scales/0000755000176200001440000000000014531327156011533 5ustar liggesusersscales/NAMESPACE0000644000176200001440000001170514523373730012756 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(fullseq,Date) S3method(fullseq,POSIXt) S3method(fullseq,difftime) S3method(fullseq,numeric) S3method(lines,transform) S3method(offset_by,Date) S3method(offset_by,POSIXt) S3method(offset_by,difftime) S3method(offset_by,numeric) S3method(plot,transform) S3method(print,transform) S3method(rescale,"NULL") S3method(rescale,AsIs) S3method(rescale,Date) S3method(rescale,POSIXt) S3method(rescale,difftime) S3method(rescale,dist) S3method(rescale,integer64) S3method(rescale,logical) S3method(rescale,numeric) S3method(rescale_mid,"NULL") S3method(rescale_mid,AsIs) S3method(rescale_mid,Date) S3method(rescale_mid,POSIXt) S3method(rescale_mid,dist) S3method(rescale_mid,integer64) S3method(rescale_mid,logical) S3method(rescale_mid,numeric) S3method(round_any,POSIXct) S3method(round_any,numeric) export(ContinuousRange) export(DiscreteRange) export(Range) export(abs_area) export(alpha) export(area_pal) export(as.trans) export(as.transform) export(asinh_trans) export(asn_trans) export(atanh_trans) export(boxcox_trans) export(breaks_extended) export(breaks_log) export(breaks_pretty) export(breaks_timespan) export(breaks_width) export(brewer_pal) export(cbreaks) export(censor) export(col2hcl) export(col_bin) export(col_factor) export(col_numeric) export(col_quantile) export(colour_ramp) export(comma) export(comma_format) export(compose_trans) export(cscale) export(cut_long_scale) export(cut_short_scale) export(cut_si) export(cut_time_scale) export(date_breaks) export(date_format) export(date_trans) export(demo_continuous) export(demo_datetime) export(demo_discrete) export(demo_log10) export(demo_time) export(demo_timespan) export(dichromat_pal) export(discard) export(div_gradient_pal) export(dollar) export(dollar_format) export(dscale) export(exp_trans) export(expand_range) export(extended_breaks) export(format_format) export(fullseq) export(gradient_n_pal) export(grey_pal) export(hms_trans) export(hue_pal) export(identity_pal) export(identity_trans) export(is.trans) export(is.transform) export(label_bytes) export(label_comma) export(label_currency) export(label_date) export(label_date_short) export(label_dollar) export(label_log) export(label_math) export(label_number) export(label_number_auto) export(label_number_si) export(label_ordinal) export(label_parse) export(label_percent) export(label_pvalue) export(label_scientific) export(label_time) export(label_timespan) export(label_wrap) export(linetype_pal) export(log10_trans) export(log1p_trans) export(log2_trans) export(log_breaks) export(log_trans) export(logit_trans) export(manual_pal) export(math_format) export(minor_breaks_n) export(minor_breaks_width) export(modulus_trans) export(muted) export(new_transform) export(number) export(number_bytes) export(number_bytes_format) export(number_format) export(oob_censor) export(oob_censor_any) export(oob_discard) export(oob_keep) export(oob_squish) export(oob_squish_any) export(oob_squish_infinite) export(ordinal) export(ordinal_english) export(ordinal_format) export(ordinal_french) export(ordinal_spanish) export(pal_area) export(pal_brewer) export(pal_dichromat) export(pal_div_gradient) export(pal_gradient_n) export(pal_grey) export(pal_hue) export(pal_identity) export(pal_linetype) export(pal_manual) export(pal_rescale) export(pal_seq_gradient) export(pal_shape) export(pal_viridis) export(parse_format) export(percent) export(percent_format) export(pretty_breaks) export(probability_trans) export(probit_trans) export(pseudo_log_trans) export(pvalue) export(pvalue_format) export(reciprocal_trans) export(regular_minor_breaks) export(rescale) export(rescale_max) export(rescale_mid) export(rescale_none) export(rescale_pal) export(reverse_trans) export(scientific) export(scientific_format) export(seq_gradient_pal) export(shape_pal) export(show_col) export(sqrt_trans) export(squish) export(squish_infinite) export(time_format) export(time_trans) export(timespan_trans) export(train_continuous) export(train_discrete) export(trans_breaks) export(trans_format) export(trans_new) export(trans_range) export(transform_asinh) export(transform_asn) export(transform_atanh) export(transform_boxcox) export(transform_compose) export(transform_date) export(transform_exp) export(transform_hms) export(transform_identity) export(transform_log) export(transform_log10) export(transform_log1p) export(transform_log2) export(transform_logit) export(transform_modulus) export(transform_probability) export(transform_probit) export(transform_pseudo_log) export(transform_reciprocal) export(transform_reverse) export(transform_sqrt) export(transform_time) export(transform_timespan) export(transform_yj) export(trim_to_domain) export(unit_format) export(viridis_pal) export(wrap_format) export(yj_trans) export(zero_range) import(rlang) importFrom(R6,R6Class) importFrom(glue,glue) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,rect) importFrom(graphics,text) importFrom(lifecycle,deprecate_soft) importFrom(lifecycle,deprecated) importFrom(munsell,mnsl) scales/LICENSE0000644000176200001440000000005414520132374012531 0ustar liggesusersYEAR: 2023 COPYRIGHT HOLDER: scales authors scales/README.md0000644000176200001440000000755514531055367013030 0ustar liggesusers # scales scales website [![CRAN status](https://www.r-pkg.org/badges/version/scales)](https://CRAN.R-project.org/package=scales) [![R-CMD-check](https://github.com/r-lib/scales/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/r-lib/scales/actions/workflows/R-CMD-check.yaml) [![Codecov test coverage](https://codecov.io/gh/r-lib/scales/branch/main/graph/badge.svg)](https://app.codecov.io/gh/r-lib/scales?branch=main) One of the most difficult parts of any graphics package is scaling, converting from data values to perceptual properties. The inverse of scaling, making guides (legends and axes) that can be used to read the graph, is often even harder! The scales packages provides the internal scaling infrastructure used by [ggplot2](https://ggplot2.tidyverse.org/), and gives you tools to override the default breaks, labels, transformations and palettes. ## Installation ``` r # Scales is installed when you install ggplot2 or the tidyverse. # But you can install just scales from CRAN: install.packages("scales") # Or the development version from Github: # install.packages("pak") pak::pak("r-lib/scales") ``` ## Usage ### Breaks and labels The most common use of the scales package is to control the appearance of axis and legend labels. Use a `break_` function to control how breaks are generated from the limits, and a `label_` function to control how breaks are turned in to labels. ``` r library(ggplot2) library(dplyr, warn.conflicts = FALSE) library(lubridate, warn.conflicts = FALSE) txhousing %>% mutate(date = make_date(year, month, 1)) %>% group_by(city) %>% filter(min(sales) > 5e2) %>% ggplot(aes(date, sales, group = city)) + geom_line(na.rm = TRUE) + scale_x_date( NULL, breaks = scales::breaks_width("2 years"), labels = scales::label_date("'%y") ) + scale_y_log10( "Total sales", labels = scales::label_number(scale_cut = scales::cut_short_scale()) ) ``` ![](man/figures/README-labels-1.png) ``` r economics %>% filter(date < ymd("1970-01-01")) %>% ggplot(aes(date, pce)) + geom_line() + scale_x_date(NULL, breaks = scales::breaks_width("3 months"), labels = scales::label_date_short() ) + scale_y_continuous("Personal consumption expenditures", breaks = scales::breaks_extended(8), labels = scales::label_dollar() ) ``` ![](man/figures/README-labels-2.png) Generally, I don’t recommend running `library(scales)` because when you type (e.g.) `scales::label_` autocomplete will provide you with a list of labelling functions to jog your memory. ### Advanced features Scales colour palettes are used to power the scales in ggplot2, but you can use them in any plotting system. The following example shows how you might apply them to a base plot. ``` r library(scales) # pull a list of colours from any palette pal_viridis()(4) #> [1] "#440154FF" "#31688EFF" "#35B779FF" "#FDE725FF" # use in combination with baseR `palette()` to set new defaults palette(pal_brewer(palette = "Set2")(4)) par(mar = c(5, 5, 1, 1)) plot(Sepal.Length ~ Sepal.Width, data = iris, col = Species, pch = 20) ``` ![](man/figures/README-palettes-1.png) scales also gives users the ability to define and apply their own custom transformation functions for repeated use. ``` r # use new_transform to build a new transformation transform_logp3 <- new_transform( name = "logp", transform = function(x) log(x + 3), inverse = function(x) exp(x) - 3, breaks = log_breaks() ) dsamp <- sample_n(diamonds, 100) ggplot(dsamp, aes(carat, price, colour = color)) + geom_point() + scale_y_continuous(trans = transform_logp3) ``` ![](man/figures/README-transforms-1.png) scales/man/0000755000176200001440000000000014522421001012266 5ustar liggesusersscales/man/pal_manual.Rd0000644000176200001440000000052714522421001014672 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-manual.R \name{pal_manual} \alias{pal_manual} \alias{manual_pal} \title{Manual palette (discrete)} \usage{ pal_manual(values) manual_pal(values) } \arguments{ \item{values}{vector of values to be used as a palette.} } \description{ Manual palette (discrete) } scales/man/unit_format.Rd0000644000176200001440000000424314520130030015104 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/labels-retired.R \name{unit_format} \alias{unit_format} \title{Unit labels} \usage{ unit_format( accuracy = NULL, scale = 1, prefix = "", unit = "m", sep = " ", suffix = paste0(sep, unit), big.mark = " ", decimal.mark = ".", trim = TRUE, ... ) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{unit}{The units to append.} \item{sep}{The separator between the number and the unit label.} \item{suffix}{Additional text to display after the number.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} This function is kept for backward compatiblity; you should either use \code{\link[=label_number]{label_number()}} or \code{\link[=label_number_si]{label_number_si()}} instead. } \examples{ # Label with units demo_continuous(c(0, 1), labels = unit_format(unit = "m")) # Labels in kg, but original data in g km <- unit_format(unit = "km", scale = 1e-3, digits = 2) demo_continuous(c(0, 2500), labels = km) } \keyword{internal} scales/man/percent_format.Rd0000644000176200001440000000372414520130030015570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-percent.R \name{percent_format} \alias{percent_format} \alias{percent} \title{Superseded interface to \code{label_percent()}} \usage{ percent_format( accuracy = NULL, scale = 100, prefix = "", suffix = "\%", big.mark = " ", decimal.mark = ".", trim = TRUE, ... ) percent( x, accuracy = NULL, scale = 100, prefix = "", suffix = "\%", big.mark = " ", decimal.mark = ".", trim = TRUE, ... ) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{suffix}{Additional text to display after the number.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_percent]{label_percent()}} for new code. } \keyword{internal} scales/man/fullseq.Rd0000644000176200001440000000065314520145514014246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/full-seq.R \name{fullseq} \alias{fullseq} \title{Generate sequence of fixed size intervals covering range.} \usage{ fullseq(range, size, ...) } \arguments{ \item{range}{range} \item{size}{interval size} \item{...}{other arguments passed on to methods} } \description{ Generate sequence of fixed size intervals covering range. } \keyword{internal} scales/man/transform_asn.Rd0000644000176200001440000000060314522421001015430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_asn} \alias{transform_asn} \alias{asn_trans} \title{Arc-sin square root transformation} \usage{ transform_asn() asn_trans() } \description{ This is the variance stabilising transformation for the binomial distribution. } \examples{ plot(transform_asn(), xlim = c(0, 1)) } scales/man/trans_breaks.Rd0000644000176200001440000000171714520130030015236 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks-retired.R \name{trans_breaks} \alias{trans_breaks} \title{Pretty breaks on transformed scale} \usage{ trans_breaks(trans, inv, n = 5, ...) } \arguments{ \item{trans}{function of single variable, \code{x}, that given a numeric vector returns the transformed values} \item{inv}{inverse of the transformation function} \item{n}{desired number of ticks} \item{...}{other arguments passed on to pretty} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These often do not produce very attractive breaks. } \examples{ trans_breaks("log10", function(x) 10^x)(c(1, 1e6)) trans_breaks("sqrt", function(x) x^2)(c(1, 100)) trans_breaks(function(x) 1 / x, function(x) 1 / x)(c(1, 100)) trans_breaks(function(x) -x, function(x) -x)(c(1, 100)) } \keyword{internal} scales/man/transform_probability.Rd0000644000176200001440000000170314522421001017171 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_probability} \alias{transform_probability} \alias{transform_logit} \alias{transform_probit} \alias{probability_trans} \alias{logit_trans} \alias{probit_trans} \title{Probability transformation} \usage{ transform_probability(distribution, ...) transform_logit() transform_probit() probability_trans(distribution, ...) logit_trans() probit_trans() } \arguments{ \item{distribution}{probability distribution. Should be standard R abbreviation so that "p" + distribution is a valid cumulative distribution function, "q" + distribution is a valid quantile function, and "d" + distribution is a valid probability density function.} \item{...}{other arguments passed on to distribution and quantile functions} } \description{ Probability transformation } \examples{ plot(transform_logit(), xlim = c(0, 1)) plot(transform_probit(), xlim = c(0, 1)) } scales/man/pal_div_gradient.Rd0000644000176200001440000000220114522421001016043 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-gradient.R \name{pal_div_gradient} \alias{pal_div_gradient} \alias{div_gradient_pal} \title{Diverging colour gradient (continuous).} \usage{ pal_div_gradient( low = mnsl("10B 4/6"), mid = mnsl("N 8/0"), high = mnsl("10R 4/6"), space = "Lab" ) div_gradient_pal( low = mnsl("10B 4/6"), mid = mnsl("N 8/0"), high = mnsl("10R 4/6"), space = "Lab" ) } \arguments{ \item{low}{colour for low end of gradient.} \item{mid}{colour for mid point} \item{high}{colour for high end of gradient.} \item{space}{colour space in which to calculate gradient. Must be "Lab" - other values are deprecated.} } \description{ Diverging colour gradient (continuous). } \examples{ x <- seq(-1, 1, length.out = 100) r <- sqrt(outer(x^2, x^2, "+")) image(r, col = pal_div_gradient()(seq(0, 1, length.out = 12))) image(r, col = pal_div_gradient()(seq(0, 1, length.out = 30))) image(r, col = pal_div_gradient()(seq(0, 1, length.out = 100))) library(munsell) pal <- pal_div_gradient(low = mnsl(complement("10R 4/6"), fix = TRUE)) image(r, col = pal(seq(0, 1, length.out = 100))) } scales/man/pal_area.Rd0000644000176200001440000000074114522421001014323 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-area.R \name{pal_area} \alias{pal_area} \alias{area_pal} \alias{abs_area} \title{Area palettes (continuous)} \usage{ pal_area(range = c(1, 6)) area_pal(range = c(1, 6)) abs_area(max) } \arguments{ \item{range}{Numeric vector of length two, giving range of possible sizes. Should be greater than 0.} \item{max}{A number representing the maximum size.} } \description{ Area palettes (continuous) } scales/man/label_ordinal.Rd0000644000176200001440000001151714523373730015371 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-ordinal.R \name{label_ordinal} \alias{label_ordinal} \alias{ordinal_english} \alias{ordinal_french} \alias{ordinal_spanish} \title{Label ordinal numbers (1st, 2nd, 3rd, etc)} \usage{ label_ordinal( prefix = "", suffix = "", big.mark = " ", rules = ordinal_english(), ... ) ordinal_english() ordinal_french(gender = c("masculin", "feminin"), plural = FALSE) ordinal_spanish() } \arguments{ \item{prefix, suffix}{Symbols to display before and after value.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{rules}{Named list of regular expressions, matched in order. Name gives suffix, and value specifies which numbers to match.} \item{...}{ Arguments passed on to \code{\link[=number]{number}} \describe{ \item{\code{accuracy}}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{\code{scale}}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{\code{decimal.mark}}{The character to be used to indicate the numeric decimal point.} \item{\code{style_positive}}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{\code{style_negative}}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{\code{scale_cut}}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} \item{\code{trim}}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} }} \item{gender}{Masculin or feminin gender for French ordinal.} \item{plural}{Plural or singular for French ordinal.} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Round values to integers and then display as ordinal values (e.g. 1st, 2nd, 3rd). Built-in rules are provided for English, French, and Spanish. } \examples{ demo_continuous(c(1, 5)) demo_continuous(c(1, 5), labels = label_ordinal()) demo_continuous(c(1, 5), labels = label_ordinal(rules = ordinal_french())) # The rules are just a set of regular expressions that are applied in turn ordinal_french() ordinal_english() # Note that ordinal rounds values, so you may need to adjust the breaks too demo_continuous(c(1, 10)) demo_continuous(c(1, 10), labels = label_ordinal()) demo_continuous(c(1, 10), labels = label_ordinal(), breaks = breaks_width(2) ) } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} scales/man/transform_identity.Rd0000644000176200001440000000057214522421001016505 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_identity} \alias{transform_identity} \alias{identity_trans} \title{Identity transformation (do nothing)} \usage{ transform_identity() identity_trans() } \description{ Identity transformation (do nothing) } \examples{ plot(transform_identity(), xlim = c(-1, 1)) } scales/man/scientific_format.Rd0000644000176200001440000000262314520130030016245 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-scientific.R \name{scientific_format} \alias{scientific_format} \alias{scientific} \title{Superseded interface to \code{label_scientific()}} \usage{ scientific_format( digits = 3, scale = 1, prefix = "", suffix = "", decimal.mark = ".", trim = TRUE, ... ) scientific( x, digits = 3, scale = 1, prefix = "", suffix = "", decimal.mark = ".", trim = TRUE, ... ) } \arguments{ \item{digits}{Number of digits to show before exponent.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix, suffix}{Symbols to display before and after value.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_scientific]{label_scientific()}} for new code. } \keyword{internal} scales/man/transform_timespan.Rd0000644000176200001440000000254614522421001016477 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-date.R \name{transform_timespan} \alias{transform_timespan} \alias{timespan_trans} \alias{transform_hms} \alias{hms_trans} \title{Transformation for times (class hms)} \usage{ transform_timespan(unit = c("secs", "mins", "hours", "days", "weeks")) timespan_trans(unit = c("secs", "mins", "hours", "days", "weeks")) transform_hms() hms_trans() } \arguments{ \item{unit}{The unit used to interpret numeric input} } \description{ \code{transform_timespan()} provides transformations for data encoding time passed along with breaks and label formatting showing standard unit of time fitting the range of the data. \code{transform_hms()} provides the same but using standard hms idioms and formatting. } \examples{ # transform_timespan allows you to specify the time unit numeric data is # interpreted in trans_min <- transform_timespan("mins") demo_timespan(seq(0, 100), trans = trans_min) # Input already in difftime format is interpreted correctly demo_timespan(as.difftime(seq(0, 100), units = "secs"), trans = trans_min) if (require("hms")) { # transform_hms always assumes seconds hms <- round(runif(10) * 86400) t <- transform_hms() t$transform(hms) t$inverse(t$transform(hms)) t$breaks(hms) # The break labels also follow the hms format demo_timespan(hms, trans = t) } } scales/man/pal_linetype.Rd0000644000176200001440000000047614522421001015251 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-linetype.R \name{pal_linetype} \alias{pal_linetype} \alias{linetype_pal} \title{Line type palette (discrete)} \usage{ pal_linetype() linetype_pal() } \description{ Based on a set supplied by Richard Pearson, University of Manchester } scales/man/minor_breaks_width.Rd0000644000176200001440000000264014520130030016426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/minor_breaks.R \name{minor_breaks_width} \alias{minor_breaks_width} \alias{minor_breaks_n} \title{Minor breaks} \usage{ minor_breaks_width(width, offset) minor_breaks_n(n) } \arguments{ \item{width}{Distance between each break. Either a number, or for date/times, a single string of the form \code{"{n} {unit}"}, e.g. "1 month", "5 days". Unit can be of one "sec", "min", "hour", "day", "week", "month", "year".} \item{offset}{Use if you don't want breaks to start at zero, or on a conventional date or time boundary such as the 1st of January or midnight. Either a number, or for date/times, a single string of the form \code{"{n} {unit}"}, as for \code{width}. \code{offset} can be a vector, which will accumulate in the order given. This is mostly useful for dates, where e.g. \code{c("3 months", "5 days")} will offset by three months and five days, which is useful for the UK tax year. Note that due to way that dates are rounded, there's no guarantee that \code{offset = c(x, y)} will give the same result as \code{offset = c(y, x)}.} \item{n}{number of breaks} } \description{ Generate minor breaks between major breaks either spaced with a fixed width, or having a fixed number. } \examples{ demo_log10(c(1, 1e6)) if (FALSE) { # Requires https://github.com/tidyverse/ggplot2/pull/3591 demo_log10(c(1, 1e6), minor_breaks = minor_breaks_n(10)) } } scales/man/label_scientific.Rd0000644000176200001440000000413614522154141016050 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-scientific.R \name{label_scientific} \alias{label_scientific} \title{Label numbers with scientific notation (e.g. 1e05, 1.5e-02)} \usage{ label_scientific( digits = 3, scale = 1, prefix = "", suffix = "", decimal.mark = ".", trim = TRUE, ... ) } \arguments{ \item{digits}{Number of digits to show before exponent.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix, suffix}{Symbols to display before and after value.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Label numbers with scientific notation (e.g. 1e05, 1.5e-02) } \examples{ demo_continuous(c(1, 10)) demo_continuous(c(1, 10), labels = label_scientific()) demo_continuous(c(1, 10), labels = label_scientific(digits = 3)) demo_log10(c(1, 1e9)) } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()} Other labels for log scales: \code{\link{label_bytes}()}, \code{\link{label_log}()}, \code{\link{label_number_si}()} } \concept{labels for continuous scales} \concept{labels for log scales} scales/man/pal_rescale.Rd0000644000176200001440000000076414522421001015036 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-rescale.R \name{pal_rescale} \alias{pal_rescale} \alias{rescale_pal} \title{Rescale palette (continuous)} \usage{ pal_rescale(range = c(0.1, 1)) rescale_pal(range = c(0.1, 1)) } \arguments{ \item{range}{Numeric vector of length two, giving range of possible values. Should be between 0 and 1.} } \description{ Just rescales the input to the specific output range. Useful for alpha, size, and continuous position. } scales/man/transform_atanh.Rd0000644000176200001440000000052414522421001015744 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_atanh} \alias{transform_atanh} \alias{atanh_trans} \title{Arc-tangent transformation} \usage{ transform_atanh() atanh_trans() } \description{ Arc-tangent transformation } \examples{ plot(transform_atanh(), xlim = c(-1, 1)) } scales/man/number.Rd0000644000176200001440000000750114523373730014070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-number.R \name{number} \alias{number} \alias{cut_short_scale} \alias{cut_long_scale} \alias{cut_time_scale} \alias{cut_si} \title{A low-level numeric formatter} \usage{ number( x, accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = " ", decimal.mark = ".", style_positive = c("none", "plus", "space"), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, trim = TRUE, ... ) cut_short_scale(space = FALSE) cut_long_scale(space = FALSE) cut_time_scale(space = FALSE) cut_si(unit) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{suffix}{Additional text to display after the number.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{style_positive}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{style_negative}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{scale_cut}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} \item{space}{Add a space before the scale suffix?} \item{unit}{SI unit abbreviation.} } \value{ A character vector of \code{length(x)}. } \description{ This function is a low-level helper that powers many of the labelling functions. You should generally not need to call it directly unless you are creating your own labelling function. } \keyword{internal} scales/man/label_log.Rd0000644000176200001440000000247714520130030014504 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-log.R \name{label_log} \alias{label_log} \title{Label numbers in log format (10^3, 10^6, etc)} \usage{ label_log(base = 10, digits = 3) } \arguments{ \item{base}{Base of logarithm to use} \item{digits}{Number of significant digits to show for the exponent. Argument is passed on to \code{\link[base:format]{base::format()}}.} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ \code{label_log()} displays numbers as base^exponent, using superscript formatting. } \examples{ demo_log10(c(1, 1e5), labels = label_log()) demo_log10(c(1, 1e5), breaks = breaks_log(base = 2), labels = label_log(base = 2)) } \seealso{ \code{\link[=breaks_log]{breaks_log()}} for the related breaks algorithm. Other labels for log scales: \code{\link{label_bytes}()}, \code{\link{label_number_si}()}, \code{\link{label_scientific}()} } \concept{labels for log scales} scales/man/label_date.Rd0000644000176200001440000001261714531113322014644 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-date.R \name{label_date} \alias{label_date} \alias{label_date_short} \alias{label_time} \alias{label_timespan} \title{Label date/times} \usage{ label_date(format = "\%Y-\%m-\%d", tz = "UTC", locale = NULL) label_date_short(format = c("\%Y", "\%b", "\%d", "\%H:\%M"), sep = "\\n") label_time(format = "\%H:\%M:\%S", tz = "UTC", locale = NULL) label_timespan( unit = c("secs", "mins", "hours", "days", "weeks"), space = FALSE, ... ) } \arguments{ \item{format}{For \code{date_format()} and \code{time_format()} a date/time format string using standard POSIX specification. See \code{\link[=strptime]{strptime()}} for details. For \code{date_short()} a character vector of length 4 giving the format components to use for year, month, day, and hour respectively.} \item{tz}{a time zone name, see \code{\link[=timezones]{timezones()}}. Defaults to UTC} \item{locale}{Locale to use when for day and month names. The default uses the current locale. Setting this argument requires stringi, and you can see a complete list of supported locales with \code{\link[stringi:stri_locale_list]{stringi::stri_locale_list()}}.} \item{sep}{Separator to use when combining date formats into a single string.} \item{unit}{The unit used to interpret numeric input} \item{space}{Add a space before the time unit?} \item{...}{ Arguments passed on to \code{\link[=number]{number}} \describe{ \item{\code{accuracy}}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{\code{scale}}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{\code{prefix}}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{\code{suffix}}{Additional text to display after the number.} \item{\code{big.mark}}{Character used between every 3 digits to separate thousands.} \item{\code{decimal.mark}}{The character to be used to indicate the numeric decimal point.} \item{\code{style_positive}}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{\code{style_negative}}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{\code{trim}}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} }} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ \code{label_date()} and \code{label_time()} label date/times using date/time format strings. \code{label_date_short()} automatically constructs a short format string sufficient to uniquely identify labels. It's inspired by matplotlib's \href{https://matplotlib.org/stable/api/dates_api.html#matplotlib.dates.ConciseDateFormatter}{\code{ConciseDateFormatter}}, but uses a slightly different approach: \code{ConciseDateFormatter} formats "firsts" (e.g. first day of month, first day of day) specially; \code{date_short()} formats changes (e.g. new month, new year) specially. \code{label_timespan()} is intended to show time passed and adds common time units suffix to the input (ns, us, ms, s, m, h, d, w). } \examples{ date_range <- function(start, days) { start <- as.POSIXct(start) c(start, start + days * 24 * 60 * 60) } two_months <- date_range("2020-05-01", 60) demo_datetime(two_months) demo_datetime(two_months, labels = date_format("\%m/\%d")) demo_datetime(two_months, labels = date_format("\%e \%b", locale = "fr")) demo_datetime(two_months, labels = date_format("\%e \%B", locale = "es")) # ggplot2 provides a short-hand: demo_datetime(two_months, date_labels = "\%m/\%d") # An alternative labelling system is label_date_short() demo_datetime(two_months, date_breaks = "7 days", labels = label_date_short()) # This is particularly effective for dense labels one_year <- date_range("2020-05-01", 365) demo_datetime(one_year, date_breaks = "month") demo_datetime(one_year, date_breaks = "month", labels = label_date_short()) } scales/man/colour_ramp.Rd0000644000176200001440000000374713610067251015124 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colour-ramp.R \name{colour_ramp} \alias{colour_ramp} \title{Fast colour interpolation} \usage{ colour_ramp(colors, na.color = NA, alpha = TRUE) } \arguments{ \item{colors}{Colours to interpolate; must be a valid argument to \code{\link[grDevices:col2rgb]{grDevices::col2rgb()}}. This can be a character vector of \code{"#RRGGBB"} or \code{"#RRGGBBAA"}, colour names from \code{\link[grDevices:colors]{grDevices::colors()}}, or a positive integer that indexes into \code{\link[grDevices:palette]{grDevices::palette()}}.} \item{na.color}{The colour to map to \code{NA} values (for example, \code{"#606060"} for dark grey, or \code{"#00000000"} for transparent) and values outside of [0,1]. Can itself by \code{NA}, which will simply cause an \code{NA} to be inserted into the output.} \item{alpha}{Whether to include alpha transparency channels in interpolation. If \code{TRUE} then the alpha information is included in the interpolation. The returned colours will be provided in \code{"#RRGGBBAA"} format when needed, i.e., in cases where the colour is not fully opaque, so that the \code{"AA"} part is not equal to \code{"FF"}. Fully opaque colours will be returned in \code{"#RRGGBB"} format. If \code{FALSE}, the alpha information is discarded before interpolation and colours are always returned as \code{"#RRGGBB"}.} } \value{ A function that takes a numeric vector and returns a character vector of the same length with RGB or RGBA hex colours. } \description{ Returns a function that maps the interval [0,1] to a set of colours. Interpolation is performed in the CIELAB colour space. Similar to \code{\link[grDevices]{colorRamp}(space = 'Lab')}, but hundreds of times faster, and provides results in \code{"#RRGGBB"} (or \code{"#RRGGBBAA"}) character form instead of RGB colour matrices. } \examples{ ramp <- colour_ramp(c("red", "green", "blue")) show_col(ramp(seq(0, 1, length = 12))) } \seealso{ \code{\link[grDevices]{colorRamp}} } scales/man/alpha.Rd0000644000176200001440000000105014520145514013650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colour-manip.R \name{alpha} \alias{alpha} \title{Modify colour transparency} \usage{ alpha(colour, alpha = NA) } \arguments{ \item{colour}{colour} \item{alpha}{new alpha level in [0,1]. If alpha is \code{NA}, existing alpha values are preserved.} } \description{ Vectorised in both colour and alpha. } \examples{ alpha("red", 0.1) alpha(colours(), 0.5) alpha("red", seq(0, 1, length.out = 10)) alpha(c("first" = "gold", "second" = "lightgray", "third" = "#cd7f32"), .5) } scales/man/pal_hue.Rd0000644000176200001440000000215214522421001014172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-hue.R \name{pal_hue} \alias{pal_hue} \alias{hue_pal} \title{Hue palette (discrete)} \usage{ pal_hue(h = c(0, 360) + 15, c = 100, l = 65, h.start = 0, direction = 1) hue_pal(h = c(0, 360) + 15, c = 100, l = 65, h.start = 0, direction = 1) } \arguments{ \item{h}{range of hues to use, in [0, 360]} \item{c}{chroma (intensity of colour), maximum value varies depending on combination of hue and luminance.} \item{l}{luminance (lightness), in [0, 100]} \item{h.start}{hue to start at} \item{direction}{direction to travel around the colour wheel, 1 = clockwise, -1 = counter-clockwise} } \description{ Hue palette (discrete) } \examples{ show_col(pal_hue()(4)) show_col(pal_hue()(9)) show_col(pal_hue(l = 90)(9)) show_col(pal_hue(l = 30)(9)) show_col(pal_hue()(9)) show_col(pal_hue(direction = -1)(9)) show_col(pal_hue(h.start = 30)(9)) show_col(pal_hue(h.start = 90)(9)) show_col(pal_hue()(9)) show_col(pal_hue(h = c(0, 90))(9)) show_col(pal_hue(h = c(90, 180))(9)) show_col(pal_hue(h = c(180, 270))(9)) show_col(pal_hue(h = c(270, 360))(9)) } scales/man/transform_date.Rd0000644000176200001440000000074114522421001015567 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-date.R \name{transform_date} \alias{transform_date} \alias{date_trans} \title{Transformation for dates (class Date)} \usage{ transform_date() date_trans() } \description{ Transformation for dates (class Date) } \examples{ years <- seq(as.Date("1910/1/1"), as.Date("1999/1/1"), "years") t <- transform_date() t$transform(years) t$inverse(t$transform(years)) t$format(t$breaks(range(years))) } scales/man/pretty_breaks.Rd0000644000176200001440000000134614520145514015451 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks.R \name{pretty_breaks} \alias{pretty_breaks} \title{Superseded interface to \code{breaks_pretty()}} \usage{ pretty_breaks(n = 5, ...) } \arguments{ \item{n}{Desired number of breaks. You may get slightly more or fewer breaks that requested.} \item{...}{other arguments passed on to \code{\link[=pretty]{pretty()}}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=breaks_pretty]{breaks_pretty()}} for new code. } \keyword{internal} scales/man/col_numeric.Rd0000644000176200001440000001257514520145514015100 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colour-mapping.R \name{col_numeric} \alias{col_numeric} \alias{col_bin} \alias{col_quantile} \alias{col_factor} \title{Colour mapping} \usage{ col_numeric( palette, domain, na.color = "#808080", alpha = FALSE, reverse = FALSE ) col_bin( palette, domain, bins = 7, pretty = TRUE, na.color = "#808080", alpha = FALSE, reverse = FALSE, right = FALSE ) col_quantile( palette, domain, n = 4, probs = seq(0, 1, length.out = n + 1), na.color = "#808080", alpha = FALSE, reverse = FALSE, right = FALSE ) col_factor( palette, domain, levels = NULL, ordered = FALSE, na.color = "#808080", alpha = FALSE, reverse = FALSE ) } \arguments{ \item{palette}{The colours or colour function that values will be mapped to} \item{domain}{The possible values that can be mapped. For \code{col_numeric} and \code{col_bin}, this can be a simple numeric range (e.g. \code{c(0, 100)}); \code{col_quantile} needs representative numeric data; and \code{col_factor} needs categorical data. If \code{NULL}, then whenever the resulting colour function is called, the \code{x} value will represent the domain. This implies that if the function is invoked multiple times, the encoding between values and colours may not be consistent; if consistency is needed, you must provide a non-\code{NULL} domain.} \item{na.color}{The colour to return for \code{NA} values. Note that \code{na.color = NA} is valid.} \item{alpha}{Whether alpha channels should be respected or ignored. If \code{TRUE} then colors without explicit alpha information will be treated as fully opaque.} \item{reverse}{Whether the colors (or color function) in \code{palette} should be used in reverse order. For example, if the default order of a palette goes from blue to green, then \code{reverse = TRUE} will result in the colors going from green to blue.} \item{bins}{Either a numeric vector of two or more unique cut points or a single number (greater than or equal to 2) giving the number of intervals into which the domain values are to be cut.} \item{pretty}{Whether to use the function \code{\link[=pretty]{pretty()}} to generate the bins when the argument \code{bins} is a single number. When \code{pretty = TRUE}, the actual number of bins may not be the number of bins you specified. When \code{pretty = FALSE}, \code{\link[=seq]{seq()}} is used to generate the bins and the breaks may not be "pretty".} \item{right}{parameter supplied to \code{\link[base:cut]{base::cut()}}. See Details} \item{n}{Number of equal-size quantiles desired. For more precise control, use the \code{probs} argument instead.} \item{probs}{See \code{\link[stats:quantile]{stats::quantile()}}. If provided, the \code{n} argument is ignored.} \item{levels}{An alternate way of specifying levels; if specified, domain is ignored} \item{ordered}{If \code{TRUE} and \code{domain} needs to be coerced to a factor, treat it as already in the correct order} } \value{ A function that takes a single parameter \code{x}; when called with a vector of numbers (except for \code{col_factor}, which expects factors/characters), #RRGGBB colour strings are returned (unless \code{alpha = TRUE} in which case #RRGGBBAA may also be possible). } \description{ Conveniently maps data values (numeric or factor/character) to colours according to a given palette, which can be provided in a variety of formats. } \details{ \code{col_numeric} is a simple linear mapping from continuous numeric data to an interpolated palette. \code{col_bin} also maps continuous numeric data, but performs binning based on value (see the \code{\link[base:cut]{base::cut()}} function). \code{col_bin} defaults for the \code{cut} function are \code{include.lowest = TRUE} and \code{right = FALSE}. \code{col_quantile} similarly bins numeric data, but via the \code{\link[stats:quantile]{stats::quantile()}} function. \code{col_factor} maps factors to colours. If the palette is discrete and has a different number of colours than the number of factors, interpolation is used. The \code{palette} argument can be any of the following: \enumerate{ \item{A character vector of RGB or named colours. Examples: \code{palette()}, \code{c("#000000", "#0000FF", "#FFFFFF")}, \code{topo.colors(10)}} \item{The name of an RColorBrewer palette, e.g. \code{"BuPu"} or \code{"Greens"}.} \item{The full name of a viridis palette: \code{"viridis"}, \code{"magma"}, \code{"inferno"}, or \code{"plasma"}.} \item{A function that receives a single value between 0 and 1 and returns a colour. Examples: \code{colorRamp(c("#000000", "#FFFFFF"), interpolate="spline")}.} } } \examples{ pal <- col_bin("Greens", domain = 0:100) show_col(pal(sort(runif(10, 60, 100)))) # Exponential distribution, mapped continuously show_col(col_numeric("Blues", domain = NULL)(sort(rexp(16)))) # Exponential distribution, mapped by interval show_col(col_bin("Blues", domain = NULL, bins = 4)(sort(rexp(16)))) # Exponential distribution, mapped by quantile show_col(col_quantile("Blues", domain = NULL)(sort(rexp(16)))) # Categorical data; by default, the values being coloured span the gamut... show_col(col_factor("RdYlBu", domain = NULL)(LETTERS[1:5])) # ...unless the data is a factor, without droplevels... show_col(col_factor("RdYlBu", domain = NULL)(factor(LETTERS[1:5], levels = LETTERS))) # ...or the domain is stated explicitly. show_col(col_factor("RdYlBu", levels = LETTERS)(LETTERS[1:5])) } scales/man/rescale.Rd0000644000176200001440000000307714522154141014212 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{rescale} \alias{rescale} \alias{rescale.numeric} \alias{rescale.dist} \alias{rescale.logical} \alias{rescale.POSIXt} \alias{rescale.Date} \alias{rescale.integer64} \alias{rescale.difftime} \alias{rescale.AsIs} \title{Rescale continuous vector to have specified minimum and maximum} \usage{ rescale(x, to, from, ...) \method{rescale}{numeric}(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) \method{rescale}{dist}(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) \method{rescale}{logical}(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) \method{rescale}{POSIXt}(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) \method{rescale}{Date}(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) \method{rescale}{integer64}(x, to = c(0, 1), from = range(x, na.rm = TRUE), ...) \method{rescale}{difftime}(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) \method{rescale}{AsIs}(x, to, from, ...) } \arguments{ \item{x}{continuous vector of values to manipulate.} \item{to}{output range (numeric vector of length two)} \item{from}{input range (vector of length two). If not given, is calculated from the range of \code{x}} \item{...}{other arguments passed on to methods} } \description{ Rescale continuous vector to have specified minimum and maximum } \details{ Objects of class \verb{} are returned unaltered. } \examples{ rescale(1:100) rescale(runif(50)) rescale(1) } \keyword{manip} scales/man/trim_to_domain.Rd0000644000176200001440000000103014522421001015553 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform.R \name{trim_to_domain} \alias{trim_to_domain} \alias{trans_range} \title{Compute range of transformed values} \usage{ trim_to_domain(transform, x) trans_range(transform, x) } \arguments{ \item{transform}{a transformation object, or the name of a transformation object given as a string.} \item{x}{a numeric vector to compute the range of} } \description{ Silently drops any ranges outside of the domain of \code{transform}. } \keyword{internal} scales/man/label_number_auto.Rd0000644000176200001440000000263714522154141016254 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-number-auto.R \name{label_number_auto} \alias{label_number_auto} \title{Label numbers, avoiding scientific notation where possible} \usage{ label_number_auto() } \description{ Switches between \code{\link[=number_format]{number_format()}} and \code{\link[=scientific_format]{scientific_format()}} based on a set of heuristics designed to automatically generate useful labels across a wide range of inputs } \examples{ # Very small and very large numbers get scientific notation demo_continuous(c(0, 1e-6), labels = label_number_auto()) demo_continuous(c(0, 1e9), labels = label_number_auto()) # Other ranges get the numbers printed in full demo_continuous(c(0, 1e-3), labels = label_number_auto()) demo_continuous(c(0, 1), labels = label_number_auto()) demo_continuous(c(0, 1e3), labels = label_number_auto()) demo_continuous(c(0, 1e6), labels = label_number_auto()) # Transformation is applied individually so you get as little # scientific notation as possible demo_log10(c(1, 1e7), labels = label_number_auto()) } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} scales/man/new_transform.Rd0000644000176200001440000000453314522421001015446 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform.R \name{new_transform} \alias{new_transform} \alias{trans} \alias{trans_new} \alias{is.transform} \alias{is.trans} \alias{as.transform} \alias{as.trans} \title{Create a new transformation object} \usage{ new_transform( name, transform, inverse, d_transform = NULL, d_inverse = NULL, breaks = extended_breaks(), minor_breaks = regular_minor_breaks(), format = format_format(), domain = c(-Inf, Inf) ) trans_new( name, transform, inverse, d_transform = NULL, d_inverse = NULL, breaks = extended_breaks(), minor_breaks = regular_minor_breaks(), format = format_format(), domain = c(-Inf, Inf) ) is.transform(x) is.trans(x) as.transform(x, arg = deparse(substitute(x))) as.trans(x, arg = deparse(substitute(x))) } \arguments{ \item{name}{transformation name} \item{transform}{function, or name of function, that performs the transformation} \item{inverse}{function, or name of function, that performs the inverse of the transformation} \item{d_transform}{Optional function, or name of function, that gives the derivative of the transformation. May be \code{NULL}.} \item{d_inverse}{Optional function, or name of function, that gives the derivative of the inverse of the transformation. May be \code{NULL}.} \item{breaks}{default breaks function for this transformation. The breaks function is applied to the un-transformed data.} \item{minor_breaks}{default minor breaks function for this transformation.} \item{format}{default format for this transformation. The format is applied to breaks generated on the un-transformed data.} \item{domain}{the allowed range of the data to be transformed. The function in the \code{transform} argument is expected to be able to transform the \code{domain} argument.} } \description{ A transformation encapsulates a transformation and its inverse, as well as the information needed to create pleasing breaks and labels. The \code{breaks()} function is applied on the un-transformed range of the data, and the \code{format()} function takes the output of the \code{breaks()} function and returns well-formatted labels. Transformations may also include the derivatives of the transformation and its inverse, but are not required to. } \seealso{ \Sexpr[results=rd,stage=build]{scales:::seealso_transform()} } \keyword{internal} scales/man/pal_grey.Rd0000644000176200001440000000106214522421001014356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-grey.R \name{pal_grey} \alias{pal_grey} \alias{grey_pal} \title{Grey scale palette (discrete)} \usage{ pal_grey(start = 0.2, end = 0.8) grey_pal(start = 0.2, end = 0.8) } \arguments{ \item{start}{grey value at low end of palette} \item{end}{grey value at high end of palette} } \description{ Grey scale palette (discrete) } \examples{ show_col(pal_grey()(25)) show_col(pal_grey(0, 1)(25)) } \seealso{ \code{\link[=pal_seq_gradient]{pal_seq_gradient()}} for continuous version } scales/man/oob.Rd0000644000176200001440000000747014520145514013356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{oob} \alias{oob} \alias{oob_censor} \alias{oob_censor_any} \alias{oob_discard} \alias{oob_squish} \alias{oob_squish_any} \alias{oob_squish_infinite} \alias{oob_keep} \alias{censor} \alias{discard} \alias{squish} \alias{squish_infinite} \title{Out of bounds handling} \usage{ oob_censor(x, range = c(0, 1), only.finite = TRUE) oob_censor_any(x, range = c(0, 1)) oob_discard(x, range = c(0, 1)) oob_squish(x, range = c(0, 1), only.finite = TRUE) oob_squish_any(x, range = c(0, 1)) oob_squish_infinite(x, range = c(0, 1)) oob_keep(x, range = c(0, 1)) censor(x, range = c(0, 1), only.finite = TRUE) discard(x, range = c(0, 1)) squish(x, range = c(0, 1), only.finite = TRUE) squish_infinite(x, range = c(0, 1)) } \arguments{ \item{x}{A numeric vector of values to modify.} \item{range}{A numeric vector of length two giving the minimum and maximum limit of the desired output range respectively.} \item{only.finite}{A logical of length one. When \code{TRUE}, only finite values are altered. When \code{FALSE}, also infinite values are altered.} } \value{ Most \code{oob_()} functions return a vector of numerical values of the same length as the \code{x} argument, wherein out of bounds values have been modified. Only \code{oob_discard()} returns a vector of less than or of equal length to the \code{x} argument. } \description{ This set of functions modify data values outside a given range. The \verb{oob_*()} functions are designed to be passed as the \code{oob} argument of ggplot2 continuous and binned scales, with \code{oob_discard} being an exception. These functions affect out of bounds values in the following ways: \itemize{ \item \code{oob_censor()} replaces out of bounds values with \code{NA}s. This is the default \code{oob} argument for continuous scales. \item \code{oob_censor_any()} acts like \code{oob_censor()}, but also replaces infinite values with \code{NA}s. \item \code{oob_squish()} replaces out of bounds values with the nearest limit. This is the default \code{oob} argument for binned scales. \item \code{oob_squish_any()} acts like \code{oob_squish()}, but also replaces infinite values with the nearest limit. \item \code{oob_squish_infinite()} only replaces infinite values by the nearest limit. \item \code{oob_keep()} does not adjust out of bounds values. In position scales, behaves as zooming limits without data removal. \item \code{oob_discard()} removes out of bounds values from the input. Not suitable for ggplot2 scales. } } \details{ The \code{oob_censor_any()} and \code{oob_squish_any()} functions are the same as \code{oob_censor()} and \code{oob_squish()} with the \code{only.finite} argument set to \code{FALSE}. Replacing position values with \code{NA}s, as \code{oob_censor()} does, will typically lead to removal of those datapoints in ggplot. Setting ggplot coordinate limits is equivalent to using \code{oob_keep()} in position scales. } \section{Old interface}{ \code{censor()}, \code{squish()}, \code{squish_infinite()} and \code{discard()} are no longer recommended; please use \code{oob_censor()}, \code{oob_squish()}, \code{oob_squish_infinite()} and \code{oob_discard()} instead. } \examples{ # Censoring replaces out of bounds values with NAs oob_censor(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) oob_censor_any(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) # Squishing replaces out of bounds values with the nearest range limit oob_squish(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) oob_squish_any(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) oob_squish_infinite(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) # Keeping does not alter values oob_keep(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) # Discarding will remove out of bounds values oob_discard(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) } \author{ \code{oob_squish()}: Homer Strong \href{mailto:homer.strong@gmail.com}{homer.strong@gmail.com} } scales/man/label_parse.Rd0000644000176200001440000000363114522154141015041 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-expression.R \name{label_parse} \alias{label_parse} \alias{label_math} \title{Label with mathematical annotations} \usage{ label_parse() label_math(expr = 10^.x, format = force) } \arguments{ \item{expr}{expression to use} \item{format}{another format function to apply prior to mathematical transformation - this makes it easier to use floating point numbers in mathematical expressions.} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ \code{label_parse()} produces expression from strings by parsing them; \code{label_math()} constructs expressions by replacing the pronoun \code{.x} with each string. } \examples{ # Use label_parse() with discrete scales greek <- c("alpha", "beta", "gamma") demo_discrete(greek) demo_discrete(greek, labels = label_parse()) # Use label_math() with continuous scales demo_continuous(c(1, 5)) demo_continuous(c(1, 5), labels = label_math(alpha[.x])) demo_continuous(c(1, 5), labels = label_math()) } \seealso{ \link{plotmath} for the details of mathematical formatting in R. Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} Other labels for discrete scales: \code{\link{label_wrap}()} } \concept{labels for continuous scales} \concept{labels for discrete scales} scales/man/show_col.Rd0000644000176200001440000000152514522421001014375 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colour-manip.R \name{show_col} \alias{show_col} \title{Show colours} \usage{ show_col(colours, labels = TRUE, borders = NULL, cex_label = 1, ncol = NULL) } \arguments{ \item{colours}{A character vector of colours} \item{labels}{Label each colour with its hex name?} \item{borders}{Border colour for each tile. Default uses \code{par("fg")}. Use \code{border = NA} to omit borders.} \item{cex_label}{Size of printed labels, as multiplier of default size.} \item{ncol}{Number of columns. If not supplied, tries to be as square as possible.} } \description{ A quick and dirty way to show colours in a plot. } \examples{ show_col(pal_hue()(9)) show_col(pal_hue()(9), borders = NA) show_col(pal_viridis()(16)) show_col(pal_viridis()(16), labels = FALSE) } \keyword{internal} scales/man/rescale_mid.Rd0000644000176200001440000000304014522154141015031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{rescale_mid} \alias{rescale_mid} \alias{rescale_mid.numeric} \alias{rescale_mid.logical} \alias{rescale_mid.dist} \alias{rescale_mid.POSIXt} \alias{rescale_mid.Date} \alias{rescale_mid.integer64} \alias{rescale_mid.AsIs} \title{Rescale vector to have specified minimum, midpoint, and maximum} \usage{ rescale_mid(x, to, from, mid, ...) \method{rescale_mid}{numeric}(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid = 0, ...) \method{rescale_mid}{logical}(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid = 0, ...) \method{rescale_mid}{dist}(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid = 0, ...) \method{rescale_mid}{POSIXt}(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid, ...) \method{rescale_mid}{Date}(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid, ...) \method{rescale_mid}{integer64}(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid = 0, ...) \method{rescale_mid}{AsIs}(x, to, from, ...) } \arguments{ \item{x}{vector of values to manipulate.} \item{to}{output range (numeric vector of length two)} \item{from}{input range (vector of length two). If not given, is calculated from the range of \code{x}} \item{mid}{mid-point of input range} \item{...}{other arguments passed on to methods} } \description{ Rescale vector to have specified minimum, midpoint, and maximum } \details{ Objects of class \verb{} are returned unaltered. } \examples{ rescale_mid(1:100, mid = 50.5) rescale_mid(runif(50), mid = 0.5) rescale_mid(1) } scales/man/transform_reverse.Rd0000644000176200001440000000104214522421001016320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_reverse} \alias{transform_reverse} \alias{reverse_trans} \title{Reverse transformation} \usage{ transform_reverse() reverse_trans() } \description{ reversing transformation works by multiplying the input with -1. This means that reverse transformation cannot easily be composed with transformations that require positive input unless the reversing is done as a final step. } \examples{ plot(transform_reverse(), xlim = c(-1, 1)) } scales/man/label_currency.Rd0000644000176200001440000001201014523373730015560 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-currency.R \name{label_currency} \alias{label_currency} \title{Label currencies ($100, €2.50, etc)} \usage{ label_currency( accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_fractional = 1e+05, ... ) } \arguments{ \item{accuracy, largest_with_fractional}{Number to round to. If \code{NULL}, the default, values will be rounded to the nearest integer, unless any of the values has non-zero fractional component (e.g. cents) and the largest value is less than \code{largest_with_fractional} which by default is 100,000.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix, suffix}{Symbols to display before and after value.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{ Arguments passed on to \code{\link[=number]{number}} \describe{ \item{\code{style_positive}}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{\code{style_negative}}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{\code{scale_cut}}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} }} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Format numbers as currency, rounding values to monetary or fractional monetary using unit a convenient heuristic. } \examples{ demo_continuous(c(0, 1), labels = label_currency()) demo_continuous(c(1, 100), labels = label_currency()) # Customise currency display with prefix and suffix demo_continuous(c(1, 100), labels = label_currency(prefix = "USD ")) yen <- label_currency( prefix = "ÂĄ", suffix = "", big.mark = ".", decimal.mark = "," ) demo_continuous(c(1000, 1100), labels = yen) # Use style_negative = "parens" for finance style display demo_continuous(c(-100, 100), labels = label_currency(style_negative = "parens")) # Use scale_cut to use K/M/B where appropriate demo_log10(c(1, 1e16), breaks = log_breaks(7, 1e3), labels = label_currency(scale_cut = cut_short_scale()) ) # cut_short_scale() uses B = one thousand million # cut_long_scale() uses B = one million million demo_log10(c(1, 1e16), breaks = log_breaks(7, 1e3), labels = label_currency(scale_cut = cut_long_scale()) ) # You can also define your own breaks gbp <- label_currency( prefix = "\u00a3", scale_cut = c(0, k = 1e3, m = 1e6, bn = 1e9, tn = 1e12) ) demo_log10(c(1, 1e12), breaks = log_breaks(5, 1e3), labels = gbp) } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} scales/man/muted.Rd0000644000176200001440000000066414520145514013713 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colour-manip.R \name{muted} \alias{muted} \title{Mute standard colour} \usage{ muted(colour, l = 30, c = 70) } \arguments{ \item{colour}{character vector of colours to modify} \item{l}{new luminance} \item{c}{new chroma} } \description{ Mute standard colour } \examples{ muted("red") muted("blue") show_col(c("red", "blue", muted("red"), muted("blue"))) } scales/man/format_format.Rd0000644000176200001440000000122114520130030015406 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/labels-retired.R \name{format_format} \alias{format_format} \title{Label using \code{format()}} \usage{ format_format(...) } \arguments{ \item{...}{Arguments passed on to \code{\link[=format]{format()}}.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} This function is kept for backward compatiblity; you should either use \code{\link[=label_number]{label_number()}} or \code{\link[=label_date]{label_date()}} instead. } \keyword{internal} scales/man/transform_exp.Rd0000644000176200001440000000111114522421001015436 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_exp} \alias{transform_exp} \alias{exp_trans} \title{Exponential transformation (inverse of log transformation)} \usage{ transform_exp(base = exp(1)) exp_trans(base = exp(1)) } \arguments{ \item{base}{Base of logarithm} } \description{ Exponential transformation (inverse of log transformation) } \examples{ plot(transform_exp(0.5), xlim = c(-2, 2)) plot(transform_exp(1), xlim = c(-2, 2)) plot(transform_exp(2), xlim = c(-2, 2)) plot(transform_exp(), xlim = c(-2, 2)) } scales/man/transform_time.Rd0000644000176200001440000000125014522421001015604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-date.R \name{transform_time} \alias{transform_time} \alias{time_trans} \title{Transformation for date-times (class POSIXt)} \usage{ transform_time(tz = NULL) time_trans(tz = NULL) } \arguments{ \item{tz}{Optionally supply the time zone. If \code{NULL}, the default, the time zone will be extracted from first input with a non-null tz.} } \description{ Transformation for date-times (class POSIXt) } \examples{ hours <- seq(ISOdate(2000, 3, 20, tz = ""), by = "hour", length.out = 10) t <- transform_time() t$transform(hours) t$inverse(t$transform(hours)) t$format(t$breaks(range(hours))) } scales/man/breaks_extended.Rd0000644000176200001440000000161214520145514015716 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks.R \name{breaks_extended} \alias{breaks_extended} \alias{extended_breaks} \title{Automatic breaks for numeric axes} \usage{ breaks_extended(n = 5, ...) } \arguments{ \item{n}{Desired number of breaks. You may get slightly more or fewer breaks that requested.} \item{...}{other arguments passed on to \code{\link[labeling:extended]{labeling::extended()}}} } \description{ Uses Wilkinson's extended breaks algorithm as implemented in the \pkg{labeling} package. } \examples{ demo_continuous(c(0, 10)) demo_continuous(c(0, 10), breaks = breaks_extended(3)) demo_continuous(c(0, 10), breaks = breaks_extended(10)) } \references{ Talbot, J., Lin, S., Hanrahan, P. (2010) An Extension of Wilkinson's Algorithm for Positioning Tick Labels on Axes, InfoVis 2010 \url{http://vis.stanford.edu/files/2010-TickLabels-InfoVis.pdf}. } scales/man/wrap_format.Rd0000644000176200001440000000113314520130030015071 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-wrap.R \name{wrap_format} \alias{wrap_format} \title{Superseded interface to \code{label_wrap()}} \usage{ wrap_format(width) } \arguments{ \item{width}{Number of characters per line.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_wrap]{label_wrap()}} for new code. } \keyword{internal} scales/man/col2hcl.Rd0000644000176200001440000000145014520145514014115 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colour-manip.R \name{col2hcl} \alias{col2hcl} \title{Modify standard R colour in hcl colour space.} \usage{ col2hcl(colour, h = NULL, c = NULL, l = NULL, alpha = NULL) } \arguments{ \item{colour}{character vector of colours to be modified} \item{h}{Hue, \verb{[0, 360]}} \item{c}{Chroma, \verb{[0, 100]}} \item{l}{Luminance, \verb{[0, 100]}} \item{alpha}{Alpha, \verb{[0, 1]}.} } \description{ Transforms rgb to hcl, sets non-missing arguments and then backtransforms to rgb. } \examples{ reds <- rep("red", 6) show_col(col2hcl(reds, h = seq(0, 180, length = 6))) show_col(col2hcl(reds, c = seq(0, 80, length = 6))) show_col(col2hcl(reds, l = seq(0, 100, length = 6))) show_col(col2hcl(reds, alpha = seq(0, 1, length = 6))) } scales/man/pal_dichromat.Rd0000644000176200001440000000141114522421001015360 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-dichromat.R \name{pal_dichromat} \alias{pal_dichromat} \alias{dichromat_pal} \title{Dichromat (colour-blind) palette (discrete)} \usage{ pal_dichromat(name) dichromat_pal(name) } \arguments{ \item{name}{Name of colour palette. One of: \Sexpr[results=rd,stage=build]{scales:::dichromat_schemes()}} } \description{ Dichromat (colour-blind) palette (discrete) } \examples{ if (requireNamespace("dichromat", quietly = TRUE)) { show_col(pal_dichromat("BluetoOrange.10")(10)) show_col(pal_dichromat("BluetoOrange.10")(5)) # Can use with gradient_n to create a continous gradient cols <- pal_dichromat("DarkRedtoBlue.12")(12) show_col(pal_gradient_n(cols)(seq(0, 1, length.out = 30))) } } scales/man/train_continuous.Rd0000644000176200001440000000063214520145515016174 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scale-continuous.R \name{train_continuous} \alias{train_continuous} \title{Train (update) a continuous scale} \usage{ train_continuous(new, existing = NULL) } \arguments{ \item{new}{New data to add to scale} \item{existing}{Optional existing scale to update} } \description{ Strips attributes and always returns a numeric vector } scales/man/transform_asinh.Rd0000644000176200001440000000056014522421001015753 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_asinh} \alias{transform_asinh} \alias{asinh_trans} \title{Inverse Hyperbolic Sine transformation} \usage{ transform_asinh() asinh_trans() } \description{ Inverse Hyperbolic Sine transformation } \examples{ plot(transform_asinh(), xlim = c(-1e2, 1e2)) } scales/man/expand_range.Rd0000644000176200001440000000102214520145514015215 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{expand_range} \alias{expand_range} \title{Expand a range with a multiplicative or additive constant} \usage{ expand_range(range, mul = 0, add = 0, zero_width = 1) } \arguments{ \item{range}{range of data, numeric vector of length 2} \item{mul}{multiplicative constant} \item{add}{additive constant} \item{zero_width}{distance to use if range has zero width} } \description{ Expand a range with a multiplicative or additive constant } scales/man/figures/0000755000176200001440000000000014531055367013754 5ustar liggesusersscales/man/figures/README-labels-1.png0000644000176200001440000015615614531055367017033 0ustar liggesusers‰PNG  IHDRŕ l< !iCCPkCGColorSpaceGenericRGB8ŤŤU]hU>›ął+$ÎÔ¦¦’ţ5”´lRŃ„ÚčţełmÜ,“l´AÉěÝťi&3ăü¤i)>AÁ¨ŕ“ŕ˙[Á'!j«í‹-˘´P˘(řĐúGˇŇ ëą3ł»“¸k˝ËÜůćśď~çŢsîŢ ¸,[–Ţ%,®-ĺÓâłÇćÄÄ:tÁ}Đ }Đ-+Ž•*•&ăÂżÚíď ĆŢ×ö·÷˙gë®PG݅ج8Ę"âeţŲ]€AűČ ×bř Ä;lś âõWžđ˛Ď™‘2_E,(ŞŚţÄŰç#öZsđŰŽ<5¨­)"ËEÉ6«šN#Ó˝ű¶EÝkÄŰOŹł0}߸ö—*r–ᇟUäÜtŻ.iłĹ˙eąi ń#]»Ľ…r ń>ÄcU{Ľčt©Ş7ŃŔ+§Ô™gßxuÁ<ĘĆîDüµ1_ś u~Rś ćŕâ*-°z÷#°Mi*ËŤWh6Çňř¸ćf}î-gi:×Đ9ĄfŠA,î‹ăňV§>ÄW©ž—Bý_-·Ć%=†^ś tČ0uüőúvWť™â’9 Ś%/VµńBČWµ'¤_¶tŹâÜČMۓʟżźĺP““í\>ÄŤÉ@Á„yě0`D i|[`٧ čhˇčĄhˇřŐŕěßÂ)ůţ·TjţČëčŃ0B¦˙#đĐŞÂďhU#Ľ ~yh«uĐ fp#Ô1I/I’ř"“ä0!Ł ’'ÉSdŚdŃ:J5Ç–"sdóąŃÔy#Rź7‹Ľ‹čwAĆţgdŕ´ĎĹJź7ŘĎŘĎkĘ•×n^:}nW‹»FVź»Ösét$gj-tČÚÔťrĎ˙Â_ç×°_ç7Z ţ~ëŰV·5ë4ĚV }şo[ÄGó=Nd>Ą-UlałŁ˘Y5VúË}ąx»g[üä÷É?’kÉ÷’&ăŢä>áÎsźrźq߀Č]ŕ.r_r_qsźGjÔyď4k± ći—QÜźBZŘ-<(d…=ÂĂÂdKO膄 a/zv7«Ť]»ǰod«}¬€©sěn¬łÖá?TF–'|¦ăď3Nnă„#I?"…m»z„íő¦v~K=ÚŻĆsńl<b|_|4>?Âpß‹ľQěńÔré˛ËâŚiť´µšęŠĂÉäăb Ż2* ĺŔ (ëşč»Ѧµ—hĺ°{28ÂoIţýŰyĄesź8ü';÷Z¶9ŕ¬ĐűhË6€gă˝ď¬>¦xöRx'Äbß8ŐĂÁWOĎ«ëő[xn%ŢŘ|˝^˙űýz}óÔ߸ ˙˙%x ĹcÖË8eXIfMM*‡i ŕ  LŠ‹‘@IDATxěÝŘ5WU>üR˙DbDPšŠB^DD!ˇ—$˝Jé!ˇ&@B !4Ch!@ÁĐ‚vQŔD:¨ ŕ÷˝żIîÇýîĚĚ™9gÎóg]×óĚś)»¬˝öş×Z»Ěţżť´ićŔĚ™3fĚŘV\p[s›3›90s`ćŔĚ™3Ě< ÂĚ™3fĚŘ x70}ÎrćŔĚ™3fl+ë[ßZ|čC:×?ő©O-Î<óĚĹ—ľôĄ­{ď{ßű_ř¶~;ůđ‡?ĽřŔ>°ËµůÇĚ™3fĚŘ9°müío{qÄG,N;í´]řtĚ1Ç,žő¬g->ń‰O,îuŻ{->÷ąĎ5÷_ůĘW.>ó™Ďl=űĆ7ľqńĚg>sqµ«]mëÚ|2s`ćŔĚ™3öVl öłź]vŘa‹o~ó›»đéśsÎi<Ú—ľôĄ‹G?úŃ‹>xńÚ׾v—güľŻ{ÝëÇwÜâŞW˝ęůîĎfĚ90s`ćŔŢĆŘŽ˙çţçâńŹüâË_ţňâďxÇV–€ůZ׺Öâ‚<׸Îu®ł8ýôÓ·î;yĂްxӛ޴8ţřăWĽâwąçÇÉ'źĽřä'?ąuýđĂß:_çä¸@S®ď˙űë$ÓűîüŔ,ţçţ§ůë}pŤ›ňřŢ÷ľ·F ýŻj;›ĚăBşPĂŁM®»đ…/ÜÔa“y¨Ç¦ĺIů7ťÇ&Űš,áÓwżűÝ~Á[ă®<đi“m˝/Č“v@›”§M÷ zśܤ<ÉĂ]^“ëżřĹëË[ż·€ŻyÍk6žuÖY[;ůüç?ż¸ôĄ/˝uí˙ýż˙×€t.Ľĺ-oYüůź˙ůâ*WąĘâr—»\.ďr4NüéOzëÁź‚0.ŕ2Ezmi(«Fۤ€>uŮé@ř´é<đi“ ó"ąHS‡Mĺ±ň¤­•_{lŠ6-OĘ.ŹMRřÓ¦0§ĘwÓň¤śř´Ic(í°é<6™ţî–§˙ţď˙î©ÍJzoÖ‹ĆŇ-ÁGC\ěbŰzë‹_üb’ć=żčE/Z<ä!Ůş—“‡?üá ! >>e©ĂćS¤ť4.ůË/ľóťď,ľńŤoäŇäÇË^ö˛‹Ż~ő«“§›/u©K5|ÝŘ]ň’—lř´)+–q…+\ˇikí± ˘Ôc“mýĂ?üĂŤĄ˙őŻ}UhŇÜ´<ńĺ›”'yĐ;›lkŃ:“NÍ}Ů]ć2—Y|ík_ŰTň mÍpüĘWľ˛±<6]:\ę°)ăú˘˝hç˙úŻ˙:ź~đđ|×Ę ›3•Ë\:ÎPٸίtĄ+m=}źűÜgA©+żýíooťA˝őđ|2s`ćŔĚ™3ö"ěVľţőŻżřËżüËĹ?ýÓ?5ˇ”·˝ím‹Üŕ[ěKXóĘWľňâˇ}čâiO{Úâß˙ýß·îĎ'3fĚ90s`oĺŔn`cľ÷˝ď}÷ľ÷˝w˝ë]›ŕ!‡ŇĘË[Ţň–‹k_űÚ‹#ŹmŘě/aÖ|{·sŕ裏^ŘJ8tě±Ç6{úű†űÔäkxO~ň“›żŹ~ôŁS'ż`đ~öłź]Üîv·›<íľgîăÎ|oćŔ6rŕcűXóyNߢ¦ fš9°'sŕŻ˙úŻ›ŻŮů˘ořŚ3ÎhŠű¤'=iŇbűÎîĂö°Ĺ)§śŇüůpĎÔýăďţîďš2űŕĎvŇ ŔŰÉí9Ż™=8óĚ3›ŹŃďż˙ţ“+žlç[3VâŔ?˙ó?7ď˝ĺ-oY|âźX|á _XvŘaÍD&ź–ťŠŢűŢ÷.¬Ď"ţŕ?¸¸Ěe.ł¸ç=ďąřŹ˙řŹ©˛X|úÓź^\â—Řĺ{ô“%ޓРŔ=Ě™oÍŘNŕ›Ţô¦‹źţéźž'am'ăçĽVâľĐ….´8í´Ó§ź~z3vęs±7şŃŤOyĘS†T¦ éëWżúŐ—˝ěeľ”gƲ<¦"ü“?ů“S%78ť€łj~pćŔć8đ™Ď|fáď·~ë·?ń?Ńx¬ţ™fě‰řÚ׾Öx ·ąÍm˙ň/˙˛8餓żů›żŮ|Őîîwżű8˙ëżţëÚE×ţđ˙pqë[ßz+­ź˙ůź_Üö¶·]ś}öŮ[×Ö=Ŕ?őS?µn2Łßźx4ËćfLĎë‘đóŹ˙řŹ7ç›ő­o}kaěN¸p¦™«r€Š:č fÓ ă´·¸Ĺ-škWľň•›ăç?˙ůć¸Î?QˇoűŰ‹[ÝęV»$ó3?ó3‹sÎ9gńÝď~w—ë«ţ`üÎĽ*÷ć÷fěĺ°˙ěĄ.u©f ڦŕ'>ń‰ Š‹§ÂŁHĐš)ÇÓöň¦‹?€˙˝ÚŐ®ÖČŇĹ/~ńfýşWŻtĄ+5)LŔÂĎ<Ţ…¤ż÷˝ď5 < ¸˝ŹđÔyÚu˝/Mtsö€'bäśĚĚu8€ŻxĹ+6IüČŹüČâb»X3Ë:Ëç=ďy‹o~ó›ë$߼űˇ}¨ź{úӟތˇ™Ü‚üޱcGs>˙›90„˙¶ż˙űżż0éŠĚ"Ű8šÉż.3ß˙ţ÷oyÖeą0ĘěĺňŢŘság4đXÎÍĎĎŘG8đĹ/~qq…+\ˇ©Í.pĹ~űí×xŔ'ź|ňâĎxFŁÖ­ę?ţă?.nxĂ.ŚŃQ`ŻzŐ«š±ş—˝ěeÍxOx¦™C8€ŻIX"7&H….xÁ .‘ëŽ m˙â/ţb’Ţ: sóş˙ţď˙~ëÚŞ'ňŃç2ôłj:«Ľ7{Ŕ«pm~gćŔÄ(=`I C˙íßţíâ/xA““ń®uČ.E”`Gw»ŰÝšM?ő¨G-ľóťď4ë8§đ˛›Äçű<đŹýŘŹuÖóGôG×ö€łˇÇ/üÂ/ś/€ÉśĘľĘU®ŇlCyľŚ6|aŕ 3xN~ćŔ”°çđźýŮź5^÷şe<9lĂů‹^ô˘‹÷˝ď}ŤW,íŻýëëd1żűËwĽnÚ<é®/ŕ)<ŕÝ5š¸Ěü¨ÓĚU]ź_ţň—ß˙ţ÷×O¨Jg Ř­„Ăn~ó›/®ýë/>÷ąĎUoŚű7i]úŇ—^Üţö·_\őŞW]<ä!i®Íܰaţ7€×ŘExÝô_üĹ_,ÚĽßäiB!đĚdÂ\{śx,ÇćçgěXűřëżţëÍ~´ÉţµŻ}íÚëżň•Ż4Ë)2,mŠÇ—YńG,€f4ůŽ= a]»…Ž:ę¨fŤĺĺ/ůćŇ7ľńŤÜšŹ3:9`ĆüWżúŐŢ46¬˛Ž±Ęľć5ŻŮY°á“uŚSuá©ďŽ X*6{ŔťÍ;ß9°+^ô˘5aÚWĽâÍ©Ź|ä# c¨@x,Q./~ń‹›×xż¨ô€-˝0ľ°ÍÖQf<Ţo“ŮÎľđ…—Ľä%·ľţ2{ŔáĚ|ěăď-ć™F¶űŇk»G^„Ë<`ﮆλ3·µÂ|mćŔÂ/}éK‹N8aqČ!‡4^¤ çmŹx°cÉ×]žúÔ§6Xż¸ČE.ŇŞŚS“ Ç’•˘B׺ֵƾ:Éół< çDöud6ňcófÝŁíńě&uťë\§ ÇŤ­?°ă!đră%”p™^€sť0tó‚-™=ŕ’ëóyŔŮńŞíąuŘřŻ}źűĽlK ěßĚ˝ńŤoĽ¸ÓťîÔV”ÎkúÓŢđ†Ĺýď˙fISçĽ1đ™;'˝op€eÍRö32>řŕfć0/řz×»ŢÂĬ±oÓR#°É>nG!îrM.K­ Ŕ–ńŇëtYfy§Lĺőů|ßăŔ;Ţń޵Ś-ŰP2yź]$šĂ¨[5jc Rź÷›|MIJZ@ĚL÷ţćoţfńÂľ0ʵŹ9ć¦ĎÝë^÷j˝żgŢ.Ďyl @›šLň0ŮĂW^ËۧŃîqŹ{4Vş )c)`§Ľ<ŕ„źßő®w-˙řÇ/ţęŻţj+IţU÷‹âI7?Ş3W ŮGÚYęŢ÷ľ÷â­o}ëĘ5ô-Ţ>Y’°>¤W A/›ťÂŰ…‹ë¨fž„ťąŽ>účő©OMZ¤ Qmc^Ć©ĐX/¸ËÎî?f=—´.[Ň”qą2ÝśOéó,(ú‡?üáŤLóqű9`źď3Î8cqÇ;ޱŮŇÔ—° w¨Ć–Č{úŘIKäm•´ňš—0€Sţ,ĄĽ(FŰGFDťN=őÔfý»čRIďyĎ{˙řÇ ëí €·ËsŰÂxŞôG4i~Ň5kL«¦uŘ»&rY Á>ë`ůw­w´‘Ć;ßůÎşh[żíuë}Ű÷užÂf™¨vÝë^·“[e‰VWçëă8 šňđ‹>đÍP‰‰„ľ7Í{ PŤKq±%źC<ŕUص/vőŤ1×ĺÎnY©W&6úüfMĎ|ć3›¶lÇZÝa­V Ô÷§ţ}~Ť2usz3¶ö±Í,áG?úŃÍ8©ö0qw·ŞĚ@ôŐŁ!ëf…  Ż” —qA`ÄýÎďüβGwąŽç›cí¬ŠÎ”¤ ßä&7)/oô|૲wN|»8‰Fżńż±đqű)•>¸müWÝVń€)$cŔfPÇ+ĺëüHč­-í^Ćsť#ż)Ű6KßĚm^ČńÇßáąo´˙źÂćuPĐż÷{ż×Ě.ĺ 3^ţň—·g:_Ýôňtä‘G6Ţś=•_úŇ—6rĚh\€mc’Ő2"{Ća»"7mďó~ —čÇcČeJ˝â ×ü±Ź}¬IÖ8oMřŔcaÇŽő­Ťýžxc¬ťŢN™‰,âž}öŮ“d/-ăX]ł>Ŕc<ŕLŔşI—,d(TlůE Ŕ®ŁÔ3•Ë酪뎼žÄmo{ŰfĘň^}>…ś™Ű Oú ÄÍnvłć[±u~óďÍr †Z˘,enĽĹUy}ČůĐŮÉŇúĺ_ţĺ°żßýî7Ř 6ţkMď%.q‰!ĹŮz†!«^dž1úío»ąW°a7i 1‹ś1´ű&+ne8ŃÉ Ŕ1rNf÷r€lBëťuÖY“őÎĂěň€ŤSQc&a%ÔËëüąźűą¦śŔ_űÚ×n&{ń&ËśÂyÍňŠ’ŔµĚóô~–7•ď´ť+ W×UÉL[ü°9BŰŐhŐĺ(Ig>ŽăŁĐĚTP$ŻcBĂŇđŽˇ‘!°ź90€2^ŞŤ,̵Q†/ţ¬CÎěç|zíCúĐůf Cw°ÉHĎ~öłw)BfóP"Öůy¬%×ahKIx-Ś‹ΨαĚ@)[ócä?|Ťk\c—·(Ĺ_úĄ_ZĽűÝďŢĺúücłŕ‹š´Q–ŘŚ CóNM\ň˘1dV1Š1ŰőnĆm3ˇŞëą®ëę%Ť¤ăąˇlĚśń.lľť4{ŔŰÉí9ŻŤq ° tDŔg™/}÷»ß]9_JEnĚ×p׻޵IłL0!˝ňZÎ-3Ş•@Ŕ’%nĽ×$)ŕ…üŽçćE óf…ç,- u… ăM ő€×`ĆPc ŔĘ) ýÁ~pĄÍňSĎľă:aó¶tMŕKµÝß®-ó€Őa,J¸úŐŻľK„c/Č ŕÎd,C0·şŐ­š}ĐË÷śYÓ[Ţrž±íź çşďńúŰ<`›ĆJ?’ßĎĚ<ç4v+(Kh<`…aÍZóH9gBĘ*…,=k`gr‡ÝrJę A·pĆ€yŔ! “bpÍѸ˛kň'˛8đŔó¬Ż1Y¦a6'ĺhvŇLzÂpچLËő®c”RťN×óőu•` t0ľá©Iľ<2ǩ葏|äâ·¸EłýčTinw:dgj,÷…‡ µÁź/•uA 36ɵ!—’:އ^ŢÉzÜăwľwĘgĘ´YŃĆżë1`ňí^M<ŕÜŕőĺŤ˙žxă,ž3Ř42şß~űí’U9÷wą9đNşQƲJŻ«Ď<đŇ ŹwUp2Ş&ĽXă‹(Td|Űäk{ăý“Ćĺ¤^@—' ëńżXţ«† Ă›6¶lŘehjé°vúźřÄ$IăŤqvˇ}‘‰˝‘L–“.° Ŕu ›tŐYş}ťĺfúÚ­o}ëóm cE8r›~üxŔŇŻg(óÔmmúš×ĽfaNŤ4ÚĽ‹Ä(s\{Ŕä;˛ž4ô=ýkŕpd>ÎÁl7ݞş­ Ěý\z¤Ä|ů%é&L,DYz\]cŔö‡¦´P©(ną–˛`Ę“çžMóVóÎîp‡ćz–ý9 |Kkßómág ~ó›ßĽë˛ć2Ż`UXYŚ‘6⥪ă”ĨyÓ›ŢÔ$)*0™ «Ý÷ß˙…ŤL`›¤Ź|ä#“ď;>wyŔÖŮ’ż±!h˛9ÁĽQ~¤ođ|M¸2ŽjÖs)ó–Ń%®eŤă IôĽ§ź~zcđZ§k„Ż…1”jĘر˛`«"ęýô˝˛ŇČžĺ3םďsŕ]Xç§óNEŇŇŮ@Ifăęř«đSžň”&”M#{Čšĺ‹ňŃç5oÓ’2ëZ©Ś<Űf…۸ Ķ»/E=žsßwOĄçskęť]‰J…ÖŔ<÷[Ţň–Í»&©ů*ŽŻČPÄŇîe)Ë#Ą×ćýć] ż4r}ťŁ‰]řCńNŔÖˇ2ÜlZAQqÄëqé»& >˙ůĎ_úÜ-É\‚¶wÝX5) ,`kC r%üL¦‡Ŕ×pD9‹_?T.×»&ň€Ű˘6§ťvZăťň˘m« DrMoé€Ë~'o2á–Ľ€+}üĘłSçôÔťÓëä€qż¦,}¬ Ëvľ4ŕ†% ׏ó^W`KN:é¤f;żźýŮźm’f5ĆE™”!Ď(Ąx»)1łP©€\~ö ŻĄTÎ…ąÍ"ŽěYŢ$ĹGkn“V žŔżö€źö´§5Ďú€ąĐíá‡Ţxżň+żŇJąŤ%Ţ7jî"\ň ëą1×…áMśůíßţíI‚ęf¦ă)p!ł›"ŃüĆ»ď0l®Ť=ć}»_uŃXŽY† í´ĄëÓ†Jns›Ű4»XEîJŁQź (w°çk&ÇĽli#}‘ě G×X>Ň©ŤľČv ŔćSěďWůg®[qţ˝đRď~÷»7ł(Íâe5„uÉľ®,d®ÚČć yµÝo»FŮ<âŹhÂvńA,gáhł@-˘|ttöž®¸Ë”ĄL1••!Ă€±]¬(´R™)O¶Ňc`€•;äů(Â\ŘĆĐ(f“Ô(NĘíWőW›/ĺPL%ç˝eG€ÎM¤ íů¶ń¸¶ç†^Sż÷ľ÷˝‹:¨‰Żu :ĽĐ†Ů‡÷»ďZľ!Ďx3~îmbűČu§©íű>f0€3g á[ýAżâÁótyÓ‘ÉČ]i4`|µŞe­Í6CVEnBwąË]šífë¨GŘsÎkŁŻ €őí0p¸;÷9P`}čC›0ç«_ýęf±»ý‚_ň’—ě2–:¶â@üAzP31ÉĚŐ6âSHmßëĄ4”Ł.iP,Ż Űu~$üŚ0ŹT§=î¸ăš-/ŁęI-}p ŔńXJfé =x ­TfĘa‡Mń=—ÝŽ˘ĐÔ•ÂŚ"ôĽkňÁŹ’€ŚĄMĆ=y”TůLßą¶ŠäE÷}>®mFj_şËîei–ńl!xĆPű˛w»î ?SÜŮľQdw_V]&ĽaGcéëÖĽ—˛ÔV®±ÄÎLgc˛Ú@ęHÚ–•2¶ŽŢPŤ~U÷;FU ˘ŇŔ䪼NöÉÓÉ'źě‘-bp¤_Ĺ.Ł.‘íŇ&GÚxŕ-6Î'ű^ö˛—5Ëf|'áZ{6ŁL€[g¸1LăBÖú–šĘ´x:Xf`–÷„‘yăÖŻ–e“˛şň4é‰1ӌͬ_Ŕ”J::8^*@ -/Bml=°Đş1ç6¦hL˘şď}ď»ĺ€ă-—¬ţřP°üŕĆĄÁŹWď~ =2@|q§Źęp`ßłCîÉÓd"ăµOhsČűmĎs7?!źť$¨6¬ÚŢ]ĺ°8´¬Cä)”®tJÖ/ó‘‚®çĂxŔ6ĺ` 2HoűŰ/ôńţI?rč:Óź"Wä:ňę>™ó~¸&˘a®EvSs ‘S_,jűŕEC8›‹d©yy˙Í!čmdö˙Ŭx“G}ôâĐCm”[x@€° Ůí đ™,iKGµ…ˇăˇęř%%Ükß=aBĘXöCÉčäƲ3ŮpۨCIß;¨Ěâ1‹“Âĺ­€ËIXŢáá"@ ŔË4\§4”'!č_ ŔńŞ2ŁŰűˇĽ/-iý+ĚÇč#^'ĺ˝cÇŽĄ;i#ĺgLAXŰj3Ćq"«¤Ď cdůBU(Şű„~Kţđ˝ŤL,=`Ďč <|Ŕmľ@é‡ÇPĎ›5MĆÚvŢr­Íŕ €€µk(ý#F„ë˘h&vđywSÇ€7ĹŮ9݆ĆyľCZ“ŻćčcÉ lÇ(Íx?]iPÎĽÔ¶‰X˸ UQ™ĺËR‚ć©Z{h§ź·Ľĺ-ŤGĎ«§8¤ T¨Ąâ±©…É;¨żOš:Hk…–űĘ’nžŁ|âť«?%Ó¶64L™z×ú¨Üň2y•GF %™hFyŻ>Ź‘Tňˇ~fĚoQ‹(fuÇçuX;0JN$Ţßň-{–1˘MČŹ¨ 0Ŕ1şVő‚ »!03˸Ţ˙ţ÷÷ގ'*đŔůęU[]`ä0÷łźş#ă¦ô€c4@˝€MJ:Ž&’÷Čwîĺ}ů를%ż„©˝C˙ôŐ#énę8đś­=“ ’Üg’0¶Eéó®jâI¶zůNý\ý›‡fY[M.# cü© €3IŞn?Ö>Ŕ`©‡xGečQŹzTS†ŚmyŢř–Nog("†S~vŤˇ•vő»&í_{Ŕć{$0ŠĚé˙e¦wÔ˝Ţ{şÎg“ż˙wk“ąlcÚmŠy•ěup௠- ăĽÄĂ›7ŻJ«ë=ž‘ŮľŮßdĘÂ$ÂŐő^S óţ®®ç¤ĄÓ AYó HžřÄ'6żŐkH8¨G[”7 äm÷X ǵÝç!›hĹ#c©ęĐéL€»~çŘcŹmB¦”ĹçŤ}ĘĂfŹ}ěc›Mö-ŰAĘĎ&ă±”ĄÂKĄĄ/T Ř÷w÷|ů5 íü¸tîx #že#ô¬­%Č,hźéł§´zy®®Oóŕy˙̦¬şžaĚ(7>á{é‘ud$t˝ON(“ËBŚ2áńg<ăMŐˇ”'ňiMfWšIÇ1ľú÷=źţÖ÷Ś~8ĘYăÖqRú>ŕKFIIG7wţ“‡r@ćÖůŠ`¤úzŇę;Ę·mbť¶ŕW—®?“věŘŃś*Đ˙–ĺ©­Ëglŕ!?kŰËëmetźáĹwîHĆÍuzä9Ŕä>Ů"çÎ9mĽ*ó‰qÄörŚaÔ}í(?ĆjžőxźÍµ2}ç Ń©®űb:C–'Ď?Ďkw}5żëô‡ţŽĚfŞ|/CMĺµň|źŕXTe%W9,„9 ż-ŤŚť  gŚÍ›0đ€–¬ó°Ë MTËyÎb÷'VŁNŘGsW଱v°a@P¦:Ĺdl×a™źN €Űň`ĺ#3Űî»'˙ěéAv_Ěp¤€Ŕ”>Rď2M<”@Ćú\‚o˘bőęh'íÜZ2»ő”!>€ŤtPůčřŚéűL0)©ĚŻyáĽ5ĹąĎĆm ®cR(ŇŽ×-MŢ€úÇÉűeÚ9ÇCĘ«ëmFäG׹ÎušWyYă  şŢľŢ/ď»fÂ’ľ1a|őŚ|”°–ď4·üK(’wŢ÷<Ъ۶Nż€DťŽ­5 ö%V>áH†eä 騋ň1$B@îőů:M˛,ëëI«í¨?ČCd%y”ω¨uFCŇ}ýë_ß„xýúgťuÖÖ˝ňÝňpä}mă#–ĹuőÇň]çŚD†š4ô=†*C€®ˇ_ô7Žűú"ÇIW0Ô’wť®ß1zDI2űą|.}]_#Űú…ţ4łŐkź|1”EÚ®&eGú~3¸őyčëĎŕ¬ďů™+űĘ=}Ű‘ţi{wě5ui{Çő>Ú縯˛SŢĂl“SxV¸”xÂ+SäC˛ě(¸Kŕg#`”űcŽ`dHů.Ą ¨(ŮułË uzÂÜe˝ć4@Ea—oµ™@Bq±čy<:e«”ѤڑˇLŔ|%»‡ŻĽ‘;eŮ ŻÍÂö,ş¨Ćŕ°¬ŰužI7]“s„ĎÚµ8ńÄ›5µ€żüîq[şÚ<Y} •`TßűŰŞ 2m‚[…§c`-#2Â8Ěw¦Űž“7¸Čť>€ÍŰB•gŰFä I?ôërL_;`ŰŢwŤÁ­ßD&ęçb„¦Ë‹#2aôôĹúÝíú=𩶢dÁZ®ÁKĄŕ§ŕ>#ŕ0ZĄ &¨Pęéle”9˰kvrůlß9eŇ÷ś±ůÔ§>uë1ťŐĚ6ľ€ńŚş°´Ŕ®1,LZ3)' Ĺë T¬ŃĺSęZć[&u™ŔdiQQ¨`ó>řŕć:Kë°¶•!«–ö‘~/ßľ2×ď+_ĘZŢóÉO ™•ć­ €kůlÎŔŚE”>á·IeůZTžď:.6‰LŐ,úŻĎČJžĽd“čôi<.© A§d“A†Ç;vě(ß-ç3ŻČvBSZlÂ|Ý„)33‹oĹäLŘ0R¬ˇ(ÖX¦ą>ćh&iS®}VňĽ(€)éĂ;ě|ë¦}vEY§ĂÔ Űő ž§čm$oY„NURf_ Äb6žkÂPT}ŚĎC‰7ń×úť€ŁĆzŔŇŤ1Q瑲âžăÓ€@},­ŇfśE>S–¬U÷ Ńřąöcň„K>äť±G¬Ż %;*·“Wń)î.®Á¨-Ťe× iĐ ŘR«–‘6ě2čÚŢŔ)kî źzꩍřn6 wŤÍz&餣gčĽô5°!Ô‚ö>™%S5Óť&” z|E‡rČů¶¦Ň×xż1ő9ܦ/š„¶ůß Ŕ+2Ľ €…BZޓ߀­¶¸>D°(ÄU®=š±«Ăö0Xú«Zţ<5–l Ŕ/|á ›ő¸<†Jxę,éô©[ÇŽ6vôěg?;ImŰĆfY˝fC{7\će“IC[‰-9±^‘Âk#Ŕc‘"ćE$|>€••7KỊˇ’ü +!Lü Ŕ}áaeŤQdňů®Ř’-ó!b áµđ7ăŃ’=eěË#ué;Ž``bĽŐ\Ľ©)mţŐ÷ăU®Ú¤H­`8ꨣšőč@lé7]]Ű»ä*euźÁcY/ŇZzm`™ýD¶»")ŢŐ~d-pú„>CgÔ†®wÚhڬOÇ0eČÉcĐ›ÄxöŮg/î~÷»oEĎʲč{%koĽ–ßhŕ[2ł4$ÄÇĂbýëôS0ĄmĽ™WzÁ”kbĘ0ôOĄo,'Ę5ŢăĐ´ó\¬÷€uhą%U&zńŚJ 1[:ťľ €) ¸ăunÝg@9ů;ş‡OĄ"Ű˙ýĺÄg|Ö;ái—BöLYЦÍŰřE ť_ýLüpm"N^Đ’ĆČBíŃĹ–Ç*ěý>/ă[ÂĹkĚXeĘ€…»K2ką )ʰĽźs0úH;úăKO–šě—:$ź]íŤďÚ)r™÷ĆĂWcżCIhµmö6ŕ4iݦÚÖ MëPçČ\‰şu:~3đµwę,íđ nó¶÷s «{V"äzŽĄ\ęRúÉDݎ¤”—ľRÎrÎ|"sé—92b÷šx…VŕPŕeÚ¤“°7!]€)„P ) ĘÉ$:HŔbl8ď°,ťF8}}Ůď6~Ík^Ó(n3„y(“jśŕ(†pęî>ŔŔ–'­lŽB]]$ ]°zĹ3Ŕ,í2é3¤Ćx§ňÚFŮ7ąůqŢż€ŐŹ2ăť&-ł˛í FÖ˛3÷Ŕ~›±°÷FIł<â‡I`x•0xĆĄ=Ç( óŔ¶&ˬµĄ ăqÖĎYg‰X}/żH}ňlyäY™eŻÜ/zŃ‹Ę[[uNírsçĘťA­ě«R¸lŁeiń\ µ§JŢž%isJ8Ľ2/BŃ.ć}ŘřĹË:Ý2=çŇĘ3ô yŐvcúFć[´‘´Č©\t#Űd| ŃŚÂxëy7Q†ľ~ŹOćt¬Ň˙’ć”Ç€Wŕ&€ĄˇI ˇ°ćŐŞĐŔ ç•{4ŻŔBQËśŇ!¤«NÄ2ŰR 82ZěDe·-×tpJŻÇ!LPŠĎţóEd˝oétĺědĎň‚Q×$,–÷E#-Jއ“˝Á] E.Č ĎŤM?i93ß iąV*wLyŹQ2™îȤEÁeü°`j` ŔxĐ] Ż]KC¨I¬ú'üŚJ¦°·1Ă>h†URö<›úĆ–ŽážrśV_7÷ĆWŕ,ł &?şˇöâc”¬_ég‘˝¬‘pđőń¬¬ł6÷[=J9K™şŽŮĘV¸Ť¤Ą.ä"şÔ„9 YGRÚŢ/ŻĄîu;ĹćČčźęMwî)4đ -ď6BS'ázž©ď ů]°±ăX,Ř!"Lc‰2V]ĎnK‡˛´ÝďşĆ«5Ƕx!ł0y €ˇývNôJHȵ€ăÝ _•ł]’xfN/ŁÚöĽq#¨((Ŕ“0ž2x˘›ţă3<ę0XŇ /Fm`Ň»<€4@8T*ĆUCĐŇęȔڠWŢŔŚQ…6˘Ś˝Ű•>%ŻťÓmi`2 B–™ůbS>»ëmGŃĘ˝¤”G1hĚÜfčZź1cĘ= Wľ;ô<<ĆčĘŘ6Ć#2JŮJľčWúWČ'ĎO8Q˘My¦<–Lç)ő,—Ďvťó€ÍŤ0ó»ŤđC.=`Î1jŰęŞňt'–_dyLú›zvŕ8pí`°°K­‡fEQSذŤY†xÁ„( 54]ĎpŘţ±]鬺ɦđqůác€€ŻôXkď´`ĘZGDQ’<$V»ĐŘ-oyËAĘ{ľô®Ěڵ/#B*Á¨ą0ň_<ÖđxČëÚS;–ډć”íŻ/^ ô=§…¤e€.‰áÔŔŇĘ}µö“gä é.;šm,*T yGSN}:şTÄř.[ú—4rě`cáúxö€Ăµ˝čč™Ä`ĽKgć…™ů*ĽS*xĚCÉĘŘj`Ţ'…tĘ”‡•pŰŞĚSŕů±hun“zN>ůäÖ"˛ ő¬Z^nM–9¸găŔúŃc’şß`mCîĆž•s$xŠv(ůÔŔřˇ˙–)\—ł|6F‡|ô]}•¬ŤíXm+ôaĆ(Ŕúý2C®,cyNŁđ‚Ň «ŚA`r6pÉą˝äÜfç¶·Ó€2›Ý›Ś[”ë~soě80±ŚĂň!(¨Óf=ś˝Ť&ĹCŕtř±ÄÂŚ÷ëş+DÄ <"Ôe^ľ¤ň˛—˝¬ĽÔśóĐŐ?[íé|ĆkíBU/{˘ (â„Y±:!«[fF€ă%y~(G •@_:FBň MżLKgg˝źuÖYĺĺ-/;e´]ńLPjÖ@3ŤłI“˘ŚÇ5&ŹĄgU'÷µ8lž™°c‡’ŇAúUd)íĽ 0H_Ę,Kqk¶ű:W2®=`ů©»zăad’Âć Sâ6‰1¬đ”§<Ą9¶-R^}©_IŇîăMůlyÎhQď%]Lđ(}.ý)Ńź2Mçd^[ôyŔꯟqP@{l=ô=żčĘš"źž!ĎäU?żěw9„…oä*ˇlŢ/«ä»,˝í¸?ŹärŞń ŤK±S~Ć4ýe EÉ&BĄ1$ ÂÂ:całľ<ëł3•Ž ţyYŠçĐüXňOe;¦XNfďR°Ę‚(6ÔŔQôÍCçý«˝#Š‹R‹b+źÍµ€c8{»Ć‰RŽ’–FˇLŻíśw#ť(Ąú™XČeř@Şź_öŰ,o†QądڞŁ…ÁŐQ;Ż«B§¬ Q*㡠ťU<ŕ(ÖŇĹOÇUr™ĄhM°đ>EË@"VáÓ€EIOűáxŔĽ_íÍËYF‘emˇMńAZ)Ż÷ăí%-ü#<]Ć\ÚOă ‹ÔđÖşŚ¬¤ŐŔń€ónĘčm¤ś 9 sŞg[8Őóé_‘WרˠăU·y‡ŢKżÉPŁ%Q©2<*A յϓÄÓ>8lh#°”)üw>”˛yšO PtZY—ˇyxÎ{ŃÓŃ˝%“7|Ó/ĆäżĘł3䚆ŇđR3{0ˇ/ ˇŠ É"ďF8(:Öz›Kв†/ď ÉáŔă‹ŕëŘ:—:P}čCoĸbĆŻŤą™J±gĚWG‰RŞ=pťşěř}\{§řÉSŚC!Ţ©Ľ˛ŤăEĐŔxwüńÇ7¬“G©Ć¤_óţ6·ąM3Űś—vŰŰ޶ż ŔĄ}s¬ßóŰvŕ*Ź÷c”ŤÉß•±TěuY¤—1A ËX±;—ń~†á2ĘŇš2Z„çĄ Ą­“–ű1Ěk!ĆcĆű"5yޱ €Ő8ę×&·Eć<ź~’‚kĽ9c˝ ź»Jź©yŘĺ36Ě´.ż…#PšĽ{eČP‘2Ć“+ %ĆW ZtQiH¤|ĺQÚĄĽ—÷ś'=ő¤#Â.C˘~żü­,Ú.†u%2BŻŁU=TrBOÚ´OäßŇ/â䤻óřż˝;K±‡çÍűŁ$|j-¤L”n©XxBéy§ďáŇÔŮP[GŠBr?ď9_F,ôx•Î);uŕ3Ś9$ă&G}t“śeJ&ź1([”±.çĄňÄ^q“:-C"–Ľçk’nęšÎ‹?eŤR–W@”cť^Űo†ďľôâ=g<˙ŐŻ~uó Ą©¬ˇ(‡üs4vHáuˇ Ŕ«”YŢ”e†H<eYZö~î«s©Řs=G'ż1ý.ů3l8$őPVxN=2–ť÷‡Ő ÓOéëtŹu⌿8+iסénňą€pWĂ » y™ĄŚ(Ő‹NÁ3Kšg@¨ĆxŔŇXgjŕX§î—čwQ±đcUë\ÖŻ]ýóŘLô2ł•AAX…Ľí•Tp„Zľ±:ŔQQ”meSżÔŐ}uëň€ĺ•1Űt޶4ëkĆѵI©ř=S†Ä(Í©Xx¦”–e-ŇNąZE‘5/¶üŁ,Ť(đI>ßb(3ĂńyĎ{Ţ–Kd!mĚN»-Söy?łŕŤ¦l}0cNyJy— \ A$ŕůL~ő‘ŚK3ĘŮ}é3ŽÚ†{˘¨Ó7=ŻŢĽ©¶qś1ĐĂ@IDATŕܵăw[{[źŠÔG´+2ľşÇ¸·¤F4…áum(®’GęŇ5KšhŮ0yM´I˙MťbHž›Ęđ˙m{ „żÚĎÚ؞ù“8É>$Dźú PO;®ęa'Í)Ź3ŕ&G„X!“>ŔB©” \k”KBĹÍK=˙"JBDxň»|5ťŤâÉ{ĺý®sŔY0/MřŽâ5m?ű3vŘaŤ[~­HÇDZŕŇE]přÔV.\z§:`<ő$ů­sE)´)´¶ô]ł~Ď2.›ç˛a0GĘď~<Ő<;öhlĎšm ŕdVf[»ŽÍ#ĎGR~@<†?I‡bHÖŢš`řńŹ<·šcĘL™Qŕ€‚ś'R±ËĂ-?â+§ÉTé#ÚQîikżË~çw(ëqŔ®“ăe#¨śĄľę­żŐĆnę[÷1^0P,'}öD!¤Y’öh3-]$Ś{‘Ż4ӎҰĚʵ‡<ä!M’éŻÉ!‚‘ ÎĐ_űHűé»eęç†`íSÔĎ÷ýVî:Bˇoú˛D­ ŔáAů—đIú‘ł´«k»›fĐéX< [)Úd‚ŕ—ŔÂRbĽGBÁNXjY6ŔŽ(·Z!$Ťt ś÷r/ÇL*ÉoG3Ě;e%ĐXˇ"˘xú”RHB”Î{eţń KÖ)âŐ'­ňHQPáSę…uút" CŮ@”i™V׹t„…ßţö·oŤ]{¶`Ţ]ŇmS]é·]'€?ˇĽđ6ÇU˛-×’GK›¬˘dÔ™\P†š;˙ĄĚÚT=ČąŞ”#3Ňăië„ Ą-˙rVę™H9°g#ËIŻVđy>GýŐ¬ÍE«ęţ&˛t|É‹Lš ŠüúyuÎŰö»MžxŔ>ˉD˛YEú‘ë&»™›‘á-eL;ą82ŔEu]š‹ĹżôQ ×EÚY˙c`©CÚżëůľëÚ[٢ó¬ÍkŇç´wÝÖynČ1ďâUúYŮŃU}úhH>S>3đnFđ8ŤeÄ’ŻőnŻUĎĹ󆎕m~]V¬NüE¨Ęj°*-M)óręo…ë çÄŔĘ€ý¦xËü°KO»äQYĆś'Tĺ™Nĺ§®ńŠxęLŤ'2KŮdĎ`i&Ô§łúMńEÉ´)Ě”yĚ1Š_Ţŕ[ę7&­®gcůÇs"K«¤Ďč$Öą:ŔiKy'MaXD–)úćÁâźľČPf2$,X[ž 8D&\Cĺ čsŻś›yOżËőň.Až‚VGwęşDŇ7“–Y˝ĘžŹÜ»žđ3ýP*ýśG®’Łžü‰¨é8C$Ţ)ŤłÝéüÇ'm“ptSd Ă`Ëú]žŹĚ¤\ĺßé:}Ť"ßU óôÓçÚŇQ–ş­Űžëş–wń@[ęgŃމ®ŠwĄłť×gŔíą1RBÄ{»„ žüä'7›d9!) ĺĚ3ĎĂ˙N¦ÔZ!” é@€#BUŢ‹%]pĆîâ5¨C«o< ŇĄŔâK‡ Ç—ż$Äjßj‚ż,ď#/·ôI˝Ó‰bĄ–J@˛(Fď%K”ů´ÓNk^Éd"?ŔĘk|eS–)Š.CH‡zŤeZ]çůĺľĘ8—:gb]×ZŮhFŢQ\`Ę4TWŮęë ÁaPů)ÍR7ą^Ţ#ůŘS 4¶ó¬đ·­j‘üę:äą!ÇÔ+ĂŚ;:˛$íY.Ż=Ď» C:…<ĹP‘]Éš˛ď -[×s3wq¦¸NČ)~V.…XXteCN_RŃYXÁďCiöK.… Hv—Ó€m«˛"P{ŔŻôNÉ©zĄ\ŢÂ$‰Bą†˛Ä)›Î˝şë˙pňPr•ßm<#kmF.› Őż¤Żď—ý=çe”J9Ő`›ÔeľĎý‚Ľŕ|Ż|™ň¨Ç*ý.‰2şÚÎaxő†ěBÚÁ_ú®Ź9’×čd\*ŇY524¦ cźťxÇpBgĆp:|ŰëźrČ:wŰG ę÷J‹÷UŻzUs»¶ČËwt8 ¤M9dĽ¨ĎXčĽ@[Y|·L7çQFĄeLŮžłÓş¤0…\ćŻ:ŔĆÉűĽě䥇zčÖŇ'ףěăĄ.ę\+ł¤łěh3ťĐä2L)ÖΫ¦ß–?pÂxäĺ×öüŞ×(,”*ň‘ö“^ŔQXT;RľäĎQÚĎ0›OŇÖ®dÇ,î«O­)pu¬ĺJ9l±jźtŠśŚú]NĽ«8žŞ<•Eţ5i»x±ĺ=ăűř•04~|ŐJż €®ŮůgL¸ÔeľÎĺ‘tńŹüâďH24—‘4đ~2%C3]ďÉĎ;«’~@źYá6‰Á(Íu{ŹÉâk‹čޤÁYX%2”÷7qśxW B§ź~zŔ}ž+¤ŕu(ž]pWvń$)ˇ-ÔŔŤ"˘Ľ„Să©č«Ą€®p›o¨úŕxÂŃî×”V Ŕ<`ăoʸ`Jź(ž ęăS™§‰m<ÓLBŁř%AAĆ#X€yB‡Ây˘fâę¤%ž)X´•<f+›šdšöÂŁýz˘']y§Ţ1Ě8ŕ€F–âUĆŇö‘‹>mË' Pź˘l•[{×pgč ö€ĺe»Jr"˘Âg,úPE(śĐg@Ś wŐCťŰ|Ű”#[Žę_mśwĂ»” Ł,ĎŇçr^öÝĽ“c ňž#_Ś!zŘ·şÍČ»ĺŃË©8 xUY•Ď9Ç«ČG}očoú—N‡˘č<çăuX:y?!čŇ ›=`Ú ‰’BvÖÁ5d°h|Ďh|ßÄ%Řľ¦ÔGF“¸€5°ěH šYhY„ë2ŢŻNĐ’/ ťâ4Ö*í,kč*“ôĄ‘Y•žŁÔŐ ĹNą]‹ŇPJ•12„(ĺbT xJĘŔSI]ڎÖĘlHúyF¸ x'7Ó›RѶ‰<'@ą®˘I^9â%ŻčăŃ&=ଡî””©íŻęźĄvĆ͵I>Ż6Qţsv*l46Ľŕőy_:xOĆsí±0VČEIĆJ= ějb`ůj’Źç|Ľ$ó!<›ń焜ăŕ.9UçŇČ,ó† 3|˘éŻuŔĄL1"č3€}ˇŻř•Ś:GŢËür^zŔx„Ź€T9E’†’m5ń‘7ŹúĽŕ©Řf?"Šä¬ÔS0ůBxZ*®áO {ż÷š=ŕ­@`\B+“IgćÍŮ4XeiGů\ykÜ6†5LH»ĄÇ’×i…Ý•Đ*%ď\ľDi°Đ•Ý3>{8D)×x:Ň`€„xqŇrb4ŕ“#Á7‰G‡î«CŇĘQť€ О§Đ2©‹:—Ę,ď=âWXY@fa;wmJ˘(\DélĘ¦ŚŚcCĂĘf=¦đ` ŕKޞ܆aĺK]B»ä‚<ŤĺŐă÷¸FŽđ;ůŕ9YJ[+ "Ońhν˛h€5Ű1ćZy|ä#Ů|žĐ:f5xŔ‘±xGŚş®zĂ€h™Źsúč›U† E ňÉŁ”Ůłv~®R¤%Ŕ'-{z[ÂđE[v‘´¤‹o1čů ›¶Č@W:ąN?q(úX~eňîcôpdün€#/]˝2¦Ü›|vŕÜĄĺ3®ńlűX{Â1a)_ŚŠ,}”<Ňć}¬®‰ú4/˙ČĐ;żk¬ĎéĽÉČN@Ű‘çť9$^ŔřL¶CV$ŞF>"+ą_塯ńŕő ă×ä‹3Ćŕ-ÓdTőđpŘš|}"şC9´5>•<)Ë7ô<ň˘-jN;ŽŐICó]őą€p.Ţ ˇyŕ¸xęSźÚ+( Źe< ;é$:?ĄvŇÎ}—Ä*ס) »( áö…‹¤‰ît§;5aTˇ(Vwb,}ôâ…—0ĎŤÁz'襅±Ž‡*MĽ¦@mvŔ±ä$!hІB‹’R‡¶gvěŘŃŚe3”(ě„˝= hÖMżÎ“ÜP0ÚmÂNx`¬ËśßĽ4˛Y€®šOfÓ—†ĹHa&,,˙€…e]ëŕ”ŰŘë' Ä(PµěwźÜŔŇ$KĆ‚Q”ľóD´jŕŇ˙…aíżŢE™śÖu?ň©/čwřĚČŔޤťyńÚµ&üŃG’o}čoíćĎdHí]ptÚĐôÚž™dČĚKy­›=ŕ6®íÁ×_&mpĘĂŹ>ŇŃuŠ€=o‰€Y“:´1Ç!á™ĆúłiDžĘsĺ1–^Ś`EáH'LYńčtŐ=ˇ <„(X €˘ĽäˇnÎ0ŹWů§`ŠG™‘΂OxĎS‰˘Ń댧Ţń†(uÉŻKç™±GŠ…˛I›—Ŕ36­®çĺA!3X´ŃTdů ą¬˝#ˇÝu8†c<őxŔQ€+Q§ÔĹfh({–§Řo$BÉ (vµy_şIdç?^°‰‡&P%ť€Kyľę¸»Ö‚NÚ[!OëŽoň€QŰ\•D Ö`ml_ é<2 _zl ö1‹,o§”]›ă;ťµ'Ń÷¤Âě‰e Ŕ)ˇJ€.!hájŕ" mŻhTZŐGMÇ’G„µ,ßťď|çćUĘ@'ÎMČjĚŘ h§FR7k¸€]_µŁ2*Ŕ™„üý1fÂ˙UÓW¶š€KE)O™ľü´CČ r´)–6^˝_“h‡1óLÄr¸Pž«ć·C’bd‘7FPä ÷ĺk~íţń\IÂĐŢfFŢŻCĐÚ&Ćoů®s2®<”w)ĂZźKÉ\óľđ3]ŮÎmi’¬Ď¶QŇĂ?}Źčôʶw–]#نd?üđĆ8(?6‘ş$ßei ąŻ¬ĄLŹ•m=$Ť®g†WŢ”=:vŻ`EMő穙ʾ/SiĄŤpáÍxŔř# Ť™ŚĄc†Ć´\ď;€Ł¨Ńٱd"YölVŹutZęĽë´#kéŁőýú·ňŠLĹŔ^SžozÓ›wĽă·ä¸~7żD]pĘ €ĺç·~2U»‹lĐů1T´ đ§śëSVúK[ë«FTşĘ‘ľ­-čAFŢÔ}»+ďˇ×0fQčřŔ!2¦bŁnáBáçľ)őC ˛§>G)ţ(ѡĺŚ0eë<ď˝ň•Ż\Ř}†’ŚUéz:÷XáX],]™×`¬-ŢÝXĽ¶Ó<ňČ#Ź~ôŁ%۱­ô”›đůCp‰Ňj.Žř—úŕLÂJç—Ś A(«ů±ćżR©dl6őX3é­×őť(ú(×­›ťŮ®ź–kµ'JşIĆpD Ŕ«Ž˙¦Lř`¬«7ŻXx¦”rŚFŔő€< ń~yłcÉ^ÇĘÎŰŔ1ę(ću]28}tHŢŇ ;’1[Ĺ:żË]î˛4 ý‡Ľ”Ë—8ň0¤ĄĎ$‚P+ź]ĺ<ş+CfĘ-Ď´Ď*iÖ郎ôkĽíueŞÎ#mŞüXż3 Noż0ć¶M˘iŢvR˛{Š}GßűŢ÷6ÇMnOH“pSücŘDĘđţ÷ż˙âÄOÜĄ*:X Ŕ„$wy¸ç‡2őEtNŃ Ö%MůÄËěIv—[„öcŽiÖ?ŰĂ•ŃeB ‹žBSfˇčd"ř»$4ŕDzt–O­ đmE(ËšôÇň¨-ÝúZę#Łľ?Ĺoio'Ú±ją)ŕČ}Ň ź(°< {ů,žč‘]şâçť!GăŔČ<…ŇfĽ’[TĘAsἑµ˛ż–÷ŰÎĄEé#Gi?[íŰAŻL‹ v°çb8jsýÔšküKŰ–¬Np`*JYÉ@ň™€Ó¶ä ì=Ť°B›tőńŹĽYJsě±Ç6ő°Ł‰đ=­rS”'–ofhš:ş5oBőOxš]Şň®)Ľ“Ů·éhcx,̇ä•IUÍ…‘˙Ś[Q&Ö2ç±Ć·yҶ¬‚g ™|ó8C‚Ž%î&ďT~ř \%ŹúťXő” ëXÚcŤ­:ͶßIsS°<źřÄ'6ź–kËÝk"'6A§l›UŇĆ Ć  Ą-Ŕ<`ĆžgEb˘PóüĐŁí"y”ÂĐä'09Kd"y×i|ďDÔ÷Ű~€)}ő“¶I`6ËJä$zˇíť äđXýŃ–®kŕD<ôű~×;cŻÓú#ăqúČŘ´şžŹ”_DeŻ`•$Č&NŘ©I'Ô(·/“Žg,w,㉎g¬”ĺkâZ(Vu:uÂČc;ĄD2V“ôsڞ×Iuć±áç¤ăh9řş Ž5!767EGŤĺ/3ć<ý)áSďK&·ëňŚaÇ@Ŕ@ĘĽIŘĐ‚ţ–-`‡ż>ăËrqŽVĺßĐ÷°1–b©Lś·âŢľJÉu\š°C ¤‘ĺAXŇ©ĆđďŹ?ţř&M“<|‡7ímĘËo]ĄÉ`™› ٶ֛d&/ˇž1J¦­ž8$mő3ĚaĆýź´ËŁ2÷©Ľ­2íśßç>÷iľ‚“ß{Ű‘üSf>Ę LĽn(=ý)Ćgř!Ź Ő0†ĺşyIŰzvĂ%<.€˘­Ăt™Q¤żú˘Rv‡Ę¦M-˙¤GVÄú‰s4¦óh­_6鱍ŇĎ‚=kKłĽ8uÝ„L¦ćgťO~BNÂŔăyřĂľői/…ę4yĹšŕ}‘YÂGQ«ÖS ZKť4ŕÂň VťüCA˝ţőŻoŔęŚ3ÎXř(ą63~Ä›HÖ`uć3źŮěM «‡P˘%jh € ă7žč&Đţ ‡X±MaFüٵeż)X{LÁ˙ŐšüQCŚHŢĽö_‡´­żÚ¦0É­ö'OBĆS´9CŽ1ĘH2Ü€ôŤ€YW}˘ŚńG4e (u=OžtV `yęŰę;†LŢöĆ}kítŔ\ßÇĂuőSŇĎ+÷Y;—1jď!ý‚÷h+Kž˙RćD6Ő7C`őč#†ýĽěkw}iŚ˝7€%úŇ—ľ´± x@f÷Ů|ârsě˝/RĽ_uËŐ:ő4qIçZ˘)ý(‚xĹ«¦Ď‚´a5ÚÖ6łUŕ’g&­š‡÷xĄ±†u RR:˔ٲĽÓŃŁt)?^Ą©Soł¨<ĘL¦ 5$˙eĺÜÔ}mvßűŢ·ék›ĘcŐt†žJYęSĄü(WĆíx+ńR§đ€Ą ´2,cR"#Ř/“Ůë\ç:ͲúÖuŻ{Ýf9¦ôşHzŚ9|ص±6]K%$/ż×ľöµÍď0yĄG¦ŕ´±µ˙CĂĎ6ä)°qŹý!–Q©S7éÓKŚźe:öĺ/yĂÇěň¸¬üSÜ Ŕ,"߲ô­ĹżřĹ Ű É¬u­á)*˛‰4v¨–\{Ô‘mČ.äBt®Ě Ź•=6ÍňyĘă÷¸&L•<$üR¦5äĽ` g™/K7FB¬Ő°‰Ľ•M0e–°çTĘ~Y=»îó8Ţţö·7žO×3»ëz&ńŃS>•´ Ręžp0yŤqYX7Oi€y^ňÉKž]éŰ*“ž3Ě€MJ2AŞ‹J@ßoçž×«Í0ŘvĆ­‰ć]2€ł J,x85§Ť…ěcpwŐ7×…“}—Üó‡í\-·}”2ĂŹ©Ú¸Î/†Ę˛ôE[|*ÖPáŘHEťçß˝üÉO~˛ŮĺČNGţěÇj<ŘŚWă€ě:Ćď‹ĺ nS¤Î D,/ľ-=ŕĎT|¬8jŞôĄS0K3żj> A§Ă€m©‰6ŔföÝMţ«–Ý÷âíd&řşéMů~Ľ”xGë¦]ĘĎ 'śĐDo†%O•v€kë±ŕȖK¸ëů®ëŚYKń˛¶ťŔB"DĎxĆ3šź›ŕŇ`ę3b "p ťD0RćúÖ×7ĺÄĄ-˘Oę2ä·±vxfŻîí¤s7×íČńĐCÝZŇńHsYˇŤAîk”´FśB@.BĎÂĐ:W ŔS{^:şÍŚâ)ŰHĘxŹq*p~Ő|€eřOC 6?&úW–yęv[ÄŚW퉼 8c€BÂúCÁHë'Sy$Ú9śuńä7yi+`DŘ×T:Yfň®J«ßéű}ŕ6@k)ă[ßúÖfČä®2tŹoS8e9,adř0L‡xŔĘĂ[ćĹ™pM ‹Ŕ1ěşž[çzÚvkç Ý*tť2•ďözŔ,/Ť»ě欄ë÷ERo´nX5Ľľ&éĽń€… M™ĘĘO^Žăq ďm‹" x€đş0ľ”ăĚń€ŤŃĺ©”qřäĺ¨}äż;Ɇ7(ßťe©óŽńł ‘e ^ ¤ľ1ĄADg×8F)€ ŽäŻüĽaÉ# ŠçGŽ‘ľ±jżf6ÉŐrCý8ßűNżăµeŇZY–)εł>×^tKÂĚÂ``€ÜGCXÖB›$Ú:–Ć0jě8ýŘňÔĎ÷0ˇˇň§sX!&°Ć˛6°N|o˙ €5Č”Öe&bá­­q.ŔĎo*ž\ ŤbÓY§Ršeůt (rfĺscĎÍD4‘€Őcágy¤ĚSAŇCxÉăŕeéWć ěI$Ęؾэn4I±Ę1ŕx‰4`ĽH$dŠ µsXT굉’šG×D¬ ¤Ý„ź›GĘÂ8?î¸ă™P^łŚQú]ś„€YŢ›âh3“l»čéOúVyJÖ®h f|ő}ÄG4Km„˘Í†Rúv—! o>ÝĽÝÔ Ŕea|Í‚b,ÖÖF×ű"ncŢSzE¬,–˝tĄĎßg 'ë7ĺ^›‹P2hUKżK~0>ń€7Ŕ)ó”Ęľ«>}×~¶ć™ń…Ţ÷ÎvŢö›ž* 4´-E.ůeśNŮ&@0ľ‰lás”ôP^RÔ&ĆhČ{Ž‘&ĘöŤëxŔŇ1ŃĘźÉyĽK<Ęü”7ŔöxĹ+^ˇ­$Zc¨ÄyĚbä++>[u#ˇőĺť5=CĄ~Ž!#}«lüá‡ŢđaĚŞ›ôí>ÎÄŘ=€ő¨G5˝€UĘřâóź˙ü&TÄZ‡0ŮVŠ:cČlëĚÎ5!qŢŃv‘ň°Č§` ˘¤€ŃÔp83(7Ŕéô:ZčTáú†);˙Éś6 ŔS†;Sţ1G ČŮ5 éřjý}šcŇëzÖ8č/˘+ťuŻÇS2)1&Żę^–8/Ű&›RÂm Ü&VTŰ3cŻ™p€w:ĄôŁX§R\:ëvpéÁDŕÇňĄëyĽBB†›jű”yę6čŞS×uď~;'­0ĆÔŐL[ßb>ĺ”S¶&Ôu˝;ô:âĹ ëŠÝIm,Ěýěg?»ń¤ôŤ)=ŕ´sęOľľžű]GúŔĆD¶–-©ô€y„p@s{ .óÁ·xľâMp™gŰą1i€Ő7‡k<őeě9ú0Ă~—ÎÜ÷Č®>’ŕĺómçiŰ8$mĎ€EîňlŰ3›ş6€…¬+7÷·%˛[KÂśc )¬(| Řąđ,»&ŕűş×˝® ÉLĚú™Müfxđľ¦ô€•S¨ĆX/Ä80ĘÄ…ćÇ˙5Î'ئ®"¦Óëh” šŇX‘^Řů¦8ăsS*{ĺKĽü|€ÂŚyŘEŮŤMł|^hÔf,~aĂrYKůÜvťG~,wŚ·EÇŘÉ °0ş¦l“´sę}V_ĎýľŁaú /C`Q Ăs `ä÷”Ę߼Öú ăNAKťşŽúĽ1ďÔŞĺ(=ŕˇÜ•ľëń°Ëů+ęJ>Ţ˙ţ÷o-ĎęKCZîó€p"“}imâ^ď2¤d|mĄř¤'=iqôŃG7{”˛ţîz×»6bčŠáçý®Ł÷ž÷Ľç5·yŔžą%ÉG¨ÇxD[g ·¤ ”Źä÷ŞG€)-ÂkyŐôĘ÷X}®\gĺE!äÚşGa2gśŮ¤U< ’÷TőĐÇäą ·«}ĽrOú¨­Ü‰Ü=đÜŠÎX®”gÉ-$ż›„ZţőÉP§óc¨ĺu2ű‚Ľ 1Nű&‰yţĆ7ľqł;WÚ&iä¨đĂV·ËĘšwę#|ŚYßëşžç°‡_řÂ.¬I۱cG’,Vť0–őiëĐ™gžŮ„X+ľěbˇëś:a:Oîĺ(•y…gĺ5ç 2Ńë_˙úMŇĚŻ0)…Ö•ŹšçćÓ˘xI9é{tP]śŢßCĘŃ›Ŕy7łä˘e8S’ŻŚQ+çTůĄťÉ©M˘Bdv•ŻÚőLóŔ€ôxM‘çúz~`ŠĄ`ŕ5®óš%™DÇu>_Ľ1©K8Úgá˛÷©Íţ yŰě·g=ëY»ŚčĚS+™±`ŃTéJKÇ·„+Ä›2ý2]ç,üM¤/mĘĚržŔ oxĂÉó‰c„mŞÖ{îy|Ň5i«6`ÎsçRä×’#†g,ĂXě˝ď}ďµŔWeé…BÚ[<>$M©~n ~ĆťsßP*WţĘ{ëžG0¦žŮË‚-«-´ľnŮ˝‹jŻ´,›Č„M#d›ř*–öŐÁöŰéĹoŠt’ç<ç9 l*Źeé żęÄ©'O–qëełî0ˇHË9f•šřµęŽeur?‘-ĺbĆx`ÔQlŃ7CŇZöLҾ¸™·°jřÖzmí%hŐE[%]ĺÉyň^VĆ!÷ĺ#Č*ŠMöď®ň eh‹|ŠäŚ•ÄčĹČÎc彡ç˘B ď6Ę\‰ŕGŰ3Ë®1Š|4‚¨ťT–]MŮVËĘ0€Ť…˛ÄĂP3- ď['¶,sJá1ŹyĚÖâx!2ÖHHă" íó¬s;'ś€ŚęAѲţ7A€m˛RĽ_m%Śł ÂŻr‚Ç&ňX5M“űöš.+ź08j"˙î˛pVý^ů;ó$J6~F6„Qwe|Oąôł˝úyĆć§*[< (]‘‰UÇţ”ËÇŰéEKĆě|EygŰýpź—ćą1¤Ďń6ń ź6Ůż»ĘŐŽŢQF”(CócÄ?şW”° €3µ3<|ŘWśن{LŢ. ŔÂŔ¦ŐSľ 8‘°07~:±Ěç×îqŹ{4!ç¤[§g/TÁ„̶cůDrL Ŕe‡ŔS+šđn»20'`SËxX×vŔŮÓČXßô fBČşeÓŻJìLŁuĽ`6*řĐbbV<ŞćˇmüWpéSľSËS<›ô9Z®­ZeNĂ'eĽ’®(‡Ć«zŮmĺ ĎDž„UK}Ňöü&®m€łIDˇŤ4úĹ:LŻ0Ě’fD‹¸dîE[ž›¸6€ŤÁšě$&Ďb§ťvZ3^k‰ĐŞä'íÜŢÎ,gˇćÓ‰'žx>fđ€m˦mšĘN”ÉSĺ`¤u Öř&Áb•MN±OŮ7~OäŃ5±(ĎěŽă»ßýîĆŰÉ8ß:e(C‰‰2%˝p”R®Ź9ň€ő›ôŻĽ{đÁ7ăĆőšÖÜßô1žO§`žÝÔlŠ÷ËS­áť® ŔÖŹŠÚéÇXzńzń.“ɦö€ĄmůŠ|4?ŞćŃ$e¬tJŔ]ŕ(źč…¶ńă!ĺ¬wyŔŇŕŻŔ&`™cA‹`ko¶”őŔȒ۱cG–=묳šńZ ćrBQ™řĐs Hxhč;›~®ô€§ě<Ę­“ú*BÝ›ň€ńÔ„¶©Ë_ň>m“\ć·'ťg'$Ü6ÁcLYyŔ 3s „ŰŁ€¤»ŽLaß:Ä-OcÍ&íŔä”ńË1ŕ©Xýô;łuÍ/ŽSx¦Ůź™.Ô×âőĘ/çňťŠb´d±Ú¨*ó1¬'úQŹŃ–ĎŚ=V"îÇ”qŐ4yE} 0WÝ®Ő{ŚRágĶö~»i yč$¶¤tXč®Aláç›Üä&Ű]îŤçWđÔ!h…ndŤŁM(š&ámřG™šČľ·Űĺ‘ův4‡2 ëYšŔĐڞ|VšĆ()´u˛)ĂĎeYÍŚ.wť+ďmúś1 ń€Óď61,z,ę°4}Ž•Ńd+Clh"Q l~„|§˘„ í› l°kK?ĘɧIŰž{-Ća8*ŁzŻŔćDôEľ09YeřÄ7fGs* !ŘTeŹ`Ś4,ls·»Ý­ŮM€XSH 9îk”4ĺW{ SÔ•Ő`ß”XTS9W A/cVć|ă|lš±ëăÖĂ3Ś„źE°öXVY“Ł,¬f™{ě±.53“­-äěkK< 9uýtÖňŢ ŔSóeOOĎŇ9ť÷e/{Ył¦6“6ÖŕxĎŚZ, ěá~đ6Ö` ­ €3Ç! ‘<·űľĆ§7Ŕ ťzBęP:°(OĹOŕĆ{3µ€ńŘ0’ŐĐLAd ¨wML†Öń€ű^ĆŢ9‡cřĹ/~qSţ{ŢóžMQńOł´)ĺߎă t bRŹ˝źU =O1†’ô÷¤ŁÄóŤršşl8”qÔüžŹ{&(<;˙<ěak JpťnŘlr (ŇdŇL”8n¬ăS‚ĽŰ.hěnN_˸ަ8Ł6Ŕë /ß&td<÷Ěhë1ÂĎtµe5&•ĂmĎ˝f8CľÁ®÷„ĆW`y,`Ţ+™ŽĽt•ŁĽÎ#7‰ŘÚĺđĐřŻ!´)‡ Ę<űÎGp_BűÚ=ĘŹ•Ą0uýbą˛ĽúĆp¦ÎwNouŘlD¶;›ů;vŽ!ťw ŇAľ †ĘŤţÉ  ^e˛Wۤ&óţ€KŔ/ďo×yúZ<šMD†(Y^)c 8L ňáex°öÎik#lG5`)J™ WDRÖ Gű6Ż gËc±Jša¤m˛Ö·/a衟&”Ž• ćlXúŔř´;hŕ®[e‰A:TÇc+_Nř†’YfI®śÉüâ¤0ÎGŰ6µ¤uŘ$ Ő˛“yD™Č]†‚69‹rKö.8ŔĐ›ţTϧŕ©ÁQ93lĺcfę]čâÇŔą6ź¤ł €ŐíěłĎŢZĘi˘~îsźŰĚ·yÎŞděů׸ĆŇ×W AgĆ×ń–‘˝˙Í?içRÖ!Ä °-HsČ›mhwÍÜÁuž°Í¦80őTGućËpŰ?9ł×“$r:óPbu[ÓŽx¶äÁ${®3ȬÝ.'b%Ô8fŘş}žş˛ •wZĆ(w7§ŻQ›Š>€ŤĺŁ.ž47WřWórSśđi—ěc/&˛ĹXŔŔdž(Ăc«Č”ÎńRFÂ*!h­ú ůĘŢ-nq‹ćÁ6hŠáÖW'†Q =Ď™Ădäî€%˙óď{çęyÄ"23’7$\t÷–ŁĆbé­RźđÔ `•˛Ěď,çpb™qÄç{±&¤)Ô;$4'ł¨}Rív·»]Ł y – ů^/Äî›Ěb›3Ä3ĆQGŐ,Ż űĆÓ|{ ÓŰTż0 IÚŽ·^Ę«oąŽvZ…âG.ę4,«A˘xČffś›xô¸Ç=nĄĐ°tň·¤ëZ)ŁÉ¬Â݆چ’~ćsśCÉ|D‹Ô+kó»ŢUž€­“fěŤÉŻ+íU®÷rEÖ,ĎeOxÂVÉ{ʧ¶–¦,0á´ĆmSŠfʲÎiť»ś"Ů˙ýwa‡ő•ńÇŚg&®}„y#QP¶ĹC¦±*áhßń’ ]k?‡ů5ögrWźa`˛ˇĐşçw')^ňÜ61ţ«nŕxŔS°¨YÉKŻxJŢ.ó€ŐŹLEż0 ěXhă şg•µłĘźčy2{üv‘6Ôg˛˘¤ëąňşçÉxmdšąlŰT{oŰ\(ýÇ»ÚÔő!0è`»92Lb„–eŮŽó^ج9 YFQ@ËžŰŰîśMtžđ÷y&yn>î~?ó6ęŹBÍzÖĆp<¤3Î8Ł`㳦p6Ľ”Íá}¦ K—ł–qE>gżőe[ěQJ)Ó˛t7yź"ÜÄ䨔™˛6 Úňayż§&:#ĽÜÔ,h[(ŠŽÄă®ë€`[»ŕU&GÉlůyéK_ÚlOl8ĄmĂŚĚs1"Ď!d‚ŁĄ`Ë5yąú€»ůđ1Çłµ CQa¨oßFfŔVÄĘř±ţµ»¨×&H:fţ„”Šú3‘Áň‹ě¶˛»*±‰| ·±ŇZš:ăsO|â§NvNoŔ,ĺG>ň‘͸Ş, ĎP.Ć‘ě‘>f)R4#7Ëb(‘xÂ҆ö˝Y !, €) “±–‘˛QF”Ťt—)@ĎĄLËŇŢä}ë[Q<·©óX&(QľSOŔJYń2Ń„MyŔĆ`óÝôä[ŔňşsŢóŞL~Ć'»gíܚї&z™Ë _0LaĆ|ČŚć2$| '4Ć’]ťËOŰů6@H$C»fĚ™üóšČxdĚg$•ϲżÝE˝\Š%®SđŘ Žűc Q o|ăËG÷‰ót XK›¨”´ű¬µMä9§9ž”…mÉ=“y¦đ"Ŕ»ß~ű5ă­Í…˙˛”L"L@µ ä+Ľ&Y÷}ßš<ť€íe‘tëg·ă÷`öU[Núţ©űâş›Lôô§?};Ęş­ydŚaw6ζVxά“çśsNs/^C0cN@Ń$* =”(K˛ţ˘îRç!'¤ČĂXF‘ß(Ď› B1Q:¶(,Ésíňúvź¬69¬N† ˘´§®#ť—‘ŹzŘbęüÚŇăwÉÓŞ!h»Čz Ŕł Ź ßčF7j&Hyoń€í©bđň˛ď}ď{çRs4«›Ç›•1¦ě Ť¬`ŐŃ"ýŽ‘§ýŤaxŕÍó»ëß Vh ʱÁŐQě°ňGuúszÓs@¸Ö˛„€ĎT9dFiBZ+oŔ1cl"Öó]ŠDASÔ¬tËŽČ[—ÂŔ†<ĚĘ2ś‰/Ąü ňP„&íé^ŽYŕČü|ă]„_cŇKy7Žóĺ)EiŹ)ß˙ßŢť]sTużßçľk©ĺ.±TJ×b±¤T ±!@Ь Y„ [@YD$$!„D ‹"  ‚ ¸‚+¸€bą• âB‰ú}ďoČ˙±3™™;3wć}î}Ó§ęyî˝3=˝śî>˙sNźî“Vżâ%Ą Ç‘m.hăĂžBö˙"lśSH˝ Ę|ó>wă DćmP‚ÇŚY ­Ś€/:±ż× ;Ú{Řń”•ś—LdĽÄV6jËýbŚ1$Ő7oCjĂżQśčDoŢ@Ö˘A É +ÇP˙ŐŠŚ0*-Ő «/ÂăĐÖ9‡¬[Ă_аq ź ŕÂäŽăbB qąeâo+^‹':UŤY˛Ś¸ă*/ÉŐuóâ*ć¦5)í§] „ V#Ë1‘ÜĐ,`©őß+s2 Îa‘$‚ű& č˘C ¶ľ˛Ú $!bIÓö čň:É׼ć5ŤĹ6U w•­^ÎČŽŰVĎv«X4íű»ţ.îÉŕôÝ®őžň|¬Ŕˇ ,ůeIelŢĆ{ŕHxČ 6Ž37!ë”2ĘCÄ"łśúDA0>‘9ÝEÜĐŇP81ÎA#‘ăîgN¨+ŃŢR(ÍɦQ¬RĎ}îs›5$űľhĚ6>ĚO}ęS›ň“]ńµËKÇU^›ÓËäĎB´ćä` ŕbśŢůÎwž´±Ż&ŘZE”°±Ţk¨°‚4cÖŁ•S^Q)Ěşę+ ł€Ń6+8ă7e¸ňŻsÎ9§±`€ňLócć?ŠŹHnݍ$|)ęS(Ľö°:­ Ŕ„=‹ń¸ÜĎÚ×§Đŕ(}S…P/ǬťĽÉWž¬ŕx¸ˇy¦2îűĘLsň±÷µo;Ĺ•ç)GWęOő˘x'Ż˛ĚŚo ,kř Ř–“ŘšŤßbůsžóśĆ×ĺ"čcňˇ\7ݸÝĄŢ×Öz_“ŃŘ’"'Y–Ü•0 —őI 8¶.‘ź¬?iŽXšCeF8«—öžC!"Üşžô\Ţ"@S‚OşŇşfü˛D¬s!s0Ć=čÚô  ę\Äş¤XnÍ+ź5cÍş®?Ő+óɵx¦|ʇÇ<Ň^Ýă¦Ń°ÉDł ‡&-2ÍQ^KąăfD»|B˛Zżm®ěďďD*`Dë~ä#ŮhŢ»€ ˇĚhóŃE/GĂ&`YŔŇ:±4›Jôü »-P)cČ"L ęˇ Ź±€cý*G˝¬Ý±âŰTZ›eÝÚé¶ýŘÂę%+„µňmĘB™/ßz˘5ľ5X$pnß»” €ŕ¤ßúÂóĽç=Ż9Т/Íśë@â kç 3€×ľß÷Ű<ČReÔ_•l~ lŰëJďšúŰ€< ¸Ďý,˝~4áŠô§XŠXŢ®uYŔŚGŃŮ}Ŕîą“E'a :bŽřđikĄEhq5GýÚ "”¸é*ŔťšĚýhĺÖćĆ)°la™őŻśnŚf˙ÇT¶®VÄŃÇme{Ź©íJ‚GÎ?˙ü&¬ë"y´H–yřŃ.Ł`Bv.0 ä"ُÚîÄB2®ď 1"´łl°CÔ@IDATwY7ŠË)/Ë(ďŤů€CC Ś+‡±PKŮšçç|˛€őaź4•5ŐÍ‚Śől­uhśŕ¬Ă*ĎďmQńŘRďX˛Ű¬Ô;ŢńŽM0!C0p<x×eă» Á} A ćâ¨< k Öđ=ÖŮXYCÚ‡-UëÜö U: JB…ëH!“•qsaÂż°G’_Ţśá źu9f ¸´20 µwqWő°¨SBŚËŘ|LJWúŇZqgý·ťžĐ‹UXÖ­ťnč7%B`‹mŠ!y>âŹhÖă_÷ş×ĺň"źËIP¶UQHĘ~ÚVîă7Đ˝řâ‹›Ł·yúʉÂăď]iYúH[ÍŰ•nę5Ô·ţ›Ľé ŘR hio`ó0 oŽđ† ŻR¬óśy>dËËQ«–†~ř‡¸éSă—2n.]°ç˛4Ŕ©íFN¬ó %÷=47ď•,Ź Ű‡FŐ:\ű8ř!a|˘f4ń9\1™­Ą˘lŹěŔ4|÷€"!’¨ĚľňJ­Óö· ̬%Zż"”´ł«ś¶Ě2ď`ĎDz™ ŔÜ€Úo[JI§ź~zăI:ďĽó¶ňĄ|nŰwmw@?>čßa¸í9÷pżyűxO,­1,žţô§ŹÉîibÇcrŤW]¤EĆÜR€űÖS†2§0…Ĺ=ĚZCĎ\‰ňkÎŚqAă˘\Zßí ŔjťřÇZ¶ÝŤbš5fĎę_ý\Î5c;Á”kĽˇ*ušň9ŔeF6Ö r ízîč_ř…_h^™®~Ż8°€˛î–=ę´uŕ)ęq. ,’Wo„ÍÚˇö‡hřѶ·bEy6đ5!éŹţ¬đ°öfYZTZŔ\‡ŃÇ;€ąź Ý(%©ĹGţs—S2ćştËĽň=‚ÝŮŔŻűřůĎţ‘5EĆŮ+÷ĺŐu]ţhł€-gÜô¦7=`}µMë*łĽf,t)e W¬Óňzß÷0€·•ÁúGé'@j^ŘCĎ[âM{í>k[Ŕ°úÜče=y@Äd-+ż Ŕڀͣ}ˇŃ¬Q”Íű´5ÇP:ˇDÄé.A.űÂZŹĂĺ×, 8ă°Üs"ć´0pJňp„]ą®ě»´m,„ĺ€ Úf±Č·´"¸ˇ'V¦7Ä”TZŔ©Oß°ç"°ç0ţŕŇý\ÖĹą¶)ÁXĺó]ßY˝<\ĽřŇć]ĎäÚ­o}ëÍmns›ü<ú5/xOpŽ7HéÓg>ó™G÷Ç~‰Űył€E|[+§X9%ÁcËęJ7Ć=Őn0…jČÎ|ÉÜŁ 'ežTŰ–đ»$y”\xłmý·|–B…Âś G)–ÖŘć%;H>űěł› Ő´ţyŤ´˙Jd&k RĺŔŔXhMy¶ť–ŔˇY›ŕ‚}ŚĎL<1B ý\ßoČýîwżĆËC0˸łűžá˛Ti·­Ç¦ą#é·YŔŇ•ëhÚÉ Č w°G›ŹĘÄ"`ÂTÝS7ĺŤ%{Mźx…ăv\â™gžyµ,mŇö¬ďórP˛´m*Q¦^đ‚ ž3 lđŚśčző"”ľąDąłöşMˇ+-`Ë‹ŔnĽA懿ˇ1ËŇäUÉÜ‹+Ů:pNĹjʵXŔĘ"ě8TŻÜSVćĽkĽ"<¶Ą šaŚc6műG~äGšcÇ4PCśŮiĐĐf*ULá€7űč˛+•Ë C¸˘s<ęÁtrIšŔÖ6#ěűęzÚ 6á Ą^_Z‚‡˛ý·ŇĹí{ĆuBŚpó,w×rdžWo×X,`kĄCB™3§çXŔ‚3 <Ö[á_„q_š)×);±˛đe[€Ď¶ĽcŤŮb"¨ m}5…đŃ:rܵ]ϲ~ ď“9Iʙʻđ _Pßx2v–bŽP(”Śmމ€Ą6QĐ»ŻĎłüă»ĺ s+Şä)-Âk<ç€÷ĐüŘň/–söyă!Ą¬ec[_sɨ8 n@đTŞÂďöD۶&ŚÉł`î<,“|Žw›(ë«Ćř6Ž;ZŮe}hű^\^M±H#Äúfů dŕ©ý¶ŢD4J抗Ný­ŤyKŤ “ˇ}Ź,`Âą-Ëňűľ;ŃK]€|áźzM üéËËu6ĚÖG†ˇçúîYŹĺҦH…X‰xRZQą·ë§ňXه9ŔÄĐŽ© źú$šşŻY‚†ÇŇËěyOŚóXŁc”FV-ő,rA»_.˙PJxp̧ĚůRŮ3îŕů“űŇŹ%J J0ˇĽđ0sŮ=eP<€}8÷ÜsMIĂL&[”¬gă˝FVŞŘĆV/2ˇ3ٶ=3tźOx"@ć…Ö$M6BŔ$ěRűň̤5™ y !ź!Š{—PŇ>e#Çb \,) Çť— Ąq™®ý˝tăąg»Ěťît§F ”ÁFűW/Vł´†(,ĘÁPÚň Ń—ÖUKâ+]ńáß.Ö]™?wv ŔîMqC—yů.‚–ËP„"Ě3r}‰O@HqhďăśŔ# 7Ą,˛ö0s)Řů9Ď §m%¨ŚW‡'ĂüáA,zîa´MiÔ–˛żŤß(Ćň*ůšńË’%Ś—XłCőĘ˝ŚßŔQ@QćZľ»~p¬ňBţifŽĂxŤĐŃ\aέT90–/{ŮËËŹu¶+:ZżőN“ĆŤÇŐuá… éRl«g!‘uËҢčzž’*ŤgLz.=Čn}–%Jţܶŕ!÷pž˘‚H´­$@ćz„޵@nMîtŰ€†(¬˝–<ôŚ{ÜϬ" zHź(—r ˙¦ôCžmZď§%϶bŇN?ć7E˘t?{&€SňvL^cŇ(ŻkŤ3ă ănL^ŇÇ·`N‘ŐˇloĘg8{ĺYŔ”®ârŚćů|łF€)*3IÓţÔ?Úk>-ĹĂ÷(Šž‹âW¸ s¸M;Ďľß±ĆÍCÄ#‚J´yaě$cŤéŻ~ő«KŘKh3´®!×SĂ…úŻrŕ*řĆŚµZQ˘Ŕ$t*“DćŚ|ŁÔ€Ĺ ó(ŠňČŇD8üPţĺ=ʬůęĄĎŔdEćĹÁ0Ë6GQjAÁŐäşíH7ąÉM\®T90š\^&×)Ą osőeţ”§<ĄyC—yéč‡~¨Ů/›ő×) EŘ$$‚±Ż.®źvbý g :‡â¶ó;B{{ë%‚#éű>Y{í€#–×Z´ţy$8Ą/ż\—Ďć^ß'ÍĹi;bI ¬sŹB‚´OSúˇĚłüž<ô W./ŻÜ\n`-ë¤kYŔęiÜwYŔÚÁşŚ’Q¶{č;@ŤŇtĆŚ =7oÓ{O,żRŃrś#Zh±€Í×r®ĄĽög¶aĺmEU§Pű%GAĄdRz“¶ťçĐoă‹ šW6.ü,=•ăú`ŘAíÉ>Ä€zŻr`śśf˝ –I6× m]Ë~NÖ.U “ĚyŻÖ"­%Eho«źű„S„ŻçXXů=ô|Ř~XŕĂ=ëĐwTZq˙B„mŔ~(ďÜëŕO„X)l¬yľď3éâ}éĘëQś¸KbeQÖą˘ ţ‹( M®ÍůŚWłř>áĂÔ<ŐQ€Ză1ŹyLó¦(`…J°j.ěřŹŇ€ş,`Äťš6Ž-ŠR×^3ĺ±4Öţđ‡7Ůd»(‹7eć$Ăô§7}y«UI™,I Ęsň)Fú(îoü˝üňË… —ăŔSŇŇî©.hu5†ÍűK.ąäč€(¸ż˛¬±JiŮţµľ˙ßµ2®ůV´9 Ţ|ât![.Ŕâ.› Ŕ@-ÁO&nŰJ5‰ąű¸w»îčÁhÉ©Żë\ĎŤq?{–śĹÇ• XMzoB±€Y%‚űmŮ$ÜňË+.D€će¨ €Ç ‚ßúY”-ŐhnGX¶ůnýűv·»]ÓF*„ÖtőCîŹýT®şâő•W^yôŔLđŰŃĹ_XŔ”$÷9÷°ďyČCšíUK0Ŕ§|á‡#4ă˘MUńs*ź(N @J>T®Yç%+K,€qÍsi-ŕ X4F´7°hě‹NĽÔ¤¤Ě ý©ľ–Ćo9ReGűKľ»ŔsÎ¤ä €Ő-ĘE®›+Ąµ}0°čdč/šb|mř4¨¸Ţâb»6´y×6Ҭ˘ÓÓđÂsX>€ËŽöO•°üÎ&{—@ăs†đťTî/ÎNęňҶŚçsîR'yŇö7ßő®wm‚ĚŇ—,7Öť~(:FąŁŔő2FE*çó, Ŕ>ëżâk(Žmp·]Їň“·ţ$^Çúh扥 Ľ”Ŕ\‰±…Ď%nc (`AT–ĆPŢ»[ZÁž“OP<.x 8KScň/Ó€ămʸT÷ŚĘC"ĄËgŹëű˙ÝV°}eÖ†ţD›^Ű(Ôađ‡L^ßPXł&7á,č¨$“mŚ,źń= €Ű@É"0ŃMÄ!.]aňŔóîwż{S·vľŇtˉá˛EďAzP“L#Â붵ҕ_×5 ęřÉg<ăMý—€r"I _ÖďT&µőŠ+®¸Ć9˝]uÁ÷R™’F»F°óP®"d]炏˘Đ•çkú’˘ĽgjmQžó…/|aŁäYŁĽŕ‚ 6/ůË·fI‘!ʱŢ3F)T¬ę%X™ ,ŕ(ďmź2ľ·VţŞm4ďডĘĺ†Î;š=V–€YŔy«TŮGĆ,ĺ„%í~ß™ß]uĄŘXcÎ:pŇÄ oŤÝđśő_ů`őf—ăϵ͵}r?«óV¦Yżîĺ ^[€¦I ¨H˙ˇµť‹ía{XăĘ[»îyCQ;bÖd±ÇÖ#n& AÍľĚĂř%DMÂŇ %Mžk_H^žŤ•PćŰ÷Ý\h»ŰXk©oňćîťKOxÂ(ăő€Ž’ˇ© îmi IOČjŻcg·Qł~ ¸ ÄŠ"ÓĄ m+«Ľv ż<8Ž:"×N ˛© +ó(ż` ëÉx#5ł·tęŘ,ónO–qÉ*4ţ)gĺŔ–¶˘PµóčúÍ.•:Kú2r”1Ę‘>1ö(˙ň 3´`ĚzzÔ¸äÇ®˙6ťřôÍĘW(śv»ę(çZŔú‹Um›ž9—9f>ČWOUJSßµ>·đZzľŚCÔYÖ˘‘5j˝+ëkµUHűlk Ńv§ZÁ& 0ąJ”v‰L.) !ŕ÷ĄIŚ$ÁÍ) h,q]ŠŤŐŔE9Ǧ )kł]ea®b»Ú €#° LË6®-)‡Ľ_µ«|×ÚĚ ĐöbőĘ:px—Hh}Ăű„Ż€Š+ÔZ3…¸ €có>č‹^_\×WI›ťę¸Př+­ą¸ăż¸›„¶P€Qi‡Oř;–Ú.hś%…®ˇLŘj3Ą!çu7ný#(ń/`ávÜž`|ć⡔»Ě |T6°ĎxRŽďm°e++^‡¦˙(hŔßⲕ,p9&:źt‰E~Ú ×¶-j7ľńŤ77=áFĺŘĚXÎřllů€Ë(hĘu–&ş-=GîTY˝·şŐ­šGŔQ@ŚŻ9Öi8‰ň!óŚYĽŐ—ú(ó,|o*1á_žĂKc9eÄ–ŐónB•¶&`A \\•®É‚”†|Ćg4š&K„`Y(đdŚëëšą^óŠÁo˝ŹPsz”=Żâ×L=í Cۤd±ôÖ$î«®Ą “Τ°.6…b“ ±¨"´Úy°2¦- #ŕJa›m9íü¶ýf=¬řIăwě& śŹ…h-jĘŢßmeŇô Nă‚U…—,ů©Ě•ŤXľÜąÖ(K·aYŹŇ ÍuÖ…(×őďýŢďm,KíÖg»p¬BýČBŔ¶íáČ>ŰRđ'}>ń‰˛’:%XÉýXŔúÍÜ^‚bE:>•Ă{aě–śĄ”´uLą].č)LQ Eć'Î%°2ćŚ[ŰíĚĂR&ĺŢ›s(@šúŚýLqßóŚĄ®ć7aŽŹmřµ-ťŽŚ:\´©S—Ţö¶·5Öp^—ă.ĽqŘ>ŕĺ ĺĆđEŔ:ůi buEV+%VÚy·óö±XÚ÷€Ł5š)<#¨xJˇ_ćC°ž@) őa4ü€®ç˘í—ÖD™ßď,Ski"ˇQÜŃꬮܲ]îň1ywĄŔÚ¨=ú 'H]Ďt]X„% ĄčáĹë^÷ş®¤GBłT|<Çí®˝Řž L°"‹y °´ ϲ ^–ă‰eVöŻç\‹kşťO~gyÂřXSîÖú oK%-ĎNýä6Ŕ“QHŐł\‚[˘ěÓrJ´6yv—óÝXˇł‰¬uč‹_üâ«MŘąe:&Ëš r9Î-Ăs&0MWY!–7 Žs-`“Ż ţ.ŠfŻŻJM¸čCí.…k„M4ô®<·]s:Đ!TíVŇFB Ţ%˙vůÉ‹\ž] ¤ö3]ż§Ŕ%@jý–R#> ‹` OéČ{Šó ˇN!qŢJźg“fʧş/j Ŕ,`ů— ×tW9QŽđ­t?K ĽŁ(E1ëĘcě5[śeÖXăľŔ±€˝šç"0VQŃó(Jc””mś9úă§ţ3vÍ‹Č0|•·9<ŔôOúA@E‘˘!ĎÄP•K8őűéą(`ĎfíąđXNîyş¸fŔŞkż´hżÇ=îqŤűŁsšChsŰŢôÄQ©•˙÷“˙(Őˇr Lä"A-řdĚ–Ťˇ<űî%zoě[5±ť?{źűܧ9«HN=@!p˘6EľvQR¤ßâľ÷<Ňţ€®ßĘDn~Lü'DŰôť­L!ë켏`Ď˝]>“ĹÄ-ÇçŘü `%Żmi`ĹŠ°Fîí<€‚§ůI ‹ő¸1DŰׄúúŚ0k?xËIK#,Ş3 ëYA˝ĘgÚyŽůí{¬K+Ô™P¬ÖüŢĺ3BQ;XÝqá•ăslţ-{ly|–u—ţ)Çş.rp ľµ-`÷X˝öŽz“šg"ŘÝ›BĆŹq“ö•0°±”`Čä €Ű ś{>cű޶€]KY»ZŔ^B˘î|ŕ‹Źuž~#;S©†6śvBą67ţé/EĚsŔę#seřއŻĆNdţJ]ó)ýŠ‚d\Ev±XÍ7°ůkNŐyLy©żö€)WQJwť×cę0%Mŕ)Üş*m8ťÝÎbW-_~ÜĂČDĽ@;Éź6I#ťKÉ?ëP"_µg +L«&ś­ksËzŤťµ_B‰Kŵ­Mqť±ľXkܦC¤–€: ÖG€MÖĄ2ž0 ‰GQ°Ş÷Ř{e^€0ă2źcó‘ŕâ“|(//}éKËđ¬łÎşÚZ.îgĎź„lY×CNdâ ”'Ŕ«lĺyźę„¸.­{Ç:uŤ0§Lup¶ˇHצXŔćYżT»°8ăT—q÷łú€]·„ĄNĆ Çşm×»üť­mx‹pv”éĘďń\d”÷|ŔQ”ĚѤ/yŢ~fč·úč7;9˘™gć^ŘĽŢ€Ł0É'ŰÔ+}›ů8TדyŻđ n`€Ň7u~´ÇŮ7Ź †G=ęQÍÁđÉ+Ëf.%˙X,/Ip‰cąÎ-#Ď)Ëdł¦ČŐí…áĘěÁb‹›xě:p„>µľőß”/ÂL™™ü4BĆÄ¤Ě°Ő ?NĆmůśń•ő>ýi;MÖQÓďezßŔ±ĐÚ÷Łds ŔŘqĎ{ŢłÉÂoJaU č)¨NDřŤĘŕ¬ćBÇż€tú'Ş#ys)ŠEi—iŰ`›k“— J~Ć~Kdf®—u™ň=@+źđĂó™oéĎ)y®™ö#ţŁ5K8ÉyGĐíZ¬”şň#tt)řĘňL.¦ëŮ2ť2hî]éĂUEó'Ľ '€ĹEÝőlYF_/Ńj3=s扵:ŃŞŽŽ#ŔÎ>űě­×Ü~,¦ˇzr€˛LG` 8‰đ3Ëű&+· >p<@±XąĐý±*ĘçšDĹ?®5®já$- 0éń@ľúذδť5”g‘ýŕWyŕQ¬ě|‚`‰ülCÚbĚ@sóÇOŃĎy>Âß3ž(A¶-qł‹G0­ç™Ô'źú^ťńĘőŰ•Ö|@]÷ôˇ#&ĺˇNí4̶/cE eD:–—ßIŻ úXżřD}üĘ\ryľy`ŕźů€”«=S}/s[;Ęü,_‘<$Ŕ/ŠĄÔşqČ8Ĺ{íŠěHţƲ<µő¶·˝íŐňĎóů”Žrď}Ů"’ă…Ę}ăSÄľşŞ ţ ü(ëťôc>s6¸ąe«ž#Ć”2đ†asóWůixXĘ6sBľĄâ3¦ÎcŇO(źĺ3‘Yĺµňű)ŔĺšNŮĐ©ßMb¨+?FwÝS-ݠ¥֮ύܕ͗–/˛:ť(Ç›„’'+Ä€"“´/°ĽGC}ŔĐ(,a‚®ĽßU%݆ŇE‹ç",ÓqÇ͆źGîkó}ď{ßĆ"`ڸܥCÜÉʶΗçşęhiú„ ´ÚFčD§Pf̈́ʳ«śľkĆC&gáżTţĘÂqë âÜü%ELżXĆ~Ľ‘Ż~Ó&ŤöNćÂçˇ2YÁy9ţë·6©»¶´óŃ˙–Ä&ŔŰiŚ/ăPűCމV\ÓIo^K'Ď(s„sî—uŠĹÇJëş_¦ÍwLá’żż,Ye.j;p(óNČ5Š)‹Ýś(ëíţ“źüäĆ;…ŹÉ/^ýńŢŢ&Jd{n{¶M@_0¤őyÚeĐ–v“_Ů»%ŻO&¶óîú­ĺEJ)7Ćđ˙)qćJÉ—®|†® ~Ď"ŹÔYzýMyŘ%ďľrSNć_™.óľĽV~?ĺ8BşläÜď:­+?“€ëş§¬ŮmIŘřëʇŐh ~T§đ}Új,oc׳e{‡ňgé¶źŹ ĚÄ7™Ű÷ËĽ}Ç#ԗ΀n€š ,ÓeýšÖŠsźĐ’7Ťß'Áź{^ÂŽ#Bĺ^sŁőŹ”"u!ś)Q"§)8‹‘P®´ľĺŮ*bđ'ˇ˘ý!JÔRůËO}#|ŤOé‡(ÁHo|ă›fJ€„đ†¦Ś3űŕ)3ŰÚăMX=’GWúľńä%ĘMkţ/íç#ŕYn€@éOoý!蓾O `2§rżäM–{(p]÷Ë´ůžľVŽgň”=`©Lf_~ÚČ’§›e:ËưkÉ?Űč칎KŮÜ*źKÝĘOi(Ú”zË â3BƬzzë›öP*˘řoË7y´?łÖ €Í?ýKßF»ŚŰ”—ľĚ\s]YäéÜş'ď®O ‹?]y3†¨®q§çžIM; e &żŔ»¬#«×É4m˘MÍ7ĺNů”żŮG*!ą+e{ëö\R&$áH –kŔ„,jóÖ5ČärĘ’C÷·AĂb˘Tpń=ëYĎj•IÉ…ŠäY~FÉi.îřOŃř)7Ö퍏śł>z<őĹcăżç’ú[eý‘5ŕôĺHącÝzqĄj{úwls€IÚٵ ôµu`s…%đפ]ž6 Xşíű™çę Śžö´§µ“lýť1¬~”r”`Ľ®‡) ć¶4‰ÚO:J±qËj J‚žµ*bÝáúo )ĂŮŽK-y”v[.Ák ą3&ß®4<+âLśF±aT„b)’;KĄ4D "cöŤ*Ďč‘€YP\F®…2¦ ™r ď*lĽé Ox`XA(mŔŔ^ż,úkvő;<ř܆WOyő_¬;Ë ¬[`Ń×>őQo–ݞŚďXv±ŕËśŁpőp€Hş(ŁY-óú,Í7b€)Ć«x•ÝćD\¶%ł”uăl©ĐćöŽB’vS\Ŕ}^‚9e–ó—2m<čłňúś|Ëg»q*_-ŕ’;úÝđg€ZÇđę9”Y›üN«˘-D¦65Z.ËĐzśE~“Ŕŕ¤cŕ>€ą›¬ěâÚ.ëiТX=ĺ˝)ß_őŞW5ÉąŐşH»b»Ď:GĐ%HşŢ®Ť!kŽäNýľďűľć‘đĎÄ×oe[—6Ć‚üŃZ ”¬+ćŚÝ]AxwŹ~ôŁŔTwĽBŘř0ţy¦páyH˙ŽyV™,`,ř¨o,É+ O jţ n~\ő/÷úR (e=Ďi\SČ6ţ€°ţ';¸Ó•ŹńČł™(Šąď©·ďň߀ĺa‹ĺ6gv€ÝŁ$ż»ZŔň •y«d%ů¦íK’yśĄ®>ĄmÉň¦ćµlk§–~@é Ö\¬®{e |!–÷¦Lčąk¨&šµ<€ B´y'ÉpáJ €äţOĘעý¸©_i˝'Ź„đ'M®Oů$¨műA}‚ÚäÖ^ŕâŢŚđ‰ĆßÜ<ń/@6ÇU彾@P~Ţóž×|—/a\"č\[ÚVoZ¸ňwGők“ń,bAě*lŚ? LÄ/– ¤řQ’>šâ‚–ţ´«ađa,Ćíj8Ă]ĎgśY˛AÚ@¨ăOĆbů\,É>–ÖŘäU2h{ÓRޱ~đő›|)xŻ^YŽb.M<5ľ'˙ô˝kSIť€°3ç)#´~Ádĺ„+ó0ą“ö ¬€#ôňL:€ťëc> RźĄ ®*VçĄXű(O\ŠeźŽ©÷4‘?”ÂôßgűŇpCŁŰßţö ř8•ěń-Ö…{cŁ)Ţ!|Cqĺ0!~Î9ç­ŃŃćcȆŘ\žĆ*ŢvĺÓT°çźylßë^÷j¬đ1ýŻ,Š©ĎŚKżCĄ¬ ĆUßË3Ű>Eł;&–‡HYDu`x,é*•…đĄz[›Ěcó‚Kż,sŰs'ë~ŕ‘śD\g\r&ËĄĺ\fX#2Q˛^Ćb"dR  `ť—5©J­Íf‡HžóÉýlŔÓ°Ł Ŕś $`$ĐÚ€ń!‚Ľ«~Ů:Ë>ŢőpÉ—®|»® „‰`¬¸#ŐŹP5IY€ đRwŰššx ţ;Ú´+Y7ç)ńáć®ä˝Ŕż)”čeb|Ź!îg4ŢŹ!–źs¸Ë=­ľł@Óçe™ń° p€AŻtS¬weeťY˙SÔÇŚ]ă”ŇfľÇCŁŔDqż9bď Ŕ”*XúÔNЇ¶ë{mČ8Vć®D1Rbleáó®y—ĎGVîăúŻzV.{kŕ;@0)B&łzӛ޴YOuÝŕĺ"Ľýŕň̶OŔ@ŕŃ6ÝŰĄ-Çý´-ßÜ'„0ëŃĚ L–L.pÜź:°îMićP Ö¶Ú>Ň>ŐÚ,ał €Siç`0mŤ“—ĐÇ6a3içäßőLc–)şú´ëą)׌ nRărŚ€“·|ě ĹŹ¬ ĺŕWÜ˝cňJJ$ĹÎX;~yhâ~€ńäąíÓş3 `€Ş¤1ś¶`K3Ô2ßÍŰ3Oś&—1šűqsßă÷h.Ťé˙ČmĄěg_~x^ZŔň§-aáÉÉqQä,1Čź2°$c„yaŰ”óŻ×tA+«0.0`î™'>ń‰ `4¶¸űLLďÓ% paŔˇ±Z>ÖŘŹg8|# Ű%Lňî]¬¶vĄö#Ţ7©iŮ&:‹žŔLÖÎćXŔÚ~Á4ePD¬!‘Óx¬;)7.ć¬o·-ŕ·ąĚ -–˛Cłgác,`7±ö†ę<ĺ^ëř,!(ŰĺgLđdŚđíç·ý&,Ťőě釀Á¶gŰ÷ł|/Gű~ű7ďH€5Ő;Ě-đŤ‚—2(Ú5üCaµěsÚ ÷ą?ă»k^_Žđd±—ö¶#§xŮδŤĚ{cĹ:,ëźâL0^t%Oůc M˝myo»Ď˘}ć°sŰŁ(eo{~ě}őeĨ»ňćÎéˇň2/şäčĐs'ë^µ€GráúöţY#‘…¨b.jÖČň#ŘĄcÝ•.Łľ"ĄĄe,]LĽ®AźA%źU_žĺőX`ŮdĐkPbz§±Iď ć(]‚¦Ěłýźě+|Ń‹^Ô¬˝‰FíjCůś5FP‰€”A@pš !×Ń\a“¶żň•Żl„™şĚÖÝ o@Éß”»Ëgę ÇŕĚ)+ f aO€ĘňBS-Ń´+ĎĄ/s˝ëÓ<˛ ‡ŚŰÜĎ]y°€Cm7´ü·ąŃyąě9GQ:˛ś|}fě¶çz”HnWîü1 ů Ţ@×&d ďŚĎ€S^ĆYY§9ßÍ;nveŮ{M9EK+¦ęK~éWs|Nßnk_ćrµ€·qjŹďRż\Łh»LrhPˤ»ë]ďşą˙ýďß0ÔD@#*““5ÚgÉDŘĘo*Ó łŢ\M6.'A&Ž t˛”‰¦lÖÁT~öłźÝ¬s]z饍ňŃő’ó6´Ůy´,S“]]FŔÄŚ›Đs´qÂ)ëGíĽ¶ý¶n©ýň!ŕ ÷]¶?±®JţnËoĚ}B°š}}:&źˇ44ҬŔx‚7řQ"ĺ›ţhŚ,®Ř§ŇĎŇ`őÎŇCŞ«ďí›kCź™ç][‘2†Jp”—y„đbą«Ż%ˇěafżĄ :˛&˛cJ]iőďZ,ŕĄX})a”ó#/eéŞÓÜk™Ëk̉ąu*ź«pÉŤžďŔd-H2ŔT2Ë×}î]ף5Ň`iŘŰ7”˘ĹšĚ}¦¶y®yxË?=,Ö9e#ţîwż{óťĄW›´mâš:÷ÜsŰ—+Ňş¨Ű– 7tÜËŮSťw÷FŔHG(Ě_ĎoŢ •r]@Τm-ô/ÂëdđeŕIř”1ZŽ˙)lJŕEkĹť›(ýŚßmĎ•÷ń^ťW¬ÔÜ絚ŔumEJޱH›„'ţĹÍ=uÜź€7KFňŁ”jG@Ţxm÷KĘťűĹ*ýŢćÉšZžüĚ1ÄÍJÔg”R <Úż e;…#`"?9°_€SÎŕ¨îĄRÖ§¸I7—Kă…?ĺĚ”|ą5QŰÜ•‡yŔr4vń0ĎvĄş+¸´Ą^–zĆRúŻ«îŕ€cň4÷怋ń©ľ”F1ň`ť–\ÎŤŚ±”;÷3kô‘!™‡Q"çćŰ~N}Ŕ‘Kí4»ţÎĽ¨Ľ+'Źńů6›P,±>`¸Á­Â}뮯RXhČíľ,óśk!űo­u–e˛$›DýƵśşrç¸Ků”BśĎ5mkBŠfśk>ń _쇴&¨i IGČss&";Ď•0ĹFĘ.”CôM)´¸§őkf—2ÚϦśđöý]GĐČgŤ2JáKň;JŕԺNJLŔÝĐóĆ7Ď’µgăijVňfM˛v˱äĄbě•XKon•± î€KP¤ŔNyy!ŚXÁ"¨żó;żłiSvwťMa'ţu°2łôt»~š ˛$ri×<ŰĎű·{sşWi<µÓçďę‚Áý‹dŤĄ Čí,Ň٬Ad@—`ŘNďwŔŚ |M ‚íg€Ť8–sy˙ňË/o~–Nľ„WŽękpůĽď€9ÂÎK»S\ÂÖdµÇµ6á álŤĚzřŇ^ÂMPFIĄĐär+Á¦L7ö;·¸CćYE%°x„ç÷Ýŕ¨Ý€&Ô¦ĘXž•“ĎP|Yc+‡2Kžłwᑹôş”ÇvűŚ7€ŻßÇ.g´óđŰŘgŤFŃu-ŕ9áÚ 0Fx&XľËďSËđ,4^€ĺšąHV¤Ś|– ’t»’%¨¸ •×''v)' YłFÖ.u;YĎVÁi@ĆÚô’`íB!“t/A\ű¨´óŽÚm°2ÚĚýÍ>ĺ+“°(µL÷˘éöŐ)€čţ}ď{ß&WvŘ…¬ůŔ·ĄÇł ¶qo y&댥Ĺ-˙¸ý2qÇäą-M ,±ăúŰöě”űଭOyvlZm3cóéJ>ن űĆ~׳]×XTéW÷­ńľä%/ąFRóĆxÖ7ńŢ\#Ń Y.˝6ŕęŚČ¦Ib©˘TČ]Ě9Í RaĚ÷9,_c1GQúíPó íHţKÎ ĺY`‡€L=ó[Ű(sBÖÜĺŚmeěűý Ŕ#z0@Xw,Ů[\Íí,LNëVI—5•Xťíô~'-â:–G,˛®ô,`nĽ¶ńŠWĽ˘YO1¸“'Ć}\0ŔĘ_™Ŕ‚EŞťxŔš:ɧŕҢHy"Dťµ<•”ˇ`0yDČÄĄľ«đ/ëĄ_ ÷G>ň‘ŤŐÍÚŠu\¦Űőű oxĂćmLĄeżkžíçŇŮS˝€ň‡4Â×>QŐ׋M˛×¶¬?ÓĂż]Ö Ó§KĘŕiAS­G=¬éś˙.cÓ|dÉ•eäű\1…‡űáW¶QÉ—2š ˛r‡F“xÇdfaS.˛˙yÇlŻöxÜÚĄ\şZ‚kÁŹ Ŕ#:™e@`“v(˛‘@ ąˇ<ú®ďú®ćÓH™Í…Ö?:ĘąEX‰>vĐŚE*8„ŐRZ¤ę¶MR”óŻiđ"P0! )-ŕ´W[¦şźµő¦M¨ p‰ËšŰ6šÉ`Â?Ę áĆҰÍc mÜiJ8Y“žđ„'4Gű­Q+‘RHá3®vuIt}Ż|ÓĎ©Ć7Ĺu÷łüŚWs& ëZ”Ç©ś×!ň*eĽšcĆĄ±·°2Ҧ©exQ<đ†Ú‰”瞼cĄ.='Č,yüwń>¨kQ̵]ű¶+ďCąVxDO”‚Ihú¬ßdç~,ŢLŽŇÍśtůŚ0đĆ%ü†Č„&ĽÔ-V0LHʸł>Uć9Ć–Ţ$gY!oľ‰­5őv?€oMÇé=S©¬_ł<âŞL;–vłŇÄ)/x ÷óT>ěczÖť1Gů˘Ěm˙ŰÚ—iĆŹ1 \˛ß×óî¤w ŔJ]¬; â EéŤ%–ëŰ>mc3VŐ5)ć~.#”ĺŽa[Ţíű9ąÍŃ©Üô%qC›ć|řYŢßĺ;™E~Ř‘ ˙Ryß%ßňY Ĺ"ňĄĽwmů^xDO›¨Ńj» đ¶|űÚĄÎÜîpŢ5—^ř—őĽľ|¦^'€Y2x"Ŕ¦R7Ś9 (Ú¦ĽuçđżWăĘş>•ŕ •xţoÓż™[(e€ç€×™'Ůb. Eg«PĆ«ëQ¬ç”áyÄ m[ ¸\‹5•‹ć|ópÇż,›9|g ÷sG‘×ĘK€·t»A|A €k4řľÇˇ’¨^'B°äşç"­<©śX}ů'¨věÜeŔËú •ĚrŚŰ`>÷ąĎm¬çm@ŽĺYnUJ G)7€ż-ßÔ±ýI1ńc…Ćí•2"çX,í˛Ęßň °¤ěň~ýţ°€ÓÇ»pĽQîbí•ţNÚ]ű!s*eDyśŔÄŐl~ľâŠ+ µ&Ě+EyŚÂĹbj¤uŮVnh®ZG´–®x˛)ssiŽ‚¤%č—őŞßwç@ŕ-<ŚŔá桉J~ČP€5BÄ€ćnäÖG˝-(d"I;e«đCžÄŕÉ2x‚@lęKX°6LfÖ˛Su†ŢÓ+oZ»<=ç5kÜ Ë!bŇł )Űx#m©gN NJĐ ˝K4lWą„ţŁ Ŕ]úȵ¬c˛ô2ţúS߉BH)5Nc5ĆeëéĚťĄö6€SVĆŐ6eşŻ%NY2Ţí@ĺůĐć%ĘüÂÜ\śřŹÜA®řĚsó2»v±°»ŞC~™k¨p‡–ąVx #$+µĎm@&5PB,;,JŮÄ÷еP´˙)Zr&t&zňĘgęÇZłŢMXç:˙äOţäV·›zźţů.·§>ő©ÍzŔ"€ äÔ]ąĘMĽ+G¨Äť6â÷Ň`Áł]eéşíS~áMĆö.uKćG<ň‹uę;ëŃ X»¶ EÁMâą•;Üá HY#őg®d=3c6§đhlŃ^€‡9ĐÜĄSB˘Xż}śőÍĄ8s&㉻;kę5őÓno3ŻYÄ^X"ßĚË(ČËSóOúÓO?˝ńarĹŚlü.˝,Ł\Övťéu>«Ľ…Ż82Í3ë’ŰŘÄööoqAqŻzm¬Q×"€¶ĺ)m(Ú|&x®ç“°4Iój?ŔĆź+<)¬Ő„'67z,ŕRQ™[†şÇÝ_ZÖÝ) „K—ú °Ta3ĚŃXŔQî†Soż LUĆż'Jw´ńŠ–ŕÔ?Ö) \¸Č‡»Üĺ.Ť…š2ŔYÓŢĹĆ{ű-!sźŚo§¬‹/UćˇĺpÉřݵţúšw(Ę›ü˛¤’%‡©JéPť˛îŻ p\şßy¸ĚµXŮ@~IđŐ>Š7ĄáSćysˇţ;(TŢŇ]\«´đ©ŕ([Úµ Ť¬źsÎ9ÍŰR"ŔrAĐTac"šč˘P>›'ţeb˛*ą»Etďâ>ě`…in—üSoo&ňŠ2ˇ™Cá—Úš˛ęçxč˙ /ĽpóMßôMăHiüqˇWÜĎKYŰňŘäc¬â”żë§9\0ĺqéČ}˛ČŢi¤ Kňh×ö×ç§q đżÚ®Ő¤˝·¸ˇťăŤUBŔh’¶-ŕ©,˝ÓwXĄ,E®ń’210ç¶ ř—éĆ~gůsA‹/Öş Ő:jy}lľCéŔ±€w©˙P9őŢvpĄ 6Jźlb8E,ęňő–‰PďęQ)kzÇ= )K’9ižQ$|*#ŔżT9ę4Ĺ:ó|©ük>'Ź€xÍbśů XÖP)ݶ€Ę¤Ŕň~ď{ßŰÔbj&"@dˇź}öŮ›·˝ímGo’ai'˘t€d‰ętČ·~ë·6uöʰt”#kf—üŹ2,ľ$.CiŰs |z¦ŢŰOTč—–A(ĚŐ”Mzç._~ůĺGn#Er­`.äĐÔ22EVŰźl«Q醎fěz,ŕ]&+aČuŽlŇO^,bDó_ €ĺáć{ĄĂç@9Vx…¸¸)q(^—Ą¨ŕ(¤ĂK•‘9)."[öÖ*ĂD™çKµˇćsň8Px€×-.«©ŕXf{§;Ý© 4á"±Diů•'RręZQ #ź±śőlň;*ď‰O|b󇶿KD¦ú±¦° )‚…Uú–·ĽĄYV‡R¨ú˝+•|Ż‚fWnî×óĆRČ´N`V™&iç~€)Ôq{Ż5^EZł€)ĺąőn?—üĚóoi+ľ]^ý˝*đh™´" K x¤óÖMnr“ć4ź—˝ěeG÷csßÚÇ—Iu”`Äç4ź{îąÍ »%wŔeᬳÎj޸DŘž¤ Ú˛„°a‘x’<#¸ôr€Će”M/ůž2Ęűőűár ´ ő3ĺ0îč(żKާ°ůś÷č.=¦˘›‡”`V}–Q–ę©”ńîwż»‘ńJ-•Íçäq đŻV6ą—@0đHç-“Đ9±Ż~ő«ŹÖ¸0MÜIU&Ôvtâô Ł2}Iëö~`”u4ß—`Î?ć1Ź‘ĺ‘ Ú÷¬s•BŐő]©\{żÎu®łkvőů=â@9ćÍ3ŰuŔ9,c—y×n*k”Ĺ€łĽ´´W%m˘”š‹˝HŘ®ĎÜßäĐŐ†Ąë?·Nőąy¨<Ŕ7Zx@>’ŢŔ÷µŻ}m“.ÁPĽl!Ú5˙NŔdÝ,[9Üłź9e&íśO_qy›ü˘I%ĂZó..î®úDrOţ•N”ĘKׇ]@K —´qµ$ĹĘ/mť–üľ÷˝Ż™e;—h đŤ\x Ž_ËŽîăkÇ*%ł3ĐwH č {‚Q †„L&î ‰5ZđRpY?Ö.a‰¸»óšÂ2Í®ßKľ,éŽÜµ^őůÝ9Pö-Wp\ĬGK`ˇĆ”]”5ॕĎ^Ý5<7‘K€›î<Ř€şhE(ě ŔŠůŞŻúŞŁýŔ9`€…g˝¨´ôŞ4ę–ýŽMÜxÜzľ— ?*Ł-‰Jw3&čki*Ýw€—ćîńćÇÂĺ±Aöűfź.đŚ•ßKÖ2 žĺ™ĄX]#3Ro1KSäQ9—.Łć·>*đGc^ÂŤÄBt Ͱř󮪥µdVp,༩hiŽŇ@kXŔŃôuSŕÁz ·€$Ęo Ą±ěűĄš—ťŮĽ§” ňcÉHîđ!ĽÉĚőúyX¨ÜÓ_ŽW$¸”ü-ˇŤł€­{Ź.r¦î·|Ë·4î¶ĄĎ8¶5!L‘@Kp´ďÜŕMţkXŔĄ€¬Ü°ů”úáJM_SHQ¬Ľ%ëÔZ3€\:fA]Ó@|Ú‰·w­Ą÷}ćŕ’<Şyť<Tîáu¬FÖęÖŻb®ýë7ĄĺXĘ׼ć5GG:®igKÇŇ“•đ$\ěoî¦=,ťu9ÂŚĄˇ3+ŁúĐ^r Ö!N˙ľ÷ŞŁY×Řßë3b}/Í´ClÇîgőMKĎéĄyQóć@ŕţ´Dů.%¬űĘËË B±†iĘKtÖ€µP.°Á‚PŽc(×p?ăG¸ZżKŽŽýÉ+@By‹Ĺ›—3¬Ńç%/áŐęâdv;r|kWş]®…oKĎé]ęTźťÎ Ŕ=< [Ű\ €Ĺ n0·X"—{Ş3ůrą¬-WúŇ |-&$YK»Ď—ćCÍo€70@ çÇ*ÎËąű©(tî–ß»SĎ»yaąim ¸đĽ>Ú—§ö€˝M'®'ĚůĄ_úĄŁ„Y\ť9w8×ÖúZ(D(/ ŽÖK¦í/í~ĆB \^ĂšPNň] €•AP¦ż+ť: ŔĹ ŕrÂZú”*y&xÉ÷X‘ľ/Ie˝×`‡đČ;JË’őŻyť<ěsĂ:21ď|Őü‹/ľřč0sż˝Ěŕ)OyĘ*`%˙6Ůßú_ńŤ7‚ˇťfÎo,3Q”ŽĄÝĎę×07őěµ,ů®€ţ˛’Jˇ–ëőóđ9đ‡ł×ď…îv·»ĺëÎźÖPŐÉ)=ŃjwÎôD·ąÍmš3Üë^÷j˛ă–^2™žvUT5đu°wů.]FSů˙N-­¨ŘđÉgv)Ż-ůťĐ\cokYǵĆQŰ‹b /]V@ŢĽ”KçŹOQ~˝˛sŤüËľX»Ż•UŰPr|ÚwxCtě°VŤŰ–Wh *…•9g{[ym‰23†2?ÖÉ›âľFţákžr˝qŃë‡lg\ŁśµŰ@6)Ă2\ŰŔ[Ş=d+>ĺ]Öeľî!±Ż—•mżĎ}îÓlźńú;Żň{ë[ßÚNŇüÖřüu&y1QÄK[x7»ŮÍĐzÖłžŐÔŰD]š :B˙]ďzW“uÝĆł4‡k~Ks kŔň%¸Ě饩tE®˝ ÉŇRĄĘ!ě5gréxď퓞ô¤ŁčáˇF-u/Üçţž[ŤL;¶6›5„ąůu=|i°ŕ¬KuĄ­×*öĺ@ů}Éş•ů®Ŕ<‚,—ŠGY˛ý5ŻýâŔ^pÉŞ[ßúÖÍ‹ ÷¸ÇąWËűk|AŚ–`yfrZ›]‹Ôű=ďyOcIÔ űkqąć»,$đg-p,ÝĺžŕĄÚ|Äu¤-ąV?+ÚŘ›5`ŔZŇ…^Xţlľł€O&±€MŘ5ÎŚ˝ůÍo޸ˇ×`®sL#·¦]©r`ß9Ŕd ŐĘTpéň^٬šgĺŔ6T©<Ŕ!Ľ†ő«H‚ŕŇK/]ő`‘¬]×őßN®·öŠÖ~?ôˇ­Y_đšđ^1µVfo9Px k¸ ×`ĹŢîv·k˘n×ŠŚ ×őßN®·öŠĽM˘¸×Z2)×€«ĽW]­¬ĚÁ¬Gď°€bÇQţ®eFy¨𮜬ϟ,$Jy­1[-ŕ“Ő“µś1¨<ŔĄ5]ĐĹ.v+ĘCµ€ciÍheälń|.]\^ľŐ^š»5ż©¨<Ŕ±S€×˛&XWoUĚâ@N‘Zëśf‘ÉÖ™EYg›ă¬ŠÖ‡*ŕ@]`âÚkŔE/r+đZÖÄ"•¬™TČöٵ˘ Ĺ ]ZÂEńőkĺŔIĺ@ŕv;’ĐQx±žd{}ů´g骿Cá+Uâ^ËĆXe0Ö!đĄÖńÔä@ŕž~Íů§ dęI¶×—qůţ÷żżyŁÓ^W´V®rŕ*ś,®[ęŰÔ5ŕž^Xó¬ž"ëĺĘk=NsAÇŐ}­gxeŔ±r ZŔ=ěŹ|Č.螦ŐË•{ËÝčF›;Ü᫺-ͬµĎxo[+¶—¨ÜÓ-ŕCvA÷4­^®Ř[ÜřĆ7ŢxGřšŻń{Ń‹^ÔwąÖ«'÷–ąµb{Çę‚îé.hŰÖ é)ş^®¨¨¨¸p pO'ł€Yż^ëW©r r r r r`iTtéáčő®w˝ÍgśŃs·^®¨¨¨¨ŘŤu ¸‡^”púé§o>řÁö¤¨—+****ćs ZŔóyWꬍ¨¨¨Í ŔłYW¬¨¨¨¨Ď ŔóyWꬍ¨¨¨Í ŔłYW¬¨¨¨¨Ď ŔóyWꬍ¨¨¨Í ŔłYW¬¨¨¨¨Ď ŔóyWꬍ¨¨¨Í ŔłYW¬¨¨¨¨Ď ŔóyWꬍ¨¨¨Í ŔłYW¬¨¨¨¨Ď˙ó˙NĐüÇë“»pŕa{Řćëľîë6w»ŰÝvÉćXź}ŮË^¶yë[ßşyÖłžu¬őŘĄđżýŰżÝ苇?üᛯůšŻŮ%«c}öŃŹ~ôćKľäK6÷ľ÷˝Źµ»ţú׿~sÉ%—l^üâď’ͱ>ű|`s˙űßóŔ>psĂŢđXë˛KáĎxĆ36˙ő_˙µ9çśsvÉćXź}Ë[޲yţóźżyÁ ^°ůřŹ˙řc­KWáő,č.®ś¤kżó;żÓĽqé$·J1ń±ůíßţíUň>Y™z/ěŻ˙úŻoţůź˙ůdąJ9ď|ç;7‡®OS†ô…vxč!҇?üᦠ˙đ˙pŐ?Şó»ßýîÍţçý>Ä/^+kęŁ6źőYźµůŘŹýŘc¬ĹîEOźň)ź˛{FÇĂ'~â'6}q¨Ö/Öy‡¸ńôq÷qÇČÉÝ‹ţÔOýÔ kţIč‹}}Ż{]>äŃUë^9P9P9P9p°¨.číşZńĘĘĘĘCć@ŕCî˝Z÷ĘĘĘĘĺŔGýđ :ŘÚ@ĹEţéźţéć ľŕ šÚŠĘű•_ů•Í˙÷7kí&؆qťë\gŻÖ,ţő_˙uóÚ׾vóĺ_ţĺMdިá_űµ_ŰĽ˙ýďß|îç~îĆjč÷˙÷7ďz×»ščî} űó›ßĽůčŹţ荵-ôÇüÇ›ßú­ßÚ|Ú§}ÚĆÚcHT÷űŢ÷ľ¦}ÚčŢ'|Â'äö±~ŽOý×˝ů˝ßű˝ŁúkĂ_ýŐ_mľđ żđXëžÂ§Ś§ů—ić ţďŰúv{÷9š/”Ŕ}˘r<©×ź˙ůźoúЇnţđ˙đŐ<„ą­ŇúЇ6l˛+ŻĽňjm8¤ą­â]ü¦Tc™×mů{µź¤5 zeFĆg|ĆĆzć3źąy⟸ůÚŻýÚÍťît§ÍYgťµąő­oÝX»ŹyĚc6űşoPýEkłîŤo|ăÍüŕ¦M€–5ü9źó9MÄäÓžö´ćúż˙űżoŢđ†74`Ý\Řé‹÷ľ÷˝ŤUuůĺ—7ĽéK_şąě˛Ë6Ź|ä#7îŃŠĎ?˙ü=¨ń5«6¸Ó7žľů›żyăńVP0Î=÷Üć÷>ü3žľńżqŁ_€Áő®w˝Íé§źŢüÝěf7Ű›čâ˛/Ö‹^ô˘Ć›RňBw(sűĎţěĎ6ŹzÔŁš6đ …(˘ˇanńű=ďyĎćv·»Ýć÷¸GšvěźŐ^ą śtuó›ßĽ±¬¸=rŇŔâÚd]qG8ĎyÎsV®ÍĽěąţ( uő ßđ GůÎâuSNĂr Ĺďţîď6®ôŁ„{đ…˛sÝë^wCĐč‡lMHTŃ$Ŕ¬-B•"±O4f<•ő}á _¸ůęŻţęÍMnr“ňň±~3žţéźţiów÷wM©¬­nžŰ'oDĆ“úq‘ău–i\C‡4·ŤőóÎ;os—»Üĺ#•żę˙!Íí!~›Ű ‰źú©źj\ěńÜ]­±'ůGŕ•nĺ7¸A#Lě™-÷7Ň2ąăěUŁ™±0÷•ľç{ľ§©ÚßüÍß­ˇş`=µ´Ü_÷ş×m¤eě“ĐW×[ÜâŤvoŤ´ÔđË6X°6üÁ~°ůä©°nż/4f<Ą®ŽDü™źů™˝ňB¤nŰĆ“ńóĄ_úĄë¬ČR~ĐwűBOęs«[Ýęh?|)Řin_˙ú×o”µ>ţÂÜâ7~űŰßŢČ[ÇťZj:nŞ|’z@ í¬$î’} T*ë×ő˝Ým(”˘W˝ęU›/ú˘/jÜí]y÷µˇ6XsĽřâ‹7wĽă›őmîö}[{Äżv\kŹ'őľŃŤnÔ,¸żŹÔnG9ž,oXŕ~Ö'_ů•_y5ĹiŰs*×éćö˙/ĽđÂfi‰ň÷ô§?˝ *ă•Y]©×ńôs?÷s›Űßţöyd/?űĆ“Ę~ý×ý†ĐtľőnKŮM°—Ť9E+uHs»Ż śimgC–ťśzgGď8©đIâ>÷2kJd'úĺ_ţĺĆMËŐvH$¸ççţç›hI.Á_ýŐ_mĄőŁG<âÍuí%ýe_öe{Ů4o¨±Mç/˙ň/«‘ĹÎRDúĺÇüÇ›ďÚôĆ7ľq#đgßhŰx˘D(ăVÜgęOę|öŮg7VŠ%oÜÖ‡6_ö™÷cëvHs»ŻMó1łńv'.h$RÝŇ™Šă¤ý]tăŚ3šŞr=‹€¶]ěď˙ţď7·Ľĺ-Żt¶OíO¶U±ôËýÍűT÷ÔehÚ÷~9ŐęwHs{÷‚)áe@ěPú5ďU^“»5ďĘĘĘĘĘÔ5ŕĆÔË•••••kr đšÜ­yWTTTTôp pcęĺĘĘĘĘĘ59PxMîÖĽ+****z8P¸‡1őrĺ@ĺ@ĺ@ĺ@ĺŔš¨Ľ&wkŢ•••••=¨ÜĂząr r r r r`Müâ|¶caHIEND®B`‚scales/man/figures/lifecycle-defunct.svg0000644000176200001440000000242414520132301020042 0ustar liggesusers lifecycle: defunct lifecycle defunct scales/man/figures/lifecycle-maturing.svg0000644000176200001440000000243014520132301020235 0ustar liggesusers lifecycle: maturing lifecycle maturing scales/man/figures/logo.png0000644000176200001440000007235314520133407015422 0ustar liggesusers‰PNG  IHDRđŢ«h cHRMz&€„ú€ču0ę`:pśşQ<bKGD˙˙˙ ˝§“tIMEç  7źDeIt „±®€C‡qfß> Dw]«^~ h_ôŮűá#°ø1Ŕ€?ŇűřÉ]ŕçŔ€zí˘ŹČŢ ˝nä v¬ćüTÎ?>lŕ#±·ÂG`/qE`đ`*‘‚ŕCŕ'ŔU@‘˝ >{ <–ËiŔ×/ˇ.ť‡‚*ŕUŕ7@‰vŃGdŔăÄŤ@5N}=Ě·Ę~üh‰˝>Źc¸‘×lľ ¬ #tKpřĎ®˙:ŔGäń Ç!Ü+‹?ž‚F© ­Ŕ;Ŕ·´‹>"Ź?ř<Žŕ±\ž |ř 0ňE@ÝÍeŔËŔoJí˘ŹČă>ʏ‘7xř6°`°ĺ)Š‚,ˢ8\~ |´ŹÄă>Ź1Ük6ˇîséú÷€ˇ7 €Ő«W#Ë2.\Ŕjµ•ČvŕęůńiÔý˛ŹČc ÇËĺy¨3î3¨3đ€ˇ( Š˘`03g{öěŃ |ţüyöíŰÇť;w$ A†BäFTO®˙r´‹>"Ź |exw đ<đ"<Ř2µĄrRR;vě`ýúő„††b6›Q§ÓIKK 'OžäСCTVŞŰYQ|ÓÖQü řŞŻ5ŕ#ňhĂGŕQ„y€=¨îŹË[ž¶\gÓ¦MlßľťřřxÝxĺçç‡,ËŘív}Ö­¬¬äŁŹ>âäÉ“477uY­Q—Ő€Nđ‘x4á#đ(ŔCć·uź» ő|wŔĐëççDzeËŘ˝{73gÎDE})-B:‰eYćÎť;ěŰ·Źk×®ałŮ†Jd+p•Č|D ř<‚čCć÷9ň4rŠ˘ČĚ™3Ů˝{7Ë–-Ӊ޷7käÔţ&Š"V«•Ë—/łoß>ňóó‘ey¨űăZŕ÷řd‹ŁG˝Čü>ŹJŢôAH7yăăăٶm›7o&<<ĽqÝżŰ=ż#Š"ŤŤŤ?~śĂ‡S]]=T䢹޴‹>"?|f¸‘×Řş\îŹĚŻWhËĺ6lŘŔŽ;HJJĐgĚŢ~ó0»W3f•••qŕŔÎś9C[[ŰP—ŐpuY}źlqDŕ#đ0ÁCć·Uć÷8—ůÝĵX,,Z´Ý»w3wî\ CŹ}n_żí/Ýż/.—‹ěělöîÝËÍ›7q8C%r;ݲĹkřd‹Ă ‡Źĺň4şe~±)ĎťśiiiěŢ˝›•+WĐërąŻ2B`Ď߉˘HGGçĎźçŔő©‰{tËKµ‹>" >˝ČüžE•ůÍl™Ú¬ËÖ­[ٲe QQQý&®{9!°çďEQ¤®®ŽŁGŹräČęęę†Ă-ó6ŞHâ]şd‹ŕ#ň`á#đ ŕ!ó{”n™źq0ĺiÄ bÍš5ěÚµ‹””ýČg „*ÝËŃŽ¦Š‹‹Ůż?çĎź§ŁŁc¨DvŇ-[üźlqĐđxđů-˘[ć<ň´ĺ˛ŃhdţüůěŮł‡ůóçc4şĎ}XąĂA`÷˛DQÄáppëÖ-öîÝKVV.—k¨ëşe‹·µ‹>"÷>÷Ëĺ$T™ß RćÝääädvíÚĹÚµk đrą7 '=ËE‘¶¶6Îś9ĂÁ)-U·łCÜ—˘îŤ_EÝ+>"÷>?nä ˇ[ć·p°ĺiË娨(yä{ě1bcc‡…¸î÷n{–-ŐŐŐ>|ăÇŹÓŘŘ8ű㫨ÖęQ­×>?>÷™ßFÔcˇ-€y0ĺąËüV®\ÉăŹ?Nzzşî95\äŐî5Rv/_ŰŁçççłoß>._ľ<\˛Ĺèűăłřd‹„ŹŔđX.gß>„ ¦ĽŢd~‹-Âb± ë¬ëyĎ‘$°ç}DQÄfłqíÚ5öíŰGnnîpÉßD Dź«]ôą'|î‚qăQĎrż¤ ¶Ěľd~#E\ ŁE`Ďű‰˘Hss3'OžäŁŹ>˘˛˛r8Ü2 P}«Źęk ř¬ÁG`z7ž2żA=źÉüF’¸î÷M{ŢW“-:tS§N ‡lQ¦[¶xźlQǤ&°q ¨2żďŰżÁ”×_™ßHc¬ě~oA$‰ÜÜ\öîÝ˵k×°ŰíC%r'ŞîřÇŔ%|˛ĹÉI`Źĺň ŕ%T™_Ô`ĘëŻĚo´0–ö¬&[ĽtéűöíŁ  `¸d‹˙¤P»8‰<©ěAÜhTŇľLl™‘ůŤĆ=ë"Š" ś8q‚Ź?ţęęęá8vşCw¶ĹFíâd"ň¤!°‡Ěo;ęry Ă ó[ż~=;wî|¨Ěo´0žě^'ÍŮŁ´´”§lń4ę±ÓÔc¨ICâ O`™ß2TŐnTŐ€1™ßha<Ř˝^šl1++‹˝{÷rëÖ­á’-ľŹżú:“D¶8ö˝:BđX.§˘F~|l™ÚĚ:X™ßhaĽŘł~î˛Ĺýű÷S\\<˛ĹJÔL/Łf–&.‘ÇOŻ<Žę„ń-`î`Ë.™ßhaĽŘłž˘(R[[ËŃŁG9zôčpÉoŃ-[lŃ.N4"Źż^ÜČkFu{ü.Şä¸ůŤĽ…ŔîőŐŽÚŠŠŠŘż?.\.Ůâ1Ôc§Oşţ=ˇH<~{uđů-D<…*@0FJć7Zđ6»×Y“-ŢĽy“˝{÷’ťť=˛ĹfÔĽÇ?CÍ L "Źď^}<–ˉ¨żŻvý˙AAsLIIv™ßhÁ ěYwQimmŐe‹eeęvvűăŕ×Ŕk@•vŃ›‰ě˝ę↠Šę˙Ud?(hËĺččh¶nÝĘ#Ź<2ě2żŃ‚7Řł ‚ PSSñcÇ8rä Ă‘MB“-îĹËe‹ŢŐ«Ü'ó[ŹşĎ}”a’ů=őÔSĚś9›Í¦ĎĆŢ:ř˝™ŔZ;ŚF#‹…ĚĚL>řŕá’-Ú€ŹQϏϡž'{‘˝¦W=fÝą¨äžEµ4î2żąsç˛gĎ.\HPPîţçm3Ż{Ű&µ¶˘H@@v»ťÎÎN®_żÎŢ˝{‡K¶ŘĽţ®vŃ[<î{Ő¸qtËüR[¦»ĚoçÎť¬_żždYĆd2a4}'ĐěďﯯŠFH¶üx¨Ó.Žw"Ćş‚‡Ěď)ÔĺΗ¬«ÉüvěŘÁ /ĽŔâĹ‹1›Í:© ˘(ârąď[>kA·škł”·BL&.—K·Iřůů1kÖ,-Z„(ŠTWWcµZ‡BäHÔ­Řj ŐŕĺJMMĄ¸¸x¬AßĎf¬+Ї’-VŻt}ʵ‹ŁMäQ]B»‘7 ř"ŞJä)†[H“ů=ůä“<˙üóş¸~° ßzüˇ?Kčľ~čçűééé,Y˛„€€Ş««iooʲ:Ué¶ 59[`íeő¨ôއĚďT÷ÇM ĚoíÚµěÚµ‹äää!Ëü|3đřĂPfŕľĘ٢U¶řźŔ)FQ¶8˘˝ę±\^€*óű4Ă ó[°`{öěaŢĽyĂ&óóxüa8 ěţlFP¶řŞĹ:[»8’D‘^ő nđTËrŇ`ËÔfVMć·fÍša—ůM6»{<ŻŹ—¶7=Ű>B˛Ĺbşe‹ŐÚĹ‘ ň°÷yOˇĘü– ¶<÷l~[¶laëÖ­#&ó›lk×®qíÚ5ýď‹…;vĄ«Ćş-#A`ĎgĄe[üřăŹ9qâÄpd[TP˝¸~‚ęŐŐĂOâa{nÄ5˘ĘüľlEÍb?đÖ»ÉüV­ZĹăŹ?NZZÚdósżçd"°(ŠĽţúëĽţúëúq[pp0˙ôO˙Dzzşî>ÖmI»?ŻʶhˇlĎ3̲ĹA‘Üá±\žęAőY b°S“ůÍ›7OĎć§ †Á=Î7‚€Á`Đ <ÄĄŁWÂÝZ-łfÍ"%%…k×®é˛Ĺ!Ś;?Ô€ëQ•Nżň4Ţ •Č&°qcQŹ…ţ6Ř2$óݧ><ÚŘ’$ łŮĚš5k;w.'OžäСCÜ»wŻÇ÷(ÔUéTíń@ýP‰<¨s`7ň îs |™!Ěş’ůŤ&q'Ó9° dff’™™©ĎĽfł™Í›71.öŔZ=s<”ű:ˇřűű÷-VUU ‡lq+Şl±(e˛ĹÍŔYÜe~ţi‰F\=›_o2?| ¸ű$&&ň /°zőjöîÝËőëׇ"[uŔbÔ¸\?®nŢĽyŔ˛Ĺ~ŘcąśŽşTţ3ă.óÓ˛Ö»Ëü|ű\Ć ÜgcQ™7oiii\şt‰ýű÷“źź?”ńŞĽŰL·l±x Ëęظ‘¨Ć©ołű@$óóís}Żpßűůů±iÓ&ćĎźĎńăÇ9|řđPe‹qŔ˙AUăý 5†uSÜçŘCć·řj,ŞAĎşšĚoëÖ­–ůŤ|{`ßřaunŮâÜąsY°`Š˘P]]=TŮb ° Uť×/Ůâ}3°‡Ěo ŞĚď h05ňĚć·gĎ]ćç~Î8^KoőźL;ĆkŰÇK˝´ń›śśĚ׿ţuVŻ^Íľ}ű†*[4˘¦ZNw¶Ĺ››7oîU¶¨ŘcąśŚęúře`ĘP¨ť«ő&óŹgŽÚ/+‚ˇ¶Es|Đßú»Ń†F„ńT'OL&–.]ĘěŮł9wî °°Pß;!¨2Ű-¨Ů_Ę<—ŐFâ†ˇŠ ľ ĚlcÜe~»víb۶mşkŢxy{ö÷˘˝h@@î–ńÁ´Á˝l÷2ÜI¤˝Řú[Žű÷{»®ŐŰ`0ôY–ŃhĽďšźź~~~ýn§F0­ßÝë3”gć^®ć%§•ëyżń‹Ĺ˘§ž=tč}ôµµµCŮ'ěâgŔ;@‹Ć[­÷̨–0MćgĚť<łů=ţřăL›¦úutvvŽőł˝îT ŠVVVF^^eeeş^488)S¦––Frr2ÁÁÁý8˘("I ”••Q^^NCCV«P_QQQ$$$””Ddd¤îĺYŽËĺęQN}}=řůůÍ´iÓHKK#44“É„,Ë8ťÎÖ͇»ÝţPŇiŠž{÷źOyy9­­­úţ0..ŽéÓ§“’’B```żź™FΚšrss)))ˇ©© ‡ĂźźQQQ¤¤¤––FLL ˘(Ž;"óĚ3ϰdÉöíŰ7˛Ĺ¨ OŁú]śFÔ ó‹¨3oč`JÖk2™ô}®–ÍO3ŤWh%;;[—•µ··ß7 ´ě)))lŢĽ™ 6`±Xúäáî޽˩S§¸}ű6uuu8Ž^Ë6›ÍDFF’‘‘ÁSO=EBB‚ľ±ŰídeeqöěYrrrhhhčł‹ĹBrr2[·nĺ±ÇĂl6÷Ůžv­/%IB’¤>Iˇ=ł;wîđńÇsëÖ-ZZZ$©ÇóĐžŮĚ™3Ůąs'K–,éőĺäنĆĆF:ÄéÓ§©­­ŐŤWî÷7™LDGGłdÉvîÜIBB¸\ÝM›6Ťo~ó›¬Ył†}űö‘••5٢ 56×*Ô™ř×Fŕ´,C÷>7==ť]»v±jŐ*]ć7žsčş×˙رcĽţúë455éoH÷¦µÁjµ’™™I[[›~nÝA ®®Ž>ř€S§NŃŇҢwV¶'śN'÷îÝŁ©©‰Gy„ÄÄDA ąą™W_}• .ôđňÜjut8Ü˝{—˘˘"Š‹‹yţůç{Xúű‹ľd†˘(błŮŘż?űöíŁ©©©Gť<oµZą~ý:wďŢĺńÇç©§žŇ—çžáaEQ¤¬¬Ś_ýęWÜľ}[/G[Š»·S’$ŞŞŞ8pŕ©©©$%%Ť»YÔńe4Yľ|9sćĚáâĹ‹|đÁ”––Ĺ‚š‰s·‘! EGGłeËvďŢMTTTĹČx'Ż \Ľx‘×^{Ťöööđ@Q¬V+V«U'ÁĚ™3 ëőŤ/………üú׿&''§ÇËŔ]¨ˇ‘X–ĺ3dBB‰‰‰ú˝4uŚF^÷\A śN'mmmú†Á`@’$:„Á`ŕůçźżoŻ;ţÖůúëŻsđŕA$IŇ—Żfł™¨¨(BCC‘$‰¦¦&‘$ Á€ŐjĺÝwßE–e>űŮĎö¨ŹÖ¦¦¦&~ýë_sëÖ­űyłŮLpp0AĎŹ¤m "##™9s渜}µńę '((Ý»w3ţ|:ÄńăLJ*[ŚpŻjÄ Ôe~Ó¦M# `\śÓő‚ ĐĐĐŔ»ďľK[[›ľś á±ÇcÉ’%şIKK EEE\˝z•»wď˛páBŚFcŹóUmóÓźţ”ÂÂB˝cdYĆ`0’’BFF)))„„„ ÔÔÔ——Çť;w>}:ÁÁÁz™ááádddPZZJll,óçĎgţüůLť:•ŚF#‡ššÎź?ĎéÓ§ő˝–˘(9r„yóć±jŐŞ!Iń´věÝ»—ö8»_´hŰ·ogúôé˘( ---dffrŕŔJJJôßďßżź””6lŘĐăEŻŐőöíŰ:yµ˛·mŰĆŚ3e™öövŞŞŞ¸}ű6—/_fÚ´iÄĹĹŤ[»CăN\\_řÂXąr%ű÷ďçŇĄK–-ö›Ŕ“ůyĂt‡ ܸqââb}°űůůń /°cÇŽFś¤¤$222زe ąąą$''÷xQiäŐ–»žäŤŤŤĺSźú«WŻ&<<üľ%ˇ˘(ŘívJJJ0Ť=Ś2A?~ŰĽy3‰‰‰úěĺţ̧L™ÂĽyó1c/żü2ťťťúŚyěŘ1˝Ż­ßoܸÁľ}űt≢ČcŹ=ĆsĎ=GXXXŹqHBBsćĚáç?˙9ŮŮŮşˇđĂ?$##CwĆĆFΞ=«?KY–Y¶lßúÖ·ŽŽĆb±č«»ôôtVŻ^ÍŽ;°Z­ÍfŻ™8 űüxÖ¬Y¤¦¦ö-tőÚ/kä}ĚĎŰ IŮŮŮ8ťN}6ť9s&6lЉçž3I#řâĹ‹ďŰßkßůř㏹yófň¦¦¦ňŇK/1{öl˝Íáţ|M&3fĚčQ¶,Ë,\¸PWĂôĺYĄť7nŢĽ™ÂÂB8¨Fˇ»wďRYYÉ´iÓ}ÖŢŢ·~Hkk«ľZYľ|9_ř ęµMŠ˘0uęTžţy~řĂęËEm5óŘcŹéő.//§şşZ–~~~ěÚµ‹ČČH\.—nQw?¦JIIąďyy$IÂd2±zőjć̙éS§8tč•••z†‡î µ( O>ů$ý×ÍÎť; ęőřÁ›ŕt:©ŻŻď1‹N™2ĄĎóOwBą˙[ű˙=zT'˝,ËDDDđµŻ}ŤŮłgß7řz+»7–6#ieöö{íš6S®]»–ŔŔîřř­­­ jk÷ż}ű¶>‹jŇϧź~Z?Rë«lY–™1c«WŻÖŰćrą¸xńb·Ăúúz‡~Ď   âââz5L=čyyÜ÷Ç!!!ěŢ˝›żţëżf÷îÝőëeűP˲ĚęŐ«yţů牏Ź÷ú‡¦A›É4hłĚ`-™çĎź§¶¶V'’ lßľťyóć=xç‹âaßŐ^D‘‘‘z=$I˘˛˛rĐłŻÓéäÂ… zhEQX¶liiiťý´—ʲeËzXź‹ŠŠôçô8‚‡Ăˇo&:ÜWy Ľđ ¬X±˘_c±_6l‹Ĺ˘ßD»ˇ·Ăd2ŢŁMŮŮŮäĺĺőéąÔ:::¸víZŹ%w||<7nFĆw×ó\TóşŇ,ÔÁÁÁúwEˇ±±qP/'mš››«·Íb±°lŮ2],ń°ß+ŠBbb˘ţĽA ĄĄ…ŠŠ ýďáááLÝţCmmmś9s—Ë5nÝ'‡žö”ľŽ(=1ńźL0ŤĚť;W„šÁĎ~ö3.^Ľ¨[ŽáÁÔ˘4TVVöp•ĚČČ &&fXW+î/íhŞŁŁŞŞ*rssąvíçÎťăüůó´µµőŘŁkÇ`… ş÷;ŮŇŇŇt7M÷—G_źGo.—‹ŞŞ*˝])))÷=ŻC‡ńÖ[oŃÜÜŚÁ`č1Č':úŰĆ!µóV(ŠÂŠ+8vě>늢HAA˙üĎ˙ĚĘ•+ŮĽy3Ó§OÇßß˙al+**t—FmÉ8kÖ,ýi:;;Ůż?¸ĎuQ«‡ÉdÂd2a4Aꑇ:¸eY¦­­íľs로Bôö\E!$$„_|łŮĚŮłgőŁ)íŘŞ´´”ŇŇR>ůä{ě1¶mۦgNVOZC÷ě¶|ůrâââřŕ¸xń˘ľÔŹËĺâćÍ›óéOšť;wöp¦p8÷9ńÔÖWÝ:;;yíµ×8räî–¨ťť&&&2kÖ,¦M›FLL ÁÁÁşÁńŐW_ĺęŐ«ĂR÷ĺł{J’ˇ"((¨ÇKH[}ăß`Ö¬YuęT^zé%¶nÝĘéÓ§ą|ů2uuu:Y ­­­ĽţúëŤFvîÜ©—ˇÍz$IŇý`gaí·ŕČ‘#z=dY&11‘Ý»wł|ůrÂĂĂď#©&ç.cŹ{;E!--Ť§žzjH/Í1ČÓš®E)Ýąs'K—.ĺÂ… ś?ž˘˘"l6["_şt §ÓÉwľó"""&%‰'5ˇ§†ŃhdáÂ…,\¸˘˘"Nź>ͱcÇôóJQ±ŰíĽűî»Ěš5‹ôôtAčá4`·Űiiir˝Š‹‹9tčPŃ@ZZßţö·IOO× 9ž†˛áTĺhiM4(Š‚żż?Ë—/čż7hľÁžgÝZ™š ꣏>Jnn.{÷îĺöíŰúoDQäĆŤ:tçž{nŇ‘&ń1’'Ü÷vZŕĎ~öłüŕ?`ŢĽy=BáÖ××sćĚ}éŮĂżŮn·S^®&mĘżxń˘î-¦çłźý,Ó§O g×pBE"""zI555ŃÖÖ¦×a°źľ PîËuMĹłaĂ~đđĚ3Ďč:lí{gĎžĄ®®ÎG`şˇ °éÓ§óőŻť)S¦ô cnn®U#!!A?x×Č–••5¤ĽĽ6›Ťśś˝LÍŻ:##هőą/ §uvĘ”)úąłćŘáî·<ŇĐČ3Ď<Ă#Ź<Ňă©¶¶VWî0Ť=˘Vx*vújŹ˘(ś:uŠĆĆĆa#p@@«WŻî±Ś®¨¨ŕ˝÷ŢÓóőçş§·˙ßßţ°Z­=޶DQ$00Đ·„ž,pßËY­Ö†]5 455qëÖ-ýš6+iÖgY–™9s&«V­ęaśq:ťĽőÖ[Ľ˙ţűú}údZśN'Š˘¨+Š]G[\\|źŹ¶űŮěĄK—8|ř°^W÷6Z{W¬Xˇ'ýÖÎČOś8ÁoĽˇG4y´ö÷fy¶ŰíşÁÎݧܳ.‚ pýúuZ[[őëţţţă6¨ÝHĂššúwú‚˘(Ěš5‹Ĺ‹÷ůͨ/±ůx6~÷»ßqôčQ, !!!X,Ěfł.𨯯çÍ7ßäĘ•+=Ţř»wďfÖ¬Yş1Ĺh42eʲ˛˛hnnÖ=şśN'YYYa6› Äd2őѵµµ‘źźĎţýű)))aöěŮÍfŞŞŞČĘĘŇ®ÍfŁľľž3fŞűok{ć“'OňÚkŻŃÔÔÔŁ­ÚţyÝşu=&ýK­˘˝P‚‚‚¸~ýşžu@–eňňň(,,ÔPfłY'Şű]{{;%%%9r„††=ܰ¶‚ÉĘĘâ§?ý)ííí„„„€ÉdBEŚF#fł™ŽŽΞ=Ë[o˝Egg§^‡Ůłgłk×®!ÇýŤqן1‚ pőęUňňňę03ľ[>^÷«noo§¶¶–şş:ÚÚÚX°`»víŇ—­ÇŽÓŤY‚ póćMţůź˙™Ő«W3uęT@őMľuëwîÜÁn·ăďďOJJŠž9Ô=µb0ĎK–eV¬XÁ“O>ÉŰożŤÓéÔ týúurrrHLL$%%…¨¨(L&’$éƸęęjŞ««iiiaíÚµ¬_ż^'ş˘(Üşu‹üü|ŠŠŠ8tčiiiL›6ŤČČHŚF#mmmdffrűöm=~”v´¶}űv=ČÄxź<†“–ŔwďŢĄ¦¦F WPP@AAAŹ0¦žI×$IbĘ”)|ń‹_Ôc@yîŰ–,YÂ7żůM~űŰßRVVÖĂ·ÚétR^^®ż´ş¸»mÖÔÔĐÔÔ„żż?©©©ěŢ˝›ß˙ţ÷úŕTE÷ ÖfSͦ˝áwîÜÉôéÓůŃŹ~¤Řfł ÉĐŁť?ńÄĽ˙ţűzđ<ÁĐăöí»ĺĺĺ´´´č[„ÖÖVnÝşĄ?Ëşş:jkkąpáBŹh$Z´‡Ńhd÷îÝşř}˛‘&)EÁét¬KÚzSô¸Ůh42oŢ<>˙ůĎëń­úň Zşt)ŃŃŃ|đÁ\ştI?ŇqĎńăYw祈Ž˝Ľť;wbµZŮ»wŻľlô ďŁ!<<śÝ»wł{÷nJJJ0 Řl6]pałŮzÚ´{kŰĎz¸Ă]¨ńôÓO3uęTŢ˙}ňóóuŃA_Ë=m›ˇi¬ýüü°Űízą‡=€gYîýŁŐ/**Š={ö°cÇ]Óí#đ$˘(¬[·Žääd.]şDff&÷îÝŁŁŁC7"iłYpp0ÉÉɬZµŠ+VÚ§ŐťÄÉÉÉ|ó›ßdË–-\¸p;wîP[[«GV•ĐÚ=âăă™3g‹/&%%EźqĚf3źůĚgHKKăđáĂäççÓŃѡĎČfł™ćϟϖ-[>}:°°0–/_®{Lާ Ňΰ—/_ŢcIÚ—µÖ>QY˝z5łgĎćÚµk\ľ|™ââbZZZôŚáL&ţţţDDD’’ÂĽyó;w®ž+ ÔŘÎßűŢ÷¸yó&W®\ˇ¸¸ććfěv»ŢNŤř111Ěź?źőë×÷ŘGOFňZÚÂľ IO<ń_ýęWű” ‚€żż?’$ Éűh´ŕ9ăZ­VôśEy‚‰ŠŠ"22RĎnĐßÁânÖöş 455é\ZŔňđđpBCCu%‘gDL­«ŐJUUŐŐŐttt`0 >>^ß+j3”fX“eYďÍčĺŮżîł®ö˝‡µŃ˝^‡¦¦&ęëëiiiŃďg±X "44”°°0=˝öě­ŤN§“––ęëëinnÖ÷»áááIpp°×‰úµźżżŹä˝A~ůË_rŕŔ‡Z÷'ĺ ěąTöóó#11‘¤¤$Ý ­‰Í=ý,îűfA "88ÔÔÔűľë~Ď3Q÷r, ©©©L›6íľČŚîut_A¸—©}ßý·îY"<ëô ¶ş×Ëh4ClllŻĎ׽6 "##‰ŠŠŇďĄÍľV«UßÇŹ§¤đc‰IIŕŢ íŃ´ćn‚Á <Ďb‡rű°2z«Łç,ĺąoďO˝‡ZŻţ–Ű[Yî/'÷•Éd'®'0 |Î “ “Ňk˘Cś.™ă׋Č)©CeeF>O0¨Ć#W řň˙ýßýéî5´#Š>O<ř<Á -v~óÚa*O]ä≫ě»pß¶qâÁGŕ EQ0"—oséÄ5pIX+Ş8x*›†6+>ţN<ř< NIćŔá«t44(€ÝNvN ×ó«E…'|ž@¨knçü…Pdő‚,ÓÖŘĘ٬2$Ů· žhđxA@ ­ÓAK»Ü̢@ms'Ň0F«ôa|ŔGŕ í(<؟ؔ0 Ëţţ#™„Ůřđdm>x|žPQč´;9|µ[p(Ał –BČ‚9CÉ*Şĺrî= §čÂŔ^͵°ĂîäßŢ:Ç_ýç^Š/ÝBîěÄŽ"É(ďTň­˙úC— 9ž}đąRz=4"ľy,“_˙ć ­ůĹŕp¨¬.ĺ‘)<”ŕął¨ţĺgIŽ e^j Ň$ÁO$řf`/‡ @E}Ż˝u’ÖÜp:uâ"Ë Ë8ëiĎ-@%Ęj[yë“,\>ňNřěĺ›y÷Č»ž ’„în%=>ކFśM-˘ŔĄ;•Ô·tú<ł&|öz”TÔckiĄOF HR{»ĐŻÍJc«Áç›ĺőđx`ŕ4ó#Ć!dÄzŘŃ»{˘`ü·E!91 żĐ`lťÖŢgaEcpŠ˘âOd°˙ Śi‹˝°Î#ŐŽ~X‹Wô0ŁÇpd¦k¸‡­˘FčúŻŰuEéŠHAßť-Kç$1kÉn~Ô ®ÜűI-sT$ưPdYaMĆTbÂ0?¨NrW™ŁE#­Oä|ĽŁżíĐ"Žôgü=”ŔZp´‡%sÖâőŽ$çQożŐ˛ŤlU‚€Íµ“Ú¦šŰm8% ?“‘đ`b‰öÇlę 'ßOśiS,|ýK[ů~I5­yEę1’QÄAĐĚ4ŃŔ´¸0ľ´m1ţ˝¦.QuĂ 6'ő-ťÔ5wĐÚaG’eü-&"C $,ČŁAD‘•Đ#ú¬şű¤ż}:”10ÖíˇßY&ú-Apą\Řl¶Ć ¶X,ȲÜgň-oÉdÂ`0`·ŰG¤óÔ—ťS’(Ľ×Ä™Ěr.ćT_QOCs;6›YVÍř[ŽffR«ć&±fn"ɱˇDˇ‡0Aŕéőł(ýú.^}ç,­UČťVŁSx–Řhł‰„¨`ţňskLgg§ŰďUâvXd—Ôq&łś«y÷(­j¤©µ»Ă‰"+Ťý‰Ź a^j,ëćOeů¬bÂ@›™G˘(걤=CăzúŰŤsýAżh®|{~Ç[ ‘V  6śE—¤p+żŠwNĺpâZ!÷j±µµ Ű­Č.Š,„N4Pb2sÝŔ‡'BINŚeëňé|zýlfMŤB ›4~&ńĚ*ęfŢ9ułdE@AD üCřßĎ­bëŇd$YŇŁsD‘N›3™eüńdłJ¨ŻkŔŮц䰢¸\(Jwť‘"“…KWyűH8łÓ¦°gÍ,v­śABT0ňí«6˝ýi‡{dчa@F¬ľ˘zţÝ[ú f>Ô2A@ŠŞšřÝŃL><ťEey%ŽÖF$»UÝ·zţ®ëż˛ÝŠ«˝Gs-Y5•ä”đŃ…\>÷čB>·9¨ĐdE]Ćú™Ť›$Ń‚ÓäŠ(‚Q€Č`ł:8dEßŰŢ.ŞáW®säb ŐŐ¸Ú[ťvz‹żŁ8`ëÄŐÖ„˝±† UÜĘ)â3wřҶ…ěZ9ť`‹Näáx~ĂÝ'c´c íóąRŽ ´V‡“ýňůĺľ+dç`kŞS‰«ujĹKRgťÖvî4×ó/ĺU\Č.ç{źYÍâéq€ ÎN,ÖZ FzŤ.#–Ů’ş,E›CâÝÓwřů{ČĎ/ÄŃŇ€âtŰţ<¬NŠ‚ârâlk˘ĄŁ•‹ŤuäVpâú\ľůÄr¤ĹýźI||hÖ`)©nćg^áýă7hĽWŽ«Łu@ÄŐˇ}WQ¬´Vóń±Š+ëů?_ŘČă+§#ꯀ (hóxW¨xTĂYC«•źĽ‰ßíż@ce’µăţűô·>˛„«­™k;ď75r»ŕßřÔJ>˝~~&źĎőÂGŕa†&í“…ă×KřoťăęŤlŤ5(.§úĄˇ fí·˛ŚłąžśV~ĐÚNsŰľđčĽî˘=Ź’P÷»ŐMüíkźđţÇ訽‡Ň5+Gť— {C5ą7Űů»ÚFnÖđť'W§_ůfăᇏŔĂmÉÜfu𻣷ůĺűç)/,ŔŐޢ’¨ŻÁű ŁĎÜ#ŮÖAE^.˙řŠú ›#µÍüîČMŢ9p[CmwŘť7Ş˙u몓dm§ˇ4ź×?h%ݬŽďnk3’dśńˇđxŕądţŃ;ůŕŘZŞĘ‘í6őK˝ĚČ2]ëZDŁŃ źĂ:]˛KIÖŤď/G›ůśvŞ‹ňů×WEbăă0ôĽN’e~ţÁenÝĚÂÖPÓ÷ EQÔ:i†5ŃhÄhTť$IĆé’Tá„BwÝ„žőS\.¬u÷8w¶“?­mâŰOŻáł›3°ř–ÔĂ ‡mɬ§n•ňŻožáňŐ,lM5ę }fTb"aA¤MŤcnz"ÓSâIŤ ,8“É€Ë%ÓŇŢIeu#wŠ*ą}·Ś‚’*ÚŰ­ (Ý*# ‚.'y´Ů$ĚA=ę(§ÄŤ[9Xë«{'Ż˘ču‹ŤcNz"ógN%mj±Q!úű`µ;¨ojŁ´˛ŽÜ˘JîTRZUŹ­Ó¸‘ą«Í®¶&О2ůű¦î”ŐógO® )&Ä·¤&ř>îg»ąĺ üôýKě?qM]2;lÝ_tI-&f¦Ná±u رaÓ“ôGAAîÚŻş\r«Yő>ˇlX6‡µKfńŐOoć÷{ĎđúŢ3ÔÖ5÷\ľĽ!,ž7Ť?ůěV¶­_@dh°^7YQĄľ÷ŔFřč0b#ز:šú.ÜČc߉kśąr‡ęş&Q@‘Ô%őéS”Ý«çĹ'VńÜ#„ůůfă!ŔGŕŔ}ŻŰau°˙b>˙ýţE˛łr±7×,A)#ÂY˝x&źÚşśőKgŽ(H˛ŚË#ąsßvŞ®ý$čż™žĎß}űÓl_żţňC>ąĄ: tđË2ÁAĽđéÍĽôą­$ÄF ÷R·‡?u• ±Qˇ<ůŘ vn\L^IťľÁţ×ÉĘ/ĂaUgeW[3EY™üS}#Wr+ůÖ§–ł(=NĎݤŕS:>÷îËeI–ą–WÍo\çă3·hĽWŽlíYĆ`62}Z<Ű7,b÷ć%dĚH"Ŕߢ»eş†”ZO‚ÝUĆęE3yĺ‡ÂżżĽźWţx»ĂŐ˙‘/ÉLMć˙űłgřÔŁË0 :q‡R7ŤĚFŁŚIdĚHâËOnâÜő\Ţ?r™ÓWîP×Đ‚l뤥˘¶p;Ż‚/l_Ę3›ć0%2¸Kâč#rá#p?`48%™ÜňŢ9™Í'oSZXŚłĄd‰°°`V,ÎŹ.cÓŠą$Ć#˛¬čł Ź  V†K’ áď˙ě˘#Bř÷ßěĄÓjđod™™i‰üç˙ýë—ÍV—ĘĂhÖ_4’‚ @dxO<şśmëq§°‚'opčäur +q6Öp÷f+˙RYĹáËy<÷čB¶.ťFLX 0r≄IMŕîlďšąz]Ŕ (´uÚą]TË y˝KQa ŽćzĚFډl]»€ť1oćTş÷sňfŰţ@}AČXLFţěKŰřá/>čóÜV@ť˝Ó’ăůŻżů kĎDrËx?üőÓž±:+›ŚÎNaᬾúéÍśż~—ý'®qöZ.÷ŞË9S_Ç­ěŢś›ÎăkçđČâTRăBŐ`ônϱ[K«řŇĄ2É ,v§‹Ú†6$›ť  ââ˘hípp§¤–‹9ĺ»ZŔµ¬"ę««1şlLŤ eő†5l[żĺ ¦Ú˝·ćٶ?ő—“ÁŔ·>żŤÚ†V~w<§×ďĘŠBLd(˙ňżžu#ďčŐÔ3dA‰ Q÷Ę›STVĂ'—r8rö7ď”röä9.^Íâ7)‰¬]ÎćĹÓX4#žÔ)&\.‰ŠŠZŃ€ŃĎL\dđ¤7|MrC{»•ďţÍ«”Ô´;%ŠéłS)ş×@^q%ÍŤMř‹)±!|j×Ö-ťÍ’ŚiÄÇ„c2†eo;ô6¨$¶Müݧ IâZI·#&őÄIä[źßĆcëŽčĚű°şjőqą$ŚłŇť–Č—>µž‚Ň.ÜĚăěµ\2óďń·żsČźř¸hć¤'dą}3źÎćVžŰł‚ďýÉîq%Ř Lj@g‡ŤČ@ ŇT5 Íś?s™s¦˛týtf¦Ć3kÚ’˘ Ä`ő%ňh϶lE×r::"„ąÓ§rµ¸Éă*Á—ÍOÇ ¸¤±÷„ęÖ+(ŠŚźĹĚüYSY0;™/?µ‘Ú†V K«ąSTI~Y-ĄUŐÜ*¬"<"Ů3ă:lĂşw÷VLj+ŠBhH Ş®`ň3óýď~šĎ>ł »Í®fçTÜĎkÇi=! ~c—˙HĎÖl2`2ă¶îĐMfŁÁ@BlIq‘l\9pąľ˙ĂÉ“7¸ŔöełEŃ7ŹuƲ,cł;±;\ÄÄEŕ‡Řu\äI‚ń6đ=ˇ(đĄGçc^>t—¤îsŁůţg×0'%zÜçvŹe%u0 ÍFÂĂ‚PÉ,átJ=~~f,f#§ÎÜĆnwŽuŐĆ“–ŔŠ˘ ęŔ¸s§L}ăK2÷*ëqąĽ3pšfĐňLä­şc+Łfun˘@Cc+…÷HJŠćîÝ ĘĘkéě´ëŰ…ÉŠII`EQÔAŃĐĘß=EXXßzi?řţgÉĚ.áÄÉ›˘÷ ô‰Ačě´ó?ż?LňÔ~ôď_gË–Ĺ”—×qŕŁK^űR.LJkţţ‡ç8{.‹ŽQ!$&DárIĽö»ĂT×4y} qo‡ú˘9~â§ÎdNdDţţj«›řÝëÇČËŻÔ/ŰIiĨ«k!+§„ÔÔx‚ýpą$˘ŁByb÷jB‚9!‡§>µIšĽËł±†:űÚ¸|ő._úÂVAí‹°Đ@,L#*"„Ógł53i¬«:f”SŚ 4·tpôŘu˛sJ ň'>>‚0’“cřĹŻ÷q7ŻÜű«±† €Őjç“S·x˙Ă3l\?‹ĹDJJ,Ł#‡Żpăfׇ“ŽŔÚŃPVv ~„‡ăçg&=m ’$ń™OodÇöäÜ)ĄĄµŁß9j|^hË缂JśNţgO3sFŠ˘°|éL¬V©iS¨¨¬§ŞşqŇöÓ¤"°z¦(’{·ś˙řń{ÍF¦L‰dçöĺ Ë ˇ!ěÜľ‚S§3ůźß&·‘d¬ Š"ŐŐMüËż˝Ťźź™Ťëč"‘Śą)¬\>“ŘŘpîÜ)ăż~ľ‡Ă9)űiRX$Ić““·X»z.ÍÍíTTÖ÷đč‘eUŚ˙Čć…ÔÔ4QRZ3)ĆXCŕÔ™ŰĚ™=•ąs’1›Ťh $A°;\äĺ•“6-ŁŃŔíĚâIiĚšThmíäĚą,ŞŞ™9#‘—ľľ “©;Ł˘,ËĚž5•ÄÄh˛sJąťYÔk”GF‡‹Óg3©ŞnbÍę ütŻ+EV–Ďźýé“8]Ąe5\Ľś;)—Ń“†ŔÚŮok['……÷P…öGŽ^cZj|ŹääááÁ¬_›A^~Ő5MúuFÚsv8śTTÔÓÚÖÉ#›öxţfł‘ččPţđöI¦DRXTEiYŤ.WśL4Ö–ĎďxłĹÄ˙ţ‹g `ţĽi¤§MŃ  ÎÂ[6/ć3Ďldßţ —ÔřçG Z€…ŹŹ\Ąş¦‰ď}ç)âbĂ{<{EMćc6ٸa/ýÉăś;źÍő›z\íÉ‚IA`͢yýfű\ ,,ÖÖĘ+ęX»f.‹ńľN7D’“˘)+«ĺő?ÇétMş·űX@ ďńĆ[ź`0$%Ĺôxą‚Úź‰ ŃĚš™ÄĺËąDF„ĐŢnă~w”Ö¶ÎIŐO“‘Cť}%NťÎäé'×ŃŮiçĚąlŚ6ÝŻç[^azzĎ}î¬V;…EUĚž•tß`ňařqęt&›6, µµ“°ĐŔ^gTY–‘%™ňŠzjk›ů̧7 póf!ÖĎź4gĂ“bUË{ýF>Żżyśy©H’ÄSO®%,,¨×ďK’Ě‚iÔŐµđ‡?ž¤¶®yRIFŠ˘}§”߼ňóçĄěßë3E‘Ůł§˛cŰ2dYÁĎĎÄo_;LEeý¤ę§ O`ÍxUUÝH}C+_xn «WÎćâĺ\öîżŔŚé }ÎŞţ^ú“]¤ĄĆ“•Uâ >>‚Pź-46¶QZZĂî]+yěŃ%˝öŤ˘€Éd$6&ś˙ô}Ú;¬|ĺům,]2ś;e“j»3á ¬©Y~ôă÷¨®nbŰÖĄLF‚ýŘ˝kÉScű|[˲LzÚ–.ťÁ/~}€ ďL:#ÉhA32ţć·qóV;¶/ÇĎĎÜGf{P™-Ź,bŢĽiřű[‹ gË#‹ůĂŰź°˙ŕE=PüDÇ„'°(Š\ą–‡źż…ó§čÇŮsYܸUČôô)%¤ Äņłvő\Î]ȡÓjź4o÷Ń„( ÜÍ« ©ąť•+fŇÇŇY˘@XhááAěÝwžšš&˘"CX·&¬ěRęë[™ Ç÷šŔJW–úłç˛hhheů˛™„půę]–.žˇGtx!EaÍŞąXüĚ\şśKuUŁŹŔĂ mkrĺj•• dĚM!5%îˇC—K"0Ŕʏ¸®ÝČgůŇDG‡qóV!y† =Ľ N`5­¦‹˘âjň *Ůşe16»šš&¦ĄĆńĐ2dY!cn2q±áÜÎ,˘±©Ý·ŚfhF§Ň˛Z2łŠŮ°~>AAţ}Ć&“‘ôô)DG†PTTEbb4ó2R¸~ł€ÚÚ–IaĚš°ÖŚW—/ß%3«„?˙ł'™=k*&Ł‘âŇ®\ÍcĆôDdY~h9FŁoĽ¸‹Ůł¦ňö;§|Ëča„6űŢÍ«ŕÄÉ›|ő+ŰY»z.˛¬ííÖ =0F ˘(ťSŠżż…Ď=»‰¤Äč%ý6›ŤH’Ě[¤¤Q3;™Ż}uEEUT×4 :}˛7`BX{{ßÍ«ŕŐד0%’)S"éě´SV^Çó_|TýŢĘظa>‡Ź\ĺř‰ttÚ&ôŔ h.®•uĽţćq$YfÖĚy»I’LJr,Ű[JVN °rĹ,ngsđă+46¶Mčí„#°¶§ęě´‘“SĘşµóxöÓÔĄšÝÁť;e”–Ő25)f@焲¬6m ňâ.ś.‰‚‚{ľeô!jö¬ěR2ć¦đµŻlÇlXěj??3±±á\żQ@yyŠ˘Ę7^ÜEhHŮ9ĄÚ5ᬩYŢúă)Žž¸ÁŽíË WGűYĚŘěśNłf>Ü€ĺĄ+KŔ†uó ä‡˙ţUUŤľČ•„fd!_¶"°¶Śt˙xţ˝ŻďŤÖ ň^=×n°xŃt˘ŁĂPčě´ŃÔÔη_ÚC` _Żőěo›7¬›OMMEĹUX­ö1oóĂÚĐUÁqUOA€ęš&nŢ*dęÔҦĹ#Iň€űDű÷ĽŚTž}fwó*ôt«Ë–ÎŔ%IäTŞFG„qŐ/ęGôK¬f‡3?°`A0ŤCZ¦ uŹ"ŞęčŔˇË|ö™M|jĎZDQÝ;·2‹hmíä'˙ńFŁ Q4ÜW†Á`@L&Sź÷IHćŻ~đ/ľôcŽž¸Áç>łiÜ8΋]ýĐăą&łůmmttŘxďs¬_7źŻ~y‹ĄĎţל4L&Ăý}f2™Ś á7/äĄoěéę[™‹…żüţçř—˙•}ű/ň§ßúfăŕ$đñüvo‡ń!ő0 ýâĂC[ŁífqŐ(Šâí5$IćŤ?ś /Żś'?µ‹ĄűĄăďďGpP©)ńĚť“‚(Š˝ ´ú?ě''Çáďgćµ˙9Šes9#q\IAŔhđ 0j{Ö¦ŃÄľąx1‡§źÚ@HHŕCźť  †>Ť†»v¬äí?ž$"<¤Ç÷âb#ŚáíwO±jŐ\Ö®ÎÓ~ę/—úˡ‡ö¨jęwałŮxS$IÂn7CQ(,Ş˘ľˇ™/~áQ¦&Ea·Ű$YÝg•pçN)ßůÓOˇ(V«Ł×r´·ŁŐj}ŕý xtËb,|ôńE’§îŃ: ˘ÝaďqMVdlV+&¤ť}Ź›ÚąťYČ _ŢF||„ŢO}AEüüü°Ůl}žDG‡Í‘cWضu1‹şÚe…Ő+gc48|ä ć§`Ł“­v»I’úä‰ĆąţđhŔ-éĎz}löT55MĽóŢ*+ëY˛hş>(dYáȱkřů™°ŮťýŢ{<č{A~,\Ćď^?ĆÍŰEú˝Ćzo©ĆNöčEÝ+ă ~‚ ĐÔÔÎÁŹ.séĘ]Ö®É@–űż‡ěëoN‡ P¨Şj$+»DźĺŚF‘5«çňÇwOsńň] ´ń°ĘŢWĂ€×Tžo…Ţn:VKč¬ěRâbĂůĆ×wueZu§ŽĆĆ6öě^CLtXźuH[dYá‘M ąty%WŻçÓĐĐÚe0§Q;„·g4 ( ˘ s§3/~u S"(\čoźŚ"óçMEˇ°¨ŠĺËfvłÔ3ágźŮČŰĽ˘ŽY3§>p©¶÷§…×#)ŠępőZ?˙ĺ>–-™ÁśŮÉ=$Š"wó*xç˝ÓLOO–=˘(řů™yb÷jňň+řŮ/öMŞP.…ÚO"…ĹŐüÇŹß#)1šU+fwÍľC/ßßĎLTdżřŐŽîŁ=EQÓéěÜľśöv+˙öďĐÚ•ój"Ŕë ¬şH:9qň+—Ď"!!JWuBBصciÓ.ďď}Y!8Řź•ËgÓÖnĺvÖäLďŃhîŚÇN\'cn ÓRă1Ĺ®ż ˝|EQر}9)LFý~Ú,¬my‚8w!{ĚöÁĂ Żo…¶÷˝rő.!!¬Y=·ëşşďE‹—ďrţ|6IIцŃYV¦D±haMMm\¸3ˇýn‡Š¶6+çÎç`0¬[›1¬VqEĐĚS·ŘíÍČŞspŘťś:ť‰47Úń Ż&°¶|nnn'3«3 ćĄę–JAPĂ®\»žÇúuó‘\Ň Üőt3kVĎĺĆŤB*«*DźŚĐfB«ÍN~A%ííVÖ¬š3 _ôţŔnwJRW^+-¤Ž¶|߸a>wrË(+ŻĂápŤőcx5AŔápňţŢs¤M‹çŰ/íąOÍbł9)+Ż#<"ÄÄčażż,+¬X6‹o|}/ĺr'· Ń7 ÷€¶*ůřđUŚ‘ďďBC†ýůů™HKŤGJJkzÜ_–e¦§Má/ľű4ĹĹU\ľ’;!˘ux-µ·ęÉÓ·9xč2ńń„‡Ýg6™Ť46¶qĺjsfMöłZÍ-pćĚ$jjšřŐËiď´ůfá.h«¤Ě¬b^ó8~ÄÇE XuÔX,&¦OOŕĐG—1›Ť]‘=Ôż ‚€¬(LKŤŁÓfçĺW?V#WząÍÂk ,V«ťK—ďňĺ/meŃ‚t ˝D!´ŮT‡Ť'źXĂ”)‘ĂľlÓf—ř¸p>űě&"ÂC¸yłpÂI† m•ręômžzr-k×dčNĂ YVذ~>K—Π©©Yéi S5óä®+X¸ Ť —îx˝Ôkk/Ş@áÄÉ›8x‰ ëçő°>«,‘ă'npî|6ţ~–®ß ˙Wű›Ś~˙Ć1 ‹Ş&Ŕňl¸ŕtş¸p9—ßżq\ Ńk1ŹŘł1 t´Űxçý3TŢ«ďŃߊq±áLMŠáĺß~ĝܲ®ëŢŰO^I`mů\RZCG‡Ť/}áQfw-ŹÝaAÍ1[V^Ç‹_ÝŃhÚMRŁŃŔźŰBĆÜîÜť\é=ô\DQ ¦¶™ęęFžúÔZÖ¬ž3"Ëg .§Ä¬™IlŰş”ĽüŠKdŤ¨źyz«WÍĄ đÖ®ŁŢJbŻ$°( Ô7´ňo˙ń{tI×±QĎNpą$rî”rĺj©©q#VÍH’”ÍÖG—đŢ{g8zěú„0’ őąX­~ü_ĐĐĐĘ»Wc4öOe3XůȉOnPUŐx_}E!""'vŻć؉üáŹ'őży#Ľ’Ŕ‚ púĚm˘˘B™ž–€ŮlDéE o2©× ‘ó§ŤhĘImpDE…°zŐ.^Éí‘{çŔ˘ČŐëyȲĚÜ9)XFÔŐT[ mX?źĘ{ úݢVë§đ°@/JçîÝ **ęĽ¶źĽ’Ŕ‡‹Óg˛0DÖ®Í ŔďľďÔ7´P]ÝČŁŹ,ę3ĎěpB–/H'!!šĽĽ ň»ßMV(ŠÂŮsŮŘíNV®ETdčę¦5ŮÂůiĚ™=•¬ěś®ű}žeYfĆŚDćÎN¦ŞŞ· ˝ÖíUŁKWž8]ŢŁ đ›7.čő»‚ päčuJJŞ‘$(b0DˇëÓőo·ŹŃ`čú]ţ}Q»ć ¨_jjIIŃ\Ľś;)2<˛,S^^ÇŤlŮĽ“©ďĺł ¨ÁDA}ÖÚs7DŚF­oچžý&jźîß‚zţ˙É©[äTŢGNE¨ČP/JçüĹ;]±Ł˝łźĆŹÂ»ЄΧĎfQßĐÂüŰ×INŠQʆşf:YVpI2mťvjZyńĄ=ŘČ.®ˇÓjÇîtápşp8%\’„$)nnu &“ łÉ„$ą0DĚ&#f“?ł?‹ ?ł ?ł‹ŮŮdŔd4t š®A˘(|ů‹Źríz>î?ĎšŐs ôëZâŹőh‚ë7 ąťUĚ÷ţüićĎKE–dݨő“Ă%aw¸°;\XNlvv‡łG?I˛˘j´mvdYT’»^Â&َ»ź,F$—ĚěůiÄĹ„‘“WIZz""`0t÷“˘(ěŢą’ë7 8|ä*{v­"66Ěë<鼎ŔĄĄ5üň×HLڦ˛®…˛ę&J«©¬mä^m35ő-Ô5¶RTR…¬(8śN~úŢ śN'.—„$ÉȲŚě®ĂÔ^ľ]39AEŚFŁQ füýň',$¨đ`b#CI '1.‚”řăÂIžĂ›8Áű{ĎńĹç¶0°0ňŢ Qhljăżu€ć¦6RS§PUßFiUĄUŤTÔ4qݶ‰š†›Űhií¤˝ÓŠŐćŔîPĂţö§ź}ĆEAťˇMFL&#.§„Ĺd"(ĐŹ7OŢ 2,¸¨P¦Ä„“NJ|$SăĂIK›Â›8Ákż?Â÷ľű´×myĽŚŔpţb;v­d߉ë|÷_ß ´ş{µMttX‘śN宓ô>ĺ ćíŞč˙ÓőoĄűş"DĚf3a!$'Dăę°ó©Ďm¦¬ĽŽúú˘˘BĆMܬ‘†(Š\ąšÇÜy©4I.ţćż? ¶ĄŤ{5Ť´{ö]ĎŹ˝É`gÁ^ňÝÜB­b Š,f‚Ő~2+°óéu W3#=Ů‹:Ę«,Ë Uµ-ěż’Ăőě|d‡Cíhí¨Yť…á]Ż ú˙Ü­łe‡ÍF­ŐJmU-…Őu,JťĘsíV˘˘B™LłpM] oťĽÉÝâR\6G÷ u$ű z/OÄíĄ+ă´Ů¨łZ©«®2‹ËY2-…M HŢÓO^E`QXąn>żąXD@l".k'’ĂŽěr˘ČR×§ëÍ>šoQAD»>#“ ĹÉHôŚt¦ÄGzĄd°P…ůKfŇńQ&~Ń.[Gw?IcÝO‚hPűÉhÂ`ńCö Ä?1±+R‡wÉ ˝ŠŔŠ˘’M\l6ŚŠ,ëä•].d—łëăB–\(’„ÜőwdŮm/ĄĹŹ‚ž3Ł k‰eÍň$]{b˘Á€ÁhÄd2!Ť(‚h4©Q]dvI2Ó¦Ć`±'ÍňY맸¨Pbc"h—D!Ú­źdŹ>R˙;<ý$ ŞÝBë'ŁÉ„ÁhBîŃO†®~2čý4;=ŕ żÁ5x áe†Ř°@Öd$RTŐ„ht˛€ ą·ßt;G+îŃÝč;˘@BTËç$áo1áo1ŕg&ĐßLp€…@?‚,üöĐuÎÜ.ÁĐˢ˘(„ZŘĽ(EWÂxŹmshP `íĽ©T6˘ôč'0-˝>/ýǸ¬ÜO±A¬š;?ţfţf‚ü-ů«ýäÇGoqôjAźý`fó˘DQ@’˝«źĽŚŔ FČç·ĚçlV9%ŐÍUýnÎŃýí—$łqÉtţóŰ;ŐŔđ˝|§¶©ť}ó4Ý–¬žő”…=«g˛lćőhb¬Ţ(BQŚ˘Čs[28“YFá˝ĆőĐŻçĺ’dVĎźĆ/˙bQěuűŰÜfĺÇďśăAý´kĺ VÎNôĘ~ň*›ą6“ÍšÉ÷>˝Š°@ż‹Ĺ<%*D=ßíăď]ʧ ˛ˇGŘč˛ÂšąIĽ´g)fÓČúţŽGhý4#!‚ď=łŠ`˙ě§`ڱO[رë…Ü)­ëµź$YaĺěDľý©eXĚŢŮO^E`ĐbéÂŽéüďgWhÖřFÚ,źÖçwęš;xóŘ­ű2Ţioôłřűç72%2Řë† ęŢ[:Ť˙óŮ5„ű {?DÔ¸đ>żÓÜnăő#7±9\÷÷“¬°lćţţůŤ$F…xm?yŐşťŃAŕŮMs ň7óooť§Ľ®µ§GÔŕgbZ|ďCQţpü67 Şz¸čÉ]1Ź·-Măź[CJlŇĘćĆ;4u <˝~6~fţő­s”Ö´ [?ů™M¤%Dôú7EQx÷T—îTôŘűj¶G—Nă/?·–ińá^ÝO^G`čIâÝ«gÂüńďT"ËĘÓeE!.<©±a˝ţýbN9żŮEżŹ¶‹öç ŹÎă+ŰäďŐb¸ŕŢO;W¦“̏޹ȹěr]»=Řg¤(@J3đÍ‚*ţűK¸\’žĄA’ÂüxnË<ľşcÁŢßO^I`ŔÍů\`Éôx~úímüáDoĎâ^}[—ßôŔ˘Ŕś”˘Bîű[~EűŰăT5¶! ’$c2X=7ŻďZĚęŚ$ ‚ŕőb8áŢO‹ŇăřÉ·ă­O˛yăX&ő­ú Đ{+ 3’˘ şďoĄŐÍüíoŹSVŰÜÝOF+gOáëŹ/fmĆT †‰ŃO^K`čîtI–‰ öç›{–±yQ*8‘Ĺá+…Ô6w@×Ҷ?Ąí«ÖĚKĆäÁ#»¤–˙ó«Ă\ËS„Ť"i1|fÓ¶-K',X5¨Éă5µĘ½źÂüřĆăKŘ´0Eď§ę¦ö÷“(¬ž;‹ąçÎŻ¨çż>Ęą,5\ŽÁ(2Z4ĎlśĂŽĺ鄇¨5oÝóz« ¬A?gć&Gów_ÜŔł›ćrđb'nS\ݬ2Psĺ ô•I=˙]7?Yżćpşřřr>?|ýwËë‰ `Ńôxv­śÎşůS‰ @‘$IPZČÉ÷~š=5Šżůâz>łi.‡.ĺsüz ĹUMXűŮOŃal\”Ş_sş$Ž_/âź’¬â˘BX”ÇΕÓY??™č°‰ŮO‚ŔĐó-/Š)1ĚMŽćůÇćsŁ † 9ĺÜ,¨ˇ¬¶…ÖN;.—|źg˛˘(ěZ=“ÔřÚ­˛KjxďT6—˛Ë§7ĚfŐśD¦'F`1!OŔ1ŇčŃO]/Ü9ÉQ|iënTs>§‚›Ő”Ő´ĐŇK? ¨ËçmËg03)šN›“;eµ|p:‡s™ĄÄE˛gő:VÎI`Fb$~&}Ćuż˙DÁ„!°÷"1ál_žĆÖĄÓhí°S^×Já˝&JŞ›ą×ĐF}K'íV—DÚ”ľ¶k) -ä”TS]ßĆĆyI|ĺ±yÄ„â׺GVT-ëx#®¶×E±Ë!BAŃewĐ›;ĂŘŔłź˘CxlY[–LٵÓNEW?W7SŐĐNc»ŤÖvv§‹©1a|cĎ2[ÚÉ«¨ç^}+«fÇóÜć9Ä„«ý„G?MTô‹ŔÚ@ő¦îná6¸şIH …yA1ĚźH’ŚK’qJ2˛¬`1 đAdIz,†ń]zTÜśĆă §KćüĹ:[ĚfĘňË8w)—Ç6ÎWEă¨î‚Ű‹E#[H€…Ś”ćĄĆtĺ4“ŮB[{'— ?“łÉ€K’YÍ’ôŘý$Źó~ę šĹ~ |ë—#GUU şŘŮ› =;Qî:NĐŚ&Ł‹‰ 3&ٍ˛„.k˛4Lé/Gz„âZŢ<›ŻÖÝá :ĐÂćĺ3ůůÇ·©ij×!~zë'u‹‚ÚO~F‚ýÍŚdYÁĐ%ä׾;N›Ő/häE‘ęęjîݻׯ—ĎC ,Š"WŻ^ĺ˙ńůä“O°Ůl ý¦ ŢÜA°;\üîČml.Ě!Áq™-¬[=—F«‹÷NßŃżëMPEIŠţ_olCßmSŰc0ččč࣏>âţá¸yófż˘}šŽŽ Ă`ŰTgHMM=…z4ô;¦»©»¶¶–K—.QVVFDD‘‘‘=,ÖŢôŔÇ;»‰«>˙¶NŻ|t‹óőP«÷˙Fá© s‘d…Ó·J(Żk%1*ô)áŚF´¨ă­­Ľ•Ŕî–eY–ą}ű6ŻĽň ~ř!µµµúßVŕ ŕ{†ÔÔÔ{ŔaŕLú=—k•pą\”””pőęUZZZŹŹ'88¸GCĽă•Ŕš†ŘEŢě‚ ~ůć~ôę!ŽŢ¬D2ű¬«S’ŮĽ8ŤŚÔXö_¸KK»ťł—ł9sţµŤ-$ĹE8nWNŢH`-¦ ”••ńöŰoóĆoPPPĐăo„ 8|ř/ Ěšš Ŕ HbR˛Fd«ŐĘť;w¸uë‚ Źżż˙¸žoÖßâ]çë[;Ů{î.ß˙÷7ŘűŃ9Ę*k±6·˘XíŞ‚T¦»są$ŇăĂ™Ęá“7(Ë-¤±ş’‚ÂrŽ]ČâNe3±qŃÄşy›Ť§ľň&kő3 477sčĐ!^yĺnܸÓé,q˛€żëúd˘r¶Ű«nóćÍî_Nľ|2F¨ĆěŮł‡… b6›‘»"ŽÇNPłŮ¬¦ń°ZÇ´žÝÄPP¨¬oăđ•B>ú(Ź>ú(111ăn6/h·:xő㛼s*‡Šş6úŻ—í ‚ đ˙^ÚÎçU3:ţöĐ5ţú•c=Rpjń˘LFł§FńőÇłmYúĄßĎv'ď˝{÷řřăŹůä“Ohjj q%ŕđcŕ#Ŕ÷WCźd,..¦kěî˘îŹ+i@Ô@j¤--:::ČÎÎ&33ŁŃH||<‹e\íŹÇĂX~wô6˙ďŹié°«©7? t¸$§KbçĘ™Śf$EQ\ŐDNI­CčJď)+ UŤí\ľ{ŹĄ3¦2f‰aĆŰŘ}źŰÚÚĘŃŁGyůĺ—ą|ů˛îj<Č:Ţţ ř+ŕ:*÷ú$/LKKËPŽ…ę€_:A%nqqńŘŻĺ°‘cŔy HLyÚąXee%W®\ˇľľžŘŘXÂÂÂt’»ËŞFóăN౸?]†«¸P®\ËŁşˇŃdD0 Ϭcµ;‰ `ý5cDdhˇ~|rŁX]Jw-•IÂŐŢÁšÔ(ľ˛g9ÁAcÖ/jŠWcŹUŃXŐ ??ź×_ťwŢy‡ŠŠ `Đ+$°ř.đ[ ľżÄŐů4Aŕ¶?vˇîŹW¦L}}ýP¶5 ęjöÇŔ~TŐ—Ę}Öm°Ťň8vŠľ|ŐŁk`­é"«(ŠĚš5‹'žx‚ĺË—ăďďŹ<ŚÁŔ˝ đź<ĎŹ~˙ ކ&¤ŽNdÉ…`0`0›,f“ ÁhÂhŃ’vu»GJT5'”"+(˛„řţ3«IŹ ˇĽ˛ž’˛Z®d–p9§ ŚF AAħNá—˙ç)ÖÎOSňŽ5DQ¤˝˝ťsçαwď^ŠŠŠô±:Hżţ¨Ö.†Ľ0 Ç{Dž |ř,1в4kµźźK–,aĎž=Ěś9Á0)‰l04´tňĄ|—ĚĘf5Í­Ó…d·c–%ľüHňŞ>:źK}s»Çĺľ@0›M&#.Ńf3?Lţ~&˛$óµíóůż_Ú„Ňis˛A“ůeff˛wď^nßľ=TGŚ&ŕ-ŕç@¶vq°ÄŐ0lć<7"QŹ›ľ l,-K#rXX7ndűöí$$$Ś+kőHA‹¬!ŐŤĽ}đ<ż~ăÍ. ţ±±–îŚ˙ňâVľĽ}1.IćË?|—çs1č•.»± %ŇÖ2"b·ß´ŰłTd©˝ÎÚj¦'óâł[ŘýČR˘Â‚‘ĆŮ‘ßČ={5*KII ŕÜąs´··…¸ŕ(đźŔiTđ‰«aŕúĄ>ŕfč’QÝ1 şgNe€Ţ\ÚžÇfłq÷î]nܸ,ËÄÇÇ0!‰¬Ĺ:6 Ô6¶ňúľ3üĺü?:O[g'ÎÖµ ČťvQDFŔî’ٵj~f#w+¸SÁdT÷ČF#b×Gý·Á ĺ.VC¶*Š‚äpâęčÄQß@gi9ťµ÷pJVjë[8z.“K·ňńł™:% ‹yÂ>{Í€ŮĐĐŔţýűyőŐWąuë.—k(ä˝ü5đŹ@. Ä@ŐŚH/x,«€Ż_E%ó€ŕî–9kÖ,öěŮĂ’%K°X,ăÎd0ĐŹ(ŇÔÚÎÁ“7xĺť\Í*BvIŞzAkźK« A0,ó…ÇW°t^*9ŤĽüń EđpŠ˘ŕrşP$E’ŔĺDtą° `Ć$Ęd–ˇ°{Çd‹ź…M+ćňⳏ°~Ůü-ć 1#»»?vvvráÂöďßOaaáP÷ąŔËŔ+]˙ľY×#úô=Ľř6điÔă§A[VűűűłbĹ vďŢMzzşľäń¶ÁäNܶN+ÇÎgňňŰÇ9w=§Ăˇ±Żö¨ˇ6»> `DdIŰ« =ěWA~l[·¨BCŽ!>>‚¤„h’’bč°ŰyňŰ˙Ź»ĺę}{»ź,Ŕöő ůÚg¶°l^&“\Î[ź˝vÚťťÍŢ˝{ąyó&v»}(3nđ.ŞRč&]j’‘ ®†QyęnD6›Q÷Ç›D\jŤČ‘‘‘lŢĽ™m۶ç5ł±;q­vg®ćň›?ă“ ŮX­¶÷áĄÓK´z˘ŁÂřäő˙ŹąÓű^ýřµ|ďź_UCç>čĹ!ËDD„đ©-ËůĘÓ›7s*˘ t…tőŽçŻÍ¬ĺĺĺвj1›Ža߉«ŘÎţŐŃm©^[ßĚé+wHNfNzŇčµĎîFŞŞŞ*Ţ}÷]~˙űßs÷î]dY,qeŕ,đ}ŕ?PŹJ•±"®†1#°Ůb.ęţřC”-fee‘™™‰Éd"..nLd‹ Šoî?Çżýj/’¶Ďm( ţ<»k-~–/pă")(­ćVvŃŔęÚµ?¶YíÜÎ/góŠąDG„đ ›Řđ7sÄd~ytËü®Ń™ßhaĚ ÷ÍĆťŔ%†A¶ŘĐĐŔőë×)**",,ڍ¨¨˛ĹŃ rsk'őă·(+ŻU—ĚcQůĚÎ5D„>8°ŠŃ` 1.Šýź\Ł˝˝sŕě ©©ťđ° Ö/›3*ms'î0ËüęQCŮü9pČüF ă‚Ŕz‘-G•-†2ŮbEEEŻ˛Ĺ‘&±( –Őđłß¬îyÇp/.Ë »YFrBôCżF]c+çŻĺjł˙7eĚfO<şŁqä†ű>†]ć·•¸/3™ßha\ćÖ–&›7o–P÷7č–-®`ç×Ú›YKuăĆ {ě1yä"""FôüX@Ý˙::cýHé´Ú)­¬e˙®Á ňⳏňÁŃËU ´ČmV\’ÄŢą‚;ykjj8räÇŽÓe~Ér€j¶¸‚‡j/CůŤĆŐ ě ·Ů؉zŢv5zA>˛4‚¶··“™™Ivv6~~~ÄĹĹa6ŹśŹŻĂéâ˝ĎŃÚŢ F±;2ű¨BYbţěT6®Čč×/ÂCp8]?[Őŕö§ÎÚ÷l.–e¤ńÔ®UCqGěăJŹ—ň‰'xůĺ—9ţ<ťťťCŮç–˙ü¸Ŕ0‹F ăšŔp߲ş5ŕ×1T+u:ŕß߲4ˤ˘(ÔŐŐqíÚ5JKK '22rDöÇA~de—u­üŚcłY!)!š'¶,ďWŰA`ZR'/gsŻŞľ-A§„ˇÓĹ·żö8K¤›ß}Ć•$‰›7oňŰßţ–ŇŘŘ8”}n3Ş6÷»Ŕű¨cl\.—{ø'°"סą.ŁęŽSŇ÷PVVĆŐ«Winn&66–aŰ+ŠÝ1!.‚cÇ®ÓZŰć1"±¬Čgv®ĹlęßÎ)(Đ?ł‰C§®#IňĂga» ę:ydĂBţ×wžÂĎ<<Ëgw÷Ç’’Ţ|óMŢzë­Aeósu ýđ şÄőŢB\ ^C` n$–Q٤[¶?˛4"Űívrssąqă’$ ›lQ}Ŕ”¸H˘ŁB9uâöć•FQUŤ"Ś&#Ďî\Ł{Kő©I1\Í*¤°č^ßł°$C»:Y8?ŤýŰ‹$'Ĺ ËC{ Ž Ěď&ŞĚď€;ôsŮŕu†űfc;p Ő¤uY:ň´AĐÚÚĘÍ›7ÉÍÍ% €ŘŘŘ!%äśŮS âŇĹ;Ř:ŔŃx}‰,+ On]IBl˙ĄXĚ&"Ă‚Ůwâ*OçWq›lĐfgăĆ…üôÇ/1wvňR—ş×jµrúôi^~ůeNť:EGGÇP[‡ę§PÇŽ×ÍşîđJkđ r+j§|‚$ŤDqß×ÔÔpőęU***ŚŚ$""bĐŮÝ—ă ¤‘–6…¬śŞšŔ.ÍĄć4R“Ť¨Ëĺ’ŮşnÁ€˝¤¦N‰˘ ¬š[9]Ü)©Äm±A› łŃČłĎnâßř5ҦM4y=łůeffňꫯ˛oß>ęęę†âţ؆Îć»]˙mď&®Ż&°"WŁŠ$n *ť¦2·L÷l‹­­­ÄĹĹ :ۢ;‰gĎšĘúuó±9ś”•ŐbkµŞ{G« şë’0üdV$™%óÓYłdÖ@~E{›•¶¦v޻Ы±ZĐî@@ ##•żúËĎńÝ?{ЍȤA¦ĚqĎŘW^^Î[o˝ĹoĽŃ#Ü ĘuˇľĐ˙ęŃPL âj{ąČ0Ă#@8đ đ- ç'Đ‚éMť:•ť;w˛nÝ:BBBu~Ü=ĂŘíN®]ĎçŤ?çăĂ—©©nVO!EQ]V›D0ÔŹÉ žĹu†vIĽřůmüęţ¤ĎŻX­v[)+Ż%;§„«×ň¸q3źü‚{45´Şn™!,ZΓO¬eÇöe$&D ZŘď>ë655qâÄ >ţřcŞŞŞ†˘ČAU ˝Ťęxç>÷ApÖŕAäTŕEŕy n ei{`ŁŃČÜąs‡śmŃ]ěp8ą“[Âá#—9~â&ŮwĘijęP÷—‚ Z¬Ĺ.Ł—ˇ‹ÜFQ%´ö7QčˇęµW@’Ř´zŻüđ%$—Dkk' ­T×4RV^KqI5ĹĹU”•×R]ÓD{KH.@$ 4ééSX·v[]Â’Eé„…éÄüËlŘłůŐ  ý (Ň.N4âj°ÖŕFdXŠšmqô݆á϶ŘÓPˇµµ‚ ®]»Ëĺ«ydß)Ł˘˘––N$‡«ŰQBű‚Ú*÷kU𬋚ô‹™ř¨pl6ťť6:­v6'¸\¨ĆXŚF‚‚ŹŹ`ÖŚ$–.™Áňe3™5+‰¨Č®#¸Áy°Ť`6żNT÷ÇŁ/z­ey đÖŕFd`ŞAc ŘkÉl‹ę§ÓEsK;••uÝ#?ż’¢*ĘĘ먭mˇąĄťŽ;v‡—KIŃĂÉŇW2}†Ś,BC‰Ž %!!ŠÔ”8¦§'ž6…©IŃDF†ŕç§*Ôö ŢŃe„˛ůɨţň?F=‰°ÂÄ'®†IC`¸oY<ĽĚLyÚ¬›ššĘăŹ?ÎęŐ« 2‘»:‚Ř”Ň%aµÚikď¤ąą¦¦6›ÚhjjŁĄµö6+ťV;v»§SB–%QÄd4b6 đ·äOHH áaA„GLXX!Ářű[0™ ]IĹŃ—ÇC…űJŁĄĄ…Ó§OsđŕÁ‚A"ř%ްľN»8YČ “ŚŔ<<řđy¨?†îŮŘl6ł`ÁöěŮCFFFŁqÄü«»ÉÝťN#šçA ěŢóű(jŘwµŽ#“Ňť¸v»ť7n°wď^rrrô<ż|6 ŔŔ٦ä&q5LJkp#˛XŤŞvÚšÔ|@ĐĚşuëŘąs'ÉÉÉÚ{3Ü—ĘŠ˘PPPŔţýűąxń"ťťťCY.ŰQŹŚŞRŐră“gT=nDvŁş–3Čl‹˛,§Ë###˝&ěíPá)ó;|ř0ÇŹŽl~Wé–ůé‚ÉŽ‰=šŹeuđ%Ôl‹©-Ë=Űbzz:»wďfĹŠz¶Ĺ‰Hdwâ¶··söěY8@iiéPł” FĹx 5Ôŕ#݆‰5ІDž‹ęň¨?†îŮŘb±čŮgÍš…Á`Wao‡÷ĺ˛ËĺâöíŰz6?÷$é@3đGTgŚLí˘Ź¸=áÝŁgáFd°őŘi {«A#rhh(7ndÇŽ$$$Ţ˝?ˇl~NÔPJ˙‰ęéÂú±‚wŽśQ„‘C€§Pó;-LYÚ¬›ŔöíŰٸq#aaa^·¬v_.×××sěŘ1Ž9BMMÍP ŞŞěżPă.ë‚ú†wŚ1†Ç˛: xˇë“8вÜ÷ÇłgĎf÷îÝ,Y˛??żqOdĎl~/^dßľ}Ñͯř-ją2í˘ŹĽÇř)ănD€…Ŕź˘ÎĘJ =ł-._ľśÝ»w3}úôq™mŃ3›_NN{÷îĺĆŤCÍć׎Ćć§ŔuF!›ßDĂř!^7"[P÷ĹßEÝ':ŰbDDDŹl‹ă…ÄžŮü:Ä©S§†šÍOBM§óźŔÜ„ő> >˝Čźľ‰ją0ů„Ź>úh8d~w€ź`ËüF >Dž†*[üă@¶8¸×fłé2?-ŻĐČ[K·ĚŻP»č#îĐŕ#đ0ÁC¶¸ Ő-s7jÖĹa¸e‹ý˝§§Ěoßľ}\ąre8d~PÝ/1Id~ه˛Ĺí¨űăŐŚ3٢ç}Üłů}ôŃGĂ%ó»şĎ=„[^!†>Ź<–ŐѨJ§oÓSŢHËEQ¤µµ•S§NqčĐ!ĘËË!Éü č–ůŐj}ä~ř<‚đ ňLT?ÇË{“ůíŰ·Źěěěáů˝‰*óËŐ.ú;rđxŕ![\ş?ŢÎ(Ë=e~………ěŰ·o¸d~‡Q—ËgGůs':|E¸9nŮâ2†([ܶm›7o~ lńaŮü†°źÖd~â“ůŤ:|ex,«ăQ#eľšßi@čŹlč!ó;wî ¤¤d¨îŹĄ¨2żWńÉüĆ >Ź<śA·l1l e=H¶ ·ĚŻxUtp[»č#îŘŔGŕ1†‡lq#ݲŧöÓƆ رcN§“pöěŮáůť [ćçqÇ>ʏ9”nŮâÂÁ”Ą-­ăăă‘$‰ÚÚÚˇş?ŢFťqßÁ'óWđxˇŮâWŻ0Ů"0ňŢŁ[ćWŞ]ô‘wüŔGŕqŮâ"TŮâ“ B¶8H´ Z—}2żq Ç1†S¶ŘOřd~^Ç9†[¶řřd~^˝Ă)[ô@ đ;|2?Ż„ŹŔ^†^d‹Z¶Ĺʵl~?Á'óóZřěĄčE¶řú—mQ. ęs2ɲůM4řěĹčE¶řŞâ©Żl‹Ŕ/€×ńÉü&|žč%Űâź ’9¦ëZŞĚďLňl~ >O xČ7ş¤ţ{Ôl>™ßĂ˙ąúÚ¦ÔKÜtEXtSoftwareAdobe ImageReadyqÉe<IEND®B`‚scales/man/figures/lifecycle-archived.svg0000644000176200001440000000243014520132301020174 0ustar liggesusers lifecycle: archived lifecycle archived scales/man/figures/lifecycle-soft-deprecated.svg0000644000176200001440000000246614520132301021471 0ustar liggesusers lifecycle: soft-deprecated lifecycle soft-deprecated scales/man/figures/logo.svg0000644000176200001440000026030114520133254015425 0ustar liggesusers scales/man/figures/lifecycle-questioning.svg0000644000176200001440000000244414520132301020761 0ustar liggesusers lifecycle: questioning lifecycle questioning scales/man/figures/lifecycle-superseded.svg0000644000176200001440000000244014520132301020553 0ustar liggesusers lifecycle: superseded lifecycle superseded scales/man/figures/README-labels-2.png0000644000176200001440000006437714531055367017037 0ustar liggesusers‰PNG  IHDRŕ l< !iCCPkCGColorSpaceGenericRGB8ŤŤU]hU>›ął+$ÎÔ¦¦’ţ5”´lRŃ„ÚčţełmÜ,“l´AÉěÝťi&3ăü¤i)>AÁ¨ŕ“ŕ˙[Á'!j«í‹-˘´P˘(řĐúGˇŇ ëą3ł»“¸k˝ËÜůćśď~çŢsîŢ ¸,[–Ţ%,®-ĺÓâłÇćÄÄ:tÁ}Đ }Đ-+Ž•*•&ăÂżÚíď ĆŢ×ö·÷˙gë®PG݅ج8Ę"âeţŲ]€AűČ ×bř Ä;lś âõWžđ˛Ď™‘2_E,(ŞŚţÄŰç#öZsđŰŽ<5¨­)"ËEÉ6«šN#Ó˝ű¶EÝkÄŰOŹł0}߸ö—*r–ᇟUäÜtŻ.iłĹ˙eąi ń#]»Ľ…r ń>ÄcU{Ľčt©Ş7ŃŔ+§Ô™gßxuÁ<ĘĆîDüµ1_ś u~Rś ćŕâ*-°z÷#°Mi*ËŤWh6Çňř¸ćf}î-gi:×Đ9ĄfŠA,î‹ăňV§>ÄW©ž—Bý_-·Ć%=†^ś tČ0uüőúvWť™â’9 Ś%/VµńBČWµ'¤_¶tŹâÜČMۓʟżźĺP““í\>ÄŤÉ@Á„yě0`D i|[`٧ čhˇčĄhˇřŐŕěßÂ)ůţ·TjţČëčŃ0B¦˙#đĐŞÂďhU#Ľ ~yh«uĐ fp#Ô1I/I’ř"“ä0!Ł ’'ÉSdŚdŃ:J5Ç–"sdóąŃÔy#Rź7‹Ľ‹čwAĆţgdŕ´ĎĹJź7ŘĎŘĎkĘ•×n^:}nW‹»FVź»Ösét$gj-tČÚÔťrĎ˙Â_ç×°_ç7Z ţ~ëŰV·5ë4ĚV }şo[ÄGó=Nd>Ą-UlałŁ˘Y5VúË}ąx»g[üä÷É?’kÉ÷’&ăŢä>áÎsźrźq߀Č]ŕ.r_r_qsźGjÔyď4k± ći—QÜźBZŘ-<(d…=ÂĂÂdKO膄 a/zv7«Ť]»ǰod«}¬€©sěn¬łÖá?TF–'|¦ăď3Nnă„#I?"…m»z„íő¦v~K=ÚŻĆsńl<b|_|4>?Âpß‹ľQěńÔré˛ËâŚiť´µšęŠĂÉäăb Ż2* ĺŔ (ëşč»Ѧµ—hĺ°{28ÂoIţýŰyĄesź8ü';÷Z¶9ŕ¬ĐűhË6€gă˝ď¬>¦xöRx'Äbß8ŐĂÁWOĎ«ëő[xn%ŢŘ|˝^˙űýz}óÔ߸ ˙˙%x ĹcÖË8eXIfMM*‡i ŕ  LŠ‹‘@IDATxíť ĽŐÓú˙×˝÷wqÍu•d2T”™HˇĚLMBé&J"3e!‰Lˇ¤™©(’)S’D!]Ó ·˙y?ţëÜďŮí˝Ďwź˝Î9{ř<Ż×>{źďđ|×ú¬ő]ĎZĎz†ż¬*!'B@! ŞżVéÓô0! „€BŔVGB@!P HWčz¤B@ `ő! „€Ő€€p5€®G ! „€VB@!P ü_5<łĘąbĹ ÷űďżÇ~îß˙ţw÷ŰożĹľ>Ý…űŰßü~ýő×t—Ĺ>÷׿ţŐýĺ/qüńGě{Ň]¸ÖZkY]Cń ‰Ýk¬áđ’ Ń`F[dŇRáFP¶˙üç?VľT×Ĺ=žëmJ]W®\·:iŻŁĐ!ů…č:ô» 7ßß4†¤íZIOŇP¨ţ–i›rýşë®›´l,  ř™Ľ¤˙řÇ?ÜO?ýdpEŔ­˝öÚŽI@—křA ţŮaÍš5ÝňĺËđŁ<`÷ăŹ?f[4»ťuÖ1ĚBđókÜÖ\sMkSĘbâÂKú˙÷ÁÚ FŤ6ŃQW‚ţűď˙;H›Ň?(!ů…zW)[Čw5n~ ł˙ţ÷żY·CČ1„„CŔ-Ä;OŮüŞż…jSĘIý'ú+„€B J®R¸ő0! „€" ¬ž „€B ®ĐőH! „€±0›˙S§N-µ&»îşëÜŃGíFŹ-…€B@ -€/şč"׺uk÷ŐW_ąűî»Ď]pÁö¨ž={şx ĂÇęr! „€ĹŤ@l|Űm·ą'ź|Ňm±Ĺněر®U«VîńÇw—^z©?~|qŁ¨Ú ! „€ČXř»ďľ3ż˝fÍšą_~ůĹ=˙üó®m۶ö¨­·ŢÚ-[¶,ĂÇęr! „€ĹŤ@¬@8öă€üŇK/™ šŔ‡~¸9űŁ~>č ŠEŐ^! ň"ĺ-Z´ČŐŻ_żJęK1‰=ŕĂ;Ě"±ôčŃĂŐ©SǵiÓĆÍ1Ăőë×/VaY)o´ŃF±®ŐEB@! * Ś_{í5ŰRťÜˇľćz–ýđzöŮgÍ—ŚŢ÷Ţ{Ď5lŘĐ,­Ż˝öZ·ĺ–[şöíŰ»N8Áťzę©ö<ö˘ĘuÇ{ܸq®˙ţÉŻcB@!PÄĽóÎ;îŢ{ďµE Ŕ 6ŘŔdBwżýöł,XŐO,+h שS'·÷Ţ{»oľůĆmľůćVŢ1cĆDµśŠČňB¶ \–ş¬¨OÔ˻첋-˙ ňÁжC‡ČÝwßmÂľ¤áň™g>ýôS·ë®»–ÎTPA#´Ł„z,5ţ=§ßB@!P¸ Oť‹/ľŘ¶/ŮÚĽë®»l‡\™;w®:t¨;đŔ«UřŇ)V«Ęk öp×_}Ç*!‰ë+ĐFŤą‡zČTÇěń¦˘Ď>űĚÔÎĚDP)ł’ĹĘlÔ¨Qîĺ—_¶|ą¨·Ůřţ׿ţĺöÚkŻRVíÁ›ŕfšŐ.“€sĎ=×®a}ĆgŘ*ŰßtĎ=÷¸Ë/żÜ˙k«iżo]zP?„€B  X°`›2eŠÉçž{Î!łŘÓĹ[‡=]ěŽ|ĆŞ¬0ĺŔ(ĹRAłŠeĹJŢÍDb/–sé5ň 7Üŕ† b ś}ö٦:F¸âcŚzš|­¬l}ôŃRĚL†@̰†¸.šwâ>4ü’K.±ëůĺ5Şň¸?üťC Či€Lžźîą´Vé™ä7NÇu ť$żŘů\ž”/[3ňî†Č‘KP¶PůYéÓ|B% g˛ŚÖ(?úo6  áE[$K*ŇĆ!ű[čw5nľ\ˇrŠçú7úö«ŻľjĆ˝,ţćĎźoýŠmLl…Z´hávŰm·Raúow?NŮ2éDZ0bŐyÍ5×*DHJ"dů°”ÉL§™>}şmrÓ‘ştébęO>ůÄŐŞUËmżýöĄjVÁ7ÝtS)Ü›6Űl3×·oßŇk¸‚'x˘…4|řxÂý)“„ú"€c(ü#R~űdÚ!ů1€… ŔLgÁŔ.¬SWrěhüpLCđZsÍ5íĹłčd0]]Ňť3Ĺeă9`&TˇřQßPĽ¨k¨v ®!ßU„9l¨w5nŃ1„EK¶żPce =†¤Â mç3ĎĹŔ0ŔB™čW¨ri<‚ođ’źtŇIVůTˇX){0D(ď¸ăŽnÓM75Ýü×_m+c ˛Ř† dÂůśsÎ)ĂşI“&¦Îţâ‹/LđbB.őrôŹB  `«“šV¶gžy¦;řŕÍ`·< l.[xăő×_·hX|đÍ<±V擎Ŕ¬`űôéc{˝Lˇ‚ćxíÚµÝYgťe¬ Y°ÂfŻ™gńyđÁKŮcEŤšşk×®ćĹlצvíÚ•^ŁB@!P°ČĂ ă)?±%YHÁśb ŕťwŢŮ]uŐU¶ˇŤ!U&D­ćÍ›x¬lQzb“üĐC5+gTĐ?˙ůOôţšÄoü¶ŕ‰NÁ-B@ÂB•3‹-âD\rÉ%ö»°jč\,Ś.ť=ŰlöXÝvďŢ˝Śđő`"˝đőÇĘűf?™ŹH!  ´źÝşułý[´ ¸Ŕ"ĹŔldłúĹEčË/ż4W$ŽyB%Ŕžny”h,UŢő:/„€Ĺ…Ń ŮďeŻ÷Î;ď\ÍȶĐ%€©0ľ¸¸Ň$EqîřăŹ/łWË1‘B@¸`ŐĚ"ŹH‰;vt—]v™ŮĹ˝?Ż‹-€Yů¦rËA˝,B@!PI@%"Ţ~űíŽPÇĹ@±%g:'pÔŃř–‰„€B@d‚‘«đŚÁ –Ĺ„$^1PlĚoŞhNRACWQ…€á@ŁJf»ëŻżŢ’"Ô)H#Ü“r—SlLĚćhÔÂđÍž=ŰŇ^}őŐą[C•L! r 4ŞdĆ#Ś$vE]EÝSsް•XŘ?ŕD"•çW\q…Y«%ž×˙B@! <dµ;v¬#<˛\ń$J(VŠ-€S„k ŽEB@! ’!@Ě~„íčŃŁ-‰ Q­ŽH˘žb¦ŘxćĚ™ŽĚCžřM¤Ňţ[$„€B ŠŔâŋͪůŢ{ďµ-ĚO<Ń ®ęŐ«˝¬hÇŔdCJf„…-‘B@Ŕť€äŤ'cŐi§ťf‘­˙/ú±đÂ… Wó&'Ş|€˙¦~ ! ŠyóćYö»'žxÂŐ¨QĂróž~úénĂ 7,fXRÖýŻ)Ď$ś8öŘcÍJŤÍţđ3fڞ%`Ą…€Ĺ„ŔkŻ˝ćÚ·ooyăßxă K'˶%9ä%|S÷„´+ŕ3f™8·ă†D<čhŔ Ü’0ŔÚvŰmS?!ÎúDŰq‰$$5AŢ´>4?Ô:ˇ@*ˇř]¦‰5RŐ ľ‚!ř‘Ă~!r‡zë­·ŢjZˇTuIw~|B&á= Ąť ٦đ˘-B´)Â/ô»Š_(ÜüB Až_wž€äĺť>}şŰf›mLíLzŘlxÓoCő˙„â—i›F]w“µ]Z  çťwžĄý#/ăäÉ“ËřjQúőë» /Ľ0ďś9¶rĺĘ2dĺŚĆÂ\>UčÍňg d’üILť-121W~”ěđAĽ„öĎĺ;?^Ď7]ă–w>Żoy×Ç9šĎ U×PeóíHąB”  \!xů6 UWř…暸ů6ńőŻČ·ç’_6őĺ …›ç—MŮÜť|ňÉîăŹ?vĎ>ű¬Ű~űím™ Ďh›…âĎP¸…ćżŘ{Ŕ'NĚKáK%EB@!45§śrŠ{÷Ýw-¨Ćž{î†qrI»fŮ 4p/ĽđBJ5îĆoě’EĘ*Bt«V­r°j*’B@dŠŔM7Ýdű˝$RčŃŁG¦·ëú %€á7jÔ(÷ŃG9ň9nµŐV®fÍšî#ްOĎž=3x¤.B@\D#’îśuÖY¶ŕĘĹ2R™ŇîG+şőÖ[;ŇKń™;w®e iҤ‰Űi§ť˘—Ąý˝lŮ2·ŃFĄ˝F'…€B j ˇČ«Żľę^zé%‹vČ"ëŚ3Îp_‰*آpă«M7Ý´´d4á*7Ůd“Ňc‰?Ü=mÚ4w˙ý÷»¶mŰÚŞ9šZ W§E‹ą¦M›Zg?›gőK2.y0îĂ?´,Ť7–P÷ č[!â:bĐÂĎ=÷ś›={¶Ĺz¨U«–E¶ÂßW®Fi |*¶Ć%©sçÎnůň嫡űě3;îăOsýäÉ“í:ýB@V´€¬d+˝ĺ8Dxrą3VvŘa¦Z&NĂúëŻo—:\ŕŔ‰ČUý˙±0 ÇŢďoĽaű·™óňË/w¨ťßyç·rĺJwę©§Úľ.ťiÁ‚fu·ÝvŰ™ š°g¨“×YgťŇDé={,!Čó‹îˇgË Cń»L'i©Ęď'Y!ř&€ˇA.ů6M§IĘô9đâ AąÚ¦Ô-—ßŐ¸±č8ňČ#ÝÂ… m\ä]¨[·®kÔ¨‘-Lřź±…o˙)/.żďoˇŢyÚˇĆßßŔ9.ůH’©®Ź%€ąu0~a¬LƬl=Q r§"®÷*eVłdŐ@uLo‚x°żü·żýÍV¶Ź>ú¨;ďĽó,ÂV”ł5fn\GfOOT1Řj×®ťżÄ:†`q‰ç÷’`Ů8QľLžźî™đăBő‚x ©k¨Ů0Ř•×éâ–Ühü YP×l‰>F_ř}~”/T›"|™č†âG;P×äW_!ůĺ껚-n,NľÔŹĹ “8ý­Ľ±¦2Ć\ío´ŞżeÚ¦ĺµ×˙¤h9o{Ŕ¨;Č™H錰P_Oź>Ý‘O¨*Ď?˙Ľűä“Ol憰d‚XăÎĘóx:+QAŤő5űƸAyâx˘6±ŞůxBUáA\˘r}yŕĹáÇ€CŁQźPüŔ!:|ĽÁ<ĚÚĽÄ …8Ć~0*iřă’±×еkW{>Ć]¸6EŐÍv‘ţ! ň S1RÝlłÍč¸(1"ÇŔ¬TIÄŚ ˝[ö&hjiÜŠęÔ©“ň±Xâ5oŢÜ]zéĄnĐ AĄ*gn »fń¨‘˘ĆUV: ~ljF­[·6ë>TÔn‘B ßxĺ•WĚ@•­¸űî»oµq/ßë§ňŻŽ@ęĄkµť:u2•ń7ß|ă6ß|s;;fĚ[ťáŞřŕ›­Ţ1“ŹůŚĘ*„€¨ ©Oh^ŚRń$/±0 ‹@Ä'%ZU¨Č=Ĺ żj.„@± @Ô>â!<őÔSĐľ˘âF ¶~ë­·L˝ $>)ą#qG˘CcÔ¨QĄ!#‹NŐ^!°:hŮŞ#ű˝ÄQ XFXŔDdŞ<Đ’1”LF¸&ˇ–&Ń‚H! Ę"@B Ů׹~ýúî™gž‘đ- QQ˙Kă~4{ölwíµ×Z4Ăő¸ĚýúősS§N-jUy! „@"ü± [VĽ„ă%ë©EBŔ#KśHUÄ)M$âBC$„€"@şUĘ|˙ý÷Ďžý^ĹKPďHD öđE]d —†ß/«bŚ pżţúë-ĺ Ě "N,S‘B ŘŔP•$2diCíLôŔ‰ď‹ ĎBŻolL6":&ô|˘ÍL¦ŁáÇGOë·B ŕŔ¦GŹ–@†Ľćä>g,©-€ÉŮ'é5a+sŤ0CúøDP»‡ ŹGh~É’ZT´Ľ`Šő Ë–2ŃçBđCý*‡Çjíµ×ŽőN”×.đŁ|!U”ôyć„ m /ʢM©üBż[™ňűăŹ?,Ću×]géY'Ožě¶Új++[zRGrĹíâ4!řQ° Ĺ‹>G}CđóB./9D›’š3[‚ĺ Q6ƲMi‡PeŁ0ŃÉ//ߎ™Ľ«źţąĹrĆ>†Ä4Ą2HS¦P¸ń0ľÂłĽÝ×!ÝwČ1„ç bÇÚ;T;„C(c¨˛eÚ¦ĺMrb ŕŽ;š»8˘„…Şö‚s•$é qÉ_˘łűŕůˇř!83©OŞz{Ě >?žă±KőĚLŽźeŁ\şĽüJ!vŮ’o‡eóe ١yQĆPuĄl´Cw »–‡~Ř-^ĽŘýúëŻ6h3płŔŕ;úńççÎťk衇˛lFŃţ 7?†POxfKđ 5†ř˛„C˘zţý†WH~™¶©+R•?¶ţôÓOÝn»ífé˛đ&9‚ńk#®©H!Żh¬D .´* ReµýřcţĎbácá\ŁFŤ|­şĘ]ŤÄŔÓ§Ow p‡z¨ Ţ &¸­·ŢÚÍ™3Ç"cUcôh! „@… Ń Á2đGś{+«&‘¨lb `ôň—]v™ĂďwÄ®fÍš‚’N+B@äË—/·Ő+î”l±hK–,ɷިĽyŠ@¬@Ôíµ×^sŤ5rä&˘KóćÍÍâočСAö%ň?[ţřăÍ˙ńÇ·}ŕÎť;›ą~ăĆŤ]ďŢ˝‹-ŐRĽDŕŤ7ŢpÝ»ww+V¬p,&Z·nť—őPˇ Ř„-[¶4|ˇČg9pŕ@ O‰Etť:u ŐFĽGkfŚFݏâ ŰBĂĎw‹-¶Čűz©…@l4>ż{ď˝·ů˙nľůćVű1cĆXT›űďżż0ĐP-„€(ľűî;Ç6ިž'Nś(á[0­[‰%€ţůg7sćLËě±ţúë—Ö“}ÂŻ=ů䓥ÇôC!PÝź E‹6nŤ9Ňü|qĄ \B – šŘ¦„Ô"T["˝űî»AČ'ň×˙B@LŔU˛]»v–í±zőęer»®U†@¬03Gf“„\ŁsC¬Šď»ď>wŰm·Y~ŕ*+±$„€HI°p&'9ű˝ľ)€Ňáś@ Ö ’b9ضm[×´iS ä}ĐAY@ubˇöěŮ3Ve–-[ć6ÚhŁX×ę"! „@&\ăä“OvŰlłŤĂ.…,="!ËÄŔ›nş©e=z饗,^*«â† Ú§Ľ ˛Zž6mš˝q‚zř—ŕçdńD¶%ďWüĂ?8ÜH‘(¸?üđCG*0Ü Ďy^úB 8`ĎáK|úńăÇ»¨­Jq  Zć#±0•#…Ő`źL*‹ÄŹ?ţhÍoĽŃ;Ŕs_ýµŰpĂ Ťĺ®»îjqÇw|°;v¬E«9ćcěšaÆ9öžÔdbşů曥j2dôG_4qŐđ-ľöĎçg$€+RQrXb%MühjŹ=†řcŘőŃG9â°&îŐ°Cz0R6kÖĚ6xÁ‚ŽU8çąźnܸq®˙ţ)žîB Ź`Ď× ßxŔ2ĺquTô"C Ň0Ô„Ż$‚B÷˙ř‡I€3Şi|ő–.]ę^|ńE´uëÖµ&@ĺŤëS“&MÜŚ3\íÚµí8y‰Y%űDǨ 'OžlçüźI“&ą;ďĽÓ˙kîSıŽK$¬F‚|˛őüŕąÎ:ë„(žńXwÝuń»P[>y~`Ć'DŔ}ߦˇrŔú˛­˝öÚÁÚ”ţÁ»‚rµMŮó% jç©S§fť“×·k¨w5nľ\Ń0ŔŮ´«ďoC2G1Ó6ýĎţ“ö!•.€yúĺ—_njg9¬\ąŇśâëׯď>ůäG±¬f° ¤ĺé§źîZµjĺuIđ^,: Şj諯ľ*3ËeŻçŰożµsţ6BÚ ´űí7˙oąßđ A”Ťö Ĺ/d›Â+ż·ŢzËƉú%ă6DfŰOBż«!ęI].řAˇŢů\C¨k¶}P¦mZŢř‘FX˛_›(Őéü›l˛Éź%Lň—˝™n¸Áśá ŢqöŮg›ęxÇwtŹ>úhéĚëĹQŁFŮ‹uÎ9ç/YKH…xÖYg™›Îí8 2‰3}"vńń„ő5]q‰ýhbĆ–^~V]!ůŃ ~ůĺ—8ŹO{ |XuÁ+?v™`ť®€Ěřiüč7Ôőß˙ţwşGĆ:G{Ň®đŠöĹX7'ąF„&ˇÄűđ믿&őŰŻVú!Ú€gÓ?ldĂoŢĽyî„Np›m¶™{â‰'L@eĂĎcn!ßŐP¸ů1„ţ†1[‚_¨1„˛„CBáFŮBŽ!đË´lĺiÜbůó`öp‰÷LU|좢aĄ"ęg™R—.]ě%dőKBl2”xb˙Í7ß8„&Ó Lűďżż© ‰G]«V-S[ű{Pa§ţţ:} !˙`|‰đe‹Š=ßPjŮüGF5ČGb `V ¬FŮŹĹp*úąé¦›RÖťVĘOÁŠPfőˬ•ାXé0›ĹčŠý^ö‚q5‚–,Yb‚š}\ö„™ńŦbcżßd‘…ŤŔ{ď˝g— ·„oa·u±Ô.– ÉŞkeo  pßľ}]ź>}lĚK„ šăO`ŮܵkW¦ěç8ÂZu4îKgö‡ą‡׳GĚě—9açDB@.LŕYů2ţ<řŕÁŚ$ 1Ő,%€Śěă ™Ňa‡ćš7onÖČ ˛=Ď,%;v4Auž÷A>?ťh­G.Ox˛ÍţłHü@€€<ŻľúŞMŞŮűö“j˙ťxŚ˙Ń”á’Čö¬”ó1•˛%€`Č!¦.^´h‘ cöf=1+-Ď͇ëIí-đü˝|c”ľŃs‰Âןc?™ŹHÜG€ÉňĄ—^ęFŹm†,Żq,Ń 3UMşóĐCIř¦HÇó˙IŃrŠĎ03ŃnÝş­vĺńÇojˇŐN$±T úWü±Mľ±é¸âŠ+l"5ľÄ5‘ŹČţ›cXsó˝Ë.»”q?,ŘTĹ"@ ¶Ć:9•[N˛Um`§* !Pěץő1Ţ$qÁ&J¨™ůh;)ŠŠ~±0{4¸ ‘‚pţüůć’Ô¨Q#{ˇ¤ .†®˘: ř`_¶PüBbŻPüŕC„¨§ďďđ !€ŁüRµ{¦Çł­+>ţW]u•i¸Ľ¬xĽôżlÚ„{ˇíźlĘÂýQňďV¨w5TŮ|ąŔĚă-w¦żéoßPmŔóCŐµ2xÁ3T]3­§·)C2J+€ýĚ‹™áä+ţożý»ř¬l˘łűY&ćCńgÜ,2é*íˆY~< ěBń"…ŕÇ ĆĚ?/Ź)}$Ä‹MC—ŤrU¤®D±bŹ‹ćzőęąaÆą.]ş8r‚ÓO˛u9¤0(U¤l÷čwČwŐ–”-Ļʪ+D=ý{J 1á_¨1Ä·ăkşÂ/nđ 9†T¤l„pNG±7pp5"ľk"Ť3Ƶk×.ń°ţB O@»5}útwúé§[hYŚ,Â/żü˛;ńÄ“¦͓ީB §H»Ć‹˝—•FXže?öŘcf!íŹé[ÜD€U,•´€|űŹO /ď5×\cB7ŞýĘÍÚ¨TB ˙H+€±v$Ô$ŞT “'O.3ć%­_żľ»đ ó Ő@x'ĽőÖ[öAČľ˙ţű&tIžâ őň;ěŕ:věč¶ß~{űŤ[‘ßoô×é[ĘC ­ţç?˙é^yĺ{:.XC+ggĺ5†8 lđˇ 1ú÷ż˙m¬j×®mµuëÖöŤĐEŕ†˛ ͦĽşW;ipś‰'Z>ŕ &X6$„3Q°öŮgźčeú-„@#ŔVĐ<`a!—-[ć:wîln[l±…«QŁF—FŹB .±0*­¶mŰş ŘLĂŤďľűÎ °FŤĺĘłöŠ[ ]'„@|°V2d›?ľ;ě°ĂÜE]äöŰo?[“(E$„@î"Ű ú¬łÎrx [´h‘í)-]şÔÍś9Óšî†nČÝŞdB  '÷±Çk)×[o=3†=z´E©*ŔęŞJB  %€™IăOć,%!|ćš4ib’¦NťZŕ¨RB ×řüóĎ]÷îÝ]Ë–-Ý’%K,ýߤI“IRDB@ä±0ÎĚl°%cH¬Ş/˛#‰„€¨<Řîąřâ‹Ý`.—_~ąĹgWîÝĘĂ\ś…@e#{˝%Ś;:tč`Îú¬Šźzę)‡ÚëúëŻ7G~ Ë w‘Ů#đË/ż¸‘#GşáÇ[*¶‚Î>űly#d­8jG ¶föM2łó‰R·nÝJ˙ep`° !ďĽóŽE§BŐ|ňÉ'»óĎ?_Ú¦ě ŐÝB §-€żţúëXńQ‰i+B ;žqŇI'ą:uę˙˝´JŮá©»…@."[ZâfDD,,ꉴ%ö€wÝu×衤żńQÜhŁŤ’žÓA! ţD࣏>r'śp‚«U«–{đÁ>÷"!  ŘřĆot,Ť°…˘Ľ|ŔDč!¦ôý÷ßoľÄGq„ĂuZ¸pˇ[Ľxq);›m·ÝÖţgŐŤ˙ńV[mUzĚ_H<[,B7n,ˇîAŃwŢ#đé§ź:ާ 7ÜĐ=ôĐCľyß˘Ş€HŤ@,L ,\®ĽňJó;Ä*:J>]VôXô7F$dR"2Ba>`Ŕ»„sZ•4\Ä<Ź,LŹ?ţ¸ů7—"EÚ»ďľk×ÝrË-îć›o¶ÔivR„@ž"Ŕ»đ%L$—°HÂE –&%ęă6mÚ”®\ăBBţĐ'ź|Ň=ňČ#fśŐŁGG8K„:ľÄ¨Ű0ę"8|”FŚa‰ öÚk/S}ăvA9X-żôŇKîᇶűÇŹďĆŤçú÷ď˝]ż…@^!€&Č'ĽGř˛÷+B °%€IAŘľ}{[y^zéĄrÇ(«fÍš¶ŠEč’@^Şiü‰Şőâ‹/şfÍšąşuë:\ś>ţřc ˙ôÓOŰJ—çB¨čX%űä٨ ÉŇ%ÂóˇîöÔ»wďŚ\Ł(s¨şľśˇůc(BŁŠźoďe#ۉŃé?!L?!Ňěů6Ĺ7>1©<účŁ-I:}— cŮ«čPáaC¶)ĽĐ…jÓ\~WCáćű›×fŰ7<żPď<ĺ)–1$Ó6%‹`:Š%€a€R ™V˘s|°ĹŁĺw2bőŠÚ· V±§žzŞ 2ź|ň‰­ngÍšeAIRđťvÚÉţďׯźŰqÇÝرcmŻ÷ÜsĎu¤T‹|믿ľűöŰoË<–PžxáČ3ˇLŻOĹŰóńß©®‹{>©O:ţđ U>žŠ—çăżÓŐˇĽs~›$Ż(ŹčďňĘě<ý™Î6b'Á6M¶ZşÚ$˙0‰H™†Ďńe—]ć5jd+eâŢ„U Ů_<ˇâNśÉ1!ŕă őąO:űf¦ÉóCt´k¬±†e’ ĹŹ—‡ Ů|Pu˘‰ÁŹň€ÝňĺËł-šÝĎ* Ě2i»T¦ß°*ôiúR]ç8+KĘF‰öĹ8÷Fݎ_sĚ1Ƈmx†¨+mJ{†JĆŔű˘\ÔťţÁ9$żPď*ăHČw5n~ ˇžhł%ř…C( rľj …e 9†Ŕ/Ó˛•§…Š%€1 š;w®{ď˝÷LhR¸´bĹ ‹’…Š ő_—.]ÜóĎ?ďXý˘nć<•‚ŘĆ Ë»*±†81Háľ)‹'TŘt‘Č'č·¸ńMŞO ™‰„€(bĹ‚^wÝuM5V‘3¬” ,1ëGč˛úeF‡Zľ¬tžxâ ˸„ŠąaƦ’ăžĎ>űĚŚŻF@yóćą/ľřÂBó)=‰ň 4Ů Ây|Ńř„€(>b­€eđŕÁ–ţŚpx¨”ŁjßÚµkŰţp2řŔ}űöu}úô±0«hTĐßzë­M×µkW¦ěç˘v†¸‡}çÇ{Ě„ö AJŤż¸u4ęöĚÚµk—ěŃ:&rTŕ„•Äę™ ŘU„€(Nb ŕ^˝zŮŠőśsÎY ©ňq`dŇĽys‡%3‚”ý8OduěŘŃü„ŔžPGŹ3ĆöŠŘ7bĎÂSëÖ­m/šČ\¬ÎEB `źŚÉ"[)Ř@ĉ—őR…€¨±pşXĐQšŞX%“Ç4ٵeD…o”‡ßŽă7űÉ!\Jůę!P`GÁD .r¸Ď‰„€(nb `ŚERYń˘ŽN%(ŁđĘX*І~ Ľ;¬|ńmż÷Ţ{]Ó¦M‹Ąęާi-€˝ŃT2^ĺ© “ÝŁcB ŔĐęÄO´`3ěůjĺ[ ­®: xÄŔ/żürźGŚIfĎžíĹś8ŢŁu•(l,X`Â[ÂŻĘÚą°Ű[µ™"[' ¶±ß~ű™ďâW\áîĽóÎLź­ë…@Á"đÁ«ÖţXň×^˛`ÁRĹ„@‘"Ë86ěëbR$„Ŕź "Âţědň’đUĎB ±WŔ3gÎ4_]Ď„ěoçąYłfţ°ľ…@Q#@¦.â™ŮŠ,]řŞ‹„€É-€[´ha~Ŕ‰LPCűŕ‰çôż(&¦L™b®v{챇ů°ËG˝Z_u™#[ą'Ń ‰TѬC™?^wÂ@€ľ„U=äCଠx/B@¤C ö0łů×^{ÍBP˛·…ŃŠFŹťŽżÎ ‚G`äČ‘ŽHqmÚ´qü–đ-ř&W…@b ŕ‹.şČ’üĄ÷Ýwź»ŕ‚ ¬={ö´€ňAJ#&B Ď:t¨Ĺ,?í´Ó,é4ByÖ€*®¨Fb ŕŰn»Í‘ł”äcÇŽu­Zµ2 Oâ;×V$Š ¶cč®»î:Ç$WĽhĽňbÂBuB bÄÚ&”7°v&u ů|ČŤ2ËDüiâMÇ%®%1wňńŞńMÜCŻ˙(żŠÜźěVm”/u(^´…ŕŻPe×gśa†VL@Éî• Ń¦đ QO_ŽPu…_ȲQ.&*ˇęJŮB˝«^{AŮBĽ«ˇpóď<ő Q.ę˛ č#”ńż˙ý/?ł¦P¸Q겮™–ŤëÓQ,Lśçµ×^Űáb zĺĘ•îđĂ7·$ň™tĐAéžQíç|#Ä-×—\&Ľ¸~!^ĘćůŮŹBÖ7tŮBń˙ő$©B§NťÜ3ϡĘć1 É/4/ĘŞ˙fZ6®OG±0LŘ&­ łś=z¸:uęŃÉŚ3\ż~ýŇ=ŁÚĎáłüŰożĹ.3ŕ_ý5Hgç…ÁZÍA—´ü˛%ß9Ŕ&?Ęvˇx‘äú†ŕÇĘ‹—0^L>O9ĺ÷ŮgźYt«=÷Ü3+~ľýXٰ*ɦlžßI†lSŚĘB•ÍŻ.Cň ő®z Cń …›C(WUfČ1ĚHˢ,T›†ÂŤ˛…Cŕ—iŮčďé(–†FW-[¶4Áäłą`ůÉoŚH2ďľű®Ądś4i’;řŕÝ7ß|SČUVÝ„€¨db `ʱŰn»•)N®«žËV˙ "đěłĎşnÝşązőę™âV[mUANşM!đ?2ŔduůúëŻßQÂGXą~Łčwˇ p÷ÝwŰöËţűďďî¸ă·ŢzëJŐT! ŞŘř‘Gqť;wvË—/_­ČĘĽ$:ç jĆ¡۾}{wĺ•W*ę[ž·©Š/r Řř¬łÎ2Ł«îÝ»Ż`^1os­YUžlŔäśsÎqÄvľđ íw6ütŻB ±đŠ+Ěŕäꫯvµk×NĆGÇ„@A °téRłt&źďí·ßîŽ<ňČ‚¨—*!„@î!ŢKř˙—wýő×w[nąĄ{ăŤ7rŻ*‘„Ŕüůó-ÂŰ_|á~řa ß@¸ŠŤÉµćÖ!C†X¶—E‹™0öQc8ÇŞ¸Aü ĽD€ 3Ř8Đ—ÉlDČU‘B 2-€Ůţá‡Ě#±@2ÂJDD˙WłgĎv °Đ„DnĂ źo>Ř) ‚€ţ˙ţôÓO-§u“&MÜ]wÝeŞŁüz¦Ĺ…@lŚűT’šHT'D;;˙üóÝĎ?˙lţę|c±żxńb;†aźź~úÉ‚É$–•Ôš×_}°¸Â‰üőżB ŘZ h¤"dŻŚP”Ť5˛8Đ>Xx"sý/Ş V®NMś8Ńí±Ç«=ÖŻ|I*ÂDí?„mÜf›mV»G„€•‰@lň§Jż§Oź^ćN|řá‡îé§źvęĄ0ĺŹ^xÁ’# |kÖ¬Y”¨ŇB@ä'±°ĎC‰ M$ŚZ0€IG#GŽtd“ÁµăóĎ?/łbćÜčŃŁMŤŤ*{ćĚ™eX˝řâ‹îâ‹/vß}÷]éńaÆąkŻ˝ÖÍ™3Çrł"ÄEŇ1ÉI“ٸqcS?ޱůŚ@¬=`r 6kÖĚňţ^uŐU¶ĎĆŕÇĘô¦›nr={öL‰ÂůÉ'źtÄ’>|¸ĺž0a‚ĺµD°łâ%™f‰Őí¨QŁĘ¸…,X°ŔáłI î?~Ľ7nśëßżâíúżŔ¸í¶ŰýaęÔ©–#ąŔ««ę !P`ÄŔÔyÄ®m۶–˙·V­ZîÇ4·BőőéÓ'%,ě@5 š÷řfÜbEÍĘ.VşÍJ„ĽWqc©Š°'&/Ú>›!|!V?“'Oö§íűŐW_5kXđÔSOÍ(°VÝD˙ AŢE+4?’¸‡"Ú$?°Ăß6ŃwčÉř!x™ü‘&pß}÷-÷ql™ŔĎ÷›roHsçAf¤T®yin_íüř„ô&`Ň –łÚC38źdm‹ŇK©#m’_čw+żP¸ů1$T&.Ď/Ô;Oă†CBáFąü;ŞżeZ¶?ţřb¤¤ŘxŰm·uoľů¦›6mšíżň‚ď°Ă®yóć)™űěc¨őÎ;︕+W:býúőÝ'ź|b© gÍše Ř»wowúé§[8@V¸›oľůjV­XĽFÁäeůöŰoýŁěűűďż7W)gf2¸… l LžďËťěŰóóB Ů5™ă… Ĺ/4vÔ7v}űöµ~pŮe—%=ź Peómŕ_îdĎĘäüü'“űŇ]K›úr¦».ÎąP¸ń,ßĎ’µiś˛$^˛lŻ\+[čry~ľ-1­Č˙ą<†PźęjSťé(¶FđačrŕÚŠ—˝_“_pÁ¦VN7Gú†n°p–oĽ±;űěłMuĽăŽ;ÚŢoŤ5¬Śřb˘rŢi§ť, *ĆD˘ˇŁł TÜĚľ˘ÔŞU+âţŞěLڵ6ÜpC‹úbuĂD…ú1IĹŹ Ů|đçöÚŚlůq?Ř%KYYŢhNŔŚ U”P9ł­Á–“«8mKż!ňUÔ0Ę3“ßřÄS6Ęí‹™đ^ËJ„÷'™ŤEôş¸żiSŢO>!ţ›ŘĺK˙`ŕŹÚtT”÷…|WGŕę] …›CŔ¬Ľ=–đ 5†đv„ΊPE HđTD&%ÔĎł.]şX'gőË@}±Ů&âÖ3Ď‚oxě+Ť@Ś®Hýq˙ŤfżC-VŔď˝÷ž© 9ľőÖ[›ŕ&ČŞdösŮÓKG\Ăőd®A˝€P&’¨đŔbcŔ3Ď<Óa“ B@ä3±0‚óŕ¶ýŢ1cĆq•&8>ą˝zőJ‹Áa‡fĆZ—^z©4he¤ń7`Ő±cGŰCHe}Hz¸(µnÝÚÁW(˛ÜŠlH±žH!ďÄŢFđţúëŻćŻ‹2{Ŕ¤okVâ:„ą<ÂȤ{÷îe„Żżuv*áëŻIüfR á›JáţO–W^yĹ1‰ĂJ$„€Čwb­€©$ę^`ň­·Ţ2KĆ]vŮĹ,–ă‚ c©¸Héş(X.<Ř´(-[¶ŚžŇo! „@Ţ"[SCVŞOń ŞBŕšk®1·°!C†TŐ#ő! „@Ą#[]é%Ń„@ČĽE¬pÂťbp'B@ Ŕ…Ň’X‚p`ŕ‡ŕ=묳 °†Ş’ĹŚ@F*čbJuŻZ05tčP7cĆ óů-/˘LŐ–NOB@dŹ@ZڱUśđxm´Qi Ťě‹$ĹŚŔgź}fY|đA ¸ŃˇCł´/fLTw!  ´ÁŹ<ľĺ‘Ş0EB "ךŘÎD·zíµ×ĚÍč¨ŁŽ˛€{îąg™pĄáŻ{„€ą@ZĚ`'ř7>ą"!)dÇBčâăKD5RKrô裏v±Ňě|$\IDAT묳Ni őLůęz! „@> V‡Ę?™@¨ŚUŔ?üŕ&Lŕîż˙~7oŢ<˛'žx˘ĺöń«¦$zŠB zH+€‹†ŞT]Äm†0”a@%ÁY‹DB ä|ľűî»ÝäÉ“-… i-ď¸ăë7!§zľŽ ! r ŘřŢ{ďµ=ąd9FÉ\$śkM›;ĺ!ŃŐW_í6Űl3ËÍŠ—ß"! „@1#[“Ńč¸ăŽłÄ m۶uÓ¦Msäç˝ňĘ+í“Ë Á+“}j=~¨Ů1°!ž‚‰ĺÉN•I}RŐ>Ŕđ˘„ŕĺDÚ4Ô€čq Ńđ MCÔ^!Ë/Ą\,›B˝«ˇpóĺłýÍóŁmCQ(áKyB˝§đ˘  ęęoĺµW,Lö^k­µ¬2;ě°e¦Ů~űín"ýű÷·ăąú‡\Ć|âU{yŕĹáfdŽ ÉŹŚýřl >Ú1‰ ÁŹň€Ý믿îN;í4ăK*ɦM›ZşÉLËëÜŹ?ţé­«]ĎKM?Á‹—^řČc‘-QOp‹ăsçYd [ąrĄőą8×—w ď~ÜxődP É/Ô»Ĺ{ň] …[t ‰ă•R^{Â/ÔÂłCĐv…CBáFŮBŽ!đË´lĺ ţXú@şŰn»Y._2Ó4lŘĐ1°"ÔđßÜrË-)›H¸ÇÜÜH/9eĘľ‚E! VG Ö Űn˝őVwä‘GşfÍš9Ś®vß}wËÇË `âĉ«sÖ‘˘CŔ[zčˇÖ_đĺ ! „@rb ŕ&Mš¸… šj ל9sÜÓO?íl•Ą&9¸Ĺrvź>}ĚŘŞwďŢîüóĎ/Ý{) TO! „@¦ÄŔ0fOô»ďľs_}ő•=_Nöšř“M6ÉôŮşľXşt©;ýôÓQ­† ćşuëć–/_^5S„€•‹@lüČ#Ź¸Îť;'\ şr)Wą'üÔSO5 bc'B@xÄŔäcmÓ¦ŤëŢ˝»…ڞG%-*.0°Â··^˝zËyóÍ7/.T[! „@–ÄŔĘ˙ć›o,šQíÚµł|¤nĎwnşé&wŐUWąC9ÄŚ­4Ë÷Uů…€¨bą!áR‚«ŃoĽQeÔ3sˇC‡šđ=óĚ3Ý1cĚ>‡Š§˘! ňX+`jC¬sĎ=×-Z´Č„1őžX7hĐŔ˙«ďEßoŇöěŮÓ]pÁZKUK!P5üOŠ–ó<ö€ I‰•k"É+‘Âű˙Ą—^2W#â€÷ëׯđ*¨ ! ŞŘŘľ©B3úظU\v=®ŠřŕĚ_p\Ťc'B@ě-€‰i‰ç}÷ÝçćĎźďęÔ©ă5jä:č `™t˛«Šî® HÂѡCkďQŁFKRQeO! „@>![Ďť;×rţ˛Ţu×]ŔqřᇛŠOÔ®ňË–-sm´QşKt.‡ `~ÇŽ-ć÷¸qăÜlCĄSQ„€ůŤ@,+hŞŘµkW·÷Ţ{»/ľřÂRĚ}ůĺ—nöěŮő$1€ÓY^ŇŹßč<ŕHčŕ‰đ–dĎńźŹ>úČźrß˙˝{ć™gJ#o•ž(ůńá‡Z(L„ş(<ż˙ţ»µů§ź~ęĆŽki(Ă?E…€Ĺ‹@¬0$VÁä†ŘD}Ţyçą'žx"­aÎČ‘#-ý1Ł?˙üsŘ 0>ścUM~aŐő¶Űnkűá‡vp€ă›Ä†Ř‡$ ×ÝrË-îć›o¶€vR‚ €•ó‹/ľh®F´‰H! Â"K“ż¬důJÉĹÉj)qŽ”…„˛>|¸ëŃŁ‡í'Ż%|Yń^}őŐe(–Xu]{íµćňÔľ}{w 'XŘC,±±ČE(s˙řńăęŃ\ĎIś ź\<ŽF˝~l#˨2 ! ňXýÝf%iq?aPŢcŹ=,ŮúôéÓQ‘đ MEř ׬YÓV´]^#P!:ÉŘOfµĹ3XacU}÷Ýw;źÎŽdĎěG"Q‰˛"CřBŤ7v“'O¶ßţ™šž{î9˙ŻĄQÜtÓMK˙/ďeÝÉűK‡â6h<ßňęç<íëů1ˇaB„Ď÷Ůgźçö2×Ŕ‡Ý!Č[ׇŕfäµÁË—‹ţ™Ę3 “úÓ—ůxľ™Ü›ęZŚ&ý;’ꚸÇC¶)m@[„hĘOŮB˝[ţÉ/D=}ąüx·ÝR]WŮcHŞçĆ=˛żůw*D;PţLˆĚKG±0 FŚáđmÚ´©«U«– Ä_~ůĹ„©čŇŃĺ—_njg2ć=‰ţőë×wź|ň‰ ňYłf™`FĹLfťV­Z• _*ŔŠ c/ ¸0üŠĄëŰoż-óxř>öŘcĄÇěţ¸äĸק»ŽÁĘäůqř1…˘5ÖXĂ„*ü˝Ń6\sÍ5r7 ‰ť !±ó/děâĆyŽď#!Ű^~ŕŽS†t×ĐˇÚ t›†ěoľBÖ5ŻĐĺňüBö7?†¤ëGqĎĺzˤMY<¦Łż”ĚŕWĄ» zŽĽŻEaxĹŕÓ°aC·ďľűF/Iű›hZoĽ± GVZT¬5jŘ}ŻĽňŠĂŐĺ®»î˛˙yŢĄ—^j«ŚK.ąÄ\`¸Źh\äś…řÝ«W/SqŰ$0Ôúí·ß’śI~ýhTÝ@“śQÉQp˘~¸ó„âÇ Ää'[‚îd¸—˝ýöŰŽr;©őYAU„Ŕ.T:B4'`†1^¶„ŕ]{íµËV”'ŘP6⣣•É–Ľ–ɶx*›6ĺ˝b{(ŃC´eˇ0Ŕ˘ů A!ßUĆ#ř…zWCáćÇleĘ[QĹÁ~ˇĆžG*ZŢůcüBáŻcHEĘćÇ îMFęq“ťI8FĂłB:ôĐC-"`łJ=zt•e˙%‘Đ3®.]şX'g•JŁE_l2ëřNĆ`„EupŮe—•úź˛úŽľĽüV.â˛gúŰ„Ą=+*|3}®®B@3±đE]äZ·nm*` t|,`öq-JE ćX)ż˙ţűv «Q„2+-V™ě5"ĚYé`M}ŕÚ yĐ Anűí··çDŐ†Dcš7ožąCaŕ5iŇ$S‹§zľŽ§G€˝őO<Ѷ0fc B@ĘG öđm·ÝfÖ̸‘ ‡}ZV¶¸ˇfOFŕľ}űÚŞ™đ{ď˝gĆ=ßzë­Ý1Çcţ¦SösYí"¬˝_0‰Ţ=aEŤ>Éť;w6őĺi×®ťżDß €–=÷Ź?ţŘTřĘé›xşT!%±0j^ö”0fbµúüóĎ;2„ť0aBÚbvŘa®yóć¶źËĘ6ş˘Ĺ ‹hK¬ÄŔŞP\ŤR+qx˛GĘb1Őł ő8űř$Ö °Ę’´‚»í¶[ˇVUőB@ä$±0›â° ±BĆ’«dV­¨ź‰]adŇ˝{÷2Â×ßQ†ľţXy߬¦CZń•÷ĽB:˙ý÷;¶6Űl37cĆ óÁe@QH8©.B@ĘD –ĆbŽ›U'ĆXÓŔҲM›66€ÇMO'c©řM‰ZčýX¬bi+4¨ţ1˘CĘj9~ítĄB@Ä6Âú׿ţĺŢ|óM÷ÚkŻąn¸ÁĂý‡ýC…* Ű‘î¸ă× As "@Ib_­QÉ®»î:‹Jʱ?DůÄC!PlÄŔ;SĹqŢsĎ=K4 zÖ ®Ëŕ«LP|ž z‚‘ÔI'ťdš|¤+J÷Ţ{Ż͡É@Ëh­˘Hę>! „@8b `öńŰ á®č…Ĺ C7,ɱú&Ü'ßÓ¦MswŢy§ąküń¦6ÎDŁr&ś$Ú ¬Ö§NťjI- 9ŐF!źÄÚ&B Bś4„d!Іă"D$~˝˘Š!0ţ|wĘ)§ Ĺ@jżýö3F¬XśGq„ů;_ýőús˙ý÷·,Th#R٢°rĆhnčС¶’Nu­Ž ! „@Ő#KS¬Á›€ §o"±:‹úë&ž×˙© i~Ő„č$©ÄV[mµÚĹbÂDâ~… ™,Q¨¨ÄřX“#Jd’şřâ‹Íş™ë h"B@ÜB – š"łňĹ8Ůçž{îÉ­ZĺIi0¶bĺKF'˘€%ľŃŞŕ®uÜqÇY˘‹Ń&fötgĎžmľÔ¸zaéĚń)S¦HřFÔo! „@!{ڱ{ÁDżBeJ$ŞĹ‹›đ@0â#€±ů‹ éyÚi§Y€’L2×€÷±ÇkĆY¸ŤŚŐ1nK'ÁJťŚF"! „€Č]b `ÜXZ¶li™B0Ć:ňČ#ÝŔM-ŤŔ/XT>[1y!ă•W^i©Ëż+ůDCýŹ:ú‘G1Ł-VżěŃ‹„€B ·˝tíÔ©“Ű{ď˝-›ŹLCVc‰ĘG࣏>2Ł*&3¬~ Ă‚X=cA=räH ߀ЇB  %€ńGť9s¦©JŁ!#1"†>˘ô`l…šU+ű˝P‰„€B xĄ‚f…ĹJ7Y‚oÜ]r}+âhňšŰ_OŠÄl lnĽńFs½żŢlBLz¬3©OŞ:POž!řÁËcÇďlÉ—/DŮઞľ üw¶ő Y6_–Đí˘ (媌˛…zW)#u Á/T=}?ăžŮ’çŞM)‘ ýńÇî±Çł€ě÷véŇĹ܇21¶Jö|ßÉłĺĺMjHĎ7zĽ"ż)W¨čh”‰0?^’w„ŕĺ±˘Ź„¨áGů2éŁĺµM¦}>?Ę7žA˙ ®!ůeű®úşűw*żP¸Eű›/k6ßľżyľŮđň÷†CBáFŮ|Cő·LËV^đŞXŠŕ2±OÓ¦Mí" %ÖĽ„JěŮł'—ä,aLYă+TÜ­*2¸röcqjҤ‰{ôŃGÝ^{íe“–¸eHuÝZk­eř‡Č^äBx…ŕG™ÁnĹŠ©ŠźŃqDÚ ?^VÚ'[b°ˇHˇÉD+[BXRW&µ!zŇç“i¬*Âźlh!Ú€gÓ?h„äWŃw5 ‚ Ѷˇř…ÂŤľćű[yzbť’ýr ?Â-ä 7ĘVłfÍ`cü2-ý)ĹŔ›nş©ůź’’\˛  6´OşËąE‹™ĐEř2˝jÄnß}÷µF[˛dI±@ˇz ! „@ b `VŹß˙˝«]»¶;ŕ€ěwQ\BŚŰożÝ˘X1&(nFŢRĽ(@P%…€B cŇZA#x ćŹĺ3Ď„4Ě$@ĆĄÉ“P;6҇‡D0Ŕ˘Q˛SÂ7ORĹB@T#iWŔ¬ěŘű%¸CÝşuMĄĘžď‡~µ‘R5ֹf_Ť8ËX2ńŦ~ÇÍ»U±nB@˘C ­ž8q˘eÔ2dÍ.»ěâŢ|ó͢ôcŇ ‹4‘B@Š V/[¶ĚVwžńÎ;ďějŐŞĺ>˙üó˘ŔXŞľđ eR1zlô-„€B ŇîŻ\ąŇ¬ťŁ ˙ůĎs—ňÍ—ßŃ<ČůRf•S! r´8÷Š« ! „€( ŇŞ ©"é18ň´téR‹đ„Ú{˘g‰„€B@x¤ŔX>cńĚÇ.Iâŕăé‡~ö`č[! „@ Ň ŕ©S§Ć`ˇK„€B@LĐp¦éz! „€˘X! „€Č ŕLÓőB@!  D±B@!))É·ş*Ó›ňíúLó¶r2DžWpZ¸pˇ{ăŤ7Ü‘Gi áłĹŽľPfűý÷ßáFwß}w·Ĺ[d[4»?$v¤ľüűß˙ną”CŽ<´!ň©~ýő×–”¤E‹nÝu×Íşh´)źeŁ0äźĆ5p›m¶Éşl0٦3f̰\ĹdU A!ˆk%avC˝«ˇĘFŞÓ™3gşV­ZYľâlq 9†Đg{ě1׸qcWż~ýl‹f÷‡Â f$˘ľűěłOµ”Ťń‹üÜ) ,Ş<Jü¨Wm·Ýv«J\µ*ď!ä\’xÜĘ6a„ r¨ÜŰ:vě¸ę¬łÎŞÜ‡T€űóĎ?o¸•L®*pwĺ߲ÓN;­5jTĺ?¨O8çśsVµoßľwVţ-%k×+VTţĂ2xBIć5+×·ß~›Á]UsiI‚+ŰűĚrł·‘KÄ>÷[o˝ĺ¶ÜrKWłfÍ\*š•壏>rěŰn˝őÖ9U¶ĄŁlěł®±Ć9U6 3gη馛şŤ7Ţ8çĘöé§ź:lJ¶er®ląú®~˙ý÷ÜvŰm7GF¶\˘e­›={¶Ůl´ŃFąT4+ËÇl{Ŕą6†x $€=úB@!P…H]…`ëQB@! <»¤„ü?ú®Ë—/wO?ý´ŰlłÍrF%ů믿ş'ź|ŇT‘k®ąfiĹŢ}÷]‡Ş­şŐEdŘzá…J“}ř¤n¸aZ×pŢd“M‚¸t•‚ůńâ‹/:0ÚvŰm#GťűňË/]‰őł«]»¶Ë…śĐĎ<óŚ©rÉĎť+ôňË/»_~ůĄLßB}úÚkŻŮ6Gu–“í–'žxbµţöóĎ?[JU¶yóć9¶*c‹†gO™2Ĺ0«S§N™"Ěš5Ë˝÷Ţ{9łý˘ţV¦y‚ýŁp(y±ďĽóNxŘaQâbä®˝öZwăŤ7–á7}útÇ@YÝ„=z´›?~™ĎO?ý”¶h·Ţz«cÂSYtĎ=÷¸+ŻĽŇ}ňÉ'eQâfax.^Ľ¸ĚńęřżPÚučСŐńř”Ď7nśëׯźŁďyŻ‘#Gú«í›}gŢj´Ď-Y˛$m™ž}öY‡ďreý2ń‰“…Ë.»ĚŤ1"z¸Ú~«żUôŔ°-ńÓsgź}¶9¤GŮ1Ă-ń“+=„pYąreé˙¬ęŔŕ´J/ČňF_)OŕúrřÇ1ă§Lž(3ÁLBS˝zőÜůçź_ćłŐV[•>† ¶hYüIVФÁ¬ *ńŁuĎ=÷\)kDpdő%4 yĐÎmť8 Ş„$4m۶5MĎ÷”ŘŹh·hy~űí7G° ęC‡.ĺ ĎÝpĂ ľHIż}9|»˘­ńúč“•A%~Čeú[Ë–-KCűaěĹĚź¤¨-›5kć=ôĐ2“ľwŢyÇĘäŮŁâ§ĎA¨ÖŰ´ic}ˇK—.–ż»2&}ÔĽRMúŔ«$ŔŠőÚ‡íąçžë‹íŢ˙}ףGŹŇ˙«âe>ţřăÝM7ÝäŽ;î8ǤÚ}áĚ3Ď´÷r1aI|p™ «nÚÖ“ú›Gbőď|íoľ&Ŕ‰ ~ó˘úY4ß„e+Źü>ăřńăÝÝwßíŘ÷¬,Úożý,Ôd˛U aÝşuÝ]wÝe–ý;˘#Ž8Âö´)ˇćŘ˙ńu YNÚ’H5ĄźáÇ{VÓ¦MłI*çSO=µ ®{íµ—»í¶ŰÜرcM˝‰!$RŹr~uÉ€xČ!‡”>‚Uä:ë¬ăJ˘MąaÆŮDá©§žrŤ52 Ç|`×rě°ĂłNéÍYţ $!űľh ô±'ž¸zL|+á!C†ĘšÉ°2„/Ď]ýőMPˇVe•%ú=ÂlĚ1¦^E?ôĐCnĎ=÷4MŞN<ä•Ńß૫ö9&4}éâ‹/¶Ő;“:>^CŔ;Ŕ˙÷Ţ{Ż›4i’ÝęOt‡°eRżÇ{”˛W+…bµąŢßV+p ŕ@2ů—Ź5#•(ń‹KBĆĄeĂJiď˝÷¶Aő«™Ę¤Ţ˝{Ű*˛E‰rtĐAvŐňh¶aƦ†Cý‹@FHăWšt^xaéçŘcʵGPNĘĂ Î Ž=8Vs~@ôxŐŞUËŚT0ŕ M¬Jh[ÔĄ¬,‰uë źÂ’pŠÖćěŐ•„5ő3m‰ŕ@(RVľC &|ë­·ž=›8·Ř!čÓ«LŞí·ßŢ.#.neú/ď»ďľ®I“&«©˘éo<{­µÖ˛r€±oW?™@aěĆÄĄ2•v´ĎˇÂdÂ7wî\üô7&wLP(/Ä$–ţO:ď-ĆQ!‰8ě´>&XÄf§\žÔß<Éżsąż%/ń˙ŽJ˙‹Ś±Opbż†—• đ1ĘňägŘüĎ âşčę 2öWíA˙˙6ŞnTŃŃ}S,ˇ0žX)Q^ «`Vľ îü® šĽüëf,Á•)ź“N:É]z饥E` ôÄľ׆&/€&Ń1Ş2eŇ€0ö„ŔĄ_ŕ„@!'.Lô^ýu[OÉúý“ɢ?fŃv÷÷†üîŐ«×j“>&LŃçŇßřĐžľż1Ůb˘PYVúh|ăŰ–$ ľĎ]uŐUĄýŞ*ű[˘¶…ň©żůVJýť«ý-u‰˙<󿑬Ľ+u~5´'śp‚cŹŇŚÉ0Ä`·Á7˛*Ćú"  *7"ęÖĘ&?KdUć !Ă˙¬: Yy4hĐŔNł"aČ ¸Yłfţ–*ůf%ÎŞLy0¸ş˙ţűKUąL P ŤŠ˛G ·BpóÍ7·•–ÚQő3ü±¤EEČÄ`‡v07ĘQfV4·ß~{đŐ/mĹJś>ćű–ƬŇéoXőz•4ÂÂx 9ßÖŘ% Ľ+“ü¤ŹvóD?˘ß{+TÍ; ` ňXĄweMř|9żkÔ¨aý ěčoLś°1đ–W_}Ő´\L ŮŰ•É)Z݆fŚŘu×]٧ÔßĘ ‘üź|ęoŃHGŃČŕ7ű2¨ŚQB]…‘ľŹ¬†;tčŕ.¸ŕ·óÎ;ŰĄřü1€2x^rÉ%ć#É Ľ˛‰ç1ŘxÂĐă›oľ1c¦víÚ™0a1ńiÚ´i•ű˝˛'Îţ a¨†ŔčÔ©“/¶YňR^ęqLe"«Nßnţ9¨GQĎcůÎóQ YV­^˝ďďËöő3)Ł„-ĎÁö€‰lŘçŤú÷éÓÇöůO;í´Rőse÷9&}Qc"Vµ¤ÔcâB™ °ďę‰s_}ő•㾪&ö…ď¸ăł7@MM˙óř1±7ޱ:OôQV&H´%űáh ˘¤ţE#őď|ęoľ E鑨ÄofüQÁÇ`Íl›˝ýcöéŘ›Şbż‹}9 Źr‰XU˛ę`v›H”ve ‘ÄçF˙G{ÁŞ-qŔdĄ‰ćKéę DlXíâşÄ„u*Fkh4 ‰eŻŠň˘†f’š¬]«âůéž‘ř®úkQ•SnŚďŞ‹Ôß*†|.÷·Ę_vU ł‚ş+*|©{r={ö4+VţgŔöî"ü_Ő”‹! \S•-ŐńŞÄŽ•Q”PYâĆ‚Ęňę«ŻŽžŞŇß‰Ř d™°źÍ Ž}F,Ë«Cř˝\›ěůJ|Wýqڤ*ÓpÍ?'Ý·ú[:tRźËĺţ¦pęv«Ô3¬RîŔě ÷ TDůŹű˙9>ąDh°ę]°`m5äZůr «|*‹ú[>µÖęe•^B@!Pé(Cp˘h Ô—°_ŃITÍÇŢľ›ěÉy,j1ŘÁ"ÚŘóçł(^Nߊĺ7ÖÂQ\łđfo7ŞFĹmL±†ĆĘ8ęÎ`Ę^,F,"! ď*|Ó˝ßÉž«cB ŔéĐIs+X\`yę­" Ýşuł  ěąáŠ«Bř®Y!”±ęĹͧ~"ášÁÁ‡˙yÉ9W¨ôČ#ŹŘ)†@Ţ Uűŕ^\Q¦řiâRÓ˝{wű_˘wuÔQv‚+Z&@DóÂ5 ·‘"ę]M÷~Gź§ßB 6%«1Q†”¸|¬:účŁW•¸É¬*±.-˝»ÄŤaU‰€(ýżÄMeU‰¶˙Kb–®*qM˛ß%+ÜU\U˛˛+˝–%«áU%q…W•¬ęĘ/”Jö»W•XŻ‹w­Uŕŕ ,K" Ůż%1ŞW•¸Ůů?ŇU%>™ţ˛U%áW•„ęł˙K&@«J|—íw‰˙䪟ěŇëôC€@Čw5Ýű-´…@Epě©Ę˙.DEĘŠ‹•oTĹL8»¨ývŰmgęe˛«ŕ3Śá ĎN ˛SÔŞ5+Î˙¤sCťZÄĘž8άbŁ„ëţČŕˇ~g%Ś»–»ř÷ˇ‚fĹ‹ő®Ç(Sśg•Ś!1[Qôú]ś„|WS˝ßʼn¬j ŕ  H0żG[2ë)倠đ‰«ŮĆ…Ŕ„+–¨¨M â%îĂÍ€Ŕ…JÄ-öęăhqý Ţ-‘¸ Ôődj»ĄK—Z,üX‰°ó¸QÔÔLrĹĚ*™ÄôXEďż˙ţ¶-@ŠĂhć˘J-´ç-}W“˝ßy ‚ ^íH° <Ďţ&«Z ůO‰íĘ˙Zźt«Löýž'ÖĎőĎŐč@!JÉŠÄÚ¨çľěőb-ŽjšŔ÷¨çŃ"`řěsž,H>!ˇ=ŮKöÉ$R>H'„@ yWSÝ#@…@EĐ ¸˘Č%ąŹýMT¤]şt1A€wVqéŮű%h>+·A•ú­ť¨22ú$)bÎBMţ_bRł˘őAúŮßeĹËŢ/†jěĂůěD$WgŐŚĆ˝xÜÂŘg ň¨Č»šîžňž§óB Š„• •,Źyt26¬ŇPE­§“]W¬ÇRaÇľ9A;|2÷(>X™WgühYô;żHŐߨEŞw5Ý=ůU{•¶ş®îĐó…€B (ĐpQ6»*-„€ŐŤ€pu·€ž/„€E‰€pQ6»*-„€ŐŤ€pu·€ž/„€E‰€pQ6»*-„€ŐŤ€pu·€ž/„€E‰€pQ6»*-„€ŐŤŔ˙Łdˇ˛8Dx8IEND®B`‚scales/man/figures/README-transforms-1.png0000644000176200001440000006224314531055367017760 0ustar liggesusers‰PNG  IHDRŕ l< !iCCPkCGColorSpaceGenericRGB8ŤŤU]hU>›ął+$ÎÔ¦¦’ţ5”´lRŃ„ÚčţełmÜ,“l´AÉěÝťi&3ăü¤i)>AÁ¨ŕ“ŕ˙[Á'!j«í‹-˘´P˘(řĐúGˇŇ ëą3ł»“¸k˝ËÜůćśď~çŢsîŢ ¸,[–Ţ%,®-ĺÓâłÇćÄÄ:tÁ}Đ }Đ-+Ž•*•&ăÂżÚíď ĆŢ×ö·÷˙gë®PG݅ج8Ę"âeţŲ]€AűČ ×bř Ä;lś âõWžđ˛Ď™‘2_E,(ŞŚţÄŰç#öZsđŰŽ<5¨­)"ËEÉ6«šN#Ó˝ű¶EÝkÄŰOŹł0}߸ö—*r–ᇟUäÜtŻ.iłĹ˙eąi ń#]»Ľ…r ń>ÄcU{Ľčt©Ş7ŃŔ+§Ô™gßxuÁ<ĘĆîDüµ1_ś u~Rś ćŕâ*-°z÷#°Mi*ËŤWh6Çňř¸ćf}î-gi:×Đ9ĄfŠA,î‹ăňV§>ÄW©ž—Bý_-·Ć%=†^ś tČ0uüőúvWť™â’9 Ś%/VµńBČWµ'¤_¶tŹâÜČMۓʟżźĺP““í\>ÄŤÉ@Á„yě0`D i|[`٧ čhˇčĄhˇřŐŕěßÂ)ůţ·TjţČëčŃ0B¦˙#đĐŞÂďhU#Ľ ~yh«uĐ fp#Ô1I/I’ř"“ä0!Ł ’'ÉSdŚdŃ:J5Ç–"sdóąŃÔy#Rź7‹Ľ‹čwAĆţgdŕ´ĎĹJź7ŘĎŘĎkĘ•×n^:}nW‹»FVź»Ösét$gj-tČÚÔťrĎ˙Â_ç×°_ç7Z ţ~ëŰV·5ë4ĚV }şo[ÄGó=Nd>Ą-UlałŁ˘Y5VúË}ąx»g[üä÷É?’kÉ÷’&ăŢä>áÎsźrźq߀Č]ŕ.r_r_qsźGjÔyď4k± ći—QÜźBZŘ-<(d…=ÂĂÂdKO膄 a/zv7«Ť]»ǰod«}¬€©sěn¬łÖá?TF–'|¦ăď3Nnă„#I?"…m»z„íő¦v~K=ÚŻĆsńl<b|_|4>?Âpß‹ľQěńÔré˛ËâŚiť´µšęŠĂÉäăb Ż2* ĺŔ (ëşč»Ѧµ—hĺ°{28ÂoIţýŰyĄesź8ü';÷Z¶9ŕ¬ĐűhË6€gă˝ď¬>¦xöRx'Äbß8ŐĂÁWOĎ«ëő[xn%ŢŘ|˝^˙űýz}óÔ߸ ˙˙%x ĹcÖË8eXIfMM*‡i ŕ  LŠ‹‘@IDATxěť|ŐöÇŮě¦wH„ŽôŢTDEÄÎSDĄ‰Šý©(|–żŤ§ Š]Đ'MDŞ`©"˝—Đ éeköĎ„Ůěf7ÉÖlÉąźO23wnýŢ™=sŰ9AFáŔŽ 0&Ŕ¨SŠ:ÍŤ3cL€ 0&Ŕ$,€ůA`L€ 0&ŕ,€˝ťłdL€ 0&Ŕź&Ŕ`^ ŔŘ Đ9K&Ŕ`,€ů`L€ 0&ŕJ/äéSYććć:Už   CŻ×;ß×") „„„@ŁŃ Pv¦©T*čt:_Cíty¨}¨mĄNü9ý(ÔYDGߡ„„„:+[ dTď0 g _úA,))q&şĎšşDDDHő ”ŹŠđđp©>ňA‰ňňrűÜóăLřr†ZÝĆ ´w¨néŐžA×ÎC0&Ŕp;ŔnGĘ 2&Ŕ¨ť ŕÚq&Ŕ`n'ŔŘíH9A&Ŕ`µ`\;#Á`LŔíX»)'Č`L vő~Rí8`L 0üąëf.Ţ€˘2 RcńŮ3w"TĹbŔ[­Ë=`o‘ç|™`uH`÷± ĽţÍ\,,…VgŔ™ yxŕÝEĐĘë°ś•9Ŕć4řś 0& Ţ]đ‡…°5”‘+„ńć}'´Ćľ_-ŔľßF\B&Ŕ€ËlőtIKśFęt]ä…X{:gɨkCz_…ĐaoîJÔZôş¬©ąź×!Ŕu›łbL€ x‹Ŕ¸ű CóFRö1ˇŤ Ă“G".:Ü[EŞ÷ů‰!c}¦ŕ¬1˛äB–B´Zm@ŕ#kH¤x˝´´4`¬!…††JÖť˘D%¤¶qÖ€ŻqŕwČ;-rčÔy•jĐ.­˘#Ăj,„Łď ag?zżţÜYL–\Č9ßţ&Ş›ô1A¸¬¬ ˇn2őp.ÔFôAAmDÖĺ™ăwČĂ/@5É7MŚwčĎPëłäč;ĸčŐx×{슰ˇÁWâWÓ&^ń– é>Pę$·O  ňP=ä:yĺ!ń@¦T~‡<đ€x’<ŕ ĚŐcL€ 0ß$ŔŘ7Ű…KĹ`N€p€70WŹ 0&Ŕ|“ `ßl.`L€ 8ŔŢŔ\=&ŔđM,€}ł]¸TL€ 0&ŕXxső`LŔ7 °öÍváR1&Ŕ@€`ŕ ĚŐcL€ 0ß$ŔŘ7Ű…KĹ`N€p€70WŹ 0&Ŕ|“@˝×í›ÍÂĄbL€ Ô-ź/ü3ĄŮH‹ÇM)}ę6ózš ŕzÚđ\m&Ŕ€Lŕť![SMą aî™ußűů6=D€‡ =–“eL€ řęůž-Ë‘„/•·F¨ Z,ÉÜäĹ·«Śß~ű-~ůĺ»ÂÖe ŔuI›óbL€ x™@Žţ82t{„Ŕ-–Jrş4ËŞDZŁé%¬üýŐđĎ?˙ěsĹç!hźk.`LŔ3Ö˝‹3şÄ0s04ĆbÜű‰9ßP…ĘÔ¦śEÔđĎ‚S5ŕ° ź0&Ŕ—ŔĆ’ĎqJ» :c™$|©¦Ë ¦`pĂ6Q(Ąą_ň R ˘G5ąš.}Ćĺääŕí·ßĆM7Ý„çź;vě0•Í`0ŕÓO?Ĺ­·ŢŠ#Fŕý÷߇N§3ÝŻz˛iÓ&Ü˙ý¸îşëđÄOŕĚ™3¦ ýő—”ϢE‹¤´čč)ÇŘSd9]&Ŕę=űĎŕ»%›°űŔdĺˇTŁő©úźŇn‚ŐR(©pNż‹ú<‡űÓc`b'ÜŮäJ,ď÷Aľ#JJJpĂ 7€†’‡ ŤF+ŻĽéééăqăĆIBąM›6čŐ«—$@)ĽŃh´j•+W⪫®BAAnżývŔíÜą3Nś8!…=rä¦OźŽ_|qqq(++łJĂ]<í.’ś`ő–Ŕ+˙·˙üqBj!Ho„ľiJc1uĚ\ÓŁŤOpQEX•Ł\Ěő*"ůŹlŇß꾯x|őŐW¸páŽ;†ŠňjµZ¬]»ÝşuĂ˙ţ÷?,_ľ\ę±R™IřöéÓGň»ĺ–[,ŞńřăŹcÔ¨Q’0§=ôZ´h—^z óçĎ—Âfeeá§ź~BŹ=,âşűÂw>qÜ]3NŹ 0&Pľýn3vţvAĺ„/e©<ŁFp‰Ż}ý+ö§źŻRÔžEż1bą˛Ď$®ôĐ yHßÚ#{9ÄÎť;Ą^«,|©8łfÍÂ<şŠÁ›JI˝ŕäädlßľÝäG'yyy8yň$nĽńF ˙áÇăďż˙6ůQz$Ř=íX{š0§Ď@@Xűó«úŃŔ§˛P/ů˙¸iżŐ}ox¤…ôĨçĹ«!†C‘¦ę…q äCCÍŐqˇŢodd¤ÍŰůůůŇP±ůý   4lŘ47lî(,ąĆŤ›{ŁQŁFaičYˇđĽx¬ü˛(_0&Ŕ€=BÂTbç¬čýV |Ʉݏfˇ˝1!ô{_)ŽÝĺhٲ%öîÝkžZ•––˘C‡Ňđô®]»L˝ÖsçÎaĎž=xá…,⤥ĄICŘ´%iŔ€¦{´G¸.zĽ¦ /ťx^ÄWÍ‘Ż™`DŕŃG®µľ˛0Ö$UĚUŢ1°kŐÖ;U?~<6nÜ(-Ž˘Y$l_ýuiÁÍ÷6kÖ S§NĹŃŁGqöěY<÷ÜsRŘ\ČRÉ1qâDĚť;«WŻ–X}ńĹزe îĽóÎ:Ż÷€ë9gČ@ čÚ) ˙y$ţó ő,Ť0„~M«HDG¨đü=× ej@Ş®WęŇ˝{wiˇ- š2eŠ$\éśVD“Ł•ÍcĆŚA»ví R©Đ©S'üöŰoHII±*ď[o˝%őśi»’R©DRR>üđCÜu×]Va=í$–i[ŻÓöt®>”> U8ăčKŠć ť‰îsqhqC ťť ˝ľbîĘç é`h‡¶Ę#ž€ňňrČóXâđąŕúedžCQ©a*1Óâß}Gß![Ďť˝ËŇ®­ˇýÜÜ\1§„řřřZłĄ­Lô{פI“ZĂz*@ťAK{®ŞVćđáĂřő×_A­Í]ÓŘ<ݯ꜉S5 ľfL€ ¸›@Ľ±‘a~/|ÝÍĹé‘p%iKřRúô‘jŹđĄ°´Ňٛ—ĘPgX­Vă?˙ůŹ´/‹2–mxž6mš´”śĆůOź>-ݢĄĺcÇŽmŠžŃĽüůD3ÔX@{‡j¬¬nÖ‰¦iäÖ­['ĺ´ŠzŲ‹‰‰‘„4©ŁNćăüŽ&Řť‰c.€iś<×LŞĘH·¨+ŽV 9j@r8úaoťňćď­ß~eŃśOţ¸ ‹Ć<€MÓ,ü˝yÁď7éמ·˝Ď[ |čÖNÄ}!ęDWW\úş2×TB«oé뾪?ŧ{aaaV÷ě‰cž˙üaęŃ8 tg•‘WA;C®îâ8ş‚łîJć\NŽ®‚^°g§4ä¬5Ó¤çţ±o^wC­…8“•ŹĎVlBq©FŇg<˘Ňt­í Ŕďť ĽĚŃwČÓ« ˝Â#Y{UÓţ+ŇV";ęáRŇvÚlMËÄĺŻcş—ššŠóçĎ;GNźŽö~Í™Çás&ŕŹhî·ÜĆ.C}ąĄz>[u;w±cŢś/¶=%-O»Žeb÷ńLĽ|˙[ÁŮŹ 0'ÔŮ*h[eëÝ»7öíŰ'Ůb¤ž,m¦¦aaš[íŰ·/V¬X!E[ż~˝´´ś–—;ÇVŢěÇťŔ@1×KB¸ŞűWçÚ•Ě?őá2. _9ţć}'qŕ¤oËÄÇúA€öľ{ęĎ›˝Ú¦ůFR F+śixŤÔ‰‘™(r“&M2m?˘ˇbR3FΙ8RDţÇŚŔ‰Ü‹Đ×6 ˇĽ´ÎĽŠMcăđéŰńĐŠ#Ö*č ĺx´ßč™Z»âŤÎZKp° JÍł°8§9Ŕg×cĂĹýV†ăŮ6·!)´rŤ‡E`ľ`L>ˇ K§ÓIĂÍQQQVMB_=4QŐ9§jtÍsŔThhž5aŮzB|ÇOžľ(¦cžýůGě>Nź B‘VGŹCb5ÖbĘÄű•]R,„pâě\µ?ĺóUŘzŕ”4mN`îK÷ ICë÷‘Â<¶ű3¤—^€ÁXŃë&Ó;?€Ë˘--ĎČéń°LÂwŹľ2ěIío¶äK]µW‡ ĺJҶ[—îWÇ™8r~|dţLŕQ±’y{ćY”č´’đĄş<°|1Ě[™×/\Ľ_iqńv _ŠűÂčÁ’đ Q#ŚĚ iú䝪ľ»ňOŕXÉ9“đĄ4HÇíÇ+¦‘čš`–Ľ:mYľbLŔűłÎ‹ádË…T%˘|8; ť“­•ĎŰ“fŐ0ŃaXóţCXşa/ĘÔ:ôé†öÍU fş.Ô—"*8 ŵɏNňuĹ×|Á@%Ŕ•,řŚ řęŃVííŞĹ\p¨XĽčN§˝ß‘j_°Ey¶‰J…ÎhůQ  F‹dw‰ÓbEŔ'† Š(W† xŔî˝,TJŇ߿ł,ZqlnŘ{ź'Ţx*ý›UęAwg±/aÂ22@_éţďĎß0kř­¸ąqßJO/ťek đ¨X•]ˇFČşP€ĂEgńA׉^*g[ĘJÔ(Î/ALBBĂ]W\&>teuŤ™¶ÁvîÜ:tpKuxÚ-9&PwîýadXćeMWć—JBţ9Ą%+ÔÚăGˇ ˛ţůřˇ‡żkŞÜk‡š„/…Óő8«ľż.¨)ßóc,Ů»Ú?€‰ýźÂđÔQ8°ý˵)((Ŕ>;vH‹-Â5×\G}Ôĺ´)î»#'Âꎀچ’ŚŞąÓÜlZl|Uo·]‹ŤI°ęv‹Ô•BiŽ/¸’*«±©L¤•łH_ć Ĺă2¸™Ŕ‘]Çńćřé©>1d ţ·sRš»ľpÖ¬Y’†FĘŕÔ©S0` „ŰożÝ"OG/|ămq´Ôž (ßOĂŰëÇgŰ·X­t–«ś(LsÚrJÚ¬+śJĚ»Ţضz¤ÚV€a+®Ł~×´l-ö[˙|ŚîÚĂѤ<ľw\«zYąíŁ›z$?NÔ»–~şĘŞÁb˙Kţ˛ňwŐ46ŢvŰmXşt©«IqŘe‚śp©żý"ONĚ몄p›óĎvü*L’+s÷Ü1öŁĺËŹX#¬…ĺ–•J‹˛®ö°Íßäčh|yËť¸wńDŞB$E´«mb’yQ˝v>ˇů¬ÍŢ-ĆâőP‰íP´EęŃ–ĂĐ,˘ˇ×ĘÄ{Ž€ąéZó\B‰Ś'\Ďž=1cĆ —“ć!h—rLŔu;33đë±Ę9+ÂÁ˘GűߍâµÁ×K„ßł+–â÷c‡Eď.¤#˝wă¦~Y{ =Ňşv¤zĂ„IŇ|tH°anއěJ}T %~č;röKĂÎDĎ·ydőŠD\É‹ăzźŔđq×cťÖi+uô\;ňjŹ®TŘÚ®N{Ł#ZŹ!9›Ă2&ŕgĹ^Úđ*Ě &-Ź ˛»ţ˙đË‘(şťőâiĂ"Ó‚Ţľr™TÂőĐ}IřĘeŁăU‰qcr/ľćPđĽCď¶xqöżĄšEĆD 15łţxWx¤¶›6mB×®]]N›{Ŕ.#ä€ëRÄnŐa4ę§FÇH‰ë…°Ýqö´Đµ\ąŢ™Îde¶5ŠŠv˝śđcWë‹•óˇ)Ó <*!ˇ*·×†ěŇ/_ľ?üđvîÜérú,€]FČ 0× ôCÉ}š¤a]úq)1ZMLŻ_;Ô”xPAY˘Őš®é„¶"I+’-|ů‚ ÔOaˇ ?w»PaΓĚmŇ>ŕnÝşá§ź~BëÖ®Oű°vwKqzLŔIoą«Äć3§Đ <ă{ő1 í’˝ß!b®wé^±°č’Łĺ%d­¨ˇ 3žr>2&ŕ<äädIđ:źBÍ1Y×̇ď2:%0LYúłĺţďĆ8*,* ÉđB§†Éxwčp[AŮŹ 0? Ŕ؉‹Č I/ľÎ^¨0zÎ`đc,€ý¸ń¸čő“@”ŹbÇ€˙ŕmHţ߆\&ŕs BńĹÉ’ Č,«ÜFĺs…ä1/ŕ°—€łgö(Ę/–4NŮŢ]áHČŻŰٍTÎ-SĐľYÍ -ň´ĹĽoň…@ŇÉÜ"23»LŠEř{ß]mÂéŔŃŽ\‹& Ukńö3q`ŰiŹcóMńß_éşő´Ł­ăŢZě‚bčőĺĐ íBÝ|9îl[çóŞ#đQ΢ Ű—´¦‹ž0Ůĺ}¬/ót{qúţE€?Iý«˝¸´őŔýžÂŽßwŁ´¨¤^ďřž“řŕ©Ďë„Äű‹ţDćĹB”Şu’đĄLgŻŢ†#g˛­ň']Öďlýĺ!yÍTđ’MŢ?söY…g&Pß °®ďO×ß§ äe壸 Ôj/âÖźw€zĆžv{ŽeB'„ľą# ]O]0÷Âţ¬ó’.kCąđ®TÖe ŁöxŮ1&`I€°%ľbľE@;[*ő´ť•ęJO<16ŇĽ3+eˇ96ŇŇBSVq1˘CBaP+Q® –lďĘĺ Râ¶ý°ăŹÝŘľv'4b.™` `~ €OŠEŰ­,„­2D‰V]šCĺ]·UQ<%¬ÉP‡V|HN¬ ĺÝ[[M‹‹†!¨ű+ŚŢ§Ç \§„pPą·F÷ÁźwŻŔűŹ~"ýÝŮz<˛3xu´@ľ¨—X×ËfçJű—ćüń ă$Ž~C{âťeSÝ^…µ+Ŕ˛ű_V&ĄßDä»â­ńčÓ. mš$án±řjÁ+÷ZĺÝ*ˇĆôčUáo ‚úX"ôGR°¨÷sX2ä¸x.EyĹ(),•ÂĽ<ň-i>Ű*!ö`őŻ‚®GŤÍUőOÔÓýzç‡P)* ßk îźű%‹JŁż_ ¬-•KóÍoŻ˙s︭…Íß1ÜüÎĂ7Ő ďţî˝Đ>©!6ź>…ÜŐą ÖK:1dnîňs u61±ÖžĚďń9¨/X×—–ćzú=č¸(”‹a^mľ{0íó˝yŢ×V|žZ˝‹ďľOŇ;muł˛čD˛ÓX®ß’˝ĹŠî2D“qě@}&PďpDD„SíŻ sqB!ľłńťĘÔ‘‚…µraaaŇŹĽłŞł¤©NÔ>´—5Ő‡ž;w?sĹŤduI­·\©¬6čQTn@|„ó˝T*ë}ĎŤÄ·ď~o±jűĆűŻCrÓFüůřéoËiő S!D¬•pŐiÄ»ńÍ7ßŘLfâĉ6ýńt˝„Žäća žŞ3Ž~ÔéĎŮřÎäéÉ8˛1xęaJťäö ěČ3wXXMzţçq®¨PzNžlK1OkˉeV ZŞŠÄŹOx°Ňĺçaä· ¦A4ľű`™ř€°±CpŰCĂĄtĺ6˛U.óăwČ»-¶iĂ!L{}ąč@QZ˘Á'ß<Öm“]*TII |đAL0AúXt)1‘Ä Ý•łÇëÜąsöł C_†‘‘‘(,,´şçŹ!bήAČÎÎŹ,{BţX*s\\ ¦ś€ŚôsX>{5 :ÝŃ©-­`.––bŘ·_Y4›JŚ…˙şŤcb-üĺ‹÷cÚĆ?ˇ=^ŮMčŐzö‘/Ý~äwČíHÝž ŁďPJJŠŰË@ ćçç×nú± xď§aBB•řrţ$¤¤Ć[řW˝ :VçrssĄßEÄîy˘<ë}¸:đěĎ|ŤŔń}éx ˙SŇęaŁ©řnĆ2Ľşŕ9tżşłEQżÝµCÚ_X±)¨â-®Z´o7žşb€EXůbDűŽhź€ĎţŢ"m'ş˝Cg\׺­|»Ć٦ĽëŠgâś~żŘ3,z¸1Ż"QٲĆ8|“ ¸“Ŕâ›­’+Zaţ\»wÝ×ßꞯxđ6$_i .¨€^§Çý˝‘ćQI% ł‘{QZ\±eHŽ®#ć—üËĹ@—Z¤Q“ëśś‚Ź†ßŠéÆC]„•ç¶á‚:ݦ("]ľÎ…SşmĐ‹ 6âűÜă®˙ľżöž¨1.ßdî"`0XäŇŘ®ARÍćz.={öDÇŽMŹ?ţ¸ë‰Š¸ěŚśđ,r¦UĂU…-Í äZ¬(ľľÍeX*öňVu7´mWŐËęşH_†‰;?‚¶\/mIú8}5¦u‹N±Í¬Â’ÇQÍ:ń#=*Wf+‚ŤčxÍĽ2űĽ:n(®ěÜÂf\ödî"0ě–ří—=É‘đ<´‹…źłß}÷ť´@UŽ%źştä°Kř82¨ ˇ*$<Ä*3RnAŰ“Ě]·”T<Ő É+N¬jŹóűϵĹ[qĎö˙bÜŽp¶,Ç<ŠéüˇťłP +E©AMyĹŢÝ×/ f[NR+yIM–YU¨zńřéňMfľ}zJł˙ä.G†vo`WÔk׹[3<7ő©dQŃa‹ŹÄŚĎĆ!9Ąúů]GŞŃşuk´mŰÖô—ššęHôjĂr¸Z4| řRĆńĘדńÔ°- őřű *.ŇÂŹ.néĐ Z´éhNŠÄčÝÓ 61A ^Ka‚öaŁ·u”墙B!hÉz‘ą#ńzŞ4 ťb¬{ÁŤU]Dš–J6ôB ĺ©}‹ĂŠËę‡Ţçź _ż4hŤehz E=aŽ‘Ď=LŕÚşâŠíPTX& `ÚŠäëŽ{ŔľŢB\>&p‰@ďÁÝ1o÷g¸ö®«1đö+ńć’—`l•‚[^Ť!˙ţcßZ­Ş–]BxÚ ÍT»KŹ "Č—î }Wř4ý'9¨é«´ŢOB9Ne-ä)R\p\őś_[¦sÔJdIÂÁżZ"DŘ+îŰÁZh›2 “Cę58­ű:!xIř’;¦YŹtí–©ˇ˙T#"2ŤDŻ×ÝÂ7::´jßüoçÎť.aě2BN€ Ô¦mz˝˙ţđa‹ˇ¶wü†|±K+fťąŹ‡ŢűŢ´@K. '+dk ˛§8é+ô2›yáńÖ7‰~˛ĺňŕÄ.hžhĚâĽEh?ŚŽźŤ^ÁaÝĽŘ»ş"ĂBĐ»}žuŤEŘ@Ľ8­ýŰŞZĺbVlŻ»qHłVŚŚB +Äl; ăná·ű}ݸž%ŔŘł|9u&ŕłWmEž0hPŐѢ§mWőĆ ¤.h݇‹2­ GϸÖR˝V›6˙üąű¸4|u÷Vz˙ űĂV‰±‡0E îO‹?JŢCYPbŃ—‡O@°wgÇj"ŔOHMtřđA_¬ÜŚď×í–”kČĹŁžk¬08ă±[&{[SÂ@ćnü;ßáôů<Óşçżö¤cćâ xâÎćÁřĽŞ P OřOŔ©s­ĄÚ|ŰEĽËE€ť Ř"@öo«ÚŔµÎżĹëöX¬v¦4ÂTJĽ:v(š%[ ؚҧůâ3Yů&áKai1×O[ZĄ_S:|Ź 0çpŘ9nő>Tßúó?b¨¸üĆŢŽ·TQ_‘5©Oź˙ü°:1›Ô¸>^? *7F“™ŇöMµ’ÔQU””ĂŐv$u–á!*”¨+µXQÂ:ˇ„#DĚe˛cLŔs¸ě9¶›rĆńs¸ŻË#řęŐyřň•ą¸§ăC8{43`ëëHĹŢ;ż}żš2-H|Nf.Ţóž#IÔvpŻ¶Ň‡ŹyŔb‘_ë&Ić^µž7J=ć*–b‚Ä*®pîŘń6rµEµ¦Ápž `çŮŐËdŕ᫞•ę®.QC]Zˇéč?÷Ľ şWźéžýű÷ÝCĎd8áčÎČθč64ŹÝŢ_lńi$Ą%ÔS6ĂÎËŢĄPW騛öđŠ(J!xUboCŃ󽱢¬Sö˙OŇíhšž 0űđ´}ś8Ô%¤{8<* eĹj &Ĺ%ČĎ.@bŞmŁďô‚L’ĘHÍĄŹąš:ťN(ǰŢ2$ßwô¬Pŕ“§ďŔůÜB–©±-ë,ÜŤË›6Y4rÄE ţÓô ¸ý·i’¦,ETe9s´…¸ ÉGj•…[ޤĎa™¨ž ŕęŮđÂÄJ[Z­ęJĹ–k5†UĂňµR,„j4H‹Ó«EoŇxI›”ŇŐj´hŘÄý&±Ńá»rĘô:hĹv˘Ů˙lÇłW^ŤŰ;9fF!v®ŞbD‘«|$­0…ďëÓ ägŠëŘł l\»Z„ <楻¬B=ř÷YÄł P< F:˝^ڍ–ĺCşĘ(#â»0|s9 ËĎ»ťŔă«–ˇP#¦Čţ/iŕ›p*żfľU ¬Âť©ý%}Ńć÷®HhŹ„hs/>gLŔŤ¸ěFő%©ac‡ Y»¦řnĆ2Qĺ Ü4ázôąÎu˝¨ŔOĄRáęeĄPçÁ(¦ÄĂ“I7¨Źéöęť+*s´‚WNśćŹç^Dł¸*‹«äŐG§ D¨POůCćf(¸ľQÜ›6¨šĐěÍ€;°vĹzF§ËŰţŘURáôéÖhza‰Ăô$K‹ÝŔ±Ę•©V–‰śŇ‹EŤd~ĐÂÓ΋;›ôý±cL n°®ÎśK= @ĆÖnOEĎÎ…¸¬U†Xx„§“±ď@WÜu{!RŁĹD«ÝÔA×áîEó$ŰEÔ›˛/OkîđB,7‰“b^% ˝´ôš+Ĺ~yWY?úꫯ¬’i۶-hĺ輻C¸¬¬ Ë—/Ç‘#G0aÂdff˘GŹB;O%; žĂű&˘R5fŻÚ†Ü˘RɨŔÍý;9TĐPĄŰö\&ýÉCIA˙ĄEY˛§Ž-âđÓ}0mă:¨Ő¸¶UÜÚÁ±ňşˇśđ ŰśÂ+_­B©P,CIľ{m,𧏶řQ«ŐâÁÄ1cV©â544Ô-u¶[޶m“ĐO(˝°ĺhîić°[¤­AF±+\¬ŠfÇ€g Č#NćąĐű§3{źÍď9zNó˝JńA-»íŰ·#8Řő9ćĘĺ”m)cšç-)±\qIA÷ďßĎsŔ6±—g|śľÚ"aٰĺŁű}ÖeďĹŤÉ˝,îŐvAÂ÷É™Ë ¶ö $Ë´r™ś!FśĐy•éŰźŹ®VKĹ?ęý˛cL nŚčßY,€ŕ^­ľ`Ţ&Đ·Cs<;j°T ˛‹ŽźşiŤŰ_]=:uę„®]»šţŞ ç¨żÝźé4Ě|ë­·˘Oź>âG) 鸽뮻đřăŹ;š/‡gN¸¶a7*>kW#„oß„Ë,ü침*\)N´ĐŤÜżKKD„… ­I<Ţß»šK Şč>ő¸Ç÷ěK§ěđ!w ęŽëz·CAqb#îř”T]WÇnśššŠ-[¶`Æ 8tč¨WÜ­[7éĎŐBÓ06­®îŮł'âââLÉĺää`ÇŽhŢĽ9.»ĚňöđáĂ8uę”´ *11Ń®8¦@|â·†‰ać#Ĺř5k'˘•áR=^Ľl$’Ă˙ŇíÔ2˙>#ő|e E¬ß#®@śĐłL®w‡4Śýá;ŃĂ6H+ _|=DÔoť×2+>2_#+zľôç/.HLTÓ,—ÝŽ‚S CG¸řcôĚ3ĎHű«hA×ĆŤAË˝›4i‚ť;wbęÔ©ŇĐ÷ÚµkĄ}XÔ'7}útiîąM›6Ř´i>üđC¤ĄĄŐGŠhăßąsçlřÖîEs‘BQaaaíý }P5hĐŮŮŮĐ ÝÂľčh®ö×cGP¬Ő IB”xŃThž•mHs´MÎü_ynVťß.™ŮžÔÓ§ýŤ°% 6C-¶!M{ř&ôj6}ŃŃ6˛Ş”źźď‹Ĺs¸Lü9ڬÎ#Řz‡j*DJŠcÖ¸jJËüž'źyóNźyžuqnwŐ /Ľ€«ŻľZ†´ «eË–xţůçńŘcŹY¬ł·ŕéééŇ0ö˙ű_) tYŘÎ1oĽń†4ć>räHIńǰaĂ$ĺÔ _Ľx±´řkáÂ…7o¦L™‚ęâpaçßHřŽú~ľ¤z‘„P™řHxEh‚ęĐÖ¶đµUŰĎŇ²s[M·fg¬ÁÄgú#á\˛Ř¸ŻCźöiČfGż>OĆJIŚÁĚ'nšW2› ń `n#`·¦mF.\ĺ.Ŕ#ˇÜ¬Y3ÜvŰmŞE‹řŕ¤xô…ł{÷n<đŔRěěŮłčŇĄ‹tŹzÇÔÓÎČČ mň—µo‘&®U«VŐ‡ň‘Ĺ—{xTg5šPţ4`ľ4]ÎĂŹňŞ>ůčkuňÓJdˇŕĘmBoŻ˙]S#MĐ Ă÷FZE%ÚDĄŞŘ ·ő€iݰąđĄúiĹÜńw™±řň‚s ńÄĚĄŇB,ş_šq÷ýß|,řĎý¦˝í¨>ôÜĘ3Çď·ź¨Úó7‡jÍ!%`ׯ ©ăúĺ—_¤a_š &G/ĎÝwߍ"a‘…VC;#€ĺÂţúëŻxçťwĐ®];\yĺ•’˛ŢĄĆ—-ĎÍÍőÄÍ—Óľä‹/ÖÇ\Ź=4·LŽ”}űí·rN]‚w*SFň„¶w÷PN–…đĄ4C•*ś,)F¤.SžüZ<Ĺ({yżś˙8şvŻřč’ŐÇJs© C‰^mQzƢăc…g?ůŃ$|)őşKŐ:l:‘×:¶ĹÉ"7_$%ąß°›‹čPrü9„«ÎËďPm›OőÔ–ďW°KÓŹ­x¦¨,€e€4J‚ŃG[śú÷3gJĂÎŹ<ňH ¶ąŁ^+=ÔC3żGţÔ“­ęOqĺ8ćéĐ|1}P#ANÂŰG T6G˝*âA#ć|}Ąnńaá8Weľ˝HĚ—ćăŢI–QÝ7 ÍŹNb53M•ĐB,˘ŠWEY `ŤŘÖ¤/*ĂĹb r Š¬Ş«=ëśÜ<§ź«]đ ŹM~/..v!߉Ęďď´Eu%‰ŠďĚĄw¨ş0ćţ´Ž„ťýěŔdăôšk®‘ć{Iý¤¬Šňďż˙–D‘6,g iÓ>­p¦Ż`ZdECÝÔÔčaZM"&!OÂźVKďٳǔůÓÄMqLĹ Y›;WaŃܲ,ĚÍÓôçsúĐ’‡č}©“űÄŘ%ßIz1¨\¤w™¬ ťßt^ŚĆ ÁTą–†Ł—-ÚŠťšKí#™żŮá^Ü·c:"Ă@«B„ýŰŹş>ý% *×ôhŤŁgł-Ň"ýĐ=Ú¤úD;“đĄż@yć裙ß!_zˬË"?oň;d‚}\!`—"Ę€ŻZX\ˇŐĆÔS˘^gďŢ˝1P¨čú÷ż˙íT¨÷H‹¸(]rüńZ·n-ÍqőíŰ+V¬üׯ_ŹřřxéŹňÜ·oÎś9# Š•+WJCÉÔ«.Ž”˙ókí’bůč±čšś˛to·žXřŻŃ0ĐÜŻŤ…ü$„«ş¤ĐX,íűžms+ž_v qŞHS°]ÓÝŰ4–®Ł#BĹ^`Ţśx#š%'Âđ `LŔ]Ú†D_C´˙v×®]ŇpçΝѡC—Ę2wî\Đ0} Ó\-™9¤ž.íńťv-®ŇIznŞî¶ő ř‹ `ßn)~‡Ş#˸:2îńŻqLŇ–Zĺ|óÍ7K˝ [ŮŢyçťX´h‘­[vůQ×–đĄČ¶„/ůÓĽ4ýŮrŐű–ýü‡Ŕ±#çńéŚ5b’Ý{µŔŹ_+ţň«ÚbÁŠ'—[ŚŘ¸DÇřŹ&˙ˇĎ%eLŔÝjŔ¤ŤJŢ D‹źHPÚrŐůŰ Ë~LŔ™gsńôĂßšć{s˛ ‘~< o0JJ.2*ôÇŽ 0&ŕ/lKÔKĄ§¦ĽéźV˙üóĎŇŞEj1˙“ĂřKĄąśţGŕŤ—–„/•^«5ŕä‰,lßrÜ˙*Ă%fL€ 5ö€eBeee8~ü¸´Böă#¨Kja$ˇŞÓjő{xľű-#“ńdëŞĐ‚U5,_3&Ŕ|Ť€]¶˝ýöŰŇŞdRĆAFČOvdŤ¨}űöň%™€Ű Tîň­LZŻ+DZňL”—pş,çĂ×=žDh°íµ•1ůŚ 0&ŕ}v `*櫯ľ*-ÂzôŃG­Jíę",«Ů T!`kťQ<˝ĺy4‹b€Ţh@™A‹ĺÂŘÂČ&ý«ÄćK&Ŕ€óhÇ )ž"ë{Ôů0`€ÉVó©Ú9MPĎ×–ÂşÇsŔDť' $&F#űBˇEAÂj˘v_4‚’J jĄşŘ€…ß—÷TH~1e4Ú¤VÚ—¶ĚL€ 2ÎbĘĎ+‘'¦LÉŠŔ÷ŽC“X×ßÚÖ:P(ś"ýW]u•¤ę†nP=ýôÓ.1´»LJ'¨ ż˙ţ»dµT?öęŐ W\q…KŕČLŔAÁ•†9äđ4,mTÁđw41h‹‡ů6zw>>|ň6´oÖČäÇ'L€ łů+Ě•š»;ľť•c@R¤µ®ópµť“ˇˇŰoż/żü˛)č¤I“$Są÷Ţ{/6lhňwôÄnLÚŻHWóÉ“'%«EYYY’†QŁFaöěŮ&ťÍŽ€Ăű.a´bęożŕďŚ3(ę߼î\ŐĽĄW śSĄ÷K…0ŠŃg…ZčGކńp$‚Ië+g‹ő†r|óÓvĽýĐpŻ”™3eL n|ĽyŁUFza€eÉľ=x°ŻóťD˛ś·qăF¬^˝Ú"}ŇŔxŕŔ—„/%Hhv9’řW_}5ČNďÁ‘ťťŤm۶aË–-’]`»á@~C€Lń žó6ź9Ť°LEvx§¬ů ›NźôJ$E[嫦©L†:Ħ‰‡ŮúqV_2´`™=aŻŞ3NÖ†Őp5]“6HZt,›d$#Adš—¶ä’Q ’‡®8ë_,©Q¦˙üó¦M›†ĆŤ+”ŐÓ˘2ŚđÜsĎI…±Ť˝üŔ†Séúµ©ç+;˝Âł¶l’/ëôřÄä*ň»4MĄŇG*`Vő“F<2Ľż4ď[µP7_ٱŞ_3&`nîŘŮŞFôŰ5ô2×vçúWí•Yß#“¶}ôĆŚă˛ěłKÓü/Y@Ú±c‡\ÓńČ‘# ]Đě‹€Z|9‹Ź¬Ş®Dg˝·jóëRźśXŤ©ćá›ÓżW»Ď<Ž­óÔ& ·ě1Ät EyššćÁ(ë‚ŕ4 âGŕhđiL{ř&)jLdÂB”?âJ\ӳ€‡­4ŮŹ 0Ŕ 0 E+<~ĺ©2qÂvxLhfޏ m“\Ş`Ďž=%űŰdŹ™â%c@ôGÖ÷\uvĎżřâ‹’Ą˘ŃŁGcčС’˝^ęŠĎ™3ď˝÷ždJ C=dŮj‘«…ăřŢ#ЧIShĹĐsU§5葞—+™¬zŻę5ÍÁÜľő-(…r Ú&´CěÓý!ă/,í÷‚S 3HÇsÂýá¸X’‡`±ŘJVąQ¤„¶\ŹŢíÓ°ňíńČČ.@\t8ÚµL«VyŐ˛ň5`ţM`|ď~ѡrÄmjL b… vŐ‘ĆÇ·Ţz ÇÇâĹ‹AŮ ~׬Y#uHiq–+®FkHć ËV1Ěýlť?ňČ#R÷ÜÖ=_ôckH­b˒ˡě,ŚYňť–bq“ŮP4łź~ăôm’Vm“îŘz˙·ĺ{”ő(IRŠĐˇ îO»·¦^^mÜšn¬ű|?K˙娧đźu{i–_»ň3[ÝöąšňńĹ{l É[Ą˛L¶ŢˇĘ»ţyćč;”’’⑊ŇO9{Ś÷|öŮgřôÓOqúôiÉr_óćÍńŇK/áî»ďv©Xv `ÚlĎí ö§}Á,€+žźę~™GÇ͆ţn5ŚĹJ©*®Ď©vhx.‰baŐŁú ›ĎÖCÝU˘X\ľzp¶äF´2\|”ăą¶·ŁOĽőPłŁ?™řŕ `lł"U÷™ń»SGߡ@ŔrĂJ6ęiZÖÎî!čĐP¶4ăŕţ– CǶ/`ć®PŁ6ż´8źýÉďŇuĐi±=¨­Ŕfš!żĹžSgaĐťj Ě›łß­zRh— ±H٦‹WÚߍcĹçP +A‹ČFH±^!]S|ľÇp†@ŚÚv§s¬ëáÎś9-ż ĐFčů¶ě#ĘbqVjtő˘Z­“ę¦Ř$ľďJIJeę‹D”TP ·˘W¬×— !Ś˙}±Ţa­ŁRĐ3ľ5 _‡Éq&Ŕ|… `_i *GqA Ţ7Ł;?ڧŻ|O·é%•.B©B”X”‰/oYm‰ŻÚEşd ‚ężá^ĹZ.×·“®yD˝PIv}Ů1&Ŕ껇 ëúZ_ŁÚ?…—-š¤Č}z× |¸äydD–#TĚń_ŰŞ TÁňdkR×ŢĐÇŽśÇęĺ;A+—qĚ^»ůeŘ˝ňŚŘ·[ąşZ!TL6IK°N„}`N€p€7°ŁŐűeŢ V]ąß—ńĘ÷WŕµĎךÍ óĎßČťŕ±—_ŹN1 ‘Ň8QŃaRÜe‹¶áĐLé\Ą †NgŔCO\Wkş€ 0&hXZ‹şXꞱrąĽę¬/PW\kʤ;úćą_ö˙’ęĘŐ8„Ű;tĆłíšâľűŃhüüă.ěÝuZ¬‚ŽÁżî˝ÜjXÚO`L€p7®3UëÚż#tÚŠETćń÷F¨ńŃ–żđhż+Í˝-Îź˙uµĐ­·P_ůÓŃC¸ˇm;tj”l ;tx7Đ;&Ŕ@}&Ŕ‹°ęsëۨűáŽ!X ›;ę+łJ1w÷?Xz B%›ů}ůü|q‘…đ%…°Ěy¶°@ÂG&Ŕ¸D€0? 4eBĹcĹd˙@ˇ®X8őĂţ=áÍ/šĹĹ´d™»bˇ;şIL¬ąź3&Ŕ€ Ŕ =u…NcmÚKÝ%Q G‘ŞsS\#ő€e#d&đ†6–ĂĎŐĹe&Ŕ@}#Pďç€I}ś3ŽĚ1ŇźłńťÉÓ“qdőˇ­;·Ä”/žŔ›fŔ®„Q¬€Ö^ʞľÉҤ±˝úV[çÁň݇ÇÇ[6˘@­F˙ć-1¤Íež,vŤiËícŹ Őň‘›TrňĚę;¤R …3—ÚĘG§‹hďÓ <Ńn]ĐĘßëÉ’nOg\jĄBŇ‘.Xěë%ý¦ĹĹĹ(˝ÜěĚ‹ř{ŰĽôë:(ĘCażý#GôŔäˇ×šŞ›_T*iÉŠŹŽ0ůůŇIxx8ĘĘ„1q’>ö@©S żCđŘ9ňч.™­ő„ó¶1OԉҬ÷=ŕaşĘG‹ľťŤďLžžŚC$€éÇ]/lGĆá˝ßwB©öwĹ*,šŮýańN lŇmš$á•Ů?cĎńLč„R 2ý7÷ĄŃ©˛xË“ĺµ'mꉔ–ŠŹ3KNöÄóŐ0¤Źť>Žĺ™ ôwČWź#GĘĺč;ä)ěH™ý),ĎűSkŐaY7íMGˇŘlľ%¸\˛wçý†űßśŹ-űO˘D(ëĐ ś-ö“@fÇ$ZˇŰŕóĎ? ,·fţő×_Řľ}»ËU­÷=`— hfŔ¨' –«šĎeŔ(üĚUuĐůîă(*U#:˘BăU€báj1&ࣞĹűࢶPŘÁ—}ź@bhőFc쩍>řŕ’Ý_ ÝüůóA–‘z÷î-{9uä°SŘ?RP!H«>˘;˘6ÚÔ­*%iNŹ`L ® d« đĐöq¶,e-ňuŸwó4äkk×ŕW×e5ĎŻęO¬ů=>ŻÇşuJCôůKŰ‘ ˘Ź+ţ‚5ĺč•Đ}:¤AYeŻpÓ†q g›Ńőř‘áŞ3ŻřüřOVy“JÜ[­ü}ɰ/µ†•ĄE«†¸˙¶~:RŠóZÄdéŃ8// «F/ÝwZ¤$HvĂCU¸¦Gk|1ązó„>T-. `H L_iĄ•J«„ĘH#¶n˛V®šđŻŰEĎ—ś1e ˇěVEĽMŁńţŔű˘¨ňŐĂżĄ("{“‹Ác\!Ęfňă&Ŕ€ż;w.®żţz$%%ą˝*Üv;Rű$SwNý……%P§gA}2[HSžžµÜĘ*‘śâ÷ëvI&%á+{Šcą„ćÂPľEB¸6GĘ5‚H˘K.ú]Q0ü™€Ţe]Ą´Ţ˙„Ń/¶ečÚ(úĚŵeÇ÷™`!ŁKÇ·ç'âÓŚŰ1çÜ” Ü’ĎłĎ>‹S§Ną%­Ş‰řŚ>tčNžwcĄG5gw ÝÎÁ YW˘Ź»ŰÖůlD¤X!m­K"!+†Â«ÉŠ˝™`!PjČĂÜ â˘ţ$ÔĆ"ÎaöůűÄ®Ž"Źäç®DÍ~˛Ý•¤ă餧§ăé§źĆÁ•Űhvî܉±cÇâČ‘#ˇâZSP !­ŠŘµucLq9>[±Y2([* #}Ă”„ŠIŕKźT« [ĐúB# iÔÝ*ťŞMĆaÍôGĐ Adgg‹^¶ľj‹k]Pw1ß»D,ŔZ.ů«1”WA[â &Ŕę’€¦ś¦ż,§Ü ĐCW®®Ëb8ś—×pxx8ľúę+Ěś9Ó4IŕěŮłčŇĄ‹TˇFŤ!"" Ţ2ů“đ%ףG¬ZµJŐĹiѢ…–ţĺçç›lÚ’`®ś˙4±ëDŽ'íŠdH%´Z‘žĺr±ÖŘÜé…á…°°jË5ęşž¸Şk+śÉĘCFvň‹Ę ‰.ĹŹŠL!|+żËO­Âőɶ‡’Íó4?§úŘS'cPc”b’)jeÎ&/ź8±§.>QP; aoűŘ™śWÉm#˝Z7fHmDXüˇ}ÚE Fşzk•V4˘exż*~ľuéu>ŢkMrMücčuŠ Żl‚e#Ż•ĹŢŚ}R“`¤ŤF¬BŽő~SSSqţüyěŮłÇT?ňOII‘ć/«‹c ,Nl~)ő¨-<ěĽ O/ś,ĚíŚflČč ?Ů9“^›öÍú˛Ď A\\ńá˘8­ĂőÇÚŘ]>yž\«Ą•Ö5ĎËeőő#}°Ď@Ŕ4 S.V¨;óŚřb[ąëň•şń;äý–h júóç« «Â"ÁÖ·o_¬XQ±‚mýúőŇ—}]őîÝűöíĂ™3g$A±rĺJĐPrMqަh×J•3ľyĘŃÇöŃE„˙7ĂŽ´ĹŁoŤ ´Şr}`uJ€¦={őęĺ‘<}˛L5ť4i’iű UMť:U@sľ'N”VE'$$ Yłf5j”tŻş8ŇÍú—ťUsyHh…&i ¤šEĹEbů±o“™ Zŕ_Ť6­ÂŔUaL€ ř5 1<çÓd´j9..Î ˛N§“†¨i^¬Ş«.NŐptM_7Î8>Ł9ĆÂÂBg˘;gÝšýřěõ’ĆÇük  ş,ŃÂlá›îCZ„óŞŇhřĚŢmHNľŽ#ŇsCsÚ>ţŰM…>8išžď@pŢz‡<ĹŽß!HÓžŕëÉgŢ–|ńDlĄé“CĐć­ŽJĄ‚-áKq«‹cž®?ž:)Y;*.Q#ďÉ<Ű—C«Ňᢶďú'JÎűcµ¸ĚL€ 0zIŔçp˝l•j*˝őŻŁbk–ŘnŢC,´˘ťKbŻŻěĘĹ&ôĎOţ"_ň‘ 0&Ŕ|ś `o óâ……© $íYqBă•ĺ–_)X±Ţů-Qćůđ9`L€ xž `Ď3v[7ŚčŽň^zŻŰ„l,źŘŮmyqBL€ 0&ŕY6~Ć=›!§î<ÓAÂláŤÖ˝\UP0şÇµÂŤŻt>qŽÉ`uJ€{ŔuŠŰµĚ¶ć¶5ňŚÖQ)xµ}ĹV,×rŕŘL€ 0&PW¸ěAŇB ÓËżýŚ˝B{I·݂´°XěÝuZhřR˘gß–ú®k+J„2 Ş %´ÂĚ–ě„餄&Č—|dL€ 0?!ŔŘC Ąş¬Ż˙ć É: X2%ąIß|ʆč"Ěę„ `ŤFŹE«žD°ĹkŹžÜ‹3ţ‚N¤-L/HQčř@‹ëí‰Îa`LŔ‡đ´‡cőŃC*5eá¤3"îç2h…Đ-.RKÂW!ĚN{•U öĎÄÖ§PTޱ¸­ Ç×=źDÓđDÄ*#Ń*2źv›„8•ó™,2ŕ &Ŕ¨3Üöj­ŢŇš“2·墣«¨´<(´±sűIS čú鏗ăŘ™iČšđś)wˇEJ…şI HBřłîŹâđ `L€ ř'î{¨Ýú6MĆĚŞQ%fkm(ýÔä>2đÂç«°ďÄ9•iL˝ßÇf,5ť{¨¨ś,`L€ x `Ao‡˙.Ą#L*†4 E|ËX¨B*ŐW)• <űŇMRü˘2üsô,túJL7HóŐ^!”É\,ÄÉgP[$]ó?&Ŕ¨¤W~Îś9nÍŚ‡ ÝŠÓ2±+›µŔęűĆăŘĹ懣őŘDĚśövl=Ȩ0Ü?ńjô»˛ ˛ňŠq˙›óˇŐY[Sjj±X+\X7ZűÝz|9ő[ˇ K) ŕg?}WŤčg™!_1&Ŕę) ň“׾„ ňó0%ˇ4ě ѱ6Öă,˛E˙ŘcŹaěرÎ&aʰ÷z$„G O“4S˘OLľŃt.źŚ·LŁ“/MGZ¤*TO†ĺ—`ćSź›üédÚC!9- mşµ˛đç &Ŕ@˝#`,@”úfioié5/"Şl(ŠĂB8Úgqđ´›F/b}őÉďxlülĽüĚwŇęg[ŮÄâ+[®O»¦XňĆ8ü:oťŐmš^żl‹•?{0&ŔęPí»Bř’V„ $í?Ń"DżĐ§Q°ö`óÜsˇXµôśJĎÁžť§pĎ­"3#Ď*ÇČP+?ňř÷ż!Dô€UBi \s¤PH†Ěýřś 0&P ‰pÔ˙5Ż˝Řrb,6÷đąsŔj’uk÷KĘ6ô—U©“+ţ}öÁ«_Ľ÷:+żű®ď…†ńó#& E°ű5wĺbőô‰7{ń9`L ^Đ+‡ ńk)ÎH ‚űű4Ë_uź.Ş®¨P E°x ĚV5“ÎË+±ŞHJÓĚxî&,˙ő ´čęĆËŰăŞ.-Máš´IĹ»+^Áż‡ľŚĐP4HŽÇäĎĂ/?íĂ®§Đ Ź>s="Ä=vL€ 0úF@Ż˝á/¨ «ĹŕsŚč MŞIB÷v Ĺďż˙ŽôęŐ Z­áb1­; `wŇ4Kë˛ö©0šÍíę#(Źö|›EI«ťihY[®ĂËćáDé!§ еÓcqźçl­š˛u—X‘9×”ĂŘ‘ź   z±rškm\wsľ{ ’|wÁ©đ|Âp3uč[ĐF } Ů0*šˇ\ŃÂĺŽ?Žß~ű óçĎǶmŰжm[—Ó4OŔ˛Ďn~‡Ď]"ж} îľżÂ< >9ĄÍĂ ŽWboîE yúS”¨1nÇLě/<Ťb}ÔĺZ”Ë1őŕ<)ßóą…xeöĎxü%XřŰN‹˛¬˙ý ňr‹%áK7H áĎ>´޶ČL€ 0&PÜĺ@·_ÂtóÍ7ăâĹ‹hذ!žţyĽýöŰnĄÇ=`·â´LěŽQýĐ y^]ř›é†N¬ŚVUoÎ]‚.%0´E‹)bęxÉyśĘĎÁ¸×Ń”±ĘFě9~›öĄcć·Iéä‹aě`ˇÄŁ\[ąo„pN–o/80Aŕ&Ŕ€ Á»fÍäçç#66Ö!ëuöTʰ=”\ŁP!*<ĹB˝¤ěH¨¦gć"¸k0ô˘×KÎÝިőAxFůŁ$xIËîŘŮ!„OâŠNÍѲu#«!Hô€;ti"ç#`L€ ¸‰@\\ś›R˛L†‡ -y¸ý*16R WQ/)r!ˇ<0±łdßW:ÚŤ10ć©`,R"[ôpÍ…Ż\¨ü˘Ré´SצzS7é2&Ŕ€Źŕ°‡¨c‹d\)P­Ů~DʉćjizÚ¤›Ž|]1Ö-°Ţ\1 ]ąů·ThĘjÝ$ÉTÚ “®Aď~-qřŔ9ÄĆăş»XőŠMů„ 0&Ŕ|Ž ŕ:hÚçŰŁm¬ßuBl# Fç.©8›…ţŃÍńźöŁpmđ'b ˝e/Y˛G¨cĐ4 -äpXG J˘ÉCĄîÚŁ9čŹ`L€ řz/€•Jç(„&Ş Ń“µ7ţMWvF›¶Ť0aÉwřkçič 1ß«ÇúA§–)Ř},ĂjŘYŮY,Ş2( h¨CdŠąúb»ósôQ ®°Ň$Ťď‹áĺö1ÚĎ÷Ĺ×R&Ş=wö>sµ$çőŰŽľC^/p-ßůXKpż¸hďŻAwNúřZ-\(Źł«ĺÓŢřE5F/ŞŘbD‚— E˙çŹ5x˙ń;pÍc BX=˘ĄŤaCň¸J ĄbÁsëř&nß.ŁŁ|É………YÍYËaüíH?„Tź@qrŮűĚůz˝}‡|˝>rűđ;äë-ĺ;ĺ«÷¸¨†uwôă {ă˙ťqd¸PWŮŃjčM'O@aÔcíô‡°qO:´b›R‡ÖIxŕŕL(h•´AÚ°'š'Řťźś‡˝ÇˇI+%%%Đ_ú@°7®Ż†Ł6*..# fËÉ}µ°v”KĄRIGö>sv$éŐ ŽľC^-¬™ó;$—FąĎüź9rO­B6ĎĂçő^;˝@­Ć˘}»ˇ?ě}SŁw“¦6“ˇ~ ·őěiÄJhµ®˘çkŘpI8(…°Ř˝µéÖŠ~/aqć&ęJŃ=®%úÄ»W‹)#>aL€ 0Ż`ě vľ·Î˙Z¨Ž,jĎ ‹íxĽß•Őµ‡UJ÷‹ůŢtˇůJGŰ„  = ´ŤT—v =Ń×—‰kNĄPâî&lÜa/&ŔĽŘÁVś´r ĘÄ- _Ů}ącNć ájćÖĄÇ‘śě á+ü•™%^™Ž°]ŮPjśUŠŘEGqdÎfłX|Ę`ő…÷€lięWťST*‚‘QX€ćń ¦ÔrJK*†•5˛ ¦-˝ÁAY} żKN!źň‘ 0&Ŕęî;ŘŘÉQÖÖ† Ĺ ç†Uü[Ä%X(ĆĐ'GÂ%4]™ĺ¦Â ;}Ű^ĄYqů” 0&ŔÜH€°0_ąć:)†Ř\q[‰nißm$Z¤Ôłq\×Úlá”Đ€•?®˨ű‡Ĺ–Ł!÷ ÂÄ×ďłÇL€ 0&P?đ´íÜ46żŽyoÝŚ˝Ňš[ Złô^Ľz04k‰Ýç2°E¬„ľXZŠéC1©C/ôl–†H~6ŁĹ§L€ 0úE€°í†]+í.,,¬1…«š·ý=Zc(ľÉ`őŤA×·çú2&Ŕ€O`ěÍŔ…`L€ 0úF€p}kq®/`L€ řŔ>Ń \&Ŕ¨oX×·çú2&Ŕ€OŕUĐl†"aHáÍ#‹q¨č¬PŔaÄ[ďCűhۆüŐ%íŔČ+H ›đc`´%ׂ 0&ŔüAűQcqQ™`L pđtŕ´ĄÝ59|ř0Nť:…=z 11ŃfĽÓ§O#33ÓtŻAµ:ÚT1>Yłf  ĄŇökš““;v yóć¸ě˛Ë|¸&Y´C‡!,,Lâo«†ü٢Â~ćlżŮć!ř< Lź>ű÷ď—„é¬Yłđá‡"--ÍŞŽ_~ů%.\fŶr]ştalEÉs?üđ´ÝhŔ€6đÎť;1uęT 2ü1h‹Ň­·ŢęąqĘŇÓÓńôÓOăŃG­Vó;dŚ/l`lJ zťňňňL9Ó"-ZEŞ*ŮyźőľJJJ¤Q ą4Ô–©©©ň%˝L€ß!/7€źdĎŘOĘĹěÝ»7öíۇ3gÎH=¦•+W‚´+‘+++“¶&ŃyAAžzę)ÉŹ†Ř~üńG\}őŐŇÂ-şĎÎ;hŰýѶ¤ľ}űJ†3¨$ëׯ—F+ä sĺwźG đ´ŁÄü8<ÍůNś8QZ1Kjóš5k†QŁFI5˘­IŻ˝öšôŁŢŞU+ÜvŰmRXÚ¤xŻżţş×<0ŠN+oU*•4'?iŇ$LžL€ 8H€°Ŕ88đd*oćĚ™ţR\.'¨wX×»&ç ×[·n­/Uĺz2ż$Ŕš°ü˛Ů¸ĐţH€¬K-X°Çţż˝űwI.Šă8ţÝEZ"„ţqq "„ JKFĐÖ8Š A n ŐFK{EsD4őDC&âÔÔ?ź/(ĎíńY®W}ßA˝zŽçś×ľśűă|ßŢliiÉóř*• 6ĄŠÔlőőőŐS ÎÎÎZ©TňüľĘLĄŮ¬V1«T*¦•Ęô®üνęűďĘ]«ä Ýr>Ł!}F`”ŹŇŃd,‘ĐltaaÁíÚÚšÝÜÜŘúúş÷·Ůlzn_%TŘÜÜô<łZúsß×Ęeľl¨Ňjő«V«őkťd2é) §§§-•JEÖ…Ž!0ά„5ÎG걇&Éd,ťNŰéé©·©¤ vvvć3Ő««+;??ď$ĽŘÚÚň™˛-h9Đx:eÉŃ)čb±h'''¦Y°f˝şaJŰăăŁýüüřçn/ĺrůżëtűľCÁ pÖŕěiyŚ …‚ŮÝÝť}}}YµZő «ë´:Ő¬°”Đ]§«uçňőőµ§ŚěEÔOÍuJűăăŁ×ßđ= P€<@|š˝˝=[^^¶••›°ËËK«ŐjţČŃöö¶§G’tmXÁůđđĐŢßß­×JVýÔÉçóČgffĆš‘"0DÜ=D‹®ż€žéŐcDíç˙Ńçç§_ÖĎýn˙ŞŁŮö÷÷·ú~˙“r Ž8gZA@ Ŕ)č; €„#@Ç™V@€ě € Ž8gZA@ @p° €@8ŕpśi@€8ŔÁ €á€Ăq¦@(ČäH»1IEND®B`‚scales/man/figures/lifecycle-stable.svg0000644000176200001440000000247214520132301017667 0ustar liggesusers lifecycle: stable lifecycle stable scales/man/figures/lifecycle-experimental.svg0000644000176200001440000000245014520132301021106 0ustar liggesusers lifecycle: experimental lifecycle experimental scales/man/figures/lifecycle-deprecated.svg0000644000176200001440000000244014520132301020510 0ustar liggesusers lifecycle: deprecated lifecycle deprecated scales/man/figures/README-palettes-1.png0000644000176200001440000007015714531055367017406 0ustar liggesusers‰PNG  IHDRŕ l< !iCCPkCGColorSpaceGenericRGB8ŤŤU]hU>›ął+$ÎÔ¦¦’ţ5”´lRŃ„ÚčţełmÜ,“l´AÉěÝťi&3ăü¤i)>AÁ¨ŕ“ŕ˙[Á'!j«í‹-˘´P˘(řĐúGˇŇ ëą3ł»“¸k˝ËÜůćśď~çŢsîŢ ¸,[–Ţ%,®-ĺÓâłÇćÄÄ:tÁ}Đ }Đ-+Ž•*•&ăÂżÚíď ĆŢ×ö·÷˙gë®PG݅ج8Ę"âeţŲ]€AűČ ×bř Ä;lś âõWžđ˛Ď™‘2_E,(ŞŚţÄŰç#öZsđŰŽ<5¨­)"ËEÉ6«šN#Ó˝ű¶EÝkÄŰOŹł0}߸ö—*r–ᇟUäÜtŻ.iłĹ˙eąi ń#]»Ľ…r ń>ÄcU{Ľčt©Ş7ŃŔ+§Ô™gßxuÁ<ĘĆîDüµ1_ś u~Rś ćŕâ*-°z÷#°Mi*ËŤWh6Çňř¸ćf}î-gi:×Đ9ĄfŠA,î‹ăňV§>ÄW©ž—Bý_-·Ć%=†^ś tČ0uüőúvWť™â’9 Ś%/VµńBČWµ'¤_¶tŹâÜČMۓʟżźĺP““í\>ÄŤÉ@Á„yě0`D i|[`٧ čhˇčĄhˇřŐŕěßÂ)ůţ·TjţČëčŃ0B¦˙#đĐŞÂďhU#Ľ ~yh«uĐ fp#Ô1I/I’ř"“ä0!Ł ’'ÉSdŚdŃ:J5Ç–"sdóąŃÔy#Rź7‹Ľ‹čwAĆţgdŕ´ĎĹJź7ŘĎŘĎkĘ•×n^:}nW‹»FVź»Ösét$gj-tČÚÔťrĎ˙Â_ç×°_ç7Z ţ~ëŰV·5ë4ĚV }şo[ÄGó=Nd>Ą-UlałŁ˘Y5VúË}ąx»g[üä÷É?’kÉ÷’&ăŢä>áÎsźrźq߀Č]ŕ.r_r_qsźGjÔyď4k± ći—QÜźBZŘ-<(d…=ÂĂÂdKO膄 a/zv7«Ť]»ǰod«}¬€©sěn¬łÖá?TF–'|¦ăď3Nnă„#I?"…m»z„íő¦v~K=ÚŻĆsńl<b|_|4>?Âpß‹ľQěńÔré˛ËâŚiť´µšęŠĂÉäăb Ż2* ĺŔ (ëşč»Ѧµ—hĺ°{28ÂoIţýŰyĄesź8ü';÷Z¶9ŕ¬ĐűhË6€gă˝ď¬>¦xöRx'Äbß8ŐĂÁWOĎ«ëő[xn%ŢŘ|˝^˙űýz}óÔ߸ ˙˙%x ĹcÖË8eXIfMM*‡i ŕ  LŠ‹‘@IDATxěť|TŐŇŔgKIHˇ%ÔHď˝÷ެ Ň‘§ďYń‰~b+ň@¤‰X@Ş€Ň{ď˝w!@ú¶oć„ÝÜ­wön¶Ěđ[öŢsĎ=ĺż›ť{Ι3Ł2ˇ `L€ 0&ŕUjŻÖĆ•1&Ŕ`‚+`ţ"0&Ŕ(¬€ :WÉ`L€0`L€ VŔ…ť«dL€ 0&Ŕ żL€ 0&Ŕ +ŕB€ÎU2&Ŕ`Ěß&Ŕ`…@€p!@ç*™`L€ °ćď`L€ 0B Ŕ ¸ s•L€ 0&ŔXów€ 0&Ŕ@!`\ĐąJ&Ŕ`¬€ů;Ŕ`L °.č\%`L€ 0VŔü`L€ 0&PXt®’ 0&Ŕ€–.Ĺ‹n¸v&Ŕp‹@ll,´iÓĆ­Ľîdbě%…ňLť:FŚ={öT¨.– 0&ŔÎŔ@đČÎŃĂé © Ő¨ˇJŸŕ€=g€*w‰ 0Ŕ pçn6|>m+„jŐ•c€Č"!đú Qó–@ř„ůS „O‘űŔ@Ŕ0MđŮÔ-@ď¤|I23u°rýé€ëk°vp°~ňÜo&Ŕ|šM=Ű ęb8q.Ĺ6™Ďý”+`?ýŕ¸ŮL€ 6Zó ±ţ‰V«U[4<°;D˝łţt¨ăÜU&Ŕ€/ ŃŔ >uEIń’BÖŕű˝jůrłąmů ŔFXů€ĹY™`Ţ$P©\,ü{H3Řsč*h4*hٰ,„h5Ţlץ VŔ Â墙`÷K xltnUé~‹áű}OAűŕ‡ÂMbL€ 0Ŕ'Ŕ#ŕŔ˙Śą‡.dŕ¶ŽĂ'“…C”5K÷[*):˝öľ†őÔ©V"ÂC”¬NôkĎá«•Ą‡ęÄCަXü‹Ŕť´lńĄőßFuĘ€ZĄňŻpkť`ě _tääŕ‹·¸Đ^ËE«ŹĂ‘-!2"T‘®“ň?e č Fˇ€˙üű8ĽülS/VD‘úČËÚ'“7C¶Îô›˝lÝ)Ňż$•+¦H}\¨ç \˝‘ßÎŢ ˇh ­7ä~GßÝĎyŘó´˝_˘˛ŹűŢďĎ}Ő‘‘»ví‚'N€Á»ńýľ ä›}šŔřr•a*(RФ¤~YrX±6Ďúý€p¨Ł3‚NoőĚřmŚąÇž®řź-g!Gřz¬K‡u’Ě^mȶß_*.ň>E€>7Rľ$ôťˇ‡DzX\ňĎ źj'7¦ŕ‚RO0ĆŽkEíăŹ?†¸¸8hܸ1T­ZŞU«+W®´ĘĂ'EŔv*ʦ…Ż'§+ÖÉŰ8•H?˘RI˝“­Ř”â•ëiŇŞÄ1ő9-#Ç.ť|Ź=‘• }}®Ň<|ě?‚Rďßż_ŚtÍÓôéÓ᭷ނ֭[Ă´iÓ`âĉPĽxqčÓ§ěݻלŤßŚ@|śőÔ/Ť€ĂĂ”[•I(…ĘÖ˘Qˇ€‰Ą˘í~ŔłŃĄaTe¦Ří{Ć)÷C@ű~‹ŘŘĐV¤’ńÖßŰű©ď-\A©€m‘Oť:š7o«W݆!C†ŔË/ż ۶męŐ«Ă—_~i›ťĎ„Ŕ ľuDOČŰ­©……já…§)Ö»ľ]« €É&,4w ď?C›)ćXż]ł bíPÚˇÁŹÔUô!CZßrĽńlżz˘ú~† `4><=Ú­ĆýĚwű ĺ÷}¦‹ň ˇËŁFŤ˛Ë8|řp2eŠ]:'čp –C'näZ%W-®˙”3n!?îĺv°ďČ5TÄ&¨VÉE"”ł‚ľ‘’Žë˝Ö¶ ˙l= •9¤ťß|KĹGÂç[ćZAŁB®WŁ¤Ý¬†ßt†jG hpff&¦čđ7z÷î —.]˛CYńńńvéś8hdAŰŹĽ%´¦× –wę[łĺś]·hý0ĺv&ÄĹđv$;8>š‰ŁŢ&u|´uܬű!”SĐ*\ě[»v-DGGCÓ¦MĹzđ×_ {öě,/^Ľ#GŽ„ŮłgĂ€î‡/ßË Ť€µąWn3ČúÚÁ2tˇµ‘+fÁL (0M+“˛ťˇTăŃŻN`…A@…›ő=(F[ ˝N˝^/ńĺË—q»Ę–-«h›:tč <Ńhś… (A ůVL™»[]ŻF)x¨]e^CT4—zőę#FŚz÷„í°#x4 &IHČ]oą{÷®PČů[/#'4Ť-'YYYáD9Łąúůzŕ /[o˝Đ:đ;Ę=d~H€°‹­|ůňĐĄK?ľ‹\ö—RRR ]»völR®^˝Şř(ۦJ>eL€ 0!Ŕ ŘĹ1zôh¨RĄŠ‹Ž/•(QΞ=ëř˘$Ő<-IâĂ @® iĺGé@ A€’»Čüš+`߸qă\\ĺKL ˙–¬9[÷äny‹Ž …W†4W<Sţ[Éw0&ŕ AiMëłW®\ń_® X¬E';÷_¶śßMËąKYÎů€ 0ŕ"” xĚ1””$ÜL˛xp}á ł·ŰPůRH9©;}#o) IZ3&ŕ{‚RÓÇ Żżţ:tíÚŐˇ,ßű¨¸EţN "̱ŰIĄ‚1ř;/n?tA«€ÉÖŽ;ŕĆŤ"ü 9ÝŕČGţu/ÜţQ0[éٱ2:ٗߊvçn6Ě_v~ZtN_¸e[ ź3&ŕ‡‚VÓgUŻ^=ˇ„i$üŰożA  U«V@á <997ŐżÓ>ŰäreŠÂ+ý¨Bb ”O( OöŞÍëË;{!«éϦnÇ®ĂŃS7áÇű`Ű^{ßĺ>Űqn` µ&"ŚáÝwßň~őÓO?‰s IX§N1MM[‘X€§ČáŹ5€Ź7„šUJ¸UěĎ‹Ĺ*–ú¬[üĎ ČÎŃ»u?gbLŔ7 đ6¤{źKxx8<őÔSâEVҀÇCLLŚo~rÜŞ !™Iű†í»«Ó1®°}:§0&ŕX;řśČ4˝zč!W9‰ x—@ýšĄŕĘş4»JŁ"ÝÓľ)©™™ĄR%˘€‚Ľ+-wҲá.ľŠŁĚđ°Ŕű‰Ńé pýf:D`,gë¨ô·)°ËĽż7>Ż·ß~[Äv#+ga…N UŁrpţňm8t" ¶ÔP4* F>ŐČ­v-_w6ďľµ·@áő-ÄýnÝ\€L»]…«Ž EźŠęlgB©č”ä›·P,ĺÉ?ď=†u¤ţµiRşµyŔ7Ë­ňyA©€«Uł·FőůOŠÔžčUčÇź~ř)Ŕ‚Z-Őwϡ«°i×EÁŤ”/É÷svÁ+ĂĐű–#ás—nĂďőä â}Ö÷ćó-! Ęű»ĐČ÷‹i۬ş±aÇ([ş(Ôrs=ßęf> zĘĎG=bŔ8¦5_óL‚ą˝dťNK,L  X„ßĂü€@÷ö•Áh´6źîŘĽD+¤0Z4L´RP4I^ąB1¨ë´ä›HS˙m›”·dÔŕ2Y§wk“dIă&Aąś@ś—  ´Ă‚Űhť¬”ˇ×¸·ż7ťä[đ@ů8hZ/A©ę ĄÜ.­“ T|$<~Gľˇ@çÖÓ Ąs\©× xM§ĄĄÁ{ď˝'ö×^»vMÄC•övüřńĐĄKi3&p­>nĺŔĂvX»Ń0«}óŠP¬hř}”ěüV5ÎÉ’R d©[˝Đ‹… Ü/Ż)ŕţýűĂŞU« E‹ЬY3»v/^Ü.Ť(8ZďuäŔŁ/ś)ßÉ Ś„áwVhľššM­“ gţJŔ+ 866V(ß Ŕ1cü•·› řfőˇAÍŇÂZi·Ćc»Ŕ¸ţŹ\F¨|I ł?őSx$śK…˙gVSŔwîÜÉ“'[*«[·.ĽőÖ[°}űvi(**ĘrŤz÷î âˇęúőëPżľüHăćÍ›Âç´>a&"oŘUĎ+«/*4<L—Nłö`.#ŕ(Ş€?üđC+`E‹…ţůGĽ¬.ŕIŐŞUFÇÇÇĂ®]»l»hwţ裏˘ŁŢŠm†ü’€*-Ő¨ě ’0‰YéĹxŘ/?Pn´âSŔMčöí<tçĎź‡„„Đjí«Ü·o”(8¤¤TË”)#űá………ŮmÇ’˝‰30/8˛ű(Ě]{ Ś&5„ŞôđƨöćÚŁ•¦iWHYżćš@Š&Šnðęw@ťŘŰ’ĽđqpJŔkĂŻęŐ«Ă… běÖ­,^ĽŘá5NdLŔ»®_ĽsÖ^Ę—¦”sLZřô»u˛ŤČÎŃĂWęžp%¤$d«ĂŕzhIřţf;o\˛q&$쇣ě89×XłfŤ(1;;† ‚14#¬jHIIrĚQˇB«t>aL pü˛p7€ ý“Łcˇ„5°kă>hÔş^nš˙·ěą„ľ Up/đ*p€´Ś8y.ŞVâ}ţqRPT?üđðiÓ& â Í K¦Â?lRĽ´JŁ`&Ŕ źŔ=µk×ňr•_!_Ôôw΀=E0Y5/\¸PÔJVÎS¦LRĄŘ…›ýÇŔ)ÁBŔ¤Ëăžµ8Â4şnkPED*ÚuÖłçđUČĘŇCőâ!.ÖzĘQĺť[T„9ë®ć]"ď¨Dë6Ż•—ćŕ¨~ŤR°ý@K…Ľq%• Ś` Ň~ń1đE°´‹áć|&ÄHůę> × lX8Bţó-¨J$*B…”ď'“7C6’§Ač˛u§ĐG=TĹ\ÖWŁQuč›™ lż%ÚŽFX˙ܸŢ΋ţĄ+$ĆXĹ˙íÚş+pI›/3Ż)ŕĆŤăSx–CÖ45MÎ:4h˙ýďýB;Äĉ~N@?ă}á ŚKOt?ľ!Ż~*ĺfą!˙l9 陨ě%2{áxcDKsĘAk˝Ťňé¸nßŃkVĘ—Ş]…#â•ăˇDś˛#}Iů ř ŻYA·oß:—.]Ž8zöě)Ö> ‘‘‘?ýôtčĐČ0‹… Óíd*_ŃżÔ¸wV™?Ă+×ÓěŇ:.F)!7oeŠ‘¶´ě°P-ÜLÍ”&ń1`÷(ó—ďďÎť;áÉ'ź„7nŔÜąsá“O>ĄK—ÂW_}/^ëäŚÓÓÓ-ëĆŠá$&ŕ·T´Ö‘˛Ą8 Hb©h¬ÎÚ*;ÇQEň !=Ym‰¸" ÂRÉĘÖ+üAZ3"ŕ•)čÔÔTXż~˝lëcذađöŰo)č¶mŰB÷îÝaëÖ­bË’?䶲´]´úuKöB=:T† Ę^śÔ¬}ôEĐŘ  Á?;-:µČ΄×&+2ýLMh׬lÜq˛%úý™Ţ5d§źéŢS+–ÁÜjČR‡CIo má¸LäJęT+ űŽ\Ł)4D 9:#ôęXĹ-| ·*Íüă€eĎđ¨§A™’Ń®ŞăkLŔď xE)RDL3“Ç«Zµ¬-)Oť:ä7ÚĽ?FŔäʱ0„Â&9rČefRR’¬ŃIa´‘ë´'0ý·}pćBŞĺÂŇ5'!"\ ők”¶¤ůÂ*,B>üŚ{׋©huŤ¦ Š,ŞXÓ®? 8Í|:ůgńf¨ňr߼4G7ě‡é‡1dá˝ů1háű©k`ôË=ńąÁµ7¬§űÔăgnBęťl(W&Ú-%šz' ¦˙¶ßŞ%ßý´ ^Ţb˘1Ş P^™‚¦˝ż´Ď— ¬(@ąĄÔét°wď^5jT¬X(XĂŠ+ŕĎ?˙„|PQÜ&L€±cÇZŐńńÇC\\±Ů/őĘ•+­ňđ‰ď ŕňRĺkná†íŽ˝®™ŻÖ» }%kvMăΊ*_ęßšżXwׯ˘ ĺśk6›Ví@ëgɰﻫ*—7m´.ĎÉ9ÝhZ/Á-ĺKE¬Ü€ńČÚmç¤r^®éÓ§ĂŔaäČ‘‚ůK6âÚí&ĄK~‘éER:nđţýűĹZ´ůc¤¶Q¤¦Nť:‰uj‘Ó:uź>}`óćÍnE62—ĹďŢ%`¤9g˘ÓçY;¸đ-!Z ´mR6íľCž‚čß˝¦o5ô>[cÂőbĹÚÍÉu㎠.U^¶ÄN]ęÁá%’Ń.>¬”Q߆¸ň®×ÇŰvo;—ˇu6=Ü ˛VˇŹ0eAůöÝeë,H†ž¸N|đ8Ög#¶Ŕ&…O™@`đš&lä’®FŤâĺ#EP* !#1š ·•áÇ ëlŰt>÷-]Ű$ˇ‹S lÚuÂqŰKŻNUpýQąµUo÷Ţ„Ž;t<“[-†ú3n\šgŢMőF.›RňŠ0*ĺř1v€ČW7ët{°ľË{čb\őZđŞúLţó$0RuŐxxÔă˛÷4Yeż>˘9|1mú‘6AdDŚ|Ş„âĂ d^SŔ´ý裏>Ł_2v"/=RůôÓOŰ4MÉăĚĚL±MN@ČM&íO¶Šé[Xa¶más×ÚŁĹ/˝Qôs' ŃN Kx~úÔďüŞPçFJ†%Ó ¸ń6ĽvsJ–?6©FcŮőçŘŞŐŕÍW«ĺݧđQѨpřż—Ú)\ Ď|‹€×đSO=%¶"Ń:kĺĘ•ĹhXŠ"&&FzŞč1ŤÄ×®] 4-NĆ_ä…‹Özű÷ď/ĽqŃľä?üfĎž ß~ű­˘mᙀSęu+ĺ+ň“BÎFĎr.°éć•Üidi¸Ę”–*«€Ą·đ1`ĘđŠľ{÷®X_%æÇ{L™žäŁT AkĽd…˝gĎńNű“iKąĂ$!d­MÓŇC‡ÍGÉś• Č0eĄ {&w1¨«5ă´–Z&Ó R×űdUxźéÄ>¸®‰…,ň °€ţ¨UqĘDÉAßÓ:|‘»KŤ&ĎLž ç`ÁEŔ+ ¦›iÔIŁM_ÚEÖÖôHúĹ?€qóŇÜľŤËuÄAN9\¦ó`$É—Âp.®‡Ľ:IÖ‡¶UOřf›®AŢěŇ‹=ËCé˛hVFNś˝ sµ\ٰázeXs(†AX°'ŕ•ÇSrlA[‹~ůĺűřPŠŮKWBB+_ú\Ą)ú€q»doůťĐĎůL¶{*ܲúĘw ńhźxBĆÎUŚ|€ű?VµRľTŃ·KÎCŽA™-Z7R2`ćď@Ź{łÍ&Ü䎒… 0{^Sµ´üŇK/ů{&oXäK*dE{‚}Ihęś”˛ŮK—»m#«jw¦®<%J”p·XÎççŚŰVä†"”ôĂtt'pD«"÷”2˘®TK&‡őĺ=‡ŻY'Ü;ŰŹéŤë$8Ľv?‰{1î0ůž&× f ŃŞáĚĹT¨±Y°& ˙WoťżŔgäyЦ~É»”#SfďS®@Ë—/]ştůóçç«ôđđpńŔ!wÓ±cÇň­ÜĺĘäë>L " G˝vBU 측8 X˛ť w=ĺmw› !! hK8ţµÜAÁH ł0&`OŔk řÚ5ÇOăöMňť”ŃŁGC•*UňÝ RŔŹ<ňě}ß|óŤÝv,Ů›8O¸–śëČU"*ąŽ-*şp@űČ(81őXT´3Ş(tIŰuěŞPŮ>™nßýň™č# 4­uRmŮ{ô¨ ?˙yČ*)ĂšUäg]˛sô°býi¸}7 jaţFµËX•ăč¤eò°vëYĽD Áŕ{,®˙V®‡Ç,L€ Řđš6WlŔő§łgĎŠ©Ý2eĘíĂ%-_‘ëׯ‹éń¨¨(7nśŻ4‹ŰáC®%§Á7łvZZ´˙čux¶_=x |1KšŁ+ˇĄav±GńR®‚ú=¦;\ÉJ„Ž2KŇLY űdę4I˘%´ţČĐôšćIrŮÖ¬\Fj ßÎĆin¬˛d|ř× ¦ömRČżöűßn´L'?“—ŻÝE'UmrZź’ÁłžĽ‘™ő/*á⸊… 0‡Ľ67DŠ—qĐž[ÚLűk)ě`űöíářńă§dâöíۡgĎž@ëĽ$‹/†Š+B©RĄD5jä“… Ř4g—mü˛Äz¤i—ţ7w÷˝äĽÎ-{.Af–ÎQvKšţ§O-ĘלhX4Č=Ąś”ŠŹ‚÷˙Ý>řO{·”/•·răéÜ©dÉZîŽýW€Fý®d㯠·•řDmÉvV§w챜ó`yĽ¦€?řŕ?~<<÷ÜsŹW*T °eË–čÇWËĚĽ®ćm۶Mř~6×I}űö…âĹ‹‹6Nś8hܵkWVÂyŘřč Z%ŰJf–ĽĄ/ ‰†k])Ą{€Íys˛ÍG}ĎČÔm€ŤV2 ŽhŔéw\+nŹ6ž c~DŔţ—DĆÓ>ŕĎ?˙fÎś)Ţi¤IB ”!EFÚ˛e‹HóĆä„FżË—/ްČ1GéŇĄE[^}őU µßuëÖA«V­8C?ň_lĽxL)čüÁ BSWŽž€ë'Ď(^[ťjÖk¨¤@ă‹EČÖ›XÚ±ăŚPô_íJÔ Ű‹ËÉčP㊶9ĺ*lUt¬«Ű |­vŐ’v÷ętFH,ĺ¸ýćĚ5ęV“$ňĄç¨B!©{ÖŰi7’áŇˇŁžrË\¤[ďôŔ@Säi9nĺçLLŔW¸ţË÷P+Ż\ąiii@#][ˇ5`rA® •Ch®{çÎť"ě ůś¶ Ń6(ó>`sú“O> ß}÷ťů”ßÝ$@Cşo^AŻK8BCŁ!ułAŰç97ď欻i0yę?pŰ: ·—¨Ú #ţő°%ĘVţKt}GŹU`ß‘kąëť•<÷dC×7áŐˇęøŻ7XöČŇ ˙"ż&«EŁ«yűsŕPfŞ^T3¤Č›nÉ6Éa†jIšs«J°zÓaÁŠÖÍĎc˙čÝ•ThPz_üťĐ@¨ =na[‡őH‚Č8×kăTćáu[`ÁÎ4Ŕ Ą­ş šGBŐ–M\U'®ť»”*öÓ¬7Y\÷{¨:ÔŻQZö>ÎŔ|€WFŔ4ş¤˝´ .´ëóŐ«W…_f {KČ#ׂ + }é˘Đ:4Ĺ$6OISŤÚi„LŃ›XÜ' "÷ÁPúmˇ|éNÚ˙jŘłÖýBň™ó©;!Ů-”/ÝzÉ «~Z’ĎRÜĎ>ó÷ýVJ”ĆŁż­8*[Ŕ’żOĂ&sFşďW7î[żă<ÖáČG—¤|I~XxĚnšX\đĐŘâő-ŕą'«ĂŃ›UŚüźŞnŇ«Ľ9°6 ďQ ^Ń ĘT—ßEpíř)řyW¶řü˛Ua˘ł¶¦CĘą .{CÚSçír}IĘ—ä×ĺGáĘő\»—7óE&ŕĽ2¦)frLAAďi4śśś,F'?üđđąL‡şuëć5oĽń‘UłfÍ`Ě1bdN±‰ŰµkĎ>ű¬–ž3güő×_°iÓ&ݵ+*2ݸ@®q Z*Ć}AÓ ˝4É#Çşě{ë Ă2:¬=R}!ŻŢŁ^óZŰ=vú¦ůÔéű1´&–Ć,¦űÎ_ƲĐęŘ•Ďäý8Ú–ŢG$ßĘ€LśzŤÄP~JIѨ0 W~%ŞD<ĐË]9¶÷8„´–(ş/ÔÇ÷…ćĘ9-ćÔů[†a(ÍĘ—2jŃ›8—)ézşÜiˇ| x‘€W0őçłĎ>ÓĐďľű®]R­˝Ň>Ű_ýUXSš7„FŰëׯ2 {úé§­Fľf…KAhTLŠšĹ}*r6žť¬GnŞhůiH«{Ü<1áôŻÚdŔѡdz –BUŽ\P¸Y¨L6RJ·nçΞłš]/šĎ˝Ť …´tűuJ2x’´ŢîÖhĽďÚÍt«Q7Ő§ E"Ăp˛ÚúóĘQ‡â°ë‡‹ČPáöR ŚÜ`RálXw÷ŻtîŮ ˘ô±ť€Ó›´>JFJ$-”Ĺ)OkEŕ¨?¶ÓČ4kž’*ż—7Ú”oŢ+˘Úá4­äĘ—Ńč«îÓŽŞńË´7^ékYWS˛ ±DhőhOŮ~ĐoÇĺëibŰ1Šwr…©Ó“űK×5˛…s&ŕ^WŔ¶}"çţýű ËôÎâŚN€é깼ĆĐČGł†5ż¶çłyéNŽÔ5›˝Ľ% 5«Ácřň–Đ4ô#ݪ竺Yě·ĘOJcůşSЬ^˘ËédýĎăŃâY§­¶Üo\wLíű‚*<Ň’ćďí.:qĂ*đń¤)čťč4¤şĹdaľNŔkSĐľ‚ŰgCŔ€FTa6–ŻF´4ŐŰŻaÚÜɧNP¤ G"µstÝÖ Í’‡4N ą˝¤)g©*a&ŕXűçTmT•­’kÍ,­đŐÍĽg­.­Z©c˝Ţ'ΦŔń37q¦]Y…Ö¬žýÚ$9đpeMýV·pŕ-§ô…Á›`NmŰ ˙Ţon]¨YŞVŚł˛€¦ĆĐçYŻş˝#‘Bm(WÎś`ěL°'ÓšmČżżÉĂ Ö€fŕ› .S1/ÍĎŹ(Pü„i[…çź„±׉=ĄJu«eÝŇĐ(ë`nń¨ě«fź‚Q]ĺ•…†ž±hĎm H´vţ÷ÜešEÓ ‡!1ŃáŇEîG€(ô5ŕçë×ÝSE…CCh(„뿪Đüď őeźţołX34|éGü×ĺGŕɇk+Ňlýřç GZ*tą»N”Ź›hŔôý 0Ž›'ܱ:«Tż|@Ú«Ëúi˙!ŻOY™;‘ VŔiCZ'áΰ{ť¦.> ŻżPB#Š8ąËż’‹ÇFŔ{/µEĂ+ÚK­bă+˙úř‚ľµÎ˙zďÍŤ7`řđᲥ(=í'ŰÎŕ’€ ť¨@DŕúH;K?ÚR!E|ćBŞ4ÉłÇéąJ”ŻEhĎ´_¸ďŐ™OîC jíŘP‘Cf:Z™;“SW2đ’őhĐ€Îo]¸ĄŞ>ŕě6żK§)|ąi|żë78((¦€őz˝ŘóëĹÚµkCLŚówĘŕŢ|ľ%ě˛WJčðÔ¦Óó2šźťňRPWˇV9ş Íä/ÇÔrqjVŔÔn˛¤#ĂA&ŕ ]S4¤ńăqJ.€$::Ú­>íÜąSqçĹšX«:D­> 9& NAçz2á^«®M ZdŔܧnÓŚý„?ü÷ćxqJXÝü!Ĺú§i×ôgců¨\tPŮz*3_Ľ÷Ţ Ý1<~Ă*5÷Ę+ęÚxËꆜoÓ­ë *_ ÔĺС‹B˘ŞŠ0ča‚^¤xIt9 nĐ^ňLŔ× đŁ˘ŻB…Ô>ŤV Ł^茣ŕ\%iĘ„ťâ!6ˇL!µČwŞŐ˘VcŔ !h‰¬nÓýcQ¬ęjŤ@ó䫹ĺăC)í‹dëK, á¦{#ő{ Ş_×_˛…ĘdĐMúź?> č'˝†-Keî(ře˛y§çŃIŚPÂń‰â\ Űć NŠďôUŠŤ€ďŢ˝+ÂşŰńîÝ»CĺĘ•ÝÍÎůĽ@€ś5ĽýJ`ąžô6m§Çčĺ%ŃÔi šŹ˙ČWm˙Ľ˛T÷Óß›vž·%^Żu"ŘögŘ»LÇ÷ä¶Ť+I ‹§ˇˇY=P•TĆzžśĹ„~° ·Nţź řĹpjj*ĽöÚknă P„¬€ÝĆĹ™€,+·tvyÔ8Ťťvó–" ’/ăH'ŐČĘ,¸^nşyE1l®†ß™€?PL—+W˛łm Uü‘·™ ř)ĸP8yŐÚG¶*T9G4Ę%˝ĽĄjáx„‰°0&`O@1l_•óÚ ś‘‘dĽÄÂĽE€Ü –ÍăÖĺFG'Öuµ]q_©2őËßáś=JáÔnqÓýRw·ö±oÚuVn<ŤÖď&¨–Oő®;g”±,o˙ذý«UjĚtw9¸UQeFżČLS·5iúČŽ\/]9Y é=T%gŰš_ żÎBóNl…eçöCşHí^ˇ ŞŢÚŻűäËŤ÷šľxń"Ľ˙ţűpüřqËȶëäää퇥}łýű÷÷eVܶ#`ř}÷¬łlc1®ůô¸OWΡƴ/CĺKArçMUQúőbůźľ. í;z ţÚpÚDţŘéX´ęôíZÝĺ}˝H†tc^yöţµ2q—Tµ†•!®Ľ2k±ć6† z ŚÇv)ő¨ĘUuB%ó%~÷sŽo†¨|ő÷––ťŰQ!áđČâľĹ·>ŻYA4fĚaaa°o~¨QčŢŔ<íÚµÖ­ů)Ë·ľßăÎŐĺkî­qýBóˇÓ÷3ĺkÎtÉk>túľzÓ‹ň5gÚ}č*îÍ•¬™š/xđ˝~·vТOWĹ•ŻąÉjôĐĄÁ¸Ń¬|ÍDüç}ŮŮ}ĺknő˛s{͇üîa^QŔ4Ę]·nť°Š^±b´iÓ[¶l…  źŃŚÁĂź,'O}ۉ5TV‹ś÷JpcY‹Q{l…vIm–lŻó9đ&­}T®tÜ[͢ ű_ęą~ý:>ůˇsç΢ô:uęŔ¦M›Ä1m?*UŞ,[¶LšąČ`!pýf:¬Üp VáújŽN5Ču×'s÷Zň¨@3Ŕ:X‚ĺ’ä atjžăJG-Z=ä¦$‡ăÇÚه$gZ­üźˇ  ô«~ýR\łľvŢqRMřăiř{čŃ_µńü198É× ś»› sŽmƵŮmcvţ˘PŁź¨ÚÜĘ&AŤVuĎŐî Pm…S¬]Ç.<˝ f݇R.N#îŐę•5`ŠŚ gÎś’%KBőęŐáË/ż´tśđéÓ§-ç|ŔňCŕěĄTřaŢ^±$KËë¶ź‡7źk Q‘öOóŇr5U€qétI’ Ôe*JÎöń„M_›SbđçÉu"RaŔ Ź:Î,I­k€A©żÂü˘=!Ô¤f™{ uD3ĚQY’ËţĐ„bşžÉ˝@~ 7.Í3o¦z#űĚ’7ęŢÁ˝Ęä®Ă7-ĆŚ—@ŽF^ţ|Ýóew—ÚőD”)őşµňĄČp+;Ë®(i9Ŕ°řH6_ŔQŤ) §ĐY|žM•Ú Ťŕ®fܶMćs7 ;ŰgţýÝĘÎpłĎfóš._ľ<éčWţ 9> 9ź=FŮĘ ­gŞ{Ďá}¤|ó ĆÔíąŔóÚ§^·«bK€ş<ź±ŔĘóŕ“]K`ć‘ `,Ś9ţ ™wŕë}+ažebj8°xm0Ť4_|ńE«0¦)hÚ–Dž±š5kV¨ěő謀ńĺË—…箲e•µ6 Ô}ŔÂë:}r/>lČ;łQa¸Ţg—3  (’ŽD´/~ęÄ$)ö‡†}ÁđË« !˙ůV6 ŹńôAĐOµVÔîÔG™®]ýÂďQ'j@ÓţPWm`Użł“[·3á×GĹţďÖŤĘAÍ*%śeµJ§­Cú9ăńa&4ÍMăÎVםť1(‚ţ«çN™W­ˇÇ8ËTéî\n^}ĆÝßřxc‚Ů]ž†NA˘;{''F¬ůŃj~ç…Úť|Öů‡§÷{MŹ?Ţ|óM¨]»6<řŕBé’÷+˛@¦)ŕgžyĆňU ‡ľśáîÝ»B!“ĺv~„Ö–·oß.{ËčŃŁ…‡°­[·Ęćő— ¦ÔdĐ}:Üşą8UŞjĐB\)o]=ŽzíF„ľ=Ó.Ůś@ŁkáíÉś Ţń'µě2jĽUŞí‰˝#Ě[tB_›l›•ĎŕŚÝö›UŹČ¸oR#ŚúÓÄ*ťO”%đććy@®6Ą‹+T#žŃÚ·Ż‰§°×zřůçź‹HgĎžÓ»R°iiibÍŐśöÚkŻů„¦˝Ë]ştůóç››ćÖ;YyżńƲyiĘ›Üt’ĐŢX m.8Rł­Ź¦Ý¶ś:<Čr˛>GRŽŁĄűx-×qo=žś^ܵ±4÷ťnK˛Ń¸ĐVůRoÉ."Äk řÚ5= )ôIѵJ•*ů.ťśxlܸQö>ó´lF?Ę ŠOČÝł*UŔŘ~MŁ®{Q§űé‰×ĆÚj¸‘¨ĐϱŞ|5 «`‹‘©k·p]^UaŮÂĹŁůŹďS%Ő‘˝Ďß2R®‚)# TĄ+ń 4ąš~NŢľ˘‹C9|ÉIU´€ÍFç RˇźűćĄ+K“<~LJţBZ Dŕ÷¬´?ńëîäsbz·QÉJďŹ' l“Pćź´ź- Ŕď©#^^›‚6Wn@‡4 ¦µVý…„ାĂQŚůŽŔ}7+ŕ@ómBă)ÝÇhĽ&ŞÔű¶Ë“˛¤]'ę?!/zĄ }EŢ ťĽQ‘C áŐ ×śU¨|µŹ˙Gö{%¦ŻÇ ÄőŃŃVU庠ŀň´5)PDŹÁ&Ś›–`˙°O¸e+dĚ4PŤ ”îÁ*4¤švd˝Ą?]ĘÖ†ˇµÚYÎť\DEřꦹ†nu&ڍŮÚ—•wŢâ¬<ąôTtu8fË|1ę&ĎK­ËT…ëv‘»­Ŕ×Óp4?rÝ p€ ŃâßĹŚÎĂq/1>äúOv-†}7/@(¶­d‘˘đAłG!ÜAXD_h¶§§ ˝¦€Iń~úé§@>—iĘůŐW_­É'3­“˙ĺÂĆŕąOŔDSK7.*<T±ńnlDeh:ľď‹Â˝ąą®Ü˝™ęCꦠ*žżi}Sňa`śßűÜmWaĺ3ě^ôŘe%ŃĹ äő˙ÄHF˝ooýŐŞ{tň/Tl-QÁÉ Ť‚É7pLh +"—˝Ŕ×ÉÂúÉ•h°g#Ăj¶Ă(<µmR=súř_ßŮT>Ş8|Öęq»t_H¸†źE'J,fŃÚ&m§°W¶!Q>řŕ C¬çž{Îâ~˛B… @†NdtE Ú[ÂÁ”'­ÂŃŻš¦<óˇ|©Uj|ňŐÔl–oĺK÷ŞJ$ć[ůŠűĐGs )_ę—Cç ´Fó*]ö{Y}áĂ>üsńĂtŰDňµ\!:^QĺKu^ĎĽ Ú `#›®ś°IQöôBš{Űě”m…ăŇK‰˛Qq>­|·üţRíż÷WžĂ»išŚ°fÎś)Ţiď/ )` Đ@¶lŮ"ŇĽńcđe®ŁĐ ĐTłít:íÉFś ĹqvĹ‘(9šuTź\­ůÚî3¦­OĹu;n“Ęq2§Ż(ŕ+W®igGń~i ¸~ýúÂUaQŕ` …EžëU’€¶çăĚ>ŕšEÝé±€Yî_ąŹ·7*SrmŐĚ1?ď1¨hVomu í;~÷»*%ýhjWô{÷;Ř]ŕ„B#÷—©`J—. ´—váÂ…vµ\˝zU¸…¤Ńpa cxúé§íŞ'OXűöíłKç&ŕČńIȸy F§Â0íé7AŰŮ7× ĘsFçĐ´dG› Ó÷S—ç Z”˘÷ťş}Ý®ü”l\PHúUnŻ5č%1ś!…4۸7T-–?Ű…šĆĹJxĹ$ަ‡˘KGŠąKŁáääd4ĘÔŔ?ü öSŔnÝşIšĄüˇ9ŤŔ9ňĽą†Â!  mß‘…Są—jýO‡ĽTSÁŞIÁu÷MWŽ[ÝL“ÁłŽn„×12ŹRB[Ź|uű‘R}ö·r˝˘€ b ëçwß}W¸áŁ4ňÉLűlýőWá ‹ŇĽ!ŚÁ”ą&Ŕ€·9Ń6 ˝Äß4í;ÖŮîyg\AGŔ+SĐD•¦ )î/yúóĎ?…Aů>xđ °‚ö&yĆŕMÚY— ­öŤÇvńÄ^ c–Â#@[Xv\?ŤN.ňgĺ{3+ ¶];§L{˛7%p 8-|mĺᤆ¶I~}NŢ«öÜ8ű’Ď9a‘' ř8++ V­Zm۶…¨T©’Ŕ@‡h Rßľ}aذa˛Nä»â~ŽĐĐPařEĆ_¶ÜHÁHhŻWŹ=@é` –ŠůŔŻP bÝÄ &Ü?'y¸lÂŻ:é'ŤÝxů|{`5Áík¸‡Ľ?úr~´˛˝’mwöˇ‡¨Ź1’ůľNekÁđZímłyěś  ˙=ŐRŢ3h”U§x9ËążÂ}ý:ÓC ízÉ6ęaJ‡!P44Âß»¦hűź;wČźňĂ? tLBŁ^:ß±cPĐ‚^xŢ{ď=E;énáäť‹$!!•Ż»Đ‚0źî›W0Ę .áE =ąé)’‹W \J»%”/UJĘ—dÁ©p$˛¸T¤|IĚ÷ý}ńě¸vÚĹ]÷w‰<;ýŇmüŘi8Ěč4ŞPďţ ô±»ßß±h&‚Ľ|‘ňĄ5îOď1ö±¦úTsUŔŕžü"/Z´ęÔÉő±űüóĎ ĺvŕŔ12¦€÷ăĆŤŠŚÄÂü‚)_é>ń›Îó‹¦R#Oˇ',Úc+Šjt Łą’ł}‡Fľ¶rôzDSX¨Ţ@ôs|)ĂeÚ¬qźşcoů­0^ż+^1|óćM1Ę3fŚń’á­˙Ňš/9ŚĚÝDOÖŃd‰ěNř>żŁË HŞâĄ±_ôŚ/t|Ďâ]%"˘ĹhKZ+ą3¤­7®„îËÂe[!?Ä,#P=YŮüE¬  »K±5`á’tę”·Ů|Íš5"­sçÎâťţ3e ĺĚ J@˙Ď0n^ €ľ) ‚ş˛rS|Z jŻŁŘĹćxĄ¸ňĘwm:߇nc°‚Żö­†TŃ!áđQ‹ţ˛ůkÄ%B‹R•aÓŐ<—Ž•ŠĆŁč*.™–CźČ=+Ö‡?Ďî±ä‹EĐÝĘ+ ‹ ”fÝpÍZŹkďcŔ w!á+ĚIDATŘV9!˝Ł7ü)Ůi"k÷ uaPő6r·yýúżë?/¬›)¬˝©r Ź÷QżÓ^‡ă˘BĹp±bĹDµ—/_†ÄÄDqLĆXĄJ•‚ÚµóS„ .(ěź‹~ńĄ " ˙}w¬˛ôX?í˙@;řmPWkdIóäŞXIywNn”!Üă®nŘT1ň?¦žlC ••Űqž[;]Ś h{N:†˛˝~6|×î—AŮÉ˝#)_yŃ}ôNëÂxŠIíD(LźTůR¶Ôś 8wç*ĹNîşżd qZ2%űĆ–yđI‹PQ¦ľÁ˙LµD4˘,;·ĎŤ09ř’ġ#ZŰ^znŻřÚ$T˛ţfqM@±)č5jY/^ĽX´€¦¤—/_={ö´˛xž3Čđ e^#vÝ\ľĘ¬ E˛TůšŻęWĚ6*ň® /šN@Óˇ+ßű$ĽîňQ µ[R˘$F<˘©dÚ"äJ¶ŁŃ”VrźP¸ԵöŇQW·Áňóű^˙ńȇé÷›HŽ8¤Ę×\ŢqpÍ×čý*®«[Y}á m’OśÓÚöŁh…ţľXůş÷‘(6&ĺK^ýuX˝z5śC€F®j-(OŮŻd5}¶.„â–î9Ĺ™^Ůűś©v]ťłŰdÓ©ÔN{eęşBŠŹËض×^{ &Mš$ ®:vě+V¬°L5“e4m?z衇`ĆŚVŁâŔF~˝3ž>†­ËÁxŇńSüý•îą»)6Żaăb0ě^ëąB”$Â6č€ë±kXü1×<4ČAîŕK˘=™k/eg÷‰m"Ţ °óúX~n•˛;Ň ×q 6#˝lś–nŚ®]I˝řňbşSš'·ŔĐô§+éT¶&`Ôh»,Ý\[˝–"xnĽlí^Ň®Ŕ{ ĹÂ"ˇZl»„ŹUić쑇ľĽCQqŰJ—rĘ­UŰÖĹçĘPükäČ‘@/[ˇ-J ‚¨¨(ŰK|î„€~ÉŹąëŽ8»9Ů nÚ ýü>ď$wá%ŽîĂĚđ±×áp=ΰt:„ü÷GP9ř1ńD+5ŹĽ¦LtpxÖ‰ń„{<+b {˘l.”/­­fáY-Î:¶Q8ĺŻUĽ¬bÝúx×b8xó"N «”賨Ժˇá+‰ ‡¦Ą’`óŐ“–l]1P=Ĺëu%4ĺ™P$NJÖV‹…FB¤‹ő_*ŹöäÖŹŻ»“ĎZŠ'EçÎúď6lăÄ}aŰ´˘óOn/Ű<-;ę~łQOłe>™Ą­SŁęvňŃĹ-ő;;řˇăĽú1-OyŞĹ”†!5Ű:ËÎé~F@qěŚG‰Ę;8«ĎŰé´®-'ôé®ĎFĺ›»žNʗĸc%ë´D‹_×?pîÖá‰|¤…ňĄÂPů Á50Ăšß@‹k¦J ěCľ©DŃ~]ćŻč”âZ…Kĺł=Káűv])IóççB!÷ű?-kŁÇ§Ä¨\ŁLGĺíOľ`Ą|)Ď*\çlŤ#ŮŞ±´ĺ˱¬Ăµ^©ňĄ\·rŇa*E UčLčAŞ|)_ŽŔ§\#jălŠIEKmRľ$ôpABžź–áhź¬Ş] ­UŹoő„«,Ż…jBáçn/8ĽĆ‰ţO@Ń)h˙ÇS°PEÚŰ,÷Z·nś={Ö­JLÉ—ÂlÜşáhĎ”|É­ű˝–én*¶łuuřăfşrĆ:ŤĎ'p­zm…¦^oŰ(eŰ<=ż‚FC4Ň– 9ž¸Š’\Éĺô[8Őj= 8ż”îJśMqźą“ěę68áÄQ‡ś/iň eëŔĂ€–ŘçdęsŮľÔX+đńSücÚż'÷jßľ=T¬XŃ­¨Jŕ´aN–u^ «J–łN+ěłhé`ô[Q%>`›Äç HŠ)i·î‰®cňĎKŁ\[»©tśţ.벧tź×nĄBí,iŔ@š§š“ř¶•‹–”fł;v6Ş®íz+Y<:đ08ŮŞŘłyv9ÁcX{ Ą˛©+TuŰľą•ĐHéÔ­z:)oOµ˛-pŻtUD$hžy;73®í®ÓzŽŇâv91á´žnÎg3¦Żxö®—»E\7MđÇĘŁ0vâZxű‹µ°eĎE·î ôL}“‰µJi?ßjÔË­éç8­úř_ßY^¶SŮŇ2ÍÇ-JW¸¶JB#X’!5ÚB‚ڦ ťqÍ—Ä|ß#IŤˇrl)‘ćěżVeŞb@|0•­ ?‚Áč] ­wL¬i•Ą(:˙V«˝Uší x×nĄR:"ş_gi˙řXYÖó>ĘÖĹĄß'íÁXŁ n\U|¨+Z˙Ügń»]ę×&‹p}P$4őZ»U¶nÂ(\Ä»nÉk7Th Ş®ć:lŰôßöÁ™ 8ő}O–®9 áZ¨_Ăůúˇ9o ż §÷‚űIëÂuŃzŘ•P0,^*#×΀™ťźĆUŇtŰă×0Ŕü^ I—śu*Ç”’u4aľźK´BV—q»†î«âbí×|˝˙·qoX{ńJąqŰŁRée§Ç´ÖKVÔ[Żť®ÖŚĄ…LŘ»\L˛›­7®fŢSĐîxµ’–ĂÇL€°öłďŤ„^>.޸R ińŰ­$ă-©ň5ßhXżĐĄ&c©ň5ß·aű… WŔżˇ˛µ•ł¸^y=ă¸ň{<ĂC Zë$#«v‰ňß˝ú%rGÁ¶uËťW/–ôĘŻ´/[č•_iVú —»r8ĐŢdr+)•żÎpiĽ%ÍËÇL@J€§ Ą4ř¸đŘü¨YbmÓcI6ŘţšÓuzűuhóµ`~§}˛6vRv8ś1µËd dŔ¦Cň:îh?qŢU>b® °v͇Żz‰€ §ŞŐŤ;ĺ®KęÔ>‚ÓŇ.$D«¶MĘFc­©űw÷Íéy]ńřĄ~Ó'ˇďaąhAŽÓ]wFżď„R·pŹí¤«ÝČ]đ,ĺpß.9ÔĐJ”0ąÍ|Ľjó‚Ęw5ž‚ęŹß·:Ż!e‹NŚ{ÖDíŁŁ¦˛ĺ¤k›$ô;®M».@x¨zuŞĺʰ#ř’áö (ZśĐú+ŤěHąĺqŻMć|Ţ~צS˛ÓEµ§qŰŐVt”1«ËóŠ5ă­ĆĂg»—ŔqÜĘTĽ\ďA ă,&P¬€ BŤďQ„ĹŚÖ><€^ů”öÍ*˝XňüwŰ‚Ľ“{GŁÁR÷ \:ĆřýÔN+ĺK·ÎĂŔÍŃĘąĆ}őYzfŹEůšŰD5¦Z Ckµ7'yôťÖ€ßDKr&ŕ <í Š\đA©÷F†¶M»śáÚÁŵĚ;¶·@:Č…/É%´v$ŽÚď(§1Â&Ŕ ¸°?®ź (DŔ™EqŤX×–Ćuq_®­drp{ĽďbşŹö _BźÇäZIiîÄ‚ąIÉ$%«ĺ˛™€Ç°öJ. řWt·sťřfĂžER\H넪ЪtU‘\/Ňzđ‡ÍűÉŢG7üÓ×#ÖüŻlš ˙ž Çnˇ U…„ö3w+oí†"(u±IS¨z.– Ü7^– ĚČČ€#GŽ@ѢE!)) -kíCI˛ó!đy?v«/‚[ŮiĐ6ˇşŰk¸Łëuëá}裔[†Fä€cBĘ»Ű˙€ďÚ=# –¤éž:~¶F;h‰kÓn^žłęË8ńT˝\đ O0ĆŽkĹďăŹ?†¸¸8hܸ1T­ZŞU«+W®´ĘĂ'LŔ t.WKDĘŻů’nT˛˘[Ę—¸üqz§C<ŮHI©†Î;úˇűIVľJR沕 ”#ŕýű÷ĂŤ7,<§Oźo˝őtęÔ ž|ňI¸sçĚť;úôé›7o†úőë[ňň`Ž „ŘD42ç2űw6źó;`ą‚RŰ~řS§N…ćÍ›ĂęŐyů_~ůehذ!|ůĺ—0cĆ Ű[řś 4L4 šslłwŰ´Tt(+ďŘd4*xnít+.´~ÜB(%S{ÉŮ˝¸Ö|E¸ďŹÎGh;›’˛ăoľzBL«?‹Á&(Ö/ (VŔH-55FŤ˛÷¸4|řp2eJA¸ň=LŔo čq/íłh@EnÉôžäspť\ Á€ ®$ÚCŠÚ6ŃŠ\Ý_kŻ˘±×•ŚTáźyçŤ3°Ł8MĂuoÚŻ«„L>ř¬˝tDMuü}ń0LÇú"ĐXŤ… ä—@P®¤ĚĚLĐét‚WďŢ˝áŇĄKvěvíÚńńňžěnä&ŕÇćß*)_ł¬ľxäÖ/9»ǻ֊ď0FV˘čJJČÎëgŕRú-«ŕÔćż±­JČUÜwlVľT>ůĚ&·”óNXž)Q7—‚RÓŐÚµk!::š6m ¤hżţúkŘłgŹř”/^Ľ#GŽ„ŮłgĂ€ó“ç^1'ŇtYVJŤ˛…ŕ4kZN–“;r“ÓuŮ6ę7÷ľ;2÷ą,ÔĹEjgÄ˝¸Ăćlä<“Ň•4ěźíz¶ţm´ga!” ¦•IŮNž<Z´hŮŮŮ ŐjáÔ©S‚áŇĄKĹ5š‚:thA¸ý=:śĆhŃ_6Šőî\ťrhŤ)Ňé{MŠ"¤”ńŐ»Űőq4úR˝n¸uJL}HÎĽ /®ź%fh­ü‰Ş-ŕáJ •ę—ëczőę#FŚz÷„°vAńîÝ»B!GD(í$0ý(=˝j˛ŐQu:C›)Řńá„”¬t¸«Ë„2Eb!•°»B®(iZ¶DD4„{Á8‰,¶I1 ‹tË[—»ýp–ŹFŮ—qí9:$â0"Kđđ´v˙Ż*x[zZľ|yčŇĄ Ěź?ß’ćÎÁÍ›7ˇ{÷î˛YÉëV™2edóůS2ЎőBú‘’Ęć+'XKřÁq\x$*Č|·”Âóy3DY +9ʶ@ßď ŃlśiË…ĎóO€° fŁGʆ*U޸Čářą˛üć›o_”¤~őŐW™˙8I>w© =NßK…ö‚Ɔ‘&ń1`L č °vń7nś‹«Î/…„„ëjç9rŻËKZk$‰ÇiÇUšZ¶f÷’Ęí! $JôĺüÝ›0×V3pşµGĹúĐŃ ÇÔ2‚Ł˝«4%Ü.±ôNRv˝’,§\#¦hk ńŐtTˇ´c %xs™LŔXŰPNOO‡””(WÎ>$›MV>uB oRc(.S‘O˘ˇ M۱ŚĹő}}ó/–›<ĽN(V2r%´-čĄ ?Y˛,8ą®˘ÓŠçjw´¤yň€–†ý3Mě!¦=˛—÷ôťëI©ż'«á˛@ŔĘmH®>˝ß˙4hŕ* _sĹdýO‡`X­öP$$ĚŤ;8‹3÷ţeu‰öž.:ł2PÁş’©‡ÖZíËŐ› Â‘Ä TŚJČblÍxň%!…|án ěK>ŻDu\&đ{A9ţüóĎáěŮł?ĽcÇŽŤ‚_|ńEqťüA2Äa^NdŢ @–ĺŽÄvĎ­mžŁě÷ŞP1*łěa»öOíˇ­H¶y¶íäs&¬‚R“ç«_~ůŠ+‰‰ÖNČ/4ą¨\·nťřN„…ńč-X˙8|ĄßÝĘ×I˙¶jMéGá6WŇĂîľqÖ*‹ UrBd¬Uš§NZ–©żŰ„$¤}ŕuöí©ös9LŔŰ‚r zÎś9đŃG E;hĐ Ř·o8p@Ľ(=66ÖrN±Y@ah›Xú?ĐÔŇ„˙vZÇa–sg JT„ÜĂ+•šő“žzôÖýÇ6é#Ę$źĐńáŃđmŰAčČ#ÄŁőpaL PĺX­VĂ1c k×®đÔSOÁ’%K`Ö¬YPˇB…@ů\ąFŕQ 8ߣb=1Ąěn䝥¦ď2]Iĺă]‹áűöóĺXCzżÜ1ąťśŐů91íˇ Á)č |Ć—ĂÄ×™€ ÔŤ5‚Ý»wC­Zµ nÝş0sćLţZ0ź%@^ĄÜUľÔ‰ýÉěúB\×2Â2WF^ł"ŃđŽ•Ż™ż3Ç‚r,EQ¤H4iôčŃC[)ĺvRZ'3oHŠ…)EL_s}ٸ&ĘNQĚ<řť & KÁ“¦u`ŠŽTż~}é%>f~Iŕ‰*-„ň%Odô"yˇv'umĽĺ—ťĺF3?$ô#`égV˛dI;w®4‰Ź™€ß ©ŕź»Ž„Ĺgö˘­l pUbKűm¸áL а´O”űĂ$hVi÷“’ęř 0|ŕ)č|Ŕâ¬L€ 0&ŔŠĂ’%Ź@vv6\˝z5ŕbOçő°ŕG¤€K”(ÁŚ%ŹŔíŰ·ü%Đ‹%ŹŔ”)S WŻ^y ÷y¤2ˇÜg|»— h4đÝeň‡5xňŮݦMxöŮg­/ůąUĄ‡˝µk×9 űîW¬XQ¸ťe'<ÖlčűBż3ďĽóŽő>ó(~Ľń(N.Ś 0&Ŕ€{X»Ç‰s1&Ŕđ(VŔĹÉ…1&ŔpŹ+`÷8q.&Ŕ`%Ŕ ŘŁ8ą0&Ŕ`î`ě'ÎĹ`LŔŁX{'Ć`LŔ=¬€ÝăÄą`L€ x”;âđ(NďF^ŤŘ­ =kňŢŠAë#"ě/qJNN¤ĄĄA\\\SpÜő7n.ät‚%Ź}_H˘˘˘ňůČăX{)Č`L@žOAË3âL€ 0&Ŕ¤­ůě rOAÚV÷C˝É—yzŽ6+`ϱôHIsçÎ…ÚµkCXX+V {ě1¸xń˘Ë˛ÉqúoĽUŞTŽĺyä¸yó¦Ë{üíâáǡ{÷îP´hQ(R¤4nÜV­Zĺ˛éééPŁF ¨^˝şŐkřđá.ďó§‹:ť&NśÍ›7Žó۵k۶m“íž={ŕ©§žß±¤¤$x˙ý÷eďń· +V¬€ţýűCtt4ÔŞUKp’ëĂożýfő]1w(=eÝşu V«aýúő˛Ý›9s&´oß^üý5mÚÖ¬Y#{gpM€°k>^˝şxńbxňÉ'ľÜ˙üó|ţůç°k×.ˇx(˘Ť3yë­·ŕ÷߇˙ýď@eś9s:uęň¤š’’]ştŠ\3eĘX˛d $$$.ÄÇ™8pŽ= ={ö„ÇÜň"%(B<Ţ{ď=ţ<ôéÓJ”(!ŰaĂÄC*ýMą’Í›7ń‘~_čRMčuČ!nýN‚1b 0¶nÝ Mš4űöí 4,ŢíţHłřnÝş™*UŞdŐšyóćŃś˛ źT­ŇÍ'ř`Â'XÓÂ… ÍI&üń÷,_ľÜ’ćĎÓ¦MýŮľ}»ĄwîÜ1a¨4Ó‹/ľhIł=Ŕ‘§¬m/Ä9* †Ą4˝ţúë–ţ—ČČHÓ|`Ił=xçťwL8“`ĘĚĚ´\7nś)>>Ţ”••eIóçT¸¦xŔd0,ÝŔ™!S˝ző,çŽ:wîl‡G—.í…^0áĚ€Ëßs§q&É„3&ćSńŽ3u&TŕVi|’?<öîóŽËÚhjôűďż·Ę YśS¬[GBŁŠűĐCY.Ó´YŐŞUaٲe–4>hĐ Lš4Iřć›oÄ´*MŻšĺÚµkb>uřN#:úľ‘ŕO©ĂŁFŤrÚ5ę;-s?~p$ ô€C¶Ä5äîÝ»âobüřńF®úGßówÄś—ř/6Š4É˙;+ŕü3óÚ´ÖBëş/˝ô’Ó?úcŠ‹‹łk)ś@QŔ¶ťŁµ+ú!%Ł3ZŰs&¤€qÚZüp|öŮg€ÓµđÚkŻÁG}äěżMź0a´jŐ –.] ź~ú)gNu§©íľ3±±±"ëőë×Ýâ·iôFë·4KĐ«W/8p ÓľĐ÷…„ÖĹi´G†Ť—.]†G‡rzźż]xőŐWˇrĺĘ0tčP·šNßz°“ ýĆĐ_ |Jű¨ô±Vé ¸ü‚ ă"2jذˇKăŤF#¬mkˇiWW†[¶ůýĺś,ľişôÔ©S⇒¬Ĺ‰^݇/żüŞU«-Z´YČ„ °h4ôĘ+ŻXMÁ:*ĂźŇČ8† ďfĎž-Śeh4G đЌ }o¤BßzŃôu ) šV&k_ńŃCʦM›ěúO}¦e›ożýžxâ ËĘóĎ?/f ČĐmţüů~ʆvüüóĎbéÂÝÎĐ÷…D:ť/=ÄßŃa/üÇ Ř ó[ĹĆŤˇGŹP§N1˘ˇ©0gR¦Lńăb{ťÖFiËN ­Óý±cÇ௿ţ'ÎúG?hLcw™¶ĄE'•AëĂ"+VzŃRMąŇ¨3L3´V,úľĐÔ| }ghzľnÝşâE#6Ó6­–-[J»/މźí5ý}‘ŇŢ»wŻ]~K ënőŇĂÍŽŃ‹fHh›ͤŃH[ˇď ‰íwĆ|NŚY F€§  ĆM±»h˝‰ ŞhÔFĆ2111.ë˘?2ž±]‡ˇ?.úA ˇi°®]»Š ÚhŐ:ëýŘĐȇ¦«Ąbţ±°}š—ćń—cš ´ !2°˘©Ó .H“-ǤTl—'Ě箦®-řÁÁÎť;ĹC–´©Ä…„–v 10OCKŻÓC‰íŚôşżS˙č;ńăŹ?Šżú˘Ń> ŮX­„#1+`ówÄś‡ÎIiÚC›ąŢxgě ĘnÖAŁ2ú‘ ÚĎK'ä¤C‡@?Ä6l°d=wîĐšU ěwĄ‘MÇ“5&őł~ýú–ľ:; ĂĘGSŠRˇýҤ„iýŘß…öşŇž_Ú ,š!IŻŃ1}g(Źôˇ ·¬n_rjěg[†ŻźÓěÇ3Ď-¸ ‚çÔwt`BKMzD\ĐŰ“ ׌M¸ž'ňÂ8=jÂV®í™Đ"Ő„ëś&´ü6Ť3ĆŇ=Űď >ČpŠŢ„Ć8&=›¶lŮb*UŞ” ťTXîń÷\˙ß™/ľř„Ž\Lüń‡ íÄľWó^gŰď NĂšđÁĹ„ĆZ&tŕbÂigc ž´ß>…úŚ ÇÎĎí-Gk–.ăÉŘ_ŽNpL´˙ś®+´·äáü u půňeń‡@ Ž^?üđh%ýhŇu|2·´GĽ&tE(ŇéÇ˝F™đ)×rÝßZ·ní q ç%$¸®'ň9QŽ 3OrÜAJ8PL¨Ź8Ől˘7ę#Q™p;šPľhC—…8úÎ,Z´Č„JâśF4ˇš ×Ě·řý;}ĆcÇŽ\Ä…řĐß=¤šĹŃw†Ląrĺ,ß7rŚ6ć[îÝ™._ľĽĺo‹:Ť.OM¸C<¸OrĚ1cĆŚ€ăáí©¨Bür˛Ú“GkU޶%@÷ Ü20˘uršz „µ_G Č]'}ţÔG9gćűéOźŚpPá˝ććô@z'«nTş@Ó¨röć~Zî ŽćőOóµ`ÇŮ ­j¨ …GúĎ Ř#ą&Ŕ`ů#ŔFXůăĹą™`L€ x„+`Ź`äB`L€ äŹ+ŕüńâÜL€ 0&Ŕ;wîŔĹ‹˝_1×Č€G°öF.„ xŹŔĽyó RĄJĺĘ•ďýúő[·nyŻ’šž~úihÓ¦Ť$%ďđ—_~•J{öěÉKÄŁ3gÎô˘E‹‚N§łşöăŹ?ŠkçÎťU«V‰ăÓ§O[呞<ńÄĐ©S'KRrr2Ě1Ăr>lŘ0hҤ‰ĺś€Ż`ě+ź· ¸A€ÚăŹ?ţ˙íśi¨Ť]Ç×Ë5Sć9Dş†kŠĚ™2‹{oľ‘[×-$S‘ E|á‹| $E|0”9„dČ,ĘPRćĚÂ~÷Ő~=žíرcuápôčŃR4ÎŁíСŔ#ţűţý»zÍżrŰ’@6ĐÎuŽIżIŕŰ·oňîÝ»źîFx۶mę5şĘ÷ďß Dáę HAA<|řĐU«(öčŃC._ľ¬"^ż~}ő®Ë Ź?^ZµjĄžh÷îÝ L ‚¸ <~ü¸ŠěСC5ĚěúzţüąÜąs'ŕ .ćřčŃ#m‚{—/_.ť:u’-ZČŇĄKל͚5KNž<©^4î{ň䉫R>¸Ż^˝z2nÜ8yüřqTÇ$ ŕlPç$đ›&L ÷ďß—Ţ˝{ˆ ˘$¬J•* ęZ·n­=câ†0őĉeÝşuňňĺKÝ u{ĹoŢĽ‘+W®Č1c{ČŰľ~ýZňóóĺŐ«WÚ˝ ¸Oź>•%K–ČŞU«¤rĺĘÚçÍ›73úŕ{÷î öfaWŻ^Őýę!C†¨Đbŕćďž˝óâ1>ćřůóg˝wĹŠ˛rĺJ Kc.‡’˝{÷jţW X,Ě1# ]߸qC/^¬Q‚™3gjčß™FY%`˙ŁŇH€ţG6nÜhęÔ©cě}Ůݱâh¬Ç} ›¨Ąu®ˇľzőęĆ ‘^;|ř°¶Y¶lYÔćăÇŹ¦aÆfţüůzÍ ś±bf¸ŰĘ}Ç:vě…ˇ±˙ëöx‘ŤP1ć C–«ó;…‹|aaaTe"2bĨśęC“&MűÉεŤ„5ărDřž ŕlPç$đ @(­—'kÖ¬‘»wďĘ–-[…2Ěz¬‚32Ł!pî…/ę↮¸!;}:[ż~˝äĺĺIÍš5ĄgĎž˛uëV±ž‚ľ\›tď)#ŰŮzŘş@xÜahÔ!<ťJ€±7 CbWÜ)ťÎš6mZŞ řÁ’–5^j’,üń(ŔüOĚ/ř§ŔŢŻ ëľ§˙ť&Mš$8ň,hXíÚµu [HĆŠżnÝşUęvŠöáń ¶Ó¦MSďúČ‘#şW ÎÔ Ŕđ±€ o݉_/^Ô>ău® ŢÝBÁí»ş˛’Ň\ť{wă®ĚwH p~Î2 €ł±H¶BňD,n(ăáđTaůÂÓ…ŘÚ}_}U«VMfĎž-v9~kĆE*ÂŔ]»vŐ6{öěŃľÖ®]«ž)ú‚§ŤvţJuę(H¨‚ Ă‹ŽźëĹ1*ô·yófőŘái—enNn‘6¸Â7m<3:^ÇĎ$$ŕ$ýś ¤!`“Łdßľ}şď 1»té’ěŢ˝[† ¦ű™EEEÚFýQ.ÎŮ"Ú&[é™Z^ÜćĚ™Ł}@ .\(Ďž=ÓăKhÓŻ_?=„đ1DíÚµko–j™×اƞ±łşuëJçÎť5ÓÚ1#Ś9á _~ť»ď5ă©W`ŹGަL™"~66űÝj„µi$Tŕ¤ţ2ś ”A‚ ˇB˛•ÍîUo˘ńD"Sź>}ô.BĹ $)!Ęf! ü'ĎÓő ŹtÓ¦M?=bahr|˙×ÝáE]yڶx(揅ÍÎVˇĹ‚ bĆ"aj„˛}ďŘŤÇwHl'óŤś$Ěs PöŤŕyÉx´K** Äçhýä%ěé"ăˇkd ăśnŞ„&x»Řvű°eŤňH2óż“›ţ¬á{c!B#¤ŕŁ(“úËp^$†ѶmŰ4­DCŃéU©R%Ąřâ^·Źś®źPőŘĎĆ+•Á#¦ř¦˘ĂëI!ŔtR~ ÎH€HŕŻ"Ŕô_ősóË’Ŕ8ľđs»ví4»úG ?‘ „ @A™c €G€!h‹$@$@$‚8eŽA$@$@ °„E  A€‚2Ç   ŹŘÂ" „ @A™c €G€ěa‘H€H€B ‡ Ě1H€H€HŔ#@ö€°H$@$@!P€CPć$@$@$ŕ {@X$  (Ŕ!(s   đP€= ,’ @ŕ”9 x(ŔI€H€H  pĘH€H€<`‹$@$@$‚8eŽA$@$@˘§ş^f2ŻIEND®B`‚scales/man/transform_compose.Rd0000644000176200001440000000135214522421001016316 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-compose.R \name{transform_compose} \alias{transform_compose} \alias{compose_trans} \title{Compose two or more transformations together} \usage{ transform_compose(...) compose_trans(...) } \arguments{ \item{...}{One or more transformers, either specified with string or as individual transformer objects.} } \description{ This transformer provides a general mechanism for composing two or more transformers together. The most important use case is to combine reverse with other transformations. } \examples{ demo_continuous(10^c(-2:4), trans = "log10", labels = label_log()) demo_continuous(10^c(-2:4), trans = c("log10", "reverse"), labels = label_log()) } scales/man/label_wrap.Rd0000644000176200001440000000217314520130030014665 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-wrap.R \name{label_wrap} \alias{label_wrap} \title{Label strings by wrapping across multiple lines} \usage{ label_wrap(width) } \arguments{ \item{width}{Number of characters per line.} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Uses \code{\link[=strwrap]{strwrap()}} to split long labels across multiple lines. } \examples{ x <- c( "this is a long label", "this is another long label", "this a label this is even longer" ) demo_discrete(x) demo_discrete(x, labels = label_wrap(10)) demo_discrete(x, labels = label_wrap(20)) } \seealso{ Other labels for discrete scales: \code{\link{label_parse}()} } \concept{labels for discrete scales} scales/man/zero_range.Rd0000644000176200001440000000263514520145514014730 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{zero_range} \alias{zero_range} \title{Determine if range of vector is close to zero, with a specified tolerance} \usage{ zero_range(x, tol = 1000 * .Machine$double.eps) } \arguments{ \item{x}{numeric range: vector of length 2} \item{tol}{A value specifying the tolerance.} } \value{ logical \code{TRUE} if the relative difference of the endpoints of the range are not distinguishable from 0. } \description{ The machine epsilon is the difference between 1.0 and the next number that can be represented by the machine. By default, this function uses epsilon * 1000 as the tolerance. First it scales the values so that they have a mean of 1, and then it checks if the difference between them is larger than the tolerance. } \examples{ eps <- .Machine$double.eps zero_range(c(1, 1 + eps)) zero_range(c(1, 1 + 99 * eps)) zero_range(c(1, 1 + 1001 * eps)) zero_range(c(1, 1 + 2 * eps), tol = eps) # Scaling up or down all the values has no effect since the values # are rescaled to 1 before checking against tol zero_range(100000 * c(1, 1 + eps)) zero_range(100000 * c(1, 1 + 1001 * eps)) zero_range(.00001 * c(1, 1 + eps)) zero_range(.00001 * c(1, 1 + 1001 * eps)) # NA values zero_range(c(1, NA)) # NA zero_range(c(1, NaN)) # NA # Infinite values zero_range(c(1, Inf)) # FALSE zero_range(c(-Inf, Inf)) # FALSE zero_range(c(Inf, Inf)) # TRUE } scales/man/label_percent.Rd0000644000176200001440000001047714523373730015405 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-percent.R \name{label_percent} \alias{label_percent} \title{Label percentages (2.5\%, 50\%, etc)} \usage{ label_percent( accuracy = NULL, scale = 100, prefix = "", suffix = "\%", big.mark = " ", decimal.mark = ".", trim = TRUE, ... ) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{suffix}{Additional text to display after the number.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{ Arguments passed on to \code{\link[=label_number]{label_number}} \describe{ \item{\code{style_positive}}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{\code{style_negative}}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{\code{scale_cut}}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} }} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Label percentages (2.5\%, 50\%, etc) } \examples{ demo_continuous(c(0, 1)) demo_continuous(c(0, 1), labels = label_percent()) # Use prefix and suffix to create your own variants french_percent <- label_percent( decimal.mark = ",", suffix = " \%" ) demo_continuous(c(0, .01), labels = french_percent) } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} scales/man/transform_yj.Rd0000644000176200001440000000302414522421001015271 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_yj} \alias{transform_yj} \alias{yj_trans} \title{Yeo-Johnson transformation} \usage{ transform_yj(p) yj_trans(p) } \arguments{ \item{p}{Transformation exponent, \eqn{\lambda}.} } \description{ The Yeo-Johnson transformation is a flexible transformation that is similar to Box-Cox, \code{\link[=transform_boxcox]{transform_boxcox()}}, but does not require input values to be greater than zero. } \details{ The transformation takes one of four forms depending on the values of \code{y} and \eqn{\lambda}. \itemize{ \item \eqn{y \ge 0} and \eqn{\lambda \neq 0}{\lambda != 0} : \eqn{y^{(\lambda)} = \frac{(y + 1)^\lambda - 1}{\lambda}}{y^(\lambda) = ((y + 1)^\lambda - 1)/\lambda} \item \eqn{y \ge 0} and \eqn{\lambda = 0}: \eqn{y^{(\lambda)} = \ln(y + 1)}{y^(\lambda) = ln(y + 1)} \item \eqn{y < 0} and \eqn{\lambda \neq 2}{\lambda != 2}: \eqn{y^{(\lambda)} = -\frac{(-y + 1)^{(2 - \lambda)} - 1}{2 - \lambda}}{y^(\lambda) = -((-y + 1)^(2 - \lambda) - 1)/(2 - \lambda)} \item \eqn{y < 0} and \eqn{\lambda = 2}: \eqn{y^{(\lambda)} = -\ln(-y + 1)}{y^(\lambda) = -ln(-y + 1)} } } \examples{ plot(transform_yj(-1), xlim = c(-10, 10)) plot(transform_yj(0), xlim = c(-10, 10)) plot(transform_yj(1), xlim = c(-10, 10)) plot(transform_yj(2), xlim = c(-10, 10)) } \references{ Yeo, I., & Johnson, R. (2000). A New Family of Power Transformations to Improve Normality or Symmetry. Biometrika, 87(4), 954-959. \url{https://www.jstor.org/stable/2673623} } scales/man/breaks_log.Rd0000644000176200001440000000426314520130030014667 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks-log.R \name{breaks_log} \alias{breaks_log} \alias{log_breaks} \title{Breaks for log axes} \usage{ breaks_log(n = 5, base = 10) } \arguments{ \item{n}{desired number of breaks} \item{base}{base of logarithm to use} } \description{ This algorithm starts by looking for integer powers of \code{base}. If that doesn't provide enough breaks, it then looks for additional intermediate breaks which are integer multiples of integer powers of base. If that fails (which it can for very small ranges), we fall back to \code{\link[=extended_breaks]{extended_breaks()}} } \details{ The algorithm starts by looking for a set of integer powers of \code{base} that cover the range of the data. If that does not generate at least \code{n - 2} breaks, we look for an integer between 1 and \code{base} that splits the interval approximately in half. For example, in the case of \code{base = 10}, this integer is 3 because \code{log10(3) = 0.477}. This leaves 2 intervals: \code{c(1, 3)} and \code{c(3, 10)}. If we still need more breaks, we look for another integer that splits the largest remaining interval (on the log-scale) approximately in half. For \code{base = 10}, this is 5 because \code{log10(5) = 0.699}. The generic algorithm starts with a set of integers \code{steps} containing only 1 and a set of candidate integers containing all integers larger than 1 and smaller than \code{base}. Then for each remaining candidate integer \code{x}, the smallest interval (on the log-scale) in the vector \code{sort(c(x, steps, base))} is calculated. The candidate \code{x} which yields the largest minimal interval is added to \code{steps} and removed from the candidate set. This is repeated until either a sufficient number of breaks, \verb{>= n-2}, are returned or all candidates have been used. } \examples{ demo_log10(c(1, 1e5)) demo_log10(c(1, 1e6)) # Request more breaks by setting n demo_log10(c(1, 1e6), breaks = breaks_log(6)) # Some tricky ranges demo_log10(c(2000, 9000)) demo_log10(c(2000, 14000)) demo_log10(c(2000, 85000), expand = c(0, 0)) # An even smaller range that requires falling back to linear breaks demo_log10(c(1800, 2000)) } scales/man/transform_boxcox.Rd0000644000176200001440000000442114522421001016153 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_boxcox} \alias{transform_boxcox} \alias{boxcox_trans} \alias{transform_modulus} \alias{modulus_trans} \title{Box-Cox & modulus transformations} \usage{ transform_boxcox(p, offset = 0) boxcox_trans(p, offset = 0) transform_modulus(p, offset = 1) modulus_trans(p, offset = 1) } \arguments{ \item{p}{Transformation exponent, \eqn{\lambda}.} \item{offset}{Constant offset. 0 for Box-Cox type 1, otherwise any non-negative constant (Box-Cox type 2). \code{transform_modulus()} sets the default to 1.} } \description{ The Box-Cox transformation is a flexible transformation, often used to transform data towards normality. The modulus transformation generalises Box-Cox to also work with negative values. } \details{ The Box-Cox power transformation (type 1) requires strictly positive values and takes the following form for \code{y > 0}: \deqn{y^{(\lambda)} = \frac{y^\lambda - 1}{\lambda}}{y^(\lambda) = (y^\lambda - 1)/\lambda} When \code{y = 0}, the natural log transform is used. The modulus transformation implements a generalisation of the Box-Cox transformation that works for data with both positive and negative values. The equation takes the following forms, when \code{y != 0} : \deqn{y^{(\lambda)} = sign(y) * \frac{(|y| + 1)^\lambda - 1}{\lambda}}{ y^(\lambda) = sign(y)*((|y|+1)^\lambda - 1)/\lambda} and when \code{y = 0}: \deqn{y^{(\lambda)} = sign(y) * \ln(|y| + 1)}{ y^(\lambda) = sign(y) * ln(|y| + 1)} } \examples{ plot(transform_boxcox(-1), xlim = c(0, 10)) plot(transform_boxcox(0), xlim = c(0, 10)) plot(transform_boxcox(1), xlim = c(0, 10)) plot(transform_boxcox(2), xlim = c(0, 10)) plot(transform_modulus(-1), xlim = c(-10, 10)) plot(transform_modulus(0), xlim = c(-10, 10)) plot(transform_modulus(1), xlim = c(-10, 10)) plot(transform_modulus(2), xlim = c(-10, 10)) } \references{ Box, G. E., & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society. Series B (Methodological), 211-252. \url{https://www.jstor.org/stable/2984418} John, J. A., & Draper, N. R. (1980). An alternative family of transformations. Applied Statistics, 190-197. \url{https://www.jstor.org/stable/2986305} } \seealso{ \code{\link[=transform_yj]{transform_yj()}} } scales/man/demo_continuous.Rd0000644000176200001440000000112114522154141015772 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \name{demo_continuous} \alias{demo_continuous} \alias{demo_log10} \alias{demo_discrete} \alias{demo_datetime} \alias{demo_time} \alias{demo_timespan} \title{Demonstrate scales functions with ggplot2 code} \usage{ demo_continuous(x, ...) demo_log10(x, ...) demo_discrete(x, ...) demo_datetime(x, ...) demo_time(x, ...) demo_timespan(x, ...) } \arguments{ \item{x}{A vector of data} } \description{ These functions generate ggplot2 code needed to use scales functions for real code. } \keyword{internal} scales/man/breaks_width.Rd0000644000176200001440000000456314520145514015245 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks.R \name{breaks_width} \alias{breaks_width} \title{Equally spaced breaks} \usage{ breaks_width(width, offset = 0) } \arguments{ \item{width}{Distance between each break. Either a number, or for date/times, a single string of the form \code{"{n} {unit}"}, e.g. "1 month", "5 days". Unit can be of one "sec", "min", "hour", "day", "week", "month", "year".} \item{offset}{Use if you don't want breaks to start at zero, or on a conventional date or time boundary such as the 1st of January or midnight. Either a number, or for date/times, a single string of the form \code{"{n} {unit}"}, as for \code{width}. \code{offset} can be a vector, which will accumulate in the order given. This is mostly useful for dates, where e.g. \code{c("3 months", "5 days")} will offset by three months and five days, which is useful for the UK tax year. Note that due to way that dates are rounded, there's no guarantee that \code{offset = c(x, y)} will give the same result as \code{offset = c(y, x)}.} } \description{ Useful for numeric, date, and date-time scales. } \examples{ demo_continuous(c(0, 100)) demo_continuous(c(0, 100), breaks = breaks_width(10)) demo_continuous(c(0, 100), breaks = breaks_width(20, -4)) demo_continuous(c(0, 100), breaks = breaks_width(20, 4)) # This is also useful for dates one_month <- as.POSIXct(c("2020-05-01", "2020-06-01")) demo_datetime(one_month) demo_datetime(one_month, breaks = breaks_width("1 week")) demo_datetime(one_month, breaks = breaks_width("5 days")) # This is so useful that scale_x_datetime() has a shorthand: demo_datetime(one_month, date_breaks = "5 days") # hms times also work one_hour <- hms::hms(hours = 0:1) demo_time(one_hour) demo_time(one_hour, breaks = breaks_width("15 min")) demo_time(one_hour, breaks = breaks_width("600 sec")) # Offets are useful for years that begin on dates other than the 1st of # January, such as the UK financial year, which begins on the 1st of April. three_years <- as.POSIXct(c("2020-01-01", "2021-01-01", "2022-01-01")) demo_datetime( three_years, breaks = breaks_width("1 year", offset = "3 months") ) # The offset can be a vector, to create offsets that have compound units, # such as the UK fiscal (tax) year, which begins on the 6th of April. demo_datetime( three_years, breaks = breaks_width("1 year", offset = c("3 months", "5 days")) ) } scales/man/date_breaks.Rd0000644000176200001440000000121214520130030015012 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks-retired.R \name{date_breaks} \alias{date_breaks} \title{Regularly spaced dates} \usage{ date_breaks(width = "1 month") } \arguments{ \item{width}{an interval specification, one of "sec", "min", "hour", "day", "week", "month", "year". Can be by an integer and a space, or followed by "s". Fractional seconds are supported.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} Use \code{breaks_width()} instead. } \keyword{internal} scales/man/Range.Rd0000644000176200001440000000052014520145515013621 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/range.R \name{Range} \alias{Range} \alias{DiscreteRange} \alias{ContinuousRange} \title{Mutable ranges} \description{ Mutable ranges have a two methods (\code{train} and \code{reset}), and make it possible to build up complete ranges with multiple passes. } scales/man/pal_viridis.Rd0000644000176200001440000000255714531175577015123 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-viridis.R \name{pal_viridis} \alias{pal_viridis} \alias{viridis_pal} \title{Viridis palette} \usage{ pal_viridis(alpha = 1, begin = 0, end = 1, direction = 1, option = "D") viridis_pal(alpha = 1, begin = 0, end = 1, direction = 1, option = "D") } \arguments{ \item{alpha}{The alpha transparency, a number in [0,1], see argument alpha in \code{\link[grDevices]{hsv}}.} \item{begin, end}{The (corrected) hue in \verb{[0,1]} at which the color map begins and ends.} \item{direction}{Sets the order of colors in the scale. If 1, the default, colors are ordered from darkest to lightest. If -1, the order of colors is reversed.} \item{option}{A character string indicating the color map option to use. Eight options are available: \itemize{ \item \code{"magma"} (or \code{"A"}) \item \code{"inferno"} (or \code{"B"}) \item \code{"plasma"} (or \code{"C"}) \item \code{"viridis"} (or \code{"D"}) \item \code{"cividis"} (or \code{"E"}) \item \code{"rocket"} (or \code{"F"}) \item \code{"mako"} (or \code{"G"}) \item \code{"turbo"} (or \code{"H"}) }} } \description{ Viridis palette } \examples{ show_col(pal_viridis()(10)) show_col(pal_viridis(direction = -1)(6)) show_col(pal_viridis(begin = 0.2, end = 0.8)(4)) show_col(pal_viridis(option = "plasma")(6)) } \references{ \url{https://bids.github.io/colormap/} } scales/man/ordinal_format.Rd0000644000176200001440000000215714520130030015557 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-ordinal.R \name{ordinal_format} \alias{ordinal_format} \alias{ordinal} \title{Superseded interface to \code{label_ordinal()}} \usage{ ordinal_format( prefix = "", suffix = "", big.mark = " ", rules = ordinal_english(), ... ) ordinal( x, prefix = "", suffix = "", big.mark = " ", rules = ordinal_english(), ... ) } \arguments{ \item{prefix, suffix}{Symbols to display before and after value.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{rules}{Named list of regular expressions, matched in order. Name gives suffix, and value specifies which numbers to match.} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_ordinal]{label_ordinal()}} for new code. } \keyword{internal} scales/man/dollar_format.Rd0000644000176200001440000000434614522154141015421 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-currency.R \name{dollar_format} \alias{dollar_format} \alias{dollar} \alias{label_dollar} \title{Superseded interface to \code{label_currency()}} \usage{ dollar_format( accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_cents = 1e+05, negative_parens = deprecated(), ... ) dollar( x, accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_cents = 1e+05, negative_parens = deprecated(), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, ... ) label_dollar( accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_cents = 1e+05, negative_parens = deprecated(), ... ) } \arguments{ \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix, suffix}{Symbols to display before and after value.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{largest_with_cents}{Like \code{largest_with_fractional()} in \code{\link[=label_currency]{label_currency()}}} \item{negative_parens}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Use \code{style_negative = "parens"} instead.} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} \item{x}{A numeric vector} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_currency]{label_currency()}} for new code. } \keyword{internal} scales/man/pal_shape.Rd0000644000176200001440000000051714522421001014514 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-shape.r \name{pal_shape} \alias{pal_shape} \alias{shape_pal} \title{Shape palette (discrete)} \usage{ pal_shape(solid = TRUE) shape_pal(solid = TRUE) } \arguments{ \item{solid}{should shapes be solid or not?} } \description{ Shape palette (discrete) } scales/man/label_number.Rd0000644000176200001440000001375714523373730015241 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-number.R \name{label_number} \alias{label_number} \alias{label_comma} \title{Label numbers in decimal format (e.g. 0.12, 1,234)} \usage{ label_number( accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = " ", decimal.mark = ".", style_positive = c("none", "plus", "space"), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, trim = TRUE, ... ) label_comma( accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, digits, ... ) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{suffix}{Additional text to display after the number.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{style_positive}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{style_negative}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{scale_cut}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} \item{digits}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Use \code{accuracy} instead.} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Use \code{label_number()} force decimal display of numbers (i.e. don't use \link[=label_scientific]{scientific} notation). \code{label_comma()} is a special case that inserts a comma every three digits. } \examples{ \dontshow{if (getRversion() >= "3.5") (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} demo_continuous(c(-1e6, 1e6)) demo_continuous(c(-1e6, 1e6), labels = label_number()) demo_continuous(c(-1e6, 1e6), labels = label_comma()) # Use scale to rescale very small or large numbers to generate # more readable labels demo_continuous(c(0, 1e6), labels = label_number()) demo_continuous(c(0, 1e6), labels = label_number(scale = 1 / 1e3)) demo_continuous(c(0, 1e-6), labels = label_number()) demo_continuous(c(0, 1e-6), labels = label_number(scale = 1e6)) #' Use scale_cut to automatically add prefixes for large/small numbers demo_log10( c(1, 1e9), breaks = log_breaks(10), labels = label_number(scale_cut = cut_short_scale()) ) demo_log10( c(1, 1e9), breaks = log_breaks(10), labels = label_number(scale_cut = cut_si("m")) ) demo_log10( c(1e-9, 1), breaks = log_breaks(10), labels = label_number(scale_cut = cut_si("g")) ) # use scale and scale_cut when data already uses SI prefix # for example, if data was stored in kg demo_log10( c(1e-9, 1), breaks = log_breaks(10), labels = label_number(scale_cut = cut_si("g"), scale = 1e3) ) #' # Use style arguments to vary the appearance of positive and negative numbers demo_continuous(c(-1e3, 1e3), labels = label_number( style_positive = "plus", style_negative = "minus" )) demo_continuous(c(-1e3, 1e3), labels = label_number(style_negative = "parens")) # You can use prefix and suffix for other types of display demo_continuous(c(32, 212), labels = label_number(suffix = "\u00b0F")) demo_continuous(c(0, 100), labels = label_number(suffix = "\u00b0C")) \dontshow{\}) # examplesIf} } scales/man/dscale.Rd0000644000176200001440000000074514522421001014016 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scale-discrete.R \name{dscale} \alias{dscale} \title{Discrete scale} \usage{ dscale(x, palette, na.value = NA) } \arguments{ \item{x}{vector of discrete values to scale} \item{palette}{aesthetic palette to use} \item{na.value}{aesthetic to use for missing values} } \description{ Discrete scale } \examples{ with(mtcars, plot(disp, mpg, pch = 20, cex = 3, col = dscale(factor(cyl), pal_brewer()) )) } scales/man/breaks_pretty.Rd0000644000176200001440000000200114520145514015436 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks.R \name{breaks_pretty} \alias{breaks_pretty} \title{Pretty breaks for date/times} \usage{ breaks_pretty(n = 5, ...) } \arguments{ \item{n}{Desired number of breaks. You may get slightly more or fewer breaks that requested.} \item{...}{other arguments passed on to \code{\link[=pretty]{pretty()}}} } \description{ Uses default R break algorithm as implemented in \code{\link[=pretty]{pretty()}}. This is primarily useful for date/times, as \code{\link[=extended_breaks]{extended_breaks()}} should do a slightly better job for numeric scales. } \examples{ one_month <- as.POSIXct(c("2020-05-01", "2020-06-01")) demo_datetime(one_month) demo_datetime(one_month, breaks = breaks_pretty(2)) demo_datetime(one_month, breaks = breaks_pretty(4)) # Tightly spaced date breaks often need custom labels too demo_datetime(one_month, breaks = breaks_pretty(12)) demo_datetime(one_month, breaks = breaks_pretty(12), labels = label_date_short() ) } scales/man/train_discrete.Rd0000644000176200001440000000120114530123007015552 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scale-discrete.R \name{train_discrete} \alias{train_discrete} \title{Train (update) a discrete scale} \usage{ train_discrete(new, existing = NULL, drop = FALSE, na.rm = FALSE, fct = NA) } \arguments{ \item{new}{New data to add to scale} \item{existing}{Optional existing scale to update} \item{drop}{\code{TRUE}, will drop factor levels not associated with data} \item{na.rm}{If \code{TRUE}, will remove missing values} \item{fct}{Treat \code{existing} as if it came from a factor (ie. don't sort the range)} } \description{ Train (update) a discrete scale } scales/man/cbreaks.Rd0000644000176200001440000000337114520130030014170 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks-retired.R \name{cbreaks} \alias{cbreaks} \title{Compute breaks for continuous scale} \usage{ cbreaks(range, breaks = extended_breaks(), labels = scientific_format()) } \arguments{ \item{range}{numeric vector of length 2 giving the range of the underlying data} \item{breaks}{either a vector of break values, or a break function that will make a vector of breaks when given the range of the data} \item{labels}{either a vector of labels (character vector or list of expression) or a format function that will make a vector of labels when called with a vector of breaks. Labels can only be specified manually if breaks are - it is extremely dangerous to supply labels if you don't know what the breaks will be.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} This function wraps up the components needed to go from a continuous range to a set of breaks and labels suitable for display on axes or legends. } \examples{ cbreaks(c(0, 100)) cbreaks(c(0, 100), breaks_pretty(3)) cbreaks(c(0, 100), breaks_pretty(10)) cbreaks(c(1, 100), log_breaks()) cbreaks(c(1, 1e4), log_breaks()) cbreaks(c(0, 100), labels = math_format()) cbreaks(c(0, 1), labels = percent_format()) cbreaks(c(0, 1e6), labels = comma_format()) cbreaks(c(0, 1e6), labels = dollar_format()) cbreaks(c(0, 30), labels = dollar_format()) # You can also specify them manually: cbreaks(c(0, 100), breaks = c(15, 20, 80)) cbreaks(c(0, 100), breaks = c(15, 20, 80), labels = c(1.5, 2.0, 8.0)) cbreaks(c(0, 100), breaks = c(15, 20, 80), labels = expression(alpha, beta, gamma) ) } \keyword{internal} scales/man/rescale_none.Rd0000644000176200001440000000056114520145514015226 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{rescale_none} \alias{rescale_none} \title{Don't perform rescaling} \usage{ rescale_none(x, ...) } \arguments{ \item{x}{numeric vector of values to manipulate.} \item{...}{all other arguments ignored} } \description{ Don't perform rescaling } \examples{ rescale_none(1:100) } scales/man/label_pvalue.Rd0000644000176200001440000000416314522154141015224 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-pvalue.R \name{label_pvalue} \alias{label_pvalue} \title{Label p-values (e.g. <0.001, 0.25, p >= 0.99)} \usage{ label_pvalue( accuracy = 0.001, decimal.mark = ".", prefix = NULL, add_p = FALSE ) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{prefix}{A character vector of length 3 giving the prefixes to put in front of numbers. The default values are \code{c("<", "", ">")} if \code{add_p} is \code{TRUE} and \code{c("p<", "p=", "p>")} if \code{FALSE}.} \item{add_p}{Add "p=" before the value?} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ Formatter for p-values, using "<" and ">" for p-values close to 0 and 1. } \examples{ demo_continuous(c(0, 1)) demo_continuous(c(0, 1), labels = label_pvalue()) demo_continuous(c(0, 1), labels = label_pvalue(accuracy = 0.1)) demo_continuous(c(0, 1), labels = label_pvalue(add_p = TRUE)) # Or provide your own prefixes prefix <- c("p < ", "p = ", "p > ") demo_continuous(c(0, 1), labels = label_pvalue(prefix = prefix)) } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} scales/man/trans_format.Rd0000644000176200001440000000136214520130030015253 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/labels-retired.R \name{trans_format} \alias{trans_format} \title{Format labels after transformation} \usage{ trans_format(trans, format = scientific_format()) } \arguments{ \item{trans}{transformation to apply} \item{format}{additional formatter to apply after transformation} } \value{ a function with single parameter x, a numeric vector, that returns a character vector of list of expressions } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} } \examples{ tf <- trans_format("log10", scientific_format()) tf(10^1:6) } \keyword{internal} scales/man/pvalue_format.Rd0000644000176200001440000000253614520130030015424 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-pvalue.R \name{pvalue_format} \alias{pvalue_format} \alias{pvalue} \title{Superseded interface to \code{label_pvalue()}} \usage{ pvalue_format( accuracy = 0.001, decimal.mark = ".", prefix = NULL, add_p = FALSE ) pvalue(x, accuracy = 0.001, decimal.mark = ".", prefix = NULL, add_p = FALSE) } \arguments{ \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{prefix}{A character vector of length 3 giving the prefixes to put in front of numbers. The default values are \code{c("<", "", ">")} if \code{add_p} is \code{TRUE} and \code{c("p<", "p=", "p>")} if \code{FALSE}.} \item{add_p}{Add "p=" before the value?} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_pvalue]{label_pvalue()}} for new code. } \keyword{internal} scales/man/regular_minor_breaks.Rd0000644000176200001440000000106413610067251016764 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/minor_breaks.R \name{regular_minor_breaks} \alias{regular_minor_breaks} \title{Minor breaks} \usage{ regular_minor_breaks(reverse = FALSE) } \arguments{ \item{reverse}{if TRUE, calculates the minor breaks for a reversed scale} } \description{ Places minor breaks between major breaks. } \examples{ m <- extended_breaks()(c(1, 10)) regular_minor_breaks()(m, c(1, 10), n = 2) n <- extended_breaks()(c(0, -9)) regular_minor_breaks(reverse = TRUE)(n, c(0, -9), n = 2) } \keyword{internal} scales/man/pal_brewer.Rd0000644000176200001440000000212214522421001014674 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-brewer.R \name{pal_brewer} \alias{pal_brewer} \alias{brewer_pal} \title{Colour Brewer palette (discrete)} \usage{ pal_brewer(type = "seq", palette = 1, direction = 1) brewer_pal(type = "seq", palette = 1, direction = 1) } \arguments{ \item{type}{One of "seq" (sequential), "div" (diverging) or "qual" (qualitative)} \item{palette}{If a string, will use that named palette. If a number, will index into the list of palettes of appropriate \code{type}} \item{direction}{Sets the order of colours in the scale. If 1, the default, colours are as output by \code{\link[RColorBrewer:ColorBrewer]{RColorBrewer::brewer.pal()}}. If -1, the order of colours is reversed.} } \description{ Colour Brewer palette (discrete) } \examples{ show_col(pal_brewer()(10)) show_col(pal_brewer("div")(5)) show_col(pal_brewer(palette = "Greens")(5)) # Can use with gradient_n to create a continuous gradient cols <- pal_brewer("div")(5) show_col(pal_gradient_n(cols)(seq(0, 1, length.out = 30))) } \references{ \url{https://colorbrewer2.org} } scales/man/comma.Rd0000644000176200001440000001041514523373730013672 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-number.R \name{comma} \alias{comma} \alias{number_format} \alias{comma_format} \title{Superseded interface to \code{label_number()}/\code{label_comma()}} \usage{ comma( x, accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, digits, ... ) number_format( accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = " ", decimal.mark = ".", style_positive = c("none", "plus", "space"), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, trim = TRUE, ... ) comma_format( accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, digits, ... ) } \arguments{ \item{x}{A numeric vector to format.} \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{prefix}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{suffix}{Additional text to display after the number.} \item{big.mark}{Character used between every 3 digits to separate thousands.} \item{decimal.mark}{The character to be used to indicate the numeric decimal point.} \item{trim}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} \item{digits}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Use \code{accuracy} instead.} \item{...}{Other arguments passed on to \code{\link[base:format]{base::format()}}.} \item{style_positive}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{style_negative}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{scale_cut}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_number]{label_number()}}/\code{\link[=label_comma]{label_comma()}} for new code. } \keyword{internal} scales/man/number_bytes_format.Rd0000644000176200001440000000203114520130030016614 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/labels-retired.R \name{number_bytes_format} \alias{number_bytes_format} \alias{number_bytes} \title{Older interface to \code{label_bytes()}} \usage{ number_bytes_format(symbol = "auto", units = "binary", ...) number_bytes(x, symbol = "auto", units = c("binary", "si"), accuracy = 1, ...) } \arguments{ \item{symbol}{byte symbol to use. If "auto" the symbol used will be determined separately for each value of \code{x}. Valid symbols are "B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", and "YB" for SI units, and the "iB" variants for binary units.} \item{units}{which unit base to use, "binary" (1024 base) or "si" (1000 base)} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility, but you should switch to \code{\link[=label_bytes]{label_bytes()}} for new code. } \keyword{internal} scales/man/pal_seq_gradient.Rd0000644000176200001440000000154114522421001016057 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-gradient.R \name{pal_seq_gradient} \alias{pal_seq_gradient} \alias{seq_gradient_pal} \title{Sequential colour gradient palette (continuous)} \usage{ pal_seq_gradient(low = mnsl("10B 4/6"), high = mnsl("10R 4/6"), space = "Lab") seq_gradient_pal(low = mnsl("10B 4/6"), high = mnsl("10R 4/6"), space = "Lab") } \arguments{ \item{low}{colour for low end of gradient.} \item{high}{colour for high end of gradient.} \item{space}{colour space in which to calculate gradient. Must be "Lab" - other values are deprecated.} } \description{ Sequential colour gradient palette (continuous) } \examples{ x <- seq(0, 1, length.out = 25) show_col(pal_seq_gradient()(x)) show_col(pal_seq_gradient("white", "black")(x)) library(munsell) show_col(pal_seq_gradient("white", mnsl("10R 4/6"))(x)) } scales/man/pal_identity.Rd0000644000176200001440000000045714522421001015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-identity.R \name{pal_identity} \alias{pal_identity} \alias{identity_pal} \title{Identity palette} \usage{ pal_identity() identity_pal() } \description{ Leaves values unchanged - useful when the data is already scaled. } scales/man/date_format.Rd0000644000176200001440000000255714520130030015050 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-date.R \name{date_format} \alias{date_format} \alias{time_format} \title{Superseded interface to \code{label_date()}/\code{label_time()}} \usage{ date_format(format = "\%Y-\%m-\%d", tz = "UTC", locale = NULL) time_format(format = "\%H:\%M:\%S", tz = "UTC", locale = NULL) } \arguments{ \item{format}{For \code{date_format()} and \code{time_format()} a date/time format string using standard POSIX specification. See \code{\link[=strptime]{strptime()}} for details. For \code{date_short()} a character vector of length 4 giving the format components to use for year, month, day, and hour respectively.} \item{tz}{a time zone name, see \code{\link[=timezones]{timezones()}}. Defaults to UTC} \item{locale}{Locale to use when for day and month names. The default uses the current locale. Setting this argument requires stringi, and you can see a complete list of supported locales with \code{\link[stringi:stri_locale_list]{stringi::stri_locale_list()}}.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to [label_date()/\code{\link[=label_time]{label_time()}} for new code. } \keyword{internal} scales/man/parse_format.Rd0000644000176200001440000000156714520130030015245 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-expression.R \name{parse_format} \alias{parse_format} \alias{math_format} \title{Superseded interface to \code{label_parse()}/\code{label_math()}} \usage{ parse_format() math_format(expr = 10^.x, format = force) } \arguments{ \item{expr}{expression to use} \item{format}{another format function to apply prior to mathematical transformation - this makes it easier to use floating point numbers in mathematical expressions.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\strong{[Superseded]}} These functions are kept for backward compatibility; you should switch to \code{\link[=label_parse]{label_parse()}}/\code{\link[=label_math]{label_math()}} for new code. } \keyword{internal} scales/man/rescale_max.Rd0000644000176200001440000000115614520145514015055 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bounds.R \name{rescale_max} \alias{rescale_max} \title{Rescale numeric vector to have specified maximum} \usage{ rescale_max(x, to = c(0, 1), from = range(x, na.rm = TRUE)) } \arguments{ \item{x}{numeric vector of values to manipulate.} \item{to}{output range (numeric vector of length two)} \item{from}{input range (numeric vector of length two). If not given, is calculated from the range of \code{x}} } \description{ Rescale numeric vector to have specified maximum } \examples{ rescale_max(1:100) rescale_max(runif(50)) rescale_max(1) } scales/man/pal_gradient_n.Rd0000644000176200001440000000150314522421001015522 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pal-gradient.R \name{pal_gradient_n} \alias{pal_gradient_n} \alias{gradient_n_pal} \title{Arbitrary colour gradient palette (continuous)} \usage{ pal_gradient_n(colours, values = NULL, space = "Lab") gradient_n_pal(colours, values = NULL, space = "Lab") } \arguments{ \item{colours}{vector of colours} \item{values}{if colours should not be evenly positioned along the gradient this vector gives the position (between 0 and 1) for each colour in the \code{colours} vector. See \code{\link[=rescale]{rescale()}} for a convenience function to map an arbitrary range to between 0 and 1.} \item{space}{colour space in which to calculate gradient. Must be "Lab" - other values are deprecated.} } \description{ Arbitrary colour gradient palette (continuous) } scales/man/transform_log.Rd0000644000176200001440000000266414522421001015441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_log} \alias{transform_log} \alias{transform_log10} \alias{transform_log2} \alias{transform_log1p} \alias{log_trans} \alias{log10_trans} \alias{log2_trans} \alias{log1p_trans} \alias{transform_pseudo_log} \alias{pseudo_log_trans} \title{Log transformations} \usage{ transform_log(base = exp(1)) transform_log10() transform_log2() transform_log1p() log_trans(base = exp(1)) log10_trans() log2_trans() log1p_trans() transform_pseudo_log(sigma = 1, base = exp(1)) pseudo_log_trans(sigma = 1, base = exp(1)) } \arguments{ \item{base}{base of logarithm} \item{sigma}{Scaling factor for the linear part of pseudo-log transformation.} } \description{ \itemize{ \item \code{transform_log()}: \code{log(x)} \item \code{log1p()}: \code{log(x + 1)} \item \code{transform_pseudo_log()}: smoothly transition to linear scale around 0. } } \examples{ plot(transform_log2(), xlim = c(0, 5)) plot(transform_log(), xlim = c(0, 5)) plot(transform_log10(), xlim = c(0, 5)) plot(transform_log(), xlim = c(0, 2)) plot(transform_log1p(), xlim = c(-1, 1)) # The pseudo-log is defined for all real numbers plot(transform_pseudo_log(), xlim = c(-5, 5)) lines(transform_log(), xlim = c(0, 5), col = "red") # For large positives numbers it's very close to log plot(transform_pseudo_log(), xlim = c(1, 20)) lines(transform_log(), xlim = c(1, 20), col = "red") } scales/man/label_bytes.Rd0000644000176200001440000001164114523373730015065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-bytes.R \name{label_bytes} \alias{label_bytes} \title{Label bytes (1 kB, 2 MB, etc)} \usage{ label_bytes(units = "auto_si", accuracy = 1, scale = 1, ...) } \arguments{ \item{units}{Unit to use. Should either one of: \itemize{ \item "kB", "MB", "GB", "TB", "PB", "EB", "ZB", and "YB" for SI units (base 1000). \item "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", and "YiB" for binary units (base 1024). \item \code{auto_si} or \code{auto_binary} to automatically pick the most appropriate unit for each value. }} \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is very small or very large.} \item{...}{ Arguments passed on to \code{\link[=number]{number}} \describe{ \item{\code{prefix}}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{\code{suffix}}{Additional text to display after the number.} \item{\code{big.mark}}{Character used between every 3 digits to separate thousands.} \item{\code{decimal.mark}}{The character to be used to indicate the numeric decimal point.} \item{\code{style_positive}}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{\code{style_negative}}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{\code{scale_cut}}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} \item{\code{trim}}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} }} } \value{ A labeller function that takes a numeric vector of breaks and returns a character vector of labels. } \description{ Scale bytes into human friendly units. Can use either SI units (e.g. kB = 1000 bytes) or binary units (e.g. kiB = 1024 bytes). See \href{https://en.wikipedia.org/wiki/Units_of_information}{Units of Information} on Wikipedia for more details. } \examples{ demo_continuous(c(1, 1e6)) demo_continuous(c(1, 1e6), labels = label_bytes()) # Auto units are particularly nice on log scales demo_log10(c(1, 1e7), labels = label_bytes()) # You can also set the units demo_continuous(c(1, 1e6), labels = label_bytes("kB")) # You can also use binary units where a megabyte is defined as # (1024) ^ 2 bytes rather than (1000) ^ 2. You'll need to override # the default breaks to make this more informative. demo_continuous(c(1, 1024^2), breaks = breaks_width(250 * 1024), labels = label_bytes("auto_binary") ) } \seealso{ Other labels for continuous scales: \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_number_si}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} Other labels for log scales: \code{\link{label_log}()}, \code{\link{label_number_si}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} \concept{labels for log scales} scales/man/breaks_timespan.Rd0000644000176200001440000000127614522154141015742 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/breaks.R \name{breaks_timespan} \alias{breaks_timespan} \title{Breaks for timespan data} \usage{ breaks_timespan(unit = c("secs", "mins", "hours", "days", "weeks"), n = 5) } \arguments{ \item{unit}{The unit used to interpret numeric data input} \item{n}{Desired number of breaks. You may get slightly more or fewer breaks that requested.} } \description{ As timespan units span a variety of bases (1000 below seconds, 60 for second and minutes, 24 for hours, and 7 for days), the range of the input data determines the base used for calculating breaks } \examples{ demo_timespan(seq(0, 100), breaks = breaks_timespan()) } scales/man/scales-package.Rd0000644000176200001440000000171514523373730015444 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scales-package.R \docType{package} \name{scales-package} \alias{scales} \alias{scales-package} \title{scales: Scale Functions for Visualization} \description{ \if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} Graphical scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends. } \seealso{ Useful links: \itemize{ \item \url{https://scales.r-lib.org} \item \url{https://github.com/r-lib/scales} \item Report bugs at \url{https://github.com/r-lib/scales/issues} } } \author{ \strong{Maintainer}: Thomas Lin Pedersen \email{thomas.pedersen@posit.co} (\href{https://orcid.org/0000-0002-5147-4711}{ORCID}) Authors: \itemize{ \item Hadley Wickham \email{hadley@posit.co} \item Dana Seidel } Other contributors: \itemize{ \item Posit, PBC [copyright holder, funder] } } \keyword{internal} scales/man/cscale.Rd0000644000176200001440000000207314522421001014011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scale-continuous.R \name{cscale} \alias{cscale} \title{Continuous scale} \usage{ cscale(x, palette, na.value = NA_real_, trans = transform_identity()) } \arguments{ \item{x}{vector of continuous values to scale} \item{palette}{palette to use. Built in palettes: \Sexpr[results=rd,stage=build]{scales:::seealso_pal()}} \item{na.value}{value to use for missing values} \item{trans}{transformation object describing the how to transform the raw data prior to scaling. Defaults to the identity transformation which leaves the data unchanged. Built in transformations: \Sexpr[results=rd,stage=build]{scales:::seealso_transform()}.} } \description{ Continuous scale } \examples{ with(mtcars, plot(disp, mpg, cex = cscale(hp, pal_rescale()))) with(mtcars, plot(disp, mpg, cex = cscale(hp, pal_rescale(), trans = transform_sqrt() ))) with(mtcars, plot(disp, mpg, cex = cscale(hp, pal_area()))) with(mtcars, plot(disp, mpg, pch = 20, cex = 5, col = cscale(hp, pal_seq_gradient("grey80", "black")) )) } scales/man/transform_sqrt.Rd0000644000176200001440000000060014522421001015635 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_sqrt} \alias{transform_sqrt} \alias{sqrt_trans} \title{Square-root transformation} \usage{ transform_sqrt() sqrt_trans() } \description{ This is the variance stabilising transformation for the Poisson distribution. } \examples{ plot(transform_sqrt(), xlim = c(0, 5)) } scales/man/transform_reciprocal.Rd0000644000176200001440000000055714522421001017002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform-numeric.R \name{transform_reciprocal} \alias{transform_reciprocal} \alias{reciprocal_trans} \title{Reciprocal transformation} \usage{ transform_reciprocal() reciprocal_trans() } \description{ Reciprocal transformation } \examples{ plot(transform_reciprocal(), xlim = c(0, 1)) } scales/man/label_number_si.Rd0000644000176200001440000001135714523373730015726 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/label-number-si.R \name{label_number_si} \alias{label_number_si} \title{Label numbers with SI prefixes (2 kg, 5 mm, etc)} \usage{ label_number_si(unit = "", accuracy = NULL, scale = 1, suffix = "", ...) } \arguments{ \item{unit}{Unit of measurement (e.g. \code{"m"} for meter, the SI unit of length).} \item{accuracy}{A number to round to. Use (e.g.) \code{0.01} to show 2 decimal places of precision. If \code{NULL}, the default, uses a heuristic that should ensure breaks have the minimum number of digits needed to show the difference between adjacent values. Applied to rescaled data.} \item{scale}{A scaling factor: \code{x} will be multiplied by \code{scale} before formatting. This is useful if the underlying data is already using an SI prefix.} \item{suffix}{Additional text to display after the number.} \item{...}{ Arguments passed on to \code{\link[=label_number]{label_number}} \describe{ \item{\code{prefix}}{Additional text to display before the number. The suffix is applied to absolute value before \code{style_positive} and \code{style_negative} are processed so that \code{prefix = "$"} will yield (e.g.) \verb{-$1} and \verb{($1)}.} \item{\code{big.mark}}{Character used between every 3 digits to separate thousands.} \item{\code{decimal.mark}}{The character to be used to indicate the numeric decimal point.} \item{\code{style_positive}}{A string that determines the style of positive numbers: \itemize{ \item \code{"none"} (the default): no change, e.g. \code{1}. \item \code{"plus"}: preceded by \code{+}, e.g. \code{+1}. \item \code{"space"}: preceded by a Unicode "figure space", i.e., a space equally as wide as a number or \code{+}. Compared to \code{"none"}, adding a figure space can ensure numbers remain properly aligned when they are left- or right-justified. }} \item{\code{style_negative}}{A string that determines the style of negative numbers: \itemize{ \item \code{"hyphen"} (the default): preceded by a standard hypen \code{-}, e.g. \code{-1}. \item \code{"minus"}, uses a proper Unicode minus symbol. This is a typographical nicety that ensures \code{-} aligns with the horizontal bar of the the horizontal bar of \code{+}. \item \code{"parens"}, wrapped in parentheses, e.g. \code{(1)}. }} \item{\code{scale_cut}}{Named numeric vector that allows you to rescale large (or small) numbers and add a prefix. Built-in helpers include: \itemize{ \item \code{cut_short_scale()}: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. \item \code{cut_long_scale()}: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. \item \code{cut_si(unit)}: uses standard SI units. } If you supply a vector \code{c(a = 100, b = 1000)}, absolute values in the range \verb{[0, 100)} will not be rescaled, absolute values in the range \verb{[100, 1000)} will be divided by 100 and given the suffix "a", and absolute values in the range \verb{[1000, Inf)} will be divided by 1000 and given the suffix "b". If the division creates an irrational value (or one with many digits), the cut value below will be tried to see if it improves the look of the final label.} \item{\code{trim}}{Logical, if \code{FALSE}, values are right-justified to a common width (see \code{\link[base:format]{base::format()}}).} }} } \value{ All \code{label_()} functions return a "labelling" function, i.e. a function that takes a vector \code{x} and returns a character vector of \code{length(x)} giving a label for each input value. Labelling functions are designed to be used with the \code{labels} argument of ggplot2 scales. The examples demonstrate their use with x scales, but they work similarly for all scales, including those that generate legends rather than axes. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} \code{label_number_si()} is deprecated because the previous unit didn't actually use SI units, but instead used the so called "short scale". You can now get the same results as before with \code{label_number(scale_cut = cut_short_scale())}, or if you want correct SI units, \code{label_number(scale_cut = cut_si("unit"))}. } \seealso{ Other labels for continuous scales: \code{\link{label_bytes}()}, \code{\link{label_currency}()}, \code{\link{label_number_auto}()}, \code{\link{label_ordinal}()}, \code{\link{label_parse}()}, \code{\link{label_percent}()}, \code{\link{label_pvalue}()}, \code{\link{label_scientific}()} Other labels for log scales: \code{\link{label_bytes}()}, \code{\link{label_log}()}, \code{\link{label_scientific}()} } \concept{labels for continuous scales} \concept{labels for log scales} \keyword{internal} scales/DESCRIPTION0000644000176200001440000000256714531327156013253 0ustar liggesusersPackage: scales Title: Scale Functions for Visualization Version: 1.3.0 Authors@R: c( person("Hadley", "Wickham", , "hadley@posit.co", role = c("aut")), person("Thomas Lin", "Pedersen", , "thomas.pedersen@posit.co", role = c("cre", "aut"), comment = c(ORCID = "0000-0002-5147-4711")), person("Dana", "Seidel", role = "aut"), person("Posit, PBC", role = c("cph", "fnd")) ) Description: Graphical scales map data to aesthetics, and provide methods for automatically determining breaks and labels for axes and legends. License: MIT + file LICENSE URL: https://scales.r-lib.org, https://github.com/r-lib/scales BugReports: https://github.com/r-lib/scales/issues Depends: R (>= 3.6) Imports: cli, farver (>= 2.0.3), glue, labeling, lifecycle, munsell (>= 0.5), R6, RColorBrewer, rlang (>= 1.0.0), viridisLite Suggests: bit64, covr, dichromat, ggplot2, hms (>= 0.5.0), stringi, testthat (>= 3.0.0) Config/Needs/website: tidyverse/tidytemplate Config/testthat/edition: 3 Encoding: UTF-8 LazyLoad: yes RoxygenNote: 7.2.3 NeedsCompilation: yes Packaged: 2023-11-27 20:27:59 UTC; thomas Author: Hadley Wickham [aut], Thomas Lin Pedersen [cre, aut] (), Dana Seidel [aut], Posit, PBC [cph, fnd] Maintainer: Thomas Lin Pedersen Repository: CRAN Date/Publication: 2023-11-28 09:10:06 UTC scales/build/0000755000176200001440000000000014531175707012635 5ustar liggesusersscales/build/partial.rdb0000644000176200001440000001707714531175707014776 0ustar liggesusers‹í]YwŰF–¦hí»ĺ%{\‘;=R"‰ÔâENݞŰnŰrÓŠ'ÝĂ´$Š$"€PK|2§ű˙Ěź™ţ}úa;S¸ ‹(µ¦tNů–É"ę«{ż{kAőĂh.—Ëçúóů\ţd/±XćČö˙i&űrýą&ľ$O¨FMɦ2©S?8¬Smĺ‘u˘é6ˇ˛bĂ I“sě˘ÜoKňŽ-ŐYŽżâĐĂ­/6_n [fŐ¤5cţç|ÓI éűŐűUMQ)ËöçÜżŠ\ŘÔŞßo?^Ľ(7LµŞ.+Z= ĐšԤVŕ˛Ă›í+äţřÁ­°ŘRÓ`&á‹ű+ýő/öźţĽrU•,ďĘyݙݶ^?ýˇj{şrţk‡T3 Ęlh»ĂTö {’Y¨éŞLM« ®콚) kM~+›+?ßÚÝÓÔőĆZ‘ýŐµÂvˇd7 ă§Ý?®ż-”*-E•—‹µőŐő7W—×W VUR©UhJZˇęä—JAä÷ĺOŚ«O3#żé×aLT‘6˝ ůřĐ7ęţ¬/řłţíÍŐů_<^ä$&(w•ë˙5ŚŐ/É+•Ju=PÖ«­&ŐlÉVtŤ()ąęX¬ęš­h-˝e-•"€ű=҇=ʏA®b~55öŘ*„ę×8‰)ŚKn#|p]ęFazłYz‚ BçĘqĚŹ'ÁZë@ŮőâĐjűPN`~˘÷ę'9‰éT-=Ŕ0Ę Ě'RMh­eIU$+˘Ţ>”“O¦‹T&ę§8‰)#“L?lr¤q"Đ  A@~€ů24Ž­Řjż  A@~ů{o¨ţ#NbJhśüqá ”n=Ú Á3&đ$¦”jyěúíÜÁ1´mş@4iiOR[”l—÷wL*©; Ä6%Íbź8˛¦›ÍEf˝—bÎÍĎÇnĚÚäcĚ?Î[-KއqËë݇sľŃjŻą5ě2˘-1%äÖxZ8#îEÚSrŞçÂâQßALXŁHObŠ+ÎoöhŐÖM˘×HgÄEâ[ÄÖ…ĚQ.-vdf# ŦÍjűP.a~©÷¬†ę śÄÔkc¨O&÷ńŁŘ<„á2&8nÜéŚx†rIŞ?Řĺ#(ŕoˢKqU7Žĺ@^ĂüµŢ[%gĄ/=`óOfZ¨%ëN\`ÜXŃ#ČřŔś•›O¸[ņΉőż1QN!2713Ă(¤*Úî)T[Őĺ°.=łj}şĎ/ÓŇú‘śNTLşOMÁ Á ,=¬•jĂÔ›’-!Á 1övę¦$+lľ&¸!¸Ą'/v4Á Á ~ŕY7éˇŕ„ŕ7ßÝi´âÎw%Î/%ĆŢ*°ŕ…ŕĎ fj"^^řÖ.š’Ö’TÁ Á ,=¬0i’Ű-‚ç—ÎĘ…Eߊ• ÁŤ 7Fn4$1ş¤đ÷#{Š©ČŠ%hŃ Z„ëřůÓ×ŰWČĂVcď—ĂɇšÔTŞŹUgçąwÓwđȶEě„çÚv ó·â¶ JŚ˙Ú %ÝMm€t›“RzclÓŘ&ObJčŚ`ÇĐDoYLtsî–“źL‚.Ő5w[›»9‚Ôt“4ËR´:nűIÖK…ŽĚĚ#8~­˛ůbď‰Ő/sSŻaĚ é©ň)ŇĂ“é¨2z\8‘|–sź•ő$¦”ją»ŻŘŤą¦]•LkŞnĎÉŠe,¦Q_ Uz@6„Ň0ś“PĽ7ÍÍĎ'8Ţäs4(Č»O—|­ŘHŃŠ…Řm¸†¸An`>Q/äJ–„ś$SäąřZ&Šä˛|L¶?‰ÁżŔęAr‡KĄ„ňm|ĂqÉ8;‹°Af7śţě¨&ÄĆxq]ÇŃçĘ”ŻbTL—+EO«7âcű âÉ=ŔťŰmBŞşÚmgţÍXsłđ®ŢŰĹŮ2[QĄęîló‰AŢĆüíÔđ/$@ň[¬$wv^FýňH™HMCĄac:ŹS˙–;ŐNŞĎs2q§=KéŞÓű›Ăfç’4=l8 źuJ7ĄŞ©Ă‰źýXGPţŃĂpâ?ż([Îq¬ŢĺűĆýMíĐ®\5ąb“!EúËÔ9eÖ+s)đ=Ď“vˇ@ˇqgęűzÍ;Ö+7ZánEöc|Ż·ěî¶ůĘ •kJ˝eR®Řĺ †˝sőÚ%ú»´čNśŰ†» hş}ÔFpl[á ]ěآ ÷@™6ŤF·‚Â’ď‡Łĺ’ ÷Vś1tű×AVŤ•­VŢUŰ_,hŇţ˛\ÓşAřĘ —-J%ŐŇýÍŹ/—ŢC´‘˛u¨é†ĄXţt+ktżŞ7›ÎąĚí˘t+źM|ljńd šp˘l0§t^­aÓŁX7TnR»ˇóE.…`,ăŰśÚĄ¦ÂJ]§š¬Ô¸R×CĽn/܏ŇĆĽ·Ľ ôL»˘lraFłĘ‘îą'ń1e¬K‘R‹)Ňě®3 H<“ôH*0?wl÷ž‹ ”ń\ä· łÎA×Q^=T¶lS÷‰pÓ€bZ¦nŇ.Ď zčĐ1®?XVeÝć56Ů$¸už Aęt]¦«˛‰˛IŹĺ…Ăĺ]z¸Ż›|™î0ůzíXŢĹ4Ż·ĚęŃAĎŹŠŁĚÄL¦ä‹ÜÓ]°a‘Oů9P¦ŃuĄ¦É”wĺŮ.D ÓWŕJ(ń XY }?ç V,…¨¦kęaxájЦ¤đä é0ćĐ›GxŻ·řŮ.0ĘôŁcϰÓXłĹ—鎷z04EÄŔ@ßŔtM7«ľńHXP.wł·»ą] aĄü‡– Đô¬÷aŁ ĺČ µę¶ó¦řŁ˘uDÔvo=´8ŞË UEây2|Ě †Ë¶Ti©ľČß=¬`erŃái°üšüFBµ]’· _€íÖµߏĂF#Đ}cÓę1c“RŁŞĹ[çjWń¸]~ś28PjGG” eßŘ! MŮŘ=F™ŕšźEŘúRŮ`sgÖGü"ďUőQÄ$Î?lóÇdÖ^ESĐßů=r9ń&µŕ5w¦Ľ`٬ęŤJKQĺßŮş®ZwîÜ)É;j‡×ĚÍ^_žť˙%dÇ/ÚŐ0_ëĚâřY|6Đ5)˙~űń"Nű_ćÜχˇBč<űî˙Ď˙Ţž˝ç}Ţžć=ęĽÚzýô‡ŞíŔůŻÝŃüh°‚7…çJĹ”ĚĂÂc“őv¬{ݵ ĄĄš÷źÂw*`Ö–V%łys­P˘nßi¬†dŇBI.¸sĚ‚uh±ľäÍvÇ‚µýX0LeŹő—6˛+ÔX@dW/¨k{ŻfĘEĂZ“ßĘćĘĎ·v÷4uý ±Vdu­°](ŮMĂři÷Źëo %Ç`ËĹÚúęúŤ›«Ëë«gˇĆň“¬kÚ<ĦÍ8x‹*ŇýNÓîiî«R"†JÁ"_uńŃÇAřnçUiîúr(ë®"Ó@†,VŽ˝^ŃË?—¶é\C?LŢĐ/1ś˝S™á~y“îwďÜ~ůĺ—wn&¤Ť+Ř.w0'ł6ްůš^W%}gaĎĐf˛áŐmŐŢ]_†–˛CšÉ-ý…­úÇkf WzXş˙Ň ßY´đ¦3ü|×°mĂşS(Ŕµ—J‹L‹đÔ%ݬ0pn°†ľnĂiwH“ą|s/0˙"“&łá‘ĹPĐl¨űqM˙‹Y’„µę#l Č"ć‹iř2WB o» NYXő»řý˘łÜÝ#z÷WAţ óJ«‡cŤ§<ý<ŐdĹ·gˇˇ{ń5¤¸őGëhőňĎ˙sf±­3®Ú|ý°ôôŐöÓ­—Ůč"Á(ŠĂ­o dČ(ęřúđéaŇÓĂ}\(ĘBwă«Ŕ]§Šný,¶dóĺLâa?›ę)Ů´{ńVYt+ Ř2÷0/µŤg<żŤÍŐ4š‘ťĆ·sł !Z ü]?órćŃ10ëęuňŹ&K2Ž»ůöěžč\€ÍH´‚{·=錋 “lćęwfUw˙žóţxçÝÔ$pGqáKň„jÎbźL*‡ÄÔëT[ąCdťhşM¨¬ŘđEŁÍ¨.Ň =ÜzńbóeŘýGîÖ'ß7$žE棾 ţrxłłNýĎ®éćßJý‹­ýwVÓMóäŤÎüz§˝ĎĺMEÓÝß>-r“Ç/#ŮmvćŻT*YÔeż¬Wť{îAŠFJÎńť"Ź€óáN‘tlÝĺQ_žL®»ĐW~ůíÍféA4ج1„’;ű">´ĐZ˝; ˇŐöˇĽŚůË˝7 T…“΂a ^ŁĽŚůD ­µ}K3´Ţ>”![˘ze¨ţ*'1ed™ŁŹ†‰°ČZä8ćÇ{`‘´H•‚ěµE úINbĘČ"#ŽEvÇÄ´Ę ZbË»ňÄ­âő‰ /bţbď­i†“2˛Ę¸b-% `Ch ď4Ąá\–=K´a†Đ O±kęŻp2Ű®eŘ3LLŁ siŞ#OÜ(Ăháö/zi:Ł@ő9‰)+o‘’{Ë˘é±·Ś 1FN×[FĐC<™±·HÉĽe 1ÚcoECŚž®·Ś˘‡x2[o™}hR6{&ať~đŚ8÷`ĽxÇĐD ç1?źˇąp“nh˝}(żÂüW˝7T˙5'1%4IýX7Fćűť”j™ňMŞćbŁâFĐü©ş)Q 3ÝřO L"„ÉśŻ“L g‚t*>&N-N8ĆQ4çť;ńMçÚA÷¶”®"w¨D6ČËďź?ŹŽýó»*R‚» ŕPa‰ˇÍ ŮőîźRa±{¤6Őd*︟$yh‘ż—˙9ć?O rž¦˘éćNŞIë°+p‡˙8 ^N‘N7Ó—KŘÍřđ~JŰý1¤nfÇI ň‡‘r7ÓSBüQR‡;TđhŰÜâS­¶@Ř?ńźă÷qo~H /ióů“ëą#qđŻżŕn䤍¸í5•řÝäGdv7q7É{fşIţ]gŁ›ä÷Íśąnň3ňŚu“\Żsv»ÉkěZî_Ł›$äí&ż@X_äÎd79‹@žj7É?šÝ$˙¸~vÝä4żČ=wî1üiĚOź‚z~‹u{2ő´ď$QŤ÷P>ČqĚ'şg–R5üîŔěTł$ůł@$łÎś^†˝AťśmĹnŮ”©.ÁK¸¨™[ÂüŇ)(Ź[ÓĘPy_Im^e­¸Żä׹” rˇŐ¶ť ]ńâ÷_eŁ¨Ř P}ž“Ŕ€)ů'iá,˘f<‰)!hLŘrrg§É±‘S ˇĹühdˇ.Ö´ś@y ó×2#räŰą`ĂăzÍc¨ţ Nbę5ŚjŔ“É˝ú(ţŽĽ÷ÎaĽ"äć§“8€µ\kiÎn:&zŤt>´l(nP€[ě±ßč°gP>ŔüÔFžôű^LLËheÜýI»]‘«v ó‰,™ŽďËXΓz c5ŕÉ“q»!\; n äć­ýśŽÓ­b9÷0/µ‰?óÖaXФňÁ549Hnéč¤}p•«6»U–Řä‡ęŻqSŻaÜ@ xňd|pL~˙.Ů€7Ń÷@^Ä|˘- °ţ°[[ÎŁű’JŽăueŹ&ňFĺ3Ě?Kměy™:Ď'0TáąD^H‡¤BIL¸· Ó-ě…Žăa 7î„ Q®b~5Ă`ńÖr¨î+”k_KďĄK r“N:TŢäxŕĺoö>FÝ O˝†Á?„‚ł„öÍŽđÖsnp™~–pJŔĎ üć—ÚÔ·»ĺ‘™¤q“{EŘŰZO#n”»(`>Ńä+^ÜĽ6ůó{7ˇúGśÄtŇqsťăÁ&ć7{° úÇśÄÔkß ĘÔC‡×c‚áćHüý͛ß{ß5rň x&Q^ĹüŐ“ź?­ÓÁřşS‹4ĄC‡Ĺ±.«Ş¶dęĆ‹ö-` é·Q/Đ5@na~+uŁÖß7¨0‘LęĽ@Ö¤o[ŠéôĽKqáżDČ ×1żžMßw°¶7ńwJăO¨>ĎÉtăĎ iáĽĘąObŠÇyq‹lanŞs¶3 Ö1ÁţÍ2ä<‘ÔqÎ=4ŞçŐF„×ĚŞő?šą@NKëGRc‚§FÜuQAŚóK >fŘ’‚íŇÓjTôŞ~ ¸!¸Ą/v¸QŐ›†{7« Çů%GçŃ˝Ů9W0C0#8 Ą† † F71͸Ű1Î/1f:ÄPdŞŮŠ}(Ř!ŘŃ6T˝.!Ń˝¬Á±\ÔÔ§†!¨!¨Ń=qeÔXĚĚ JÜg?5Î/5¸ĄĐ¦.·Ô–ľ rxĄŻtČazEŞ(ŞÁ ‚tJOű "zÁŤvéË7,Ú’u±Č!řΓV?Ş’*ř!řŃ=25i’WN rś_rpkÖ[S ;3Ba+±_x.q~™1ăg†eHš`‡`–ď°ăđ'Á‹^đ"\ÇĎźľŢޏBľ$‡0*ös-|“2jŔp٢đ ©ůŞ«„SĽšˇÄ8”Ŕ+ fˇ€”ç$¦^ćSŠ˘ŮÔÔbOđŕâQ”síŁŔ33Ő.=Ü×M9˘ć>”3źIýb›ŞżÄILÉîP]uzŰŘě\V,…Ď&ŕł~÷˘Sż">hŐg¬˝N€K ¶Ć,Î3™´°'™…š®ĘlZP× ö^Í”‹†µ&ż•Í•źoíîięúAc­ČţęZa»P˛›†ńÓî×ßJ•–˘ĘËĹÚúęúŤ›«Ëë««*©Ô*4%­ŕ;J|Éł…H&ÉÝż·mÁP:OŃ]jáKň¤ý¶±Ę!1őĂ:ŐVîYwʤ˛bĂ I“#¸7ôpëŋ͗aôă‚TűT©…2˘/^âŮAnWáőK„liđůť¸ŠśŕŇbGƇë,|u÷ë©ďk¶ţ@mŃĄČG"}oy2di7ő=bE9łjSŢiČÇűmł"ls†ls ŚbëŹ$swËy‘Ł0Đ™7Đma 3d i0M‰Ę"ľý+XGřÎY˛Î¤Üž”jKËkÂ6gČ6ăžm¤Ă%á5gÉ23®eÜá‹mÂsΖ}¦xűÉč™6Ž­ť%ăLúŚ#zťłd›«Ď•zĂîĚFĹJŰٳѕ0Ý&:C&š|(Ů´®›JURE÷s¶lsŃ™Úú ©»¦––o óś!ó\zmSĂ ňkú¶ďdtă˙›ÂÍqśGŕ۰Ýó ‰8ło‚kČć7â6$ Jş;¶é;NbĘHÇGźă7Ž ™B™čúɨ ĺ9‰)ˇOćÓ™F ySĘPµcŹS\ÄŃ C¶‚§äŐűNč™ĆgŇ0+=‹f9žLǢ‘㉌ăp•1NíL¨–JŤĚáiN°Â2¤*ť›mďî™] ě;j«‡dl—ľßśź'ďbcç6÷än`ţFjěË„X }‡ŃÎżck6°5;?·\śŹżA‰Ű!éě·îË%ÝsÍ[ŚűFŘW*Č"ć‹'çA‘8>Ŕş=™Ť'CČuňPŇHˢd_±¤nJ˛Âú©Ť; T"Uť ™4˝eµ ÄnÁ‡ä7˙& 0Ű[äŰE°đÎ*w%>>B¨eJ€Ťo;j‡ČšźłčŰąâY^ *ŐęvcIoŮ,l¬2׋߆Ź7ČÄă®îţ/±|‚•Ěc>QGZíH™HMĂyb'4ćCuźfę@±»ÂO±ĺžLÜFŹ×»ęôţ>Ăfç’4=l| ź‰'ß÷´ZÔ“‰đ]űľ ‡«ÎőŕÇîÓ]Ź;âçÝ•ĺţůfÁ0?żZscales/tests/0000755000176200001440000000000014147724140012672 5ustar liggesusersscales/tests/testthat/0000755000176200001440000000000014531327156014535 5ustar liggesusersscales/tests/testthat/test-colour-mapping.R0000644000176200001440000002233014520130030020546 0ustar liggesusersbw <- c("black", "white") test_that("Edgy col_bin scenarios", { # Do these cases make sense? expect_equal(col_bin(bw, NULL)(1), "#777777") expect_equal(col_bin(bw, 1)(1), "#FFFFFF") }) test_that("Outside of domain returns na.color", { suppressWarnings({ expect_identical("#808080", col_factor(bw, letters)("foo")) expect_identical("#808080", col_quantile(bw, 0:1)(-1)) expect_identical("#808080", col_quantile(bw, 0:1)(2)) expect_identical("#808080", col_numeric(bw, c(0, 1))(-1)) expect_identical("#808080", col_numeric(bw, c(0, 1))(2)) expect_true(is.na(col_factor(bw, letters, na.color = NA)("foo"))) expect_true(is.na(col_quantile(bw, 0:1, na.color = NA)(-1))) expect_true(is.na(col_quantile(bw, 0:1, na.color = NA)(2))) expect_true(is.na(col_numeric(bw, c(0, 1), na.color = NA)(-1))) expect_true(is.na(col_numeric(bw, c(0, 1), na.color = NA)(2))) }) expect_warning(col_factor(bw, letters, na.color = NA)("foo")) expect_warning(col_quantile(bw, 0:1, na.color = NA)(-1)) expect_warning(col_quantile(bw, 0:1, na.color = NA)(2)) expect_warning(col_numeric(bw, c(0, 1), na.color = NA)(-1)) expect_warning(col_numeric(bw, c(0, 1), na.color = NA)(2)) }) test_that("Basic color accuracy", { expect_identical(c("#000000", "#808080", "#FFFFFF"), col_numeric(colorRamp(bw), NULL)(c(0, 0.5, 1))) expect_identical(c("#000000", "#FFFFFF"), col_bin(bw, NULL)(c(1, 2))) expect_identical(c("#000000", "#FFFFFF"), col_bin(bw, c(1, 2))(c(1, 2))) expect_identical(c("#000000", "#FFFFFF"), col_bin(bw, c(1, 2), 2)(c(1, 2))) expect_identical(c("#000000", "#FFFFFF"), col_bin(bw, NULL, bins = c(1, 1.5, 2))(c(1, 2))) expect_identical(c("#000000", "#FFFFFF"), col_bin(bw, c(1, 2), bins = c(1, 1.5, 2))(c(1, 2))) expect_identical(c("#000000", "#777777", "#FFFFFF"), col_numeric(bw, NULL)(1:3)) expect_identical(c("#000000", "#777777", "#FFFFFF"), col_numeric(bw, c(1:3))(1:3)) expect_identical(rev(c("#000000", "#777777", "#FFFFFF")), col_numeric(rev(bw), c(1:3))(1:3)) # domain != unique(x) expect_identical(c("#000000", "#0E0E0E", "#181818"), col_factor(bw, LETTERS)(LETTERS[1:3])) # domain == unique(x) expect_identical(c("#000000", "#777777", "#FFFFFF"), col_factor(bw, LETTERS[1:3])(LETTERS[1:3])) # no domain expect_identical(c("#000000", "#777777", "#FFFFFF"), col_factor(bw, NULL)(LETTERS[1:3])) # Non-factor domains are sorted unless instructed otherwise expect_identical(c("#000000", "#777777", "#FFFFFF"), col_factor(bw, rev(LETTERS[1:3]))(LETTERS[1:3])) expect_identical(rev(c("#000000", "#777777", "#FFFFFF")), col_factor(bw, rev(LETTERS[1:3]), ordered = TRUE)(LETTERS[1:3])) }) test_that("col_numeric respects alpha", { expect_equal( col_numeric(c("#FF000000", "#FF0000FF"), c(0, 1), alpha = TRUE)(0.5), "#FF000080" ) }) test_that("CIELab overflow", { expect_identical(c("#FFFFFF", "#CFB1FF", "#9265FF", "#0000FF"), colour_ramp(c("white", "blue"))(0:3 / 3)) }) test_that("factors match by name, not position", { full <- factor(letters[1:5]) pal <- col_factor("magma", na.color = NA, levels = full) partial <- full[2:4] expect_identical(pal(partial), pal(droplevels(partial))) # Sending in values outside of the color scale should result in a warning and na.color expect_warning(col <- pal(letters[10:20])) expect_true(all(is.na(col))) }) test_that("qualitative palettes don't interpolate", { pal <- col_factor("Accent", na.color = NA, levels = letters[1:5]) allColors <- RColorBrewer::brewer.pal( n = RColorBrewer::brewer.pal.info["Accent", "maxcolors"], name = "Accent" ) # If we're not interpolating, then the colors for each level should match # exactly with the color in the corresponding position in the palette. expect_identical(pal(letters[1:5]), allColors[1:5]) # Same behavior when domain is provided initially expect_identical( col_factor("Accent", domain = rep(letters[1:5], 2))(letters[1:5]), allColors[1:5] ) # Same behavior when domain is provided initially, and is a factor expect_identical( col_factor("Accent", domain = factor(rep(letters[5:1], 2)))(letters[1:5]), allColors[1:5] ) # Same behavior when domain is provided initially, and is not a factor expect_identical( col_factor("Accent", domain = rep(letters[5:1], 2), ordered = TRUE)(letters[5:1]), allColors[1:5] ) # Same behavior when no domain or level is provided initially expect_identical( col_factor("Accent", NULL)(letters[1:5]), allColors[1:5] ) # Values outside of the originally provided levels should be NA with warning expect_warning(pal(letters[6])) expect_true(suppressWarnings(is.na(pal(letters[6])))) }) test_that("OK, qualitative palettes sometimes interpolate", { pal <- col_factor("Accent", na.color = NA, levels = letters[1:20]) allColors <- RColorBrewer::brewer.pal( n = RColorBrewer::brewer.pal.info["Accent", "maxcolors"], name = "Accent" ) expect_warning(result <- pal(letters[1:20])) # The first and last levels are the first and last palette colors expect_true(all(result[c(1, 20)] %in% allColors)) # All the rest are interpolated though expect_true(!any(result[-c(1, 20)] %in% allColors)) }) verifyReversal <- function(colorFunc, values, ..., filter = identity) { f1 <- filter(colorFunc("Blues", domain = values, ...)(values)) f2 <- filter(colorFunc("Blues", domain = NULL, ...)(values)) f3 <- filter(colorFunc("Blues", domain = values, reverse = FALSE, ...)(values)) f4 <- filter(colorFunc("Blues", domain = NULL, reverse = FALSE, ...)(values)) r1 <- filter(colorFunc("Blues", domain = values, reverse = TRUE, ...)(values)) r2 <- filter(colorFunc("Blues", domain = NULL, reverse = TRUE, ...)(values)) expect_identical(f1, f2) expect_identical(f1, f3) expect_identical(f1, f4) expect_identical(r1, r2) expect_identical(f1, rev(r1)) } test_that("col_numeric can be reversed", { verifyReversal(col_numeric, 1:10) }) test_that("col_bin can be reversed", { # col_bin needs to filter because with 10 values and 7 bins, there is some # repetition that occurs in the results. Hard to explain but easy to see: # scales::show_col(col_bin("Blues", NULL)(1:8)) # scales::show_col(col_bin("Blues", NULL, reverse = TRUE)(1:8)) verifyReversal(col_bin, 1:10, filter = unique) }) test_that("col_quantile can be reversed", { verifyReversal(col_quantile, 1:10, n = 7) }) test_that("col_factor can be reversed", { # With interpolation verifyReversal(col_factor, letters[1:8]) # Without interpolation accent <- suppressWarnings(RColorBrewer::brewer.pal(Inf, "Accent")) result1 <- col_factor("Accent", NULL)(letters[1:5]) expect_identical(result1, head(accent, 5)) # Reversing a qualitative palette means we should pull the same colors, but # apply them in reverse order result2 <- col_factor("Accent", NULL, reverse = TRUE)(letters[1:5]) expect_identical(result2, rev(head(accent, 5))) }) test_that("Palettes with ncolor < 3 work properly", { test_palette <- function(palette) { colors <- col_factor(palette, letters[1:2])(letters[1:2]) # brewer.pal returns minimum 3 colors, and warns if you request less than 3. expected_colors <- suppressWarnings(RColorBrewer::brewer.pal(2, palette))[1:2] # The expected behavior is that the first two colors in the palette are returned. # This is different than the behavior in Leaflet color* functions; in those # functions, when 2 colors are needed from an RColorBrewer palette, the first and # third colors are used. Using the first and third is arguably a better choice # for sequential and diverging palettes, and very arguably worse for qualitative. # The scales' col_* functions use the first 2 colors for consistency with # scales::brewer_pal. expect_identical(colors, expected_colors) colors <- col_bin(palette, 1:2, bins = 2)(1:2) expect_identical(colors, expected_colors) } # Qualitative palette test_palette("Accent") # Sequential palette test_palette("Blues") # Diverging palette test_palette("Spectral") }) test_that("col_quantile handles skewed data", { expect_snapshot({ x <- c(1:5, rep(10, 10)) col <- col_quantile("RdYlBu", domain = x, n = 7)(x) col <- col_quantile("RdYlBu", domain = NULL, n = 7)(x) }) }) test_that("Arguments to `cut` are respected", { colors1 <- col_bin("Greens", 1:3, 1:3)(1:3) # Intervals are [1,2) and [2,3], so 2 and 3 are the same expect_identical(colors1, c("#E5F5E0", "#A1D99B", "#A1D99B")) colors2 <- col_bin("Blues", 1:3, 1:3, right = TRUE)(1:3) # Intervals are [1,2] and (2,3], so 1 and 2 are the same expect_identical(colors2, c("#DEEBF7", "#DEEBF7", "#9ECAE1")) # Shows that you can use cut + col_factor to achieve finer grained # control than with col_bin pal <- col_factor("Reds", domain = NULL, na.color = NA) colorsTT <- pal(cut(1:3, 1:3, include.lowest = TRUE, right = TRUE)) expect_identical(colorsTT, c("#FEE0D2", "#FEE0D2", "#FC9272")) colorsTF <- pal(cut(1:3, 1:3, include.lowest = TRUE, right = FALSE)) expect_identical(colorsTF, c("#FEE0D2", "#FC9272", "#FC9272")) colorsFT <- pal(cut(1:3, 1:3, include.lowest = FALSE, right = TRUE)) expect_identical(colorsFT, c(NA, "#FEE0D2", "#FC9272")) colorsFF <- pal(cut(1:3, 1:3, include.lowest = FALSE, right = FALSE)) expect_identical(colorsFF, c("#FEE0D2", "#FC9272", NA)) }) scales/tests/testthat/test-scale-continuous.R0000644000176200001440000000172014520422774021130 0ustar liggesuserstest_that("NA.value works for continuous scales", { x <- c(NA, seq(0, 1, length.out = 10), NA) pal <- rescale_pal() expect_equal(cscale(x, pal)[1], NA_real_) expect_equal(cscale(x, pal)[12], NA_real_) expect_equal(cscale(x, pal, 5)[1], 5) expect_equal(cscale(x, pal, 5)[12], 5) }) test_that("train_continuous stops on discrete values", { expect_error(train_continuous(LETTERS[1:5]), regexp = "Discrete value supplied" ) }) test_that("train_continuous strips attributes", { expect_equal(train_continuous(1:5), c(1, 5)) x <- as.Date("1970-01-01") + c(1, 5) expect_equal(train_continuous(x), c(1, 5)) }) test_that("train_continuous with new=NULL maintains existing range.", { expect_equal( train_continuous(NULL, existing = c(1, 5)), c(1, 5) ) }) test_that("train_continuous works with integer64", { skip_if_not_installed("bit64") new <- bit64::as.integer64(1:10) expect_identical( train_continuous(new), c(1, 10) ) }) scales/tests/testthat/test-minor_breaks.R0000644000176200001440000000072114520130030020265 0ustar liggesuserstest_that("minor breaks are calculated correctly", { l1 <- c(0, 9) b1 <- extended_breaks()(l1) m1 <- regular_minor_breaks()(b1, l1, n = 2) expect_equal(m1, c(0, 1.25, 2.5, 3.75, 5, 6.25, 7.5, 8.75, 10)) }) test_that("minor breaks for reversed scales are comparable to non-reversed", { l2 <- c(0, -9) b2 <- extended_breaks()(l2) m2 <- regular_minor_breaks()(b2, l2, n = 2) expect_equal(m2, c(-10, -8.75, -7.5, -6.25, -5, -3.75, -2.5, -1.25, 0)) }) scales/tests/testthat/test-full-seq.R0000644000176200001440000000172414520130030017346 0ustar liggesuserstest_that("works with numeric", { x <- c(0, 100) expect_equal(fullseq(x, 50), c(0, 50, 100)) }) test_that("works with POSIXct", { x <- as.POSIXct(c("2000-01-01 08:29:58", "2000-01-01 08:30:10"), tz = "UTC") expect_equal( fullseq(x, "1 hour"), as.POSIXct(c("2000-01-01 8:00:00 UTC", "2000-01-01 9:00:00 UTC"), tz = "UTC") ) expect_equal( fullseq(x, ".5 secs")[1:2], as.POSIXct(c("2000-01-01 08:29:58.0 UTC", "2000-01-01 08:29:58.5 UTC"), tz = "UTC") ) }) test_that("works with Date", { x <- as.Date("2012-01-01") + 1:30 expect_equal(fullseq(x, "1 month"), as.Date(c("2012-01-01", "2012-02-01"))) }) test_that("works with hms/difftime", { x <- hms::hms(hours = 0:1) y <- as.difftime(c(0, 1800, 3600), units = "secs") expect_equal(fullseq(x, 1800), y) expect_equal(fullseq(x, "30 mins"), y) # Preserves units x <- as.difftime(c(0, 1), units = "hours") expect_equal(fullseq(x, 1800), as.difftime(c(0, 0.5, 1), units = "hours")) }) scales/tests/testthat/test-label-ordinal.R0000644000176200001440000000116214520130030020317 0ustar liggesusers test_that("ordinal format in English", { expect_snapshot({ ordinal(c(1:4, 11:21, 101, NA)) ordinal(c(1, 2, 10, 11, NA), rules = ordinal_french()) ordinal(c(1, 2, 10, 11, NA), rules = ordinal_french("f", TRUE)) }) }) test_that("ordinal match rules in order", { custom <- list( a = "^1", b = ".", c = "^3" ) expect_equal( ordinal(1:3, rules = custom), c("1a", "2b", "3b") ) }) test_that("ordinal format maintains order", { expect_equal(ordinal(c(21, 1, NA, 11)), c("21st", "1st", NA, "11th")) }) test_that("ordinal preserves names", { expect_named(ordinal(c(a = 1)), "a") }) scales/tests/testthat/test-label-wrap.R0000644000176200001440000000102213610067251017650 0ustar liggesuserstest_that("wrap correctly wraps long lines", { expect_equal( label_wrap(10)("this is a long line"), "this is a\nlong line" ) expect_equal( label_wrap(10)(c("this is a long line", "this is another long line")), c("this is a\nlong line", "this is\nanother\nlong line") ) expect_equal( label_wrap(10)("a_very_long_word_without_spaces"), "a_very_long_word_without_spaces" ) expect_equal(wrap_format(10)("short line"), "short\nline") expect_equal(wrap_format(15)("short line"), "short line") }) scales/tests/testthat/test-pal-manual.R0000644000176200001440000000045514522421001017650 0ustar liggesuserstest_that("pal_manual gives warning if n greater than the number of values", { expect_warning(pal_manual(c("red", "blue", "green"))(4), "can handle a maximum") }) test_that("pal_manual returns an unnamed vector", { x <- c(foo = "red", bar = "blue") expect_equal(pal_manual(x)(2), unname(x)) }) scales/tests/testthat/test-label-expression.R0000644000176200001440000000072214520130030021067 0ustar liggesuserstest_that("parse_format() returns an expression object", { expect_equal( parse_format()(c("alpha", "beta", "gamma")), expression(alpha, beta, gamma) ) expect_equal( parse_format()(1:5), expression(1, 2, 3, 4, 5) ) expect_identical(label_math()(character()), expression()) expect_identical(label_parse()(character()), expression()) }) test_that("math_format() returns expression", { expect_equal(label_math()(1), expression(10^1)) }) scales/tests/testthat/test-bounds.R0000644000176200001440000001354214522154141017124 0ustar liggesuserstest_that("rescale_mid returns correct results", { x <- c(-1, 0, 1) expect_equal(rescale_mid(x), c(0, 0.5, 1)) expect_equal(rescale_mid(x, mid = -1), c(0.5, 0.75, 1)) expect_equal(rescale_mid(x, mid = 1), c(0, 0.25, 0.5)) expect_equal(rescale_mid(x, mid = 1, to = c(0, 10)), c(0, 2.5, 5)) expect_equal(rescale_mid(x, mid = 1, to = c(8, 10)), c(8, 8.5, 9)) expect_equal(rescale_mid(c(1, NA, 1)), c(0.5, NA, 0.5)) }) test_that("rescale_max returns correct results", { expect_equal(rescale_max(0), NaN) expect_equal(rescale_max(1), 1) expect_equal(rescale_max(.3), 1) expect_equal(rescale_max(c(4, 5)), c(0.8, 1.0)) expect_equal(rescale_max(c(-3, 0, -1, 2)), c(-1.5, 0, -0.5, 1)) expect_equal(rescale_max(c(-3, 0, -1, 2)), c(-1.5, 0, -0.5, 1)) }) test_that("rescale functions handle NAs consistently", { expect_equal(rescale(c(2, NA, 0, -2)), c(1, NA, 0.5, 0)) expect_equal(rescale(c(-2, NA, -2)), c(.5, NA, .5)) expect_equal(rescale_mid(c(NA, 1, 2)), c(NA, 0.75, 1)) expect_equal(rescale_mid(c(2, NA, 0, -2), mid = .5), c(0.8, NA, 0.4, 0)) expect_equal(rescale_mid(c(-2, NA, -2)), c(.5, NA, .5)) expect_equal(rescale_max(c(1, NA)), c(1, NA)) expect_equal(rescale_max(c(2, NA, 0, -2)), c(1, NA, 0, -1)) expect_equal(rescale_max(c(-2, NA, -2)), c(1, NA, 1)) }) test_that("rescale preserves NAs even when x has zero range", { expect_equal(rescale(c(1, NA)), c(0.5, NA)) }) test_that("zero range inputs return mid range", { expect_equal(rescale(0), 0.5) expect_equal(rescale(c(0, 0)), c(0.5, 0.5)) }) test_that("scaling is possible with dates and times", { dates <- as.Date(c("2010-01-01", "2010-01-03", "2010-01-05", "2010-01-07")) expect_equal(rescale(dates, from = c(dates[1], dates[4])), seq(0, 1, 1 / 3)) expect_equal(rescale_mid(dates, mid = dates[3])[3], 0.5) dates <- as.POSIXct(c( "2010-01-01 01:40:40", "2010-01-01 03:40:40", "2010-01-01 05:40:40", "2010-01-01 07:40:40" )) expect_equal(rescale(dates, from = c(dates[1], dates[4])), seq(0, 1, 1 / 3)) expect_equal(rescale_mid(dates, mid = dates[3])[3], 0.5) }) test_that("scaling is possible with integer64 data", { skip_if_not_installed("bit64") x <- bit64::as.integer64(2^60) + c(0:3) expect_equal( rescale_mid(x, mid = bit64::as.integer64(2^60) + 1), c(0.25, 0.5, 0.75, 1) ) }) test_that("scaling is possible with NULL values", { expect_null(rescale(NULL)) expect_null(rescale_mid(NULL)) }) test_that("rescaling does not alter AsIs objects", { expect_identical(I(1:3), rescale(I(1:3), from = c(0, 4))) expect_identical(I(1:3), rescale_mid(I(1:3), from = c(0, 4), mid = 1)) }) test_that("scaling is possible with logical values", { expect_equal(rescale(c(FALSE, TRUE)), c(0, 1)) expect_equal(rescale_mid(c(FALSE, TRUE), mid = 0.5), c(0, 1)) }) test_that("expand_range respects mul and add values", { expect_equal(expand_range(c(1, 1), mul = 0, add = 0.6), c(0.4, 1.6)) expect_equal(expand_range(c(1, 1), mul = 1, add = 0.6), c(-0.6, 2.6)) expect_equal(expand_range(c(1, 9), mul = 0, add = 2), c(-1, 11)) }) test_that("out of bounds functions return correct values", { x <- c(-Inf, -1, 0.5, 1, 2, NA, Inf) expect_equal(oob_censor(x), c(-Inf, NA, 0.5, 1, NA, NA, Inf)) expect_equal(oob_censor_any(x), c(NA, NA, 0.5, 1, NA, NA, NA)) expect_equal(oob_censor(x), censor(x)) expect_equal(oob_squish(x), c(-Inf, 0, 0.5, 1, 1, NA, Inf)) expect_equal(oob_squish_any(x), c(0, 0, 0.5, 1, 1, NA, 1)) expect_equal(oob_squish_infinite(x), c(0, -1, 0.5, 1, 2, NA, 1)) expect_equal(oob_squish(x), squish(x)) expect_equal(oob_discard(x), c(0.5, 1, NA)) expect_equal(oob_discard(x), discard(x)) expect_equal(oob_keep(x), x) }) # zero_range -------------------------------------------------------------- test_that("large numbers with small differences", { expect_false(zero_range(c(1330020857.8787, 1330020866.8787))) expect_true(zero_range(c(1330020857.8787, 1330020857.8787))) }) test_that("small numbers with differences on order of values", { expect_false(zero_range(c(5.63e-147, 5.93e-123))) expect_false(zero_range(c(-7.254574e-11, 6.035387e-11))) expect_false(zero_range(c(-7.254574e-11, -6.035387e-11))) }) test_that("ranges with 0 endpoint(s)", { expect_false(zero_range(c(0, 10))) expect_true(zero_range(c(0, 0))) expect_false(zero_range(c(-10, 0))) expect_false(zero_range(c(0, 1) * 1e-100)) expect_false(zero_range(c(0, 1) * 1e+100)) }) test_that("symmetric ranges", { expect_false(zero_range(c(-1, 1))) expect_false(zero_range(c(-1, 1 * (1 + 1e-20)))) expect_false(zero_range(c(-1, 1) * 1e-100)) }) test_that("length 1 ranges", { expect_true(zero_range(c(1))) expect_true(zero_range(c(0))) expect_true(zero_range(c(1e100))) expect_true(zero_range(c(1e-100))) }) test_that("NA and Inf", { # Should return NA expect_true(is.na(zero_range(c(NA, NA)))) expect_true(is.na(zero_range(c(1, NA)))) expect_true(is.na(zero_range(c(1, NaN)))) # Not zero range expect_false(zero_range(c(1, Inf))) expect_false(zero_range(c(-Inf, Inf))) # Can't know if these are truly zero range expect_true(zero_range(c(Inf, Inf))) expect_true(zero_range(c(-Inf, -Inf))) }) test_that("Tolerance", { # By default, tolerance is 1000 times this eps <- .Machine$double.eps expect_true(zero_range(c(1, 1 + eps))) expect_true(zero_range(c(1, 1 + 99 * eps))) # Cross the threshold expect_false(zero_range(c(1, 1 + 1001 * eps))) expect_false(zero_range(c(1, 1 + 2 * eps), tol = eps)) # Scaling up or down all the values has no effect since the values # are rescaled to 1 before checking against tol expect_true(zero_range(100000 * c(1, 1 + eps))) expect_true(zero_range(.00001 * c(1, 1 + eps))) expect_true(zero_range(100000 * c(1, 1 + 99 * eps))) expect_true(zero_range(.00001 * c(1, 1 + 99 * eps))) expect_false(zero_range(100000 * c(1, 1 + 1001 * eps))) expect_false(zero_range(.00001 * c(1, 1 + 1001 * eps))) }) scales/tests/testthat/test-label-scientific.R0000644000176200001440000000213513610067251021025 0ustar liggesusers test_that("scientific format shows specific sig figs", { expect_equal(label_scientific(digits = 1)(123456), "1e+05") expect_equal(label_scientific(digits = 2)(123456), "1.2e+05") expect_equal(label_scientific(digits = 3)(123456), "1.23e+05") expect_equal(label_scientific(digits = 1)(0.123456), "1e-01") expect_equal(label_scientific(digits = 2)(0.123456), "1.2e-01") expect_equal(label_scientific(digits = 3)(0.123456), "1.23e-01") }) test_that("prefix and suffix works with scientific format", { expect_equal(scientific(123456, digits = 2, prefix = "V="), "V=1.2e+05") expect_equal(scientific(123456, digits = 2, suffix = " km"), "1.2e+05 km") }) test_that("scale works with scientific format", { expect_equal(scientific(123456, digits = 2, scale = 1000), "1.2e+08") }) test_that("decimal.mark works with scientific format", { expect_equal(scientific(123456, digits = 2, decimal.mark = ","), "1,2e+05") }) test_that("scientific format respects NAs", { expect_equal(scientific(NA), NA_character_) }) test_that("scientific preserves names", { expect_named(scientific(c(a = 1)), "a") }) scales/tests/testthat/test-label-percent.R0000644000176200001440000000127414520130030020333 0ustar liggesusers test_that("negative percents work", { expect_equal(percent(-0.6, accuracy = 1), "-60%") }) test_that("Single 0 gives 0%", { expect_equal(percent(0), "0%") }) test_that("preserves NAs", { expect_equal(percent(c(NA, 1, 2, 3)), c(NA, "100%", "200%", "300%")) expect_equal(percent(NA_real_), NA_character_) }) test_that("preserves names", { expect_named(percent(c(a = 1)), "a") }) test_that("default accuracy works for range of inputs", { x <- c(0.1, 0.2, 0.5) expect_equal(percent(x / 100), c("0.1%", "0.2%", "0.5%")) expect_equal(percent(x / 10), c("1%", "2%", "5%")) expect_equal(percent(x), c("10%", "20%", "50%")) expect_equal(percent(x * 10), c("100%", "200%", "500%")) }) scales/tests/testthat/test-label-number-si.R0000644000176200001440000000022614522421001020573 0ustar liggesuserstest_that("label_number_si() is deprecated", { lifecycle::expect_defunct(label_number_si("")) lifecycle::expect_defunct(label_number_si("m")) }) scales/tests/testthat/test-label-bytes.R0000644000176200001440000000553614520130030020026 0ustar liggesuserstest_that("auto units always rounds down", { expect_equal(label_bytes()(1000^(1:3)), c("1 kB", "1 MB", "1 GB")) }) test_that("auto units handles 0 and other special values", { expect_equal(label_bytes()(NA_real_), NA_character_) expect_equal(label_bytes()(0), "0 B") expect_equal(label_bytes()(-1), "-1 B") expect_equal(label_bytes()(Inf), "Inf") }) test_that("can use either binary or si units", { expect_equal(label_bytes("kB")(1000), "1 kB") expect_equal(label_bytes("kiB")(1024), "1 kiB") }) test_that("compatible with scale argument", { expect_equal(label_bytes("auto_si", scale = 2)(500), "1 kB") expect_equal(label_bytes("auto_binary", scale = 2)(512), "1 kiB") }) test_that("errors if unknown unit", { expect_error(label_bytes("unit")(0), "valid unit") }) # deprecated interface ---------------------------------------------------- test_that("Byte formatter can take a symbol designator", { expect_equal( number_bytes(c(50, 400, 502, NA), symbol = "B"), c("50 B", "400 B", "502 B", NA) ) expect_equal( number_bytes(3:5 * 1024^2, symbol = "MiB"), c("3 MiB", "4 MiB", "5 MiB") ) expect_equal( number_bytes(1000^(1:3), symbol = "kB", units = "si"), c("1 kB", "1 000 kB", "1 000 000 kB") ) # informative warning for incorrect spelling expect_warning(number_bytes(c(50, 400, 502, NA), symbol = "k"), "must be") # respects unit designation expect_equal(number_bytes(1024, accuracy = .01), c("1.00 KiB")) expect_equal(number_bytes(1024, units = "si", accuracy = .01), c("1.02 kB")) expect_equal(number_bytes(1000, units = "si", accuracy = .01), c("1.00 kB")) # takes parameters from number() expect_equal( number_bytes(c(3e6, 4e6, 5e6), accuracy = .001), c("2.861 MiB", "3.815 MiB", "4.768 MiB") ) expect_equal( number_bytes(c(3e6, 4e6, 5e6), units = "si", accuracy = .1), c("3.0 MB", "4.0 MB", "5.0 MB") ) # unit system is enforced expect_warning(number_bytes(1024^(1:2), "kB", units = "binary"), "KiB") expect_warning(number_bytes(1024^(1:2), "KiB", units = "si"), "kB") }) test_that("Byte formatter handles zero values", { expect_equal(number_bytes(0), "0 B") }) test_that("Byte formatter handles large values", { expect_equal(number_bytes(1024^11), "1 073 741 824 YiB") expect_equal(number_bytes(1000^9, units = "si"), "1 000 YB") }) test_that("Byte formatter handles negative values", { expect_equal(number_bytes(-1024^2), "-1 MiB") }) test_that('Byte formatter symbol = "auto" can show variable multiples', { expect_equal(number_bytes(1024^(1:3)), c("1 KiB", "1 MiB", "1 GiB")) }) test_that("Byte formatter throws informative error for wrong length symbol", { expect_error(number_bytes(symbol = character()), "not length 0") expect_error(number_bytes(symbol = c("kB", "MB")), "not length 2") }) test_that("preserves names", { expect_named(number_bytes(c(a = 1)), "a") }) scales/tests/testthat/test-breaks-log.R0000644000176200001440000000460014520130030017640 0ustar liggesuserstest_that("Five ticks over 10^4 range work", { expect_equal(breaks_log()(10^(1:5)), 10^(1:5)) }) test_that("behaves nicely when inputs are wacky", { expect_equal(breaks_log()(c(0, NA)), 0) expect_equal(breaks_log()(c(0, Inf)), numeric()) expect_equal(breaks_log()(c(NA, NA)), numeric()) expect_equal(breaks_log()(c(-Inf, Inf)), numeric()) expect_equal(breaks_log()(numeric(0)), numeric()) }) test_that("use integer base powers when at least 3 breaks are within range", { base <- 10 expect_equal( breaks_log(base = base)(base^c(0, 2)), base^(0:2) ) base <- 4 expect_equal( breaks_log(base = base)(base^c(0, 2)), base^(0:2) ) base <- 2 expect_equal( breaks_log(base = base)(base^c(0, 2)), base^(0:2) ) }) test_that("add intermediate breaks when more breaks are needed", { base <- 10 expect_equal( breaks_log(base = base)(base^c(2, 4) + c(1, -1)), c(100, 300, 1000, 3000, 10000) ) expect_equal( breaks_log(base = base)(base^c(2, 3) + c(1, -1)), c(100, 200, 300, 500, 1000) ) base <- 4 expect_equal( breaks_log(base = base)(base^c(2, 4) + c(1, -1)), c(16, 32, 64, 128, 256) ) base <- 3 expect_equal( breaks_log(base = base)(base^c(2, 4) + c(1, -1)), c(9, 18, 27, 54, 81) ) base <- 2 expect_equal( breaks_log(n = 5, base = 2)(c(3, 100)), c(2, 4, 8, 16, 32, 64, 128) ) }) test_that("breaks_log arguments are forcely evaluated on each call #81", { subfun1 <- breaks_log(n = 5, base = 10) subfun2 <- breaks_log(n = 20, base = 5) subfuns <- list() cases_n <- c(5, 20) cases_base <- c(10, 5) for (i in 1:2) { subfuns[[i]] <- breaks_log(n = cases_n[i], base = cases_base[i]) } expect_equal(subfun1(1:1000), subfuns[[1]](1:1000)) expect_equal(subfun2(1:1000), subfuns[[2]](1:1000)) }) test_that("breaks_log with very small ranges fall back to extended_breaks", { expect_equal( breaks_log(n = 5, base = 10)(c(2.001, 2.002)), extended_breaks(n = 5)(c(2.001, 2.002)) ) expect_equal( breaks_log(n = 5, base = 10)(c(0.95, 1.1)), extended_breaks(n = 5)(c(0.95, 1.1)) ) # The switch to extended_breaks occurs at approximately the half-log point expect_equal( breaks_log(n = 5, base = 10)(c(0.95, 2.9)), extended_breaks(n = 5)(c(0.95, 2.9)) ) expect_false(identical( breaks_log(n = 5, base = 10)(c(0.95, 3)), extended_breaks(n = 5)(c(0.95, 3)) )) }) scales/tests/testthat/test-range.R0000644000176200001440000000365514530123112016723 0ustar liggesuserstest_that("R6 inheritance works", { expect_error(ContinuousRange$new(), NA) expect_error(DiscreteRange$new(), NA) expect_true(R6::is.R6(ContinuousRange$new())) expect_true(R6::is.R6(DiscreteRange$new())) }) test_that("Mutable ranges work", { x <- ContinuousRange$new() x$train(c(-1, 45, 10)) expect_equal(x$range, c(-1, 45)) x$train(c(1000)) expect_equal(x$range, c(-1, 1000)) x$reset() expect_equal(x$range, NULL) x <- DiscreteRange$new() x$train(factor(letters[1:3])) expect_equal(x$range, c("a", "b", "c")) x$train(factor(c("a", "h"))) expect_equal(x$range, c("a", "b", "c", "h")) x$reset() expect_equal(x$range, NULL) }) test_that("starting with NULL always returns new", { expect_equal(discrete_range(NULL, 1:3), 1:3) expect_equal(discrete_range(NULL, 3:1), 1:3) expect_equal(discrete_range(NULL, c("a", "b", "c")), c("a", "b", "c")) expect_equal(discrete_range(NULL, c("c", "b", "a")), c("a", "b", "c")) f1 <- factor(letters[1:3], levels = letters[1:4]) expect_equal(discrete_range(NULL, f1, drop = FALSE), letters[1:4]) expect_equal(discrete_range(NULL, f1, drop = TRUE), letters[1:3]) f2 <- factor(letters[1:3], levels = letters[4:1]) expect_equal(discrete_range(NULL, f2, drop = FALSE), letters[4:1]) expect_equal(discrete_range(NULL, f2, drop = TRUE), letters[3:1]) }) test_that("factor discrete ranges stay in order", { f <- factor(letters[1:3], levels = letters[3:1]) expect_equal(discrete_range(f, f), letters[3:1]) expect_equal(discrete_range(f, "c"), letters[3:1]) expect_equal(discrete_range(f, c("a", "b", "c")), letters[3:1]) expect_equal(discrete_range(f, c("a", "b", "c", NA), na.rm = FALSE), c(letters[3:1], NA)) }) test_that("factor discrete ranges take precedence over character", { f <- factor(letters[1:3], levels = letters[3:1]) expect_equal(discrete_range(letters[1:3], f), letters[3:1]) expect_equal(discrete_range(letters[1:4], f), letters[c(3:1, 4)]) }) scales/tests/testthat/test-breaks.R0000644000176200001440000000157314520130030017067 0ustar liggesuserstest_that("extended breaks returns no breaks for bad inputs", { breaks <- extended_breaks() expect_equal(breaks(NA), numeric()) expect_equal(breaks(Inf), numeric()) expect_equal(breaks(NaN), numeric()) }) test_that("breaks_pretty() arguments are forcely evaluated on each call #81", { subfun1 <- breaks_pretty(n = 5) subfun2 <- breaks_pretty(n = 10) subfuns <- list() cases <- c(5, 10) for (i in 1:2) { subfuns[[i]] <- breaks_pretty(n = cases[i]) } expect_equal(subfun1(1), subfuns[[1]](1)) expect_equal(subfun2(1), subfuns[[2]](1)) # A ... argument: subfun1 <- breaks_pretty(n = 10, min.n = 2) subfun2 <- breaks_pretty(n = 10, min.n = 5) subfuns <- list() cases <- c(2, 5) for (i in 1:2) { subfuns[[i]] <- breaks_pretty(n = 10, min.n = cases[i]) } expect_equal(subfun1(1), subfuns[[1]](1)) expect_equal(subfun2(1), subfuns[[2]](1)) }) scales/tests/testthat/test-labels-retired.R0000644000176200001440000000064714520130030020517 0ustar liggesuserstest_that("unit format", { expect_equal( unit_format(unit = "km", scale = 1e-3)(c(1e3, NA, 2e3)), c("1 km", NA, "2 km") ) expect_equal( unit_format(unit = "ha", scale = 1e-4, accuracy = .1)(c(1e3, 2e3)), c("0.1 ha", "0.2 ha") ) expect_equal( unit_format()(c(1e2, 2e2)), c("100 m", "200 m") ) }) test_that("unit_format preserves names", { expect_named(unit_format()(c(a = 1)), "a") }) scales/tests/testthat/test-label-date.R0000644000176200001440000000310414520130030017602 0ustar liggesuserstest_that("date_format works correctly", { a_date <- ISOdate(2012, 1, 1, 11, tz = "UTC") na_date <- ISOdate(NA, 1, 1) # date of value NA expect_equal(date_format()(a_date), "2012-01-01") expect_equal(date_format(format = "%m/%d/%Y")(a_date), "01/01/2012") expect_equal(date_format(format = "%m/%d/%Y", tz = "Etc/GMT+12")(a_date), "12/31/2011") expect_equal(date_format()(na_date), NA_character_) }) test_that("time_format works correctly", { a_time <- ISOdatetime(2012, 1, 1, 11, 30, 0, tz = "UTC") na_time <- ISOdatetime(NA, 1, 1, 1, 1, 0) # time of value NA expect_equal(time_format()(a_time), "11:30:00") expect_equal(time_format()(hms::as_hms(a_time)), "11:30:00") expect_equal(time_format(format = "%H")(hms::as_hms(a_time)), "11") expect_equal(time_format()(na_time), NA_character_) }) test_that("can set locale", { x <- ISOdate(2012, 1, 1, 11, tz = "UTC") expect_equal(date_format("%B", locale = "fr")(x), "janvier") expect_equal(time_format("%B", locale = "fr")(x), "janvier") }) test_that("date_short doesn't change unexpectedly", { expect_snapshot({ dformat <- label_date_short() "dates" jan1 <- as.Date("2010-01-01") dformat(seq(jan1, length = 8, by = "7 day")) dformat(seq(jan1, length = 8, by = "3 month")) dformat(seq(jan1, length = 8, by = "1 year")) "date-times" jan1 <- as.POSIXct("2010-01-01", tz = "UTC") dformat(seq(jan1, length = 6, by = "3 hours")) dformat(seq(jan1, length = 6, by = "7 day")) dformat(seq(jan1, length = 6, by = "3 month")) dformat(seq(jan1, length = 6, by = "1 year")) }) }) scales/tests/testthat/test-label-currency.R0000644000176200001440000000146114522421001020526 0ustar liggesuserstest_that("negative comes before prefix", { expect_equal(label_currency()(-1), "-$1") }) test_that("negative_parens is deprecated", { lifecycle::expect_defunct(label_dollar(negative_parens = TRUE)(1)) }) test_that("preserves NAs", { expect_equal(label_currency()(NA_real_), NA_character_) }) test_that("preserves names", { expect_named(label_currency()(c(a = 1)), "a") }) test_that("decimal.mark could be modified", { expect_equal(label_currency(decimal.mark = ",")(123.45), "$123,45") }) test_that("can rescale with scale_cut", { lab <- label_currency(scale_cut = cut_short_scale()) expect_equal(lab(c(1, 1e3, 1e6)), c("$1", "$1K", "$1M")) lab <- label_currency(scale_cut = cut_short_scale(), prefix = "", suffix = " USD") expect_equal(lab(c(1, 1e3, 1e6)), c("1 USD", "1K USD", "1M USD")) }) scales/tests/testthat/test-label-number.R0000644000176200001440000001345214523373716020213 0ustar liggesusers# Number formatter -------------------------------------------------------- test_that("number format works correctly", { expect_equal(number(123.45, accuracy = 1), "123") expect_equal(number(123.45, accuracy = 10), "120") expect_equal(number(123.45, accuracy = .25), "123.5") expect_equal( number(12345, big.mark = ","), "12,345" ) expect_equal( number(12.3, decimal.mark = ",", accuracy = .1), "12,3" ) expect_equal( number(1.234, scale = 100), "123" ) expect_equal( number(123, prefix = "pre", suffix = "post"), "pre123post" ) expect_equal(number(c(1, 23)), c("1", "23")) expect_equal(number(c(1, 23), trim = FALSE), c(" 1", "23")) }) test_that("number_format works with Inf", { cust <- number_format(suffix = "suff", accuracy = NULL) expect_equal(cust(c(Inf, -Inf)), c("Inf", "-Inf")) }) test_that("number preserves names", { expect_named(number(c(a = 1)), "a") }) test_that("can control positive and negative styles", { expect_equal(number(1, style_positive = "none"), "1") expect_equal(number(1, style_positive = "plus"), "+1") expect_equal(number(-1, style_negative = "hyphen"), "-1") expect_equal(number(-1, style_negative = "minus"), "\u22121") expect_equal(number(-1, style_negative = "parens"), "(1)") }) test_that("prefix applied before negative format", { expect_equal(number(-1, prefix = "$"), "-$1") expect_equal(number(-1, prefix = "$", style_negative = "parens"), "($1)") }) test_that("accuracy is vectorised", { expect_equal( number(rep(0.1234, 4), accuracy = 10^(0:-3)), c("0", "0.1", "0.12", "0.123") ) }) # Comma formatter -------------------------------------------------------- test_that("comma format always adds commas", { expect_equal(comma(1e3), "1,000") expect_equal(comma(1e6), "1,000,000") expect_equal(comma(1e9), "1,000,000,000") }) test_that("comma preserves names", { expect_named(comma(c(a = 1)), "a") }) # Common tests -------------------------------------------------------- test_that("formatters don't add extra spaces", { has_space <- function(x) any(grepl("\\s", x)) x <- 10^c(-1, 0, 1, 3, 6, 9) expect_false(has_space(number(x, big.mark = ","))) expect_false(has_space(comma(x))) expect_false(has_space(dollar(x))) expect_false(has_space(percent(x, big.mark = ","))) expect_false(has_space(scientific(x))) }) test_that("formats work with 0 length input", { x <- numeric() expected <- character() expect_identical(number(x), expected) expect_identical(comma(x), expected) expect_identical(dollar(x), expected) expect_identical(percent(x), expected) expect_identical(scientific(x), expected) expect_identical(comma_format()(x), expected) expect_identical(date_format()(as.Date(character(0))), expected) expect_identical(dollar_format()(x), expected) expect_identical(parse_format()(x), expression()) expect_identical(parse_format()(character()), expression()) expect_identical(percent_format()(x), expected) expect_identical(scientific_format()(x), expected) expect_identical(trans_format(identity)(x), expected) }) # precision --------------------------------------------------------------- test_that("precision rounds large numbers appropriately", { x <- c(0, 0.025) expect_equal(precision(x), 0.001) expect_equal(precision(x * 10), 0.01) expect_equal(precision(x * 100), 0.1) expect_equal(precision(x * 1000), 1) expect_equal(precision(x * 10000), 1) }) test_that("precision is reduced when possible", { expect_equal(precision(c(0, 0.01)), 0.01) expect_equal(precision(c(0, 0.011)), 0.001) expect_equal(precision(c(0, 0.0101)), 0.01) expect_equal(precision(c(0, 0.0109)), 0.001) expect_equal(precision(c(0.251, 0.351)), 0.01) }) test_that("precision handles duplicate values", { expect_equal(precision(c(0, 0, 0.025)), 0.001) expect_equal(precision(c(Inf, 0.1, 0.2, Inf)), 0.1) }) test_that("precision ignores Inf and NA", { expect_equal(precision(c(NA, Inf, -Inf)), 1) expect_equal(precision(c(1, NA)), 1) }) # scale_cut --------------------------------------------------------------- test_that("accuracy computed on individual scales", { x <- c(0, 250, 500, 750, 1250, 1500) * 1e3 expect_equal( number(x, scale_cut = cut_short_scale()), c("0", "250K", "500K", "750K", "1.25M", "1.50M") ) }) test_that("zero and special values don't get units", { x <- c(0, NA, Inf, -Inf) expect_equal( number(x, scale_cut = cut_short_scale()), c("0", NA, "Inf", "-Inf") ) }) test_that("scale applied before scale_cut", { expect_equal(number(500, scale = 2, scale_cut = cut_short_scale()), "1K") expect_equal( number(c(0, 5e5, 1.2e6), scale = 1/1000, scale_cut = cut_short_scale()), c("0", "500", "1K") ) }) test_that("cut_si() adds space before unit", { skip_if_not(getRversion() >= "3.5") expect_equal(number(c(0, 1, 1000), scale_cut = cut_si("m")), c("0 m", "1 m", "1 km")) }) test_that("handles out-of-range inputs", { expect_equal(number(1e15, scale_cut = cut_short_scale()), "1 000T") }) test_that("short and long scale can add spaces", { expect_equal(number(1000, scale_cut = cut_short_scale(TRUE)), "1 K") expect_equal(number(1000, scale_cut = cut_long_scale(TRUE)), "1 K") }) test_that("scale_cut checks its inputs", { expect_snapshot(error = TRUE, { number(1, scale_cut = 0) number(1, scale_cut = "x") number(1, scale_cut = c(x = 0, NA)) }) }) test_that("scale_cut prefers clean cuts", { x <- c(518400, 691200) # prefers days over week in second element expect_equal(number(x, scale_cut = cut_time_scale()), c("6d", "8d")) }) test_that("built-in functions return expected values", { skip_if_not(getRversion() >= "3.5") expect_equal(number(1e9, scale_cut = cut_short_scale()), "1B") expect_equal(number(1e9, scale_cut = cut_long_scale()), "1 000M") expect_equal(number(1e9, scale_cut = cut_si("m")), "1 Gm") }) scales/tests/testthat/test-colour-manip.R0000644000176200001440000000243713610067251020242 0ustar liggesusers# hcl --------------------------------------------------------------------- test_that("can modify each hcl component", { expect_equal(col2hcl("red", h = 180), "#00B793") expect_equal(col2hcl("red", l = 50), "#F40000") expect_equal(col2hcl("red", c = 50), "#B36B6B") expect_equal(col2hcl("red", alpha = 0.5), "#FF000080") }) # alpha ------------------------------------------------------------------- test_that("missing alpha preserves existing", { rgb <- farver::decode_colour(rep("red", 5), to = "rgb") alpha <- seq(0, 1, length.out = nrow(rgb)) reds <- farver::encode_colour(rgb, alpha) expect_equal(reds, alpha(reds, NA)) expect_equal(reds, alpha(reds, rep(NA, 5))) }) test_that("alpha values recycled to match colour", { cols <- farver::encode_colour(farver::decode_colour(c("red", "green", "blue", "pink"))) expect_equal(cols, alpha(cols, NA)) expect_equal(cols, alpha(cols, 1)) }) test_that("col values recycled to match alpha", { alphas <- round(seq(0, 1, length.out = 3)) reds <- alpha("red", alphas) reds_alpha <- farver::decode_colour(reds, TRUE)[, 4] expect_equal(alphas, reds_alpha) }) test_that("preserves names", { x <- c("deeppink", "hotpink", "lightpink") expect_named(alpha(x, 0.5), NULL) names(x) <- x expect_named(alpha(x, 0.5), names(x)) }) scales/tests/testthat/_snaps/0000755000176200001440000000000014523161232016010 5ustar liggesusersscales/tests/testthat/_snaps/label-number.md0000644000176200001440000000067614530124462020712 0ustar liggesusers# scale_cut checks its inputs Code number(1, scale_cut = 0) Condition Error in `scale_cut()`: ! `scale_cut` must be a named numeric vector Code number(1, scale_cut = "x") Condition Error in `scale_cut()`: ! `scale_cut` must be a named numeric vector Code number(1, scale_cut = c(x = 0, NA)) Condition Error in `scale_cut()`: ! `scale_cut` values must not be missing scales/tests/testthat/_snaps/label-date.md0000644000176200001440000000264214530124461020331 0ustar liggesusers# date_short doesn't change unexpectedly Code dformat <- label_date_short() # dates jan1 <- as.Date("2010-01-01") dformat(seq(jan1, length = 8, by = "7 day")) Output [1] "01\nJan\n2010" "08" "15" "22" [5] "29" "05\nFeb" "12" "19" Code dformat(seq(jan1, length = 8, by = "3 month")) Output [1] "Jan\n2010" "Apr" "Jul" "Oct" "Jan\n2011" "Apr" [7] "Jul" "Oct" Code dformat(seq(jan1, length = 8, by = "1 year")) Output [1] "2010" "2011" "2012" "2013" "2014" "2015" "2016" "2017" Code # date-times jan1 <- as.POSIXct("2010-01-01", tz = "UTC") dformat(seq(jan1, length = 6, by = "3 hours")) Output [1] "00:00\n01\nJan\n2010" "03:00" "06:00" [4] "09:00" "12:00" "15:00" Code dformat(seq(jan1, length = 6, by = "7 day")) Output [1] "01\nJan\n2010" "08" "15" "22" [5] "29" "05\nFeb" Code dformat(seq(jan1, length = 6, by = "3 month")) Output [1] "Jan\n2010" "Apr" "Jul" "Oct" "Jan\n2011" "Apr" Code dformat(seq(jan1, length = 6, by = "1 year")) Output [1] "2010" "2011" "2012" "2013" "2014" "2015" scales/tests/testthat/_snaps/trans.md0000644000176200001440000000076314530124462017471 0ustar liggesusers# as.transform generates informative error Code as.transform(1) Condition Error in `as.transform()`: ! `1` must be a character vector or a transformer object Code as.transform("x") Condition Error in `as.transform()`: ! Could not find any function named `transform_x()` or `x_trans()` # trans has useful print method Code new_transform("test", transform = identity, inverse = identity) Output Transformer: test [-Inf, Inf] scales/tests/testthat/_snaps/label-number-auto.md0000644000176200001440000000253114530124461021647 0ustar liggesusers# tricky breaks don't change unexpectedly Code number_auto <- label_number_auto() number_auto(c(0, 1e-06)) Output [1] "0e+00" "1e-06" Code number_auto(c(9e-04, 0.001, 0.0011)) Output [1] "0.0009" "0.0010" "0.0011" Code number_auto(c(9e-05, 1e-04, 0.00011)) Output [1] "0.00009" "0.00010" "0.00011" Code number_auto(c(9e-06, 1e-05, 1.1e-05)) Output [1] "9.0e-06" "1.0e-05" "1.1e-05" Code number_auto(c(999, 1000, 1001)) Output [1] "999" "1 000" "1 001" Code number_auto(c(999999, 1e+06, 1000001)) Output [1] "999 999" "1 000 000" "1 000 001" Code number_auto(c(9999999, 1e+07, 10000001)) Output [1] "9 999 999" "10 000 000" "10 000 001" Code number_auto(c(99999999, 1e+08, 100000001)) Output [1] "1e+08" "1e+08" "1e+08" Code number_auto(c(9e-07, 1e-06, 1.1e-06)) Output [1] "9.0e-07" "1.0e-06" "1.1e-06" Code # Years shouldn't get commas number_auto(c(2010, 2013, 2020)) Output [1] "2010" "2013" "2020" Code number_auto(c(-2010, -2013, -2020)) Output [1] "-2 010" "-2 013" "-2 020" Code # Pick shortest individually number_auto(10^(1:7)) Output [1] "10" "100" "1 000" "1e+04" "1e+05" "1e+06" "1e+07" scales/tests/testthat/_snaps/trans-date.md0000644000176200001440000000027414530124462020401 0ustar liggesusers# date/time scales raise error on incorrect inputs `transform_time()` works with objects of class only --- `transform_date()` works with objects of class only scales/tests/testthat/_snaps/label-ordinal.md0000644000176200001440000000076614530124462021052 0ustar liggesusers# ordinal format in English Code ordinal(c(1:4, 11:21, 101, NA)) Output [1] "1st" "2nd" "3rd" "4th" "11th" "12th" "13th" "14th" "15th" [10] "16th" "17th" "18th" "19th" "20th" "21st" "101st" NA Code ordinal(c(1, 2, 10, 11, NA), rules = ordinal_french()) Output [1] "1er" "2e" "10e" "11e" NA Code ordinal(c(1, 2, 10, 11, NA), rules = ordinal_french("f", TRUE)) Output [1] "1res" "2es" "10es" "11es" NA scales/tests/testthat/_snaps/trans-compose.md0000755000176200001440000000055714530124462021140 0ustar liggesusers# produces informative errors Code transform_compose() Condition Error in `transform_compose()`: ! `transform_compose()` must include at least 1 transformer to compose Code transform_compose("sqrt", "reverse", "log10") Condition Error in `transform_compose()`: ! Sequence of transformations yields invalid domain scales/tests/testthat/_snaps/colour-mapping.md0000644000176200001440000000065314530124461021273 0ustar liggesusers# col_quantile handles skewed data Code x <- c(1:5, rep(10, 10)) col <- col_quantile("RdYlBu", domain = x, n = 7)(x) Condition Warning: Skewed data means we can only allocate 4 unique colours not the 7 requested Code col <- col_quantile("RdYlBu", domain = NULL, n = 7)(x) Condition Warning: Skewed data means we can only allocate 4 unique colours not the 7 requested scales/tests/testthat/test-colour-ramp.R0000644000176200001440000000214114520130030020050 0ustar liggesuserstest_that("Special values yield NAs", { pal <- seq_gradient_pal() expect_equal(pal(NA), NA_character_) expect_equal(pal(NaN), NA_character_) expect_equal(pal(Inf), NA_character_) expect_equal(pal(-Inf), NA_character_) }) test_that("can make ramp with single color", { expect_equal(colour_ramp("black")(0.5), "black") expect_equal(colour_ramp("black", na.color = "red")(NA), "red") }) test_that("Fully opaque colors are returned without alpha", { expect_equal( colour_ramp(c("#1234AB", "#BA4321"))(0:1), c("#1234AB", "#BA4321") ) }) test_that("Partially transparent colors are returned with alpha", { expect_equal( colour_ramp(c("#1234AB20", "#BA43218F"))(0:1), c("#1234AB20", "#BA43218F") ) }) test_that("Partially transparent colors are returned without alpha when `alpha = FALSE`", { expect_equal( colour_ramp(c("#1234AB20", "#BA43218F"), alpha = FALSE)(0:1), c("#1234AB", "#BA4321") ) }) test_that("Interpolation works from color without to color with alpha channel", { expect_identical( colour_ramp(c("#1234AB", "#1234AB00"))(0.5), "#1234AB80" ) }) scales/tests/testthat/test-label-pvalue.R0000644000176200001440000000136714520130030020172 0ustar liggesusers test_that("arguments passed onto number()", { expect_equal(label_pvalue()(c(.5, NA)), c("0.500", NA)) expect_equal(label_pvalue(0.1)(c(.5, NA)), c("0.5", NA)) expect_equal(label_pvalue(decimal.mark = ",")(c(.5, NA)), c("0,500", NA)) }) test_that("preserves names", { expect_named(label_pvalue()(c(a = 1)), "a") }) test_that("values close to 0 and 1 get special treamtent", { expect_equal(label_pvalue(0.1)(0.001), "<0.1") expect_equal(label_pvalue(0.1)(0.999), ">0.9") }) test_that("can control prefixes", { x <- c(0.001, 0.5, 0.999) expect_equal( label_pvalue(0.01, add_p = TRUE)(x), c("p<0.01", "p=0.50", "p>0.99") ) expect_equal( label_pvalue(0.01, prefix = c("a", "b", "c"))(x), c("a0.01", "b0.50", "c0.99") ) }) scales/tests/testthat/test-trans-numeric.R0000644000176200001440000002537514522421001020420 0ustar liggesuserstest_that("Pseudo-log is invertible", { trans <- transform_pseudo_log() expect_equal( trans$inverse(trans$transform(-10:10)), -10:10 ) }) test_that("Modulus is invertible for negative and positive numbers", { trans <- transform_modulus(p = .1) expect_equal(trans$inv(trans$trans(-10:10)), -10:10) trans <- transform_modulus(p = -2) expect_equal(trans$inv(trans$trans(-10:10)), -10:10) trans <- transform_modulus(p = 1) expect_equal(trans$inv(trans$trans(-10:10)), -10:10) }) test_that("Boxcox gives error for negative values", { trans <- transform_boxcox(p = .1) expect_error(trans$trans(-10:10)) trans <- transform_boxcox(p = -2) expect_error(trans$trans(-10:10)) }) test_that("Boxcox can handle NA values", { trans <- transform_boxcox(p = 0) expect_equal(trans$trans(c(1, NA_real_)), c(0, NA_real_)) }) test_that("Boxcox is invertible", { trans <- transform_boxcox(p = .1) expect_equal(trans$inv(trans$trans(0:10)), 0:10) trans <- transform_boxcox(p = -2) expect_equal(trans$inv(trans$trans(0:10)), 0:10) trans <- transform_boxcox(p = 1) expect_equal(trans$inv(trans$trans(0:10)), 0:10) }) test_that("Yeo-Johnson is invertible", { x <- c(-12345, 12345, -0.12345, 0.12345, -10:10) trans <- transform_yj(p = -1.5) expect_equal(trans$inverse(trans$transform(x)), x) trans <- transform_yj(p = 0) expect_equal(trans$inverse(trans$transform(x)), x) trans <- transform_yj(p = 0.7) expect_equal(trans$inverse(trans$transform(x)), x) trans <- transform_yj(p = 1.5) expect_equal(trans$inverse(trans$transform(x)), x) trans <- transform_yj(p = 2) expect_equal(trans$inverse(trans$transform(x)), x) }) test_that("Yeo-Johnson is identity function for p = 1", { x <- c(-12345, 12345, -0.12345, 0.12345, -10:10) trans <- transform_yj(p = 1) expect_equal(trans$transform(x), x) }) test_that("Yeo-Johnson transforms NAs to NAs without error", { x <- c(1, 2, NA, 4) trans <- transform_yj(p = 1) expect_equal(trans$transform(x), x) }) test_that("Yeo-Johnson transform works", { # example data adpated from recipes package # https://github.com/tidymodels/recipes/blob/master/tests/testthat/test_YeoJohnson.R n <- 20 set.seed(1) x <- data.frame( x1 = exp(rnorm(n, mean = .1)), x2 = 1 / rnorm(n), x3 = rexp(n) ) lambdas <- c( x1 = -0.2727204451, x2 = 1.139292543, x3 = -1.012702061 ) expected_data <- data.frame( x1 = c( 0.435993557749438, 0.754696454247318, 0.371327932207827, 1.46113017436327, 0.82204097731098, 0.375761562702297, 0.89751975937422, 1.02175936118846, 0.940739811377902, 0.54984302797741, 1.41856737837093, 0.850587387615876, 0.437701618670981, 0.112174615510591, 1.21942112715274, 0.654589551748501, 0.666780580127795, 1.12625135443351, 1.0636850911955, 0.949680956411546 ), x2 = c( 1.15307873387121, 1.36532999080347, 17.4648439780388, -0.487746797875704, 1.74452440065935, -13.3640721541574, -5.35805967319061, -0.653901985285932, -1.90735599477338, 2.65253432454371, 0.76771137336975, -7.79484535687973, 2.87484976680907, -13.8738947581599, -0.696856395842167, -2.17745353101028, -2.28384276604207, -12.7261652971783, 0.95585544349634, 1.40099012093008 ), x3 = c( 0.49061104973894, 0.49670370366879, 0.338742419511653, 0.663722100577351, 0.296260662322359, 0.681346128666408, 0.757581280603711, 0.357148961119583, 0.371872889850153, 0.49239057672598, 0.173259524331095, 0.235933290139909, 0.52297977893566, 0.434927187456966, 0.0822501770191215, 0.523479652016858, 0.197977570919824, 0.608108816144845, 0.821913792446345, 0.300608495427594 ) ) expect_equal(transform_yj(lambdas[1])$transform(x[[1]]), expected_data[[1]]) expect_equal(transform_yj(lambdas[2])$transform(x[[2]]), expected_data[[2]]) expect_equal(transform_yj(lambdas[3])$transform(x[[3]]), expected_data[[3]]) }) test_that("probability transforms have domain (0,1)", { expect_equal(transform_logit()$domain, c(0, 1)) expect_equal(transform_probit()$domain, c(0, 1)) }) # Derivatives ------------------------------------------------------------- test_that("transform_asn derivatives work", { trans <- transform_asn() expect_equal(trans$d_transform(c(0, 0.5, 1)), c(Inf, 2, Inf)) expect_equal(trans$d_inverse(c(0, pi/2, pi)), c(0, 0.5, 0)) x <- seq(0.1, 0.9, length.out = 10) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_atanh derivatives work", { trans <- transform_atanh() expect_equal(trans$d_transform(c(-1, 0, 1)), c(Inf, 1, Inf)) expect_equal(trans$d_inverse(c(-log(2), 0, log(2))), c(0.64, 1, 0.64)) x <- seq(-0.9, 0.9, length.out = 10) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_asinh derivatives work", { trans <- transform_asinh() expect_equal(trans$d_transform(c(-1, 0, 1)), c(sqrt(2) / 2, 1, sqrt(2) / 2)) expect_equal(trans$d_inverse(c(-log(2), 0, log(2))), c(1.25, 1, 1.25)) x <- seq(-0.9, 0.9, length.out = 10) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_boxcox derivatives work", { trans <- transform_boxcox(p = 0, offset = 1) expect_equal(trans$d_transform(c(0, 1, 2)), c(1, 1/2, 1/3)) expect_equal(trans$d_inverse(c(0, 1, 2)), exp(c(0, 1, 2))) x <- 0:10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) trans <- transform_boxcox(p = 2, offset = 2) expect_equal(trans$d_transform(c(0, 1, 2)), c(2, 3, 4)) expect_equal(trans$d_inverse(c(0, 0.5, 4)), c(1, sqrt(2) / 2, 1/3)) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_modulus derivatives work", { trans <- transform_modulus(p = 0, offset = 1) expect_equal(trans$d_transform(c(-2, -1, 1, 2)), c(1/3, 1/2, 1/2, 1/3)) expect_equal(trans$d_inverse(c(-2, -1, 1, 2)), exp(c(2, 1, 1, 2))) x <- c(-10:-2, 2:10) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) trans <- transform_modulus(p = 2, offset = 2) expect_equal(trans$d_transform(c(-2, -1, 1, 2)), c(4, 3, 3, 4)) expect_equal(trans$d_inverse(c(-4, -0.5, 0.5, 4)), c(1/3, sqrt(2) / 2, sqrt(2) / 2, 1/3)) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_yj derivatives work", { trans <- transform_yj(p = 0) expect_equal(trans$d_transform(c(-2, -1, 1, 2)), c(3, 2, 0.5, 1/3)) expect_equal(trans$d_inverse(c(-1/2, 1, 2)), c(sqrt(2) / 2, exp(1), exp(2))) x <- c(-10:10) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) trans <- transform_yj(p = 3) expect_equal(trans$d_transform(c(-2, -1, 1, 2)), c(1/9, 1/4, 4, 9)) expect_equal(trans$d_inverse(c(-4, -0.5, 1)), c(1/9, 4, (1/16)^(1/3))) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(0:10), 1 / trans$d_transform(trans$inverse(0:10))) }) test_that("transform_exp derivatives work", { trans <- transform_exp(10) expect_equal(trans$d_transform(c(0, 1, 2)), c(1, 10, 100) * log(10)) expect_equal(trans$d_inverse(c(0.1, 1, 10) / log(10)), c(10, 1, 0.1)) x <- 1:10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_identity derivatives work", { trans <- transform_identity() expect_equal(trans$d_transform(numeric(0)), numeric(0)) expect_equal(trans$d_transform(c(0, 1, 2)), c(1, 1, 1)) expect_equal(trans$d_inverse(numeric(0)), numeric(0)) expect_equal(trans$d_inverse(c(0, 1, 2)), c(1, 1, 1)) }) test_that("transform_log derivatives work", { trans <- transform_log(10) expect_equal(trans$d_transform(c(0.1, 1, 10) / log(10)), c(10, 1, 0.1)) expect_equal(trans$d_inverse(c(0, 1, 2)), c(1, 10, 100) * log(10)) x <- 1:10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_log1p derivatives work", { trans <- transform_log1p() expect_equal(trans$d_transform(c(0, 1, 2)), c(1, 1/2, 1/3)) expect_equal(trans$d_inverse(c(0, 1, 2)), exp(c(0, 1, 2))) x <- 0:10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_pseudo_log derivatives work", { trans <- transform_pseudo_log(0.5) expect_equal(trans$d_transform(c(0, 1)), c(1, sqrt(2) / 2)) expect_equal(trans$d_inverse(c(0, 1)), c(1, cosh(1))) x <- 1:10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_logit derivatives work", { trans <- transform_logit() expect_equal(trans$d_transform(c(0.1, 0.5, 0.8)), c(100/9, 4, 6.25)) expect_equal(trans$d_inverse(c(0, 1, 2)), dlogis(c(0, 1, 2))) x <- seq(0.1, 0.9, length.out = 10) expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_reciprocal derivatives work", { trans <- transform_reciprocal() expect_equal(trans$d_transform(c(0.1, 1, 10)), c(-100, -1, -0.01)) expect_equal(trans$d_inverse(c(0.1, 1, 10)), c(-100, -1, -0.01)) x <- (1:20)/10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) test_that("transform_reverse derivatives work", { trans <- transform_reverse() expect_equal(trans$d_transform(numeric(0)), numeric(0)) expect_equal(trans$d_transform(c(-1, 1, 2)), c(-1, -1, -1)) expect_equal(trans$d_inverse(numeric(0)), numeric(0)) expect_equal(trans$d_inverse(c(-1, 1, 2)), c(-1, -1, -1)) }) test_that("transform_sqrt derivatives work", { trans <- transform_sqrt() expect_equal(trans$d_transform(c(1, 4, 9)), c(1/2, 1/4, 1/6)) expect_equal(trans$d_inverse(c(1, 2, 3)), c(2, 4, 6)) x <- 1:10 expect_equal(trans$d_transform(x), 1 / trans$d_inverse(trans$transform(x))) expect_equal(trans$d_inverse(x), 1 / trans$d_transform(trans$inverse(x))) }) scales/tests/testthat/test-pal-hue.R0000644000176200001440000000152014522421001017146 0ustar liggesuserstest_that("pal_hue arguments are forcely evaluated on each call #81", { col1 <- pal_hue(h.start = 0) col2 <- pal_hue(h.start = 90) colours <- list() hues <- c(0, 90) for (i in 1:2) { colours[[i]] <- pal_hue(h.start = hues[i]) } expect_equal(col1(1), colours[[1]](1)) expect_equal(col2(1), colours[[2]](1)) }) test_that("hue_pal respects direction argument #252", { col1 <- pal_hue() col2 <- pal_hue(direction = -1) expect_equal(col1(3), rev(col2(3))) expect_equal(col1(9), rev(col2(9))) }) test_that("hue_pal respects h.start", { hue <- function(...) { farver::decode_colour(pal_hue(...)(2), to = "hcl")[, "h"] } # Have to use large tolerance since we're generating out of gamut colours. expect_equal(hue(), c(15, 195), tolerance = 0.1) expect_equal(hue(h.start = 30), c(45, 235), tolerance = 0.1) }) scales/tests/testthat/test-trans.R0000644000176200001440000000160014522421001016741 0ustar liggesuserstest_that("Transformed ranges silently drop out-of-domain values", { r1 <- trim_to_domain(transform_log(), -1:10) expect_equal(r1, log(c(1e-100, 10))) r2 <- trim_to_domain(transform_sqrt(), -1:10) expect_equal(r2, sqrt(c(0, 10))) }) test_that("as.transform handles character inputs", { expect_equal(as.trans("log10"), transform_log10()) expect_equal( as.transform(c("log10", "reverse")), transform_compose(transform_log10(), transform_reverse()) ) }) test_that("as.transform generates informative error", { expect_snapshot(error = TRUE, { as.transform(1) as.transform("x") }) }) test_that("trans has useful print method", { expect_snapshot({ new_transform("test", transform = identity, inverse = identity) }) }) test_that("inverse of trans_sqrt() returns NA for values outside of range", { expect_equal(transform_sqrt()$inverse(-2), NA_real_) }) scales/tests/testthat/test-scale-discrete.R0000644000176200001440000000152414530123130020507 0ustar liggesuserstest_that("NA.value works for discrete", { x <- c(NA, "a", "b", "c", NA) pal <- brewer_pal() expect_equal(dscale(x, pal)[1], NA_character_) expect_equal(dscale(x, pal)[5], NA_character_) expect_equal(dscale(x, pal, "grey50")[1], "grey50") expect_equal(dscale(x, pal, "grey50")[5], "grey50") }) test_that("na.rm = FALSE keeps NA", { x1 <- c("a", NA) x2 <- factor(x1) x3 <- addNA(x2) expect_equal(train_discrete(x1, na.rm = FALSE), c("a", NA)) expect_equal(train_discrete(x2, na.rm = FALSE), c("a", NA)) expect_equal(train_discrete(x3, na.rm = FALSE), c("a", NA)) }) test_that("na.rm = TRUE drops NA", { x1 <- c("a", NA) x2 <- factor(x1) x3 <- addNA(x2) expect_equal(train_discrete(x1, na.rm = TRUE), "a") expect_equal(train_discrete(x2, na.rm = TRUE), "a") expect_equal(train_discrete(x3, na.rm = TRUE), "a") }) scales/tests/testthat/test-round-any.R0000644000176200001440000000164014520130030017527 0ustar liggesuserstest_that("round_any function rounds numeric", { expect_equal(round_any(135, 10), 140) expect_equal(round_any(135, 100), 100) expect_equal(round_any(135, 25), 125) expect_equal(round_any(135, 10, floor), 130) expect_equal(round_any(135, 100, floor), 100) expect_equal(round_any(135, 25, floor), 125) expect_equal(round_any(135, 10, ceiling), 140) expect_equal(round_any(135, 100, ceiling), 200) expect_equal(round_any(135, 25, ceiling), 150) }) test_that("round_any() function rounds POSIXct", { expect_equal( round_any(as.POSIXct("2000-01-01 11:00:00", tz = "UTC"), 86400), as.POSIXct("2000-01-01", tz = "UTC") ) expect_equal( round_any(as.POSIXct("2000-01-01 11:11:11", tz = "UTC"), 3600), as.POSIXct("2000-01-01 11:00", tz = "UTC") ) expect_equal( round_any(as.POSIXct("2000-01-01 11:11:11", tz = "UTC"), 10, ceiling), as.POSIXct("2000-01-01 11:11:20", tz = "UTC") ) }) scales/tests/testthat/test-label-log.R0000644000176200001440000000054514520130030017454 0ustar liggesuserstest_that("label_log() returns expression", { expect_identical(label_log()(numeric()), expression()) expect_identical(label_log()(NA_real_), expression(NA)) expect_equal(label_log()(c(0.1, 10)), expression(10^-1, 10^1)) expect_equal(label_log(base = 2)(8), expression(2^3)) expect_equal(label_log(base = 2, digits = 3)(7), expression(2^2.81)) }) scales/tests/testthat/test-trans-compose.R0000644000176200001440000000254114522421001020411 0ustar liggesuserstest_that("composes transforms correctly", { t <- transform_compose("log10", "reverse") expect_equal(t$transform(100), -2) expect_equal(t$inverse(-2), 100) }) test_that("composes derivatives correctly", { t <- transform_compose("sqrt", "reciprocal", "reverse") expect_equal(t$d_transform(0.25), 4) expect_equal(t$d_inverse(-2), 0.25) }) test_that("produces NULL derivatives if not all transforms have derivatives", { t <- transform_compose("sqrt", new_transform("no_deriv", identity, identity)) expect_null(t$d_transform) expect_null(t$d_inverse) }) test_that("uses breaks from first transformer", { t <- transform_compose("log10", "reverse") expect_equal(t$breaks(c(1, 1000)), log_breaks()(c(1, 1000))) }) test_that("produces informative errors", { expect_snapshot(error = TRUE, { transform_compose() transform_compose("sqrt", "reverse", "log10") }) }) test_that("produces correct domains", { expect_equal(transform_compose("sqrt", "reverse")$domain, c(0, Inf)) expect_equal(transform_compose("sqrt", "log")$domain, c(0, Inf)) expect_equal(transform_compose("log", "log")$domain, c(1, Inf)) expect_equal(transform_compose("reverse", "log")$domain, c(-Inf, 0)) expect_equal(transform_compose("reverse", "logit", "log")$domain, c(-1, -0.5)) expect_error(transform_compose("sqrt", "reverse", "log")$domain, "invalid domain") }) scales/tests/testthat/test-trans-date.R0000644000176200001440000000334614522421001017665 0ustar liggesusersa_time <- ISOdatetime(2012, 1, 1, 11, 30, 0, tz = "UTC") a_date <- as.Date(a_time) tz <- function(x) attr(as.POSIXlt(x), "tzone")[1] tz2 <- function(x) format(x, "%Z") with_tz <- function(x, value) { as.POSIXct(format(x, tz = value, usetz = TRUE), tz = value) } test_that("date/time scales raise error on incorrect inputs", { time <- transform_time() expect_snapshot_error(time$transform(a_date)) date <- transform_date() expect_snapshot_error(date$transform(a_time)) }) test_that("time scales learn timezones", { skip_if_not(getRversion() > "3.3.3") time <- transform_time() x <- time$inverse(time$transform(a_time)) expect_equal(tz(x), "UTC") expect_equal(tz2(x), "UTC") time <- transform_time() x <- time$inverse(time$transform(with_tz(a_time, "GMT"))) expect_equal(tz(x), "GMT") expect_equal(tz2(x), "GMT") }) test_that("tz arugment overrules default time zone", { time <- transform_time("GMT") x <- time$inverse(time$transform(a_time)) expect_equal(tz(x), "GMT") expect_equal(tz2(x), "GMT") }) test_that("date_breaks() works", { times <- as.POSIXct(c("2000-01-01 08:29:58", "2000-01-01 08:30:10"), tz = "UTC") expect_equal( date_breaks("1 hour")(times), as.POSIXct(c("2000-01-01 8:00:00 UTC", "2000-01-01 9:00:00 UTC"), tz = "UTC") ) expect_equal( date_breaks(".5 secs")(times)[1:2], as.POSIXct(c("2000-01-01 08:29:58.0 UTC", "2000-01-01 08:29:58.5 UTC"), tz = "UTC") ) dates <- a_date + 1:30 expect_equal( date_breaks("1 month")(dates), as.Date(c("2012-01-01", "2012-02-01")) ) }) test_that("can invert domain", { t <- transform_date() expect_equal(t$transform(t$domain), c(-Inf, Inf)) t <- transform_time() expect_equal(t$transform(t$domain), c(-Inf, Inf)) }) scales/tests/testthat/test-offset-by.R0000644000176200001440000000403614520130030017513 0ustar liggesuserstest_that("breaks_width() offset supports numeric units", { scale_range <- 0:1 breaks <- breaks_width(1, offset = 0.5) expect_equal(breaks(scale_range), c(0.5, 1.5)) }) test_that("breaks_width() with offset supports Date and POSIXt units #247 #269", { breaks <- breaks_width("1 year", offset = "3 months") compound_breaks <- breaks_width("1 year", offset = c("3 months", "5 days")) Date_range <- as.Date(c("2020-01-01", "2020-01-02")) POSIXt_range <- as.POSIXct(c("2020-01-01", "2020-01-02"), tz = "UTC") # Date expect_equal( breaks(Date_range), as.Date(c("2020-04-01", "2021-04-01")) ) expect_equal( compound_breaks(Date_range), as.Date(c("2020-04-06", "2021-04-06")) ) # POSIXt expect_equal( breaks(POSIXt_range), as.POSIXct(c("2020-04-01", "2021-04-01"), tz = "UTC") ) expect_equal( compound_breaks(POSIXt_range), as.POSIXct(c("2020-04-06", "2021-04-06"), tz = "UTC") ) # Fractional seconds fractional_seconds <- breaks_width("1 sec", offset = "0.5 secs") sec_range <- as.POSIXct(c("2020-01-01 00:00:00", "2020-01-01 00:00:01"), tz = "UTC") expected <- .POSIXct(c(1577836800.5, 1577836801.5, 1577836802.5), tz = "UTC") expect_equal(fractional_seconds(sec_range), expected) }) test_that("breaks_width() with offset supports difftime units #247 #269", { secs <- breaks_width("3 mins", offset = "1 sec") mins <- breaks_width("3 mins", offset = "1 min") hours <- breaks_width("3 hours", offset = "1 hour") days <- breaks_width("3 days", offset = "1 day") scale_range <- as.difftime(0:1, units = "secs") expect_equal(secs(scale_range), as.difftime(c(1, 181), units = "secs")) expect_equal(mins(scale_range), as.difftime(c(60, 240), units = "secs")) expect_equal(hours(scale_range), as.difftime(c(3600, 14400), units = "secs")) expect_equal(days(scale_range), as.difftime(c(86400, 345600), units = "secs")) # Compound units mins_secs <- breaks_width("1 hour", offset = c("1 min", "1 sec")) expect_equal(mins_secs(scale_range), as.difftime(c(61, 3661), units = "secs")) }) scales/tests/testthat/test-label-number-auto.R0000644000176200001440000000207314520130030021127 0ustar liggesuserstest_that("gracefully handles bad input works", { number_auto <- label_number_auto() expect_equal(number_auto(NULL), character()) expect_equal(number_auto(numeric()), character()) expect_equal(number_auto(NA), "NA") expect_equal(number_auto(Inf), "Inf") }) test_that("tricky breaks don't change unexpectedly", { expect_snapshot({ number_auto <- label_number_auto() number_auto(c(0, 0.000001)) number_auto(c(0.0009, 0.0010, 0.0011)) number_auto(c(0.00009, 0.00010, 0.00011)) number_auto(c(0.000009, 0.000010, 0.000011)) number_auto(c(999, 1000, 1001)) number_auto(c(999999, 1000000, 1000001)) number_auto(c(9999999, 10000000, 10000001)) number_auto(c(99999999, 100000000, 100000001)) number_auto(c(0.0000009, 0.0000010, 0.0000011)) "Years shouldn't get commas" number_auto(c(2010, 2013, 2020)) number_auto(c(-2010, -2013, -2020)) "Pick shortest individually" number_auto(10^(1:7)) }) }) test_that("single values > 1e+06 don't throw error", { expect_equal(label_number_auto()(30925005), "30 925 005") }) scales/tests/testthat.R0000644000176200001440000000007013423551260014647 0ustar liggesuserslibrary(testthat) library(scales) test_check("scales") scales/R/0000755000176200001440000000000014522421001011714 5ustar liggesusersscales/R/pal-shape.r0000644000176200001440000000117114522421001013751 0ustar liggesusers#' Shape palette (discrete) #' #' @param solid should shapes be solid or not? #' @export pal_shape <- function(solid = TRUE) { force(solid) function(n) { if (n > 6) { cli::cli_warn(c( "The shape palette can deal with a maximum of 6 discrete values because more than 6 becomes difficult to discriminate", i = "you have requested {n} values. Consider specifying shapes manually if you need that many have them." )) } if (solid) { c(16, 17, 15, 3, 7, 8)[seq_len(n)] } else { c(1, 2, 0, 3, 7, 8)[seq_len(n)] } } } #' @export #' @rdname pal_shape shape_pal <- pal_shape scales/R/scales-package.R0000644000176200001440000000053214520130505014706 0ustar liggesusers#' @keywords internal #' @importFrom R6 R6Class #' @import rlang "_PACKAGE" # The following block is used by usethis to automatically manage # roxygen namespace tags. Modify with care! ## usethis namespace: start #' @importFrom glue glue #' @importFrom lifecycle deprecate_soft #' @importFrom lifecycle deprecated ## usethis namespace: end NULL scales/R/round-any.R0000644000176200001440000000070013423551257013770 0ustar liggesusers# Methods used to round to multiple of any number. Added from plyr. round_any <- function(x, accuracy, f = round) { UseMethod("round_any") } #' @export round_any.numeric <- function(x, accuracy, f = round) { f(x / accuracy) * accuracy } #' @export round_any.POSIXct <- function(x, accuracy, f = round) { tz <- format(x[1], "%Z") xr <- round_any(as.numeric(x), accuracy, f) as.POSIXct(xr, origin = "1970-01-01 00:00.00 UTC", tz = tz) } scales/R/transform-date.R0000644000176200001440000000734114522421001014772 0ustar liggesusers#' Transformation for dates (class Date) #' #' @export #' @examples #' years <- seq(as.Date("1910/1/1"), as.Date("1999/1/1"), "years") #' t <- transform_date() #' t$transform(years) #' t$inverse(t$transform(years)) #' t$format(t$breaks(range(years))) transform_date <- function() { new_transform( "date", transform = "from_date", inverse = "to_date", breaks = breaks_pretty(), domain = to_date(c(-Inf, Inf)) ) } #' @export #' @rdname transform_date date_trans <- transform_date to_date <- function(x) structure(x, class = "Date") from_date <- function(x) { if (!inherits(x, "Date")) { cli::cli_abort("{.fun transform_date} works with objects of class {.cls Date} only") } structure(as.numeric(x), names = names(x)) } #' Transformation for date-times (class POSIXt) #' #' @param tz Optionally supply the time zone. If `NULL`, the default, #' the time zone will be extracted from first input with a non-null tz. #' @export #' @examples #' hours <- seq(ISOdate(2000, 3, 20, tz = ""), by = "hour", length.out = 10) #' t <- transform_time() #' t$transform(hours) #' t$inverse(t$transform(hours)) #' t$format(t$breaks(range(hours))) transform_time <- function(tz = NULL) { force(tz) to_time <- function(x) { structure(x, class = c("POSIXt", "POSIXct"), tzone = tz) } from_time <- function(x) { if (!inherits(x, "POSIXct")) { cli::cli_abort("{.fun transform_time} works with objects of class {.cls POSIXct} only") } if (is.null(tz)) { tz <<- attr(as.POSIXlt(x), "tzone")[[1]] } structure(as.numeric(x), names = names(x)) } new_transform("time", transform = "from_time", inverse = "to_time", breaks = breaks_pretty(), domain = to_time(c(-Inf, Inf)) ) } #' @export #' @rdname transform_time time_trans <- transform_time #' Transformation for times (class hms) #' #' `transform_timespan()` provides transformations for data encoding time passed #' along with breaks and label formatting showing standard unit of time fitting #' the range of the data. `transform_hms()` provides the same but using standard #' hms idioms and formatting. #' #' @inheritParams label_timespan #' @export #' @examples #' # transform_timespan allows you to specify the time unit numeric data is #' # interpreted in #' trans_min <- transform_timespan("mins") #' demo_timespan(seq(0, 100), trans = trans_min) #' # Input already in difftime format is interpreted correctly #' demo_timespan(as.difftime(seq(0, 100), units = "secs"), trans = trans_min) #' #' if (require("hms")) { #' # transform_hms always assumes seconds #' hms <- round(runif(10) * 86400) #' t <- transform_hms() #' t$transform(hms) #' t$inverse(t$transform(hms)) #' t$breaks(hms) #' # The break labels also follow the hms format #' demo_timespan(hms, trans = t) #' } #' transform_timespan <- function(unit = c("secs", "mins", "hours", "days", "weeks")) { unit <- arg_match(unit) new_transform( "timespan", transform = function(x) { structure(as.numeric(as.difftime(x, units = unit), units = "secs"), names = names(x)) }, inverse = function(x) { x <- as.difftime(x, units = "secs") units(x) <- unit x }, breaks = breaks_timespan(unit), format = label_timespan(unit) ) } #' @export #' @rdname transform_timespan timespan_trans <- transform_timespan #' @rdname transform_timespan #' @export transform_hms <- function() { new_transform( "hms", transform = function(x) { structure(as.numeric(x), names = names(x)) }, inverse = hms::as_hms, breaks = breaks_hms() ) } #' @rdname transform_timespan #' @export hms_trans <- transform_hms breaks_hms <- function(n = 5) { base_breaks <- breaks_timespan("secs", n) function(x) { hms::as_hms(base_breaks(x)) } } scales/R/utils.R0000644000176200001440000000302314522154141013205 0ustar liggesusers# Evaluates all arguments (see #81) force_all <- function(...) list(...) demo_ggplot <- function(x, scale_name, ...) { call <- substitute(list(...)) call[[1]] <- as.name(scale_name) cat(paste0(deparse(call), "\n", collapse = "")) if (!requireNamespace("ggplot2", quietly = TRUE)) { cli::cli_inform("Skipping; {.pkg ggplot2} not installed") return(invisible()) } scale <- getExportedValue("ggplot2", scale_name) df <- data.frame(x = x, stringsAsFactors = FALSE) ggplot2::ggplot(df, ggplot2::aes(x, 1)) + ggplot2::geom_blank() + scale(NULL, ...) + ggplot2::scale_y_continuous(NULL, breaks = NULL) + ggplot2::theme(aspect.ratio = 1 / 5) } #' Demonstrate scales functions with ggplot2 code #' #' These functions generate ggplot2 code needed to use scales functions for #' real code. #' #' @param x A vector of data #' @keywords internal #' @export demo_continuous <- function(x, ...) { demo_ggplot(x, "scale_x_continuous", ...) } #' @rdname demo_continuous #' @export demo_log10 <- function(x, ...) { demo_ggplot(x, "scale_x_log10", ...) } #' @rdname demo_continuous #' @export demo_discrete <- function(x, ...) { demo_ggplot(x, "scale_x_discrete", ...) } #' @rdname demo_continuous #' @export demo_datetime <- function(x, ...) { demo_ggplot(x, "scale_x_datetime", ...) } #' @rdname demo_continuous #' @export demo_time <- function(x, ...) { demo_ggplot(x, "scale_x_time", ...) } #' @rdname demo_continuous #' @export demo_timespan <- function(x, ...) { demo_ggplot(x, "scale_x_continuous", ...) } scales/R/colour-mapping.R0000644000176200001440000003236414522421001015003 0ustar liggesusers#' Colour mapping #' #' Conveniently maps data values (numeric or factor/character) to colours #' according to a given palette, which can be provided in a variety of formats. #' #' `col_numeric` is a simple linear mapping from continuous numeric data #' to an interpolated palette. #' #' @param palette The colours or colour function that values will be mapped to #' @param domain The possible values that can be mapped. #' #' For `col_numeric` and `col_bin`, this can be a simple numeric #' range (e.g. `c(0, 100)`); `col_quantile` needs representative #' numeric data; and `col_factor` needs categorical data. #' #' If `NULL`, then whenever the resulting colour function is called, the #' `x` value will represent the domain. This implies that if the function #' is invoked multiple times, the encoding between values and colours may not #' be consistent; if consistency is needed, you must provide a non-`NULL` #' domain. #' @param na.color The colour to return for `NA` values. Note that #' `na.color = NA` is valid. #' @param alpha Whether alpha channels should be respected or ignored. If `TRUE` #' then colors without explicit alpha information will be treated as fully #' opaque. #' @param reverse Whether the colors (or color function) in `palette` should be #' used in reverse order. For example, if the default order of a palette goes #' from blue to green, then `reverse = TRUE` will result in the colors going #' from green to blue. #' @return A function that takes a single parameter `x`; when called with a #' vector of numbers (except for `col_factor`, which expects #' factors/characters), #RRGGBB colour strings are returned (unless #' `alpha = TRUE` in which case #RRGGBBAA may also be possible). #' #' @export col_numeric <- function(palette, domain, na.color = "#808080", alpha = FALSE, reverse = FALSE) { rng <- NULL if (length(domain) > 0) { rng <- range(domain, na.rm = TRUE) if (!all(is.finite(rng))) { cli::cli_abort("Wasn't able to determine range of {.arg domain}") } } pf <- safePaletteFunc(palette, na.color, alpha) withColorAttr("numeric", list(na.color = na.color), function(x) { if (length(x) == 0 || all(is.na(x))) { return(pf(x)) } if (is.null(rng)) rng <- range(x, na.rm = TRUE) rescaled <- rescale(x, from = rng) if (any(rescaled < 0 | rescaled > 1, na.rm = TRUE)) { cli::cli_warn("Some values were outside the color scale and will be treated as NA") } if (reverse) { rescaled <- 1 - rescaled } pf(rescaled) }) } # Attach an attribute colorType to a color function f so we can derive legend # items from it withColorAttr <- function(type, args = list(), fun) { structure(fun, colorType = type, colorArgs = args) } # domain may or may not be NULL. # Iff domain is non-NULL, x may be NULL. # bins is non-NULL. It may be a scalar value (# of breaks) or a set of breaks. getBins <- function(domain, x, bins, pretty) { if (is.null(domain) && is.null(x)) { cli::cli_abort("{.arg domain} and {.arg x} can't both be NULL") } # Hard-coded bins if (length(bins) > 1) { return(bins) } if (bins < 2) { cli::cli_abort(c( "Invalid {.arg bins} value ({bins})", i = "bin count must be at least 2" )) } if (pretty) { base::pretty(domain %||% x, n = bins) } else { rng <- range(domain %||% x, na.rm = TRUE) seq(rng[1], rng[2], length.out = bins + 1) } } #' @details `col_bin` also maps continuous numeric data, but performs #' binning based on value (see the [base::cut()] function). `col_bin` #' defaults for the `cut` function are `include.lowest = TRUE` and #' `right = FALSE`. #' @param bins Either a numeric vector of two or more unique cut points or a #' single number (greater than or equal to 2) giving the number of intervals #' into which the domain values are to be cut. #' @param pretty Whether to use the function [pretty()] to generate #' the bins when the argument `bins` is a single number. When #' `pretty = TRUE`, the actual number of bins may not be the number of #' bins you specified. When `pretty = FALSE`, [seq()] is used #' to generate the bins and the breaks may not be "pretty". #' @param right parameter supplied to [base::cut()]. See Details #' @rdname col_numeric #' @export col_bin <- function(palette, domain, bins = 7, pretty = TRUE, na.color = "#808080", alpha = FALSE, reverse = FALSE, right = FALSE) { # domain usually needs to be explicitly provided (even if NULL) but not if # breaks are specified if (missing(domain) && length(bins) > 1) { domain <- NULL } autobin <- is.null(domain) && length(bins) == 1 if (!is.null(domain)) { bins <- getBins(domain, NULL, bins, pretty) } numColors <- if (length(bins) == 1) bins else length(bins) - 1 colorFunc <- col_factor(palette, domain = if (!autobin) 1:numColors, na.color = na.color, alpha = alpha, reverse = reverse ) pf <- safePaletteFunc(palette, na.color, alpha) withColorAttr("bin", list(bins = bins, na.color = na.color, right = right), function(x) { if (length(x) == 0 || all(is.na(x))) { return(pf(x)) } binsToUse <- getBins(domain, x, bins, pretty) ints <- cut(x, binsToUse, labels = FALSE, include.lowest = TRUE, right = right) if (any(is.na(x) != is.na(ints))) { cli::cli_warn("Some values were outside the color scale and will be treated as NA") } colorFunc(ints) }) } #' @details `col_quantile` similarly bins numeric data, but via the #' [stats::quantile()] function. #' @param n Number of equal-size quantiles desired. For more precise control, #' use the `probs` argument instead. #' @param probs See [stats::quantile()]. If provided, the `n` #' argument is ignored. #' @rdname col_numeric #' @export col_quantile <- function(palette, domain, n = 4, probs = seq(0, 1, length.out = n + 1), na.color = "#808080", alpha = FALSE, reverse = FALSE, right = FALSE) { if (!is.null(domain)) { bins <- safe_quantile(domain, probs) return(withColorAttr( "quantile", list(probs = probs, na.color = na.color, right = right), col_bin(palette, domain = NULL, bins = bins, na.color = na.color, alpha = alpha, reverse = reverse ) )) } # I don't have a precise understanding of how quantiles are meant to map to colors. # If you say probs = seq(0, 1, 0.25), which has length 5, does that map to 4 colors # or 5? 4, right? colorFunc <- col_factor(palette, domain = 1:(length(probs) - 1), na.color = na.color, alpha = alpha, reverse = reverse ) withColorAttr("quantile", list(probs = probs, na.color = na.color, right = right), function(x) { binsToUse <- safe_quantile(x, probs) ints <- cut(x, binsToUse, labels = FALSE, include.lowest = TRUE, right = right) if (any(is.na(x) != is.na(ints))) { cli::cli_warn("Some values were outside the color scale and will be treated as NA") } colorFunc(ints) }) } safe_quantile <- function(x, probs) { bins <- stats::quantile(x, probs, na.rm = TRUE, names = FALSE) if (anyDuplicated(bins)) { bins <- unique(bins) cli::cli_warn("Skewed data means we can only allocate {length(bins)} unique colours not the {length(probs) - 1} requested") } bins } # If already a factor, return the levels. Otherwise, convert to factor then # return the levels. calcLevels <- function(x, ordered) { if (is.null(x)) { NULL } else if (is.factor(x)) { levels(x) } else if (ordered) { unique(x) } else { sort(unique(x)) } } getLevels <- function(domain, x, lvls, ordered) { if (!is.null(lvls)) { return(lvls) } if (!is.null(domain)) { return(calcLevels(domain, ordered)) } if (!is.null(x)) { return(calcLevels(x, ordered)) } } #' @details `col_factor` maps factors to colours. If the palette is #' discrete and has a different number of colours than the number of factors, #' interpolation is used. #' @param levels An alternate way of specifying levels; if specified, domain is #' ignored #' @param ordered If `TRUE` and `domain` needs to be coerced to a #' factor, treat it as already in the correct order #' @rdname col_numeric #' @export col_factor <- function(palette, domain, levels = NULL, ordered = FALSE, na.color = "#808080", alpha = FALSE, reverse = FALSE) { # domain usually needs to be explicitly provided (even if NULL) but not if # levels are specified if (missing(domain) && !is.null(levels)) { domain <- NULL } if (!is.null(levels) && anyDuplicated(levels)) { cli::cli_warn("Duplicate levels detected") levels <- unique(levels) } lvls <- getLevels(domain, NULL, levels, ordered) force(palette) # palette loses scope withColorAttr("factor", list(na.color = na.color), function(x) { if (length(x) == 0 || all(is.na(x))) { return(rep.int(na.color, length(x))) } lvls <- getLevels(domain, x, lvls, ordered) pf <- safePaletteFunc(palette, na.color, alpha, nlevels = length(lvls) * ifelse(reverse, -1, 1)) origNa <- is.na(x) x <- match(as.character(x), lvls) if (any(is.na(x) != origNa)) { cli::cli_warn("Some values were outside the color scale and will be treated as NA") } scaled <- rescale(as.integer(x), from = c(1, length(lvls))) if (any(scaled < 0 | scaled > 1, na.rm = TRUE)) { cli::cli_warn("Some values were outside the color scale and will be treated as NA") } if (reverse) { scaled <- 1 - scaled } pf(scaled) }) } #' @details The `palette` argument can be any of the following: #' \enumerate{ #' \item{A character vector of RGB or named colours. Examples: `palette()`, `c("#000000", "#0000FF", "#FFFFFF")`, `topo.colors(10)`} #' \item{The name of an RColorBrewer palette, e.g. `"BuPu"` or `"Greens"`.} #' \item{The full name of a viridis palette: `"viridis"`, `"magma"`, `"inferno"`, or `"plasma"`.} #' \item{A function that receives a single value between 0 and 1 and returns a colour. Examples: `colorRamp(c("#000000", "#FFFFFF"), interpolate="spline")`.} #' } #' @examples #' pal <- col_bin("Greens", domain = 0:100) #' show_col(pal(sort(runif(10, 60, 100)))) #' #' # Exponential distribution, mapped continuously #' show_col(col_numeric("Blues", domain = NULL)(sort(rexp(16)))) #' # Exponential distribution, mapped by interval #' show_col(col_bin("Blues", domain = NULL, bins = 4)(sort(rexp(16)))) #' # Exponential distribution, mapped by quantile #' show_col(col_quantile("Blues", domain = NULL)(sort(rexp(16)))) #' #' # Categorical data; by default, the values being coloured span the gamut... #' show_col(col_factor("RdYlBu", domain = NULL)(LETTERS[1:5])) #' # ...unless the data is a factor, without droplevels... #' show_col(col_factor("RdYlBu", domain = NULL)(factor(LETTERS[1:5], levels = LETTERS))) #' # ...or the domain is stated explicitly. #' show_col(col_factor("RdYlBu", levels = LETTERS)(LETTERS[1:5])) #' @rdname col_numeric #' @name col_numeric NULL safePaletteFunc <- function(pal, na.color, alpha, nlevels = NULL) { filterRange( filterNA( na.color = na.color, filterZeroLength( filterRGB( toPaletteFunc(pal, alpha = alpha, nlevels = nlevels) ) ) ) ) } toPaletteFunc <- function(pal, alpha, nlevels) { UseMethod("toPaletteFunc") } # Strings are interpreted as color names, unless length is 1 and it's the name # of an RColorBrewer palette that is marked as qualitative toPaletteFunc.character <- function(pal, alpha, nlevels) { if (length(pal) == 1 && pal %in% row.names(RColorBrewer::brewer.pal.info)) { paletteInfo <- RColorBrewer::brewer.pal.info[pal, ] if (!is.null(nlevels)) { # pal_brewer will return NAs if you ask for more colors than the palette has colors <- pal_brewer(palette = pal)(abs(nlevels)) colors <- colors[!is.na(colors)] } else { colors <- pal_brewer(palette = pal)(RColorBrewer::brewer.pal.info[pal, "maxcolors"]) # Get all colors } } else if (length(pal) == 1 && pal %in% c("viridis", "magma", "inferno", "plasma")) { colors <- pal_viridis(option = pal)(256) } else { colors <- pal } colour_ramp(colors, alpha = alpha) } # Accept colorRamp style matrix toPaletteFunc.matrix <- function(pal, alpha, nlevels) { toPaletteFunc(farver::decode_colour(pal), alpha = alpha) } # If a function, just assume it's already a function over [0-1] toPaletteFunc.function <- function(pal, alpha, nlevels) { pal } # colorRamp(space = 'Lab') throws error when called with # zero-length input filterZeroLength <- function(f) { force(f) function(x) { if (length(x) == 0) { character(0) } else { f(x) } } } # Wraps an underlying non-NA-safe function (like colorRamp). filterNA <- function(f, na.color) { force(f) function(x) { results <- character(length(x)) nas <- is.na(x) results[nas] <- na.color results[!nas] <- f(x[!nas]) results } } # Wraps a function that may return RGB color matrix instead of rgb string. filterRGB <- function(f) { force(f) function(x) { results <- f(x) if (is.character(results)) { results } else if (is.matrix(results)) { farver::encode_colour(results, from = "rgb") } else { cli::cli_abort("Unexpected result type {.cls {class(x)}}") } } } filterRange <- function(f) { force(f) function(x) { x[x < 0 | x > 1] <- NA f(x) } } scales/R/scale-continuous.R0000644000176200001440000000412414522421001015333 0ustar liggesusers#' Continuous scale #' #' @param x vector of continuous values to scale #' @param palette palette to use. #' #' Built in palettes: #' \Sexpr[results=rd,stage=build]{scales:::seealso_pal()} #' @param na.value value to use for missing values #' @param trans transformation object describing the how to transform the #' raw data prior to scaling. Defaults to the identity transformation which #' leaves the data unchanged. #' #' Built in transformations: #' \Sexpr[results=rd,stage=build]{scales:::seealso_transform()}. #' @export #' @examples #' with(mtcars, plot(disp, mpg, cex = cscale(hp, pal_rescale()))) #' with(mtcars, plot(disp, mpg, cex = cscale(hp, pal_rescale(), #' trans = transform_sqrt() #' ))) #' with(mtcars, plot(disp, mpg, cex = cscale(hp, pal_area()))) #' with(mtcars, plot(disp, mpg, #' pch = 20, cex = 5, #' col = cscale(hp, pal_seq_gradient("grey80", "black")) #' )) cscale <- function(x, palette, na.value = NA_real_, trans = transform_identity()) { if (!is.trans(trans)) cli::cli_abort("{.arg trans} must be a {.cls trans} object") x <- trans$transform(x) limits <- train_continuous(x) map_continuous(palette, x, limits, na.value) } #' Train (update) a continuous scale #' #' Strips attributes and always returns a numeric vector #' #' @inheritParams train_discrete #' @export train_continuous <- function(new, existing = NULL) { if (is.null(new)) { return(existing) } if (is.factor(new) || !typeof(new) %in% c("integer", "double")) { cli::cli_abort("Discrete value supplied to a continuous scale") } # Needs casting to numeric because some `new` vectors can misbehave when # combined with a NULL `existing` (#369) suppressWarnings(range(existing, as.numeric(new), na.rm = TRUE, finite = TRUE)) } # Map values for a continuous palette. # # @param oob out of bounds behaviour. Defaults to \code{\link{censor}} # which turns oob values into missing values. map_continuous <- function(palette, x, limits, na.value = NA_real_, oob = censor) { x <- oob(rescale(x, from = limits)) pal <- palette(x) ifelse(!is.na(x), pal, na.value) } scales/R/range.R0000644000176200001440000000161414530122144013142 0ustar liggesusers#' Mutable ranges #' #' Mutable ranges have a two methods (`train` and `reset`), and #' make it possible to build up complete ranges with multiple passes. #' #' @export Range <- R6::R6Class("Range", list( range = NULL, initialize = function() { self$range <- NULL } )) #' @export #' @rdname Range DiscreteRange <- R6::R6Class( "DiscreteRange", inherit = Range, list( factor = NULL, train = function(x, drop = FALSE, na.rm = FALSE) { self$factor <- self$factor %||% is.factor(x) self$range <- train_discrete(x, self$range, drop, na.rm, self$factor) }, reset = function() { self$range <- NULL self$factor <- NULL } ) ) #' @export #' @rdname Range ContinuousRange <- R6::R6Class( "ContinuousRange", inherit = Range, list( train = function(x) self$range <- train_continuous(x, self$range), reset = function() self$range <- NULL ) ) scales/R/pal-gradient.R0000644000176200001440000000503514522421061014417 0ustar liggesusers#' Arbitrary colour gradient palette (continuous) #' #' @param colours vector of colours #' @param values if colours should not be evenly positioned along the gradient #' this vector gives the position (between 0 and 1) for each colour in the #' `colours` vector. See [rescale()] for a convenience function #' to map an arbitrary range to between 0 and 1. #' @param space colour space in which to calculate gradient. Must be "Lab" - #' other values are deprecated. #' @export pal_gradient_n <- function(colours, values = NULL, space = "Lab") { if (!identical(space, "Lab")) { lifecycle::deprecate_stop("0.3.0", "pal_gradient_n(space = 'only supports be \"Lab\"')") } ramp <- colour_ramp(colours) force(values) function(x) { if (length(x) == 0) { return(character()) } if (!is.null(values)) { xs <- seq(0, 1, length.out = length(values)) f <- stats::approxfun(values, xs) x <- f(x) } ramp(x) } } #' @export #' @rdname pal_gradient_n gradient_n_pal <- pal_gradient_n #' Diverging colour gradient (continuous). #' #' @param low colour for low end of gradient. #' @param mid colour for mid point #' @param high colour for high end of gradient. #' @inheritParams pal_gradient_n #' @export #' @examples #' x <- seq(-1, 1, length.out = 100) #' r <- sqrt(outer(x^2, x^2, "+")) #' image(r, col = pal_div_gradient()(seq(0, 1, length.out = 12))) #' image(r, col = pal_div_gradient()(seq(0, 1, length.out = 30))) #' image(r, col = pal_div_gradient()(seq(0, 1, length.out = 100))) #' #' library(munsell) #' pal <- pal_div_gradient(low = mnsl(complement("10R 4/6"), fix = TRUE)) #' image(r, col = pal(seq(0, 1, length.out = 100))) #' @importFrom munsell mnsl pal_div_gradient <- function(low = mnsl("10B 4/6"), mid = mnsl("N 8/0"), high = mnsl("10R 4/6"), space = "Lab") { pal_gradient_n(c(low, mid, high), space = space) } #' @export #' @rdname pal_div_gradient div_gradient_pal <- pal_div_gradient #' Sequential colour gradient palette (continuous) #' #' @param low colour for low end of gradient. #' @param high colour for high end of gradient. #' @inheritParams pal_gradient_n #' @export #' @examples #' x <- seq(0, 1, length.out = 25) #' show_col(pal_seq_gradient()(x)) #' show_col(pal_seq_gradient("white", "black")(x)) #' #' library(munsell) #' show_col(pal_seq_gradient("white", mnsl("10R 4/6"))(x)) pal_seq_gradient <- function(low = mnsl("10B 4/6"), high = mnsl("10R 4/6"), space = "Lab") { pal_gradient_n(c(low, high), space = space) } #' @export #' @rdname pal_seq_gradient seq_gradient_pal <- pal_seq_gradient scales/R/transform-compose.R0000644000176200001440000000547614522421001015531 0ustar liggesusers#' Compose two or more transformations together #' #' This transformer provides a general mechanism for composing two or more #' transformers together. The most important use case is to combine reverse #' with other transformations. #' #' @param ... One or more transformers, either specified with string or #' as individual transformer objects. #' @export #' @examples #' demo_continuous(10^c(-2:4), trans = "log10", labels = label_log()) #' demo_continuous(10^c(-2:4), trans = c("log10", "reverse"), labels = label_log()) transform_compose <- function(...) { trans_list <- lapply(list2(...), as.transform) if (length(trans_list) == 0) { cli::cli_abort("{.fun transform_compose} must include at least 1 transformer to compose") } # Resolve domains. First push the domain of the first transformation all the # way forward through the sequence of transformations, intersecting it with # all domains along the way, to get the range. Then push the range back # through the inverses to get the domain. range <- trans_list[[1]]$transform(trans_list[[1]]$domain) for (trans in trans_list[-1]) { lower <- max(min(trans$domain), min(range)) upper <- min(max(trans$domain), max(range)) if (isTRUE(lower <= upper)) { range <- trans$transform(c(lower, upper)) } else { range <- c(NA_real_, NA_real_) break } } domain <- compose_rev(range, trans_list) if (any(is.na(domain))) { cli::cli_abort("Sequence of transformations yields invalid domain") } domain <- range(domain) names <- vapply(trans_list, "[[", "name", FUN.VALUE = character(1)) has_d_transform <- all(lengths(lapply(trans_list, "[[", "d_transform")) > 0) has_d_inverse <- all(lengths(lapply(trans_list, "[[", "d_inverse")) > 0) new_transform( paste0("composition(", paste0(names, collapse = ","), ")"), transform = function(x) compose_fwd(x, trans_list), inverse = function(x) compose_rev(x, trans_list), d_transform = if (has_d_transform) function(x) compose_deriv_fwd(x, trans_list), d_inverse = if (has_d_inverse) function(x) compose_deriv_rev(x, trans_list), breaks = function(x) trans_list[[1]]$breaks(x), domain = domain ) } #' @export #' @rdname transform_compose compose_trans <- transform_compose compose_fwd <- function(x, trans_list) { for (trans in trans_list) { x <- trans$transform(x) } x } compose_rev <- function(x, trans_list) { for (trans in rev(trans_list)) { x <- trans$inverse(x) } x } compose_deriv_fwd <- function(x, trans_list) { x_deriv <- 1 for (trans in trans_list) { x_deriv <- trans$d_transform(x) * x_deriv x <- trans$transform(x) } x_deriv } compose_deriv_rev <- function(x, trans_list) { x_deriv <- 1 for (trans in rev(trans_list)) { x_deriv <- trans$d_inverse(x) * x_deriv x <- trans$inverse(x) } x_deriv } scales/R/scale-discrete.R0000644000176200001440000000541314530124454014744 0ustar liggesusers#' Discrete scale #' #' @param x vector of discrete values to scale #' @param palette aesthetic palette to use #' @param na.value aesthetic to use for missing values #' @export #' @examples #' with(mtcars, plot(disp, mpg, #' pch = 20, cex = 3, #' col = dscale(factor(cyl), pal_brewer()) #' )) dscale <- function(x, palette, na.value = NA) { limits <- train_discrete(x) map_discrete(palette, x, limits, na.value) } is.discrete <- function(x) { is.factor(x) || is.character(x) || is.logical(x) } #' Train (update) a discrete scale #' #' @param new New data to add to scale #' @param existing Optional existing scale to update #' @param drop `TRUE`, will drop factor levels not associated with data #' @param na.rm If `TRUE`, will remove missing values #' @param fct Treat `existing` as if it came from a factor (ie. don't sort the range) #' @export train_discrete <- function(new, existing = NULL, drop = FALSE, na.rm = FALSE, fct = NA) { if (is.null(new)) { return(existing) } if (!is.discrete(new)) { cli::cli_abort("Continuous value supplied to a discrete scale") } discrete_range(existing, new, drop = drop, na.rm = na.rm, fct = fct) } discrete_range <- function(old, new, drop = FALSE, na.rm = FALSE, fct = NA) { new_is_factor <- is.factor(new) old_is_factor <- is.factor(old) || isTRUE(fct) new <- clevels(new, drop = drop, na.rm = na.rm) if (is.null(old)) { return(new) } if (old_is_factor && !is.factor(old)) { old <- factor(old, old) } if (!is.character(old)) { old <- clevels(old, na.rm = na.rm) } else { old <- sort(old, na.last = if (na.rm) NA else TRUE) } # If new is more rich than old it becomes the primary if (new_is_factor && !old_is_factor) { tmp <- old old <- new new <- tmp tmp <- old_is_factor old_is_factor <- new_is_factor new_is_factor <- tmp } new_levels <- setdiff(new, old) # Keep as a factor if we don't have any new levels if (length(new_levels) == 0) { return(old) } range <- c(old, new_levels) # Avoid sorting levels when dealing with factors. `old` will always be a # factor if either `new` or `old` was a factor going in if (old_is_factor) { return(range) } sort(range, na.last = if (na.rm) NA else TRUE) } clevels <- function(x, drop = FALSE, na.rm = FALSE) { if (is.null(x)) { character() } else if (is.factor(x)) { if (drop) x <- factor(x) values <- levels(x) if (na.rm) { values <- values[!is.na(values)] } else if (any(is.na(x))) { values <- c(values, NA) } values } else { sort(unique(x), na.last = if (na.rm) NA else TRUE) } } map_discrete <- function(palette, x, limits, na.value = NA) { n <- length(limits) pal <- palette(n)[match(as.character(x), limits)] ifelse(!is.na(x), pal, na.value) } scales/R/label-expression.R0000644000176200001440000000420014520130030015304 0ustar liggesusers#' Label with mathematical annotations #' #' `label_parse()` produces expression from strings by parsing them; #' `label_math()` constructs expressions by replacing the pronoun `.x` #' with each string. #' #' @inherit label_number return #' @seealso [plotmath] for the details of mathematical formatting in R. #' @export #' @family labels for continuous scales #' @family labels for discrete scales #' @examples #' # Use label_parse() with discrete scales #' greek <- c("alpha", "beta", "gamma") #' demo_discrete(greek) #' demo_discrete(greek, labels = label_parse()) #' #' # Use label_math() with continuous scales #' demo_continuous(c(1, 5)) #' demo_continuous(c(1, 5), labels = label_math(alpha[.x])) #' demo_continuous(c(1, 5), labels = label_math()) label_parse <- function() { function(text) { parse_safe(as.character(text)) } } #' @rdname label_parse #' @export #' @param expr expression to use #' @param format another format function to apply prior to mathematical #' transformation - this makes it easier to use floating point numbers in #' mathematical expressions. label_math <- function(expr = 10^.x, format = force) { .x <- NULL quoted <- substitute(expr) subs <- function(x) { do.call("substitute", list(quoted, list(.x = x))) } function(x) { x <- format(x) ret <- lapply(x, subs) ret <- as.expression(ret) # restore NAs from input vector ret[is.na(x)] <- NA names(ret) <- names(x) ret } } #' Superseded interface to `label_parse()`/`label_math()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_parse()]/[label_math()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_parse parse_format <- label_parse #' @rdname parse_format #' @export math_format <- label_math # From ggplot2:::parse_safe # See https://github.com/tidyverse/ggplot2/issues/2864 for discussion. parse_safe <- function(text) { out <- vector("expression", length(text)) for (i in seq_along(text)) { expr <- parse(text = text[[i]]) out[[i]] <- if (length(expr) == 0) NA else expr[[1]] } out } scales/R/pal-dichromat.R0000644000176200001440000000205314522421001014563 0ustar liggesusers#' Dichromat (colour-blind) palette (discrete) #' #' @param name Name of colour palette. One of: #' \Sexpr[results=rd,stage=build]{scales:::dichromat_schemes()} #' @export #' @examples #' if (requireNamespace("dichromat", quietly = TRUE)) { #' show_col(pal_dichromat("BluetoOrange.10")(10)) #' show_col(pal_dichromat("BluetoOrange.10")(5)) #' #' # Can use with gradient_n to create a continous gradient #' cols <- pal_dichromat("DarkRedtoBlue.12")(12) #' show_col(pal_gradient_n(cols)(seq(0, 1, length.out = 30))) #' } pal_dichromat <- function(name) { check_installed("dichromat") if (!any(name == names(dichromat::colorschemes))) { cli::cli_abort("Palette name must be one of {.or {.val {names(dichromat::colorschemes)}}}") } pal <- dichromat::colorschemes[[name]] function(n) pal[seq_len(n)] } #' @export #' @rdname pal_dichromat dichromat_pal <- pal_dichromat dichromat_schemes <- function() { if (requireNamespace("dichromat", quietly = TRUE)) { paste0("\\code{", names(dichromat::colorschemes), "}", collapse = ", ") } } scales/R/documentation.R0000644000176200001440000000053014522421001014706 0ustar liggesusers# Functions used for producing Rd chunks to reduce duplication in # documentation seealso <- function(pattern) { require("scales") names <- ls("package:scales", pattern = pattern) paste0("\\code{\\link{", names, "}}", collapse = ", ") } seealso_transform <- function() seealso("^transform_") seealso_pal <- function() seealso("^pal_") scales/R/colour-manip.R0000644000176200001440000000714414522421001014452 0ustar liggesusers#' Modify standard R colour in hcl colour space. #' #' Transforms rgb to hcl, sets non-missing arguments and then backtransforms #' to rgb. #' #' @param colour character vector of colours to be modified #' @param h Hue, `[0, 360]` #' @param l Luminance, `[0, 100]` #' @param c Chroma, `[0, 100]` #' @param alpha Alpha, `[0, 1]`. #' @export #' @examples #' reds <- rep("red", 6) #' show_col(col2hcl(reds, h = seq(0, 180, length = 6))) #' show_col(col2hcl(reds, c = seq(0, 80, length = 6))) #' show_col(col2hcl(reds, l = seq(0, 100, length = 6))) #' show_col(col2hcl(reds, alpha = seq(0, 1, length = 6))) col2hcl <- function(colour, h = NULL, c = NULL, l = NULL, alpha = NULL) { hcl <- farver::decode_colour(colour, to = "hcl") if (!is.null(h)) hcl[, "h"] <- h if (!is.null(c)) hcl[, "c"] <- c if (!is.null(l)) hcl[, "l"] <- l farver::encode_colour(hcl, alpha, from = "hcl") } #' Mute standard colour #' #' @param colour character vector of colours to modify #' @param l new luminance #' @param c new chroma #' @export #' @examples #' muted("red") #' muted("blue") #' show_col(c("red", "blue", muted("red"), muted("blue"))) muted <- function(colour, l = 30, c = 70) col2hcl(colour, l = l, c = c) #' Modify colour transparency #' #' Vectorised in both colour and alpha. #' #' @param colour colour #' @param alpha new alpha level in \[0,1]. If alpha is `NA`, #' existing alpha values are preserved. #' @export #' @examples #' alpha("red", 0.1) #' alpha(colours(), 0.5) #' alpha("red", seq(0, 1, length.out = 10)) #' alpha(c("first" = "gold", "second" = "lightgray", "third" = "#cd7f32"), .5) alpha <- function(colour, alpha = NA) { if (length(colour) != length(alpha)) { if (length(colour) > 1 && length(alpha) > 1) { cli::cli_abort("Only one of {.arg colour} and {.arg alpha} can be vectorised") } if (length(colour) > 1) { alpha <- rep(alpha, length.out = length(colour)) } else { colour <- rep(colour, length.out = length(alpha)) } } rgb <- farver::decode_colour(colour, alpha = TRUE) rgb[!is.na(alpha), 4] <- alpha[!is.na(alpha)] farver::encode_colour(rgb, rgb[, 4]) } #' Show colours #' #' A quick and dirty way to show colours in a plot. #' #' @param colours A character vector of colours #' @param labels Label each colour with its hex name? #' @param borders Border colour for each tile. Default uses `par("fg")`. #' Use `border = NA` to omit borders. #' @param cex_label Size of printed labels, as multiplier of default size. #' @param ncol Number of columns. If not supplied, tries to be as square as #' possible. #' @export #' @importFrom graphics par plot rect text #' @keywords internal #' @examples #' show_col(pal_hue()(9)) #' show_col(pal_hue()(9), borders = NA) #' #' show_col(pal_viridis()(16)) #' show_col(pal_viridis()(16), labels = FALSE) show_col <- function(colours, labels = TRUE, borders = NULL, cex_label = 1, ncol = NULL) { n <- length(colours) ncol <- ncol %||% ceiling(sqrt(length(colours))) nrow <- ceiling(n / ncol) colours <- c(colours, rep(NA, nrow * ncol - length(colours))) colours <- matrix(colours, ncol = ncol, byrow = TRUE) old <- par(pty = "s", mar = c(0, 0, 0, 0)) on.exit(par(old)) size <- max(dim(colours)) plot(c(0, size), c(0, -size), type = "n", xlab = "", ylab = "", axes = FALSE) rect(col(colours) - 1, -row(colours) + 1, col(colours), -row(colours), col = colours, border = borders ) if (labels) { hcl <- farver::decode_colour(colours, "rgb", "hcl") label_col <- ifelse(hcl[, "l"] > 50, "black", "white") text(col(colours) - 0.5, -row(colours) + 0.5, colours, cex = cex_label, col = label_col) } } scales/R/label-number-si.R0000644000176200001440000000225214522424624015034 0ustar liggesusers#' Label numbers with SI prefixes (2 kg, 5 mm, etc) #' #' @description #' `r lifecycle::badge("deprecated")` #' #' `label_number_si()` is deprecated because the previous unit didn't actually #' use SI units, but instead used the so called "short scale". You can now get the #' same results as before with #' `label_number(scale_cut = cut_short_scale())`, or if you want correct SI #' units, `label_number(scale_cut = cut_si("unit"))`. #' #' @keywords internal #' @inherit label_number return params #' @param unit Unit of measurement (e.g. `"m"` for meter, the SI unit of length). #' @param scale A scaling factor: `x` will be multiplied by `scale` before #' formatting. This is useful if the underlying data is already using an SI #' prefix. #' @inheritDotParams label_number #' @export #' @family labels for continuous scales #' @family labels for log scales label_number_si <- function(unit = "", accuracy = NULL, scale = 1, suffix = "", ...) { lifecycle::deprecate_stop( when = "1.2.0", what = "label_number_si()", with = "label_number(scale_cut)" ) } cut_bad_si <- function(unit) { out <- cut_short_scale(unit != "") names(out) <- paste0(names(out), unit) out } scales/R/breaks-retired.R0000644000176200001440000000707114520134353014760 0ustar liggesusers#' Regularly spaced dates #' #' @description #' `r lifecycle::badge('superseded')` #' #' Use `breaks_width()` instead. #' #' @param width an interval specification, one of "sec", "min", "hour", #' "day", "week", "month", "year". Can be by an integer and a space, or #' followed by "s". Fractional seconds are supported. #' @keywords internal #' @export date_breaks <- function(width = "1 month") { force(width) function(x) fullseq(x, width) } #' Pretty breaks on transformed scale #' #' @description #' `r lifecycle::badge('superseded')` #' #' These often do not produce very attractive breaks. #' #' @param trans function of single variable, `x`, that given a numeric #' vector returns the transformed values #' @param inv inverse of the transformation function #' @param n desired number of ticks #' @param ... other arguments passed on to pretty #' @keywords internal #' @export #' @examples #' trans_breaks("log10", function(x) 10^x)(c(1, 1e6)) #' trans_breaks("sqrt", function(x) x^2)(c(1, 100)) #' trans_breaks(function(x) 1 / x, function(x) 1 / x)(c(1, 100)) #' trans_breaks(function(x) -x, function(x) -x)(c(1, 100)) trans_breaks <- function(trans, inv, n = 5, ...) { trans <- match.fun(trans) inv <- match.fun(inv) force_all(n, ...) n_default <- n function(x, n = n_default) { inv(pretty(trans(x), n, ...)) } } #' Compute breaks for continuous scale #' #' @description #' `r lifecycle::badge('superseded')` #' #' This function wraps up the components needed to go from a continuous range #' to a set of breaks and labels suitable for display on axes or legends. #' #' @param range numeric vector of length 2 giving the range of the underlying #' data #' @param breaks either a vector of break values, or a break function that #' will make a vector of breaks when given the range of the data #' @param labels either a vector of labels (character vector or list of #' expression) or a format function that will make a vector of labels when #' called with a vector of breaks. Labels can only be specified manually if #' breaks are - it is extremely dangerous to supply labels if you don't know #' what the breaks will be. #' @keywords internal #' @export #' @examples #' cbreaks(c(0, 100)) #' cbreaks(c(0, 100), breaks_pretty(3)) #' cbreaks(c(0, 100), breaks_pretty(10)) #' cbreaks(c(1, 100), log_breaks()) #' cbreaks(c(1, 1e4), log_breaks()) #' #' cbreaks(c(0, 100), labels = math_format()) #' cbreaks(c(0, 1), labels = percent_format()) #' cbreaks(c(0, 1e6), labels = comma_format()) #' cbreaks(c(0, 1e6), labels = dollar_format()) #' cbreaks(c(0, 30), labels = dollar_format()) #' #' # You can also specify them manually: #' cbreaks(c(0, 100), breaks = c(15, 20, 80)) #' cbreaks(c(0, 100), breaks = c(15, 20, 80), labels = c(1.5, 2.0, 8.0)) #' cbreaks(c(0, 100), #' breaks = c(15, 20, 80), #' labels = expression(alpha, beta, gamma) #' ) cbreaks <- function(range, breaks = extended_breaks(), labels = scientific_format()) { if (zero_range(range)) { return(list(breaks = range[1], labels = format(range[1]))) } if (is.function(breaks)) { breaks <- breaks(range) if (!is.function(labels)) { cli::cli_abort("{.arg labels} can only be manually specified in conjunction with {.arg breaks}") } } if (is.function(labels)) { labels <- labels(breaks) } else { if (length(labels) != length(breaks)) { cli::cli_abort("{.arg labels} and {.arg breaks} must be same length") } if (is.expression(labels)) { labels <- as.list(labels) } else { labels <- as.character(labels) } } list(breaks = breaks, labels = labels) } scales/R/breaks.R0000644000176200001440000001351014522154141013316 0ustar liggesusers#' Equally spaced breaks #' #' Useful for numeric, date, and date-time scales. #' #' @param width Distance between each break. Either a number, or for #' date/times, a single string of the form `"{n} {unit}"`, e.g. "1 month", #' "5 days". Unit can be of one "sec", "min", "hour", "day", "week", #' "month", "year". #' @param offset Use if you don't want breaks to start at zero, or on a #' conventional date or time boundary such as the 1st of January or midnight. #' Either a number, or for date/times, a single string of the form #' `"{n} {unit}"`, as for `width`. #' #' `offset` can be a vector, which will accumulate in the order given. This #' is mostly useful for dates, where e.g. `c("3 months", "5 days")` will #' offset by three months and five days, which is useful for the UK tax year. #' Note that due to way that dates are rounded, there's no guarantee that #' `offset = c(x, y)` will give the same result as `offset = c(y, x)`. #' @export #' @examples #' demo_continuous(c(0, 100)) #' demo_continuous(c(0, 100), breaks = breaks_width(10)) #' demo_continuous(c(0, 100), breaks = breaks_width(20, -4)) #' demo_continuous(c(0, 100), breaks = breaks_width(20, 4)) #' #' # This is also useful for dates #' one_month <- as.POSIXct(c("2020-05-01", "2020-06-01")) #' demo_datetime(one_month) #' demo_datetime(one_month, breaks = breaks_width("1 week")) #' demo_datetime(one_month, breaks = breaks_width("5 days")) #' # This is so useful that scale_x_datetime() has a shorthand: #' demo_datetime(one_month, date_breaks = "5 days") #' #' # hms times also work #' one_hour <- hms::hms(hours = 0:1) #' demo_time(one_hour) #' demo_time(one_hour, breaks = breaks_width("15 min")) #' demo_time(one_hour, breaks = breaks_width("600 sec")) #' #' # Offets are useful for years that begin on dates other than the 1st of #' # January, such as the UK financial year, which begins on the 1st of April. #' three_years <- as.POSIXct(c("2020-01-01", "2021-01-01", "2022-01-01")) #' demo_datetime( #' three_years, #' breaks = breaks_width("1 year", offset = "3 months") #' ) #' #' # The offset can be a vector, to create offsets that have compound units, #' # such as the UK fiscal (tax) year, which begins on the 6th of April. #' demo_datetime( #' three_years, #' breaks = breaks_width("1 year", offset = c("3 months", "5 days")) #' ) breaks_width <- function(width, offset = 0) { force_all(width, offset) function(x) { x <- fullseq(x, width) for (i in offset) { x <- offset_by(x, i) } x } } #' Automatic breaks for numeric axes #' #' Uses Wilkinson's extended breaks algorithm as implemented in the #' \pkg{labeling} package. #' #' @param n Desired number of breaks. You may get slightly more or fewer #' breaks that requested. #' @param ... other arguments passed on to [labeling::extended()] #' @references Talbot, J., Lin, S., Hanrahan, P. (2010) An Extension of #' Wilkinson's Algorithm for Positioning Tick Labels on Axes, InfoVis #' 2010 . #' @export #' @examples #' demo_continuous(c(0, 10)) #' demo_continuous(c(0, 10), breaks = breaks_extended(3)) #' demo_continuous(c(0, 10), breaks = breaks_extended(10)) breaks_extended <- function(n = 5, ...) { n_default <- n function(x, n = n_default) { x <- x[is.finite(x)] if (length(x) == 0) { return(numeric()) } rng <- range(x) labeling::extended(rng[1], rng[2], n, ...) } } #' @export #' @usage NULL #' @rdname breaks_extended extended_breaks <- breaks_extended #' Pretty breaks for date/times #' #' Uses default R break algorithm as implemented in [pretty()]. This is #' primarily useful for date/times, as [extended_breaks()] should do a slightly #' better job for numeric scales. #' #' @inheritParams breaks_extended #' @param ... other arguments passed on to [pretty()] #' @export #' @examples #' one_month <- as.POSIXct(c("2020-05-01", "2020-06-01")) #' demo_datetime(one_month) #' demo_datetime(one_month, breaks = breaks_pretty(2)) #' demo_datetime(one_month, breaks = breaks_pretty(4)) #' #' # Tightly spaced date breaks often need custom labels too #' demo_datetime(one_month, breaks = breaks_pretty(12)) #' demo_datetime(one_month, #' breaks = breaks_pretty(12), #' labels = label_date_short() #' ) breaks_pretty <- function(n = 5, ...) { force_all(n, ...) n_default <- n function(x, n = n_default) { breaks <- pretty(x, n, ...) names(breaks) <- attr(breaks, "labels") breaks } } #' Superseded interface to `breaks_pretty()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [breaks_pretty()] for new code. #' #' @keywords internal #' @export #' @inheritParams breaks_pretty pretty_breaks <- breaks_pretty #' Breaks for timespan data #' #' As timespan units span a variety of bases (1000 below seconds, 60 for second #' and minutes, 24 for hours, and 7 for days), the range of the input data #' determines the base used for calculating breaks #' #' @param unit The unit used to interpret numeric data input #' @inheritParams breaks_extended #' @export #' @examples #' demo_timespan(seq(0, 100), breaks = breaks_timespan()) #' breaks_timespan <- function(unit = c("secs", "mins", "hours", "days", "weeks"), n = 5) { unit <- arg_match(unit) force(n) function(x) { x <- as.numeric(as.difftime(x, units = unit), units = "secs") rng <- range(x) diff <- rng[2] - rng[1] if (diff <= 2 * 60) { scale <- 1 } else if (diff <= 2 * 3600) { scale <- 60 } else if (diff <= 2 * 86400) { scale <- 3600 } else if (diff <= 2 * 604800) { scale <- 86400 } else { scale <- 604800 } rng <- rng / scale breaks <- labeling::extended( rng[1], rng[2], n, Q = c(1, 2, 1.5, 4, 3), only.loose = FALSE ) as.difftime(breaks * scale, units = "secs") } } scales/R/label-pvalue.R0000644000176200001440000000443314520137575014436 0ustar liggesusers#' Label p-values (e.g. <0.001, 0.25, p >= 0.99) #' #' Formatter for p-values, using "<" and ">" for p-values close to 0 and 1. #' #' @inherit label_number return params #' @param prefix A character vector of length 3 giving the prefixes to #' put in front of numbers. The default values are `c("<", "", ">")` #' if `add_p` is `TRUE` and `c("p<", "p=", "p>")` if `FALSE`. #' @param add_p Add "p=" before the value? #' @export #' @family labels for continuous scales #' @examples #' demo_continuous(c(0, 1)) #' demo_continuous(c(0, 1), labels = label_pvalue()) #' demo_continuous(c(0, 1), labels = label_pvalue(accuracy = 0.1)) #' demo_continuous(c(0, 1), labels = label_pvalue(add_p = TRUE)) #' #' # Or provide your own prefixes #' prefix <- c("p < ", "p = ", "p > ") #' demo_continuous(c(0, 1), labels = label_pvalue(prefix = prefix)) label_pvalue <- function(accuracy = .001, decimal.mark = ".", prefix = NULL, add_p = FALSE) { force_all(accuracy, decimal.mark, add_p) function(x) { pvalue( x, accuracy = accuracy, decimal.mark = decimal.mark, prefix = prefix, add_p = add_p ) } } #' Superseded interface to `label_pvalue()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_pvalue()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_pvalue #' @export pvalue_format <- label_pvalue #' @rdname pvalue_format #' @export pvalue <- function(x, accuracy = .001, decimal.mark = ".", prefix = NULL, add_p = FALSE) { out <- number(x, accuracy, decimal.mark = decimal.mark) below <- number(accuracy, accuracy, decimal.mark = decimal.mark) above <- number(1 - accuracy, accuracy, decimal.mark = decimal.mark) if (is.null(prefix)) { if (add_p) { prefix <- c("p<", "p=", "p>") } else { prefix <- c("<", "", ">") } } else { if (!is.character(prefix) || length(prefix) != 3) { cli::cli_abort("{.arg prefix} must be a length 3 character vector") } } out <- paste0(prefix[[2]], out) out[x < accuracy] <- paste0(prefix[[1]], below) out[x > 1 - accuracy] <- paste0(prefix[[3]], above) out[is.na(x)] <- NA names(out) <- names(x) out } scales/R/full-seq.R0000644000176200001440000000324014520130030013563 0ustar liggesusers#' Generate sequence of fixed size intervals covering range. #' #' @param range range #' @param size interval size #' @param ... other arguments passed on to methods #' @keywords internal #' @export fullseq <- function(range, size, ...) UseMethod("fullseq") #' @export fullseq.numeric <- function(range, size, ..., pad = FALSE) { if (zero_range(range)) { return(range + size * c(-1, 1) / 2) } x <- seq( round_any(range[1], size, floor), round_any(range[2], size, ceiling), by = size ) if (pad) { # Add extra bin on bottom and on top, to guarantee that we cover complete # range of data, whether right = T or F c(min(x) - size, x, max(x) + size) } else { x } } #' @export fullseq.Date <- function(range, size, ...) { seq(floor_date(range[1], size), ceiling_date(range[2], size), by = size) } #' @export fullseq.POSIXt <- function(range, size, ...) { # for subsecond interval support # seq() does not support partial secs in character strings parsed <- parse_unit_spec(size) if (parsed$unit == "sec") { seq(floor_time(range[1], size), ceiling_time(range[2], size), by = parsed$mult) } else { seq(floor_time(range[1], size), ceiling_time(range[2], size), by = size) } } #' @export fullseq.difftime <- function(range, size, ...) { if (is.numeric(size)) { size_seconds <- size } else { size_seconds <- unit_seconds(size) } input_units <- units(range) x <- seq( round_any(as.numeric(range[1], units = "secs"), size_seconds, floor), round_any(as.numeric(range[2], units = "secs"), size_seconds, ceiling), by = size_seconds ) x <- as.difftime(x, units = "secs") units(x) <- input_units x } scales/R/pal-brewer.R0000644000176200001440000000440014522421001014075 0ustar liggesusers#' Colour Brewer palette (discrete) #' #' @param type One of "seq" (sequential), "div" (diverging) or "qual" #' (qualitative) #' @param palette If a string, will use that named palette. If a number, will #' index into the list of palettes of appropriate `type` #' @param direction Sets the order of colours in the scale. If 1, the default, #' colours are as output by [RColorBrewer::brewer.pal()]. If -1, the #' order of colours is reversed. #' @references #' @export #' @examples #' show_col(pal_brewer()(10)) #' show_col(pal_brewer("div")(5)) #' show_col(pal_brewer(palette = "Greens")(5)) #' #' # Can use with gradient_n to create a continuous gradient #' cols <- pal_brewer("div")(5) #' show_col(pal_gradient_n(cols)(seq(0, 1, length.out = 30))) pal_brewer <- function(type = "seq", palette = 1, direction = 1) { pal <- pal_name(palette, type) force(direction) function(n) { # If <3 colors are requested, brewer.pal will return a 3-color palette and # give a warning. This warning isn't useful, so suppress it. # If the palette has k colors and >k colors are requested, brewer.pal will # return a k-color palette and give a warning. This warning is useful, so # don't suppress it. if (n < 3) { pal <- suppressWarnings(RColorBrewer::brewer.pal(n, pal)) } else { pal <- RColorBrewer::brewer.pal(n, pal) } # In both cases ensure we have n items pal <- pal[seq_len(n)] if (direction == -1) { pal <- rev(pal) } pal } } #' @export #' @rdname pal_brewer brewer_pal <- pal_brewer pal_name <- function(palette, type) { if (is.character(palette)) { if (!palette %in% unlist(brewer)) { cli::cli_warn("Unknown palette: {.val {palette}}") palette <- "Greens" } return(palette) } type <- match.arg(type, c("div", "qual", "seq")) brewer[[type]][palette] } brewer <- list( div = c( "BrBG", "PiYG", "PRGn", "PuOr", "RdBu", "RdGy", "RdYlBu", "RdYlGn", "Spectral" ), qual = c( "Accent", "Dark2", "Paired", "Pastel1", "Pastel2", "Set1", "Set2", "Set3" ), seq = c( "Blues", "BuGn", "BuPu", "GnBu", "Greens", "Greys", "Oranges", "OrRd", "PuBu", "PuBuGn", "PuRd", "Purples", "RdPu", "Reds", "YlGn", "YlGnBu", "YlOrBr", "YlOrRd" ) ) scales/R/label-number.R0000644000176200001440000003307114523373061014425 0ustar liggesusers#' Label numbers in decimal format (e.g. 0.12, 1,234) #' #' Use `label_number()` force decimal display of numbers (i.e. don't use #' [scientific][label_scientific] notation). `label_comma()` is a special case #' that inserts a comma every three digits. #' #' @return #' All `label_()` functions return a "labelling" function, i.e. a function that #' takes a vector `x` and returns a character vector of `length(x)` giving a #' label for each input value. #' #' Labelling functions are designed to be used with the `labels` argument of #' ggplot2 scales. The examples demonstrate their use with x scales, but #' they work similarly for all scales, including those that generate legends #' rather than axes. #' #' @param accuracy A number to round to. Use (e.g.) `0.01` to show 2 decimal #' places of precision. If `NULL`, the default, uses a heuristic that should #' ensure breaks have the minimum number of digits needed to show the #' difference between adjacent values. #' #' Applied to rescaled data. #' @param scale A scaling factor: `x` will be multiplied by `scale` before #' formatting. This is useful if the underlying data is very small or very #' large. #' @param prefix Additional text to display before the number. The suffix is #' applied to absolute value before `style_positive` and `style_negative` are #' processed so that `prefix = "$"` will yield (e.g.) `-$1` and `($1)`. #' @param suffix Additional text to display after the number. #' @param big.mark Character used between every 3 digits to separate thousands. #' @param decimal.mark The character to be used to indicate the numeric #' decimal point. #' @param style_positive A string that determines the style of positive numbers: #' #' * `"none"` (the default): no change, e.g. `1`. #' * `"plus"`: preceded by `+`, e.g. `+1`. #' * `"space"`: preceded by a Unicode "figure space", i.e., a space equally #' as wide as a number or `+`. Compared to `"none"`, adding a figure space #' can ensure numbers remain properly aligned when they are left- or #' right-justified. #' @param style_negative A string that determines the style of negative numbers: #' #' * `"hyphen"` (the default): preceded by a standard hypen `-`, e.g. `-1`. #' * `"minus"`, uses a proper Unicode minus symbol. This is a typographical #' nicety that ensures `-` aligns with the horizontal bar of the #' the horizontal bar of `+`. #' * `"parens"`, wrapped in parentheses, e.g. `(1)`. #' @param scale_cut Named numeric vector that allows you to rescale large #' (or small) numbers and add a prefix. Built-in helpers include: #' * `cut_short_scale()`: [10^3, 10^6) = K, [10^6, 10^9) = M, [10^9, 10^12) = B, [10^12, Inf) = T. #' * `cut_long_scale()`: [10^3, 10^6) = K, [10^6, 10^12) = M, [10^12, 10^18) = B, [10^18, Inf) = T. #' * `cut_si(unit)`: uses standard SI units. #' #' If you supply a vector `c(a = 100, b = 1000)`, absolute values in the #' range `[0, 100)` will not be rescaled, absolute values in the range `[100, 1000)` #' will be divided by 100 and given the suffix "a", and absolute values in #' the range `[1000, Inf)` will be divided by 1000 and given the suffix "b". #' If the division creates an irrational value (or one with many digits), the #' cut value below will be tried to see if it improves the look of the final #' label. #' @param trim Logical, if `FALSE`, values are right-justified to a common #' width (see [base::format()]). #' @param ... Other arguments passed on to [base::format()]. #' @export #' @examplesIf getRversion() >= "3.5" #' demo_continuous(c(-1e6, 1e6)) #' demo_continuous(c(-1e6, 1e6), labels = label_number()) #' demo_continuous(c(-1e6, 1e6), labels = label_comma()) #' #' # Use scale to rescale very small or large numbers to generate #' # more readable labels #' demo_continuous(c(0, 1e6), labels = label_number()) #' demo_continuous(c(0, 1e6), labels = label_number(scale = 1 / 1e3)) #' demo_continuous(c(0, 1e-6), labels = label_number()) #' demo_continuous(c(0, 1e-6), labels = label_number(scale = 1e6)) #' #' #' Use scale_cut to automatically add prefixes for large/small numbers #' demo_log10( #' c(1, 1e9), #' breaks = log_breaks(10), #' labels = label_number(scale_cut = cut_short_scale()) #' ) #' demo_log10( #' c(1, 1e9), #' breaks = log_breaks(10), #' labels = label_number(scale_cut = cut_si("m")) #' ) #' demo_log10( #' c(1e-9, 1), #' breaks = log_breaks(10), #' labels = label_number(scale_cut = cut_si("g")) #' ) #' # use scale and scale_cut when data already uses SI prefix #' # for example, if data was stored in kg #' demo_log10( #' c(1e-9, 1), #' breaks = log_breaks(10), #' labels = label_number(scale_cut = cut_si("g"), scale = 1e3) #' ) #' #' #' # Use style arguments to vary the appearance of positive and negative numbers #' demo_continuous(c(-1e3, 1e3), labels = label_number( #' style_positive = "plus", #' style_negative = "minus" #' )) #' demo_continuous(c(-1e3, 1e3), labels = label_number(style_negative = "parens")) #' #' # You can use prefix and suffix for other types of display #' demo_continuous(c(32, 212), labels = label_number(suffix = "\u00b0F")) #' demo_continuous(c(0, 100), labels = label_number(suffix = "\u00b0C")) label_number <- function(accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = " ", decimal.mark = ".", style_positive = c("none", "plus", "space"), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, trim = TRUE, ...) { force_all( accuracy, scale, prefix, suffix, big.mark, decimal.mark, style_positive, style_negative, scale_cut, trim, ... ) function(x) { number( x, accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, style_positive = style_positive, style_negative = style_negative, scale_cut = scale_cut, trim = trim, ... ) } } #' @export #' @rdname label_number #' @param digits `r lifecycle::badge("deprecated")` Use `accuracy` instead. label_comma <- function(accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, digits, ...) { if (!missing(digits)) { lifecycle::deprecate_stop( when = "1.0.0", what = "label_comma(digits)", with = "label_comma(accuracy)" ) } number_format( accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, ... ) } #' Superseded interface to `label_number()`/`label_comma()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_number()]/[label_comma()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_number #' @param x A numeric vector to format. comma <- function(x, accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, digits, ...) { if (!missing(digits)) { lifecycle::deprecate_stop( when = "1.0.0", what = "comma(digits)", with = "comma(accuracy)" ) } number( x = x, accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, ... ) } #' @export #' @rdname comma number_format <- label_number #' @export #' @rdname comma comma_format <- label_comma #' A low-level numeric formatter #' #' This function is a low-level helper that powers many of the labelling #' functions. You should generally not need to call it directly unless you #' are creating your own labelling function. #' #' @keywords internal #' @export #' @inheritParams label_number #' @return A character vector of `length(x)`. number <- function(x, accuracy = NULL, scale = 1, prefix = "", suffix = "", big.mark = " ", decimal.mark = ".", style_positive = c("none", "plus", "space"), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, trim = TRUE, ...) { if (length(x) == 0) { return(character()) } style_positive <- arg_match(style_positive) style_negative <- arg_match(style_negative) if (!is.null(scale_cut)) { cut <- scale_cut(x, breaks = scale_cut, scale = scale, accuracy = accuracy, suffix = suffix ) scale <- cut$scale suffix <- cut$suffix accuracy <- cut$accuracy } accuracy <- accuracy %||% precision(x * scale) x <- round_any(x, accuracy / scale) nsmalls <- -floor(log10(accuracy)) nsmalls <- pmin(pmax(nsmalls, 0), 20) sign <- sign(x) sign[is.na(sign)] <- 0 x <- abs(x) x_scaled <- scale * x ret <- character(length(x)) for (nsmall in unique(nsmalls)) { idx <- nsmall == nsmalls ret[idx] <- format( x_scaled[idx], big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, nsmall = nsmall, scientific = FALSE, ... ) } ret <- paste0(prefix, ret, suffix) ret[is.infinite(x)] <- as.character(x[is.infinite(x)]) if (style_negative == "hyphen") { ret[sign < 0] <- paste0("-", ret[sign < 0]) } else if (style_negative == "minus") { ret[sign < 0] <- paste0("\u2212", ret[sign < 0]) } else if (style_negative == "parens") { ret[sign < 0] <- paste0("(", ret[sign < 0], ")") } if (style_positive == "plus") { ret[sign > 0] <- paste0("+", ret[sign > 0]) } else if (style_positive == "space") { ret[sign > 0] <- paste0("\u2007", ret[sign > 0]) } # restore NAs from input vector ret[is.na(x)] <- NA names(ret) <- names(x) ret } # Helpers ----------------------------------------------------------------- precision <- function(x) { x <- unique(x) # ignore NA and Inf/-Inf x <- x[is.finite(x)] if (length(x) <= 1) { return(1) } smallest_diff <- min(diff(sort(x))) if (smallest_diff < sqrt(.Machine$double.eps)) { 1 } else { precision <- 10^(floor(log10(smallest_diff)) - 1) # reduce precision when final digit always 0 if (all(round(x / precision) %% 10 == 0)) { precision <- precision * 10 } # Never return precision bigger than 1 pmin(precision, 1) } } # each value of x is assigned a suffix and associated scaling factor scale_cut <- function(x, breaks, scale = 1, accuracy = NULL, suffix = "") { if (!is.numeric(breaks) || is.null(names(breaks))) { cli::cli_abort("{.arg scale_cut} must be a named numeric vector") } breaks <- sort(breaks, na.last = TRUE) if (any(is.na(breaks))) { cli::cli_abort("{.arg scale_cut} values must not be missing") } break_suffix <- as.character(cut( abs(x * scale), breaks = c(unname(breaks), Inf), labels = c(names(breaks)), right = FALSE )) break_suffix[is.na(break_suffix)] <- "" # See if any of the cuts aren't perfect cuts bad_break <- ((x * scale / breaks[break_suffix]) %% 1 != 0) %|% FALSE if (any(bad_break)) { # If the break below result in a perfect cut, prefer it lower_break <- breaks[match(break_suffix[bad_break], names(breaks)) - 1] improved_break <- (x[bad_break] * scale / lower_break) %% 1 == 0 # Unless the break below is a power of 10 change (1.25 is as good as 1250) power10_break <- log10(breaks[break_suffix[bad_break]] / lower_break) %% 1 == 0 break_suffix[bad_break][improved_break & !power10_break] <- names(lower_break[improved_break & !power10_break]) } break_scale <- scale * unname(1 / breaks[break_suffix]) break_scale[which(break_scale %in% c(Inf, NA))] <- scale # exact zero is not scaled, nor are values below lowest break break_scale[abs(x) == 0 | is.na(break_scale)] <- 1 suffix <- paste0(break_suffix, suffix) accuracy <- accuracy %||% stats::ave(x * break_scale, break_scale, FUN = precision) list( scale = break_scale, suffix = suffix, accuracy = accuracy ) } #' #' See [Metric Prefix](https://en.wikipedia.org/wiki/Metric_prefix) on Wikipedia #' for more details. #' @export #' @rdname number #' @param space Add a space before the scale suffix? cut_short_scale <- function(space = FALSE) { out <- c(0, K = 1e3, M = 1e6, B = 1e9, T = 1e12) if (space) { names(out) <- paste0(" ", names(out)) } out } #' @export #' @rdname number cut_long_scale <- function(space = FALSE) { out <- c(0, K = 1e3, M = 1e6, B = 1e12, T = 1e18) if (space) { names(out) <- paste0(" ", names(out)) } out } #' @export #' @rdname number cut_time_scale <- function(space = FALSE) { out <- c( 0, "ns" = 1e-9, "\u03BCs" = 1e-6, "ms" = 1e-3, "s" = 1, "m" = 60, "h" = 3600, "d" = 24 * 3600, "w" = 7 * 24 * 3600 ) if (space) { names(out) <- paste0(" ", names(out)) } out } # power-of-ten prefixes used by the International System of Units (SI) # https://www.bipm.org/en/measurement-units/prefixes.html # # note: irregular prefixes (hecto, deca, deci, centi) are not stored # because they don't commonly appear in scientific usage anymore si_powers <- c( y = -24, z = -21, a = -18, f = -15, p = -12, n = -9, micro = -6, m = -3, 0, k = 3, M = 6, G = 9, T = 12, P = 15, E = 18, Z = 21, Y = 24 ) # Avoid using UTF8 as symbol names(si_powers)[si_powers == -6] <- "\u00b5" #' @export #' @rdname number #' @param unit SI unit abbreviation. cut_si <- function(unit) { out <- c(0, 10^si_powers) names(out) <- c(paste0(" ", unit), paste0(" ", names(si_powers), unit)) out } scales/R/date-time.R0000644000176200001440000000353214520130030013710 0ustar liggesusers# Minimal date time code so no external dependencies needed, and # we can do the date operations we need. Need to look at this again once we # switch to S4 for lubridate. "%||%" <- function(a, b) if (!is.null(a)) a else b floor_date <- function(date, time) { prec <- parse_unit_spec(time) if (prec$unit == "day") { structure(round_any(as.numeric(date), prec$mult), class = "Date") } else { as.Date(cut(date, time, right = TRUE, include.lowest = TRUE)) } } floor_time <- function(date, time) { to_time <- function(x) { force(x) structure(x, class = c("POSIXt", "POSIXct"), tzone = attr(date, "tzone", exact = TRUE) %||% "" ) } prec <- parse_unit_spec(time) if (prec$unit == "sec") { to_time(round_any(as.numeric(date), prec$mult)) } else if (prec$unit == "min") { to_time(round_any(as.numeric(date), prec$mult * 60)) } else { as.POSIXct( cut(date, time, right = TRUE, include.lowest = TRUE), tz = attr(date, "tzone", exact = TRUE) %||% "" ) } } ceiling_date <- function(date, time) { prec <- parse_unit_spec(time) up <- c("day" = 1, "week" = 7, "month" = 31, "year" = 365) date <- date + prec$mult * up[prec$unit] floor_date(date, time) } ceiling_time <- function(date, time) { date <- date + unit_seconds(time) floor_time(date, time) } unit_seconds <- function(unitspec) { prec <- parse_unit_spec(unitspec) unit_in_seconds <- c( "sec" = 1, "min" = 60, "hour" = 3600, c("day" = 1, "week" = 7, "month" = 31, "year" = 365) * 3600 * 24 ) prec$mult * unit_in_seconds[prec$unit] } parse_unit_spec <- function(unitspec) { parts <- strsplit(unitspec, " ")[[1]] if (length(parts) == 1) { mult <- 1 unit <- unitspec } else { mult <- as.numeric(parts[[1]]) unit <- parts[[2]] } unit <- gsub("s$", "", unit) list(unit = unit, mult = mult) } scales/R/label-currency.R0000644000176200001440000001216614522421001014754 0ustar liggesusers#' Label currencies ($100, €2.50, etc) #' #' Format numbers as currency, rounding values to monetary or fractional #' monetary using unit a convenient heuristic. #' #' @inherit label_number return params #' @param accuracy,largest_with_fractional Number to round #' to. If `NULL`, the default, values will be rounded to the nearest integer, #' unless any of the values has non-zero fractional component (e.g. cents) and #' the largest value is less than `largest_with_fractional` which by default #' is 100,000. #' @param prefix,suffix Symbols to display before and after value. #' @inheritDotParams number #' @export #' @family labels for continuous scales #' @examples #' demo_continuous(c(0, 1), labels = label_currency()) #' demo_continuous(c(1, 100), labels = label_currency()) #' #' # Customise currency display with prefix and suffix #' demo_continuous(c(1, 100), labels = label_currency(prefix = "USD ")) #' yen <- label_currency( #' prefix = "ÂĄ", #' suffix = "", #' big.mark = ".", #' decimal.mark = "," #' ) #' demo_continuous(c(1000, 1100), labels = yen) #' #' # Use style_negative = "parens" for finance style display #' demo_continuous(c(-100, 100), labels = label_currency(style_negative = "parens")) #' #' # Use scale_cut to use K/M/B where appropriate #' demo_log10(c(1, 1e16), #' breaks = log_breaks(7, 1e3), #' labels = label_currency(scale_cut = cut_short_scale()) #' ) #' # cut_short_scale() uses B = one thousand million #' # cut_long_scale() uses B = one million million #' demo_log10(c(1, 1e16), #' breaks = log_breaks(7, 1e3), #' labels = label_currency(scale_cut = cut_long_scale()) #' ) #' #' # You can also define your own breaks #' gbp <- label_currency( #' prefix = "\u00a3", #' scale_cut = c(0, k = 1e3, m = 1e6, bn = 1e9, tn = 1e12) #' ) #' demo_log10(c(1, 1e12), breaks = log_breaks(5, 1e3), labels = gbp) label_currency <- function(accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_fractional = 100000, ...) { force_all( accuracy, scale, prefix, suffix, big.mark, decimal.mark, trim, largest_with_fractional, ... ) function(x) { dollar( x, accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, largest_with_cents = largest_with_fractional, ... ) } } needs_cents <- function(x, threshold) { if (all(is.na(x))) { return(FALSE) } if (max(abs(x), na.rm = TRUE) > threshold) { return(FALSE) } !all(x == floor(x), na.rm = TRUE) } #' Superseded interface to `label_currency()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_currency()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_currency #' @param largest_with_cents Like `largest_with_fractional()` in #' [label_currency()] #' @param negative_parens `r lifecycle::badge("deprecated")` Use #' `style_negative = "parens"` instead. dollar_format <- function(accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_cents = 100000, negative_parens = deprecated(), ...) { force_all( accuracy, scale, prefix, suffix, big.mark, decimal.mark, trim, largest_with_cents, negative_parens, ... ) function(x) { dollar( x, accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, largest_with_cents = largest_with_cents, negative_parens = negative_parens, ... ) } } #' @export #' @rdname dollar_format #' @param x A numeric vector dollar <- function(x, accuracy = NULL, scale = 1, prefix = "$", suffix = "", big.mark = ",", decimal.mark = ".", trim = TRUE, largest_with_cents = 100000, negative_parens = deprecated(), style_negative = c("hyphen", "minus", "parens"), scale_cut = NULL, ...) { if (length(x) == 0) { return(character()) } if (is.null(accuracy) && is.null(scale_cut)) { if (needs_cents(x * scale, largest_with_cents)) { accuracy <- .01 } else { accuracy <- 1 } } if (identical(big.mark, ",") & identical(decimal.mark, ",")) { big.mark <- " " } if (lifecycle::is_present(negative_parens)) { lifecycle::deprecate_stop("1.2.0", "dollar(negative_parens)", "dollar(style_negative)") } number( x, accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, style_negative = style_negative, scale_cut = scale_cut, ... ) } #' @export #' @rdname dollar_format label_dollar <- dollar_format scales/R/breaks-log.R0000644000176200001440000001016214520130030014062 0ustar liggesusers#' Breaks for log axes #' #' This algorithm starts by looking for integer powers of `base`. If that #' doesn't provide enough breaks, it then looks for additional intermediate #' breaks which are integer multiples of integer powers of base. If that fails #' (which it can for very small ranges), we fall back to [extended_breaks()] #' #' @details #' The algorithm starts by looking for a set of integer powers of `base` that #' cover the range of the data. If that does not generate at least `n - 2` #' breaks, we look for an integer between 1 and `base` that splits the interval #' approximately in half. For example, in the case of `base = 10`, this integer #' is 3 because `log10(3) = 0.477`. This leaves 2 intervals: `c(1, 3)` and #' `c(3, 10)`. If we still need more breaks, we look for another integer #' that splits the largest remaining interval (on the log-scale) approximately #' in half. For `base = 10`, this is 5 because `log10(5) = 0.699`. #' #' The generic algorithm starts with a set of integers `steps` containing #' only 1 and a set of candidate integers containing all integers larger than 1 #' and smaller than `base`. Then for each remaining candidate integer #' `x`, the smallest interval (on the log-scale) in the vector #' `sort(c(x, steps, base))` is calculated. The candidate `x` which #' yields the largest minimal interval is added to `steps` and removed from #' the candidate set. This is repeated until either a sufficient number of #' breaks, `>= n-2`, are returned or all candidates have been used. #' @param n desired number of breaks #' @param base base of logarithm to use #' @export #' @examples #' demo_log10(c(1, 1e5)) #' demo_log10(c(1, 1e6)) #' #' # Request more breaks by setting n #' demo_log10(c(1, 1e6), breaks = breaks_log(6)) #' #' # Some tricky ranges #' demo_log10(c(2000, 9000)) #' demo_log10(c(2000, 14000)) #' demo_log10(c(2000, 85000), expand = c(0, 0)) #' #' # An even smaller range that requires falling back to linear breaks #' demo_log10(c(1800, 2000)) breaks_log <- function(n = 5, base = 10) { force_all(n, base) n_default <- n function(x, n = n_default) { raw_rng <- suppressWarnings(range(x, na.rm = TRUE)) if (any(!is.finite(raw_rng))) { return(numeric()) } rng <- log(raw_rng, base = base) min <- floor(rng[1]) max <- ceiling(rng[2]) if (max == min) { return(base^min) } by <- floor((max - min) / n) + 1 breaks <- base^seq(min, max, by = by) relevant_breaks <- base^rng[1] <= breaks & breaks <= base^rng[2] if (sum(relevant_breaks) >= (n - 2)) { return(breaks) } # the easy solution to get more breaks is to decrease 'by' while (by > 1) { by <- by - 1 breaks <- base^seq(min, max, by = by) relevant_breaks <- base^rng[1] <= breaks & breaks <= base^rng[2] if (sum(relevant_breaks) >= (n - 2)) { return(breaks) } } log_sub_breaks(rng, n = n, base = base) } } #' @export #' @usage NULL #' @rdname breaks_log log_breaks <- breaks_log #' @author Thierry Onkelinx, \email{thierry.onkelinx@inbo.be} #' @noRd log_sub_breaks <- function(rng, n = 5, base = 10) { min <- floor(rng[1]) max <- ceiling(rng[2]) if (base <= 2) { return(base^(min:max)) } steps <- 1 # 'delta()' calculates the smallest distance in the log scale between the # currectly selected breaks and a new candidate 'x' delta <- function(x) { min(diff(log(sort(c(x, steps, base)), base = base))) } candidate <- seq_len(base) candidate <- candidate[1 < candidate & candidate < base] while (length(candidate)) { best <- which.max(vapply(candidate, delta, 0)) steps <- c(steps, candidate[best]) candidate <- candidate[-best] breaks <- as.vector(outer(base^seq(min, max), steps)) relevant_breaks <- base^rng[1] <= breaks & breaks <= base^rng[2] if (sum(relevant_breaks) >= (n - 2)) { break } } if (sum(relevant_breaks) >= (n - 2)) { breaks <- sort(breaks) lower_end <- pmax(min(which(base^rng[1] <= breaks)) - 1, 1) upper_end <- pmin(max(which(breaks <= base^rng[2])) + 1, length(breaks)) breaks[lower_end:upper_end] } else { extended_breaks(n = n)(base^rng) } } scales/R/pal-linetype.R0000644000176200001440000000060614522421001014444 0ustar liggesusers#' Line type palette (discrete) #' #' Based on a set supplied by Richard Pearson, University of Manchester #' #' @export pal_linetype <- function() { types <- c( "solid", "22", "42", "44", "13", "1343", "73", "2262", "12223242", "F282", "F4448444", "224282F2", "F1" ) function(n) { types[seq_len(n)] } } #' @export #' @rdname pal_linetype linetype_pal <- pal_linetype scales/R/label-date.R0000644000176200001440000001277614531113317014056 0ustar liggesusers#' Label date/times #' #' `label_date()` and `label_time()` label date/times using date/time format #' strings. `label_date_short()` automatically constructs a short format string #' sufficient to uniquely identify labels. It's inspired by matplotlib's #' [`ConciseDateFormatter`](https://matplotlib.org/stable/api/dates_api.html#matplotlib.dates.ConciseDateFormatter), #' but uses a slightly different approach: `ConciseDateFormatter` formats #' "firsts" (e.g. first day of month, first day of day) specially; #' `date_short()` formats changes (e.g. new month, new year) specially. #' `label_timespan()` is intended to show time passed and adds common time units #' suffix to the input (ns, us, ms, s, m, h, d, w). #' #' @inherit label_number return #' @param format For `date_format()` and `time_format()` a date/time format #' string using standard POSIX specification. See [strptime()] for details. #' #' For `date_short()` a character vector of length 4 giving the format #' components to use for year, month, day, and hour respectively. #' @param tz a time zone name, see [timezones()]. Defaults #' to UTC #' @param locale Locale to use when for day and month names. The default #' uses the current locale. Setting this argument requires stringi, and you #' can see a complete list of supported locales with #' [stringi::stri_locale_list()]. #' @export #' @examples #' date_range <- function(start, days) { #' start <- as.POSIXct(start) #' c(start, start + days * 24 * 60 * 60) #' } #' #' two_months <- date_range("2020-05-01", 60) #' demo_datetime(two_months) #' demo_datetime(two_months, labels = date_format("%m/%d")) #' demo_datetime(two_months, labels = date_format("%e %b", locale = "fr")) #' demo_datetime(two_months, labels = date_format("%e %B", locale = "es")) #' # ggplot2 provides a short-hand: #' demo_datetime(two_months, date_labels = "%m/%d") #' #' # An alternative labelling system is label_date_short() #' demo_datetime(two_months, date_breaks = "7 days", labels = label_date_short()) #' # This is particularly effective for dense labels #' one_year <- date_range("2020-05-01", 365) #' demo_datetime(one_year, date_breaks = "month") #' demo_datetime(one_year, date_breaks = "month", labels = label_date_short()) label_date <- function(format = "%Y-%m-%d", tz = "UTC", locale = NULL) { force_all(format, tz, locale) function(x) { format_dt(x, format = format, tz = tz, locale = locale) } } #' @export #' @rdname label_date #' @param sep Separator to use when combining date formats into a single string. label_date_short <- function(format = c("%Y", "%b", "%d", "%H:%M"), sep = "\n") { force_all(format, sep) function(x) { dt <- unclass(as.POSIXlt(x)) changes <- cbind( year = changed(dt$year), month = changed(dt$mon), day = changed(dt$mday) ) # Ensure large unit changes implies that small units change too # Would be more elegant with cumany() but cumsum() does the job changes <- t(apply(changes, 1, cumsum)) >= 1 # Trim out "firsts" from smallest to largest - only want to trim (e.g.) # January if all dates are the first of the month. if (inherits(x, "Date") || all(dt$hour == 0 & dt$min == 0, na.rm = TRUE)) { format[[4]] <- NA if (all(dt$mday == 1, na.rm = TRUE)) { format[[3]] <- NA if (all(dt$mon == 0, na.rm = TRUE)) { format[[2]] <- NA } } } for_mat <- cbind( ifelse(changes[, 1], format[[1]], NA), ifelse(changes[, 2], format[[2]], NA), ifelse(changes[, 3], format[[3]], NA), format[[4]] ) format <- apply(for_mat, 1, function(x) paste(rev(x[!is.na(x)]), collapse = sep)) format(x, format) } } changed <- function(x) c(TRUE, is.na(x[-length(x)]) | x[-1] != x[-length(x)]) append_if <- function(x, cond, value) { x[cond] <- lapply(x[cond], c, value) x } #' @export #' @rdname label_date label_time <- function(format = "%H:%M:%S", tz = "UTC", locale = NULL) { force_all(format, tz) function(x) { if (inherits(x, "POSIXt")) { format_dt(x, format = format, tz = tz, locale = locale) } else if (inherits(x, "difftime")) { format(as.POSIXct(x), format = format, tz = tz) } else { cli::cli_abort("{.fun label_time} can't be used with an object of class {.cls {class(x)}}") } } } #' @export #' @rdname label_date #' @param unit The unit used to interpret numeric input #' @param space Add a space before the time unit? #' @inheritDotParams number accuracy scale prefix suffix big.mark decimal.mark style_positive style_negative trim label_timespan <- function(unit = c("secs", "mins", "hours", "days", "weeks"), space = FALSE, ...) { unit <- arg_match(unit) force_all(...) function(x) { x <- as.numeric(as.difftime(x, units = unit), units = "secs") number( x, scale_cut = cut_time_scale(space), ... ) } } format_dt <- function(x, format, tz = "UTC", locale = NULL) { if (is.null(locale)) { format(x, format = format, tz = tz) } else { check_installed("stringi") format <- stringi::stri_datetime_fstr(format) stringi::stri_datetime_format(x, format, tz = tz, locale = locale) } } #' Superseded interface to `label_date()`/`label_time()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_date()/[label_time()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_date date_format <- label_date #' @export #' @rdname date_format time_format <- label_time scales/R/label-ordinal.R0000644000176200001440000000616114520152015014554 0ustar liggesusers#' Label ordinal numbers (1st, 2nd, 3rd, etc) #' #' Round values to integers and then display as ordinal values (e.g. 1st, 2nd, #' 3rd). Built-in rules are provided for English, French, and Spanish. #' #' @inherit label_number return params #' @param prefix,suffix Symbols to display before and after value. #' @param rules Named list of regular expressions, matched in order. #' Name gives suffix, and value specifies which numbers to match. #' @param gender Masculin or feminin gender for French ordinal. #' @param plural Plural or singular for French ordinal. #' @inheritDotParams number #' @export #' @family labels for continuous scales #' @examples #' demo_continuous(c(1, 5)) #' demo_continuous(c(1, 5), labels = label_ordinal()) #' demo_continuous(c(1, 5), labels = label_ordinal(rules = ordinal_french())) #' #' # The rules are just a set of regular expressions that are applied in turn #' ordinal_french() #' ordinal_english() #' #' # Note that ordinal rounds values, so you may need to adjust the breaks too #' demo_continuous(c(1, 10)) #' demo_continuous(c(1, 10), labels = label_ordinal()) #' demo_continuous(c(1, 10), #' labels = label_ordinal(), #' breaks = breaks_width(2) #' ) label_ordinal <- function(prefix = "", suffix = "", big.mark = " ", rules = ordinal_english(), ...) { force_all(prefix, suffix, big.mark, rules, ...) function(x) { ordinal( x, prefix = prefix, suffix = suffix, big.mark = big.mark, rules = rules, ... ) } } #' @export #' @rdname label_ordinal ordinal_english <- function() { list( st = "(? max(b)) b <- c(b, b[length(b)] + bd) } else { if (max(limits) > max(b)) b <- c(b[1] - bd, b) if (min(limits) < min(b)) b <- c(b, b[length(b)] + bd) } # Find minor breaks between major breaks seq_between <- function(a, b) { seq(a, b, length.out = n + 1)[-(n + 1)] } breaks <- unlist(Map(seq_between, b[-length(b)], b[-1])) # Add the final break back breaks <- c(breaks, b[length(b)]) breaks } } scales/R/pal-rescale.R0000644000176200001440000000067614522421001014240 0ustar liggesusers#' Rescale palette (continuous) #' #' Just rescales the input to the specific output range. Useful for #' alpha, size, and continuous position. #' #' @param range Numeric vector of length two, giving range of possible #' values. Should be between 0 and 1. #' @export pal_rescale <- function(range = c(0.1, 1)) { force(range) function(x) { rescale(x, range, c(0, 1)) } } #' @export #' @rdname pal_rescale rescale_pal <- pal_rescale scales/R/bounds.R0000644000176200001440000002617514522154141013354 0ustar liggesusers#' Rescale continuous vector to have specified minimum and maximum #' #' @param x continuous vector of values to manipulate. #' @param to output range (numeric vector of length two) #' @param from input range (vector of length two). If not given, is #' calculated from the range of `x` #' @param ... other arguments passed on to methods #' @details #' Objects of class `` are returned unaltered. #' #' @keywords manip #' @export #' @examples #' rescale(1:100) #' rescale(runif(50)) #' rescale(1) rescale <- function(x, to, from, ...) { UseMethod("rescale") } #' @rdname rescale #' @export rescale.numeric <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) { if (zero_range(from) || zero_range(to)) { return(ifelse(is.na(x), NA, mean(to))) } (x - from[1]) / diff(from) * diff(to) + to[1] } #' @export rescale.NULL <- function(...) NULL #' @rdname rescale #' @export rescale.dist <- rescale.numeric #' @rdname rescale #' @export rescale.logical <- rescale.numeric #' @rdname rescale #' @export rescale.POSIXt <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE, finite = TRUE), ...) { x <- as.numeric(x) from <- as.numeric(from) rescale.numeric(x = x, to = to, from = from) } #' @rdname rescale #' @export rescale.Date <- rescale.POSIXt #' @rdname rescale #' @export rescale.integer64 <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE), ...) { if (zero_range(from, tol = 0) || zero_range(to)) { return(ifelse(is.na(x), NA, mean(to))) } (x - from[1]) / diff(from) * diff(to) + to[1] } #' @rdname rescale #' @export rescale.difftime <- rescale.numeric #' @rdname rescale #' @export rescale.AsIs <- function(x, to, from, ...) x #' Rescale vector to have specified minimum, midpoint, and maximum #' #' @export #' @param x vector of values to manipulate. #' @param to output range (numeric vector of length two) #' @param from input range (vector of length two). If not given, is #' calculated from the range of `x` #' @param mid mid-point of input range #' @param ... other arguments passed on to methods #' @details #' Objects of class `` are returned unaltered. #' @examples #' rescale_mid(1:100, mid = 50.5) #' rescale_mid(runif(50), mid = 0.5) #' rescale_mid(1) rescale_mid <- function(x, to, from, mid, ...) { UseMethod("rescale_mid") } #' @rdname rescale_mid #' @export rescale_mid.numeric <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid = 0, ...) { if (zero_range(from) || zero_range(to)) { return(ifelse(is.na(x), NA, mean(to))) } extent <- 2 * max(abs(from - mid)) (x - mid) / extent * diff(to) + mean(to) } #' @export rescale_mid.NULL <- function(...) NULL #' @rdname rescale_mid #' @export rescale_mid.logical <- rescale_mid.numeric #' @rdname rescale_mid #' @export rescale_mid.dist <- rescale_mid.numeric #' @rdname rescale_mid #' @export rescale_mid.POSIXt <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid, ...) { x <- as.numeric(as.POSIXct(x)) if (!is.numeric(from)) { from <- as.numeric(as.POSIXct(from)) } if (!is.numeric(mid)) { mid <- as.numeric(as.POSIXct(mid)) } rescale_mid.numeric(x = x, to = to, from = from, mid = mid) } #' @rdname rescale_mid #' @export rescale_mid.Date <- rescale_mid.POSIXt #' @rdname rescale_mid #' @export rescale_mid.integer64 <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE), mid = 0, ...) { if (zero_range(from, tol = 0) || zero_range(to)) { return(ifelse(is.na(x), NA, mean(to))) } extent <- 2 * max(abs(from - mid)) (x - mid) / extent * diff(to) + mean(to) } #' @rdname rescale_mid #' @export rescale_mid.AsIs <- function(x, to, from, ...) x #' Rescale numeric vector to have specified maximum #' #' @export #' @param x numeric vector of values to manipulate. #' @param to output range (numeric vector of length two) #' @param from input range (numeric vector of length two). If not given, is #' calculated from the range of `x` #' @examples #' rescale_max(1:100) #' rescale_max(runif(50)) #' rescale_max(1) rescale_max <- function(x, to = c(0, 1), from = range(x, na.rm = TRUE)) { x / from[2] * to[2] } #' Don't perform rescaling #' #' @param x numeric vector of values to manipulate. #' @param ... all other arguments ignored #' @export #' @examples #' rescale_none(1:100) rescale_none <- function(x, ...) { x } #' Out of bounds handling #' #' @description #' This set of functions modify data values outside a given range. #' The `oob_*()` functions are designed to be passed as the `oob` argument of #' ggplot2 continuous and binned scales, with `oob_discard` being an exception. #' #' These functions affect out of bounds values in the following ways: #' #' * `oob_censor()` replaces out of bounds values with `NA`s. This is the #' default `oob` argument for continuous scales. #' * `oob_censor_any()` acts like `oob_censor()`, but also replaces infinite #' values with `NA`s. #' * `oob_squish()` replaces out of bounds values with the nearest limit. This #' is the default `oob` argument for binned scales. #' * `oob_squish_any()` acts like `oob_squish()`, but also replaces infinite #' values with the nearest limit. #' * `oob_squish_infinite()` only replaces infinite values by the nearest limit. #' * `oob_keep()` does not adjust out of bounds values. In position scales, #' behaves as zooming limits without data removal. #' * `oob_discard()` removes out of bounds values from the input. Not suitable #' for ggplot2 scales. #' #' @param x A numeric vector of values to modify. #' @param range A numeric vector of length two giving the minimum and maximum #' limit of the desired output range respectively. #' @param only.finite A logical of length one. When `TRUE`, only finite values #' are altered. When `FALSE`, also infinite values are altered. #' #' @return Most `oob_()` functions return a vector of numerical values of the #' same length as the `x` argument, wherein out of bounds values have been #' modified. Only `oob_discard()` returns a vector of less than or of equal #' length to the `x` argument. #' #' @details The `oob_censor_any()` and `oob_squish_any()` functions are the same #' as `oob_censor()` and `oob_squish()` with the `only.finite` argument set to #' `FALSE`. #' #' Replacing position values with `NA`s, as `oob_censor()` does, will typically #' lead to removal of those datapoints in ggplot. #' #' Setting ggplot coordinate limits is equivalent to using `oob_keep()` in #' position scales. #' #' @section Old interface: `censor()`, `squish()`, `squish_infinite()` and #' `discard()` are no longer recommended; please use `oob_censor()`, #' `oob_squish()`, `oob_squish_infinite()` and `oob_discard()` instead. #' #' @name oob #' #' @examples #' # Censoring replaces out of bounds values with NAs #' oob_censor(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) #' oob_censor_any(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) #' #' # Squishing replaces out of bounds values with the nearest range limit #' oob_squish(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) #' oob_squish_any(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) #' oob_squish_infinite(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) #' #' # Keeping does not alter values #' oob_keep(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) #' #' # Discarding will remove out of bounds values #' oob_discard(c(-Inf, -1, 0.5, 1, 2, NA, Inf)) NULL #' @rdname oob #' @export oob_censor <- function(x, range = c(0, 1), only.finite = TRUE) { force(range) finite <- if (only.finite) is.finite(x) else TRUE x[finite & x < range[1]] <- NA_real_ x[finite & x > range[2]] <- NA_real_ x } #' @rdname oob #' @export oob_censor_any <- function(x, range = c(0, 1)) { oob_censor(x, range = range, only.finite = FALSE) } #' @rdname oob #' @export oob_discard <- function(x, range = c(0, 1)) { force(range) x[x >= range[1] & x <= range[2]] } #' @rdname oob #' @author `oob_squish()`: Homer Strong #' @export oob_squish <- function(x, range = c(0, 1), only.finite = TRUE) { force(range) finite <- if (only.finite) is.finite(x) else TRUE x[finite & x < range[1]] <- range[1] x[finite & x > range[2]] <- range[2] x } #' @rdname oob #' @export oob_squish_any <- function(x, range = c(0, 1)) { oob_squish(x, range, only.finite = FALSE) } #' @rdname oob #' @export oob_squish_infinite <- function(x, range = c(0, 1)) { force(range) x[x == -Inf] <- range[1] x[x == Inf] <- range[2] x } #' @rdname oob #' @export oob_keep <- function(x, range = c(0, 1)) { x } #' @rdname oob #' @export censor <- oob_censor #' @rdname oob #' @export discard <- oob_discard #' @rdname oob #' @export squish <- oob_squish #' @rdname oob #' @export squish_infinite <- oob_squish_infinite #' Expand a range with a multiplicative or additive constant #' #' @param range range of data, numeric vector of length 2 #' @param mul multiplicative constant #' @param add additive constant #' @param zero_width distance to use if range has zero width #' @export expand_range <- function(range, mul = 0, add = 0, zero_width = 1) { if (is.null(range)) { return() } width <- if (zero_range(range)) zero_width else diff(range) range + c(-1, 1) * (width * mul + add) } #' Determine if range of vector is close to zero, with a specified tolerance #' #' The machine epsilon is the difference between 1.0 and the next number #' that can be represented by the machine. By default, this function #' uses epsilon * 1000 as the tolerance. First it scales the values so that #' they have a mean of 1, and then it checks if the difference between #' them is larger than the tolerance. #' #' @examples #' eps <- .Machine$double.eps #' zero_range(c(1, 1 + eps)) #' zero_range(c(1, 1 + 99 * eps)) #' zero_range(c(1, 1 + 1001 * eps)) #' zero_range(c(1, 1 + 2 * eps), tol = eps) #' #' # Scaling up or down all the values has no effect since the values #' # are rescaled to 1 before checking against tol #' zero_range(100000 * c(1, 1 + eps)) #' zero_range(100000 * c(1, 1 + 1001 * eps)) #' zero_range(.00001 * c(1, 1 + eps)) #' zero_range(.00001 * c(1, 1 + 1001 * eps)) #' #' # NA values #' zero_range(c(1, NA)) # NA #' zero_range(c(1, NaN)) # NA #' #' # Infinite values #' zero_range(c(1, Inf)) # FALSE #' zero_range(c(-Inf, Inf)) # FALSE #' zero_range(c(Inf, Inf)) # TRUE #' #' @export #' @param x numeric range: vector of length 2 #' @param tol A value specifying the tolerance. #' @return logical `TRUE` if the relative difference of the endpoints of #' the range are not distinguishable from 0. zero_range <- function(x, tol = 1000 * .Machine$double.eps) { if (length(x) == 1) { return(TRUE) } if (length(x) != 2) cli::cli_abort("{.arg x} must be length 1 or 2") if (any(is.na(x))) { return(NA) } # Special case: if they are equal as determined by ==, then there # is zero range. Also handles (Inf, Inf) and (-Inf, -Inf) if (x[1] == x[2]) { return(TRUE) } # If we reach this, then x must be (-Inf, Inf) or (Inf, -Inf) if (all(is.infinite(x))) { return(FALSE) } # Take the smaller (in magnitude) value of x, and use it as the scaling # factor. m <- min(abs(x)) # If we get here, then exactly one of the x's is 0. Return FALSE if (m == 0) { return(FALSE) } # If x[1] - x[2] (scaled to 1) is smaller than tol, then return # TRUE; otherwise return FALSE abs((x[1] - x[2]) / m) < tol } scales/R/transform.R0000644000176200001440000001131114523157231014063 0ustar liggesusers#' Create a new transformation object #' #' A transformation encapsulates a transformation and its inverse, as well #' as the information needed to create pleasing breaks and labels. The `breaks()` #' function is applied on the un-transformed range of the data, and the #' `format()` function takes the output of the `breaks()` function and returns #' well-formatted labels. Transformations may also include the derivatives of the #' transformation and its inverse, but are not required to. #' #' @param name transformation name #' @param transform function, or name of function, that performs the #' transformation #' @param inverse function, or name of function, that performs the #' inverse of the transformation #' @param d_transform Optional function, or name of function, that gives the #' derivative of the transformation. May be `NULL`. #' @param d_inverse Optional function, or name of function, that gives the #' derivative of the inverse of the transformation. May be `NULL`. #' @param breaks default breaks function for this transformation. The breaks #' function is applied to the un-transformed data. #' @param minor_breaks default minor breaks function for this transformation. #' @param format default format for this transformation. The format is applied #' to breaks generated on the un-transformed data. #' @param domain the allowed range of the data to be transformed. The function #' in the `transform` argument is expected to be able to transform the `domain` #' argument. #' @seealso \Sexpr[results=rd,stage=build]{scales:::seealso_transform()} #' @export #' @keywords internal #' @aliases trans new_transform <- function(name, transform, inverse, d_transform = NULL, d_inverse = NULL, breaks = extended_breaks(), minor_breaks = regular_minor_breaks(), format = format_format(), domain = c(-Inf, Inf)) { if (is.character(transform)) transform <- match.fun(transform) if (is.character(inverse)) inverse <- match.fun(inverse) if (is.character(d_transform)) d_transform <- match.fun(d_transform) if (is.character(d_inverse)) d_inverse <- match.fun(d_inverse) structure( list( name = name, transform = transform, inverse = inverse, d_transform = d_transform, d_inverse = d_inverse, breaks = breaks, minor_breaks = minor_breaks, format = format, domain = domain ), class = "transform" ) } #' @rdname new_transform #' @export trans_new <- new_transform #' @rdname new_transform #' @export is.transform <- function(x) inherits(x, "transform") #' @export #' @rdname new_transform is.trans <- is.transform #' @export print.transform <- function(x, ...) { cat("Transformer: ", x$name, " [", x$domain[[1]], ", ", x$domain[[2]], "]\n", sep = "") invisible(x) } #' @export plot.transform <- function(x, y, ..., xlim, ylim = NULL) { if (is.null(ylim)) { ylim <- range(x$transform(seq(xlim[1], xlim[2], length = 100)), finite = TRUE) } plot( xlim, ylim, xlab = "", ylab = "", type = "n", main = paste0("Transformer: ", x$name), ) graphics::grid(lty = "solid") graphics::abline(h = 0, v = 0, col = "grey90", lwd = 5) graphics::lines(x, xlim = xlim) } #' @export lines.transform <- function(x, ..., xlim) { xgrid <- seq(xlim[1], xlim[2], length = 100) y <- suppressWarnings(x$transform(xgrid)) graphics::lines(xgrid, y, ...) } #' @rdname new_transform #' @export as.transform <- function(x, arg = deparse(substitute(x))) { if (is.transform(x)) { x } else if (is.character(x) && length(x) >= 1) { if (length(x) == 1) { f <- paste0("transform_", x) # For backward compatibility fun <- get0(f, mode = "function") if (is.null(fun)) { f2 <- paste0(x, "_trans") fun <- get0(f2, mode = "function") } if (is.null(fun)) { cli::cli_abort("Could not find any function named {.fun {f}} or {.fun {f2}}") } fun() } else { transform_compose(!!!x) } } else { cli::cli_abort(sprintf("{.arg %s} must be a character vector or a transformer object", arg)) } } #' @export #' @rdname new_transform as.trans <- as.transform #' Compute range of transformed values #' #' Silently drops any ranges outside of the domain of `transform`. #' #' @param transform a transformation object, or the name of a transformation object #' given as a string. #' @param x a numeric vector to compute the range of #' @export #' @keywords internal trim_to_domain <- function(transform, x) { transform <- as.transform(transform) range(transform$transform(range(squish(x, transform$domain), na.rm = TRUE))) } #' @export #' @rdname trim_to_domain trans_range <- trim_to_domain scales/R/pal-grey.R0000644000176200001440000000072114522421001013557 0ustar liggesusers#' Grey scale palette (discrete) #' #' @param start grey value at low end of palette #' @param end grey value at high end of palette #' @seealso [pal_seq_gradient()] for continuous version #' @export #' @examples #' show_col(pal_grey()(25)) #' show_col(pal_grey(0, 1)(25)) pal_grey <- function(start = 0.2, end = 0.8) { force_all(start, end) function(n) grDevices::grey.colors(n, start = start, end = end) } #' @export #' @rdname pal_grey grey_pal <- pal_grey scales/R/pal-identity.R0000644000176200001440000000033314522421001014441 0ustar liggesusers#' Identity palette #' #' Leaves values unchanged - useful when the data is already scaled. #' #' @export pal_identity <- function() { function(x) x } #' @export #' @rdname pal_identity identity_pal <- pal_identity scales/R/label-scientific.R0000644000176200001440000000337414520130030015240 0ustar liggesusers#' Label numbers with scientific notation (e.g. 1e05, 1.5e-02) #' #' @inherit label_number return params #' @param digits Number of digits to show before exponent. #' @param prefix,suffix Symbols to display before and after value. #' @param ... Other arguments passed on to [base::format()]. #' @family labels for continuous scales #' @family labels for log scales #' @export #' @examples #' demo_continuous(c(1, 10)) #' demo_continuous(c(1, 10), labels = label_scientific()) #' demo_continuous(c(1, 10), labels = label_scientific(digits = 3)) #' #' demo_log10(c(1, 1e9)) label_scientific <- function(digits = 3, scale = 1, prefix = "", suffix = "", decimal.mark = ".", trim = TRUE, ...) { force_all(digits, scale, prefix, suffix, decimal.mark, trim, ...) function(x) { scientific( x, digits = digits, scale = scale, prefix = prefix, suffix = suffix, decimal.mark = decimal.mark, ... ) } } #' Superseded interface to `label_scientific()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_scientific()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_scientific scientific_format <- label_scientific #' @export #' @rdname scientific_format scientific <- function(x, digits = 3, scale = 1, prefix = "", suffix = "", decimal.mark = ".", trim = TRUE, ...) { if (length(x) == 0) { return(character()) } x <- signif(x * scale, digits) ret <- paste0( prefix, format(x, decimal.mark = decimal.mark, trim = trim, scientific = TRUE, ...), suffix ) # restore NAs from input vector ret[is.na(x)] <- NA names(ret) <- names(x) ret } scales/R/pal-viridis.R0000644000176200001440000000201014531175574014300 0ustar liggesusers#' Viridis palette #' #' @inheritParams viridisLite::viridis #' @param begin,end The (corrected) hue in `[0,1]` at which the color map #' begins and ends. #' @param option A character string indicating the color map option to use. #' Eight options are available: #' * `"magma"` (or `"A"`) #' * `"inferno"` (or `"B"`) #' * `"plasma"` (or `"C"`) #' * `"viridis"` (or `"D"`) #' * `"cividis"` (or `"E"`) #' * `"rocket"` (or `"F"`) #' * `"mako"` (or `"G"`) #' * `"turbo"` (or `"H"`) #' @references #' @export #' @examples #' show_col(pal_viridis()(10)) #' show_col(pal_viridis(direction = -1)(6)) #' show_col(pal_viridis(begin = 0.2, end = 0.8)(4)) #' show_col(pal_viridis(option = "plasma")(6)) pal_viridis <- function(alpha = 1, begin = 0, end = 1, direction = 1, option = "D") { force_all(alpha, begin, end, direction, option) function(n) { viridisLite::viridis(n, alpha, begin, end, direction, option) } } #' @export #' @rdname pal_viridis viridis_pal <- pal_viridis scales/R/label-percent.R0000644000176200001440000000304114520145763014572 0ustar liggesusers#' Label percentages (2.5%, 50%, etc) #' #' @inherit label_number return params #' @inheritDotParams label_number #' @export #' @family labels for continuous scales #' @examples #' demo_continuous(c(0, 1)) #' demo_continuous(c(0, 1), labels = label_percent()) #' #' # Use prefix and suffix to create your own variants #' french_percent <- label_percent( #' decimal.mark = ",", #' suffix = " %" #' ) #' demo_continuous(c(0, .01), labels = french_percent) label_percent <- function(accuracy = NULL, scale = 100, prefix = "", suffix = "%", big.mark = " ", decimal.mark = ".", trim = TRUE, ...) { number_format( accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, ... ) } #' Superseded interface to `label_percent()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_percent()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_percent percent_format <- label_percent #' @export #' @rdname percent_format percent <- function(x, accuracy = NULL, scale = 100, prefix = "", suffix = "%", big.mark = " ", decimal.mark = ".", trim = TRUE, ...) { number( x = x, accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, ... ) } scales/R/label-log.R0000644000176200001440000000161414520130030013674 0ustar liggesusers#' Label numbers in log format (10^3, 10^6, etc) #' #' `label_log()` displays numbers as base^exponent, using superscript formatting. #' #' @param base Base of logarithm to use #' @param digits Number of significant digits to show for the exponent. Argument #' is passed on to [base::format()]. #' @inherit label_number return #' @seealso [breaks_log()] for the related breaks algorithm. #' @export #' @family labels for log scales #' @examples #' demo_log10(c(1, 1e5), labels = label_log()) #' demo_log10(c(1, 1e5), breaks = breaks_log(base = 2), labels = label_log(base = 2)) label_log <- function(base = 10, digits = 3) { function(x) { if (length(x) == 0) { return(expression()) } exponent <- format(log(x, base = base), digits = digits) text <- paste0(base, "^", exponent) ret <- parse_safe(text) # restore NAs from input vector ret[is.na(x)] <- NA ret } } scales/R/pal-hue.R0000644000176200001440000000320414522421001013371 0ustar liggesusers#' Hue palette (discrete) #' #' @param h range of hues to use, in \[0, 360] #' @param l luminance (lightness), in \[0, 100] #' @param c chroma (intensity of colour), maximum value varies depending on #' combination of hue and luminance. #' @param h.start hue to start at #' @param direction direction to travel around the colour wheel, #' 1 = clockwise, -1 = counter-clockwise #' @export #' @examples #' show_col(pal_hue()(4)) #' show_col(pal_hue()(9)) #' show_col(pal_hue(l = 90)(9)) #' show_col(pal_hue(l = 30)(9)) #' #' show_col(pal_hue()(9)) #' show_col(pal_hue(direction = -1)(9)) #' show_col(pal_hue(h.start = 30)(9)) #' show_col(pal_hue(h.start = 90)(9)) #' #' show_col(pal_hue()(9)) #' show_col(pal_hue(h = c(0, 90))(9)) #' show_col(pal_hue(h = c(90, 180))(9)) #' show_col(pal_hue(h = c(180, 270))(9)) #' show_col(pal_hue(h = c(270, 360))(9)) pal_hue <- function(h = c(0, 360) + 15, c = 100, l = 65, h.start = 0, direction = 1) { if (length(h) != 2) cli::cli_abort("{.arg h} must have length 2.") if (length(l) != 1) cli::cli_abort("{.arg l} must have length 1.") if (length(c) != 1) cli::cli_abort("{.arg c} must have length 1.") force_all(h, c, l, h.start, direction) function(n) { if (n == 0) { cli::cli_abort("Must request at least one colour from a hue palette.") } if ((diff(h) %% 360) < 1) { h[2] <- h[2] - 360 / n } hues <- seq(h[1], h[2], length.out = n) hues <- (hues + h.start) %% 360 hcl <- cbind(hues, c, l) pal <- farver::encode_colour(hcl, from = "hcl") if (direction == -1) { rev(pal) } else { pal } } } #' @export #' @rdname pal_hue hue_pal <- pal_hue scales/R/labels-retired.R0000644000176200001440000001020514520142032014735 0ustar liggesusers#' Older interface to `label_bytes()` #' #' @description #' `r lifecycle::badge('superseded')` #' #' These functions are kept for backward compatibility, but you should switch #' to [label_bytes()] for new code. #' #' @keywords internal #' @param symbol byte symbol to use. If "auto" the symbol used will be #' determined separately for each value of `x`. Valid symbols are "B", "kB", #' "MB", "GB", "TB", "PB", "EB", "ZB", and "YB" for SI units, and the "iB" #' variants for binary units. #' @param units which unit base to use, "binary" (1024 base) or "si" (1000 base) #' @export number_bytes_format <- function(symbol = "auto", units = "binary", ...) { force_all(symbol, units, ...) function(x) { number_bytes(x, symbol, units, ...) } } #' @export #' @rdname number_bytes_format number_bytes <- function(x, symbol = "auto", units = c("binary", "si"), accuracy = 1, ...) { units <- match.arg(units, c("binary", "si")) powers <- si_powers[si_powers >= 3] / 3 # powers of 1000 prefix <- names(powers) symbols <- c("B", switch(units, si = paste0(prefix, "B"), binary = paste0(toupper(prefix), "iB") )) symbol <- validate_byte_symbol(symbol, symbols) base <- switch(units, binary = 1024, si = 1000 ) if (symbol == "auto") { power <- findInterval(abs(x), base^powers) symbol <- symbols[1L + power] } else { power <- match(symbol, symbols) - 1L } number(x / base^power, accuracy = accuracy, suffix = paste0(" ", symbol), ...) } validate_byte_symbol <- function(symbol, symbols, default = "auto") { if (length(symbol) != 1) { cli::cli_abort("{.arg symbol} must have length 1, not length {length(symbol)}") } valid_symbols <- c(default, symbols) if (!(symbol %in% valid_symbols)) { cli::cli_warn(c( "{.arg symbol} must be one of {.or {.or {valid_symbols}}}", i = "The provided value ({.val {symbol}}) will be changed to the default ({.val {default}})" )) symbol <- default } symbol } #' Format labels after transformation #' #' `r lifecycle::badge('superseded')` #' #' @param trans transformation to apply #' @param format additional formatter to apply after transformation #' @return a function with single parameter x, a numeric vector, that #' returns a character vector of list of expressions #' @export #' @keywords internal #' @examples #' tf <- trans_format("log10", scientific_format()) #' tf(10^1:6) trans_format <- function(trans, format = scientific_format()) { if (is.character(trans)) trans <- match.fun(trans) force(format) function(x) { x <- trans(x) format(x) } } #' Unit labels #' #' @description #' `r lifecycle::badge('superseded')` #' #' This function is kept for backward compatiblity; you should either use #' [label_number()] or [label_number_si()] instead. #' #' @inheritParams number_format #' @keywords internal #' @param unit The units to append. #' @param sep The separator between the number and the unit label. #' @export #' @examples #' # Label with units #' demo_continuous(c(0, 1), labels = unit_format(unit = "m")) #' # Labels in kg, but original data in g #' km <- unit_format(unit = "km", scale = 1e-3, digits = 2) #' demo_continuous(c(0, 2500), labels = km) unit_format <- function(accuracy = NULL, scale = 1, prefix = "", unit = "m", sep = " ", suffix = paste0(sep, unit), big.mark = " ", decimal.mark = ".", trim = TRUE, ...) { number_format( accuracy = accuracy, scale = scale, prefix = prefix, suffix = suffix, big.mark = big.mark, decimal.mark = decimal.mark, trim = trim, ... ) } #' Label using `format()` #' #' @description #' `r lifecycle::badge('superseded')` #' #' This function is kept for backward compatiblity; you should either use #' [label_number()] or [label_date()] instead. #' #' @param ... Arguments passed on to [format()]. #' @export #' @keywords internal format_format <- function(...) { force_all(...) function(x) { if (!is.null(names(x))) { return(names(x)) } ret <- format(x, ..., trim = TRUE, justify = "left") # format.character() renders NA as "NA" ret[is.na(x)] <- NA ret } } scales/R/pal-manual.R0000644000176200001440000000066014522421001014070 0ustar liggesusers#' Manual palette (discrete) #' #' @param values vector of values to be used as a palette. #' @export pal_manual <- function(values) { force(values) function(n) { n_values <- length(values) if (n > n_values) { cli::cli_warn("This manual palette can handle a maximum of {n_values} values. You have supplied {n}") } unname(values[seq_len(n)]) } } #' @export #' @rdname pal_manual manual_pal <- pal_manual scales/R/label-bytes.R0000644000176200001440000000560514520146147014265 0ustar liggesusers#' Label bytes (1 kB, 2 MB, etc) #' #' Scale bytes into human friendly units. Can use either SI units (e.g. #' kB = 1000 bytes) or binary units (e.g. kiB = 1024 bytes). See #' [Units of Information](https://en.wikipedia.org/wiki/Units_of_information) #' on Wikipedia for more details. #' #' @param units Unit to use. Should either one of: #' * "kB", "MB", "GB", "TB", "PB", "EB", "ZB", and "YB" for #' SI units (base 1000). #' * "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", and "YiB" for #' binary units (base 1024). #' * `auto_si` or `auto_binary` to automatically pick the most appropriate #' unit for each value. #' @inheritParams number_format #' @inheritDotParams number #' @return A labeller function that takes a numeric vector of breaks and #' returns a character vector of labels. #' @export #' @family labels for continuous scales #' @family labels for log scales #' @examples #' demo_continuous(c(1, 1e6)) #' demo_continuous(c(1, 1e6), labels = label_bytes()) #' #' # Auto units are particularly nice on log scales #' demo_log10(c(1, 1e7), labels = label_bytes()) #' #' # You can also set the units #' demo_continuous(c(1, 1e6), labels = label_bytes("kB")) #' #' # You can also use binary units where a megabyte is defined as #' # (1024) ^ 2 bytes rather than (1000) ^ 2. You'll need to override #' # the default breaks to make this more informative. #' demo_continuous(c(1, 1024^2), #' breaks = breaks_width(250 * 1024), #' labels = label_bytes("auto_binary") #' ) label_bytes <- function(units = "auto_si", accuracy = 1, scale = 1, ...) { if (!(is.character(units) && length(units) == 1)) { cli::cli_abort("{.arg units} must be a scalar string") } force_all(accuracy, ...) function(x) { if (units %in% c("auto_si", "auto_binary")) { scale_cut <- cut_bytes(if (units == "auto_binary") "binary" else "si") suffix <- "" } else { powers <- si_powers[si_powers >= 3] / 3 # powers of 1000 si_units <- paste0(names(powers), "B") bin_units <- paste0(names(powers), "iB") if (units %in% si_units) { base <- 1000 power <- powers[[match(units, si_units)]] } else if (units %in% bin_units) { base <- 1024 power <- powers[[match(units, bin_units)]] } else { cli::cli_abort("{.val {units}} is not a valid unit") } suffix <- paste0(" ", units) scale <- scale / base^power scale_cut <- NULL } number( x, accuracy = accuracy, scale = scale, suffix = suffix, scale_cut = scale_cut, ... ) } } cut_bytes <- function(units = c("si", "binary")) { units <- arg_match(units) powers <- si_powers[si_powers >= 3] / 3 # powers of 1000 base <- if (units == "binary") 1024 else 1000 suffix <- if (units == "binary") "iB" else "B" out <- c(0, base^powers) names(out) <- c(paste0(" ", suffix), paste0(" ", names(powers), suffix)) out } scales/R/colour-ramp.R0000644000176200001440000000554714520137104014320 0ustar liggesusers#' Fast colour interpolation #' #' Returns a function that maps the interval \[0,1] to a set of colours. #' Interpolation is performed in the CIELAB colour space. Similar to #' \code{\link[grDevices]{colorRamp}(space = 'Lab')}, but hundreds of #' times faster, and provides results in `"#RRGGBB"` (or #' `"#RRGGBBAA"`) character form instead of RGB colour matrices. #' #' @param colors Colours to interpolate; must be a valid argument to #' [grDevices::col2rgb()]. This can be a character vector of #' `"#RRGGBB"` or `"#RRGGBBAA"`, colour names from #' [grDevices::colors()], or a positive integer that indexes into #' [grDevices::palette()]. #' @param na.color The colour to map to `NA` values (for example, #' `"#606060"` for dark grey, or `"#00000000"` for transparent) and #' values outside of \[0,1]. Can itself by `NA`, which will simply cause #' an `NA` to be inserted into the output. #' @param alpha Whether to include alpha transparency channels in interpolation. #' If `TRUE` then the alpha information is included in the interpolation. #' The returned colours will be provided in `"#RRGGBBAA"` format when needed, #' i.e., in cases where the colour is not fully opaque, so that the `"AA"` #' part is not equal to `"FF"`. Fully opaque colours will be returned in #' `"#RRGGBB"` format. If `FALSE`, the alpha information is discarded #' before interpolation and colours are always returned as `"#RRGGBB"`. #' #' @return A function that takes a numeric vector and returns a character vector #' of the same length with RGB or RGBA hex colours. #' #' @seealso \code{\link[grDevices]{colorRamp}} #' #' @export #' @examples #' ramp <- colour_ramp(c("red", "green", "blue")) #' show_col(ramp(seq(0, 1, length = 12))) colour_ramp <- function(colors, na.color = NA, alpha = TRUE) { if (length(colors) == 0) { cli::cli_abort("Must provide at least one colour to create a colour ramp") } if (length(colors) == 1) { return(structure( function(x) { ifelse(is.na(x), na.color, colors) }, safe_palette_func = TRUE )) } # farver is not currently case insensitive, but col2rgb() is colors <- tolower(colors) lab_in <- farver::decode_colour( colour = colors, alpha = TRUE, to = "lab", na_value = "transparent" ) x_in <- seq(0, 1, length.out = length(colors)) l_interp <- stats::approxfun(x_in, lab_in[, 1]) u_interp <- stats::approxfun(x_in, lab_in[, 2]) v_interp <- stats::approxfun(x_in, lab_in[, 3]) if (!alpha || all(lab_in[, 4] == 1)) { alpha_interp <- function(x) NULL } else { alpha_interp <- stats::approxfun(x_in, lab_in[, 4]) } structure( function(x) { lab_out <- cbind(l_interp(x), u_interp(x), v_interp(x)) out <- farver::encode_colour(lab_out, alpha = alpha_interp(x), from = "lab") out[is.na(out)] <- na.color out }, safe_palette_func = TRUE ) } scales/R/pal-area.R0000644000176200001440000000075714522421001013532 0ustar liggesusers#' Area palettes (continuous) #' #' @param range Numeric vector of length two, giving range of possible sizes. #' Should be greater than 0. #' @export pal_area <- function(range = c(1, 6)) { force(range) function(x) rescale(sqrt(x), range, c(0, 1)) } #' @export #' @rdname pal_area area_pal <- pal_area #' @param max A number representing the maximum size. #' @export #' @rdname pal_area abs_area <- function(max) { force(max) function(x) rescale(sqrt(abs(x)), c(0, max), c(0, 1)) } scales/R/label-number-auto.R0000644000176200001440000000405114520130030015347 0ustar liggesusers#' Label numbers, avoiding scientific notation where possible #' #' Switches between [number_format()] and [scientific_format()] based on a set of #' heuristics designed to automatically generate useful labels across a wide #' range of inputs #' #' @export #' @family labels for continuous scales #' @examples #' # Very small and very large numbers get scientific notation #' demo_continuous(c(0, 1e-6), labels = label_number_auto()) #' demo_continuous(c(0, 1e9), labels = label_number_auto()) #' #' # Other ranges get the numbers printed in full #' demo_continuous(c(0, 1e-3), labels = label_number_auto()) #' demo_continuous(c(0, 1), labels = label_number_auto()) #' demo_continuous(c(0, 1e3), labels = label_number_auto()) #' demo_continuous(c(0, 1e6), labels = label_number_auto()) #' #' # Transformation is applied individually so you get as little #' # scientific notation as possible #' demo_log10(c(1, 1e7), labels = label_number_auto()) label_number_auto <- function() { function(x) { if (length(x) == 0) { return(character(0)) } if (sum(is.finite(x)) == 0) { return(format(x, trim = TRUE)) } max_magnitude <- max(abs(x[x != 0 & is.finite(x)])) min_magnitude <- min(abs(x[x != 0 & is.finite(x)])) if (max_magnitude > 1e6) { format_shortest( x, number_format(1), format_format(scientific = TRUE) ) } else if (min_magnitude < 1e-3) { format_shortest( x, format_format(scientific = FALSE), format_format(scientific = TRUE) ) } else if (all(x > 0) && min_magnitude >= 1000 && max_magnitude <= 2200) { # Probably a year so don't use commas format(x, trim = TRUE) } else if (max_magnitude > 1e3) { number(x, 1) } else { format(x, trim = TRUE) } } } format_shortest <- function(breaks, ...) { options <- list(...) labels <- vapply(options, function(labeller) labeller(breaks), character(length(breaks))) apply(matrix(labels, nrow = length(breaks)), 1, shortest) } shortest <- function(x) { x[which.min(nchar(x))] } scales/R/label-wrap.R0000644000176200001440000000167114520130030014067 0ustar liggesusers#' Label strings by wrapping across multiple lines #' #' Uses [strwrap()] to split long labels across multiple lines. #' #' @inherit label_number return #' @param width Number of characters per line. #' @export #' @family labels for discrete scales #' @examples #' x <- c( #' "this is a long label", #' "this is another long label", #' "this a label this is even longer" #' ) #' demo_discrete(x) #' demo_discrete(x, labels = label_wrap(10)) #' demo_discrete(x, labels = label_wrap(20)) label_wrap <- function(width) { force(width) function(x) { unlist(lapply(strwrap(x, width = width, simplify = FALSE), paste0, collapse = "\n")) } } #' Superseded interface to `label_wrap()` #' #' @description #' `r lifecycle::badge("superseded")` #' #' These functions are kept for backward compatibility; you should switch #' to [label_wrap()] for new code. #' #' @keywords internal #' @export #' @inheritParams label_wrap wrap_format <- label_wrap scales/R/offset-by.R0000644000176200001440000000205114520130030013730 0ustar liggesusersoffset_by <- function(x, size) { UseMethod("offset_by") } #' @export offset_by.numeric <- function(x, size) { x + size } #' @export offset_by.Date <- function(x, size) { fun <- function(x) seq(x, length.out = 2, by = size)[2] out <- lapply(x, fun) do.call(c, out) } #' @export offset_by.POSIXt <- function(x, size) { # for subsecond interval support # seq() does not support partial secs in character strings if (is.character(size) && (parsed <- parse_unit_spec(size))$unit == "sec") { fun <- function(x) seq(x, length.out = 2, by = parsed$mult)[2] } else { fun <- function(x) seq(x, length.out = 2, by = size)[2] } out <- lapply(x, fun) out <- do.call(c, out) attr(out, "tzone") <- attr(x, "tzone") out } #' @export offset_by.difftime <- function(x, size) { if (is.numeric(size)) { size_seconds <- size } else { size_seconds <- unit_seconds(size) } input_units <- units(x) x <- as.numeric(x, units = "secs") x <- x + size_seconds x <- as.difftime(x, units = "secs") units(x) <- input_units x } scales/R/transform-numeric.R0000644000176200001440000003335014522421001015516 0ustar liggesusers#' Arc-sin square root transformation #' #' This is the variance stabilising transformation for the binomial #' distribution. #' #' @export #' @examples #' plot(transform_asn(), xlim = c(0, 1)) transform_asn <- function() { new_transform( "asn", function(x) 2 * asin(sqrt(x)), function(x) sin(x / 2)^2, d_transform = function(x) 1 / sqrt(x - x^2), d_inverse = function(x) sin(x) / 2, domain = c(0, 1) ) } #' @rdname transform_asn #' @export asn_trans <- transform_asn #' Arc-tangent transformation #' #' @export #' @examples #' plot(transform_atanh(), xlim = c(-1, 1)) transform_atanh <- function() { new_transform( "atanh", "atanh", "tanh", d_transform = function(x) 1 / (1 - x^2), d_inverse = function(x) 1 / cosh(x)^2, domain = c(-1, 1) ) } #' @export #' @rdname transform_atanh atanh_trans <- transform_atanh #' Inverse Hyperbolic Sine transformation #' #' @export #' @examples #' plot(transform_asinh(), xlim = c(-1e2, 1e2)) transform_asinh <- function() { new_transform( "asinh", transform = asinh, inverse = sinh, d_transform = function(x) 1 / sqrt(x^2 + 1), d_inverse = cosh ) } #' @export #' @rdname transform_asinh asinh_trans <- transform_asinh #' Box-Cox & modulus transformations #' #' The Box-Cox transformation is a flexible transformation, often used to #' transform data towards normality. The modulus transformation generalises #' Box-Cox to also work with negative values. #' #' The Box-Cox power transformation (type 1) requires strictly positive values and #' takes the following form for `y > 0`: #' \deqn{y^{(\lambda)} = \frac{y^\lambda - 1}{\lambda}}{y^(\lambda) = (y^\lambda - 1)/\lambda} #' When `y = 0`, the natural log transform is used. #' #' The modulus transformation implements a generalisation of the Box-Cox #' transformation that works for data with both positive and negative values. #' The equation takes the following forms, when `y != 0` : #' \deqn{y^{(\lambda)} = sign(y) * \frac{(|y| + 1)^\lambda - 1}{\lambda}}{ #' y^(\lambda) = sign(y)*((|y|+1)^\lambda - 1)/\lambda} #' and when `y = 0`: \deqn{y^{(\lambda)} = sign(y) * \ln(|y| + 1)}{ #' y^(\lambda) = sign(y) * ln(|y| + 1)} #' #' @param p Transformation exponent, \eqn{\lambda}. #' @param offset Constant offset. 0 for Box-Cox type 1, #' otherwise any non-negative constant (Box-Cox type 2). `transform_modulus()` #' sets the default to 1. #' @seealso [transform_yj()] #' @references Box, G. E., & Cox, D. R. (1964). An analysis of transformations. #' Journal of the Royal Statistical Society. Series B (Methodological), 211-252. #' \url{https://www.jstor.org/stable/2984418} #' #' John, J. A., & Draper, N. R. (1980). #' An alternative family of transformations. Applied Statistics, 190-197. #' \url{https://www.jstor.org/stable/2986305} #' @export #' @examples #' plot(transform_boxcox(-1), xlim = c(0, 10)) #' plot(transform_boxcox(0), xlim = c(0, 10)) #' plot(transform_boxcox(1), xlim = c(0, 10)) #' plot(transform_boxcox(2), xlim = c(0, 10)) #' #' plot(transform_modulus(-1), xlim = c(-10, 10)) #' plot(transform_modulus(0), xlim = c(-10, 10)) #' plot(transform_modulus(1), xlim = c(-10, 10)) #' plot(transform_modulus(2), xlim = c(-10, 10)) transform_boxcox <- function(p, offset = 0) { if (abs(p) < 1e-07) { trans <- function(x) log(x + offset) inv <- function(x) exp(x) - offset d_trans <- function(x) 1 / (x + offset) d_inv <- "exp" } else { trans <- function(x) ((x + offset)^p - 1) / p inv <- function(x) (x * p + 1)^(1 / p) - offset d_trans <- function(x) (x + offset)^(p - 1) d_inv <- function(x) (x * p + 1)^(1 / p - 1) } trans_with_check <- function(x) { if (any((x + offset) < 0, na.rm = TRUE)) { cli::cli_abort(c( "{.fun transform_boxcox} must be given only positive values", i = "Consider using {.fun transform_modulus} instead?" )) } trans(x) } new_transform( paste0("pow-", format(p)), trans_with_check, inv, d_transform = d_trans, d_inverse = d_inv, domain = c(0, Inf) ) } #' @export #' @rdname transform_boxcox boxcox_trans <- transform_boxcox #' @rdname transform_boxcox #' @export transform_modulus <- function(p, offset = 1) { if (abs(p) < 1e-07) { trans <- function(x) sign(x) * log(abs(x) + offset) inv <- function(x) sign(x) * (exp(abs(x)) - offset) d_trans <- function(x) 1 / (abs(x) + offset) d_inv <- function(x) exp(abs(x)) } else { trans <- function(x) sign(x) * ((abs(x) + offset)^p - 1) / p inv <- function(x) sign(x) * ((abs(x) * p + 1)^(1 / p) - offset) d_trans <- function(x) (abs(x) + offset)^(p - 1) d_inv <- function(x) (abs(x) * p + 1)^(1 / p - 1) } new_transform( paste0("mt-pow-", format(p)), trans, inv, d_transform = d_trans, d_inverse = d_inv ) } #' @rdname transform_boxcox #' @export modulus_trans <- transform_modulus #' Yeo-Johnson transformation #' #' The Yeo-Johnson transformation is a flexible transformation that is similar #' to Box-Cox, [transform_boxcox()], but does not require input values to be #' greater than zero. #' #' The transformation takes one of four forms depending on the values of `y` and \eqn{\lambda}. #' #' * \eqn{y \ge 0} and \eqn{\lambda \neq 0}{\lambda != 0} : #' \eqn{y^{(\lambda)} = \frac{(y + 1)^\lambda - 1}{\lambda}}{y^(\lambda) = ((y + 1)^\lambda - 1)/\lambda} #' * \eqn{y \ge 0} and \eqn{\lambda = 0}: #' \eqn{y^{(\lambda)} = \ln(y + 1)}{y^(\lambda) = ln(y + 1)} #' * \eqn{y < 0} and \eqn{\lambda \neq 2}{\lambda != 2}: #' \eqn{y^{(\lambda)} = -\frac{(-y + 1)^{(2 - \lambda)} - 1}{2 - \lambda}}{y^(\lambda) = -((-y + 1)^(2 - \lambda) - 1)/(2 - \lambda)} #' * \eqn{y < 0} and \eqn{\lambda = 2}: #' \eqn{y^{(\lambda)} = -\ln(-y + 1)}{y^(\lambda) = -ln(-y + 1)} #' #' @param p Transformation exponent, \eqn{\lambda}. #' @references Yeo, I., & Johnson, R. (2000). #' A New Family of Power Transformations to Improve Normality or Symmetry. Biometrika, 87(4), 954-959. #' \url{https://www.jstor.org/stable/2673623} #' @export #' @examples #' plot(transform_yj(-1), xlim = c(-10, 10)) #' plot(transform_yj(0), xlim = c(-10, 10)) #' plot(transform_yj(1), xlim = c(-10, 10)) #' plot(transform_yj(2), xlim = c(-10, 10)) transform_yj <- function(p) { eps <- 1e-7 if (abs(p) < eps) { trans_pos <- log1p inv_pos <- expm1 d_trans_pos <- function(x) 1 / (1 + x) d_inv_pos <- exp } else { trans_pos <- function(x) ((x + 1)^p - 1) / p inv_pos <- function(x) (p * x + 1)^(1 / p) - 1 d_trans_pos <- function(x) (x + 1)^(p - 1) d_inv_pos <- function(x) (p * x + 1)^(1 / p - 1) } if (abs(2 - p) < eps) { trans_neg <- function(x) -log1p(-x) inv_neg <- function(x) 1 - exp(-x) d_trans_neg <- function(x) 1 / (1 - x) d_inv_new <- function(x) exp(-x) } else { trans_neg <- function(x) -((-x + 1)^(2 - p) - 1) / (2 - p) inv_neg <- function(x) 1 - (-(2 - p) * x + 1)^(1 / (2 - p)) d_trans_neg <- function(x) (1 - x)^(1 - p) d_inv_neg <- function(x) (-(2 - p) * x + 1)^(1 / (2 - p) - 1) } new_transform( paste0("yeo-johnson-", format(p)), function(x) trans_two_sided(x, trans_pos, trans_neg), function(x) trans_two_sided(x, inv_pos, inv_neg), d_transform = function(x) trans_two_sided(x, d_trans_pos, d_trans_neg, f_at_0 = 1), d_inverse = function(x) trans_two_sided(x, d_inv_pos, d_inv_neg, f_at_0 = 1) ) } #' @export #' @rdname transform_yj yj_trans <- transform_yj trans_two_sided <- function(x, pos, neg, f_at_0 = 0) { out <- rep(NA_real_, length(x)) present <- !is.na(x) out[present & x > 0] <- pos(x[present & x > 0]) out[present & x < 0] <- neg(x[present & x < 0]) out[present & x == 0] <- f_at_0 out } #' Exponential transformation (inverse of log transformation) #' #' @param base Base of logarithm #' @export #' @examples #' plot(transform_exp(0.5), xlim = c(-2, 2)) #' plot(transform_exp(1), xlim = c(-2, 2)) #' plot(transform_exp(2), xlim = c(-2, 2)) #' plot(transform_exp(), xlim = c(-2, 2)) transform_exp <- function(base = exp(1)) { force(base) new_transform( paste0("power-", format(base)), function(x) base^x, function(x) log(x, base = base), d_transform = function(x) base^x * log(base), d_inverse = function(x) 1 / x / log(base) ) } #' @export #' @rdname transform_exp exp_trans <- transform_exp #' Identity transformation (do nothing) #' #' @export #' @examples #' plot(transform_identity(), xlim = c(-1, 1)) transform_identity <- function() { new_transform( "identity", "force", "force", d_transform = function(x) rep(1, length(x)), d_inverse = function(x) rep(1, length(x)) ) } #' @export #' @rdname transform_identity identity_trans <- transform_identity #' Log transformations #' #' * `transform_log()`: `log(x)` #' * `log1p()`: `log(x + 1)` #' * `transform_pseudo_log()`: smoothly transition to linear scale around 0. #' #' @param base base of logarithm #' @export #' @examples #' plot(transform_log2(), xlim = c(0, 5)) #' plot(transform_log(), xlim = c(0, 5)) #' plot(transform_log10(), xlim = c(0, 5)) #' #' plot(transform_log(), xlim = c(0, 2)) #' plot(transform_log1p(), xlim = c(-1, 1)) #' #' # The pseudo-log is defined for all real numbers #' plot(transform_pseudo_log(), xlim = c(-5, 5)) #' lines(transform_log(), xlim = c(0, 5), col = "red") #' #' # For large positives numbers it's very close to log #' plot(transform_pseudo_log(), xlim = c(1, 20)) #' lines(transform_log(), xlim = c(1, 20), col = "red") transform_log <- function(base = exp(1)) { force(base) new_transform( paste0("log-", format(base)), function(x) log(x, base), function(x) base^x, d_transform = function(x) 1 / x / log(base), d_inverse = function(x) base^x * log(base), breaks = log_breaks(base = base), domain = c(1e-100, Inf) ) } #' @export #' @rdname transform_log transform_log10 <- function() { transform_log(10) } #' @export #' @rdname transform_log transform_log2 <- function() { transform_log(2) } #' @rdname transform_log #' @export transform_log1p <- function() { new_transform( "log1p", "log1p", "expm1", d_transform = function(x) 1 / (1 + x), d_inverse = "exp", domain = c(-1 + .Machine$double.eps, Inf) ) } #' @export #' @rdname transform_log log_trans <- transform_log #' @export #' @rdname transform_log log10_trans <- transform_log10 #' @export #' @rdname transform_log log2_trans <- transform_log2 #' @export #' @rdname transform_log log1p_trans <- transform_log1p #' @rdname transform_log #' @param sigma Scaling factor for the linear part of pseudo-log transformation. #' @export transform_pseudo_log <- function(sigma = 1, base = exp(1)) { new_transform( "pseudo_log", function(x) asinh(x / (2 * sigma)) / log(base), function(x) 2 * sigma * sinh(x * log(base)), d_transform = function(x) 1 / (sqrt(4 + x^2/sigma^2) * sigma * log(base)), d_inverse = function(x) 2 * sigma * cosh(x * log(base)) * log(base) ) } #' @export #' @rdname transform_log pseudo_log_trans <- transform_pseudo_log #' Probability transformation #' #' @param distribution probability distribution. Should be standard R #' abbreviation so that "p" + distribution is a valid cumulative distribution #' function, "q" + distribution is a valid quantile function, and #' "d" + distribution is a valid probability density function. #' @param ... other arguments passed on to distribution and quantile functions #' @export #' @examples #' plot(transform_logit(), xlim = c(0, 1)) #' plot(transform_probit(), xlim = c(0, 1)) transform_probability <- function(distribution, ...) { qfun <- match.fun(paste0("q", distribution)) pfun <- match.fun(paste0("p", distribution)) dfun <- match.fun(paste0("d", distribution)) new_transform( paste0("prob-", distribution), function(x) qfun(x, ...), function(x) pfun(x, ...), d_transform = function(x) 1 / dfun(qfun(x, ...), ...), d_inverse = function(x) dfun(x, ...), domain = c(0, 1) ) } #' @export #' @rdname transform_probability transform_logit <- function() transform_probability("logis") #' @export #' @rdname transform_probability transform_probit <- function() transform_probability("norm") #' @export #' @rdname transform_probability probability_trans <- transform_probability #' @export #' @rdname transform_probability logit_trans <- transform_logit #' @export #' @rdname transform_probability probit_trans <- transform_probit #' Reciprocal transformation #' #' @export #' @examples #' plot(transform_reciprocal(), xlim = c(0, 1)) transform_reciprocal <- function() { new_transform( "reciprocal", function(x) 1 / x, function(x) 1 / x, d_transform = function(x) -1 / x^2, d_inverse = function(x) -1 / x^2 ) } #' @export #' @rdname transform_reciprocal reciprocal_trans <- transform_reciprocal #' Reverse transformation #' #' reversing transformation works by multiplying the input with -1. This means #' that reverse transformation cannot easily be composed with transformations #' that require positive input unless the reversing is done as a final step. #' #' @export #' @examples #' plot(transform_reverse(), xlim = c(-1, 1)) transform_reverse <- function() { new_transform( "reverse", function(x) -x, function(x) -x, d_transform = function(x) rep(-1, length(x)), d_inverse = function(x) rep(-1, length(x)), minor_breaks = regular_minor_breaks(reverse = TRUE) ) } #' @export #' @rdname transform_reverse reverse_trans <- transform_reverse #' Square-root transformation #' #' This is the variance stabilising transformation for the Poisson #' distribution. #' #' @export #' @examples #' plot(transform_sqrt(), xlim = c(0, 5)) transform_sqrt <- function() { new_transform( "sqrt", "sqrt", function(x) ifelse(x < 0, NA_real_, x ^ 2), d_transform = function(x) 0.5 / sqrt(x), d_inverse = function(x) 2 * x, domain = c(0, Inf) ) } #' @export #' @rdname transform_sqrt sqrt_trans <- transform_sqrt scales/NEWS.md0000644000176200001440000005010714531115065012626 0ustar liggesusers# scales 1.3.0 ## Better type support * `rescale(I(x), ...)` and `rescale_mid(I(x), ...)` return `I(x)` unaltered (@teunbrand, #403). * Add a rescale method for `difftime` objects (#382) * Add better support for `difftime` objects. `label_timespan()` adds functionality for adding correct unit suffix to timespan data, `breaks_timespan()` adds functionality for finding pleasant breakpoints across the various bases in time units, while `transform_timespan()` wraps it all together and provides an alternative to `transform_hms()` (#212) ## Ranges * `train_continuous()` coerces `new` to numeric before calculating range (@teunbrand, #369). * Training on factor data no longer sorts the range after multiple training passes if the new `fct` argument of `train_discrete()` is used (#383) * The `DiscreteRange` class now keeps track on whether it has been trained on factor data. * Attempt to make the sort behavior of the range consistent for character vectors during training. Mixing of character and factor data will make the factor level order take precedence no matter if the training starts with a charactor vector ## Transformations * Transformation function have been renamed to `transform_*`-prefixed names instead of `*_trans`-suffixed names. This allows for a better tab-completion search of transformations. The S3 class of transformations has been renamed from `"trans"` to `"transform"`. `new_transform()` replaces `trans_new()` and `trim_to_domain()` replaces `trans_range()`. All old functions are kept for posterity. * `transform_sqrt()` no longer returns an inverse for values outside of its domain (#214) * Add an inverse (area) hyperbolic sine transformation `transform_asinh()`, which provides a logarithm-like transformation of a space, but which accommodates negative values (#297) * Correct the domain calculation for `transform_compose()` (@mjskay, #408). * Transformation objects can optionally include the derivatives of the transform and the inverse transform (@mjskay, #322). ## Misc * The `scale_cut` argument in `number()` now works as advertised for values below the lowest cut value (#346) * `scale_cut` will now choose a more appropriate cut in the case of the first cut creating an irrational-ish number. * Added a new option to the `style_positive` argument in `label_*()` functions. Setting this to `"space"` will add a figure space in front of the number to make it easier to align positive and negative values as figure space takes up the same amount of space as `-` (#366) * `label_dollar()` has been superseeded by `label_currency()` for clarity (#344) * Palette functions now have the `pal_`-prefix. The old `_pal`-suffixed versions are kept for backward compatibility. # scales 1.2.1 * Re-document to fix HTML issues in `.Rd`. # scales 1.2.0 ## New features * `label_number()`: * New `style_positive` and `style_negative` argument control how positive and negative numbers are styled (#249, #262). * The `prefix` comes after the negative sign, rather than before it, yielding (e.g) the correct `-$1` instead of `$-1`. * New `scale_cut` argument enables independent scaling of different parts of the range. This is useful in `label_dollar()` to support scaling of large numbers by suffix (e.g. "M" for million, "B" for billion). It can be used with `cut_short_scale()` when billion = thousand million and `cut_long_scale()` when billion = million million (initial implementation provided by @davidchall). Additionally, the accuracy is now computed per scale category, so rescaled values can have different numbers of decimal places (#339). * `label_number_si()` is deprecated because it previously used [short scale abbreviations](https://en.wikipedia.org/wiki/Long_and_short_scales) instead of the correct [SI prefixes](https://en.wikipedia.org/wiki/Metric_prefix). You can mimic the previous results with `label_number(scale_cut = cut_scale_short())` or get real SI labels with `label_number(scale_cut = cut_SI("m"))` (#339, with help from @davidchall). * `label_bytes()` now correctly accounts for the `scale` argument when choosing auto units (@davidchall, #235). * `label_date()` and `label_time()` gain a `locale` argument that allows you to set the locale used to generate day and month names (#309). * New `label_log()` displays the base and a superscript exponent, for use with logarithmic axes (@davidchall, #312). * New `compose_trans()` allows arbitrary composition of transformers. This is mostly easily achieved by passing a character vector whenever you might previously have passed the name of a single transformer. For example, `scale_y_continuous(trans = c("log10", "reverse"))` will create a reverse log-10 scale (#287). ## Bug fixes and minor improvements * `breaks_width()` now supports units like `"3 months"` in the `offset` argument. * `col_quantile()` no longer errors if data is sufficiently skewed that we can't generate the requested number of unique colours (#294). * `dollar(negative_parens)` is deprecated in favour of `style_negative = "parens"`. * `hue_pal()` respects `h.start` once again (#288). * `label_number_auto()` correctly formats single numbers that are greater than 1e+06 without an error (@karawoo, #321) * `manual_pal()` now always returns an unnamed colour vector, which is easy to use with `ggplot2::discrete_scale()` (@yutannihilation, #284). * `time_trans()` and `date_trans()` have `domains` of the correct type so that they can be transformed without error (#298). * Internal `precision()`, used when `accuracy = NULL`, now avoids displaying unnecessary digits (@davidchall, #304). # scales 1.1.1 * `breaks_width()` now handles `difftime`/`hms` objects (@bhogan-mitre, #244). * `hue_pal()` now correctly inverts color palettes when `direction = -1` (@dpseidel, #252). * Internal `precision()`, used when `accuracy = NULL`, now does a better job when duplicate values are present (@teunbrand, #251). It also does a better job when there's a mix of finite and non-finite values (#257). * New `oob_keep()` to keep data outside range, allowing for zoom-limits when `oob_keep` is used as `oob` argument in scales. Existing out of bounds functions have been renamed with the `oob_`-prefix to indicate their role (@teunbrand, #255). * `ordinal_french()` gains `plural` and `gender` arguments (@stephLH, #256). # scales 1.1.0 * Axis breaks and labels have a new naming scheme: functions that generate breaks from limits are called `breaks_`; functions that generate labels from breaks are called `labels_` (#226). * All breaks and labels examples have been overhauled to use new `demo_continuous()`, `demo_discrete()`, and `demo_log10()`, so you can see how to use scales functions with ggplot2. ## Labels * All label functions preserve names (#202) and keep `NA`s as `NA`s instead of trying to convert to `"NA"` (@clauswilke, #187). * New `label_bytes()` replaces `number_bytes_format()` with a more convenient interface. It takes a single `unit` argument which can either be an SI unit (e.g. "kB"), a binary unit (e.g. "kIB"), or an automatic unit (either "auto_si" or "auto_binary"). It always uses "B" as the symbol for bytes (#174), and checks that `units` are valid. Additionally, auto units are now used to determine the symbol separately for each value (@mikmart): ```R label_bytes("auto_binary")(1024^(1:3)) #> [1] "1 kiB" "1 MiB" "1 GiB" ``` * New `label_date_short()` creates labels for a date axis that only show the components of the date that have changed since the previous label. For example, if you have Jan 10, Jan 20, Jan 30, and Feb 1, `label_date_short()` will use labels Jan 10, 20, 30, Feb 1 (#209). * `label_dollar()` now correctly formats negative numbers as (e.g.) -$200 (#216). * `label_math()` now returns an expression vector, and doesn't coerce inputs to names. * `label_number()` takes `scale` into account when computing `accuracy`, if not supplied. This means that `label_percent()` should have better default accuracy in many cases (#192). * `label_number()` now picks the accuracy automatically by default. The underlying heuristic has been improved to use the distance between adjacent breaks (rather than the total range of the break). * New `label_number_auto()` automatically picks between `number_format()` and `scientific_format()` based on the range of the input. It should produce nice output over a very wide range of inputs (@paleolimbot, #208). * New `label_number_si()` formats numeric vectors with limited SI units. Individual values are scaled and labelled with abbreviations "K", "M", "B", or "T" dependent on magnitude (@dpseidel, #83). * `label_parse()` now generates an expression object that can be used to display formatted labels in ggplot2 (@agila5, #203). * `label_pvalue()` now reports values close to 1 (as determined by `accuracy`) as (e.g.) ">0.99". You can control the prefixes used with the new `prefix` argument (#213). ## Breaks * The built in breaks functions now returns a function that takes both a range and a desired number of breaks, making it possible to overwrite the defaults number of desired breaks given in the constructor call (@thomasp85). * `breaks_log()` has nicer behaviour when there are no finite inputs (#210). It also provides usable breaks even with very small ranges (@billdenney, #168) * New `breaks_width()` which allows you to specify a fixed distance between breaks (along with optional offset). ## Transformations * New `yj_trans()` implements the Yeo-Johnson transformation (@zamorarr, #196) * `trans` objects gets methods for `plot()` and `lines()`, and all numeric transformations get an example showing the transformation. * `boxcox_trans()` no longer throws an error when given NA values (@sflippl, #181). ## Other bug fixes and minor improvements * scales now uses the farver package for colour manipulation instead of a combination of grDevices and hand-rolled C++ code (#223). * `alpha()` now preserves element names (@wibeasley, #195) * `ContinuousRange` and `DiscreteRange` methods now properly inherit and are fully mutable (@dpseidel). * `col_numeric()`, `col_bin()`, `col_quantile()`, and `col_factor()` now support viridis colors. Just pass a palette name (`"magma"`, `"inferno"`, `"plasma"`, or `"viridis"`) as the `palette` argument (@jcheng5, #191). * `col_numeric()`, `col_bin()`, `col_quantile()`, and `col_factor()` now have a `reverse` parameter, to apply color palettes in the opposite of their usual order (i.e. high-to-low instead of low-to-high) (@jcheng5, #191). * `col_bin()` and `col_quantile()` now take a `right` argument, which is passed to `base::cut()`; it indicates whether the bin/quantile intervals should be closed on the right (and open on the left), or vice versa (@jcheng5, #191). * `col_factor()` now tries to avoid interpolating qualitative RColorBrewer palettes. Instead, it attempts to assign a palette color to each factor level. Interpolation will still be used if there are more factor levels than available colors, and a warning will be emitted in that case (@jcheng5, #191). * `dichromat_pal()` documentation now builds without requiring suggested `dichromat` package to be installed (@dpseidel, #172). * `date_breaks()` now supports subsecond intervals (@dpseidel, #85). # scales 1.0.0 ## New Features ### Formatters * `comma_format()`, `percent_format()` and `unit_format()` gain new arguments: `accuracy`, `scale`, `prefix`, `suffix`, `decimal.mark`, `big.mark` (@larmarange, #146). * `dollar_format()` gains new arguments: `accuracy`, `scale`, `decimal.mark`, `trim` (@larmarange, #148). * New `number_bytes_format()` and `number_bytes()` format numeric vectors into byte measurements (@hrbrmstr, @dpseidel). * New `number_format()` provides a generic formatter for numbers (@larmarange, #142). * New `pvalue_format()` formats p-values (@larmarange, #145). * `ordinal_format()` gains new arguments: `prefix`, `suffix`, `big.mark`, `rules`; rules for French and Spanish are also provided (@larmarange, #149). * `scientific_format()` gains new arguments: `scale`, `prefix`, `suffix`, `decimal.mark`, `trim` (@larmarange, #147). * New `time_format()` formats `POSIXt` and `hms` objects (@dpseidel, #88). ### Transformations & breaks * `boxcox_trans()` is now invertible for `x >= 0` and requires positive values. A new argument `offset` allows specification of both type-1 and type-2 Box-Cox transformations (@dpseidel, #103). * `log_breaks()` returns integer multiples of integer powers of base when finer breaks are needed (@ThierryO, #117). * New function `modulus_trans()` implements the modulus transformation for positive and negative values (@dpseidel). * New `pseudo_log_trans()` for transforming numerics into a signed logarithmic scale with a smooth transition to a linear scale around 0 (@lepennec, #106). ## Minor bug fixes and improvements * scales functions now work as expected when it is used inside a for loop. In previous package versions if a scales function was used with variable custom parameters inside a for loop, some of the parameters were not evaluated until the end of the loop, due to how R lazy evaluation works (@zeehio, #81). * `colour_ramp()` now uses `alpha = TRUE` by default (@clauswilke, #108). * `date_breaks()` now supports subsecond intervals (@dpseidel, #85). * Removes `dichromat` and `plyr` dependencies. `dichromat` is now suggested (@dpseidel, #118). * `expand_range()` arguments `mul` and `add` now affect scales with a range of 0 (@dpseidel, [ggplot2-2281](https://github.com/tidyverse/ggplot2/issues/2281)). * `extended_breaks()` now allows user specification of the `labeling::extended()` argument `only.loose` to permit more flexible breaks specification (@dpseidel, #99). * New `rescale()` and `rescale_mid()` methods support `dist` objects (@zeehio, #105). * `rescale_mid()` now properly handles NAs (@foo-bar-baz-qux, #104). # scales 0.5.0 * New function `regular_minor_breaks()` calculates minor breaks as a property of the transformation (@karawoo). * Adds `viridis_pal()` for creating palettes with color maps from the viridisLite package (@karawoo). * Switched from reference classes to R6 (#96). * `rescale()` and `rescale_mid()` are now S3 generics, and work with `numeric`, `Date`, `POSIXct`, `POSIXlt` and `bit64::integer64` objects (@zeehio, #74). # scales 0.4.1 * `extended_breaks()` no longer fails on pathological inputs. * New `hms_trans()` for transforming hms time vectors. * `train_discrete()` gets a new `na.rm` argument which controls whether `NA`s are preserved or dropped. # scales 0.4.0 * Switched from `NEWS` to `NEWS.md`. * `manual_pal()` produces a warning if n is greater than the number of values in the palette (@jrnold, #68). * `precision(0)` now returns 1, which means `percent(0)` now returns 0% (#50). * `scale_continuous()` uses a more correct check for numeric values. * NaN is correctly recognised as a missing value by the gradient palettes ([ggplot2-1482](https://github.com/tidyverse/ggplot2/issues/1482)). # scales 0.3.0 * `rescale()` preserves missing values in input when the range of `x` is (effectively) 0 ([ggplot2-985](https://github.com/tidyverse/ggplot2/issues/985)). * Continuous colour palettes now use `colour_ramp()` instead of `colorRamp()`. This only supports interpolation in Lab colour space, but is hundreds of times faster. # scales 0.2.5 ## Improved formatting functions * `date_format()` gains an option to specify time zone (#51). * `dollar_format()` is now more flexible and can add either prefixes or suffixes for different currencies (#53). It gains a `negative_parens` argument to show negative values as `($100)` and now passes missing values through unchanged (@dougmitarotonda, #40). * New `ordinal_format()` generates ordinal numbers (1st, 2nd, etc) (@aaronwolen, #55). * New `unit_format()` makes it easier to add units to labels, optionally scaling (@ThierryO, #46). * New `wrap_format()` function to wrap character vectors to a desired width. (@jimhester, #37). ## New colour scaling functions * New color scaling functions `col_numeric()`, `col_bin()`, `col_quantile()`, and `col_factor()`. These functions provide concise ways to map continuous or categorical values to color spectra. * New `colour_ramp()` function for performing color interpolation in the CIELAB color space (like `grDevices::colorRamp(space = 'Lab')`, but much faster). ## Other bug fixes and minor improvements * `boxcox_trans()` returns correct value when p is close to zero (#31). * `dollar()` and `percent()` both correctly return a zero length string for zero length input (@BrianDiggs, #35). * `brewer_pal()` gains a `direction` argument to easily invert the order of colours (@jiho, #36). * `show_col()` has additional options to showcase colors better (@jiho, #52). * Relaxed tolerance in `zero_range()` to `.Machine$double.eps * 1000` (#33). # scales 0.2.4 * Eliminate stringr dependency. * Fix outstanding errors in R CMD check. # scales 0.2.3 * `floor_time()` calls `to_time()`, but that function was moved into a function so it was no longer available in the scales namespace. Now `floor_time()` has its own copy of that function (Thanks to Stefan Novak). * Color palettes generated by `brewer_pal()` no longer give warnings when fewer than 3 colors are requested (@wch). * `abs_area()` and `rescale_max()` functions have been added, for scaling the area of points to be proportional to their value. These are used by `scale_size_area()` in ggplot2. # scales 0.2.2 * `zero_range()` has improved behaviour thanks to Brian Diggs. * `brewer_pal()` complains if you give it an incorrect palette type. (Fixes #15, thanks to Jean-Olivier Irisson). * `shape_pal()` warns if asked for more than 6 values. (Fixes #16, thanks to Jean-Olivier Irisson). * `time_trans()` gains an optional argument `tz` to specify the time zone to use for the times. If not specified, it will be guess from the first input with a non-null time zone. * `date_trans()` and `time_trans()` now check that their inputs are of the correct type. This prevents ggplot2 scales from silently giving incorrect outputs when given incorrect inputs. * Change the default breaks algorithm for `cbreaks()` and `trans_new()`. Previously it was `pretty_breaks()`, and now it's `extended_breaks()`, which uses the `extended()` algorithm from the labeling package. * fixed namespace problem with `fullseq()`. # scales 0.2.1 * `suppressWarnings` from `train_continuous()` so zero-row or all infinite data frames don't potentially cause problems. * check for zero-length colour in `gradient_n_pal()`. * added `extended_breaks()` which implements an extension to Wilkinson's labelling approach, as implemented in the `labeling` package. This should generally produce nicer breaks than `pretty_breaks()`. * `alpha()` can now preserve existing alpha values if `alpha()` is missing. * `log_breaks()` always gives breaks evenly spaced on the log scale, never evenly spaced on the data scale. This will result in really bad breaks for some ranges (e.g 0.5-0.6), but you probably shouldn't be using log scales in that situation anyway. # scales 0.2.0 * `censor()` and `squish()` gain `only.finite` argument and default to operating only on finite values. This is needed for ggplot2, and reflects the use of Inf and -Inf as special values. * `bounds` functions now `force` evaluation of range to avoid bug with S3 method dispatch inside primitive functions (e.g. `[`). * Simplified algorithm for `discrete_range()` that is robust to `stringsAsFactors` global option. Now, the order of a factor will only be preserved if the full factor is the first object seen, and all subsequent inputs are subsets of the levels of the original factor. * `scientific()` ensures output is always in scientific format and off the specified number of significant digits. `comma()` ensures output is never in scientific format (Fixes #7). * Another tweak to `zero_range()` to better detect when a range has zero length (Fixes #6). scales/MD50000644000176200001440000002637514531327156012060 0ustar liggesusersed3276bb84409d21a5f3225d435daecb *DESCRIPTION c61dc42adf8dffa35696c09d084896a1 *LICENSE c152aa38acbf14d37a2aadfe4383b287 *NAMESPACE 6f9ca6e271b5b425b4eb309b6226ab74 *NEWS.md 3a60a8145dc7ca1021d84d972336b2d4 *R/bounds.R b1445d3043396543a72d4fe2d076e92b *R/breaks-log.R 9b9ad469654d128f9c2dbd6dfcb98d54 *R/breaks-retired.R 01de763ec316fd73a81223a11c2192e2 *R/breaks.R 0d676a76a2d8c6107a7510c8f2a2d686 *R/colour-manip.R 601313486b6c99ba6fde3ad8da72becf *R/colour-mapping.R d5ec63f90107e7cbccd2c4f5481db575 *R/colour-ramp.R 12e3cbdd615448f0fff6d4f67d5f5319 *R/date-time.R 1766434b368c5b53280110fb4e93da1f *R/documentation.R 179dc1a114e37abd0cb6421028cc7e21 *R/full-seq.R 417e9befc7c728ce95d80818ff65823f *R/label-bytes.R d4cd130465071bd6abf0f426bcd64609 *R/label-currency.R 9c69fdcd2e578be1a0f58a5afa4d26a9 *R/label-date.R a457012db694d859ebf670a7bbc572c4 *R/label-expression.R 072a45868011daf67b2bc6a04545fabe *R/label-log.R 0c10033f3f3c85385342ab2ac8189662 *R/label-number-auto.R 7a23d77a7776cba79123e543fa4ceb8b *R/label-number-si.R 1c8da8d4bd1f267533ee2aa865ac93c8 *R/label-number.R 43569a129f8f2d6696cca4aa069ab02b *R/label-ordinal.R 3f6ded40c4caca9a4a701356173a3fa2 *R/label-percent.R a4638898a3566adb999bdf402f8cff8f *R/label-pvalue.R 2535d400c96084be3ed9c803f7d6c4cf *R/label-scientific.R 71e1b38bd338042c946d7899f288c1a6 *R/label-wrap.R a3aff46c44f2ff172f56ae996544e052 *R/labels-retired.R b8852b7e92b0f2ace954538e0f2dd09b *R/minor_breaks.R 37f738b5dc4c092541ccbec3f4454812 *R/offset-by.R e9cf03247ea74c8ee850e1751afa2771 *R/pal-area.R bd8cafe49f3f24badc53bd6898d7615f *R/pal-brewer.R 9bf609ede8eb7c5d8b982639d9a43f7d *R/pal-dichromat.R 4d8c46ef891c18d9a7a102c7284f3abe *R/pal-gradient.R 7799bfdb8de9ebdfd7c0f89dba970fd9 *R/pal-grey.R 17ca069ad59093f2a7d41fea039d8756 *R/pal-hue.R 131c533bf8754a8c722b34520c6e3faa *R/pal-identity.R c25e4de4ec73d3b8f23edd4d6d5dd29c *R/pal-linetype.R 3c10749b9bb1dd1118b4a8afb65fc85d *R/pal-manual.R 67e62f2171e7a676f7844c2d4e3dbbd6 *R/pal-rescale.R c25f70c9a0043bbdc7ef144554525a7d *R/pal-shape.r b38081ad17e6f94416012d815b061fbc *R/pal-viridis.R 7997f8e2226e01f53767afc10b99a5b4 *R/range.R 5d3dad6c4f5c87a4e745ff798e100a26 *R/round-any.R b01a2831c93f6f136a2feebb753613e6 *R/scale-continuous.R 0343526f1af326585b60c14ea9ca5201 *R/scale-discrete.R 64a7c51ef8780793a101a0049aec558f *R/scales-package.R f9118b8e36fe459ae2e92701b0600af5 *R/transform-compose.R 468db33dca15fa9d11014206aa0c3965 *R/transform-date.R 280d1096240b85dcfbf31616cca7d515 *R/transform-numeric.R 0f495067c9f40630799911f76fdefb66 *R/transform.R dae907cf2d74da801729320228a5d2be *R/utils.R 2a098c2f7a9dd8495f3eab775c1f7735 *README.md 53f3de7d486ed882a113c69c1bbd012d *build/partial.rdb 8df734d2f10b99e178943aaeb6ae818b *man/Range.Rd 1f511efd1e9d729a672da668fb25d804 *man/alpha.Rd 370ac0ae719683b6b6b5e3d194cb262f *man/breaks_extended.Rd 2676a10654a5b2fc82cebd20d8fd2297 *man/breaks_log.Rd c70a1a4784c1304ff705a8a3a856f507 *man/breaks_pretty.Rd f5cfb1ae5538df5c43218a5913125a91 *man/breaks_timespan.Rd c6af808c16d8b6ac08ecdaaabf7af2e1 *man/breaks_width.Rd 450975074ff4d8e11d42a645e3340f9e *man/cbreaks.Rd 9d8e96da549b923d6aa1fb631f49f930 *man/col2hcl.Rd bbeee98ad38c4cbd048f49fe0ba0f0f1 *man/col_numeric.Rd 1d322bd9d68d9149f99ac63ee127067e *man/colour_ramp.Rd 9739d0d2c4461fd32dfafb753bea1ce5 *man/comma.Rd 52de21dd7e11fce200446530cb8ad926 *man/cscale.Rd f572db11afa4399b9e178122f4f38660 *man/date_breaks.Rd e9cea05087f88c1ec84ad3da4c2553c7 *man/date_format.Rd cf8a90e0bb0279556017a2678ce1fba4 *man/demo_continuous.Rd aecfc5c6899aee369dd22b3705678320 *man/dollar_format.Rd 54301fe14acecea257b700c4c1c61a08 *man/dscale.Rd a4fc7c27dde4719bfa681d779bd2e0a5 *man/expand_range.Rd a5f357df8a0e79adb76182446b5d9917 *man/figures/README-labels-1.png 73e83a7499ef80323378a96413686c79 *man/figures/README-labels-2.png 711b0e907d5c8589847635da67baed0b *man/figures/README-palettes-1.png ac2e0b97252e7a9eeaa8b08eaca9d793 *man/figures/README-transforms-1.png a1cbaf3f328e8d74e747faacf640c7fc *man/figures/lifecycle-archived.svg 6f521fb1819410630e279d1abf88685a *man/figures/lifecycle-defunct.svg 391f696f961e28914508628a7af31b74 *man/figures/lifecycle-deprecated.svg 691b1eb2aec9e1bec96b79d11ba5e631 *man/figures/lifecycle-experimental.svg 405e252e54a79b33522e9699e4e9051c *man/figures/lifecycle-maturing.svg f41ed996be135fb35afe00641621da61 *man/figures/lifecycle-questioning.svg 306bef67d1c636f209024cf2403846fd *man/figures/lifecycle-soft-deprecated.svg ed42e3fbd7cc30bc6ca8fa9b658e24a8 *man/figures/lifecycle-stable.svg bf2f1ad432ecccee3400afe533404113 *man/figures/lifecycle-superseded.svg 0496cb9052aa257e358375ed69163b64 *man/figures/logo.png 90dde0bc6fdfadcb4d25ff3b9b96c020 *man/figures/logo.svg cae727a9c3f1be007d2efc7576006380 *man/format_format.Rd 517737ee0f3e8917ebb550f4b9e8948c *man/fullseq.Rd 62eca350703aabb00a673546e225e50f *man/label_bytes.Rd 911851d7b4ddfed73d53dbac8e50188b *man/label_currency.Rd 3ad4462edc72e88cde0d8ee0efdf15ea *man/label_date.Rd fe14fb991936b9f955cd5db5cbce905a *man/label_log.Rd caf3b6aa9585c1914a3046dcf413a2ab *man/label_number.Rd 05a40b9ed14feff61b85283e37f67b04 *man/label_number_auto.Rd f554dd283dc5d5df03244b10511169a3 *man/label_number_si.Rd b43ff6c11136808686137f0ab52a7a9a *man/label_ordinal.Rd 04befc8809806d3baed8b005f90e73c9 *man/label_parse.Rd 5e12463331ad3b748c3f8d7461711987 *man/label_percent.Rd 65fedb217c373af7056d9bf97ce1023f *man/label_pvalue.Rd d0f9724e689e09ca1887b18a6e42bfb3 *man/label_scientific.Rd e6dd8270bad76511ae292cfcb4360bfc *man/label_wrap.Rd d0ef33ad152a289c21404c4907af50af *man/minor_breaks_width.Rd 2eccdca7a8f743f89992483abcf428b6 *man/muted.Rd c30b8a331403fe978fb46b71714065dd *man/new_transform.Rd b854b793bec45f632c5ba62ae91d94db *man/number.Rd 46b378fd9a11b2c7a0a1d0ffda3b7c6e *man/number_bytes_format.Rd 1f4a10b947cc61cf87707d7ef383791f *man/oob.Rd 679d9d3f3ff7c606eaae28bdfb7e63ca *man/ordinal_format.Rd fc4f8b22fef43b15f8683b489d08ed1b *man/pal_area.Rd 3c2828f6882e4bd3e932e1fa8f2929e4 *man/pal_brewer.Rd 95bacb7af709a039afcada7e820cdde0 *man/pal_dichromat.Rd 2f0b5ea578c8870337ff8b58c6ccf208 *man/pal_div_gradient.Rd 643eb1d9a43297a41a3c20c845a15277 *man/pal_gradient_n.Rd 05a6f85a448d29d15e6f0861a53a9d57 *man/pal_grey.Rd 2bb08d9ee59321f0347b7b87af2244c0 *man/pal_hue.Rd e5a897d82dd57afb18826adc8fd9fdb9 *man/pal_identity.Rd ca30b5e18a9044525460f83e474b829b *man/pal_linetype.Rd 23460ccebc9f825c5279379a10e64a65 *man/pal_manual.Rd b7851f4428bb6635d0a5658c712af7d6 *man/pal_rescale.Rd 50e72c2c3b9d82ad0ebc8b28f5fa6383 *man/pal_seq_gradient.Rd 681cb71c0a4cc9c5cdea6b39e550f66d *man/pal_shape.Rd 5b5784eb4b6c52017c396c47378121eb *man/pal_viridis.Rd 87023e6af5509b7872d1a8b42ccc9900 *man/parse_format.Rd b5ac8911772ebb35084607bc2ce4166a *man/percent_format.Rd 7dfe8ee853c8e8ab811f693e62028dd6 *man/pretty_breaks.Rd 9eee620460dee126ca2279a682be0527 *man/pvalue_format.Rd 956c832f6b8d1bf786f24386032b6358 *man/regular_minor_breaks.Rd 1b6440e79c4de593e66aacb0ab93bdc9 *man/rescale.Rd d9672e336aae3f32b849680b8546b7a7 *man/rescale_max.Rd 28da7460e95f91718a7fcadd471b8601 *man/rescale_mid.Rd 62846324d590864f54033f96cd4f9a68 *man/rescale_none.Rd dcfea868c59553d15c186b612a67fdcd *man/scales-package.Rd f4b3dc988978e99925953ea237e9a1d0 *man/scientific_format.Rd 3efe8c7d6c26c934ffe7d132017d5b25 *man/show_col.Rd 14b4e1ce20387c4f3704f3a0df2183ad *man/train_continuous.Rd b3ebb21e83b3823a721dce335ac71ccf *man/train_discrete.Rd 622fb57a93a119eb9899433b24413053 *man/trans_breaks.Rd f3d5ae917c55ae3f838455a292f6f0f4 *man/trans_format.Rd 91f6d4e5998e5d2a8c6f7bf717b30f1e *man/transform_asinh.Rd 49e4ba2eed6226abfec4c19bb2f9dab9 *man/transform_asn.Rd f47a15f4270cdfb969dd3e7ef4e2416b *man/transform_atanh.Rd f9bda04dac4e06ee7580b137f59423ef *man/transform_boxcox.Rd 81941b145e34ab66335b41bec6dde403 *man/transform_compose.Rd edefd6f3ef1b0f1969f73390b95b1e78 *man/transform_date.Rd c77039efed9e86f4322000de32642f38 *man/transform_exp.Rd 341a86fa7f35a9bf0f6b1531f635401b *man/transform_identity.Rd edbd21258d9f851cb1eaf6887ff8f86f *man/transform_log.Rd 46637248085504319e4c66f7ede49628 *man/transform_probability.Rd e688538ea74215c3735fd4f3f00873bd *man/transform_reciprocal.Rd 842ad1ca31fc2388692b57a1b64d5897 *man/transform_reverse.Rd c3e388b2a4cc86c5aa50baa467e44b77 *man/transform_sqrt.Rd 213ddba1e9709c75b1fdca751b08f20e *man/transform_time.Rd 222b87074dfae85e586577dcf65036a0 *man/transform_timespan.Rd e03867278737dfd633160611211d44fa *man/transform_yj.Rd fa19639cc4e8b00e22d49e439ab45b2e *man/trim_to_domain.Rd eb66b346cb2e17af7ef7945d1b47f209 *man/unit_format.Rd 6ddec2147e677e82a5454d0eb453b3e0 *man/wrap_format.Rd 8f227fefe98a7ea2a5fe92c7263c7a9c *man/zero_range.Rd 1bc97669868c55fc86b10bffb2010b63 *tests/testthat.R 448806281de910f50e843b081d1d9245 *tests/testthat/_snaps/colour-mapping.md a4538e6ace0483294af592e17ae1d529 *tests/testthat/_snaps/label-date.md 202b124010f867b79f74c0a7e3c9f88f *tests/testthat/_snaps/label-number-auto.md 328d16b12baa716e776c0ace83dd6ac4 *tests/testthat/_snaps/label-number.md 5df8b93419757304abaece7ff6a6bdbd *tests/testthat/_snaps/label-ordinal.md c816852e29d2bc1138b3aaf35bbdb598 *tests/testthat/_snaps/trans-compose.md c70ecef7db96ebc8085d934b08a911c2 *tests/testthat/_snaps/trans-date.md 0db67e2bc741d93ad10fcdb0c4fa66b8 *tests/testthat/_snaps/trans.md 34de1bb2e57b229b07a63f3adf469eab *tests/testthat/test-bounds.R f32f902b7afb106eb25bb8a900463750 *tests/testthat/test-breaks-log.R d6cab1b46f222387432b1fe5f2f9de10 *tests/testthat/test-breaks.R 36ecbc55dda4ce7442421c0f59f4687c *tests/testthat/test-colour-manip.R 7f71595eff840e6de5419ead98a586a1 *tests/testthat/test-colour-mapping.R 4fb53fa4b105c924d33c0e03301b666c *tests/testthat/test-colour-ramp.R 79020702174ed52589cf7efd389ee1d2 *tests/testthat/test-full-seq.R 122bec73d88f0a51cebe7ce28cb9566f *tests/testthat/test-label-bytes.R c7b5e1d39cc26ab2fcf184f25d166269 *tests/testthat/test-label-currency.R 4f0d25177a99be597616d2dc0c528adf *tests/testthat/test-label-date.R 9f0dfffab9f421258ad6f183602e5797 *tests/testthat/test-label-expression.R f713deb49d22cbfe7af34d966cd8f63b *tests/testthat/test-label-log.R 3b056db9a1f8b2da54ad0adfddaec45e *tests/testthat/test-label-number-auto.R 11ae0d053d143a4f1a72c52995617456 *tests/testthat/test-label-number-si.R a959746891d246213a8c84809246f12a *tests/testthat/test-label-number.R a39a85b8c8d95135dfd50e9cdbb6e9c0 *tests/testthat/test-label-ordinal.R 0635235d1a43347ae50ee32d0c553d59 *tests/testthat/test-label-percent.R 7a8e4fbe7866d6fc8c26f214302272e9 *tests/testthat/test-label-pvalue.R 3c83b6d7378e85741b96a89d9b06baf0 *tests/testthat/test-label-scientific.R 9edaadb50a932261843dfbfa4718805d *tests/testthat/test-label-wrap.R 258114b488527ed2037ef2773f05bfc0 *tests/testthat/test-labels-retired.R 6106647ac1b736b9242e8ff3a433de06 *tests/testthat/test-minor_breaks.R f46f44767c900548365929b488f5215e *tests/testthat/test-offset-by.R dcfdda37753a92d04d9288701aefa146 *tests/testthat/test-pal-hue.R 67d608f4e39c02654b5ccc4c6144914c *tests/testthat/test-pal-manual.R bed1613bcfa11ebb3a18e12e4ea861d5 *tests/testthat/test-range.R a1e372a8010cfd235ed2598f7f0995c4 *tests/testthat/test-round-any.R ef4f46fe23b6e21c10df0bcd77f79b9b *tests/testthat/test-scale-continuous.R cb5b870d28af7ca69efe2c9fdcc7d6f0 *tests/testthat/test-scale-discrete.R 9d5399b15f0c3f102e79c2b76f8c9b0c *tests/testthat/test-trans-compose.R b3d4000e44fd94f3ae2437c7f8685650 *tests/testthat/test-trans-date.R b1d61a8735d61ecbe45a282f2f2d9d1c *tests/testthat/test-trans-numeric.R 5e8e2c6f5807938656527f0b9f1a46c1 *tests/testthat/test-trans.R