stars/0000755000176200001440000000000014645437762011430 5ustar liggesusersstars/tests/0000755000176200001440000000000014644756220012562 5ustar liggesusersstars/tests/rectilinear.Rout.save0000644000176200001440000000545214644736040016677 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > x = read_stars(tif) > (xx = x[,c(1:347,349),c(1:350,352),]) # rectilinear: one-but-last row & col missing stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.9915 86 255 dimension(s): from to refsys point x 1 348 SIRGAS 2000 / UTM zone 25S FALSE y 1 351 SIRGAS 2000 / UTM zone 25S FALSE band 1 6 NA NA values x/y x [288790.5,288819),...,[298708.5,298737) [x] y [9120747,9120718),...,[9110743,9110715) [y] band NULL > image(xx) # chooses useRaster itself > # see also tidy.R for a ggplot example, leaving out the row. > > m = matrix(1:16, 4, 4) > x = 1:4 > y = 2:5 > (st = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. m 1 4.75 8.5 8.5 12.25 16 dimension(s): from to offset delta point x/y x 1 4 1 1 FALSE [x] y 1 4 2 1 FALSE [y] > st = st_set_dimensions(st, 1, values = c(1,2,3,4,6)) > st = st_set_dimensions(st, 2, values = c(2,3,4,5,8)) > try(st_set_dimensions(st, 2, values = c(2,3,4,5,8,20))) # one too many Error in st_set_dimensions(st, 2, values = c(2, 3, 4, 5, 8, 20)) : length of values ( 6 ) does not match length of dimension 2 ( 4 ) > > # $<-.stars: > st$foo = st$m * 2 > st stars object with 2 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. m 1 4.75 8.5 8.5 12.25 16 foo 2 9.50 17.0 17.0 24.50 32 dimension(s): from to point values x/y x 1 4 FALSE [1,2),...,[4,6) [x] y 1 4 FALSE [2,3),...,[5,8) [y] > > # st_as_sf: > > if (utils::packageVersion("sf") > "0.7.2") { + plot(st_as_sf(st, as_points = FALSE), axes = TRUE) + } > > image(st, text_values = TRUE, axes = TRUE) > > proc.time() user system elapsed 1.10 0.17 1.26 stars/tests/plot.R0000644000176200001440000000155614453011313013653 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require(spacetime, quietly = TRUE)) { data(air) # this loads several datasets in .GlobalEnv dim(air) d = st_dimensions(station = st_as_sfc(stations), time = dates) aq = st_as_stars(list(PM10 = air), dimensions = d) image(aperm(log(aq), 2:1), main = "NA pattern (white) in PM10 station time series") st_geometry(aq) } csv = system.file("tif/ESACCI-LC-Legend.csv", package = "starsdata") if (csv != "") { rgb = read.csv(csv, header = TRUE, sep = ";") luc = read_stars(system.file("tif/LUC3.tif", package = "starsdata")) plot(luc, rgb = rgb, axes = TRUE, key.pos = NULL) } # https://github.com/r-spatial/stars/issues/233 : nc = read_sf(system.file("shape/nc.shp", package = "sf")) output = st_as_stars(st_bbox(nc), nx = 1, ny = 1, values = 1) plot(output) stars/tests/rasterize.R0000644000176200001440000000237714144045432014715 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) nc = read_sf(system.file("gpkg/nc.gpkg", package="sf")) (x = st_rasterize(nc)) # default grid: plot(x, axes = TRUE) # a bit more customized grid: (x = st_rasterize(nc, st_as_stars(st_bbox(nc), nx = 100, ny = 50, values = NA_real_))) plot(x, axes = TRUE) (ls = st_sf(a = 1:2, st_sfc(st_linestring(rbind(c(0.1, 0), c(1.1, 1))), st_linestring(rbind(c(0, 0.05), c(1, 0.05)))))) (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = NA_real_)) # the following two plots confirm that (only) the # upper-left corner is part of the grid cell (when dy is negative), leading # to a seemingly half-gridcell-shift problem: ## sf_extSoftVersion()["GDAL"] plot(st_rasterize(ls, grd), axes = TRUE, reset = FALSE) # ALL_TOUCHED=FALSE; plot(ls, add = TRUE, col = "red") plot(st_rasterize(ls, grd, options = "ALL_TOUCHED=TRUE"), axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = "red") # add lines to existing 0 values, summing values in case of multiple lines: (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = 0)) r = st_rasterize(ls, grd, options = c("MERGE_ALG=ADD", "ALL_TOUCHED=TRUE")) plot(r, axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = "red") stars/tests/spatstat.R0000644000176200001440000000043314376467445014562 0ustar liggesuserssuppressPackageStartupMessages(library(sf)) library(stars) if (suppressPackageStartupMessages(require(spatstat.geom, quietly = TRUE))) { tif = system.file("tif/L7_ETMs.tif", package = "stars") s = adrop(read_stars(tif)[,,,1]) > 70 plot(s) m = as.owin(s) plot(m) print(table(m$m)) } stars/tests/datasets.Rout.save0000644000176200001440000000316014644736040016200 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > bcsd_obs stars_proxy object with 2 attributes in 2 file(s): $foo [1] "[...]/bcsd_obs_1999.nc:pr" $bar [1] "[...]/bcsd_obs_1999.nc:tas" dimension(s): from to offset delta refsys values x/y x 1 81 -85 0.125 NA NULL [x] y 1 33 37.12 -0.125 NA NULL [y] time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31 > L7_ETMs stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > if (require(starsdata, quietly = TRUE)) { + print(stars_sentinel2) + } > > proc.time() user system elapsed 0.62 0.21 0.78 stars/tests/spatstat.Rout.save0000644000176200001440000000212414644736040016232 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(sf)) > > library(stars) Loading required package: abind > if (suppressPackageStartupMessages(require(spatstat.geom, quietly = TRUE))) { + tif = system.file("tif/L7_ETMs.tif", package = "stars") + s = adrop(read_stars(tif)[,,,1]) > 70 + plot(s) + m = as.owin(s) + plot(m) + print(table(m$m)) + } FALSE TRUE 39494 83354 > > proc.time() user system elapsed 2.00 0.17 2.17 stars/tests/extract.Rout.save0000644000176200001440000001101514644736040016040 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # Create 'stars' object > set.seed(1331) > suppressPackageStartupMessages(library(stars)) > volcano = rbind(volcano, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) # add NA rows > d = st_dimensions(x = 1:ncol(volcano), y = 1:nrow(volcano)) > (r = st_as_stars(t(volcano))) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's A1 94 108 124 130.1879 150 195 732 dimension(s): from to offset delta point x/y X1 1 61 0 1 FALSE [x] X2 1 99 0 1 FALSE [y] > r = st_set_dimensions(r, 1, offset = 0, delta = 1) > r = st_set_dimensions(r, 2, offset = nrow(volcano), delta = -1) > > # Create points > pnt = st_sample(st_as_sfc(st_bbox(r)), 100) > pnt = st_as_sf(pnt) > > # Extract - 'st_join' > x = st_join(pnt, st_as_sf(r)) > > # Extract - 'st_extract' > y = st_extract(r, pnt) > > # check there are NA's: > any(is.na(x)) [1] TRUE > # Compare > all.equal(x$A1, y[[1]]) [1] TRUE > > ################################################ > if (FALSE) { + + ## tic: segfaults + # check equal results with stars_proxy: + #x = st_extract(stars:::st_as_stars_proxy(r), pnt) + #all.equal(x$A1, y[[1]]) + #all.equal(x, y) + + r = c(r, 2*r, 10*r) + x = st_join(pnt, st_as_sf(r)) + y = st_as_sf(st_extract(r, pnt)) + all.equal(x, y) + + ## tic: segfaults + #x = st_extract(stars:::st_as_stars_proxy(merge(r)), pnt) + #all.equal(st_as_sf(x), y) + + tif = system.file("tif/L7_ETMs.tif", package = "stars") + xp = read_stars(tif, proxy = TRUE) + xm = read_stars(tif, proxy = FALSE) + pts = st_sample(st_as_sfc(st_bbox(xp)), 10) + pts = c(pts, st_as_sfc("POINT(0 0)"), pts) + em = st_extract(xm, pts) + if (utils::packageVersion("sf") >= "0.9-7") { + ep = st_extract(xp, pts) + print(all.equal(ep, em, check.attributes = TRUE)) + } + + # two-attribute objects: + library(stars) + tif = system.file("tif/L7_ETMs.tif", package = "stars") + xp = read_stars(c(tif, tif), proxy = TRUE) + xm = read_stars(c(tif, tif), proxy = FALSE) + pts = st_sample(st_as_sfc(st_bbox(xp)), 10) + pts = c(pts, st_as_sfc("POINT(0 0)"), pts) + em = st_extract(xm, pts) + if (utils::packageVersion("sf") >= "0.9-7") { + ep = st_extract(xp, pts) + print(all.equal(ep, em, check.attributes = TRUE)) + } + + # single-attribute, single raster objects: + tif1 = paste0(tempfile(), ".tif") + write_stars(xm[1,,,1], "x.tif") + xp = read_stars("x.tif", proxy = TRUE) + xm = read_stars("x.tif", proxy = FALSE) + em = st_extract(xm, pts) + if (utils::packageVersion("sf") >= "0.9-7") { + ep = st_extract(xp, pts) + print(all.equal(ep, em, check.attributes = TRUE)) + } + + # multiple-file attributes: + x = c( + "avhrr-only-v2.19810901.nc", + "avhrr-only-v2.19810902.nc", + "avhrr-only-v2.19810903.nc", + "avhrr-only-v2.19810904.nc", + "avhrr-only-v2.19810905.nc", + "avhrr-only-v2.19810906.nc", + "avhrr-only-v2.19810907.nc", + "avhrr-only-v2.19810908.nc", + "avhrr-only-v2.19810909.nc" + ) + file_list = system.file(paste0("netcdf/", x), package = "starsdata") + if (!identical(file_list, "")) { + y = read_stars(file_list, quiet = TRUE) + print(y) + st_crs(y) = "OGC:CRS84" + pts = st_sample(st_as_sfc(st_bbox(y)), 10) + em = st_extract(y, pts) + + (y = read_stars(file_list, quiet = TRUE, proxy = TRUE)) + print(y) + st_crs(y) = "OGC:CRS84" + if (utils::packageVersion("sf") >= "0.9-7") { + ep = st_extract(y, pts) + print(all.equal(em, ep)) + } + } + + # nearest & bilinear comparison: + if (utils::packageVersion("sf") >= "0.9-7") { + set.seed(12331) + s = st_as_stars(matrix(rnorm(16), 4)) + pts = st_sample(st_as_sfc(st_bbox(s)), 10000, type = "regular") + s1 = st_extract(s, pts, bilinear = FALSE) + s2 = st_extract(s, pts, bilinear = TRUE) + s1$s2 = s2[[1]] + names(s1)[c(1,3)] = c("nearest", "bilinear") + print(s1[sample(10000, 5),]) + } + } > > proc.time() user system elapsed 0.60 0.14 0.73 stars/tests/align.Rout.save0000644000176200001440000000424114644736040015463 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > set.seed(1331) > st_sample(st_as_sfc(st_bbox(L7_ETMs)), 1) Geometry set for 1 feature Geometry type: POINT Dimension: XY Bounding box: xmin: 291430.8 ymin: 9111430 xmax: 291430.8 ymax: 9111430 Projected CRS: SIRGAS 2000 / UTM zone 25S POINT (291430.8 9111430) > b = st_buffer(st_sample(st_as_sfc(st_bbox(L7_ETMs)), 1), 335) > bba = stars:::st_align(st_bbox(b), st_dimensions(L7_ETMs)) > > plot(L7_ETMs[,,,1], extent = st_buffer(b, 20), reset = FALSE, key.pos = NULL) > plot(b, add = TRUE, col = NA, border = 'red') > plot(st_as_sfc(st_bbox(b)), col = NA, border = 'red', add = TRUE) > plot(st_as_sfc(bba), col = NA, border = 'blue', add = TRUE) > st_bbox(b) xmin ymin xmax ymax 297116.8 9119404.1 297786.8 9120074.1 > bba xmin ymin xmax ymax 297098.3 9119392.8 297810.8 9120076.8 > > plot(L7_ETMs[,,,1], reset = FALSE, key.pos = NULL) > plot(b, col = 'red', add = TRUE) > plot(st_as_sfc(bba), col = NA, border = 'blue', add = TRUE) > > b0 = st_buffer(b, -100) > L7 = st_as_stars(L7_ETMs)[b0][,,,1] |> st_normalize() > bbb = stars:::st_align(st_bbox(b), st_dimensions(L7)) > plot(L7, extent = st_buffer(b, 120), reset = FALSE, key.pos = NULL) > plot(st_as_sfc(st_bbox(L7)), col = NA, border = 'black', add = TRUE) > plot(st_as_sfc(bbb), col = NA, border = 'blue', add = TRUE) > plot(b, col = NA, border = 'red', add = TRUE) > > all.equal(bbb, bba) [1] TRUE > > proc.time() user system elapsed 1.15 0.18 1.32 stars/tests/warp.R0000644000176200001440000000404314603253262013650 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) geomatrix = system.file("tif/geomatrix.tif", package = "stars") x = read_stars(geomatrix) # can stars reproduce what gdal does, by default? x2 = st_warp(x, use_gdal = TRUE, no_data_value = -9999) y = st_warp(x, x2) if (interactive()) { plot(x2, breaks = "equal", axes=TRUE) } if (interactive()) { plot(y, breaks = "equal", axes=TRUE) } names(x2) = names(y) all.equal(x2, y) # yes? # does gdal reproduce with stars template object? (x2 = setNames(st_warp(x, y, use_gdal = TRUE, no_data_value=-1), "file.tif")) # does gdal reproduce what stars does, default cell size? (x2 = st_warp(x, crs = st_crs(x), use_gdal = FALSE)) (y = setNames(st_warp(x, x2, use_gdal = TRUE, debug = FALSE, no_data_value=-1), "file.tif")) # try with multiple bands: tif = system.file("tif/L7_ETMs.tif", package = "stars") (x1 = read_stars(tif)) tifcp = tempfile(fileext = ".tif") file.copy(tif, tifcp) x1p = read_stars(tifcp, proxy = TRUE) st_dimensions(x1p) (x1a = st_warp(x1, crs = st_crs(4326))) (x1b = setNames(st_warp(x1, x1p, use_gdal = TRUE, no_data_value=-1), "file.tif")) # does gdal reproduce what stars does? Smaller grid: x2 = st_warp(x, crs = st_crs(x), use_gdal = FALSE, cellsize = 3) # x2 = x2[,2:43,2:43] if (interactive()) { plot(x2, breaks = "equal", axes=TRUE, reset = FALSE) } if (interactive()) { plot(st_as_sfc(st_bbox(x2)), add = TRUE, col = NA, border = 'red') } ### doesn't work: FIXME: check with more recent GDAL: (y = setNames(st_warp(x, x2, use_gdal = TRUE, debug = FALSE, no_data_value=-1), "file.tif")) if (interactive()) { plot(y, breaks = "equal") } names(x2) = names(y) # isTRUE(all.equal(x2, y, check.attributes=FALSE)) m = mean(as.vector(x2[[1]]==y[[1]]), na.rm = TRUE) u = unique(as.vector(x2[[1]]-y[[1]])) g = st_as_stars() attr(g, "dimensions")$x$offset = 0 g$values = as.vector(t(matrix(seq_len(prod(dim(g))), 180, 360))) if (interactive()) { plot(g, axes=TRUE) } a = st_warp(g, st_as_stars(), use_gdal=FALSE) b = st_warp(g, st_as_stars(), use_gdal=TRUE, no_data_value = -1) all.equal(a, b, check.attributes = FALSE) stars/tests/mdim.R0000644000176200001440000000174014603251236013625 0ustar liggesusersSys.setenv(TZ="") suppressPackageStartupMessages(library(stars)) matrix(1:4,2) m = matrix(1:4,2) s = st_as_stars(m) s = st_set_dimensions(s, st_dimensions(s), xy = NULL) sfc = st_sfc(st_point(0:1), st_point(3:2)) s = st_set_dimensions(s, 1, sfc) |> st_set_crs(4326) tm = as.POSIXct("2023-03-04 12:35") + c(0, 3600) s = st_set_dimensions(s, 2, tm) f = tempfile(fileext = ".nc") write_mdim(s, f, as_float = FALSE) s2 = read_mdim(f) #print(s2) print(all.equal(s, s2, check.attributes = FALSE)) print(all.equal(s, s2)) st_crs(sfc) = st_crs(s2) st_crs(s) = st_crs(s2) tm = as.Date("2023-02-25") + 0:1 sd = st_set_dimensions(s, 2, tm) print(sd) sd = st_set_dimensions(sd, 1, sfc) print(sd) f = tempfile(fileext = ".nc") write_mdim(sd, f) sd2 = read_mdim(f) print(sd2) print(all.equal(sd, sd2, check.attributes = FALSE)) print(all.equal(sd, sd2)) # if (.Platform$OS.type == "unix") { # print(read_mdim(paste0("/vsizip/", (system.file("zarr/sic_daily_sample.zarr.zip", package = "stars")))) # } stars/tests/transform.R0000644000176200001440000000243014604056237014714 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) #suppressPackageStartupMessages(library(lwgeom)) geomatrix = system.file("tif/geomatrix.tif", package = "stars") (x = read_stars(geomatrix)) new = st_crs(4326) y = st_transform(x, new) plot(st_transform(st_as_sfc(st_bbox(x)), new), col = NA, border = 'red') plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) image(y, add = TRUE) plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) plot(st_transform(st_as_sfc(x, as_points=FALSE), new), add = TRUE) tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif)[,1:10,1:10,1:3] x_ = st_transform(x, st_crs(4326)) ## IGNORE_RDIFF_BEGIN if (require(lwgeom, quietly = TRUE)) { x__ = st_transform_proj(x, st_crs(4326)$proj4string) st_crs(x_) = st_crs(x__) print(all.equal(x_,x__)) # x__ = st_transform(x, x_) #now in st_warp # all.equal(x_, x__) x = st_xy2sfc(x, as_points = FALSE) (x_ = st_transform(x, st_crs(4326))) (x__ = st_transform_proj(x, st_crs(4326))) print(all.equal(x_,x__,check.attributes = FALSE)) } ## IGNORE_RDIFF_END # nothing to transform: now errs: try(st_transform(st_as_stars(list(m = matrix(1,10,10))), st_crs(4326))) try(st_transform_proj(st_as_stars(list(m = matrix(1,10,10))), st_crs(4326))) stars/tests/write.R0000644000176200001440000000046013777653456014054 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") (x = read_stars(tif)) # write stars object: write_stars(x, tempfile(), driver = "GTiff") # write stars_proxy object: (x = read_stars(tif, proxy = TRUE)) write_stars(x, tempfile(), driver = "GTiff") stars/tests/raster.R0000644000176200001440000000405414464700704014204 0ustar liggesusersoptions(rgdal_show_exportToProj4_warnings = "none") suppressPackageStartupMessages(library(stars)) if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require("raster", quietly = TRUE) && suppressPackageStartupMessages(require("terra", quietly = TRUE))) { tif = system.file("tif/L7_ETMs.tif", package = "stars") (x = read_stars(tif)) (r = as(x, "Raster")) (y = st_as_stars(r)) # single band: x = adrop(x[,,,1]) r = as(x, "Raster") (y = st_as_stars(r)) # proxy: (x = read_stars(tif, proxy = TRUE)) (r = as(x, "Raster")) (y = st_as_stars(r)) (y2 = st_as_stars(r, proxy = TRUE)) } if (require(terra, quietly = TRUE)) { ## terra ------------- stopifnot(require(terra)) (x = read_stars(tif)) (r = as(x, "SpatRaster")) (y = st_as_stars(r)) # single band: x = adrop(x[,,,1]) r = as(x, "SpatRaster") (y = st_as_stars(r)) # proxy: (x = read_stars(tif, proxy = TRUE)) (r = as(x, "SpatRaster")) (y = st_as_stars(r)) (y2 = st_as_stars(r, proxy = TRUE)) f = system.file("tif/lc.tif", package = "stars") lc = read_stars(system.file("tif/lc.tif", package = "stars")) levels(lc[[1]]) r = rast(lc) e = attr(lc[[1]], "exclude") if (packageVersion("terra") >= "1.5.48") { print(all.equal(terra::levels(r)[[1]][,2], terra::levels(rast(f))[[1]][!e,2])) print(all.equal(terra::coltab(r)[[1]][!e,], terra::coltab(rast(f))[[1]][!e,], check.attributes = FALSE)) r<- rast(nrow=10, ncol=10) set.seed(5) values(r)<- sample(1:3, size = ncell(r), replace = TRUE) levels(r) <- data.frame(ID=1:3, category = c("c1", "c2", "c3")) r2<- rast(nrow=10, ncol=10) set.seed(6) values(r2)<- sample(c(0,2,3), size = ncell(r2), replace = TRUE) levels(r2) <- data.frame(ID=c(0,2,3), category = c("x1", "x2", "x3")) r3<- c(r,r2) names(r3)<- c("lyr.1", "lyr.2") r3_stars<- st_as_stars(r3) st_redimension(r3_stars) |> print() rast(r3_stars) |> levels() |> print() m = matrix(1:121, 11, 11) bb = st_bbox(c(xmin=0, xmax=11, ymin=0, ymax=11)) s = st_as_stars(bb, values = m) r = rast(s) aggregate(r, 2) |> st_as_stars() -> r.s stopifnot(isTRUE(all.equal(r.s[,1:5,1:5], st_downsample(s, 1, FUN = mean)))) } } stars/tests/stars.Rout.save0000644000176200001440000004573114644736040015536 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > Sys.setenv(TZ="UTC") > suppressPackageStartupMessages(library(stars)) > set.seed(13521) # runif > tif = system.file("tif/L7_ETMs.tif", package = "stars") > (x_ = read_stars(c(tif,tif))) # FIXME: not what you'd expect stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 L7_ETMs.tif.1 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > (x = read_stars(tif)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > # image(x) > gdal_crs(tif) Coordinate Reference System: User input: PROJCS["SIRGAS 2000 / UTM zone 25S",GEOGCS["SIRGAS 2000",DATUM["Sistema_de_Referencia_Geocentrico_para_las_AmericaS_2000",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6674"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4674"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-33],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","31985"]] wkt: PROJCRS["SIRGAS 2000 / UTM zone 25S", BASEGEOGCRS["SIRGAS 2000", DATUM["Sistema de Referencia Geocentrico para las AmericaS 2000", ELLIPSOID["GRS 1980",6378137,298.257222101, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4674]], CONVERSION["UTM zone 25S", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-33, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",500000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",10000000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["easting",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["northing",north, ORDER[2], LENGTHUNIT["metre",1]], ID["EPSG",31985]] > plot(x) > plot(x, join_zlim = FALSE) > x %>% st_set_dimensions(names = c('a', 'b', 'c')) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y a 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] b 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] c 1 6 NA NA NA NA > st_get_dimension_values(x, 3) [1] 1 2 3 4 5 6 > > (x1 = st_set_dimensions(x, "band", values = c(1,2,3,4,5,7), names = "band_number", point = TRUE)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point values x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band_number 1 6 NA NA NA TRUE 1,...,7 > rbind(c(0.45,0.515), c(0.525,0.605), c(0.63,0.69), c(0.775,0.90), c(1.55,1.75), c(2.08,2.35)) %>% + units::set_units(um) -> bw # units::set_units(µm) -> bw > # set bandwidth midpoint: > (x2 = st_set_dimensions(x, "band", values = 0.5 * (bw[,1]+bw[,2]), + names = "bandwidth_midpoint", point = TRUE)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE bandwidth_midpoint 1 6 NA NA udunits TRUE values x/y x NULL [x] y NULL [y] bandwidth_midpoint 0.4825 [um],...,2.215 [um] > # set bandwidth intervals: > (x3 = st_set_dimensions(x, "band", values = make_intervals(bw), names = "bandwidth")) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE bandwidth 1 6 NA NA udunits NA values x/y x NULL [x] y NULL [y] bandwidth [0.45,0.515) [um],...,[2.08,2.35) [um] > > x + x stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 2 108 138 137.8248 172 510 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > x * x stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 2916 4761 5512.41 7396 65025 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > x[,,,1:3] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 21 58 70 70.36041 83 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 3 NA NA NA NA > x[,1:100,100:200,] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 13 54 65 67.21531 77 252 dimension(s): from to offset delta refsys point x/y x 1 100 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 100 200 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > sqrt(x) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 7.348469 8.306624 8.094006 9.273618 15.96872 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > st_apply(x, 3, min) stars object with 1 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. min 1 3 15 18.5 29.25 47 dimension(s): from to band 1 6 > st_apply(x, 1:2, max) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. max 55 85 96 99.36018 113 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] > st_apply(x, 1:2, range) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 50 71 72.43565 96 255 dimension(s): from to offset delta refsys point x/y range 1 2 NA NA NA NA x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] > > geomatrix = system.file("tif/geomatrix.tif", package = "stars") > x = read_stars(geomatrix) > y = st_transform(x, st_crs(4326)) > st_coordinates(x)[1:2,] x y 1 1841000 1144000 2 1841002 1143995 > > nc = system.file("nc/tos_O1_2001-2002.nc", package = "stars") > if (nc != "" && require(PCICt, quietly = TRUE)) { + print(x <- read_stars(nc)) + print(st_bbox(x)) + s = st_as_stars(st_bbox(x)) # inside = NA + print(st_bbox(s)) + s = st_as_stars(st_bbox(x), inside = TRUE) + print(st_bbox(s)) + s = st_as_stars(st_bbox(x), inside = FALSE) + print(st_bbox(s)) + (s = st_as_stars(st_bbox(x), dy = 1)) + print(st_bbox(s)) + print(identical(st_as_stars(st_bbox(x), dx = 1), st_as_stars(st_bbox(x), dy = 1))) + s = st_as_stars(st_bbox(x), dx = 10) + print(st_bbox(s)) + s = st_as_stars(st_bbox(x), dx = 20) + print(st_bbox(s)) + x1 = x + st_crs(x1) = "OGC:CRS84" + print(identical(st_as_stars(st_bbox(x1), dx = 1), st_as_stars(st_bbox(x1), dx = units::set_units(1, degree)))) + + df = as.data.frame(x) + if (require(units, quietly = TRUE)) + print(units::drop_units(x)) + + print(dimnames(x)) + dimnames(x) <- letters[1:3] + print(dimnames(x)) + } # PCICt > > st_as_stars() stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. values 0 0 0 0 0 0 dimension(s): from to offset delta refsys x/y x 1 360 -180 1 WGS 84 (CRS84) [x] y 1 180 90 -1 WGS 84 (CRS84) [y] > > # multiple sub-datasets: > nc_red = system.file("nc/reduced.nc", package = "stars") > red = read_stars(nc_red) sst, anom, err, ice, > red stars object with 4 dimensions and 4 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's sst [°C] -1.80 -0.03 13.655 12.9940841 24.8125 32.97 4448 anom [°C] -10.16 -0.58 -0.080 -0.1855812 0.2100 2.99 4448 err [°C] 0.11 0.16 0.270 0.2626872 0.3200 0.84 4448 ice [percent] 0.01 0.47 0.920 0.7178118 0.9600 1.00 13266 dimension(s): from to offset delta refsys x/y x 1 180 -1 2 NA [x] y 1 90 90 -2 NA [y] zlev 1 1 0 [m] NA NA time 1 1 1981-12-31 UTC NA POSIXct > plot(red) > > x = st_xy2sfc(read_stars(tif)[,1:10,1:10,], as_points = FALSE) > st_bbox(x) xmin ymin xmax ymax 288776.3 9120475.8 289061.3 9120760.8 > x = read_stars(tif) > merge(split(x, "band")) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X1.X2.X3.X4.X5.X6 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point values x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL attributes 1 6 NA NA NA NA X1,...,X6 x/y x [x] y [y] attributes > > read_stars(c(tif,tif)) # merges as attributes stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 L7_ETMs.tif.1 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > read_stars(c(tif,tif), along = "sensor") stars object with 4 dimensions and 1 attribute attribute(s), summary of first 1e+05 cells: Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 47 65 76 77.3419 87 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA sensor 1 2 NA NA NA NA > read_stars(c(tif,tif), along = 4) stars object with 4 dimensions and 1 attribute attribute(s), summary of first 1e+05 cells: Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 47 65 76 77.3419 87 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA new_dim 1 2 NA NA NA NA > read_stars(c(tif,tif), along = "band") stars object with 3 dimensions and 1 attribute attribute(s), summary of first 1e+05 cells: Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 47 65 76 77.3419 87 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 12 NA NA NA NA > read_stars(c(tif,tif), along = 3) stars object with 3 dimensions and 1 attribute attribute(s), summary of first 1e+05 cells: Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 47 65 76 77.3419 87 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 12 NA NA NA NA > > # cut: > tif = system.file("tif/L7_ETMs.tif", package = "stars") > x = read_stars(tif) > cut(x, c(0, 50, 100, 255)) stars object with 3 dimensions and 1 attribute attribute(s): L7_ETMs.tif (0,50] :156060 (50,100] :503764 (100,255]: 77264 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > cut(x[,,,1,drop=TRUE], c(0, 50, 100, 255)) stars object with 2 dimensions and 1 attribute attribute(s): L7_ETMs.tif (0,50] : 1 (50,100] :117134 (100,255]: 5713 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] > plot(cut(x[,,,1,drop=TRUE], c(0, 50, 100, 255))) > > st_bbox(st_dimensions(x)) xmin ymin xmax ymax 288776.3 9110728.8 298722.8 9120760.8 > x[x < 0] = NA > x[is.na(x)] = 0 > > # c: > f = system.file("netcdf/avhrr-only-v2.19810902.nc", package = "starsdata") > if (FALSE && f != "") { + files = c("avhrr-only-v2.19810901.nc", + "avhrr-only-v2.19810902.nc", + "avhrr-only-v2.19810903.nc", + "avhrr-only-v2.19810904.nc", + "avhrr-only-v2.19810905.nc", + "avhrr-only-v2.19810906.nc", + "avhrr-only-v2.19810907.nc", + "avhrr-only-v2.19810908.nc", + "avhrr-only-v2.19810909.nc") + l = list() + for (f in files) { + from = system.file(paste0("netcdf/", f), package = "starsdata") + l[[f]] = read_stars(from, sub = c("sst", "anom")) + } + ret = do.call(c, l) + print(ret) + ret = adrop(c(l[[1]], l[[2]], l[[3]], along = list(times = as.Date("1981-09-01") + 0:2))) + print(ret) + #ret = adrop(adrop(c(l[[1]], l[[2]], l[[3]], along = "times"))) + #print(ret) + } > > st_dimensions(list(matrix(1, 4, 4))) # st_dimensions.default from to point values X1 1 1 FALSE 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 > > if (FALSE && require("starsdata", quietly = TRUE)) { + # curvilinear: + s5p = system.file( + "sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", + package = "starsdata") + print(s5p) + lat_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/latitude") + lon_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/longitude") + nit_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column") + lat = read_stars(lat_ds) + lon = read_stars(lon_ds) + nit = read_stars(nit_ds) + nit[[1]][nit[[1]] > 9e+36] = NA + + ll = setNames(c(lon, lat), c("x", "y")) + nit.c = st_as_stars(nit, curvilinear = ll) + print(nit.c) + + s5p = system.file( + "sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", + package = "starsdata") + nit.c2 = read_stars(s5p, + sub = "//PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column", + curvilinear = c("//PRODUCT/latitude", "//PRODUCT/longitude")) + print(all.equal(nit.c, nit.c2)) + } > > proc.time() user system elapsed 6.00 0.54 6.53 stars/tests/area.Rout.save0000644000176200001440000000540314644736040015302 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > x = read_stars(tif) > (a = st_area(x[,1:5,1:5])) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. area [m^2] 812.25 812.25 812.25 812.25 812.25 812.25 dimension(s): from to offset delta refsys point x/y x 1 5 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 5 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] > > m = matrix(1:20, nrow = 5, ncol = 4) > x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! > y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! > (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. m 1 5.75 10.5 10.5 15.25 20 dimension(s): from to point values x/y x 1 5 FALSE [0,0.5),...,[4,5) [x] y 1 4 FALSE [0.3,0.5),...,[2,2.2) [y] > # image(r, axes = TRUE, col = grey((1:20)/20)) > (a = st_area(r)) Missing coordinate reference system: assuming Cartesian coordinates stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. area 0.1 0.2 0.325 0.475 0.5 2 dimension(s): from to point values x/y x 1 5 FALSE [0,0.5),...,[4,5) [x] y 1 4 FALSE [0.3,0.5),...,[2,2.2) [y] > #plot(a, axes = TRUE) > > s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata") > if (s5p != "") { + nit.c = read_stars(s5p, sub = "//PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column", + curvilinear = c("//PRODUCT/longitude", "//PRODUCT/latitude"), driver = NULL) + if (inherits(nit.c[[1]], "units")) + nit.c[[1]] = units::drop_units(nit.c[[1]]) + nit.c[[1]][nit.c[[1]] > 9e+36] = NA + st_crs(nit.c) = 4326 + print((a <- st_area(nit.c[,1:5,1:5]))) + # plot(a, axes = TRUE, border = NA) + } > > proc.time() user system elapsed 0.71 0.15 0.84 stars/tests/downsample.Rout.save0000644000176200001440000001027214644736040016543 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > m = matrix(1:121, 11, 11) > m [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [1,] 1 12 23 34 45 56 67 78 89 100 111 [2,] 2 13 24 35 46 57 68 79 90 101 112 [3,] 3 14 25 36 47 58 69 80 91 102 113 [4,] 4 15 26 37 48 59 70 81 92 103 114 [5,] 5 16 27 38 49 60 71 82 93 104 115 [6,] 6 17 28 39 50 61 72 83 94 105 116 [7,] 7 18 29 40 51 62 73 84 95 106 117 [8,] 8 19 30 41 52 63 74 85 96 107 118 [9,] 9 20 31 42 53 64 75 86 97 108 119 [10,] 10 21 32 43 54 65 76 87 98 109 120 [11,] 11 22 33 44 55 66 77 88 99 110 121 > s = st_as_stars(m) > st_downsample(s, 1) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 28.5 61 61 93.5 121 dimension(s): from to offset delta point x/y X1 1 6 0 2 FALSE [x] X2 1 6 0 2 FALSE [y] > st_downsample(s, 1)[[1]] [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 23 45 67 89 111 [2,] 3 25 47 69 91 113 [3,] 5 27 49 71 93 115 [4,] 7 29 51 73 95 117 [5,] 9 31 53 75 97 119 [6,] 11 33 55 77 99 121 > st_downsample(s, 1, offset = 1) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 13 37 61 61 85 109 dimension(s): from to offset delta point x/y X1 1 5 1 2 FALSE [x] X2 1 5 1 2 FALSE [y] > st_downsample(s, 1, offset = 1)[[1]] [,1] [,2] [,3] [,4] [,5] [1,] 13 35 57 79 101 [2,] 15 37 59 81 103 [3,] 17 39 61 83 105 [4,] 19 41 63 85 107 [5,] 21 43 65 87 109 > st_downsample(s, 1, FUN = mean) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 7 31 55 55 79 103 dimension(s): from to offset delta point x/y X1 1 5 0 2 FALSE [x] X2 1 5 0 2 FALSE [y] > st_downsample(s, 1, FUN = mean)[[1]] [,1] [,2] [,3] [,4] [,5] [1,] 7 29 51 73 95 [2,] 9 31 53 75 97 [3,] 11 33 55 77 99 [4,] 13 35 57 79 101 [5,] 15 37 59 81 103 > st_downsample(s, 1, offset = 1, FUN = mean) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 19 43 67 67 91 115 dimension(s): from to offset delta point x/y X1 1 5 1 2 FALSE [x] X2 1 5 1 2 FALSE [y] > st_downsample(s, 1, offset = c(0,1), FUN = mean)[[1]] [,1] [,2] [,3] [,4] [,5] [1,] 18 40 62 84 106 [2,] 20 42 64 86 108 [3,] 22 44 66 88 110 [4,] 24 46 68 90 112 [5,] 26 48 70 92 114 > st_downsample(s, 1, offset = c(0,1)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 12 36.5 61 61 85.5 110 dimension(s): from to offset delta point x/y X1 1 6 0 2 FALSE [x] X2 1 5 1 2 FALSE [y] > st_downsample(s, 1, offset = c(0,1))[[1]] [,1] [,2] [,3] [,4] [,5] [1,] 12 34 56 78 100 [2,] 14 36 58 80 102 [3,] 16 38 60 82 104 [4,] 18 40 62 84 106 [5,] 20 42 64 86 108 [6,] 22 44 66 88 110 > > proc.time() user system elapsed 0.68 0.10 0.79 stars/tests/nc.R0000644000176200001440000000233413777653456013324 0ustar liggesusers# examples with the sf::nc polygon dataset NOT ABOUT NETCDF's, see e.g. stars.R netcdf.R suppressPackageStartupMessages(library(sf)) nc = read_sf(system.file("gpkg/nc.gpkg", package="sf")) m = st_set_geometry(nc, NULL) n = as.matrix(m[c("BIR74", "SID74", "NWBIR74", "BIR79", "SID79", "NWBIR79")]) dim(n) = c(county = 100, var = 3, year = 2) dimnames(n) = list(county = nc$NAME, var = c("BIR", "SID", "NWBIR"), year = c(1974, 1979)) suppressPackageStartupMessages(library(stars)) (st = st_as_stars(pop = n)) foo <- st %>% st_set_dimensions(1, st_geometry(nc)) # %>% st_set_dimensions(3, c(1974, 1979)) st %>% st_set_dimensions(1, st_geometry(nc)) %>% st_set_dimensions(names = c("geometries", "var", "year")) foo st_bbox(foo) (x = st_as_sf(foo)) frac = function(x) x[2] / x[1] frac2 = function(x) c(sidsr = x[2] / x[1], nwbr = x[3] / x[1]) frac2an = function(x) c(x[2] / x[1], x[3] / x[1]) st_apply(foo, c(1,3), frac) st_apply(foo, c(1,3), frac2) st_apply(foo, c(1,3), frac2an) library(abind) (x = aperm(st_apply(foo, c(1,3), frac2), c(2,3,1))) y = aperm(st_apply(foo, c(1,3), frac2), c("county","year","frac2")) all.equal(st_dimensions(x), st_dimensions(y)) split(foo, 2) split(foo, 3) st_crs(foo) plot(foo) # subset vector cube: foo[nc[1]] stars/tests/predict.Rout.save0000644000176200001440000000662014644736040016026 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > # predict: > tif = system.file("tif/L7_ETMs.tif", package = "stars") > (x = read_stars(tif)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > st_crs(x) = st_crs(x) # cleans trailing space > model = lm(x~L7_ETMs.tif, head(as.data.frame(x), 50)) > x = predict(x, model) > > (y = read_stars(tif, proxy = TRUE)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > (yp = predict(y, model)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] predict(object = object, model = model) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > all.equal(x, st_as_stars(yp)) [1] TRUE > > yy = st_set_dimensions(y, 3, values = paste0("band", 1:6)) > (y_spl = split(yy, 3)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point values x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL band 1 6 NA NA NA NA band1,...,band6 x/y x [x] y [y] band call_list: [[1]] split(x = x, 3) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > as.data.frame(st_as_stars(split(yy, 3)))[1:3,] x y band1 band2 band3 band4 band5 band6 1 288790.5 9120747 69 56 46 79 86 46 2 288819.0 9120747 69 57 49 75 88 49 3 288847.5 9120747 63 52 45 66 75 41 > > proc.time() user system elapsed 2.18 0.23 2.40 stars/tests/rectilinear.R0000644000176200001440000000142613777653456015226 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) (xx = x[,c(1:347,349),c(1:350,352),]) # rectilinear: one-but-last row & col missing image(xx) # chooses useRaster itself # see also tidy.R for a ggplot example, leaving out the row. m = matrix(1:16, 4, 4) x = 1:4 y = 2:5 (st = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st = st_set_dimensions(st, 1, values = c(1,2,3,4,6)) st = st_set_dimensions(st, 2, values = c(2,3,4,5,8)) try(st_set_dimensions(st, 2, values = c(2,3,4,5,8,20))) # one too many # $<-.stars: st$foo = st$m * 2 st # st_as_sf: if (utils::packageVersion("sf") > "0.7.2") { plot(st_as_sf(st, as_points = FALSE), axes = TRUE) } image(st, text_values = TRUE, axes = TRUE) stars/tests/aggregate.R0000644000176200001440000000327314603250270014625 0ustar liggesusers## IGNORE_RDIFF_BEGIN library(stars) ## IGNORE_RDIFF_END if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require(spacetime, quietly = TRUE)) { data(air) # this loads several datasets in .GlobalEnv dim(air) d = st_dimensions(station = st_set_crs(st_as_sfc(stations), 4326), time = dates) blocks = st_make_grid(st_as_sfc("POLYGON ((5.871619 47.26986, 15.03811 47.26986, 15.03811 55.05653, 5.871619 55.05653, 5.871619 47.26986))", crs = 4326), n = c(3,3)) print(aq <- st_as_stars(list(PM10 = air), dimensions = d)) print(a <- aggregate(aq, blocks, mean, na.rm = TRUE)) } # adapted from ?read_stars: m = array(1:720, dim = c(x = 10, y = 12, t = 6)) # named dim st = st_as_stars(m) attr(st, "dimensions")$y$delta = -1 attr(st, "dimensions")$y$offset = 12 tm = as.Date("2019-02-19") + 1:6 st = st_set_crs(st_set_dimensions(st, 3, values = tm), 4326) tmp = tempfile(fileext = ".tif") write_stars(st, tmp) (red <- setNames(read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXsize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2)), "foo")) sfc = st_set_crs(st_as_sfc(red, as_points = FALSE), st_crs(st)) (a = aggregate(st, st_sf(a = 1, geom = sfc), mean)) (a = aggregate(st, sfc, mean)) if (require(raster)) { print(a <- aggregate(st, sfc, mean, exact = TRUE)) print(a[[1]]) print(sum(a[[1]])*30 == sum(1:720)) } tm0 = as.Date("2019-02-19") + -1:8 (a = aggregate(st, tm0, mean, na.rm = TRUE)) (a = aggregate(st, "days", mean, na.rm = TRUE)) yd = function(x) as.POSIXlt(x)$yday (a = aggregate(st, yd, mean, na.rm = TRUE)) # with "by" geometry not overlapping x pt = st_point(c(-10,-10)) (sfc = c(sfc, st_sfc(pt, crs = st_crs(sfc)))) (a = aggregate(st, sfc, mean)) (a = aggregate(st, st, mean)) stars/tests/proxy.R0000644000176200001440000000440014353574021014056 0ustar liggesusersSys.setenv(TZ="UTC") suppressPackageStartupMessages(library(sf)) suppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") (r = read_stars(tif, proxy = TRUE)) if (interactive()) { plot(r) } dim(r) r[,,,2:3] r+r st_as_stars(sin(r), downsample = 2) aperm(r, c(3,2,1)) if (interactive()) { plot(r) } (xx = c(r,r)) st_redimension(xx) st_as_stars(r) (y = st_apply(r, 1:2, max)) (yy = st_as_stars(y, downsample = 1)) (y = adrop(st_apply(r, c("x", "y"), max))) (yy = st_as_stars(y, downsample = 1)) plot(yy) (y = adrop(st_apply(r, c("x", "band"), max))) (yy = st_as_stars(y, downsample = 1)) rm(yy) (xx = c(r,r)) names(xx) = c("a", "b") xx["a"] pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) buf = st_buffer(st_sfc(pt, crs = st_crs(r)), 1500) buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), crs = st_crs(r)) r = r[buf] # crops r = r[buf, epsilon = 1e-5] # crops with shrinked bounding box # c: f = system.file("netcdf/avhrr-only-v2.19810902.nc", package = "starsdata") if (FALSE && f != "") { files = c("avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc") l = list() for (f in files) { from = system.file(paste0("netcdf/", f), package = "starsdata") l[[f]] = read_stars(from, sub = c("sst", "anom"), proxy = TRUE) } ret = do.call(c, l) print(ret) all = system.file(paste0("netcdf/", files), package = "starsdata") ret = read_stars(all, sub = c("sst", "anom")) print(ret) print(st_redimension(ret)) # collapse the two attributes into new dimension try(ret <- c(l[[1]], l[[2]], l[[3]], along = list(times = as.Date("1981-09-01") + 0:2))) #print(ret) #ret = adrop(adrop(c(l[[1]], l[[2]], l[[3]], along = "times"))) #print(ret) ret <- st_redimension(l[[1]], along = list(times = as.Date("1981-09-01") + 0:1)) print(ret) } # demonstrate that environments work: x = read_stars(tif, proxy = TRUE) f = function(x) { g = function(xx) { ndvi = function(z1, z2, z3, z4, z5, z6) (z2-z1)/(z2+z1) st_apply(xx, 1:2, ndvi) } g(x) } (x = f(x)) st_as_stars(x) stars/tests/dimensions.Rout.save0000644000176200001440000000465614644736040016553 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # https://github.com/r-spatial/stars/issues/295 > suppressPackageStartupMessages(library(stars)) > raw <- read_stars(system.file("nc/bcsd_obs_1999.nc", package = "stars")) pr, tas, > foo <- function(x, idx) stats::lowess(idx, x)$y > > timeline <- st_get_dimension_values(raw, "time") > smooth = st_apply(raw, + MARGIN = c("x", "y"), + FUN = foo, + idx = st_get_dimension_values(raw, "time") + ) > > st_set_dimensions(smooth, + which = "foo", + values = st_get_dimension_values(raw, "time"), + names = "time" + ) stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's pr 16.133519 70.371665 84.55774 87.72969 101.94830 278.6427 7116 tas -2.354958 9.632157 15.32671 14.61650 19.99331 24.7976 7116 dimension(s): from to offset delta refsys values x/y time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31 x 1 81 -85 0.125 NA NULL [x] y 1 33 37.12 -0.125 NA NULL [y] > > raw %>% + st_apply(MARGIN = c("x", "y"), FUN = foo, idx = timeline) %>% + st_set_dimensions("foo", st_dimensions(raw)["time"]) stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's pr 16.133519 70.371665 84.55774 87.72969 101.94830 278.6427 7116 tas -2.354958 9.632157 15.32671 14.61650 19.99331 24.7976 7116 dimension(s): from to offset delta refsys values x/y time 1 12 NA NA POSIXct 1999-01-31,...,1999-12-31 x 1 81 -85 0.125 NA NULL [x] y 1 33 37.12 -0.125 NA NULL [y] > > proc.time() user system elapsed 1.46 0.18 1.62 stars/tests/extract.R0000644000176200001440000000641614144045432014355 0ustar liggesusers# Create 'stars' object set.seed(1331) suppressPackageStartupMessages(library(stars)) volcano = rbind(volcano, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA) # add NA rows d = st_dimensions(x = 1:ncol(volcano), y = 1:nrow(volcano)) (r = st_as_stars(t(volcano))) r = st_set_dimensions(r, 1, offset = 0, delta = 1) r = st_set_dimensions(r, 2, offset = nrow(volcano), delta = -1) # Create points pnt = st_sample(st_as_sfc(st_bbox(r)), 100) pnt = st_as_sf(pnt) # Extract - 'st_join' x = st_join(pnt, st_as_sf(r)) # Extract - 'st_extract' y = st_extract(r, pnt) # check there are NA's: any(is.na(x)) # Compare all.equal(x$A1, y[[1]]) ################################################ if (FALSE) { ## tic: segfaults # check equal results with stars_proxy: #x = st_extract(stars:::st_as_stars_proxy(r), pnt) #all.equal(x$A1, y[[1]]) #all.equal(x, y) r = c(r, 2*r, 10*r) x = st_join(pnt, st_as_sf(r)) y = st_as_sf(st_extract(r, pnt)) all.equal(x, y) ## tic: segfaults #x = st_extract(stars:::st_as_stars_proxy(merge(r)), pnt) #all.equal(st_as_sf(x), y) tif = system.file("tif/L7_ETMs.tif", package = "stars") xp = read_stars(tif, proxy = TRUE) xm = read_stars(tif, proxy = FALSE) pts = st_sample(st_as_sfc(st_bbox(xp)), 10) pts = c(pts, st_as_sfc("POINT(0 0)"), pts) em = st_extract(xm, pts) if (utils::packageVersion("sf") >= "0.9-7") { ep = st_extract(xp, pts) print(all.equal(ep, em, check.attributes = TRUE)) } # two-attribute objects: library(stars) tif = system.file("tif/L7_ETMs.tif", package = "stars") xp = read_stars(c(tif, tif), proxy = TRUE) xm = read_stars(c(tif, tif), proxy = FALSE) pts = st_sample(st_as_sfc(st_bbox(xp)), 10) pts = c(pts, st_as_sfc("POINT(0 0)"), pts) em = st_extract(xm, pts) if (utils::packageVersion("sf") >= "0.9-7") { ep = st_extract(xp, pts) print(all.equal(ep, em, check.attributes = TRUE)) } # single-attribute, single raster objects: tif1 = paste0(tempfile(), ".tif") write_stars(xm[1,,,1], "x.tif") xp = read_stars("x.tif", proxy = TRUE) xm = read_stars("x.tif", proxy = FALSE) em = st_extract(xm, pts) if (utils::packageVersion("sf") >= "0.9-7") { ep = st_extract(xp, pts) print(all.equal(ep, em, check.attributes = TRUE)) } # multiple-file attributes: x = c( "avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc" ) file_list = system.file(paste0("netcdf/", x), package = "starsdata") if (!identical(file_list, "")) { y = read_stars(file_list, quiet = TRUE) print(y) st_crs(y) = "OGC:CRS84" pts = st_sample(st_as_sfc(st_bbox(y)), 10) em = st_extract(y, pts) (y = read_stars(file_list, quiet = TRUE, proxy = TRUE)) print(y) st_crs(y) = "OGC:CRS84" if (utils::packageVersion("sf") >= "0.9-7") { ep = st_extract(y, pts) print(all.equal(em, ep)) } } # nearest & bilinear comparison: if (utils::packageVersion("sf") >= "0.9-7") { set.seed(12331) s = st_as_stars(matrix(rnorm(16), 4)) pts = st_sample(st_as_sfc(st_bbox(s)), 10000, type = "regular") s1 = st_extract(s, pts, bilinear = FALSE) s2 = st_extract(s, pts, bilinear = TRUE) s1$s2 = s2[[1]] names(s1)[c(1,3)] = c("nearest", "bilinear") print(s1[sample(10000, 5),]) } } stars/tests/downsample.R0000644000176200001440000000070614576033423015056 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) m = matrix(1:121, 11, 11) m s = st_as_stars(m) st_downsample(s, 1) st_downsample(s, 1)[[1]] st_downsample(s, 1, offset = 1) st_downsample(s, 1, offset = 1)[[1]] st_downsample(s, 1, FUN = mean) st_downsample(s, 1, FUN = mean)[[1]] st_downsample(s, 1, offset = 1, FUN = mean) st_downsample(s, 1, offset = c(0,1), FUN = mean)[[1]] st_downsample(s, 1, offset = c(0,1)) st_downsample(s, 1, offset = c(0,1))[[1]] stars/tests/nc.Rout.save0000644000176200001440000002473614644736040015004 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # examples with the sf::nc polygon dataset NOT ABOUT NETCDF's, see e.g. stars.R netcdf.R > suppressPackageStartupMessages(library(sf)) > nc = read_sf(system.file("gpkg/nc.gpkg", package="sf")) > m = st_set_geometry(nc, NULL) > n = as.matrix(m[c("BIR74", "SID74", "NWBIR74", "BIR79", "SID79", "NWBIR79")]) > dim(n) = c(county = 100, var = 3, year = 2) > dimnames(n) = list(county = nc$NAME, var = c("BIR", "SID", "NWBIR"), year = c(1974, 1979)) > suppressPackageStartupMessages(library(stars)) > (st = st_as_stars(pop = n)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 8 538 1657.032 1784 30757 dimension(s): from to values county 1 100 Ashe,...,Brunswick var 1 3 BIR , SID , NWBIR year 1 2 1974, 1979 > foo <- st %>% st_set_dimensions(1, st_geometry(nc)) # %>% st_set_dimensions(3, c(1974, 1979)) > st %>% st_set_dimensions(1, st_geometry(nc)) %>% st_set_dimensions(names = c("geometries", "var", "year")) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 8 538 1657.032 1784 30757 dimension(s): from to refsys point geometries 1 100 NAD27 FALSE var 1 3 NA NA year 1 2 NA NA values geometries MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... var BIR , SID , NWBIR year 1974, 1979 > foo stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 8 538 1657.032 1784 30757 dimension(s): from to refsys point county 1 100 NAD27 FALSE var 1 3 NA NA year 1 2 NA NA values county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... var BIR , SID , NWBIR year 1974, 1979 > st_bbox(foo) xmin ymin xmax ymax -84.32385 33.88199 -75.45698 36.58965 > (x = st_as_sf(foo)) Simple feature collection with 100 features and 6 fields Geometry type: MULTIPOLYGON Dimension: XY Bounding box: xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965 Geodetic CRS: NAD27 First 10 features: BIR.1974 SID.1974 NWBIR.1974 BIR.1979 SID.1979 NWBIR.1979 1 1091 1 10 1364 0 19 2 487 0 10 542 3 12 3 3188 5 208 3616 6 260 4 508 1 123 830 2 145 5 1421 9 1066 1606 3 1197 6 1452 7 954 1838 5 1237 7 286 0 115 350 2 139 8 420 0 254 594 2 371 9 968 4 748 1190 2 844 10 1612 1 160 2038 5 176 county 1 MULTIPOLYGON (((-81.47276 3... 2 MULTIPOLYGON (((-81.23989 3... 3 MULTIPOLYGON (((-80.45634 3... 4 MULTIPOLYGON (((-76.00897 3... 5 MULTIPOLYGON (((-77.21767 3... 6 MULTIPOLYGON (((-76.74506 3... 7 MULTIPOLYGON (((-76.00897 3... 8 MULTIPOLYGON (((-76.56251 3... 9 MULTIPOLYGON (((-78.30876 3... 10 MULTIPOLYGON (((-80.02567 3... > frac = function(x) x[2] / x[1] > frac2 = function(x) c(sidsr = x[2] / x[1], nwbr = x[3] / x[1]) > frac2an = function(x) c(x[2] / x[1], x[3] / x[1]) > st_apply(foo, c(1,3), frac) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. frac 0 0.001197874 0.001930504 0.002042241 0.002599348 0.00955414 dimension(s): from to refsys point county 1 100 NAD27 FALSE year 1 2 NA NA values county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... year 1974, 1979 > st_apply(foo, c(1,3), frac2) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 0.001923331 0.005119673 0.1567576 0.3065298 0.7727273 dimension(s): from to refsys point frac2 1 2 NA NA county 1 100 NAD27 FALSE year 1 2 NA NA values frac2 sidsr, nwbr county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... year 1974, 1979 > st_apply(foo, c(1,3), frac2an) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 0.001923331 0.005119673 0.1567576 0.3065298 0.7727273 dimension(s): from to refsys point frac2an 1 2 NA NA county 1 100 NAD27 FALSE year 1 2 NA NA values frac2an NULL county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... year 1974, 1979 > library(abind) > (x = aperm(st_apply(foo, c(1,3), frac2), c(2,3,1))) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 0.001923331 0.005119673 0.1567576 0.3065298 0.7727273 dimension(s): from to refsys point county 1 100 NAD27 FALSE year 1 2 NA NA frac2 1 2 NA NA values county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... year 1974, 1979 frac2 sidsr, nwbr > y = aperm(st_apply(foo, c(1,3), frac2), c("county","year","frac2")) > all.equal(st_dimensions(x), st_dimensions(y)) [1] TRUE > > split(foo, 2) stars object with 2 dimensions and 3 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. BIR 248 1176.75 2265 3761.770 4450.75 30757 SID 0 2.00 5 7.515 9.00 57 NWBIR 1 206.00 742 1201.810 1315.75 11631 dimension(s): from to refsys point county 1 100 NAD27 FALSE year 1 2 NA NA values county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... year 1974, 1979 > split(foo, 3) stars object with 2 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. 1974 0 8 501.5 1452.367 1580.50 21588 1979 0 9 614.0 1861.697 2040.25 30757 dimension(s): from to refsys point county 1 100 NAD27 FALSE var 1 3 NA NA values county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... var BIR , SID , NWBIR > > st_crs(foo) Coordinate Reference System: User input: NAD27 wkt: GEOGCRS["NAD27", DATUM["North American Datum 1927", ELLIPSOID["Clarke 1866",6378206.4,294.978698213898, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], USAGE[ SCOPE["Geodesy."], AREA["North and central America: Antigua and Barbuda - onshore. Bahamas - onshore plus offshore over internal continental shelf only. Belize - onshore. British Virgin Islands - onshore. Canada onshore - Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Northwest Territories, Nova Scotia, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan and Yukon - plus offshore east coast. Cuba - onshore and offshore. El Salvador - onshore. Guatemala - onshore. Honduras - onshore. Panama - onshore. Puerto Rico - onshore. Mexico - onshore plus offshore east coast. Nicaragua - onshore. United States (USA) onshore and offshore - Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin and Wyoming - plus offshore . US Virgin Islands - onshore."], BBOX[7.15,167.65,83.17,-47.74]], ID["EPSG",4267]] > plot(foo) > > # subset vector cube: > foo[nc[1]] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. pop 0 8 538 1657.032 1784 30757 dimension(s): from to refsys point county 1 100 NAD27 FALSE var 1 3 NA NA year 1 2 NA NA values county MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572... var BIR , SID , NWBIR year 1974, 1979 > > proc.time() user system elapsed 1.31 0.21 1.50 stars/tests/spacetime.Rout.save0000644000176200001440000001655214644736040016353 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require(spacetime, quietly = TRUE)) { + set.seed(1331) + Sys.setenv(TZ="UTC") + example(STFDF) + + x = st_as_stars(stfdf) + xx = as(x, "STFDF") + + # as.xts.stars: + library(xts) + xts = as.xts(x) + st_as_stars(xts) + st_as_stars(xts, dimensions = st_dimensions(x)) + + library(sp) + pts = SpatialPoints(rbind(c(0,0), c(0,1), c(1,0), c(1,1))) + gridded(pts) = TRUE + + tm = xts(1:10, as.Date("2010-01-01")+0:9) + stfdf = STFDF(pts, tm, data.frame(foo = seq_len(length(pts) * length(tm)))) + x = st_as_stars(stfdf) + xx = as(x, "STFDF") + + x = st_as_stars(as(stfdf, "STSDF")) + } STFDF> sp = cbind(x = c(0,0,1), y = c(0,1,1)) STFDF> row.names(sp) = paste("point", 1:nrow(sp), sep="") STFDF> library(sp) STFDF> sp = SpatialPoints(sp) STFDF> time = as.POSIXct("2010-08-05")+3600*(10:13) STFDF> m = c(10,20,30) # means for each of the 3 point locations STFDF> mydata = rnorm(length(sp)*length(time),mean=rep(m, 4)) STFDF> IDs = paste("ID",1:length(mydata)) STFDF> mydata = data.frame(values = signif(mydata,3), ID=IDs) STFDF> stfdf = STFDF(sp, time, mydata) STFDF> stfdf An object of class "STFDF" Slot "data": values ID 1 9.38 ID 1 2 21.10 ID 2 3 29.80 ID 3 4 11.50 ID 4 5 19.80 ID 5 6 31.20 ID 6 7 10.40 ID 7 8 20.50 ID 8 9 29.80 ID 9 10 10.30 ID 10 11 21.40 ID 11 12 29.40 ID 12 Slot "sp": SpatialPoints: x y point1 0 0 point2 0 1 point3 1 1 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2010-08-05 10:00:00 1 2010-08-05 11:00:00 2 2010-08-05 12:00:00 3 2010-08-05 13:00:00 4 Slot "endTime": [1] "2010-08-05 11:00:00 UTC" "2010-08-05 12:00:00 UTC" [3] "2010-08-05 13:00:00 UTC" "2010-08-05 14:00:00 UTC" STFDF> stfdf[1:2,] An object of class "STFDF" Slot "data": values ID 1 9.38 ID 1 2 21.10 ID 2 3 11.50 ID 4 4 19.80 ID 5 5 10.40 ID 7 6 20.50 ID 8 7 10.30 ID 10 8 21.40 ID 11 Slot "sp": SpatialPoints: x y point1 0 0 point2 0 1 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2010-08-05 10:00:00 1 2010-08-05 11:00:00 2 2010-08-05 12:00:00 3 2010-08-05 13:00:00 4 Slot "endTime": [1] "2010-08-05 11:00:00 UTC" "2010-08-05 12:00:00 UTC" [3] "2010-08-05 13:00:00 UTC" "2010-08-05 14:00:00 UTC" STFDF> stfdf[,1:2] An object of class "STFDF" Slot "data": values ID 1 9.38 ID 1 2 21.10 ID 2 3 29.80 ID 3 4 11.50 ID 4 5 19.80 ID 5 6 31.20 ID 6 Slot "sp": SpatialPoints: x y point1 0 0 point2 0 1 point3 1 1 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2010-08-05 10:00:00 1 2010-08-05 11:00:00 2 Slot "endTime": [1] "2010-08-05 11:00:00 UTC" "2010-08-05 12:00:00 UTC" STFDF> stfdf[,,2] An object of class "STFDF" Slot "data": ID 1 ID 1 2 ID 2 3 ID 3 4 ID 4 5 ID 5 6 ID 6 7 ID 7 8 ID 8 9 ID 9 10 ID 10 11 ID 11 12 ID 12 Slot "sp": SpatialPoints: x y point1 0 0 point2 0 1 point3 1 1 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2010-08-05 10:00:00 1 2010-08-05 11:00:00 2 2010-08-05 12:00:00 3 2010-08-05 13:00:00 4 Slot "endTime": [1] "2010-08-05 11:00:00 UTC" "2010-08-05 12:00:00 UTC" [3] "2010-08-05 13:00:00 UTC" "2010-08-05 14:00:00 UTC" STFDF> stfdf[,,"values"] An object of class "STFDF" Slot "data": values 1 9.38 2 21.10 3 29.80 4 11.50 5 19.80 6 31.20 7 10.40 8 20.50 9 29.80 10 10.30 11 21.40 12 29.40 Slot "sp": SpatialPoints: x y point1 0 0 point2 0 1 point3 1 1 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2010-08-05 10:00:00 1 2010-08-05 11:00:00 2 2010-08-05 12:00:00 3 2010-08-05 13:00:00 4 Slot "endTime": [1] "2010-08-05 11:00:00 UTC" "2010-08-05 12:00:00 UTC" [3] "2010-08-05 13:00:00 UTC" "2010-08-05 14:00:00 UTC" STFDF> stfdf[1,] values ID timeIndex 2010-08-05 10:00:00 9.38 ID 1 1 2010-08-05 11:00:00 11.50 ID 4 2 2010-08-05 12:00:00 10.40 ID 7 3 2010-08-05 13:00:00 10.30 ID 10 4 STFDF> stfdf[,2] coordinates values ID 1 (0, 0) 11.5 ID 4 2 (0, 1) 19.8 ID 5 3 (1, 1) 31.2 ID 6 STFDF> as(stfdf[,,1], "xts") point1 point2 point3 2010-08-05 10:00:00 9.38 21.1 29.8 2010-08-05 11:00:00 11.50 19.8 31.2 2010-08-05 12:00:00 10.40 20.5 29.8 2010-08-05 13:00:00 10.30 21.4 29.4 STFDF> as(stfdf[,,2], "xts") point1 point2 point3 2010-08-05 10:00:00 ID 1 ID 2 ID 3 2010-08-05 11:00:00 ID 4 ID 5 ID 6 2010-08-05 12:00:00 ID 7 ID 8 ID 9 2010-08-05 13:00:00 ID 10 ID 11 ID 12 STFDF> # examples for [[, [[<-, $ and $<- STFDF> stfdf[[1]] [1] 9.38 21.10 29.80 11.50 19.80 31.20 10.40 20.50 29.80 10.30 21.40 29.40 STFDF> stfdf[["values"]] [1] 9.38 21.10 29.80 11.50 19.80 31.20 10.40 20.50 29.80 10.30 21.40 29.40 STFDF> stfdf[["newVal"]] <- rnorm(12) STFDF> stfdf$ID [1] "ID 1" "ID 2" "ID 3" "ID 4" "ID 5" "ID 6" "ID 7" "ID 8" "ID 9" [10] "ID 10" "ID 11" "ID 12" STFDF> stfdf$ID = paste("OldIDs", 1:12, sep="") STFDF> stfdf$NewID = paste("NewIDs", 12:1, sep="") STFDF> stfdf An object of class "STFDF" Slot "data": values ID newVal NewID 1 9.38 OldIDs1 -0.3125824 NewIDs12 2 21.10 OldIDs2 -1.0536246 NewIDs11 3 29.80 OldIDs3 -0.7188880 NewIDs10 4 11.50 OldIDs4 -1.0525404 NewIDs9 5 19.80 OldIDs5 -0.8441413 NewIDs8 6 31.20 OldIDs6 1.1420848 NewIDs7 7 10.40 OldIDs7 1.9479070 NewIDs6 8 20.50 OldIDs8 -0.4512836 NewIDs5 9 29.80 OldIDs9 0.6695716 NewIDs4 10 10.30 OldIDs10 0.1269003 NewIDs3 11 21.40 OldIDs11 -0.7273297 NewIDs2 12 29.40 OldIDs12 -0.8151803 NewIDs1 Slot "sp": SpatialPoints: x y point1 0 0 point2 0 1 point3 1 1 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2010-08-05 10:00:00 1 2010-08-05 11:00:00 2 2010-08-05 12:00:00 3 2010-08-05 13:00:00 4 Slot "endTime": [1] "2010-08-05 11:00:00 UTC" "2010-08-05 12:00:00 UTC" [3] "2010-08-05 13:00:00 UTC" "2010-08-05 14:00:00 UTC" STFDF> x = stfdf[stfdf[1:2,],] STFDF> all.equal(x, stfdf[1:2,]) [1] TRUE STFDF> all.equal(stfdf, stfdf[stfdf,]) # converts character to factor... [1] TRUE Loading required package: zoo Attaching package: 'zoo' The following objects are masked from 'package:base': as.Date, as.Date.numeric only the first attribute will used; maybe use merge() first? > > proc.time() user system elapsed 1.78 0.23 1.95 stars/tests/area.R0000644000176200001440000000177114353574021013615 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) (a = st_area(x[,1:5,1:5])) m = matrix(1:20, nrow = 5, ncol = 4) x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) # image(r, axes = TRUE, col = grey((1:20)/20)) (a = st_area(r)) #plot(a, axes = TRUE) s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata") if (s5p != "") { nit.c = read_stars(s5p, sub = "//PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column", curvilinear = c("//PRODUCT/longitude", "//PRODUCT/latitude"), driver = NULL) if (inherits(nit.c[[1]], "units")) nit.c[[1]] = units::drop_units(nit.c[[1]]) nit.c[[1]][nit.c[[1]] > 9e+36] = NA st_crs(nit.c) = 4326 print((a <- st_area(nit.c[,1:5,1:5]))) # plot(a, axes = TRUE, border = NA) } stars/tests/sf.Rout.save0000644000176200001440000001401414644736040015000 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > library(sf) > #jp2 = system.file("jp2/B01.jp2", package = "stars") > #(x = read_stars(jp2, options = c("OVERVIEW_LEVEL=3"))) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > #(x = read_stars(tif, options = c("OVERVIEW_LEVEL=3"))) # FIXME: breaks on windows > (x = read_stars(tif)[,1:20,1:20]) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 17 44 58 58.19667 70 130 dimension(s): from to offset delta refsys point x/y x 1 20 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 20 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > # names(x) = "L7_ETM" > > # library(abind) > # x = adrop(x) > image(x) > (sfc = st_as_sfc(x, as_points = FALSE)) Geometry set for 400 features Geometry type: POLYGON Dimension: XY Bounding box: xmin: 288776.3 ymin: 9120191 xmax: 289346.3 ymax: 9120761 Projected CRS: SIRGAS 2000 / UTM zone 25S First 5 geometries: POLYGON ((288776.3 9120761, 288804.8 9120761, 2... POLYGON ((288804.8 9120761, 288833.3 9120761, 2... POLYGON ((288833.3 9120761, 288861.8 9120761, 2... POLYGON ((288861.8 9120761, 288890.3 9120761, 2... POLYGON ((288890.3 9120761, 288918.8 9120761, 2... > plot(sfc, add =TRUE) > (sfc = st_as_sfc(x, as_points = TRUE)) Geometry set for 400 features Geometry type: POINT Dimension: XY Bounding box: xmin: 288790.5 ymin: 9120205 xmax: 289332 ymax: 9120747 Projected CRS: SIRGAS 2000 / UTM zone 25S First 5 geometries: POINT (288790.5 9120747) POINT (288819 9120747) POINT (288847.5 9120747) POINT (288876 9120747) POINT (288904.5 9120747) > plot(sfc, add = TRUE) > > sf = st_as_sf(x, as_points = FALSE) > plot(sf, border = NA) > sf = st_as_sf(x[,,,1], as_points = FALSE, merge = TRUE) > plot(sf, border = NA) > > sfc1 <- st_as_sfc(x, as_points = TRUE, use_cpp = TRUE, na.rm = FALSE) > sfc2 <- st_as_sfc(x, as_points = TRUE, use_cpp = FALSE) > identical(sfc1, sfc2) [1] TRUE > > sfc1 <- st_as_sfc(x, as_points = FALSE, use_cpp = TRUE, na.rm = FALSE) > sfc2 <- st_as_sfc(x, as_points = FALSE, use_cpp = FALSE) > identical(sfc1, sfc2) [1] TRUE > > # sf -> stars -> sf > x = st_sfc(st_point(0:1), st_point(1:2), st_point(2:3)) > m = matrix(1:9,3) > colnames(m) = c("a", "b", "c") > foo = st_sf(m, geom = x) > x = st_as_stars(foo) > c(x) stars object with 1 dimensions and 3 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a 1 1.5 2 2 2.5 3 b 4 4.5 5 5 5.5 6 c 7 7.5 8 8 8.5 9 dimension(s): from to point values geom 1 3 TRUE POINT (0 1),...,POINT (2 3) > st_redimension(x) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a.b.c 1 3 5 5 7 9 dimension(s): from to point values geom 1 3 TRUE POINT (0 1),...,POINT (2 3) new_dim 1 3 NA a, b, c > c(x, x) stars object with 1 dimensions and 6 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a 1 1.5 2 2 2.5 3 b 4 4.5 5 5 5.5 6 c 7 7.5 8 8 8.5 9 a.1 1 1.5 2 2 2.5 3 b.1 4 4.5 5 5 5.5 6 c.1 7 7.5 8 8 8.5 9 dimension(s): from to point values geom 1 3 TRUE POINT (0 1),...,POINT (2 3) > (y = st_redimension(x, along = list(time = as.Date("2017-11-27") + 0:2))) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a.b.c 1 3 5 5 7 9 dimension(s): from to offset delta refsys point values geom 1 3 NA NA NA TRUE POINT (0 1),...,POINT (2 3) time 1 3 2017-11-27 1 days Date NA NULL > st_as_sf(y) Simple feature collection with 3 features and 3 fields Geometry type: POINT Dimension: XY Bounding box: xmin: 0 ymin: 1 xmax: 2 ymax: 3 CRS: NA 2017-11-27 2017-11-28 2017-11-29 geom 1 1 4 7 POINT (0 1) 2 2 5 8 POINT (1 2) 3 3 6 9 POINT (2 3) > st_as_sf(st_as_stars(foo)) Simple feature collection with 3 features and 3 fields Geometry type: POINT Dimension: XY Bounding box: xmin: 0 ymin: 1 xmax: 2 ymax: 3 CRS: NA a b c geom 1 1 4 7 POINT (0 1) 2 2 5 8 POINT (1 2) 3 3 6 9 POINT (2 3) > > c(x,x,along=1) # NEEDS FIXING! stars object with 1 dimensions and 3 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a 1 1.25 2 2 2.75 3 b 4 4.25 5 5 5.75 6 c 7 7.25 8 8 8.75 9 dimension(s): from to point values geom 1 6 TRUE POINT (0 1),...,POINT (2 3) > # st_as_stars.sfc > st_as_stars(st_geometry(st_as_sf(y)), nx = 10, ny = 10, as_points = FALSE) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. values 0 0 0 0.06 0 1 dimension(s): from to offset delta x/y x 1 10 0 0.2 [x] y 1 10 3 -0.2 [y] > > proc.time() user system elapsed 1.03 0.18 1.21 stars/tests/aggregate.Rout.save0000644000176200001440000002015014644736040016314 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > ## IGNORE_RDIFF_BEGIN > library(stars) Loading required package: abind Loading required package: sf Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE > ## IGNORE_RDIFF_END > > if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require(spacetime, quietly = TRUE)) { + data(air) # this loads several datasets in .GlobalEnv + dim(air) + d = st_dimensions(station = st_set_crs(st_as_sfc(stations), 4326), time = dates) + + blocks = st_make_grid(st_as_sfc("POLYGON ((5.871619 47.26986, 15.03811 47.26986, 15.03811 55.05653, 5.871619 55.05653, 5.871619 47.26986))", crs = 4326), + n = c(3,3)) + + print(aq <- st_as_stars(list(PM10 = air), dimensions = d)) + print(a <- aggregate(aq, blocks, mean, na.rm = TRUE)) + } stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's PM10 0 9.921 14.792 17.69728 21.992 274.333 157659 dimension(s): from to offset delta refsys point station 1 70 NA NA WGS 84 TRUE time 1 4383 1998-01-01 1 days Date FALSE values station POINT (9.585911 53.67057),...,POINT (9.446661 49.24068) time NULL stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's PM10 1 11 15.57425 18.1715 22.17197 183.271 8429 dimension(s): from to offset delta refsys point geometry 1 9 NA NA WGS 84 FALSE time 1 4383 1998-01-01 1 days Date FALSE values geometry POLYGON ((5.871619 47.269...,...,POLYGON ((11.98261 52.460... time NULL > > # adapted from ?read_stars: > m = array(1:720, dim = c(x = 10, y = 12, t = 6)) # named dim > st = st_as_stars(m) > attr(st, "dimensions")$y$delta = -1 > attr(st, "dimensions")$y$offset = 12 > tm = as.Date("2019-02-19") + 1:6 > st = st_set_crs(st_set_dimensions(st, 3, values = tm), 4326) > > tmp = tempfile(fileext = ".tif") > write_stars(st, tmp) > > (red <- setNames(read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXsize = 10, nYSize = 12, + nBufXSize = 2, nBufYSize = 2)), "foo")) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 33 199.25 365.5 365.5 531.75 698 dimension(s): from to offset delta refsys point x/y x 1 2 0 5 WGS 84 FALSE [x] y 1 2 12 -6 WGS 84 FALSE [y] band 1 6 NA NA NA NA > > sfc = st_set_crs(st_as_sfc(red, as_points = FALSE), st_crs(st)) > (a = aggregate(st, st_sf(a = 1, geom = sfc), mean)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 28 194.25 360.5 360.5 526.75 693 dimension(s): from to offset delta refsys point geom 1 4 NA NA WGS 84 FALSE t 1 6 2019-02-20 1 days Date FALSE values geom POLYGON ((0 12, 5 12, 5 6...,...,POLYGON ((5 6, 10 6, 10 0... t NULL > (a = aggregate(st, sfc, mean)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 28 194.25 360.5 360.5 526.75 693 dimension(s): from to offset delta refsys point geometry 1 4 NA NA WGS 84 FALSE t 1 6 2019-02-20 1 days Date FALSE values geometry POLYGON ((0 12, 5 12, 5 6...,...,POLYGON ((5 6, 10 6, 10 0... t NULL > if (require(raster)) { + print(a <- aggregate(st, sfc, mean, exact = TRUE)) + print(a[[1]]) + print(sum(a[[1]])*30 == sum(1:720)) + } Loading required package: raster stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 28 194.25 360.5 360.5 526.75 693 dimension(s): from to offset delta refsys point geometry 1 4 NA NA WGS 84 FALSE t 1 6 2019-02-20 1 days Date FALSE values geometry POLYGON ((0 12, 5 12, 5 6...,...,POLYGON ((5 6, 10 6, 10 0... t NULL [,1] [,2] [,3] [,4] [,5] [,6] [1,] 28 148 268 388 508 628 [2,] 33 153 273 393 513 633 [3,] 88 208 328 448 568 688 [4,] 93 213 333 453 573 693 [1] TRUE > > tm0 = as.Date("2019-02-19") + -1:8 > (a = aggregate(st, tm0, mean, na.rm = TRUE)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's A1 1 180.75 360.5 360.5 540.25 720 480 dimension(s): from to offset delta refsys point x/y time 1 10 2019-02-18 1 days Date NA x 1 10 0 1 WGS 84 FALSE [x] y 1 12 12 -1 WGS 84 FALSE [y] > (a = aggregate(st, "days", mean, na.rm = TRUE)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 180.75 360.5 360.5 540.25 720 dimension(s): from to offset delta refsys point x/y time 1 6 2019-02-20 1 days Date NA x 1 10 0 1 WGS 84 FALSE [x] y 1 12 12 -1 WGS 84 FALSE [y] > yd = function(x) as.POSIXlt(x)$yday > (a = aggregate(st, yd, mean, na.rm = TRUE)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 180.75 360.5 360.5 540.25 720 dimension(s): from to offset delta refsys point values x/y geometry 1 6 NA NA NA NA 50,...,55 x 1 10 0 1 WGS 84 FALSE NULL [x] y 1 12 12 -1 WGS 84 FALSE NULL [y] > > # with "by" geometry not overlapping x > pt = st_point(c(-10,-10)) > (sfc = c(sfc, st_sfc(pt, crs = st_crs(sfc)))) Geometry set for 5 features Geometry type: GEOMETRY Dimension: XY Bounding box: xmin: -10 ymin: -10 xmax: 10 ymax: 12 Geodetic CRS: WGS 84 POLYGON ((0 12, 5 12, 5 6, 0 6, 0 12)) POLYGON ((5 12, 10 12, 10 6, 5 6, 5 12)) POLYGON ((0 6, 5 6, 5 0, 0 0, 0 6)) POLYGON ((5 6, 10 6, 10 0, 5 0, 5 6)) POINT (-10 -10) > (a = aggregate(st, sfc, mean)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's A1 28 194.25 360.5 360.5 526.75 693 6 dimension(s): from to offset delta refsys point geometry 1 5 NA NA WGS 84 FALSE t 1 6 2019-02-20 1 days Date FALSE values geometry POLYGON ((0 12, 5 12, 5 6...,...,POINT (-10 -10) t NULL > (a = aggregate(st, st, mean)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 180.75 360.5 360.5 540.25 720 dimension(s): from to offset delta refsys point geometry 1 120 NA NA WGS 84 FALSE t 1 6 2019-02-20 1 days Date FALSE values geometry POLYGON ((0 12, 1 12, 1 1...,...,POLYGON ((9 1, 10 1, 10 0... t NULL > > proc.time() user system elapsed 5.67 0.43 6.12 stars/tests/plot.Rout.save0000644000176200001440000000411714644736040015351 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require(spacetime, quietly = TRUE)) { + data(air) # this loads several datasets in .GlobalEnv + dim(air) + d = st_dimensions(station = st_as_sfc(stations), time = dates) + aq = st_as_stars(list(PM10 = air), dimensions = d) + image(aperm(log(aq), 2:1), main = "NA pattern (white) in PM10 station time series") + st_geometry(aq) + } Geometry set for 70 features Geometry type: POINT Dimension: XY Bounding box: xmin: 6.28107 ymin: 47.80847 xmax: 14.78617 ymax: 54.92497 Geodetic CRS: +proj=longlat +datum=WGS84 +no_defs First 5 geometries: POINT (9.585911 53.67057) POINT (9.68503 53.52418) POINT (9.791584 54.07312) POINT (13.64701 52.44775) POINT (13.29635 52.65315) > > csv = system.file("tif/ESACCI-LC-Legend.csv", package = "starsdata") > if (csv != "") { + rgb = read.csv(csv, header = TRUE, sep = ";") + luc = read_stars(system.file("tif/LUC3.tif", package = "starsdata")) + plot(luc, rgb = rgb, axes = TRUE, key.pos = NULL) + } > > # https://github.com/r-spatial/stars/issues/233 : > nc = read_sf(system.file("shape/nc.shp", package = "sf")) > output = st_as_stars(st_bbox(nc), nx = 1, ny = 1, values = 1) > plot(output) Warning message: In plot.stars(output) : breaks="quantile" leads to a single class; maybe try breaks="equal" instead? > > proc.time() user system elapsed 1.89 0.37 2.25 stars/tests/tidy.Rout.save0000644000176200001440000000526014644736040015344 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > > if (require(dplyr, quietly = TRUE)) { + tif = system.file("tif/L7_ETMs.tif", package = "stars") + x <- read_stars(tif) + (y <- x %>% select(L7_ETMs.tif)) + (y <- x %>% filter(band > 2)) + (z <- x %>% mutate(foo = 2* L7_ETMs.tif)) + x %>% pull(L7_ETMs.tif) %>% class() + x %>% filter(x > 289900) + x %>% slice("x", 50:100) + + suppressPackageStartupMessages(library(ggplot2)) + ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + ggplot() + geom_stars(data = x[,c(1:50,52:100),c(1:45, 50:60)]) + + coord_equal() + ggplot() + geom_stars(data = x[,1:10,1:10,1:2], sf = TRUE) + facet_wrap(~band) + + + # see https://github.com/r-spatial/stars/issues/539 : + x <- read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) + y <- transmute(x, L7_ETMs.tif = units::set_units(L7_ETMs.tif, degree_C)) # same as x but with units + + x - slice(x, 'band', 1) # runs as expected, recycling the second object + try(y - slice(x, 'band', 1)) # fails as expected because x is unitless + try(x - slice(y, 'band', 1)) # fails as expected + y - slice(y, 'band', 1) # runs as expected + } Attaching package: 'dplyr' The following objects are masked from 'package:stats': filter, lag The following objects are masked from 'package:base': intersect, setdiff, setequal, union Error in Ops.units(X[[i]], ...) : both operands of the expression should be "units" objects Error in Ops.units(X[[i]], ...) : both operands of the expression should be "units" objects stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif [°C] -184 -19 -8 -10.2353 0 131 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > > proc.time() user system elapsed 1.29 0.14 1.42 stars/tests/sf.R0000644000176200001440000000257614536637433013333 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) library(sf) #jp2 = system.file("jp2/B01.jp2", package = "stars") #(x = read_stars(jp2, options = c("OVERVIEW_LEVEL=3"))) tif = system.file("tif/L7_ETMs.tif", package = "stars") #(x = read_stars(tif, options = c("OVERVIEW_LEVEL=3"))) # FIXME: breaks on windows (x = read_stars(tif)[,1:20,1:20]) # names(x) = "L7_ETM" # library(abind) # x = adrop(x) image(x) (sfc = st_as_sfc(x, as_points = FALSE)) plot(sfc, add =TRUE) (sfc = st_as_sfc(x, as_points = TRUE)) plot(sfc, add = TRUE) sf = st_as_sf(x, as_points = FALSE) plot(sf, border = NA) sf = st_as_sf(x[,,,1], as_points = FALSE, merge = TRUE) plot(sf, border = NA) sfc1 <- st_as_sfc(x, as_points = TRUE, use_cpp = TRUE, na.rm = FALSE) sfc2 <- st_as_sfc(x, as_points = TRUE, use_cpp = FALSE) identical(sfc1, sfc2) sfc1 <- st_as_sfc(x, as_points = FALSE, use_cpp = TRUE, na.rm = FALSE) sfc2 <- st_as_sfc(x, as_points = FALSE, use_cpp = FALSE) identical(sfc1, sfc2) # sf -> stars -> sf x = st_sfc(st_point(0:1), st_point(1:2), st_point(2:3)) m = matrix(1:9,3) colnames(m) = c("a", "b", "c") foo = st_sf(m, geom = x) x = st_as_stars(foo) c(x) st_redimension(x) c(x, x) (y = st_redimension(x, along = list(time = as.Date("2017-11-27") + 0:2))) st_as_sf(y) st_as_sf(st_as_stars(foo)) c(x,x,along=1) # NEEDS FIXING! # st_as_stars.sfc st_as_stars(st_geometry(st_as_sf(y)), nx = 10, ny = 10, as_points = FALSE) stars/tests/ee.Rout.save0000644000176200001440000000303314644736040014760 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > # show that extract with exact=TRUE equals st_interpolate_aw(), only much faster > options(digits=15) > suppressPackageStartupMessages(library(stars)) > L = st_as_stars(L7_ETMs)[,,,1] > set.seed(123432) > st_bbox(L) |> + st_as_sfc() |> + st_centroid() |> + st_buffer(50) |> + st_sample(10) |> + st_combine() |> + st_convex_hull() -> ch > if (interactive()) { + plot(L, reset = FALSE) + plot(ch, add = TRUE, border = 'red', col = NA) + } > if (FALSE) { + e = st_extract(L, ch)[[1]] + a = aggregate(L, ch, mean)[[1]] + identical(e, a) # same code path + ee = aggregate(L, ch, mean, exact = TRUE)[[1]] + all.equal(e, ee) + aw = suppressWarnings(st_interpolate_aw(L, ch, extensive = FALSE)$V1) + all.equal(as.vector(ee), aw) + ee0 = st_extract(L, ch, exact = TRUE)[[1]] + all.equal(ee0, ee) # ?? + } > > proc.time() user system elapsed 0.73 0.07 0.81 stars/tests/tidy.R0000644000176200001440000000210614271153074013647 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) if (require(dplyr, quietly = TRUE)) { tif = system.file("tif/L7_ETMs.tif", package = "stars") x <- read_stars(tif) (y <- x %>% select(L7_ETMs.tif)) (y <- x %>% filter(band > 2)) (z <- x %>% mutate(foo = 2* L7_ETMs.tif)) x %>% pull(L7_ETMs.tif) %>% class() x %>% filter(x > 289900) x %>% slice("x", 50:100) suppressPackageStartupMessages(library(ggplot2)) ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) ggplot() + geom_stars(data = x[,c(1:50,52:100),c(1:45, 50:60)]) + coord_equal() ggplot() + geom_stars(data = x[,1:10,1:10,1:2], sf = TRUE) + facet_wrap(~band) # see https://github.com/r-spatial/stars/issues/539 : x <- read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) y <- transmute(x, L7_ETMs.tif = units::set_units(L7_ETMs.tif, degree_C)) # same as x but with units x - slice(x, 'band', 1) # runs as expected, recycling the second object try(y - slice(x, 'band', 1)) # fails as expected because x is unitless try(x - slice(y, 'band', 1)) # fails as expected y - slice(y, 'band', 1) # runs as expected } stars/tests/curvilinear.R0000644000176200001440000000341514353574021015225 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata") if (s5p != "") { lat_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/latitude") lon_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/longitude") nit_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column") lat = read_stars(lat_ds) lon = read_stars(lon_ds) nit = read_stars(nit_ds) nit[[1]][nit[[1]] > 9e+36] = NA ll = setNames(c(lon, lat), c("x", "y")) nit.c0 = st_as_stars(nit, curvilinear = ll) # more direct method: nit.c = read_stars(s5p, sub = "//PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column", curvilinear = c("//PRODUCT/longitude", "//PRODUCT/latitude"), driver = NULL) if (inherits(nit.c[[1]], "units")) nit.c[[1]] = units::drop_units(nit.c[[1]]) nit.c[[1]][nit.c[[1]] > 9e+36] = NA all.equal(nit.c0, nit.c) st_crs(nit.c) = 4326 print(nit.c) if (FALSE && capabilities()["png"]) { png("nit1.png", 800, 800) plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16) maps::map('world', add = TRUE, col = 'red') dev.off() png("nit2.png", 800, 800) plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA) maps::map('world', add = TRUE, col = 'red') dev.off() nit.c = stars:::st_downsample(nit.c, 8) print(nit.c) png("nit3.png", 800, 800) plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16) maps::map('world', add = TRUE, col = 'red') dev.off() png("nit4.png", 800, 800) plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA) maps::map('world', add = TRUE, col = 'red') dev.off() } } stars/tests/datasets.R0000644000176200001440000000020414271153074014503 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) bcsd_obs L7_ETMs if (require(starsdata, quietly = TRUE)) { print(stars_sentinel2) } stars/tests/spacetime.R0000644000176200001440000000121314452766315014657 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require(spacetime, quietly = TRUE)) { set.seed(1331) Sys.setenv(TZ="UTC") example(STFDF) x = st_as_stars(stfdf) xx = as(x, "STFDF") # as.xts.stars: library(xts) xts = as.xts(x) st_as_stars(xts) st_as_stars(xts, dimensions = st_dimensions(x)) library(sp) pts = SpatialPoints(rbind(c(0,0), c(0,1), c(1,0), c(1,1))) gridded(pts) = TRUE tm = xts(1:10, as.Date("2010-01-01")+0:9) stfdf = STFDF(pts, tm, data.frame(foo = seq_len(length(pts) * length(tm)))) x = st_as_stars(stfdf) xx = as(x, "STFDF") x = st_as_stars(as(stfdf, "STSDF")) } stars/tests/warp.Rout.save0000644000176200001440000001337114644736040015346 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > geomatrix = system.file("tif/geomatrix.tif", package = "stars") > x = read_stars(geomatrix) > # can stars reproduce what gdal does, by default? > x2 = st_warp(x, use_gdal = TRUE, no_data_value = -9999) > y = st_warp(x, x2) > if (interactive()) { plot(x2, breaks = "equal", axes=TRUE) } > if (interactive()) { plot(y, breaks = "equal", axes=TRUE) } > names(x2) = names(y) > all.equal(x2, y) # yes? [1] TRUE > > # does gdal reproduce with stars template object? > (x2 = setNames(st_warp(x, y, use_gdal = TRUE, no_data_value=-1), "file.tif")) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's file.tif 74 115 123 126.4289 132 255 224 dimension(s): from to offset delta refsys point x/y x 1 25 1840902 5.22 WGS 84 / UTM zone 11N FALSE [x] y 1 25 1144003 -5.22 WGS 84 / UTM zone 11N FALSE [y] > > # does gdal reproduce what stars does, default cell size? > (x2 = st_warp(x, crs = st_crs(x), use_gdal = FALSE)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's geomatrix.tif 74 115 123 126.4289 132 255 224 dimension(s): from to offset delta refsys x/y x 1 25 1840902 5.22 WGS 84 / UTM zone 11N [x] y 1 25 1144003 -5.22 WGS 84 / UTM zone 11N [y] > (y = setNames(st_warp(x, x2, use_gdal = TRUE, debug = FALSE, no_data_value=-1), "file.tif")) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's file.tif 74 115 123 126.4289 132 255 224 dimension(s): from to offset delta refsys point x/y x 1 25 1840902 5.22 WGS 84 / UTM zone 11N FALSE [x] y 1 25 1144003 -5.22 WGS 84 / UTM zone 11N FALSE [y] > > # try with multiple bands: > tif = system.file("tif/L7_ETMs.tif", package = "stars") > (x1 = read_stars(tif)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > tifcp = tempfile(fileext = ".tif") > file.copy(tif, tifcp) [1] TRUE > x1p = read_stars(tifcp, proxy = TRUE) > st_dimensions(x1p) from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > (x1a = st_warp(x1, crs = st_crs(4326))) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's L7_ETMs.tif 1 54 69 68.93072 86 255 8778 dimension(s): from to offset delta refsys x/y x 1 350 -34.92 0.0002592 WGS 84 [x] y 1 352 -7.95 -0.0002592 WGS 84 [y] band 1 6 NA NA NA > (x1b = setNames(st_warp(x1, x1p, use_gdal = TRUE, no_data_value=-1), "file.tif")) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. file.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > > # does gdal reproduce what stars does? Smaller grid: > x2 = st_warp(x, crs = st_crs(x), use_gdal = FALSE, cellsize = 3) > # x2 = x2[,2:43,2:43] > if (interactive()) { plot(x2, breaks = "equal", axes=TRUE, reset = FALSE) } > if (interactive()) { plot(st_as_sfc(st_bbox(x2)), add = TRUE, col = NA, border = 'red') } > ### doesn't work: FIXME: check with more recent GDAL: > (y = setNames(st_warp(x, x2, use_gdal = TRUE, debug = FALSE, no_data_value=-1), "file.tif")) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's file.tif 74 107 123 126.6584 132 255 727 dimension(s): from to offset delta refsys point x/y x 1 44 1840902 3 WGS 84 / UTM zone 11N FALSE [x] y 1 44 1144003 -3 WGS 84 / UTM zone 11N FALSE [y] > if (interactive()) { plot(y, breaks = "equal") } > names(x2) = names(y) > # isTRUE(all.equal(x2, y, check.attributes=FALSE)) > m = mean(as.vector(x2[[1]]==y[[1]]), na.rm = TRUE) > u = unique(as.vector(x2[[1]]-y[[1]])) > > g = st_as_stars() > attr(g, "dimensions")$x$offset = 0 > g$values = as.vector(t(matrix(seq_len(prod(dim(g))), 180, 360))) > if (interactive()) { plot(g, axes=TRUE) } > a = st_warp(g, st_as_stars(), use_gdal=FALSE) > b = st_warp(g, st_as_stars(), use_gdal=TRUE, no_data_value = -1) > all.equal(a, b, check.attributes = FALSE) [1] TRUE > > proc.time() user system elapsed 1.54 0.21 1.76 stars/tests/mdim.Rout.save0000644000176200001440000001101414644736040015313 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > Sys.setenv(TZ="") > suppressPackageStartupMessages(library(stars)) > matrix(1:4,2) [,1] [,2] [1,] 1 3 [2,] 2 4 > m = matrix(1:4,2) > s = st_as_stars(m) > > s = st_set_dimensions(s, st_dimensions(s), xy = NULL) > sfc = st_sfc(st_point(0:1), st_point(3:2)) > s = st_set_dimensions(s, 1, sfc) |> st_set_crs(4326) > tm = as.POSIXct("2023-03-04 12:35") + c(0, 3600) > s = st_set_dimensions(s, 2, tm) > f = tempfile(fileext = ".nc") > write_mdim(s, f, as_float = FALSE) Warning messages: 1: In CPL_write_mdim(file, driver, dimx, cdl, wkt, xy, root_group_options, : GDAL Error 6: SetIndexingVariable() not implemented 2: In CPL_write_mdim(file, driver, dimx, cdl, wkt, xy, root_group_options, : GDAL Error 6: SetIndexingVariable() not implemented > s2 = read_mdim(f) > #print(s2) > print(all.equal(s, s2, check.attributes = FALSE)) [1] TRUE > print(all.equal(s, s2)) [1] "Attributes: < Component \"dimensions\": Component \"X1\": Component \"refsys\": Component \"input\": 1 string mismatch >" [2] "Attributes: < Component \"dimensions\": Component \"X1\": Component \"refsys\": Component \"wkt\": 1 string mismatch >" [3] "Attributes: < Component \"dimensions\": Component \"X1\": Component \"values\": Attributes: < Component \"crs\": Component \"input\": 1 string mismatch > >" [4] "Attributes: < Component \"dimensions\": Component \"X1\": Component \"values\": Attributes: < Component \"crs\": Component \"wkt\": 1 string mismatch > >" [5] "Attributes: < Component \"dimensions\": Component \"X2\": Component \"offset\": 'tzone' attributes are inconsistent ('' and 'UTC') >" [6] "Attributes: < Component \"dimensions\": Component \"X2\": Component \"point\": 'is.NA' value mismatch: 1 in current 0 in target >" > > st_crs(sfc) = st_crs(s2) > st_crs(s) = st_crs(s2) > tm = as.Date("2023-02-25") + 0:1 > sd = st_set_dimensions(s, 2, tm) > print(sd) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 1.75 2.5 2.5 3.25 4 dimension(s): from to offset delta refsys point values X1 1 2 NA NA WGS 84 TRUE POINT (0 1), POINT (3 2) X2 1 2 2023-02-25 1 days Date FALSE NULL > sd = st_set_dimensions(sd, 1, sfc) > print(sd) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 1.75 2.5 2.5 3.25 4 dimension(s): from to offset delta refsys point values X1 1 2 NA NA WGS 84 TRUE POINT (0 1), POINT (3 2) X2 1 2 2023-02-25 1 days Date FALSE NULL > f = tempfile(fileext = ".nc") > write_mdim(sd, f) Warning messages: 1: In CPL_write_mdim(file, driver, dimx, cdl, wkt, xy, root_group_options, : GDAL Error 6: SetIndexingVariable() not implemented 2: In CPL_write_mdim(file, driver, dimx, cdl, wkt, xy, root_group_options, : GDAL Error 6: SetIndexingVariable() not implemented > sd2 = read_mdim(f) > print(sd2) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. A1 1 1.75 2.5 2.5 3.25 4 dimension(s): from to offset delta refsys point values X1 1 2 NA NA WGS 84 TRUE POINT (0 1), POINT (3 2) X2 1 2 2023-02-25 1 days Date NA NULL > print(all.equal(sd, sd2, check.attributes = FALSE)) [1] TRUE > print(all.equal(sd, sd2)) [1] "Attributes: < Component \"dimensions\": Component \"X2\": Component \"point\": 'is.NA' value mismatch: 1 in current 0 in target >" > # if (.Platform$OS.type == "unix") { > # print(read_mdim(paste0("/vsizip/", (system.file("zarr/sic_daily_sample.zarr.zip", package = "stars")))) > # } > > proc.time() user system elapsed 0.51 0.23 0.73 stars/tests/write.Rout.save0000644000176200001440000000352614644736040015530 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > > tif = system.file("tif/L7_ETMs.tif", package = "stars") > (x = read_stars(tif)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > > # write stars object: > write_stars(x, tempfile(), driver = "GTiff") > > # write stars_proxy object: > (x = read_stars(tif, proxy = TRUE)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > write_stars(x, tempfile(), driver = "GTiff") > > proc.time() user system elapsed 0.76 0.15 0.92 stars/tests/crop.R0000644000176200001440000000220614453526025013644 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) xy = structure(list(x = c(293253.999046018, 296400.196497684), y = c(9113801.64775462, 9111328.49619133)), .Names = c("x", "y")) pts = st_as_sf(data.frame(do.call(cbind, xy)), coords = c("x", "y"), crs = st_crs(x)) image(x, axes = TRUE) plot(st_as_sfc(st_bbox(pts)), col = NA, add = TRUE) bb = st_bbox(pts) (xx = x[bb]) image(xx) plot(st_as_sfc(bb), add = TRUE, col = NA) st_contains(st_as_sfc(st_bbox(xx)), st_as_sfc(st_bbox(pts))) image(x) pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) buf = st_buffer(st_sfc(pt, crs = st_crs(x)), 1500) plot(buf, add = TRUE) buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), crs = st_crs(x)) image(x[buf]) plot(buf, add = TRUE, col = NA) image(x[buf,crop=FALSE]) plot(buf, add = TRUE, col = NA) plot(x, rgb = 1:3) # #638: l = st_as_stars(L7_ETMs) st_bbox(l) |> st_as_sfc() -> bb (bb + 1e6) |> st_set_crs(st_crs(l)) -> b st_crop(l, b) st_intersects(b, st_as_sfc(st_bbox(l))) |> as.matrix() (bb - 1e6) |> st_set_crs(st_crs(l)) -> b st_crop(l, b) stars/tests/raster.Rout.save0000644000176200001440000000754614644736040015704 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(rgdal_show_exportToProj4_warnings = "none") > suppressPackageStartupMessages(library(stars)) > > if (suppressPackageStartupMessages(require(sp, quietly = TRUE)) && require("raster", quietly = TRUE) && + suppressPackageStartupMessages(require("terra", quietly = TRUE))) { + + tif = system.file("tif/L7_ETMs.tif", package = "stars") + (x = read_stars(tif)) + (r = as(x, "Raster")) + (y = st_as_stars(r)) + + # single band: + x = adrop(x[,,,1]) + r = as(x, "Raster") + (y = st_as_stars(r)) + + # proxy: + (x = read_stars(tif, proxy = TRUE)) + (r = as(x, "Raster")) + (y = st_as_stars(r)) + (y2 = st_as_stars(r, proxy = TRUE)) + } stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > > if (require(terra, quietly = TRUE)) { + ## terra ------------- + stopifnot(require(terra)) + (x = read_stars(tif)) + (r = as(x, "SpatRaster")) + (y = st_as_stars(r)) + + # single band: + x = adrop(x[,,,1]) + r = as(x, "SpatRaster") + (y = st_as_stars(r)) + + # proxy: + (x = read_stars(tif, proxy = TRUE)) + (r = as(x, "SpatRaster")) + (y = st_as_stars(r)) + (y2 = st_as_stars(r, proxy = TRUE)) + + f = system.file("tif/lc.tif", package = "stars") + lc = read_stars(system.file("tif/lc.tif", package = "stars")) + levels(lc[[1]]) + r = rast(lc) + e = attr(lc[[1]], "exclude") + + if (packageVersion("terra") >= "1.5.48") { + + print(all.equal(terra::levels(r)[[1]][,2], terra::levels(rast(f))[[1]][!e,2])) + print(all.equal(terra::coltab(r)[[1]][!e,], terra::coltab(rast(f))[[1]][!e,], check.attributes = FALSE)) + + r<- rast(nrow=10, ncol=10) + set.seed(5) + values(r)<- sample(1:3, size = ncell(r), replace = TRUE) + levels(r) <- data.frame(ID=1:3, category = c("c1", "c2", "c3")) + + r2<- rast(nrow=10, ncol=10) + set.seed(6) + values(r2)<- sample(c(0,2,3), size = ncell(r2), replace = TRUE) + levels(r2) <- data.frame(ID=c(0,2,3), category = c("x1", "x2", "x3")) + + r3<- c(r,r2) + names(r3)<- c("lyr.1", "lyr.2") + + r3_stars<- st_as_stars(r3) + + st_redimension(r3_stars) |> print() + rast(r3_stars) |> levels() |> print() + + m = matrix(1:121, 11, 11) + bb = st_bbox(c(xmin=0, xmax=11, ymin=0, ymax=11)) + s = st_as_stars(bb, values = m) + r = rast(s) + aggregate(r, 2) |> st_as_stars() -> r.s + stopifnot(isTRUE(all.equal(r.s[,1:5,1:5], st_downsample(s, 1, FUN = mean)))) + } + } [1] TRUE [1] TRUE stars object with 3 dimensions and 1 attribute attribute(s): lyr.1.lyr.2 c1:34 c2:32 c3:34 x1:28 x2:37 x3:35 dimension(s): from to offset delta refsys values x/y x 1 10 -180 36 WGS 84 (CRS84) NULL [x] y 1 10 90 -18 WGS 84 (CRS84) NULL [y] new_dim 1 2 NA NA NA lyr.1, lyr.2 [[1]] IDs categories 1 1 c1 2 2 c2 3 3 c3 [[2]] IDs categories 1 0 x1 2 2 x2 3 3 x3 > > > proc.time() user system elapsed 6.21 0.35 6.51 stars/tests/testthat/0000755000176200001440000000000014645437762014432 5ustar liggesusersstars/tests/testthat/Rplots.pdf0000644000176200001440000024643614476142420016411 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20230906202918) /ModDate (D:20230906202918) /Title (R Graphics Output) /Producer (R 4.3.1) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 81095 /Filter /FlateDecode >> stream xK&<_QCNN'FRGbqju 5=/q9.$^Z;\v8~?~~3~i?o}?g>w_#ww*?#ݿ3?w~~T_g.?4|~~}?vʝ~W^&g~G3#4K&'<R/:krG]/W9@{~_'\+R5Q>ooxw#4krcFkrS)3'/krtW;{W Ot;_iI;7䌷twxP#^3?j'ߩ҈'@{Œ@P7w;ŷ,{ ‰H$a)sXvX?n͏[aDjIĢ:^2/+䌷tݔˬӾ7k`G/w퍰w\% ՒZvnH;Kw&F;Z(]>;ݹ_H&'< zVN?J_EG)7rB7 ]ƿ3=t2Uo~;XS}V;8{ϻ}ސ3{ߊ_oo^Z}xMn4 oohFkrvU`7䌷ᛳ7䌷M6^[ChO?^3ߺ/SooywMwpN=G;'a:K# ľsEb^qs>AoGָ9هHk5.N΃ *^qsym vXN֝YĉH$VsBl~8s;,8'kxf`ITG6I$v=kõQ\w >^lk|$ ݿ\#\lGL.pǓ}DG2^Ʒx^drmqbc H&X[5B-&g{{z=XxM> ؐpD 5e`һTK:Xg{>1FwXpnPhĦnHG%#\ eToGܗ8W'a^}#R-p(Xp׳J8<lH6]Xl0jQ'of>otsXv/OmYxMx;X7̜ 59{ +zyxC> {o 5HH87,Z|$ R(3^tuÇ>"䌷sÇRGL,& MW=7,& v~< 5LH'87O7eO%Ʃtxw(XpnX蕄841GXk/csS7#\|wwpog5wX Q,-R-;,8߫6seHsB`$:IXVIhT~͎ lӕyV~,Z^-)C燕G֦[q mތ-w~IJ-&g@#r 5T8?l|d g9Q5T8?|8%oGG`kra/\⪗ ^LuCqD885.xxCx;8peF^&^tJA?ސt}#^tL.}SxM>R^&c59`m|5HA8{hJ#]llyk.6ЈTxM>R*M@wv6R6xM>W?'8_0!#\lF`5L+'X분1xM> UZ`&?gs5 H `m >HtUzca@j$jz&FpG̨L 1hr%Z7_UKY]2ke'[ݝevIQǨ~xM>rW6 !g}4GrИ2xM>rHk[NpFƄ#^r5:45|ёӈ -XkkS 153R-d[;,8{)({%I`SfZ,8{ER-l~6i59C傀*{=o5 ;N5@-qr,z]Pʭv$ U7#Z|$ }Xcp& u\Ā\;8{#(e1|$ =T#BxM>G<%#\Mo5L0'XCoi(R|&Uz}-{xC> Л ^ &2c^3/^pF^sud]O^fEwXpk'nOj$ ըqR H$1Wxks`K㤀Hbzx7#\8왓A 1 0F&VqCk8D<.!v.A{vRDՎ,ss>}xM>;j&g=2knxxM>>2{|d uw<"#\܎$%yxC>;>xM>ӈ/3˜܎Mg3˜`xM> *ͳސ,suCAJ,ss;6 + ՒNY ^_QXR-`=~[R-wvXs0`Y ojI'_a"Z=-ZZ-j WRvZ +;4xWL:&w֛8;$"V9rl9fMlzgfGwvAS^3ayE^t3GG|7#-]`ܟ`.1| 9Rk.pH{/pxM>oGZcr;Nr q|OK9^k>+Thg^ϴtA4'ZO&Â!5ig]ܺ6*R-d;,XsUt9DbYI.&ɮ_du!@`CǼ5b[#C{fLrϸ=$Z4HQi'3=d_BflskA; GCo+Nu| =.&yk 60ط$#]V=!ykI*|=ډdkr6={-&ykhg\g;#?8"{xC> qݼ Q^SGڔM8) ՒNÂǗ֞qŢZ9]`HcC Hy*XpЫTK ;~U 59 >$YM?3 V\ZZ +;4xk6A=)Ҏ 5z =xM>R7_ .pC>-&)直G| o~6]Rl5HqX߬927{`5Lq'8߬H7#]`}}o&wwgE7y^^.^wu]IF^m琕fqxR#;,88kHs`:dw4|K%S 7_CC7dQki'ޭsvO-oCKEmwsN8&7-&T͊#(|d sv#kIXxM>9_|joG:g(;#]K+UH Oy?'-tW,X}y5TK粕&+JސLyuX]#"xMx;8?-4esOO>ÂS7 ՒNÂ/zjIexei֐jI d9~̬H)/pNe!hzq\R+no 59';8M8yxC> &_~>i`5L'8,C/#1^lD#5L'X66^sQ+M i-yg׀.b"˓I'a!ZW}4Rr\ƽA 1 BLv ґrh s=wwnE8qc%" 6ҎCbf|YZKA-H+Ϲz-dKn#],gGOGƻZb 5x8K|joGƻZbW1xrg;Y"YWzgda4|NV6^SwXpFY)VH: }6%ՒFƻgOq `'vE'9 ՒNÂ5/2NƖTKb +XxM~{9XTK:Y Qdohh. q{PX 7K-A#-B@wPTֱ(kI?.h>3ZK; P&;qZ_*kI8#&S W)(i43z%LSiX| kq84Uk.p^ϴwGf)g;jw>J詵4q7ouL#"N68T )hGx~ >4Pơ^zۊ&8K5!gvlFV\`w@%V}wXp^8- ՒFzKoUxM>V8Ј򱊼->R"xM>roi+H&gw9kÏr;,Xg'gWYR-xwpFO4vpfkɟ\F Oq *(Ɠ>aV: 8%Xs@lvwh*CRki`Ui B;uw\QW&/:OEv&ۺ=6sJ_+eq4xC/r4N=v2ݳZs4lbaû9^=r@ܷ7xMΆF6um59`m/ӈTxM>FiGܷ72OpހTKړpg]F^6*DjIk`qChʥZ)asU5ֈ- _c OS;,8{bWo@% δ_ / X-t,XF#mqTK: v[MD%mӋVJ@%q5ff%Â3hqEH: ֟[^zJ_5}MqR֏1&)F|ސS ֏? TK:\G%7 Ւ8&1bkͭ`1NjIxǕfq'yR#ھ`4YנTK`Džbo^zgǍv2K%wXpM2ҕZ-h`|r=N[ab;WW'"wۉ& -ҎCC/G@mͬ~w;Q#D~x5GE" o7jIhOIw̝__Iӗ!d'6pMN%Kǝh8Y`M0S ־+Պ^~x Gj55k>Z2ZhxM~JwXpF]ɨgWIs}nbkL ΒF}48)_ 5)aZ2.yR-d;,8KFDHzkt4/ʻkv XNӴ0àwd|˸1Vv+vhѼRki3_ 8Csk}{$Zı:mwB;Ҏq ލ?zrH w *!qߡqſRkiH4n\x3Û<ƗJ@`GϬ'"N!L*1Knx(D#_`MMZxM>Δ׈ 9`MwgPl-&?;,8SXR-8`rE~͉H`Y5דI'#aZ3ՀTK:ଚVZҩ}ߍyZR-<wvVZyWd(At#Xp<\RhDŌ8B-BrC~IӜovJcCC`W>,vsZ!;xCogZJ6H1CiIA~w\{h'E)oH0AH8_f**g>2(|&/cVQxM>W'8^#7#E_`qR3,&?/Xp^kԖTK:y kC6 t*vX^QyK@%qsՊsq8MސvXe4?a_ Z1ޑ!YjWPO̬ m7 4B-Blxf+ 9Ґ@`gC$Z %$" uLtT"j#;4xC{yꊩ4qC}x]`ZDE.f?sZqUKLvrzp_x~_kOp\Orf#r<ypF^ϵ ΃/)^3m"δ&#jl(XqjI,{s[ڰ8H$66>>kS־ÂZ4chjQ!p?!ŽC_gP%Zڡ!p-JRkiJACՍ;|cÙw^}߼GEU+Ѽ8K qQP;n9eQkiXdՙV外Cj-h;4^MRrOXj#M+cn@mqEvhAiR S{>8.jɼ5 3,-G^~W\g ?Y6AF!O|e7p8LkrY63{Zgٍ<2ZR`-㋛ş,tJwXpF>q˓Ic}5l:(!KkÛWB`ׅqMtEZbwdܚR`3kea^]Cj-m& _4{Ĉ8ί[1Z1١{]XZ;nmt$ZR:t,ycj-CSRkiXx%FpuZ;x.~163y-(hۤRi*=g啮 #Gk}1g&X+ G^3 9a5 V`cv҈+c&`_\k1vGȋrm䌷3TXxM>·Emy^ 7 Ru&߁!0ʓ5o޴V1ءp8r 8(DC!0ajφPRki3_ c;]5KE mCAl,!;xc-jwkLEB3D$$ZNWXˁA[uZKoeR I ArX{Z)Q?OrNn48e?|>~nūIisi/ခ3m] HX~gO<Gھk>^[Q%=&g~ܔ\Zhc t`az.Zw\+#jYGߑ!0\AuZ鍢py{;6[j-h;46̏ynKmM m|J#"tp=!1S 7bGCGEކ\hh;[u1x-iIu%" pKn7cXZ_SxeEh'T{-EuX<_욥.?$U*/4sBnQxM>ah5̦'Xq^lzstxC>aD7{^lz҇Hk# YR-5dDGYZ-8;C|-,{AQnPQki3^ 8fa}Q-!淃@;+7iHcDC[*Cxj-m \R В3^ }4SiTސD9G }P!!>@࣍%FHA;fv8HV-!淃@i߈Ĉ8E pgvLwh_ԧ!vݥMx8/VqR/p&K%4|V4 5H8u#A#^Lí859`Mj<S2!fkxCx;X۔CqHJf?;.?=0ղi g$vZ1Rء;i"]GuYS; q ?4x''M=v\2ߡ!%mMv\rޡ!p]}F(ZP8˔hB訵h/R׍\ѱ$FLx/.HA ¡،H v\V{q$Z yc8-t)hTn//aOZ~_R7ntӡ,?ˏ_76L??&[gQ)_翸~]߯!W߿oBh&f+}?E#99?`-Z@,kx<~F |4xxXVЬ>xrԿQ::xfF8Dj/L|V]˲\ueI , *$>E]-J_TID(/ `AtjyIFl ;R!m!Lֿ7~Ob=ZgK7N3My˱E8r1U۽V oI)lY~ϷO+s^/NfLa}G~N|eǝ I9ވY<ok4ӻ2o ?Nt]iq-bG f[n. c~}cA ]?<KˣbO7 UX4~ۨ/ܴ@\#oTOdyF\)#cSh7v2[7&p@ձw4Ny`[y)|ʼoɬ)m8A f(ڱ?/A 4nT^{ ^,2xl7.{j['"4eJ{kaLMbn;CR9Й"[7HٹoVjZ"{36y)_hF#kPsJ{r rJ&777Pg_ʏ#IQ&%RSG4=N媗>oM)V.MK࿥Vy|֣ vT~xꦐ{anLxIvmIm}g#M;?ۑdi} |3O{##WG 9q2r'%yG;x9yÃt,7hr%Pe"S+2eiԜ$tn |h,ݲ2?B?" * _PLT/d9PW2e:ϒ,mO/q[o˛ Non$Jt,(D;_/izGg_ )q?^_w')euSTx?W,?SdnJ|[l߬2GoR71R~e:6ߏ;U[sO,石Y\ rq 9Yd ÍM q}3HINU(ğ8 ￰脝Zgz>ܿ o:M7~Bldy)ݩzJx̍g #\|Gjv}\|Txc'$>ד˛]~anw?6T_rK_|R?oB_5s"[}xǽtn*N;|N|__nNz!޸ ot?SHҋo6GT&xr|_o|A畏'om|?^h?}~z9`RcAssx>ycrgi~b$<ߘcy<̟84sfz2'7>ϕOW␌c/}VLsCYޟuYFyu_7؃~gx #ΘQJXb/?i>Ѱz|& w23}i#[^8ޝ ul=㐋'x"KsʣsO|}FOǔ͙eZ?/RHëldRgM4VX$?y>$gYT Ѷyp޻1fi"CZ>L֟cV KXݮ;ΑhtЏF2?J[q?:D`Pd2b,+5ĈA?+68ahPN!!;t#N"'!z-@5V:c/7~y©$SjHEA4cN3frHE0APzGQ#8(&1"tAFeN:g1$Z fX'Vٔ1! Ai{5Ѡ/"1"tAPꝔ11??SGIA:hon_TD`Pq)bcJht^[b \~j<($Za%IC#Uð'"Qi_ (G]x<'"kS=d|ATXAPNsc˃({t$FġhGC#u9̘X4OMbj-M g/T:(D8N+ׅ0_J\=+vvh,aՙ}<6~%^($Z -򱑸h3E^ kzsĈXX֑hGG~5)O_9LJ s],!;8sE7a(OE*sx-b s8*d<1S\9 ~:-b s}i\H"/̕>诐h7WA,H"/>ԈĈ)o!q W*dRSkiG}˥Y3u7[w;K%78D$Z ,hHd/,#pۉ!"f@[nwăfɖ&"f@ Lz-b& ˥)8诐hܛzFSP,1DIr+ rl-!ѓh3^ X.8 "#b8OZ(~ٔ[-FS+ ƻ<&@`\]'"8Oh$CʸtZKC⼠!0WzТN 8/̕hk8k-b& {D8ʼn s~itCm&4xs}f;˹TZKa/mYyܺD89rh̵\;qdqfqd/p>;NNq$ZLZ(9y4ROE${@`68Ew䰕SqlKmτ|@`@ޣ͒h3!_ X;]wHĒ|E_q$Z XC ΖD r+$ZLx˽d%"fB@ ܗW8#b%fFp,1$ZJ'[+|BC`+TB - РD84K "#j#;4x}%KZK9Ζ6wHE!^XKOQkiH4x#H`Qki;ХyK˒hGߡ!0ƻ.L卑?/hʦױoQkiJAC` T`H;ط 2.[6GcfVe#4}@`)7 "f@ gnmG9!!;x{NTHmDiJ-"1"f@F BE4}@`ϼ}uH/3,1ޞ3o$ZJ'F̞Hm'1"1 ޞZJ'F\$Z1&ء!0ͽGc=sDBj-Mn(-7Ĉ8;4Fq'Ҏ1 ޞ+7B7$A 0bލ'C#t4x#~>nE*K}@`7M=DC!\nXQҎCwƑ$WlFZLޗC`ĜH?|^r}f# Kf !;x#Nb;$"f@ 0bn ת\CGE}@`t($!UfDoNI/rB#1"f@q QWH/ϰAOHE{ X.y'"C7rbWrZK4wrPwY#;4xEwxZwh8shq㨵4q<궡\hGߡ[nc! Sw*}Cj-h;4FL6ZKߑ/hRKwzkH* =W^[ߍ6/hܨ' 5]I!vءG-S'Qki=n\G}bWnrP'ĕwҹؓh3_ [͈IW(hl3L.^`ӝ8850A B}+[J 69zCj-Z, >o*niT#m@ T Y)@ 0B˸hVB-kK_KIX)tjmh,1k_;-!;V$Z M*'{-?(hLgRiaoڍ&0U!0BRki_AC/UG=S<%!iR9@[yw| do|{Gc=voY<o❒ɠc9U@ }ږ'"1"Nݷk㨵ӥRxkZڜVX /Q9-LSUZK;&;4!6AՈHd C$ZĪK ~ zj-u `'(q$A>:!D8;4_i'7ΈF 7 Kv$Z1ءnW$rƌ'AU= tk'O;-b,,P ِ`IcNCC`Լ v4gz"TCj-m,=3$FLx#FϔA9$"f@ 0Q"-b,aM$ZLx#泜hP I!0⊟i)펨 ޞ+QZK;;4x{ƭ\4Ҏ;4 n6k x{"8$Zj 4̇rRkiHaCS쨵4= MIq{X7%1" ;4xhxQki7%aDHa 2hdahHaw~Lpg;~6ŞQUGb;xӾi~GEH@`ϕ7L J5$"t8 t! Sw$ZJsSB-b#TFJDbD4}7⇞J! \G%"/h,q!MQki@co**!v}(dFm/,ϸm\wHE\U.c-b/l|EU$F \/P+ZK;;4PwI፣'w̕&qq$ZLxsŭn\K)D8] -)HAzhWd)’hG}tF]Iyl5/>@`Rnߒh;K]]d)ёh j!qۡ!0bLv\ߡswṚ OK]! =Syt$ZJ'x{~M$ZL} qtr q4WҜRki;EAC`8j-(hz!TBj-m =w'm\3O$Z1١!0 4vY6|7 H/F}`x$Z1wޡ!Vz )j#ȿC7/ѴyO+!6=KnO"-b {n\#"td|.2yB-ޞoZ(*9RVţS<a {z|ȳ#1"f@sC߿FEW vh_KP_H}@` Рhǘ`oυ'7fJ@ J+ƒʽiq~SkiK!BKQkiGߡ!r^OXWHU޴·\GE.+ S<-&76WIMJ58G@`/ey58-B@whΠ\ILƑh@`Ԩ"c۽h3_ G w X-~VYqZ)Pvho/p&OI&qء mPZK;{<%WVGb≕O5ADXo/!AC`T(PQiJ'4x+G_i_CC`t$A!vtp4j!6 x+*DS Ӯ8]' Ĉiw'-KsސD{.(鑮_D8) 晄4\QkiGSߡ3 iN7+ɲ6N' UZK;.*mћ+Ҏ;4KtwDmINAOIA 0Tb-;4q,bKÚc":j-4E>eKbE+ۯd8ytin$5& ?4'GEaZaAC` Z1,ء!yHZڪ .]$;-bM+-VrVNܯϒoZ4OUZ8\DjHE JHEHV@`c$FĜ*X ୼+E Ùq `vhp,ҎCC`6/5Ҏ G"Z4VN#sZq^`?P%Z;xGhP!!3;VrwL֒믠YydQkiʹc'P=qU44Qy#zyj-UQkeO7)>eɆ3X 9-Bw_`@7mʃJHE iA5$"fy~!gy9-C燿<;j-XCC`ڕy v,ء[yKZK +/8鈃hb;VިoHE޴RHϠ#"Ni H;NM ^^ZK; ޴[qNZKA 痫T 9-)Mg Rkis`@`=4}P*!!N@`4D8F ;48VRki2)@`/O|[+B@w1@x)OEcs𛲌6&F` ^4h-bUL pPI3x{F'm<$ZJ'\y%aIAqwG)7$"1 PZ1&ء!0b:T}Bj-m& w{6r$Z*4\90*Km⟿2qHA 0?!9Dm,`qt{@![N_+7vF56No_pZqMboP\zᨵL iI2GgwhppO!6i?_'R<qT+0Z;x1TRHE=o_*Ofɲ=+ X9.*  ",DXʩ G-$"V?A F{&v¡&"fMo,iX-b,R|Ĉ84xӮ|e+GgvhL{B=WH~`AC`CɮxKC{($F 7tאD8N_Xy{t]vZwheSkifo`b}ZiWy[{qT h[v UvhpVrǝCj-mN ,LRZ+B@wxd$Z #ĸq%'"vGaS ՆG]A{&&EO#"Ԥ7hK%"֤4δiw. "#bN ,pWFHA 0B@xGE=s2Ƒhwo3"`G {z[Dm{o9 <֑hsR`@`ύc,i!;x#nԐnKEȌRStq)4x輠ZK;&;4F\D`N%&GzSki_A3b\fYZj-PCC`mUjj-?z6pW /dT‡%"T@Mq,۝f}>yKRh#O] 7 i,1i7A9$"f@vWJ I/LR>(!;x{٪5$" q<#"/hR,v稵cCB;ZڱncRi3_ M+ng;-B@wL(_!1x.>IrDGEHJ@`/AwHKYA71:j-8{CC`|#}?vۡ!0mkPҧRkiǠdouI5MXj-mN ,&eÖĈ2J݈#"t Zt$Zi7Zh3̍>qP!qx44]y"e䭆J;;4xV#Rkiǿjoh[pVjj-m Ӧcpʼn-q4x9:cMp%Rki XX0rq,ۡ[n )eZ4F'2ήZqA}?V=΁pZLx{n.}HJ@ J(=!!S;K I-Ϲ_`!v44F\i=,Yj#h(hFꪭZ1&ء>"SkiDw?geOi9>tf?oo?pEuo/gc?}|g~Jnru]˟/,Inq*5h]D?S?-?G虣U2{\+g1若F}4wznx\=SV8⌷=1Ag=GuUZ39Vit{|~o:5%<Ҥd͟I/J?tl%?/dM/M6cF098;Qg59 w<<]g}9n{V [sk \gkƵR]gt zx~N,Zn'焊ă=u- #?M:zr-rGG">uxSߗ]t٦_C5Ջ΁c_B ?cNj?I%+=x]ހH ׾Q 2)t}'Ʋx>{ZS@?=_+oәǭ4{Bp:+w94O9/qCkB}~2 giu@7~ocR\(_'p {߼_XJq/|k+@̓0JW+.q3w܅xѤ+F(p>DjK5x7屷ϵӌX?_/ZmQl%Q~Y7/>sL OhP7w}r=O˗M؁ /~62'UZG+JQ<'RL1ю&o9H#hܺFv$+b Kʜ p~5rL'M$Hx}'_ gQX7Cqϣ@#j,eA8ں5 Ӳ.^T4?EͧrF9;qT7=ēVA5nRUG܁Y=}+2~x y*ޏ8s5Ux4^~u?t̼"M&$L{,Zb*qx z}}gjjLGw A~+ } #3 摕I/1^0 w&=KG4R 1cBߧ ,5 XJP1k]UNUʿP|] xx#]I8 }\ϩ3/|? Gj͌(_+ƛS<(vR$i<7Qv;/%'G5yh/IfԐ<P %/Ҕ_x4}+45>S"IiKJ~HI#}yi@L^2}= 9%M&1K≀1IXSHFU/_7 p5`N廙=|95j>DLw=38ϼǧ,3iB Y&w?/RױMF Gϋ5Z_8^?~5Kw]$?sy4KGfѶYp淏ϓyh*qG1G=~L+}R^{TyZ#B@whJy, L!!;H/T$9D`P45DLg )$"t{y:b5O )Ҵ7FV. WǍQ]Hm3-1FY,~SuȞ6/9Q3X j@y1A-PH J4>thyĊP ~YɃ+A kcAyj$"T (u;q}/=8HbE@?I˱W_ zS+A R3u/er|#!~a'W .pĊ,Yhh~IF;Ce^f)B#{{C:CJ#* r~ZAOޭ'D+A Rzb Z2I DiОBh>XA>EpA8F+A :3.X ivsI Izү s{f$Ċحoeu WS^,.A Ɨ$iH F+B\N@bT􈃸'q"T@}pI X#&8HbEiHq/@bEh "x q"T@ѓV$Vj^}ҩTs$VλCb4U$_;y{L{DN$@$VL{$6JEdOJbE̴w@b0o)1FrA$V8Fin!I.6NOC "fڻ@ ыgJ+b }r5:1F, $VL{$6zS7c@bE̴w@b/%_E&Y FAqjhHl˜*$C  PQ *)KTD+b k|X,xD+b 5~΃hHbE̴w@b7BV^$VL{$H78#12AJI]f!qƳ[;P;i[֮ atk/P*}q]{& a6ZAgNbEdx@bTrw{'b& a>l $VjH OƯ@bEdx@b o&[10?o/C#1a7('q"f2@ 1L:R^ "f2@ {rev6X3^ &/>_2Hjh/O+'R[i do.:R[i}<5?'"^vER[ib^q&KzFDl3l rV} 4D"R[iOe!1ð‹I A˯HbEnĈ/X4o@ q>j8 $VC4Fe4;;og|1Ĉ5"<HT D:HbEhoir0J$"f:@ 1bQx&83^ ˞ *@bEtz@bĴ>{OX3^ 1.4'"T@4N.Ar/X3^ 1qR+bk# 6R[ismy@\rǛ=)M54$F8fK34@[pPNbEl_CCbWnH QkhH*nhIz/[˜)1SzHbE{@bDĊP F?k<$VجF=ĉP W&!ڑĊzb6gHi#佗#jHl9aSi!>T+%"f@ ы&1#1Ң7YĊIh^R+b& }(8('q"T@bTۄ_DĊIh/$8)1a>c-׮y'bo@CPV :[:Gj+m8!1W'>~J'4Ds-'gV s"Kmj'm%khH,CyV\^ 1oJ 1Sш?Ŭ=%"Ĉ-gMId/H+O9+XA ?s<ĊغvsH6Xw.ƌ[4q&f@ 1N?Gz$VLD#~I9ĊIĈy)RId/H6JId/HqP)!A 1⇻@ĉIh/K Hd/HJ39ĊĈi7B+f@ X.EꙒX[АXn} \j[ΜĊk D+bk-*)Y FqR[i3^ (m%#%"f@ QA䘊HbE${@ѓ;\%X3^ (m-3-#q"f@ (n|iPk)!WN$X;6^ rЏQV^>F?ǣO/X3^ (bWX3^ (93Id/6i>jJbEFy*S+b& }EmĊIhmDF "+pz3j'{AC0Wr<)&A Qv&"ut ^]yOoܒ-XsR`@bu͑'q"T@4NB͝Ċ ӦV8Ċ ~G[BbE 4D+y!7zͨ@ 1mj##q"~X2ԛR[ikR`@bOQmĊؚĴ lHmͩ_+S+⧩ s/G{j/_0U ]3TO(XEs~#$VO+6&4Sj+mN ,{;O%ՔĊ+ {HoI/HD㠧$V֨54D#ƒ6)7~Rj+M-4$LLVI fJ$NĜX MsWN$VĜX 6,WJbEIi5FbEJўߓ#CĞ?zj'I Iq`+J~* i2xj+ iS|)= &D.&AgJbE4U0!1ƕ<7* VνVXh?rW$"5$VP% ĊZhE R[i;2АX9FI4+W]YCCbJB@r>z_)z 7#\Ut, FSj+m44xtmcHlY|J7>cŻcN ,Hl_c'"h|ɇf$VĜ@X >I}'bN ,q_!"fU.R+b7+a!1N.ە"y-4'-|R[iUy 7zti᩽CC=Vښ@бR0xX$V8,)*44DchJ4 4$OE8H 1'$VLSj+m,H3X?L ,hHGhCҶQh7IJ 4$Qͽg_YN.0Q$Ʌş6QƜlX  9Xsa@b|&M{$VĜlX ,gE+bN6,|Zk$VĬ5X Xy#/$NjMNʃ#%"񃆆Ĵ;vj+m?hhHL`W53V6~Љ`J X9AR'B@5DӮ~V@bEPU!O/}j+M^@b,0)!icᗋߔĊa`ACbڜJ<*RVS sVhAҨߓXR`@bύXIY)@ -8C "T@bX j@ usHbEl}^6$K(~ƺԿ_%G3_ -@񩏁Ċr:|H/#X[KbED@br8/Xb˕h;E+B@5s%;xPOI]d!16N]WBm 44Ds-[euҶ>!\9rJ[)rzR+b&!Zn~qMmĈo.d6vҶ9Ği^JJmILA {|&x'b;{!ʼnF僧ҶĞ/%li5$L/%:MIY@ ?G&r#!A FZW'q"T@&qĊ!sCt,%v]kN1L$L:NI/HӟwJbE4}@dgmĊiĞ>8>3'b;!69EPH4ѯA gLR+bk{4?ҶAhxzeR[iH@Cb< AIhϟgVTS+b)hhH}L}khH%@j+m =$VjHAÒ^S+b[!wlc944D{d7?)<А6'̨/+xviOI/HL`H7АXyyn)&/: s@bEl@N(&c/PN"{'f@ rZG'OFD@r|14hnI/H+ꮚX?/hHcL kJmI ܃)!kn] hߧoC7Ҷ񃆆Ĵ/\T"R[iACCbKNTAKmIA v&[4 4$ݨ9%%I+W[Ҷp!Pk)6'$Vh9WǑ8ۨBCCm䩭ݷb!C>ImT!1xޟܥ>R[is`@4=FcAObEj s%UNڶPCCP+>j+mhhHCwy;Gj+m,HN}t$VĜlX s"@bE0$hjԥH͓8;2$@lZ' `,:"`A@ ^*OX;_7Аi=FQ$. ?=UiĊ B0@ ֔J[Sۧ0$$^v^@CC}⛡JJmm ӋJۆۧsi⪥V6mVnc?v\xj'mhhR}6BOJmm# ?$8FmҶ` f5$X v᠚X?T+,hH^rdv$xɢჁJ o: Xە I0@SuV 4oY VڜX |C?唏@bEH\A C:rba$"q3 :mYEn>/}>ND@ xk-^)1'1$@#3hGH&14`_4@JicBC"oCc V%`N6AOJbE4]1!H+&4$@É@iJP;i?MWLh@ 4!S[i?LW,hHjZRj+M4$OSTt$V6mnŷ&P[iۥ S7<*oFm# I0R:puΰth?' *%%"~XАؾl|;P;ih>8kUАM:-Yj+mhHle Omm 1h28v$Dh\Ȥv$. 㐇wjvx$V6.q/c} kH\A .'%"$$_#"q o? VڜX  /`h@# I4ѯA G+b0А~gj+ ? S_%~XА 7ђQ;iۙ 1꼫ܰ@mIA HbEn(:ΔJ7hhE^j+mhhHW/O~Dj+M I0@sQĐ v44`sh^|_94P[ikHlf# ĉP [U[V544$ 91@ 1xnȉG) `44-iDJ:vh՞ɖNǚ >uA9!?<$V6А>BGJm S)<Ċ:b@mIuM1+ד8@CC4JS[i _8eO{Jmm44$߱n J^|t-&)y6 $N6 ٌ2\,P[iۉ /J@mm{ ?\NOm͉?/Ios$VjH jJbElW&44$b,PR[ikh "t$V8jxFY#q"hn9+/XA | oJbEl@bY)mjڟ9sZa@brSHbE`2$Vva@CCb卡O)Aw^i/;i2+b?hhH/qRJA@b\:QI &KtOJbE@Cb<[FPٰ!IeTuVڜ*X Ş?Ċ=?{  V_=-xĊR+b[ר!]q PgOmPk!盫O3 VĞiR[i ў\)6=I88HIݫ@C4݅U+yz2P[i@CEt^J;d&P[iۨBG |Q/50A < ildIU0A 1xuAgBEh话ĊXӾx% <АX9MI'ҶW-"P[iIy qc_v$, mpP)Аa+}j+  w3NLVڜ@X m[$V `Oݭ2<4FTb0MAOmm\CC tHEHfhx)h\H ͛ϪL+bN,H t|3%"Th=RX2UA 1ctI #z ~C0mNe Me)Fk`@b8JI5U0A 1m.:X=!ijDPOIY)@ gj橐ĉڷhϕw~PwO9)@ 12sIĞ~ÃCMh焺JaaACbܧ#"~bRj+I O )&Iʹ7>z ƒjIm!r~j1+khH g'Vڜ@X wG\ ObEjHLkox=!i72|LXA fhHݓb!玾@99 J44D{~*9~Rj+mhHz9S_3vvAĴ_n4vj+mhhVY?͏1bm¸xL 0D+G<$VĜ@X Xņ9 $VĚ@ Xy.8?7XA Z9f 9z ?#vҶV!Z%@mP)!1>ZRj+M z@bE̚Ѵ/ 2HqZ =}d$N i;:&5$-޾הĊkhH\Ԙj+m;!T^s*KOm0U!1FKQgIIy ?ŨbFT~'تσOto_/<;_ x*n'i_W!o_׿ hv6lԃE+ۿUa}r#hƥ]l/HE-//#C34hZ{4/xԱ\s6^ktgN:^'NkOU1sYӉ\h<7[k>}.ٗ[91;yK[%N྿2y[z0zh"=f)\uoWyf\S# isCO㾌~PK:޸oN}j8lFCGSqfuk]7"#}>zȟ}%z5#K燳[VK}IZ89psFyg>7:==hrxkRm 1#'{ʪNs_PXkN8GJ.mTk:Yq{p%cqw>JJOg%й/.9׍CqzGp\^;]^s]|='8=^Tƣ|)mt|?xaV.<σ7n=ϣ'|ҋJN_߇״S||}- /]a$?/Aت"-[+Nڥ_v$G7?ʁ}ts[N5m{9~jexg6}R1x)~h•fx}u27fW|}s+B=J~Z~(_9;ourS~M:u4 7>9sM}/yJ׼_.ɧ1y.&^nYidޢiEԋcq}': ,Km*+ãImJ24´]mI/cA?vo |x< ~Y:xKx~EY4-9cލaSI2neXLf8xGx5°cSޒ3R(B]A<9xK. _.x/O ޒo},)8,8%s:Vrr\dޑoV` o榞C'6$~5(*&h^7<,c!_fk,q:EDhc2Ќ 03qwi)]}6Oc~ o+J0D>ѾNW,7!Ww_,-B/@GgAQ&v 3lHJ _܁;aR҃? ~'/E? [ʯI.G`oNFj%ipږNy/iȃ#*PpMxBfs5&x3S-F3×6} !e(5Ҳ+Uؐ]ftptF zVNp<iuG%ymxxK>`[w..O0a## ,xo]'6& iqZI#G]9%zGo-F'#v|.XHPIsjXވU "Oj%qn `3!8xG> Z[~3 W1<%߼ ,#.[3V.հͰV+ۆ<֮[Ù[ݏޭ摏+Bto W-ee(5f|ee!֝jo}!C8R+i$ 1Mjw#]L#"ޒVÂNiNH$63 x;.-8 %g< i%rdtHUԲ7 X R sBpA U-7g#]\Yd4x<)oK-9{{.`9i~;8ʬ0t|Q]H1Kj%KBpAB6VHFx]Gl nJDZI^߽]qlߝV= 'VLF'lU~w8xGxߡ?$\' ҟFdP@ExxKO;,xÍ8[*#Fڹ =&H#\ߤ#\ q*W %g,Qw#]M| R-Ehp[-+GLZUSvHuolxP!yD/f8= %g< +7woG !k <=% ]T[-jXG# 4R[-jXwSk‘ZI;Ӱ쐪))ۜ4R>I*CzxK>S G/[.1ZZ4x{vu|&hޑlQB0&Vl[t.GѺD|$ F*ZoGҹ 5kޒ\LBpÎUelVHGC?DeGoXe![B("^΀BD^j]8VxK, }f$|d %Z,#oM0H-9iwR5S;xK ְ,]Jo7'@JS C/Yd-L}'f4|>R-a ,fd&Vd`!8kǬpJڥvUF$vna!-uwBtN΍5,VezVO  ԉ qxۑZIb`!x3AIg1Y4j_ Uv/^+,$ a5 f$VCaZRv.z@aځ#jO-ȫxޙr}K poO@^h-9ԏ G7䌧{MpD oG x+cw#W^ཱུQe7oG xE4$|]v[+O.s %|6o*&uf痟.S6xxK>rOAޒMBpߘr%VX ^=-\l){xK>n#+^l+xޒ\B05Z} MU50$NxS^v[CCBꨟDK hE*P[i+6 9y)w}|tpf: _zޛtP4xs^GXҤC#a^QU8)ޑ3oaҩ[r M[/HqMxxK> %I`mpD|&9>ܜG %9 fXxÛ=C4y] oGvM.CP%`ԄGOw#]MQxZogv; E[:<%gKL C %om0Xr%jX?*G$SÂ*=!fΫf&=^4xI_o4#|h]<%ߙo/5ģ'!Fλ #OC=#]ܑj?qxKx 7a yJvO`n0$&Z'6_hXsGMJ/^:kevĕarCv.orjHn#:V9[.Ig<|Wۥa]8ˑZI c9[Bj%$y@ؗ@oG{lccp$e-L'v8p|$ Ǣ=<'47>4J-5,7]4V.ְ=QkBj%Vk5,祊qZS#e ynqxؑZI#I^<TA[$//d7w#I^}ZraX7;|΀+`{性4pV54D{-b)yO[hH᫟hI$߀@t %@bEx2x?脵'#Tqn5/~zVx<L-ȉ璃H%97h#ʝ[/I'\ ޑxFJ-ȉM|G&{D=%M3kX11[NiR+i+5Nx䍤NW5,x<* >ZI#S^Ο~ӳˏ$z@0Z:po7^yޒho6K %`t~5 %ohFԚ[ra hyssyޑxT>F %`t(8xKΦ $&@[R <{=!Ɗ`t|%8"#Y`th5-JYo/HL5!F 'Lcg| uIIǝ[/H{Y VW52$yg'-2[eR. 7 Y8Rj+m 4$?K6{j'mkof{q)p Ѳ=x.7R[i; ׮ T c^'8[G`_G<-#^M)[oG& *WF>2ȤxSE K-̤'Sh.[ޒLz@0U6G6-zxK>W'xS}38xK ,4W/jV3zoG *mn)%鬒Nw-L'_mTi$iL'x_}(wouHOޒW,0aD+J\hhu2|$ +y\##' Wuڏ7!XlA=%8mtrVHxDWٓ[8/H|Ohv V8ƀ&_* ;9 m[j~#!CP>!8 [CC4J4喭ڑJz/:ꒄ.R[i[oАxq/j+mW[RI9e%J]a{=Ɓqp'F xh5,}##g< C_VN'䌧 x(;-ȓeooG{C×\o4li` ##߯"/X)= Je^tΊԄJbG<%g9xK7]aޒ X.-]ޒϵgxs3d|kXd&HUjXOHb`[{plVhXŮ`I$6d r uޒzVA)x|˾sx t|B{GU㵲f0 q[mVLD= $Vm#ԮĉP m+O~XA ՋfʿAH] J3G $Vj}V-$V.7 ^o:QnK'/R:o٢`cmHIohqF|d eҖ%*ޒl[B0R6WaOj%w_Fj+m sC{9?$V̯$rg$VjZOdɲ'"'5$I7>13\O*RAܒGd|,D/6۩ qޒ3o~, %S@Fo5s|*/XIDm~=IJ5$uO?vz~ΜjؕhX(*3OmmC ?4|CҶea|)H}Q7mT!zg{h==&A ҇b'q"T@ғN[Y$VL$^zAw6I1p awz;}ou$V~Qzy2K/y=,T` \7O4F𖜭U@05|,4/6v333l;tH-̌Jx[/6iifGޒx@I>ǞxG>2&_Υœ[rlBjq % vW]ޒ3\o= "+]5 "A@TyRj+m44D,\AR[irg E>hAgJmlw@4Ϸk&zĊ؆VsHmx@b/fEĊP "ϓh.nIP E.vX2'B@5DL9I/k:k]H~lz//NF#zog; 8%;7bl6|$ON֔\ogr; 8DxG>)}-Hno.ޒv@pY"oGr;KTpDxK>)5;r} f6|>؅^4A)W`l&,2$vȭ?#gʶbg8JJmmRCCbG|؋vvA$_.cmb:J~* $+oKQfr@ 1I)3'bhyRPR[i_@b7`{Xo!1T?;:fJ-'iē[ ex_û). %SO2-Ȇ_( #/#[%ԋ G3#^lGVoG6 *Z49 ,LkHܓ7T@rHbEl ON~V6CАdU FJ蓕{Ȫ{Ҷс=op]6OgY[Ċ* =OZ)AJݭ2АëJU<<&A 'vSpĊFq_|N9;Sj+mgڛ!XEoK?&;y@VBq'|>\3}|3 I8ǛZIBaoVHI-Hx~'oG A/mG0" {F|>R_XUtb0 q`zףA@5D-ԓX;7Аxmw2N 54D"Ҷ!zmj+mw 4$u킲V\1^ ,X%`ĊUoJGЕX7k_ޓd?b5DWx7)nX9zd$NȖCFڵEuL<|f>\Ά#ޒl EN#Jog< &\-Ȗxklш[/B0̆?I ,x}iKz-0J`݌M^ %࢝?gI#^<'3^Xh >Rx 3^ -;@w$VjHBALIY "AKbEl +7P\4m!ņۃ; 4D<B՜Jh'AMvߕB ^khzѶ VXֻ@bEkH忏1Re@~|%=ϔyׇJV8-.հ\y&uv)ŸPTJH: .N~[kXK7V$Oj%_Â2!5:R+i 7\[Er| )' yzo77BZYהAIJ)U e/ᶌrmŞĊK X6̏.)ODhΕ q6+B@5$6L qP}R+BQ Rop$EמĊzhߋȩKjhH U P;i[ l}dS[iO!瘯Ԯ)6 ?uz@ "T@zl!}?l@bE{9x792Sj\(3otxxK>2a$|KhX91No K wHd 4ִxËF[],a!.׋8ϓZI{c`!,̓ZI#K_LP~f w; jGB%l54D6uV6А8Ū{j+mf 'J8hs߿oB+5x/lX_*Kj\Bdž~z$cxyfhRS̉\Y)>H7& x En6P{Fm(o92YŋZ>׸>FgME4q֚7g,ίfhs;yȷIsI,q("}Ȭ1YemXfs%)(|*tc;n\ :$mx'߉"%/%-wiygP_>F>^|yEbsIM`8:c w1WmeuI\F&Ls\EF\~ 2t7Dr$^z#}O5qƶ(࿗Tٰ g(G&A>ɸI]wt:6>_kr+W6ˎvO~!O-qhАݣLRv4Y;ƺ$~xؑ;Qsrëo|e5!vgK>(B9F$'{G߇^gc;~#&&}u$?S3B}q^T_iLD~RC"g'7zyǔ4|#:㯱Wb: qp(͍xr#xܐF6oOP8$mXQ8Y韝\wB:>9}f1κ(2zD1İlcT'ۅt7wkΎw5龛~_o!P}Fz= cF5gf(6T\O$cڨ/Gf}{9o傝oc2Z?Dzep)%9R?Up)ZqySg4''{RD&?cM d;^mqA(;*i ˺eee,h} N)OgC#Zc;ȐzΦczFƷ-~kG/YƱ8o7G=T2J#|̇w\KKП"e;>9˿7Eegÿ_Q8p*^7`RP{|pn\"z_%+7 * W͍rnT O}M{q$s\._򟳌;̇x񓺎HZ[;7^cʎ;_7IxM.3}=A"硿_R*$h!^^ղIx}JK?<dn>A2û$gen^_^x>|s3ar?7GrsN Ψ5ms69,>yM9ghGMdkB>0RwK_HGO M/[]f9oTM LQ5y$#yyyIG-P'y}R}A~_Ni+Α)6_S1|`:G>wc7׍CWmW6#}T%#  ?/~8C\2Je֡mΞﳍUųr.X*'pkØfC0w>YDz'}}+^<1Y&=(7{oO|x7%0X7JRp!l ,4ebK84I2E ͢V\)RR#( )m\sq&ސi? i /G3_*-~pc o#H X!(ܑXj+|9ĊP  i\` "4$VHb8`OEhnliHbE if$V y>73)!~pII X!-Ђ̑Xj+AH 䙖CJ#!^A qC*ݣAgFD}JIkhGVֆ2Dci\PxSbkkC0̛V\_䌴F(\yOhSj_Y\ol~ސ3h,%ߕ)*)ĩ ^3X\ίg*@ ZKk&X3] X%U=Yĉ`ʀSW?)1SU^d@d|$V*;G <1S* WO$VLe$VտBDTv@bt9*OJbETv@J)*#%"f*@ JZAWH.VdA+b D+ĊX*io׳K\ϯؗ`IE :/ #l+r"+~>Xbp=ΙAr>Ow/YMHE,Uh^Y.%i>R{i? i>zq@⍼oJEhpk H4kk0 K4T ^ N{|#h08~[Rw"߱:3,D .)`Iz#<9#wcGkxk c* Uċ@ Gdj $^0^Hq{x ZIVD{ĤNx$ $^={$^/J>ýLI o {|xv jċ@ G)@ċ@ MhPMI o{d:% 9,",UFX̴)_IA 2/ꕒx;wА!oFO|kM ^x C>HEhj dT++= ?+7;.yWb@4J鵘e}f^ N4.~oyv[Fٹw=8(#s|qk n 4j,"t`iV%)x:@b|dċ@ 1J#?bċ@ IF $^Q> zzF@ 1J~/ IA ynTS/B[(iRNfߌd@4J<$^ QIZY$"fH~IHE ( 9'E/ga;.QVwz]!1J(eR{iD|!JEhtk %OI $ p 'VΊċW,d1xb3$ȯEU2/B@g,%+kl8#|cl4ycvg1glTߔċ3ufq@⌕" WUƵLMR#q@7%4x$Hg5px:@tƋH$^Ƶ3RY)q@},儯@EX\ QaVx$H%1% VEŵ  eMW/bg9)ugtK=Dj/MsɓƧ."q@Dȕxd<4$~ɇ1^O]͞R{i$.'CWEFF_N^>{Q$"tM穎q;/b΋!J Ϩ9;A?/ר@ (Y4yS/B^F E EHF/B^Fi#%"456^Pj$^F>t򡌝d!3$6ڹA=/B^hIǃx&x$6JYqo&$z  :$^FRTR/¢^F;%"6;CC^/sj/m(=Kԋ45HlYӠ+%",U6зG(oJEhk &}3#YDhk 2)E#uc/^a(:$^0dfAgKI!j>xzً!QXXIA gXE%ϔċ@ gSxzD{bbylf%"46HH5@[A U mZċ[A g*EGJJEX qć.@E^K'B=Ҷ6CCbĕdGH@ Z#u4|$"thX+&@bT7%";CC4.^]@ACb}4z^8 R!$+K2t8w r#;2E  ċ,r1V.Nعe-l} }!^ *Btr87)!3D=4~S/Btr_r˧㲒,"4L7bxx$gC@Ehn Xn奏:+a@ܛLImD=CCb3Eo+DE䥙$^tr /VS{i? 9M0bJ8oJ@4bwċA 1b,*"' wNF% ^֨ghF\4KI@nАs坡.T+"m:hRU)fhHk]|4L7H^R9x qfd~9εj/m;S@- @Eg3$ͅkBi\PJHEhn 6WB|ċ@ 1mq9xDӾJSċ@ 1mJA@,"4x7}seg$/BwĞcsHf "34+g Ѵŋ#/D^vӮ z?]OO4 +9wT $^is UZS/b>CC4I C]oJm*34$M B8P{i$x!+;ш_ p+ $^tАs彥q^> ўׯj/m&! "ƻ+P{iۙEȖ0AwĴ;y#῁@4_V }$"47HLw̓,"47}X@Eho m$"47HL, ՚x+DӾ zċ=(f'}(EP/~wMPW^v0CCb&AR{i?[PhHLqL*KEyg5w$ʭ$^- ($Ջt $ݏ7H왪SΛxۙ ў+U(R{i3$R J)i\~Eot@ $^<4$~KՃ7.IAC2[s4 ԋG<{dҚ}~@g^# %"47H왊 akNz $^=s*"@g,Jr3x$r"+"B}h-.yI #.T (f$^vN0CCbԹZJm34D#.ܽ)KY?tݧLz@ߠ!IiWJio 3u|-'%"ľgHÿx:@4zr:ʮ$^OBzĞzKWj/mx>CCb҅Tϴ^v0CC4WVҤmigHKbޣJfhݸ= j/m%0CCbՔKʁ@23s$LILav~HL]9#;זѴ? cċ@@ 1mN d$ i_z=)@byF`ċ@@ 1}r/B}h7׾bn "d}ĞC'WEBzh;VQ{i? {4i))А37&{h R{iۙ Ѵԑ˸R{i$͍"JS/B@g\o>ku^r "47Ho 8EO sU9Аst"'y{PTċА@ Zn42* /b;hHDHZzEv`dUn&`x|rrIY-i^$L_pP+)@bϝ,"II =_7;kt|OEho 35G׶d@@JIA g>2x2'A 1b~j[I ш+C)8hH҃sz9t!^vN0CCbυ}K@@ gzzhsLI =N5)jx:@bϜُIgJE.@b}$<9!3D}yHHElghHY&JHA q;h%x,#ǣz K۽4$FLy]NKHmCI n]cJlH39=hLVEў?'6K "47H왓`߱H {nܰl&x+D{F'-4ҍ$^ў?'}y"$+!@b/s?w%YD ў?ϔCwNE &7j)Аs9WI}̗[=~4$\!Ψi?@4~p*,ċ2 9u!1N+sQl3ͳ #6NW/BwhuAdۓx$FLqPN]A 16A?H #JEX q8IIQ''C)4$F\&VEn!1jSSj/'ACb=D4x7Ho( $^ a8x$FL$)@b},9@4◻cYIgH,ʝ%$A kH8$^ (O[RVR%!3D9/A$^]X+^,"v9ŐhO{y;^A@ыO H -ۃy{JE# hFk3/B@g6z%+A@bm8g$ a9+]x!1B NXZJI 56J|}$"5~l;-WJmfhH u}E6r!hhh4㓛d$^f{w "466H JeiV/BqF%+'3x:@F3|%xy\+};p^il ͵Sɷa)@bRM}@EV4$(NwJm}~mH,lltŒg{quD "=gH,[VE -A-%"46H,p[R/ir)!3DsE|f+fghH,# k^mghp[5\Xɩ_5CCb|KK-r8hH,q;Vj/m34D#)KA 1⇦VEs{(xdD#FcI #od$ AHA ܇zKY@E{ X./!~xdD憃x#xd$*E_|,"tAT8>R/bCC4׋rY̖oٕ]^}\B7HW/Bl\4/Blh(zJEX +`wJ [A kIJE z3%"v!F{\wOmmvhG'v RmJy2Ermr] A@b\wM!1W&AIJim 7%"46H:x/BCo\7O/BCohߗh3ɂJEl}vh>x{4wx s zK=dᴁ@4I{$^ (=GJEh8m k#8$^ x$Vs-ܻO=!k3$6J$iБ,">CCчԕR{i0 ->f$^PghH Rj/m;M!(fr^rАh4sq^* \1Nf(a<-vxA@b4ApI 6G$xd$4򽥠c "46H,SoUR/bn?CC4@{5]vL&:@bĕ*Q|%YDhm tdz/bwO;hs4O##=Ӊ=J㶼4os {nhx+D{F'}yЛx$\Y=,$ =޳ċfАva@m7ghHLQާKSA &qPNEH:@bϔMBGFc‰*-%"ӏ#"NE&{:hHij/MAċA Jld@b}$HJE "L4$L}GbBHU=$>^!1@ v/yds~%"47v8O/@=$sJ/١d{;Ğ+9q^Yu47NР!"47Hċ^A F 8NI 1潁ċf/r+}1:ZI:@܇6i$^ܻ/B,yr9oJE \ċ=kF7J4Ds2}JҶ-]&<@br;$^ ͵q.%)s}hSK: v*F@I?@Q1Ӥ=) sghH(JH}Tߋ^ ros$^ 7^:%IϾ JD_0ro R/trێ;E r|%"l\A \$^ 6+@Ehm -o@b>VVErċmr u]WJE kI7l)ᴁ@-oYR/b!1WoR/vod r5:?y)6Ҷ)/pАh~zu!K @  0HG!1חTY ^D3E 6J4/BiFֺx"xb3$6JG:a$^f!:8q+2K:}{`Q~ɓ-VH̕}="‚lh7ЯѲ"xd+$J QhS/‚l\"3:zJEX ͕SAxd$ZqOG*ߌdA@4ʟ9&xd$檃"A@bt:*WHb r΍ Jɨ#!1b:zp^JHA ZngqH@E Zl "gHlϫ@/b:h/ym@mw\+3`z{v>tX'"vA;bA%6Ĉ_>zS0JJ|K +f)u!1BKXMmt\A`ـ s)BohąhЙxz+$FL1iЙ,"46Fd)@bt$^ө}$^ш1+Xċ@ 1ޅd@Wd@Ehm k56,l%"Q 6T9bh~UKA 1b*8#YDlzhĝ 6j/mQ9hHq,KA 1F:;f$^&_,R/BCo\2t)IА+C?=ҶS=dKJ;H|?HzCCb샟v]--VZ0M a@b-l/BCo\.wѠxzDs}(*)@b?,*wd$ փAll%"46H̕AFS/BCo\,z[JE@4ח~+%"$HA Qvk5,">CC9*j/m34$ʏFK@ QʽAHA fF8zS/b;hHl0BIBH34s$ԑS{iAC\J)e6ZO5x:@B07q$^>|́@Ew xu51$^ŐhRBlA (72AoJEhl (Yt;KH8+D6<5i5%"4p6HlVD~NEhl hǛ )@JKtzMI },"4p66l,/BgF3#%"~84$6J5ɩ F?#eԯ^R(t"B@g6uu$^ f&@bJFq@Eh0l LU9Yxb=3$&X5p=U{DRF젯$^ MwN9eċ@ 1AnQY$^  ^S/+\Mpin`7Z$&H+%",UHLB7t$^ۣK ċ@ 1G$A `IJ R/B@gHL6;ZJE +%"th͠x ݋ d8$A [;YAZēx_l ucAWOI Z cdԄ$^>)P=V/BmonKKl$},mO+m;fGϘQ4_1V5a%:u,TqI srMsV&-t2J0?Jgة.9̸_nL!?1CtVJ0V4=-\z*ϒy uT9؏=UhfȬ KB kΛA]QK#KP̥˹zӊ`uR86/֜DJ_|FOޅPK!dz}(OXߗ}RNi?=꘯7Gsv*Í@G[pfgƏ/zrT 9'R`ewTF]۬%w^Ny??,<:XTU-e*d}r3+\,[XWɜi?qA:$Q=$~oq g~eƻ>. ӑL;鸿7=( BD0Wi_+)0MoޢM n?k&G~?:]!c384O'灞7yߔIɧ|D_~?X5gW*oN#ob+ԺĉXK_ϻ2t8)A__\<x]/=/sSo.$=cG{,|ko}]~w_/,tAkcVzx϶뼤E>9_AKy=>gf<=\|_ZZt?'yQg''t&~_og?;c{p%ik^:8\7OFP)x(/)xI!WPKӥ.-APSw+Wv1[Ŋ 6frZGawLOt xԹNh@1>sMXN֥4Jz?6y PױxJ2\̫&7L#)=NRO-Mug) (h]#90y$MJH1~7?Vp׽?_rkX%&cf?H D_#.x'eXqu Ja*(MuWE i \^RK2x:|j JJ "ԁ KS&K7.4D ċ})W5OiIu Z(ƭҺ9"B@gm)4QJ"vċmN/$^:e:N@SVU#!3rCPHi5s$F/b3?*.~w#BK3P{i&T\R89@;|#Ao."< k L5:땃cbXl:`!exDZJOI~;Ԋ~;`āw۱zfw"K#E님4dN>֭lѤ8;rƛrĿY-p8qDMM7V~Ń##w}P粐$#iW}}A 1N8 mċA ?+xu3$@JE  RD!d$"t Mc12)!^7@b4ǘ7!3DCZIewܦ3E $=8"!3D+ꑒx_3$*)td!3#:i$^ % Ҡ;%"v!>C"K'.ҙ2{eb@Dc8BK+f`q?K"iuqz\^*P/fHӳGzV$"~4DnW8dfH\T "b*憆udvԌ B e=NL3Dnw")o={`Yu-gT$}p y m$^8 }eՔċ}|^ċА@ O.S bkXIDĬqG "45HԶoS/BC^> zċ}r6#e@Ehk 'T$^}R* j)a!@iPKIqq4MHVth'!BKۮАj< Dj/m!qgNlF^Yt pL$ċ^~Εx$Rb[Ɏd!3Do>oS/Bw !ċ@ 1LN>mS$"tϷ $^֥gׅ0i0P<@nkkm &Mq$^0M8 $^a!;,ud$ 씘TD$"46H e=/Bo0_d1@4L0A|0=xc$Ipoh/Bcl0H7>)1@0LrƒJJEl u0+e#ԝPҶy[34DKK0iQ1K-h03AWJE 01oJEn@b-ّ$^aR) "٠!u=N4q\tHAC4Bl)&g^nmHE94$ʓıki"Ds|b:MI s R>x"$JGMq$^\'+`IA 1W>7jJEhl k/#m%"4D6>x $^"0>2E\dPOI eo y3USj/mk34D=}r"EļfHl\J`@ Q@%wJEh0l m")@b/H @`@ M70 _)!3$է(ENElWghH ^-)!@4L)$3xgAC-Kԋw^ r}sqAv5p669A "4p6Hl{iv,$"L4 e,/ $^v#yr*\,R{i? ;Vʩ4 KJGn9H$˥ o=x:@\v*)@b\9 $ \sd{JEh@n Xn὚.ċA 1WHt%"v>!Zns8.3!\*IDjFHʁ@2ٷ!Z!G/}A \ndx%"=gH,k4Qst{=*R{im +}$o4x[!X. w萒j+Ϥ\M:'YEl}~h /O^6ʟ!BmcݔACbčq{4 7F 1ċЀ@ 1bqw>@b\~%1xD#Ax[O!KKҒ!P/6ϯhυڳ!KۮАs=qf?P{iĴ6VYRj/m;)!ǻ+P{i<hX%L3$VN}!JА@ ZyrR>x$V]xII +TJM@E边@4~sc|V/b7pАX9WFՕz_4#-"?АX9SFK i;=+?M7s ev!1,kE:M0틻w칯$^ Ѵ/^U$"47HLrF'"v' Xe9^i?THА6W\_4y7\.w "$A 1J׷4 $ ~Om\~%xۉ  GHmvsHWIߴ{ ho 1yuċ@@ 12`@ꡯ$^sU*m"B}hm4xn X.SC'%"?CCbč~\VS{in ,ܑ@4m#A]菔ċfhH,S{io 6w(u{YI ѴPuWj/m;hH0^"M ?SFU@E is[:F/b;hH |ZfK$VΉ(U`H2Хh A$^.$VN C铑,"t@ Zy?م{/B +^H7HL[^JEln? _)T4$V^GIWiQ0@4mtʃċNUfhHLюTҶ i7]`j)Ѵ/@+]"{9hHL#ؙQ/Ҷ+t^f Db|$^n!w=)"M3D.` ^Or +o>^Teh|JՔKNfhH OQEYqА-\4^v1 >63Rk|.01}#s]V0Hlߚx` ~[MI]V09=[?ċeL"q?JFL`亅gJEl:fhH Njԟ!F^\2"~m] ^!}^R+P/Ҷ3d+0}^vdd2PSKbAC2xG*5&K8C<ЕċbAC2xx2 ^.6$>9!3Dtċ}ۯ#*"m*8CCc ^.6$_ANI!1lj/;zrGNElg,mT[p~ ~ nx$d ; mLI]l0H 7~ċi䂁!3+GŜvH@EH?@bڕ:'!YElfh}~A)&gHPe1$^v0CCbύWݦ|Kn@\6$Ҷ7CCbIQQϨiۙ iˡ:Wj/M =Nr2$^O ~bԙR/tY@ v< 鯳x:@be9@bLJEl fh{R ܴKF34$[)mѭԋݒhbڑO4$[q+uz'5Vj/M,yhvNɕċs:>@E* vN~. ^vJ1CC4}p{I4#Sd!3D#|p@E *T2x3$FLmS "4 7F9@b zjF@ k=hH s"tj$^8 SN;ċ:А+5 -YgË ͵sEoYI sdYE\_S/Bo\[a@b]Sx:@QnNΔċA 1J{~GƸ34DX>.<)&АhpKpt0yaċح<8hysMWZ.Fj/mА(ZÚcGFHF34$irA7t@ @Eh8m +` "Bihc`og!/Bi\.ZOEO k%ol$^\+ߠMI s4߯,$A :K98HV/bCC4W~xW{y_;*xp@ 1 T@$^6Vvaᴂ@0W=GJEh8m +A%!YEpGb5WnNZJEN@bdoF/b=CCbCK@ EiGr$^n!1W:prz<8h9>j/M&3$6Z8F3F/bJ>CCbmahc ^v0CCb=&{j/Mlr92,Ꞓx?TfҶi34$R*"m8hxj/Mf 3$M]pod/BtĴb-Rp xAC/ryoҶy>?}wǹ;4$ZN) fEdH5x7H̵a~ċ@ + )a@bT *‚whgvYk ",xG0B_̘D/Bw\ifzJEhn m㵴-R/BlvF9oFI@nmsPR{ies-}ghH, KA kǻ$^ VaöoF-S9hHlSXϙR{iAC4W@P/W!ܗ$Qs^% -9=)@bWž!9@b$^ -*߿x}%x @ =VEoCb[{]"d%w,<$^ ;~'",VH,1*_I 6MI ˭W^Q+"BlhǨHA ?hċp@ 1W*ǃ'%"~ms?@b܍+Xe$^6Ȟ!F羱*ƙR{i2A sau6RV/bАyuXJim +WhZn%"46Zil $^ҊzJFԆ+%"t\Z/B}o Y$^g\uMyݣwx >4Hx/‚l\92?_PU 6$^u{s:4ai)aA@bAxdDs39A@b8,"th}x</B ,ZA| )xi0= BIK@ f?S/bxАf`}^moh%={ ^!(=5Wj/m7ysАk~HBҶ r?w$a P{id$ћ*Nċ @ \:oxdDR' ΔċKA \ڌsoFaB|g/boC\r}s=+~[ X.#zR/‚lryM:aA@ܓ4$^ ViAGHd+D˽yJEhm Xn=:ޔċ @ \ 6ċ: x;m +俾/"Bw bs3H#Acg/xzD#ܑVFXX "t@ *G-VE szРz$^vJ1CCbTZ uҶ934$K]X ghF\x)BWJI:@bT])"bk34D} c/ ^֒gh`?j/MCo\$)6%D 9j83(x[}ewh]Ŀx#m} ˥:(x+D=/6H ˭EJFЀ@ ZE;WUDY "4 7H,u]Ã@bA^m%"4 7_3.F^ċЀ@ \p2ErA+%"4 7H,9/B,yr9qk%"tw@ ÏFċ uF)Jp@ fV8zS/b7#qА((@(I _FMB9) F_3q_<j/M ڭ{+"B@gH sq[N/b;h6G[)J4@ $<,"60a_:=-/w4@Q|/5$^k7%",VHl:_MH vj9ᴁ@b/>8"Bih78}S/BiFY$^vV6Gᴁ@Ÿ!&)ᴁ@bdᴁ@`%E,x:@bNIAוx:@4zqF"ʁċ`@ [%J ~~p6$t$^ `AHIACbݒR{i۰whR3OV4$ #KU\2eTj/mݳCb\K=-^!@ѓhЕx"+$6bGΌd!@Q S+ Y_ "4D6Hl9!8@b+%"th$PW/BqFi+#YD Fɠw3/B@gHlrpPIqEN<!@ч6#pS/BCdF_V2ʯ$ ~G2h$^8$6ZxfD|ċGA QV $^ m溘@b7:,"thY-A79s&  6g (ċؙ]4i+^1JˏW/7l r_?'5wCaQǟ}/8yq|g??BGqbzS/KoC ooST9*tÏ~X1.zxF{:}X7߆ ?뿥xO*}/ić&R~`*<\%,\u="%v|,Yk<@kϚ泎//݅Gni]s"gRS~ kG?Rp/[PHѻTn)z͍3?qsspy]ͥ}9f=o*MgtJeb{E;pӁRGfb]]zP/?X-GzIUanbJ/Nm\N+51(g+GUDGs }>C]GPx瀪`sM3ou)؃!\ISvqi:J9-/J9;{5YO9nе!}hT7֞[To۩Gú:3;zu{Ʃi\@?sCCS[dc\/~z)O3ߑU ^)MX 8TYY>5ßxsqc"QN^֧t>߱A5XژLbSƓXO*>s_xЇ'nI7}<5v3R5-JDH&~kᦷB&H m R$@!:?t?_r_Gӫ.J>$&|g7KKQuxLB/FтxGZV eRI?}G ":|ᑍ7^E;;~zԣGnT:2yԇwJ&Bp)1BN##hfDi, 5y(cx c_S)a\qxz(i#1o5+/ؼZccY1wj}ףW9ϯc»ONkcÂS}d<\Ih9́Rc^<[q Irع^ϗW/]Sȉ&<i1uQʽ/Zﳏ7ytb@p+WOk| OD IG+7>dz:.~^*x?<Jҳ _h'7^__ߋIf׈9Od^.It^itMB3oyNRj_|ҏ:G&9rVjmj/7,~byxxMt5~~L~2 jw*exiv;FxsQF} 7^S!x4+Oaw/~'+U ǸҕKF yX12..]4o <:F2 @8J=G~{g)(֐h]#9!eñ #YG[?_sl|Xf7'}{^:[|bˍ"[d4ԡ/ TD<9\_jnDC(PϿ0S=?t#~/?8>qAxF3/<9MzZh)[H^ЋҪ nc]iE ,07GFȪsxH_Z+@\oΓilWy<{?"7ɑq0JJ3D¨;`tiQT󡞴|iQ[^r|Q3[icʥzD,O[%,2VE1, _蔈/\ؔ~A._贲/w>r9,[~a]R'a)R;*i}Ն?{uwn2?hd4> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 9 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 10 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 9 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 9 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol >> endobj xref 0 13 0000000000 65535 f 0000000021 00000 n 0000000163 00000 n 0000081460 00000 n 0000081543 00000 n 0000081677 00000 n 0000081710 00000 n 0000000212 00000 n 0000000292 00000 n 0000084405 00000 n 0000084662 00000 n 0000084759 00000 n 0000084861 00000 n trailer << /Size 13 /Info 1 0 R /Root 2 0 R >> startxref 84939 %%EOF stars/tests/testthat/test-stars.R0000644000176200001440000000431114576033423016652 0ustar liggesuserscontext("st_as_stars tests") options(rgdal_show_exportToProj4_warnings = "none") test_that("basic st_as_stars", { skip_if_not_installed("ncdfgeom") skip_on_os("solaris") skip_if_not_installed("ncdfgeom") f <- system.file("nc/timeseries.nc", package = "stars") test_list <- ncdfgeom::read_timeseries_dsg(f) stars_obj <- st_as_stars(test_list) expect_true("XYZ" %in% class(st_dimensions(stars_obj)$points$values[[1]])) expect_s3_class(stars_obj, "stars") dim <- stars::st_dimensions(stars_obj) #expect_true(sf::st_crs(dim$points$refsys) == sf::st_crs(4326)) expect_equal(dim$time$refsys, "POSIXct") expect_s3_class(dim$points$values, "sfc_POINT") expect_true(dim$points$point) geom_point <- sf::st_as_sf(data.frame(id = names(test_list$data_frames[[1]]), lon = test_list$lons, lat = test_list$lats, stringsAsFactors = FALSE), coords = c("lon", "lat"), crs = 4326) geom_poly <- sf::st_buffer(st_transform(geom_point, 3857), dist = 100) stars_obj <- st_as_stars(test_list, sf_geometry = geom_poly) dim <- stars::st_dimensions(stars_obj) expect_equal(sf::st_crs(dim$geometry$refsys)$proj4string, sf::st_crs(geom_poly)$proj4string) expect_s3_class(dim$geometry$values, "sfc_POLYGON") expect_false(dim$geometry$point) stars_obj <- st_as_stars(test_list, sf_geometry = geom_point) dim <- stars::st_dimensions(stars_obj) expect_equal(sf::st_crs(dim$geometry$refsys)$proj4string, sf::st_crs(geom_point)$proj4string) expect_true(dim$geometry$point) expect_s3_class(dim$geometry$values, "sfc_POINT") test_list$alts <- numeric(0) stars_obj <- st_as_stars(test_list) expect_true("XY" %in% class(st_dimensions(stars_obj)$points$values[[1]])) }) test_that("st_as_stars.Raster", { skip_if_not_installed("raster") tif = system.file("tif/L7_ETMs.tif", package = "stars") x = raster::raster(tif) stars_obj <- st_as_stars(x) expect_s3_class(stars_obj, "stars") expect_equal(names(stars_obj), names(x)) # change the name of the attribute names(x) <- "newname" stars_obj2 <- st_as_stars(x) expect_equal(names(stars_obj2), names(x)) }) stars/tests/testthat/test-cubble.R0000644000176200001440000000245714642501067016761 0ustar liggesuserstest_that("cubble", { skip_if_not_installed("cubble") skip_if_not_installed("dplyr") library(dplyr) library(cubble) skip_if(packageVersion("cubble") == "0.3.1") # https://github.com/huizezhang-sherry/cubble/issues/30 library(units) tm = set_units(1:6, "days since 1985-01-01") # l7 = st_as_stars(L7_ETMs) |> st_set_dimensions(3, values = Sys.time() + 1:6) l7 = st_as_stars(L7_ETMs) |> st_set_dimensions(3, values = tm) l7sub = l7[,1:30,1:30] cu = as_cubble(l7sub) s2 = st_as_stars(cu) # expect_equal(l7sub, s2) expect_true(all.equal(l7sub, s2, check.attributes=FALSE)) prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") #(prec = read_stars(gdal_subdatasets(prec_file)[[1]])) (prec = read_ncdf(prec_file)) sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") %>% st_transform(st_crs(prec)) -> nc # transform from NAD27 to WGS84 nc_outline = st_union(st_geometry(nc)) plot_hook = function() plot(nc_outline, border = 'red', add = TRUE) prec %>% slice(index = 1:12, along = "time") %>% plot(downsample = c(3, 3, 1), hook = plot_hook) a = aggregate(prec, by = nc, FUN = max) a.cb = as_cubble(a, key = id, index = time) a2 = st_as_stars(a.cb) # expect_equal(a, a2) expect_true(all.equal(drop_units(a),a2,check.attributes=FALSE)) }) stars/tests/testthat/test-gdal.R0000644000176200001440000000247414576033423016435 0ustar liggesuserslibrary(testthat) library(stars) context("gdal utils") test_that('gdal_utils work', { skip_on_appveyor() fname = system.file("nc/tos_O1_2001-2002.nc", package = "stars") if (fname != "") { info = gdal_utils("info", fname, quiet = TRUE) sd2 = gdal_subdatasets(fname)[[4]] info = gdal_utils("info", sd2, quiet = TRUE) tf = tempfile() tf2 = tempfile() tf3 = tempfile() #tf = "foo" #gdal_utils("rasterize", points, tif) -> need a good example expect_true(gdal_utils("warp", sd2, tf, c("-t_srs", "+proj=utm +zone=11 +datum=WGS84"))) # expect_true(gdal_utils("rasterize", sd2, tf)) # breaks on fedora-clang expect_true(gdal_utils("translate", sd2, tf)) expect_true(gdal_utils("vectortranslate", sd2, tf2)) expect_warning(gdal_utils("nearblack", sd2, tf)) # create point geom: expect_true(gdal_utils("buildvrt", sd2, tf3)) # expect_true(gdal_utils("demprocessing", sd2, tf, processing = "hillshade")) # breaks on fedora-clang } tf = tempfile() points = system.file("gpkg/nc.gpkg", package="sf") expect_true(gdal_utils("grid", points, tf)) }) # gdalwarp -t_srs '+proj=utm +zone=11 +datum=WGS84' -overwrite NETCDF:avhrr-only-v2.19810901.nc:anom utm11.tif # becomes: # gdal_utils("warp" "NETCDF:avhrr-only-v2.19810901.nc:anom", "utm11.tif", c("-t_srs", "+proj=utm +zone=11 +datum=WGS84")) stars/tests/testthat/test-rectilinear.R0000644000176200001440000000617014576033423020024 0ustar liggesuserscontext("rectilinear matrices") m <- matrix(1:12, nrow = 4, ncol = 3) x = c(0, 1, 2, 3) y = c(2, 1, 0) r_cell_edge = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y, .raster = c("x", "y"), cell_midpoints = FALSE)) sf::st_crs(r_cell_edge) <- sf::st_crs(5070) r_ce_dim <- st_dimensions(r_cell_edge) r_cell_mid = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y, .raster = c("x", "y"), cell_midpoints = TRUE)) sf::st_crs(r_cell_mid) <- sf::st_crs(5070) r_cm_dim <- st_dimensions(r_cell_mid) x = c(0, 1, 2, 3, 4) y = c(2, 1, 0, -1) r_cell_edges = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y, .raster = c("x", "y"), cell_midpoints = FALSE)) sf::st_crs(r_cell_edges) <- sf::st_crs(5070) r_ces_dim <- st_dimensions(r_cell_edges) r_cell_mids = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y, .raster = c("x", "y"), cell_midpoints = TRUE)) sf::st_crs(r_cell_mids) <- sf::st_crs(5070) r_cms_dim <- st_dimensions(r_cell_edges) test_that("same number of values as rows/cols", { expect_s3_class(r_cell_edge, "stars") expect_equal(names(dim(r_cell_edge)), names(r_ce_dim)) expect_equal(names(r_ce_dim), c("x", "y")) #expect_true(st_crs(r_ce_dim) == sf::st_crs(5070)) expect_equal(r_ce_dim$x$from, 1) expect_equal(r_ce_dim$x$to, 4) expect_equal(r_ce_dim$x$offset, 0) expect_equal(r_ce_dim$x$delta, 1) expect_equal(r_ce_dim$y$from, 1) expect_equal(r_ce_dim$y$to, 3) expect_equal(r_ce_dim$y$offset, 2) expect_equal(r_ce_dim$y$delta, -1) expect_s3_class(r_cell_mid, "stars") expect_equal(names(dim(r_cell_mid)), names(r_cm_dim)) expect_equal(names(r_cm_dim), c("x", "y")) #expect_true(st_crs(r_cm_dim) == sf::st_crs(5070)) expect_equal(r_cm_dim$x$from, 1) expect_equal(r_cm_dim$x$to, 4) expect_equal(r_cm_dim$x$offset, -0.5) expect_equal(r_cm_dim$x$delta, 1) expect_equal(r_cm_dim$y$from, 1) expect_equal(r_cm_dim$y$to, 3) expect_equal(r_cm_dim$y$offset, 2.5) expect_equal(r_cm_dim$y$delta, -1) }) test_that("one more cell coordinate than matrix cells", { expect_s3_class(r_cell_edges, "stars") expect_equal(r_ces_dim, r_ce_dim) # Make sure cell_midpoint argument is ignored here. expect_equal(r_cms_dim, r_ces_dim) }) test_that("st_as_sf works for these", { skip_on_cran() # too costly? sf_cell_edge <- sf::st_as_sf(r_cell_edge) expect_s3_class(sf_cell_edge, "sf") expect_s3_class(sf_cell_edge$geometry, "sfc_POLYGON") sf_cell_mid <- sf::st_as_sf(r_cell_mid) expect_s3_class(sf_cell_mid, "sf") expect_s3_class(sf_cell_mid$geometry, "sfc_POLYGON") sf_cell_edges <- sf::st_as_sf(r_cell_edges) expect_equal(sf_cell_edge, sf_cell_edges) sf_cell_mids <- sf::st_as_sf(r_cell_mids) expect_equal(sf_cell_mid, sf_cell_mids) }) stars/tests/testthat/test-ncdf.R0000644000176200001440000002500314612224636016430 0ustar liggesusersskip_on_cran() context("read ncdf") f <- system.file("nc/reduced.nc", package = "stars") test_that("basic reduced comes back as expected", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f) expect_equal(names(nc), c("sst", "anom", "err", "ice")) st_dim <- st_dimensions(nc) expect_equal(names(st_dim), c("lon", "lat", "zlev", "time")) expect_equal(st_dim$lon$delta, 2) expect_equal(length(st_dim$zlev$values), 1) expect_equal(length(st_dim$time$values), 1) }) test_that("variable subsetting", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f, var = c("anom")) expect_equal(names(nc), "anom") }) test_that("domain subsetting", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f, ncsub = cbind(start = c(20, 1, 1, 1), count = c(10, 12, 1, 1))) st_dim <- st_dimensions(nc) expect_equal(st_dim$lon$to - st_dim$lon$from, 9) expect_equal(st_dim$lat$to - st_dim$lat$from, 11) expect_equal(st_dim$lon$offset, 37) expect_error(nc <- read_ncdf(f, ncsub = cbind(start = c(1, 1, 1, 1), count = c(200, 12, 1, 1))), "start or count out of bounds") expect_error(nc <- read_ncdf(f, ncsub = cbind(start = c(1, 1, 1), count = c(200, 12, 1))), "input ncsub doesn't match available dims") # Leaving this here -- NA or -1 counts should return all but this causes other errors. # nc <- read_ncdf(f, ncsub = cbind(start = c(1, 1, 1, 1), # count = c(NA, NA, 1, 1))) # st_dim <- st_dimensions(nc) # expect_equal(st_dim$lon$to - st_dim$lon$from, c("lon" = 179)) # expect_equal(st_dim$lat$to - st_dim$lat$from, c("lat" = 89)) }) test_that("normal bcsd", { skip_if_not_installed("ncmeta") f <- system.file("nc/bcsd_obs_1999.nc", package = "stars") nc <- read_ncdf(f, package = "stars") expect_equal(names(nc), c("pr", "tas")) st_dim <- st_dimensions(nc) expect_equal(names(st_dim), c("longitude", "latitude", "time")) expect_equal(st_dim$longitude$delta, 0.125) file.copy(f, (tf <- tempfile())) nc_tf <- RNetCDF::open.nc(tf, write = TRUE) RNetCDF::var.put.nc(nc_tf, "longitude", (360 + stars::st_get_dimension_values(nc, "longitude"))) RNetCDF::close.nc(nc_tf) nc <- read_ncdf(tf, package = "stars") expect_equal(stars::st_get_dimension_values(nc, "longitude")[1], -84.9375) }) test_that("non canonical axis order is handled right", { skip_if_not_installed("ncmeta") expect_warning(nc <- read_ncdf(system.file("nc/3B42_Daily.19991231.7.test.nc", package = "stars")), "Non-canonical axis order found, attempting to correct.") expect_equal(names(st_dimensions(nc)), c("lon", "lat")) expect_equal(st_dimensions(nc)[[1]]$to, 4L) expect_equal(st_dimensions(nc)[[2]]$to, 5L) }) test_that("euro cordex extra dimvars", { skip_if_not_installed("ncmeta") f <- unzip(zipfile = system.file("nc/EURO-CORDEX_81_DOMAIN000_mask_int.nc.zip", package = "stars"), exdir = tempdir()) expect_warning(out <- read_ncdf(f, var = "mask"), "Didn't find a longitude of prime meridian for datum, assuming 0.") expect_equal(names(out), c("mask")) #expect_true(sf::st_crs(out) == #sf::st_crs("+proj=lcc +lat_1=30 +lat_2=65 +lat_0=48 +lon_0=9.75 +x_0=-6000 +y_0=-6000 +a=6371229 +b=6371229 +units=m +no_defs")) expect_error(out <- suppressWarnings(read_ncdf(f, var = "mask", curvilinear = c("X", "Y"))), "Curvilinear variables not found in file.") out1 <- suppressWarnings(read_ncdf(f, var = "mask", curvilinear = c("xlat", "xlon"))) out2 <- suppressWarnings(read_ncdf(f, var = "mask", curvilinear = c("xlon", "xlat"))) expect_equal(sf::st_crs(out1), sf::st_crs(NULL)) expect_true(attr(st_dimensions(out1), "raster")$curvilinear) expect_true(attr(st_dimensions(out2), "raster")$curvilinear) expect_equal(st_dimensions(out1), st_dimensions(out2)) }) test_that("curvilinear", { skip_if_not_installed("ncmeta") f <- system.file("nc/test_stageiv_xyt.nc", package = "stars") out <-read_ncdf(f, curvilinear = c(X = "lon", Y = "lat")) # expect_match(warn[1], "bounds for time seem to be reversed; reverting them") st_dim <- st_dimensions(out) expect_true(all(st_dim$x$values < -74 & st_dim$x$values > -81)) expect_true(all(st_dim$y$values < 38 & st_dim$y$values > 32)) expect_equal(dim(st_dim$y$values), setNames(c(87, 118), c("x", "y"))) nc <- RNetCDF::open.nc(f) expect_equal(st_get_dimension_values(st_dim, "time"), RNetCDF::utcal.nc(RNetCDF::att.get.nc(nc, "time", "units"), RNetCDF::var.get.nc(nc, "time"), type = "c")) RNetCDF::close.nc(nc) # Should also find the curvilinear grid. suppressWarnings(out <- read_ncdf(f, var = "Total_precipitation_surface_1_Hour_Accumulation")) expect_true(attr(st_dimensions(out), "raster")$curvilinear) }) test_that("curvilinear broked", { skip_if_not_installed("ncmeta") f <- system.file("nc/test_stageiv_xyt_borked.nc", package = "stars") expect_error(suppressMessages(read_ncdf(f, curvilinear = c("lon", "lat", "time"))), "Curvilinear input must be a length two character vector.") expect_error(read_ncdf(f, curvilinear = c("time", "time_bounds")), "Specified curvilinear coordinates are not 2-dimensional.") expect_error(suppressMessages(read_ncdf(f, curvilinear = c("lon", "time_bounds"))), "Specified curvilinear coordinate variables not found as X/Y coordinate variables.") warn <- capture_warnings(out <-read_ncdf(f, curvilinear = c(X = "lon", Y = "lat"))) expect_match(warn[1], "Non-canonical axis order found, attempting to correct.") st_dim <- st_dimensions(out) expect_true(all(st_dim$y$values < -74 & st_dim$y$values > -81)) expect_true(all(st_dim$x$values < 38 & st_dim$x$values > 32)) expect_equal(dim(st_dim$y$values), setNames(c(118, 87), c("y", "x"))) expect_equal(as.character(st_dim$time$values), "2018-09-14 05:00:00") }) test_that("high-dim from rasterwise", { skip_if_not_installed("ncmeta") f <- system.file("nc/test-1.nc", package = "stars") out <- suppressWarnings(read_ncdf(f, var = "a")) expect_equal(names(st_dimensions(out)), c("x", "y", "c3", "c4", "c5")) }) test_that("timeseries.nc", { skip_if_not_installed("ncmeta") skip_if_not_installed("ncdfgeom") skip_on_os("solaris") f <- system.file("nc/timeseries.nc", package = "stars") nc <- read_ncdf(f) dims <- st_dimensions(nc) expect_s3_class(nc, "stars") expect_equal(names(nc), "pr") expect_equal(names(dims), c("time", "points")) poly <- sf::st_buffer(st_transform(st_sf(id = seq_along(dims$points$values), geom = dims$points$values, crs = 4326), 3857), dist = 100, nQuadSegs = 1) temp_f <- tempfile() file.copy(f, temp_f) suppressWarnings(temp_f <- ncdfgeom::write_geometry(temp_f, poly, "station", "pr")) nc <- read_ncdf(temp_f) dims <- st_dimensions(nc) expect_s3_class(nc, "stars") expect_equal(names(nc), "pr") expect_equal(names(dims), c("time", "points", "geometry")) }) test_that("curvilinear 2", { skip_if_not_installed("ncmeta") f <- system.file("nc/c201923412.out1_4.nc", package = "stars") nc <- read_ncdf(f) expect_equal(names(st_dimensions(nc)), c("nx", "ny", "time")) expect_true(attributes(st_dimensions(nc))$raster$curvilinear) expect_equal(attributes(st_dimensions(nc))$raster$dimensions, c("nx", "ny")) }) test_that("lon cross 360", { skip_if_not_installed("ncmeta") f <- system.file("nc/test_adaptor.cams_regional_fc.nc", package = "stars") suppressWarnings(nc <- read_ncdf(f)) expect_true(head(st_dimensions(nc)$longitude$values, 1) < 0 & tail(st_dimensions(nc)$longitude$values, 1) > 0) }) test_that("4d not 4d", { skip_if_not_installed("ncmeta") f <- system.file("nc/sub.nc", package = "stars") nc <- read_ncdf(f) dim <- st_dimensions(nc) expect_equal(dim$time$to, 10) expect_equal(dim$level$to, 2) }) test_that("units are right with lcc km", { skip_if_not_installed("ncmeta") f <- system.file("nc/lcc_km.nc", package = "stars") nc <- expect_warning(read_ncdf(f), "prime meridian") expect_equal(units(sf::st_crs(nc)$ud_unit)$numerator, "km") }) test_that("axis attribute order -- see #680", { # Example with two netCDFs tas <- array( data = rowSums( expand.grid(seq_len(9), 10 * (seq_len(2) - 1), 100 * (seq_len(3) - 1)) ), dim = c(9, 2, 3) ) # File1 has no "axis" attributes file1 <- tempfile("tas_example_", fileext = ".nc") nc <- RNetCDF::create.nc(file1) id_lat <- RNetCDF::dim.def.nc(nc, "lat", 3) iv_lat <- RNetCDF::var.def.nc(nc, "lat", "NC_FLOAT", id_lat) RNetCDF::var.put.nc(nc, "lat", c(40, 45, 50)) id_lon <- RNetCDF::dim.def.nc(nc, "lon", 2) iv_lon <- RNetCDF::var.def.nc(nc, "lon", "NC_FLOAT", id_lon) RNetCDF::var.put.nc(nc, "lon", c(-100, -95)) id_bnds <- RNetCDF::dim.def.nc(nc, "bnds", 2) id_time <- RNetCDF::dim.def.nc(nc, "time", 9) iv_time <- RNetCDF::var.def.nc(nc, "time", "NC_INT", id_time) RNetCDF::var.put.nc(nc, "time", 1:9) iv_tas <- RNetCDF::var.def.nc(nc, "temperature", "NC_FLOAT", c(id_time, id_lon, id_lat)) RNetCDF::var.put.nc(nc, "temperature", tas) RNetCDF::close.nc(nc) # File2 has X, Y, T axis attributes file2 <- tempfile("tas_example_", fileext = ".nc") file.copy(from = file1, to = file2) #> [1] TRUE nc <- RNetCDF::open.nc(file2, write = TRUE) RNetCDF::att.put.nc(nc, "lon", "axis", "NC_CHAR", "X") RNetCDF::att.put.nc(nc, "lat", "axis", "NC_CHAR", "Y") RNetCDF::att.put.nc(nc, "time", "axis", "NC_CHAR", "T") RNetCDF::close.nc(nc) file3 <- tempfile("tas_example_", fileext = ".nc") file.copy(from = file1, to = file3) #> [1] TRUE nc <- RNetCDF::open.nc(file3, write = TRUE) RNetCDF::att.put.nc(nc, "lon", "standard_name", "NC_CHAR", "longitude") RNetCDF::att.put.nc(nc, "lat", "standard_name", "NC_CHAR", "latitude") RNetCDF::att.put.nc(nc, "time", "standard_name", "NC_CHAR", "time") RNetCDF::att.put.nc(nc, "lon", "units", "NC_CHAR", "degrees") RNetCDF::att.put.nc(nc, "lat", "units", "NC_CHAR", "degrees") RNetCDF::att.put.nc(nc, "time", "units", "NC_CHAR", "days since 1900-01-01") RNetCDF::close.nc(nc) s1 <- suppressWarnings(stars::read_ncdf(file1)) expect_equal(names(stars::st_dimensions(s1)), c("time", "lon", "lat")) s2 <- suppressWarnings(stars::read_ncdf(file2)) expect_equal(names(stars::st_dimensions(s2)), c("lon", "lat", "time")) s3 <- suppressWarnings(stars::read_ncdf(file3)) expect_equal(names(stars::st_dimensions(s3)), c("lon", "lat", "time")) }) stars/tests/testthat/test-OpenStreetMap.R0000644000176200001440000000034214576033423020244 0ustar liggesuserstest_that("st_as_stars.OpenStreetMap works", { skip_on_cran() skip_if_not_installed("OpenStreetMap") m = OpenStreetMap::openmap(c(52,7.3),c(52.1,7.15), type = "osm") s = st_as_stars(m) expect_s3_class(s, "stars") }) stars/tests/testthat/test-tidyverse.R0000644000176200001440000000234114576033423017535 0ustar liggesuserstest_that("slice", { skip_if_not_installed("dplyr", "1.0.0") library(dplyr) f <- system.file("nc/reduced.nc", package = "stars") nc <- read_ncdf(f, proxy = TRUE) expect_s3_class(nc, "stars_proxy") # Slicing after other lazy operations should be lazy nc2 <- adrop(nc) nc3 <- slice(nc2, "lon", 90) expect_equal(length(attr(nc3, "call_list")), 2) # Slicing dimension that are part of the file should be lazy nc4 <- slice(nc, "lon", 90) expect_equal(length(attr(nc4, "call_list")), 1) # Trailing singleton dimensions in files nc5 <- slice(nc, "time", 1) expect_null(attr(nc5, "call_list")) expect_equal(st_dimensions(nc), st_dimensions(nc5)) # concatenate to simulate an extra dimension nc6 <- c(nc, nc, nc, nc, along = "dummy") expect_equal(dim(nc6)["dummy"], c(dummy = 4)) expect_s3_class(nc6, "stars_proxy") nc7 <- slice(nc6, "dummy", 1) expect_s3_class(nc7, "stars_proxy") expect_equal(dim(nc7)["dummy"], c(dummy = 1)) expect_null(attr(nc7, "call_list")) expect_equal(names(nc7), names(nc6)) nc8 <- slice(nc6, "dummy", 2:3) expect_s3_class(nc8, "stars_proxy") expect_equal(dim(nc8)["dummy"], c(dummy = 2)) expect_null(attr(nc8, "call_list")) expect_equal(names(nc8), names(nc6)) }) stars/tests/testthat/test-ncproxy.R0000644000176200001440000000645414576033423017232 0ustar liggesusersskip_on_cran() f <- system.file("nc/reduced.nc", package = "stars") test_that("proxy", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f, proxy = TRUE) expect_equal(as.character(nc[[1]]), f) expect_s3_class(nc, "stars_proxy") output <- capture_output(print(nc)) expect_true(grepl("^netcdf source", output)) old_opts <- options("stars.n_proxy" = 100) nc <- read_ncdf(f) expect_equal(as.character(nc[[1]]), f) expect_warning(nc <- read_ncdf(f, proxy = FALSE)) expect_s3_class(nc, "stars") options(old_opts) }) test_that("st_as_stars.nc_proxy", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f, proxy = TRUE) nc2 <- nc[1, 25:35, 25:35, 1, 1] nc2 <- st_as_stars(nc2) expect_s3_class(nc2, 'stars', exact = TRUE) expect_equal(names(nc2), "sst") dim <- st_dimensions(nc2) expect_equal(dim$lon$to, 11) expect_equal(dim$lon$offset, 47) nc2 <- st_as_stars(nc, var = "sst", proxy = TRUE) expect_s3_class(nc2, c("nc_proxy", "stars_proxy", "stars"), exact = TRUE) dim <- st_dimensions(nc2) expect_equal(dim$lon$to, 180) expect_equal(dim$lon$offset, -1) }) test_that("basics", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f, proxy = TRUE) x <- nc["sst"] expect_s3_class(x, "nc_proxy") expect_equal(length(x), 1) expect_equal(names(x), "sst") nc[[5]] <- nc[[4]] expect_equal(length(nc), 5) expect_equal(names(nc), c("sst", "anom", "err", "ice", "")) xx <- c(nc["sst"], nc["ice"]) expect_equal(length(xx), 2) expect_equal(names(xx), c("sst", "ice")) expect_error(st_mosaic(nc)) expect_error(st_redimension(nc)) }) test_that("subset", { skip_if_not_installed("ncmeta") nc <- read_ncdf(f, proxy = TRUE) nc2 <- nc[1, 80:100, 45:55, , ] nc3 <- nc["sst", 80:100, 45:55, , ] expect_equal(nc2, nc3) expect_equal(dim(nc2), setNames(c(21, 11, 1, 1), c("lon", "lat", "zlev", "time"))) nc3 <- st_as_stars(nc2) expect_s3_class(nc3, "stars") expect_equal(as.numeric(dim(nc3)), dim(nc3$sst)) nc <- read_ncdf(system.file("nc/bcsd_obs_1999.nc", package = "stars"), proxy = TRUE) nc2 <- nc[ , , , 5] expect_equal(st_dimensions(nc2)$time$from, 5) expect_equal(st_dimensions(nc2)$time$values, structure(928108800, class = c("POSIXct", "POSIXt"), tzone = "UTC")) nc3 <- st_as_stars(nc2) expect_equal(dim(nc3$pr), as.numeric(dim(nc2))) nc_sf <- sf::st_transform( read_sf(system.file("gpkg/nc.gpkg", package="sf")), sf::st_crs(nc)) nc2 <- st_crop(nc, nc_sf[10, ]) nc2 <- nc2["pr", , , 1] nc2 <- st_as_stars(nc2) nc3 <- nc["pr", , , 1] nc3 <- st_crop(nc3, nc_sf[10, ]) nc3 <- st_as_stars(nc3) expect_equal(nc2, nc3) }) test_that("curvilinear", { skip_if_not_installed("ncmeta") f <- system.file("nc/test_stageiv_xyt.nc", package = "stars") out <-read_ncdf(f, curvilinear = c(X = "lon", Y = "lat"), proxy = TRUE) out <- st_as_stars(out) st_dim <- st_dimensions(out) expect_true(all(st_dim$x$values < -74 & st_dim$x$values > -81)) expect_true(all(st_dim$y$values < 38 & st_dim$y$values > 32)) expect_equal(dim(st_dim$y$values), setNames(c(87, 118), c("x", "y"))) # Should also find the curvilinear grid. suppressWarnings( out <- read_ncdf(f, var = "Total_precipitation_surface_1_Hour_Accumulation", proxy = TRUE)) expect_true(attr(st_dimensions(out), "raster")$curvilinear) }) stars/tests/testthat/test-tile.R0000644000176200001440000000205614576033423016457 0ustar liggesusersmat = matrix(0L, 10, 10) test1 = st_tile(nrow(mat), ncol(mat), 10, 10) test_that("one block", { expect_equal(nrow(test1), 1) expect_setequal(test1, c(1, 1, 10, 10)) # output matrix should be integer to best performance expect_type(test1, "integer") }) test2 = st_tile(nrow(mat), ncol(mat), 5, 5) test_that("equal blocks", { expect_equal(nrow(test2), 4) }) test3 = st_tile(nrow(mat), ncol(mat), 9, 5) test_that("different size blocks", { expect_equal(nrow(test3), 4) }) test4 = st_tile(nrow(mat), ncol(mat), 1, 1) test_that("many small blocks ", { expect_equal(nrow(test4), 100) expect_setequal(test4[, "nXOff"], rep(1:10, each = 10)) expect_setequal(test4[, "nYOff"], rep(1:10, times = 10)) expect_setequal(test4[, "nXSize"], rep(1, times = 100)) expect_setequal(test4[, "nYSize"], rep(1, times = 100)) }) test5 = st_tile(nrow(mat), ncol(mat), 5, 5, overlap = 5) test_that("blocks with overlap", { expect_equal(nrow(test5), 4) expect_setequal(test5[, "nXSize"], rep(c(10, 5), each = 2)) expect_setequal(test5[, "nYSize"], rep(c(10, 5), times = 2)) }) stars/tests/subset.R0000644000176200001440000000115313777653456014227 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) y = st_set_dimensions(x, "band", point = TRUE) y[,1:10, 1:10, c(1,4,3,2)] y = st_set_dimensions(x, "band", point = NA) y[,1:10, 1:10, c(1,4,3,2)] y = st_set_dimensions(x, "band", point = FALSE) y[,1:10, 1:10, c(1,4,3,2)] y = st_set_dimensions(x, "band", values = letters[1:6]) y[,1:10, 1:10, c(1,4,3,2)] y = st_set_dimensions(x, "band", values = letters[1:6], point = NA) y[,1:10, 1:10, c(1,4,3,2)] y = st_set_dimensions(x, "band", values = letters[1:6], point = TRUE) y[,1:10, 1:10, c(1,4,3,2)] stars/tests/redimension.Rout.save0000644000176200001440000001057014644736040016707 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > r = read_stars(list(a = c(tif,tif), b = c(tif, tif)), proxy = TRUE) > (xx = st_redimension(r, along = list(foo = 1:4))) stars_proxy object with 1 attribute in 4 file(s): $a.L7_ETMs.tif.a.L7_ETMs.tif.b.L7_ETMs.tif.b.L7_ETMs.tif [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA foo 1 4 1 1 NA NA > (rr = c(xx, xx)) stars_proxy object with 2 attributes in 8 file(s): $a.L7_ETMs.tif.a.L7_ETMs.tif.b.L7_ETMs.tif.b.L7_ETMs.tif [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" $a.L7_ETMs.tif.a.L7_ETMs.tif.b.L7_ETMs.tif.b.L7_ETMs.tif [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA foo 1 4 1 1 NA NA > # st_as_stars(rr) > (rrr = st_redimension(rr, along = list(bar = as.Date(c("2001-01-01", "2002-01-01"))))) stars_proxy object with 1 attribute in 8 file(s): $a.L7_ETMs.tif.a.L7_ETMs.tif.b.L7_ETMs.tif.b.L7_ETMs.tif.a.L7_ETMs.tif.a.L7_ETMs.tif.b.L7_ETMs.tif.b.L7_ETMs.tif [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [7] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA foo 1 4 1 1 NA NA bar 1 2 2001-01-01 365 days Date NA > (rr = c(a = xx, b = xx)) stars_proxy object with 2 attributes in 8 file(s): $a [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" $b [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA foo 1 4 1 1 NA NA > # st_as_stars(rr) > (rrr = st_redimension(rr, along = list(bar = as.Date(c("2001-01-01", "2002-01-01"))))) stars_proxy object with 1 attribute in 8 file(s): $a.b [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [4] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" [7] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA foo 1 4 1 1 NA NA bar 1 2 2001-01-01 365 days Date NA > > proc.time() user system elapsed 0.92 0.20 1.12 stars/tests/subset.Rout.save0000644000176200001440000001025714644736040015702 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > x = read_stars(tif) > y = st_set_dimensions(x, "band", point = TRUE) > y[,1:10, 1:10, c(1,4,3,2)] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 25 45 57 56.535 64 97 dimension(s): from to offset delta refsys point values x/y x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 10 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band 1 4 NA NA NA TRUE 1,...,2 > y = st_set_dimensions(x, "band", point = NA) > y[,1:10, 1:10, c(1,4,3,2)] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 25 45 57 56.535 64 97 dimension(s): from to offset delta refsys point values x/y x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 10 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band 1 4 NA NA NA NA [1,2),...,[2,3) > y = st_set_dimensions(x, "band", point = FALSE) > y[,1:10, 1:10, c(1,4,3,2)] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 25 45 57 56.535 64 97 dimension(s): from to offset delta refsys point values x/y x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 10 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band 1 4 NA NA NA FALSE [1,2),...,[2,3) > y = st_set_dimensions(x, "band", values = letters[1:6]) > y[,1:10, 1:10, c(1,4,3,2)] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 25 45 57 56.535 64 97 dimension(s): from to offset delta refsys point values x/y x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 10 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band 1 4 NA NA NA NA a,...,b > y = st_set_dimensions(x, "band", values = letters[1:6], point = NA) > y[,1:10, 1:10, c(1,4,3,2)] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 25 45 57 56.535 64 97 dimension(s): from to offset delta refsys point values x/y x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 10 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band 1 4 NA NA NA NA a,...,b > y = st_set_dimensions(x, "band", values = letters[1:6], point = TRUE) > y[,1:10, 1:10, c(1,4,3,2)] stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 25 45 57 56.535 64 97 dimension(s): from to offset delta refsys point values x/y x 1 10 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [x] y 1 10 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE NULL [y] band 1 4 NA NA NA TRUE a,...,b > > proc.time() user system elapsed 0.93 0.21 1.09 stars/tests/sp.Rout.save0000644000176200001440000000425214644736040015015 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > options(rgdal_show_exportToProj4_warnings = "none") > if (suppressPackageStartupMessages(require(sp, quietly = TRUE))) { + demo(meuse) + # remove +init=xxx + meuse@proj4string = CRS( + "+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs" + ) + meuse.grid@proj4string = CRS( + "+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs" + ) + + suppressPackageStartupMessages(library(stars)) + (m = st_as_stars(meuse)) + (gr = st_as_stars(meuse.grid)) + + m2 = as(m, "Spatial") + summary(m2) + gr2 = as(gr, "Spatial") + summary(gr2) + + all.equal(meuse, m2, check.attributes = FALSE) + fullgrid(meuse.grid) = TRUE + all.equal(meuse.grid, gr2, check.attributes = FALSE) + + #all.equal(meuse, m2) + #all.equal(meuse.grid, gr2) + } demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("EPSG:28992") > data("meuse") > coordinates(meuse) <- ~x+y > proj4string(meuse) <- crs > data("meuse.grid") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > proj4string(meuse.grid) <- crs > data("meuse.riv") > meuse.riv <- SpatialPolygons(list(Polygons(list(Polygon(meuse.riv)),"meuse.riv"))) > proj4string(meuse.riv) <- crs > data("meuse.area") > meuse.area = SpatialPolygons(list(Polygons(list(Polygon(meuse.area)), "area"))) > proj4string(meuse.area) <- crs [1] TRUE > > proc.time() user system elapsed 0.85 0.25 1.10 stars/tests/testthat.R0000644000176200001440000000017313777653456014563 0ustar liggesusers## load dependencies library(testthat) suppressPackageStartupMessages(library(stars)) ## test package test_check("stars") stars/tests/transform.Rout.save0000644000176200001440000000553414644736040016412 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > #suppressPackageStartupMessages(library(lwgeom)) > geomatrix = system.file("tif/geomatrix.tif", package = "stars") > (x = read_stars(geomatrix)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. geomatrix.tif 74 107 123 126.765 132 255 dimension(s): from to offset delta refsys point x/y x 1 20 1841002 1.5 WGS 84 / UTM zone 11N TRUE [x] y 1 20 1144003 -1.5 WGS 84 / UTM zone 11N TRUE [y] sheared raster with parameters: -5 -5 > new = st_crs(4326) > y = st_transform(x, new) > plot(st_transform(st_as_sfc(st_bbox(x)), new), col = NA, border = 'red') > plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) > image(y, add = TRUE) > plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) > plot(st_transform(st_as_sfc(x, as_points=FALSE), new), add = TRUE) > > tif = system.file("tif/L7_ETMs.tif", package = "stars") > x = read_stars(tif)[,1:10,1:10,1:3] > x_ = st_transform(x, st_crs(4326)) > ## IGNORE_RDIFF_BEGIN > if (require(lwgeom, quietly = TRUE)) { + x__ = st_transform_proj(x, st_crs(4326)$proj4string) + st_crs(x_) = st_crs(x__) + print(all.equal(x_,x__)) + + # x__ = st_transform(x, x_) #now in st_warp + # all.equal(x_, x__) + + x = st_xy2sfc(x, as_points = FALSE) + (x_ = st_transform(x, st_crs(4326))) + (x__ = st_transform_proj(x, st_crs(4326))) + print(all.equal(x_,x__,check.attributes = FALSE)) + } Linking to liblwgeom 3.0.0beta1 r16016, GEOS 3.12.1, PROJ 9.3.1 Attaching package: 'lwgeom' The following object is masked from 'package:sf': st_perimeter [1] TRUE [1] TRUE > ## IGNORE_RDIFF_END > > # nothing to transform: now errs: > try(st_transform(st_as_stars(list(m = matrix(1,10,10))), st_crs(4326))) Error in st_transform.stars(st_as_stars(list(m = matrix(1, 10, 10))), : !is.na(st_crs(x)) is not TRUE > try(st_transform_proj(st_as_stars(list(m = matrix(1,10,10))), st_crs(4326))) Error in st_transform_proj.stars(st_as_stars(list(m = matrix(1, 10, 10))), : !is.na(st_crs(x)) is not TRUE > > proc.time() user system elapsed 0.76 0.21 0.95 stars/tests/gridtypes.Rout.save0000644000176200001440000002542214644736040016407 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > > # regular, but not spatial: > d = st_dimensions(a = 1:3, b = 1:3, band = c("foo", "bar")) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values a 1 3 1 1 FALSE NULL b 1 3 1 1 FALSE NULL band 1 2 NA NA FALSE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] a b band X 1 1 1 foo 1 2 2 1 foo 2 3 3 1 foo 3 4 1 2 foo 4 > try(x <- st_bbox(st)) # error Error in st_bbox.dimensions(st_dimensions(obj), ...) : dimensions table does not have x & y, nor an sfc dimension > > # regular, geotransform: > d = st_dimensions(x = 1:3, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y")) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x/y x 1 3 1 1 FALSE NULL [x] y 1 3 1 1 FALSE NULL [y] band 1 2 NA NA FALSE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] x y band X 1 1.5 1.5 foo 1 2 2.5 1.5 foo 2 3 3.5 1.5 foo 3 4 1.5 2.5 foo 4 > as.data.frame(st, add_max=TRUE)[1:4,] x y band x_max y_max X 1 1 1 foo 2 2 1 2 2 1 foo 3 2 2 3 3 1 foo 4 2 3 4 1 2 foo 2 3 4 > st_bbox(st) xmin ymin xmax ymax 1 1 4 4 > > # rectilinear with offset given: > xd = c(1, 2, 4) > d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y")) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x/y x 1 3 NA NA FALSE [1,2), [2,4), [4,6) [x] y 1 3 1 1 FALSE NULL [y] band 1 2 NA NA FALSE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] x y band X 1 1.5 1.5 foo 1 2 3.0 1.5 foo 2 3 5.0 1.5 foo 3 4 1.5 2.5 foo 4 > as.data.frame(st, add_max=TRUE)[1:4,] x y band x_max y_max X 1 1 1 foo 2 2 1 2 2 1 foo 4 2 2 3 4 1 foo 6 2 3 4 1 2 foo 2 3 4 > st_bbox(st) xmin ymin xmax ymax 1 1 6 4 > > # rectilinear with midpoints given: > xd = c(1, 2, 4) > d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y"), cell_midpoints = TRUE) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x/y x 1 3 NA NA FALSE [0.5,1.5), [1.5,3.0), [3.0,5.0) [x] y 1 3 0.5 1 FALSE NULL [y] band 1 2 NA NA FALSE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] x y band X 1 1.00 1 foo 1 2 2.25 1 foo 2 3 4.00 1 foo 3 4 1.00 2 foo 4 > as.data.frame(st, add_max=TRUE)[1:4,] x y band x_max y_max X 1 0.5 0.5 foo 1.5 1.5 1 2 1.5 0.5 foo 3.0 1.5 2 3 3.0 0.5 foo 5.0 1.5 3 4 0.5 1.5 foo 1.5 2.5 4 > st_bbox(st) xmin ymin xmax ymax 0.5 0.5 5.0 3.5 > > # rectilinear with midpoints given, point support > xd = c(1, 2, 4) > d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y"), cell_midpoints = TRUE, point = TRUE) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x/y x 1 3 NA NA TRUE 1, 2, 4 [x] y 1 3 0.5 1 TRUE NULL [y] band 1 2 NA NA TRUE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] x y band X 1 1 1 foo 1 2 2 1 foo 2 3 4 1 foo 3 4 1 2 foo 4 > as.data.frame(st, add_max=TRUE)[1:4,] x y band x_max y_max X 1 1 0.5 foo 1 1.5 1 2 2 0.5 foo 2 1.5 2 3 4 0.5 foo 4 1.5 3 4 1 1.5 foo 1 2.5 4 > st_bbox(st) xmin ymin xmax ymax 1.0 0.5 4.0 3.5 > > # rectilinear with start/end given: > #xd = stars:::make_intervals(start = c(1,2,4), end = c(2, 4, 8)) > xd = c(1, 2, 4, 8) # one more than dim of the data array > d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y")) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x/y x 1 3 NA NA FALSE [1,2), [2,4), [4,8) [x] y 1 3 1 1 FALSE NULL [y] band 1 2 NA NA FALSE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] x y band X 1 1.5 1.5 foo 1 2 3.0 1.5 foo 2 3 6.0 1.5 foo 3 4 1.5 2.5 foo 4 > as.data.frame(st, add_max=TRUE)[1:4,] x y band x_max y_max X 1 1 1 foo 2 2 1 2 2 1 foo 4 2 2 3 4 1 foo 8 2 3 4 1 2 foo 2 3 4 > st_bbox(st) xmin ymin xmax ymax 1 1 8 4 > > # with sfc: > sfc = st_sfc(st_point(0:1), st_point(2:1), st_point(4:3)) > d = st_dimensions(x = sfc, y = 1:3, band = c("foo", "bar")) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x 1 3 NA NA TRUE POINT (0 1),...,POINT (4 3) y 1 3 1 1 FALSE NULL band 1 2 NA NA FALSE foo, bar > as.data.frame(st, add_max=FALSE)[1:4,] x y band X 1 POINT (0 1) 1 foo 1 2 POINT (2 1) 1 foo 2 3 POINT (4 3) 1 foo 3 4 POINT (0 1) 2 foo 4 > st_as_sf(st, long = TRUE)[1:4,] Simple feature collection with 4 features and 3 fields Geometry type: POINT Dimension: XY Bounding box: xmin: 0 ymin: 1 xmax: 4 ymax: 3 CRS: NA y band X x 1 1 foo 1 POINT (0 1) 2 1 foo 2 POINT (2 1) 3 1 foo 3 POINT (4 3) 4 2 foo 4 POINT (0 1) > st_bbox(st) xmin ymin xmax ymax 0 1 4 3 > > # rotated/sheared: > d = st_dimensions(x = 1:3, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y"), affine = c(0.2, -0.2)) > (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 5.25 9.5 9.5 13.75 18 dimension(s): from to offset delta point values x/y x 1 3 1 1 FALSE NULL [x] y 1 3 1 1 FALSE NULL [y] band 1 2 NA NA FALSE foo, bar sheared raster with parameters: 0.2 -0.2 > as.data.frame(st, add_max=FALSE)[1:4,] x y X 1 1.6 1.4 1 2 2.6 1.2 2 3 3.6 1.0 3 4 1.8 2.4 4 > try(as.data.frame(st, add_max=TRUE)[1:4,]) # errors Error in st_coordinates.stars(x, add_max = add_max, center = center, ...) : add_max will not work for rotated/shared rasters > st_bbox(st) xmin ymin xmax ymax 1.0 0.4 4.6 4.0 > > # curvilinear: > set.seed(13531) > lon = st_as_stars(matrix(signif(runif(9), 2), 3, 3)) > lat = st_as_stars(matrix(signif(runif(9), 2), 3, 3)) > ll = setNames(c(lon, lat), c("lon", "lat")) > d = st_dimensions(lon = 1:3, lat = 1:3) > a = st_as_stars(list(X = array(1:9, c(3,3))), dimensions = d) > (st = st_as_stars(a, curvilinear = ll)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. X 1 3 5 5 7 9 dimension(s): from to refsys point values x/y lon 1 3 WGS 84 (CRS84) FALSE [3x3] 0.03,...,0.89 [x] lat 1 3 WGS 84 (CRS84) FALSE [3x3] 0.021,...,0.89 [y] curvilinear grid > as.data.frame(st) lon lat X 1 0.89 0.250 1 2 0.64 0.510 2 3 0.30 0.670 3 4 0.69 0.890 4 5 0.47 0.890 5 6 0.26 0.190 6 7 0.57 0.021 7 8 0.27 0.220 8 9 0.03 0.340 9 > st_bbox(st) xmin ymin xmax ymax 0.030 0.021 0.890 0.890 > > # time regular: > t = as.Date("2019-01-20") + 0:3 > d = st_dimensions(t, sfc) > (st = st_as_stars(list(a = matrix(1:12, 4, 3)), dimensions = d)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a 1 3.75 6.5 6.5 9.25 12 dimension(s): from to offset delta refsys point values X1 1 4 2019-01-20 1 days Date FALSE NULL X2 1 3 NA NA NA TRUE POINT (0 1),...,POINT (4 3) > as.data.frame(st) X1 X2 a 1 2019-01-20 POINT (0 1) 1 2 2019-01-21 POINT (0 1) 2 3 2019-01-22 POINT (0 1) 3 4 2019-01-23 POINT (0 1) 4 5 2019-01-20 POINT (2 1) 5 6 2019-01-21 POINT (2 1) 6 7 2019-01-22 POINT (2 1) 7 8 2019-01-23 POINT (2 1) 8 9 2019-01-20 POINT (4 3) 9 10 2019-01-21 POINT (4 3) 10 11 2019-01-22 POINT (4 3) 11 12 2019-01-23 POINT (4 3) 12 > > # time, rectilinear > t = as.Date("2019-01-20") + c(0, 2, 3, 10) > d = st_dimensions(t, sfc) > (st = st_as_stars(list(a = matrix(1:12, 4, 3)), dimensions = d)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. a 1 3.75 6.5 6.5 9.25 12 dimension(s): from to refsys point values X1 1 4 Date FALSE 2019-01-20,...,2019-01-30 X2 1 3 NA TRUE POINT (0 1),...,POINT (4 3) > as.data.frame(st) X1 X2 a 1 2019-01-20 POINT (0 1) 1 2 2019-01-22 POINT (0 1) 2 3 2019-01-23 POINT (0 1) 3 4 2019-01-30 POINT (0 1) 4 5 2019-01-20 POINT (2 1) 5 6 2019-01-22 POINT (2 1) 6 7 2019-01-23 POINT (2 1) 7 8 2019-01-30 POINT (2 1) 8 9 2019-01-20 POINT (4 3) 9 10 2019-01-22 POINT (4 3) 10 11 2019-01-23 POINT (4 3) 11 12 2019-01-30 POINT (4 3) 12 > > proc.time() user system elapsed 0.85 0.12 0.96 stars/tests/crop.Rout.save0000644000176200001440000000702514644736040015337 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > x = read_stars(tif) > xy = structure(list(x = c(293253.999046018, 296400.196497684), y = c(9113801.64775462, + 9111328.49619133)), .Names = c("x", "y")) > pts = st_as_sf(data.frame(do.call(cbind, xy)), coords = c("x", "y"), crs = st_crs(x)) > image(x, axes = TRUE) > plot(st_as_sfc(st_bbox(pts)), col = NA, add = TRUE) > > bb = st_bbox(pts) > (xx = x[bb]) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 3 56 73 70.87303 89 255 dimension(s): from to offset delta refsys point x/y x 158 268 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 245 331 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > image(xx) > plot(st_as_sfc(bb), add = TRUE, col = NA) > st_contains(st_as_sfc(st_bbox(xx)), st_as_sfc(st_bbox(pts))) Sparse geometry binary predicate list of length 1, where the predicate was `contains' 1: 1 > > image(x) > pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) > buf = st_buffer(st_sfc(pt, crs = st_crs(x)), 1500) > plot(buf, add = TRUE) > > buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), + crs = st_crs(x)) > image(x[buf]) > plot(buf, add = TRUE, col = NA) > image(x[buf,crop=FALSE]) > plot(buf, add = TRUE, col = NA) > > plot(x, rgb = 1:3) > > # #638: > l = st_as_stars(L7_ETMs) > st_bbox(l) |> st_as_sfc() -> bb > (bb + 1e6) |> st_set_crs(st_crs(l)) -> b > st_crop(l, b) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's L7_ETMs NA NA NA NaN NA NA 737088 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA Warning message: In st_crop.stars(l, b) : st_crop: bounding boxes of x and y do not overlap > st_intersects(b, st_as_sfc(st_bbox(l))) |> as.matrix() [,1] [1,] FALSE > (bb - 1e6) |> st_set_crs(st_crs(l)) -> b > st_crop(l, b) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's L7_ETMs NA NA NA NaN NA NA 737088 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA Warning message: In st_crop.stars(l, b) : st_crop: bounding boxes of x and y do not overlap > > proc.time() user system elapsed 3.15 0.39 3.48 stars/tests/predict.R0000644000176200001440000000074013777653456014355 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) # predict: tif = system.file("tif/L7_ETMs.tif", package = "stars") (x = read_stars(tif)) st_crs(x) = st_crs(x) # cleans trailing space model = lm(x~L7_ETMs.tif, head(as.data.frame(x), 50)) x = predict(x, model) (y = read_stars(tif, proxy = TRUE)) (yp = predict(y, model)) all.equal(x, st_as_stars(yp)) yy = st_set_dimensions(y, 3, values = paste0("band", 1:6)) (y_spl = split(yy, 3)) as.data.frame(st_as_stars(split(yy, 3)))[1:3,] stars/tests/stars.R0000644000176200001440000001114614603250422014030 0ustar liggesusersSys.setenv(TZ="UTC") suppressPackageStartupMessages(library(stars)) set.seed(13521) # runif tif = system.file("tif/L7_ETMs.tif", package = "stars") (x_ = read_stars(c(tif,tif))) # FIXME: not what you'd expect (x = read_stars(tif)) # image(x) gdal_crs(tif) plot(x) plot(x, join_zlim = FALSE) x %>% st_set_dimensions(names = c('a', 'b', 'c')) st_get_dimension_values(x, 3) (x1 = st_set_dimensions(x, "band", values = c(1,2,3,4,5,7), names = "band_number", point = TRUE)) rbind(c(0.45,0.515), c(0.525,0.605), c(0.63,0.69), c(0.775,0.90), c(1.55,1.75), c(2.08,2.35)) %>% units::set_units(um) -> bw # units::set_units(µm) -> bw # set bandwidth midpoint: (x2 = st_set_dimensions(x, "band", values = 0.5 * (bw[,1]+bw[,2]), names = "bandwidth_midpoint", point = TRUE)) # set bandwidth intervals: (x3 = st_set_dimensions(x, "band", values = make_intervals(bw), names = "bandwidth")) x + x x * x x[,,,1:3] x[,1:100,100:200,] sqrt(x) st_apply(x, 3, min) st_apply(x, 1:2, max) st_apply(x, 1:2, range) geomatrix = system.file("tif/geomatrix.tif", package = "stars") x = read_stars(geomatrix) y = st_transform(x, st_crs(4326)) st_coordinates(x)[1:2,] nc = system.file("nc/tos_O1_2001-2002.nc", package = "stars") if (nc != "" && require(PCICt, quietly = TRUE)) { print(x <- read_stars(nc)) print(st_bbox(x)) s = st_as_stars(st_bbox(x)) # inside = NA print(st_bbox(s)) s = st_as_stars(st_bbox(x), inside = TRUE) print(st_bbox(s)) s = st_as_stars(st_bbox(x), inside = FALSE) print(st_bbox(s)) (s = st_as_stars(st_bbox(x), dy = 1)) print(st_bbox(s)) print(identical(st_as_stars(st_bbox(x), dx = 1), st_as_stars(st_bbox(x), dy = 1))) s = st_as_stars(st_bbox(x), dx = 10) print(st_bbox(s)) s = st_as_stars(st_bbox(x), dx = 20) print(st_bbox(s)) x1 = x st_crs(x1) = "OGC:CRS84" print(identical(st_as_stars(st_bbox(x1), dx = 1), st_as_stars(st_bbox(x1), dx = units::set_units(1, degree)))) df = as.data.frame(x) if (require(units, quietly = TRUE)) print(units::drop_units(x)) print(dimnames(x)) dimnames(x) <- letters[1:3] print(dimnames(x)) } # PCICt st_as_stars() # multiple sub-datasets: nc_red = system.file("nc/reduced.nc", package = "stars") red = read_stars(nc_red) red plot(red) x = st_xy2sfc(read_stars(tif)[,1:10,1:10,], as_points = FALSE) st_bbox(x) x = read_stars(tif) merge(split(x, "band")) read_stars(c(tif,tif)) # merges as attributes read_stars(c(tif,tif), along = "sensor") read_stars(c(tif,tif), along = 4) read_stars(c(tif,tif), along = "band") read_stars(c(tif,tif), along = 3) # cut: tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) cut(x, c(0, 50, 100, 255)) cut(x[,,,1,drop=TRUE], c(0, 50, 100, 255)) plot(cut(x[,,,1,drop=TRUE], c(0, 50, 100, 255))) st_bbox(st_dimensions(x)) x[x < 0] = NA x[is.na(x)] = 0 # c: f = system.file("netcdf/avhrr-only-v2.19810902.nc", package = "starsdata") if (FALSE && f != "") { files = c("avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc") l = list() for (f in files) { from = system.file(paste0("netcdf/", f), package = "starsdata") l[[f]] = read_stars(from, sub = c("sst", "anom")) } ret = do.call(c, l) print(ret) ret = adrop(c(l[[1]], l[[2]], l[[3]], along = list(times = as.Date("1981-09-01") + 0:2))) print(ret) #ret = adrop(adrop(c(l[[1]], l[[2]], l[[3]], along = "times"))) #print(ret) } st_dimensions(list(matrix(1, 4, 4))) # st_dimensions.default if (FALSE && require("starsdata", quietly = TRUE)) { # curvilinear: s5p = system.file( "sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata") print(s5p) lat_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/latitude") lon_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/longitude") nit_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column") lat = read_stars(lat_ds) lon = read_stars(lon_ds) nit = read_stars(nit_ds) nit[[1]][nit[[1]] > 9e+36] = NA ll = setNames(c(lon, lat), c("x", "y")) nit.c = st_as_stars(nit, curvilinear = ll) print(nit.c) s5p = system.file( "sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata") nit.c2 = read_stars(s5p, sub = "//PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column", curvilinear = c("//PRODUCT/latitude", "//PRODUCT/longitude")) print(all.equal(nit.c, nit.c2)) } stars/tests/ee.R0000644000176200001440000000137314576033423013277 0ustar liggesusers# show that extract with exact=TRUE equals st_interpolate_aw(), only much faster options(digits=15) suppressPackageStartupMessages(library(stars)) L = st_as_stars(L7_ETMs)[,,,1] set.seed(123432) st_bbox(L) |> st_as_sfc() |> st_centroid() |> st_buffer(50) |> st_sample(10) |> st_combine() |> st_convex_hull() -> ch if (interactive()) { plot(L, reset = FALSE) plot(ch, add = TRUE, border = 'red', col = NA) } if (FALSE) { e = st_extract(L, ch)[[1]] a = aggregate(L, ch, mean)[[1]] identical(e, a) # same code path ee = aggregate(L, ch, mean, exact = TRUE)[[1]] all.equal(e, ee) aw = suppressWarnings(st_interpolate_aw(L, ch, extensive = FALSE)$V1) all.equal(as.vector(ee), aw) ee0 = st_extract(L, ch, exact = TRUE)[[1]] all.equal(ee0, ee) # ?? } stars/tests/gridtypes.R0000644000176200001440000000576413777653456014750 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) # regular, but not spatial: d = st_dimensions(a = 1:3, b = 1:3, band = c("foo", "bar")) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] try(x <- st_bbox(st)) # error # regular, geotransform: d = st_dimensions(x = 1:3, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y")) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] as.data.frame(st, add_max=TRUE)[1:4,] st_bbox(st) # rectilinear with offset given: xd = c(1, 2, 4) d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y")) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] as.data.frame(st, add_max=TRUE)[1:4,] st_bbox(st) # rectilinear with midpoints given: xd = c(1, 2, 4) d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y"), cell_midpoints = TRUE) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] as.data.frame(st, add_max=TRUE)[1:4,] st_bbox(st) # rectilinear with midpoints given, point support xd = c(1, 2, 4) d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y"), cell_midpoints = TRUE, point = TRUE) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] as.data.frame(st, add_max=TRUE)[1:4,] st_bbox(st) # rectilinear with start/end given: #xd = stars:::make_intervals(start = c(1,2,4), end = c(2, 4, 8)) xd = c(1, 2, 4, 8) # one more than dim of the data array d = st_dimensions(x = xd, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y")) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] as.data.frame(st, add_max=TRUE)[1:4,] st_bbox(st) # with sfc: sfc = st_sfc(st_point(0:1), st_point(2:1), st_point(4:3)) d = st_dimensions(x = sfc, y = 1:3, band = c("foo", "bar")) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] st_as_sf(st, long = TRUE)[1:4,] st_bbox(st) # rotated/sheared: d = st_dimensions(x = 1:3, y = 1:3, band = c("foo", "bar"), .raster = c("x", "y"), affine = c(0.2, -0.2)) (st = st_as_stars(array(1:18, c(3,3,2)), dimension = d)) as.data.frame(st, add_max=FALSE)[1:4,] try(as.data.frame(st, add_max=TRUE)[1:4,]) # errors st_bbox(st) # curvilinear: set.seed(13531) lon = st_as_stars(matrix(signif(runif(9), 2), 3, 3)) lat = st_as_stars(matrix(signif(runif(9), 2), 3, 3)) ll = setNames(c(lon, lat), c("lon", "lat")) d = st_dimensions(lon = 1:3, lat = 1:3) a = st_as_stars(list(X = array(1:9, c(3,3))), dimensions = d) (st = st_as_stars(a, curvilinear = ll)) as.data.frame(st) st_bbox(st) # time regular: t = as.Date("2019-01-20") + 0:3 d = st_dimensions(t, sfc) (st = st_as_stars(list(a = matrix(1:12, 4, 3)), dimensions = d)) as.data.frame(st) # time, rectilinear t = as.Date("2019-01-20") + c(0, 2, 3, 10) d = st_dimensions(t, sfc) (st = st_as_stars(list(a = matrix(1:12, 4, 3)), dimensions = d)) as.data.frame(st) stars/tests/align.R0000644000176200001440000000201114157612520013762 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) set.seed(1331) st_sample(st_as_sfc(st_bbox(L7_ETMs)), 1) b = st_buffer(st_sample(st_as_sfc(st_bbox(L7_ETMs)), 1), 335) bba = stars:::st_align(st_bbox(b), st_dimensions(L7_ETMs)) plot(L7_ETMs[,,,1], extent = st_buffer(b, 20), reset = FALSE, key.pos = NULL) plot(b, add = TRUE, col = NA, border = 'red') plot(st_as_sfc(st_bbox(b)), col = NA, border = 'red', add = TRUE) plot(st_as_sfc(bba), col = NA, border = 'blue', add = TRUE) st_bbox(b) bba plot(L7_ETMs[,,,1], reset = FALSE, key.pos = NULL) plot(b, col = 'red', add = TRUE) plot(st_as_sfc(bba), col = NA, border = 'blue', add = TRUE) b0 = st_buffer(b, -100) L7 = st_as_stars(L7_ETMs)[b0][,,,1] |> st_normalize() bbb = stars:::st_align(st_bbox(b), st_dimensions(L7)) plot(L7, extent = st_buffer(b, 120), reset = FALSE, key.pos = NULL) plot(st_as_sfc(st_bbox(L7)), col = NA, border = 'black', add = TRUE) plot(st_as_sfc(bbb), col = NA, border = 'blue', add = TRUE) plot(b, col = NA, border = 'red', add = TRUE) all.equal(bbb, bba) stars/tests/dimensions.R0000644000176200001440000000113713777653456015074 0ustar liggesusers# https://github.com/r-spatial/stars/issues/295 suppressPackageStartupMessages(library(stars)) raw <- read_stars(system.file("nc/bcsd_obs_1999.nc", package = "stars")) foo <- function(x, idx) stats::lowess(idx, x)$y timeline <- st_get_dimension_values(raw, "time") smooth = st_apply(raw, MARGIN = c("x", "y"), FUN = foo, idx = st_get_dimension_values(raw, "time") ) st_set_dimensions(smooth, which = "foo", values = st_get_dimension_values(raw, "time"), names = "time" ) raw %>% st_apply(MARGIN = c("x", "y"), FUN = foo, idx = timeline) %>% st_set_dimensions("foo", st_dimensions(raw)["time"]) stars/tests/curvilinear.Rout.save0000644000176200001440000000513514644736040016717 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > > s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata") > if (s5p != "") { + + lat_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/latitude") + lon_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/longitude") + nit_ds = paste0("HDF5:\"", s5p, "\"://PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column") + lat = read_stars(lat_ds) + lon = read_stars(lon_ds) + nit = read_stars(nit_ds) + nit[[1]][nit[[1]] > 9e+36] = NA + + ll = setNames(c(lon, lat), c("x", "y")) + nit.c0 = st_as_stars(nit, curvilinear = ll) + + # more direct method: + nit.c = read_stars(s5p, sub = "//PRODUCT/SUPPORT_DATA/DETAILED_RESULTS/nitrogendioxide_summed_total_column", + curvilinear = c("//PRODUCT/longitude", "//PRODUCT/latitude"), driver = NULL) + if (inherits(nit.c[[1]], "units")) + nit.c[[1]] = units::drop_units(nit.c[[1]]) + nit.c[[1]][nit.c[[1]] > 9e+36] = NA + all.equal(nit.c0, nit.c) + st_crs(nit.c) = 4326 + print(nit.c) + + if (FALSE && capabilities()["png"]) { + png("nit1.png", 800, 800) + plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16) + maps::map('world', add = TRUE, col = 'red') + dev.off() + + png("nit2.png", 800, 800) + plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA) + maps::map('world', add = TRUE, col = 'red') + dev.off() + + nit.c = stars:::st_downsample(nit.c, 8) + print(nit.c) + + png("nit3.png", 800, 800) + plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16) + maps::map('world', add = TRUE, col = 'red') + dev.off() + + png("nit4.png", 800, 800) + plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA) + maps::map('world', add = TRUE, col = 'red') + dev.off() + } + + } > > proc.time() user system elapsed 0.60 0.14 0.75 stars/tests/rasterize.Rout.save0000644000176200001440000001270314644736040016403 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > suppressPackageStartupMessages(library(stars)) > nc = read_sf(system.file("gpkg/nc.gpkg", package="sf")) > (x = st_rasterize(nc)) # default grid: stars object with 2 dimensions and 12 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's AREA 0.042 0.108 0.142 1.451932e-01 0.181 0.241 30904 PERIMETER 0.999 1.461 1.716 1.786110e+00 2.004 3.640 30904 CNTY_ 1825.000 1907.000 1989.000 1.998403e+03 2085.000 2241.000 30904 CNTY_ID 1825.000 1907.000 1989.000 1.998403e+03 2085.000 2241.000 30904 FIPSNO 37001.000 37049.000 37101.000 3.710042e+04 37153.000 37199.000 30904 CRESS_ID 1.000 25.000 51.000 5.071206e+01 77.000 100.000 30904 BIR74 248.000 1323.000 2648.000 3.791637e+03 4139.000 21588.000 30904 SID74 0.000 3.000 5.000 7.891985e+00 10.000 44.000 30904 NWBIR74 1.000 297.000 844.000 1.246210e+03 1396.000 8027.000 30904 BIR79 319.000 1606.000 3108.000 4.852046e+03 5400.000 30757.000 30904 SID79 0.000 3.000 6.000 9.584098e+00 13.000 57.000 30904 NWBIR79 3.000 360.000 1058.000 1.604642e+03 1524.000 11631.000 30904 dimension(s): from to offset delta refsys point x/y x 1 461 -84.32 0.01925 NAD27 FALSE [x] y 1 141 36.59 -0.01925 NAD27 FALSE [y] > plot(x, axes = TRUE) > # a bit more customized grid: > (x = st_rasterize(nc, st_as_stars(st_bbox(nc), nx = 100, ny = 50, values = NA_real_))) stars object with 2 dimensions and 12 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's AREA 0.042 0.108 0.142 0.145536 0.181 0.241 2373 PERIMETER 0.999 1.470 1.716 1.789032 2.004 3.640 2373 CNTY_ 1825.000 1908.000 1989.000 1999.761325 2088.000 2241.000 2373 CNTY_ID 1825.000 1908.000 1989.000 1999.761325 2088.000 2241.000 2373 FIPSNO 37001.000 37049.000 37101.000 37100.327750 37151.000 37199.000 2373 CRESS_ID 1.000 25.000 51.000 50.663875 76.000 100.000 2373 BIR74 248.000 1323.500 2648.000 3790.530263 4139.000 21588.000 2373 SID74 0.000 3.000 5.000 7.905976 10.000 44.000 2373 NWBIR74 1.000 289.000 844.000 1246.116483 1396.000 8027.000 2373 BIR79 319.000 1606.000 3108.000 4848.231062 5386.000 30757.000 2373 SID79 0.000 3.000 6.000 9.574419 13.000 57.000 2373 NWBIR79 3.000 360.000 1058.000 1602.740769 1524.000 11631.000 2373 dimension(s): from to offset delta refsys point x/y x 1 100 -84.32 0.08867 NAD27 FALSE [x] y 1 50 36.59 -0.05415 NAD27 FALSE [y] > plot(x, axes = TRUE) > (ls = st_sf(a = 1:2, st_sfc(st_linestring(rbind(c(0.1, 0), c(1.1, 1))), st_linestring(rbind(c(0, 0.05), c(1, 0.05)))))) Simple feature collection with 2 features and 1 field Geometry type: LINESTRING Dimension: XY Bounding box: xmin: 0 ymin: 0 xmax: 1.1 ymax: 1 CRS: NA a 1 1 2 2 c..st_sfc.st_linestring.rbind.c.0.1..0...c.1.1..1.....st_linestring.rbind.c.0..........0.05...c.1..0.05...... 1 LINESTRING (0.1 0, 1.1 1) 2 LINESTRING (0 0.05, 1 0.05) > (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = NA_real_)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's values NA NA NA NaN NA NA 100 dimension(s): from to offset delta x/y x 1 10 0 0.1 [x] y 1 10 1 -0.1 [y] > # the following two plots confirm that (only) the > # upper-left corner is part of the grid cell (when dy is negative), leading > # to a seemingly half-gridcell-shift problem: > ## sf_extSoftVersion()["GDAL"] > plot(st_rasterize(ls, grd), axes = TRUE, reset = FALSE) # ALL_TOUCHED=FALSE; > plot(ls, add = TRUE, col = "red") > plot(st_rasterize(ls, grd, options = "ALL_TOUCHED=TRUE"), axes = TRUE, reset = FALSE) > plot(ls, add = TRUE, col = "red") > # add lines to existing 0 values, summing values in case of multiple lines: > (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = 0)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. values 0 0 0 0 0 0 dimension(s): from to offset delta x/y x 1 10 0 0.1 [x] y 1 10 1 -0.1 [y] > r = st_rasterize(ls, grd, options = c("MERGE_ALG=ADD", "ALL_TOUCHED=TRUE")) > plot(r, axes = TRUE, reset = FALSE) > plot(ls, add = TRUE, col = "red") > > proc.time() user system elapsed 1.42 0.28 1.70 stars/tests/sp.R0000644000176200001440000000147714452766244013344 0ustar liggesusersoptions(rgdal_show_exportToProj4_warnings = "none") if (suppressPackageStartupMessages(require(sp, quietly = TRUE))) { demo(meuse) # remove +init=xxx meuse@proj4string = CRS( "+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs" ) meuse.grid@proj4string = CRS( "+proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs" ) suppressPackageStartupMessages(library(stars)) (m = st_as_stars(meuse)) (gr = st_as_stars(meuse.grid)) m2 = as(m, "Spatial") summary(m2) gr2 = as(gr, "Spatial") summary(gr2) all.equal(meuse, m2, check.attributes = FALSE) fullgrid(meuse.grid) = TRUE all.equal(meuse.grid, gr2, check.attributes = FALSE) #all.equal(meuse, m2) #all.equal(meuse.grid, gr2) } stars/tests/proxy.Rout.save0000644000176200001440000002760214644736040015560 0ustar liggesusers R Under development (unstable) (2024-07-13 r86895 ucrt) -- "Unsuffered Consequences" Copyright (C) 2024 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > Sys.setenv(TZ="UTC") > suppressPackageStartupMessages(library(sf)) > suppressPackageStartupMessages(library(stars)) > tif = system.file("tif/L7_ETMs.tif", package = "stars") > (r = read_stars(tif, proxy = TRUE)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > if (interactive()) { + plot(r) + } > dim(r) x y band 349 352 6 > r[,,,2:3] stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 2 3 NA NA NA NA > r+r stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] e1 + e2 attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > st_as_stars(sin(r), downsample = 2) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif -0.9999902 -0.676772 0.0353983 0.01655317 0.7210377 0.9999119 dimension(s): from to offset delta refsys point x/y x 1 117 288776 85.01 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 118 9120761 -85.02 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > aperm(r, c(3,2,1)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] aperm(a = a, perm = perm) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > if (interactive()) { + plot(r) + } > (xx = c(r,r)) stars_proxy object with 2 attributes in 2 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > st_redimension(xx) stars_proxy object with 1 attribute in 2 file(s): $L7_ETMs.tif.L7_ETMs.tif [1] "[...]/L7_ETMs.tif" "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE band 1 6 NA NA NA NA new_dim 1 2 NA NA NA NA values x/y x NULL [x] y NULL [y] band NULL new_dim L7_ETMs.tif, L7_ETMs.tif > st_as_stars(r) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. L7_ETMs.tif 1 54 69 68.91242 86 255 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > (y = st_apply(r, 1:2, max)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > (yy = st_as_stars(y, downsample = 1)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. max 55 85 96 99.38568 113 255 dimension(s): from to offset delta refsys point x/y x 1 175 288776 56.84 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 176 9120761 -57 SIRGAS 2000 / UTM zone 25S FALSE [y] > (y = adrop(st_apply(r, c("x", "y"), max))) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) attr(,".Environment") [[2]] adrop(x = x, drop = drop) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > (yy = st_as_stars(y, downsample = 1)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. max 55 85 96 99.38568 113 255 dimension(s): from to offset delta refsys point x/y x 1 175 288776 56.84 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 176 9120761 -57 SIRGAS 2000 / UTM zone 25S FALSE [y] > plot(yy) > (y = adrop(st_apply(r, c("x", "band"), max))) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) attr(,".Environment") [[2]] adrop(x = x, drop = drop) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > (yy = st_as_stars(y, downsample = 1)) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. max 77 111 133 137.8505 157 255 dimension(s): from to offset delta refsys point x 1 175 288776 56.84 SIRGAS 2000 / UTM zone 25S FALSE band 1 6 NA NA NA NA Warning message: In FUN(X[[i]], ...) : st_apply on x/y dimensions applied to downsampled image(s) > rm(yy) > > (xx = c(r,r)) stars_proxy object with 2 attributes in 2 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > names(xx) = c("a", "b") > xx["a"] stars_proxy object with 1 attribute in 1 file(s): $a [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA > pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) > buf = st_buffer(st_sfc(pt, crs = st_crs(r)), 1500) > buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), + crs = st_crs(r)) > r = r[buf] # crops > r = r[buf, epsilon = 1e-5] # crops with shrinked bounding box > > # c: > f = system.file("netcdf/avhrr-only-v2.19810902.nc", package = "starsdata") > if (FALSE && f != "") { + files = c("avhrr-only-v2.19810901.nc", + "avhrr-only-v2.19810902.nc", + "avhrr-only-v2.19810903.nc", + "avhrr-only-v2.19810904.nc", + "avhrr-only-v2.19810905.nc", + "avhrr-only-v2.19810906.nc", + "avhrr-only-v2.19810907.nc", + "avhrr-only-v2.19810908.nc", + "avhrr-only-v2.19810909.nc") + l = list() + for (f in files) { + from = system.file(paste0("netcdf/", f), package = "starsdata") + l[[f]] = read_stars(from, sub = c("sst", "anom"), proxy = TRUE) + } + ret = do.call(c, l) + print(ret) + all = system.file(paste0("netcdf/", files), package = "starsdata") + ret = read_stars(all, sub = c("sst", "anom")) + print(ret) + print(st_redimension(ret)) # collapse the two attributes into new dimension + + try(ret <- c(l[[1]], l[[2]], l[[3]], along = list(times = as.Date("1981-09-01") + 0:2))) + #print(ret) + #ret = adrop(adrop(c(l[[1]], l[[2]], l[[3]], along = "times"))) + #print(ret) + ret <- st_redimension(l[[1]], along = list(times = as.Date("1981-09-01") + 0:1)) + print(ret) + } > > # demonstrate that environments work: > x = read_stars(tif, proxy = TRUE) > f = function(x) { + g = function(xx) { + ndvi = function(z1, z2, z3, z4, z5, z6) (z2-z1)/(z2+z1) + st_apply(xx, 1:2, ndvi) + } + g(x) + } > (x = f(x)) stars_proxy object with 1 attribute in 1 file(s): $L7_ETMs.tif [1] "[...]/L7_ETMs.tif" dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] band 1 6 NA NA NA NA call_list: [[1]] st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname) attr(,".Environment") This object has pending lazy operations: dimensions as printed may not reflect this. > st_as_stars(x) stars object with 2 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. ndvi -0.2828283 -0.1081081 -0.08287293 -0.08464615 -0.05882353 0.09259259 dimension(s): from to offset delta refsys point x/y x 1 349 288776 28.5 SIRGAS 2000 / UTM zone 25S FALSE [x] y 1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y] > > proc.time() user system elapsed 2.12 0.14 2.26 stars/tests/redimension.R0000644000176200001440000000073114353574021015214 0ustar liggesuserssuppressPackageStartupMessages(library(stars)) tif = system.file("tif/L7_ETMs.tif", package = "stars") r = read_stars(list(a = c(tif,tif), b = c(tif, tif)), proxy = TRUE) (xx = st_redimension(r, along = list(foo = 1:4))) (rr = c(xx, xx)) # st_as_stars(rr) (rrr = st_redimension(rr, along = list(bar = as.Date(c("2001-01-01", "2002-01-01"))))) (rr = c(a = xx, b = xx)) # st_as_stars(rr) (rrr = st_redimension(rr, along = list(bar = as.Date(c("2001-01-01", "2002-01-01"))))) stars/MD50000644000176200001440000003140514645437762011743 0ustar liggesusers51df8acd6d880ca7d79e2ea90bde418c *DESCRIPTION c9143d733713314a8e64db43518e391a *NAMESPACE b2faa5694c1294722ef02e9182891950 *NEWS.md 3ff18e713497a0a4563c64c53c6e4094 *R/OpenStreetMap.R 23f61c368b966570f4a2076e5a71a6fa *R/aggregate.R 317a0803b9901a2d35bebe64ed54c487 *R/cubble.R 3e29b9fdfd337f0a2a53b20aba3ddd5f *R/datasets.R 0a0665f9a6bfa07871189b6e7af39663 *R/dimensions.R fe1c1e4d87ddcc318b93e73c7940bd3c *R/extract.R db43e3cba96bf86f6db78db3fa17b02b *R/factors.R c10bcd3ca447083818112126e0ca8eaf *R/geom.R c38ec2e5350dfc55bb854f4ee5993a8a *R/gt.R d6d43ae9b7967766e654a47b48a661cc *R/init.R bf168ff258ece437f4c0ec462d4b81b0 *R/intervals.R 6a121cdce3dae76091052aed7bb730a8 *R/mdim.R 40bfd832d56453c6c6342f93b8517b3d *R/mosaic.R 9bd602b8bd5c979afe7f05e2dba96867 *R/ncdf.R 4e4d6b2232cbcd453d00a29a0d8b99cd *R/ncproxy.R 496509e1dc786797226357f2aaa38de1 *R/ops.R 212da32cfda01a99d821c0e5f8f74b4e *R/plot.R fabcad9577aa60754db1c58ceeaafb80 *R/prcomp.R 8e4ffa04dd2757121226fa4cc2fbde30 *R/proxy.R 84208afdbfb87d196f3fe11f5109ff05 *R/raster.R 87605008f3d3e64f1fab6e7936cff690 *R/rasterize.R af9dadc9fa1e50d988735a191d9ed1fc *R/read.R 44bc5d3f75d6e8a6b659addd4d238d6f *R/rotate.R 06e08b039665c0f1fc8325edbd0e4773 *R/sample.R 1bc9fdc577d84932cf0880853e2bc9c1 *R/sf.R 6ec12d5bfeee859e48cb7b10396a6f92 *R/sp.R ecbb9f4c3ebfdbff0a0a91e7d4acb267 *R/spacetime.R 98b9cb65c57c4876806fb98ae072d019 *R/spatstat.R 0731d778ae0c96ebb0f89a72eb2922e6 *R/stars.R b7a013141b215ff32a52adbb1018d65a *R/subset.R 12a4bd14f93a076df0e0d0aec491a378 *R/tidyverse.R 3fd9d7fc0a49ac7b0674624604295ccd *R/tile.R 71c72bf6e0ae8be2a17e9c53865e56d5 *R/transform.R ed43225cec6b11bdef9eb818ff772f3e *R/values.R 69375ac0f5144f1f455342f12091f5fc *R/warp.R 716eb424d3baffe0371f5a37f84f8483 *R/write.R 3922eea2449e008ce02a6a7d7f114883 *R/xts.R f97d665bc38fe308da66829de6ea5262 *build/vignette.rds a435bedc6ce47db8500cbe305977d62b *data/L7_ETMs.rda 67039d8a3fe23f44081872eba9a4a1bf *data/bcsd_obs.rda c029436ddd75626396a03e5212dd9d61 *data/stars_sentinel2.rda eedf2309c7b1e13b8dfdf3cfc083c62a *demo/00Index 2e05f69139fb57e284fbab0739c0d9de *demo/spacetime.R 79c89095fa978bc34c60426d24584598 *demo/udf_demo.R e0a4e7f8e849cdc30df67b1ee466cb10 *inst/CITATION e571cb774a4324b6f87a9c8a20bccb91 *inst/doc/stars1.R 26b27a56fceb04a98e2af790e6ef971d *inst/doc/stars1.Rmd 38bbbbd18e5ecb32966e3a2848d11716 *inst/doc/stars1.html 3ee1741c1cc4d120c9e52f9f14087fbe *inst/doc/stars2.R 63d13a5eaba8a244dd4b7a63847f2091 *inst/doc/stars2.Rmd cae44f576b35f8926ea4f337cda11e5a *inst/doc/stars2.html 67ddf2ba7cfb695e7d485d98a6ff8184 *inst/doc/stars3.R 1aa2d383c440837f12b8696bffb3eaa9 *inst/doc/stars3.Rmd f92945847d0fcd5f6d2e52646e4a5b76 *inst/doc/stars3.html f20ab2c94fa2ada0776e824d67cdcc73 *inst/doc/stars4.R baf2929fa168488a0dc25614f456e173 *inst/doc/stars4.Rmd 08b0fc7927d141df836bbe06508d0e79 *inst/doc/stars4.html eb5d12bd5434e326899f7851a4f2bee0 *inst/doc/stars5.R b520916931b2177a62f7d18e3c532a8b *inst/doc/stars5.Rmd d5a9490fbacd8e6d7e420ef8f9ba1508 *inst/doc/stars5.html 317ab56132918c703204601a576b1de2 *inst/doc/stars6.R 38e6a52a29e9fb23896d50e473091331 *inst/doc/stars6.Rmd 028c8e506d32c59bedee4262c0b806cc *inst/doc/stars6.html 08e507bbd03192bc1e41cac8a80411dd *inst/doc/stars7.Rmd da5323ea6638e7afb7218d15d48ee19f *inst/doc/stars7.html b8388b6cca5a71934dbffe5dfda9788a *inst/doc/stars8.R 9bfcb15fb52f6cdf4a4303c3f3ce7d7f *inst/doc/stars8.Rmd 365125c744f15ef79bdd4ecf2a37e5b6 *inst/doc/stars8.html ecfed7037cea35ed0d882b2052a365d6 *inst/docker/fedora/Dockerfile deb1c90408a0dca2f6a2f337d06bc4a2 *inst/docker/rdevel/Dockerfile 0e6a84f1535795799ec915d5fcf368f6 *inst/docker/trusty/Dockerfile 9bc407f78d194cf7d6754c72581bf29c *inst/docker/ubuntu/Dockerfile f45775750a47b7df9fa6a49b8f58db19 *inst/gpkg/s2.gpkg 6b0bf065fe515e195fa63f5771e483e2 *inst/nc/3B42_Daily.19991231.7.test.nc 738ee1f8cd5e71a0b1296e9feee02813 *inst/nc/EURO-CORDEX_81_DOMAIN000_mask_int.nc.zip ca0fb07e4e777802f27fbd6eaeefddef *inst/nc/bcsd_obs_1999.nc 02bf8d6cbe11eeb4c68d7c9012471f7c *inst/nc/c201923412.out1_4.nc aaabd6ad872e65778656289fcc9141d6 *inst/nc/d d41d8cd98f00b204e9800998ecf8427e *inst/nc/d.nc f332ae1ddb0439d97cba3e2c8b388a9c *inst/nc/lcc_km.nc f958364f2684da3bf4168137374a9ee6 *inst/nc/ncdf_tidync.R 04d2cbcd943c6741d6da5051f807330c *inst/nc/plot_bcsd_obs_1999.R 0898370734408f416608b96b32dc1960 *inst/nc/reduced.R cdce72d0d8ecdad6aff1e29e52f97efb *inst/nc/reduced.nc 27338fe22e77beb17e7411348ab4801f *inst/nc/sub.nc 0f16970f7eb398c2395ba7cc27efb46f *inst/nc/test-1.nc dac4e316d85e67a1ee4d2f27d7643b12 *inst/nc/test_adaptor.cams_regional_fc.nc a07c1ea5d3bf307e9a614b677f4ef887 *inst/nc/test_stageiv_xyt.nc b853abab2020876a3166de3453063353 *inst/nc/test_stageiv_xyt_borked.nc 756b2bb82818a7f7ff97322a47e83d72 *inst/nc/timeseries.cdl 4392e7603e4b6f52dd3416588e051706 *inst/nc/timeseries.nc c63745af4c73c6cdb69f6a2141c47ed9 *inst/plumber/api.R 42d02b497e66bdd58599738a1a151cf3 *inst/plumber/client.R 28642f4214cc77be85a61fdb70b72c1a *inst/plumber/client_blog.R edf6b6f0a751af9f693346c88b8eee3e *inst/plumber/server.R 703f38d5bdd129f5543b6ba3aafa0ef1 *inst/plumber/server_blog.R ccdc51016cd62df38f2e6e7cefc743f3 *inst/tif/L7_ETMs.tif 49c08c46f50e67c2e5aab86a460dd783 *inst/tif/README b577a2c1d01ff7bc9d875606e39d8c67 *inst/tif/geomatrix.tif 353ff649134f5da072dd3f705749d503 *inst/tif/lc.tif 23106b7d083bd65b5ff794c8e2cbcbd0 *inst/tif/lc.tif.aux.xml 55cab99a00a945f76cd9944745747bb0 *inst/tif/na.tif 948a38e7d84ce13d37f4541f781b8287 *inst/tif/olinda_dem_utm25s.tif 630cc1c574af07f1b403c5f156e7e8aa *inst/tif/olinda_dem_utm25s.tif.aux.xml f1ab7d0643dcb71e8605480a16324857 *inst/tif/x 0d39d4a27ba6c16c3587e58a7c78284b *inst/zarr/sic_daily_sample.zarr.zip bfda2ede60cdda97cf3759eaec3d5c96 *man/L7_ETMs.Rd 962917850b9bfc211b93231a7f2f39a6 *man/aggregate.stars.Rd 0758996b89b8fafffb256c45821c4f60 *man/bcsd_obs.Rd 449ce1373c98d3389fbbcacc6632d96b *man/c.stars.Rd dad8cfc717e5a5c45dfc7d13b1b037cc *man/coerce-methods.Rd c4709f8ee577d36bb209e5c5034929eb *man/contour.stars.Rd 3f86a011197bddc05013601a2aa6b4ac *man/cut_stars.Rd 4e9c8a9118ea417cb445e495bdd2bc35 *man/dplyr.Rd e99f2daee750b5451540f160ed51373c *man/expand_dimensions.Rd 69f008fe652bf0fc9c2afe6668dae047 *man/figures/README-plot1-1.png 902041181751e6d593751abe671dbe2d *man/figures/README-plot2-1.png 95f2dab772bbba71560e90c4c8622e2d *man/figures/README-plot3-1.png 7ea6f66b680cdacba26327b533392a0a *man/figures/README-plot4-1.png c1a58f61ad5deceb2e8c8da9c7bafbe7 *man/figures/README-plot5-1.png d77bbf4e3182c575025b92fa1390a059 *man/figures/README-plot6-1.png 42df98b9fe587179662ad0d8e518bfc1 *man/geom_stars.Rd 88b86b1941af7d237870f8513079847d *man/in-methods.Rd 62e706df061a4700e9a7a753b1fb07ce *man/make_intervals.Rd 5c3c08fabadbd161874d427a862a3f8a *man/mdim.Rd 07cef2bbbf137f7e3b92c796a1c1ef18 *man/merge.Rd 9d97c09419209be42275bd710f3acf38 *man/ops_stars.Rd 1a639b7544f025784bb566905fba2cd4 *man/plot.Rd 6bf7c4f966f2ff1c5543bdf79f223fb2 *man/prcomp.Rd b589335679d907a53dfb0090c5cd57a5 *man/predict.stars.Rd ec8aae7b1bc0ea5d36594f7d40c0c6e7 *man/print_stars.Rd 76307bd626a078e683c0f722546169e5 *man/read_ncdf.Rd 71c19a3e2d5224d111565de4cc566975 *man/read_stars.Rd 5fbaddc6d84f9c5c7e2c4e074ac6f797 *man/redimension.Rd eb993b17334a26bcf7caf0d831a92cbd *man/st_apply.Rd fb35346d074c89ac040cdeb7e5fa50d0 *man/st_as_sf.Rd 26a12f5c0f94e2a5d1caa98f5e1e5b45 *man/st_as_stars.Rd b0988b71a6b734ea188e71d90b8ed9f5 *man/st_cells.Rd 24d04b8161c5aaa2b04c638176619d0d *man/st_contour.Rd f926cf1e93525dde8f79c45cec352dc2 *man/st_coordinates.Rd f35e300a8c7a8bb980f9c51030bef7fe *man/st_crop.Rd fc2c05fb740c394bb8315713151d0922 *man/st_dim_to_attr.Rd e012d25edca718f82ad95a78fbae50e8 *man/st_dimensions.Rd 9098b2e590d32ed0d08674495d2f2fad *man/st_downsample.Rd 898a8b58dd0ad476e028321407607f03 *man/st_extract.Rd 5290fd7ae9c5d7ee4bc00991bdbe32d9 *man/st_geotransform.Rd 2492ae6715a5a7383c30a3a1075d4413 *man/st_intersects.stars.Rd 24a182efee073a213e7fca246e6511fd *man/st_join.stars.Rd 5219e20f5bf8d65e78b28f4c8b2b9d85 *man/st_mosaic.Rd 35ffcb938765ff0114bdcb38909bd7d6 *man/st_raster_type.Rd c374d920193535566b1419d01bfc0378 *man/st_rasterize.Rd 155250be07cff12864477bcf7ae1867f *man/st_res.Rd 98bbfb6b6785c51e05d3bd97614d9b20 *man/st_rgb.Rd 3e4157efc877d0dac1e9095ff48d2965 *man/st_rotate.Rd 4fc8d1bedcc274633b2a1a207e05612a *man/st_set_bbox.Rd e69c14a857c81617ac038babcd4021fe *man/st_sfc2xy.Rd 0a56ce9a80f75e12f09e4c9cc039544d *man/st_tile.Rd 8507d2012f4e6a2e72e313e9debb6b42 *man/st_transform.Rd 123491944baf8db2f3a66715477ee898 *man/st_warp.Rd 9728d47a3057ab95c81d6d7d7eb8a85a *man/st_xy2sfc.Rd eb0d357bd8127a8d18f7a9f94b94fb80 *man/stars_sentinel2.Rd 02f16a4120edb54a55052aa84efddc65 *man/stars_subset.Rd 41487659acc082b9210f37835d4a66cb *man/write_stars.Rd 5ccb5f10273d0615ec990058cfe468c9 *tests/aggregate.R f89db159f68e4ee49c5a918da7d61829 *tests/aggregate.Rout.save 428221e6e2fb186c957a5a092e990a65 *tests/align.R 1261660df61f50c7ad64c1087223e5d3 *tests/align.Rout.save df0fa2b1fa7cb4725b2214e35e36a7ec *tests/area.R 09299ad729fd12cd90944e7812caef66 *tests/area.Rout.save ea4c216c5bbbc11089aa5e9503004337 *tests/crop.R 7d2f55b528c900389ac7b68d06c45d83 *tests/crop.Rout.save 0d88973bad61992fbc5534180c47ce0b *tests/curvilinear.R 995c05ac3405e5f0bf17ed6d58b155de *tests/curvilinear.Rout.save e97c2cb4b610e384fa8e226764bf6562 *tests/datasets.R 2134ff7ea282c5c8bd5227baa0c0f45c *tests/datasets.Rout.save c6853fcd5d9939de6da8e51cae3310a3 *tests/dimensions.R 6bad3fba028e472420c5262ced579c74 *tests/dimensions.Rout.save beaa423061b000076cd2f8210c984b9a *tests/downsample.R 30691c4ce6327afa129785b4eb894550 *tests/downsample.Rout.save e017b551bc55e27235d2caa47ef69cc6 *tests/ee.R c216db2c84fda503f73d8db85cb249de *tests/ee.Rout.save c8bedf9116ac55434df43268151ca62c *tests/extract.R 6aacc125305ff287b509145065517e29 *tests/extract.Rout.save d84ceeca92a20c3507d86f1dbfdec796 *tests/gridtypes.R de5eecdba9d3f15080d8e6d4a602c5cf *tests/gridtypes.Rout.save 2a6c7447dd961a8b3ff4d84d722566a0 *tests/mdim.R de9c9bdc7806a7e5027a97e648b8f9d7 *tests/mdim.Rout.save 0ab11674389c7a82de22ecb770b72d13 *tests/nc.R f15b0faa59e3e5445d43bda46d866121 *tests/nc.Rout.save 6a90512496059f9e1cb6ecda3d699e02 *tests/plot.R a535361620820c0166d87ca0bdcf9f30 *tests/plot.Rout.save da7caa6fd6a2ed38353f5db4409fa645 *tests/predict.R d479eba4d193dd9efced7d59d3968d58 *tests/predict.Rout.save 927ae62e8783ffe54bb80863ce652dd6 *tests/proxy.R 9c181d817e42588a498759c984788d59 *tests/proxy.Rout.save ce664334312f59e3945db93c0d78a4b0 *tests/raster.R ca5bf3262773ab1eda05a518e5cf61d0 *tests/raster.Rout.save 638de9419defa0815d5682110a9b55de *tests/rasterize.R 56e59e166dbc01231fac9470dc79b928 *tests/rasterize.Rout.save 2a657db17aa050ae15654e40b43b8ab0 *tests/rectilinear.R eb0abcfe51ffc1bf6db3c149124c9fe3 *tests/rectilinear.Rout.save 30c4191ea87c2c9d4d09983b05c2f7fb *tests/redimension.R eff8d9bc34170525190818c03792dfb3 *tests/redimension.Rout.save 75c64c8d189aae3784ae1d25b98fc17d *tests/sf.R 77a028c210c8c06a73506a64cb9746ec *tests/sf.Rout.save 832a985ac25207ddfa3b118beaa1e2c5 *tests/sp.R 2a93ca42f9e6225886803088f80d3f45 *tests/sp.Rout.save c5611f1602f169ff1379b76a7e5f6487 *tests/spacetime.R 257bb1f802dfd52f728bf2b03c85e4b4 *tests/spacetime.Rout.save 16c545c6be1c9ad378a90e210db99457 *tests/spatstat.R 672a56c693da57465f483f136272c83a *tests/spatstat.Rout.save 084ec5ce01164a25ae9fc137ac7bc6c5 *tests/stars.R 265c11a8098519e592c34c2dceda0ead *tests/stars.Rout.save 378708f1041ed4f5c1de8936daccb9c6 *tests/subset.R 21ade77bf3353b995058f003beca9015 *tests/subset.Rout.save 4a769f7a0c6559959df876ac723261cf *tests/testthat.R 6d57d25e2ad42cd86d9a3f974adc9ca0 *tests/testthat/Rplots.pdf 34ed86a41107de4acc5dfb47d95f2c1f *tests/testthat/test-OpenStreetMap.R 6973125ac9d78c01528505fceae396dd *tests/testthat/test-cubble.R 2cf93abfd2cf928a0c3aea06e11fd175 *tests/testthat/test-gdal.R 505665e780a619b90b4735f8786118fe *tests/testthat/test-ncdf.R c194706f6b3ee5ff76d9344f43d78d95 *tests/testthat/test-ncproxy.R e0a16e53e135c179ab14f4187700e81e *tests/testthat/test-rectilinear.R 5141e8193a66ede0ce69894358615a58 *tests/testthat/test-stars.R 66a5ca440916db64138fe1313d2e3b0f *tests/testthat/test-tidyverse.R 0769288099b46c6be6f37993cc104d02 *tests/testthat/test-tile.R 76f573410682a025fd12ab0a88b313f7 *tests/tidy.R a4dff5d3e3b19c0e56bd9ac82218b5a5 *tests/tidy.Rout.save 6370acd1c40c4921e89be71696083b1b *tests/transform.R 5362ca811005c383a925162deb74ed91 *tests/transform.Rout.save 6f7750a6d7b092b020405029a0b79141 *tests/warp.R 075673c8ff542d5303700072f30e2067 *tests/warp.Rout.save 8bc6703cc5841faff3d0974f32cc7fed *tests/write.R d0747d62fee78f90eb80bc59b55f5032 *tests/write.Rout.save 26b27a56fceb04a98e2af790e6ef971d *vignettes/stars1.Rmd 63d13a5eaba8a244dd4b7a63847f2091 *vignettes/stars2.Rmd 1aa2d383c440837f12b8696bffb3eaa9 *vignettes/stars3.Rmd baf2929fa168488a0dc25614f456e173 *vignettes/stars4.Rmd b520916931b2177a62f7d18e3c532a8b *vignettes/stars5.Rmd 38e6a52a29e9fb23896d50e473091331 *vignettes/stars6.Rmd 08e507bbd03192bc1e41cac8a80411dd *vignettes/stars7.Rmd 9bfcb15fb52f6cdf4a4303c3f3ce7d7f *vignettes/stars8.Rmd stars/R/0000755000176200001440000000000014644756201011620 5ustar liggesusersstars/R/plot.R0000644000176200001440000006534014576033423012727 0ustar liggesusersmake_label = function(x, i = 1) { dims = dim(x) if ((length(dims) <= 2 || dims[3] == 1) && inherits(x[[i]], "units")) make_unit_label(paste0("'", names(x)[i], "'"), units(x[[i]])) else names(x)[i] } #kw_dflt = function(x, key.pos) { # if (is.null(key.pos) || key.pos <= 0) # lcm(0) # else if (key.pos %in% c(2,4) && is.factor(x[[1]])) # lcm(max(strwidth(levels(x[[1]]), "inches")) * 2.54 * 1.1 + par("ps")/12) # cm # else # lcm(1.8 * par("ps")/12) #} # copy from sf: kw_dflt = function(x, key.pos) { if (is.null(key.pos) || key.pos[1] == 0) # no key: return(lcm(0)) font_scale = par("ps") / 12 if (key.pos[1] == -1) lcm(1.8 * font_scale) else if (key.pos[1] %in% c(2, 4) && (is.character(x[[1]]) || is.factor(x[[1]]))) { strings = if (is.factor(x[[1]])) levels(x[[1]]) else x[[1]] lcm(cm(max(strwidth(strings, "inches"))) * 1.3 + font_scale) # cm #lcm(cm(max(strwidth(strings, "inches"))) * 1.3) # cm } else lcm(1.8 * font_scale) } #' plot stars object, with subplots for each level of first non-spatial dimension #' #' plot stars object, with subplots for each level of first non-spatial dimension, and customization of legend key #' #' @name plot #' @param x object of class \code{stars} #' @param y ignored #' @param join_zlim logical; if \code{TRUE}, compute a single, joint zlim (color scale) for all subplots from \code{x} #' @param main character; subplot title prefix; use \code{""} to get only time, use \code{NULL} to suppress subplot titles #' @param axes logical; should axes and box be added to the plot? #' @param downsample logical or numeric; if \code{TRUE} will try to plot not many more pixels than actually are visible, if \code{FALSE}, no downsampling takes place, if numeric, the number of pixels/lines/bands etc that will be skipped; see Details. #' @param nbreaks number of color breaks; should be one more than number of colors. If missing and \code{col} is specified, it is derived from that. #' @param breaks numeric vector with actual color breaks, or a \code{style} name used in \link[classInt]{classIntervals}. #' @param col colors to use for grid cells, or color palette function #' @param ... further arguments: for \code{plot}, passed on to \code{image.stars}; for \code{image}, passed on to \code{image.default} or \code{rasterImage}. #' @param key.pos numeric; side to plot a color key: 1 bottom, 2 left, 3 top, 4 right; set to \code{NULL} to omit key. Ignored if multiple columns are plotted in a single function call. Default depends on plot size, map aspect, and, if set, parameter \code{asp}. If it has length 2, the second value, ranging from 0 to 1, determines where the key is placed in the available space (default: 0.5, center). #' @param key.width amount of space reserved for width of the key (labels); relative or absolute (using lcm) #' @param key.length amount of space reserved for length of the key (labels); relative or absolute (using lcm) #' @param key.lab character; label for color key in case of multiple subplots, use \code{""} to suppress #' @param reset logical; if \code{FALSE}, keep the plot in a mode that allows adding further map elements; if \code{TRUE} restore original mode after plotting #' @param box_col color for box around sub-plots; use \code{NA} to suppress plotting of boxes around sub-plots. #' @param center_time logical; if \code{TRUE}, sub-plot titles will show the center of time intervals, otherwise their start #' @param hook NULL or function; hook function that will be called on every sub-plot; see examples. #' @param mfrow length-2 integer vector with nrows, ncolumns of a composite plot, to override the default layout #' @param compact logical; place facets compactly (TRUE), or spread over the plotting device area? #' @details #' Downsampling: a value for \code{downsample} of 0: no downsampling, 1: after every dimension value (pixel/line/band), one value is skipped (half of the original resolution), 2: after every dimension value, 2 values are skipped (one third of the original resolution), etc. If \code{downsample} is \code{TRUE} or a length 1 numeric vector, downsampling is only applied to the raster [x] and [y] dimensions. #' #' To remove unused classes in a categorical raster, use the \link[base]{droplevels} function. #' #' When bitmaps show visual artefacts (Moiré effects), make sure that device \link{png} is used rather than \code{ragg::agg_png} as the latter uses antialiasing for filled polygons which causes this; see also https://github.com/r-spatial/stars/issues/573 . #' @export #' @examples #' st_bbox(L7_ETMs) |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt #' hook1 = function() { #' text(pt[,"X"], pt[,"Y"], "foo", col = 'orange', cex = 2) #' } #' plot(L7_ETMs, hook = hook1) #' x = st_set_dimensions(L7_ETMs, 3, paste0("B_", 1:6)) #' hook2 = function(..., row, col, nr, nrow, ncol, value, bbox) { #' str = paste0("row ", row, "/", nrow, ", col ", col, "/", ncol, "\nnr: ", nr, " value: ", value) #' bbox |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt #' text(pt[,"X"], pt[,"Y"], str, col = 'red', cex = 2) #' } #' plot(x, hook = hook2, col = grey(c(.2,.25,.3,.35))) #' if (isTRUE(dev.capabilities()$rasterImage == "yes")) { #' lc = read_stars(system.file("tif/lc.tif", package = "stars")) #' levels(lc[[1]]) = abbreviate(levels(lc[[1]]), 6) # so it's not only legend #' plot(lc, key.pos=4) #' } plot.stars = function(x, y, ..., join_zlim = TRUE, main = make_label(x, 1), axes = FALSE, downsample = TRUE, nbreaks = 11, breaks = "quantile", col = grey(1:(nbreaks-1)/nbreaks), key.pos = get_key_pos(x, ...), key.width = kw_dflt(x, key.pos), key.length = 0.618, key.lab = main, reset = TRUE, box_col = NA, center_time = FALSE, hook = NULL, mfrow = NULL, compact = TRUE) { if (!missing(y)) stop("y argument should be missing") flatten = function(x, i) { # collapse all non-x/y dims into one, and select "layer" i d = st_dimensions(x) dxy = attr(d, "raster")$dimensions dims = dim(x) nms = names(x) x = x[[1]] aux = setdiff(names(dims), dxy) newdims = c(dims[dxy], prod(dims[aux])) dim(x) = newdims st_as_stars(setNames(list(x[,,i]), nms[1]), dimensions = d[dxy]) } x = st_normalize(x) if (is.character(x[[1]])) # rgb values key.pos = NULL if (!missing(col) && is.function(col)) col = col(nbreaks - 1) if (is.factor(x[[1]])) { if (missing(col)) col = attr(x[[1]], "colors") %||% sf.colors(length(levels(x[[1]])), categorical = TRUE) else attr(x[[1]], "colors") = col } key.pos.missing = missing(key.pos) breaks.missing = missing(breaks) if (missing(nbreaks) && !missing(col)) nbreaks = length(col) + 1 opar = par(no.readonly = TRUE) dots = list(...) need_to_reset = TRUE #if (any(dim(x) == 1)) # x = adrop(x) if (is.factor(x[[1]]) && any(is.na(levels(x[[1]])))) x = droplevels(x) # https://github.com/r-spatial/stars/issues/339 zlim = if (join_zlim && is.null(dots$rgb)) range(unclass(x[[1]]), na.rm = TRUE) else rep(NA_real_, 2) # downsample if raster: if (has_raster(x) && !identical(downsample, FALSE)) { dxy = attr(st_dimensions(x), "raster")$dimensions loop = setdiff(names(dim(x)), dxy) # dimension (name) over which we loop, if any x = aperm(x, c(dxy, loop)) dims = dim(x) if (isTRUE(downsample)) { n = dims * 0 # keep names n[dxy] = get_downsample(dims, rgb = is.numeric(dots$rgb)) x = st_downsample(x, n) } else if (is.numeric(downsample)) { x = st_downsample(x, downsample) } } # find breaks: if (join_zlim && !is.character(x[[1]]) && is.null(dots$rgb)) { breaks = if (is.factor(x[[1]])) seq(.5, length.out = length(levels(x[[1]])) + 1) else get_breaks(x, breaks, nbreaks, dots$logz) if (!inherits(breaks, c("POSIXt", "Date"))) breaks = as.numeric(breaks) if (length(breaks) > 2) breaks = unique(breaks) nbreaks = length(breaks) # might be shorter than originally intended! if (breaks.missing && nbreaks <= 2) # unlucky default! warning('breaks="quantile" leads to a single class; maybe try breaks="equal" instead?') } if (isTRUE(dots$logz) && !((has_raster(x) && (is_curvilinear(x) || has_rotate_or_shear(x))) || has_sfc(x))) x = log10(x) # otherwise, defer log-transforming to sf::plot.sf if (has_raster(x)) { dims = dim(x) if (length(dims) == 2 || dims[3] == 1 || (!is.null(dots$rgb) && is.numeric(dots$rgb))) { ## ONE IMAGE: # set up key region values = structure(x[[1]], dim = NULL) # array -> vector if (! isTRUE(dots$add) && ! is.null(key.pos) && !all(is.na(values)) && is.null(dots$rgb) && (is.factor(values) || length(unique(na.omit(values))) > 1) && length(col) > 1 && !is_curvilinear(x)) { # plot key? switch(key.pos[1], layout(matrix(c(2,1), nrow = 2, ncol = 1), widths = 1, heights = c(1, key.width)), # 1 bottom layout(matrix(c(1,2), nrow = 1, ncol = 2), widths = c(key.width, 1), heights = 1), # 2 left layout(matrix(c(1,2), nrow = 2, ncol = 1), widths = 1, heights = c(key.width, 1)), # 3 top layout(matrix(c(2,1), nrow = 1, ncol = 2), widths = c(1, key.width), heights = 1) # 4 right ) if (missing(key.lab)) key.lab = "" if (is.factor(values)) .image_scale_factor(levels(values), col, key.pos = key.pos, key.width = key.width, key.length = key.length, axes = axes, ...) else .image_scale(values, col, breaks = breaks, key.pos = key.pos, key.width = key.width, key.length = key.length, axes = axes, ..., lab = key.lab) } else need_to_reset = FALSE # map panel: mar = c(axes * 2.1, axes * 2.1, 1.2 * !is.null(main), 0) if (!is.null(key.pos) && key.pos[1] %in% 1:4) mar[key.pos[1]] = mar[key.pos[1]] + .5 par(mar = mar) # plot the map: image(x, ..., axes = axes, breaks = breaks, col = col, key.pos = key.pos, key.width = key.width, key.length = key.length, main = NULL) if (!is.null(main)) title(main) } else { ## MULTIPLE IMAGES -- now loop over dimensions 3: draw.key = !is.null(key.pos) && join_zlim if (! draw.key) key.pos = NULL lt = sf::.get_layout(st_bbox(x), dims[3], par("din"), if (join_zlim && key.pos.missing) -1 else key.pos[1], key.width, mfrow = mfrow, main = main) if (key.pos.missing) key.pos = lt$key.pos title_size = if (is.null(main)) 0 else 1.2 layout(lt$m, widths = lt$widths, heights = lt$heights, respect = compact) par(mar = c(axes * 2.1, axes * 2.1, title_size, 0)) labels = st_get_dimension_values(x, 3, center = center_time) for (i in seq_len(dims[3])) { im = flatten(x, i) if (! join_zlim) { zlim = range(im[[1]], na.rm = TRUE) br = get_breaks(im, breaks, nbreaks, dots$logz) } else br = breaks image(im, xlab = "", ylab = "", axes = axes, zlim = zlim, breaks = br, col = col, key.pos = NULL, main = NULL, ...) if (!is.null(main)) { if (length(main) == dims[3]) title(main[i]) else if (identical(main, names(x)[1])) # default value: omit on multi title(paste(format(labels[i]))) else # user-defined title(paste(main, format(labels[i]))) } if (!is.null(hook) && is.function(hook)) { if (is.null(formals(hook))) hook() else { nc = lt$mfrow[[2]] # nr of columns in the plot hook(row = ((i - 1) %/% nc) + 1, col = ((i - 1) %% nc) + 1, nrow = lt$mfrow[[1]], ncol = nc, nr = i, value = labels[i], bbox = st_bbox(x)) } } if (!is.na(box_col)) box(col = box_col) } for (i in seq_len(prod(lt$mfrow) - dims[3])) # empty panels: plot.new() if (draw.key) { if (missing(key.lab) && inherits(x[[1]], "units")) key.lab = units::make_unit_label(names(x)[1], x[[1]]) values = structure(x[[1]], dim = NULL) if (is.factor(values)) .image_scale_factor(levels(values), col, key.pos = key.pos, key.width = key.width, key.length = key.length, axes = axes,...) else .image_scale(values, col, breaks = breaks, key.pos = key.pos, key.width = key.width, key.length = key.length, axes = axes,..., lab = key.lab) } } } else if (has_sfc(x)) { # if (key.pos.missing) # key.pos = -1 if (! join_zlim) key.pos = NULL # omit key plot(st_as_sf(x[1]), ..., breaks = breaks, key.pos = key.pos, key.length = key.length, key.width = key.width, reset = reset, axes = axes, main = main) } else stop("no raster, no features geometries: no default plot method set up yet!") if (reset && need_to_reset) { layout(matrix(1)) # reset par(opar) } invisible(NULL) } get_breaks = function(x, breaks, nbreaks, logz = NULL) { if (is.character(breaks)) { # compute breaks from values in x: pdx = prod(dim(x[[1]])) ## take a regular sample from x[[1]]: # values = structure(x[[1]], dim = NULL)[seq(1, pdx, length.out = min(pdx, 10000))] values = structure(x[[1]], dim = NULL) if (isTRUE(logz)) values = log10(values) if (is.factor(values) || is.logical(values)) values = as.numeric(values) n.unq = length(unique(na.omit(values))) if (! all(is.na(values)) && n.unq > 1) classInt::classIntervals(na.omit(values), min(nbreaks-1, n.unq), breaks, warnSmallN = FALSE)$brks else range(values, na.rm = TRUE) # lowest and highest! } else # breaks was given: breaks } #' @name plot #' @param band integer; which band (dimension) to plot #' @param attr integer; which attribute to plot #' @param asp numeric; aspect ratio of image #' @param rgb integer; specify three bands to form an rgb composite. Experimental: rgb color table; see Details. #' @param maxColorValue numeric; passed on to \link{rgb} #' @param xlab character; x axis label #' @param ylab character; y axis label #' @param xlim x axis limits #' @param ylim y axis limits #' @param text_values logical; print values as text on image? #' @param text_color character; color for printed text values #' @param interpolate logical; when using \link{rasterImage} (rgb), should pixels be interpolated? #' @param as_points logical; for curvilinear or sheared grids: parameter passed on to \link{st_as_sf}, determining whether raster cells will be plotted as symbols (fast, approximate) or small polygons (slow, exact) #' @param logz logical; if \code{TRUE}, use log10-scale for the attribute variable. In that case, \code{breaks} and \code{at} need to be given as log10-values; see examples. #' @param add.geom object of class \code{sfc}, or list with arguments to \code{plot}, that will be added to an image or sub-image #' @param border color used for cell borders (only in case \code{x} is a curvilinear or rotated/sheared grid) #' @param useRaster logical; use the rasterImage capabilities of the graphics device? #' @param extent object which has a \code{st_bbox} method; sets the plotting extent #' @details use of an rgb color table is experimental; see https://github.com/r-spatial/mapview/issues/208 #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' image(x, col = grey((3:9)/10)) #' if (isTRUE(dev.capabilities()$rasterImage == "yes")) { #' image(x, rgb = c(1,3,5)) # false color composite #' } image.stars = function(x, ..., band = 1, attr = 1, asp = NULL, rgb = NULL, maxColorValue = ifelse(inherits(rgb, "data.frame"), 255, max(x[[attr]], na.rm = TRUE)), xlab = if (!axes) "" else names(d)[1], ylab = if (!axes) "" else names(d)[2], xlim = st_bbox(extent)$xlim, ylim = st_bbox(extent)$ylim, text_values = FALSE, text_color = 'black', axes = FALSE, interpolate = FALSE, as_points = FALSE, key.pos = NULL, logz = FALSE, key.width = kw_dflt(x, key.pos), key.length = 0.618, add.geom = NULL, border = NA, useRaster = isTRUE(dev.capabilities()$rasterImage == "yes"), extent = x) { dots = list(...) #stopifnot(!has_rotate_or_shear(x)) # FIXME: use rasterImage() with rotate, if only rotate & no shear if (any(dim(x) == 1)) x = adrop(x, drop_xy = TRUE) d = st_dimensions(x) if (has_raster(x) || has_sfc(x)) { if (missing(xlim) || missing(ylim)) { force(xlim) force(ylim) } dimxy = attr(d, "raster")$dimensions dimx = dimxy[1] dimy = dimxy[2] dimxn = match(dimx, names(d)) dimyn = match(dimy, names(d)) is_rectilinear = is_rectilinear(x) } else { e = expand_dimensions(x) if (missing(xlim)) xlim = range(e[[1]]) if (missing(ylim)) ylim = range(e[[2]]) dimx = names(dim(x))[1] dimy = names(dim(x))[2] dimxn = 1 dimyn = 2 is_rectilinear = (is.na(d[[1]]$delta) || is.na(d[[2]]$delta)) && (!regular_intervals(d[[1]]$values) || !regular_intervals(d[[2]]$values)) if (missing(axes)) axes = TRUE } if (has_sfc(x) && length(dim(x)) == 2) { # time series of features: ed = lapply(expand_dimensions(x), function(x) if (inherits(x, "sfc")) seq_along(x) else x) names(ed) = c("x", "y") ed$z = x[[attr]] axes = TRUE return(image(ed, ..., xlab = xlab, ylab = ylab)) } if (! is_curvilinear(x)) { dims = expand_dimensions(x, center = FALSE, max = FALSE) d_max = expand_dimensions(x, center = FALSE, max = TRUE) if (tail(dims[[dimx]], 1) != tail(d_max[[dimx]], 1)) dims[[ dimx ]] = c(dims[[dimx]], tail(d_max[[dimx]], 1)) if (tail(dims[[dimy]], 1) != tail(d_max[[dimy]], 1)) dims[[ dimy ]] = c(dims[[dimy]], tail(d_max[[dimy]], 1)) y_is_neg = all(diff(dims[[ dimy ]]) < 0) if (y_is_neg) dims[[ dimy ]] = rev(dims[[ dimy ]]) } if (is.null(asp)) asp = if (isTRUE(st_is_longlat(x))) 1 / cos((mean(st_bbox(x)[c(2,4)]) * pi)/180) else if (!has_raster(x) && !has_sfc(x)) NA_real_ else 1.0 ar = unclass(x[[ attr ]]) # raw data matrix/array # handle color table, if present: co = attr(ar, "colors") if (! is.null(co)) { if (is.null(rgb)) rgb = TRUE interpretation = attr(co, "interpretation") if (!is.null(interpretation) && interpretation != 1) warning("color interpretation is not RGB, but rgb is used nevertheless: colors will probably be wrong") } # rearrange ar: others = setdiff(seq_along(dim(ar)), c(dimxn, dimyn)) ar = aperm(ar, c(dimxn, dimyn, others)) if (text_values) ar_text = ar # keep original order for cell text labels if (is.null(rgb) && is.character(ar)) rgb = TRUE if (! is.null(rgb)) { if (is_curvilinear(x)) { x.sf = st_as_sf(x, as_points = as_points) plot_sf = function(x, col, ...) plot(x, ...) # absorb col if (!is.null(co)) # #456: plot_sf(x.sf, pal = co, border = FALSE, ...) else plot(x.sf, border = FALSE, ...) return() } xy = dim(ar)[1:2] if (! y_is_neg) { # need to flip y? ar = if (length(dim(ar)) == 3) ar[ , rev(seq_len(dim(ar)[2])), ] else ar[ , rev(seq_len(dim(ar)[2]))] } if (!useRaster) stop("rgb plotting not supported on this device") if (! isTRUE(dots$add)) { plot.new() plot.window(xlim = xlim, ylim = ylim, asp = asp) } if (is.numeric(rgb) && length(rgb) == 3) { ar = structure(ar[ , , rgb], dim = c(prod(xy), 3)) # flattens x/y #nas = apply(ar, 1, function(x) any(is.na(x))) #503 nas = !complete.cases(ar) ar = grDevices::rgb(ar[!nas,], maxColorValue = maxColorValue) mat = rep(NA_character_, prod(xy)) mat[!nas] = ar dim(mat) = xy } else { stopifnot(isTRUE(rgb) || inherits(rgb, "data.frame")) # rgb has col 1: index, col 2: label, col 3-5: R, G, B # ar = as.vector(ar[ , , 1]) # flattens x/y to 1-D index vector mat = if (isTRUE(rgb)) { if (!is.null(co)) structure(co[as.vector(ar)], dim = dim(ar)) else ar } else { ar = as.vector(ar) # flattens x/y to 1-D index vector rgb = grDevices::rgb(rgb[match(ar, rgb[[1]]), 3:5], maxColorValue = maxColorValue) structure(rgb, dim = xy) } } myRasterImage = function(x, xmin, ymin, xmax, ymax, interpolate, ..., breaks, add, zlim) # absorbs breaks, add & zlim rasterImage(x, xmin, ymin, xmax, ymax, interpolate = interpolate, ...) myRasterImage(t(mat), xlim[1], ylim[1], xlim[2], ylim[2], interpolate = interpolate, ...) } else if (is_curvilinear(x) || has_rotate_or_shear(x)) { x = st_as_sf(x[1], as_points = as_points) mplot = function(x, col, ..., zlim) { if (missing(col)) plot(x, ...) else plot(x, pal = col, ...) # need to swap arg names: FIXME:? } mplot(x, xlab = xlab, ylab = ylab, xlim = xlim, ylim = ylim, axes = axes, reset = FALSE, key.pos = key.pos, key.width = key.width, key.length = key.length, logz = logz, border = border, ...) } else { # regular & rectilinear grid, no RGB: if (y_is_neg) { # need to flip y? ar = if (length(dim(ar)) == 2) ar[ , rev(seq_len(dim(ar)[2])), drop = FALSE] else ar[ , rev(seq_len(dim(ar)[2])), band] # FIXME: breaks if more than 3? } image.default(dims[[ dimx ]], dims[[ dimy ]], ar, asp = asp, xlab = xlab, ylab = ylab, xlim = xlim, ylim = ylim, axes = FALSE, useRaster = useRaster && !is_rectilinear, ...) } if (text_values) { dims = expand_dimensions.stars(x, center = TRUE) text(do.call(expand.grid, dims[1:2]), labels = as.character(as.vector(ar_text)), col = text_color) } if (axes) { # FIXME: see sf::plot.sf for refinements to be ported here? if (!is.null(dots$cex.axis)) par(cex.axis = dots$cex.axis) if (isTRUE(st_is_longlat(x))) { if (isTRUE(all.equal(st_bbox(x), st_bbox(), tolerance = .1, check.attributes = FALSE))) { .degAxis(1, at = seq(-180, 180, 60)) .degAxis(2, at = seq(-90, 90, 30)) } else { .degAxis(1) .degAxis(2) } } else { axis(1) axis(2) } } if (!is.null(add.geom)) { if (inherits(add.geom, c("sf", "sfc"))) add.geom = list(add.geom) do.call(plot, c(add.geom, add = TRUE)) } } # compute the degree of downsampling allowed to still have more than # one cell per screen/device pixel: get_downsample = function(dims, px = dev.size("px"), rgb = FALSE) { if (rgb) dims = dims[1:2] if (n <- max(0L, floor(sqrt(prod(dims) / prod(px))) - 1.0)) message(paste0("downsample set to ", n)) n } #' plot contours of a stars object #' #' plot contours of a stars object #' @param x object of class \code{stars} #' @param ... other parameters passed on to \link[graphics]{contour} #' @details this uses the R internal contour algorithm, which (by default) plots contours; \link{st_contour} uses the GDAL contour algorithm that returns contours as simple features. #' @export #' @examples #' d = st_dimensions(x = 1:ncol(volcano), y = 1:nrow(volcano)) #' r = st_as_stars(t(volcano)) #' r = st_set_dimensions(r, 1, offset = 0, delta = 1) #' r = st_set_dimensions(r, 2, offset = 0, delta = -1) #' plot(r, reset = FALSE) #' contour(r, add = TRUE) contour.stars = function(x, ...) { if (!(is_regular_grid(x) || is_rectilinear(x))) stop("contour only works for regular or rectilinear grids") if (inherits(x[[1]], "units")) x[[1]] = units::drop_units(x[[1]]) x = st_upfront(adrop(x)) # drop singular dimensions, put x/y first dx = dim(x) if (length(dx) != 2) stop("contour only supported for 2-D arrays") # nocov e = expand_dimensions(x) contour(z = x[[1]][,rev(seq_len(dx[2]))], x = e[[1]], y = rev(e[[2]]), ...) } #' reduce dimension to rgb (alpha) hex values #' #' @export #' @param x object of class \code{stars} #' @param dimension dimension name or number to reduce #' @param use_alpha logical; if TRUE, the fourth band will be used as alpha values #' @param maxColorValue integer; maximum value for colors #' @param stretch logical or character; if \code{TRUE} or \code{"percent"}, #' each band is stretched to 0 ... maxColorValue by "percent clip" method using #' probs values. If \code{"histogram"}, a "histogram equalization" is performed #' (\code{probs} values are ignored). If stretch is \code{NULL} or \code{FALSE}, no stretching #' is performed. Other character values are interpreted as "percent" and a message #' will be printed. #' @param probs probability values for quantiles used for stretching by "percent". #' @seealso \link{st_apply}, \link[grDevices]{rgb} #' @details the dimension's bands are mapped to red, green, blue, alpha; if a different #' ordering is wanted, use \link{[.stars} to reorder a dimension, see examples. #' Alternatively, you can use \link{plot.stars} with the \code{rgb} argument to create a three-band composition. #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' st_rgb(x[,,,3:1]) #' r = st_rgb(x[,,,c(6,5,4,3)], 3, use_alpha=TRUE) # now R=6,G=5,B=4,alpha=3 #' if (require(ggplot2)) { #' ggplot() + geom_stars(data = r) + scale_fill_identity() #' } #' r = st_rgb(x[,,,3:1], #' probs = c(0.01, 0.99), #' stretch = "percent") #' plot(r) #' r = st_rgb(x[,,,3:1], #' probs = c(0.01, 0.99), #' stretch = "histogram") #' plot(r) st_rgb = function (x, dimension = 3, use_alpha = dim(x)[dimension] == 4, maxColorValue = 255L, probs = c(0, 1), stretch = NULL) { if (inherits(x, "stars_proxy")) return(collect(x, match.call(), "st_rgb", c("x", "dimension", "use_alpha", "maxColorValue", "probs", "stretch"), env = environment())) # RETURNS!! # if not stars_proxy: if (is.character(dimension)) dimension = match(dimension, names(dim(x))) stopifnot(is.numeric(dimension), length(dimension) == 1) if (!dim(x)[dimension] %in% c(3, 4)) stop(paste("number of bands along dimension", dimension, "should be 3 or 4")) dims = setdiff(seq_along(dim(x)), dimension) cutoff = function(x, probs, stretch.method = "percent") { if (stretch.method == "percent"){ qs = if (all(probs == c(0, 1))) range(x) else quantile(x, probs, na.rm = TRUE) x = (x - qs[1])/(qs[2] - qs[1]) x[x > 1] = 1 x[x < 0] = 0 x * maxColorValue } else if(stretch.method == "histogram"){ x = stats::ecdf(x)(x) x * maxColorValue } else { qs = range(x) (x - qs[1])/(qs[2] - qs[1]) * maxColorValue } } if (is.null(stretch)) { stretch.method = "none" stretch = FALSE } if (is.logical(stretch)) { if(stretch) stretch.method = "percent" else maxColorValue = max(maxColorValue, max(x[[1]], na.rm = TRUE)) } if (is.character(stretch)) { if (!stretch %in% c("percent", "histogram")) stretch.method = "percent" else stretch.method = stretch stretch = TRUE } if (stretch) x = st_apply(x, dimension, cutoff, probs = probs, stretch.method = stretch.method) if (anyNA(x[[1]])) { rgb4 = function(r, g, b, a) { r = cbind(as.vector(r), as.vector(g), as.vector(b), as.vector(a)) sel = !apply(r, 1, anyNA) ret = rep(NA_character_, nrow(r)) ret[sel] = rgb(r[sel, 1:3], alpha = a[sel], maxColorValue = maxColorValue) structure(ret, dim = dim(g)) } rgb3 = function(r, g, b) { r = cbind(as.vector(r), as.vector(g), as.vector(b)) sel = !apply(r, 1, anyNA) ret = rep(NA_character_, nrow(r)) ret[sel] = rgb(r[sel, 1:3], maxColorValue = maxColorValue) structure(ret, dim = dim(g)) } } else { rgb4 = function(r, g, b, a) structure(rgb(r, g, b, a,maxColorValue = maxColorValue), dim = dim(r)) rgb3 = function(r, g, b) structure(rgb(r, g, b, maxColorValue = maxColorValue), dim = dim(r)) } st_apply(x, dims, if (use_alpha) rgb4 else rgb3) } #' @export hist.stars = function(x, ..., main = names(x)[1]) { hist(x[[1]], ..., main = main) } #' @export hist.stars_proxy = function(x, ..., downsample = 0) { x = st_as_stars(x, downsample = downsample) NextMethod() } stars/R/rasterize.R0000644000176200001440000002254214576033423013756 0ustar liggesusers# align bb with the first two dimensions of d st_align = function(bb, d) { up1 = function(x) ifelse(sign(x) < 0, -ceiling(abs(x)), floor(x)) up2 = function(x) ifelse(sign(x) > 0, ceiling(abs(x)), -floor(abs(x))) dx = d[[1]]$delta dy = d[[2]]$delta ox = d[[1]]$offset oy = d[[2]]$offset dbbx = diff(bb[c("xmin", "xmax")]) dbby = diff(bb[c("ymin", "ymax")]) bb["xmin"] = ox - up2((ox - bb["xmin"])/dx) * dx bb["ymin"] = oy - up1((oy - bb["ymin"])/dy) * dy bb["xmax"] = ox - up1((ox - bb["xmax"])/dx) * dx bb["ymax"] = oy - up2((oy - bb["ymax"])/dy) * dy bb } #' rasterize simple feature geometries #' #' rasterize simple feature geometries #' @export #' @param sf object of class \code{sf} #' @param template optional; stars object with desired target geometry, or target geometry alignment if \code{align=TRUE}; see details #' @param file temporary file name #' @param driver driver for temporary file #' @param options character; options vector for \code{GDALRasterize} #' @param align logical; if \code{TRUE}, \code{template} is only used for the geometry _alignment_, #' informing target resolution and offset #' @param proxy logical; should a proxy object be returned? #' @param ... arguments passed on to \link{st_as_stars} #' @details if `template` is a `stars` object, non-NA cells that are not covered by `sf` receive the value in `template`; see also argument `align`. #' @examples #' demo(nc, echo = FALSE, ask = FALSE) #' (x = st_rasterize(nc)) # default grid: #' plot(x, axes = TRUE) #' # a bit more customized grid: #' (x = st_rasterize(nc, st_as_stars(st_bbox(nc), nx = 100, ny = 50, values = NA_real_))) #' plot(x, axes = TRUE) #' (ls = st_sf(a = 1:2, st_sfc(st_linestring(rbind(c(0.1, 0), c(1.1, 1))), #' st_linestring(rbind(c(0, 0.05), c(1, 0.05)))))) #' (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), #' values = NA_real_)) #' # Only the left-top corner is part of the grid cell: #' sf_extSoftVersion()["GDAL"] #' plot(st_rasterize(ls, grd), axes = TRUE, reset = FALSE) # ALL_TOUCHED=FALSE; #' plot(ls, add = TRUE, col = "red") #' plot(st_rasterize(ls, grd, options = "ALL_TOUCHED=TRUE"), axes = TRUE, reset = FALSE) #' plot(ls, add = TRUE, col = "red") #' # add lines to existing 0 values, summing values in case of multiple lines: #' (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = 0)) #' r = st_rasterize(ls, grd, options = c("MERGE_ALG=ADD", "ALL_TOUCHED=TRUE")) #' plot(r, axes = TRUE, reset = FALSE) #' plot(ls, add = TRUE, col = "red") st_rasterize = function(sf, template = guess_raster(sf, ...) %||% st_as_stars(st_bbox(sf), values = NA_real_, ...), file = tempfile(), driver = "GTiff", options = character(0), align = FALSE, proxy = FALSE, ...) { if (align) { if (missing(template)) stop("align=TRUE requires template to be specified") stopifnot(is_regular_grid(template)) bb = st_align(st_bbox(sf), d <- st_dimensions(st_normalize(template))) dx = d[[1]]$delta dy = d[[2]]$delta template = st_as_stars(bb, values = NA, dx = dx, dy = dy, nx = round(diff(bb[c("xmin", "xmax")])/abs(dx)), ny = round(diff(bb[c("ymin", "ymax")])/abs(dy)), proxy = proxy) } else template = st_normalize(template) is_numeric = function(x) is.numeric(x) || is.factor(x) isn = sapply(sf, is_numeric) sf = if (!any(isn)) { sf$ID = seq_len(nrow(sf)) sf["ID"] } else sf[isn] n_attr = length(which(isn)) if (length(dim(template)) == 2 && n_attr > 1) template = merge(do.call(c, lapply(seq_len(n_attr), function(x) template))) geoms = which(sapply(sf, inherits, "sfc")) attrs = as.data.frame(sf)[-geoms] for (i in which(sapply(sf, inherits, "factor"))) # factors: sf[[i]] = as.numeric(sf[[i]]) sf::gdal_rasterize(sf, template, st_geotransform(template), file, driver, options) ret = read_stars(file, driver = driver, proxy = proxy) if (!proxy) { if (length(dim(ret)) > 2) ret = split(ret) for (i in seq_along(ret)) { ret[[i]][is.nan(ret[[i]])] = NA_real_ if (inherits(sf[[i]], "units")) units(ret[[i]]) = units(sf[[i]]) if (is.factor(attrs[[i]])) ret[[i]] = structure(ret[[i]], class = class(attrs[[i]]), levels = levels(attrs[[i]])) } } setNames(ret, names(attrs)) } guess_raster = function(x, ...) { if (length(list(...))) # ... hints at other arguments meant at not guessing the raster return(NULL) get_cell_size = function(x) { du = unique(diff(x)) if (length(du) > 1) { if (var(du)/mean(du) < 1e-8) # some fuzz: du = mean(du) else if (all(du %% min(du) == 0)) # missing cols/rows: du = min(du) else numeric(0) # no regular step size } else du } if (all(st_dimension(x) == 0)) { # POINT cc = st_coordinates(x) ux = sort(unique(cc[,1])) if (length(dux <- get_cell_size(ux)) == 0) return(NULL); uy = sort(unique(cc[,2])) if (length(duy <- get_cell_size(uy)) == 0) return(NULL); bb = st_bbox(x) bb = st_bbox(setNames(c(bb["xmin"] - 0.5 * dux, bb["ymin"] - 0.5 * duy, bb["xmax"] + 0.5 * dux, bb["ymax"] + 0.5 * duy), c("xmin", "ymin", "xmax", "ymax")), crs = st_crs(x)) return(st_as_stars(bb, dx = dux, dy = duy)) } NULL } #' @export #' @param dims the column names or indices that form the cube dimensions #' @param coords same as dims, for symmetry with \link[sf]{st_as_sf} #' @param xy the x and y raster dimension names or indices; only takes effect after \code{dims} has been specified, see details #' @param y_decreasing logical; if TRUE, (numeric) y values get a negative delta (decrease with increasing index) #' @name st_as_stars #' @details #' If \code{xy} is not specified and the first two dimensions in \code{dims} are both numeric, #' then it is set to these two dimensions. #' @examples #' if (require(plm, quietly = TRUE)) { #' data(Produc, package = "plm") #' st_as_stars(Produc) #' } #' if (require(dplyr, quietly = TRUE)) { #' # https://stackoverflow.com/questions/77368957/ #' spatial_dim <- st_sf( #' ID = 1:3, #' geometry = list( #' st_polygon(list( #' cbind(c(0, 1, 1, 0, 0), c(0, 0, 1, 1, 0)) #' )), #' st_polygon(list( #' cbind(c(1, 2, 2, 1, 1), c(0, 0, 1, 1, 0)) #' )), #' st_polygon(list( #' cbind(c(2, 3, 3, 2, 2), c(0, 0, 1, 1, 0)) #' )) #' ) #' ) #' weekdays_dim <- data.frame(weekdays = c("Monday", "Tuesday", "Wednesday", #' "Thursday", "Friday", "Saturday", "Sunday")) #' hours_dim <- data.frame(hours = c("8am", "11am", "4pm", "11pm")) #' sf_dta <- spatial_dim |> #' cross_join(weekdays_dim)|> #' cross_join(hours_dim) |> #' mutate(population = rnorm(n(), mean = 1000, sd = 200)) |> #' select(everything(), geometry) #' #' st_as_stars(sf_dta, dims = c("weekdays", "hours", "geometry")) #' } #' demo(nc, echo=FALSE,ask=FALSE) #' st_as_stars(nc) #' st_as_stars(st_drop_geometry(nc), dims = "NAME") #' data.frame(expand.grid(x=1:5, y = 1:5), z = rnorm(25)) |> st_as_stars() st_as_stars.data.frame = function(.x, ..., dims = coords, xy, y_decreasing = TRUE, coords = 1:2) { if (missing(dims) && !missing(xy)) stop("parameter xy only takes effect when the cube dimensions are set with dims") if (is.character(dims)) dims = match(dims, names(.x)) if (missing(xy)) { if (length(dims) > 1 && all(sapply(.x[dims[1:2]], is.numeric))) xy = dims[1:2] else xy = c(-1, -1) # cancels y_decreasing } if (is.character(xy)) { xy = match(xy, names(.x)) if (any(is.na(xy))) stop("xy coordinates not found in data") } stopifnot(length(dims) >= 1, all(dims >= 1), !any(is.na(dims))) index = NULL dimensions = list() this_dim = 1 for (i in dims) { v = .x[[i]] if (inherits(v, "sfc")) { if (!requireNamespace("digest", quietly = TRUE)) stop("package digest required, please install it first") # nocov dig = sapply(st_equals(v), digest::digest) uv = unique(dig) # no need to sort ix = match(dig, uv) # but look up "hash collision" } else { suv = if (is.factor(v)) levels(v) else if (is.character(v)) unique(v) else # numeric: sort(unique(v), decreasing = y_decreasing && i == xy[2]) ix = match(v, suv) } index = cbind(index, ix) dimensions[[this_dim]] = if (inherits(v, "sfc")) create_dimension(values = v[match(uv, dig)]) else create_dimension(values = suv, is_raster = i %in% xy) this_dim = this_dim + 1 } names(dimensions) = names(.x)[dims] raster_xy = if (length(xy) == 2 && all(xy > 0)) names(.x)[xy] else c(NA_character_, NA_character_) d = create_dimensions(dimensions, raster = get_raster(dimensions = raster_xy)) l = lapply(.x[-dims], function(x) { m = if (is.factor(x)) structure(factor(rep(NA_character_, prod(dim(d))), levels = levels(x)), dim = dim(d)) else array(NA, dim = dim(d)) m[index] = x # match order m } ) st_stars(l, d) } #' replace POINT simple feature geometry list with an x y raster #' @param x object of class \code{stars}, or of class \code{sf} #' @param ... passed on to \link{as.data.frame.stars} #' @return object of class \code{stars} with a POINT list replaced by x and y raster dimensions. This only works when the points are distributed over a regular or rectilinear grid. #' @export st_sfc2xy = function(x, ...) { if (inherits(x, "sf")) x = st_as_stars(x) i = which_sfc(x) d = st_dimensions(x) if (!inherits(d[[i]]$values, "sfc_POINT")) stop("point geometries expected") cc = st_coordinates(d[[i]]$values) df = as.data.frame(x) df$geometry = NULL s = st_as_stars(cbind(cc, df)) st_set_crs(s, st_crs(d)) } stars/R/spatstat.R0000644000176200001440000000263214576033423013607 0ustar liggesuserscheck_spatstat <- function(pkg, X = NULL){ if(!requireNamespace(pkg, quietly = TRUE)){ stop("package ", pkg, " required, please install it (or the full spatstat package) first") } else{ spst_ver <- try(packageVersion("spatstat"), silent = TRUE) if (!inherits(spst_ver, "try-error") && spst_ver < "2.0-0") { stop("You have an old version of spatstat installed which is incompatible with ", pkg, ". Please update spatstat (or uninstall it).") } } if (!is.null(X) && isTRUE(st_is_longlat(X))) stop("Only projected coordinates may be converted to spatstat class objects", call. = FALSE) } as.owin.stars = function(W, ..., fatal) { check_spatstat("spatstat.geom", W) if (length(dim(W)) != 2) stop("as.owin.stars requires a 2-dimensional object (single raster layer)") m = t(W[[1]]) bb = st_bbox(W) spatstat.geom::owin(bb[c("xmin", "xmax")], bb[c("ymin", "ymax")], mask = m[nrow(m):1,]) } #' @export st_as_stars.im = function(.x, ...) { # see https://github.com/r-spatial/stars/issues/648 setNames(st_as_stars(as.data.frame(.x, ...)), "v") } as.im.stars = function(X, ...) { check_spatstat("spatstat.geom", X) if (!has_raster(X) || !is_regular_grid(X)) stop("as.im.stars only works for stars objects with regular raster data") if (length(dim(X)) > 2) stop("as.im.stars only works for two-dimensional rasters") X = as.data.frame(X) spatstat.geom::as.im.data.frame(X, ...) } stars/R/intervals.R0000644000176200001440000000544714576033423013762 0ustar liggesusers#' create an intervals object #' #' create an intervals object, assuming left-closed and right-open intervals #' @param start vector with start values, or 2-column matrix with start and end values in column 1 and 2, respectively #' @param end vector with end values #' @export make_intervals = function(start, end) { if (missing(end) && is.matrix(start) && ncol(start) == 2) { end = start[,2] start = start[,1] } stopifnot(length(start) > 0, length(start) == length(end)) structure(list(start = start, end = end), class = "intervals") } as_intervals = function(x, add_last = FALSE) { stopifnot(is.atomic(x)) if (add_last) x = c(x, tail(x, 1) + diff(tail(x, 2))) make_intervals(start = head(x, -1), end = tail(x, -1)) } #' @export length.intervals = function(x) length(x$start) #' @export head.intervals = function(x, n, ...) make_intervals(head(x$start, n, ...), head(x$end, n, ...)) #' @export tail.intervals = function(x, n, ...) make_intervals(tail(x$start, n, ...), tail(x$end, n, ...)) #' @export c.intervals = function(...) { dots = list(...) start = do.call(c, lapply(dots, function(x) x$start)) end = do.call(c, lapply(dots, function(x) x$end)) make_intervals(start, end) } #' @export `[.intervals` = function(x, i, ...) { make_intervals(x$start[i], x$end[i]) } #' @export format.intervals = function(x, ...) { mformat = function(x, ..., digits = getOption("digits")) { if (inherits(x, "PCICt")) format(x, ...) else format(x, digits = digits, ...) } if (inherits(x$start, "units") && inherits(x$end, "units")) { stopifnot(units(x$start) == units(x$end)) paste0("[", format(as.numeric(x$start), ...), ",", format(as.numeric(x$end), ...), ") ", "[", as.character(units(x$start)), "]") } else paste0("[", mformat(x$start, ...), ",", mformat(x$end, ...), ")") } find_interval = function(x, intervals) { if (inherits(intervals$start, "Date") && inherits(x, "POSIXct")) x = as.Date(x) if (inherits(x, "Date") && inherits(intervals$start, "POSIXct")) x = as.POSIXct(x) if (all(intervals$start > intervals$end)) { # decreasing intervals start = intervals$end intervals$end = intervals$start intervals$start = start } if (getRversion() < "4.1.0") stop("R >= 4.1.0 required for handling intervals") w = apply(outer(x, intervals$start, ">=") & outer(x, intervals$end, "<"), 1, which, simplify = FALSE) w[lengths(w) == 0] = NA_integer_ unlist(w) } #' @export as.list.intervals = function(x, ...) { structure(mapply(make_intervals, x$start, x$end, SIMPLIFY = FALSE), class = "intervals_list") } #' @export format.intervals_list = function(x, ...) { sapply(x, format, ...) } #' @export `[.intervals_list` = function(x, i, ...) { ret = NextMethod() is_null = sapply(ret, is.null) ret[is_null] = list(make_intervals(NA_real_, NA_real_)) structure(ret, class = "intervals_list") } stars/R/ncproxy.R0000644000176200001440000001214614451263410013440 0ustar liggesusers.update_dims <- function(dims, proxy_dimensions, coords, tdim) { uc <- coords for(coord in names(coords)) { pv <- st_get_dimension_values(proxy_dimensions, coord) between <- function(x, ymin, ymax, z = x) { z[x >= ymin & x <= ymax, drop = FALSE] } if(inherits(pv, "POSIXt")) { # Need to deal with the case where tdim isn't values but is from to. uc[[coord]] <- between(tdim$values, min(pv), max(pv), uc[[coord]]) } else { if(attr(proxy_dimensions, "raster")$curvilinear) { uc[[coord]] <- seq(proxy_dimensions[[coord]]$from, proxy_dimensions[[coord]]$to) } else { uc[[coord]] <- between(uc[[coord]], min(pv), max(pv)) } } dims$start[dims$name == coord] <- which(coords[[coord]] == uc[[coord]][1])[1] dims$count[dims$name == coord] <- dims$length[dims$name == coord] <- length(uc[[coord]]) } dims } #' @export print.nc_proxy = function(x, ..., n = 1e5, nfiles = 10, simplify = TRUE) { cat("netcdf source stars proxy object from:\n") if(simplify) print(shorten_names(x[[1]], nfiles)) cat("\nAvailable nc variables:\n") cat(paste(names(x), collapse = "\n")) cat("\n\ndimension(s):\n") print(st_dimensions(x), ...) cat("\n") if (!is.null(attr(x, "call_list"))) { cat("call_list:\n") print(unlist(attr(x, "call_list"))) cat("This object has pending lazy operations: dimensions as printed may not reflect this.\n") } } # as.data.frame.stars_proxy works for nc_proxy. #' @export st_as_stars.nc_proxy <- function(.x, ..., downsample = 0, envir = parent.frame()) { process_call_list(read_ncdf(.x, downsample = downsample, ...), attr(.x, "call_list"), envir = envir, downsample = downsample) } #' @name plot #' @param max_times integer; maximum number of time steps to attempt to plot. #' @export #' @details when plotting a subsetted \code{stars_proxy} object, the default value for argument \code{downsample} will not be computed correctly, and has to be set manually. plot.nc_proxy = function(x, y, ..., downsample = get_downsample(dim(x)), max_times = 16) { if(length(x) > 1) { message("Plotting first variable only.") x <- x[1] } tdim <- which(sapply(st_dimensions(x), function(x) any(grepl("^POSIX|^PCIC", x$refsys)))) if(length(tdim)) { if(length(st_get_dimension_values(x, tdim)) > max_times) { stop("Time dimension of nc_proxy is longer than max_times in plot.nc_proxy.") } } plot(st_as_stars(x, downsample = downsample, ...), ..., downsample = 0) } #' @export "[.nc_proxy" <- function(x, i = TRUE, ...) { # stars_proxy works but need to match class. structure(NextMethod(), class = class(x)) } #' @export st_crop.nc_proxy <- function(x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), collect = TRUE) { # will this work? Couild be slick if it does. structure(NextMethod(), class = class(x)) } # "[[<-.nc_proxy" not needed. #' @export c.nc_proxy = function(..., along = NA_integer_, along_crs = FALSE, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps)) { dots = list(...) if (!all(sapply(dots, function(x) inherits(x, "nc_proxy")))) stop("all arguments to c() should be nc_proxy objects") x <- dots[[1]] structure(NextMethod(), class = class(x)) } #' @export st_redimension.nc_proxy <- function(x, new_dims, along, ...) stop("st_redimension not support for nc_proxy") #' @export st_mosaic.nc_proxy = function(.x, ...) stop("st_mosaic not supported for nc_proxy") #' @param .x stars object to add curvilinear coordinates too. #' @param curvilinear only for creating curvilinear grids: named length #' 2 list holding longitude and latitude matrices; the names of this #' list should correspond to raster dimensions referred to #' @param crs object of class \code{crs} with the coordinate reference #' system of the values in \code{curvilinear}; see details #' @details if \code{curvilinear} is a \code{stars} object with longitude #' and latitude values, its coordinate reference system is typically not #' that of the latitude and longitude values. #' @noRd add_curvilinear <- function(.x, curvilinear = NULL, crs = st_crs('OGC:CRS84')) { # so we can just call add_curvilinear regardless if (is.null(curvilinear)) .x else { stopifnot(is.list(curvilinear), names(curvilinear) %in% names(dim(.x))) if (inherits(curvilinear[[1]], "stars")) curvilinear[[1]] = curvilinear[[1]][[1]] if (inherits(curvilinear[[2]], "stars")) curvilinear[[2]] = curvilinear[[2]][[1]] dimensions = st_dimensions(.x) xy = names(curvilinear) dimensions[[ xy[1] ]]$values = structure(curvilinear[[1]], dim = setNames(dim(curvilinear[[1]]), xy)) dimensions[[ xy[2] ]]$values = structure(curvilinear[[2]], dim = setNames(dim(curvilinear[[1]]), xy)) # erase regular grid coefficients $offset and $delta: dimensions[[ xy[1] ]]$offset = dimensions[[ xy[1] ]]$delta = NA_real_ dimensions[[ xy[2] ]]$offset = dimensions[[ xy[2] ]]$delta = NA_real_ raster = get_raster(dimensions = names(curvilinear), curvilinear = TRUE) st_set_crs(st_stars(.x, create_dimensions(dimensions, raster), class = class(.x)), crs) } } stars/R/prcomp.R0000644000176200001440000000224114600276514013236 0ustar liggesusers#' @name prcomp #' @param downsample see \link{st_as_stars} #' @export prcomp.stars_proxy = function(x, ..., downsample = 0) { prcomp(st_as_stars(x, downsample = downsample), ...) } #' Principle components of stars object #' #' Compute principle components of stars object #' @param x object of class `stars` or `stars_proxy` #' @param quiet logical; if `TRUE`, suppress message that PCs will be computed on last dimension; see details #' @param ... see \link[stats]{prcomp} #' @details if `x` has only one attribute, principle components will be computed in the space of the last dimension of `x` #' to predict PC scores into a `stars` object, use \link{predict.stars}; see example below #' @name prcomp #' @returns object of class `prcomp`, see \link[stats]{prcomp} #' @export #' @examples #' l7 = split(st_as_stars(L7_ETMs), 3) # use bands as features #' l7 |> prcomp() |> plot() #' l7 |> prcomp() |> predict(l7, model = _) |> merge() |> plot() prcomp.stars = function(x, ..., quiet = FALSE) { if (length(x) == 1) { if (!quiet) message(paste0("computing PCs over dimension `", tail(names(dim(x)), 1), "'")) x = split(x, length(dim(x))) } prcomp(as.data.frame(x), ...) } stars/R/warp.R0000644000176200001440000002707114576033423012721 0ustar liggesusers## https://mastodon.social/@EvenRouault/111738407524055989 has_global_longitude = function(x) { st_is_longlat(x) && isTRUE(all.equal(as.numeric(st_bbox(x)$xlim), c(-180.,180.))) } cut_latitude_to_3857 = function(bb) { # Pseudomercator does not have global coverage: bb["ymin"] = max(bb["ymin"], -85.06) bb["ymax"] = min(bb["ymax"], 85.06) bb } # create a target grid from x and crs, determining cellsize if unknown # return a dimensions object default_target_grid = function(x, crs, cellsize = NA_real_, segments = NA) { bb_x = st_bbox(x) if (st_is_longlat(x) && crs == st_crs(3857)) # common case: bb_x = cut_latitude_to_3857(bb_x) envelope = st_as_sfc(bb_x) # global adjustment: needed to have st_segmentize span global extent # https://github.com/r-spatial/mapview/issues/256 envelope = if (!is.na(segments) && !has_global_longitude(x)) # FIXME: should this branch be retained? st_segmentize(envelope, st_length(st_cast(envelope, "LINESTRING"))/segments) else { # https://github.com/r-tmap/tmap/issues/526 : old_crs = st_crs(envelope) st_crs(envelope) = NA_crs_ st_set_crs(st_segmentize(envelope, st_length(st_cast(envelope, "LINESTRING"))/segments), old_crs) } envelope_new = st_transform(envelope, crs) bb = st_bbox(envelope_new) # in new crs if (any(is.na(cellsize))) { area = if (st_is_longlat(crs)) # we need a cell size in degree lon lat diff(bb[c("xmin", "xmax")]) * diff(bb[c("ymin", "ymax")]) else st_area(envelope_new) ratio = if (has_rotate_or_shear(x)) { d = st_dimensions(x) xy = xy_from_colrow(rbind(c(0,0), c(1,1)), st_geotransform(d)) cellarea = sum((xy[1,] - xy[2,])^2) / 2 # lenght is cell diagonal xy_dims = attr(d, "raster")$dimensions unclass(st_area(envelope)) / (prod(dim(x)[xy_dims]) * cellarea) # > 1 } else 1.0 dxy = attr(st_dimensions(x), "raster")$dimensions cellsize = sqrt(unclass(area)/prod(dim(x)[dxy])/ratio) # TODO: divide by st_area(evelope_new)/st_area(envelope) ? } cellsize = rep(abs(cellsize), length.out = 2) nx = ceiling(diff(bb[c("xmin", "xmax")])/cellsize[1]) ny = ceiling(diff(bb[c("ymin", "ymax")])/cellsize[2]) if (has_global_longitude(x)) { # if global coverage, don't cross the boundaries: cellsize[1] = diff(bb[c("xmin", "xmax")])/nx cellsize[2] = diff(bb[c("ymin", "ymax")])/ny } x = create_dimension(from = 1, to = nx, offset = bb["xmin"], delta = cellsize[1], refsys = crs) y = create_dimension(from = 1, to = ny, offset = bb["ymax"], delta = -cellsize[2], refsys = crs) create_dimensions(list(x = x, y = y), get_raster()) } rename_xy_dimensions = function(x, dims) { #stopifnot(inherits(x, "stars"), inherits(dims, "dimensions")) dx = st_dimensions(x) xxy = attr(dx, "raster")$dimensions dimsxy = attr(dims, "raster")$dimensions if (all(xxy == dimsxy)) x else { na = names(dx) names(dx)[match(xxy, na)] = dimsxy attr(dx, "raster")$dimensions = dimsxy structure(x, dimensions = dx) } } # transform grid x to dimensions target # x is a stars object, target is a dimensions object transform_grid_grid = function(x, target, threshold) { stopifnot(inherits(x, "stars"), inherits(target, "dimensions")) x = rename_xy_dimensions(x, target) # so we can match by name xy_names = attr(target, "raster")$dimensions new_pts = st_coordinates(target[xy_names]) dxy = attr(target, "raster")$dimensions from = st_crs(target) pts = sf::sf_project(from = from, to = st_crs(x), pts = new_pts) # at xy (target) locations, get values from x, or put NA # to array: d = st_dimensions(x) # get col/row from x/y: xy = if (is_curvilinear(x)) { if (!requireNamespace("FNN", quietly = TRUE)) stop("package FNN required, please install it first") #nocov if (st_is_longlat(x)) warning("using Euclidean distance measures on geodetic coordinates") fnn = FNN::get.knnx(cc_x <- st_coordinates(d[xy_names]), pts, 1) if (is.na(threshold)) { p12 = st_as_sf(as.data.frame(cc_x[1:2,]), coords = 1:2) threshold = signif(st_distance(p12)[1,2]) message(paste("threshold set to", format(threshold), ": set a larger value if you see missing values where there shouldn't be")) } i = fnn$nn.index - 1 i[fnn$nn.dist > threshold] = NA ny = dim(x)[1] cbind(i %% ny, i %/% ny) + 1 } else colrow_from_xy(pts, x, NA_outside = TRUE) dims = dim(x) index = matrix(seq_len(prod(dims[dxy])), dims[ dxy[1] ], dims[ dxy[2] ])[xy] x = unclass(x) # avoid using [[<-.stars: if (length(dims) > 2) { remaining_dims = dims[setdiff(names(dims), dxy)] newdim = c(prod(dims[dxy]), prod(remaining_dims)) for (i in seq_along(x)) { dim(x[[i]]) = newdim x[[i]] = x[[i]][index,] dim(x[[i]]) = c(dim(target)[dxy], remaining_dims) } } else { for (i in seq_along(x)) { x[[i]] = x[[i]][index] dim(x[[i]]) = dim(target) } } d[dxy] = target[1:2] st_stars(x, dimensions = create_dimensions(d, attr(target, "raster"))) } #' Warp (resample) grids in stars objects to a new grid, possibly in an new coordinate reference system #' #' @param src object of class \code{stars} with source raster #' @param dest object of class \code{stars} with target raster geometry #' @param crs coordinate reference system for destination grid, only used when \code{dest} is missing #' @param cellsize length 1 or 2 numeric; cellsize in target coordinate reference system units #' @param segments (total) number of segments for segmentizing the bounding box before transforming to the new crs #' @param use_gdal logical; if \code{TRUE}, use gdal's warp or warper, through \link[sf]{gdal_utils} #' @param options character vector with options, passed on to gdalwarp #' @param no_data_value value used by gdalwarp for no_data (NA) when writing to temporary file; #' not setting this when \code{use_gdal} is \code{TRUE} leads to a warning #' @param debug logical; if \code{TRUE}, do not remove the temporary gdalwarp destination file, and print its name #' @param method character; see details for options; methods other than \code{near} only work when \code{use_gdal=TRUE} #' @param threshold numeric; distance threshold for warping curvilinear grids: new cells at distances larger than threshold are assigned NA values. #' @param ... ignored #' @details \code{method} should be one of \code{near}, \code{bilinear}, \code{cubic}, \code{cubicspline}, \code{lanczos}, \code{average}, \code{mode}, \code{max}, \code{min}, \code{med}, \code{q1} or \code{q3}; see https://github.com/r-spatial/stars/issues/109 #' @examples #' geomatrix = system.file("tif/geomatrix.tif", package = "stars") #' (x = read_stars(geomatrix)) #' new_crs = st_crs('OGC:CRS84') #' y = st_warp(x, crs = new_crs) #' plot(st_transform(st_as_sfc(st_bbox(x)), new_crs), col = NA, border = 'red') #' plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) #' image(y, add = TRUE, nbreaks = 6) #' plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) #' plot(st_transform(st_as_sfc(x, as_points=FALSE), new_crs), add = TRUE) #' # warp 0-360 raster to -180-180 raster: #' r = read_stars(system.file("nc/reduced.nc", package = "stars")) #' r %>% st_set_crs('OGC:CRS84') %>% st_warp(st_as_stars(st_bbox(), dx = 2)) -> s #' plot(r, axes = TRUE) # no CRS set, so no degree symbols in labels #' plot(s, axes = TRUE) #' # downsample raster (90 to 270 m) #' r = read_stars(system.file("tif/olinda_dem_utm25s.tif", package = "stars")) #' r270 = st_as_stars(st_bbox(r), dx = 270) #' r270 = st_warp(r, r270) #' @details For gridded spatial data (dimensions \code{x} and \code{y}), see figure; the existing grid is transformed into a regular grid defined by \code{dest}, possibly in a new coordinate reference system. If \code{dest} is not specified, but \code{crs} is, the procedure used to choose a target grid is similar to that of \link[raster]{projectRaster}. This entails: (i) the envelope (bounding box polygon) is transformed into the new crs, possibly after segmentation (red box); (ii) a grid is formed in this new crs, touching the transformed envelope on its East and North side, with (if cellsize is not given) a cellsize similar to the cell size of \code{src}, with an extent that at least covers \code{x}; (iii) for each cell center of this new grid, the matching grid cell of \code{x} is used; if there is no match, an \code{NA} value is used. #' @export st_warp = function(src, dest, ..., crs = NA_crs_, cellsize = NA_real_, segments = 100, use_gdal = FALSE, options = character(0), no_data_value = NA_real_, debug = FALSE, method = "near", threshold = NA_real_) { if (!inherits(src, "stars_proxy")) src = st_normalize(src) if (!is.na(crs)) crs = st_crs(crs) if (!missing(dest)) { if (inherits(dest, "crs")) stop("target crs should be specified with crs = ..., not as argument dest") } else if (is.na(crs) && !use_gdal) stop("when use_gdal is FALSE, either dest or crs need to be specified") ret = if (use_gdal) { if (is_curvilinear(src)) stop("for warping curvilinear grids using GDAL, use gdal_utils(\"warp\",...) directly on the source dataset of this object") if (!is.na(no_data_value)) options = c(options, "-dstnodata", no_data_value) else warning("no_data_value not set: missing values will appear as zero values") options = c(options, "-r", method) if (all(!is.na(cellsize))) { cellsize = rep(abs(cellsize), length.out = 2) options = c(options, "-tr", cellsize[1], cellsize[2]) } if (! inherits(src, "stars_proxy")) { src = st_as_stars_proxy(src, NA_value = no_data_value) if (debug) cat("Writing input to: ", src[[1]], "\n") else on.exit(unlink(src[[1]])) # temp file } # collapse a multi-file proxy objects into single-file/multi-band: if (length(src[[1]]) > 1 || length(src) > 1) { tmp = tempfile(fileext = ".vrt") # multi-band destination sf::gdal_utils("buildvrt", unlist(src), tmp, options = "-separate") src[[1]] = tmp } if (missing(dest) && is.na(crs)) { delete = TRUE dest = tempfile(fileext = ".tif") sf::gdal_utils("warp", src[[1]], dest, options = options) } else { # dest exists, and should be used: should use warper rather than warp # https://github.com/r-spatial/stars/issues/407 if (missing(dest)) { dest = default_target_grid(src, crs = crs, cellsize = cellsize, segments = segments) # dimensions dest = st_stars(list(values = array(NA_real_, dim(dest))), dest) } if (length(dim(src)) == 3 && length(dim(dest)) == 2) dest = merge(do.call(c, lapply(seq_len(dim(src)[3]), function(x) dest))) dest = if (! inherits(dest, "stars_proxy")) { dest[[1]] = NA_real_ * dest[[1]] # blank out values delete = !debug st_as_stars_proxy(dest, NA_value = no_data_value)[[1]] } else { delete = FALSE dest[[1]] # the file name of the stars_proxy, not to be deleted } sf::gdal_utils("warper", src[[1]], dest, options = method) # not "warp"! } if (debug) cat("Writing result to: ", dest, "\n") else if (delete) on.exit(unlink(dest)) # a temp file read_stars(dest) } else { if (method != "near") stop("methods other than \"near\" are only supported if use_gdal=TRUE") if (missing(dest)) dest = default_target_grid(src, crs = crs, cellsize = cellsize, segments = segments) if (!inherits(dest, "stars") && !inherits(dest, "dimensions")) stop("dest should be a stars object, or a dimensions object") transform_grid_grid(st_as_stars(src), st_dimensions(dest), threshold) } # restore attributes? if (method %in% c("near", "mode")) { a = lapply(src, attributes) for (i in seq_along(ret)) ret[[i]] = structure(ret[[i]], levels = attr(ret[[i]], "levels") %||% a[[i]]$levels, colors = attr(ret[[i]], "colors") %||% a[[i]]$colors, class = attr(ret[[i]], "class") %||% a[[i]]$class) } ret } stars/R/tidyverse.R0000644000176200001440000003720414627273120013762 0ustar liggesusers# convert arrays to data.frame, in long form to_df = function(x) { dplyr::as_tibble(lapply(x, function(y) structure(y, dim = NULL))) } set_dim = function(x, d) { lapply(x, function(y, dims) structure(y, dim = dims), dims = d) } get_dims = function(d_cube, d_stars) { xy = attr(d_stars, "raster")$dimensions d_stars = d_stars[names(d_cube)] for (i in seq_along(d_cube)) { d_stars[[i]]$values = if (inherits(d_stars[[i]]$values, "intervals")) { v = d_stars[[i]]$values d_stars[[i]]$values = v[ na.omit(find_interval(d_cube[[i]], v)) ] } else if (is.list(d_stars[[i]]$values)) { d_stars[[i]]$values[ d_cube[[i]] ] } else d_cube[[i]] d_stars[[i]] = create_dimension(values = d_stars[[i]]$values, point = d_stars[[i]]$point, refsys = d_stars[[i]]$refsys, is_raster = names(d_stars)[i] %in% xy) } d_stars } #' dplyr verbs for stars objects #' #' dplyr verbs for stars objects; package dplyr needs to be loaded before these methods can be used for stars objects. #' @param .data object of class \code{stars} #' @param ... see \link[dplyr]{filter} #' @name dplyr filter.stars <- function(.data, ...) { if (!requireNamespace("dplyr", quietly = TRUE)) stop("package dplyr required, please install it first") # nocov if (!requireNamespace("cubelyr", quietly = TRUE)) stop("package cubelyr required, please install it first") # nocov cb = cubelyr::as.tbl_cube(.data) cb = dplyr::filter(cb, ...) st_as_stars(cb$mets, dimensions = get_dims(cb$dims, st_dimensions(.data))) } #' @name dplyr filter.stars_proxy = function(.data, ...) { collect(.data, match.call(), "filter", ".data", env = environment()) } #' @name dplyr mutate.stars <- function(.data, ...) { ret = dplyr::mutate(to_df(.data), ...) st_as_stars(set_dim(ret, dim(.data)), dimensions = st_dimensions(.data)) } #' @name dplyr mutate.stars_proxy = function(.data, ...) { collect(.data, match.call(), "mutate", ".data", env = parent.frame()) } #' @name dplyr transmute.stars <- function(.data, ...) { ret = dplyr::transmute(to_df(.data), ...) st_as_stars(set_dim(ret, dim(.data)), dimensions = st_dimensions(.data)) } #' @name dplyr transmute.stars_proxy = function(.data, ...) { collect(.data, match.call(), "transmute", ".data", env = environment()) } #' @name dplyr select.stars <- function(.data, ...) { if (!requireNamespace("dplyr", quietly = TRUE)) stop("package dplyr required, please install it first") # nocov ret <- dplyr::select(to_df(.data), ...) st_as_stars(set_dim(ret, dim(.data)), dimensions = st_dimensions(.data)) } #' @name dplyr select.stars_proxy = function(.data, ...) { collect(.data, match.call(), "select", ".data", env = environment()) } #' @name dplyr rename.stars <- function(.data, ...) { if (!requireNamespace("dplyr", quietly = TRUE)) stop("package dplyr required, please install it first") # nocov ret <- dplyr::rename(to_df(.data), ...) st_as_stars(set_dim(ret, dim(.data)), dimensions = st_dimensions(.data)) } #' @name dplyr rename.stars_proxy = function(.data, ...) { collect(.data, match.call(), "rename", ".data", env = environment()) } #' @param var see \link[dplyr]{pull} #' @name dplyr pull.stars = function (.data, var = -1) { if (!requireNamespace("dplyr", quietly = TRUE)) stop("package dplyr required, please install it first") # nocov if (!requireNamespace("rlang", quietly = TRUE)) stop("package rlang required, please install it first") # nocov var = rlang::enquo(var) structure(dplyr::pull(to_df(.data), !!var), dim = dim(.data)) } #' @name dplyr pull.stars_proxy = function(.data, ...) { collect(.data, match.call(), "pull", ".data", env = environment()) } #' @name dplyr #' @param x object of class \code{stars} #' @export as.tbl_cube.stars = function(x, ...) { if (!requireNamespace("cubelyr", quietly = TRUE)) stop("package cubelyr required, please install it first") # nocov cleanup = function(y) { if (is.list(y)) seq_along(y) else y } dims = lapply(expand_dimensions(x), cleanup) cubelyr::tbl_cube(dims, c(unclass(x))) } #' @name dplyr #' @param along name or index of dimension to which the slice should be applied #' @param index integer value(s) for this index #' @param drop logical; drop dimensions that only have a single index? #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x1 = read_stars(tif) #' if (require(dplyr, quietly = TRUE)) { #' x1 %>% slice("band", 2:3) #' x1 %>% slice("x", 50:100) #' } slice.stars <- function(.data, along, index, ..., drop = length(index) == 1) { #stopifnot(length(index) == 1) if (!requireNamespace("rlang", quietly = TRUE)) stop("package rlang required, please install it first") # nocov nd <- length(dim(.data)) indices <- rep(list(rlang::missing_arg()), nd + 1) along = rlang::expr_text(rlang::ensym(along)) ix = which(along == names(st_dimensions(.data)))[1] indices[[ix + 1]] <- index indices[["drop"]] <- drop eval(rlang::expr(.data[!!!indices])) } #' @name dplyr slice.stars_proxy <- function(.data, along, index, ...) { # TODO: add adrop argument, this requires an eager implementation of # adrop.stars_proxy # If there are already operations queued, just add to the queue if (!is.null(attr(.data, "call_list"))) return(collect(.data, match.call(), "slice", ".data", env = parent.frame(), ...)) # figure out which dimensions are part of the files vecsize <- rev(cumprod(rev(dim(.data)))) # NOTE: The first set of dimensions corresponds to the dimensions in the # files. The second set of dimensions corresponds to the list of files. It may # be undecided where exactly the break is (at least without reading in the # files) if there are a singleton dimensions, I am not sure if this matters, # for now just assume the maximum index, this should be the safe choice. # Singleton dimensions that are part of files probably need some logic # somewhere else and cannot just be ignored. # Can we assume, that all elements of .data are the same? first_concat_dim <- max(which(vecsize == length(.data[[1]]))) stopifnot(first_concat_dim > 0) all_dims <- st_dimensions(.data) file_dims <- all_dims[seq_len(first_concat_dim - 1)] concat_dims <- all_dims[first_concat_dim:length(dim(.data))] d_concat_dims <- dim(concat_dims) l_concat_vec <- prod(d_concat_dims) # what is the dimension we have to subset ix <- which(names(all_dims) == along) - length(file_dims) stopifnot(length(ix) == 1) # if the slice is on file dimensions we have to queue the operation if (ix <= 0) return(collect(.data, match.call(), "slice", ".data", env = parent.frame(), ...)) # subset indices for the files, it may be faster to calculate these and not # take them from an array. d <- array(seq_len(l_concat_vec), d_concat_dims) idx <- rep(list(quote(expr = )), length(d_concat_dims)) idx[[ix]] <- index vidx <- as.vector(do.call(`[`, c(list(d), idx))) # The actual subsetting of files and dimensions file_list_new <- lapply(.data, function(x) x[vidx]) all_dims[[along]] <- all_dims[[along]][index] # construct stars_proxy st_stars_proxy(as.list(file_list_new), all_dims, NA_value = attr(.data, "NA_value"), resolutions = attr(.data, "resolutions"), RasterIO = attr(.data, "RasterIO")) } #' @name st_coordinates #' @param .x object to be converted to a tibble as_tibble.stars = function(.x, ..., add_max = FALSE, center = NA) { if (!requireNamespace("tibble", quietly = TRUE)) stop("package tibble required, please install it first") # nocov tibble::as_tibble(append( st_coordinates(.x, add_max = add_max, center = center), lapply(.x, function(y) structure(y, dim = NULL)) ) ) } #' @name dplyr #' @param data data set to work on #' @param replace see \link[tidyr]{replace_na}: list with variable=value pairs, where value is the replacement value for NA's replace_na.stars = function(data, replace, ...) { if (!requireNamespace("tidyr", quietly = TRUE)) stop("package tidyr required, please install it first") # nocov if (!requireNamespace("cubelyr", quietly = TRUE)) stop("package cubelyr required, please install it first") # nocov cb = cubelyr::as.tbl_cube(data) d = dim(cb$mets[[1]]) cb$mets = as.data.frame(lapply(cb$mets, as.vector)) cb$mets = unclass(tidyr::replace_na(cb$mets, replace, ...)) for (i in seq_along(cb$mets)) cb$mets[[i]] = structure(cb$mets[[i]], dim = d) st_as_stars(cb$mets, dimensions = get_dims(cb$dims, st_dimensions(data))) } #' @name dplyr replace_na.stars_proxy = function(data, ...) { collect(data, match.call(), "replace_na", "data", env = environment()) } #' ggplot geom for stars objects #' #' ggplot geom for stars objects #' @name geom_stars #' @param mapping see \link[ggplot2:geom_tile]{geom_raster} #' @param data see \link[ggplot2:geom_tile]{geom_raster} #' @param ... see \link[ggplot2:geom_tile]{geom_raster} #' @param downsample downsampling rate: e.g. 3 keeps rows and cols 1, 4, 7, 10 etc.; a value of 0 does not downsample; can be specified for each dimension, e.g. \code{c(5,5,0)} to downsample the first two dimensions but not the third. #' @param sf logical; if \code{TRUE} rasters will be converted to polygons and plotted using \link[ggplot2:ggsf]{geom_sf}. #' @param na.action function; if \code{NA} values need to be removed before plotting use the value \code{na.omit} here (only applies to objects with raster dimensions) #' @details \code{geom_stars} returns (a call to) either \link[ggplot2:geom_tile]{geom_raster}, \link[ggplot2]{geom_tile}, or \link[ggplot2:ggsf]{geom_sf}, depending on the raster or vector geometry; for the first to, an \link[ggplot2]{aes} call is constructed with the raster dimension names and the first array as fill variable. Further calls to \link[ggplot2:coord_fixed]{coord_equal} and \link[ggplot2]{facet_wrap} are needed to control aspect ratio and the layers to be plotted; see examples. If a \code{stars} array contains hex color values, and no \code{fill} parameter is given, the color values are used as fill color; see the example below. #' #' If visual artefacts occur (Moiré-Effekt), then see the details section of \link{plot.stars} #' @export #' @examples #' system.file("tif/L7_ETMs.tif", package = "stars") %>% read_stars() -> x #' if (require(ggplot2, quietly = TRUE)) { #' ggplot() + geom_stars(data = x) + #' coord_equal() + #' facet_wrap(~band) + #' theme_void() + #' scale_x_discrete(expand=c(0,0))+ #' scale_y_discrete(expand=c(0,0)) #' # plot rgb composite: #' st_as_stars(L7_ETMs)[,,,1:3] |> st_rgb() -> x # x contains colors as pixel values #' ggplot() + geom_stars(data = x) #' } geom_stars = function(mapping = NULL, data = NULL, ..., downsample = 0, sf = FALSE, na.action = na.pass) { if (!requireNamespace("ggplot2", quietly = TRUE)) stop("package ggplot2 required, please install it first") # nocov if (!requireNamespace("tibble", quietly = TRUE)) stop("package tibble required, please install it first") # nocov if (is.null(data)) stop("argument data should be a stars or stars_proxy object") for (i in seq_along(data)) { if (inherits(data[[i]], "units")) data[[i]] = units::drop_units(data[[i]]) } if (inherits(data, "stars_proxy")) data = st_as_stars(data, downsample = downsample) # fetches data else if (any(downsample > 0)) data = st_downsample(data, downsample) all_colors = function (x) { is.character(x) && all(nchar(x) %in% c(7, 9) & substr(x, 1, 1) == "#", na.rm = TRUE) } if (is.null(list(...)$fill) && all_colors(fill <- as.vector(data[[1]]))) return(geom_stars(mapping = mapping, data = data, sf = sf, na.action = na.action, ..., fill = fill)) # RETURNS/recurses if (is_curvilinear(data) || sf) data = st_xy2sfc(data, as_points = FALSE) # removes NA's by default d = st_dimensions(data) if (has_raster(d) && (is_regular_grid(d) || is_rectilinear(d))) { xy = attr(d, "raster")$dimensions if (is_regular_grid(d)) { mapping = if (is.null(mapping)) ggplot2::aes(x = !!rlang::sym(xy[1]), y = !!rlang::sym(xy[2]), fill = !!rlang::sym(names(data)[1])) else modifyList( ggplot2::aes(x = !!rlang::sym(xy[1]), y = !!rlang::sym(xy[2]), fill = !!rlang::sym(names(data)[1])), mapping) data = na.action(tibble::as_tibble(data)) ggplot2::geom_raster(mapping = mapping, data = data, ...) } else { # rectilinear: use geom_rect, passing on cell boundaries xy_max = paste0(xy, "_max") mapping = if (is.null(mapping)) ggplot2::aes(xmin = !!rlang::sym(xy[1]), ymin = !!rlang::sym(xy[2]), xmax = !!rlang::sym(xy_max[1]), ymax = !!rlang::sym(xy_max[2]), fill = !!rlang::sym(names(data)[1])) else modifyList(ggplot2::aes(xmin = !!rlang::sym(xy[1]), ymin = !!rlang::sym(xy[2]), xmax = !!rlang::sym(xy_max[1]), ymax = !!rlang::sym(xy_max[2]), fill = !!rlang::sym(names(data)[1])), mapping) data = na.action(tibble::as_tibble(data, add_max = TRUE)) ggplot2::geom_rect(mapping = mapping, data = data, ...) } } else if (has_sfc(d)) { if (is.null(mapping)) { mapping = ggplot2::aes(fill = !!rlang::sym(names(data)[1])) } else { mapping = modifyList( ggplot2::aes(fill = !!rlang::sym(names(data)[1])), mapping) } ggplot2::geom_sf(data = st_as_sf(data, long = TRUE), color = NA, mapping = mapping, ...) } else stop("geom_stars only works for objects with raster or vector geometries") } #' @name geom_stars theme_stars = function(...) { if (!requireNamespace("ggplot2", quietly = TRUE)) stop("package ggplot2 required, please install it first") # nocov # coord_equal() + # scale_fill_viridis() + # scale_x_discrete(expand=c(0,0)) + # scale_y_discrete(expand=c(0,0)) + ggplot2::theme_void() } register_all_s3_methods = function() { register_s3_method("cubelyr", "as.tbl_cube", "stars") # nocov start register_s3_method("dplyr", "filter", "stars") register_s3_method("dplyr", "filter", "stars_proxy") register_s3_method("dplyr", "select", "stars") register_s3_method("dplyr", "select", "stars_proxy") register_s3_method("dplyr", "mutate", "stars") register_s3_method("dplyr", "mutate", "stars_proxy") register_s3_method("dplyr", "pull", "stars") register_s3_method("dplyr", "pull", "stars_proxy") register_s3_method("dplyr", "rename", "stars") register_s3_method("dplyr", "rename", "stars_proxy") register_s3_method("dplyr", "slice", "stars") register_s3_method("dplyr", "slice", "stars_proxy") register_s3_method("dplyr", "transmute", "stars") register_s3_method("dplyr", "transmute", "stars_proxy") register_s3_method("tidyr", "replace_na", "stars") register_s3_method("tidyr", "replace_na", "stars_proxy") register_s3_method("lwgeom", "st_transform_proj", "stars") register_s3_method("sf", "st_join", "stars") register_s3_method("spatstat.geom", "as.owin", "stars") register_s3_method("spatstat.geom", "as.im", "stars") register_s3_method("tibble", "as_tibble", "stars") register_s3_method("xts", "as.xts", "stars") # nocov end } # from: https://github.com/tidyverse/hms/blob/master/R/zzz.R # Thu Apr 19 10:53:24 CEST 2018 #nocov start register_s3_method <- function(pkg, generic, class, fun = NULL) { stopifnot(is.character(pkg), length(pkg) == 1) stopifnot(is.character(generic), length(generic) == 1) stopifnot(is.character(class), length(class) == 1) if (is.null(fun)) { fun <- get(paste0(generic, ".", class), envir = parent.frame()) } else { stopifnot(is.function(fun)) } if (pkg %in% loadedNamespaces()) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } # Always register hook in case package is later unloaded & reloaded setHook( packageEvent(pkg, "onLoad"), function(...) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } ) } #nocov end stars/R/tile.R0000644000176200001440000000377014166576214012712 0ustar liggesusers#' Specify parameters to load raster in blocks #' #' Helper function for specifying the block parameters (\code{nXOff}, #' \code{nYOff}, \code{nXsize}, and \code{nYSize}) required by \code{RasterIO} #' argument in \link{read_stars} #' #' @param img_rows number of input raster rows (integer) #' @param img_cols number of input raster columns (integer) #' @param x_window number of rows in block (integer) #' @param y_window number of columns in block (integer) #' @param overlap number of overlapping pixels (integer) #' #' @return matrix with specified \code{nXOff}, \code{nYOff}, \code{nXsize}, #' and \code{nYSize} parameters for every block #' #' @examples #' \dontrun{ #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' r = read_stars(tif, proxy = TRUE) #' tiles = st_tile(nrow(r), ncol(r), 256, 256) #' for (i in seq_len(nrow(tiles))) { #' tile = read_stars(tif, proxy = FALSE, RasterIO = tiles[i, ]) #' # write tiles to separate files #' write_stars(tile, dsn = paste0(i, ".tif")) #' } #' } #' #' @export st_tile = function(img_rows, img_cols, x_window, y_window, overlap = 0) { # make sure input values are integers img_rows = as.integer(img_rows) img_cols = as.integer(img_cols) x_window = as.integer(x_window) y_window = as.integer(y_window) overlap = as.integer(overlap) n = ceiling((img_rows / x_window)) * ceiling((img_cols / y_window)) x_vec = y_vec = integer(n) nXSize_vec = nYSize_vec = integer(n) i = 1L for (x in seq.int(1L, img_rows, y_window)) { if (x + y_window + overlap <= img_rows) { nXSize = y_window + overlap } else { nXSize = img_rows - x + 1L } for (y in seq.int(1L, img_cols, x_window)) { if (y + x_window + overlap <= img_cols) { nYSize = x_window + overlap } else { nYSize = img_cols - y + 1L } x_vec[i] = x y_vec[i] = y nXSize_vec[i] = nXSize nYSize_vec[i] = nYSize i = i + 1L } } mat = matrix(c(x_vec, y_vec, nXSize_vec, nYSize_vec), ncol = 4) colnames(mat) = c("nXOff", "nYOff", "nXSize", "nYSize") return(mat) } stars/R/mdim.R0000644000176200001440000004001214612223663012662 0ustar liggesusers# close rings by repeating the first point close_mat = function(m) { if (any(m[1,] != m[nrow(m),])) m = rbind(m, m[1,]) if (nrow(m) < 4) stop("polygons require at least 4 points") unclass(m) } regrp = function(grp, i) { # work on single MULTIPOLYGON, group outer rings or outer rings+holes if (all(i == 0)) # only outer rings lapply(grp, function(x) list(close_mat(x))) # add one list level else { for (j in seq_along(grp)) grp[[j]] = close_mat(grp[[j]]) starts = which(i == 0) lst = vector("list", length(starts)) for (j in seq_along(lst)) { end = start = starts[j] while (end < length(i) && i[end + 1] == 1) end = end + 1 # consume holes from start to end lst[j] = list(grp[start:end]) } lst } } regroup = function(grps, ir) { mapply(regrp, grps, ir, SIMPLIFY = FALSE) } recreate_geometry = function(l) { if (length(geom <- l$geometry)) { cc = cbind(geom$x[[1]], geom$y[[1]]) if (geom$geometry_type == "point") { sfc = do.call(st_sfc, lapply(seq_len(nrow(cc)), function(i) st_point(cc[i,]))) dimension = attr(geom$x[[1]], "d_names") } else { nc = geom$node_count[[1]] pnc = c(0, cumsum(geom$part_node_count[[1]])) parts = vector("list", length(geom$part_node_count[[1]])) for (i in seq_along(parts)) parts[[i]] = cc[(pnc[i]+1):pnc[i+1],] i = findInterval(pnc[-1], cumsum(c(0, nc)), left.open = TRUE) grps = lapply(split(seq_along(parts), i), function(x) parts[x]) dimension = attr(nc, "d_names") if (geom$geometry_type == "line") sfc = do.call(st_sfc, lapply(grps, st_multilinestring)) else if (geom$geometry_type == "polygon") { ir = geom$interior_ring[[1]] grps = regroup(grps, split(ir, i)) sfc = do.call(st_sfc, lapply(grps, st_multipolygon)) # if all rings are exterior rings: add one list level to each # do.call(st_sfc, lapply(lapply(grps, function(x) lapply(x, list)), st_multipolygon)) } else stop(paste("unsupported geometry type:", geom$geometry_type)) } l$dimensions[[dimension]] = sfc } l } get_values_from_bounds = function(x, bnd, center) { a = gdal_read_mdim(x, bnd)$array_list[[1]] dim(a) = rev(dim(a)) a = t(a) if (length(dim(a)) == 2) { if (!dim(a)[2] %in% 1:2) warning(paste("bounds variable", bnd, "has", dim(a)[2], "vertices and may be treated incorrectly")) if (center) { m = apply(a, 1, mean) if (regular_intervals(m)) m else make_intervals(a[,1], a[,2]) } else # start of bound: a[,1] } else a } mdim_use_bounds = function(dims, x, bnds, center = TRUE) { if (isTRUE(bnds)) { bnds = character() for (d in names(dims)) if (d != "time" && !is.null(b <- attr(dims[[d]]$values[[1]], "attributes")["bounds"])) bnds = c(bnds, setNames(b, d)) } if (length(bnds) && is.null(names(bnds))) stop("bounds must be a named vector, names indicating the non-bounds dimension variables") for (b in names(bnds)) if (!is.na(bnds[b])) { v <- try(get_values_from_bounds(x, bnds[b], center = TRUE), silent = TRUE) if (!inherits(v, "try-error")) dims[[b]]$values[[1]] = v } dims } match_raster_dims = function(nms) { x = tolower(nms) %in% c("lon", "long", "longitude") y = tolower(nms) %in% c("lat", "latitude") if (sum(xor(x, y)) == 2) c(which(x), which(y)) else 1:2 } #' Read or write data using GDAL's multidimensional array API #' #' Read or write data using GDAL's multidimensional array API #' @name mdim #' @param filename name of the source or destination file or data source #' @param variable name of the array to be read; if `"?"`, a list of array names is returned, with group name as list element names. #' @param options character; driver specific options regarding the opening (read_mdim) or creation (write_mdim) of the dataset #' @param raster names of the raster variables (default: first two dimensions) #' @param offset integer; offset for each dimension (pixels) of sub-array to read, defaults to 0 for each dimension(requires sf >= 1.0-9) #' @param count integer; size for each dimension (pixels) of sub-array to read (default: read all); a value of NA will read the corresponding dimension entirely; counts are relative to the step size (requires sf >= 1.0-9) #' @param step integer; step size for each dimension (pixels) of sub-array to read; defaults to 1 for each dimension (requires sf >= 1.0-9) #' @param proxy logical; return proxy object? (not functional yet) #' @param debug logical; print debug info? #' @param bounds logical or character: if \code{TRUE} tries to infer from "bounds" attribute; if character, #' named vector of the form \code{c(longitude="lon_bnds", latitude="lat_bnds")} with names dimension names #' @param curvilinear control reading curvilinear (geolocation) coordinate arrays; if \code{NA} try reading the x/y dimension names; if character, defines the arrays to read; if \code{FALSE} do not try; see also \link{read_stars} #' @details it is assumed that the first two dimensions are easting and northing #' @param ... ignored #' @seealso \link[sf]{gdal_utils}, in particular util \code{mdiminfo} to query properties of a file or data source containing arrays #' @export read_mdim = function(filename, variable = character(0), ..., options = character(0), raster = NULL, offset = integer(0), count = integer(0), step = integer(0), proxy = FALSE, debug = FALSE, bounds = TRUE, curvilinear = NA) { if (proxy) stop("proxy not yet implemented in read_mdim()") stopifnot(is.character(filename), is.character(variable), is.character(options)) ret = gdal_read_mdim(filename, variable, options, rev(offset), rev(count), rev(step), proxy, debug) if (length(ret$dimensions) == 1 && length(ret$array_list) == 1 && is.data.frame(ret$array_list[[1]])) return(ret$array_list[[1]]) ## composite data: RETURNS ret = recreate_geometry(ret) if (isTRUE(bounds) || is.character(bounds)) ret$dimensions = mdim_use_bounds(ret$dimensions, filename, bounds) create_units = function(x) { u = attr(x, "units") x = structure(x, units = NULL) # remove attribute if (is.null(u) || u %in% c("", "none")) x else { if (!is.null(a <- attr(x, "attributes")) && !is.na(cal <- a["calendar"]) && cal %in% c("360_day", "365_day", "noleap")) get_pcict(x, u, cal) else { days_since = grepl("days since", u) u = try_as_units(u) if (!inherits(u, "units")) # FAIL: x else { units(x) = u if (days_since && inherits(d <- try(as.Date(x), silent = TRUE), "Date")) d else if (inherits(p <- try(as.POSIXct(x), silent = TRUE), "POSIXct")) p else x } } } } l = rev(lapply(ret$dimensions, function(x) { if (inherits(x, "sfc")) x else create_units(x$values[[1]]) })) if (length(offset) != 0 || length(step) != 0 || length(count) != 0) { if (length(offset) == 0) offset = rep(0, length(l)) if (length(step) == 0) step = rep(1, length(l)) ll = lengths(lapply(l, as.list)) # take care of dimensions of class intervals if (length(count) == 0) count = floor((ll - offset)/step) else if (any(a <- is.na(count))) count[a] = floor((ll[a] - offset[a])/step[a]) for (i in seq_along(l)) { l[[i]] = l[[i]][seq(from = offset[i]+1, length.out = count[i], by = step[i])] } } # create dimensions table: sf = any(sapply(l, function(x) inherits(x, "sfc"))) # FIXME: i %in% 1:2 always the case? raster_dims = match_raster_dims(names(l)) d = mapply(function(x, i) create_dimension(values = x, is_raster = !sf && i %in% raster_dims, point = ifelse(length(x) == 1, TRUE, NA)), l, seq_along(l), SIMPLIFY = FALSE) if (is.null(raster)) { raster = if (sf) get_raster(dimensions = rep(NA_character_,2)) else get_raster(dimensions = names(d)[raster_dims]) } else raster = get_raster(dimensions = raster) dimensions = create_dimensions(d, raster = raster) # handle array units: for (i in seq_along(ret$array_list)) if (nchar(u <- attr(ret$array_list[[i]], "units")) && inherits(u <- try_as_units(u), "units")) units(ret$array_list[[i]]) = u clean_units = function(x) { if (identical(attr(x, "units"), "")) structure(x, units = NULL) else x } lst = lapply(ret$array_list, function(x) structure(clean_units(x), dim = rev(dim(x)))) # create return object: st = st_stars(lst, dimensions) if (is.null(ret$srs) || is.na(ret$srs)) { if (missing(curvilinear) || is.character(curvilinear)) { # try curvilinear: xy = raster$dimensions ll = curvilinear if (is.character(curvilinear)) { if (is.null(names(curvilinear))) names(curvilinear) = xy[1:2] ret = try(st_as_stars(st, curvilinear = curvilinear), silent = TRUE) if (inherits(ret, "stars")) st = ret } if (!is_curvilinear(st) && inherits(x <- try(read_mdim(filename, ll[1], curvilinear = FALSE), silent = TRUE), "stars") && inherits(y <- try(read_mdim(filename, ll[2], curvilinear = FALSE), silent = TRUE), "stars") && identical(dim(x)[xy], dim(st)[xy]) && identical(dim(y)[xy], dim(st)[xy])) st = st_as_stars(st, curvilinear = setNames(list(x, y), xy)) } st } else st_set_crs(st, ret$srs) } # WRITE helper functions: add_attr = function(x, at) { # append at to attribute "attrs" structure(x, attrs = c(attr(x, "attrs"), at)) } add_units_attr = function(l) { f = function(x) { if (inherits(x, "units")) add_attr(x, c(units = as.character(units(x)))) else if (inherits(x, c("POSIXct", "PCICt"))) { cal = if (!is.null(cal <- attr(x, "cal"))) c(calendar = paste0(cal, "_day")) # else NULL, intended x = as.numeric(x) if (all(x %% 86400 == 0)) add_attr(x/86400, c(units = "days since 1970-01-01", cal)) else if (all(x %% 3600 == 0)) add_attr(x / 3600, c(units = "hours since 1970-01-01 00:00:00", cal)) else add_attr(x, c(units = "seconds since 1970-01-01 00:00:00", cal)) } else if (inherits(x, "Date")) add_attr(as.numeric(x), c(units = "days since 1970-01-01")) else x } lapply(l, f) } cdl_add_geometry = function(e, i, sfc) { stopifnot(inherits(sfc, c("sfc_POINT", "sfc_POLYGON", "sfc_MULTIPOLYGON", "sfc_LINESTRING", "sfc_MULTILINESTRING"))) if (inherits(sfc, "sfc_POLYGON")) sfc = st_cast(sfc, "MULTIPOLYGON") if (inherits(sfc, "sfc_LINESTRING")) sfc = st_cast(sfc, "MULTILINESTRING") cc = st_coordinates(sfc) if (inherits(sfc, c("sfc_MULTIPOLYGON"))) { e$node = structure(seq_len(nrow(cc)), dim = c(node = nrow(cc))) e$x = structure(cc[, 1], dim = c(node = nrow(cc))) e$y = structure(cc[, 2], dim = c(node = nrow(cc))) e$node_count = structure(rle(cc[,"L3"])$lengths, dim = setNames(length(sfc), names(e)[i])) part = rle(cc[,"L3"] * 2 * max(cc[,"L2"]) + 2 * (cc[,"L2"] - 1) + cc[,"L1"])$lengths e$part_node_count = structure(part, dim = c(part = length(part))) e$interior_ring = structure(as.numeric(cc[cumsum(part), "L1"] > 1), dim = c(part = length(part))) attr(e, "dims") = c(node = nrow(cc), part = length(part)) e$geometry = add_attr(structure(numeric(0), dim = c("somethingNonEx%isting" = 0)), c(geometry_type = "polygon", node_count = "node_count", node_coordinates = "x y", part_node_count = "part_node_count", interior_ring = "interior_ring", grid_mapping = if (!is.na(st_crs(sfc))) "crs" else NULL)) } else if (inherits(sfc, "sfc_MULTILINESTRING")) { # LINE: e$node = structure(seq_len(nrow(cc)), dim = c(node = nrow(cc))) e$x = structure(cc[, 1], dim = c(node = nrow(cc))) e$y = structure(cc[, 2], dim = c(node = nrow(cc))) e$node_count = structure(rle(cc[,"L2"])$lengths, dim = setNames(length(sfc), names(e)[i])) part = rle((cc[,"L2"] - 1) * max(cc[,"L1"]) + cc[,"L1"])$lengths e$part_node_count = structure(part, dim = c(part = length(part))) attr(e, "dims") = c(node = nrow(cc), part = length(part)) e$geometry = add_attr(structure(numeric(0), dim = c("somethingNonEx%isting" = 0)), c(geometry_type = "line", node_count = "node_count", node_coordinates = "x y", part_node_count = "part_node_count", grid_mapping = if (!is.na(st_crs(sfc))) "crs" else NULL)) } else { # POINT: if (ll <- isTRUE(st_is_longlat(sfc))) { e$lon = add_attr(structure(cc[, 1], dim = setNames(nrow(cc), names(e)[i])), c(units = "degrees_north", standard_name = "longitude")) e$lat = add_attr(structure(cc[, 2], dim = setNames(nrow(cc), names(e)[i])), c(units = "degrees_east", standard_name = "latitude")) } else { e$x = structure(cc[, 1], dim = setNames(nrow(cc), names(e)[i])) e$y = structure(cc[, 2], dim = setNames(nrow(cc), names(e)[i])) } e$geometry = add_attr(structure(numeric(0), dim = c("somethingNonEx%isting" = 0)), c(geometry_type = "point", node_coordinates = ifelse(ll, "lon lat", "x y"), grid_mapping = if (!is.na(st_crs(sfc))) "crs" else NULL)) } e } # convert stars object into a list of CDL-like variables with named dimensions st_as_cdl = function(x) { e = add_units_attr(expand_dimensions(x)) # TODO: handle sfc dimensions d = st_dimensions(x) dimx = dim(x) xy = attr(st_dimensions(x), "raster")$dimensions co = NULL for (i in seq_along(e)) { if (is.null(dim(e[[i]])) && !is.list(e[[i]])) e[[i]] = structure(e[[i]], dim = setNames(length(e[[i]]), names(e)[i])) else if (is_curvilinear(x)) { # curvilinear coordinate matrices: if (names(e)[i] == xy[1]) names(e)[i] = "lon" if (names(e)[i] == xy[2]) names(e)[i] = "lat" } else if (inherits(e[[i]], "sfc")) { # vector data cube: sfc = e[[i]] e[[i]] = structure(seq_along(sfc), dim = setNames(length(sfc), names(e)[i])) e = cdl_add_geometry(e, i, sfc) if (inherits(sfc, "sfc_POINT")) { if (isTRUE(st_is_longlat(x))) { co = c(coordinates = "lat lon") xy = c("lon", "lat") # hack } else { co = c(coordinates = "x y") xy = c("x", "y") # hack } } else { dimx = c(dimx, attr(e, "dims")) co = c(coordinates = "x y") xy = c("x", "y") # hack } co = c(co, geometry = "geometry") } } if (is_curvilinear(x)) { e[["lat"]] = add_attr(e[["lat"]], c(units = "degrees_north", "_CoordinateAxisType" = "Lat", axis = "Y")) e[["lon"]] = add_attr(e[["lon"]], c(units = "degrees_east", "_CoordinateAxisType" = "Lon", axis = "X")) co = paste(rev(setdiff(names(d), c("x", "y", "lat", "lon"))), "lat lon") } else { if (!any(is.na(xy))) { e[[ xy[1] ]] = add_attr(e[[ xy[1] ]], c(axis = "X")) e[[ xy[2] ]] = add_attr(e[[ xy[2] ]], c(axis = "Y")) } } for (i in seq_along(x)) x[[i]] = add_attr(x[[i]], co) x = add_units_attr(x) # unclasses for (i in seq_along(x)) if (is.null(names(dim(x[[i]])))) # FIXME: read_ncdf() doesn't name dim names(dim(x[[i]])) = names(d) for (i in names(e)) x[[i]] = e[[i]] which_dims = function(a, dimx) { m = match(names(dim(a)), names(dimx), nomatch = numeric(0)) - 1 if (all(is.na(m))) integer(0) else m } ret = lapply(x, function(a) structure(a, which_dims = which_dims(a, dimx))) structure(ret, which_crs = !(names(ret) %in% names(e)), is_numeric = sapply(ret, is.numeric), dims = attr(e, "dims")) } #' @name mdim #' @param x stars object #' @param driver character; driver name #' @param root_group_options character; driver specific options regarding the creation of the root group #' @param as_float logical; if \code{TRUE} write 4-byte floating point numbers, if \code{FALSE} write 8-byte doubles #' @param ... ignored #' @export #' @examples #' set.seed(135) #' m = matrix(runif(10), 2, 5) #' names(dim(m)) = c("stations", "time") #' times = as.Date("2022-05-01") + 1:5 #' pts = st_as_sfc(c("POINT(0 1)", "POINT(3 5)")) #' s = st_as_stars(list(Precipitation = m)) |> #' st_set_dimensions(1, values = pts) |> #' st_set_dimensions(2, values = times) #' nc = tempfile(fileext=".nc") #' if (compareVersion(sf_extSoftVersion()["GDAL"], "3.4.0") > -1) { #' write_mdim(s, nc) #' # try ncdump on the generated file #' print(read_mdim(nc)) #' } write_mdim = function(x, filename, driver = detect.driver(filename), ..., root_group_options = character(0), options = character(0), as_float = TRUE) { cdl = st_as_cdl(x) wkt = if (is.na(st_crs(x))) character(0) else st_crs(x)$wkt xy = attr(st_dimensions(x), "raster")$dimensions gdal_write_mdim(filename, driver, c(dim(x), attr(cdl, "dims")), cdl, wkt, xy, root_group_options = root_group_options, options = options, as_float = as_float) invisible(x) } stars/R/transform.R0000644000176200001440000001073214642501334013752 0ustar liggesusersto_curvilinear = function(x) { if (! is_curvilinear(x)) { xy = attr(st_dimensions(x), "raster")$dimensions nx = dim(x)[ xy[1] ] ny = dim(x)[ xy[2] ] cl = if (has_rotate_or_shear(x)) { pts = xy_from_colrow(as.matrix(expand.grid(seq_len(nx), seq_len(ny))) - 0.5, st_geotransform(x)) list(matrix(pts[,1], nx, ny), matrix(pts[,2], nx, ny)) } else { ed = expand_dimensions(x) list(matrix(ed[[ xy[1] ]], nx, ny), matrix(ed[[ xy[2] ]], nx, ny, byrow = TRUE)) } st_as_stars(x, curvilinear = setNames(cl, xy), crs = st_crs(x)) } else x } transform_curvilinear = function(x, crs, ...) { if (is.numeric(crs)) crs = st_crs(crs) # nocov to = crs from = if (sf_extSoftVersion()["proj.4"] < "5.0.0") { if (inherits(crs, "crs")) to = crs$proj4string else stopifnot(is.character(crs)) st_crs(x)$proj4string } else st_crs(x) get_yx = function(x) isTRUE(sf::st_crs(sf::st_sfc(sf::st_point(), crs = x), parameters=TRUE)$yx) d = st_dimensions(x) xy = attr(d, "raster")$dimensions cc = cbind(as.vector(d[[ xy[1] ]]$values), as.vector(d[[ xy[2] ]]$values)) pts = sf::sf_project(from, to, cc, ...) d[[ xy[1] ]]$refsys = d[[ xy[2] ]]$refsys = st_crs(crs) d[[ xy[1] ]]$values = matrix(pts[,1], dim(x)[xy]) d[[ xy[2] ]]$values = matrix(pts[,2], dim(x)[xy]) if (sf::st_axis_order() && get_yx(st_crs(from)) != get_yx(st_crs(crs))) { message("swapping [x] and [y] roles") attr(d, "raster")$dimensions = rev(attr(d, "raster")$dimensions) d[[ xy[1] ]]$values = t(d[[ xy[1] ]]$values) d[[ xy[2] ]]$values = t(d[[ xy[2] ]]$values) } st_stars(x, d) } #' transform geometries in stars objects to a new coordinate reference system, without warping #' #' @name st_transform #' @param x object of class \code{stars}, with either raster or simple feature geometries #' @param crs object of class \code{crs} with target crs #' @param ... ignored #' @examples #' geomatrix = system.file("tif/geomatrix.tif", package = "stars") #' (x = read_stars(geomatrix)) #' new = st_crs('OGC:CRS84') #' y = st_transform(x, new) #' plot(st_transform(st_as_sfc(st_bbox(x)), new), col = NA, border = 'red') #' plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) #' image(y, col = heat.colors(12), add = TRUE) #' plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) #' plot(st_transform(st_as_sfc(x, as_points=FALSE), new), add = TRUE) #' @seealso \link{st_warp} #' @details For simple feature dimensions, \link[sf]{st_transform} is called, leading to lossless transformation. For gridded spatial data, a curvilinear grid with transformed grid cell (centers) is returned, which is also lossless. To convert this to a regular grid in the new \code{CRS}, use \link{st_warp} (which is in general lossy). #' #' If array values contain geometries and an array as a whole is of class `sfc` and #' has a non-missing CRS, array geometries are also transformed. #' @export st_transform.stars = function(x, crs, ...) { stopifnot(!is.na(crs), !is.na(st_crs(x))) for (i in seq_along(x)) { if (inherits(x[[i]], "sfc") && !is.na(st_crs(x[[i]]))) # array cells are geometries x[[i]] = structure(st_transform(x[[i]], crs), dim = dim(x[[i]])) } if (has_sfc(x)) { if (!inherits(crs, "crs") && !inherits(crs, "stars")) crs = st_crs(crs) # needed for GDAL's transform of features d = st_dimensions(x) ix = which_sfc(x) for (j in ix) { d[[j]]$values = st_transform(d[[j]]$values, crs, ...) d[[j]]$refsys = crs } structure(x, dimensions = d) } else { if (! has_raster(x)) { warning("no spatial coordinates present: st_transform does nothing") x } else transform_curvilinear(to_curvilinear(x), crs, ...) } } #' @name st_transform st_transform_proj.stars = function(x, crs, ...) { stopifnot(!is.na(crs), !is.na(st_crs(x))) if (has_sfc(x)) { try_proj = function(x, crs) { ret = try(st_transform(x, crs), silent = TRUE) if (inherits(ret, "try-error")) { if (!requireNamespace("lwgeom", quietly = TRUE)) stop("package lwgeom required, please install it first") # nocov if (inherits(crs, "crs")) crs = crs$proj4string ret = lwgeom::st_transform_proj(x, crs) } ret } d = st_dimensions(x) ix = which_sfc(x) for (j in ix) { d[[j]]$values = try_proj(d[[j]]$values, crs) d[[j]]$refsys = crs } structure(x, dimensions = d) } else { if (! has_raster(x)) { warning("no spatial coordinates present: st_transform_proj does nothing") x } else transform_curvilinear(to_curvilinear(x), crs) } } stars/R/write.R0000644000176200001440000001640614576033423013102 0ustar liggesusers# reset the offset when x is a sub-raster (i.e, starts at index larger than 1) reset_sub = function(x) { d = st_dimensions(x) xy = attr(d, "raster")$dimensions if (all(is.na(xy))) return(x) for (i in xy) { if (d[[ i ]]$from > 1) { if (!is_regular_grid(x)) stop("can only write sub-rasters for regular grids") ioff = d[[ i ]]$from - 1 d[[ i ]]$offset = d[[ i ]]$offset + ioff * d[[ i ]]$delta d[[ i ]]$to = d[[ i ]]$to - ioff d[[ i ]]$from = 1 } } structure(x, dimensions = d) } #' @export st_write.stars = function(obj, dsn, layer, ...) { .Deprecated("write_stars") # nocov } #' @name write_stars #' @export write_stars = function(obj, dsn, layer, ...) UseMethod("write_stars") #' write stars object to gdal dataset (typically: to file) #' #' @param obj object of class \code{stars} #' @param dsn gdal dataset (file) name #' @param layer attribute name; if missing, the first attribute is written #' @param ... passed on to \link[sf:gdal]{gdal_write} #' @param driver driver driver name; see \link[sf]{st_drivers} #' @param options character vector with dataset creation options, passed on to GDAL #' @param type character; output binary type, one of: \code{Byte} for eight bit unsigned integer, \code{UInt16} for sixteen bit unsigned integer, \code{Int16} for sixteen bit signed integer, \code{UInt32} for thirty two bit unsigned integer, \code{Int32} for thirty two bit signed integer, \code{Float32} for thirty two bit floating point, \code{Float64} for sixty four bit floating point. #' @param NA_value non-NA value that should represent R's \code{NA} value in the target raster file; if set to \code{NA}, it will be ignored. #' @param update logical; if \code{TRUE}, an existing file is being updated #' @param normalize_path logical; see \link{read_stars} #' @param scale_offset length 2 numeric vector with scale, offset values: raw values computed by raw = (value - offset) / scale are written to dsn; scale and offset values are written to dsn or else a warning is raised #' @name write_stars #' @export write_stars.stars = function(obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), type = if (is.factor(obj[[1]]) && length(levels(obj[[1]])) < 256) "Byte" else "Float32", NA_value = NA_real_, update = FALSE, normalize_path = TRUE, scale_offset = c(1.0, 0.0)) { if (missing(layer) && length(obj) > 1) warning("all but first attribute are ignored") if (length(layer) > 1) stop("layer should have length 1; for writing multi-band images use merge() to merge layers into a dimension") obj = st_upfront(obj[layer]) if (! update) # new file: should not be a sub-array obj = reset_sub(obj) if (!update && !is.null(attr(obj[[1]], "colors"))) # add r g b alpha table from colors: obj[[1]] = structure(obj[[1]], rgba = t(col2rgb(attr(obj[[1]], "colors"), alpha = TRUE))) if (normalize_path) dsn = enc2utf8(maybe_normalizePath(dsn, TRUE)) sf::gdal_write(obj, ..., file = dsn, driver = driver, options = options, type = type, NA_value = NA_value, geotransform = st_geotransform(obj), update = update, scale_offset = scale_offset) invisible(obj) } #' @name write_stars #' @param chunk_size length two integer vector with the number of pixels (x, y) used in the read/write loop; see details. #' @param progress logical; if \code{TRUE}, a progress bar is shown #' @details \code{write_stars} first creates the target file, then updates it sequentially by writing blocks of \code{chunk_size}. #' @details in case \code{obj} is a multi-file \code{stars_proxy} object, all files are written as layers into the output file \code{dsn} #' @export write_stars.stars_proxy = function(obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), scale_offset = c(1.0, 0.0), type = "Float32", NA_value = NA_real_, chunk_size = c(dim(obj)[1], floor(25e6 / dim(obj)[1])), progress = TRUE) { if (!missing(layer)) obj = obj[layer] cl = attr(obj, "call_list") if (is.null(cl) && (length(obj[[1]]) > 1 || length(obj) > 1)) { # collapse bands: out_file = tempfile(fileext = ".vrt") gdal_utils("buildvrt", unlist(obj), out_file, options = "-separate") obj[[1]] = out_file } if (progress) { pb = txtProgressBar() setTxtProgressBar(pb, 0) } dim_obj = dim(obj) if (prod(chunk_size) > prod(dim_obj[1:2])) write_stars(st_as_stars(obj), dsn, layer, ..., driver = driver, options = options, scale_offset = scale_offset, type = type, NA_value = NA_value) else { # write chunked: https://github.com/r-spatial/stars/pull/291/files di_write = di_read = st_dimensions(obj) di_from = c(di_read[[1]]$from, di_read[[2]]$from) created = FALSE ncol = ceiling(dim_obj[1] / chunk_size[1]) nrow = ceiling(dim_obj[2] / chunk_size[2]) for (col in 1:ncol) { di_write[[1]]$from = 1 + (col - 1) * chunk_size[1] di_write[[1]]$to = min(col * chunk_size[1], dim_obj[1]) di_read[[1]]$from = di_write[[1]]$from + di_from[1] - 1 di_read[[1]]$to = di_write[[1]]$to + di_from[1] - 1 di_write[[1]]$offset = with(di_read[[1]], offset + delta * (from - 1)) for (row in 1:nrow) { di_write[[2]]$from = 1 + (row - 1) * chunk_size[2] di_write[[2]]$to = min(row * chunk_size[2], dim_obj[2]) di_read[[2]]$from = di_write[[2]]$from + di_from[2] - 1 di_read[[2]]$to = di_write[[2]]$to + di_from[2] -1 di_write[[2]]$offset = with(di_read[[2]], offset + delta * (from - 1)) chunk = st_as_stars(structure(obj, dimensions = di_read)) attr(chunk, "dimensions")[[1]] <- di_write[[1]] # x attr(chunk, "dimensions")[[2]] <- di_write[[2]] # y if (! created) { # create: d = st_dimensions(chunk) d_obj = st_dimensions(obj) d[[1]]$from = d[[2]]$from = 1 d[[1]]$to = d[[1]]$from + dim_obj[1] - 1 d[[2]]$to = d[[2]]$from + dim_obj[2] - 1 gt = st_geotransform(structure(obj, dimensions = d)) sf::gdal_write(structure(obj, dimensions = d), ..., file = dsn, driver = driver, options = options, type = type, scale_offset = scale_offset, NA_value = NA_value, geotransform = gt) # branches on stars_proxy } created = TRUE write_stars(chunk, dsn = dsn, layer = layer, driver = driver, options = options, type = type, scale_offset = scale_offset, update = TRUE, NA_value = NA_value) if (progress) setTxtProgressBar(pb, ((col-1) * nrow + row) / (ncol * nrow)) } } } if (progress) close(pb) invisible(obj) } #' @name write_stars #' @export #' @param filename character; used for guessing driver short name based on file #' extension; see examples #' @examples #' detect.driver("L7_ETMs.tif") detect.driver = function(filename) { #nocov start # from raster::.getFormat: ext <- tolower(tools::file_ext(filename)) if (nchar(ext) < 2) { warning("file without extension, using driver GTiff", call. = FALSE) 'GTiff' } else { switch(ext, tif = , tiff = 'GTiff', grd = 'rraster', nc = , cdf = , ncdf = 'NetCDF', zarr = 'ZARR', kml = , kmz = 'KML', big = 'big.matrix', sgrd = , sdat = 'SAGA', bil = 'BIL', bsq = 'BSQ', bip = 'BIP', bmp = 'BMP', gen = 'ADRG', bt = 'BT', envi = 'ENVI', ers = 'ERS', img = 'HFA', rst = 'RST', mpr = 'ILWIS', rsw = 'RMF', flt = 'EHdr', gpkg = 'GPKG', { warning("extension ", ext, " is unknown. Using default driver GTiff.") 'GTiff' } ) } } #nocov end stars/R/raster.R0000644000176200001440000003250014576033423013241 0ustar liggesusers#' @name st_as_stars #' @param att see \link[raster:factor]{factorValues}; column in the RasterLayer's attribute table #' @param ignore_file logical; if \code{TRUE}, ignore the Raster object file name #' @export st_as_stars.Raster = function(.x, ..., att = 1, ignore_file = FALSE) { if (!requireNamespace("raster", quietly = TRUE)) stop("package raster required, please install it first") # nocov #0 360 -90 90 e = as.vector(raster::extent(.x)) # xmin xmax ymin ymax RasterIO = if ("data" %in% slotNames(.x) && inherits(.x@data, ".SingleLayerData")) list(bands = .x@data@band) else list() if (!ignore_file) { file = if ("file" %in% slotNames(.x)) .x@file@name else if ("filename" %in% slotNames(.x)) .x@filename else "" if (file != "") { r = try(read_stars(file, RasterIO = RasterIO, ...), silent = TRUE) if (!inherits(r, "try-error")) { if (is.na(st_crs(r))) r = st_set_crs(r, st_crs(raster::crs(.x))) r = fix_dims(r, e) if (inherits(.x, "RasterLayer")) names(r) <- names(.x) return(r) } } } if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") # nocov v = raster::values(.x) dim(v) = dim(.x)[c(2,1,3)] if (all(raster::is.factor(.x))) { l = raster::levels(.x)[[1]]$levels if (length(l) == 0) # get the layer's RAT, column att: l = raster::factorValues(.x, seq_len(max(v, na.rm = TRUE)), att = att)[[1]] colors = try(.x@legend@colortable, silent = TRUE) if (inherits(colors, "try-error") || length(colors) == 0) colors = NULL else colors = colors[-1] v = structure(v, class = "factor", levels = as.character(l), colors = colors) # FIXME: should we handle levels for all layers here, or break on multiple different ones? } dimensions = list( x = create_dimension(from = 1, to = dim(v)[1], offset = e[1], delta = (e[2]-e[1])/dim(v)[1], refsys = st_crs(raster::crs(.x))), y = create_dimension(from = 1, to = dim(v)[2], offset = e[4], delta = (e[3]-e[4])/dim(v)[2], refsys = st_crs(raster::crs(.x)))) z = raster::getZ(.x) dimensions$band = if (is.null(z)) create_dimension(values = names(.x)) else create_dimension(values = z) l = if (length(names) > 1) setNames(list(v), deparse(substitute(.x), 50)) else setNames(list(v), names(.x)[1]) ret = st_as_stars(l, dimensions = create_dimensions(dimensions, get_raster())) if (dim(ret)[3] == 1) adrop(ret, 3) else ret } #' Coerce stars object into a Raster raster or brick #' #' Coerce stars object into a Raster raster or brick #' @param from object to coerce #' @name as #' @rdname coerce-methods #' @aliases coerce,stars,Raster-method #' @aliases coerce,stars_proxy,Raster-method #' @returns RasterLayer or RasterBrick #' @details If the stars object has more than three dimensions, all dimensions higher than the third will be collapsed into the third dimensions. If the stars object has only an x/y raster but multiple attributes, these are merged first, then put in a raster brick. setAs("stars", "Raster", function(from) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") # nocov if (!requireNamespace("raster", quietly = TRUE)) stop("package raster required, please install it first") # nocov if (!is_regular_grid(from)) stop("only regular rasters can be converted to Raster* objects") st_as_raster(from, class = "Raster") }) setAs("stars_proxy", "Raster", function(from) { if (!requireNamespace("raster", quietly = TRUE)) stop("package raster required, please install it first") # nocov if (!is_regular_grid(from)) stop("only regular rasters can be converted to Raster* objects") if (length(attr(from, "call_list"))) { fname = paste0(tempfile(), ".tif") write_stars(from, fname) from = fname } raster::brick(unlist(from)) }) get_terra_levels = function(x, colors) { # create factor levels, as used by stars, from SpatRaster levels in a data.frame # see https://github.com/r-spatial/stars/pull/484 x = x[order(x[[1]]), ] # sort table on level missing_labels = x[[2]] == "" levels = x[[1]] if (any(levels < 0)) stop("negative IDs in SpatRaster levels not supported") ex = setdiff(0:max(levels), levels) exclude = rep(FALSE, max(levels) + 1) exclude[ex + 1] = TRUE # 0-based vector list(levels = levels[!missing_labels], labels = x[[2]][!missing_labels], exclude = exclude, colors = colors[!missing_labels]) } #' @name st_as_stars #' @param ignore_file logical; if \code{TRUE}, ignore the SpatRaster object file name #' @param as_attributes logical; if \code{TRUE} and \code{.x} has more than one layer, load these as separate attributes rather than as a band or time dimension (only implemented for the case where \code{ignore_file} is \code{TRUE}) #' @export st_as_stars.SpatRaster = function(.x, ..., ignore_file = FALSE, as_attributes = all(terra::is.factor(.x))) { if (!requireNamespace("terra", quietly = TRUE)) stop("package terra required, please install it first") # nocov #0 360 -90 90 e = as.vector(terra::ext(.x)) # xmin xmax ymin ymax src = terra::sources(.x, bands=TRUE) attr_name = basename(src$source[1]) if (!ignore_file && all(src$source != "")) { # there can be multiple files, but only the first one is used here. # perhaps a warning should be given; better would be to iterate over "sid" # but you might have a situation where some sources are filenames and others are not if (attr_name == "") attr_name = "values" lst = vector("list", length(unique(src$sid))) for (i in unique(src$sid)) { file = unique(src$source[src$sid == i]) if (length(file) > 1) stop("more than one file per sid: giving up; try ignore_file=FALSE") # RasterIO = if (dim(.x)[3] == 1) # > 1 would be more sensible? # But this can only be ignored if the _file_ has 1 band RasterIO = list(bands = src$bands[src$sid == i]) r = try(read_stars(file, RasterIO = RasterIO, ...), silent = TRUE) if (! inherits(r, "try-error")) { if (is.na(st_crs(r)) && terra::crs(.x) != "") r = st_set_crs(r, st_crs(terra::crs(.x))) r = fix_dims(r, e) if (length(unique(src$sid)) > 1 && length(dim(r)) > 2) r = split(r) #transfer the layer/band names as well? # ... = names(.x)[1:(dim(r)[3])] # perhaps check whether they represent a time dimension (all(!is.na(time(.x)))) } else stop(paste("error reading", file, "bands", paste0(RasterIO$bands, collapse = " "))) lst[[i]] = r } ret = if (length(lst) > 1) merge(setNames(do.call(c, lst), names(.x))) else r if (!all(is.na(terra::time(.x)))) ret = st_set_dimensions(ret, 3, values = terra::time(.x), names = "time") } else { # ignore_file TRUE: if (terra::nlyr(.x) > 1 && as_attributes) { ret = do.call(c, lapply(seq_len(terra::nlyr(.x)), function(i) st_as_stars(.x[[i]], ignore_file = TRUE))) if (!is.null(names(.x))) names(ret) = names(.x) return(ret) # RETURNS } if (attr_name == "") { if (all(names(.x) == "")) attr_name = "values" else attr_name = paste(names(.x)[1], collapse = ".") } v = terra::values(.x, mat = FALSE) dimv = dim(v) = setNames(dim(.x)[c(2,1,3)], c("x", "y", "band")) if (all(terra::is.factor(.x))) { if (length(terra::levels(.x)) > 1) warning("ignoring categories/levels for all but first layer") colors = try(rgb(terra::coltab(.x)[[1]][-1], maxColorValue = 255), silent = TRUE) if (inherits(colors, "try-error") || length(colors) == 0) colors = NULL if (inherits(l <- terra::levels(.x)[[1]], "data.frame")) l = get_terra_levels(l, colors) else stop("terra levels should return a list of data.frame's; pls update terra") v = structure(factor(as.vector(v), levels = l$levels, labels = l$labels), dim = dimv, colors = l$colors, exclude = l$exclude) } crs = if (terra::crs(.x) == "") NA_crs_ else st_crs(terra::crs(.x)) dimensions = list( x = create_dimension(from = 1, to = dim(v)[1], offset = e[1], delta = (e[2]-e[1])/dim(v)[1], refsys = crs), y = create_dimension(from = 1, to = dim(v)[2], offset = e[4], delta = (e[3]-e[4])/dim(v)[2], refsys = crs)) dimensions$band = create_dimension(values = names(.x)) ret = st_as_stars(setNames(list(v), attr_name), dimensions = create_dimensions(dimensions, get_raster())) if (dim(ret)[3] == 1) ret = adrop(ret, 3) else if (!all(is.na(terra::time(.x)))) ret = st_set_dimensions(ret, 3, values = terra::time(.x), names = "time") } ret } #' Coerce stars object into a terra SpatRaster #' #' Coerce stars object into a terra SpatRaster #' @param from object to coerce #' @name as #' @rdname coerce-methods #' @aliases coerce,stars,Terra-method #' @aliases coerce,stars_proxy,Terra-method #' @returns SpatRaster #' @details If the stars object has more than three dimensions, all dimensions higher than the third will be collapsed into the third dimensions. If the stars object has only an x/y raster but multiple attributes, these are merged first, then put in a SpatRaster. setAs("stars", "SpatRaster", function(from) { if (!requireNamespace("terra", quietly = TRUE)) stop("package terra required, please install it first") # nocov if (!is_regular_grid(from)) stop("only regular rasters can be converted to SpatRaster objects") st_as_raster(from, class = "SpatRaster") }) setAs("stars_proxy", "SpatRaster", function(from) { if (!requireNamespace("terra", quietly = TRUE)) stop("package terra required, please install it first") # nocov if (!is_regular_grid(from)) stop("only regular rasters can be converted to SpatRaster objects") if (length(attr(from, "call_list"))) { fname = paste0(tempfile(), ".tif") write_stars(from, fname) from = fname } terra::rast(unlist(from)) }) fix_dims = function(r, e){ e = unname(e) rdims = attr(r, "dimensions") dxy = attr(rdims, "raster")$dimensions dimx = rdims[[dxy[1]]] dimy = rdims[[dxy[2]]] xrev = dimx$delta < 0 yrev = dimy$delta < 0 if (xrev) { dimx$offset = e[2] dimx$delta = (e[1] - e[2]) / (dimx$to - dimx$from + 1) } else { dimx$offset = e[1] dimx$delta = (e[2] - e[1]) / (dimx$to - dimx$from + 1) } if (yrev) { dimy$offset = e[4] dimy$delta = (e[3] - e[4]) / (dimy$to - dimy$from + 1) } else { dimy$offset = e[3] dimy$delta = (e[4] - e[3]) / (dimy$to - dimy$from + 1) } attr(r, "dimensions")[[dxy[1]]] = dimx attr(r, "dimensions")[[dxy[2]]] = dimy r } st_as_raster = function(x, class, ...) { stopifnot(inherits(x, "stars")) if (is.null(names(x))) names(x) = make.names(seq_along(x)) # FIXME: why? sdsr_exercises x_crs = st_crs(x) x = st_upfront(x) # x/y dimensions first if (length(dim(x)) > 3) { warning("folding all higher dimensions into the third dimension") # nocov x = st_apply(x, 1:2, as.vector) # fortunes::fortune("side effect") # nocov } if (length(dim(x)) == 2 && length(x) > 1) x = merge(x) d = st_dimensions(x) if (d[[2]]$delta > 0) { # swap: ny = dim(x)[2] d[[2]]$offset = d[[2]]$offset + ny * d[[2]]$delta # top d[[2]]$delta = -d[[2]]$delta # going down x[[1]] = if (length(dim(x)) == 2) x[[1]][,ny:1] else x[[1]][,ny:1,] } dxy = attr(d, "raster")$dimensions stopifnot(all(dxy %in% names(d))) bb = st_bbox(x) levels = NULL coltab = vector("list", length(x)) values = if (all(sapply(x, is.factor))) { ex = attr(x[[1]], "exclude") if (is.null(ex) || class != "SpatRaster") structure(merge(x)[[1]], dim = NULL) # return the factor else { v = vector("list", length(x)) levels = vector("list", length(x)) for (i in seq_along(v)) { ex = attr(x[[i]], "exclude") ix = which(!ex) - 1 # 0-based index n = as.numeric(structure(x[[i]], dim = NULL)) # factor -> numeric v[[i]] = ix[n] levels[[i]] = data.frame(IDs = ix, categories = levels(x[[i]])) if (!is.null(ct <- attr(x[[i]], "colors"))) { coltab[[i]] = t(col2rgb(rep("#000000", length(ex)), alpha = TRUE)) coltab[[i]][which(!ex),] = t(col2rgb(ct, alpha = TRUE)) } } do.call(c, v) } } else { if (any(sapply(x, is.factor))) warning("mix of factor and non-factor attributes: all factor levels are ignored") as.vector(merge(x)[[1]]) } if (class == "SpatRaster") { third = setdiff(names(d), dxy) b = terra::rast(nrows = dim(x)[ dxy[2] ], ncols=dim(x)[ dxy[1] ], xmin = bb[1], xmax = bb[3], ymin = bb[2], ymax = bb[4], nlyrs = ifelse(length(dim(x)) == 2, 1, dim(x)[third]), crs = x_crs$wkt) terra::values(b) = values if (!is.null(levels)) { levels(b) = levels if (!all(sapply(coltab, is.null))) for (i in seq_len(terra::nlyr(b))) { m = coltab[[i]] terra::coltab(b, layer = i) = cbind(value = seq_len(nrow(m)) - 1, m) } } if (length(dim(x)) != 2) { z = seq(d[[third]]) if (!any(is.na(z))) { if (is.character(z)) { names(b) = z } else { names(b) = paste0(third, z) } } } else if (length(x) == terra::nlyr(b)) names(b) = names(x) } else { if (length(dim(x)) == 2) { b = raster::raster(nrows=dim(x)[ dxy[2] ], ncols=dim(x)[ dxy[1] ], xmn = bb[1], xmx = bb[3], ymn = bb[2], ymx = bb[4], crs = as(x_crs, "CRS"), vals = values) } else { third = setdiff(names(d), dxy) b = raster::brick(nrows=dim(x)[ dxy[2] ], ncols=dim(x)[ dxy[1] ], xmn = bb[1], xmx = bb[3], ymn = bb[2], ymx = bb[4], nl = dim(x)[third], crs = as(x_crs, "CRS")) raster::values(b) = values z = seq(d[[third]]) if (!any(is.na(z))) { if (is.character(z)) names(b) = z else b = raster::setZ(b, z) } } } return(b) } stars/R/values.R0000644000176200001440000000727014576033423013246 0ustar liggesusers## $values interface # if the offset and delta fields are not set, dimension values need # to be in the $values field of a dimension. # this can be in two forms: # 1. curvilinear grid (raster, 2d space only): here, a matrix keeps the values for all x (y) # coordinates for the full set of coordinates # 2. rectilinear grid (space, but also time or sth else): here, a data.frame with values # that specify the start, and that specify the end of the dimensions values values_get_start = function(x) { stopifnot(inherits(x, "dimension")) v = x$values stopifnot(inherits(v, "intervals") && !is.null(v$start)) v$start } values_get_end = function(x) { stopifnot(inherits(x, "dimension")) v = x$values stopifnot(inherits(v, "intervals") && !is.null(v$end)) v$end } values_get_where = function(x, where) { if (where == 0.0) values_get_start(x) else if (where == 1.0) values_get_end(x) else { stopifnot(inherits(x, "dimension")) v = x$values stopifnot(inherits(v, "intervals")) v$start + where * (v$end - v$start) } } # x is an object of class dimension # where specifies, in case of linear mapping, where in [0,1] the value is to be returned: # 0 begin, 1 end, 0.5 center # geotransform: the geotransform (for rotated or sheared raster) # what: "x" or "y" if geotransform is given get_dimension_values = function(x, where = 0.0, geotransform, what = NA_character_) { stopifnot(inherits(x, "dimension")) stopifnot(where >= 0.0 && where <= 1.0) if (!is.null(x$values)) { if (is.atomic(x$values) || inherits(x$values, "sfc")) x$values else values_get_where(x, where) } else { if (! any(is.na(geotransform))) switch(what, x = xy_from_colrow(cbind(seq(x$from, x$to) - 1 + where, 0), geotransform)[,1], y = xy_from_colrow(cbind(0, seq(x$from, x$to) - 1 + where), geotransform)[,2], stop("argument what needs to be x or y") ) else if (!any(c(is.na(x$offset), is.na(x$delta)))) { if (inherits(x$offset, "PCICt") && inherits(x$delta, "difftime")) # FIXME: why does this generate a warning, where POSIXct & difftime doesn't? suppressWarnings(seq(from = x$offset + (x$from - 1 + where) * x$delta, by = x$delta, length.out = x$to - x$from + 1)) else seq(from = x$offset + (x$from - 1 + where) * x$delta, by = x$delta, length.out = x$to - x$from + 1) } else if (!is.na(x$offset) && x$from == 1 && x$to == 1) x$offset else seq(x$from, x$to) } } #values_range = function(x) { # stopifnot(inherits(x, "dimension")) # range(as.vector(as.matrix(x$values))) #} # sets the values (start, end) field of a dimension, from centers, from start, or from start & end. # if end is not given, the last two intervals are assumed to be equal sized # if centers is given, the first two, and the last two intervals are assumed to be equal sized. set_dimension_values = function(..., start = NULL, end = NULL, centers = NULL) { if (!is.null(centers) && (!is.null(start) || !is.null(end))) stop("if centers is given, start and end should not be given") if (!is.null(centers)) { l = length(centers) if (l <= 1) stop("cannot derive cell boundaries from a single center: specify start and end") d = diff(centers) start = c(centers - 0.5 * c(d[1], d)) end = c(start[-1], centers[l] + 0.5 * d[l-1]) } else if (missing(end)) { l = length(start) end = if (l == 1) NA_real_ #stop("cannot infer end values from a single start value") else c(start[-1], start[l] + diff(c(start[l-1], start[l]))) } make_intervals(start = start, end = end) } #' @export range.dimension = function(..., na.rm = FALSE) { dots = list(...) stopifnot(length(dots) == 1) x = dots[[1]] range(get_dimension_values(x, 0.0, NA, NA_character_), get_dimension_values(x, 1.0, NA, NA_character_)) } stars/R/aggregate.R0000644000176200001440000002555014644747037013707 0ustar liggesusers#' spatially or temporally aggregate stars object #' #' spatially or temporally aggregate stars object, returning a data cube with lower spatial or temporal resolution #' #' @param x object of class \code{stars} with information to be aggregated #' @param by object of class \code{sf} or \code{sfc} for spatial aggregation, for temporal aggregation a vector with time values (\code{Date}, \code{POSIXct}, or \code{PCICt}) that is interpreted as a sequence of left-closed, right-open time intervals or a string like "months", "5 days" or the like (see \link{cut.POSIXt}), or a function that cuts time into intervals; if by is an object of class \code{stars}, it is converted to sfc by \code{st_as_sfc(by, as_points = FALSE)} thus ignoring its time component. Note: each pixel is assigned to only a single group (in the order the groups occur) so non-overlapping spatial features and temporal windows are recommended. #' @param FUN aggregation function, such as \code{mean} #' @param ... arguments passed on to \code{FUN}, such as \code{na.rm=TRUE} #' @param drop logical; ignored #' @param join function; function used to find matches of \code{x} to \code{by} #' @param rightmost.closed see \link{findInterval} #' @param left.open logical; used for time intervals, see \link{findInterval} and \link{cut.POSIXt} #' @param as_points see \link[stars]{st_as_sf}: shall raster pixels be taken as points, or small square polygons? #' @param exact logical; if \code{TRUE}, use \link[exactextractr]{coverage_fraction} to compute exact overlap fractions of polygons with raster cells #' @seealso \link[sf]{aggregate}, \link[sf]{st_interpolate_aw}, \link{st_extract}, https://github.com/r-spatial/stars/issues/317 #' @export #' @aliases aggregate #' @examples #' # aggregate time dimension in format Date #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' t1 = as.Date("2018-07-31") #' x = read_stars(c(tif, tif, tif, tif), along = list(time = c(t1, t1+1, t1+2, t1+3)))[,1:30,1:30] #' st_get_dimension_values(x, "time") #' x_agg_time = aggregate(x, by = t1 + c(0, 2, 4), FUN = max) #' #' # aggregate time dimension in format Date - interval #' by_t = "2 days" #' x_agg_time2 = aggregate(x, by = by_t, FUN = max) #' st_get_dimension_values(x_agg_time2, "time") #' #TBD: #' #x_agg_time - x_agg_time2 #' #' # aggregate time dimension in format POSIXct #' x = st_set_dimensions(x, 4, values = as.POSIXct(c("2018-07-31", #' "2018-08-01", #' "2018-08-02", #' "2018-08-03")), #' names = "time") #' by_t = as.POSIXct(c("2018-07-31", "2018-08-02")) #' x_agg_posix = aggregate(x, by = by_t, FUN = max) #' st_get_dimension_values(x_agg_posix, "time") #' #TBD: #' # x_agg_time - x_agg_posix #' aggregate(x, "2 days", mean) #' if (require(ncmeta, quietly = TRUE)) { #' # Spatial aggregation, see https://github.com/r-spatial/stars/issues/299 #' prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") #' prec = read_ncdf(prec_file, curvilinear = c("lon", "lat")) #' prec_slice = dplyr::slice(prec, index = 17, along = "time") #' nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") #' nc = st_transform(nc, st_crs(prec_slice)) #' agg = aggregate(prec_slice, st_geometry(nc), mean) #' plot(agg) #' } #' #' # example of using a function for "by": aggregate by month-of-year #' d = c(10, 10, 150) #' a = array(rnorm(prod(d)), d) # pure noise #' times = Sys.Date() + seq(1, 2000, length.out = d[3]) #' m = as.numeric(format(times, "%m")) #' signal = rep(sin(m / 12 * pi), each = prod(d[1:2])) # yearly period #' s = (st_as_stars(a) + signal) %>% #' st_set_dimensions(3, values = times) #' f = function(x, format = "%B") { #' months = format(as.Date(paste0("01-", 1:12, "-1970")), format) #' factor(format(x, format), levels = months) #' } #' agg = aggregate(s, f, mean) #' plot(agg) aggregate.stars = function(x, by, FUN, ..., drop = FALSE, join = st_intersects, as_points = any(st_dimension(by) == 2, na.rm = TRUE), rightmost.closed = FALSE, left.open = FALSE, exact = FALSE) { fn_name = substr(deparse1(substitute(FUN)), 1, 20) classes = c("sf", "sfc", "POSIXct", "Date", "PCICt", "character", "function", "stars") if (!is.function(by) && !inherits(by, classes)) stop(paste("currently, only `by' arguments of class", paste(classes, collapse= ", "), "supported")) if (inherits(by, "stars")) by = st_as_sfc(by, as_points = FALSE) # and if not, then use st_normalize(by) if (inherits(by, "sf")) { geom = attr(by, "sf_column") by = st_geometry(by) } else geom = "geometry" stopifnot(!missing(FUN), is.function(FUN)) if (exact && inherits(by, c("sfc_POLYGON", "sfc_MULTIPOLYGON")) && has_raster(x)) { if (!requireNamespace("raster", quietly = TRUE)) stop("package raster required, please install it first") # nocov if (!requireNamespace("exactextractr", quietly = TRUE)) stop("package exactextractr required, please install it first") # nocov x = st_upfront(x) d = st_dimensions(x)[1:2] r = st_as_stars(list(a = array(1, dim = dim(d))), dimensions = d) e = exactextractr::coverage_fraction(as(r, "Raster"), by) st = do.call(raster::stack, e) m = raster::getValues(st) if (!identical(FUN, sum)) { # see https://github.com/r-spatial/stars/issues/289 if (isTRUE(as.character(as.list(FUN)[[3]])[2] == "mean")) m = sweep(m, 2, colSums(m), "/") # mean: divide weights by the sum of weights else stop("for exact=TRUE, FUN should either be mean or sum") } new_dim = c(prod(dim(x)[1:2]), prod(dim(x)[-(1:2)])) out_dim = c(ncol(m), dim(x)[-(1:2)]) if (isTRUE(list(...)$na.rm)) x = lapply(x, function(y) { y[is.na(y)] = 0.0; y }) agg = lapply(x, function(a) array(t(m) %*% array(a, dim = new_dim), dim = out_dim)) # %*% dropped units, so to propagate units, if present we need to copy (mean/sum): d = create_dimensions(append(setNames(list(create_dimension(values = by)), geom), st_dimensions(x)[-(1:2)])) for (i in seq_along(x)) { if (inherits(x[[i]], "units")) agg[[i]] = units::set_units(agg[[i]], units(x[[i]]), mode = "standard") names(dim(agg[[i]])) = names(d) } return(st_as_stars(agg, dimensions = d)) } drop_y = FALSE grps = if (inherits(by, c("sf", "sfc"))) { x = if (has_raster(x)) { ndims = 2 drop_y = TRUE st_upfront(x) } else if (has_sfc(x)) { ndims = 1 st_upfront(x, which_sfc(x)) } # find groups: # don't use unlist(join(x_geoms, by)) as this would miss the empty groups, # and may have multiple if geometries in by overlap, hence: if (identical(join, st_intersects) && has_raster(x)) sapply(join(x, by, as_points = as_points), function(x) if (length(x)) x[1] else NA) else { x_geoms = if (has_raster(x)) st_as_sfc(x, as_points = as_points) else st_dimensions(x)[[ which_sfc(x) ]]$values sapply(join(x_geoms, by), function(x) if (length(x)) x[1] else NA) } } else { # time: by is POSIXct/Date or character ndims = 1 x = st_upfront(x, which_time(x)) values = expand_dimensions(x)[[1]] if (is.function(by)) { i = by(values) if (!is.factor(i)) i = as.factor(i) by = levels(i) } else if (inherits(by, "character")) { i = cut(values, by, right = left.open) by = if (inherits(values, "Date")) as.Date(levels(i)) else as.POSIXct(levels(i)) } else { if (!inherits(values, class(by))) warning(paste0('argument "by" is of a different class (', class(by)[1], ') than the time values (', class(values)[1], ')')) i = findInterval(values, by, left.open = left.open, rightmost.closed = rightmost.closed) i[ i == 0 | i == length(by) ] = NA } as.integer(i) } d = st_dimensions(x) dims = dim(d) agr_grps = function(x, grps, uq, FUN, bind, ...) { do.call(bind, lapply(uq, function(i) { sel <- which(grps == i) if (!isTRUE(any(sel))) NA_real_ else apply(x[sel, , drop = FALSE], 2, FUN, ...) } )) } bind = if (length(FUN(1:10, ...)) > 1) cbind else rbind # rearrange: x = structure(x, dimensions = NULL, class = NULL) # unclass newdims = c(prod(dims[1:ndims]), prod(dims[-(1:ndims)])) for (i in seq_along(x)) { a = array(x[[i]], newdims) u = if (inherits(x[[i]], "units") && dim(a)[2] > 0) { a = units::set_units(a, units(x[[i]]), mode = "standard") try(out <- FUN(a[,1], ...)) if (inherits(out, "units")) units(out) else NULL } else NULL x[[i]] = agr_grps(a, grps, seq_along(by), FUN, bind, ...) if (is.numeric(x[[i]]) && !is.null(u)) x[[i]] = units::set_units(x[[i]], u, mode = "standard") } # reconstruct dimensions table: d[[1]] = create_dimension(values = by) names(d)[1] = if (is.function(by) || inherits(by, c("POSIXct", "Date", "PCICt", "function"))) "time" else geom if (drop_y) d = d[-2] # y # suppose FUN resulted in more than one value? if ((r <- prod(dim(x[[1]])) / prod(dim(d))) > 1) { if (r %% 1 != 0) stop("unexpected array size: does FUN return a consistent number of values?") a = attributes(d) values = if (is.null(rn <- rownames(x[[1]]))) seq_len(r) else rn[1:r] d = append(d, list(create_dimension(values = values))) n = length(d) names(d)[n] = fn_name d = d[c(n, 1:(n-1))] attr(d, "raster") = a$raster attr(d, "class") = a$class newdim = setNames(c(r, length(by), dims[-(1:ndims)]), names(d)) } else newdim = setNames(c(length(by), dims[-(1:ndims)]), names(d)) st_stars(lapply(x, structure, dim = newdim), dimensions = d) } # aggregate is done over one or more dimensions # say we have dimensions 1,...,k and we want to aggregate over i,...,j # with 1 <= i <= j <= k; # let |n| = j-1+1 be the number of dimensions to aggregate over, n # let |m| = k - n be the number of remaining dimensions, m # permute the cube such that the n dimensions are followed by the m # rearrange the cube to a 2D matrix with |i| x ... x |j| rows, and remaining cols # find the grouping of the rows # (rearrange such that groups are together) # for each sub matrix, belonging to a group, do # apply FUN to every column # assing the resulting row to the group # now we have |g| rows, with |g| the number of groups # assign each group to the target group of "by" # redimension the matrix such that unaffected dimensions match again #' @export aggregate.stars_proxy = function(x, by, FUN, ...) { if (!inherits(by, c("sf", "sfc", "sfg", "stars"))) collect(x, match.call(), "aggregate", c("x", "by", "FUN"), env = environment(), ...) else { if (inherits(by, "stars")) by = st_as_sfc(by, as_points = FALSE) by = st_geometry(by) # this assumes each result of a [ selection is small enough to hold in memory l = lapply(seq_along(by), function(i) { sel_i = st_normalize(st_as_stars(x[by[i]])) aggregate(sel_i, by[i], FUN, ...) } ) do.call(c, c(l, along = list(which_sfc(l[[1]])))) } } stars/R/proxy.R0000644000176200001440000005720014576033423013126 0ustar liggesusersshorten_names = function(x, n) { x = head(x ,n) bn = basename(x) here = paste0(normalizePath("."), .Platform$file.sep, bn) clean = gsub("\"", "", bn) if (any(x != here)) paste0("[...]", .Platform$file.sep, clean) else clean } #' @export print.stars_proxy = function(x, ..., n = 1e5, nfiles = 10, simplify = TRUE) { if (!is.null(attr(x, "resolutions"))) cat("multi-resolution ") cat("stars_proxy object with", length(x), if (length(x) > 1) "attributes" else "attribute", "in", sum(lengths(x)), "file(s)") if (length(x[[1]]) > nfiles) cat("; showing the first", min(length(x[[1]]), nfiles), "filenames\n") else cat(":\n") names = lapply(x, function(nm) if (is.function(nm)) nm() else nm) if (simplify) print(lapply(names, shorten_names, n = nfiles)) else print(lapply(names, head, n = nfiles)) if (!is.null(attr(x, "NA_value")) && !is.na(attr(x, "NA_value"))) cat("NA_value: ", attr(x, "NA_value"), "\n") cat("dimension(s):\n") print(st_dimensions(x), ...) if (!is.null(attr(x, "call_list"))) { cat("call_list:\n") print(unlist(attr(x, "call_list"))) cat("This object has pending lazy operations: dimensions as printed may not reflect this.\n") } } #' @export dim.stars_proxy = function(x) { dim(st_dimensions(x)) } #' @export as.data.frame.stars_proxy = function(x, ...) { as.data.frame(st_as_stars(x), ...) } #' @name plot #' @export #' @details when plotting a subsetted \code{stars_proxy} object, the default value for argument \code{downsample} will not be computed correctly, and has to be set manually. plot.stars_proxy = function(x, y, ..., downsample = get_downsample(dim(x))) { plot(st_as_stars(x, downsample = downsample, ...), ..., downsample = 0) } st_stars_proxy = function(x, dimensions, ..., NA_value, resolutions, RasterIO = list(), file_dim = NULL) { stopifnot(!missing(NA_value)) stopifnot(!missing(resolutions)) stopifnot(length(list(...)) == 0) stopifnot(is.list(x)) stopifnot(inherits(dimensions, "dimensions")) if (length(RasterIO) == 0) RasterIO = NULL structure(x, dimensions = dimensions, NA_value = NA_value, resolutions = resolutions, RasterIO = RasterIO, file_dim = file_dim, class = c("stars_proxy", "stars")) } add_resolution = function(lst) { n = length(lst) resolutions = data.frame(x = numeric(n), y = numeric(n)) for (i in seq_along(lst)) { d = st_dimensions(lst[[i]]) xy = attr(d, "raster")$dimensions resolutions[i,] = c(d[[ xy[1] ]]$delta, d[[ xy[2] ]]$delta) } rownames(resolutions) = sapply(lst, names) structure(lst, resolutions = resolutions) } #' @export #' @param along_crs logical; if \code{TRUE}, combine arrays along a CRS dimension #' @name c.stars c.stars_proxy = function(..., along = NA_integer_, along_crs = FALSE, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps)) { dots = list(...) get_file_dim = function(dots) { do.call(rbind, lapply(dots, attr, "file_dim")) } if (!all(sapply(dots, function(x) inherits(x, "stars_proxy")))) stop("all arguments to c() should be stars_proxy objects") rio = attr(dots[[1]], "RasterIO") # Case 1: merge attributes of several objects by simply putting them together in a single stars object; # dim does not change: if (length(dots) == 1 && length(along) == 1 && is.na(along)) # do nothing dots[[1]] else if (along_crs) combine_along_crs_proxy(dots) else if (identical(along, NA_integer_)) { if (identical_dimensions(dots)) st_stars_proxy(setNamesIfnn(do.call(c, lapply(dots, unclass)), nms), dimensions = st_dimensions(dots[[1]]), NA_value = attr(dots[[1]], "NA_value"), resolutions = NULL, file_dim = get_file_dim(dots), RasterIO = rio) else if (identical_dimensions(dots, ignore_resolution = TRUE, tolerance = tolerance)) { dots = add_resolution(dots) st_stars_proxy(setNamesIfnn(do.call(c, lapply(dots, unclass)), nms), dimensions = st_dimensions(dots[[1]]), resolutions = attr(dots, "resolutions"), NA_value = attr(dots[[1]], "NA_value"), file_dim = get_file_dim(dots), RasterIO = rio) } else { # currently catches only the special case of ... being a broken up time series: along = sort_out_along(dots) if (!is.na(along)) do.call(c, c(dots, along = along)) else if (!try_hard) stop("don't know how to merge arrays: please specify parameter along") else { d = lapply(dots, st_dimensions) ident = c(TRUE, sapply(d[-1], identical, d[[1]])) if (!all(ident)) warning(paste( "ignored subdataset(s) with dimensions different from first subdataset:", paste(which(!ident), collapse = ", "), "\nuse gdal_subdatasets() to find all subdataset names")) if (!is.null(nms)) nms = nms[ident] st_stars_proxy(setNamesIfnn(do.call(c, lapply(dots[ident], unclass)), nms), dimensions = st_dimensions(dots[[1]]), NA_value = attr(dots[[1]], "NA_value"), resolutions = NULL, file_dim = get_file_dim(dots), RasterIO = rio) } } } else { # arrange along "along" dimension: if (is.list(along)) { # custom ordering of ... over dimension(s) with values specified stop("for proxy objects, along argument as list is not implemented") } else { # loop over attributes, abind them: # along_dim: the number of the dimension along which we merge arrays d = st_dimensions(dots[[1]]) along_dim = if (is.character(along)) { along_dim = which(along == names(d)) if (length(along_dim) == 0) length(d) + 1 else along_dim } else along # ret = propagate_units(mapply(abind, ..., along = along_dim, SIMPLIFY = FALSE), dots[[1]]) ret = if (length(dots[[1]]) == 1) list(attr = unlist(do.call(c, lapply(dots, unclass)))) else { m = mapply(c, lapply(dots, unclass)) # simplifies to list matrix setNames(lapply(seq_len(nrow(m)), function(i) unlist(m[i,])), names(dots[[1]])) } dims = combine_dimensions(dots, along_dim) if (along_dim == length(d) + 1) names(dims)[along_dim] = if (is.character(along)) along else "new_dim" st_stars_proxy(ret, dimensions = dims, NA_value = attr(dots[[1]], "NA_value"), resolutions = NULL, file_dim = get_file_dim(dots), RasterIO = rio) } } } combine_along_crs_proxy = function(dots) { crs = lapply(l, st_crs) l = lapply(dots, st_set_crs, value = NA) ret = do.call(c, c(l, along = "crs")) st_set_dimensions(ret, "crs", values = crs, point = TRUE) } #' @export #' @name redimension st_redimension.stars_proxy = function(x, new_dims = st_dimensions(x), along = list(new_dim = names(x)), ...) { d = st_dimensions(x) new_dim = create_dimension(values = along[[1]]) dims = create_dimensions(c(d, new_dim = list(new_dim)), attr(d, "raster")) names(dims)[names(dims) == "new_dim"] = names(along) ret = list(unlist(do.call(c, lapply(x, unclass)))) st_stars_proxy(setNames(ret, paste(names(x), collapse = ".")), dimensions = dims, NA_value = attr(x, "NA_value"), resolutions = attr(x, "resolutions")) } # fetch a stars object from a stars_proxy object, using downsampling fetch = function(x, downsample = 0, ...) { stopifnot(inherits(x, "stars_proxy")) d = st_dimensions(x) xy = attr(d, "raster")$dimensions dx = d[[ xy[1] ]] dy = d[[ xy[2] ]] nBufXSize = nXSize = dx$to - dx$from + 1 nBufYSize = nYSize = dy$to - dy$from + 1 downsample = rep(downsample, length.out = 2) if (downsample[1] > 0) nBufXSize = ceiling(nBufXSize / (downsample[1] + 1)) if (downsample[2] > 0) nBufYSize = ceiling(nBufYSize / (downsample[2] + 1)) # issue #438: if (any(downsample > 0) && !is.null(attr(x, "RasterIO"))) warning("with RasterIO defined, argument downsample is ignored") rasterio = attr(x, "RasterIO") %||% list(nXOff = dx$from, nYOff = dy$from, nXSize = nXSize, nYSize = nYSize, nBufXSize = nBufXSize, nBufYSize = nBufYSize) # select bands? bands <- d[["band"]] if (!is.null(bands)) { if (!is.null(bands$values) && is.numeric(bands$values)) rasterio$bands = bands$values else if (!is.na(bands$from) && !is.na(bands$to) # && (bands$to - bands$from + 1) < length(x[[1]]) ) rasterio$bands = seq(bands$from, bands$to) if (!is.null(rasterio$bands) && length(rasterio$bands) > 1 && length(rasterio$bands) == length(x[[1]])) # one band in each file rasterio$bands = NULL # https://github.com/r-spatial/stars/issues/608 } # do it: ret = vector("list", length(x)) res <- attr(x, "resolutions") for (i in seq_along(ret)) { if (!is.null(res) && any(res[1,] != res[i,])) { mult = c(res[i,1] / res[1,1], res[i,2] / res[1,2]) rasterio$nXOff = floor((dx$from - 1) / mult[1]) + 1 rasterio$nYOff = floor((dy$from - 1) / mult[2]) + 1 rasterio$nXSize = ceiling(dx$to / mult[1]) - floor((dx$from - 1) / mult[1]) rasterio$nYSize = ceiling(dy$to / mult[2]) - floor((dy$from - 1) / mult[2]) rasterio$nBufXSize = ceiling(rasterio$nXSize * mult[1] / (downsample[1] + 1)) rasterio$nBufYSize = ceiling(rasterio$nXSize * mult[2] / (downsample[2] + 1)) mod = function(a, n) { a - n * floor(a/n) } offset = round(c(mod(dx$from - 1, mult[1]), mod(dy$from - 1, mult[2]))) } else offset = c(0,0) file_name = unclass(x)[[i]] if (is.function(file_name)) # realise/evaluate: file_name = file_name() ret[[i]] = read_stars(file_name, RasterIO = rasterio, NA_value = attr(x, "NA_value") %||% NA_real_, normalize_path = FALSE, proxy = FALSE, ...) if (i == 1) dm1 = dim(ret[[1]]) else { xrange = seq_len(dm1[1]) + offset[1] yrange = seq_len(dm1[2]) + offset[2] ret[[i]] = ret[[i]] [ , xrange, yrange ] st_dimensions(ret[[i]]) = st_dimensions(ret[[1]]) } } along = if (length(dim(x)) > 3) setNames(list(st_get_dimension_values(x, 4)), tail(names(st_dimensions(x)), 1)) else list(new_dim = names(x)) ret = if (length(ret) == 1) st_redimension(ret[[1]], name = along) else do.call(c, lapply(ret, st_redimension, along = along)) new_dim = st_dimensions(ret) # for (dm in setdiff(names(d), xy)) # copy over non x/y dimension values, if present: # if (dm %in% names(new_dim)) # new_dim[[dm]] = d[[dm]] if (length(d) > 2) for (dm in 3:length(d)) { new_dim[[dm]] = d[[dm]] # copy all fields - what if this was downsampled? names(new_dim)[dm] = names(d)[dm] } ret = unclass(ret) for (i in seq_along(ret)) { file_dim = attr(x, "file_dim") if (is.null(bands) && !is.null(file_dim) && ncol(file_dim) == length(dim(new_dim)) && ncol(file_dim) == 3) { # https://github.com/r-spatial/stars/issues/596 r = new_dim[[3]]$from:new_dim[[3]]$to # FIXME: or else use $values? ret[[i]] = ret[[i]][,,r] } dim(ret[[i]]) = dim(new_dim) } adrop(st_set_crs(st_stars(setNames(ret, names(x)), new_dim), st_crs(x))) } check_xy_warn = function(call, dimensions) { if (as.character(as.list(call)[[1]]) == "st_apply") { # check dims MARGIN = as.list(call)$MARGIN if (inherits(MARGIN, "call")) MARGIN = eval(MARGIN, environment(call)) if (inherits(MARGIN, "name")) MARGIN = get("MARGIN", environment(call)) xy = attr(dimensions, "raster")$dimensions ok = if (is.numeric(MARGIN)) all(which(names(dimensions) %in% xy) %in% MARGIN) else all(xy %in% MARGIN) if (!ok) warning("st_apply on x/y dimensions applied to downsampled image(s)") } } #' @name st_as_stars #' @param downsample integer: if larger than 0, downsample with this rate (number of pixels to skip in every row/column); if length 2, specifies downsampling rate in x and y. #' @param url character; URL of the stars endpoint where the data reside #' @param envir environment to resolve objects in #' @export st_as_stars.stars_proxy = function(.x, ..., downsample = 0, url = attr(.x, "url"), envir = parent.frame()) { if (! is.null(url)) { # execute/get remotely: # nocov start # if existing, convert call_list to character: attr(.x, "call_list") = lapply(attr(.x, "call_list"), deparse) # push the object to url, then st_as_stars() it there: tempnam = substr(tempfile(pattern = "Z", tmpdir = "", fileext = ""), 2, 15) put_data_url(url, tempnam, .x) expr = paste0("st_as_stars(", tempnam, ", url = NULL, downsample=", downsample, ", envir = data)") # evaluate in "data" first ret = get_data_url(url, expr) put_data_url(url, tempnam, NULL) # remove the temporary object ret # nocov end } else { cl = attr(.x, "call_list") # FIXME: this means we ALWAYS process after (possibly partial) reading; # there are cases where this is not right. Hence: # TODO: only warn when there is a reason to warn. if (!all(downsample == 0)) lapply(attr(.x, "call_list"), check_xy_warn, dimensions = st_dimensions(.x)) process_call_list(fetch(.x, ..., downsample = downsample), cl, envir = envir, downsample = downsample) } } st_as_stars_proxy = function(x, fname = tempfile(fileext = rep_len(".tif", length(x))), quiet = TRUE, NA_value = NA_real_) { stopifnot(inherits(x, "stars")) if (inherits(x, "stars_proxy")) return(x) for (i in seq_along(x)) write_stars(x[i], fname[i], NA_value = NA_value) if (!quiet) cat(paste("writing to", fname, "\n")) st_stars_proxy(setNames(as.list(fname), names(x)), st_dimensions(x), NA_value = NA_value, resolutions = NULL) } # execute the call list on a stars object process_call_list = function(x, cl, envir = new.env(), downsample = 0) { for (i in seq_along(cl)) { if (is.character(cl[[i]])) cl[[i]] = parse(text = cl[[i]])[[1]] stopifnot(is.call(cl[[i]])) env = environment(cl[[i]]) env [[ names(cl[[i]])[2] ]] = x # here, a stars_proxy may be replaced with the fetched stars object old_downsample = env$downsample # might be NULL if (!is.null(env$downsample) && any(env$downsample != downsample)) { cat(paste0("overriding downsample of (sub)expression to c(", paste(downsample, collapse = ","), ")\n")) env$downsample = downsample } # so we need to do that for other args too: https://github.com/r-spatial/stars/issues/390 : if ("e2" %in% names(env) && inherits(env$e2, "stars_proxy")) # binary ops: also fetch the second arg env$e2 = st_as_stars(env$e2, downsample = downsample) x = eval(cl[[i]], env, parent.frame()) env$downsample = old_downsample } x } # add a call to the call list, possibly replacing function name (fn) and first arg name collect = function(x, call, fn, args = "x", env, ...) { call_list = attr(x, "call_list") %||% list() dots = list(...) nd = names(dots) # I would say now to do # env = as.environment(append(as.list(env), dots)) -> but that didn't work. # so we iterate over ... : for (i in seq_along(dots)) env[[ nd[i] ]] = dots[[i]] args = c(args, nd) # set function to call: lst = as.list(call) if (!missing(fn)) lst[[1]] = as.name(fn) # set argument names: if (!missing(fn) && fn == "[") { lst[[2]] = as.name(args[1]) lst[[3]] = as.name(args[2]) for (i in seq_along(args)[-(1:2)]) { if (!args[i] %in% names(lst)) lst[[ args[i] ]] = as.name(args[i]) # appends } } else { for (i in seq_along(args)) { lst[[i+1]] = as.name(args[i]) names(lst)[[i+1]] = args[i] } } call = as.call(lst) environment(call) = env structure(x, call_list = c(call_list, call)) } #' @export adrop.stars_proxy = function(x, drop = which(dim(x) == 1), ...) { collect(x, match.call(), "adrop", c("x", "drop"), env = environment(), ...) } #' @export aperm.stars_proxy = function(a, perm = NULL, ...) { collect(a, match.call(), "aperm", c("a", "perm"), env = environment(), ...) } #' @export is.na.stars_proxy = function(x) { collect(x, match.call(), "is.na", "x", env = environment()) } #' @name stars_subset #' @export "[<-.stars_proxy" = function(x, i, downsample = 0, value) { # https://stackoverflow.com/questions/9965577/copy-move-one-environment-to-another # copy the environment, to avoid side effect later on: # FIXME: to investigate - should this be done to env in every call to collect()? env = as.environment(as.list(environment(), all.names = TRUE)) # copies parent.env(env) = parent.env(environment()) collect(x, match.call(), "[<-", c("x", "i", "value", "downsample"), env) } #' @export split.stars_proxy = function(x, ...) { collect(x, match.call(), "split", env = environment()) } #' @export merge.stars_proxy = function(x, y, ..., name = "attributes") { if (!missing(y)) stop("argument y needs to be missing: merging attributes of x") if (!is.null(attr(x, "call_list")) || !is.null(attr(x, "resolutions"))) # postpone: collect(x, match.call(), "merge", c("x", "y", "name"), env = environment(), ...) else { if (length(x) > 1) { cl = class(x) x = unclass(x) x[[1]] = unlist(x) x[2:length(x)] = NULL class(x) = cl } st_stars_proxy(x, dimensions = create_dimensions(append(st_dimensions(x), list(band = create_dimension(values = names(x[[1]])))), raster = attr(st_dimensions(x), "raster")), NA_value = attr(x, "NA_value"), resolutions = attr(x, "resolutions")) } } #' @export "[.stars_proxy" = function(x, i = TRUE, ..., drop = FALSE, crop = TRUE) { get_range = function(expr) { v = try(eval(expr, parent.frame(2)), silent = TRUE) if (is.numeric(v) && all(diff(v) == 1)) range(v) else NULL } rio = attr(x, "RasterIO") dim_orig = dim(x) mc = match.call() lst = as.list(mc) cl = attr(x, "call_list") if (length(lst) < 3) return(x) # if (missing(i) | !"i" %in% names(lst)) # insert: lst = c(lst[1:2], i = TRUE, lst[-(1:2)]) if (inherits(i, c("character", "logical", "numeric")) && is.null(cl)) { if (!is.null(unclass(x)[[i]])) { # can/should be selected now: if (!is.null(resolutions <- attr(x, "resolutions"))) resolutions = resolutions[i, ] x = st_stars_proxy(unclass(x)[i], st_dimensions(x), NA_value = attr(x, "NA_value"), resolutions = resolutions, file_dim = attr(x, "file_dim"), RasterIO = rio) lst[["i"]] = TRUE # this one has been handled now } ix = 1 while (length(lst) >= 4) { # https://github.com/r-spatial/stars/issues/496 if (!is.null(r <- get_range(lst[[4]]))) { attr(x, "dimensions")[[ix]]$from = r[1] attr(x, "dimensions")[[ix]]$to = r[2] if(!is.null(attr(x, "dimensions")[[ix]]$values)) { attr(x, "dimensions")[[ix]]$values <- attr(x, "dimensions")[[ix]]$values[r[1]:r[2]] } } ix = ix + 1 lst[[4]] = NULL # eat/remove } } else if (crop && inherits(i, c("sf", "sfc", "stars", "bbox"))) { x = st_crop(x, i, ..., collect = FALSE) # does bounding box cropping only if (inherits(i, c("stars", "bbox"))) lst[["i"]] = TRUE # this one has been handled now } # return or collect? file_dim = attr(x, "file_dim") %||% matrix(dim(x)[1:2], 1) n_file_dim = ncol(file_dim) if (length(lst) == 3 && isTRUE(lst[["i"]]) && is.null(cl) && # drop a number of files in the lists of files? length(x) && length(dim(x)) > n_file_dim && length(x[[1]]) == prod(dim_orig[-(seq_len(ncol(file_dim)))])) { # https://github.com/r-spatial/stars/issues/561 # select from the vectors of proxy object names: get_ix = function(d) { stopifnot(inherits(d, "dimension")) if (!is.na(d$from)) seq(d$from, d$to) else d$values } d = st_dimensions(x)[-seq_len(n_file_dim)] # dimensions not in the file(s) e = do.call(expand.grid, lapply(dim_orig[-seq_len(n_file_dim)], seq_len)) # all combinations e$rn = seq_len(nrow(e)) # their index f = do.call(expand.grid, lapply(d, get_ix)) # the ones we want if (!requireNamespace("dplyr", quietly = TRUE)) stop("package dplyr required, please install it first") # nocov sel = dplyr::inner_join(e, f, by = colnames(f))$rn for (i in seq_along(x)) # select: x[[i]] = x[[i]][sel] x } else { # still processing the geometries inside the bbox: if (length(lst) == 3 && isTRUE(lst[["i"]]) && is.null(cl)) x else collect(x, as.call(lst), "[", c("x", "i", "drop", "crop"), env = environment()) # postpone every arguments > 3 to after reading cells } } # shrink bbox with e * width in each direction bb_shrink = function(bb, e) { dx = diff(bb[c("xmin", "xmax")]) dy = diff(bb[c("ymin", "ymax")]) st_bbox(setNames(c(bb["xmin"] + e * dx, bb["ymin"] + e * dy, bb["xmax"] - e * dx, bb["ymax"] - e * dy), c("xmin", "ymin", "xmax", "ymax"))) } #' @name st_crop #' @param collect logical; if \code{TRUE}, repeat cropping on \code{stars} object, i.e. after data has been read #' @export st_crop.stars_proxy = function(x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), collect = TRUE) { dm = st_dimensions(x) d_max = dim(x) + sapply(dm, function(x) x$from) - 1 if (st_crs(x) != st_crs(y)) stop("for cropping, the CRS of both objects has to be identical") if (crop && has_raster(x)) { rast = attr(dm, "raster")$dimensions xd = rast[1] yd = rast[2] bb = if (!inherits(y, "bbox")) st_bbox(y) else y if (epsilon != 0) bb = bb_shrink(bb, epsilon) # FIXME: document how EXACTLY cropping works; https://github.com/hypertidy/tidync/issues/73 cr = colrow_from_xy(matrix(bb, 2, byrow=TRUE), dm) # crop x: dm[[ xd ]]$from = max(1, cr[1, 1], na.rm = TRUE) dm[[ xd ]]$to = min(d_max[xd], cr[2, 1], na.rm = TRUE) if(!is.null(dm[[ xd ]]$values)) dm[[ xd ]]$values = dm[[ xd ]]$values[dm[[ xd ]]$from:dm[[ xd ]]$to] # crop y: if (!is.na(dm[[ yd ]]$delta) && dm[[ yd ]]$delta < 0) # FIXME: just subtract values to avoid NA miss? cr[1:2, 2] = cr[2:1, 2] dm[[ yd ]]$from = max(1, cr[1, 2], na.rm = TRUE) dm[[ yd ]]$to = min(d_max[yd], cr[2, 2], na.rm = TRUE) if(!is.null(dm[[ yd ]]$values)) dm[[ yd ]]$values = dm[[ yd ]]$values[dm[[ yd ]]$from:dm[[ yd ]]$to] } x = st_stars_proxy(x, dm, NA_value = attr(x, "NA_value"), resolutions = attr(x, "resolutions"), file_dim = attr(x, "file_dim")) # crop to bb if (collect) collect(x, match.call(), "st_crop", c("x", "y", "crop", "epsilon"), env = environment(), ...) # crops further when realised else x } #' @export st_apply.stars_proxy = function(X, MARGIN, FUN, ..., CLUSTER = NULL, PROGRESS = FALSE, FUTURE = FALSE, rename = TRUE, .fname) { mc = match.call() if (missing(.fname)) .fname = as.character(mc[["FUN"]])[1] collect(X, mc, "st_apply", c("X", "MARGIN", "FUN", "CLUSTER", "PROGRESS", "FUTURE", "rename", ".fname"), env = environment(), ...) } #' @export #' @name predict.stars predict.stars_proxy = function(object, model, ...) { collect(object, match.call(), "predict", c("object", "model"), env = environment(), ...) } #' @export "[[<-.stars_proxy" = function(x, i, value) { y = unclass(x) y[[i]] = value structure(y, class = class(x)) } #' @export st_normalize.stars_proxy = function(x, domain = c(0, 0, 1, 1), ...) { stopifnot(all(domain == c(0,0,1,1))) d = st_dimensions(x) stopifnot(d[[1]]$from == 1, d[[2]]$from == 1) x } #' @export image.stars_proxy <- function(x, ..., downsample = get_downsample(dim(x))) { image(st_as_stars(x, downsample = downsample), ...) } #nocov start get_data_url = function(url, expr = NULL) { if (!requireNamespace("httr", quietly = TRUE)) # GET, POST, PUT stop("package httr required, please install it first") # nocov if (!requireNamespace("jsonlite", quietly = TRUE)) # base64_dec, base64_enc, toJSON, fromJSON stop("package jsonlite required, please install it first") # nocov if (is.null(expr)) jsonlite::fromJSON( httr::content(httr::GET(url), "text", encoding = "UTF-8")) else { js = jsonlite::fromJSON( httr::content(httr::POST(url, body = list(expr = expr), encode = "json"), "text", encoding = "UTF-8")) if (is.list(js) && !is.null(js$error)) stop(paste(js$error, ":", js$message)) unserialize(jsonlite::base64_dec(js)) } } put_data_url = function(url, name, value) { if (!requireNamespace("httr", quietly = TRUE)) # GET, POST, PUT stop("package httr required, please install it first") # nocov if (!requireNamespace("jsonlite", quietly = TRUE)) # base64_dec, base64_enc, toJSON, fromJSON stop("package jsonlite required, please install it first") # nocov value = jsonlite::toJSON(jsonlite::base64_enc(serialize(value, NULL))) httr::PUT(url, body = list(name = name, value = value), encode = "json") } #nocov end stars/R/extract.R0000644000176200001440000001615114600562123013407 0ustar liggesusers#' Extract cell values at point locations #' #' Extract cell values at point locations #' @name st_extract #' @export st_extract = function(x, ...) UseMethod("st_extract") #' @name st_extract #' @param x object of class \code{stars} or \code{stars_proxy} #' @param at object of class \code{sf} or \code{sfc} with geometries, or two-column matrix with coordinate points in rows, indicating where to extract values of \code{x} #' @param bilinear logical; use bilinear interpolation rather than nearest neighbour? #' @param time_column character or integer; name or index of a column with time or date values that will be matched to values of the first temporal dimension (matching classes \code{POSIXct}, \code{POSIXt}, \code{Date}, or \code{PCICt}), in \code{x}, after which this dimension is reduced. This is useful to extract data cube values along a trajectory; see https://github.com/r-spatial/stars/issues/352 . #' @param interpolate_time logical; should time be interpolated? if FALSE, time instances are matched using the coinciding or the last preceding time in the data cube. #' @param FUN function used to aggregate pixel values when geometries of \code{at} intersect with more than one pixel #' @param ... passed on to \link{aggregate.stars} when geometries are not exclusively POINT geometries #' @returns if \code{at} is of class \code{matrix}, a matrix with extracted values is returned; #' otherwise: if \code{x} has more dimensions than only x and y (raster), an #' object of class \code{stars} with POINT geometries replacing x and y raster #' dimensions, if this is not the case, an object of \code{sf} with extracted values. #' @details points outside the raster are returned as \code{NA} values. For #' large sets of points for which extraction is needed, passing a matrix as #' to \code{at} may be much faster than passing an \code{sf} or \code{sfc} object. #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' r = read_stars(tif) #' pnt = st_sample(st_as_sfc(st_bbox(r)), 10) #' st_extract(r, pnt) #' st_extract(r, pnt) %>% st_as_sf() #' st_extract(r[,,,1], pnt) #' st_extract(r, st_coordinates(pnt)) # "at" is a matrix: return a matrix st_extract.stars = function(x, at, ..., bilinear = FALSE, time_column = attr(at, "time_column") %||% attr(at, "time_col"), interpolate_time = bilinear, FUN = mean) { stopifnot(inherits(at, c("sf", "sfc", "matrix"))) if (inherits(at, "matrix")) pts = at else { stopifnot(st_crs(at) == st_crs(x)) if (! all(st_dimension(at) == 0)) { # should check & branch here in case of MULTIPOINT? stopifnot(is.null(time_column), !bilinear, !interpolate_time) # from aggregate.stars_proxy: by = st_geometry(at) # this assumes the result is small, no need to proxy l = lapply(seq_along(by), function(i) aggregate(st_normalize(st_as_stars(x[by[i]])), by[i], FUN, ...)) return(do.call(c, c(l, along = list(which_sfc(l[[1]]))))) # RETURNS! } sf_column = attr(at, "sf_column") %||% "geometry" tm_pts = if (!is.null(time_column)) at[[time_column]] # else NULL at = st_geometry(at) pts = st_coordinates(at) } if (bilinear && !inherits(x, "stars_proxy")) x = st_as_stars_proxy(x) min_dist = NULL m = if (inherits(x, "stars_proxy")) { try_result = try(x0 <- st_as_stars(x, downsample = dim(x)/2), silent = TRUE) lapply(x, function(y) do.call(abind, lapply(get_names(y), gdal_extract, pts = pts, bilinear = bilinear))) } else { x = st_normalize(st_upfront(x)) if (is_curvilinear(x)) { # https://github.com/r-spatial/stars/issues/632 d = st_distance(at, st_as_sfc(x, as_points = TRUE)) ix = apply(d, 1, which.min) # FIXME: handle points outside the raster min_dist = d[cbind(seq_along(at), ix)] } else { cr = colrow_from_xy(pts, x, NA_outside = TRUE) ix = (cr[,2] - 1) * dim(x)[1] + cr[,1] } lapply(x, function(y) array(y, dim = c(prod(dim(x)[1:2]), prod(dim(x)[-(1:2)])))[ix, , drop = FALSE]) } # reset factors & units attributes: for (i in seq_along(m)) { if (inherits(x[[i]], "factor")) { if (is.character(m[[i]])) m[[i]] = match(as.vector(m[[i]]), levels(x[[i]])) m[[i]] = structure(m[[i]], levels = levels(x[[i]]), colors = attr(x[[i]], "colors"), class = class(x[[i]])) } else if (inherits(x[[i]], "units")) units(m[[i]]) = units(x[[i]]) else if (inherits(x, "stars_proxy") && !inherits(try_result, "try-error") && inherits(x0[[i]], "units")) units(m[[i]]) = units(x0[[i]]) } # match times: if (!is.null(time_column)) { refsys_time = c("POSIXct", "POSIXt", "Date", "PCICt") ## If there are more than two temporal dimensions, the first one is taken tm = names(which(sapply( st_dimensions(x), function(i) any(i$refsys %in% refsys_time))))[1] if (is.na(tm)) stop("cannot match times: x does not have a temporal dimension") tm_cube = st_dimensions(x)[[tm]]$values %||% st_get_dimension_values(x, tm) tm_ix = match_time(tm_pts, tm_cube, intervals = !st_dimensions(x)[[tm]]$point, interpolate_time) if (!interpolate_time) m = lapply(m, function(p) p[cbind(seq_along(at), tm_ix)]) else { interpolate = function(x, ix) { i = floor(ix) di = ix - i if (is.na(ix) || di == 0) x[i] else (1 - di) * x[i] + di * x[i+1] } # each time series is reduced to a _single_ time step, interpolated: m = lapply(m, function(n) mapply(interpolate, asplit(n, 1), tm_ix)) } } if (NCOL(m[[1]]) > 1) { # multi-band: if (inherits(at, "matrix")) do.call(cbind, m) else { # return stars: for (i in seq_along(x)) dim(m[[i]]) = c(length(at), dim(x)[-(1:2)]) d = structure(st_dimensions(x), raster = get_raster(dimensions = rep(NA_character_,2))) d[[1]] = create_dimension(values = at) d[[2]] = NULL names(d)[1] = sf_column st = setNames(st_as_stars(m, dimensions = d), names(x)) if (!is.null(min_dist)) st$min_dist = min_dist st } } else { df = setNames(as.data.frame(lapply(m, function(i) structure(i, dim = NULL))), names(x)) if (inherits(at, "matrix")) df else { # return sf: df[[sf_column]] = st_geometry(at) if (!is.null(time_column)) { # add time columns of both cube and at: if (inherits(tm_cube, "intervals")) tm_cube = as.list(tm_cube) df[[tm]] = tm_cube[tm_ix] df[[time_column]] = tm_pts } sf = st_as_sf(df) if (!is.null(min_dist)) sf$min_dist = min_dist sf } } } # match the times in a to those of b, or interpolate: # if interpolate = FALSE, returns an integer in 1...length(b) or NA if outside # if interpolate = TRUE, returns a continuous index in 1...length(b) or NA if outside match_time = function(a, b, intervals = FALSE, interpolate = FALSE) { if (inherits(a, "POSIXct") && inherits(b, "Date")) a = as.Date(a) if (inherits(b, "POSIXct") && inherits(a, "Date")) b = as.Date(b) m = if (inherits(b, "intervals")) find_interval(a, b) else if (isTRUE(intervals) || interpolate) { m = findInterval(a, b, rightmost.closed = TRUE) m[ m == 0 | m == length(b) ] = NA m } else match(a, b) if (interpolate && !isTRUE(intervals) && !inherits(b, "intervals")) { b = as.numeric(b) a = as.numeric(a) b = c(b, tail(b, 1)) m + (a - b[m])/(diff(b)[m]) } else m } stars/R/OpenStreetMap.R0000644000176200001440000000227114342440632014464 0ustar liggesusers#' @name st_as_stars #' @param as_col logical; return rgb numbers (FALSE) or (character) color values (TRUE)? #' @export st_as_stars.OpenStreetMap = function(.x, ..., as_col = FALSE) { ncols = .x$tiles[[1]]$yres # not sure why OpenStreetMap has swapped y and x... nrows = .x$tiles[[1]]$xres a = if (as_col) array(.x$tiles[[1]]$colorData, dim = c(x = ncols, y = nrows)) else { rgb_values = grDevices::col2rgb(.x$tiles[[1]]$colorData) array(t(rgb_values), dim = c(x = ncols, y = nrows, band = 3)) } bbx <- unname(unlist(.x$bbox))[c(1,3,4,2)] names(bbx) <- c("xmin", "xmax", "ymin", "ymax") crs = st_crs(.x$tiles[[1]]$projection) dimensions = list( x = create_dimension(from = 1, to = ncols, offset = unname(bbx["xmin"]), delta = unname((bbx["xmax"] - bbx["xmin"]) / ncols), refsys = crs), y = create_dimension(from = 1, to = nrows, offset = unname(bbx["ymax"]), delta = unname((bbx["ymin"] - bbx["ymax"]) / nrows), refsys = crs), band = create_dimension(values = c("red", "green", "blue"))) if (as_col) st_as_stars(a, dimensions = create_dimensions(dimensions[1:2], get_raster())) else st_as_stars(a, dimensions = create_dimensions(dimensions, get_raster())) } stars/R/read.R0000644000176200001440000004115514607453662012670 0ustar liggesusersmaybe_normalizePath = function(.x, np = FALSE) { prefixes = c("NETCDF:", "HDF5:", "HDF4:", "HDF4_EOS:", "SENTINEL2_L1", "SENTINEL2_L2", "GPKG:", "/vsi", "http://", "https://") has_prefix = function(pf, x) substr(x, 1, nchar(pf)) == pf if (is.function(.x) || !np || any(sapply(prefixes, has_prefix, x = .x))) .x else setNames(normalizePath(.x, mustWork = FALSE), names(.x)) } enc2utf8char = function(x) { if (is.character(x)) enc2utf8(x) else x } get_names = function(x) { if (is.function(x)) x() else x } is_functions = function(x) { is.function(x) || all(sapply(x, is.function)) } is_big = function(x, ..., sub = sub, n_proxy) { prod(dim(read_stars(x, ..., sub = sub, proxy = TRUE, quiet = TRUE))) > n_proxy } # strip common start & end parts of x, if remainder != "" unique_part = function(x, prefix) { stopifnot(is.character(x), length(x) > 1) original = x while (nchar(x[1]) && length(unique(substr(x, 1, 1))) == 1) x = sapply(x, substring, 2) while ((n <- nchar(x[1])) && length(unique(substr(x, n, n))) == 1) x = sapply(x, substring, 1, n - 1) if (any(x == "")) original else if (is.character(prefix)) paste0(prefix, x) else x } geoloc_is_2D = function(geolocation, driver) { # the thing has 2-D x and y arrays: # read coordinate array dimensions only: gxy = c(geolocation$X_DATASET, geolocation$Y_DATASET) lon = adrop(read_stars(gxy[1], driver = driver, quiet = TRUE, proxy = TRUE, curvilinear = character(0))) lat = adrop(read_stars(gxy[2], driver = driver, quiet = TRUE, proxy = TRUE, curvilinear = character(0))) dim(lon)[2] > 1 || dim(lat)[2] > 1 } #' read raster/array dataset from file or connection #' #' read raster/array dataset from file or connection #' @param .x character vector with name(s) of file(s) or data source(s) to be read, or a function that returns such a vector #' @param options character; opening options #' @param driver character; driver to use for opening file. To override fixing for subdatasets and autodetect them as well, use \code{NULL}. #' @param sub character, integer or logical; name, index or indicator of sub-dataset(s) to be read #' @param quiet logical; print progress output? #' @param NA_value numeric value to be used for conversion into NA values; by default this is read from the input file #' @param along length-one character or integer, or list; determines how several arrays are combined, see Details. #' @param RasterIO list with named parameters for GDAL's RasterIO, to further control the extent, resolution and bands to be read from the data source; see details. #' @param proxy logical; if \code{TRUE}, an object of class \code{stars_proxy} is read which contains array #' metadata only; if \code{FALSE} the full array data is read in memory. Always \code{FALSE} for curvilinear girds. #' If set to a number, defaults to \code{TRUE} when the number of cells to be read is larger than that number. #' @param curvilinear length two character vector with names of subdatasets holding longitude and latitude values for all raster cells, or named length 2 list holding longitude and latitude matrices; the names of this list should correspond to raster dimensions referred to #' @param normalize_path logical; if \code{FALSE}, suppress a call to \link{normalizePath} on \code{.x} #' @param RAT character; raster attribute table column name to use as factor levels #' @param tolerance numeric; passed on to \link{all.equal} for comparing dimension parameters. #' @param ... passed on to \link{st_as_stars} if \code{curvilinear} was set #' @param exclude character; vector with category value(s) to exclude #' @param shorten logical or character; if \code{TRUE} and \code{length(.x) > 1}, remove common start and end parts of array names; if character a new prefix #' @return object of class \code{stars} #' @details In case \code{.x} contains multiple files, they will all be read and combined with \link{c.stars}. Along which dimension, or how should objects be merged? If \code{along} is set to \code{NA} it will merge arrays as new attributes if all objects have identical dimensions, or else try to merge along time if a dimension called \code{time} indicates different time stamps. A single name (or positive value) for \code{along} will merge along that dimension, or create a new one if it does not already exist. If the arrays should be arranged along one of more dimensions with values (e.g. time stamps), a named list can passed to \code{along} to specify them; see example. #' #' \code{RasterIO} is a list with zero or more of the following named arguments: #' \code{nXOff}, \code{nYOff} (both 1-based: the first row/col has offset value 1), #' \code{nXSize}, \code{nYSize}, \code{nBufXSize}, \code{nBufYSize}, \code{bands}, \code{resample}. #' See \url{https://gdal.org/doxygen/classGDALDataset.html} for their meaning; #' \code{bands} is an integer vector containing the band numbers to be read (1-based: first band is 1). #' Note that if \code{nBufXSize} or \code{nBufYSize} are specified for downsampling an image, #' resulting in an adjusted geotransform. \code{resample} reflects the resampling method and #' has to be one of: "nearest_neighbour" (the default), #' "bilinear", "cubic", "cubic_spline", "lanczos", "average", "mode", or "Gauss". #' #' Data that are read into memory (\code{proxy=FALSE}) are read into a numeric (double) array, except for categorical variables which are read into an numeric (integer) array of class \code{factor}. #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' (x1 = read_stars(tif)) #' (x2 = read_stars(c(tif, tif))) #' (x3 = read_stars(c(tif, tif), along = "band")) #' (x4 = read_stars(c(tif, tif), along = "new_dimensions")) # create 4-dimensional array #' x1o = read_stars(tif, options = "OVERVIEW_LEVEL=1") #' t1 = as.Date("2018-07-31") #' # along is a named list indicating two dimensions: #' read_stars(c(tif, tif, tif, tif), along = list(foo = c("bar1", "bar2"), time = c(t1, t1+2))) #' #' m = matrix(1:120, nrow = 12, ncol = 10) #' dim(m) = c(x = 10, y = 12) # named dim #' st = st_as_stars(m) #' attr(st, "dimensions")$y$delta = -1 #' attr(st, "dimensions")$y$offset = 12 #' st #' tmp = tempfile(fileext = ".tif") #' write_stars(st, tmp) #' (red <- read_stars(tmp)) #' read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, #' nBufXSize = 2, nBufYSize = 2))[[1]] #' (red <- read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, #' nBufXSize = 2, nBufYSize = 2))) #' red[[1]] # cell values of subsample grid: #' \dontrun{ #' plot(st, reset = FALSE, axes = TRUE, ylim = c(-.1,12.1), xlim = c(-.1,10.1), #' main = "nBufXSize & nBufYSize demo", text_values = TRUE) #' plot(st_as_sfc(red, as_points = TRUE), add = TRUE, col = 'red', pch = 16) #' plot(st_as_sfc(st_as_stars(st), as_points = FALSE), add = TRUE, border = 'grey') #' plot(st_as_sfc(red, as_points = FALSE), add = TRUE, border = 'green', lwd = 2) #' } #' file.remove(tmp) read_stars = function(.x, sub = TRUE, ..., options = character(0), driver = character(0), quiet = FALSE, NA_value = NA_real_, along = NA_integer_, RasterIO = list(), proxy = getOption("stars.n_proxy") %||% 1.e8, curvilinear = character(0), normalize_path = TRUE, RAT = character(0), tolerance = 1e-10, exclude = "", shorten = TRUE) { is_false = function(x) { length(x) == 1 && is.logical(x) && !x } if (!is.list(.x) && length(.x) > 1 && is.null(names(.x)) && !is_false(shorten) && any((short_names <- unique_part(.x, shorten)) != .x)) names(.x) = short_names if (is.numeric(proxy)) { if (is_functions(.x)) proxy = TRUE else if (length(curvilinear)) proxy = FALSE } x = if (is.list(.x)) { f = function(y, np) enc2utf8char(maybe_normalizePath(y, np)) rapply(.x, f, classes = c("character", "function"), how = "replace", np = normalize_path) } else enc2utf8char(maybe_normalizePath(.x, np = normalize_path)) if (missing(curvilinear)) { # see if we can get it from metadata item "GEOLOCATION": geolocation <- try(gdal_metadata(.x, "GEOLOCATION"), silent = TRUE) if (!inherits(geolocation, "try-error") && geoloc_is_2D(geolocation, driver)) { # the thing has 2-D x and y arrays: # read coordinate arrays: gxy = c(geolocation$X_DATASET, geolocation$Y_DATASET) lon = adrop(read_stars(gxy[1], driver = driver, quiet = quiet, NA_value = NA_value, RasterIO = RasterIO, proxy = FALSE, curvilinear = character(0), ...)) lat = adrop(read_stars(gxy[2], driver = driver, quiet = quiet, NA_value = NA_value, RasterIO = RasterIO, proxy = FALSE, curvilinear = character(0), ...)) if (all(dim(lon) > 1) && all(dim(lat) > 1)) # both are 2-D matrices: curvilinear = setNames(c(st_set_dimensions(lon, names = c("x", "y")), st_set_dimensions(lat, names = c("x", "y"))), c("x", "y")) else { ulon = unique(diff(as.vector(lon[[1]]))) ulat = unique(diff(as.vector(lat[[1]]))) if (length(ulon) > 1 || length(ulat) > 1) warning("ignoring irregular (rectilinear) x and/or y coordinates!") } } } else if (length(curvilinear) == 2 && is.character(curvilinear)) { # user-set, read them lon = adrop(read_stars(.x, sub = curvilinear[1], driver = driver, quiet = quiet, NA_value = NA_value, RasterIO = RasterIO, proxy = FALSE, ..., sub_required = TRUE)) lat = adrop(read_stars(.x, sub = curvilinear[2], driver = driver, quiet = quiet, NA_value = NA_value, RasterIO = RasterIO, proxy = FALSE, ..., sub_required = TRUE)) curvilinear = setNames(c(st_set_dimensions(lon, names = c("x", "y")), st_set_dimensions(lat, names = c("x", "y"))), c("x", "y")) } if (length(curvilinear) && isTRUE(proxy)) warning("proxy = TRUE may not work for curvilinear rasters") if (length(x) > 1) { # loop over data sources, read, c() all, and RETURN: ret = lapply(x, read_stars, options = options, driver = driver, sub = sub, quiet = quiet, NA_value = NA_value, RasterIO = as.list(RasterIO), proxy = proxy, curvilinear = curvilinear, along = if (length(along) > 1) along[-1] else NA_integer_, normalize_path = normalize_path) return(do.call(c, append(ret, list(along = along, tolerance = tolerance)))) } # else: do it -- data = sf::gdal_read(get_names(x), options = options, driver = driver, read_data = ifelse(is.logical(proxy), !proxy, proxy), NA_value = NA_value, RasterIO_parameters = as.list(RasterIO)) if (!is.null(data$default_geotransform) && data$default_geotransform == 1) { ## we have the 0 1 0 0 0 1 transform indicated ## so stars policy is flip-y and shift to be in 0, ncol, 0, nrow data$geotransform <- c(0, 1, 0, data$rows[2L], 0, -1) } if (length(data$bands) == 0) { # read sub-datasets: different attributes sub_names = split_strings(data$sub) # get named list sub_datasets = sub_names[seq(1, length(sub_names), by = 2)] # sub_datasets = gdal_subdatasets(x, options)[sub] # -> would open x twice # FIXME: only tested for NetCDF: nms = sapply(strsplit(unlist(sub_datasets), ":"), tail, 1) names(sub_datasets) = nms if (any(sapply(sub_datasets[sub], is.null))) sub = sub("^//", "/", sub) # GDAL2->3, HDF5, double to single slash? sub_datasets = sub_datasets[sub] nms = names(sub_datasets) .read_stars = function(x, options, driver, quiet, proxy, curvilinear) { if (! quiet) cat(paste0(tail(strsplit(x, ":")[[1]], 1), ", ")) read_stars(x, options = options, driver = driver, NA_value = NA_value, RasterIO = as.list(RasterIO), proxy = proxy, curvilinear = curvilinear) } driver = if (is.null(driver) || data$driver[1] == "HDF5") # to override auto-detection: character(0) else data$driver[1] ret = lapply(sub_datasets, .read_stars, options = options, driver = driver, quiet = quiet, proxy = proxy, curvilinear = curvilinear) if (! quiet) cat("\n") # return: if (length(ret) == 1) ret[[1]] else { ret = do.call(c, append(ret, list(try_hard = TRUE, nms = nms))) if (length(nms) == length(ret)) # lost my ability to solve this here... setNames(ret, nms) else ret } } else { # we have one single array: read it if (!isTRUE(sub)) { sub_required = if (is.null(list(...)$sub_required)) FALSE else list(...)$sub_required if (sub_required) stop(paste("only one array present in", .x, ": cannot resolve subdataset", sub)) else warning("only one array present: argument 'sub' will be ignored") } meta_data = structure(data, data = NULL) # take meta_data only if (is.numeric(proxy) && !is.null(data$proxy)) proxy = data$proxy data = if (proxy) .x else get_data_units(attr(data, "data")) # extract data array; sets units if present if (meta_data$driver[1] == "netCDF") meta_data = parse_netcdf_meta(meta_data, get_names(x)) # sets all kind of units if (! proxy && !is.null(meta_data$units) && !is.na(meta_data$units) && !inherits(data, "units")) # set units units(data) = try_as_units(meta_data$units) meta_data = parse_gdal_meta(meta_data) newdims = lengths(meta_data$dim_extra) if (length(newdims) && !proxy) dim(data) = c(dim(data)[1:2], newdims) # handle color table and/or attribute table ct = meta_data$color_tables at = meta_data$attribute_tables if (meta_data$driver[1] == "AIG" && identical(names(at[[1]]), c("VALUE", "COUNT"))) at = list() # skip it: https://github.com/r-spatial/stars/issues/435 # FIXME: how to handle multiple color, category or attribute tables? if (!proxy && (any(lengths(ct) > 0) || any(lengths(at) > 0))) { if (any(meta_data$ranges[1, c(2,4)] == 1)) { # adjust data to min/max values from image metadata r = range(data, na.rm = TRUE) min_value = if (meta_data$ranges[1,2] == 1) meta_data$ranges[1,1] else r[1] max_value = if (meta_data$ranges[1,4] == 1) meta_data$ranges[1,3] else r[2] data[data < min_value | data > max_value] = NA } # convert color table ct to a vector of R colors: co = if (any(lengths(ct) > 0)) { ct = ct[[ which(length(ct) > 0)[1] ]] apply(ct, 1, function(x) rgb(x[1], x[2], x[3], x[4], maxColorValue = 255)) } else NULL if (any(lengths(at) > 0)) { # select attribute table: which.at = which(lengths(at) > 0)[1] which.column = if (length(RAT)) RAT[1] else which(sapply(at[[which.at]], class) == "character")[1] if (length(which.column) == 0) which.column = 1 } else which.column = NA if (!(all(is.na(which.column)))) { labels = at = at[[ which.at ]][[ which.column ]] levels = 0:(length(at) - 1) if (length(exclude)) { ex = at %in% exclude labels = labels[!ex] levels = levels[!ex] if (!is.null(co)) co = co[!ex] } else ex = rep(FALSE, length(levels)) } else { levels = sort(unique(as.vector(data))) labels = as.character(levels) if (!is.null(co)) co = co[levels + 1] ex = rep(FALSE, length(levels)) } # f = factor(as.vector(data), levels = levels, labels = labels) # is too costly; # see https://github.com/r-spatial/stars/issues/565: # construct factor array manually: data = structure(match(as.integer(as.vector(data)), levels), levels = labels, dim = dim(data), colors = co, exclude = ex, class = "factor") } dims = if (proxy) { if (length(meta_data$bands) > 1) c(x = meta_data$cols[2], y = meta_data$rows[2], band = length(meta_data$bands), lengths(meta_data$dim_extra)) else c(x = meta_data$cols[2], y = meta_data$rows[2], lengths(meta_data$dim_extra)) } else NULL # return: name_x = if (!is.null(meta_data$long_name) && !is.na(meta_data$long_name)) meta_data$long_name else if (is.function(.x)) names(.x()) %||% .x() else x name_x = tail(strsplit(name_x, '[\\\\/:]+')[[1]], 1) ret = if (proxy) { # no data present, subclass of "stars": dims = create_dimensions_from_gdal_meta(dims, meta_data) st_stars_proxy(setNames(list(x), names(.x) %||% name_x), dims, NA_value = NA_value, resolutions = NULL, RasterIO = RasterIO, file_dim = matrix(dim(dims), 1, dimnames = list(NULL, names(dims)))) } else st_stars(setNames(list(data), names(.x) %||% name_x), create_dimensions_from_gdal_meta(dim(data), meta_data)) if (is.list(curvilinear)) st_as_stars(ret, curvilinear = curvilinear, ...) else ret } } get_data_units = function(data) { units = unique(attr(data, "units")) # will fail parsing in as_units() when more than one if (length(units) > 1) { warning(paste("more than one unit available for array: ignoring all")) # nocov structure(data, units = NULL) } else { if (!is.null(units) && nzchar(units)) { if (units == "arc-second") # datum grids may have this units = "arcsecond" units = try_as_units(units) } if (inherits(units, "units")) units::set_units(structure(data, units = NULL), units, mode = "standard") else structure(data, units = NULL) } } stars/R/rotate.R0000644000176200001440000000653214576033423013245 0ustar liggesuserstoRad = function(x) x * pi / 180 toDeg = function(x) x * 180 / pi rotate = function(lonlat, lon0, lat0, north = TRUE) { # https://gis.stackexchange.com/questions/10808/manually-transforming-rotated-lat-lon-to-regular-lat-lon/14445 , by Miha! lon0 = toRad(lon0) lat0 = toRad(lat0) if (north) { lat0 = -lat0 lon0 = pi + lon0 } lonlat = toRad(lonlat) lon = lonlat[,1] lat = lonlat[,2] vartheta = -(pi/2 + lat0) varphi = -lon0 toDeg(cbind( atan2(sin(lon), tan(lat) * sin(vartheta) + cos(lon) * cos(vartheta)) - varphi, asin(cos(vartheta) * sin(lat) - cos(lon) * sin(vartheta) * cos(lat)) )) } #' @export st_rotate = function(.x, lon0, lat0, north, ...) UseMethod("st_rotate") #' Transform rotated pole long/lat regular grid to unrotated curvilinear grid #' #' Transform rotated long/lat regular grid to unrotated curvilinear grid #' @param .x object of class \code{stars} #' @param lon0 longitude of the rotated pole in degrees #' @param lat0 latitude of the rotated pole in degrees #' @param north logical; if \code{TRUE} the pole refers to the North pole, otherwise the South pole #' @param ... ignored #' @returns curvilinear stars object with coordinates in regular long/lat (North pole at lat=90) #' @export #' @name st_rotate #' @examples #' if (require("starsdata") && require("maps")) { #' # data downloaded from https://esgf-data.dkrz.de/search/cosmo-rea/ #' nc = "netcdf/ts_EUR-6km_ECMWF-ERAINT_REA6_r1i1p1f1_COSMO_v1_mon_201801-201812.nc" #' f = system.file(nc, package = "starsdata") #' m = read_mdim(f, "ts") #' print(m) #' # NOTE this function is obsolete when reading m as #' # m = read_mdim(f, "ts", curvilinear = c("longitude", "latitude")) #' if (require(RNetCDF)) { #' x = open.nc(f) #' lon = att.get.nc(x, "rotated_latitude_longitude", "grid_north_pole_longitude") #' lat = att.get.nc(x, "rotated_latitude_longitude", "grid_north_pole_latitude") #' close.nc(x) #' print(c(lon = lon, lat = lat)) #' } else { #' lon = -162 #' lat = 39.25 #' } #' m1 = st_rotate(m, lon, lat) #' print(m1) #' h = function() maps::map(add = TRUE) #' plot(m1, downsample = c(10, 10, 5), axes = TRUE, hook = h, mfrow = c(1, 2)) #' # curvilinear grid: downsample for plotting speed #' m2 = st_warp(m1, crs = st_crs("OGC:CRS84"), threshold = .1) #' plot(m2, hook = h, mfrow = c(3, 4)) # regular grid: plots fast #' } st_rotate.stars = function(.x, lon0, lat0, north = TRUE, ...) { stopifnot(is.na(st_crs(.x)) || st_is_longlat(.x), !is_curvilinear(.x), is.logical(north), !is.na(north), lat0 <= 90, lat0 >= -90, length(list(...)) == 0) if (has_sfc(.x)) st_set_dimensions(.x, which_sfc(.x), values = rotate(st_geometry(.x), lon0, lat0, north)) else { .x = st_upfront(.x) d = dim(.x) ccr = rotate(st_coordinates(st_dimensions(.x)[1:2]), lon0, lat0, north) st_as_stars(.x, curvilinear = setNames(list(matrix(ccr[,1], d[1], d[2]), matrix(ccr[,2], d[1], d[2])), names(d)[1:2])) } } #' @name st_rotate #' @export st_rotate.sfc = function(.x, lon0, lat0, north = TRUE, ...) { r = rapply(.x, rotate, how = "replace", lon0 = lon0, lat0 = lat0, north = north) st_set_crs(st_sfc(r, recompute_bbox = TRUE), NA_crs_) } #' @name st_rotate #' @export st_rotate.sf = function(.x, lon0, lat0, north = TRUE, ...) { st_set_geometry(.x, st_rotate(st_geometry(.x), lon0, lat0, north)) } stars/R/cubble.R0000644000176200001440000000310214451263410013162 0ustar liggesusers#' @name st_as_stars #' @export #' @param check_times logical; should we check that the time stamps of all time series are identical? st_as_stars.cubble_df = function(.x, ..., check_times = FALSE) { if (!requireNamespace("tsibble", quietly = TRUE)) stop("package cubble required, please install it first") #nocov if (!requireNamespace("cubble", quietly = TRUE)) stop("package cubble required, please install it first") #nocov if (!requireNamespace("dplyr", quietly = TRUE)) stop("package dplyr required, please install it first") #nocov # time_column = cubble::index(.x) nr = sapply(.x$ts, nrow) stopifnot(length(unique(nr)) == 1) ts1 = .x$ts[[1]] dt = which(sapply(ts1, inherits, c("Date", "POSIXct", "units"))) if (length(dt) > 1) { message("using only first time column for time index") dt = dt[1] } if (length(dt) == 0) stop("no time column found") times = ts1[[dt]] if (check_times) stopifnot(all(sapply(.x$ts, function(ts) identical(ts[[dt]], times)))) else message("assuming times are identical for all elements in in the ts list column") m = do.call(rbind, lapply(.x$ts, function(df) df[-dt][[1]])) if (inherits(.x, "sf")) { # vector data cube sfc = st_geometry(.x) d = create_dimensions(list( geometry = create_dimension(values = sfc), time = create_dimension(values = times)) ) st_stars(list(values = m), d) } else { # raster: kv = tsibble::key_vars(.x) .x = dplyr::as_tibble(.x) for (k in kv) .x[[k]] = NULL .x$ts = NULL # remove time series payload .x = cbind(.x, m) merge(st_as_stars(.x)) } } stars/R/xts.R0000644000176200001440000000336714576033423012570 0ustar liggesusersas.xts.stars <- function(x,...) { if (!requireNamespace("xts", quietly = TRUE)) stop("xts required: install that first") # nocov if (length(x) > 1) message("only the first attribute will used; maybe use merge() first?") ed = expand_dimensions.stars(x) time = which(sapply(ed, inherits, c("Date", "POSIXt"))) if (length(time) < 1) stop("no time dimension present in object") if (length(time) > 1) { message("more than one time dimension present in object; taking the first") time = time[1] } x = adrop(st_upfront(x[1], time), drop_xy = TRUE) if (length(dim(x)) > 2) { dims = setNames(c(dim(x)[1], prod(dim(x)[-1])), c(names(ed)[time], "other")) x = st_redimension(x, dims) } else { # set colnames d = st_dimensions(x) if (length(dim(x)) == 2 && length(d[[2]]$values) == dim(x)[2] && is.character(d[[2]]$values)) colnames(x[[1]]) = d[[2]]$values } xts::xts(x[[1]], ed[[time]]) } #' @name st_as_stars #' @param name character; attribute name for array from an \code{xts} object #' @details for the \code{xts} methods, if \code{dimensions} are provided, time has to be the first dimension. #' @export st_as_stars.xts = function(.x, ..., dimensions, name = "attr") { if (!requireNamespace("xts", quietly = TRUE)) stop("xts required: install that first") # nocov if (!requireNamespace("zoo", quietly = TRUE)) stop("zoo required: install that first") # nocov time = zoo::index(.x) cn = colnames(.x) if (!missing(dimensions)) { .x = as.matrix(.x) dim(.x) = dim(dimensions) st_stars(setNames(list(.x), name), dimensions) } else { .x = st_as_stars(setNames(list(as.matrix(.x)), name)) .x = st_set_dimensions(.x, 1, time) if (!is.null(cn)) .x = st_set_dimensions(.x, 2, cn) st_set_dimensions(.x, names = c("time", "others")) } } stars/R/sf.R0000644000176200001440000002424114576033423012354 0ustar liggesusers# sf conversion things #' @export #' @name st_as_sf st_as_sfc.stars = function(x, ..., as_points, which = seq_len(prod(dim(x)[1:2]))) { r = attr(st_dimensions(x), "raster") gt = st_geotransform(x) d = st_dimensions(x)[r$dimensions] if (xor(is.null(d[[1]]$values), is.null(d[[2]]$values))) { # mixed regular/rectilinear dimensions: make rectilinear; https://github.com/r-spatial/stars/issues/458 e = expand_dimensions(d) if (is.null(d[[1]]$values)) { d[[1]]$from = d[[1]]$to = NA d[[1]]$values = e[[1]] } if (is.null(d[[2]]$values)) { d[[2]]$from = d[[2]]$to = NA d[[2]]$values = e[[2]] } } sfc = st_as_sfc(d, ..., as_points = as_points, which = which, geotransform = gt) # swap axes? if (st_axis_order() && isTRUE(st_crs(x, parameters = TRUE)$yx)) st_transform(sfc, pipeline = "+proj=pipeline +step +proj=axisswap +order=2,1") else sfc } #' replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) #' @param x object of class \code{stars} #' @param as_points logical; if \code{TRUE}, generate points at cell centers, else generate polygons #' @param ... arguments passed on to \code{st_as_sfc} #' @param na.rm logical; omit (remove) cells which are entirely missing valued (across other dimensions)? #' @return object of class \code{stars} with x and y raster dimensions replaced by a single sfc geometry list column containing either points, or polygons. Adjacent cells with identical values are not merged; see \code{st_rasterize} for this. #' @export st_xy2sfc = function(x, as_points, ..., na.rm = TRUE) { if (inherits(x, "stars_proxy")) x = st_as_stars(x) d = st_dimensions(x) olddim = dim(x) if (! has_raster(x)) stop("x and/or y not among dimensions") x = st_upfront(x) dxy = attr(d, "raster")$dimensions xy_pos = match(dxy, names(d)) stopifnot(all(xy_pos == 1:2)) if (missing(as_points) && isTRUE(d[[dxy[1]]]$point) && isTRUE(d[[dxy[2]]]$point)) as_points = TRUE # find which records are NA for all attributes: a = abind(x, along = length(dim(x)) + 1) keep = if (na.rm) as.vector(apply(a, c(1,2), function(x) !all(is.na(x)))) else rep(TRUE, prod(dim(x)[1:2])) # flatten two dims x,y to one dim sfc (replacing "x") sfc = st_as_sfc(x, as_points = as_points, ..., which = which(keep)) # overwrite raster-x with sfc: d[[ dxy[1] ]] = create_dimension(from = 1, to = length(sfc), values = sfc) # rename raster-x to sfc: names(d)[names(d) == dxy[1] ] = "geometry" # remove y: d[[ dxy[2] ]] = NULL attr(d, "raster") = get_raster(dimensions = rep(NA_character_, 2)) # flatten arrays: x = unclass(x) # to omit using [[<-.stars method: for (i in seq_along(x)) dim(x[[i]]) = c(geometry = length(keep), olddim[-xy_pos]) # reduce arrays to non-NA cells: if (na.rm) { args = rep(list(rlang::missing_arg()), length(dim(x[[1]]))) args[[1]] = which(keep) args[["drop"]] = FALSE for (i in seq_along(x)) x[[i]] = structure(eval(rlang::expr(x[[i]][ !!!args ])), levels = attr(x[[i]], "levels")) } st_stars(x, dimensions = d) } #' @export st_as_sf.dimensions = function(x, ...) { ix = which_sfc(x)[1] st_sf(setNames(list(x[[ ix ]]$values), names(x)[ix]), crs = st_crs(x), ...) } #' Convert stars object into an sf object #' #' Convert stars object into an sf object #' @name st_as_sf #' @param x object of class \code{stars} #' @param as_points logical; should cells be converted to points or to polygons? See details. #' @param which linear index of cells to keep (this argument is not recommended to be used) #' @param na.rm logical; should missing valued cells be removed, or also be converted to features? #' @param merge logical; if \code{TRUE}, cells with identical values are merged (using \code{GDAL_Polygonize} or \code{GDAL_FPolygonize}); if \code{FALSE}, a polygon for each raster cell is returned; see details #' @param use_integer (relevant only if \code{merge} is \code{TRUE}): if \code{TRUE}, before polygonizing values are rounded to 32-bits signed integer values (GDALPolygonize), otherwise they are converted to 32-bit floating point values (GDALFPolygonize). #' @param long logical; if \code{TRUE}, return a long table form \code{sf}, with geometries and other dimensions recycled #' @param connect8 logical; if \code{TRUE}, use 8 connectedness. Otherwise the 4 connectedness algorithm will be applied. #' @param ... ignored #' @details If \code{merge} is \code{TRUE}, only the first attribute is converted into an \code{sf} object. If \code{na.rm} is \code{FALSE}, areas with \code{NA} values are also written out as polygons. Note that the resulting polygons are typically invalid, and use \link[sf:valid]{st_make_valid} to create valid polygons out of them. #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' x = x[,1:100,1:100,6] # subset of a band with lower values in it #' x[[1]][x[[1]] < 30] = NA # set lower values to NA #' x[[1]] = x[[1]] < 100 # make the rest binary #' x #' (p = st_as_sf(x)) # removes NA areas #' (p = st_as_sf(x[,,,1], merge = TRUE)) # glues polygons together #' all(st_is_valid(p)) # not all valid, see details #' plot(p, axes = TRUE) #' (p = st_as_sf(x, na.rm = FALSE, merge = TRUE)) # includes polygons with NA values #' plot(p, axes = TRUE) st_as_sf.stars = function(x, ..., as_points = FALSE, merge = FALSE, na.rm = TRUE, use_integer = is.logical(x[[1]]) || is.integer(x[[1]]), long = FALSE, connect8 = FALSE) { if (length(x) == 0) return(st_as_sf.dimensions(st_dimensions(st_xy2sfc(x, as_points = as_points, na.rm = FALSE)))) crs = st_crs(x) d = st_dimensions(x) if (merge && !as_points && has_raster(x) && !any(is.na(st_geotransform(x)))) { # uses GDAL polygonize path: x = st_normalize(x) mask = if (na.rm) { mask = x[1] mask[[1]] = !is.na(mask[[1]]) mask } else NULL ret = gdal_polygonize(x, mask, use_integer = use_integer, geotransform = st_geotransform(x), use_contours = FALSE, connect8 = connect8, ...) # factor levels? if (!is.null(lev <- attr(x[[1]], "levels"))) { ex = attr(x[[1]], "exclude") if(any(ex)){ id = (seq_along(ex) - 1)[!ex] # index-values matching to levels ret[[1]] = structure(match(ret[[1]], id), class = "factor", levels = lev) # ordered? } else { ret[[1]] = structure(ret[[1]], class = "factor", levels = lev) # ordered? } } st_set_crs(ret, crs) } else { if (merge) stop("merge=TRUE and as_points=TRUE unsupported; consider using st_contour for generating contour lines") if (has_raster(x)) x = st_xy2sfc(st_upfront(x), as_points = as_points, ..., na.rm = na.rm) if (! has_sfc(x)) stop("no feature geometry column found") if (long) { st_as_sf(as.data.frame(x), crs = crs) } else { ix = which_sfc(x) if (length(ix) > 1) warning("working on the first sfc dimension only") # FIXME: this probably only works for 2D arrays, now other_dim = setdiff(seq_along(dim(x)), ix[1]) sfc = st_dimensions(x)[[ ix[1] ]]$values # other_values = st_dimensions(x)[[ other_dim[1] ]]$values other_values = lapply(st_dimensions(x)[other_dim], function(x) x$values) varnames = apply(do.call(expand.grid, other_values), 1, paste, collapse = ".") un_dim = function(x) { # remove a dim attribute from data.frame columns for (i in seq_along(x)) x[[i]] = structure(x[[i]], dim = NULL) x } dfs = lapply(x, function(y) un_dim(as.data.frame(y))) nc = sapply(dfs, ncol) df = do.call(cbind, dfs) if (length(dim(x)) == 1) # one-dimensional cube... names(df) = names(x) else if (length(varnames) == ncol(df)) names(df) = varnames else if (length(unique(names(df))) < ncol(df) && length(names(dfs)) == ncol(df)) # I hate this names(df) = names(dfs) else { # another exception... time as second dimension e = expand_dimensions(x) if (length(e[-ix]) == 1 && inherits(e[-ix][[1]], c("Date", "POSIXt", "PCICt"))) names(df) = as.character(e[-ix][[1]]) } df[[ names(st_dimensions(x))[ ix[1] ] ]] = sfc # keep dimension name st_sf(df, crs = crs) } } } #' @export #' @name st_as_sf #' @param downsample see \link{st_as_stars} st_as_sf.stars_proxy = function(x, ..., downsample = 0) { st_as_sf(st_as_stars(x, downsample = downsample), ...) } #' Compute or plot contour lines or sets #' #' Compute contour lines or sets #' @param x object of class \code{stars} #' @param na.rm logical; should missing valued cells be removed, or also be converted to features? #' @param contour_lines logical; if \code{FALSE}, polygons are returned (contour sets), otherwise contour lines #' @param breaks numerical; values at which to "draw" contour levels #' @details this function requires GDAL >= 2.4.0 #' @seealso for polygonizing rasters following grid boundaries, see \link{st_as_sf} with arguments \code{as_points=FALSE} and \code{merge=TRUE}; \link{contour} plots contour lines using R's native algorithm (which also plots contour levels) #' @export st_contour = function(x, na.rm = TRUE, contour_lines = FALSE, breaks = classInt::classIntervals(na.omit(as.vector(x[[1]])))$brks) { #nocov start mask = if (na.rm) { mask = x[1] mask[[1]] = !is.na(mask[[1]]) mask } else NULL ret = gdal_polygonize(x, mask, use_integer = FALSE, geotransform = st_geotransform(x), use_contours = TRUE, contour_lines = contour_lines, breaks = breaks) # factor levels? if (!is.null(lev <- attr(x[[1]], "levels"))) ret[[1]] = structure(ret[[1]], class = "factor", levels = lev) st_set_crs(ret, st_crs(x)) #nocov end } #' @export st_as_stars.sfc = function(.x, ..., FUN = length, as_points = TRUE) { st = st_as_stars(st_bbox(.x), ...) sfc = st_as_sfc(st, as_points = as_points) i = st_intersects(sfc, .x) vals = sapply(i, FUN) st[[1]] = array(vals, dim(st[[1]])) st } #' @name st_as_stars #' @details The \code{st_as_stars} method for \code{sf} objects without any additional #' arguments returns a one-dimensional data cube with a dimension for the simple features #' geometries, and all remaining attributes as data cube attributes. When used with #' further arguments, the method for \code{data.frame}s is called. #' @examples #' nc = st_read(system.file("gpkg/nc.gpkg", package="sf")) #' st_as_stars(nc) #' @export st_as_stars.sf = function(.x, ..., dims = attr(.x, "sf_column")) { .x = as.data.frame(.x) NextMethod(dims = dims, ...) } stars/R/ncdf.R0000644000176200001440000010260214611433374012653 0ustar liggesusers #' Read NetCDF into stars object #' #' Read data from a file (or source) using the NetCDF library directly. #' #' The following logic is applied to coordinates. If any coordinate axes have #' regularly spaced coordinate variables they are reduced to the #' offset/delta form with 'affine = c(0, 0)', otherwise the values of the coordinates #' are stored and used to define a rectilinear grid. #' #' If the data has two or more dimensions and the first two are regular #' they are nominated as the 'raster' for plotting. #' #' If the \code{curvilinear} argument is used it specifies the 2D arrays #' containing coordinate values for the first two dimensions of the data read. It is currently #' assumed that the coordinates are 2D and that they relate to the first two dimensions in #' that order. #' @examples #' f <- system.file("nc/reduced.nc", package = "stars") #' if (require(ncmeta, quietly = TRUE)) { #' read_ncdf(f) #' read_ncdf(f, var = c("anom")) #' read_ncdf(f, ncsub = cbind(start = c(1, 1, 1, 1), count = c(10, 12, 1, 1))) #' } #' #' @param .x NetCDF file or source as a character vector or an nc_proxy object. #' @param ... ignored #' @param var variable name or names (they must be on matching grids) #' @param ncsub matrix of start, count columns (see Details) #' @param curvilinear length two character named vector with names of variables holding #' longitude and latitude values for all raster cells. `stars` attempts to figure out appropriate #' curvilinear coordinates if they are not supplied. #' @param eps numeric; dimension value increases are considered identical when they differ less than \code{eps} #' @param ignore_bounds logical; should bounds values for dimensions, if present, be ignored? #' @param make_time if \code{TRUE} (the default), an attempt is made to provide a date-time class from the "time" variable #' @param make_units if \code{TRUE} (the default), an attempt is made to set the units property of each variable #' @param proxy logical; if \code{TRUE}, an object of class \code{stars_proxy} is read which contains array #' metadata only; if \code{FALSE} the full array data is read in memory. If not set, defaults to \code{TRUE} #' when the number of cells to be read is larger than \code{options(stars.n_proxy)}, or to 1e8 if that option was not set. #' @param downsample integer; number of cells to omit between samples along each dimension. #' e.g. \code{c(1,1,2)} would return every other cell in x and y and every third cell #' in the third dimension (z or t). If 0, no downsampling is applied. Note that this transformation #' is applied AFTER NetCDF data are read using st_downsample. As such, if proxy=TRUE, this #' option is ignored. #' @details #' If \code{var} is not set the first set of variables on a shared grid is used. #' #' \code{start} and \code{count} columns of ncsub must correspond to the variable dimension (nrows) #' and be valid index using \code{\link[RNetCDF]{var.get.nc}} convention (start is 1-based). If the count value #' is \code{NA} then all steps are included. Axis order must match that of the variable/s being read. #' @export #' @examples #' if (require(ncmeta, quietly = TRUE)) { #' #' precipitation data in a curvilinear NetCDF #' prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") #' prec = read_ncdf(prec_file, curvilinear = c("lon", "lat"), ignore_bounds = TRUE) #' } #' #' ##plot(prec) ## gives error about unique breaks #' ## remove NAs, zeros, and give a large number #' ## of breaks (used for validating in detail) #' qu_0_omit = function(x, ..., n = 22) { #' x = units::drop_units(na.omit(x)) #' c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) #' } #' if (require(dplyr, quietly = TRUE)) { #' prec_slice = slice(prec, index = 17, along = "time") #' plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) #' nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") #' plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA) #' } read_ncdf = function(.x, ..., var = NULL, ncsub = NULL, curvilinear = character(0), eps = sqrt(.Machine$double.eps), ignore_bounds = FALSE, make_time = TRUE, make_units = TRUE, proxy = NULL, downsample = 0) { if (!requireNamespace("ncmeta", quietly = TRUE)) stop("package ncmeta required, please install it first") # nocov if (!requireNamespace("RNetCDF", quietly = TRUE)) stop("package RNetCDF required, please install it first") # nocov if(inherits(.x, "nc_proxy")) { # grab the source file and all variables needed. x <- as.character(.x[[1]]) # FIXME: only supports one data source. var <- names(.x) proxy_dimensions <- st_dimensions(.x) nc_prj <- sf::st_crs(.x) if(!is.null(ncsub)) { warning("ncsub ignored when .x is class nc_proxy") ncsub <- NULL } } else { x <- .x proxy_dimensions <- NULL } # Get all the nc metadata meta <- .fix_meta(ncmeta::nc_meta(x)) if(.is_netcdf_cf_dsg(meta)) { if (!requireNamespace("ncdfgeom", quietly = TRUE)) stop("package ncdfgeom required, please install it first") # nocov if(!is.null(proxy) && proxy) warning("proxy behavior not supported for timeseries netcdf") geom <- .get_geom_name(meta) return(st_as_stars(ncdfgeom::read_timeseries_dsg(x), sf_geometry = geom)) } # Get relevant variables var <- .get_vars(var, meta) rep_var <- var[1L] # Get coordinate variable info all_coord_var <- ncmeta::nc_coord_var(x) if(ncol(all_coord_var) == 0) all_coord_var <- data.frame(variable = NA, X = NA, Y = NA, Z = NA, T = NA, bounds = NA) coord_var <- .clean_coord_var(all_coord_var, rep_var, meta, curvilinear) canon_order <- c("X", "Y", "Z", "T")[!is.na(coord_var[c("X", "Y", "Z", "T")])] curvilinear <- if(coord_var$curvilinear) { c(X = coord_var$X, Y = coord_var$Y) } else character(0) # Get dimensions for representative var in correct axis order. dims <- .get_dims(meta, rep_var, coord_var, meta$axis, canon_order) # Validate that ncsub matches dims dims <- .add_ncsub(dims, ncsub) nc <- RNetCDF::open.nc(x) on.exit(RNetCDF::close.nc(nc), add = TRUE) # Get coordinates from netcdf or create them coords <- .get_coords(nc, dims) coords <- .clean_coords(coords, coord_var, meta$attribute, eps) # Figure out if we have a raster or not raster <- .get_nc_raster(coords) # Get matcher for netcdf requests dimid_matcher <- .get_dimid_matcher(nc, coord_var, var) if(!is.null(proxy_dimensions)) { tdim <- if("T" %in% dims$axis) { tmeta <- .get_time_meta(coord_var, rep_var, meta) tvals <- coords[[which(dims$axis == "T")]] tdim <- create_dimension(from = 1, to = length(tvals)) tdim$values <- tvals make_cal_time2(tdim, time_unit = tmeta$tunit, cal = tmeta$calendar) } else NULL dims <- .update_dims(dims, proxy_dimensions, coords, tdim) coords <- .get_coords(nc, dims) coords <- .clean_coords(coords, coord_var, meta$attributes, eps) } pull <- .should_pull(proxy, array_size = prod(dims[, "count", drop = TRUE]), num_vars = length(var)) out_data <- if(pull) { # Get all the data from the nc file .set_nc_units(.get_data(nc, var, dims, dimid_matcher, pull = pull), meta$attribute, make_units) } else { # Just return the source file for each variable. setNames(as.list(rep(x, length(var))), var) } # Create stars dimensions object if(is.null(nc_dim <- dim(out_data[[1]]))) nc_dim <- dims$length dimensions <- create_dimensions(setNames(nc_dim, dims$name), raster) dimensions <- .get_nc_dimensions(dimensions, coord_var = all_coord_var, coords = coords, nc = nc, dims = dims, var_names = meta$variable$name, curvilinear, eps = eps, ignore_bounds = ignore_bounds, atts = meta$attribute) dimensions <- .get_nc_time(dimensions, make_time, coord_var, rep_var, meta) if (is.character(out_data[[1]])) { # this is a proxy out_data <- st_stars_proxy(out_data, dimensions, NA_value = NA_real_, resolutions = NULL) class(out_data) <- c("nc_proxy", "stars_proxy", "stars") } else { # Make initial response data out_data <- st_stars(out_data, dimensions) } if(is.null(proxy_dimensions)) { if(length(curvilinear) == 2) { cv <- curvilinear[1] } else if (length(attr(coords, "cv")) > 0) { cv <- attr(coords, "cv")[1] } else { cv <- all_coord_var[all_coord_var$variable == rep_var, ]$X } nc_prj <- .get_nc_projection(meta$attribute, rep_var, cv) } st_crs(out_data) <- nc_prj # Add curvilinear and return if (length(curvilinear) == 2) { curvi_coords = .get_curvilinear_coords(curvilinear, dimensions, nc, dims) out_data <- add_curvilinear(out_data, curvilinear = curvi_coords, nc_prj) } if(!all(downsample == 0)) { out_data <- st_downsample(out_data, downsample) } out_data } .fix_meta <- function(meta) { nas <- is.na(meta$axis$dimension) if (any(nas)) meta$axis$dimension[nas] <- -1 # nocov if(!is.null(names(meta$attribute))) { names(meta$attribute)[names(meta$attribute) == "attribute"] <- "name" # future proofing. } meta } .is_regular <- function(coords_list, eps) { sapply(coords_list, function(x) regular_intervals(x, epsilon = eps)) } .unique_fuzz <- function(x, eps) { u = unique(x) if (all(diff(sort(u)) < eps)) mean(x) # rather than mean(u) else u } .as_rectilinear = function(d) { ed = expand_dimensions(d, center = FALSE) for (i in attr(d, "raster")$dimensions) { if (!is.na(d[[ i ]]$offset)) { d[[i]]$values = as_intervals(ed[[i]], add_last = TRUE) d[[i]]$offset = d[[i]]$delta = NA } } d } .should_pull <- function(proxy, array_size, num_vars, n_proxy = options("stars.n_proxy")[[1]] %||% 1.e8) { if(is.null(proxy)) { if(array_size > n_proxy) { pull <- FALSE message("Large netcdf source found, returning proxy object.") } else { pull <- TRUE message(paste("Will return stars object with", array_size, "cells.")) } } else { pull <- !proxy } if(pull & array_size > n_proxy) warning("Large netcdf source will be requested. Consider using stars proxy.") pull } .get_vars <- function(var, meta) { if (is.null(var)) { ix <- 1 if (meta$grid$grid[ix] == "S") { ix <- which(!meta$grid$grid == "S")[1L] # nocov if (length(ix) < 1) stop("only scalar variables found, not yet supported") # nocov } grd = meta$grid$grid[which.max(nchar(meta$grid$grid))] var = meta$grid$variables[[match(grd, meta$grid$grid)]]$variable message(sprintf("no 'var' specified, using %s", paste(var, collapse = ", "))) other_vars <- setdiff(meta$variable$name, var) if (length(other_vars) > 0) message(sprintf("other available variables:\n %s", paste(other_vars, collapse = ", "))) } return(var) } .get_grid_mapping <- function(atts, rep_var) { if(!is.null(atts)) { suppressWarnings(ncmeta::nc_grid_mapping_atts(atts, rep_var)) } else { list() } } .get_nc_projection <- function(atts, rep_var, rep_coord_var) { nc_grid_mapping <- .get_grid_mapping(atts, rep_var) if(length(nc_grid_mapping) == 0) { if(.is_degrees(atts, rep_coord_var)) { message(paste("No projection information found in nc file. \n", "Coordinate variable units found to be degrees, \n", "assuming WGS84 Lat/Lon.")) st_crs('OGC:CRS84') } else { warning("No projection information found in nc file.") st_crs(NULL) } } else { tryCatch({ cv_units <- .get_gm_units(atts, rep_coord_var) base_gm <- ncmeta::nc_gm_to_prj(nc_grid_mapping) base_gm <- paste0(gsub("\\+units=m ", "", base_gm), " +units=", cv_units) st_crs(base_gm) }, error = function(e) { warning(paste0("failed to create crs based on grid mapping\n", "and coordinate variable units. Will return NULL crs.\n", "Original error: \n", e)) st_crs(NULL) }) } } .is_degrees <- function(atts, var) { units <- .get_attributes(atts, "units", var)$value[[1]] !is.null(units) && grepl("degrees", units, ignore.case = TRUE) } .get_gm_units <- function(atts, var) { if(.is_degrees(atts, var)) { "degrees" } else { .get_attributes(atts, "units", var)$value[[1]] } } .clean_coord_var <- function(c_v, var, meta, curvilinear) { c_v <- c_v[c_v$variable == var, ] if(nrow(c_v) == 0) c_v[1, ] <- NA check_curvi <- .check_curvilinear(c_v, var, meta$variable, curvilinear) if(length(curvilinear)) { c_v$X <- rep(check_curvi[1], nrow(c_v)) c_v$Y <- rep(check_curvi[2], nrow(c_v)) } not_na <- apply(c_v, 1, function(x) sum(!is.na(x))) c_v <- c_v[which(not_na == max(not_na)), ][1, ] has_prj <- length(.get_grid_mapping(meta$attribute, var)) != 0 if(length(curvilinear) > 0) { if(length(check_curvi) == 0) stop("Curvilinear coordinate variables provided by not found in file.") c_v <- c_v[c_v$variable == var & c_v$X == check_curvi[1], ] c_v$curvilinear <- TRUE } else if(nrow(c_v) > 1 | length(check_curvi) == 2) { # Should use convenience function? sn_atts <- meta$attribute[meta$attribute$name == "standard_name", ] auxiliary_x <- sn_atts[grepl("projection_x_coordinate", sn_atts$value), ]$variable auxiliary_y <- sn_atts[grepl("projection_y_coordinate", sn_atts$value), ]$variable if(length(auxiliary_x) > 0 && length(auxiliary_y) > 0 && auxiliary_x %in% c_v$X && auxiliary_y %in% c_v$Y & has_prj) { c_v <- c_v[c_v$variable == var & c_v$X == auxiliary_x, ] c_v$curvilinear <- FALSE } else if (length(check_curvi) == 2) { c_v <- c_v[c_v$variable == var & c_v$X == check_curvi[1], ] c_v$curvilinear <- TRUE } else{ c_v <- c_v[1, ] warning(paste("Found two coordinate variable pairs. Chosing:", paste(as.character(c_v)[2:5], collapse = " "), "for", as.character(c_v)[1])) #nocov } } else { c_v$curvilinear <- FALSE } return(c_v) } .check_curvilinear <- function(coord_var, var, variables, curvilinear) { if(length(curvilinear) > 0) { if(!all(curvilinear %in% variables$name)) stop("Curvilinear variables not found in file.") if(!length(curvilinear) == 2 | all(!is.character(curvilinear))) stop("Curvilinear input must be a length two character vector.") if(all(variables$ndims[match(curvilinear, variables$name)] == 2)) { xy_coords <- coord_var[c("X", "Y")] if(!curvilinear[1] %in% c(xy_coords$X, xy_coords$Y) | !curvilinear[2] %in% c(xy_coords$X, xy_coords$Y)) { stop("Specified curvilinear coordinate variables not found as X/Y coordinate variables.") } else { if(!curvilinear[1] %in% xy_coords$X) { curvilinear <- curvilinear[2:1] } return(stats::setNames(curvilinear, c("X", "Y"))) } } else { stop("Specified curvilinear coordinates are not 2-dimensional.") } } # If we have X and Y coordvars to look at. if (all(c("X", "Y") %in% names(coord_var))) { # Actually look at this one. XY_curvi = unlist(coord_var[coord_var$variable == var, ][c("X", "Y")]) if (all(!is.na(XY_curvi)) && # If all coordinate variables have 2 dims. all(variables$ndims[match(XY_curvi, variables$name)] == 2)) { return(XY_curvi) } else { return(character(0)) } } else { return(character(0)) } } #' Gets dimension info ensuring they are in an order suited to coordinate #' variables that need to be subset appropriately. #' @noRd .get_dims <- function(meta, var, c_v, axis, canon_order) { # This matches the axes of a given variable to the correct dimension dims <-meta$dimension[match(meta$axis$dimension[meta$axis$variable == var], meta$dimension$id), ] dims$coord_var <- "" dims$axis <- "" rep_var_coordinates <- .get_attributes(meta$attribute, "coordinates", var) if(!is.null(rep_var_coordinates)) { rep_var_coordinates <- strsplit(rep_var_coordinates$value[[1]], " ")[[1]] } x_cv <- axis[axis$variable == c_v$X, ] y_cv <- axis[axis$variable == c_v$Y, ] if(nrow(x_cv) == 1 & nrow(y_cv) == 1) { dims[dims$id == x_cv$dimension, ][c("coord_var", "axis")] <- list(x_cv$variable, "X") dims[dims$id == y_cv$dimension, ][c("coord_var", "axis")] <- list(y_cv$variable, "Y") } dim_matcher <- axis[axis$variable == c_v$X, ]$dimension if(length(dim_matcher) < 2) { dim_matcher <- c(dim_matcher, axis[axis$variable == c_v$Y, ]$dimension) } z_axis <- integer(0) if(!is.na(c_v$Z)) { z_cv <- axis[axis$variable == c_v$Z, ] z_axis <- z_cv$dimension dims[dims$id == z_cv$dimension, ][c("coord_var", "axis")] <- list(z_cv$variable, "Z") dim_matcher <- c(dim_matcher, z_axis) } else if(nrow(dims) == 4 & !c_v$curvilinear) { z_axis <- unique(axis[!axis$variable %in% c(c_v$X, c_v$Y, c_v$T) & !axis$dimension %in% dim_matcher, ]$dimension) } if(!is.na(c_v$T)) { t_cv <- axis[axis$variable == c_v$T, ] t_axis <- t_cv$dimension dims[dims$id == t_cv$dimension, ][c("coord_var", "axis")] <- list(t_cv$variable, "T") if(length(z_axis) > 1) { z_axis <- z_axis[z_axis != t_axis] } dim_matcher <- c(dim_matcher, z_axis, t_axis) } if(all(!is.na(dim_matcher))) { if(length(dim_matcher) != length(dims$id)) { dim_matcher <- c(dim_matcher, dims$id[!dims$id %in% dim_matcher]) dim_matcher <- unique(dim_matcher) } dims <- dims[match(dim_matcher, dims$id, nomatch = 0L), ] } return(dims) } #' Gets a list of dimension id matching indexes for use in #' requesting data from a given NetCDF file. #' @noRd .get_dimid_matcher <- function(nc, coord_var, var) { setNames(lapply(var, FUN = function(.v, c_v, nc) { matcher <- NULL if(all(!is.na(c_v[2:3]))) { coordvar_dimids <- RNetCDF::var.inq.nc(nc, c_v$X)$dimids if(length(coordvar_dimids) == 1) { coordvar_dimids <- c(coordvar_dimids, RNetCDF::var.inq.nc(nc, c_v$Y)$dimids) } if(!is.na(c_v$Z)) { coordvar_dimids <- c(coordvar_dimids, RNetCDF::var.inq.nc(nc, c_v$Z)$dimids) } if(!is.na(c_v$T)) { coordvar_dimids <- c(coordvar_dimids, RNetCDF::var.inq.nc(nc, c_v$T)$dimids) } var_dimids <- RNetCDF::var.inq.nc(nc, .v)$dimids matcher <- match(coordvar_dimids, var_dimids) if(!all(diff(matcher[1:2]) == 1)) { warning("Non-canonical axis order found, attempting to correct.") } } matcher }, c_v = coord_var, nc = nc), var) } .get_nc_var <- function(nc, .v, start, count) { RNetCDF::var.get.nc(nc, variable = .v, start = start, count = count, collapse = FALSE, ## keep 1-dims unpack = TRUE, ## offset and scale applied internally rawchar = TRUE) ## needed for NC_CHAR, as per } .get_data <- function(nc, var, dims, dimid_matcher, pull = pull) { out_data <- lapply(var, pull = pull, FUN = function(.v, pull) { dm <- match(RNetCDF::var.inq.nc(nc, .v)$dimids, dims[, "id", drop = TRUE]) if(is.null(dm)) dm <- c(1:nrow(dims)) request <- list(start = dims[, "start", drop = TRUE][dm], count = dims[, "count", drop = TRUE][dm]) request$size <- prod(request$count) request$dimid_match <- dm request$axis <- dims$axis[dm] if(pull) { ret <- .get_nc_var(nc, .v, request$start, request$count) if(length(dm) > 1 && !all(diff(dm[1:2]) == 1)) { ret <- aperm(ret, dm) } } return(ret) }) ## "../rasterwise/extdata/R13352.nc" ## https://github.com/hypertidy/tidync/issues/75 ## check for NC_CHAR case setNames(lapply(out_data, function(.v) { if (mode(.v) == "raw") { array(unlist(lapply(.v, rawToChar)), dims$length) } else .v }), var) } .get_attributes <- function(attribute, att, var = NULL) { if(!is.null(var)) attribute <- attribute[attribute$variable == var, ] if(att %in% attribute$name) attribute[attribute$name == att, ] else { NULL } } .add_ncsub <- function(dims, ncsub, proxy_dimensions) { if (is.null(ncsub)) { dims$start <- 1 dims$count <- dims$length } else { if (nrow(dims) != nrow(ncsub)) stop("input ncsub doesn't match available dims") ix <- is.na(ncsub[, "count"]) if (any(ix)) ncsub[ix, "count"] <- dims$length[ix] - ncsub[ix, "start"] + 1 if (any(ncsub[, "start"] < 1) || any((ncsub[, "count"] - ncsub[, "start"] + 1) > dims$length)) stop("start or count out of bounds") dims$start <- ncsub[, "start"] dims$count <- ncsub[, "count"] } return(dims) } .set_nc_units <- function(data_list, nc_atts, make_units) { # Get all the units nc_units <- .get_attributes(nc_atts, "units") if (!is.null(nc_units) && nrow(nc_units) > 0 && make_units) { for (i in names(data_list)) { if (i %in% nc_units$variable) { uval <- unlist(nc_units$value[nc_units$variable == i]) if(is.numeric(data_list[[i]])) { units(data_list[[i]]) <- try_as_units(uval[1L]) } else { data_list[[i]]$units <- try_as_units(uval[1L]) } } } } return(data_list) } .get_coords <- function(nc, dims) { ## cannot assume we have COORDS style coordinate varibales ## - so create them as 1:length if needed coords = setNames(vector("list", length(dims$name)), dims$name) attr(coords, "cv") <- c() for (ic in seq_along(coords)) { subidx <- seq(dims$start[ic], length = dims$count[ic]) ## create_dimvar means we can var_get it ## test checks if there's actuall a variable of the dim name if (dims$name[ic] %in% ncmeta::nc_vars(nc)$name) { coords[[ic]] <- RNetCDF::var.get.nc(nc, variable = dims$name[ic])[subidx] attr(coords, "cv") <- c(attr(coords, "cv"), dims$name[ic]) } else { coords[[ic]] <- subidx } } return(coords) } .get_nc_raster <- function(coords) { ## can we create a raster? raster = NULL ## which coords are regular if (length(coords) > 1) { raster = get_raster(affine = c(0, 0), dimensions = names(coords)[1:2], curvilinear = FALSE) } return(raster) } .clean_coords <- function(coords, coord_var, atts, eps) { ## hack longitudes for #277 if (any(lon_coord <- grepl("lon", coord_var$X, ignore.case = TRUE))) { lon_coord <- coord_var$X[lon_coord][1] lons <- coords[[lon_coord]] if (!is.null(lons) && !regular_intervals(lons, epsilon = eps) && .is_degrees(atts, lon_coord) && lons[1L] > 180 && min(lons) > 0) { coords[[lon_coord]] <- ((coords[[lon_coord]] + 180) %% 360) - 180 } else if(!is.null(lons) && .is_degrees(atts, lon_coord) && max(lons) > 180 && min(lons) > 180) { coords[[lon_coord]] <- ((coords[[lon_coord]] + 180) %% 360) - 180 } else if(!is.null(lons) && .is_degrees(atts, lon_coord) && max(lons) > 180) { message(paste("0-360 longitude crossing the international date", "line encountered.\nLongitude coordinates will be", "0-360 in output.")) } } coords } .get_nc_dimensions <- function(dimensions, coord_var, coords, nc, dims, var_names, curvilinear, eps, ignore_bounds, atts) { to_rectilinear = FALSE regular <- .is_regular(coords, eps) for (i in seq_along(coords)) { from_to <- dimensions[[i]]$from:dimensions[[i]]$to try_bounds <- names(coords)[i] %in% var_names && !ignore_bounds && length(bounds <- coord_var[coord_var$variable == names(coords)[i], ]$bounds) > 0 && bounds %in% var_names if (try_bounds) { bounds = RNetCDF::var.get.nc(nc, bounds) if (!is.matrix(bounds)) # single instance, returns a vector bounds = matrix(bounds, nrow = 2) if(!bounds[1, 1] < coords[[i]][1] | !bounds[2, 1] > coords[[i]][1]) { warning(paste("bounds not enveloping", names(coords)[i], "coordinates. Ignoring.")) try_bounds <- FALSE } else { is_reg = ncol(bounds) > 1 && length(u <- .unique_fuzz(apply(bounds, 2, diff), eps)) == 1 && length(v <- .unique_fuzz(diff(bounds[1,]), eps)) == 1 if (is_reg && abs(u + v) < eps) { warning(paste("bounds for", names(coords)[i], "seem to be reversed; reverting them")) bounds = apply(bounds, 2, sort) # should not be needed according to CF, but see #133 u = v } if (is_reg && abs(v - u) < eps) { dimensions[[i]]$offset = bounds[1,1] dimensions[[i]]$delta = v } else { dimensions[[i]]$values = make_intervals(bounds[1, from_to], bounds[2,from_to]) dimensions[[i]]$point = FALSE if (i %in% 1:2 && length(curvilinear) < 1) # FIXME: ? hard-coding here that lon lat are in the first two dimensions: to_rectilinear = TRUE } } } if (regular[i] & !try_bounds) { mdc = mean(diff(coords[[i]])) coord_name = names(coords)[i] t_dim = coord_var[coord_var$variable == coord_name,]$T if (is.null(t_dim) || length(t_dim) == 0) t_dim = NA_character_ # https://github.com/r-spatial/stars/issues/378 if (!is.na(t_dim) && names(coords)[i] == t_dim) dimensions[[i]]$offset[1L] = coords[[i]][1] else dimensions[[i]]$offset[1L] = coords[[i]][1] - mdc/2 ## NaN for singleton dims, but that seems ok unless we have explicit interval? dimensions[[i]]$delta[1L] = mdc } else { dimensions[[i]]$values = coords[[i]][from_to] ## offset/delta for fall-back index (and for NA test ) ## https://github.com/r-spatial/stars/blob/master/R/dimensions.R#L294-L303 dimensions[[i]]$offset[1L] = NA_real_ dimensions[[i]]$delta[1L] = NA_real_ } } if (to_rectilinear) dimensions = .as_rectilinear(dimensions) return(dimensions) } .get_time_meta <- function(coord_var, var, meta) { TIME_name = as.character(na.omit(unlist( coord_var[coord_var$variable == var, ][c("T")]))) if(!length(TIME_name)) { list(tname = NULL, calendar = NULL, tunit = NULL) } else { atts = meta$attribute[meta$attribute$variable == TIME_name, ] ## might not exist, so default to NULL calendar = unlist(atts$value[atts$name == "calendar"])[1L] tunit = unlist(atts$value[atts$name == "units"])[1L] list(tname = TIME_name, calendar = calendar, tunit = tunit) } } .get_nc_time <- function(dimensions, make_time, coord_var, var, meta) { # sort out time -> POSIXct: if (make_time) { if (all("T" %in% names(coord_var))) { tmeta <- .get_time_meta(coord_var, var, meta) if (!is.na(tmeta$tname) && length(tmeta$tname) == 1L && meta$variable$ndims[match(tmeta$tname, meta$variable$name)] == 1) { if (tmeta$tname %in% names(dimensions)) { tdim <- NULL if (is.null(tmeta$tunit) || inherits(tmeta$tunit, "try-error")) { warning("ignoring units of time dimension, not able to interpret") } else { tdim = make_cal_time2(dimensions, time_name = tmeta$tname, time_unit = tmeta$tunit, cal = tmeta$calendar) } if (!is.null(tdim)) dimensions[[tmeta$tname]] <- tdim } } } } return(dimensions) } .get_curvilinear_coords <- function(curvilinear, dimensions, nc, dims) { curvi_coords <- lapply(curvilinear, function(.v) { cv_matcher <- RNetCDF::var.inq.nc(nc, .v)$dimids cv_matcher <- match(cv_matcher, dims$id[1:2]) RNetCDF::var.get.nc(nc, variable = .v, start = dims[1:2, "start", drop = TRUE][cv_matcher], count = dims[1:2, "count", drop = TRUE][cv_matcher], collapse = FALSE, unpack = TRUE) }) names(curvi_coords)[1:2] <- names(dimensions)[1:2] expected_shape <- c(dimensions[[1]]$to, dimensions[[2]]$to) if(!all(dim(curvi_coords[[1]]) == expected_shape)) { curvi_coords[1] <- t(curvi_coords[1]) } if(!all(dim(curvi_coords[2]) == expected_shape)) { curvi_coords[2] <- t(curvi_coords[2]) } return(curvi_coords) } make_cal_time2 <- function(x, time_name = NULL, time_unit = NULL, cal = NULL) { if(inherits(x, "dimensions")) { tm = st_get_dimension_values(x, time_name) dimension <- x[[time_name]] } else { tm <- x$values dimension <- x } if(! is.null(cal) && cal %in% c("360_day", "365_day", "noleap")) { if (!requireNamespace("PCICt", quietly = TRUE)) { stop("package PCICt required, please install it first") # nocov } t01 = set_units(0:1, time_unit, mode = "standard") delta = if (grepl("months", time_unit)) { if (cal == "360_day") set_units(30 * 24 * 3600, "s", mode = "standard") else set_units((365/12) * 24 * 3600, "s", mode = "standard") } else set_units(as_units(diff(as.POSIXct(t01))), "s", mode = "standard") origin = as.character(as.POSIXct(t01[1])) v.pcict = PCICt::as.PCICt(tm * as.numeric(delta), cal, origin) if (!is.null(dimension$values)) { v = dimension$values if (inherits(v, "intervals")) { start = PCICt::as.PCICt(v$start * as.numeric(delta), cal, origin) end = PCICt::as.PCICt(v$end * as.numeric(delta), cal, origin) dimension$values = make_intervals(start, end) } else dimension$values = v.pcict } else { dimension$offset = v.pcict[1] dimension$delta = diff(v.pcict[1:2]) } dimension$refsys = "PCICt" } else { # Gregorian/Julian, POSIXct: if (!is.null(dimension$values)) { v = dimension$values if (inherits(v, "intervals")) { start = as.POSIXct(units::set_units(v$start, time_unit, mode = "standard")) # or: RNetCDF::utcal.nc(u, tm, "c") end = as.POSIXct(units::set_units(v$end, time_unit, mode = "standard")) # or: RNetCDF::utcal.nc(u, tm, "c") dimension$values = make_intervals(start, end) } else dimension$values = as.POSIXct(units::set_units(tm, time_unit, mode = "standard")) # or: RNetCDF::utcal.nc(u, tm, "c") } else { t0 = dimension$offset t1 = dimension$offset + dimension$delta t.posix = as.POSIXct(units::set_units(c(t0, t1), time_unit, mode = "standard")) # or: utcal.nc(u, c(t0,t1), "c") dimension$offset = t.posix[1] dimension$delta = diff(t.posix) } dimension$refsys = "POSIXct" } dimension } .is_netcdf_cf_dsg <- function(meta) { featuretype <- .get_attributes(meta$attribute, "featureType", "NC_GLOBAL") if(!is.null(featuretype)) { if(grepl( "timeseries", featuretype$value, ignore.case = TRUE)) { return(TRUE) } } return(FALSE) } .get_geom_name <- function(meta) { geometry <- unlist(unique(.get_attributes(meta$attribute, "geometry")$value)) if(length(geometry) > 1) { warning(paste("Only a single geometry is supported. Using", geometry[1])) #nocov geometry <- geometry[1] } if(!is.null(geometry)) { ncdfgeom::read_geometry(meta$source$source) } else { NA } } #' @param sf_geometry sf data.frame with geometry and attributes to be added to stars object. #' Must have same number of rows as timeseries instances. #' @details For the \code{ncdfgeom} method: objects are point-timeseries with optional line or polygon geometry for each timeseries specified with the \code{sf_geometry} parameter. See \pkg{ncdfgeom} for more about this NetCDF-based format for geometry and timeseries. #' @name st_as_stars #' @export #' st_as_stars.ncdfgeom <- function(.x, ..., sf_geometry = NA) { crs <- sf::st_crs('OGC:CRS84') if(length(.x$alts) == 0) { ts_points <- data.frame(X = .x$lons, Y = .x$lats) ts_points <- sf::st_as_sf(ts_points, coords = c("X", "Y"), crs = crs) } else { ts_points <- data.frame(X = .x$lons, Y = .x$lats, Z = .x$alts) ts_points <- sf::st_as_sf(ts_points, coords = c("X", "Y", "Z"), crs = crs) } data <- .x$data_frames[[1]] gdim <- create_dimension(from = 1, to = length(.x$lats), refsys = crs, point = TRUE, values = ts_points$geometry) tdim <- create_dimension(from = 1, to = length(.x$time), refsys = "POSIXct", point = FALSE, values = as.POSIXct(.x$time)) dim <- list(time = tdim, points = gdim) if(inherits(sf_geometry, "sf")) { if(length(gdim$values) != length(st_geometry(sf_geometry))) stop("geometry must be same length as instance dimension of timeseries") is_point <- any(grepl("point", class(st_geometry(sf_geometry)), ignore.case = TRUE)) sf_dim <- create_dimension(from = 1, to = length(gdim$values), refsys = st_crs(sf_geometry), point = is_point, is_raster = FALSE, values = st_geometry(sf_geometry)) dim <- c(dim, list(geometry = sf_dim)) } st_stars(x = setNames(list(as.matrix(.x$data_frames[[1]])), .x$varmeta[[1]]$name), dimensions = create_dimensions(dim)) } stars/R/init.R0000644000176200001440000000204514644756201012707 0ustar liggesusers#' @importFrom graphics image.default image par plot title box text axis plot.new plot.window rasterImage layout lcm contour hist strwidth #' @importFrom grDevices dev.capabilities dev.size grey rgb col2rgb cm #' @importFrom utils head tail setTxtProgressBar txtProgressBar packageVersion methods modifyList #' @importFrom stats na.omit runif aggregate setNames predict quantile var complete.cases na.pass time prcomp #' @importFrom tools file_ext #' @importFrom methods as slotNames new slot #' @importFrom abind abind adrop asub #' @importFrom classInt classIntervals #' @importFrom parallel parApply #' @importFrom rlang %||% #' @import sf #' @import units NULL setOldClass("stars") setOldClass("stars_proxy") .onLoad = function(libname, pkgname) { register_all_s3_methods() # dynamically registers non-imported pkgs (tidyverse) # nocov } .onAttach = function(libname, pkgname) { if (nrow(sf::st_drivers("raster", "netCDF")) != 1) packageStartupMessage("Note: sf is linked to a GDAL version without netCDF driver, some tests or examples may fail") } stars/R/ops.R0000644000176200001440000002360414576033423012547 0ustar liggesusersfirst_dimensions_match = function(e1, e2) { d1 = st_dimensions(e1) d2 = st_dimensions(e2) crs1 = st_crs(d1) crs2 = st_crs(d2) st_crs(d1) = st_crs(NA) st_crs(d2) = st_crs(NA) n = min(length(d1), length(d2)) isTRUE(all.equal(d1[1:n], d2[1:n], check.attributes = FALSE)) && crs1 == crs2 } #' S3 Ops Group Generic Functions for stars objects #' #' Ops functions for stars objects, including comparison, product and divide, add, subtract #' #' @param e1 object of class \code{stars} #' @param e2 object of class \code{stars} #' #' @return object of class \code{stars} #' @name ops_stars #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' x * x #' x / x #' x + x #' x + 10 #' all.equal(x * 10, 10 * x) #' @export #' @details if \code{e1} or \code{e2} is is a numeric vector, or \code{e2} #' has less or smaller dimensions than \code{e1}, then \code{e2} is recycled #' such that it fits \code{e1}, using usual R array recycling rules. The user #' needs to make sure this is sensible; it may be needed to use \code{aperm} #' to permutate dimensions first. Ops.stars <- function(e1, e2) { if (!missing(e2)) { if (inherits(e1, "stars") && inherits(e2, "stars") && !first_dimensions_match(e1, e2)) stop("(first) dimensions of e1 and e2 do not match") if (!inherits(e2, "stars")) e1 = drop_units(e1) } ret = if (missing(e2)) lapply(e1, .Generic) else if (!inherits(e2, "stars")) lapply(e1, .Generic, e2 = e2) else { # both e1 and e2 are stars objects: # https://github.com/r-spatial/stars/issues/187#issuecomment-834020710 : if (!is.null(dim(e1)) && !isTRUE(all.equal(dim(e1), dim(e2), check.attributes = FALSE))) { stopifnot(length(e2) == 1) lapply(e1, .Generic, e2 = structure(e2[[1]], dim = NULL)) } else mapply(.Generic, e1, e2, SIMPLIFY = FALSE) } if (any(sapply(ret, function(x) is.null(dim(x))))) # happens if e1[[1]] is a factor; #304 ret = lapply(ret, function(x) { dim(x) = dim(e1); x }) if (! inherits(e1, "stars")) st_as_stars(setNames(ret, names(e2)), dimensions = st_dimensions(e2)) else st_as_stars(ret, dimensions = st_dimensions(e1)) } #' Mathematical operations for stars objects #' #' @param x object of class stars #' @param ... parameters passed on to the Math functions #' #' @export #' @name ops_stars #' #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' a = sqrt(x) #' b = log(x, base = 10) #' @export Math.stars = function(x, ...) { ret = lapply(x, .Generic, ...) st_as_stars(ret, dimensions = st_dimensions(x)) } #' @name ops_stars #' @export Ops.stars_proxy <- function(e1, e2) { if (!inherits(e1, "stars_proxy")) stop("first argument in expression needs to be the stars_proxy object") # FIXME: needed?? #nocov if (missing(e2)) collect(e1, match.call(), .Generic, "e1", env = environment()) else collect(e1, match.call(), .Generic, c("e1", "e2"), env = environment()) } #' @name ops_stars #' @export Math.stars_proxy = function(x, ...) { collect(x, match.call(), .Generic, env = environment()) } # https://github.com/r-spatial/stars/issues/390 has_single_arg = function(fun, dots) { sum(!(names(as.list(args(fun))) %in% c("", "...", names(dots)))) <= 1 } can_single_arg = function(fun) { !inherits(try(fun(1:10), silent = TRUE), "try-error") } #' @export st_apply = function(X, MARGIN, FUN, ...) UseMethod("st_apply") #' st_apply apply a function to one or more array dimensions #' #' st_apply apply a function to array dimensions: aggregate over space, time, or something else #' @name st_apply #' @param X object of class \code{stars} #' @param MARGIN see \link[base]{apply}; index number(s) or name(s) of the dimensions over which \code{FUN} will be applied #' @param FUN see \link[base]{apply} and see Details. #' @param ... arguments passed on to \code{FUN} #' @param CLUSTER cluster to use for parallel apply; see \link[parallel]{makeCluster} #' @param PROGRESS logical; if \code{TRUE}, use \code{pbapply::pbapply} to show progress bar #' @param FUTURE logical;if \code{TRUE}, use \code{future.apply::future_apply} #' @param rename logical; if \code{TRUE} and \code{X} has only one attribute and #' \code{FUN} is a simple function name, rename the attribute of the returned object #' to the function name #' @param .fname function name for the new attribute name (if one or more #' dimensions are reduced) or the new dimension (if a new dimension is created); #' if missing, the name of \code{FUN} is used #' @param single_arg logical; if \code{TRUE}, FUN takes a single argument (like \code{fn_ndvi1} below), #' if \code{FALSE} FUN takes multiple arguments (like \code{fn_ndvi2} below). #' @return object of class \code{stars} with accordingly reduced number of dimensions; #' in case \code{FUN} returns more than one value, a new dimension is created carrying #' the name of the function used; see the examples. Following the logic of #' \link[base]{apply}, This new dimension is put before the #' other dimensions; use \link{aperm} to rearrange this, see last example. #' @param keep logical; if \code{TRUE}, preserve dimension metadata (e.g. time stamps) #' @details FUN is a function which either operates on a single object, which will #' be the data of each iteration step over dimensions MARGIN, or a function that #' has as many arguments as there are elements in such an object. See the NDVI #' examples below. The second form can be VERY much faster e.g. when a trivial #' function is not being called for every pixel, but only once (example). #' #' The heuristics for the default of \code{single_arg} work often, but not always; try #' setting this to the right value when \code{st_apply} gives an error. #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' st_apply(x, 1:2, mean) # mean band value for each pixel #' st_apply(x, c("x", "y"), mean) # equivalent to the above #' st_apply(x, 3, mean) # mean of all pixels for each band #' \dontrun{ #' st_apply(x, "band", mean) # equivalent to the above #' st_apply(x, 1:2, range) # min and max band value for each pixel #' fn_ndvi1 = function(x) (x[4]-x[3])/(x[4]+x[3]) # ONE argument: will be called for each pixel #' fn_ndvi2 = function(red,nir) (nir-red)/(nir+red) # n arguments: will be called only once #' ndvi1 = st_apply(x, 1:2, fn_ndvi1) #' # note that we can select bands 3 and 4 in the first argument: #' ndvi2 = st_apply(x[,,,3:4], 1:2, fn_ndvi2) #' all.equal(ndvi1, ndvi2) #' # compute the (spatial) variance of each band; https://github.com/r-spatial/stars/issues/430 #' st_apply(x, 3, function(x) var(as.vector(x))) # as.vector is required! #' # to get a progress bar also in non-interactive mode, specify: #' if (require(pbapply)) { # install it, if FALSE #' pboptions(type = "timer") #' } #' st_apply(x, 1:2, range) # dimension "range" is first; rearrange by: #' st_apply(x, 1:2, range) %>% aperm(c(2,3,1)) #' } #' @export st_apply.stars = function(X, MARGIN, FUN, ..., CLUSTER = NULL, PROGRESS = FALSE, FUTURE = FALSE, rename = TRUE, .fname, single_arg = has_single_arg(FUN, list(...)) || can_single_arg(FUN), keep = FALSE) { if (missing(.fname)) .fname <- paste(deparse(substitute(FUN), 50), collapse = "\n") if (is.character(MARGIN)) MARGIN = match(MARGIN, names(dim(X))) dX = dim(X)[MARGIN] if (PROGRESS && !requireNamespace("pbapply", quietly = TRUE)) stop("package pbapply required, please install it first") if (FUTURE && !requireNamespace("future.apply", quietly = TRUE)) stop("package future.apply required, please install it first") fn = function(y, ...) { ret = if (PROGRESS) pbapply::pbapply(X = y, MARGIN = MARGIN, FUN = FUN, ..., cl = CLUSTER) else { if (is.null(CLUSTER) && !FUTURE) apply(X = y, MARGIN = MARGIN, FUN = FUN, ...) else if (FUTURE) { oopts = options(future.globals.maxSize = +Inf) on.exit(options(oopts)) future.apply::future_apply(y, MARGIN = MARGIN, FUN = FUN, ...) } else parallel::parApply(CLUSTER, X = y, MARGIN = MARGIN, FUN = FUN, ...) } if (is.array(ret)) ret else array(ret, dX) } no_margin = setdiff(seq_along(dim(X)), MARGIN) ret = if (single_arg) lapply(X, fn, ...) else # call FUN on full chunks: lapply(X, function(a) do.call(FUN, setNames(append(asplit(a, no_margin), list(...)), NULL))) # fix dimensions: dim_ret = dim(ret[[1]]) ret = if (length(dim_ret) == length(MARGIN)) { # FUN returned a single value if (length(ret) == 1 && rename && make.names(.fname) == .fname) ret = setNames(ret, .fname) st_stars(ret, st_dimensions(X)[MARGIN]) } else { # FUN returned multiple values: need to set dimension name & values dim_no_margin = dim(X)[-MARGIN] if (length(no_margin) > 1 && dim(ret[[1]])[1] == prod(dim_no_margin)) { r = attr(st_dimensions(X), "raster") new_dim = c(dim_no_margin, dim(ret[[1]])[-1]) for (i in seq_along(ret)) dim(ret[[i]]) = new_dim # set dims: dims = st_dimensions(X)[c(no_margin, MARGIN)] } else { orig = st_dimensions(X)[MARGIN] r = attr(orig, "raster") dims = if (keep) { c(st_dimensions(X)[no_margin], orig) } else { dim1 = if (!is.null(dimnames(ret[[1]])[[1]])) # FUN returned named vector: create_dimension(values = dimnames(ret[[1]])[[1]]) else create_dimension(to = dim_ret[1]) c(structure(list(dim1), names = .fname), orig) } } st_stars(ret, dimensions = create_dimensions(dims, r)) } for (i in seq_along(ret)) names(dim(ret[[i]])) = names(st_dimensions(ret)) ret } if (!isGeneric("%in%")) setGeneric("%in%", function(x, table) standardGeneric("%in%")) #' evaluate whether cube values are in a given set #' #' evaluate whether cube values are in a given set #' @docType methods #' @rdname in-methods #' @param x data cube value #' @param table values of the set #' @exportMethod "%in%" setMethod("%in%", signature(x = "stars"), function(x, table) { st_stars(lapply(x, function(y) structure(y %in% table, dim = dim(y))), st_dimensions(x)) } ) stars/R/factors.R0000644000176200001440000000333114144300304013364 0ustar liggesusers#' cut methods for stars objects #' #' cut methods for stars objects #' @name cut_stars #' @param x see \link[base]{cut} #' @param breaks see \link[base]{cut} #' @param ... see \link[base]{cut} #' @return an array or matrix with a \code{levels} attribute; see details #' @details R's \code{factor} only works for vectors, not for arrays or matrices. This is a work-around (or hack?) to keep the factor levels generated by \code{cut} and use them in plots. #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' cut(x, c(0, 50, 100, 255)) #' cut(x[,,,1], c(0, 50, 100, 255)) #' plot(cut(x[,,,1], c(0, 50, 100, 255))) cut.array = function(x, breaks, ...) { structure(cut(as.vector(x), breaks, ...), dim = dim(x)) } #' @name cut_stars #' @export cut.matrix = cut.array #' @name cut_stars #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x1 = read_stars(tif) #' (x1_cut = cut(x1, breaks = c(0, 50, 100, Inf))) # shows factor in summary #' plot(x1_cut[,,,c(3,6)]) # propagates through [ and plot cut.stars = function(x, breaks, ...) { my_cut = function(x, breaks, ...) structure(cut(x, breaks, ...), dim = dim(x)) st_stars(lapply(x, my_cut, breaks = breaks, ...), st_dimensions(x)) } #' @export droplevels.stars = function(x, ...) { drop_level = function(x, ...) { d = dim(x) l = levels(x) co = attr(x, "colors") dim(x) = NULL x = droplevels(x, ...) sel = match(levels(x), l) structure(x, dim = d, colors = co[sel]) } for (i in seq_along(x)) { if (inherits(x[[i]], "factor")) x[[i]] = drop_level(x[[i]], ...) } x } #' @export droplevels.stars_proxy = function(x, ...) { collect(x, match.call(), "droplevels", env = environment()) } stars/R/geom.R0000644000176200001440000001226214576033423012673 0ustar liggesusers#' spatial intersect predicate for stars and sfc object #' #' spatial intersect predicate for stars and sfc object #' @param x object of class stars #' @param y object that has an `st_geometry` method: of class `sf` or `sfc`, or `stars` object with an `sfc` dimension #' @param sparse logical; if TRUE, return the a sparse logical matrix (object of class `sgbp`), if FALSE, return a logical matrix #' @param as_points logical, should grid cells be considered as points (TRUE) or polygons (FALSE)? Default: FALSE and warning emitted #' @param ... ignored, or passed on to `st_intersects.sf` for curvilinear grids #' @param transpose logical; should the transpose of the `sgbp` object be returned? #' @return `sgbp` object if sparse = TRUE, logical matrix otherwise #' @details curvilinear grids are always converted to polygons, so points on grid boundaries may intersect with two cells touched; for other grids each cell boundary or corner belongs only to one cell. #' #' @export st_intersects.stars = function(x, y, sparse = TRUE, ..., as_points = NA, transpose = FALSE) { y = st_geometry(y) d = st_dimensions(x) xy = attr(d, "raster")$dimensions if (is.na(as_points)) { p = d[[ xy[1] ]]$point || d[[ xy[2] ]]$point if (is.na(p)) { warning("as_points is NA: assuming here that raster cells are small polygons, not points") as_points = FALSE } else as_points = p } ret = if (has_raster(x) && !is_curvilinear(x) && inherits(y, "sfc_POINT") && !as_points) { cr = colrow_from_xy(st_coordinates(y), x, NA_outside = TRUE) ncells = prod(dim(d[xy])) ncols = dim(x)[ xy[1] ] ix = (cr[,2] - 1) * ncols + cr[,1] # for all points, the 1-based index in (as.vector) x # now create the TRANSPOSE of the sgbp: ret = structure(lapply(as.list(ix), function(x) if (is.na(x)) integer(0) else x), predicate = "intersects", region.id = seq_along(y), ncol = ncells, class = "sgbp") if (! sparse) ret = as.matrix(ret) if (! transpose) t(ret) else ret } else { # curvilinear or !as_points: ret = st_intersects(st_as_sf(x, as_points = as_points, na.rm = FALSE), y, sparse = sparse, ...) if (! sparse) ret = as.matrix(ret) if (transpose) t(ret) else ret } } # FIXME: of_y should be left/right/full? #' Spatially join a stars and an `sf` object #' #' Spatially join a stars and an `sf` object #' @param x object of class stars #' @param y object of class sf, or one that can be coerced into that by \link{st_as_sf} #' @param join the join function, which should return an sgbp object; see details #' @param ... arguments that will be passed on to the join function #' @param as_points logical; controls whether grid cells in \code{x} will be treated as points, or as cell areas; the \link{st_intersects.stars} method by default will derive this from \code{x}'s metadata, or else assume areas. #' @param what "left1", "right" or "inner"; see details #' @param warn logical; if TRUE, warn on 1-to-many matches when \code{what} is \code{"left1"} #' @return If what is "left1", an object of class stars with the (first) value of y at spatial instances of x #' @details When there is more than one match to a single x value, the first matching record from y is taken (and if \code{warn} is TRUE a warning is raised). If what is "inner", an object of class \code{sf} with all matching records of x and y. #' @export st_join.stars = function(x, y, join = st_intersects, ..., what = "left1", as_points = NA, warn = TRUE) { if (!requireNamespace("dplyr", quietly = TRUE)) stop("dplyr needed: install first?") if (!inherits(y, "sf")) { try(y <- st_as_sf(y)) if (inherits(y, "try-error")) stop("argument y should be of class sf, or sfc") } x = st_upfront(x) if (what == "left1") { ix = join(x, y, ..., as_points = as_points) li = lengths(ix) if (warn && any(li > 1)) { warning(paste("st_join found", sum(li > 1),"1-to-n matches, taking the first match for each of those")) ix[li > 1] = lapply(ix[li > 1], head, 1) } sel = li > 0 ix = unlist(ix) # white-out existing cells not matched; No,see https://github.com/r-spatial/stars/issues/643: # for (i in seq_along(x)) # x[[i]][!sel] = NA # add matching fields from y: for (i in setdiff(names(y), attr(y, "sf_column"))) { na_mode = NA storage.mode(na_mode) = storage.mode(y[[i]]) a = array(na_mode, dim(x)) attr(a, "units") = attr(y[[i]], "units") attr(a, "levels") = attr(y[[i]], "levels") a[sel] = y[[i]][ix] x[[ i ]] = a } x } else if (what == "inner") { ix = if (missing(join)) st_intersects(x, y, sparse = TRUE, ..., transpose = TRUE, as_points = as_points) else join(y, st_as_sf(x, as_points = as_points), ...) li = lengths(ix) i = unlist(ix) # sequence of x indexes j = rep(seq_along(ix), li) # possibly repeated y indexes stopifnot(length(i) == length(j)) if (length(dim(x)) > 2) { recycle = prod(dim(x)[-(1:2)]) # 1 in case of no dimensions beyond x and y i = rep(i, recycle) j = rep(j, recycle) # FIXME: create a stars object with an sfc dimension warning("a stars object should probably have been created here; please file an issue") } st_sf(dplyr::bind_cols(as.data.frame(x)[i,], y[j,])) } else stop('value for "what" not supported') } stars/R/datasets.R0000644000176200001440000000201514576033423013547 0ustar liggesusers#' Landsat-7 bands for a selected region around Olinda, BR #' #' Probably containing the six 30 m bands: #' \itemize{ #' \item Band 1 Visible (0.45 - 0.52 µm) 30 m #' \item Band 2 Visible (0.52 - 0.60 µm) 30 m #' \item Band 3 Visible (0.63 - 0.69 µm) 30 m #' \item Band 4 Near-Infrared (0.77 - 0.90 µm) 30 m #' \item Band 5 Short-wave Infrared (1.55 - 1.75 µm) 30 m #' \item Band 7 Mid-Infrared (2.08 - 2.35 µm) 30 m #' } #' "L7_ETMs" #' Monthly Gridded Meteorological Observations #' #' These are the monthly observational data used for BCSD downscaling. See: for more information." ; #' "Atmospheric Temperature, Air Temperature Atmosphere, Precipitation, Rain, Maximum Daily Temperature, Minimum Daily Temperature" ; #' "bcsd_obs" #' Sentinel-2 sample tile #' #' Sentinel-2 sample tile, downloaded from #' reads the four 10-m bands: B2 (490 nm), B3 (560 nm), B4 (665 nm) and B8 (842 nm) "stars_sentinel2" stars/R/spacetime.R0000644000176200001440000001036214246204071013706 0ustar liggesusers#' @export st_as_stars.STSDF = function(.x, ...) st_as_stars(as(.x, "STFDF"), ...) #' @export st_as_stars.STS = function(.x, ...) st_as_stars(as(.x, "STF"), ...) #' @export st_as_stars.STFDF = function(.x, ...) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") #nocov if (!requireNamespace("zoo", quietly = TRUE)) stop("package zoo required, please install it first") #nocov #ix = 1:prod(dim(.x)[c("space", "time")]) d = if (sp::gridded(.x@sp)) { gp = sp::gridparameters(.x@sp) nx = gp[1,3] ny = gp[2,3] if (! sp::fullgrid(.x@sp)) { # SpatialPixels lst = vector("list", ncol(.x@data)) for (j in seq_along(.x@data)) { # attributes px2vec = function(pix) { sp::fullgrid(pix) = TRUE as.vector(as.matrix(pix)) } a = array(NA_real_, c(nx, ny, dim(.x)[2])) for (i in seq_len(dim(.x)[2])) # time a[,,i] = px2vec(.x[,i,j]) lst[[j]] = as.vector(a) } .x@data = as.data.frame(setNames(lst, names(.x@data))) } # offs_x dx 0 offs_y 0 dy gt = c(gp[1,1] - gp[1,2]/2, gp[1,2], 0.0, gp[2,1] + (gp[2,3] - 0.5) * gp[2,2], 0.0, -gp[2,2]) vals = lapply(seq_len(nrow(gp)), function(i) seq(gp[i,1], by = gp[i,2], length.out = gp[i,3])) create_dimensions(list( x = create_dimension(values = vals[[1]] - gp[1,2]/2), y = create_dimension(values = rev(vals[[2]]) + gp[2,2]/2), time = create_dimension(values = zoo::index(.x@time))), raster = get_raster()) } else create_dimensions(list( sfc = create_dimension(values = st_as_sfc(.x@sp)), # FIXME: doesn't do SpatialPixels -> x/y time = create_dimension(values = zoo::index(.x@time)))) vals = lapply(.x@data, function(y) { dim(y) = dim(d); y }) st_set_crs(st_as_stars(vals, dimensions = d), st_crs(.x@sp)) } #' @export st_as_stars.STF = function(.x, ...) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") #nocov if (!requireNamespace("zoo", quietly = TRUE)) stop("package zoo required, please install it first") #nocov #ix = 1:prod(dim(.x)[c("space", "time")]) d = if (sp::gridded(.x@sp)) { gp = sp::gridparameters(.x@sp) nx = gp[1,3] ny = gp[2,3] # offs_x dx 0 offs_y 0 dy gt = c(gp[1,1] - gp[1,2]/2, gp[1,2], 0.0, gp[2,1] + (gp[2,3] - 0.5) * gp[2,2], 0.0, -gp[2,2]) vals = lapply(seq_len(nrow(gp)), function(i) seq(gp[i,1], by = gp[i,2], length.out = gp[i,3])) create_dimensions(list( x = create_dimension(values = vals[[1]] - gp[1,2]/2), y = create_dimension(values = rev(vals[[2]]) + gp[2,2]/2), time = create_dimension(values = zoo::index(.x@time))), raster = get_raster()) } else create_dimensions(list( sfc = create_dimension(values = st_as_sfc(.x@sp)), # FIXME: doesn't do SpatialPixels -> x/y time = create_dimension(values = zoo::index(.x@time)))) st_set_crs(st_as_stars(list(), dimensions = d), st_crs(.x@sp)) } st_as_STFDF = function(x) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") #nocov if (!requireNamespace("spacetime", quietly = TRUE)) stop("package spacetime required, please install it first") #nocov rst = has_raster(x) d = st_dimensions(x) geom = if (rst) { x = st_upfront(x) time_dim = 3 sp::geometry(as(adrop(x[,,,1], drop = 3), "Spatial")) } else { x = st_upfront(x, which_sfc(x)) time_dim = 2 sp::geometry(as(adrop(x[,,1], drop = 2), "Spatial")) } tm = st_get_dimension_values(x, time_dim, center = FALSE) st = suppressWarnings(spacetime::STF(geom, tm)) # would warn for SpatialGrid -> SpatialPixels sp::addAttrToGeom(st, as.data.frame(lapply(x, function(y) structure(y, dim = NULL))), match.ID = FALSE) } setAs("stars", "STFDF", function(from) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") #nocov if (!requireNamespace("zoo", quietly = TRUE)) stop("package zoo required, please install it first") #nocov if (!requireNamespace("xts", quietly = TRUE)) stop("package xts required, please install it first") #nocov if (!requireNamespace("spacetime", quietly = TRUE)) stop("package spacetime required, please install it first") #nocov st_as_STFDF(from) }) stars/R/subset.R0000644000176200001440000003503214644747114013256 0ustar liggesusers#' subset stars objects #' #' subset stars objects #' @name stars_subset #' @param x object of class \code{stars} #' @param i first selector: integer, logical or character vector indicating attributes to select, or object of class \code{sf}, \code{sfc}, \code{bbox}, or \code{stars} used as spatial selector; see details #' @param ... further (logical or integer vector) selectors, matched by order, to select on individual dimensions #' @param drop logical; if \code{TRUE}, degenerate dimensions (with only one value) are dropped #' @param crop logical; if \code{TRUE} and parameter \code{i} is a spatial geometry (\code{sf} or \code{sfc}) object, the extent (bounding box) of the result is cropped to match the extent of \code{i} using \link{st_crop}. Cropping curvilinear grids is not supported. #' @details If \code{i} is an object of class \code{sf}, \code{sfc} or \code{bbox}, the spatial subset covering this geometry is selected, possibly followed by cropping the extent. Array values for which the cell centre is not inside the geometry are assigned \code{NA}. If \code{i} is of class \code{stars}, and attributes of \code{i} are \code{logical}, cells in \code{x} corresponding to \code{NA} or \code{FALSE} cells in \code{i} are assigned an \code{NA}. Dimension ranges containing negative values or \code{NA} may be partially supported. #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' x[,,,1:3] # select bands #' x[,1:100,100:200,] # select x and y by range #' x["L7_ETMs.tif"] # select attribute #' xy = structure(list(x = c(293253.999046018, 296400.196497684), y = c(9113801.64775462, #' 9111328.49619133)), .Names = c("x", "y")) #' pts = st_as_sf(data.frame(do.call(cbind, xy)), coords = c("x", "y"), crs = st_crs(x)) #' image(x, axes = TRUE) #' plot(st_as_sfc(st_bbox(pts)), col = NA, add = TRUE) #' bb = st_bbox(pts) #' (xx = x[bb]) #' image(xx) #' plot(st_as_sfc(bb), add = TRUE, col = NA) #' image(x) #' pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) #' buf = st_buffer(st_sfc(pt, crs = st_crs(x)), 1500) #' plot(buf, add = TRUE) #' #' buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), #' crs = st_crs(x)) #' image(x[buf]) #' plot(buf, add = TRUE, col = NA) #' image(x[buf, crop=FALSE]) #' plot(buf, add = TRUE, col = NA) #' # with i of class stars: #' x[x > 75] # generates lots of NA's; pattern for each band #' x[x[,,,1] > 75] # recycles a single band template for all bands "[.stars" = function(x, i = TRUE, ..., drop = FALSE, crop = !is_curvilinear(x)) { missing.i = missing(i) # special case: i is sf/sfc/bbox if (! missing.i && inherits(i, c("sf", "sfc", "bbox"))) { x = if (has_raster(x)) st_crop(x, i, crop = crop, ...) else { x = st_upfront(x, which_sfc(x)) sel = which(lengths(st_intersects(st_geometry(x), i)) > 0) x[, sel] } return(x) } # special case: i is stars if (! missing.i && inherits(i, "stars")) { stopifnot(all(sapply(i, is.logical))) fun = function(x, y) { x[is.na(y) | !y] = NA; x } ret = mapply(fun, x, i, SIMPLIFY = FALSE) return(st_as_stars(ret, dimensions = st_dimensions(x))) } d = st_dimensions(x) args = rep(list(rlang::missing_arg()), length(dim(x))) x = unclass(x) if (length(x)) x = x[i] mc = match.call(expand.dots = TRUE) # remove [, x, i from mc: mc = if (missing.i) mc[-(1:2)] else mc[-(1:3)] do_select = FALSE for (i in seq_along(mc)) { if ((is.call(mc[[i]]) || is.name(mc[[i]])) && !identical(as.character(mc[[i]]), "")) # try to "get" it: mc[[i]] = eval(mc[[i]], parent.frame()) if (is.numeric(mc[[i]]) || is.call(mc[[i]]) || is.name(mc[[i]]) || is.character(mc[[i]])) { # FIXME: or something else? args[[i]] = if (is.character(mc[[i]])) { m = match(mc[[i]], d[[i]]$values) if (length(m) == 0 || any(is.na(m))) stop("selecting using invalid value label(s)?") m } else mc[[i]] do_select = TRUE } } if (is_curvilinear(d)) { # fill the row/col selectors for $values matrices: args_xy = rep(list(rlang::missing_arg()), 2) xy = attr(d, "raster")$dimensions for (i in seq_along(mc)) { if (is.numeric(mc[[i]]) || is.call(mc[[i]]) || is.name(mc[[i]])) { # FIXME: or something else? if (names(d)[i] == xy[1]) args_xy[[1]] = mc[[i]] if (names(d)[i] == xy[2]) args_xy[[2]] = mc[[i]] } } } # subset arrays: args[["drop"]] = FALSE for (i in names(x)) x[[i]] = structure(eval(rlang::expr(x[[i]][ !!!args ])), levels = attr(x[[i]], "levels"), colors = attr(x[[i]], "colors"), exclude = attr(x[[i]], "exclude")) # now do dimensions: if (do_select) { ed = expand_dimensions(d) xy = attr(d, "raster")$dimensions if (is_curvilinear(d)) { # subset curvilinear lat/lon matrices/rasters: can't do one-at-a-time! d[[ xy[1] ]]$values = eval(rlang::expr(d[[ xy[1] ]]$values[!!!args_xy])) d[[ xy[2] ]]$values = eval(rlang::expr(d[[ xy[2] ]]$values[!!!args_xy])) } # dimensions: #mc0 = mc[1:3] # "[", x, first dim for (i in seq_along(d)) { # one-at-a-time: name_i = names(d)[i] argi = args[i] if (!(is_curvilinear(d) && name_i %in% xy) && # as that case was handled above !(is.name(argi[[1]]) && all(argi[[1]] == rlang::missing_arg())) && # empty arg is.numeric(e <- eval(argi[[1]])) && !any(is.na(e)) && !all(diff(e) == 1)) # sequence with gaps d[[i]]$values = if (isTRUE(d[[i]]$point) || !is.numeric(unclass(ed[[i]][1]))) ed[[i]] else as_intervals(ed[[i]], add_last = TRUE) d[[i]] = eval(rlang::expr(d[[i]] [!!!argi])) } } x = st_as_stars(x, dimensions = d) if (drop) adrop(x) else x } #' @name stars_subset #' @param downsample downsampling rate used in case \code{i} is a \code{stars_proxy} object #' @param value array of dimensions equal to those in \code{x}, or a vector or value that will be recycled to such an array #' @export #' @details in an assignment (or replacement form, \code{[<-}), argument \code{i} needs to be either (i) a \code{stars} object with logical attribute(s) that has dimensions matching (possibly after recycling) those of \code{x}, in which case the \code{TRUE} cells will be replaced and \code{i} and/or \code{value} will be recycled to the dimensions of the arrays in \code{x}, or (ii) a length-one integer or character vector indicating which array to replace, in which case \code{value} may be stars object or a vector or array (that will be recycled). #' @examples #' x = read_stars(tif) #' # replace, using a logical stars selector: cuts all values above 90 to 90 #' x[x > 90] = 90 #' # replace a single attribute when there are more than one: #' s = split(x) #' names(s) = paste0("band", 1:6) #' # rescale only band 1: #' s[1] = s[1] * 0.75 #' # rescale only attribute named "band2": #' s["band2"] = s["band2"] * 0.85 #' # create a new attribute from a numeric vector: #' s["rnorm"] = rnorm(prod(dim(s))) #' s "[<-.stars" = function(x, i, value) { if (inherits(i, "stars")) { fun = function(x, y, value) { x[y] = value; x } st_as_stars(mapply(fun, x, i, value = value, SIMPLIFY = FALSE), dimensions = st_dimensions(x)) } else if (inherits(i, c("numeric", "character")) && length(i) == 1) { if (inherits(value, "stars")) { stopifnot(length(value) == 1, first_dimensions_match(x, value)) value = value[[1]] } if (is.numeric(i)) stopifnot(i > 0, i <= length(x)) y = unclass(x) y[[i]] = array(value, dim(x)) st_as_stars(y, dimensions = st_dimensions(x)) } else stop("selector i should be a stars object or a lenght-one integer or character vector") } #' @export st_intersects.bbox = function(x, y, ...) { # FIXME: segmentize first if geographic coords? see sf::st_sample if (!inherits(y, "sfc")) y = st_as_sfc(y) st_intersects(st_as_sfc(x), y, ...) } #' crop a stars object #' #' crop a stars object #' @name st_crop #' @export #' @param x object of class \code{stars} #' @param y object of class \code{sf}, \code{sfc} or \code{bbox}; see Details below. #' @param epsilon numeric; factor to shrink the bounding box of \code{y} towards its center before cropping. #' @param as_points logical; only relevant if \code{y} is of class \code{sf} or \code{sfc}: if \code{FALSE}, treat \code{x} as a set of points, else as a set of small polygons. Default: \code{TRUE} if \code{y} is two-dimensional, else \code{FALSE}; see Details #' @param ... ignored #' @param crop logical; if \code{TRUE}, the spatial extent of the returned object is cropped to still cover \code{obj}, if \code{FALSE}, the extent remains the same but cells outside \code{y} are given \code{NA} values. #' @param normalize logical; if \code{TRUE} then pass the cropped object to \code{\link[sf]{st_normalize}} before returning. #' @details for raster \code{x}, \code{st_crop} selects cells that intersect with \code{y}. #' For intersection, are raster cells interpreted as points or as small polygons? #' If \code{y} is of class \code{stars}, \code{x} raster cells are interpreted as points; if \code{y} is of class \code{bbox}, \code{x} cells are interpreted as cells (small polygons). Otherwise, if \code{as_points} is not given, cells are interpreted as points if \code{y} has a two-dimensional geometry. #' #' @examples #' l7 = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) #' d = st_dimensions(l7) #' #' # area around cells 3:10 (x) and 4:11 (y): #' offset = c(d[["x"]]$offset, d[["y"]]$offset) #' res = c(d[["x"]]$delta, d[["y"]]$delta) #' bb = st_bbox(c(xmin = offset[1] + 2 * res[1], #' ymin = offset[2] + 11 * res[2], #' xmax = offset[1] + 10 * res[1], #' ymax = offset[2] + 3 * res[2]), crs = st_crs(l7)) #' l7[bb] #' # equivalent: #' st_crop(l7, bb) #' #' plot(l7[,1:13,1:13,1], reset = FALSE) #' image(l7[bb,,,1], add = TRUE, col = sf.colors()) #' plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) #' #' # slightly smaller bbox: #' bb = st_bbox(c(xmin = offset[1] + 2.1 * res[1], #' ymin = offset[2] + 10.9 * res[2], #' xmax = offset[1] + 9.9 * res[1], #' ymax = offset[2] + 3.1 * res[2]), crs = st_crs(l7)) #' l7[bb] #' #' plot(l7[,1:13,1:13,1], reset = FALSE) #' image(l7[bb,,,1], add = TRUE, col = sf.colors()) #' plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) #' #' # slightly larger bbox: #' bb = st_bbox(c(xmin = offset[1] + 1.9 * res[1], #' ymin = offset[2] + 11.1 * res[2], #' xmax = offset[1] + 10.1 * res[1], #' ymax = offset[2] + 2.9 * res[2]), crs = st_crs(l7)) #' l7[bb] #' #' plot(l7[,1:13,1:13,1], reset = FALSE) #' image(l7[bb,,,1], add = TRUE, col = sf.colors()) #' plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) #' #' # half a cell size larger bbox: #' bb = st_bbox(c(xmin = offset[1] + 1.49 * res[1], #' ymin = offset[2] + 11.51 * res[2], #' xmax = offset[1] + 10.51 * res[1], #' ymax = offset[2] + 2.49 * res[2]), crs = st_crs(l7)) #' l7[bb] #' #' plot(l7[,1:13,1:13,1], reset = FALSE) #' image(l7[bb,,,1], add = TRUE, col = sf.colors()) #' plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) st_crop.stars = function(x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), as_points = all(st_dimension(y) == 2, na.rm = TRUE), normalize = FALSE) { x = st_upfront(x) # put spatial dimensions up front; https://github.com/r-spatial/stars/issues/457 d = dim(x) dm = st_dimensions(x) args = rep(list(rlang::missing_arg()), length(d)+1) if (inherits(y, c("stars", "sf", "sfc", "bbox")) && st_crs(x) != st_crs(y)) stop("for cropping, the CRS of both objects have to be identical") if (inherits(y, "stars")) { as_points = TRUE y = st_as_sfc(st_bbox(y)) } if (!as.matrix(st_intersects(st_bbox(x), st_bbox(y)))) warning("st_crop: bounding boxes of x and y do not overlap") if (crop && (is_regular_grid(x) || has_rotate_or_shear(x))) { rastxy = attr(dm, "raster")$dimensions xd = rastxy[1] yd = rastxy[2] bb = if (!inherits(y, "bbox")) st_bbox(y) else y if (any(is.na(as.numeric(bb)))) # as.numeric() can go after sf 0.7-5 stop("NA values in bounding box of y") if (epsilon != 0) bb = bb_shrink(bb, epsilon) if (!all(is.na(colrow_from_xy(matrix(bb, 2, byrow = TRUE), dm, NA_outside = TRUE)))) { cr = colrow_from_xy(matrix(bb, 2, byrow = TRUE), dm, NA_outside = FALSE) # FALSE: https://github.com/r-spatial/stars/issues/455 cr[,1] = cr[,1] - dm[[xd]]$from + 1 cr[,2] = cr[,2] - dm[[yd]]$from + 1 for (i in seq_along(d)) { if (names(d[i]) == xd) args[[i+1]] = seq(max(1, cr[1, 1], na.rm = TRUE), min(d[xd], cr[2, 1], na.rm = TRUE)) if (names(d[i]) == yd) { if (dm[[ yd ]]$delta < 0) cr[1:2, 2] = cr[2:1, 2] args[[i+1]] = seq(max(1, cr[1, 2], na.rm = TRUE), min(d[yd], cr[2, 2], na.rm = TRUE)) } } x = eval(rlang::expr(x[!!!args])) } } else if (crop) warning("crop only crops regular grids: maybe use st_warp() first?") if (!inherits(y, "bbox")) { # post-process: burn in geometry mask dxy = attr(dm, "raster")$dimensions xy_grd = if (is_curvilinear(x) || !as_points) # FIXME: for curvilinear as_points should work too! st_as_sfc(st_dimensions(x)[dxy], as_points = as_points, geotransform = st_geotransform(x)) else st_as_sf(do.call(expand.grid, expand_dimensions.stars(x)[dxy]), coords = dxy, crs = st_crs(x)) inside = st_intersects(st_union(y), xy_grd)[[1]] d = dim(x) # cropped x mask = rep(TRUE, prod(d[dxy])) mask[inside] = FALSE mask = array(mask, d) # recycles over dims >= 3 for (i in seq_along(x)) x[[i]][mask] = NA } if (normalize[1]) x = st_normalize(x) x } #' @export st_normalize.stars = function(x, domain = c(0, 0, 1, 1), ...) { stopifnot(all(domain == c(0,0,1,1))) if (has_raster(x)) { x = st_upfront(x) d = st_dimensions(x) if (d[[1]]$from != 1) { d[[1]]$offset = d[[1]]$offset + (d[[1]]$from - 1) * d[[1]]$delta d[[1]]$to = d[[1]]$to - d[[1]]$from + 1 d[[1]]$from = 1 } if (d[[2]]$from != 1) { d[[2]]$offset = d[[2]]$offset + (d[[2]]$from - 1) * d[[2]]$delta d[[2]]$to = d[[2]]$to - d[[2]]$from + 1 d[[2]]$from = 1 } st_stars(x, dimensions = d) } else x } #' @name stars_subset #' @param which character or integer; dimension(s) to be flipped #' @export #' @return \code{st_flip} flips (reverts) the array values along the chosen dimension #' without(s) changing the dimension properties #' @examples #' lc = read_stars(system.file("tif/lc.tif", package = "stars")) #' x = c(orig = lc, #' flip_x = st_flip(lc, "x"), #' flip_y = st_flip(lc, "y"), #' flip_xy = st_flip(lc, c("x", "y")), #' along = 3) #' plot(x) st_flip = function(x, which = 1) { if (is.character(which)) which = match(which, names(dim(x))) stopifnot(all(which %in% seq_along(dim(x)))) dims = lapply(dim(x), seq_len) for (i in which) dims[[ i ]] = rev(dims[[ i ]]) for (i in seq_along(x)) x[[i]] = do.call(`[`, c(list(x[[i]]), dims)) x } stars/R/gt.R0000644000176200001440000000602214576033423012353 0ustar liggesusersget_geotransform = function(x) { r = attr(x, "raster") if (is.null(r)) rep(NA_real_, 6) else { xd = x[[ r$dimensions[1] ]] yd = x[[ r$dimensions[2] ]] as.numeric(c(xd$offset, xd$delta, r$affine[1], yd$offset, r$affine[2], yd$delta)) } } #' get or set the geotransform, or rotation matrix #' @param x object of class stars or dimensions #' @param ... ignored #' @export st_geotransform = function(x, ...) UseMethod("st_geotransform") #' @export st_geotransform.default = function(x, ...) { stop(paste("no st_geotransform method available for objects of class", class(x)[1])) } #' @export st_geotransform.stars = function(x, ...) st_geotransform(st_dimensions(x)) #' @export st_geotransform.dimensions = function(x, ...) get_geotransform(x) #' @export #' @name st_geotransform #' @param value length 6 numeric vector, or 2 x 2 (scaled) rotation matrix `st_geotransform<-` = function(x, value) UseMethod("st_geotransform<-") #' @export #' @name st_geotransform #' @examples #' # using the "classical" rotation matrix, see https://en.wikipedia.org/wiki/Rotation_matrix : #' rot = function(theta, dxdy = c(1., -1.)) { #' th = theta / 180 * pi #' matrix(c(cos(th), sin(th), -sin(th), cos(th)), 2, 2) %*% #' matrix(c(dxdy[2], 0, 0, dxdy[1]), 2, 2) #' } #' l = st_downsample(st_as_stars(L7_ETMs), 9) # save time in plotting #' st_geotransform(l) = rot(20, c(28.5, 28.5)) # clockwise, 20 degrees, scale by cell size #' plot(l[,,,1]) #' m = rot(20, c(1, 2)) #' g = expand.grid(x = 0:4, y = 0:4) #' plot(g[1:2], asp = 1) #' text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4) #' g = t(m %*% t(as.matrix(g))) #' points(g, col = 'red') #' text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4, col = 'red') #' #' m = matrix(1:20, 4) #' s0 = st_as_stars(m) #' s = s0 #' # dy > 0, clockwise rotation: #' st_geotransform(s) = rot(10, c(1,1)) #' plot(s0, reset = FALSE) #' plot(s, add = TRUE) #' # dy < 0, counter clockwise rotation, + expansion in x-direction: #' layout(1) #' s0 = st_as_stars(st_bbox(s0), dx = 1) #' s0$values = 1:20 #' s0 #' plot(s0, reset = FALSE) #' s = s0 #' st_geotransform(s) = rot(10, c(2,1)) #' plot(s, add = TRUE) `st_geotransform<-.stars` = function(x, value) { d = st_dimensions(x) r = attr(d, "raster") # https://gdal.org/tutorials/geotransforms_tut.html if (is.matrix(value)) { # gdal has col-row (pixel-line) order, where linear algebra uses row-col stopifnot(all(dim(value) == c(2, 2))) r$affine = c(value[2,1] * sign(d[[ r$dimensions[1] ]]$delta), value[1,2] * sign(d[[ r$dimensions[2] ]]$delta)) d[[ r$dimensions[1] ]]$delta = value[2,2] * sign(d[[ r$dimensions[1] ]]$delta) d[[ r$dimensions[2] ]]$delta = value[1,1] * sign(d[[ r$dimensions[2] ]]$delta) } else { stopifnot(is.numeric(value), length(value) == 6) d[[ r$dimensions[1] ]]$offset = value[1] d[[ r$dimensions[1] ]]$delta = value[2] r$affine[1] = value[3] d[[ r$dimensions[2] ]]$offset = value[4] r$affine[2] = value[5] d[[ r$dimensions[2] ]]$delta = value[6] } attr(d, "raster") = r st_stars(x, d) } stars/R/mosaic.R0000644000176200001440000000553614604601335013220 0ustar liggesusers#' build mosaic (composite) of several spatially disjoint stars objects #' #' build mosaic (composite) of several spatially disjoint stars objects #' @param .x object of class stars, or character vector with input dataset names #' @param ... further input stars objects #' @param dst character; destination file name; this will be a VRT file with references to the source file(s), see details #' @param options character; options to the gdalbuildvrt command #' @param file_ext character; file extension, determining the format used to write to (".tif" implies GeoTIFF) #' @return the stars method returns a stars object with the composite of the input; the \code{character} method returns the file name of the file with the mosaic; see also the GDAL documentation of \code{gdalbuildvrt} #' @details the gdal function buildvrt builds a mosaic of input images; these input images can be multi-band, but not higher-dimensional data cubes or stars objects with multiple attributes; note that for the `stars` method, the `dst` file may contain references to temporary files that are going to be removed at termination of the R session. #' #' uses \link[sf]{gdal_utils} to internally call \code{buildvrt}; no executables external to R are called. #' @export #' @examples #' x = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) #' x1 = x[,100:200,100:200,] #' x2 = x[,150:300,150:300,] #' plot(st_mosaic(x1, x2)) st_mosaic = function(.x, ...) UseMethod("st_mosaic") #' @export #' @name st_mosaic st_mosaic.stars = function(.x, ..., dst = tempfile(fileext = file_ext), options = c("-vrtnodata", "-9999", "-srcnodata", "nan"), # -srcnodata "nan": see https://github.com/r-spatial/stars/issues/274 file_ext = ".tif") { lst_write = function(obj) { fname = tempfile(fileext = file_ext) write_stars(obj, fname) fname } missing_dst = missing(dst) objs = if (missing(.x)) list(...) else append(list(.x), list(...)) src = sapply(objs, lst_write) st_mosaic(src, dst = dst, file_ext = file_ext, options = options) ret = setNames(read_stars(dst), names(objs[[1]])[1]) if (!inherits(ret, "stars_proxy") && missing_dst) { unlink(src) unlink(dst) } ret } #' @export #' @name st_mosaic st_mosaic.character = function(.x, ..., dst = tempfile(fileext = file_ext), options = c("-vrtnodata", "-9999"), file_ext = ".tif") { sf::gdal_utils("buildvrt", .x, dst, options = options, ...) dst } #' @export #' @name st_mosaic st_mosaic.stars_proxy = function(.x, ..., dst = tempfile(fileext = file_ext), options = c("-vrtnodata", "-9999"), file_ext = ".tif") { if (length(.x) > 1 || length(.x[[1]]) > 1) stop("st_mosaic.stars_proxy only implemented for single-file proxy objects") objs = if (missing(.x)) list(...) else append(list(.x), list(...)) files = sapply(objs, function(sp) sp[[1]]) read_stars(st_mosaic(files, dst = dst, options = options, file_ext = file_ext), proxy = TRUE) } stars/R/sample.R0000644000176200001440000001247114576033423013227 0ustar liggesusersget_index_ranges = function(d, n, offset) { nd = (d - offset) %/% (n + 1) g = do.call(expand.grid, lapply(nd, seq_len)) g = t(apply(g, 1, function(x) offset + 1 + (x - 1) * (n + 1))) dimnames(g) = NULL f = function(x) mapply(seq, x, length.out = n + 1, SIMPLIFY = FALSE) apply(g, 1, f, simplify = FALSE) } # reduce resolution of x, keeping (most of) extent #' @export #' @name st_downsample st_downsample = function(x, n, ...) UseMethod("st_downsample") #' downsample stars or stars_proxy objects #' #' downsample a stars or stars_proxy object either by skipping rows, columns and bands, #' or by computing a single value (e.g. the mean) from the sub-tiles involved #' #' @param x object of class stars or stars_proxy #' @param n integer; for each dimension the number of pixels/lines/bands etc that will be skipped; see Details. #' @param offset integer; offset(s) for downsampling, in pixels, starting at the offset of #' each dimension; should be smaller or equal to \code{n} #' @param FUN function; if given, downsampling will apply FUN to each of the the subtiles #' @param ... arguments passed on to \code{FUN} (e.g., \code{na.rm = TRUE} to ignore missing values if FUN is \code{mean}) #' @details If all n == 0, no downsampling takes place; if it is 1, every second row/column/band #' is skipped, if it is 2, every second+third row/column/band are skipped, etc. #' #' Downsampling a \code{stars_proxy} object returns a \code{stars} object, is #' equivalent to calling \code{st_as_stars(x, downsample = 2)}, and only downsamples #' the first two (x and y) dimensions. #' #' Downsampled regular rasters keep their dimension offsets, have a cell size (delta) that #' is n[i]+1 times larger, and may result in a (slightly) different extent. #' #' Note that terra's \link[terra]{aggregate} with \code{fact=2} corresponds to #' \code{st_downsample(x, n = 1, FUN = mean)}: \code{fact} is one larger than \code{n}. #' @name st_downsample #' @export #' @examples #' (m = matrix(1:121, 11, 11)) #' (s = st_as_stars(m)) #' st_downsample(s, 1) #' st_downsample(s, 1)[[1]] #' st_downsample(s, 1, offset = 1) #' st_downsample(s, 1, offset = 1)[[1]] #' st_downsample(s, 1, offset = c(0,1)) #' st_downsample(s, 1, offset = c(0,1))[[1]] #' st_downsample(s, 1, FUN = mean) #' st_downsample(s, 1, FUN = mean)[[1]] #' st_downsample(s, 1, offset = 1, FUN = mean) #' st_downsample(s, 1, offset = c(0,1), FUN = mean)[[1]] st_downsample.stars = function(x, n, ..., offset = 0, FUN) { d = dim(x) n = rep_len(as.integer(n), length(d)) offset = rep_len(as.integer(offset), length(d)) stopifnot(all(n >= 0), all(offset <= n), all(offset < d)) new_dim = if (! missing(FUN)) (d - offset) %/% (n + 1) else ceiling((d - offset) / (n + 1)) # include last, incomplete tile dims = st_dimensions(x) ix = setNames(vector("list", length(dims)), names(dims)) for (i in seq_along(d)) # need to precompute: ix[[i]] = seq(1 + offset[i], d[i], n[i] + 1) xy = attr(dims, "raster")$dimensions for (i in seq_along(d)) { dims[[i]]$offset = if (offset[i] != 0) dims[[i]]$offset + offset[i] * dims[[i]]$delta else dims[[i]]$offset = dims[[i]]$offset dims[[i]]$delta = dims[[i]]$delta * (n[i] + 1) dims[[i]]$from = 1 dims[[i]]$to = unname(new_dim[i]) if (!is.null(dims[[i]]$values)) { if (is.matrix(dims[[i]]$values) && names(ix)[i] %in% xy) dims[[i]]$values = dims[[i]]$values[ ix[[ xy[1] ]], ix[[ xy[2] ]] ] # speaks for itself else dims[[i]]$values = dims[[i]]$values[ ix[[i]] ] } } if (!all(attr(dims, "raster")$affine == 0.0)) { if (!all(xy %in% names(d)[1:2])) stop("downsampling an affine raster needs to have x/y in dims 1 and 2") attr(dims, "raster")$affine = attr(dims, "raster")$affine * (n[1:2] + 1) } if (all(n == 0)) x else if (!missing(FUN)) { # compute FUN() values over the subtiles: stopifnot(is.function(FUN)) l = get_index_ranges(d, n, offset) x = unclass(x) # so that `[[<-` doesn't go into the stars method, which recycles for (i in seq_along(x)) x[[i]] = structure(sapply(l, function(y) FUN(as.vector(asub(x[[i]], y)), ...)), dim = new_dim) structure(x, class = "stars", dimensions = dims) } else { # downsample using `[`: args = rep(list(rlang::missing_arg()), length(d)+1) for (i in seq_along(d)) if (n[i] > 0) args[[i+1]] = ix[[i]] # i==1 skipped: retain all attributes x = eval(rlang::expr(x[!!!args])) structure(x, dimensions = dims) } } #' @export #' @name st_downsample st_downsample.stars_proxy = function(x, n, ...) { if (length(n) != 2) message("for stars_proxy objects, downsampling only happens for dimensions x and y") st_as_stars(x, downsample = n) } #' @export st_sample.stars = function(x, size, ..., type = "random", replace = FALSE) { if (length(x) > 1) warning("only sampling the first attribute") if (type != "random") warning("only type 'random' supported") v = structure(x[[1]], dim = NULL) if (missing(replace)) replace = size > length(v) v[sample(length(v), size, replace = replace, ...)] } #' @export st_sample.stars_proxy = function(x, size, ..., type = "regular", quiet = TRUE) { if (type != "regular") stop("only type 'regular' for stars_proxy objects supported") # FIXME: tbd d = dim(x) downsampling_rate = c(floor(d[1:2] / sqrt(size)), d[-(1:2)]) if (!quiet) print(downsampling_rate) # nocov st_as_stars(x, downsample = downsampling_rate) # st_sample(st, size, ...) } stars/R/stars.R0000644000176200001440000012377014621476642013114 0ustar liggesuserssplit_strings = function(md, split = "=") { splt = strsplit(md, split) lst = lapply(splt, function(x) if (length(x) <= 1) NA_character_ else x[[2]]) structure(lst, names = sapply(splt, function(x) x[[1]]), class = "gdal_metadata") } .array = function(x, dim) { structure(rep_len(x, prod(dim)), dim = dim) } #' convert objects into a stars object #' #' convert objects into a stars object #' @export #' @param .x object to convert #' @param ... in case \code{.x} is of class \code{bbox}, arguments passed on to #' \link{pretty}. In case \code{.x} is of class \code{nc_proxy}, arguments #' passed on to \code{\link{read_ncdf}}. st_as_stars = function(.x, ...) UseMethod("st_as_stars") #' @name st_as_stars #' @param dimensions object of class dimensions #' @export st_as_stars.list = function(.x, ..., dimensions = NULL) { if (length(.x)) { if (is.null(names(.x))) stop("list should have named elements") for (i in seq_along(.x)[-1]) if (!all(dim(.x[[1]]) == dim(.x[[i]]))) stop("dim attributes not identical") if (!is.null(n <- names(.x)) && (any(n == "") || length(n) != length(unique(n)))) names(.x) = make.names(names(.x), unique = TRUE) # check dimensions, if set: if (!is.null(dimensions)) { dx = dim(.x[[1]]) dd = dim(dimensions) stopifnot(!is.null(dx), !is.null(dd)) for (i in seq_along(dimensions)) { if (dx[i] < dd[i]) { # create_dimension was called with $values one longer than corresponding array dim, v = dimensions[[i]]$values if (is.null(v)) # regularly spaced, meaning offset/delta have replaced $values: dimensions[[i]]$to = dimensions[[i]]$to - 1 else if (length(v) == dx[i] + 1) { # convert the one-too-long values into an intervals object: dimensions[[i]]$values = head(v, -1) dimensions[[i]]$to = dimensions[[i]]$to - 1 } else stop(paste("incorrect length of dimensions values for dimension", i)) dimensions[[i]]$point = FALSE } } } else dimensions = create_dimensions(dim(.x[[1]])) if (is.null(names(dim(.x[[1]])))) for (i in seq_along(.x)) names(dim(.x[[i]])) = names(dimensions) } st_stars(.x, dimensions) } st_stars = function(x, dimensions, class = "stars") { # sanity checks: stopifnot(is.list(x)) stopifnot(inherits(dimensions, "dimensions")) stopifnot(!is.null(attr(dimensions, "raster"))) # for (i in seq_along(x)) # names(dim(x[[i]])) = names(dimensions) structure(x, dimensions = dimensions, class = class) } #' @name st_as_stars #' @export #' @param raster character; the names of the dimensions that denote raster dimensions st_as_stars.default = function(.x = NULL, ..., raster = NULL) { args = if (is.null(.x)) list(...) else append(list(.x), list(...)) if (length(args) == 0) return(st_as_stars(st_bbox())) isdim = sapply(args, inherits, what = "dimensions") dimensions = if (! any(isdim)) { if (is.array(args[[1]]) && !is.null(dimnames(args[[1]]))) st_dimensions(args[[1]]) else do.call(st_dimensions, lapply(dim(args[[1]]), function(x) seq_len(x) - 1)) } else { d = args[[ which(isdim)[1] ]] if (is.null(raster)) raster = attr(d, "raster") d } if (is.null(raster) && !has_sfc(dimensions)) { w = which(sapply(dimensions, function(x) is.null(x$values))) raster = get_raster(dimensions = names(dimensions)[w[1:2]]) } dimensions = create_dimensions(dimensions, raster) if (any(isdim)) args = args[-which(isdim)] if (is.null(names(args))) names(args) = paste0("A", seq_along(args)) for (i in seq_along(args)) names(dim(args[[i]])) = names(dimensions) st_as_stars.list(args, dimensions = dimensions) } #' @param curvilinear only for creating curvilinear grids: named length 2 list holding longitude and latitude matrices or stars arrays, or the names of the corresponding attributes in \code{.x}; the names of this vector should correspond to raster dimensions the matrices are associated with; see Details. #' @param crs object of class \code{crs} with the coordinate reference system of the values in \code{curvilinear}; see details #' @details if \code{curvilinear} is a list with \code{stars} objects with longitude and latitude values, its coordinate reference system is typically not that of the latitude and longitude values. If \code{curvilinear} contains the names of two arrays in \code{.x}, then these are removed from the returned object. #' @export #' @name st_as_stars st_as_stars.stars = function(.x, ..., curvilinear = NULL, crs = st_crs('OGC:CRS84')) { if (is.null(curvilinear)) .x else { stopifnot(names(curvilinear) %in% names(dim(.x))) if (all(sapply(curvilinear, is.character))) curvilinear = unlist(curvilinear) if (is.character(cl <- curvilinear)) { if (!cl[1] %in% names(.x) || !cl[2] %in% names(.x)) stop("curvilinear arrays not present in object") curvilinear = setNames(vector("list", 2), names(curvilinear)) curvilinear[[1]] = .x[ cl[1] ] curvilinear[[2]] = .x[ cl[2] ] .x[[ cl[1] ]] = NULL .x[[ cl[2] ]] = NULL } stopifnot(is.list(curvilinear)) if (inherits(curvilinear[[1]], "stars")) curvilinear[[1]] = curvilinear[[1]][[1]] if (inherits(curvilinear[[2]], "stars")) curvilinear[[2]] = curvilinear[[2]][[1]] dimensions = st_dimensions(.x) xy = names(curvilinear) dimensions[[ xy[1] ]]$values = structure(curvilinear[[1]], dim = setNames(dim(curvilinear[[1]])[1:2], xy)) dimensions[[ xy[2] ]]$values = structure(curvilinear[[2]], dim = setNames(dim(curvilinear[[1]])[1:2], xy)) # erase regular grid coefficients $offset and $delta: dimensions[[ xy[1] ]]$offset = dimensions[[ xy[1] ]]$delta = NA_real_ dimensions[[ xy[2] ]]$offset = dimensions[[ xy[2] ]]$delta = NA_real_ raster = get_raster(dimensions = names(curvilinear), curvilinear = TRUE) st_set_crs(st_stars(.x, create_dimensions(dimensions, raster)), crs) } } pretty_cut = function(lim, n, inside = FALSE, ...) { stopifnot(n > 2) p = pretty(x = lim, n = n, ...) d = diff(p[1:2]) if (! inside) lim = c(lim[1] - 0.5 * d, lim[2] + 0.5 * d) # extended limits half a cell p[p >= lim[1] & p <= lim[2]] } #' @param nx integer; number of cells in x direction; see details #' @param ny integer; number of cells in y direction; see details #' @param nz integer; number of cells in z direction; if missing no z-dimension is created. #' @param dx numeric or object of class units; cell size in x direction; see details #' @param dy numeric or object of class units; cell size in y direction; see details #' @param xlim length 2 numeric vector with extent (min, max) in x direction #' @param ylim length 2 numeric vector with extent (min, max) in y direction #' @param values value(s) to populate the raster values with #' @param n the (approximate) target number of grid cells #' @param pretty logical; should cell coordinates have \link{pretty} values? #' @param inside logical; should all cells entirely fall inside the bbox, potentially not covering it completely (\code{TRUE}), or always cover the bbox (\code{FALSE}), or find a good approximation (\code{NA}, default)? #' @param proxy logical; should a \code{stars_proxy} object be created? (requires gdal_create binary when sf < 1.0-6) #' @details For the \code{bbox} method: if \code{pretty} is \code{TRUE}, raster cells may extend the coordinate range of \code{.x} on all sides. If in addition to \code{nx} and \code{ny}, \code{dx} and \code{dy} are also missing, these are set to a single value computed as \code{sqrt(diff(xlim)*diff(ylim)/n)}. #' #' If \code{nx} and \code{ny} are missing and \code{values} is a matrix, the number of columns and rows of the matrix are taken. #' #' Otherwise, if \code{nx} and \code{ny} are missing, they are computed as the (ceiling, floor, or rounded to integer value) of the ratio of the (x or y) range divided by (dx or dy), depending on the value of \code{inside}. Positive \code{dy} will be made negative. Further named arguments (\code{...}) are passed on to \code{pretty}. If \code{dx} or \code{dy} are \code{units} objects, their value is converted to the units of \code{st_crs(.x)} (only when sf >= 1.0-7). #' #' @export #' @name st_as_stars st_as_stars.bbox = function(.x, ..., nx, ny, dx = dy, dy = dx, xlim = .x[c("xmin", "xmax")], ylim = .x[c("ymin", "ymax")], values = 0., n = 64800, pretty = FALSE, inside = FALSE, nz, proxy = FALSE) { if (xor(missing(nx), missing(ny))) stop("either specify both nx and ny, or none of them") adx = abs(diff(xlim)) ady = abs(diff(ylim)) if (is.matrix(values) && missing(nx) && missing(ny)) { nx = ncol(values) ny = nrow(values) } if (missing(dx) && missing(dy)) { if (missing(nx)) dx = dy = sqrt(adx * ady / n) else { dx = diff(xlim)/nx dy = -diff(ylim)/ny } } else { u <- st_crs(.x)$ud_unit if (inherits(u, "units")) { if (inherits(dx, "units")) units(dx) = u # might convert value if (inherits(dy, "units")) units(dy) = u # might convert value } dx = as.numeric(dx) # drop units if present dy = as.numeric(dy) # drop units if present } consider_inside = function(x, inside) { if (is.na(inside)) round(x) else if (inside) floor(x) else ceiling(x) } if (missing(nx)) nx = consider_inside(diff(xlim) / dx, inside) if (missing(ny)) { if (dy > 0) dy = -dy ny = consider_inside(-diff(ylim) / dy, inside) } if (pretty) { vx = pretty_cut(xlim, nx, inside, ...) nx = length(vx) x = create_dimension(values = vx, refsys = st_crs(.x)) vy = pretty_cut(ylim, ny, inside, ...) ny = length(vy) y = create_dimension(values = vy, refsys = st_crs(.x)) } else { x = create_dimension(from = 1, to = nx, offset = unname(xlim[1]), delta = unname(dx), refsys = st_crs(.x)) y = create_dimension(from = 1, to = ny, offset = unname(ylim[2]), delta = unname(dy), refsys = st_crs(.x)) } if (missing(nz)) { # 2D: if (proxy) { f = tempfile(fileext = ".tif") sf::gdal_create(f, c(nx, ny), values, st_crs(.x), xlim, ylim) read_stars(f, proxy = TRUE) } else st_as_stars(values = .array(values, c(x = nx[[1L]], y = ny[[1L]])), dims = create_dimensions(list(x = x, y = y), get_raster())) } else { stopifnot(proxy == FALSE) z = create_dimension(from = 1, to = nz[[1]]) st_as_stars(values = .array(values, c(x = nx[[1L]], y = ny[[1L]], z = nz[[1]])), dims = create_dimensions(list(x = x, y = y, z = z), get_raster())) } } ## @param x two-column matrix with columns and rows, as understood by GDAL; 0.5 refers to the first cell's centre; xy_from_colrow = function(x, geotransform) { # http://www.gdal.org/classGDALDataset.html , search for geotransform: # 0-based indices: # Xp = geotransform[0] + P*geotransform[1] + L*geotransform[2]; # Yp = geotransform[3] + P*geotransform[4] + L*geotransform[5]; stopifnot(ncol(x) == 2, length(geotransform) == 6, !any(is.na(geotransform))) matrix(geotransform[c(1, 4)], nrow(x), 2, byrow = TRUE) + x %*% matrix(geotransform[c(2, 3, 5, 6)], nrow = 2, ncol = 2) } colrow_from_xy = function(x, obj, NA_outside = FALSE) { if (inherits(obj, "stars")) obj = st_dimensions(obj) xy = attr(obj, "raster")$dimensions if (inherits(obj, "dimensions")) gt = st_geotransform(obj) if (isTRUE(st_is_longlat(st_crs(obj)))) { bb = st_bbox(obj) # see https://github.com/r-spatial/stars/issues/519 where this is problematic; # not sure whether this introduces new problems. # sign = ifelse(x[,1] < bb["xmin"], 1., ifelse(x[,1] > bb["xmax"], -1., 0.)) # x[,1] = x[,1] + sign * 360. # one more try: https://github.com/r-spatial/stars/issues/563 ix = x[,1] > bb["xmax"] & !is.na(x[,1]) x[ix,1] = x[ix,1] - 360. ix = x[,1] < bb["xmin"] & !is.na(x[,1]) x[ix,1] = x[ix,1] + 360. } if (!any(is.na(gt))) { # have geotransform inv_gt = gdal_inv_geotransform(gt) if (any(is.na(inv_gt))) stop("geotransform not invertible") ret = floor(xy_from_colrow(x, inv_gt) + 1.) # will return floating point col/row numbers!! if (NA_outside) ret[ ret[,1] < 1 | ret[,1] > obj[[ xy[1] ]]$to | ret[,2] < 1 | ret[,2] > obj[[ xy[2] ]]$to, ] = NA ret } else if (is_rectilinear(obj)) { ix = obj[[ xy[1] ]]$values if (!inherits(ix, "intervals")) ix = as_intervals(ix, add_last = length(ix) == dim(obj)[ xy[1] ]) cols = find_interval(x[,1], ix) iy = obj[[ xy[2] ]]$values if (!inherits(iy, "intervals")) iy = as_intervals(iy, add_last = length(iy) == dim(obj)[ xy[2] ]) rows = find_interval(x[,2], iy) # always NA_outside cbind(cols, rows) } else if (is_curvilinear(obj)) { stop("colrow_from_xy not supported for curvilinear objects") } else stop("colrow_from_xy not supported for this object") } st_cells_from_row_col = function(x, rows, cols) { nc = dim(x)[1] # ncols (rows - 1) * nc + cols } st_cells_from_xy = function(x, xy) { x = st_upfront(x) cr = colrow_from_xy(xy, x, NA_outside = TRUE) st_cells_from_row_col(x, cr[,2], cr[,1]) } #' return the cell index corresponding to the location of a set of points #' #' If the object has been cropped without normalization, then the indices return #' are relative to the original uncropped extent. See \code{\link{st_crop}} #' @param x object of class \code{stars} #' @param sf object of class \code{sf} or \code{sfc} #' @examples #' set.seed(1345) #' st_bbox(L7_ETMs) |> #' st_as_sfc() |> #' st_sample(10) -> pts #' (x <- st_cells(L7_ETMs, pts)) #' # get the pixel values (first band only): #' st_as_stars(L7_ETMs)[[1]][x] #' # get pixel values for all bands: #' st_as_stars(L7_ETMs) |> split() |> sapply(`[`, x) #' # compare with st_extract(): #' st_as_stars(L7_ETMs) |> split() |> st_extract(pts) #' @export st_cells = function(x, sf) { stopifnot(inherits(x, "stars"), inherits(sf, c("sf", "sfc")), st_crs(x) == st_crs(sf)) st_cells_from_xy(x, st_coordinates(sf)) } has_rotate_or_shear = function(x) { dimensions = st_dimensions(x) if (has_raster(x)) { r = attr(dimensions, "raster") !any(is.na(r$affine)) && any(r$affine != 0.0) } else FALSE } has_raster = function(x) { if (inherits(x, "stars")) x = st_dimensions(x) !is.null(r <- attr(x, "raster")) && all(r$dimensions %in% names(x)) } is_regular_grid = function(x) { has_raster(x) && !(has_rotate_or_shear(x) || is_rectilinear(x) || is_curvilinear(x)) } is_rectilinear = function(x) { d = st_dimensions(x) if (has_raster(x) && !is_curvilinear(x)) { xy = attr(d, "raster")$dimensions dimx = d[[ xy[1] ]] dimy = d[[ xy[2] ]] (is.na(dimx$delta) || is.na(dimy$delta)) && (!regular_intervals(dimx$values) || !regular_intervals(dimy$values)) } else FALSE } is_curvilinear = function(x) { d = st_dimensions(x) has_raster(x) && isTRUE(attr(d, "raster")$curvilinear) } which_sfc = function(x) { if (inherits(x, "stars")) x = st_dimensions(x) which(sapply(x, function(i) inherits(i$values, "sfc"))) } which_time = function(x) { if (inherits(x, "stars")) x = st_dimensions(x) which(sapply(x, function(i) inherits(i$values, c("POSIXct", "Date", "PCICt")) || (is.character(i$refsys) && (i$refsys %in% c("POSIXct", "Date", "PCICt") || grepl("PCICt", i$refsys))))) } #' @export time.stars = function(x, ..., which = 1) { w = which_time(x) if (length(w) > 1 && missing(which)) warning(paste("using the first of", length(w), "time dimensions")) if (length(w) == 0) stop("object does not have a time dimensions") stopifnot(length(which) == 1) expand_dimensions(x)[[ w[which] ]] } has_sfc = function(x) { length(which_sfc(x)) > 0 } #' retrieve coordinates for raster or vector cube cells #' #' retrieve coordinates for raster or vector cube cells #' @param x object of class \code{stars} #' @param add_max logical; if \code{TRUE}, dimensions are given with a min (x) and max (x_max) value #' @param center logical; (only if \code{add_max} is FALSE): should grid cell center coordinates be returned (TRUE) or offset values (FALSE)? \code{center} can be a named logical vector or list to specify values for each dimension. #' @name st_coordinates #' @param ... ignored #' @export st_coordinates.stars = function(x, ..., add_max = FALSE, center = TRUE) { dims = st_dimensions(x) xy = attr(dims, "raster")$dimensions if (is_curvilinear(x)) { x = st_upfront(x) # x and y first... cc = setNames(data.frame(as.vector(dims[[ xy[1] ]]$values), as.vector(dims[[ xy[2] ]]$values)), xy) dims[ xy ] = NULL # remove out = do.call(expand.grid, append(list(ix = seq_len(nrow(cc))), expand_dimensions(dims, center = center))) # cell offsets ix = out$ix out$ix = NULL out = cbind(cc[[1]][ix], cc[[2]][ix], out) names(out)[1:2] = xy out } else if (has_rotate_or_shear(x)) { if (add_max) stop("add_max will not work for rotated/shared rasters") if (isTRUE(!center)) # center = FALSE warning("center values are given for spatial coordinates") d = dim(x) nx = d[ xy[1] ] ny = d[ xy[2] ] setNames(as.data.frame(xy_from_colrow(as.matrix(expand.grid(seq_len(nx), seq_len(ny))) - 0.5, st_geotransform(x))), xy) # gives cell centers } else { if (add_max) { cbind( do.call(expand.grid, expand_dimensions(x, center = FALSE)), # cell offsets setNames(do.call(expand.grid, expand_dimensions(dims[xy], max = TRUE)), paste0(xy, "_max")) ) } else { ed = expand_dimensions(x, center = center) # cell centers for x/y if raster if (length(ed) > 1) do.call(expand.grid, ed) else data.frame(ed) } } } #' @export st_coordinates.dimensions = function(x, ...) { st_coordinates(st_as_stars(list(), dimensions = x), ...) } #' @name st_coordinates #' @export #' @param add_coordinates logical; if `TRUE`, columns with dimension values preceed the array values, #' otherwise they are omitted as.data.frame.stars = function(x, ..., add_max = FALSE, center = NA, add_coordinates = TRUE) { if (add_coordinates) data.frame(st_coordinates(x, add_max = add_max, center = center, ...), lapply(x, function(y) structure(y, dim = NULL))) else as.data.frame(lapply(x, function(y) structure(y, dim = NULL))) } add_units = function(x) { f = function(obj) if (inherits(obj, "units")) paste0("[", enc2utf8(as.character(units(obj))), "]") else "" paste(names(x), sapply(x, f)) } #' print stars or dimensions object #' #' print stars or dimensions object #' @name print_stars #' @param x object of class stars or of class dimensions #' @param n when prod(dim(x)) > 10 * n, the first n cells are used for attribute summary statistics #' @param abbrev number of characters to abbreviate attribute names to #' @param ... passed on to \code{as.data.frame.dimensions} #' @export print.stars = function(x, ..., n = 1e5, abbrev = 30) { shorten = function(s) { if (nchar(s) > abbrev) paste0(substr(s, 1, abbrev - 3), "...") else s } cat("stars object with", length(dim(x)), "dimensions and", length(x), if (length(x) != 1) "attributes\n" else "attribute\n") if (length(x)) { cat("attribute(s)") names(x) = sapply(names(x), shorten) df = if (prod(dim(x)) > 10 * n) { cat(paste0(", summary of first ", n, " cells:\n")) # nocov as.data.frame(lapply(x, function(y) structure(y, dim = NULL)[1:n]), optional = TRUE) # nocov } else { cat(":\n") as.data.frame(lapply(x, function(y) structure(y, dim = NULL)), optional = TRUE) } names(df) = add_units(x) if (all(sapply(x, is.numeric))) { m_summary = function(x) { s = summary(x); if (!"NA's" %in% names(s)) s["NA's"] = 0; s } sums = lapply(df, summary) if (length(unique(lengths(sums))) > 1) sums = lapply(df, m_summary) print(do.call(rbind, sums)) } else print(summary(df)) } cat("dimension(s):\n") print(st_dimensions(x), ...) invisible(x) } #' @export aperm.stars = function(a, perm = NULL, ...) { if (is.null(perm)) perm = rev(seq_along(dim(a))) if (all(perm == seq_along(dim(a))) || isTRUE(all(match(perm, names(dim(a))) == seq_along(dim(a))))) return(a) d = st_dimensions(a) if (is.character(perm)) perm = match(perm, names(d)) st_stars(lapply(a, aperm, perm = perm, ...), d[perm]) } #' @export dim.stars = function(x) { d = st_dimensions(x) if (length(x) == 0) dim(d) else { stopifnot(length(d) == length(dim(x[[1]]))) structure(dim(x[[1]]), names = names(d)) } } propagate_units = function(new, old) { for (i in seq_along(new)) if (inherits(old[[i]], "units")) units(new[[i]]) <- units(old[[i]]) new } setNamesIfnn = function(x, nms) { # set names if not NULL stopifnot(is.character(nms) || is.null(nms)) if (is.null(nms) || length(nms) != length(x)) x else setNames(x, nms) } #' combine multiple stars objects, or combine multiple attributes in a single stars object into a single array #' #' combine multiple stars objects, or combine multiple attributes in a single stars object into a single array #' @param ... object(s) of class \code{star}: in case of multiple arguments, these are combined into a single stars object, in case of a single argument, its attributes are combined into a single attribute. In case of multiple objects, all objects should have the same dimensionality. #' @param along integer; see \link{read_stars} #' @param try_hard logical; if \code{TRUE} and some arrays have different dimensions, combine those that dimensions matching to the first array #' @param tolerance numeric; values used in \link{all.equal} to compare dimension values #' combine those that dimensions matching to the first array #' @param nms character; vector with array names #' @returns a single \code{stars} object with merged (binded) arrays. #' @details An error is raised when attempting to combine arrays with different #' measurement units into a single array. If this was intentded, \code{drop_units} #' can be used to remove units of a \code{stars} object before merging. #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' (new = c(x, x)) #' c(new) # collapses two arrays into one with an additional dimension #' c(x, x, along = 3) c.stars = function(..., along = NA_integer_, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps)) { dots = list(...) if (!all(sapply(dots, inherits, "stars"))) stop("all arguments to c() should be stars objects") if (any(sapply(dots, inherits, "stars_proxy"))) stop("convert stars_proxy objects to stars first using st_as_stars()") if (length(dots) == 1 && length(along) == 1 && missing(along)) dots[[1]] else if (length(along) == 1 && is.na(along)) { # Case 1: merge attributes of several objects by simply putting them together in a single stars object; # dim does not change: if (identical_dimensions(dots, tolerance = tolerance)) st_as_stars(setNamesIfnn(do.call(c, lapply(dots, unclass)), nms), dimensions = st_dimensions(dots[[1]])) else { # currently catches only the special case of ... being a broken up time series: along = sort_out_along(dots) if (!is.na(along)) do.call(c, c(dots, along = along)) else if (!try_hard) stop("don't know how to merge arrays: please specify parameter along") else { d = lapply(dots, st_dimensions) ident = c(TRUE, sapply(d[-1], identical, d[[1]])) if (!all(ident)) { warning(paste( "ignored subdataset(s) with dimensions different from first subdataset:", paste(which(!ident), collapse = ", "), "\nuse gdal_subdatasets() to find all subdataset names")) if (!is.null(nms)) nms = nms[ident] } st_as_stars(setNamesIfnn(do.call(c, lapply(dots[ident], unclass)), nms), dimensions = st_dimensions(dots[[1]])) } } } else { if (is.list(along)) { # custom ordering of ... over dimension(s) with values specified if (prod(lengths(along)) != length(dots)) stop("number of objects does not match the product of lenghts of the along argument", call. = FALSE) # abind all: d = st_dimensions(dots[[1]]) ret = mapply(abind, ..., along = length(d) + 1, SIMPLIFY = FALSE) # make dims: newdim = c(dim(dots[[1]]), lengths(along)) ret = lapply(ret, function(x) { dim(x) = newdim; x }) ret = propagate_units(ret, dots[[1]]) # make dimensions: for (i in seq_along(along)) d[[ names(along)[i] ]] = create_dimension(values = along[[i]]) st_as_stars(ret, dimensions = d) } else { # loop over attributes, abind them: # along_dim: the number of the dimension along which we merge arrays d = st_dimensions(dots[[1]]) along_dim = if (is.character(along)) { along_dim = which(along == names(d)) if (length(along_dim) == 0) length(d) + 1 else along_dim } else along stopifnot_identical_units(dots) ret = propagate_units(mapply(abind, ..., along = along_dim, SIMPLIFY = FALSE), dots[[1]]) dims = combine_dimensions(dots, along_dim) if (along_dim == length(d) + 1) names(dims)[along_dim] = if (is.character(along)) along else "new_dim" st_as_stars(ret, dimensions = dims) } } } stopifnot_identical_units = function(lst) { a1 = lst[[1]][[1]] for (i in seq_along(lst[-1])) { ai = lst[[i+1]][[1]] if (inherits(a1, "units") && !identical(units(a1), units(ai))) stop("cannot merge subarrays with different units") } TRUE } #' @export adrop.stars = function(x, drop = which(dim(x) == 1), ..., drop_xy = FALSE) { if (missing(drop) && !drop_xy) { # hanlde drop_xy: by default, don't drop x/y d = st_dimensions(x) xy = attr(d, "raster")$dimensions drop = setdiff(drop, match(xy, names(d))) } if (is.logical(drop)) drop = which(drop) if (any(dim(x) > 1) && length(drop) > 0) { l = vector("list", length = length(x)) f = sapply(x, is.factor) l[!f] = lapply(x[!f], adrop, drop = drop, one.d.array = TRUE, ...) l[f] = lapply(x[f], function(x) structure(x, dim = dim(x)[-drop])) st_as_stars(setNames(l, names(x)), dimensions = st_dimensions(x)[-drop]) } else x } #' @export st_bbox.default = function(obj, ...) { if (!missing(obj)) stop(paste("no st_bbox method available for object of class", class(obj))) obj = st_sfc(st_point(c(-180,-90)), st_point(c(180, 90)), crs = st_crs('OGC:CRS84')) st_bbox(obj) } #' @export st_bbox.dimensions = function(obj, ...) { if (has_raster(obj)) { # raster r = attr(obj, "raster") x = obj[[ r$dimensions[1] ]] y = obj[[ r$dimensions[2] ]] bb = if (is.null(x$values) && is.null(y$values)) { gt = st_geotransform(obj) if (length(gt) == 6 && !any(is.na(gt))) { bb = rbind(c(x$from - 1, y$from - 1), c(x$to, y$from - 1), c(x$to, y$to), c(x$from - 1, y$to)) xy = xy_from_colrow(bb, gt) c(xmin = min(xy[,1]), ymin = min(xy[,2]), xmax = max(xy[,1]), ymax = max(xy[,2])) } else c(xmin = x$from - 0.5, ymin = y$from - 0.5, xmax = x$to + 0.5, ymax = y$to + 0.5) } else { if (is_curvilinear(obj)) c(xmin = min(x$values, na.rm = TRUE), ymin = min(y$values, na.rm = TRUE), xmax = max(x$values, na.rm = TRUE), ymax = max(y$values, na.rm = TRUE)) else { rx = range(x) # dispatches into range.dimension ry = range(y) c(xmin = rx[1], ymin = ry[1], xmax = rx[2], ymax = ry[2]) } } structure(bb, crs = st_crs(x$refsys), class = "bbox") } else { if (! has_sfc(obj)) stop("dimensions table does not have x & y, nor an sfc dimension") # nocov ix = which_sfc(obj) if (length(ix) > 1) warning("returning the bounding box of the first geometry dimension") st_bbox(obj[[ ix[1] ]]$values) } } #' @export st_bbox.stars = function(obj, ...) { st_bbox(st_dimensions(obj), ...) } #' set bounding box parameters of regular grid #' @param x object of class dimensions, stars or stars_proxy #' @param value object of class bbox #' @param ... ignored #' @export st_set_bbox = function(x, value, ...) UseMethod("st_set_bbox") #' @export st_set_bbox.dimensions = function(x, value, ...) { stopifnot(inherits(value, "bbox"), is_regular_grid(x)) xy = attr(x, "raster")$dimensions if (x[[ xy[1] ]]$from != 1 || x[[ xy[2] ]]$from != 1) stop("use st_normalize first so that dimensions start at index 1") d = dim(x) xsign = sign(x[[ xy[1] ]]$delta) ysign = sign(x[[ xy[2] ]]$delta) x[[ xy[1] ]]$offset = ifelse(xsign < 0, value[["xmax"]], value[["xmin"]]) x[[ xy[2] ]]$offset = ifelse(ysign < 0, value[["ymax"]], value[["ymin"]]) x[[ xy[1] ]]$delta = xsign * (value[["xmax"]] - value[["xmin"]]) / d[[ xy[1] ]] x[[ xy[2] ]]$delta = ysign * (value[["ymax"]] - value[["ymin"]]) / d[[ xy[2] ]] if (!is.na(st_crs(value))) st_crs(x) = st_crs(value) x } #' @export st_set_bbox.stars = function(x, value, ...) { structure(x, dimensions = st_set_bbox(st_dimensions(x), value)) } #' @export st_set_bbox.stars_proxy = function(x, value, ...) { structure(x, dimensions = st_set_bbox(st_dimensions(x), value)) } #' @export st_crs.stars = function(x, ...) { st_crs(st_dimensions(x), ...) } #' @export st_crs.dimensions = function(x, ...) { xy = attr(x, "raster")$dimensions if (!all(is.na(xy))) st_crs(x[[ xy[1] ]]$refsys) else if (has_sfc(x)) # search for simple features: st_crs(x[[ which_sfc(x)[1] ]]$values) else NA_crs_ } #' @export `st_crs<-.stars` = function(x, value) { structure(x, dimensions = st_set_crs(st_dimensions(x), value)) } #' @export `st_crs<-.dimensions` = function(x, value) { value = if (is.na(value)) NA_crs_ else if (is.numeric(value) || is.character(value)) st_crs(value) else if (inherits(value, "crs")) value else stop(paste("crs of class", class(value), "not recognized")) # set CRS in dimensions: xy = attr(x, "raster")$dimensions if (!all(is.na(xy))) { # has x/y spatial dimensions: x[[ xy[1] ]]$refsys = value x[[ xy[2] ]]$refsys = value } if (!all(is.na(xy)) && !is.na(x[[ xy[1] ]]$refsys) && !is.na(value) && st_crs(x) != value) warning("replacing CRS does not reproject data: use st_transform, or st_warp to warp to a new CRS") # set crs of sfc's, if any: for (j in which_sfc(x)) { x[[ j ]]$refsys = value st_crs(x[[ j ]]$values) = value } x } #' @export st_geometry.stars = function(obj,...) { if (!has_sfc(obj)) stop("stars object does not have a simple feature dimension") d = st_dimensions(obj) d[[ which_sfc(obj) ]]$values } # make sure asub works for factor too: #' @export asub.factor = function(x, idx, dims, drop = NULL, ...) { l = levels(x) x = unclass(x) ret = NextMethod() structure(ret, class = class(x), levels = l) } #' @name merge #' @aliases split #' @param f the name or index of the dimension to split; by default the last dimension #' @param drop ignored #' @details split.stars works on the first attribute, and will give an error when more than one attribute is present #' @export split.stars = function(x, f = length(dim(x)), drop = TRUE, ...) { if (length(x) > 1) { l = lapply(seq_along(x), function(i) split(x[i], f, drop = drop, ...)) do.call(c, setNames(l, names(x))) } else { d = st_dimensions(x) if (is.character(f)) f = which(names(d) == f) ret = lapply(seq_len(dim(x)[f]), function(y) asub(x[[1]], y, f, drop = TRUE)) nm = if (!is.null(d[[f]]$values)) d[[f]]$values else make.names(seq_along(ret)) st_as_stars(setNames(ret, nm), dimensions = d[-f]) } } #' merge or split stars object #' #' merge attributes into a dimension, or split a dimension over attributes #' @param x object of class \code{stars} #' @param y needs to be missing #' @param name name for the new dimension #' @param ... if defined, the first unnamed argument is used for dimension values, if not defined, attribute names are used for dimension values #' @returns merge merges attributes of a stars object into a new dimension; split splits a dimension over attributes #' @name merge #' @export merge.stars = function(x, y, ..., name = "attributes") { dots = list(...) if (!missing(y)) stop("argument y needs to be missing: merging attributes of x") old_dim = st_dimensions(x) out = st_redimension(x, name = name) new_dim = if (length(dots)) create_dimension(values = dots[[1]]) else create_dimension(values = names(x)) dims = setNames(c(old_dim, list(new_dim)), make.unique(c(names(old_dim), name))) d = create_dimensions(dims, raster = attr(old_dim, "raster")) if (!is.null(names(dots))) names(d)[length(d)] = names(dots) st_stars(out, dimensions = d) # overwrite dimensions of out } sort_out_along = function(ret) { d1 = st_dimensions(ret[[1]]) d2 = st_dimensions(ret[[2]]) if ("time" %in% names(d1) && (isTRUE(d1$time$offset != d2$time$offset) || !any(d1$time$values %in% d2$time$values))) "time" else NA_integer_ } #' @export is.na.stars = function(x, ...) { st_as_stars(lapply(x, is.na), dimensions = st_dimensions(x)) } #' redimension array, or collapse attributes into a new dimension #' #' redimension array, or collapse attributes into a new dimension #' @name redimension #' @export st_redimension = function(x, new_dims, along, ...) UseMethod("st_redimension") #' @export #' @name redimension #' @param x object of class \code{stars} #' @param new_dims target dimensions: either a `dimensions` object or an integer vector with the dimensions' sizes #' @param along named list with new dimension name and values #' @param name character name of the new dimension #' @param ... ignored st_redimension.stars = function(x, new_dims = st_dimensions(x), along = setNames(list(names(x)), name), ..., name = "new_dim") { d = st_dimensions(x) if (inherits(new_dims, "dimensions")) { di = dim(new_dims) } else { di = new_dims new_dims = create_dimensions(di) } if (!isTRUE(all.equal(di, dim(x), check.attributes = FALSE))) { if (prod(dim(x)) != prod(di)) stop("product of dim(new_dim) does not match that of x") for (i in seq_len(min(length(di), length(dim(x))))) if (di[i] == dim(x)[i]) { new_dims[[i]] = d[[i]] names(new_dims)[i] = names(d[i]) } x = unclass(x) raster = attr(d, "raster") if (all(raster$dimensions %in% names(new_dims))) attr(new_dims, "raster") = raster for (i in seq_along(x)) dim(x[[i]]) = di st_stars(x, dimensions = new_dims) } else { # collapse attributes into dimension if (length(x) == 1) # only one attribute: do nothing x else { new_dim = create_dimension(values = along[[1]]) dims = create_dimensions(c(d, new_dim = list(new_dim)), attr(d, "raster")) if (length(names(along)) == 1) names(dims)[names(dims) == "new_dim"] = names(along) ret = structure(do.call(c, x), dim = dim(dims)) st_stars(setNames(list(ret), paste(names(x), collapse = ".")), dimensions = dims) } } } #' @export "$<-.stars" = function(x, i, value) { x[[i]] = value x } #' @export "[[<-.stars" = function(x, i, value) { if (!is.null(value)) { if (prod(dim(x)) %% length(value) != 0) { # error: if (is.null(dim(value))) stop(paste("replacement has length", length(value), ", data has dim", paste(dim(x), collapse = ", "))) else stop(paste("replacement has dim", paste(dim(value), collapse = ", "), ", data has dim", paste(dim(x), collapse = ", "))) } if (inherits(value, "stars")) { stopifnot(length(value) == 1) value = value[[1]] } value = if (inherits(value, c("factor", "POSIXct"))) structure(rep(value, length.out = prod(dim(x))), dim = dim(x), colors = attr(value, "colors"), rgba = attr(value, "rgba"), exclude = attr(value, "exclude")) else if (!is.array(value) || !isTRUE(all.equal(dim(value), dim(x), check.attributes = FALSE))) array(value, dim(x)) else value } NextMethod() } st_upfront = function(x, first = attr(st_dimensions(x), "raster")$dimensions) { if (!is.character(first)) first = names(st_dimensions(x))[first] if (!any(is.na(first))) aperm(x, c(first, setdiff(names(st_dimensions(x)), first))) else x } #' @export st_area.stars = function(x, ...) { crs = st_crs(x) if (is.na(crs)) message("Missing coordinate reference system: assuming Cartesian coordinates") d = st_dimensions(st_upfront(x))[1:2] a = if (isTRUE(st_is_longlat(x)) || is_curvilinear(x)) st_area(st_as_sfc(x, as_points = FALSE)) # has units else { a = if (is_regular_grid(x)) d[[1]]$delta * d[[2]]$delta else { # rectilinear: x = if (inherits(d[[1]]$values, "intervals")) d[[1]]$values else as_intervals(d[[1]]$values) y = if (inherits(d[[2]]$values, "intervals")) d[[2]]$values else as_intervals(d[[2]]$values) apply(do.call(cbind, x), 1, diff) %o% apply(do.call(cbind, y), 1, diff) } if (!is.na(crs)) units::set_units(abs(a), paste0(crs$units, "^2"), mode = "standard") else abs(a) } lst = if (inherits(a, "units")) list(area = `units<-`(array(a, dim(d)), units(a))) else list(area = array(a, dim(d))) st_stars(lst, dimensions = d) } #' @export drop_units.stars = function(x) { try_drop_units = function(x) { if (inherits(x, "units")) units::drop_units(x) else x } st_stars(lapply(x, try_drop_units), dimensions = st_dimensions(x)) } #' Predict values, given a model object, for a stars or stars_proxy object #' @export #' @name predict.stars #' @param object object of class `stars` #' @param model model object of a class that has a predict method; check with `methods(class = class(object))` #' @param drop_dimensions logical; if `TRUE`, remove dimensions (coordinates etc) from `data.frame` with predictors #' @param ... arguments passed on to this predict method #' @details separate predictors in object need to be separate attributes in object; #' in case they are e.g. in a band dimension, use `split(object)` predict.stars = function(object, model, ..., drop_dimensions = FALSE) { obj_df = as.data.frame(st_as_stars(object)) if (drop_dimensions) obj_df = obj_df[-seq_along(dim(object))] na_ids = which(is.na(obj_df), arr.ind = TRUE) # identify rows with NA's in the predictors obj_df[na_ids] = 0 # fill with something valid (e.g. 0) pr = try(predict(model, obj_df, ...), silent = TRUE) has_method = function(generic, cls) { m = row.names(attr(methods(generic), "info")) cls %in% substring(m, nchar(generic) + 2, 1e4) } if (inherits(pr, "try-error") && !has_method("predict", class(model))) stop(paste("No predict method found for objects of class", class(model))) if (inherits(pr, "try-error")) { # https://github.com/r-spatial/stars/issues/448 m = paste0("prediction on array(s) `", paste(names(object), collapse = ","), "' failed; will try to split() dimension `", tail(names(dim(object)), 1), "' over attributes") message(m) predict(split(object), model, ..., drop_dimensions = drop_dimensions) # returns } else { if (!inherits(pr, "data.frame")) pr = if (is.null(colnames(pr))) data.frame(prediction = pr) else as.data.frame(pr) pr[unique(data.frame(na_ids)[,1]), ] = NA # Mask with original NA's st_stars(lapply(pr, function(y) structure(y, dim = dim(object))), st_dimensions(object)) } } #' create an array with dimension values #' #' create an array with dimension values #' @param x object of class \code{stars} #' @param which integer; indices of the dimensions to address (default: all) #' @return \code{stars} object with dimension values as attributes #' @export #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x1 = read_stars(tif) #' (x = st_dim_to_attr(x1)) #' plot(x) #' (x = st_dim_to_attr(x1, 2:3)) #' plot(x) #' (x= st_dim_to_attr(x1, 3)) #' plot(x) st_dim_to_attr = function(x, which = seq_along(dim(x))) { d = dim(x) l = vector("list", length = length(which)) e = expand_dimensions(x) for (i in seq_along(which)) { l [[i]] = if (is.null(dim(e[[i]]))) { dp = c(which[i], setdiff(seq_along(dim(x)), which[i])) aperm(array(e[[ which[i] ]], d[dp]), order(dp)) } else # curvilinear: array(e[[i]], d) } st_stars(setNames(l, names(d)[which]), st_dimensions(x)) } #' @export st_interpolate_aw.stars = function(x, to, extensive, ...) { ret = sf::st_interpolate_aw(st_as_sf(x), to, extensive, ...) geom = attr(ret, "sf_column") dx = dim(x) if (length(dx) > 2 && length(x) == 1 && length(ret) > 2) { ret = merge(st_as_stars(ret)) nd = names(st_dimensions(x)) ret = st_set_dimensions(ret, seq_along(dx), names = c(geom, paste0(nd[-(1:2)], collapse = "."))) setNames(ret, names(x)) } else ret } #' get the raster type (if any) of a stars object #' @param x object of class \code{stars} #' @param dimension optional: numbers or names of dimension(s) to get per-dimension type #' @return if \code{dimension} is not specified, return the spatial raster type: #' one of \code{NA} (if the object does not have raster dimensions), #' \code{"curvilinear"}, \code{"rectilinear"}, \code{"affine"}, or \code{"regular"}. #' In case dimension(s) are specified, return one of \code{"regular"}, \code{"rectilinear"} #' (irregular but numeric), or \code{"discrete"} (anything else). #' @details categories \code{"curvilinear"} and \code{"affine"} only refer to #' the relationship between a pair of spatial (raster) dimensions. #' @examples #' tif = system.file("tif/L7_ETMs.tif", package = "stars") #' x = read_stars(tif) #' st_raster_type(x) #' st_raster_type(x, 1:3) #' @export st_raster_type = function(x, dimension = character(0)) { stopifnot(inherits(x, "stars")) if (!missing(dimension)) stopifnot(all(dimension >= 1), all(dimension <= length(dim(x)))) dimension_type = function(d) { if (!any(is.na(c(d$offset, d$delta)))) "regular" else if (!is.null(d$values) && is.numeric(d$values) && is.matrix(d$values)) "curvilinear" else if (!is.null(d$values) && is.numeric(d$values)) "rectilinear" else "discrete" } if (length(dimension)) sapply(st_dimensions(x)[dimension], dimension_type) else if (!has_raster(x)) NA_character_ else if (is_curvilinear(x)) "curvilinear" else if (is_rectilinear(x)) "rectilinear" else if (has_rotate_or_shear(x)) "affine" else "regular" } #' obtain (spatial) resolution of a stars object #' #' obtain resolution(s) of a stars object: by default only the (absolute) x/y raster dimensions, optionally all \code{delta} dimension parameters #' @param x an object of class \code{stars} #' @param all logical; if FALSE return a vector with the x/y raster resolution #' @param absolute logical; only works when \code{all = FALSE}; if TRUE return absolute resolution values, if FALSE return \code{delta} values #' @returns if \code{all = FALSE} a vector with x/y raster resolutions, otherwise a list with delta values #' @examples #' st_res(L7_ETMs) #' st_res(L7_ETMs, absolute = FALSE) #' st_res(L7_ETMs, all = TRUE) #' if (require(starsdata)) { #' paste0("netcdf/", c("avhrr-only-v2.19810901.nc", #' "avhrr-only-v2.19810902.nc", #' "avhrr-only-v2.19810903.nc", #' "avhrr-only-v2.19810904.nc")) |> #' system.file(package = "starsdata") |> #' read_stars(quiet = TRUE) -> x #' st_res(x) |> print() #' st_res(x, all = TRUE) |> print() #' } #' @export st_res = function(x, all = FALSE, absolute = !all) { stopifnot(inherits(x, "stars")) d = st_dimensions(x) l = lapply(d, `[[`, "delta") if (!all) { xy = attr(d, "raster")$dimensions l = unlist(l[xy]) if (absolute) l = abs(l) } l } stars/R/dimensions.R0000644000176200001440000006755114576033423014127 0ustar liggesusers#' get dimensions from stars object #' @name st_dimensions #' @export #' @param .x object to retrieve dimensions information from #' @param ... further arguments #' @param value new object of class \code{dimensions}, with matching dimensions #' @return the \code{dimensions} attribute of \code{x}, of class \code{dimensions} st_dimensions = function(.x, ...) UseMethod("st_dimensions") #' @export #' @name st_dimensions st_dimensions.stars = function(.x, ...) attr(.x, "dimensions") #' @export st_dimensions.dimensions = function(.x, ...) .x #' @export #' @name st_dimensions `st_dimensions<-` = function(x, value) UseMethod("st_dimensions<-") #' @export #' @name st_dimensions #' @param x object of class \code{dimensions} `st_dimensions<-.stars` = function(x, value) { stopifnot(inherits(value, "dimensions"), length(x) && all(dim(x[[1]]) == dim(value))) st_stars(x, value) } #' @export #' @name st_dimensions `st_dimensions<-.stars_proxy` = function(x, value) { if (!is.null(attr(x, "call_list"))) stop("st_dimensions<- on a stars_proxy object only works if there is no call list") structure(NextMethod(), class = class(x)) } #' @export #' @name st_dimensions `st_dimensions<-.list` = function(x, value) { st_as_stars(x, dimensions = value) } #' @export #' @name st_dimensions st_dimensions.array = function(.x, ...) { if (length(list(...)) > 0) stop("only one argument expected") dn = dimnames(.x) # raster? r = if (all(c("x", "y") %in% names(dn))) get_raster(affine = c(0.0, 0.0), dimensions = c("x", "y"), curvilinear = FALSE) else get_raster(affine = c(0.0, 0.0), dimensions = rep(NA_character_, 2), curvilinear = FALSE) ret = if (is.null(dn)) st_dimensions(list(.x)) # default else # try to get dimension names and default values from dimnames(.x): create_dimensions(lapply(dn, function(y) create_dimension(values = y)), r) if (is.null(names(ret)) || any(names(ret) == "")) names(ret) = make.names(seq_along(ret)) ret } #' @export st_dimensions.matrix = st_dimensions.array #' @export #' @name st_dimensions #' @param .raster length 2 character array with names (if any) of the raster dimensions #' @param affine numeric; specify parameters of the affine transformation #' @param cell_midpoints logical; if \code{TRUE} AND the dimension values are strictly regular, the values are interpreted as the cell midpoint values rather than the cell offset values when calculating offset (i.e., the half-cell-size correction is applied); can have a value for each dimension, or else is recycled #' @param point logical; does the pixel value (measure) refer to a point (location) value or to an pixel (area) summary value? #' @details dimensions can be specified in two ways. The simplest is to pass a vector with numeric values for a numeric dimension, or character values for a categorical dimension. Parameter \code{cell_midpoints} is used to specify whether numeric values refer to the offset (start) of a dimension interval (default), or to the center; the center case is only available for regular dimensions. For rectilinear numeric dimensions, one can specify either a vector with cell borders (start values), or a data.frame with two columns named "start" and "end", with the respective interval start and end values. In the first case, the end values are computed from the start values by assuming the last two intervals have equal width. #' st_dimensions.default = function(.x, ..., .raster, affine = c(0, 0), cell_midpoints = FALSE, point = FALSE) { d = list(...) if (! missing(.x)) d = append(list(.x), d) if (missing(.raster)) { .raster = if (all(c("x", "y") %in% names(d)) && is.numeric(d$x) && is.numeric(d$y)) c("x", "y") else rep(NA_character_, 2) } create_dimensions(mapply(create_dimension, values = d, is_raster = cell_midpoints, point = point, SIMPLIFY = FALSE), raster = get_raster(dimensions = .raster, affine = affine)) } #' @name st_dimensions #' @param which integer or character; index or name of the dimension to be changed #' @param values values for this dimension (e.g. \code{sfc} list-column), or length-1 \code{dimensions} object; setting special value \code{NULL} removes dimension values, for instance to remove curvilinear raster coordinates #' @param names character; vector with new names for all dimensions, or with the single new name for the dimension indicated by \code{which} #' @param xy length-2 character vector; (new) names for the \code{x} and \code{y} raster dimensions #' @export #' @examples #' x = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) #' # Landsat 7 ETM+ band semantics: https://landsat.gsfc.nasa.gov/the-enhanced-thematic-mapper-plus/ #' # set bands to values 1,2,3,4,5,7: #' (x1 = st_set_dimensions(x, "band", values = c(1,2,3,4,5,7), names = "band_number", point = TRUE)) #' # set band values as bandwidth #' rbind(c(0.45,0.515), c(0.525,0.605), c(0.63,0.69), c(0.775,0.90), c(1.55,1.75), c(2.08,2.35)) %>% #' units::set_units("um") -> bw # or: units::set_units(µm) -> bw #' # set bandwidth midpoint: #' (x2 = st_set_dimensions(x, "band", values = 0.5 * (bw[,1]+bw[,2]), #' names = "bandwidth_midpoint", point = TRUE)) #' # set bandwidth intervals: #' (x3 = st_set_dimensions(x, "band", values = make_intervals(bw), names = "bandwidth")) st_set_dimensions = function(.x, which, values = NULL, point = NULL, names = NULL, xy, ...) { d = st_dimensions(.x) if (!missing(which) && is.character(which)) which = match(which, base::names(d)) if (! missing(values)) { if (is.na(which)) stop("which should be a name or index of an existing dimensions") if (inherits(values, "units") && names(d)[which] %in% attr(d, "raster")$xy && !is.na(st_crs(.x))) stop("units in x/y dimension values only allowed if object has no CRS") if (inherits(values, "dimensions")) { if (is.null(names)) names <- names(values) values <- values[[1]]$values } if (!is.null(values) && !inherits(values, "intervals") && dim(.x)[which] != length(values)) { if (dim(.x)[which] == length(values) - 1) # create intervals: values = as_intervals(values) else stop(paste("length of values (", length(values), ") does not match length of dimension", which, "(", dim(.x)[which], ")")) } if (is.null(values)) d[[which]]["values"] = list(NULL) # avoid removing element values else d[[which]] = create_dimension(values = values, point = point %||% d[[which]]$point, ...) r = attr(d, "raster") if (isTRUE(r$curvilinear)) { # FIXME: there's much more that should be checked for curvilinear grids... # https://github.com/r-spatial/stars/issues/460 if (base::names(d)[which] %in% r$dimensions && !any(sapply(d, function(v) is.matrix(v$values)))) { attr(d, "raster")$curvilinear = FALSE st_crs(d) = NA } } # else if (inherits(values, "sfc")) # base::names(d)[which] = "sfc" } if (!is.null(point) && is.logical(point)) { d[[which]]$point = point } if (! missing(xy)) { if (is.null(xy) || (length(xy) == 1 && is.na(xy))) xy = c(NA, NA) stopifnot(length(xy) == 2) r = attr(d, "raster") r$dimensions = as.character(xy) attr(d, "raster") = r } if (!missing(names)) { if (length(d) != length(names) && length(names) != 1) stop("length of names should match number of dimensions") r = attr(d, "raster") if (length(d) == length(names)) { # handle names in raster attribute, #46 # problematic again in #379 if (any(!is.na(r$dimensions))) r$dimensions = names[match(r$dimensions, names(d))] new_names = names } else { # replace the name of dimension `which`, #354 if (names(d)[which] %in% r$dimensions) r$dimensions[match(names(d)[which], r$dimensions)] = names new_names = names(d) new_names[which] = names } attr(d, "raster") = r base::names(d) = new_names } if (length(list(...))) d[[which]] = create_dimension(from = 1, to = dim(.x)[which], ...) if (inherits(.x, "stars_proxy")) structure(.x, dimensions = d) else st_as_stars(unclass(.x), dimensions = d) } #' @name st_dimensions #' @param where character, one of 'start', 'center' or 'end'. Set to NA (default) to ignore and use \code{max} and \code{center} explictly. This argument provides a convenient alternative to setting \code{max} and \code{center}. #' @param max logical; if \code{TRUE} return the end, rather than the beginning of an interval #' @param center logical; if \code{TRUE} return the center of an interval; if \code{NA} return the center for raster dimensions, and the start of intervals in other cases #' @export #' @examples #' m = matrix(1:20, nrow = 5, ncol = 4) #' dim(m) = c(x = 5, y = 4) # named dim #' (s = st_as_stars(m)) #' st_get_dimension_values(s, 'x', where = "start") #' st_get_dimension_values(s, 'x', center = FALSE) #' st_get_dimension_values(s, 'x', where = "center") #' st_get_dimension_values(s, 'x', center = TRUE) #' st_get_dimension_values(s, 'x', where = "end") #' st_get_dimension_values(s, 'x', max = TRUE) st_get_dimension_values = function(.x, which, ..., where = NA, max = FALSE, center = NA) { if ((!is.numeric(which) && !is.character(which)) || length(which) != 1) stop("argument which should be a length 1 dimension index or name") # nocov if (!is.na(where)){ w = tolower(where[1]) if (w == 'center'){ max = FALSE center = TRUE } else if (w == 'start'){ max = FALSE center = FALSE } else if (w == 'end'){ max = TRUE center = NA } else { stop("where, if not NA, must be 'start', 'center' or 'end': ", where) } } expand_dimensions(.x, ..., max = max, center = center)[[which]] } #' @export "[.dimensions" = function(x, i, j,..., drop = FALSE) { raster = attr(x, "raster") ret = unclass(x)[i] if (isTRUE(all(raster$dimensions %in% names(ret)))) create_dimensions(ret, raster) else create_dimensions(ret) # drop raster } regular_intervals = function(x, epsilon = 1e-10) { if (length(x) <= 1) FALSE else { ud = if (is.atomic(x) && (is.numeric(x) || inherits(x, c("POSIXt", "Date", "PCICt")))) unique(diff(x)) else { if (inherits(x, "intervals") && identical(tail(x$end, -1), head(x$start, -1))) x$end - x$start else return(FALSE) } isTRUE(as.numeric(abs(diff(range(ud)) / mean(ud))) < epsilon) } } create_dimension = function(from = 1, to, offset = NA_real_, delta = NA_real_, refsys = NA_character_, point = NA, values = NULL, is_raster = FALSE) { example = NA if (! is.null(values)) { # figure out from values whether we have sth regular: from = 1 to = length(values) if (!(is.character(values) || is.factor(values)) && is.atomic(values)) { if (! all(is.finite(values))) warning("dimension value(s) non-finite") else { if (regular_intervals(values)) { offset = values[1] if (length(values) > 1) { delta = diff(values[1:2]) # shift half grid cell size if x or y raster dim cell midpoints: if (is_raster) offset = offset - 0.5 * delta } values = NULL example = offset } else example = values } } if (inherits(values, "intervals")) example = values$start # refsys: if (inherits(example, "POSIXct")) refsys = "POSIXct" else if (inherits(example, "Date")) refsys = "Date" else if (inherits(example, "PCICt")) refsys = paste0("PCICt_", attr(example, "cal")) else if (inherits(example, "units")) refsys = "udunits" if (inherits(values, "sfc")) { point = inherits(values, c("sfc_POINT", "sfc_MULTIPOINT")) if (!is.na(st_crs(values)) && is.na(refsys)) # inherit: refsys = st_crs(values) } if (is.numeric(values) && (is.na(point) || !point)) { values = if (is_raster) set_dimension_values(centers = values) else set_dimension_values(start = values) } } structure(list(from = unname(from), to = unname(to), offset = unname(offset), delta = unname(delta), refsys = refsys, point = unname(point), values = values), class = "dimension") } create_dimensions = function(lst, raster = NULL) { if (is.numeric(lst)) # when called with a dim(array) argument: lst = setNames(lapply(seq_along(lst), function(i) create_dimension(from = 1, to = lst[i])), names(lst)) if (is.null(names(lst))) names(lst) = make.names(seq_along(lst)) if (any(names(lst) == "")) { sel = which(names(lst) == "") names(lst)[sel] = make.names(seq_along(sel)) } if (is.null(raster)) structure(lst, raster = get_raster(dimensions = c(NA_character_, NA_character_)), class = "dimensions") else { d = structure(lst, raster = raster, class = "dimensions") rd = raster$dimensions if (identical(d[[rd[1]]]$refsys, "udunits") && identical(d[[rd[2]]]$refsys, "udunits")) { deg = units(as_units("degree")) ux = units(d[[rd[1]]]) uy = units(d[[rd[2]]]) u1 = units(units::as_units("1")) if (inherits(ux, "symbolic_units") && inherits(uy, "symbolic_units") && (!identical(ux, u1) && !identical(uy, u1)) && units::ud_are_convertible(ux, deg) && units::ud_are_convertible(uy, deg)) { d[[rd[1]]] = drop_units(d[[rd[1]]]) d[[rd[2]]] = drop_units(d[[rd[2]]]) d[[rd[1]]]$refsys = d[[rd[2]]]$refsys = st_crs('OGC:CRS84') # specifies units } } d } } get_crs = function(pr) { if (!is.null(pr$crs)) pr$crs else if (!is.null(pr$wkt)) # newer sf, but GDAL < 3.0.0 st_crs(pr$wkt) else if (!is.null(pr$proj_wkt)) st_crs(pr$proj_wkt) else st_crs(NA) } create_dimensions_from_gdal_meta = function(dims, pr) { #if (all(is.na(pr$geotransform))) # pr$geotransform = c(0.0, 1.0, 0.0, 0.0, 0.0, -1.0) # some GTiffs... lst = vector("list", length(dims)) names(lst) = names(dims) for (i in names(lst)) { lst[[i]] = switch(i, x = create_dimension(from = pr$cols[1], to = pr$cols[2], offset = pr$geotransform[1], delta = pr$geotransform[2], point = pr$point, refsys = get_crs(pr)), y = create_dimension(from = pr$rows[1], to = pr$rows[2], offset = pr$geotransform[4], delta = pr$geotransform[6], point = pr$point, refsys = get_crs(pr)), # default: create_dimension(from = 1, to = dims[i]) # time? depth+units? To be filled in later... ) } if (! is.null(pr$dim_extra)) { # netcdf... for (d in names(pr$dim_extra)) { refsys = if (inherits(pr$dim_extra[[d]], "POSIXct")) "POSIXct" else if (inherits(pr$dim_extra[[d]], "PCICt")) "PCICt" else NA_character_ de = pr$dim_extra[[d]] diff.de = diff(de) lst[[d]] = if (length(unique(diff.de)) <= 1) { delta = if (length(diff.de)) diff.de[1] else NA_real_ create_dimension(from = 1, to = length(de), offset = de[1], delta = delta, refsys = refsys) } else create_dimension(from = 1, to = length(de), values = de, refsys = refsys) } lst[["band"]] = NULL } # handle band descriptions, if present: if (!is.null(lst$band) && !is.null(pr$descriptions) && all(pr$descriptions != "")) lst$band$values = pr$descriptions else if (!is.null(pr$band_meta)) { bm = unlist(pr$band_meta) if (any(a <- grepl("DESCRIPTION=", bm)) && length(which(a)) > 1) lst$band$values = substring(bm[a], 13) } # set up raster: raster = get_raster(affine = pr$geotransform[c(3,5)], dimensions = c("x", "y"), curvilinear = FALSE, blocksizes = pr$blocksizes) create_dimensions(lst, raster) } get_raster = function(affine = rep(0, 2), dimensions = c("x", "y"), curvilinear = FALSE, blocksizes = NULL) { if (any(is.na(affine))) affine = c(0, 0) if (!is.null(blocksizes)) colnames(blocksizes) = dimensions # columns, rows! structure(list(affine = affine, dimensions = dimensions, curvilinear = curvilinear, blocksizes = blocksizes), class = "stars_raster") } #' @export print.stars_raster = function(x, ...) { if (any(is.na(x$affine))) cat(paste("affine parameters:", x$affine[1], x$affine[2], "\n")) else if (any(x$affine != 0.0)) cat(paste("sheared raster with parameters:", format(x$affine[1], ...), format(x$affine[2], ...), "\n")) if (x$curvilinear) cat("curvilinear grid\n") invisible(x) } get_val = function(pattern, meta) { i = grep(pattern, meta) if (length(i)) strsplit(meta[i], "=")[[1]][2] else NA_character_ } get_pcict = function(values, unts, calendar) { stopifnot(calendar %in% c("360_day", "365_day", "noleap")) if (!requireNamespace("PCICt", quietly = TRUE)) stop("package PCICt required, please install it first") # nocov origin = 0:1 units(origin) = try_as_units(unts) delta = if (grepl("months", unts)) { # for these calendars, length of months are different from udunits representation if (calendar == "360_day") set_units(30 * 24 * 3600, "s", mode = "standard") else set_units((365./12) * 24 * 3600, "s", mode = "standard") } else set_units(as_units(diff(as.POSIXct(origin))), "s", mode = "standard") origin_txt = as.character(as.POSIXct(origin[1])) PCICt::as.PCICt(values * as.numeric(delta), calendar, origin_txt) } parse_netcdf_meta = function(pr, name) { meta = pr$meta spl = strsplit(name, ":")[[1]] # "C:\..." results in length 2: name = if (length(spl) < 3) # name is not the variable, but the file name; FIXME: how to make it the variable? "zzzzz40163a99980" # bogus string, to avoid match else tail(spl, 1) # last one contains # longname: pr$long_name = get_val(paste0(get_val("NC_GLOBAL#variable_id", meta), "#long_name"), meta) # unit: pr$units = get_val(paste0(name, "#units"), meta) # extra dims: NETCDF_DIM_EXTRA={time,zlev} val = get_val("NETCDF_DIM_EXTRA", meta) if (! is.na(val)) { val = substr(val, 2, nchar(val)-1) # e.g. "{time,depth}" removes { } val = strsplit(val, ",")[[1]] if (length(val)) { pr$dim_extra = vector("list", length(val)) names(pr$dim_extra) = val for (v in val) { rhs = get_val(paste0("NETCDF_DIM_", v, "_VALUES"), meta) if (!is.na(rhs)) { rhs = strsplit(gsub("[\\{\\}]" , "", rhs), ",") pr$dim_extra[[v]] = as.numeric(rhs[[1]]) } else { rhs = get_val(paste0("NETCDF_DIM_", v), meta) # nocov # FIXME: find example? pr$dim_extra[[v]] = as.numeric(rhs) # nocov } cal = get_val(paste0(v, "#calendar"), meta) u = get_val(paste0(v, "#units"), meta) if (! is.na(u)) { if (v %in% c("t", "time") && !is.na(cal) && cal %in% c("360_day", "365_day", "noleap")) pr$dim_extra[[v]] = get_pcict(pr$dim_extra[[v]], u, cal) else { units(pr$dim_extra[[v]]) = try_as_units(u) if (v %in% c("t", "time") && !inherits(try(as.POSIXct(pr$dim_extra[[v]]), silent = TRUE), "try-error")) pr$dim_extra[[v]] = as.POSIXct(pr$dim_extra[[v]]) } } } pr$dim_extra = rev(pr$dim_extra) } } pr } try_as_units = function(u) { un = try(suppressWarnings(as_units(u)), silent = TRUE) if (inherits(un, "try-error")) # try without ^: un = try(suppressWarnings(as_units(gsub("^", "", u, fixed = TRUE))), silent = TRUE) if (inherits(un, "try-error")) # try without ** un = try(suppressWarnings(as_units(gsub("**", "", u, fixed = TRUE))), silent = TRUE) if (inherits(un, "try-error")) { warning(paste("ignoring unrecognized unit:", u), call. = FALSE) NULL } else un } parse_gdal_meta = function(properties) { point = get_val("AREA_OR_POINT", properties$meta) properties$point = switch(point, Area=FALSE, Point=TRUE, NA) properties } #' expand the dimension values into a list #' #' expand the dimension values into a list #' @param x object of class `stars` or `dimensions` #' @param ... ignored #' @export expand_dimensions = function(x, ...) UseMethod("expand_dimensions") #' @export expand_dimensions.stars = function(x, ...) { expand_dimensions(st_dimensions(x), ...) } #' @export #' @name expand_dimensions #' @param max logical; if `TRUE` return the max (end) values of the dimensions intervals #' @param center logical; if `TRUE` return the center values of intervals, otherwise return offset (start) of intervals; if `NA` (default) return centers for x/y dimensions, offsets for all others expand_dimensions.dimensions = function(x, ..., max = FALSE, center = NA) { # returns, in case of numeric dimensions: # center = TRUE: return center values for x and y coordinates, interval start values otherwise # center = FALSE: return start values # center = NA: return centers for x/y raster, otherwise start values # add_max = TRUE: add in addition to x and y start values an x_max and y_max end values if (length(center) == 1) center = setNames(rep(center, length(x)), names(x)) if (length(max) == 1) max = setNames(rep(max, length(x)), names(x)) if (is.list(max)) max = unlist(max) if (is.list(center)) center = unlist(center) if (any(max & center, na.rm = TRUE)) stop("only one of max and center can be TRUE, not both") where = setNames(rep(0.0, length(x)), names(x)) # offset for (i in seq_along(x)) { if (max[i]) where[i] = 1.0 if (isTRUE(center[i])) where[i] = 0.5 } dimensions = x xy = attr(x, "raster")$dimensions gt = st_geotransform(x) lst = vector("list", length(dimensions)) names(lst) = names(dimensions) if (! is.null(xy) && all(!is.na(xy))) { # we have raster: where defaulting to 0.5 where[xy] = ifelse(!max[xy] & (is.na(center[xy]) | center[xy]), 0.5, where[xy]) if (xy[1] %in% names(lst)) # x lst[[ xy[1] ]] = get_dimension_values(dimensions[[ xy[1] ]], where[[ xy[1] ]], gt, "x") if (xy[2] %in% names(lst)) # y lst[[ xy[2] ]] = get_dimension_values(dimensions[[ xy[2] ]], where[[ xy[2] ]], gt, "y") } if ("crs" %in% names(lst)) lst[[ "crs" ]] = dimensions[[ "crs" ]]$values for (nm in setdiff(names(lst), c(xy, "crs"))) # non-xy, non-crs dimensions lst[[ nm ]] = get_dimension_values(dimensions[[ nm ]], where[[nm]], NA, NA) lst } #' @export dim.dimensions = function(x) { if (is_curvilinear(x)) setNames(sapply(x, function(x) { x$to - x$from + 1 } ), names(x)) else lengths(expand_dimensions(x)) # FIXME: optimise? } #' @name print_stars #' @param digits number of digits to print numbers #' @param usetz logical; used to format \code{PCICt} or \code{POSIXct} values #' @param stars_crs maximum width of string for CRS objects #' @param all logical; if \code{TRUE} print also fields entirely filled with \code{NA} or \code{NULL} #' @export as.data.frame.dimensions = function(x, ..., digits = max(3, getOption("digits")-3), usetz = TRUE, stars_crs = getOption("stars.crs") %||% 28, all = FALSE) { mformat = function(x, ..., digits) { if (inherits(x, c("PCICt", "POSIXct"))) format(x, ..., usetz = usetz) else format(x, digits = digits, ...) } abbrev_dim = function(y) { if (length(y$values) > 3 || (inherits(y$values, "sfc") && length(y$values) > 2)) { y$values = if (is.array(y$values)) paste0("[", paste(dim(y$values), collapse = "x"), "] ", mformat(min(y$values), digits = digits), ",...,", mformat(max(y$values), digits = digits)) else if (inherits(y$values[[1]], "crs")) paste0(format(y$values[[1]]), ",...,", format(y$values[[length(y$values)]])) else if (inherits(y$values, "sfc")) paste0(format(y$values[[1]], width = stars_crs), ",...,", format(y$values[[length(y$values)]], width = stars_crs)) else paste0(format(head(y$values, 1)), ",...,", format(tail(y$values, 1))) } if (is.na(y$refsys)) y$refsys = NA_character_ else if (nchar(tail(format(y$refsys), 1)) > stars_crs) y$refsys = paste0(substr(tail(format(y$refsys), 1), 1L, stars_crs - 3), "...") y } lst = lapply(x, abbrev_dim) lst = lapply(lst, function(x) sapply(x, mformat, digits = digits)) ret = data.frame(do.call(rbind, lst), stringsAsFactors = FALSE) if (! all) { # remove fields entirely NA or NULL: if (all(ret$offset == "NA")) ret$offset = NULL if (all(ret$delta == "NA")) ret$delta = NULL if (all(ret$refsys == "NA")) ret$refsys = NULL if (all(ret$point == "NA")) ret$point = NULL if (all(ret$values == "NULL")) ret$values = NULL } r = attr(x, "raster") if (! any(is.na(r$dimensions))) { ret$raster = rep("", nrow(ret)) ret[r$dimensions[1], "raster"] = "[x]" ret[r$dimensions[2], "raster"] = "[y]" names(ret)[ncol(ret)] = "x/y" } ret } #' @name print_stars #' @export print.dimensions = function(x, ...) { ret = as.data.frame(x, ...) print(ret) print(attr(x, "raster")) invisible(x) } identical_dimensions = function(lst, ignore_resolution = FALSE, tolerance = 0) { if (length(lst) > 1) { d1 = attr(lst[[1]], "dimensions") for (i in 2:length(lst)) { di = attr(lst[[i]], "dimensions") if (ignore_resolution) { for (j in seq_along(d1)) d1[[j]]$delta = d1[[j]]$to = NA_real_ for (j in seq_along(di)) di[[j]]$delta = di[[j]]$to = NA_real_ attr(d1, "raster")$blocksizes = NULL attr(di, "raster")$blocksizes = NULL } if (! isTRUE(all.equal(d1, di, tolerance = tolerance, check.attributes = FALSE))) return(FALSE) } } TRUE } #' @export all.equal.dimensions = function(target, current, ..., ignore_blocksizes = TRUE) { if (ignore_blocksizes) { attr(target, "raster")$blocksizes = NULL attr(current, "raster")$blocksizes = NULL } NextMethod() } combine_dimensions = function(dots, along, check_dims_identical = TRUE) { dims = st_dimensions(dots[[1]]) if (along > length(dims)) { if (length(dots) > 1 && check_dims_identical) { for (i in 2:length(dots)) if (! isTRUE(all.equal(dims, st_dimensions(dots[[i]])))) stop(paste("dimensions of element", 1, "and", i, "are not identical")) } dims[[along]] = create_dimension(from = 1, to = length(dots), values = names(dots)) } else { offset = lapply(dots, function(x) attr(x, "dimensions")[[along]]$offset) if (any(is.na(offset))) { # concatenate values if non-NULL: dims[[along]]$from = 1 dims[[along]]$to = sum(sapply(dots, function(x) { d = st_dimensions(x)[[along]]; d$to - d$from + 1} )) if (!is.null(dims[[along]]$values)) dims[[along]]$values = do.call(c, lapply(dots, function(x) attr(x, "dimensions")[[along]]$values)) } else { values = do.call(c, lapply(dots, function(y) st_get_dimension_values(y, along))) dims[[along]] = create_dimension(values = values) } } dims } #' @export seq.dimension = function(from, ..., center = FALSE) { # does what expand_dimensions also does, for single dimension get_dimension_values(from, where = ifelse(center, 0.5, 0.0), NA, what = NA_character_) } #' @export `[.dimension` = function(x, i, ...) { if (!missing(i)) { if (!is.null(x$values) && !is.matrix(x$values)) x$values = x$values[i] if (!is.na(x$from)) { rang = x$from:x$to # valid range if (!all(is.na(i)) && max(i, na.rm = TRUE) > -1 && min(i, na.rm = TRUE) < 0) stop("cannot mix positive and negative indexes") if (is.logical(i)) i = which(i) else if (all(i < 0)) i = setdiff(rang, abs(i)) # subtract if (!any(is.na(i)) && all(diff(i) == 1)) { if (max(i) > length(rang)) stop("invalid range selected") sel = rang[i] x$from = min(sel) x$to = max(sel) } else { # invalidate offset & delta x$delta = x$offset = NA x$from = 1 x$to = length(i) } } } x } #' @export `[<-.dimensions` = function(x, i, value) { # stopifnot(length(i) == length(value)) if (!is.null(value)) create_dimensions(NextMethod(), raster = attr(x, "raster")) else NextMethod() } #' @export dimnames.stars = function(x) { names(st_dimensions(x)) } #' @export `dimnames<-.stars` = function(x, value) { for (i in seq_along(x)) names(dim(x[[i]])) = value names(attr(x, "dimensions")) = value x } #' @export as.POSIXct.stars = function(x, ...) { d = st_dimensions(x) e = expand_dimensions(d) for (i in seq_along(d)) { p = try(as.POSIXct(e[[i]]), silent = TRUE) if (!inherits(p, "try-error")) d[[i]] = create_dimension(values = p) } structure(x, dimensions = d) } #' @export drop_units.dimension = function(x) { du = function(y) { if (inherits(y, "units")) units::drop_units(y) else if (inherits(y, "intervals")) { y$start = du(y$start) y$end = du(y$end) y } else y } if (!is.null(x$offset)) x$offset = du(x$offset) if (!is.null(x$delta)) x$delta = du(x$delta) if (!is.null(x$values)) x$values = du(x$values) x } #' @export units.dimension = function(x) { if (inherits(x$offset, "units")) units(x$offset) else if (inherits(x$delta, "units")) units(x$delta) else if (inherits(x$values, "units")) units(x$values) else if (inherits(x$values$start, "units")) units(x$values$start) else NULL } stars/R/sp.R0000644000176200001440000000426714576556631012407 0ustar liggesusersstars_to_Spatial = function(from) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") #nocov geom = if (has_raster(from)) { from = st_normalize(from) if (length(dim(from)) > 2) stop("stars object must have two (raster: x, y) dimensions") if (!is_regular_grid(from)) stop("only regular rasters can be converted to Spatial") d = st_dimensions(from) xy = attr(d, "raster")$dimensions if (!all(match(xy, names(d)) == 1:2)) stop("x/y dimensions should be at pos 1 and 2") offset = c( d[[ 1 ]]$offset, d[[ 2 ]]$offset ) delta = c( d[[ 1 ]]$delta, d[[ 2 ]]$delta ) cells.dim = dim(from) if (delta[1] < 0) stop("negative x cell size not supported") if (delta[2] > 0) stop("only negative y delta supported") cellcentre.offset = setNames(c(offset[1] + 0.5 * delta[1], offset[2] + (cells.dim[2] - 0.5) * delta[2]), xy) gt = sp::GridTopology(cellcentre.offset, abs(delta), cells.dim) sp::SpatialGrid(gt, as(st_crs(d), "CRS")) } else { if (!has_sfc(from)) stop("no feature dimension in stars object") as(st_dimensions(from)[[1]]$values, "Spatial") } if (length(from) == 0) geom else sp::addAttrToGeom(geom, as.data.frame(lapply(from, function(y) structure(y, dim = NULL))), match.ID = FALSE) } setAs("stars", "Spatial", stars_to_Spatial) #' @export st_as_stars.Spatial = function(.x, ...) { if (!requireNamespace("sp", quietly = TRUE)) stop("package sp required, please install it first") # nocov if (sp::gridded(.x)) { sp::fullgrid(.x) = TRUE gt = sp::gridparameters(.x) # st_as_stars(raster::stack(.x)) --- we can do better # UL corner: x = create_dimension(1, gt$cells.dim[1], offset = gt$cellcentre.offset[1] - 0.5 * gt$cellsize[1], delta = gt$cellsize[1], refsys = st_crs(.x)) y = create_dimension(1, gt$cells.dim[2], offset = gt$cellcentre.offset[2] + (gt$cells.dim[2] - 0.5) * gt$cellsize[2], delta = -gt$cellsize[2], refsys = st_crs(.x)) d = create_dimensions(list(x = x, y = y), raster = get_raster(dimensions = c("x", "y"))) lst = lapply(.x@data, function(x, dims) structure(x, dim = dims), dims = dim(d)) st_stars(lst, d) } else st_as_stars(st_as_sf(.x)) } stars/demo/0000755000176200001440000000000013777653456012361 5ustar liggesusersstars/demo/udf_demo.R0000644000176200001440000000406213777653456014270 0ustar liggesuserslibrary(stars) library(xts) x.orig = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) x = x.orig (x = st_set_dimensions(x, 3, Sys.Date() + 1:6)) (x = st_set_dimensions(x, 3, names = c("x", "y", "time"))) x = as.xts(x) x[1:3,1:5] y = st_as_stars(x) # has other dimensions collapsed y = st_as_stars(x, dimensions = st_dimensions(x.orig)[c("band","x","y")]) setNames(y, "L7_ETMs.tif") %>% aperm(c(2,3,1)) -> yy all.equal(yy, x.orig) # xts -> equal-sized xts (reverse order) f1 = function(x) { xts(as.matrix(x)[rev(seq_len(nrow(x))),], index(x)) } # xts -> single number (compute time mean) f2 = function(x) { apply(x, 2, mean) } # xts -> multiple numbers (return mean and variance) f3 = function(x) { apply(x, 2, function(x) c(mean = mean(x), var = var(x))) } # xts -> monthly maxima f4 = function(x, by = "months") { a = aggregate(x, cut(index(x), breaks = by), max) xts(as.matrix(a), as.POSIXct(index(a))) } # univariate examples: x = xts(1:5, Sys.Date() + 1:5) f1(x) f2(x) f3(x) x = xts(rnorm(50), Sys.Date() + 1:50) f4(x, "weeks") # multivariate examples, only working on time: x = xts(cbind(1:5,5:1,runif(5)), Sys.Date() + 1:5) f1(x) f2(x) f3(x) x = xts(cbind(rnorm(50), runif(50)), Sys.Date() + 1:50) f4(x) # running them on a 4-d cube: # create 4-dimensional cube: x/y/band/time c(x.orig, 2*x.orig, 3*x.orig, 4*x.orig, along = "time") %>% st_set_dimensions(4, Sys.Date()+1:4) -> d4 d4 # apply a time reducer to a 4d cube, either dropping time, or adding a new dimension reduce_4d_time_xts = function(x, f, time = "time", ...) { out = f(as.xts(x), ...) t = which(names(dim(x)) == time) if (!is.null(dim(out))) { out = t(out) dim(out) = c(dim(x)[-t], new = prod(dim(out))/prod(dim(x)[-t])) st_as_stars(list(x = out)) # but this looses all the dimension metadata } else { # f() returns a vector, not a matrix dim(out) = dim(x)[-t] st_as_stars(list(x = out), dimensions = st_dimensions(x)[-t]) } } reduce_4d_time_xts(d4, f2) reduce_4d_time_xts(d4, f1) reduce_4d_time_xts(d4, f3) # reduce_4d_time_xts(d4[,1:20,1:20], f4, by = "days") -->> takes ages!! stars/demo/00Index0000644000176200001440000000016213777653456013512 0ustar liggesusersspacetime examples from the spacetime package, redone with stars udf_demo demo scripts for (possible) openEO udfs stars/demo/spacetime.R0000644000176200001440000000227713777653456014466 0ustar liggesuserslibrary(stars) # wind: library(gstat) data(wind) library(sp) library(sf) wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) locs = st_as_sf(wind.loc, coords = c("x", "y"), crs = st_crs(4326)) # match order: data = as.data.frame(t(wind[,-c(1:3)])) data$geom = st_geometry(locs[match(names(wind)[-c(1:3)], locs$Code),]) wind_ = st_sf(data) wind.st = merge(st_as_stars(wind_), times = ISOdate(wind$year+1900, wind$month, wind$day, 0)) plot(wind.st) # Produc: data(Produc, package = "plm") library(maps) states = st_as_sf(map('state', plot=FALSE, fill=TRUE))[-8,] yrs = 1970:1986 #time = as.POSIXct(paste(yrs, "-01-01", sep=""), tz = "GMT") Pr = lapply(Produc[order(Produc[2], Produc[1]),-(1:3)], matrix, nrow = nrow(states)) (Produc.st = st_as_stars(Pr, dimensions = st_dimensions(sfc = st_geometry(states[-8]), times = yrs))) plot(Produc.st[1], max.plot = 17) plot(Produc.st[2], max.plot = 17) # gridded example: library(gstat) example(krigeST) library(stars) s = st_as_stars(DE_kriged) stplot(DE_kriged,scales=list(draw=T)) plot(s, axes = TRUE) f = as(s, "STFDF") # roundtrip: summary(f@data - DE_kriged@data) stars/vignettes/0000755000176200001440000000000014644756275013442 5ustar liggesusersstars/vignettes/stars1.Rmd0000644000176200001440000003260614644756215015324 0ustar liggesusers--- title: "1. introduction" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{1. introduction} %\VignetteEncoding{UTF-8} %\VignetteEngine{knitr::rmarkdown} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") ev = suppressWarnings(require(starsdata, quietly = TRUE)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` Package `stars` provides infrastructure for _data cubes_, array data with labeled dimensions, with emphasis on arrays where some of the dimensions relate to time and/or space. Spatial data cubes are arrays with one or more spatial dimensions. Raster data cubes have at least two spatial dimensions that form the raster tesselation. Vector data cubes have at least one spatial dimension that may for instance reflect a polygon tesselation, or a set of point locations. Conversions between the two (rasterization, polygonization) are provided. Vector data are represented by simple feature geometries (packages `sf`). Tidyverse methods are provided. The `stars` package is loaded by ```{r} library(stars) ``` Spatiotemporal arrays are stored in objects of class `stars`; methods for class `stars` currently available are ``` {r} methods(class = "stars") ``` (tidyverse methods are only visible after loading package `tidyverse`). # Reading a satellite image We can read a satellite image through GDAL, e.g. from a GeoTIFF file in the package: ```{r} tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) plot(x, axes = TRUE) ``` We see that the image is geographically referenced (has coordinate values along axes), and that the object returned (`x`) has three dimensions called `x`, `y` and `band`, and has one attribute: ```{r} x ``` Each dimension has a name; the meaning of the fields of a single dimension are: |*field* |*meaning* | |--------|------------------------------------------------------------| | from | the origin index (1) | | to | the final index (dim(x)[i]) | | offset | the start value for this dimension (pixel boundary), if regular | | delta | the step (pixel, cell) size for this dimension, if regular | | refsys | the reference system, or proj4string | | point | logical; whether cells refer to points, or intervals | | values | the sequence of values for this dimension (e.g., geometries), if irregular | This means that for an index i (starting at $i=1$) along a certain dimension, the corresponding dimension value (coordinate, time) is $\mbox{offset} + (i-1) \times \mbox{delta}$. This value then refers to the start (edge) of the cell or interval; in order to get the interval middle or cell centre, one needs to add half an offset. Dimension `band` is a simple sequence from 1 to 6. Since bands refer to colors, one could put their wavelength values in the `values` field. For this particular dataset (and most other raster datasets), we see that delta for dimension `y` is negative: this means that consecutive array values have decreasing $y$ values: cell indexes increase from top to bottom, in the direction opposite to the $y$ axis. `read_stars` reads all bands from a raster dataset, or optionally a subset of raster datasets, into a single `stars` array structure. While doing so, raster values (often UINT8 or UINT16) are converted to double (numeric) values, and scaled back to their original values if needed if the file encodes the scaling parameters. The data structure `stars` is a generalization of the `tbl_cube` found in `cubelyr`; we can convert to that by ```{r eval=ev} library(cubelyr) as.tbl_cube(x) ``` but this will cause a loss of certain properties (cell size, reference system, vector geometries) ## Switching attributes to dimensions and back ```{r} (x.spl = split(x, "band")) merge(x.spl) ``` We see that the newly created dimension lost its name, and the single attribute got a default name. We can set attribute names with `setNames`, and dimension names and values with `st_set_dimensions`: ```{r} merge(x.spl) |> setNames(names(x)) |> st_set_dimensions(3, values = paste0("band", 1:6)) |> st_set_dimensions(names = c("x", "y", "band")) ``` ## Subsetting Besides the `tidyverse` subsetting and selection operators explained in [this vignette](stars3.html), we can also use `[` and `[[`. Since `stars` objects are a list of `array`s with a metadata table describing dimensions, list extraction (and assignment) works as expected: ```{r} class(x[[1]]) dim(x[[1]]) x$two = 2 * x[[1]] x ``` At this level, we can work with `array` objects directly. The `stars` subset operator `[` works a bit different: its * first argument selects attributes * second argument selects the first dimension * third argument selects the second dimension, etc Thus, ```{r} x["two", 1:10, , 2:4] ``` selects the second attribute, the first 10 columns (x-coordinate), all rows, and bands 2-4. Alternatively, when `[` is given a single argument of class `sf`, `sfc` or `bbox`, `[` will work as a crop operator: ```{r} circle = st_sfc(st_buffer(st_point(c(293749.5, 9115745)), 400), crs = st_crs(x)) plot(x[circle][, , , 1], reset = FALSE) plot(circle, col = NA, border = 'red', add = TRUE, lwd = 2) ``` ## Overviews We can read rasters at a lower resolution when they contain so-called overviews. For this GeoTIFF file, they were created with the `gdaladdo` utility, in particular ``` gdaladdo -r average L7_ETMs.tif 2 4 8 16 ``` which adds coarse resolution versions by using the _average_ resampling method to compute values based on blocks of pixels. These can be read by ```{r} x1 = read_stars(tif, options = c("OVERVIEW_LEVEL=1")) x2 = read_stars(tif, options = c("OVERVIEW_LEVEL=2")) x3 = read_stars(tif, options = c("OVERVIEW_LEVEL=3")) dim(x1) dim(x2) dim(x3) par(mfrow = c(1, 3), mar = rep(0.2, 4)) image(x1[,,,1]) image(x2[,,,1]) image(x3[,,,1]) ``` # Reading a raster time series: NetCDF Another example is when we read raster time series model outputs in a NetCDF file, e.g. by ```{r eval=ev} system.file("nc/bcsd_obs_1999.nc", package = "stars") |> read_stars() -> w ``` We see that ```{r eval=ev} w ``` For this dataset we can see that * variables have units associated (and a wrong unit, `C` is assigned to temperature) * time is now a dimension, with proper units and time steps Alternatively, this dataset can be read using `read_ncdf`, as in ```{r} system.file("nc/bcsd_obs_1999.nc", package = "stars") |> read_ncdf() ``` The difference between `read_ncdf` and `read_stars` for NetCDF files is that the former uses package RNetCDF to directly read the NetCDF file, where the latter uses the GDAL driver for NetCDF files. ## Reading datasets from multiple files Model data are often spread across many files. An example of a 0.25 degree grid, global daily sea surface temperature product is found [here](https://psl.noaa.gov/data/gridded/data.noaa.oisst.v2.highres.html); the subset from 1981 used below was downloaded from a NOAA ftp site that is no longer available in this form. (ftp site used to be eclipse.ncdc.noaa.gov/pub/OI-daily-v2/NetCDF/1981/AVHRR/). We read the data by giving `read_stars` a vector with character names: ```{r eval=ev} x = c( "avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc" ) # see the second vignette: # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") file_list = system.file(paste0("netcdf/", x), package = "starsdata") (y = read_stars(file_list, quiet = TRUE)) ``` Next, we select sea surface temperature (`sst`), and drop the singular `zlev` (depth) dimension using `adrop`: ```{r eval=ev} library(dplyr) library(abind) z <- y |> select(sst) |> adrop() ``` We can now graph the sea surface temperature (SST) using `ggplot`, which needs data in a long table form, and without units: ```{r eval=ev} # convert POSIXct time to character, to please ggplot's facet_wrap() z1 = st_set_dimensions(z, 3, values = as.character(st_get_dimension_values(z, 3))) library(ggplot2) library(viridis) library(ggthemes) ggplot() + geom_stars(data = z1[1], alpha = 0.8, downsample = c(10, 10, 1)) + facet_wrap("time") + scale_fill_viridis() + coord_equal() + theme_map() + theme(legend.position = "bottom") + theme(legend.key.width = unit(2, "cm")) ``` # Writing stars objects to disk We can write a stars object to disk by using `write_stars`; this used the GDAL write engine. Writing NetCDF files without going through the GDAL interface is currently not supported. `write_stars` currently writes only a single attribute: ```{r eval=ev} write_stars(adrop(y[1]), "sst.tif") ``` See the explanation of `merge` above to see how multiple attributes can be merged (folded) into a dimension. # Cropping a raster's extent Using a curvilinear grid, taken from the example of `read_ncdf`: ```{r} prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") prec = read_ncdf(prec_file, curvilinear = c("lon", "lat")) ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { if (inherits(x, "units")) x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } library(dplyr) # loads slice generic prec_slice = slice(prec, index = 17, along = "time") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') ``` We can now crop the grid to those cells falling in ```{r} nc = st_transform(nc, st_crs(prec_slice)) # datum transformation plot(prec_slice[nc], border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') ``` The selection `prec_slice[nc]` essentially calls `st_crop(prec_slice, nc)` to get a cropped selection. What happened here is that all cells not intersecting with North Carolina (sea) are set to `NA` values. For regular grids, the extent of the resulting `stars` object is also be reduced (cropped) by default; this can be controlled with the `crop` parameter to `st_crop` and `[.stars`. # Vector data cube example Like `tbl_cube`, `stars` arrays have no limits to the number of dimensions they handle. An example is the origin-destination (OD) matrix, by time and travel mode. ## OD: space x space x travel mode x time x time We create a 5-dimensional matrix of traffic between regions, by day, by time of day, and by travel mode. Having day and time of day each as dimension is an advantage when we want to compute patterns over the day, for a certain period. ```{r} nc = st_read(system.file("gpkg/nc.gpkg", package="sf")) to = from = st_geometry(nc) # 100 polygons: O and D regions mode = c("car", "bike", "foot") # travel mode day = 1:100 # arbitrary library(units) units(day) = as_units("days since 2015-01-01") hour = set_units(0:23, h) # hour of day dims = st_dimensions(origin = from, destination = to, mode = mode, day = day, hour = hour) (n = dim(dims)) traffic = array(rpois(prod(n), 10), dim = n) # simulated traffic counts (st = st_as_stars(list(traffic = traffic), dimensions = dims)) ``` This array contains the simple feature geometries of origin and destination so that we can directly plot every slice without additional table joins. If we want to represent such an array as a `tbl_cube`, the simple feature geometry dimensions need to be replaced by indexes: ```{r eval=ev} st |> as.tbl_cube() ``` The following demonstrates how we can use `dplyr` to filter travel mode `bike`, and compute mean bike traffic by hour of day: ```{r eval=ev} b <- st |> as.tbl_cube() |> filter(mode == "bike") |> group_by(hour) |> summarise(traffic = mean(traffic)) |> as.data.frame() require(ggforce) # for plotting a units variable ggplot() + geom_line(data = b, aes(x = hour, y = traffic)) ``` # Extracting at point locations, aggregating over polygons Data cube values at point location can be extracted by `st_extract`, an example is found in [vignette 7](stars7.html) Aggregates, such as mean, maximum or modal values can be obtained by `aggregate`. In this example we use a categorical raster, and try to find the modal (most frequent) class within two circular polygons: ```{r} s = system.file("tif/lc.tif", package = "stars") r = read_stars(s, proxy = FALSE) |> droplevels() levels(r[[1]]) = abbreviate(levels(r[[1]]), 10) # shorten text labels st_point(c(3190631, 3125)) |> st_sfc(crs = st_crs(r)) |> st_buffer(25000) -> pol1 st_point(c(3233847, 21027)) |> st_sfc(crs = st_crs(r)) |> st_buffer(10000) -> pol2 if (isTRUE(dev.capabilities()$rasterImage == "yes")) { plot(r, reset = FALSE, key.pos = 4) plot(c(pol1, pol2), col = NA, border = c('yellow', 'green'), lwd = 2, add = TRUE) } ``` To find the modal value, we need a function that gives back the label corresponding to the class which is most frequent, using `table`: ```{r} f = function(x) { tb = table(x); names(tb)[which.max(tb)] } ``` We can then call `aggregate` on the raster map, and the set of the two circular polygons `pol1` and `pol2`, and pass the function `f`: ```{r} aggregate(r, c(pol1, pol2), f) |> st_as_sf() ``` stars/vignettes/stars8.Rmd0000644000176200001440000001020514644756215015322 0ustar liggesusers--- title: "8. NetCDF Proxy Workflows" author: "David Blodgett" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{8. NetCDF Proxy Workflows} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r, include = FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(dplyr)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) EVAL = suppressWarnings(require(starsdata, quietly = TRUE)) ``` NetCDF data sources are available via more _and_ less granular files and/or OPeNDAP endpoints. This article demonstrates how `stars` enables discovery, access, and processing of NetCDF data across a wide range of such source-data organization schemes. We'll start with some basics using datasets included with the `stars` installation. A call to `read_ncdf()`, for a dataset smaller than the default threshold, will just read in all the data. Below we read in and display the `reduced.nc` NetCDF file. ```{r} library(stars) f <- system.file("nc/reduced.nc", package = "stars") (nc <- read_ncdf(f)) ``` Let's assume `reduced.nc` was 10 years of hourly data, rather than 1 time step. It would be over 10GB rather than about 130KB and we would not be able to just read it all into memory. In this case, we need a way to read the file's metadata such that we could iterate over it in a way that meets the needs of our workflow objectives. This is where `proxy = TRUE` comes in. Below, we'll lower the option that controls whether `read_ncdf()` defaults to proxy _and_ use `proxy = TRUE` to show both ways of getting the same result. ```{r} old_options <- options("stars.n_proxy" = 100) (nc <- read_ncdf(f, proxy = TRUE)) options(old_options) ``` The above shows that we have a NetCDF sourced stars proxy derived from the `reduced.nc` file. We see it has four variables and their units are displayed. The normal `stars` `dimension(s)` are available and a `nc_request` object is also available. The `nc_request` object contains the information needed to make requests for data according to the dimensions of the NetCDF data source. With this information, we have what we need to request a chunk of data that is what we want and not too large. ```{r} (nc <- read_ncdf(f, var = "sst", ncsub = cbind(start = c(90, 45, 1 , 1), count = c(90, 45, 1, 1)))) plot(nc) ``` The ability to view NetCDF metadata so we can make well formed requests against the data is useful, but the real power of a proxy object is that we can use it in a "lazy evaluation" coding style. That is, we can do virtual operations on the object, like subsetting with another dataset, prior to actually accessing the data volume. Lazy operations. There are two kinds of lazy operations possible with `stars_proxy` objects. Some can be applied to the `stars_proxy` object itself without accessing underlying data. Others must be composed as a chain of calls that will be applied when data is actually required. Methods applied to a `stars_proxy` object: - `[` - Nearly the same as stars_proxy - `[[<-` - stars_proxy method works - `print` - unique method for nc_proxy to facilitate unique workflows - `dim` - stars_proxy method works - `c` - stars_proxy method works - `st_redimension` - Not sure what this entails but it might not make sense for nc_proxy. - `st_mosaic` * Calls read_stars on assembled list. Not supported for now. - `st_set_bbox` Methods that add a call to the `call_list`. - `[<-` - `adrop` - `aperm` - `is.na` - `split` - `st_apply` - `predict` - `merge` - `st_crop` - `drop_levels` - `Ops` (group generic for +, -, etc.) - `Math` (group generic for abs, sqrt, tan, etc.) - `filter` - `mutate` - `tansmute` - `select` - `rename` - `pull` - `slice` * hyperslabbing for NetCDF could be as above? - `pull` - `replace_na` Methods that cause a `stars_proxy` object to be fetched and turned into a `stars` object. - `as.data.frame` - `plot` - `st_as_stars` - `aggregate` - `st_dimensions<-` * https://github.com/r-spatial/stars/issues/494 - `hist` - `st_downsample` - `st_sample` - `st_as_sf` - `write_stars` stars/vignettes/stars6.Rmd0000644000176200001440000002040014644756215015316 0ustar liggesusers--- title: "6. How `raster` functions map to `stars` functions" author: "Sébastien Rochette, Adriano Fantini, Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{6. How raster functions map to stars functions} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r, include = FALSE} knitr::opts_chunk$set(echo = FALSE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(dplyr)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` Here's an attempt at the table describing how `raster` functions map to `stars` functions, discussed in [issue #122](https://github.com/r-spatial/stars/issues/122). This table uses the functionality of the `raster` package as a template; it may be incomplete, imprecise or plain wrong, so take it with a pinch of salt. Any comment or correction is hugely appreciated, please contribute! Some of the functions (`filter`, `slice`, `mutate`, `select`, `pull`, ...) are provided via `dplyr`, which must be loaded. See `?stars::dplyr`. ## COMMENT LEGEND ? = Not sure / unknown \* = Not present, low priority \# = Not present, high priority NA = Not available by design ## Creating objects ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "{raster, stack, brick} (read)", "read_stars or read_stars(along = ...)","", "{stack, brick} (concatenate layers)", "c or c(along = ...)","", "subset", "{[ ] , slice, filter}","", "addLayer", "c() or c(along = ...)","", "dropLayer", "{[ ] , slice, filter}","", "unstack", "combine lapply and {[ ] , slice, filter}","" ) %>% knitr::kable() ``` ## Changing spatial extent and/or resolution of objects ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "merge", "c", "#, currently only works for adjacent objects", "mosaic", "st_mosaic", "these are not identical, read the docs carefully", "crop", "filter, st_crop", "", "setExtent", "", "# maybe use st_warp?", "trim", "", "#", "aggregate", "aggregate", "WIP; raster's aggregate with fact=2 will not work, use st_warp in that case?", "disaggregate", "", "# use st_warp(use_gdal = TRUE)?", "resample", "{st_transform, st_warp}", "", "projectRaster", "{st_transform, st_warp}", "", "shift", "", "#, now use st_set_dimensions", "flip", "[] with reversed index", "#", "rotate", "", "*", "t", "", "NA" ) %>% knitr::kable() ``` ## Cell based computation ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "calc", "st_apply", "", "overlay", "c(along = , ...) %>% st_apply(...)", "", "cover", "[ ] <-", "", "mask", "[ ], st_crop", "when using an sf polygon as mask", "mask", "[ ]<- NA", "when using a stars object to mask", "cut", "cut", "", "subs", "", "", "reclassify", "mutate with case_when", "or forcats::fct_recode ?", "reclassify", "cut", "see https://stackoverflow.com/questions/70619002/reclassify-2d-stars-array/", "init", "[ ] <-", "", "stackApply", "{[ ] , slice, filter} %>% st_apply", "", "stackSelect", "", "", ) %>% knitr::kable() ``` ## Spatial contextual computation ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "distance", "", "#", "gridDistance", "", "*", "distanceFromPoints", "", "#", "direction", "", "*", "focal", "f = st_apply(x1, 3, foc, w = matrix(1, 3, 3))", "See. [issue 176](https://github.com/r-spatial/stars/issues/176)", "localFun", "", "*", "boundaries", "st_as_sf(as_points=FALSE, merge=TRUE, connect8=TRUE)", "", "clump", "st_as_sf(r, merge = TRUE)", "`st_as_sf` returns polygons, `clump` a raster", "adjacent", "", "*", "area", "st_area", "", "terrain", "", "#", "Moran", "", "" ) %>% knitr::kable() ``` ## Model predictions ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "predict", "predict", "", "interpolate", "gstat::idw, gstat::krige", "`st_warp` has raster-raster interpolations of `gdalwarp`" ) %>% knitr::kable() ``` ## Data type conversion ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "rasterize", "st_as_stars", "", "rasterToPoints", "st_as_sf(as_points=TRUE)", "", "rasterToPolygons", "st_as_sf(as_points=FALSE, ...), st_polygonize", "", "rasterToContour", "st_contour", "requires GDAL >= 2.4.0", "rasterFromXYZ", "", "", "rasterFromCells", "", "", ) %>% knitr::kable() ``` ## Summarizing ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "cellStats", "st_apply", "", "summary", "print, summary(as.vector(. %>% pull))", "", "freq", "table", "*", "crosstab", "", "", "unique", "unique(as.vector(. %>% pull))", "", "zonal", "", "*" ) %>% knitr::kable() ``` ## Accessing values of objects ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "getValues", "{pull, [[ ]]}", "", "getValuesBlock", "{[ ] , slice, filter} %>% pull", "", "getValuesFocal", "{[ ] , slice, filter} %>% pull", "", "as.matrix", "[[ ]]", "currently behaves somewhat unexpectedly *", "as.array", "[[ ]]", "currently behaves somewhat unexpectedly *", "extract (by cell)", "{[ ] , slice, filter}", "", "extract (by polygon)", "x[sf_object]", "", "extract (by point)", "aggregate(stars_object, sf_object, function(x) x[1], as_points = FALSE)", "", "sampleRandom", "", "*", "sampleRegular", "", "*", "minValue", "purrr::map(x, min)", "", "maxValue", "purrr::map(x, max)", "", "setMinMax", "", "," ) %>% knitr::kable() ``` ## Plotting ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "plot", "plot, geom_stars", "", "plotRGB", "plot(x, rgb =...)", "", "spplot", "-", "", "image", "image", "", "persp", "-", "", "contour", "(st_contour, then sf::plot)", "", "filledContour", "(same)", "", "text", "text", "", "`hist`", "`hist(x[[1]])`", "", "barplot", "", "", "density", "", "", "pairs", "", "", "boxplot", "", "" ) %>% knitr::kable() ``` ## Getting and setting dimensions ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "ncol", "dim(x)[1]", "or use name instead of 1; cols may be the second dimension!", "nrow", "dim(x)[2]", "or use name instead of 2; rows may be the first dimension!", "ncell", "prod(dim(x))", "", "res", "st_dimensions", "can also not be a constant in case of rectilinear or curvilinear grids", "nlayers", "-", "there is no concept of layers in stars", "names", "names", "", "xres", "st_res(x)[1]", "may not be a constant in case of rectilinear or curvilinear grids", "yres", "st_res(x)[2]", "may not be a constant in case of rectilinear or curvilinear grids", "xmin", "st_bbox(x)[1]", "", "xmax", "st_bbox(x)[3]", "", "ymin", "st_bbox(x)[2]", "", "ymax", "st_bbox(x)[4]", "", "extent", "st_bbox(x)", "different ordering of numbers", "origin", "-", "", "projection", "st_crs(x)", "", "isLonLat", "st_is_longlat(st_crs(x))", "", "filename", "", "stars_proxy objects carry file names where otherwise the array data is", "bandnr", "", "stars has no general concept of bands", "nbands", "dim(x)[3]", "may also be time; bands may also be in another dimension, or have another name", "compareRaster", "all.equal(st_dimensions(x), st_dimensions(y))", "*", "NAvalue", "", "-" ) %>% knitr::kable() ``` ## Computing row, column, cell numbers and coordinates ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "xFromCol", "st_get_dimension_values(., 'x')[col]", "I am not sure how to generally get the x dimension name - here it is x", "yFromRow", "st_get_dimension_values(., 'y')[row]", "I am not sure how to generally get the y dimension name - here it is y", "xFromCell", "", "", "yFromCell", "", "", "xyFromCell", "", "", "colFromX", "", "*", "rowFromY", "", "*", "rowColFromCell", "", "", "cellFromXY", "st_cells()", "", "cellFromRowCol", "", "", "cellsFromExtent", "", "", "coordinates", "st_coordinates", "", "validCell", "", "", "validCol", "col %>% between(st_dimensions(.)$x$from, st_dimensions(.)$x$to)", "raster columns are not always named 'x'", "validRow", "row %>% between(st_dimensions(.)$y$from, st_dimensions(.)$y$to)", "raster columns are not always named 'y'", "setValues", "[ ] <-", "", "writeRaster", "write_stars", "currently uses GDAL, somewhat limited", "KML", "", "" ) %>% knitr::kable() ``` The format of this table follows the `raster-package` entry in the raster manual, found at `https://cran.r-project.org/web/packages/raster/raster.pdf`. stars/vignettes/stars5.Rmd0000644000176200001440000001200514644756215015317 0ustar liggesusers--- title: "5. vector-raster conversions, reprojection, warping" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{5. vector-raster conversions, reprojection, warping} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(sf)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ev = TRUE ``` This vignette shows how `stars` object can be moved from vector and raster representations. # Rasterizing an `sf` vector object ```{r} library(stars) system.file("gpkg/nc.gpkg", package = "sf") %>% read_sf() %>% st_transform(32119) -> nc nc$dens = nc$BIR79 / units::set_units(st_area(nc), km^2) (nc.st = st_rasterize(nc["dens"], dx = 5000, dy = 5000)) plot(nc.st) ``` The algorithm used is the GDAL `rasterize` utility, all options of this utility can be passed to `st_rasterize`. The geometry of the final raster can be controlled by passing a target bounding box and either the raster dimensions `nx` and `ny`, or pixel size by the `dx` and `dy` parameters. # Vectorizing a raster object to an `sf` object `stars` objects can be converted into an `sf` object using `st_as_sf`. It has a number of options, depending on whether pixels represent the point value at the pixel center, or small square polygons with a single value. We will work again with the landsat-7 6-band image, but will select the first band and round the values: ```{r} tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif)[, 1:50, 1:50, 1:2] x[[1]] = round(x[[1]]/5) ``` ## Polygonizing In case raster cells reflect point values and we want to get a vector representation of the whole field, we can draw contour lines and export the contour sets (only available when the GDAL version is at least 2.4.0): ```{r eval=ev} l = st_contour(x, contour_lines = TRUE, breaks = 11:15) plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8) ``` ## Exporting to points Alternatively, we can simply export all the pixels as points, and get them either as a wide table with all bands per point, and no replicated `POINT` geometries: ```{r} st_as_sf(x, as_points = TRUE, merge = FALSE) ``` or as a long table with a single attribute and all points replicated: ```{r} st_as_sf(x, as_points = TRUE, merge = FALSE, long = TRUE) ``` as we can see, an additional attribute `band` now indicates which band is concerned. ## Exporting to polygons Alternatively, we can export to polygons and either get a single polygon per pixel, as in ```{r} st_as_sf(x[1], as_points = FALSE, merge = FALSE) ``` or merge polygons that have identical pixel values; ```{r} p = st_as_sf(x, as_points = FALSE, merge = TRUE) ``` When plotted with boundaries, we see the resolved boundaries of areas with the same pixel value: ```{r} plot(p) ``` A further option `connect8` can be set to `TRUE` to use 8 connectedness, rather than the default 4 connectedness algorithm. In both cases, the polygons returned will often be invalid according to the simple feature standard, but can be made valid using `lwgeom::st_make_valid`. # Switching between vector and raster in `stars` objects We can convert a raster dimension to a vector dimension while keeping other dimensions as they are in a `stars` object by ```{r} x.sf = st_xy2sfc(x, as_points = TRUE) x.sf ``` which also requires setting the `as_points` arguments as in `st_as_sf`. # Reprojecting a raster If we accept that curvilinear rasters are rasters too, and that regular and rectilinear grids are special cases of curvilinear grids, reprojecting a raster is no longer a "problem", it just recomputes new coordinates for every raster cell, and generally results in a curvilinear grid (that sometimes can be brought back to a regular or rectilinear grid). If curvilinear grid cells are represented by coordinates of the cell center, the actual shape of a grid cell gets lost, and this may be a larger effect if grid cells are large or if the transformation is stronger non-linear. An example of the reprojection of the grid created above is ```{r} nc.st %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") -> nc.curv nc.curv plot(nc.curv, border = NA, graticule = TRUE) ``` where it should be noted that the dimensionality of the grid didn't change: the same set of raster cells has been replotted in the new CRS, but now in a curvilinear grid. # Warping a raster Warping a raster means creating a new _regular_ grid in a new CRS, based on a (usually regular) grid in another CRS. We can do the transformation of the previous section by first creating a target grid: ```{r} nc %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") %>% st_bbox() %>% st_as_stars() -> newgrid ``` and then warping the old raster to the new ```{r} nc.st %>% st_warp(newgrid) -> nc.new nc.new plot(nc.new) ``` This new object has a regular grid in the new CRS, aligned with the new x- and y-axes. stars/vignettes/stars2.Rmd0000644000176200001440000003207514644756215015325 0ustar liggesusers--- title: "2. stars proxy objects" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{2. stars proxy objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") set.seed(13579) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) EVAL = x = suppressWarnings(require(starsdata, quietly = TRUE)) ``` When your imagery or array data easily fits a couple of times in R's working memory (RAM), consider yourself lucky. This document was not written for you. If your imagery is too large, or for other reasons you want to work with smaller chunks of data than the files in which they come, read on about your options. First, we will discuss the low-level interface for this, then the higher level, using stars proxy objects that delay all reading. # Preamble: the starsdata package To run all of the examples in this vignette, you must install a package with datasets that are too large (1 Gb) to be held in the `stars` package. They are in a [drat repo](https://github.com/eddelbuettel/drat), installation is done by ```{r eval=FALSE} install.packages("starsdata", repos = "http://gis-bigdata.uni-muenster.de/pebesma", type = "source") # possibly after: options(timeout = 100) # or from an alternative repository: # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") ``` # Reading chunks, change resolution, select bands `read_stars` has an argument called `RasterIO` which controls how a GDAL dataset is being read. By default, all pixels and all bands are read in memory. This can consume a lot of time and require a lot of memory. Remember that your file may be compressed, and that pixel values represented in the file by bytes are converted to 8-byte doubles in R. The reason for using `RasterIO` for this is that the parameters we use are directly mapped to the GDAL RasterIO function used (after adapting the 1-based offset index in R to 0-based offset in C++). ## Reading a particular chunk An example of using `RasterIO` is ```{r} library(stars) tif = system.file("tif/L7_ETMs.tif", package = "stars") rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) dim(x) ``` Compare this to ```{r} st_dimensions(read_stars(tif)) ``` and we see that * the `delta` values remain the same, * the offset (x/y coordinates of origin) of the grid remain the same * the `from` and `to` reflect the new area, and relate to the new `delta` values * `dim(x)` reflects the new size, and * only three bands were read ## Reading at a different resolution Reading datasets at a lower (but also higher!) resolution can be done by setting `nBufXSize` and `nBufYSize` ```{r} rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, nBufXSize = 20, nBufYSize = 20, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ``` and we see that in addition: * the `delta` (raster cell size) values have increased a factor 5, because `nBufXSize` and `nBufYSize` were set to values a factor 5 smaller than `nXSize` and `nYSize` * the offset coordinates of the grid are still the same * the `from` and `to` reflect the new area, but relate to the new `delta` cell size values We can also read at higher resolution; here we read a 3 x 3 area and blow it up to 100 x 100: ```{r} rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1) x = read_stars(tif, RasterIO = rasterio) dim(x) plot(x) ``` The reason we "see" only three grid cells is that the default sampling method is "nearest neighbour". We can modify this by ```{r} rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1, resample = "cubic_spline") x = read_stars(tif, RasterIO = rasterio) dim(x) plot(x) ``` The following methods are allowed for parameter `resample`: | `resample` | method used | |------------|------------------------------------| |`nearest_neighbour`| Nearest neighbour (default) | |`bilinear` | Bilinear (2x2 kernel) | |`cubic` | Cubic Convolution Approximation (4x4 kernel) | |`cubic_spline` | Cubic B-Spline Approximation (4x4 kernel) | |`lanczos` | Lanczos windowed sinc interpolation (6x6 kernel) | |`average` | Average | |`mode` | Mode (selects the value which appears most often of all the sampled points) | |`Gauss` | Gauss blurring | All these methods are implemented in GDAL; for what these methods exactly do, we refer to the GDAL documentation or source code. # Stars proxy objects Stars proxy objects take another approach: upon creation they contain no data at all, but only pointers to where the data can be read. Data is only read when it is needed, and only as much as is needed: if we plot a proxy objects, the data are read at the resolution of pixels on the screen, rather than at the native resolution, so that if we have e.g. a 10000 x 10000 Sentinel 2 (level 1C) image, we can open it by ```{r, eval=EVAL} granule = system.file("sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip", package = "starsdata") s2 = paste0("SENTINEL2_L1C:/vsizip/", granule, "/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632") (p = read_stars(s2, proxy = TRUE)) ``` and this happens _instantly_, because no data is read. When we plot this object, ```{r,eval=EVAL} system.time(plot(p)) ``` This takes only around 1 second, since only those pixels are read that can be seen on the plot. If we read the entire image in memory first, as we would do with ```{r eval = FALSE} p = read_stars(s2, proxy = FALSE) ``` then only the reading would take over a minute, and require 5 Gb memory. ## Methods for stars proxy objects ```{r} methods(class = "stars_proxy") ``` ## Select attributes We can select attributes as with regular `stars` objects, by using the first argument to `[`: ```{r,eval=EVAL} x = c("avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc") file_list = system.file(paste0("netcdf/", x), package = "starsdata") y = read_stars(file_list, quiet = TRUE, proxy = TRUE) names(y) y["sst"] ``` Note that this selection limits the reading from 4 to 1 subdataset from all 9 NetCDF files. ## Select an area Another possibility is to crop, or select a rectangular region based on a spatial object. This can be done by passing a `bbox` object, or an `sf`, `sfc` or `stars` object from which the bounding box will be taken. An example: ```{r,eval=EVAL} bb = st_bbox(c(xmin = 10.125, ymin = 0.125, xmax = 70.125, ymax = 70.125)) ysub = y[bb] st_dimensions(ysub) class(ysub) # still no data here!! plot(ysub, reset = FALSE) # plot reads the data, at resolution that is relevant plot(st_as_sfc(bb), add = TRUE, lwd = .5, border = 'red') ``` ## Lazy evaluation, changing evaluation order Some other actions can be carried out on `stars_proxy` objects, but their effect is delayed until the data are actually needed (`plot`, `write_stars`). For instance, range selections on dimensions other than shown above first need data, and can only then be carried out. Such functions are added to the object, in an attribute called `call_list`: ```{r,eval=EVAL} yy = adrop(y) yyy = yy[,1:10,1:10,] class(yyy) # still no data st_dimensions(yyy) # and dimensions not adjusted attr(yyy, "call_list") # the name of object in the call (y) is replaced with x: ``` Doing this allows for optimizing the order in which operations are done. As an example, for `st_apply`, reading can be done sequentially over the dimensions over which the function is applied: * If for example a function is applied to each band (such as: compute band quantiles), bands can be read sequentially, and discarded after the quantiles have been computed. * If a time series function is applied to pixel time series and the result is plotted on a map, the time series function is only evaluated on the pixels actually plotted. This means that e.g. in ```{r eval = FALSE} plot(st_apply(x, c("x", "y"), range)) ``` the order of evaluation is reversed: `plot` knows which pixels are going to be shown, and controls how `x` is downsampled *before* `st_apply` is carried out on this subset. ### Fetching the data Fetching the data now involves reading the whole array and then evaluating the `call_list` on it, sequentially: ```{r,eval=EVAL} (x = st_as_stars(yyy)) # read, adrop, subset ``` ### Plotting with changed evaluation order For the Sentinel 2 data, band 4 represents NIR and band 1 red, so we can compute NDVI by ```{r,eval=EVAL} # S2 10m: band 4: near infrared, band 1: red. #ndvi = function(x) (x[4] - x[1])/(x[4] + x[1]) ndvi = function(x1, x2, x3, x4) (x4 - x1)/(x4 + x1) rm(x) (s2.ndvi = st_apply(p, c("x", "y"), ndvi)) system.time(plot(s2.ndvi)) # read - compute ndvi - plot ``` # Multi-resolution proxy objects This sections shows some examples how `stars_proxy` objects deal with the situation where the different maps have dissimilar resolution. The assumptions here are: * all maps need to have the same origin coordinates (typically upper-left corner) and CRS. * the first map determines the "working" resolution, to which e.g. native or downsampled resolutions refer We'll create four maps with cells size 1, 2 and 3: ```{r} s1 = st_as_stars(matrix(1:16, 4)) s2 = st_as_stars(matrix(1:16, 4)) s3 = st_as_stars(matrix(1:16, 4)) attr(s1, "dimensions")$X1$offset = 0 attr(s1, "dimensions")$X2$offset = 4 attr(s2, "dimensions")$X1$offset = 0 attr(s2, "dimensions")$X2$offset = 4 attr(s3, "dimensions")$X1$offset = 0 attr(s3, "dimensions")$X2$offset = 4 attr(s1, "dimensions")$X1$delta = 1 attr(s1, "dimensions")$X2$delta = -1 attr(s2, "dimensions")$X1$delta = 2 attr(s2, "dimensions")$X2$delta = -2 attr(s3, "dimensions")$X1$delta = 3 attr(s3, "dimensions")$X2$delta = -3 plot(s1, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s2, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s3, axes = TRUE, text_values = TRUE, text_color = 'orange') ``` We created three rasters with identical cell values and dimensions, but different cell sizes, and hence extents. If we bind them in a single proxy object, with ```{r eval=TRUE} fn1 = paste0(tempdir(), .Platform$file.sep, "img1.tif") fn2 = paste0(tempdir(), .Platform$file.sep, "img2.tif") fn3 = paste0(tempdir(), .Platform$file.sep, "img3.tif") write_stars(s1, fn1) write_stars(s2, fn2) write_stars(s3, fn3) (r1 = read_stars(c(fn1, fn2, fn3), proxy = TRUE)) ``` We see that **multi-resolution** is mentioned in the printed summary. When converting this to a `stars` object, the secondary rasters are resampled to the cellsize + extent of the first: ```{r eval=TRUE} st_as_stars(r1) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` If we do this for a sub-range, defined for the object resolutions, we get: ```{r eval=TRUE} st_as_stars(r1[,2:4,2:4]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` We now create four maps, all over the same region ([0,4] x [0,4]), with different resolutions (cell size 1, 1/2 and 1/3): ```{r} s4 = st_as_stars(matrix(1: 16, 4)) s5 = st_as_stars(matrix(1: 64, 8)) s6 = st_as_stars(matrix(1:144,12)) attr(s4, "dimensions")$X1$offset = 0 attr(s4, "dimensions")$X2$offset = 4 attr(s5, "dimensions")$X1$offset = 0 attr(s5, "dimensions")$X2$offset = 4 attr(s6, "dimensions")$X1$offset = 0 attr(s6, "dimensions")$X2$offset = 4 attr(s4, "dimensions")$X1$delta = 1 attr(s4, "dimensions")$X2$delta = -1 attr(s5, "dimensions")$X1$delta = 1/2 attr(s5, "dimensions")$X2$delta = -1/2 attr(s6, "dimensions")$X1$delta = 1/3 attr(s6, "dimensions")$X2$delta = -1/3 plot(s4, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s5, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s6, axes = TRUE, text_values = TRUE, text_color = 'orange') ``` ```{r eval=TRUE} fn4 = paste0(tempdir(), .Platform$file.sep, "img4.tif") fn5 = paste0(tempdir(), .Platform$file.sep, "img5.tif") fn6 = paste0(tempdir(), .Platform$file.sep, "img6.tif") write_stars(s4, fn4) write_stars(s5, fn5) write_stars(s6, fn6) (r2 = read_stars(c(fn4, fn5, fn6), proxy = TRUE)) st_as_stars(r2) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r2[,2:4,2:4]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` Finally, an example where the first raster has the higher resolution: ```{r eval=TRUE} (r3 = read_stars(c(fn6, fn5, fn4), proxy = TRUE)) st_as_stars(r3) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r3[,2:6,3:6]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` stars/vignettes/stars7.Rmd0000644000176200001440000000055114644756215015324 0ustar liggesusers--- title: "7. Statistical modelling with stars objects" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{7. Statistical modelling with stars objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ stars/vignettes/stars4.Rmd0000644000176200001440000002652214644756215015327 0ustar liggesusers--- title: '4. stars data model' author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{4. stars data model} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") set.seed(13579) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` This vignette explains the data model of `stars` objects, illustrated using artificial and real datasets. ## Stars objects `stars` objects consist of * a (possibly empty) named list of arrays, each having named dimensions (`dim`) attribute * an attribute called `dimensions` of class `dimensions` that carries dimension metadata * a class name that includes `stars` A `dimensions` object is a named list of `dimension` elements, each describing the semantics a dimension of the data arrays (space, time, type etc). In addition to that, a `dimensions` object has an attribute called `raster` of class `stars_raster`, which is a named list with three elements: * `dimensions` length 2 character; the dimension names that constitute a spatial raster (or NA) * `affine` length 2 numeric; the two affine parameters of the geotransform (or NA) * `curvilinear` a boolean indicating whether a raster is a curvilinear raster (or NA) The `affine` and `curvilinear` values are only relevant in case of raster data, indicated by `dimensions` to have non-NA values. A `dimension` object describes a _single_ dimension; it is a list with named elements * `from`: (numeric length 1): the start index of the array * `to`: (numeric length 1): the end index of the array * `offset`: (numeric length 1): the start coordinate (or time) value of the first pixel (i.e., a pixel/cell boundary) * `delta`: (numeric length 1): the increment, or cell size * `refsys`: (character, or `crs`): object describing the reference system; e.g. the PROJ string, or string `POSIXct` or `PCICt` (for 360 and 365 days/year calendars), or object of class `crs` (containing both EPSG code and proj4string) * `point`: (logical length 1): boolean indicating whether cells/pixels refer to areas/periods, or to points/instances (may be NA) * `values`: one of * `NULL` (missing), * a vector with coordinate values (numeric, `POSIXct`, `PCICt`, or `sfc`), * an object of class `intervals` (a list with two vectors, `start` and `end`, with interval start- and end-values), or * a matrix with longitudes or latitudes for all cells (in case of curvilinear grids) `from` and `to` will usually be 1 and the dimension size, but `from` may be larger than 1 in case a sub-grid got was selected (or cropped). `offset` and `delta` only apply to _regularly_ discretized dimensions, and are `NA` if this is not the case. If they are `NA`, dimension values may be held in the `values` field. Rectilinear and curvilinear grids need grid values in `values` that can be either: * for rectilinear grids: irregularly _spaced_ coordinate values, or coordinate _intervals_ of irregular width (a rectilinear grid _can_ have one dimension that is regular), * for curvilinear grids: or a matrix with grid cell centre values for _all_ row/col combinations (usually in longitude or latitude). Alternatively, `values` can contains a set of spatial geometries encoded in an `sfc` vector ("list-column"), in which case we have a [vector data cube](https://r-spatial.org/r/2022/09/12/vdc.html). ## Grid type ### Regular grids With a very simple file created from a $4 \times 5$ matrix ```{r fig.width=4.5, fig.height=4} suppressPackageStartupMessages(library(stars)) m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) ``` we see that * the rows (5) are mapped to the first dimension, the x-coordinate * the columns (4) are mapped to the second dimension, the y-coordinate * the `from` and `to` fields of each dimension define a range that corresponds to the array dimension: ```{r} dim(s[[1]]) ``` * offset and delta specify how increasing row and column index maps to x and y coordinate values respectively. When we plot this object, using the `image` method for `stars` objects, ```{r fig.width=4.5, fig.height=4} image(s, text_values = TRUE, axes = TRUE) ``` we see that $(0,0)$ is the origin of the grid (grid corner), and $1$ the coordinate value increase from one index (row, col) to the next. It means that consecutive matrix columns represent grid lines, going from south to north. Grids defined this way are **regular**: grid cell size is constant everywhere. Many actual grid datasets have y coordinates (grid rows) going from North to South (top to bottom); this is realised with a negative value for `delta`. We see that the grid origin $(0,0)$ did not change: ```{r fig.width=4.5, fig.height=4} attr(s, "dimensions")[[2]]$delta = -1 image(s, text_values = TRUE, axes = TRUE) ``` An example is the GeoTIFF carried in the package, which, as probably all data sources read through GDAL, has a negative `delta` for the `y`-coordinate: ```{r} tif = system.file("tif/L7_ETMs.tif", package = "stars") st_dimensions(read_stars(tif))["y"] ``` ### Raster attributes, rotated and sheared grids Dimension tables of `stars` objects carry a `raster` attribute: ```{r} str(attr(st_dimensions(s), "raster")) ``` which is a list that holds * `dimensions`: character, the names of raster dimensions (if any), as opposed to e.g. spectral, temporal or other dimensions * `affine`: numeric, the affine parameters * `curvilinear`: a logical indicating whether the raster is curvilinear These fields are needed at this level, because they describe properties of the array at a higher level than individual dimensions do: a pair of dimensions forms a raster, both `affine` and `curvilinear` describe how x and y _as a pair_ are derived from grid indexes (see below) when this cannot be done on a per-dimension basis. With two affine parameters $a_1$ and $a_2$, $x$ and $y$ coordinates are derived from (1-based) grid indexes $i$ and $j$, grid offset values $o_x$ and $o_y$, and grid cell sizes $d_x$ and $d_y$ by $$x = o_x + (i-1) d_x + (j-1) a_1$$ $$y = o_y + (i-1) a_2 + (j-1) d_y$$ Clearly, when $a_1=a_2=0$, $x$ and $y$ are entirely derived from their respective index, offset and cellsize. Note that for integer indexes, the coordinates are that of the starting edge of a grid cell; to get the grid cell center of the top left grid cell (in case of a negative $d_y$), use $i=1.5$ and $j=1.5$. We can rotate grids by setting $a_1$ and $a_2$ to a non-zero value: ```{r} attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.1) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) ``` The rotation angle, in degrees, is ```{r} atan2(0.1, 1) * 180 / pi ``` Sheared grids are obtained when the two rotation coefficients, $a_1$ and $a_2$, are unequal: ```{r} attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.2) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) ``` Now, the y-axis and x-axis have different rotation in degrees of respectively ```{r} atan2(c(0.1, 0.2), 1) * 180 / pi ``` ## Rectilinear grids [Rectilinear grids](https://en.wikipedia.org/wiki/Regular_grid) have orthogonal axes, but do not have congruent (equally sized and shaped) cells: each axis has its own irregular subdivision. We can define a rectilinear grid by specifying the cell _boundaries_, meaning for every dimension we specify _one more_ value than the dimension size: ```{r} x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) image(r, axes = TRUE, col = grey((1:20)/20)) ``` Would we leave out the last value, than `stars` may come up with a _different_ cell boundary for the last cell, as this is now derived from the width of the one-but-last cell: ```{r} x = c(0, 0.5, 1, 2, 4) # 5 numbers: offsets only! y = c(0.3, 0.5, 1, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) ``` This is not problematic if cells have a constant width, in which case the boundaries are reduced to an `offset` and `delta` value, irrespective whether an upper boundary is given: ```{r} x = c(0, 1, 2, 3, 4) # 5 numbers: offsets only! y = c(0.5, 1, 1.5, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) ``` Alternatively, one can also set the _cell midpoints_ by specifying arguments `cell_midpoints` to the `st_dimensions` call: ```{r} x = st_as_stars(matrix(1:9, 3, 3), st_dimensions(x = c(1, 2, 3), y = c(2, 3, 10), cell_midpoints = TRUE)) ``` When the dimension is regular, this results in `offset` being shifted back with half a `delta`, or else in intervals derived from the distances between cell centers. This should obviously not be done when cell boundaries are specified. ## Curvilinear grids Curvilinear grids are grids whose grid lines are not straight. Rather than describing the curvature parametrically, the typical (HDF5 or NetCDF) files in which they are found have two raster layers with the longitudes and latitudes for every corresponding pixel of remaining layers. As an example, we will use a Sentinel 5P dataset available from package `starsdata`; this package can be installed with ```{r eval=FALSE} install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") ``` The dataset is found here: ```{r} (s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata")) ``` ```{r echo=FALSE} EVAL = s5p != "" ``` We can construct the curvilinear `stars` raster by calling `read_stars` on the right sub-array: ```{r eval=EVAL} subs = gdal_subdatasets(s5p) subs[[6]] ``` For this array, we can see the GDAL metadata under item `GEOLOCATION`: ```{r eval=EVAL} gdal_metadata(subs[[6]], "GEOLOCATION") ``` which reveals where, in this dataset, the longitude and latitude arrays are kept. ```{r eval=EVAL} nit.c = read_stars(subs[[6]]) threshold = units::set_units(9e+36, mol/m^2) nit.c[[1]][nit.c[[1]] > threshold] = NA nit.c ``` The curvilinear array has the actual arrays (raster layers, matrices) with longitude and latitude values read in its dimension table. We can plot this file: ```{r eval=EVAL} plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` ```{r eval=EVAL} plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` We can downsample the data by ```{r eval=EVAL} (nit.c_ds = stars:::st_downsample(nit.c, 8)) plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` which doesn't look nice, but plotting the cells as polygons looks better: ```{r eval=EVAL} plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` Another approach would be to warp the curvilinear grid to a regular grid, e.g. by ```{r eval=EVAL} w = st_warp(nit.c, crs = 4326, cellsize = 0.25) plot(w) ``` stars/vignettes/stars3.Rmd0000644000176200001440000000532114644756215015320 0ustar liggesusers--- title: "3. stars tidyverse methods" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{3. stars tidyverse methods} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") ev = TRUE knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` This vignette shows how some of the tidyverse verbs can be used on `stars` objects. The `stars` and `tidyverse` packages are loaded by ```{r} library(stars) library(dplyr) ``` Methods now available for class `stars` are ``` {r} methods(class = "stars") ``` We will work with a three-band section of a landsat image: ```{r} system.file("tif/L7_ETMs.tif", package = "stars") %>% read_stars -> x x ``` ## `slice` `slice` slices a sub-array out of the cube; this is done by specifying the dimension on which to act, and the slice number. ```{r} x %>% slice(band, 6) -> x6 x6 ``` It returns a lower-dimensional array if a single element is selected along the slice dimension. ## `filter` Similar to `slice`, `filter` selects on dimensions but evaluates their values rather than their index: in ```{r} x %>% filter(x > 289000, x < 291000, band > 3) -> x7 x7 ``` the subarray is created based on the x _coordinate_ values. Note that `filter` converts the object to a `tbl_cube`, and uses the `dplyr` `filter` method for `tbl_cube` objects. This has the limitation that `stars` objects with rectilinear, curvilinear or simple feature geometries cannot be handled. For such objects, using regular `[` selection or using `st_crop` may be an alternative. ## `pull` `pull` pulls out an array from a stars object: ```{r} x %>% pull(1) -> x8 class(x8) dim(x8) ``` ## `mutate` ```{r} x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 x2 ``` ## `select` `select` selects an attribute, or a set of attributes: ```{r} x2 %>% select(band2) -> x9 x9 ``` ## `geom_stars` `geom_raster` is a `ggplot2` geom function that accepts `stars` objects as its `data` argument and * sets up the raster or vector spatial coordinates as plot dimensions, and the first attribute as the fill variable * allows for downsampling (without choosing a suitable downsampling level) * chooses between using `geom_raster`, `geom_rect` and `geom_sf` depending on whether the geometry is regular, rectilinear or has vector geometries An example use is ```{r} library(ggplot2) library(viridis) ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_fill_viridis() + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) ``` stars/data/0000755000176200001440000000000014144045432012320 5ustar liggesusersstars/data/bcsd_obs.rda0000644000176200001440000000156214144045432014572 0ustar liggesusersBZh91AY&SY˓0!`"D@ @L#o(IP iPAFi4=M4m @@@@@d8  2 p4 dMHh {IM6(hiz mHl:d+GOA؏ʔLb1fC.IYs0ccK \;'9S*F!],*B+@C1P\(Tg!Я+ JANRb)zPd2iYզj*́S! AA eSc;c&db9m<8DD2:s!o%'NYƄAC 0_\J] "`C@bIB$D^x̍S؅%2-L&z#SQ[uHKR1$1 l&C0m0Nb BS؈Н H@66Lm$ Y1aޅ8ps`6cHc: LnQY 4n@+p|A ]m߱S^dA0)A}L5}tHeH}\*jkzAy$jgKQ9EXxVӸRE0d̾9СjUG+<h:UZ%)+1BuJBFձiU/ѥV% ed ]ޒw"A2_Saer63vyLE<+Z,/ @1Bϰ90oAz#^e&}-5 F]ī aVjElKM$Fy .^Y7W#QYX]BBTcw`stars/data/stars_sentinel2.rda0000644000176200001440000000316714144045432016136 0ustar liggesusersBZh91AY&SY>SgBL/@f4zhA~6hmM2=G 1hhɠ8i @44 h2dC@M FMOU?SʞOSiO<=&OSA=''=OS{ UVMA:7 f D0.._!=>#!:;4rݫU zRUU!u¢&` +wu}lv ei]!BC˧#?sI }7eÞ6v/"TF(ջ! rAۭɄn8%eK&wdE]ۓqv4Tү..FR<8cjk~nOa>|3zTTUQU"MT THZ-jSs.]4p{ef͕ˆ*QTQ"K#.=a;%>/_gROu)rS\8ԉ8JiOJo[&xcx5<)(H<'/1(4}Ԟ%n{Fc8γěDEdS'+jnN3mS4E-ě.dhJS2k/LYq3KIe4h&RE'k9>;{YSyt#R[YyglX~;|o/k{{B9 ?315III9m'cJypS51n8S;ni߳&ZblЙ pŜW9pH`jG#r3̤:ڲf;;MyNuc .;v_j|F%E"oKȽq{^bs9-i.u4S}C7$s.ǁRo|7&${Kq`:W3i'qz2ތ?t1a*fJkpM.LO})hbt8]N8L'.}';h`ڹ>zkޜwNy)~fv BͬN)5LN~Qz_Ώ6i`%i~ DC ))lsgϛ]LDZ]=N0`،XNFvKt5#KzSYi[̗L!gS\ə4w8if:u%aGf,E%RxjW`=$D>Ӻ4NG*>ݧqrwjXNҹ&=:rm<͉c7kG) O 2ǀ)JQ4=-Zw\NWYnyD:+Ds8qkzuř,741bj^b0SnzMzZ24h`bڔbԚ)4% WLX^ioSZh-j k>G yQ=$^Ӹgo/bl\kroЇipGQqb1r2M!kr?;) pCK6'lah6p6SW&+V)0Cx-q7:jh:Ч"ݱjsL'io/fGkaqqXhb5ɹ鶗}{G#f/ \%u,Z;eyč}b$\Mw/nz1ZGOo 'SǛΘ==s1~Ƥ޽/b;L2ULa*}딴O2WRb-8_5OKՓsO}s_v1`-Y+l'7غw0,1\Z\ SirN"kf%+42ju\C nrq.QQY/\t^S/o䗭~)R=eȽrd-brS6LgI>&Zͼ▾?oKj q'cdE0,ĉ }FDbaXWug4W[o;jLНo^ Zf>9|ũR6& v kq-fũjXYt9f cMYh]εPo2ȫF c9хj]<$ rE8PWstars/NAMESPACE0000644000176200001440000001506714576035525012652 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("$<-",stars) S3method("[",dimension) S3method("[",dimensions) S3method("[",intervals) S3method("[",intervals_list) S3method("[",nc_proxy) S3method("[",stars) S3method("[",stars_proxy) S3method("[<-",dimensions) S3method("[<-",stars) S3method("[<-",stars_proxy) S3method("[[<-",stars) S3method("[[<-",stars_proxy) S3method("dimnames<-",stars) S3method("st_crs<-",dimensions) S3method("st_crs<-",stars) S3method("st_dimensions<-",list) S3method("st_dimensions<-",stars) S3method("st_dimensions<-",stars_proxy) S3method("st_geotransform<-",stars) S3method(Math,stars) S3method(Math,stars_proxy) S3method(Ops,stars) S3method(Ops,stars_proxy) S3method(adrop,stars) S3method(adrop,stars_proxy) S3method(aggregate,stars) S3method(aggregate,stars_proxy) S3method(all,equal.dimensions) S3method(aperm,stars) S3method(aperm,stars_proxy) S3method(as.POSIXct,stars) S3method(as.data.frame,dimensions) S3method(as.data.frame,stars) S3method(as.data.frame,stars_proxy) S3method(as.list,intervals) S3method(asub,factor) S3method(c,intervals) S3method(c,nc_proxy) S3method(c,stars) S3method(c,stars_proxy) S3method(contour,stars) S3method(cut,array) S3method(cut,matrix) S3method(cut,stars) S3method(dim,dimensions) S3method(dim,stars) S3method(dim,stars_proxy) S3method(dimnames,stars) S3method(drop_units,dimension) S3method(drop_units,stars) S3method(droplevels,stars) S3method(droplevels,stars_proxy) S3method(expand_dimensions,dimensions) S3method(expand_dimensions,stars) S3method(format,intervals) S3method(format,intervals_list) S3method(head,intervals) S3method(hist,stars) S3method(hist,stars_proxy) S3method(image,stars) S3method(image,stars_proxy) S3method(is.na,stars) S3method(is.na,stars_proxy) S3method(length,intervals) S3method(merge,stars) S3method(merge,stars_proxy) S3method(plot,nc_proxy) S3method(plot,stars) S3method(plot,stars_proxy) S3method(prcomp,stars) S3method(prcomp,stars_proxy) S3method(predict,stars) S3method(predict,stars_proxy) S3method(print,dimensions) S3method(print,nc_proxy) S3method(print,stars) S3method(print,stars_proxy) S3method(print,stars_raster) S3method(range,dimension) S3method(seq,dimension) S3method(split,stars) S3method(split,stars_proxy) S3method(st_apply,stars) S3method(st_apply,stars_proxy) S3method(st_area,stars) S3method(st_as_sf,dimensions) S3method(st_as_sf,stars) S3method(st_as_sf,stars_proxy) S3method(st_as_sfc,stars) S3method(st_as_stars,OpenStreetMap) S3method(st_as_stars,Raster) S3method(st_as_stars,STF) S3method(st_as_stars,STFDF) S3method(st_as_stars,STS) S3method(st_as_stars,STSDF) S3method(st_as_stars,SpatRaster) S3method(st_as_stars,Spatial) S3method(st_as_stars,bbox) S3method(st_as_stars,cubble_df) S3method(st_as_stars,data.frame) S3method(st_as_stars,default) S3method(st_as_stars,im) S3method(st_as_stars,list) S3method(st_as_stars,nc_proxy) S3method(st_as_stars,ncdfgeom) S3method(st_as_stars,sf) S3method(st_as_stars,sfc) S3method(st_as_stars,stars) S3method(st_as_stars,stars_proxy) S3method(st_as_stars,xts) S3method(st_bbox,default) S3method(st_bbox,dimensions) S3method(st_bbox,stars) S3method(st_coordinates,dimensions) S3method(st_coordinates,stars) S3method(st_crop,nc_proxy) S3method(st_crop,stars) S3method(st_crop,stars_proxy) S3method(st_crs,dimensions) S3method(st_crs,stars) S3method(st_dimensions,array) S3method(st_dimensions,default) S3method(st_dimensions,dimensions) S3method(st_dimensions,matrix) S3method(st_dimensions,stars) S3method(st_downsample,stars) S3method(st_downsample,stars_proxy) S3method(st_extract,stars) S3method(st_geometry,stars) S3method(st_geotransform,default) S3method(st_geotransform,dimensions) S3method(st_geotransform,stars) S3method(st_interpolate_aw,stars) S3method(st_intersects,bbox) S3method(st_intersects,stars) S3method(st_join,stars) S3method(st_mosaic,character) S3method(st_mosaic,nc_proxy) S3method(st_mosaic,stars) S3method(st_mosaic,stars_proxy) S3method(st_normalize,stars) S3method(st_normalize,stars_proxy) S3method(st_redimension,nc_proxy) S3method(st_redimension,stars) S3method(st_redimension,stars_proxy) S3method(st_rotate,sf) S3method(st_rotate,sfc) S3method(st_rotate,stars) S3method(st_sample,stars) S3method(st_sample,stars_proxy) S3method(st_set_bbox,dimensions) S3method(st_set_bbox,stars) S3method(st_set_bbox,stars_proxy) S3method(st_transform,stars) S3method(st_write,stars) S3method(tail,intervals) S3method(time,stars) S3method(units,dimension) S3method(write_stars,stars) S3method(write_stars,stars_proxy) export("st_dimensions<-") export("st_geotransform<-") export(as.tbl_cube.stars) export(detect.driver) export(expand_dimensions) export(geom_stars) export(make_intervals) export(read_mdim) export(read_ncdf) export(read_stars) export(st_apply) export(st_as_stars) export(st_cells) export(st_contour) export(st_dim_to_attr) export(st_dimensions) export(st_downsample) export(st_extract) export(st_flip) export(st_geotransform) export(st_get_dimension_values) export(st_mosaic) export(st_raster_type) export(st_rasterize) export(st_redimension) export(st_res) export(st_rgb) export(st_rotate) export(st_set_bbox) export(st_set_dimensions) export(st_sfc2xy) export(st_tile) export(st_warp) export(st_xy2sfc) export(write_mdim) export(write_stars) exportMethods("%in%") import(sf) import(units) importFrom(abind,abind) importFrom(abind,adrop) importFrom(abind,asub) importFrom(classInt,classIntervals) importFrom(grDevices,cm) importFrom(grDevices,col2rgb) importFrom(grDevices,dev.capabilities) importFrom(grDevices,dev.size) importFrom(grDevices,grey) importFrom(grDevices,rgb) importFrom(graphics,axis) importFrom(graphics,box) importFrom(graphics,contour) importFrom(graphics,hist) importFrom(graphics,image) importFrom(graphics,image.default) importFrom(graphics,layout) importFrom(graphics,lcm) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,plot.new) importFrom(graphics,plot.window) importFrom(graphics,rasterImage) importFrom(graphics,strwidth) importFrom(graphics,text) importFrom(graphics,title) importFrom(methods,as) importFrom(methods,new) importFrom(methods,slot) importFrom(methods,slotNames) importFrom(parallel,parApply) importFrom(rlang,"%||%") importFrom(stats,aggregate) importFrom(stats,complete.cases) importFrom(stats,na.omit) importFrom(stats,na.pass) importFrom(stats,prcomp) importFrom(stats,predict) importFrom(stats,quantile) importFrom(stats,runif) importFrom(stats,setNames) importFrom(stats,time) importFrom(stats,var) importFrom(tools,file_ext) importFrom(utils,head) importFrom(utils,methods) importFrom(utils,modifyList) importFrom(utils,packageVersion) importFrom(utils,setTxtProgressBar) importFrom(utils,tail) importFrom(utils,txtProgressBar) stars/NEWS.md0000644000176200001440000005270614642514221012517 0ustar liggesusers# version 0.6-6 * skip `cubble` tests for cubble version 0.3.1; https://github.com/huizezhang-sherry/cubble/issues/30 * `st_transform.stars` transforms geometries in array elements * `mutate.stars` (and others) handle attribute names with spaces in them; #689 * `st_crop()` gains an argument `normalize`; when set to `TRUE` `st_normalize()` is called on the returned value; #685, #686 * constrain reading full GEOLOCATION arrays to the case where they are 2-D; #678 # version 0.6-5 * fix `st_as_stars.Spatial()` for `Spatial` gridded objects with non-square grid cells, see https://github.com/r-spatial/gstat/issues/123 * add `prcomp()` methods for `stars` and `stars_proxy` objects, working on attributes or last dimension * `st_rasterize()` with `align=TRUE` returns `NA` values where there are no data; #668 * `read_mdim()` reads tables with composity type, returning a `data.frame` in that case; #659 * `st_rotate()` transforms a rotated grid back to a curvilinear grid in unrotated coordinates. * `aggregate.stars()` deals with functions that return more than one number, putting these in a new dimension like `st_apply()` does * `st_as_stars.data.frame()` and `st_as_stars.sf()` better handle non-raster data cubes * `plot.stars()` only resets layout when needed (more than one sub-plot, or key present) * fixed `st_as_stars.im()`; #648 * `st_crs<-.stars()` is less critical on existing CRS being of class `crs` * `c.stars()` with a single (valid) argument and `along` specified adds a dimension; #646 * `st_join.stars()` keeps attributes from `x` complete; #643 * `st_as_stars.list()` requires a _named_ list, and will set names of array dimensions if not present # version 0.6-4 * `plot.stars()` has a `fill` argument that shifts unused plotting space between sub-maps to the bottom or right side of the plotting area * in `plot.stars()`, the `key.width` default is sensitive to `par("ps")`, the pointsize graphics parameter * `plot.stars()` and `image.stars()` are sensitive to `cex.axis`, for axes and key (requires sf >= 1.0-14); #642 * move `lwgeom` dependency to Suggests; using `st_transform_proj()` on vector data cubes requires loading `lwgeom` first # version 0.6-3 * `st_downsample()` has argument `offset` to pixel-shift downsampled images * `st_downsample()` has argument `FUN` to compute sub-tile aggregates; #604 * `st_as_stars.bbox()` retains `factor` values; #640 * fix CRAN error in test script * `st_crop()` works (and warns) for the case when the crop area does not overlap with the area of the object; #638 # version 0.6-2 * `split.stars()` accepts `stars` objects with multiple attributes; #635 * `[.stars()` supports `NA` values in dimension ranges for vector geometry (`sfc`) dimensions, resulting in empty geometries * `st_extract()` supports extracting points values from curvilinear grids (when not proxy); #632 * `read_mdim()` reads curvilinear rasters (geolocation arrays), so far only at full extent/resolution * `st_as_stars.stars()` accepts curvilinear argument with lon/lat array names present in `.x` * consistently use `OGC:CRS84` instead of `EPSG:4326` * setting `values = NULL` in `st_set_dimensions()` removes dimension values * more gracefully handle plotting of global coverage curvilinear grids; #632 * `image.stars()` plots images (e.g. of cross sections) when x and/or y are singular or absent; #628 * `st_as_stars.cubble_df()` adds conversion from cubble; `cubble::as_cubble()` methods converts back * `[<-.stars()` accepts for `i` an indicator (numeric length character) to the array to be replaced; #626 * `plot.stars()` gains an argument `key.lab` to set the legend key label (requires sf >= 1.0-13) # version 0.6-1 * remove `rgdal` dependency * `read_stars()` fixes combining bands with different block sizes; #623 * `st_warp()` gets (proper) default value for `threshold`; #618 * `read_mdim()` reads "raster" with single pixel (as a point) * `[.stars()`, as in `r[x]` allows `x` to be a logical stars object * `[<-.stars_proxy()` clones environment, so that after `r[r > 100] = NA` we don't get infinite recursion when realizing `r` * `read_stars()` avoids reading a raster twice to determine how to choose `proxy`; `proxy` can now be set as (and defaults to) the number of cells (bands * rows * columns) above which data will not be read in memory but returned as `stars_proxy` object; #609 * fix using `RasterIO` in `read_stars()` when `proxy=TRUE`; #608 * `plot.stars()` hook function can handle arguments `row`, `col`, `nrow`, `ncol`, `nr`, `value` and `bbox`; #600 * fix handling of categorical rasters with colors but without category labels; #595, fallout of #565 * fix subsetting of proxy objects over a time range; #596 # version 0.6-0 * `write_stars()` writes scaled and/or shifted values when using argument `scale_offset`; #589 * `aggregate.stars_proxy()` implements aggregation with non-spatial `by` objects (lazily) * fix `[.stars_proxy()` when selecting dimension 3 and higher; #561 * in `plot.stars()`, `col` can also be a palette function * `st_res()` returns spatial resolutions, and optionally all dimension resolutions; #557 thanks to Krzysztof Dyba * `read_stars()` shortens band or array names that contain a common start or ending, unless names would become empty or `shorten=FALSE` was set; e.g. `shorten="B"` puts a `B` before shortened array names * printing `stars` dimension tables omits fields with only `NULL` or `NA` values, unless `print(..., all = TRUE)` is given * improve reading categorical rasters, which now avoids calling `factor()`; #565 thanks to Krzysztof Dyba * `read_mdim()` will read bounds arrays for coordinates using the `bounds` attribute, and accepts a `bounds` argument to specify them when that attribute is missing * `time()` returns time stamps of a time dimension * `st_cells()` returns the cell index for a set of point coordinates, provided as `sf` or `sfc` object; #558 * reading & writing vector data cubes: `read_mdim()` reads CF compliant vector geometries, and reconstructs them into an `sfc` dimension; `write_mdim()` writes them. * `write_mdim()` uses GDAL multidimensional array API; * `read_mdim()` uses arguments `offset`, `count` and `step` to read sub-arrays or strided arrays (requires sf >= 1.0-9) # version 0.5-6 * export `read_mdim()`, a reader using GDAL's multidimensional array API (for sf <= 1.0-8) * remove `tos_O1_2001-2002.nc` from packaged datasets to keep source package size below 5 Mb * `as.POSIXct.stars()` converts `PCICt` dimensions to `POSIXct` values. * improve handling of `PCICt` 360 or 365 day calendars; read them in `read_mdim` (requires sf >= 1.0-9) * `read_stars()` reads factor levels better from attribute table; #484 thanks to @ailich * `read_stars()` puts band names from `band_meta` DESCRIPTION= tags into `values`; * improve handling of categorical rasters, and their exchange with `terra`; #484 * `plot()` handles auto colors better for factor arrays * `read_ncdf()` handles units more formally in setting crs; #533 * print message that dimensions of proxy objects do not reflect unevaluated operations; #530 * passing `na.action = na.omit` to `geom_stars()` removes `NA` values; #532 * `read_stars()` detects curvilinear grids automatically; #513 * `st_warp()` warps curvilinear grids (using Euclidean distances only on coordinates); #513 * `Ops.stars()` errors when (common) dimension are not identical; #506 * `guess_raster()` accepts empty rows/columns and sparse grids; #509 * speed up `rgb` plotting; #503 * Added a new helper function `st_tile()` to specify the block parameters (`nXOff`, `nYOff`, `nXsize`, `nYSize`) required by `RasterIO` argument in `read_stars()`; #492 thanks to Krzysztof Dyba # version 0.5-5 * `st_as_stars.bbox()` creates an empy raster file if `proxy = TRUE`; #489 * `st_rasterize()` has option `align = TRUE` to use a template for aligning the new raster to; #489 * `adrop.stars()` with missing dimensions no longer drops x/y raster dimensions; #485 * `aggregate.stars()` propagates units of arrays; #477 # version 0.5-4 * `c.stars()` fails if it tries to merge arrays with different units; #475 * For NetCDF files, `read_stars()` uses the `long_name` as array name; #475 * add `rename()` method; #470 * refresh CRS of packaged `L7_ETMs.tif`; #466 * `as.data.frame.stars()` works for mixed regular and rectilinear dimension; #458 * `plot.stars()` plots curvilinear rasters with color table, or without table but `col` argument passed; #456 * `st_extract()` accepts a matrix with points as `at` argument, for when performance is important; see e.g. https://github.com/rspatial/terra/issues/341 * fix bug in `st_crop()` when cropping area is larger than grid; #455 * export `st_downsample()`, e.g. to be used by `tmap`; https://github.com/r-tmap/tmap/issues/597 * argument `downsample` in `plot.stars()` and `st_as_stars.stars_proxy()` and `st_downsample()` has the same effect (removed a one-offset between them). * `st_redimension()` works for curvilinear grids; #441 * `downsample` is propagated to subexpressions like `r[r < 50] = NA` * `predict.stars()` obtains an argument `drop_dimensions` that, if `TRUE`, drops dimensions from the prediction `data.frame`; #362 * extend options in `st_rgb()`, #432, by Gabo Gaona * allow subsetting with `[` by using labels, e.g. of band names. # version 0.5-3 * `read_stars()` accepts a function (or list with functions) as first argument, allowing for saving `stars` objects that read from package directories resolving platform-dependent paths at run-time * handle categorical rasters starting at value 0 (by adding 1, and warning); #428 * add `%in%` method; #424 * `read_stars()` gains an argument `tolerance` to control tolerance in dimension value comparisons; #414 * binary Ops (like `+`, `-`, `*` etc.) work for `stars_proxy` objects; #390 * `st_rasterize()` rasterizes multiple attributes, and handles factors (when sf >= 0.9-9) * `write_stars()` deals better with `stars_proxy` objects; #404 * fix regression in reading some `stars_proxy` objects; #379 * add `[<-` (partially) and `is.na` methods for `stars_proxy` objects; #402 * add `replace_na()` methods; #402 # version 0.5-2 * read and write factor levels as GDAL category names; write color table; #392 * handle `normalize_path` for choosing to `proxy`; #391 * ignore units when there are different units across bands of a subdataset * speed up `st_rgb()` using faster `st_apply()` approach; #315, #390 * improve handling of crs in Spatial objects (avoid loss of wkt comments) * correctly write band subsets for smaller proxy objects; #291 * write arbitrarily cropped proxy objects; #291 * speed up `st_apply()` when a function is provided that works on chunks at a time; #390 * warn when breaks = "quantile" results in a single class; #388 * fix `[` bug selecting bands in proxy objects; #388 * for `stars_proxy` objects, `write_stars()` writes all objects into a multi-layer file; #385 * multi-file proxy objects can be `st_warp()`ed with `use_gdal = TRUE`; #385 # version 0.5-1 * fix weird GDAL-related bug in stars2 vignette * `read_ncdf()` does not take time as mid-points of regular intervals, but as starting points; #378 # version 0.5-0 * fix handling of rasters with color tables; #375 * `st_apply()` and other methods for `stars_proxy` objects handle ... ; #374 * add `st_bbox()`, `st_crs()` methods for terra's `SpatVector` objects; https://github.com/r-tmap/tmap/issues/536 * add `st_bbox()`, `st_crs()` and `st_as_stars()` methods for terra's `SpatRaster` objects; https://github.com/r-tmap/tmap/issues/536 * allow for multi-resolution attributes in `stars_proxy` objects (e.g., all gray scale sentinel-2 bands); see vignettes 2 and 7 for examples. * `plot()` defaults to a categorical color scale when plotting a factor variable; https://github.com/r-tmap/tmap/issues/526 * `st_extract()` extracts space-time points if `time_column` is specified, and handles time intervals; #352 * add `[[<-.stars` method, which is now called by `$<-.stars`, so that array names can be set programmatically * add `transmute()` methods * `plot.stars()` calls `droplevels` if a factor array has any `NA` levels; #339 * `read_stars()` reads `NaN`s as `NA`; #333 * improve `st_extract()` method for both `stars` and `stars_proxy` objects; interpolation options are reduced to bilinear; #322, #279, #290 * better handle categorical rasters that do not start at value 1; #329 * plot layout can be controlled with `mfrow = c(nr, nc)` argument * `stars_proxy` objects have a normalized path; #331 * cropping or selecting with `bbox` treats cells always as small polygons; #330 * add faster `st_extract()` method for `stars` objects; #322 * added vignette: "How `raster` functions map to `stars` functions", by Sebastien Rochette; #122, #325 * fix bug in dimension `values` field when downsampling; #324 * `write_stars()` also writes out band names; #323 * add `rgdal` to Suggests: * each `call_list` entry of a `stars_proxy` object carries its proper calling environment; #309 * `st_as_sf.stars()` copes with zero attribute (empty) stars objects * add `st_set_bbox()` generic, to set raster extent, motivated by #315 * set up tic, with great help from @pat-s, #313 * get rid of more `proj4string`s for representing coordinate reference systems; #312 * as(x, "Spatial") correctly handles `from` dimension values different from one * `read_stars()` now sets the `BANDNAME` GDAL metadata item, or else the band's GetDescription() as the band's dimension values * `st_as_stars.data.frame()` reads simple tables (non-raster data) if `dims` has length less than 2 * band descriptions are in the band dimension values * dimension tables are simpler, and are shown properly in Rstudio * `st_rgb()` gains a `probs` argument, to cut off and stretch based on quantiles * `as(x, "Raster")` merges multiple attributes before converting to raster brick # version 0.4-3 * fix bug in `st_as_stars.Raster`; set crs to the one assigned by raster; https://github.com/r-tmap/tmap/issues/471 * add `s2` to Suggests: * new function `st_rgb()` collapses (reduces) a dimension to rgb hex value; #302 # version 0.4-2 * `aggregate.stars()` handles arrays with NA values now correctly; brought up in #299 by Thorsten Simon * `aggregate.stars()` gains an argument `exact` which, if `TRUE`, calls `exactextractr` for polygonal aggregation; #289 * `read_stars()` reads all subdatasets with dimensions equal to first, and warns when ignoring others; #296 * make copying over of dimensions somewhat easier; #295 * `st_as_stars.Raster()` tries to read from file if the raster object is not an in-memory object. * `write_stars()` normalizes path, as `read_stars` already did; #293 * `merge()` for proxy objects acts, and is no longer lazy; #290 * `st_as_stars.Raster()` returns a proxy object if the raster layer is on disk * add `st_extract()` to extract e.g. time series from grids at point locations; #279; #290 * `read_stars()` chooses a value for `proxy` that depends on the data dimensions; #281 * x/y range subsetting of `stars_proxy` objects now only reads that range, similar to how crop already did this. * `st_warp()` preserves levels and colors; https://github.com/r-tmap/tmap/issues/429 * `st_crop()` works with bounding boxes larger than the downsampled bounding box; #276 * `st_crop()` has a non-zero default for `epsilon` (bounding box shrinkage) to exclude cells touching the crop bounding box; #275 * `image.stars()` (and hence `plot.stars`) gains an `extent` argument for setting the extent of a plot; https://github.com/r-spatial/sf/issues/1193 # version 0.4-1 * `st_warp()` (stars native) flips longitudes a full cycle; #256, #264, #269 * handle axis order in `st_transform` (requires sf >= 0.9-1) * depend on sf 0.9-0 * adapt to cubelyr split-off from dplyr; add cubelyr to Suggests:; https://github.com/hadley/cubelyr/issues/2 * add `droplevels()` method * handle color tables, category tables and raster attribute tables read through GDAL; #128, #245; https://github.com/r-spatial/mapview/issues/208 * handle dimension `crs` specially, for proxy objects now. * handle new-style `crs` objects from upcoming sf, moving away from proj4strings * handle full `crs` objects as `refsys` element in a spatial dimensions, rather than proj4string only * `st_raster_type(x)` reveals the raster type of `x`; #248, https://github.com/r-tmap/tmap/issues/368 * add `st_as_stars.OpenStreetMap()` method; #241 by @mtennekes * add `st_flip()` to flip arrays along one or more dimensions without changing dimension properties * add `as.owin()` method to convert (2D raster) stars objects to spatstat `owin`; https://github.com/r-spatial/sf/issues/1233 * for temporal aggregation, `aggregate.stars` now also takes `by` arguments like "week", "month", or "5 days" * add `st_as_stars()` method for `xts` objects; improve `as.xts` for `stars` objects * skip some tests on solaris # version 0.4-0 * `plot()` now uses all data to figure out breaks, in order to also find extremes; #216 * `st_mosaic()` creates mosaics from spatially disjoint rasters; #210 * #205 large refactoring of `read_ncdf`, by David Blodgett and Mike Sumner, affecting #199, #89, #30, #86, #175 * allow for funny units like `m s**-1`; #201 * add `contour()` method for `stars` objects; #196 * plot uses `rasterImage` by default if available; #194 * the `x` and `y` raster dimensions can be set and unset with `xy` argument in `st_set_dimensions`; #190 * retain `factor` levels with dimension values when set in `st_set_dimensions`; #188 * add conversion from `stars_proxy` to `Raster`: #193 * make plotting of multiple curvilinear grids work * plot by default no cell borders in case of curvilinear, rotated or sheared grids * robustify handling of units * allow `read_ncdf()` to ignore bounds * scale was applied wrongly on multi-band images; #189, this requires sf >= 0.7-5 * `.nc` is now recognized correctly by `write_stars` and will write a NetCDF file; #186 * `[` subset now works correctly with negative or logical indices; #184, #185 * `NA` values for float32 grids are now correctly detected; #182, this requires sf >= 0.7-5 * cropping of a `stars_proxy` object now works; #179 * `st_apply()` can now loop over Raster layers; examples in #176 # version 0.3-1 * `st_as_stars.bbox` now has an `ncells` and `pretty` argument, to better choose default raster dimensions * `geom_stars` now works with `stars_proxy` objects, but needs `downsample` to be set; #21 * `NA` values in Float32 rasters are now read correctly with `read_stars`; #182 * handle bounds, when given, in `read_ncdf` * provide time parsing (POSIXct, PCICt) for `read_ncdf`; #115 # version 0.3-0 * add `st_area` method to return raster grid cell sizes; #99 * fix `st_warp` with `use_gdal=TRUE`, allowing for multi-band warps * add `st_get_dimension_values` to get the values of a particular dimension (if meaningful); #100 * allow for setting intervals as dimension values; see examples of `st_dimensions` * add `st_contour`, and clean up `st_as_sf`; #99 * experimental color table support; https://github.com/r-spatial/mapview/issues/208 * rewrote vignettes, added vignettes; #99 * deprecate `st_write.stars` for `write_stars`; #96 * use "native" R array-factor support * support for `PCICt` 360- and 365-day calendars; #29 * remove import of `ncdf4` in favor of `RNetCDF`, now in line with practice in `ncmeta` package. Thanks to David Blodgett for motivation and testing (see #87, #94). * `st_as_sf` uses date/time column names when appropriate * allow missing trailing comma's when subsetting: `a[1,,]` and `a[1,]` now do the same. * move `rlang` to Imports: ; rewrite `[` subset using rlang. * add conversion to and from `Spatial*` classes, including the gridded ones, taking care of `factor` variables * depend on sf 0.7-2 * add `logz` support for log-scale keys to `plot` and `image` # version 0.2-0 * vignettes now use an external package, `starsdata`, for larger dataset examples * support `[<-.stars` e.g. to mask out values; support `is.na.stars` to replace NA masks * support `cut` methods and factor arrays (plot, subset); #56 * add `st_rasterize`, which uses `GDALRasterize` to rasterize an sf object; #13 * `st_as_sf.stars` now uses `GDAL(F)Polygonize` when give a regular or sheared grid grid cells are not points, and returns contour bands using `GDALContourGenerateEx` (requiring GDAL 2.4.0) in case cells are points; #13 * support curvilinear grids; see #54 and the `data_model` vignette * add vignette about how `stars_proxy` objects work * `stars_proxy` objects defer processing of `st_apply` jobs until after subsampling; #50 * allow reading sections of a raster, raster at a lower resolution, selected bands; #48 * allow reading vectors (arrays) with more than 2^31 elements; #48 * fold all higher dimensions into the third dimension before coercing to `Raster`; #40 # version 0.1-1 * add meta data reader to `read_stars` # version 0.1-0 * add `merge` (merge attributes into array dimension) and `split` (split dimension over attributes) * interface to sf, raster and spacetime * improve plotting * handle `logical` arrays in plot * add `st_apply`, analogous to `apply` * add cropping/masking when used as x[buf] with buf an `sf`, `sfc` or `bbox` object; masking when `x[buf, crop = FALSE]` * add Ops (+,-,/ etc) and Math (sqrt, pow, sin etc) methods * add `dimnames` and `dimnames<-` methods for stars objects * downsample large grids to only plot pixels actually shown * can plot rectilinear grids (but will plot rgb images as regular grids) * `rgb` argument to `image` works * `[` array-like subsetting works; first index is attribute selector # version 0.0 * interface the 9 C++ gdal utils through `gdal_utils()` (now part of `sf`) stars/inst/0000755000176200001440000000000014644756275012407 5ustar liggesusersstars/inst/CITATION0000644000176200001440000000057514405651246013536 0ustar liggesuserscitHeader("To cite package stars in publications, please use:") bibentry(bibtype = "Book", title = "{Spatial Data Science: With applications in R}", author = c(person("Edzer", "Pebesma"), person("Roger", "Bivand")), year = "2023", publisher = "Chapman and Hall/CRC", address = "London", url = "https://r-spatial.org/book/", pages = 352, doi = "10.1201/9780429459016") stars/inst/plumber/0000755000176200001440000000000013777653456014060 5ustar liggesusersstars/inst/plumber/server.R0000644000176200001440000000100013777653456015500 0ustar liggesusers# script.R library(jsonlite) # base64_enc # load stars library(stars) # load some imagery data x = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) # global database data = list(x = x, y = "foo", z = 0:10) #* @get /data get_data <- function(expr = NULL) { if (is.null(expr)) names(data) else base64_enc(serialize( eval(parse(text = expr), data), NULL)) # to char } #* @put /data put_data <- function(req, name, value) { data[[name]] <<- unserialize(base64_dec(fromJSON(value))) NULL } stars/inst/plumber/api.R0000644000176200001440000000025713777653456014760 0ustar liggesuserslibrary(plumber) r <- plumb("server.R") # Where 'script.R' is the location of the file shown above r$registerHook("exit", function(){ print("Bye bye!") }) r$run(port=8000) stars/inst/plumber/client.R0000644000176200001440000000211213777653456015455 0ustar liggesuserslibrary(httr) # GET library(jsonlite) # base64_dec library(stars) url = "http://localhost:8000/data" get_data = function(url, expr = NULL) { if (is.null(expr)) fromJSON( content(GET(url), "text", encoding = "UTF-8")) else { url = paste0(url, "?expr=", expr) unserialize(base64_dec(fromJSON( content(GET(url), "text", encoding = "UTF-8")))) } } put_data = function(url, name, value) { value = toJSON(base64_enc(serialize(value, NULL))) PUT(url, body = list(name = name, value = value), encode = "json") } get_data(url) get_data(url, "y") get_data(url, "z") xx = get_data(url, "x") tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) all.equal(x, xx) #get_data(url, "x[,,,1]") #get_data(url, "adrop(x[,,,1])") put_data(url, "foo", "bar") get_data(url) get_data(url, "foo") put_data(url, "z3", "3 * z") get_data(url, "z3") #put_data(url, "tif", x) #get_data(url) put_data(url, "xx", matrix(1:4,2)) get_data(url) get_data(url, "xx") library(sf) pt = st_sf(a = 1, geom = st_sfc(st_point(3:4))) put_data(url, "xx", pt) get_data(url) get_data(url, "xx") stars/inst/plumber/server_blog.R0000644000176200001440000000253313777653456016517 0ustar liggesusers# script.R library(jsonlite) # base64_enc # load stars library(stars) # load some imagery meta data # from a S2 .zip file, create a readable gdal source: s2_expand_zip = function(s) { paste0("/vsizip/", s, "/", sub(".zip", ".SAFE", s), "/MTD_MSIL1C.xml") } lst = list.files(pattern = "*.zip") lst = lst[c(grep("S2A_MSIL1C", lst), grep("S2B_MSIL1C", lst))] time = strptime(substr(lst, 12, 26), "%Y%m%dT%H%M%S") l = lapply(s2_expand_zip(lst), read_stars, sub = 1, proxy = TRUE) bb = do.call(c, lapply(l, function(x) st_as_sfc(st_bbox(st_dimensions(x))))) epsg = sapply(l, function(x) st_crs(x)$epsg) library(tibble) md = st_sf(tibble(proxy = l, time = as.POSIXct(time), epsg = epsg, geom = bb)) # create global database data = list(md = md) rm(md) #* Log some information about the incoming request #* @filter logger function(req) { cat(as.character(Sys.time()), "-", req$REQUEST_METHOD, req$PATH_INFO, "-", req$HTTP_USER_AGENT, "@", req$REMOTE_ADDR, ":", req$postBody, "\n") plumber::forward() } # plumber REST end points /data: #* @get /data #* @post /data get_data <- function(req, expr = NULL) { print(expr) if (is.null(expr)) names(data) else base64_enc(serialize( eval(parse(text = expr), data), NULL)) # to char } #* @put /data put_data <- function(req, name, value) { data[[name]] <<- unserialize(base64_dec(fromJSON(value))) NULL } stars/inst/plumber/client_blog.R0000644000176200001440000000317513777653456016472 0ustar liggesuserslibrary(httr) # GET, POST, PUT library(jsonlite) # base64_dec, base64_enc, toJSON, fromJSON library(tibble) # print get_data = function(url, expr = NULL) { if (is.null(expr)) fromJSON( content(GET(url), "text", encoding = "UTF-8")) else unserialize(base64_dec(fromJSON( content(POST(url, body = list(expr = expr), encode = "json"), "text", encoding = "UTF-8") ))) } put_data = function(url, name, value) { value = toJSON(base64_enc(serialize(value, NULL))) PUT(url, body = list(name = name, value = value), encode = "json") } # from where? url = "http://localhost:8000/data" get_data(url) # list library(stars) md = get_data(url, "md") # select a country: nl = st_as_sf(raster::getData("GADM", country = "NLD", level = 0)) %>% st_transform(st_crs(md)) get_data(url) # any data there? md = get_data(url, "md") proxy = md[nl,]$proxy plot(st_geometry(nl), axes = TRUE) s = sapply(proxy, function(x) { r = st_as_stars(x, downsample = 100, url = url) image(r, add = TRUE, rgb = 1:3, maxColorValue = 30000) }) plot(st_geometry(md), border = 'yellow', add = TRUE, lwd = .8) plot(st_geometry(nl), add=TRUE, border = 'orange', lwd = 2) ndvi = function(x) (x[4]-x[1])/(x[4]+x[1]) put_data(url, "ndvi", ndvi) get_data(url, "ndvi") plot(st_geometry(nl), axes = TRUE) x = st_apply(proxy[[10]], 1:2, ndvi) xs = st_as_stars(x, url = url, downsample = 50) image(xs, add = TRUE) s = sapply(proxy, function(x) { x = st_apply(x, 1:2, ndvi) r = st_as_stars(x, url = url, downsample = 100) image(r, add = TRUE, zlim = c(-1,1), col = colorRampPalette(c(grey(.1), grey(.5), 'green'))(10)) }) plot(st_geometry(nl), add = TRUE, border = 'red') stars/inst/doc/0000755000176200001440000000000014644756275013154 5ustar liggesusersstars/inst/doc/stars1.Rmd0000644000176200001440000003260614644756215015036 0ustar liggesusers--- title: "1. introduction" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{1. introduction} %\VignetteEncoding{UTF-8} %\VignetteEngine{knitr::rmarkdown} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") ev = suppressWarnings(require(starsdata, quietly = TRUE)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` Package `stars` provides infrastructure for _data cubes_, array data with labeled dimensions, with emphasis on arrays where some of the dimensions relate to time and/or space. Spatial data cubes are arrays with one or more spatial dimensions. Raster data cubes have at least two spatial dimensions that form the raster tesselation. Vector data cubes have at least one spatial dimension that may for instance reflect a polygon tesselation, or a set of point locations. Conversions between the two (rasterization, polygonization) are provided. Vector data are represented by simple feature geometries (packages `sf`). Tidyverse methods are provided. The `stars` package is loaded by ```{r} library(stars) ``` Spatiotemporal arrays are stored in objects of class `stars`; methods for class `stars` currently available are ``` {r} methods(class = "stars") ``` (tidyverse methods are only visible after loading package `tidyverse`). # Reading a satellite image We can read a satellite image through GDAL, e.g. from a GeoTIFF file in the package: ```{r} tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) plot(x, axes = TRUE) ``` We see that the image is geographically referenced (has coordinate values along axes), and that the object returned (`x`) has three dimensions called `x`, `y` and `band`, and has one attribute: ```{r} x ``` Each dimension has a name; the meaning of the fields of a single dimension are: |*field* |*meaning* | |--------|------------------------------------------------------------| | from | the origin index (1) | | to | the final index (dim(x)[i]) | | offset | the start value for this dimension (pixel boundary), if regular | | delta | the step (pixel, cell) size for this dimension, if regular | | refsys | the reference system, or proj4string | | point | logical; whether cells refer to points, or intervals | | values | the sequence of values for this dimension (e.g., geometries), if irregular | This means that for an index i (starting at $i=1$) along a certain dimension, the corresponding dimension value (coordinate, time) is $\mbox{offset} + (i-1) \times \mbox{delta}$. This value then refers to the start (edge) of the cell or interval; in order to get the interval middle or cell centre, one needs to add half an offset. Dimension `band` is a simple sequence from 1 to 6. Since bands refer to colors, one could put their wavelength values in the `values` field. For this particular dataset (and most other raster datasets), we see that delta for dimension `y` is negative: this means that consecutive array values have decreasing $y$ values: cell indexes increase from top to bottom, in the direction opposite to the $y$ axis. `read_stars` reads all bands from a raster dataset, or optionally a subset of raster datasets, into a single `stars` array structure. While doing so, raster values (often UINT8 or UINT16) are converted to double (numeric) values, and scaled back to their original values if needed if the file encodes the scaling parameters. The data structure `stars` is a generalization of the `tbl_cube` found in `cubelyr`; we can convert to that by ```{r eval=ev} library(cubelyr) as.tbl_cube(x) ``` but this will cause a loss of certain properties (cell size, reference system, vector geometries) ## Switching attributes to dimensions and back ```{r} (x.spl = split(x, "band")) merge(x.spl) ``` We see that the newly created dimension lost its name, and the single attribute got a default name. We can set attribute names with `setNames`, and dimension names and values with `st_set_dimensions`: ```{r} merge(x.spl) |> setNames(names(x)) |> st_set_dimensions(3, values = paste0("band", 1:6)) |> st_set_dimensions(names = c("x", "y", "band")) ``` ## Subsetting Besides the `tidyverse` subsetting and selection operators explained in [this vignette](stars3.html), we can also use `[` and `[[`. Since `stars` objects are a list of `array`s with a metadata table describing dimensions, list extraction (and assignment) works as expected: ```{r} class(x[[1]]) dim(x[[1]]) x$two = 2 * x[[1]] x ``` At this level, we can work with `array` objects directly. The `stars` subset operator `[` works a bit different: its * first argument selects attributes * second argument selects the first dimension * third argument selects the second dimension, etc Thus, ```{r} x["two", 1:10, , 2:4] ``` selects the second attribute, the first 10 columns (x-coordinate), all rows, and bands 2-4. Alternatively, when `[` is given a single argument of class `sf`, `sfc` or `bbox`, `[` will work as a crop operator: ```{r} circle = st_sfc(st_buffer(st_point(c(293749.5, 9115745)), 400), crs = st_crs(x)) plot(x[circle][, , , 1], reset = FALSE) plot(circle, col = NA, border = 'red', add = TRUE, lwd = 2) ``` ## Overviews We can read rasters at a lower resolution when they contain so-called overviews. For this GeoTIFF file, they were created with the `gdaladdo` utility, in particular ``` gdaladdo -r average L7_ETMs.tif 2 4 8 16 ``` which adds coarse resolution versions by using the _average_ resampling method to compute values based on blocks of pixels. These can be read by ```{r} x1 = read_stars(tif, options = c("OVERVIEW_LEVEL=1")) x2 = read_stars(tif, options = c("OVERVIEW_LEVEL=2")) x3 = read_stars(tif, options = c("OVERVIEW_LEVEL=3")) dim(x1) dim(x2) dim(x3) par(mfrow = c(1, 3), mar = rep(0.2, 4)) image(x1[,,,1]) image(x2[,,,1]) image(x3[,,,1]) ``` # Reading a raster time series: NetCDF Another example is when we read raster time series model outputs in a NetCDF file, e.g. by ```{r eval=ev} system.file("nc/bcsd_obs_1999.nc", package = "stars") |> read_stars() -> w ``` We see that ```{r eval=ev} w ``` For this dataset we can see that * variables have units associated (and a wrong unit, `C` is assigned to temperature) * time is now a dimension, with proper units and time steps Alternatively, this dataset can be read using `read_ncdf`, as in ```{r} system.file("nc/bcsd_obs_1999.nc", package = "stars") |> read_ncdf() ``` The difference between `read_ncdf` and `read_stars` for NetCDF files is that the former uses package RNetCDF to directly read the NetCDF file, where the latter uses the GDAL driver for NetCDF files. ## Reading datasets from multiple files Model data are often spread across many files. An example of a 0.25 degree grid, global daily sea surface temperature product is found [here](https://psl.noaa.gov/data/gridded/data.noaa.oisst.v2.highres.html); the subset from 1981 used below was downloaded from a NOAA ftp site that is no longer available in this form. (ftp site used to be eclipse.ncdc.noaa.gov/pub/OI-daily-v2/NetCDF/1981/AVHRR/). We read the data by giving `read_stars` a vector with character names: ```{r eval=ev} x = c( "avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc" ) # see the second vignette: # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") file_list = system.file(paste0("netcdf/", x), package = "starsdata") (y = read_stars(file_list, quiet = TRUE)) ``` Next, we select sea surface temperature (`sst`), and drop the singular `zlev` (depth) dimension using `adrop`: ```{r eval=ev} library(dplyr) library(abind) z <- y |> select(sst) |> adrop() ``` We can now graph the sea surface temperature (SST) using `ggplot`, which needs data in a long table form, and without units: ```{r eval=ev} # convert POSIXct time to character, to please ggplot's facet_wrap() z1 = st_set_dimensions(z, 3, values = as.character(st_get_dimension_values(z, 3))) library(ggplot2) library(viridis) library(ggthemes) ggplot() + geom_stars(data = z1[1], alpha = 0.8, downsample = c(10, 10, 1)) + facet_wrap("time") + scale_fill_viridis() + coord_equal() + theme_map() + theme(legend.position = "bottom") + theme(legend.key.width = unit(2, "cm")) ``` # Writing stars objects to disk We can write a stars object to disk by using `write_stars`; this used the GDAL write engine. Writing NetCDF files without going through the GDAL interface is currently not supported. `write_stars` currently writes only a single attribute: ```{r eval=ev} write_stars(adrop(y[1]), "sst.tif") ``` See the explanation of `merge` above to see how multiple attributes can be merged (folded) into a dimension. # Cropping a raster's extent Using a curvilinear grid, taken from the example of `read_ncdf`: ```{r} prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") prec = read_ncdf(prec_file, curvilinear = c("lon", "lat")) ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { if (inherits(x, "units")) x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } library(dplyr) # loads slice generic prec_slice = slice(prec, index = 17, along = "time") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') ``` We can now crop the grid to those cells falling in ```{r} nc = st_transform(nc, st_crs(prec_slice)) # datum transformation plot(prec_slice[nc], border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') ``` The selection `prec_slice[nc]` essentially calls `st_crop(prec_slice, nc)` to get a cropped selection. What happened here is that all cells not intersecting with North Carolina (sea) are set to `NA` values. For regular grids, the extent of the resulting `stars` object is also be reduced (cropped) by default; this can be controlled with the `crop` parameter to `st_crop` and `[.stars`. # Vector data cube example Like `tbl_cube`, `stars` arrays have no limits to the number of dimensions they handle. An example is the origin-destination (OD) matrix, by time and travel mode. ## OD: space x space x travel mode x time x time We create a 5-dimensional matrix of traffic between regions, by day, by time of day, and by travel mode. Having day and time of day each as dimension is an advantage when we want to compute patterns over the day, for a certain period. ```{r} nc = st_read(system.file("gpkg/nc.gpkg", package="sf")) to = from = st_geometry(nc) # 100 polygons: O and D regions mode = c("car", "bike", "foot") # travel mode day = 1:100 # arbitrary library(units) units(day) = as_units("days since 2015-01-01") hour = set_units(0:23, h) # hour of day dims = st_dimensions(origin = from, destination = to, mode = mode, day = day, hour = hour) (n = dim(dims)) traffic = array(rpois(prod(n), 10), dim = n) # simulated traffic counts (st = st_as_stars(list(traffic = traffic), dimensions = dims)) ``` This array contains the simple feature geometries of origin and destination so that we can directly plot every slice without additional table joins. If we want to represent such an array as a `tbl_cube`, the simple feature geometry dimensions need to be replaced by indexes: ```{r eval=ev} st |> as.tbl_cube() ``` The following demonstrates how we can use `dplyr` to filter travel mode `bike`, and compute mean bike traffic by hour of day: ```{r eval=ev} b <- st |> as.tbl_cube() |> filter(mode == "bike") |> group_by(hour) |> summarise(traffic = mean(traffic)) |> as.data.frame() require(ggforce) # for plotting a units variable ggplot() + geom_line(data = b, aes(x = hour, y = traffic)) ``` # Extracting at point locations, aggregating over polygons Data cube values at point location can be extracted by `st_extract`, an example is found in [vignette 7](stars7.html) Aggregates, such as mean, maximum or modal values can be obtained by `aggregate`. In this example we use a categorical raster, and try to find the modal (most frequent) class within two circular polygons: ```{r} s = system.file("tif/lc.tif", package = "stars") r = read_stars(s, proxy = FALSE) |> droplevels() levels(r[[1]]) = abbreviate(levels(r[[1]]), 10) # shorten text labels st_point(c(3190631, 3125)) |> st_sfc(crs = st_crs(r)) |> st_buffer(25000) -> pol1 st_point(c(3233847, 21027)) |> st_sfc(crs = st_crs(r)) |> st_buffer(10000) -> pol2 if (isTRUE(dev.capabilities()$rasterImage == "yes")) { plot(r, reset = FALSE, key.pos = 4) plot(c(pol1, pol2), col = NA, border = c('yellow', 'green'), lwd = 2, add = TRUE) } ``` To find the modal value, we need a function that gives back the label corresponding to the class which is most frequent, using `table`: ```{r} f = function(x) { tb = table(x); names(tb)[which.max(tb)] } ``` We can then call `aggregate` on the raster map, and the set of the two circular polygons `pol1` and `pol2`, and pass the function `f`: ```{r} aggregate(r, c(pol1, pol2), f) |> st_as_sf() ``` stars/inst/doc/stars8.Rmd0000644000176200001440000001020514644756215015034 0ustar liggesusers--- title: "8. NetCDF Proxy Workflows" author: "David Blodgett" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{8. NetCDF Proxy Workflows} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r, include = FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(dplyr)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) EVAL = suppressWarnings(require(starsdata, quietly = TRUE)) ``` NetCDF data sources are available via more _and_ less granular files and/or OPeNDAP endpoints. This article demonstrates how `stars` enables discovery, access, and processing of NetCDF data across a wide range of such source-data organization schemes. We'll start with some basics using datasets included with the `stars` installation. A call to `read_ncdf()`, for a dataset smaller than the default threshold, will just read in all the data. Below we read in and display the `reduced.nc` NetCDF file. ```{r} library(stars) f <- system.file("nc/reduced.nc", package = "stars") (nc <- read_ncdf(f)) ``` Let's assume `reduced.nc` was 10 years of hourly data, rather than 1 time step. It would be over 10GB rather than about 130KB and we would not be able to just read it all into memory. In this case, we need a way to read the file's metadata such that we could iterate over it in a way that meets the needs of our workflow objectives. This is where `proxy = TRUE` comes in. Below, we'll lower the option that controls whether `read_ncdf()` defaults to proxy _and_ use `proxy = TRUE` to show both ways of getting the same result. ```{r} old_options <- options("stars.n_proxy" = 100) (nc <- read_ncdf(f, proxy = TRUE)) options(old_options) ``` The above shows that we have a NetCDF sourced stars proxy derived from the `reduced.nc` file. We see it has four variables and their units are displayed. The normal `stars` `dimension(s)` are available and a `nc_request` object is also available. The `nc_request` object contains the information needed to make requests for data according to the dimensions of the NetCDF data source. With this information, we have what we need to request a chunk of data that is what we want and not too large. ```{r} (nc <- read_ncdf(f, var = "sst", ncsub = cbind(start = c(90, 45, 1 , 1), count = c(90, 45, 1, 1)))) plot(nc) ``` The ability to view NetCDF metadata so we can make well formed requests against the data is useful, but the real power of a proxy object is that we can use it in a "lazy evaluation" coding style. That is, we can do virtual operations on the object, like subsetting with another dataset, prior to actually accessing the data volume. Lazy operations. There are two kinds of lazy operations possible with `stars_proxy` objects. Some can be applied to the `stars_proxy` object itself without accessing underlying data. Others must be composed as a chain of calls that will be applied when data is actually required. Methods applied to a `stars_proxy` object: - `[` - Nearly the same as stars_proxy - `[[<-` - stars_proxy method works - `print` - unique method for nc_proxy to facilitate unique workflows - `dim` - stars_proxy method works - `c` - stars_proxy method works - `st_redimension` - Not sure what this entails but it might not make sense for nc_proxy. - `st_mosaic` * Calls read_stars on assembled list. Not supported for now. - `st_set_bbox` Methods that add a call to the `call_list`. - `[<-` - `adrop` - `aperm` - `is.na` - `split` - `st_apply` - `predict` - `merge` - `st_crop` - `drop_levels` - `Ops` (group generic for +, -, etc.) - `Math` (group generic for abs, sqrt, tan, etc.) - `filter` - `mutate` - `tansmute` - `select` - `rename` - `pull` - `slice` * hyperslabbing for NetCDF could be as above? - `pull` - `replace_na` Methods that cause a `stars_proxy` object to be fetched and turned into a `stars` object. - `as.data.frame` - `plot` - `st_as_stars` - `aggregate` - `st_dimensions<-` * https://github.com/r-spatial/stars/issues/494 - `hist` - `st_downsample` - `st_sample` - `st_as_sf` - `write_stars` stars/inst/doc/stars3.R0000644000176200001440000000277314644756253014523 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") ev = TRUE knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ## ----------------------------------------------------------------------------- library(stars) library(dplyr) ## ----------------------------------------------------------------------------- methods(class = "stars") ## ----------------------------------------------------------------------------- system.file("tif/L7_ETMs.tif", package = "stars") %>% read_stars -> x x ## ----------------------------------------------------------------------------- x %>% slice(band, 6) -> x6 x6 ## ----------------------------------------------------------------------------- x %>% filter(x > 289000, x < 291000, band > 3) -> x7 x7 ## ----------------------------------------------------------------------------- x %>% pull(1) -> x8 class(x8) dim(x8) ## ----------------------------------------------------------------------------- x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 x2 ## ----------------------------------------------------------------------------- x2 %>% select(band2) -> x9 x9 ## ----------------------------------------------------------------------------- library(ggplot2) library(viridis) ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_fill_viridis() + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) stars/inst/doc/stars2.html0000644000176200001440000207052314644756252015264 0ustar liggesusers 2. stars proxy objects

2. stars proxy objects

Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

When your imagery or array data easily fits a couple of times in R’s working memory (RAM), consider yourself lucky. This document was not written for you. If your imagery is too large, or for other reasons you want to work with smaller chunks of data than the files in which they come, read on about your options. First, we will discuss the low-level interface for this, then the higher level, using stars proxy objects that delay all reading.

Preamble: the starsdata package

To run all of the examples in this vignette, you must install a package with datasets that are too large (1 Gb) to be held in the stars package. They are in a drat repo, installation is done by

install.packages("starsdata", repos = "http://gis-bigdata.uni-muenster.de/pebesma", type = "source") 
# possibly after: options(timeout = 100)
# or from an alternative repository:
# install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source")

Reading chunks, change resolution, select bands

read_stars has an argument called RasterIO which controls how a GDAL dataset is being read. By default, all pixels and all bands are read in memory. This can consume a lot of time and require a lot of memory. Remember that your file may be compressed, and that pixel values represented in the file by bytes are converted to 8-byte doubles in R.

The reason for using RasterIO for this is that the parameters we use are directly mapped to the GDAL RasterIO function used (after adapting the 1-based offset index in R to 0-based offset in C++).

Reading a particular chunk

An example of using RasterIO is

library(stars)
tif = system.file("tif/L7_ETMs.tif", package = "stars")
rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, bands = c(1, 3, 4))
(x = read_stars(tif, RasterIO = rasterio))
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif    23      54     63 62.05977   73.25  235
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       6 105  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       6 105 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   3      NA    NA                         NA    NA
dim(x)
##    x    y band 
##  100  100    3

Compare this to

st_dimensions(read_stars(tif))
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

and we see that

  • the delta values remain the same,
  • the offset (x/y coordinates of origin) of the grid remain the same
  • the from and to reflect the new area, and relate to the new delta values
  • dim(x) reflects the new size, and
  • only three bands were read

Reading at a different resolution

Reading datasets at a lower (but also higher!) resolution can be done by setting nBufXSize and nBufYSize

rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100,
                nBufXSize = 20, nBufYSize = 20, bands = c(1, 3, 4))
(x = read_stars(tif, RasterIO = rasterio))
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif    27      53     63 62.09417      74  151
## dimension(s):
##      from to  offset  delta                     refsys point x/y
## x       2 21  288776  142.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       2 21 9120761 -142.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1  3      NA     NA                         NA    NA

and we see that in addition:

  • the delta (raster cell size) values have increased a factor 5, because nBufXSize and nBufYSize were set to values a factor 5 smaller than nXSize and nYSize
  • the offset coordinates of the grid are still the same
  • the from and to reflect the new area, but relate to the new delta cell size values

We can also read at higher resolution; here we read a 3 x 3 area and blow it up to 100 x 100:

rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3,
   nBufXSize = 100, nBufYSize = 100, bands = 1)
x = read_stars(tif, RasterIO = rasterio)
dim(x)
##   x   y 
## 100 100
plot(x)

The reason we “see” only three grid cells is that the default sampling method is “nearest neighbour”. We can modify this by

rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3,
   nBufXSize = 100, nBufYSize = 100, bands = 1, resample = "cubic_spline")
x = read_stars(tif, RasterIO = rasterio)
dim(x)
##   x   y 
## 100 100
plot(x)

The following methods are allowed for parameter resample:

resample method used
nearest_neighbour Nearest neighbour (default)
bilinear Bilinear (2x2 kernel)
cubic Cubic Convolution Approximation (4x4 kernel)
cubic_spline Cubic B-Spline Approximation (4x4 kernel)
lanczos Lanczos windowed sinc interpolation (6x6 kernel)
average Average
mode Mode (selects the value which appears most often of all the sampled points)
Gauss Gauss blurring

All these methods are implemented in GDAL; for what these methods exactly do, we refer to the GDAL documentation or source code.

Stars proxy objects

Stars proxy objects take another approach: upon creation they contain no data at all, but only pointers to where the data can be read. Data is only read when it is needed, and only as much as is needed: if we plot a proxy objects, the data are read at the resolution of pixels on the screen, rather than at the native resolution, so that if we have e.g. a 10000 x 10000 Sentinel 2 (level 1C) image, we can open it by

granule = system.file("sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip", package = "starsdata")
s2 = paste0("SENTINEL2_L1C:/vsizip/", granule, "/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632")
(p = read_stars(s2, proxy = TRUE))
## stars_proxy object with 1 attribute in 1 file(s):
## $EPSG_32632
## [1] "[...]/MTD_MSIL1C.xml:10m:EPSG_32632"
## 
## dimension(s):
##      from    to offset delta                refsys    values x/y
## x       1 10980  3e+05    10 WGS 84 / UTM zone 32N      NULL [x]
## y       1 10980  6e+06   -10 WGS 84 / UTM zone 32N      NULL [y]
## band    1     4     NA    NA                    NA B4,...,B8

and this happens instantly, because no data is read. When we plot this object,

system.time(plot(p))
## downsample set to 43

##    user  system elapsed 
##   0.766   0.356   0.166

This takes only around 1 second, since only those pixels are read that can be seen on the plot. If we read the entire image in memory first, as we would do with

p = read_stars(s2, proxy = FALSE)

then only the reading would take over a minute, and require 5 Gb memory.

Methods for stars proxy objects

methods(class = "stars_proxy")
##  [1] Math            Ops             [               [<-            
##  [5] [[<-            adrop           aggregate       aperm          
##  [9] as.data.frame   c               coerce          dim            
## [13] droplevels      filter          hist            image          
## [17] initialize      is.na           merge           mutate         
## [21] plot            prcomp          predict         print          
## [25] pull            rename          select          show           
## [29] slice           slotsFromS3     split           st_apply       
## [33] st_as_sf        st_as_stars     st_crop         st_dimensions<-
## [37] st_downsample   st_mosaic       st_normalize    st_redimension 
## [41] st_sample       st_set_bbox     transmute       write_stars    
## see '?methods' for accessing help and source code

Select attributes

We can select attributes as with regular stars objects, by using the first argument to [:

x = c("avhrr-only-v2.19810901.nc",
"avhrr-only-v2.19810902.nc",
"avhrr-only-v2.19810903.nc",
"avhrr-only-v2.19810904.nc",
"avhrr-only-v2.19810905.nc",
"avhrr-only-v2.19810906.nc",
"avhrr-only-v2.19810907.nc",
"avhrr-only-v2.19810908.nc",
"avhrr-only-v2.19810909.nc")
file_list = system.file(paste0("netcdf/", x), package = "starsdata")
y = read_stars(file_list, quiet = TRUE, proxy = TRUE)
names(y)
## [1] "sst"  "anom" "err"  "ice"
y["sst"]
## stars_proxy object with 1 attribute in 9 file(s):
## $sst
## [1] "[...]/avhrr-only-v2.19810901.nc:sst" "[...]/avhrr-only-v2.19810902.nc:sst"
## [3] "[...]/avhrr-only-v2.19810903.nc:sst" "[...]/avhrr-only-v2.19810904.nc:sst"
## [5] "[...]/avhrr-only-v2.19810905.nc:sst" "[...]/avhrr-only-v2.19810906.nc:sst"
## [7] "[...]/avhrr-only-v2.19810907.nc:sst" "[...]/avhrr-only-v2.19810908.nc:sst"
## [9] "[...]/avhrr-only-v2.19810909.nc:sst"
## 
## dimension(s):
##      from   to         offset  delta  refsys x/y
## x       1 1440              0   0.25      NA [x]
## y       1  720             90  -0.25      NA [y]
## zlev    1    1          0 [m]     NA      NA    
## time    1    9 1981-09-01 UTC 1 days POSIXct

Note that this selection limits the reading from 4 to 1 subdataset from all 9 NetCDF files.

Select an area

Another possibility is to crop, or select a rectangular region based on a spatial object. This can be done by passing a bbox object, or an sf, sfc or stars object from which the bounding box will be taken. An example:

bb = st_bbox(c(xmin = 10.125, ymin = 0.125, xmax = 70.125, ymax = 70.125))
ysub = y[bb]
st_dimensions(ysub)
##      from  to         offset  delta  refsys x/y
## x      41 281              0   0.25      NA [x]
## y      80 360             90  -0.25      NA [y]
## zlev    1   1          0 [m]     NA      NA    
## time    1   9 1981-09-01 UTC 1 days POSIXct
class(ysub) # still no data here!!
## [1] "stars_proxy" "stars"
plot(ysub, reset = FALSE) # plot reads the data, at resolution that is relevant
plot(st_as_sfc(bb), add = TRUE, lwd = .5, border = 'red')

Lazy evaluation, changing evaluation order

Some other actions can be carried out on stars_proxy objects, but their effect is delayed until the data are actually needed (plot, write_stars). For instance, range selections on dimensions other than shown above first need data, and can only then be carried out. Such functions are added to the object, in an attribute called call_list:

yy = adrop(y)
yyy = yy[,1:10,1:10,]
class(yyy) # still no data
## [1] "stars_proxy" "stars"
st_dimensions(yyy) # and dimensions not adjusted
##      from   to         offset  delta  refsys x/y
## x       1 1440              0   0.25      NA [x]
## y       1  720             90  -0.25      NA [y]
## zlev    1    1          0 [m]     NA      NA    
## time    1    9 1981-09-01 UTC 1 days POSIXct
attr(yyy, "call_list") # the name of object in the call (y) is replaced with x:
## [[1]]
## adrop(x = x, drop = drop)
## attr(,".Environment")
## <environment: 0x62e8bab6dbf8>
## 
## [[2]]
## x[i = i, 1:10, 1:10, , drop = drop, crop = crop]
## attr(,".Environment")
## <environment: 0x62e8bab1ff68>

Doing this allows for optimizing the order in which operations are done. As an example, for st_apply, reading can be done sequentially over the dimensions over which the function is applied:

  • If for example a function is applied to each band (such as: compute band quantiles), bands can be read sequentially, and discarded after the quantiles have been computed.
  • If a time series function is applied to pixel time series and the result is plotted on a map, the time series function is only evaluated on the pixels actually plotted. This means that e.g. in
plot(st_apply(x, c("x", "y"), range))

the order of evaluation is reversed: plot knows which pixels are going to be shown, and controls how x is downsampled before st_apply is carried out on this subset.

Fetching the data

Fetching the data now involves reading the whole array and then evaluating the call_list on it, sequentially:

(x = st_as_stars(yyy)) # read, adrop, subset
## stars object with 3 dimensions and 4 attributes
## attribute(s):
##                Min. 1st Qu. Median       Mean 3rd Qu.  Max.
## sst [C*°]     -1.28   -1.17  -1.11 -1.1163555   -1.06 -0.95
## anom [C*°]     0.48    0.62   0.69  0.6649555    0.72  0.77
## err [C*°]      0.30    0.30   0.30  0.3000000    0.30  0.30
## ice [percent]  0.76    0.79   0.81  0.8062889    0.82  0.85
## dimension(s):
##      from to         offset  delta  refsys x/y
## x       1 10              0   0.25      NA [x]
## y       1 10             90  -0.25      NA [y]
## time    1  9 1981-09-01 UTC 1 days POSIXct

Plotting with changed evaluation order

For the Sentinel 2 data, band 4 represents NIR and band 1 red, so we can compute NDVI by

# S2 10m: band 4: near infrared, band 1: red.
#ndvi = function(x) (x[4] - x[1])/(x[4] + x[1])
ndvi = function(x1, x2, x3, x4) (x4 - x1)/(x4 + x1)
rm(x)
(s2.ndvi = st_apply(p, c("x", "y"), ndvi))
## stars_proxy object with 1 attribute in 1 file(s):
## $EPSG_32632
## [1] "[...]/MTD_MSIL1C.xml:10m:EPSG_32632"
## 
## dimension(s):
##      from    to offset delta                refsys    values x/y
## x       1 10980  3e+05    10 WGS 84 / UTM zone 32N      NULL [x]
## y       1 10980  6e+06   -10 WGS 84 / UTM zone 32N      NULL [y]
## band    1     4     NA    NA                    NA B4,...,B8    
## call_list:
## [[1]]
## st_apply(X = X, MARGIN = MARGIN, FUN = FUN, CLUSTER = CLUSTER, 
##     PROGRESS = PROGRESS, FUTURE = FUTURE, rename = rename, .fname = .fname)
## attr(,".Environment")
## <environment: 0x62e8a9034ad8>
## 
## This object has pending lazy operations: dimensions as printed may not reflect this.
system.time(plot(s2.ndvi)) # read - compute ndvi - plot 
## downsample set to 43

##    user  system elapsed 
##   0.736   0.282   0.127

Multi-resolution proxy objects

This sections shows some examples how stars_proxy objects deal with the situation where the different maps have dissimilar resolution. The assumptions here are:

  • all maps need to have the same origin coordinates (typically upper-left corner) and CRS.
  • the first map determines the “working” resolution, to which e.g. native or downsampled resolutions refer

We’ll create four maps with cells size 1, 2 and 3:

s1 = st_as_stars(matrix(1:16, 4))
s2 = st_as_stars(matrix(1:16, 4))
s3 = st_as_stars(matrix(1:16, 4))
attr(s1, "dimensions")$X1$offset = 0
attr(s1, "dimensions")$X2$offset = 4
attr(s2, "dimensions")$X1$offset = 0
attr(s2, "dimensions")$X2$offset = 4
attr(s3, "dimensions")$X1$offset = 0
attr(s3, "dimensions")$X2$offset = 4
attr(s1, "dimensions")$X1$delta =  1
attr(s1, "dimensions")$X2$delta = -1
attr(s2, "dimensions")$X1$delta =  2
attr(s2, "dimensions")$X2$delta = -2
attr(s3, "dimensions")$X1$delta =  3
attr(s3, "dimensions")$X2$delta = -3
plot(s1, axes = TRUE, text_values = TRUE, text_color = 'orange')

plot(s2, axes = TRUE, text_values = TRUE, text_color = 'orange')

plot(s3, axes = TRUE, text_values = TRUE, text_color = 'orange')

We created three rasters with identical cell values and dimensions, but different cell sizes, and hence extents. If we bind them in a single proxy object, with

fn1 = paste0(tempdir(), .Platform$file.sep, "img1.tif")
fn2 = paste0(tempdir(), .Platform$file.sep, "img2.tif")
fn3 = paste0(tempdir(), .Platform$file.sep, "img3.tif")
write_stars(s1, fn1)
write_stars(s2, fn2)
write_stars(s3, fn3) 
(r1 = read_stars(c(fn1, fn2, fn3), proxy = TRUE))
## multi-resolution stars_proxy object with 3 attributes in 3 file(s):
## $`1`
## [1] "[...]/img1.tif"
## 
## $`2`
## [1] "[...]/img2.tif"
## 
## $`3`
## [1] "[...]/img3.tif"
## 
## dimension(s):
##   from to offset delta x/y
## x    1  4      0     1 [x]
## y    1  4      4    -1 [y]

We see that multi-resolution is mentioned in the printed summary. When converting this to a stars object, the secondary rasters are resampled to the cellsize + extent of the first:

st_as_stars(r1) %>%
  merge() %>%
  plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE)

If we do this for a sub-range, defined for the object resolutions, we get:

st_as_stars(r1[,2:4,2:4]) %>%
  merge() %>%
  plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE)

We now create four maps, all over the same region ([0,4] x [0,4]), with different resolutions (cell size 1, 1/2 and 1/3):

s4 = st_as_stars(matrix(1: 16, 4))
s5 = st_as_stars(matrix(1: 64, 8))
s6 = st_as_stars(matrix(1:144,12))
attr(s4, "dimensions")$X1$offset = 0
attr(s4, "dimensions")$X2$offset = 4
attr(s5, "dimensions")$X1$offset = 0
attr(s5, "dimensions")$X2$offset = 4
attr(s6, "dimensions")$X1$offset = 0
attr(s6, "dimensions")$X2$offset = 4
attr(s4, "dimensions")$X1$delta =  1
attr(s4, "dimensions")$X2$delta = -1
attr(s5, "dimensions")$X1$delta =  1/2
attr(s5, "dimensions")$X2$delta = -1/2
attr(s6, "dimensions")$X1$delta =  1/3
attr(s6, "dimensions")$X2$delta = -1/3
plot(s4, axes = TRUE, text_values = TRUE, text_color = 'orange')

plot(s5, axes = TRUE, text_values = TRUE, text_color = 'orange')

plot(s6, axes = TRUE, text_values = TRUE, text_color = 'orange')

fn4 = paste0(tempdir(), .Platform$file.sep, "img4.tif")
fn5 = paste0(tempdir(), .Platform$file.sep, "img5.tif")
fn6 = paste0(tempdir(), .Platform$file.sep, "img6.tif")
write_stars(s4, fn4)
write_stars(s5, fn5)
write_stars(s6, fn6) 
(r2 = read_stars(c(fn4, fn5, fn6), proxy = TRUE))
## multi-resolution stars_proxy object with 3 attributes in 3 file(s):
## $`4`
## [1] "[...]/img4.tif"
## 
## $`5`
## [1] "[...]/img5.tif"
## 
## $`6`
## [1] "[...]/img6.tif"
## 
## dimension(s):
##   from to offset delta x/y
## x    1  4      0     1 [x]
## y    1  4      4    -1 [y]

st_as_stars(r2) %>%
  merge() %>%
  plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE)

st_as_stars(r2[,2:4,2:4]) %>%
  merge() %>%
  plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE)

Finally, an example where the first raster has the higher resolution:

(r3 = read_stars(c(fn6, fn5, fn4), proxy = TRUE))
## multi-resolution stars_proxy object with 3 attributes in 3 file(s):
## $`6`
## [1] "[...]/img6.tif"
## 
## $`5`
## [1] "[...]/img5.tif"
## 
## $`4`
## [1] "[...]/img4.tif"
## 
## dimension(s):
##   from to offset   delta x/y
## x    1 12      0  0.3333 [x]
## y    1 12      4 -0.3333 [y]

st_as_stars(r3) %>%
  merge() %>%
  plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE)

st_as_stars(r3[,2:6,3:6]) %>%
  merge() %>%
  plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE)

stars/inst/doc/stars2.R0000644000176200001440000001700514644756251014512 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") set.seed(13579) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) EVAL = x = suppressWarnings(require(starsdata, quietly = TRUE)) ## ----eval=FALSE--------------------------------------------------------------- # install.packages("starsdata", repos = "http://gis-bigdata.uni-muenster.de/pebesma", type = "source") # # possibly after: options(timeout = 100) # # or from an alternative repository: # # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") ## ----------------------------------------------------------------------------- library(stars) tif = system.file("tif/L7_ETMs.tif", package = "stars") rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) dim(x) ## ----------------------------------------------------------------------------- st_dimensions(read_stars(tif)) ## ----------------------------------------------------------------------------- rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, nBufXSize = 20, nBufYSize = 20, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ## ----------------------------------------------------------------------------- rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1) x = read_stars(tif, RasterIO = rasterio) dim(x) plot(x) ## ----------------------------------------------------------------------------- rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1, resample = "cubic_spline") x = read_stars(tif, RasterIO = rasterio) dim(x) plot(x) ## ----eval=EVAL---------------------------------------------------------------- granule = system.file("sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip", package = "starsdata") s2 = paste0("SENTINEL2_L1C:/vsizip/", granule, "/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632") (p = read_stars(s2, proxy = TRUE)) ## ----eval=EVAL---------------------------------------------------------------- system.time(plot(p)) ## ----eval = FALSE------------------------------------------------------------- # p = read_stars(s2, proxy = FALSE) ## ----------------------------------------------------------------------------- methods(class = "stars_proxy") ## ----eval=EVAL---------------------------------------------------------------- x = c("avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc") file_list = system.file(paste0("netcdf/", x), package = "starsdata") y = read_stars(file_list, quiet = TRUE, proxy = TRUE) names(y) y["sst"] ## ----eval=EVAL---------------------------------------------------------------- bb = st_bbox(c(xmin = 10.125, ymin = 0.125, xmax = 70.125, ymax = 70.125)) ysub = y[bb] st_dimensions(ysub) class(ysub) # still no data here!! plot(ysub, reset = FALSE) # plot reads the data, at resolution that is relevant plot(st_as_sfc(bb), add = TRUE, lwd = .5, border = 'red') ## ----eval=EVAL---------------------------------------------------------------- yy = adrop(y) yyy = yy[,1:10,1:10,] class(yyy) # still no data st_dimensions(yyy) # and dimensions not adjusted attr(yyy, "call_list") # the name of object in the call (y) is replaced with x: ## ----eval = FALSE------------------------------------------------------------- # plot(st_apply(x, c("x", "y"), range)) ## ----eval=EVAL---------------------------------------------------------------- (x = st_as_stars(yyy)) # read, adrop, subset ## ----eval=EVAL---------------------------------------------------------------- # S2 10m: band 4: near infrared, band 1: red. #ndvi = function(x) (x[4] - x[1])/(x[4] + x[1]) ndvi = function(x1, x2, x3, x4) (x4 - x1)/(x4 + x1) rm(x) (s2.ndvi = st_apply(p, c("x", "y"), ndvi)) system.time(plot(s2.ndvi)) # read - compute ndvi - plot ## ----------------------------------------------------------------------------- s1 = st_as_stars(matrix(1:16, 4)) s2 = st_as_stars(matrix(1:16, 4)) s3 = st_as_stars(matrix(1:16, 4)) attr(s1, "dimensions")$X1$offset = 0 attr(s1, "dimensions")$X2$offset = 4 attr(s2, "dimensions")$X1$offset = 0 attr(s2, "dimensions")$X2$offset = 4 attr(s3, "dimensions")$X1$offset = 0 attr(s3, "dimensions")$X2$offset = 4 attr(s1, "dimensions")$X1$delta = 1 attr(s1, "dimensions")$X2$delta = -1 attr(s2, "dimensions")$X1$delta = 2 attr(s2, "dimensions")$X2$delta = -2 attr(s3, "dimensions")$X1$delta = 3 attr(s3, "dimensions")$X2$delta = -3 plot(s1, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s2, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s3, axes = TRUE, text_values = TRUE, text_color = 'orange') ## ----eval=TRUE---------------------------------------------------------------- fn1 = paste0(tempdir(), .Platform$file.sep, "img1.tif") fn2 = paste0(tempdir(), .Platform$file.sep, "img2.tif") fn3 = paste0(tempdir(), .Platform$file.sep, "img3.tif") write_stars(s1, fn1) write_stars(s2, fn2) write_stars(s3, fn3) (r1 = read_stars(c(fn1, fn2, fn3), proxy = TRUE)) ## ----eval=TRUE---------------------------------------------------------------- st_as_stars(r1) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ## ----eval=TRUE---------------------------------------------------------------- st_as_stars(r1[,2:4,2:4]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ## ----------------------------------------------------------------------------- s4 = st_as_stars(matrix(1: 16, 4)) s5 = st_as_stars(matrix(1: 64, 8)) s6 = st_as_stars(matrix(1:144,12)) attr(s4, "dimensions")$X1$offset = 0 attr(s4, "dimensions")$X2$offset = 4 attr(s5, "dimensions")$X1$offset = 0 attr(s5, "dimensions")$X2$offset = 4 attr(s6, "dimensions")$X1$offset = 0 attr(s6, "dimensions")$X2$offset = 4 attr(s4, "dimensions")$X1$delta = 1 attr(s4, "dimensions")$X2$delta = -1 attr(s5, "dimensions")$X1$delta = 1/2 attr(s5, "dimensions")$X2$delta = -1/2 attr(s6, "dimensions")$X1$delta = 1/3 attr(s6, "dimensions")$X2$delta = -1/3 plot(s4, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s5, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s6, axes = TRUE, text_values = TRUE, text_color = 'orange') ## ----eval=TRUE---------------------------------------------------------------- fn4 = paste0(tempdir(), .Platform$file.sep, "img4.tif") fn5 = paste0(tempdir(), .Platform$file.sep, "img5.tif") fn6 = paste0(tempdir(), .Platform$file.sep, "img6.tif") write_stars(s4, fn4) write_stars(s5, fn5) write_stars(s6, fn6) (r2 = read_stars(c(fn4, fn5, fn6), proxy = TRUE)) st_as_stars(r2) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r2[,2:4,2:4]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ## ----eval=TRUE---------------------------------------------------------------- (r3 = read_stars(c(fn6, fn5, fn4), proxy = TRUE)) st_as_stars(r3) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r3[,2:6,3:6]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) stars/inst/doc/stars8.R0000644000176200001440000000160514644756274014524 0ustar liggesusers## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(dplyr)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) EVAL = suppressWarnings(require(starsdata, quietly = TRUE)) ## ----------------------------------------------------------------------------- library(stars) f <- system.file("nc/reduced.nc", package = "stars") (nc <- read_ncdf(f)) ## ----------------------------------------------------------------------------- old_options <- options("stars.n_proxy" = 100) (nc <- read_ncdf(f, proxy = TRUE)) options(old_options) ## ----------------------------------------------------------------------------- (nc <- read_ncdf(f, var = "sst", ncsub = cbind(start = c(90, 45, 1 , 1), count = c(90, 45, 1, 1)))) plot(nc) stars/inst/doc/stars6.Rmd0000644000176200001440000002040014644756215015030 0ustar liggesusers--- title: "6. How `raster` functions map to `stars` functions" author: "Sébastien Rochette, Adriano Fantini, Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{6. How raster functions map to stars functions} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r, include = FALSE} knitr::opts_chunk$set(echo = FALSE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(dplyr)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` Here's an attempt at the table describing how `raster` functions map to `stars` functions, discussed in [issue #122](https://github.com/r-spatial/stars/issues/122). This table uses the functionality of the `raster` package as a template; it may be incomplete, imprecise or plain wrong, so take it with a pinch of salt. Any comment or correction is hugely appreciated, please contribute! Some of the functions (`filter`, `slice`, `mutate`, `select`, `pull`, ...) are provided via `dplyr`, which must be loaded. See `?stars::dplyr`. ## COMMENT LEGEND ? = Not sure / unknown \* = Not present, low priority \# = Not present, high priority NA = Not available by design ## Creating objects ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "{raster, stack, brick} (read)", "read_stars or read_stars(along = ...)","", "{stack, brick} (concatenate layers)", "c or c(along = ...)","", "subset", "{[ ] , slice, filter}","", "addLayer", "c() or c(along = ...)","", "dropLayer", "{[ ] , slice, filter}","", "unstack", "combine lapply and {[ ] , slice, filter}","" ) %>% knitr::kable() ``` ## Changing spatial extent and/or resolution of objects ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "merge", "c", "#, currently only works for adjacent objects", "mosaic", "st_mosaic", "these are not identical, read the docs carefully", "crop", "filter, st_crop", "", "setExtent", "", "# maybe use st_warp?", "trim", "", "#", "aggregate", "aggregate", "WIP; raster's aggregate with fact=2 will not work, use st_warp in that case?", "disaggregate", "", "# use st_warp(use_gdal = TRUE)?", "resample", "{st_transform, st_warp}", "", "projectRaster", "{st_transform, st_warp}", "", "shift", "", "#, now use st_set_dimensions", "flip", "[] with reversed index", "#", "rotate", "", "*", "t", "", "NA" ) %>% knitr::kable() ``` ## Cell based computation ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "calc", "st_apply", "", "overlay", "c(along = , ...) %>% st_apply(...)", "", "cover", "[ ] <-", "", "mask", "[ ], st_crop", "when using an sf polygon as mask", "mask", "[ ]<- NA", "when using a stars object to mask", "cut", "cut", "", "subs", "", "", "reclassify", "mutate with case_when", "or forcats::fct_recode ?", "reclassify", "cut", "see https://stackoverflow.com/questions/70619002/reclassify-2d-stars-array/", "init", "[ ] <-", "", "stackApply", "{[ ] , slice, filter} %>% st_apply", "", "stackSelect", "", "", ) %>% knitr::kable() ``` ## Spatial contextual computation ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "distance", "", "#", "gridDistance", "", "*", "distanceFromPoints", "", "#", "direction", "", "*", "focal", "f = st_apply(x1, 3, foc, w = matrix(1, 3, 3))", "See. [issue 176](https://github.com/r-spatial/stars/issues/176)", "localFun", "", "*", "boundaries", "st_as_sf(as_points=FALSE, merge=TRUE, connect8=TRUE)", "", "clump", "st_as_sf(r, merge = TRUE)", "`st_as_sf` returns polygons, `clump` a raster", "adjacent", "", "*", "area", "st_area", "", "terrain", "", "#", "Moran", "", "" ) %>% knitr::kable() ``` ## Model predictions ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "predict", "predict", "", "interpolate", "gstat::idw, gstat::krige", "`st_warp` has raster-raster interpolations of `gdalwarp`" ) %>% knitr::kable() ``` ## Data type conversion ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "rasterize", "st_as_stars", "", "rasterToPoints", "st_as_sf(as_points=TRUE)", "", "rasterToPolygons", "st_as_sf(as_points=FALSE, ...), st_polygonize", "", "rasterToContour", "st_contour", "requires GDAL >= 2.4.0", "rasterFromXYZ", "", "", "rasterFromCells", "", "", ) %>% knitr::kable() ``` ## Summarizing ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "cellStats", "st_apply", "", "summary", "print, summary(as.vector(. %>% pull))", "", "freq", "table", "*", "crosstab", "", "", "unique", "unique(as.vector(. %>% pull))", "", "zonal", "", "*" ) %>% knitr::kable() ``` ## Accessing values of objects ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "getValues", "{pull, [[ ]]}", "", "getValuesBlock", "{[ ] , slice, filter} %>% pull", "", "getValuesFocal", "{[ ] , slice, filter} %>% pull", "", "as.matrix", "[[ ]]", "currently behaves somewhat unexpectedly *", "as.array", "[[ ]]", "currently behaves somewhat unexpectedly *", "extract (by cell)", "{[ ] , slice, filter}", "", "extract (by polygon)", "x[sf_object]", "", "extract (by point)", "aggregate(stars_object, sf_object, function(x) x[1], as_points = FALSE)", "", "sampleRandom", "", "*", "sampleRegular", "", "*", "minValue", "purrr::map(x, min)", "", "maxValue", "purrr::map(x, max)", "", "setMinMax", "", "," ) %>% knitr::kable() ``` ## Plotting ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "plot", "plot, geom_stars", "", "plotRGB", "plot(x, rgb =...)", "", "spplot", "-", "", "image", "image", "", "persp", "-", "", "contour", "(st_contour, then sf::plot)", "", "filledContour", "(same)", "", "text", "text", "", "`hist`", "`hist(x[[1]])`", "", "barplot", "", "", "density", "", "", "pairs", "", "", "boxplot", "", "" ) %>% knitr::kable() ``` ## Getting and setting dimensions ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "ncol", "dim(x)[1]", "or use name instead of 1; cols may be the second dimension!", "nrow", "dim(x)[2]", "or use name instead of 2; rows may be the first dimension!", "ncell", "prod(dim(x))", "", "res", "st_dimensions", "can also not be a constant in case of rectilinear or curvilinear grids", "nlayers", "-", "there is no concept of layers in stars", "names", "names", "", "xres", "st_res(x)[1]", "may not be a constant in case of rectilinear or curvilinear grids", "yres", "st_res(x)[2]", "may not be a constant in case of rectilinear or curvilinear grids", "xmin", "st_bbox(x)[1]", "", "xmax", "st_bbox(x)[3]", "", "ymin", "st_bbox(x)[2]", "", "ymax", "st_bbox(x)[4]", "", "extent", "st_bbox(x)", "different ordering of numbers", "origin", "-", "", "projection", "st_crs(x)", "", "isLonLat", "st_is_longlat(st_crs(x))", "", "filename", "", "stars_proxy objects carry file names where otherwise the array data is", "bandnr", "", "stars has no general concept of bands", "nbands", "dim(x)[3]", "may also be time; bands may also be in another dimension, or have another name", "compareRaster", "all.equal(st_dimensions(x), st_dimensions(y))", "*", "NAvalue", "", "-" ) %>% knitr::kable() ``` ## Computing row, column, cell numbers and coordinates ```{r} tribble( ~raster, ~stars, ~`Note/comment`, "xFromCol", "st_get_dimension_values(., 'x')[col]", "I am not sure how to generally get the x dimension name - here it is x", "yFromRow", "st_get_dimension_values(., 'y')[row]", "I am not sure how to generally get the y dimension name - here it is y", "xFromCell", "", "", "yFromCell", "", "", "xyFromCell", "", "", "colFromX", "", "*", "rowFromY", "", "*", "rowColFromCell", "", "", "cellFromXY", "st_cells()", "", "cellFromRowCol", "", "", "cellsFromExtent", "", "", "coordinates", "st_coordinates", "", "validCell", "", "", "validCol", "col %>% between(st_dimensions(.)$x$from, st_dimensions(.)$x$to)", "raster columns are not always named 'x'", "validRow", "row %>% between(st_dimensions(.)$y$from, st_dimensions(.)$y$to)", "raster columns are not always named 'y'", "setValues", "[ ] <-", "", "writeRaster", "write_stars", "currently uses GDAL, somewhat limited", "KML", "", "" ) %>% knitr::kable() ``` The format of this table follows the `raster-package` entry in the raster manual, found at `https://cran.r-project.org/web/packages/raster/raster.pdf`. stars/inst/doc/stars3.html0000644000176200001440000141044314644756253015264 0ustar liggesusers 3. stars tidyverse methods

3. stars tidyverse methods

Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

This vignette shows how some of the tidyverse verbs can be used on stars objects.

The stars and tidyverse packages are loaded by

library(stars)
library(dplyr)

Methods now available for class stars are

methods(class = "stars")
##  [1] $<-               %in%              Math              Ops              
##  [5] [                 [<-               [[<-              adrop            
##  [9] aggregate         aperm             as.POSIXct        as.data.frame    
## [13] as.tbl_cube       as_tibble         c                 coerce           
## [17] contour           cut               dim               dimnames         
## [21] dimnames<-        drop_units        droplevels        expand_dimensions
## [25] filter            hist              image             initialize       
## [29] is.na             merge             mutate            plot             
## [33] prcomp            predict           print             pull             
## [37] rename            select            show              slice            
## [41] slotsFromS3       split             st_apply          st_area          
## [45] st_as_sf          st_as_sfc         st_as_stars       st_bbox          
## [49] st_coordinates    st_crop           st_crs            st_crs<-         
## [53] st_dimensions     st_dimensions<-   st_downsample     st_extract       
## [57] st_geometry       st_geotransform   st_geotransform<- st_interpolate_aw
## [61] st_intersects     st_join           st_mosaic         st_normalize     
## [65] st_redimension    st_rotate         st_sample         st_set_bbox      
## [69] st_transform      st_write          time              transmute        
## [73] write_stars      
## see '?methods' for accessing help and source code

We will work with a three-band section of a landsat image:

system.file("tif/L7_ETMs.tif", package = "stars") %>%
    read_stars -> x
x
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69 68.91242      86  255
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

slice

slice slices a sub-array out of the cube; this is done by specifying the dimension on which to act, and the slice number.

x %>% slice(band, 6) -> x6
x6
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     1      32     60 59.97521      88  255
## dimension(s):
##   from  to  offset delta                     refsys point x/y
## x    1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y    1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]

It returns a lower-dimensional array if a single element is selected along the slice dimension.

filter

Similar to slice, filter selects on dimensions but evaluates their values rather than their index: in

x %>% filter(x > 289000, x < 291000, band > 3) -> x7
x7
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     5      54     70 71.79194      88  252
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1  70  289004  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   3       4     1                         NA    NA

the subarray is created based on the x coordinate values.

Note that filter converts the object to a tbl_cube, and uses the dplyr filter method for tbl_cube objects. This has the limitation that stars objects with rectilinear, curvilinear or simple feature geometries cannot be handled. For such objects, using regular [ selection or using st_crop may be an alternative.

pull

pull pulls out an array from a stars object:

x %>% pull(1) -> x8
class(x8)
## [1] "array"
dim(x8)
##    x    y band 
##  349  352    6

mutate

x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 
x2
## stars object with 3 dimensions and 2 attributes
## attribute(s):
##              Min. 1st Qu. Median      Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69  68.91242      86  255
## band2           2     108    138 137.82484     172  510
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

select

select selects an attribute, or a set of attributes:

x2 %>% select(band2) -> x9
x9
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##        Min. 1st Qu. Median     Mean 3rd Qu. Max.
## band2     2     108    138 137.8248     172  510
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

geom_stars

geom_raster is a ggplot2 geom function that accepts stars objects as its data argument and

  • sets up the raster or vector spatial coordinates as plot dimensions, and the first attribute as the fill variable
  • allows for downsampling (without choosing a suitable downsampling level)
  • chooses between using geom_raster, geom_rect and geom_sf depending on whether the geometry is regular, rectilinear or has vector geometries

An example use is

library(ggplot2)
library(viridis)
ggplot() + 
  geom_stars(data = x) +
  coord_equal() +
  facet_wrap(~band) +
  theme_void() +
  scale_fill_viridis() +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_discrete(expand = c(0, 0))

stars/inst/doc/stars5.Rmd0000644000176200001440000001200514644756215015031 0ustar liggesusers--- title: "5. vector-raster conversions, reprojection, warping" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{5. vector-raster conversions, reprojection, warping} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(sf)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ev = TRUE ``` This vignette shows how `stars` object can be moved from vector and raster representations. # Rasterizing an `sf` vector object ```{r} library(stars) system.file("gpkg/nc.gpkg", package = "sf") %>% read_sf() %>% st_transform(32119) -> nc nc$dens = nc$BIR79 / units::set_units(st_area(nc), km^2) (nc.st = st_rasterize(nc["dens"], dx = 5000, dy = 5000)) plot(nc.st) ``` The algorithm used is the GDAL `rasterize` utility, all options of this utility can be passed to `st_rasterize`. The geometry of the final raster can be controlled by passing a target bounding box and either the raster dimensions `nx` and `ny`, or pixel size by the `dx` and `dy` parameters. # Vectorizing a raster object to an `sf` object `stars` objects can be converted into an `sf` object using `st_as_sf`. It has a number of options, depending on whether pixels represent the point value at the pixel center, or small square polygons with a single value. We will work again with the landsat-7 6-band image, but will select the first band and round the values: ```{r} tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif)[, 1:50, 1:50, 1:2] x[[1]] = round(x[[1]]/5) ``` ## Polygonizing In case raster cells reflect point values and we want to get a vector representation of the whole field, we can draw contour lines and export the contour sets (only available when the GDAL version is at least 2.4.0): ```{r eval=ev} l = st_contour(x, contour_lines = TRUE, breaks = 11:15) plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8) ``` ## Exporting to points Alternatively, we can simply export all the pixels as points, and get them either as a wide table with all bands per point, and no replicated `POINT` geometries: ```{r} st_as_sf(x, as_points = TRUE, merge = FALSE) ``` or as a long table with a single attribute and all points replicated: ```{r} st_as_sf(x, as_points = TRUE, merge = FALSE, long = TRUE) ``` as we can see, an additional attribute `band` now indicates which band is concerned. ## Exporting to polygons Alternatively, we can export to polygons and either get a single polygon per pixel, as in ```{r} st_as_sf(x[1], as_points = FALSE, merge = FALSE) ``` or merge polygons that have identical pixel values; ```{r} p = st_as_sf(x, as_points = FALSE, merge = TRUE) ``` When plotted with boundaries, we see the resolved boundaries of areas with the same pixel value: ```{r} plot(p) ``` A further option `connect8` can be set to `TRUE` to use 8 connectedness, rather than the default 4 connectedness algorithm. In both cases, the polygons returned will often be invalid according to the simple feature standard, but can be made valid using `lwgeom::st_make_valid`. # Switching between vector and raster in `stars` objects We can convert a raster dimension to a vector dimension while keeping other dimensions as they are in a `stars` object by ```{r} x.sf = st_xy2sfc(x, as_points = TRUE) x.sf ``` which also requires setting the `as_points` arguments as in `st_as_sf`. # Reprojecting a raster If we accept that curvilinear rasters are rasters too, and that regular and rectilinear grids are special cases of curvilinear grids, reprojecting a raster is no longer a "problem", it just recomputes new coordinates for every raster cell, and generally results in a curvilinear grid (that sometimes can be brought back to a regular or rectilinear grid). If curvilinear grid cells are represented by coordinates of the cell center, the actual shape of a grid cell gets lost, and this may be a larger effect if grid cells are large or if the transformation is stronger non-linear. An example of the reprojection of the grid created above is ```{r} nc.st %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") -> nc.curv nc.curv plot(nc.curv, border = NA, graticule = TRUE) ``` where it should be noted that the dimensionality of the grid didn't change: the same set of raster cells has been replotted in the new CRS, but now in a curvilinear grid. # Warping a raster Warping a raster means creating a new _regular_ grid in a new CRS, based on a (usually regular) grid in another CRS. We can do the transformation of the previous section by first creating a target grid: ```{r} nc %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") %>% st_bbox() %>% st_as_stars() -> newgrid ``` and then warping the old raster to the new ```{r} nc.st %>% st_warp(newgrid) -> nc.new nc.new plot(nc.new) ``` This new object has a regular grid in the new CRS, aligned with the new x- and y-axes. stars/inst/doc/stars2.Rmd0000644000176200001440000003207514644756215015037 0ustar liggesusers--- title: "2. stars proxy objects" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{2. stars proxy objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") set.seed(13579) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) EVAL = x = suppressWarnings(require(starsdata, quietly = TRUE)) ``` When your imagery or array data easily fits a couple of times in R's working memory (RAM), consider yourself lucky. This document was not written for you. If your imagery is too large, or for other reasons you want to work with smaller chunks of data than the files in which they come, read on about your options. First, we will discuss the low-level interface for this, then the higher level, using stars proxy objects that delay all reading. # Preamble: the starsdata package To run all of the examples in this vignette, you must install a package with datasets that are too large (1 Gb) to be held in the `stars` package. They are in a [drat repo](https://github.com/eddelbuettel/drat), installation is done by ```{r eval=FALSE} install.packages("starsdata", repos = "http://gis-bigdata.uni-muenster.de/pebesma", type = "source") # possibly after: options(timeout = 100) # or from an alternative repository: # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") ``` # Reading chunks, change resolution, select bands `read_stars` has an argument called `RasterIO` which controls how a GDAL dataset is being read. By default, all pixels and all bands are read in memory. This can consume a lot of time and require a lot of memory. Remember that your file may be compressed, and that pixel values represented in the file by bytes are converted to 8-byte doubles in R. The reason for using `RasterIO` for this is that the parameters we use are directly mapped to the GDAL RasterIO function used (after adapting the 1-based offset index in R to 0-based offset in C++). ## Reading a particular chunk An example of using `RasterIO` is ```{r} library(stars) tif = system.file("tif/L7_ETMs.tif", package = "stars") rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) dim(x) ``` Compare this to ```{r} st_dimensions(read_stars(tif)) ``` and we see that * the `delta` values remain the same, * the offset (x/y coordinates of origin) of the grid remain the same * the `from` and `to` reflect the new area, and relate to the new `delta` values * `dim(x)` reflects the new size, and * only three bands were read ## Reading at a different resolution Reading datasets at a lower (but also higher!) resolution can be done by setting `nBufXSize` and `nBufYSize` ```{r} rasterio = list(nXOff = 6, nYOff = 6, nXSize = 100, nYSize = 100, nBufXSize = 20, nBufYSize = 20, bands = c(1, 3, 4)) (x = read_stars(tif, RasterIO = rasterio)) ``` and we see that in addition: * the `delta` (raster cell size) values have increased a factor 5, because `nBufXSize` and `nBufYSize` were set to values a factor 5 smaller than `nXSize` and `nYSize` * the offset coordinates of the grid are still the same * the `from` and `to` reflect the new area, but relate to the new `delta` cell size values We can also read at higher resolution; here we read a 3 x 3 area and blow it up to 100 x 100: ```{r} rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1) x = read_stars(tif, RasterIO = rasterio) dim(x) plot(x) ``` The reason we "see" only three grid cells is that the default sampling method is "nearest neighbour". We can modify this by ```{r} rasterio = list(nXOff = 6, nYOff = 6, nXSize = 3, nYSize = 3, nBufXSize = 100, nBufYSize = 100, bands = 1, resample = "cubic_spline") x = read_stars(tif, RasterIO = rasterio) dim(x) plot(x) ``` The following methods are allowed for parameter `resample`: | `resample` | method used | |------------|------------------------------------| |`nearest_neighbour`| Nearest neighbour (default) | |`bilinear` | Bilinear (2x2 kernel) | |`cubic` | Cubic Convolution Approximation (4x4 kernel) | |`cubic_spline` | Cubic B-Spline Approximation (4x4 kernel) | |`lanczos` | Lanczos windowed sinc interpolation (6x6 kernel) | |`average` | Average | |`mode` | Mode (selects the value which appears most often of all the sampled points) | |`Gauss` | Gauss blurring | All these methods are implemented in GDAL; for what these methods exactly do, we refer to the GDAL documentation or source code. # Stars proxy objects Stars proxy objects take another approach: upon creation they contain no data at all, but only pointers to where the data can be read. Data is only read when it is needed, and only as much as is needed: if we plot a proxy objects, the data are read at the resolution of pixels on the screen, rather than at the native resolution, so that if we have e.g. a 10000 x 10000 Sentinel 2 (level 1C) image, we can open it by ```{r, eval=EVAL} granule = system.file("sentinel/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.zip", package = "starsdata") s2 = paste0("SENTINEL2_L1C:/vsizip/", granule, "/S2A_MSIL1C_20180220T105051_N0206_R051_T32ULE_20180221T134037.SAFE/MTD_MSIL1C.xml:10m:EPSG_32632") (p = read_stars(s2, proxy = TRUE)) ``` and this happens _instantly_, because no data is read. When we plot this object, ```{r,eval=EVAL} system.time(plot(p)) ``` This takes only around 1 second, since only those pixels are read that can be seen on the plot. If we read the entire image in memory first, as we would do with ```{r eval = FALSE} p = read_stars(s2, proxy = FALSE) ``` then only the reading would take over a minute, and require 5 Gb memory. ## Methods for stars proxy objects ```{r} methods(class = "stars_proxy") ``` ## Select attributes We can select attributes as with regular `stars` objects, by using the first argument to `[`: ```{r,eval=EVAL} x = c("avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc") file_list = system.file(paste0("netcdf/", x), package = "starsdata") y = read_stars(file_list, quiet = TRUE, proxy = TRUE) names(y) y["sst"] ``` Note that this selection limits the reading from 4 to 1 subdataset from all 9 NetCDF files. ## Select an area Another possibility is to crop, or select a rectangular region based on a spatial object. This can be done by passing a `bbox` object, or an `sf`, `sfc` or `stars` object from which the bounding box will be taken. An example: ```{r,eval=EVAL} bb = st_bbox(c(xmin = 10.125, ymin = 0.125, xmax = 70.125, ymax = 70.125)) ysub = y[bb] st_dimensions(ysub) class(ysub) # still no data here!! plot(ysub, reset = FALSE) # plot reads the data, at resolution that is relevant plot(st_as_sfc(bb), add = TRUE, lwd = .5, border = 'red') ``` ## Lazy evaluation, changing evaluation order Some other actions can be carried out on `stars_proxy` objects, but their effect is delayed until the data are actually needed (`plot`, `write_stars`). For instance, range selections on dimensions other than shown above first need data, and can only then be carried out. Such functions are added to the object, in an attribute called `call_list`: ```{r,eval=EVAL} yy = adrop(y) yyy = yy[,1:10,1:10,] class(yyy) # still no data st_dimensions(yyy) # and dimensions not adjusted attr(yyy, "call_list") # the name of object in the call (y) is replaced with x: ``` Doing this allows for optimizing the order in which operations are done. As an example, for `st_apply`, reading can be done sequentially over the dimensions over which the function is applied: * If for example a function is applied to each band (such as: compute band quantiles), bands can be read sequentially, and discarded after the quantiles have been computed. * If a time series function is applied to pixel time series and the result is plotted on a map, the time series function is only evaluated on the pixels actually plotted. This means that e.g. in ```{r eval = FALSE} plot(st_apply(x, c("x", "y"), range)) ``` the order of evaluation is reversed: `plot` knows which pixels are going to be shown, and controls how `x` is downsampled *before* `st_apply` is carried out on this subset. ### Fetching the data Fetching the data now involves reading the whole array and then evaluating the `call_list` on it, sequentially: ```{r,eval=EVAL} (x = st_as_stars(yyy)) # read, adrop, subset ``` ### Plotting with changed evaluation order For the Sentinel 2 data, band 4 represents NIR and band 1 red, so we can compute NDVI by ```{r,eval=EVAL} # S2 10m: band 4: near infrared, band 1: red. #ndvi = function(x) (x[4] - x[1])/(x[4] + x[1]) ndvi = function(x1, x2, x3, x4) (x4 - x1)/(x4 + x1) rm(x) (s2.ndvi = st_apply(p, c("x", "y"), ndvi)) system.time(plot(s2.ndvi)) # read - compute ndvi - plot ``` # Multi-resolution proxy objects This sections shows some examples how `stars_proxy` objects deal with the situation where the different maps have dissimilar resolution. The assumptions here are: * all maps need to have the same origin coordinates (typically upper-left corner) and CRS. * the first map determines the "working" resolution, to which e.g. native or downsampled resolutions refer We'll create four maps with cells size 1, 2 and 3: ```{r} s1 = st_as_stars(matrix(1:16, 4)) s2 = st_as_stars(matrix(1:16, 4)) s3 = st_as_stars(matrix(1:16, 4)) attr(s1, "dimensions")$X1$offset = 0 attr(s1, "dimensions")$X2$offset = 4 attr(s2, "dimensions")$X1$offset = 0 attr(s2, "dimensions")$X2$offset = 4 attr(s3, "dimensions")$X1$offset = 0 attr(s3, "dimensions")$X2$offset = 4 attr(s1, "dimensions")$X1$delta = 1 attr(s1, "dimensions")$X2$delta = -1 attr(s2, "dimensions")$X1$delta = 2 attr(s2, "dimensions")$X2$delta = -2 attr(s3, "dimensions")$X1$delta = 3 attr(s3, "dimensions")$X2$delta = -3 plot(s1, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s2, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s3, axes = TRUE, text_values = TRUE, text_color = 'orange') ``` We created three rasters with identical cell values and dimensions, but different cell sizes, and hence extents. If we bind them in a single proxy object, with ```{r eval=TRUE} fn1 = paste0(tempdir(), .Platform$file.sep, "img1.tif") fn2 = paste0(tempdir(), .Platform$file.sep, "img2.tif") fn3 = paste0(tempdir(), .Platform$file.sep, "img3.tif") write_stars(s1, fn1) write_stars(s2, fn2) write_stars(s3, fn3) (r1 = read_stars(c(fn1, fn2, fn3), proxy = TRUE)) ``` We see that **multi-resolution** is mentioned in the printed summary. When converting this to a `stars` object, the secondary rasters are resampled to the cellsize + extent of the first: ```{r eval=TRUE} st_as_stars(r1) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` If we do this for a sub-range, defined for the object resolutions, we get: ```{r eval=TRUE} st_as_stars(r1[,2:4,2:4]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` We now create four maps, all over the same region ([0,4] x [0,4]), with different resolutions (cell size 1, 1/2 and 1/3): ```{r} s4 = st_as_stars(matrix(1: 16, 4)) s5 = st_as_stars(matrix(1: 64, 8)) s6 = st_as_stars(matrix(1:144,12)) attr(s4, "dimensions")$X1$offset = 0 attr(s4, "dimensions")$X2$offset = 4 attr(s5, "dimensions")$X1$offset = 0 attr(s5, "dimensions")$X2$offset = 4 attr(s6, "dimensions")$X1$offset = 0 attr(s6, "dimensions")$X2$offset = 4 attr(s4, "dimensions")$X1$delta = 1 attr(s4, "dimensions")$X2$delta = -1 attr(s5, "dimensions")$X1$delta = 1/2 attr(s5, "dimensions")$X2$delta = -1/2 attr(s6, "dimensions")$X1$delta = 1/3 attr(s6, "dimensions")$X2$delta = -1/3 plot(s4, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s5, axes = TRUE, text_values = TRUE, text_color = 'orange') plot(s6, axes = TRUE, text_values = TRUE, text_color = 'orange') ``` ```{r eval=TRUE} fn4 = paste0(tempdir(), .Platform$file.sep, "img4.tif") fn5 = paste0(tempdir(), .Platform$file.sep, "img5.tif") fn6 = paste0(tempdir(), .Platform$file.sep, "img6.tif") write_stars(s4, fn4) write_stars(s5, fn5) write_stars(s6, fn6) (r2 = read_stars(c(fn4, fn5, fn6), proxy = TRUE)) st_as_stars(r2) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r2[,2:4,2:4]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` Finally, an example where the first raster has the higher resolution: ```{r eval=TRUE} (r3 = read_stars(c(fn6, fn5, fn4), proxy = TRUE)) st_as_stars(r3) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) st_as_stars(r3[,2:6,3:6]) %>% merge() %>% plot(breaks = "equal", text_values = TRUE, text_color = 'orange', axes = TRUE) ``` stars/inst/doc/stars7.html0000644000176200001440000001310714644756274015266 0ustar liggesusers 7. Statistical modelling with stars objects

7. Statistical modelling with stars objects

Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

stars/inst/doc/stars7.Rmd0000644000176200001440000000055114644756215015036 0ustar liggesusers--- title: "7. Statistical modelling with stars objects" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{7. Statistical modelling with stars objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ stars/inst/doc/stars6.html0000644000176200001440000006305414644756274015273 0ustar liggesusers 6. How raster functions map to stars functions

6. How raster functions map to stars functions

Sébastien Rochette, Adriano Fantini, Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

Here’s an attempt at the table describing how raster functions map to stars functions, discussed in issue #122. This table uses the functionality of the raster package as a template; it may be incomplete, imprecise or plain wrong, so take it with a pinch of salt. Any comment or correction is hugely appreciated, please contribute!

Some of the functions (filter, slice, mutate, select, pull, …) are provided via dplyr, which must be loaded. See ?stars::dplyr.

COMMENT LEGEND

? = Not sure / unknown

* = Not present, low priority

# = Not present, high priority

NA = Not available by design

Creating objects

raster stars Note/comment
{raster, stack, brick} (read) read_stars or read_stars(along = …)
{stack, brick} (concatenate layers) c or c(along = …)
subset {[ ] , slice, filter}
addLayer c() or c(along = …)
dropLayer {[ ] , slice, filter}
unstack combine lapply and {[ ] , slice, filter}

Changing spatial extent and/or resolution of objects

raster stars Note/comment
merge c #, currently only works for adjacent objects
mosaic st_mosaic these are not identical, read the docs carefully
crop filter, st_crop
setExtent # maybe use st_warp?
trim #
aggregate aggregate WIP; raster’s aggregate with fact=2 will not work, use st_warp in that case?
disaggregate # use st_warp(use_gdal = TRUE)?
resample {st_transform, st_warp}
projectRaster {st_transform, st_warp}
shift #, now use st_set_dimensions
flip [] with reversed index #
rotate *
t NA

Cell based computation

raster stars Note/comment
calc st_apply
overlay c(along = , …) %>% st_apply(…)
cover [ ] <-
mask [ ], st_crop when using an sf polygon as mask
mask [ ]<- NA when using a stars object to mask
cut cut
subs
reclassify mutate with case_when or forcats::fct_recode ?
reclassify cut see https://stackoverflow.com/questions/70619002/reclassify-2d-stars-array/
init [ ] <-
stackApply {[ ] , slice, filter} %>% st_apply
stackSelect

Spatial contextual computation

raster stars Note/comment
distance #
gridDistance *
distanceFromPoints #
direction *
focal f = st_apply(x1, 3, foc, w = matrix(1, 3, 3)) See. issue 176
localFun *
boundaries st_as_sf(as_points=FALSE, merge=TRUE, connect8=TRUE)
clump st_as_sf(r, merge = TRUE) st_as_sf returns polygons, clump a raster
adjacent *
area st_area
terrain #
Moran

Model predictions

raster stars Note/comment
predict predict
interpolate gstat::idw, gstat::krige st_warp has raster-raster interpolations of gdalwarp

Data type conversion

raster stars Note/comment
rasterize st_as_stars
rasterToPoints st_as_sf(as_points=TRUE)
rasterToPolygons st_as_sf(as_points=FALSE, …), st_polygonize
rasterToContour st_contour requires GDAL >= 2.4.0
rasterFromXYZ
rasterFromCells

Summarizing

raster stars Note/comment
cellStats st_apply
summary print, summary(as.vector(. %>% pull))
freq table *
crosstab
unique unique(as.vector(. %>% pull))
zonal *

Accessing values of objects

raster stars Note/comment
getValues {pull, [[ ]]}
getValuesBlock {[ ] , slice, filter} %>% pull
getValuesFocal {[ ] , slice, filter} %>% pull
as.matrix [[ ]] currently behaves somewhat unexpectedly *
as.array [[ ]] currently behaves somewhat unexpectedly *
extract (by cell) {[ ] , slice, filter}
extract (by polygon) x[sf_object]
extract (by point) aggregate(stars_object, sf_object, function(x) x[1], as_points = FALSE)
sampleRandom *
sampleRegular *
minValue purrr::map(x, min)
maxValue purrr::map(x, max)
setMinMax ,

Plotting

raster stars Note/comment
plot plot, geom_stars
plotRGB plot(x, rgb =…)
spplot -
image image
persp -
contour (st_contour, then sf::plot)
filledContour (same)
text text
hist hist(x[[1]])
barplot
density
pairs
boxplot

Getting and setting dimensions

raster stars Note/comment
ncol dim(x)[1] or use name instead of 1; cols may be the second dimension!
nrow dim(x)[2] or use name instead of 2; rows may be the first dimension!
ncell prod(dim(x))
res st_dimensions can also not be a constant in case of rectilinear or curvilinear grids
nlayers - there is no concept of layers in stars
names names
xres st_res(x)[1] may not be a constant in case of rectilinear or curvilinear grids
yres st_res(x)[2] may not be a constant in case of rectilinear or curvilinear grids
xmin st_bbox(x)[1]
xmax st_bbox(x)[3]
ymin st_bbox(x)[2]
ymax st_bbox(x)[4]
extent st_bbox(x) different ordering of numbers
origin -
projection st_crs(x)
isLonLat st_is_longlat(st_crs(x))
filename stars_proxy objects carry file names where otherwise the array data is
bandnr stars has no general concept of bands
nbands dim(x)[3] may also be time; bands may also be in another dimension, or have another name
compareRaster all.equal(st_dimensions(x), st_dimensions(y)) *
NAvalue -

Computing row, column, cell numbers and coordinates

raster stars Note/comment
xFromCol st_get_dimension_values(., ‘x’)[col] I am not sure how to generally get the x dimension name - here it is x
yFromRow st_get_dimension_values(., ‘y’)[row] I am not sure how to generally get the y dimension name - here it is y
xFromCell
yFromCell
xyFromCell
colFromX *
rowFromY *
rowColFromCell
cellFromXY st_cells()
cellFromRowCol
cellsFromExtent
coordinates st_coordinates
validCell
validCol col %>% between(st_dimensions(.)\(x\)from, st_dimensions(.)\(x\)to) raster columns are not always named ‘x’
validRow row %>% between(st_dimensions(.)\(y\)from, st_dimensions(.)\(y\)to) raster columns are not always named ‘y’
setValues [ ] <-
writeRaster write_stars currently uses GDAL, somewhat limited
KML

The format of this table follows the raster-package entry in the raster manual, found at https://cran.r-project.org/web/packages/raster/raster.pdf.

stars/inst/doc/stars1.html0000644000176200001440000172354714644756245015277 0ustar liggesusers 1. introduction

1. introduction

Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

Package stars provides infrastructure for data cubes, array data with labeled dimensions, with emphasis on arrays where some of the dimensions relate to time and/or space.

Spatial data cubes are arrays with one or more spatial dimensions. Raster data cubes have at least two spatial dimensions that form the raster tesselation. Vector data cubes have at least one spatial dimension that may for instance reflect a polygon tesselation, or a set of point locations. Conversions between the two (rasterization, polygonization) are provided. Vector data are represented by simple feature geometries (packages sf). Tidyverse methods are provided.

The stars package is loaded by

library(stars)
## Loading required package: abind
## Loading required package: sf
## Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE

Spatiotemporal arrays are stored in objects of class stars; methods for class stars currently available are

methods(class = "stars")
##  [1] $<-               %in%              Math              Ops              
##  [5] [                 [<-               [[<-              adrop            
##  [9] aggregate         aperm             as.POSIXct        as.data.frame    
## [13] c                 coerce            contour           cut              
## [17] dim               dimnames          dimnames<-        droplevels       
## [21] expand_dimensions hist              image             initialize       
## [25] is.na             merge             plot              prcomp           
## [29] predict           print             show              slotsFromS3      
## [33] split             st_apply          st_area           st_as_sf         
## [37] st_as_sfc         st_as_stars       st_bbox           st_coordinates   
## [41] st_crop           st_crs            st_crs<-          st_dimensions    
## [45] st_dimensions<-   st_downsample     st_extract        st_geometry      
## [49] st_geotransform   st_geotransform<- st_interpolate_aw st_intersects    
## [53] st_join           st_mosaic         st_normalize      st_redimension   
## [57] st_rotate         st_sample         st_set_bbox       st_transform     
## [61] st_write          time              write_stars      
## see '?methods' for accessing help and source code

(tidyverse methods are only visible after loading package tidyverse).

Reading a satellite image

We can read a satellite image through GDAL, e.g. from a GeoTIFF file in the package:

tif = system.file("tif/L7_ETMs.tif", package = "stars")
x = read_stars(tif)
plot(x, axes = TRUE)

We see that the image is geographically referenced (has coordinate values along axes), and that the object returned (x) has three dimensions called x, y and band, and has one attribute:

x
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69 68.91242      86  255
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

Each dimension has a name; the meaning of the fields of a single dimension are:

field meaning
from the origin index (1)
to the final index (dim(x)[i])
offset the start value for this dimension (pixel boundary), if regular
delta the step (pixel, cell) size for this dimension, if regular
refsys the reference system, or proj4string
point logical; whether cells refer to points, or intervals
values the sequence of values for this dimension (e.g., geometries), if irregular

This means that for an index i (starting at \(i=1\)) along a certain dimension, the corresponding dimension value (coordinate, time) is \(\mbox{offset} + (i-1) \times \mbox{delta}\). This value then refers to the start (edge) of the cell or interval; in order to get the interval middle or cell centre, one needs to add half an offset.

Dimension band is a simple sequence from 1 to 6. Since bands refer to colors, one could put their wavelength values in the values field.

For this particular dataset (and most other raster datasets), we see that delta for dimension y is negative: this means that consecutive array values have decreasing \(y\) values: cell indexes increase from top to bottom, in the direction opposite to the \(y\) axis.

read_stars reads all bands from a raster dataset, or optionally a subset of raster datasets, into a single stars array structure. While doing so, raster values (often UINT8 or UINT16) are converted to double (numeric) values, and scaled back to their original values if needed if the file encodes the scaling parameters.

The data structure stars is a generalization of the tbl_cube found in cubelyr; we can convert to that by

library(cubelyr)
as.tbl_cube(x)
## Source: local array [737,088 x 3]
## D: x [dbl, 349]
## D: y [dbl, 352]
## D: band [int, 6]
## M: L7_ETMs.tif [dbl[,352,6]]

but this will cause a loss of certain properties (cell size, reference system, vector geometries)

Switching attributes to dimensions and back

(x.spl = split(x, "band"))
## stars object with 2 dimensions and 6 attributes
## attribute(s):
##     Min. 1st Qu. Median     Mean 3rd Qu. Max.
## X1    47      67     78 79.14772      89  255
## X2    32      55     66 67.57465      79  255
## X3    21      49     63 64.35886      77  255
## X4     9      52     63 59.23541      75  255
## X5     1      63     89 83.18266     112  255
## X6     1      32     60 59.97521      88  255
## dimension(s):
##   from  to  offset delta                     refsys point x/y
## x    1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y    1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
merge(x.spl)
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##                    Min. 1st Qu. Median     Mean 3rd Qu. Max.
## X1.X2.X3.X4.X5.X6     1      54     69 68.91242      86  255
## dimension(s):
##            from  to  offset delta                     refsys point    values
## x             1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE      NULL
## y             1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE      NULL
## attributes    1   6      NA    NA                         NA    NA X1,...,X6
##            x/y
## x          [x]
## y          [y]
## attributes

We see that the newly created dimension lost its name, and the single attribute got a default name. We can set attribute names with setNames, and dimension names and values with st_set_dimensions:

merge(x.spl) |>
  setNames(names(x)) |> 
  st_set_dimensions(3, values = paste0("band", 1:6)) |>
  st_set_dimensions(names = c("x", "y", "band"))
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median     Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69 68.91242      86  255
## dimension(s):
##      from  to  offset delta                     refsys point          values
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE            NULL
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE            NULL
## band    1   6      NA    NA                         NA    NA band1,...,band6
##      x/y
## x    [x]
## y    [y]
## band

Subsetting

Besides the tidyverse subsetting and selection operators explained in this vignette, we can also use [ and [[.

Since stars objects are a list of arrays with a metadata table describing dimensions, list extraction (and assignment) works as expected:

class(x[[1]])
## [1] "array"
dim(x[[1]])
##    x    y band 
##  349  352    6
x$two = 2 * x[[1]]
x
## stars object with 3 dimensions and 2 attributes
## attribute(s):
##              Min. 1st Qu. Median      Mean 3rd Qu. Max.
## L7_ETMs.tif     1      54     69  68.91242      86  255
## two             2     108    138 137.82484     172  510
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1 349  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    1   6      NA    NA                         NA    NA

At this level, we can work with array objects directly.

The stars subset operator [ works a bit different: its

  • first argument selects attributes
  • second argument selects the first dimension
  • third argument selects the second dimension, etc

Thus,

x["two", 1:10, , 2:4]
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##      Min. 1st Qu. Median     Mean 3rd Qu. Max.
## two    36     100    116 119.7326     136  470
## dimension(s):
##      from  to  offset delta                     refsys point x/y
## x       1  10  288776  28.5 SIRGAS 2000 / UTM zone 25S FALSE [x]
## y       1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE [y]
## band    2   4      NA    NA                         NA    NA

selects the second attribute, the first 10 columns (x-coordinate), all rows, and bands 2-4.

Alternatively, when [ is given a single argument of class sf, sfc or bbox, [ will work as a crop operator:

circle = st_sfc(st_buffer(st_point(c(293749.5, 9115745)), 400), crs = st_crs(x))
plot(x[circle][, , , 1], reset = FALSE)
plot(circle, col = NA, border = 'red', add = TRUE, lwd = 2)

Overviews

We can read rasters at a lower resolution when they contain so-called overviews. For this GeoTIFF file, they were created with the gdaladdo utility, in particular

gdaladdo -r average L7_ETMs.tif  2 4 8 16

which adds coarse resolution versions by using the average resampling method to compute values based on blocks of pixels. These can be read by

x1 = read_stars(tif, options = c("OVERVIEW_LEVEL=1"))
x2 = read_stars(tif, options = c("OVERVIEW_LEVEL=2"))
x3 = read_stars(tif, options = c("OVERVIEW_LEVEL=3"))
dim(x1)
##    x    y band 
##   88   88    6
dim(x2)
##    x    y band 
##   44   44    6
dim(x3)
##    x    y band 
##   22   22    6
par(mfrow = c(1, 3), mar = rep(0.2, 4))
image(x1[,,,1])
image(x2[,,,1])
image(x3[,,,1])

Reading a raster time series: NetCDF

Another example is when we read raster time series model outputs in a NetCDF file, e.g. by

system.file("nc/bcsd_obs_1999.nc", package = "stars") |>
    read_stars() -> w
## pr, tas,

We see that

w
## stars object with 3 dimensions and 2 attributes
## attribute(s):
##                 Min.   1st Qu.   Median      Mean   3rd Qu.      Max. NA's
## pr [mm/m]  0.5900000 56.139999 81.88000 101.26433 121.07250 848.54999 7116
## tas [C]   -0.4209678  8.898887 15.65763  15.48932  21.77979  29.38581 7116
## dimension(s):
##      from to offset  delta  refsys                    values x/y
## x       1 81    -85  0.125      NA                      NULL [x]
## y       1 33  37.12 -0.125      NA                      NULL [y]
## time    1 12     NA     NA POSIXct 1999-01-31,...,1999-12-31

For this dataset we can see that

  • variables have units associated (and a wrong unit, C is assigned to temperature)
  • time is now a dimension, with proper units and time steps

Alternatively, this dataset can be read using read_ncdf, as in

system.file("nc/bcsd_obs_1999.nc", package = "stars") |>
    read_ncdf()
## no 'var' specified, using pr, tas
## other available variables:
##  latitude, longitude, time
## Will return stars object with 32076 cells.
## No projection information found in nc file. 
##  Coordinate variable units found to be degrees, 
##  assuming WGS84 Lat/Lon.
## stars object with 3 dimensions and 2 attributes
## attribute(s):
##                 Min.   1st Qu.   Median      Mean   3rd Qu.      Max. NA's
## pr [mm/m]  0.5900000 56.139999 81.88000 101.26433 121.07250 848.54999 7116
## tas [C]   -0.4209678  8.898887 15.65763  15.48932  21.77979  29.38581 7116
## dimension(s):
##           from to offset delta         refsys                    values x/y
## longitude    1 81    -85 0.125 WGS 84 (CRS84)                      NULL [x]
## latitude     1 33     33 0.125 WGS 84 (CRS84)                      NULL [y]
## time         1 12     NA    NA        POSIXct 1999-01-31,...,1999-12-31

The difference between read_ncdf and read_stars for NetCDF files is that the former uses package RNetCDF to directly read the NetCDF file, where the latter uses the GDAL driver for NetCDF files.

Reading datasets from multiple files

Model data are often spread across many files. An example of a 0.25 degree grid, global daily sea surface temperature product is found here; the subset from 1981 used below was downloaded from a NOAA ftp site that is no longer available in this form. (ftp site used to be eclipse.ncdc.noaa.gov/pub/OI-daily-v2/NetCDF/1981/AVHRR/).

We read the data by giving read_stars a vector with character names:

x = c(
"avhrr-only-v2.19810901.nc",
"avhrr-only-v2.19810902.nc",
"avhrr-only-v2.19810903.nc",
"avhrr-only-v2.19810904.nc",
"avhrr-only-v2.19810905.nc",
"avhrr-only-v2.19810906.nc",
"avhrr-only-v2.19810907.nc",
"avhrr-only-v2.19810908.nc",
"avhrr-only-v2.19810909.nc"
)
# see the second vignette:
# install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source")
file_list = system.file(paste0("netcdf/", x), package = "starsdata")
(y = read_stars(file_list, quiet = TRUE))
## stars object with 4 dimensions and 4 attributes
## attribute(s), summary of first 1e+05 cells:
##                Min. 1st Qu. Median       Mean 3rd Qu. Max.  NA's
## sst [C*°]     -1.80   -1.19  -1.05 -0.3201670   -0.20 9.36 13360
## anom [C*°]    -4.69   -0.06   0.52  0.2299385    0.71 3.70 13360
## err [C*°]      0.11    0.30   0.30  0.2949421    0.30 0.48 13360
## ice [percent]  0.01    0.73   0.83  0.7657695    0.87 1.00 27377
## dimension(s):
##      from   to         offset  delta  refsys x/y
## x       1 1440              0   0.25      NA [x]
## y       1  720             90  -0.25      NA [y]
## zlev    1    1          0 [m]     NA      NA    
## time    1    9 1981-09-01 UTC 1 days POSIXct

Next, we select sea surface temperature (sst), and drop the singular zlev (depth) dimension using adrop:

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(abind)
z <- y |> select(sst) |> adrop()

We can now graph the sea surface temperature (SST) using ggplot, which needs data in a long table form, and without units:

# convert POSIXct time to character, to please ggplot's facet_wrap()
z1 = st_set_dimensions(z, 3, values = as.character(st_get_dimension_values(z, 3)))
library(ggplot2)
library(viridis)
## Loading required package: viridisLite
library(ggthemes)
ggplot() +  
  geom_stars(data = z1[1], alpha = 0.8, downsample = c(10, 10, 1)) + 
  facet_wrap("time") +
  scale_fill_viridis() +
  coord_equal() +
  theme_map() +
  theme(legend.position = "bottom") +
  theme(legend.key.width = unit(2, "cm"))

Writing stars objects to disk

We can write a stars object to disk by using write_stars; this used the GDAL write engine. Writing NetCDF files without going through the GDAL interface is currently not supported. write_stars currently writes only a single attribute:

write_stars(adrop(y[1]), "sst.tif")

See the explanation of merge above to see how multiple attributes can be merged (folded) into a dimension.

Cropping a raster’s extent

Using a curvilinear grid, taken from the example of read_ncdf:

prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars")
prec = read_ncdf(prec_file, curvilinear = c("lon", "lat"))
## no 'var' specified, using Total_precipitation_surface_1_Hour_Accumulation
## other available variables:
##  lat, lon, time
## Will return stars object with 236118 cells.
## No projection information found in nc file. 
##  Coordinate variable units found to be degrees, 
##  assuming WGS84 Lat/Lon.
##plot(prec) ## gives error about unique breaks
## remove NAs, zeros, and give a large number
## of breaks (used for validating in detail)
qu_0_omit = function(x, ..., n = 22) {
  if (inherits(x, "units"))
    x = units::drop_units(na.omit(x))
  c(0, quantile(x[x > 0], seq(0, 1, length.out = n)))
}
library(dplyr) # loads slice generic
prec_slice = slice(prec, index = 17, along = "time")
plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE)
nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg")
plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red')

We can now crop the grid to those cells falling in

nc = st_transform(nc, st_crs(prec_slice)) # datum transformation
plot(prec_slice[nc], border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE)
plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red')

The selection prec_slice[nc] essentially calls st_crop(prec_slice, nc) to get a cropped selection. What happened here is that all cells not intersecting with North Carolina (sea) are set to NA values. For regular grids, the extent of the resulting stars object is also be reduced (cropped) by default; this can be controlled with the crop parameter to st_crop and [.stars.

Vector data cube example

Like tbl_cube, stars arrays have no limits to the number of dimensions they handle. An example is the origin-destination (OD) matrix, by time and travel mode.

OD: space x space x travel mode x time x time

We create a 5-dimensional matrix of traffic between regions, by day, by time of day, and by travel mode. Having day and time of day each as dimension is an advantage when we want to compute patterns over the day, for a certain period.

nc = st_read(system.file("gpkg/nc.gpkg", package="sf")) 
## Reading layer `nc.gpkg' from data source 
##   `/home/edzer/R/x86_64-pc-linux-gnu-library/4.4/sf/gpkg/nc.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 100 features and 14 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS:  NAD27
to = from = st_geometry(nc) # 100 polygons: O and D regions
mode = c("car", "bike", "foot") # travel mode
day = 1:100 # arbitrary
library(units)
## udunits database from /usr/share/xml/udunits/udunits2.xml
units(day) = as_units("days since 2015-01-01")
hour = set_units(0:23, h) # hour of day
dims = st_dimensions(origin = from, destination = to, mode = mode, day = day, hour = hour)
(n = dim(dims))
##      origin destination        mode         day        hour 
##         100         100           3         100          24
traffic = array(rpois(prod(n), 10), dim = n) # simulated traffic counts
(st = st_as_stars(list(traffic = traffic),  dimensions = dims))
## stars object with 5 dimensions and 1 attribute
## attribute(s), summary of first 1e+05 cells:
##          Min. 1st Qu. Median    Mean 3rd Qu. Max.
## traffic     0       8     10 9.99579      12   26
## dimension(s):
##             from  to                      offset                       delta
## origin         1 100                          NA                          NA
## destination    1 100                          NA                          NA
## mode           1   3                          NA                          NA
## day            1 100 1 [(days since 2015-01-01)] 1 [(days since 2015-01-01)]
## hour           1  24                       0 [h]                       1 [h]
##              refsys point
## origin        NAD27 FALSE
## destination   NAD27 FALSE
## mode             NA FALSE
## day         udunits FALSE
## hour        udunits FALSE
##                                                                    values
## origin      MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572...
## destination MULTIPOLYGON (((-81.47276...,...,MULTIPOLYGON (((-78.65572...
## mode                                                     car , bike, foot
## day                                                                  NULL
## hour                                                                 NULL

This array contains the simple feature geometries of origin and destination so that we can directly plot every slice without additional table joins. If we want to represent such an array as a tbl_cube, the simple feature geometry dimensions need to be replaced by indexes:

st |> as.tbl_cube()
## Source: local array [72,000,000 x 5]
## D: origin [int, 100]
## D: destination [int, 100]
## D: mode [chr, 3]
## D: day [[(days since 2015-01-01)], 100]
## D: hour [[h], 24]
## M: traffic [int[,100,3,100,24]]

The following demonstrates how we can use dplyr to filter travel mode bike, and compute mean bike traffic by hour of day:

b <- st |> 
  as.tbl_cube() |> 
  filter(mode == "bike") |> 
  group_by(hour) |>
  summarise(traffic = mean(traffic)) |> 
  as.data.frame()
require(ggforce) # for plotting a units variable
## Loading required package: ggforce
ggplot() +  
  geom_line(data = b, aes(x = hour, y = traffic))
## Warning: The `scale_name` argument of `continuous_scale()` is deprecated as of ggplot2
## 3.5.0.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Extracting at point locations, aggregating over polygons

Data cube values at point location can be extracted by st_extract, an example is found in vignette 7

Aggregates, such as mean, maximum or modal values can be obtained by aggregate. In this example we use a categorical raster, and try to find the modal (most frequent) class within two circular polygons:

s = system.file("tif/lc.tif", package = "stars")
r = read_stars(s, proxy = FALSE) |> droplevels()
levels(r[[1]]) = abbreviate(levels(r[[1]]), 10) # shorten text labels
st_point(c(3190631, 3125)) |> st_sfc(crs = st_crs(r)) |> st_buffer(25000) -> pol1
st_point(c(3233847, 21027)) |> st_sfc(crs = st_crs(r)) |> st_buffer(10000) -> pol2
if (isTRUE(dev.capabilities()$rasterImage == "yes")) {
  plot(r, reset = FALSE, key.pos = 4)
  plot(c(pol1, pol2), col = NA, border = c('yellow', 'green'), lwd = 2, add = TRUE)
}

To find the modal value, we need a function that gives back the label corresponding to the class which is most frequent, using table:

f = function(x) { tb = table(x); names(tb)[which.max(tb)] }

We can then call aggregate on the raster map, and the set of the two circular polygons pol1 and pol2, and pass the function f:

aggregate(r, c(pol1, pol2), f) |> st_as_sf()
## Simple feature collection with 2 features and 1 field
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 3165631 ymin: -21875 xmax: 3243847 ymax: 31027
## Projected CRS: Albers Conical Equal Area
##       lc.tif                       geometry
## 1 EvrgrnFrst POLYGON ((3215631 3125, 321...
## 2 Dvlpd,MdmI POLYGON ((3243847 21027, 32...
stars/inst/doc/stars5.R0000644000176200001440000000433714644756273014525 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(sf)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ev = TRUE ## ----------------------------------------------------------------------------- library(stars) system.file("gpkg/nc.gpkg", package = "sf") %>% read_sf() %>% st_transform(32119) -> nc nc$dens = nc$BIR79 / units::set_units(st_area(nc), km^2) (nc.st = st_rasterize(nc["dens"], dx = 5000, dy = 5000)) plot(nc.st) ## ----------------------------------------------------------------------------- tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif)[, 1:50, 1:50, 1:2] x[[1]] = round(x[[1]]/5) ## ----eval=ev------------------------------------------------------------------ l = st_contour(x, contour_lines = TRUE, breaks = 11:15) plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8) ## ----------------------------------------------------------------------------- st_as_sf(x, as_points = TRUE, merge = FALSE) ## ----------------------------------------------------------------------------- st_as_sf(x, as_points = TRUE, merge = FALSE, long = TRUE) ## ----------------------------------------------------------------------------- st_as_sf(x[1], as_points = FALSE, merge = FALSE) ## ----------------------------------------------------------------------------- p = st_as_sf(x, as_points = FALSE, merge = TRUE) ## ----------------------------------------------------------------------------- plot(p) ## ----------------------------------------------------------------------------- x.sf = st_xy2sfc(x, as_points = TRUE) x.sf ## ----------------------------------------------------------------------------- nc.st %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") -> nc.curv nc.curv plot(nc.curv, border = NA, graticule = TRUE) ## ----------------------------------------------------------------------------- nc %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") %>% st_bbox() %>% st_as_stars() -> newgrid ## ----------------------------------------------------------------------------- nc.st %>% st_warp(newgrid) -> nc.new nc.new plot(nc.new) stars/inst/doc/stars5.html0000644000176200001440000066177714644756273015311 0ustar liggesusers 5. vector-raster conversions, reprojection, warping

5. vector-raster conversions, reprojection, warping

Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

This vignette shows how stars object can be moved from vector and raster representations.

Rasterizing an sf vector object

library(stars)
system.file("gpkg/nc.gpkg", package = "sf") %>%
  read_sf() %>%
  st_transform(32119) -> nc
nc$dens = nc$BIR79 / units::set_units(st_area(nc), km^2)
(nc.st = st_rasterize(nc["dens"], dx = 5000, dy = 5000))
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##                    Min.  1st Qu. Median     Mean  3rd Qu.     Max. NA's
## dens [1/km^2] 0.2545128 1.225654 1.9322 3.345956 3.825793 21.24795 4808
## dimension(s):
##   from  to offset delta                 refsys point x/y
## x    1 162 123830  5000 NAD83 / North Carolina FALSE [x]
## y    1  61 318256 -5000 NAD83 / North Carolina FALSE [y]
plot(nc.st)

The algorithm used is the GDAL rasterize utility, all options of this utility can be passed to st_rasterize. The geometry of the final raster can be controlled by passing a target bounding box and either the raster dimensions nx and ny, or pixel size by the dx and dy parameters.

Vectorizing a raster object to an sf object

stars objects can be converted into an sf object using st_as_sf. It has a number of options, depending on whether pixels represent the point value at the pixel center, or small square polygons with a single value.

We will work again with the landsat-7 6-band image, but will select the first band and round the values:

tif = system.file("tif/L7_ETMs.tif", package = "stars")
x = read_stars(tif)[, 1:50, 1:50, 1:2]
x[[1]] = round(x[[1]]/5)

Polygonizing

In case raster cells reflect point values and we want to get a vector representation of the whole field, we can draw contour lines and export the contour sets (only available when the GDAL version is at least 2.4.0):

l =  st_contour(x, contour_lines = TRUE, breaks = 11:15)
plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8)

Exporting to points

Alternatively, we can simply export all the pixels as points, and get them either as a wide table with all bands per point, and no replicated POINT geometries:

st_as_sf(x, as_points = TRUE, merge = FALSE)
## Simple feature collection with 2500 features and 2 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 288790.5 ymin: 9119350 xmax: 290187 ymax: 9120747
## Projected CRS: SIRGAS 2000 / UTM zone 25S
## First 10 features:
##    L7_ETMs.tif.V1 L7_ETMs.tif.V2                 geometry
## 1              14             11 POINT (288790.5 9120747)
## 2              14             11   POINT (288819 9120747)
## 3              13             10 POINT (288847.5 9120747)
## 4              12              9   POINT (288876 9120747)
## 5              12             10 POINT (288904.5 9120747)
## 6              12             10   POINT (288933 9120747)
## 7              12             10 POINT (288961.5 9120747)
## 8              12             10   POINT (288990 9120747)
## 9              13             10 POINT (289018.5 9120747)
## 10             13             10   POINT (289047 9120747)

or as a long table with a single attribute and all points replicated:

st_as_sf(x, as_points = TRUE, merge = FALSE, long = TRUE)
## Simple feature collection with 5000 features and 2 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 288790.5 ymin: 9119350 xmax: 290187 ymax: 9120747
## Projected CRS: SIRGAS 2000 / UTM zone 25S
## First 10 features:
##    band L7_ETMs.tif                 geometry
## 1     1          14 POINT (288790.5 9120747)
## 2     1          14   POINT (288819 9120747)
## 3     1          13 POINT (288847.5 9120747)
## 4     1          12   POINT (288876 9120747)
## 5     1          12 POINT (288904.5 9120747)
## 6     1          12   POINT (288933 9120747)
## 7     1          12 POINT (288961.5 9120747)
## 8     1          12   POINT (288990 9120747)
## 9     1          13 POINT (289018.5 9120747)
## 10    1          13   POINT (289047 9120747)

as we can see, an additional attribute band now indicates which band is concerned.

Exporting to polygons

Alternatively, we can export to polygons and either get a single polygon per pixel, as in

st_as_sf(x[1], as_points = FALSE, merge = FALSE)
## Simple feature collection with 2500 features and 2 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: 288776.3 ymin: 9119336 xmax: 290201.3 ymax: 9120761
## Projected CRS: SIRGAS 2000 / UTM zone 25S
## First 10 features:
##    L7_ETMs.tif.V1 L7_ETMs.tif.V2                       geometry
## 1              14             11 POLYGON ((288776.3 9120761,...
## 2              14             11 POLYGON ((288804.8 9120761,...
## 3              13             10 POLYGON ((288833.3 9120761,...
## 4              12              9 POLYGON ((288861.8 9120761,...
## 5              12             10 POLYGON ((288890.3 9120761,...
## 6              12             10 POLYGON ((288918.8 9120761,...
## 7              12             10 POLYGON ((288947.3 9120761,...
## 8              12             10 POLYGON ((288975.8 9120761,...
## 9              13             10 POLYGON ((289004.3 9120761,...
## 10             13             10 POLYGON ((289032.8 9120761,...

or merge polygons that have identical pixel values;

p = st_as_sf(x, as_points = FALSE, merge = TRUE)

When plotted with boundaries, we see the resolved boundaries of areas with the same pixel value:

plot(p)

A further option connect8 can be set to TRUE to use 8 connectedness, rather than the default 4 connectedness algorithm. In both cases, the polygons returned will often be invalid according to the simple feature standard, but can be made valid using lwgeom::st_make_valid.

Switching between vector and raster in stars objects

We can convert a raster dimension to a vector dimension while keeping other dimensions as they are in a stars object by

x.sf = st_xy2sfc(x, as_points = TRUE)
x.sf
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##              Min. 1st Qu. Median    Mean 3rd Qu. Max.
## L7_ETMs.tif     7       9     11 11.2548      12   28
## dimension(s):
##          from   to                     refsys point
## geometry    1 2500 SIRGAS 2000 / UTM zone 25S  TRUE
## band        1    2                         NA    NA
##                                                       values
## geometry POINT (288790.5 9120747),...,POINT (290187 9119350)
## band                                                    NULL

which also requires setting the as_points arguments as in st_as_sf.

Reprojecting a raster

If we accept that curvilinear rasters are rasters too, and that regular and rectilinear grids are special cases of curvilinear grids, reprojecting a raster is no longer a “problem”, it just recomputes new coordinates for every raster cell, and generally results in a curvilinear grid (that sometimes can be brought back to a regular or rectilinear grid). If curvilinear grid cells are represented by coordinates of the cell center, the actual shape of a grid cell gets lost, and this may be a larger effect if grid cells are large or if the transformation is stronger non-linear.

An example of the reprojection of the grid created above is

nc.st %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") -> nc.curv
nc.curv
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##                    Min.  1st Qu. Median     Mean  3rd Qu.     Max. NA's
## dens [1/km^2] 0.2545128 1.225654 1.9322 3.345956 3.825793 21.24795 4808
## dimension(s):
##   from  to                       refsys point                         values
## x    1 162 +proj=laea +lat_0=34 +lon... FALSE [162x61] -2210936,...,-1371611
## y    1  61 +proj=laea +lat_0=34 +lon... FALSE      [162x61] 90646,...,538200
##   x/y
## x [x]
## y [y]
## curvilinear grid
plot(nc.curv, border = NA, graticule = TRUE)

where it should be noted that the dimensionality of the grid didn’t change: the same set of raster cells has been replotted in the new CRS, but now in a curvilinear grid.

Warping a raster

Warping a raster means creating a new regular grid in a new CRS, based on a (usually regular) grid in another CRS. We can do the transformation of the previous section by first creating a target grid:

nc %>% st_transform("+proj=laea +lat_0=34 +lon_0=-60") %>% st_bbox() %>%
    st_as_stars() -> newgrid

and then warping the old raster to the new

nc.st %>% st_warp(newgrid) -> nc.new
nc.new 
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##                    Min.  1st Qu. Median     Mean  3rd Qu.     Max.  NA's
## dens [1/km^2] 0.2545128 1.225654 1.9322 3.344844 3.825793 21.24795 36155
## dimension(s):
##   from  to   offset delta                       refsys x/y
## x    1 380 -2188108  2098 +proj=laea +lat_0=34 +lon... [x]
## y    1 171   494920 -2098 +proj=laea +lat_0=34 +lon... [y]
plot(nc.new)

This new object has a regular grid in the new CRS, aligned with the new x- and y-axes.

stars/inst/doc/stars4.Rmd0000644000176200001440000002652214644756215015041 0ustar liggesusers--- title: '4. stars data model' author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{4. stars data model} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") set.seed(13579) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` This vignette explains the data model of `stars` objects, illustrated using artificial and real datasets. ## Stars objects `stars` objects consist of * a (possibly empty) named list of arrays, each having named dimensions (`dim`) attribute * an attribute called `dimensions` of class `dimensions` that carries dimension metadata * a class name that includes `stars` A `dimensions` object is a named list of `dimension` elements, each describing the semantics a dimension of the data arrays (space, time, type etc). In addition to that, a `dimensions` object has an attribute called `raster` of class `stars_raster`, which is a named list with three elements: * `dimensions` length 2 character; the dimension names that constitute a spatial raster (or NA) * `affine` length 2 numeric; the two affine parameters of the geotransform (or NA) * `curvilinear` a boolean indicating whether a raster is a curvilinear raster (or NA) The `affine` and `curvilinear` values are only relevant in case of raster data, indicated by `dimensions` to have non-NA values. A `dimension` object describes a _single_ dimension; it is a list with named elements * `from`: (numeric length 1): the start index of the array * `to`: (numeric length 1): the end index of the array * `offset`: (numeric length 1): the start coordinate (or time) value of the first pixel (i.e., a pixel/cell boundary) * `delta`: (numeric length 1): the increment, or cell size * `refsys`: (character, or `crs`): object describing the reference system; e.g. the PROJ string, or string `POSIXct` or `PCICt` (for 360 and 365 days/year calendars), or object of class `crs` (containing both EPSG code and proj4string) * `point`: (logical length 1): boolean indicating whether cells/pixels refer to areas/periods, or to points/instances (may be NA) * `values`: one of * `NULL` (missing), * a vector with coordinate values (numeric, `POSIXct`, `PCICt`, or `sfc`), * an object of class `intervals` (a list with two vectors, `start` and `end`, with interval start- and end-values), or * a matrix with longitudes or latitudes for all cells (in case of curvilinear grids) `from` and `to` will usually be 1 and the dimension size, but `from` may be larger than 1 in case a sub-grid got was selected (or cropped). `offset` and `delta` only apply to _regularly_ discretized dimensions, and are `NA` if this is not the case. If they are `NA`, dimension values may be held in the `values` field. Rectilinear and curvilinear grids need grid values in `values` that can be either: * for rectilinear grids: irregularly _spaced_ coordinate values, or coordinate _intervals_ of irregular width (a rectilinear grid _can_ have one dimension that is regular), * for curvilinear grids: or a matrix with grid cell centre values for _all_ row/col combinations (usually in longitude or latitude). Alternatively, `values` can contains a set of spatial geometries encoded in an `sfc` vector ("list-column"), in which case we have a [vector data cube](https://r-spatial.org/r/2022/09/12/vdc.html). ## Grid type ### Regular grids With a very simple file created from a $4 \times 5$ matrix ```{r fig.width=4.5, fig.height=4} suppressPackageStartupMessages(library(stars)) m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) ``` we see that * the rows (5) are mapped to the first dimension, the x-coordinate * the columns (4) are mapped to the second dimension, the y-coordinate * the `from` and `to` fields of each dimension define a range that corresponds to the array dimension: ```{r} dim(s[[1]]) ``` * offset and delta specify how increasing row and column index maps to x and y coordinate values respectively. When we plot this object, using the `image` method for `stars` objects, ```{r fig.width=4.5, fig.height=4} image(s, text_values = TRUE, axes = TRUE) ``` we see that $(0,0)$ is the origin of the grid (grid corner), and $1$ the coordinate value increase from one index (row, col) to the next. It means that consecutive matrix columns represent grid lines, going from south to north. Grids defined this way are **regular**: grid cell size is constant everywhere. Many actual grid datasets have y coordinates (grid rows) going from North to South (top to bottom); this is realised with a negative value for `delta`. We see that the grid origin $(0,0)$ did not change: ```{r fig.width=4.5, fig.height=4} attr(s, "dimensions")[[2]]$delta = -1 image(s, text_values = TRUE, axes = TRUE) ``` An example is the GeoTIFF carried in the package, which, as probably all data sources read through GDAL, has a negative `delta` for the `y`-coordinate: ```{r} tif = system.file("tif/L7_ETMs.tif", package = "stars") st_dimensions(read_stars(tif))["y"] ``` ### Raster attributes, rotated and sheared grids Dimension tables of `stars` objects carry a `raster` attribute: ```{r} str(attr(st_dimensions(s), "raster")) ``` which is a list that holds * `dimensions`: character, the names of raster dimensions (if any), as opposed to e.g. spectral, temporal or other dimensions * `affine`: numeric, the affine parameters * `curvilinear`: a logical indicating whether the raster is curvilinear These fields are needed at this level, because they describe properties of the array at a higher level than individual dimensions do: a pair of dimensions forms a raster, both `affine` and `curvilinear` describe how x and y _as a pair_ are derived from grid indexes (see below) when this cannot be done on a per-dimension basis. With two affine parameters $a_1$ and $a_2$, $x$ and $y$ coordinates are derived from (1-based) grid indexes $i$ and $j$, grid offset values $o_x$ and $o_y$, and grid cell sizes $d_x$ and $d_y$ by $$x = o_x + (i-1) d_x + (j-1) a_1$$ $$y = o_y + (i-1) a_2 + (j-1) d_y$$ Clearly, when $a_1=a_2=0$, $x$ and $y$ are entirely derived from their respective index, offset and cellsize. Note that for integer indexes, the coordinates are that of the starting edge of a grid cell; to get the grid cell center of the top left grid cell (in case of a negative $d_y$), use $i=1.5$ and $j=1.5$. We can rotate grids by setting $a_1$ and $a_2$ to a non-zero value: ```{r} attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.1) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) ``` The rotation angle, in degrees, is ```{r} atan2(0.1, 1) * 180 / pi ``` Sheared grids are obtained when the two rotation coefficients, $a_1$ and $a_2$, are unequal: ```{r} attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.2) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) ``` Now, the y-axis and x-axis have different rotation in degrees of respectively ```{r} atan2(c(0.1, 0.2), 1) * 180 / pi ``` ## Rectilinear grids [Rectilinear grids](https://en.wikipedia.org/wiki/Regular_grid) have orthogonal axes, but do not have congruent (equally sized and shaped) cells: each axis has its own irregular subdivision. We can define a rectilinear grid by specifying the cell _boundaries_, meaning for every dimension we specify _one more_ value than the dimension size: ```{r} x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) image(r, axes = TRUE, col = grey((1:20)/20)) ``` Would we leave out the last value, than `stars` may come up with a _different_ cell boundary for the last cell, as this is now derived from the width of the one-but-last cell: ```{r} x = c(0, 0.5, 1, 2, 4) # 5 numbers: offsets only! y = c(0.3, 0.5, 1, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) ``` This is not problematic if cells have a constant width, in which case the boundaries are reduced to an `offset` and `delta` value, irrespective whether an upper boundary is given: ```{r} x = c(0, 1, 2, 3, 4) # 5 numbers: offsets only! y = c(0.5, 1, 1.5, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) ``` Alternatively, one can also set the _cell midpoints_ by specifying arguments `cell_midpoints` to the `st_dimensions` call: ```{r} x = st_as_stars(matrix(1:9, 3, 3), st_dimensions(x = c(1, 2, 3), y = c(2, 3, 10), cell_midpoints = TRUE)) ``` When the dimension is regular, this results in `offset` being shifted back with half a `delta`, or else in intervals derived from the distances between cell centers. This should obviously not be done when cell boundaries are specified. ## Curvilinear grids Curvilinear grids are grids whose grid lines are not straight. Rather than describing the curvature parametrically, the typical (HDF5 or NetCDF) files in which they are found have two raster layers with the longitudes and latitudes for every corresponding pixel of remaining layers. As an example, we will use a Sentinel 5P dataset available from package `starsdata`; this package can be installed with ```{r eval=FALSE} install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") ``` The dataset is found here: ```{r} (s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata")) ``` ```{r echo=FALSE} EVAL = s5p != "" ``` We can construct the curvilinear `stars` raster by calling `read_stars` on the right sub-array: ```{r eval=EVAL} subs = gdal_subdatasets(s5p) subs[[6]] ``` For this array, we can see the GDAL metadata under item `GEOLOCATION`: ```{r eval=EVAL} gdal_metadata(subs[[6]], "GEOLOCATION") ``` which reveals where, in this dataset, the longitude and latitude arrays are kept. ```{r eval=EVAL} nit.c = read_stars(subs[[6]]) threshold = units::set_units(9e+36, mol/m^2) nit.c[[1]][nit.c[[1]] > threshold] = NA nit.c ``` The curvilinear array has the actual arrays (raster layers, matrices) with longitude and latitude values read in its dimension table. We can plot this file: ```{r eval=EVAL} plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` ```{r eval=EVAL} plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` We can downsample the data by ```{r eval=EVAL} (nit.c_ds = stars:::st_downsample(nit.c, 8)) plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` which doesn't look nice, but plotting the cells as polygons looks better: ```{r eval=EVAL} plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ``` Another approach would be to warp the curvilinear grid to a regular grid, e.g. by ```{r eval=EVAL} w = st_warp(nit.c, crs = 4326, cellsize = 0.25) plot(w) ``` stars/inst/doc/stars6.R0000644000176200001440000001702614644756274014526 0ustar liggesusers## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set(echo = FALSE, collapse = TRUE, dev = "png") suppressPackageStartupMessages(library(dplyr)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "{raster, stack, brick} (read)", "read_stars or read_stars(along = ...)","", "{stack, brick} (concatenate layers)", "c or c(along = ...)","", "subset", "{[ ] , slice, filter}","", "addLayer", "c() or c(along = ...)","", "dropLayer", "{[ ] , slice, filter}","", "unstack", "combine lapply and {[ ] , slice, filter}","" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "merge", "c", "#, currently only works for adjacent objects", "mosaic", "st_mosaic", "these are not identical, read the docs carefully", "crop", "filter, st_crop", "", "setExtent", "", "# maybe use st_warp?", "trim", "", "#", "aggregate", "aggregate", "WIP; raster's aggregate with fact=2 will not work, use st_warp in that case?", "disaggregate", "", "# use st_warp(use_gdal = TRUE)?", "resample", "{st_transform, st_warp}", "", "projectRaster", "{st_transform, st_warp}", "", "shift", "", "#, now use st_set_dimensions", "flip", "[] with reversed index", "#", "rotate", "", "*", "t", "", "NA" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "calc", "st_apply", "", "overlay", "c(along = , ...) %>% st_apply(...)", "", "cover", "[ ] <-", "", "mask", "[ ], st_crop", "when using an sf polygon as mask", "mask", "[ ]<- NA", "when using a stars object to mask", "cut", "cut", "", "subs", "", "", "reclassify", "mutate with case_when", "or forcats::fct_recode ?", "reclassify", "cut", "see https://stackoverflow.com/questions/70619002/reclassify-2d-stars-array/", "init", "[ ] <-", "", "stackApply", "{[ ] , slice, filter} %>% st_apply", "", "stackSelect", "", "", ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "distance", "", "#", "gridDistance", "", "*", "distanceFromPoints", "", "#", "direction", "", "*", "focal", "f = st_apply(x1, 3, foc, w = matrix(1, 3, 3))", "See. [issue 176](https://github.com/r-spatial/stars/issues/176)", "localFun", "", "*", "boundaries", "st_as_sf(as_points=FALSE, merge=TRUE, connect8=TRUE)", "", "clump", "st_as_sf(r, merge = TRUE)", "`st_as_sf` returns polygons, `clump` a raster", "adjacent", "", "*", "area", "st_area", "", "terrain", "", "#", "Moran", "", "" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "predict", "predict", "", "interpolate", "gstat::idw, gstat::krige", "`st_warp` has raster-raster interpolations of `gdalwarp`" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "rasterize", "st_as_stars", "", "rasterToPoints", "st_as_sf(as_points=TRUE)", "", "rasterToPolygons", "st_as_sf(as_points=FALSE, ...), st_polygonize", "", "rasterToContour", "st_contour", "requires GDAL >= 2.4.0", "rasterFromXYZ", "", "", "rasterFromCells", "", "", ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "cellStats", "st_apply", "", "summary", "print, summary(as.vector(. %>% pull))", "", "freq", "table", "*", "crosstab", "", "", "unique", "unique(as.vector(. %>% pull))", "", "zonal", "", "*" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "getValues", "{pull, [[ ]]}", "", "getValuesBlock", "{[ ] , slice, filter} %>% pull", "", "getValuesFocal", "{[ ] , slice, filter} %>% pull", "", "as.matrix", "[[ ]]", "currently behaves somewhat unexpectedly *", "as.array", "[[ ]]", "currently behaves somewhat unexpectedly *", "extract (by cell)", "{[ ] , slice, filter}", "", "extract (by polygon)", "x[sf_object]", "", "extract (by point)", "aggregate(stars_object, sf_object, function(x) x[1], as_points = FALSE)", "", "sampleRandom", "", "*", "sampleRegular", "", "*", "minValue", "purrr::map(x, min)", "", "maxValue", "purrr::map(x, max)", "", "setMinMax", "", "," ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "plot", "plot, geom_stars", "", "plotRGB", "plot(x, rgb =...)", "", "spplot", "-", "", "image", "image", "", "persp", "-", "", "contour", "(st_contour, then sf::plot)", "", "filledContour", "(same)", "", "text", "text", "", "`hist`", "`hist(x[[1]])`", "", "barplot", "", "", "density", "", "", "pairs", "", "", "boxplot", "", "" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "ncol", "dim(x)[1]", "or use name instead of 1; cols may be the second dimension!", "nrow", "dim(x)[2]", "or use name instead of 2; rows may be the first dimension!", "ncell", "prod(dim(x))", "", "res", "st_dimensions", "can also not be a constant in case of rectilinear or curvilinear grids", "nlayers", "-", "there is no concept of layers in stars", "names", "names", "", "xres", "st_res(x)[1]", "may not be a constant in case of rectilinear or curvilinear grids", "yres", "st_res(x)[2]", "may not be a constant in case of rectilinear or curvilinear grids", "xmin", "st_bbox(x)[1]", "", "xmax", "st_bbox(x)[3]", "", "ymin", "st_bbox(x)[2]", "", "ymax", "st_bbox(x)[4]", "", "extent", "st_bbox(x)", "different ordering of numbers", "origin", "-", "", "projection", "st_crs(x)", "", "isLonLat", "st_is_longlat(st_crs(x))", "", "filename", "", "stars_proxy objects carry file names where otherwise the array data is", "bandnr", "", "stars has no general concept of bands", "nbands", "dim(x)[3]", "may also be time; bands may also be in another dimension, or have another name", "compareRaster", "all.equal(st_dimensions(x), st_dimensions(y))", "*", "NAvalue", "", "-" ) %>% knitr::kable() ## ----------------------------------------------------------------------------- tribble( ~raster, ~stars, ~`Note/comment`, "xFromCol", "st_get_dimension_values(., 'x')[col]", "I am not sure how to generally get the x dimension name - here it is x", "yFromRow", "st_get_dimension_values(., 'y')[row]", "I am not sure how to generally get the y dimension name - here it is y", "xFromCell", "", "", "yFromCell", "", "", "xyFromCell", "", "", "colFromX", "", "*", "rowFromY", "", "*", "rowColFromCell", "", "", "cellFromXY", "st_cells()", "", "cellFromRowCol", "", "", "cellsFromExtent", "", "", "coordinates", "st_coordinates", "", "validCell", "", "", "validCol", "col %>% between(st_dimensions(.)$x$from, st_dimensions(.)$x$to)", "raster columns are not always named 'x'", "validRow", "row %>% between(st_dimensions(.)$y$from, st_dimensions(.)$y$to)", "raster columns are not always named 'y'", "setValues", "[ ] <-", "", "writeRaster", "write_stars", "currently uses GDAL, somewhat limited", "KML", "", "" ) %>% knitr::kable() stars/inst/doc/stars8.html0000644000176200001440000007747714644756275015314 0ustar liggesusers 8. NetCDF Proxy Workflows

8. NetCDF Proxy Workflows

David Blodgett

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

NetCDF data sources are available via more and less granular files and/or OPeNDAP endpoints. This article demonstrates how stars enables discovery, access, and processing of NetCDF data across a wide range of such source-data organization schemes.

We’ll start with some basics using datasets included with the stars installation. A call to read_ncdf(), for a dataset smaller than the default threshold, will just read in all the data. Below we read in and display the reduced.nc NetCDF file.

library(stars)
f <- system.file("nc/reduced.nc", package = "stars")
(nc <- read_ncdf(f))
## no 'var' specified, using sst, anom, err, ice
## other available variables:
##  lon, lat, zlev, time
## 0-360 longitude crossing the international date line encountered.
## Longitude coordinates will be 0-360 in output.
## Will return stars object with 16200 cells.
## No projection information found in nc file. 
##  Coordinate variable units found to be degrees, 
##  assuming WGS84 Lat/Lon.
## stars object with 4 dimensions and 4 attributes
## attribute(s):
##                Min. 1st Qu. Median       Mean 3rd Qu.  Max.  NA's
## sst [°C]      -1.80   -0.03 13.655 12.9940841 24.8125 32.97  4448
## anom [°C]     -7.95   -0.58 -0.080 -0.1847324  0.2100  2.99  4449
## err [°C]       0.11    0.16  0.270  0.2626872  0.3200  0.84  4448
## ice [percent]  0.01    0.47  0.920  0.7178118  0.9600  1.00 13266
## dimension(s):
##      from  to offset delta         refsys         values x/y
## lon     1 180     -1     2 WGS 84 (CRS84)           NULL [x]
## lat     1  90    -90     2 WGS 84 (CRS84)           NULL [y]
## zlev    1   1     NA    NA             NA              0    
## time    1   1     NA    NA        POSIXct 1981-12-31 UTC

Let’s assume reduced.nc was 10 years of hourly data, rather than 1 time step. It would be over 10GB rather than about 130KB and we would not be able to just read it all into memory. In this case, we need a way to read the file’s metadata such that we could iterate over it in a way that meets the needs of our workflow objectives. This is where proxy = TRUE comes in. Below, we’ll lower the option that controls whether read_ncdf() defaults to proxy and use proxy = TRUE to show both ways of getting the same result.

old_options <- options("stars.n_proxy" = 100)
(nc <- read_ncdf(f, proxy = TRUE))
## no 'var' specified, using sst, anom, err, ice
## other available variables:
##  lon, lat, zlev, time
## 0-360 longitude crossing the international date line encountered.
## Longitude coordinates will be 0-360 in output.
## No projection information found in nc file. 
##  Coordinate variable units found to be degrees, 
##  assuming WGS84 Lat/Lon.
## netcdf source stars proxy object from:
## [1] "[...]/reduced.nc"
## 
## Available nc variables:
## sst
## anom
## err
## ice
## 
## dimension(s):
##      from  to offset delta         refsys         values x/y
## lon     1 180     -1     2 WGS 84 (CRS84)           NULL [x]
## lat     1  90    -90     2 WGS 84 (CRS84)           NULL [y]
## zlev    1   1     NA    NA             NA              0    
## time    1   1     NA    NA        POSIXct 1981-12-31 UTC
options(old_options)

The above shows that we have a NetCDF sourced stars proxy derived from the reduced.nc file. We see it has four variables and their units are displayed. The normal stars dimension(s) are available and a nc_request object is also available. The nc_request object contains the information needed to make requests for data according to the dimensions of the NetCDF data source. With this information, we have what we need to request a chunk of data that is what we want and not too large.

(nc <- read_ncdf(f, 
                 var = "sst", 
                 ncsub = cbind(start = c(90, 45, 1 , 1), 
                              count = c(90, 45, 1, 1))))
## 0-360 longitude crossing the international date line encountered.
## Longitude coordinates will be 0-360 in output.
## Will return stars object with 4050 cells.
## No projection information found in nc file. 
##  Coordinate variable units found to be degrees, 
##  assuming WGS84 Lat/Lon.
## stars object with 4 dimensions and 1 attribute
## attribute(s):
##          Min. 1st Qu. Median     Mean 3rd Qu.  Max. NA's
## sst [°C] -1.8   -1.04     14 12.92722   25.13 29.81  757
## dimension(s):
##      from to offset delta         refsys         values x/y
## lon     1 90    177     2 WGS 84 (CRS84)           NULL [x]
## lat     1 45     -2     2 WGS 84 (CRS84)           NULL [y]
## zlev    1  1     NA    NA             NA              0    
## time    1  1     NA    NA        POSIXct 1981-12-31 UTC

plot(nc)

The ability to view NetCDF metadata so we can make well formed requests against the data is useful, but the real power of a proxy object is that we can use it in a “lazy evaluation” coding style. That is, we can do virtual operations on the object, like subsetting with another dataset, prior to actually accessing the data volume.

Lazy operations.

There are two kinds of lazy operations possible with stars_proxy objects. Some can be applied to the stars_proxy object itself without accessing underlying data. Others must be composed as a chain of calls that will be applied when data is actually required.

Methods applied to a stars_proxy object:

  • [ - Nearly the same as stars_proxy
  • [[<- - stars_proxy method works
  • print - unique method for nc_proxy to facilitate unique workflows
  • dim - stars_proxy method works
  • c - stars_proxy method works
  • st_redimension - Not sure what this entails but it might not make sense for nc_proxy.
  • st_mosaic * Calls read_stars on assembled list. Not supported for now.
  • st_set_bbox

Methods that add a call to the call_list.

  • [<-
  • adrop
  • aperm
  • is.na
  • split
  • st_apply
  • predict
  • merge
  • st_crop
  • drop_levels
  • Ops (group generic for +, -, etc.)
  • Math (group generic for abs, sqrt, tan, etc.)
  • filter
  • mutate
  • tansmute
  • select
  • rename
  • pull
  • slice * hyperslabbing for NetCDF could be as above?
  • pull
  • replace_na

Methods that cause a stars_proxy object to be fetched and turned into a stars object.

stars/inst/doc/stars4.R0000644000176200001440000001152214644756272014515 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") set.seed(13579) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ## ----fig.width=4.5, fig.height=4---------------------------------------------- suppressPackageStartupMessages(library(stars)) m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) ## ----------------------------------------------------------------------------- dim(s[[1]]) ## ----fig.width=4.5, fig.height=4---------------------------------------------- image(s, text_values = TRUE, axes = TRUE) ## ----fig.width=4.5, fig.height=4---------------------------------------------- attr(s, "dimensions")[[2]]$delta = -1 image(s, text_values = TRUE, axes = TRUE) ## ----------------------------------------------------------------------------- tif = system.file("tif/L7_ETMs.tif", package = "stars") st_dimensions(read_stars(tif))["y"] ## ----------------------------------------------------------------------------- str(attr(st_dimensions(s), "raster")) ## ----------------------------------------------------------------------------- attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.1) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) ## ----------------------------------------------------------------------------- atan2(0.1, 1) * 180 / pi ## ----------------------------------------------------------------------------- attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.2) plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20) ## ----------------------------------------------------------------------------- atan2(c(0.1, 0.2), 1) * 180 / pi ## ----------------------------------------------------------------------------- x = c(0, 0.5, 1, 2, 4, 5) # 6 numbers: boundaries! y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) image(r, axes = TRUE, col = grey((1:20)/20)) ## ----------------------------------------------------------------------------- x = c(0, 0.5, 1, 2, 4) # 5 numbers: offsets only! y = c(0.3, 0.5, 1, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) ## ----------------------------------------------------------------------------- x = c(0, 1, 2, 3, 4) # 5 numbers: offsets only! y = c(0.5, 1, 1.5, 2) # 4 numbers: offsets only! (r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y))) st_bbox(r) ## ----------------------------------------------------------------------------- x = st_as_stars(matrix(1:9, 3, 3), st_dimensions(x = c(1, 2, 3), y = c(2, 3, 10), cell_midpoints = TRUE)) ## ----eval=FALSE--------------------------------------------------------------- # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") ## ----------------------------------------------------------------------------- (s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata")) ## ----echo=FALSE--------------------------------------------------------------- EVAL = s5p != "" ## ----eval=EVAL---------------------------------------------------------------- subs = gdal_subdatasets(s5p) subs[[6]] ## ----eval=EVAL---------------------------------------------------------------- gdal_metadata(subs[[6]], "GEOLOCATION") ## ----eval=EVAL---------------------------------------------------------------- nit.c = read_stars(subs[[6]]) threshold = units::set_units(9e+36, mol/m^2) nit.c[[1]][nit.c[[1]] > threshold] = NA nit.c ## ----eval=EVAL---------------------------------------------------------------- plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ## ----eval=EVAL---------------------------------------------------------------- plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ## ----eval=EVAL---------------------------------------------------------------- (nit.c_ds = stars:::st_downsample(nit.c, 8)) plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, pch = 16, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ## ----eval=EVAL---------------------------------------------------------------- plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, border = NA, logz = TRUE, key.length = 1) maps::map('world', add = TRUE, col = 'red') ## ----eval=EVAL---------------------------------------------------------------- w = st_warp(nit.c, crs = 4326, cellsize = 0.25) plot(w) stars/inst/doc/stars1.R0000644000176200001440000001534514644756244014520 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") ev = suppressWarnings(require(starsdata, quietly = TRUE)) knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ## ----------------------------------------------------------------------------- library(stars) ## ----------------------------------------------------------------------------- methods(class = "stars") ## ----------------------------------------------------------------------------- tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) plot(x, axes = TRUE) ## ----------------------------------------------------------------------------- x ## ----eval=ev------------------------------------------------------------------ library(cubelyr) as.tbl_cube(x) ## ----------------------------------------------------------------------------- (x.spl = split(x, "band")) merge(x.spl) ## ----------------------------------------------------------------------------- merge(x.spl) |> setNames(names(x)) |> st_set_dimensions(3, values = paste0("band", 1:6)) |> st_set_dimensions(names = c("x", "y", "band")) ## ----------------------------------------------------------------------------- class(x[[1]]) dim(x[[1]]) x$two = 2 * x[[1]] x ## ----------------------------------------------------------------------------- x["two", 1:10, , 2:4] ## ----------------------------------------------------------------------------- circle = st_sfc(st_buffer(st_point(c(293749.5, 9115745)), 400), crs = st_crs(x)) plot(x[circle][, , , 1], reset = FALSE) plot(circle, col = NA, border = 'red', add = TRUE, lwd = 2) ## ----------------------------------------------------------------------------- x1 = read_stars(tif, options = c("OVERVIEW_LEVEL=1")) x2 = read_stars(tif, options = c("OVERVIEW_LEVEL=2")) x3 = read_stars(tif, options = c("OVERVIEW_LEVEL=3")) dim(x1) dim(x2) dim(x3) par(mfrow = c(1, 3), mar = rep(0.2, 4)) image(x1[,,,1]) image(x2[,,,1]) image(x3[,,,1]) ## ----eval=ev------------------------------------------------------------------ system.file("nc/bcsd_obs_1999.nc", package = "stars") |> read_stars() -> w ## ----eval=ev------------------------------------------------------------------ w ## ----------------------------------------------------------------------------- system.file("nc/bcsd_obs_1999.nc", package = "stars") |> read_ncdf() ## ----eval=ev------------------------------------------------------------------ x = c( "avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc", "avhrr-only-v2.19810905.nc", "avhrr-only-v2.19810906.nc", "avhrr-only-v2.19810907.nc", "avhrr-only-v2.19810908.nc", "avhrr-only-v2.19810909.nc" ) # see the second vignette: # install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") file_list = system.file(paste0("netcdf/", x), package = "starsdata") (y = read_stars(file_list, quiet = TRUE)) ## ----eval=ev------------------------------------------------------------------ library(dplyr) library(abind) z <- y |> select(sst) |> adrop() ## ----eval=ev------------------------------------------------------------------ # convert POSIXct time to character, to please ggplot's facet_wrap() z1 = st_set_dimensions(z, 3, values = as.character(st_get_dimension_values(z, 3))) library(ggplot2) library(viridis) library(ggthemes) ggplot() + geom_stars(data = z1[1], alpha = 0.8, downsample = c(10, 10, 1)) + facet_wrap("time") + scale_fill_viridis() + coord_equal() + theme_map() + theme(legend.position = "bottom") + theme(legend.key.width = unit(2, "cm")) ## ----eval=ev------------------------------------------------------------------ write_stars(adrop(y[1]), "sst.tif") ## ----------------------------------------------------------------------------- prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") prec = read_ncdf(prec_file, curvilinear = c("lon", "lat")) ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { if (inherits(x, "units")) x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } library(dplyr) # loads slice generic prec_slice = slice(prec, index = 17, along = "time") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') ## ----------------------------------------------------------------------------- nc = st_transform(nc, st_crs(prec_slice)) # datum transformation plot(prec_slice[nc], border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA, border = 'red') ## ----------------------------------------------------------------------------- nc = st_read(system.file("gpkg/nc.gpkg", package="sf")) to = from = st_geometry(nc) # 100 polygons: O and D regions mode = c("car", "bike", "foot") # travel mode day = 1:100 # arbitrary library(units) units(day) = as_units("days since 2015-01-01") hour = set_units(0:23, h) # hour of day dims = st_dimensions(origin = from, destination = to, mode = mode, day = day, hour = hour) (n = dim(dims)) traffic = array(rpois(prod(n), 10), dim = n) # simulated traffic counts (st = st_as_stars(list(traffic = traffic), dimensions = dims)) ## ----eval=ev------------------------------------------------------------------ st |> as.tbl_cube() ## ----eval=ev------------------------------------------------------------------ b <- st |> as.tbl_cube() |> filter(mode == "bike") |> group_by(hour) |> summarise(traffic = mean(traffic)) |> as.data.frame() require(ggforce) # for plotting a units variable ggplot() + geom_line(data = b, aes(x = hour, y = traffic)) ## ----------------------------------------------------------------------------- s = system.file("tif/lc.tif", package = "stars") r = read_stars(s, proxy = FALSE) |> droplevels() levels(r[[1]]) = abbreviate(levels(r[[1]]), 10) # shorten text labels st_point(c(3190631, 3125)) |> st_sfc(crs = st_crs(r)) |> st_buffer(25000) -> pol1 st_point(c(3233847, 21027)) |> st_sfc(crs = st_crs(r)) |> st_buffer(10000) -> pol2 if (isTRUE(dev.capabilities()$rasterImage == "yes")) { plot(r, reset = FALSE, key.pos = 4) plot(c(pol1, pol2), col = NA, border = c('yellow', 'green'), lwd = 2, add = TRUE) } ## ----------------------------------------------------------------------------- f = function(x) { tb = table(x); names(tb)[which.max(tb)] } ## ----------------------------------------------------------------------------- aggregate(r, c(pol1, pol2), f) |> st_as_sf() stars/inst/doc/stars3.Rmd0000644000176200001440000000532114644756215015032 0ustar liggesusers--- title: "3. stars tidyverse methods" author: "Edzer Pebesma" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{3. stars tidyverse methods} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- **For a better version of the stars vignettes see** https://r-spatial.github.io/stars/articles/ ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, collapse = TRUE, dev = "png") ev = TRUE knitr::opts_chunk$set(fig.height = 4.5) knitr::opts_chunk$set(fig.width = 6) ``` This vignette shows how some of the tidyverse verbs can be used on `stars` objects. The `stars` and `tidyverse` packages are loaded by ```{r} library(stars) library(dplyr) ``` Methods now available for class `stars` are ``` {r} methods(class = "stars") ``` We will work with a three-band section of a landsat image: ```{r} system.file("tif/L7_ETMs.tif", package = "stars") %>% read_stars -> x x ``` ## `slice` `slice` slices a sub-array out of the cube; this is done by specifying the dimension on which to act, and the slice number. ```{r} x %>% slice(band, 6) -> x6 x6 ``` It returns a lower-dimensional array if a single element is selected along the slice dimension. ## `filter` Similar to `slice`, `filter` selects on dimensions but evaluates their values rather than their index: in ```{r} x %>% filter(x > 289000, x < 291000, band > 3) -> x7 x7 ``` the subarray is created based on the x _coordinate_ values. Note that `filter` converts the object to a `tbl_cube`, and uses the `dplyr` `filter` method for `tbl_cube` objects. This has the limitation that `stars` objects with rectilinear, curvilinear or simple feature geometries cannot be handled. For such objects, using regular `[` selection or using `st_crop` may be an alternative. ## `pull` `pull` pulls out an array from a stars object: ```{r} x %>% pull(1) -> x8 class(x8) dim(x8) ``` ## `mutate` ```{r} x %>% mutate(band2 = 2 * L7_ETMs.tif) -> x2 x2 ``` ## `select` `select` selects an attribute, or a set of attributes: ```{r} x2 %>% select(band2) -> x9 x9 ``` ## `geom_stars` `geom_raster` is a `ggplot2` geom function that accepts `stars` objects as its `data` argument and * sets up the raster or vector spatial coordinates as plot dimensions, and the first attribute as the fill variable * allows for downsampling (without choosing a suitable downsampling level) * chooses between using `geom_raster`, `geom_rect` and `geom_sf` depending on whether the geometry is regular, rectilinear or has vector geometries An example use is ```{r} library(ggplot2) library(viridis) ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_fill_viridis() + scale_x_discrete(expand = c(0, 0)) + scale_y_discrete(expand = c(0, 0)) ``` stars/inst/doc/stars4.html0000644000176200001440000236645414644756272015303 0ustar liggesusers 4. stars data model

4. stars data model

Edzer Pebesma

For a better version of the stars vignettes see https://r-spatial.github.io/stars/articles/

This vignette explains the data model of stars objects, illustrated using artificial and real datasets.

Stars objects

stars objects consist of

  • a (possibly empty) named list of arrays, each having named dimensions (dim) attribute
  • an attribute called dimensions of class dimensions that carries dimension metadata
  • a class name that includes stars

A dimensions object is a named list of dimension elements, each describing the semantics a dimension of the data arrays (space, time, type etc). In addition to that, a dimensions object has an attribute called raster of class stars_raster, which is a named list with three elements:

  • dimensions length 2 character; the dimension names that constitute a spatial raster (or NA)
  • affine length 2 numeric; the two affine parameters of the geotransform (or NA)
  • curvilinear a boolean indicating whether a raster is a curvilinear raster (or NA)

The affine and curvilinear values are only relevant in case of raster data, indicated by dimensions to have non-NA values.

A dimension object describes a single dimension; it is a list with named elements

  • from: (numeric length 1): the start index of the array
  • to: (numeric length 1): the end index of the array
  • offset: (numeric length 1): the start coordinate (or time) value of the first pixel (i.e., a pixel/cell boundary)
  • delta: (numeric length 1): the increment, or cell size
  • refsys: (character, or crs): object describing the reference system; e.g. the PROJ string, or string POSIXct or PCICt (for 360 and 365 days/year calendars), or object of class crs (containing both EPSG code and proj4string)
  • point: (logical length 1): boolean indicating whether cells/pixels refer to areas/periods, or to points/instances (may be NA)
  • values: one of
    • NULL (missing),
    • a vector with coordinate values (numeric, POSIXct, PCICt, or sfc),
    • an object of class intervals (a list with two vectors, start and end, with interval start- and end-values), or
    • a matrix with longitudes or latitudes for all cells (in case of curvilinear grids)

from and to will usually be 1 and the dimension size, but from may be larger than 1 in case a sub-grid got was selected (or cropped).

offset and delta only apply to regularly discretized dimensions, and are NA if this is not the case. If they are NA, dimension values may be held in the values field. Rectilinear and curvilinear grids need grid values in values that can be either:

  • for rectilinear grids: irregularly spaced coordinate values, or coordinate intervals of irregular width (a rectilinear grid can have one dimension that is regular),
  • for curvilinear grids: or a matrix with grid cell centre values for all row/col combinations (usually in longitude or latitude).

Alternatively, values can contains a set of spatial geometries encoded in an sfc vector (“list-column”), in which case we have a vector data cube.

Grid type

Regular grids

With a very simple file created from a \(4 \times 5\) matrix

suppressPackageStartupMessages(library(stars))
m = matrix(1:20, nrow = 5, ncol = 4)
dim(m) = c(x = 5, y = 4) # named dim
(s = st_as_stars(m))
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##     Min. 1st Qu. Median Mean 3rd Qu. Max.
## A1     1    5.75   10.5 10.5   15.25   20
## dimension(s):
##   from to offset delta point x/y
## x    1  5      0     1 FALSE [x]
## y    1  4      0     1 FALSE [y]

we see that

  • the rows (5) are mapped to the first dimension, the x-coordinate
  • the columns (4) are mapped to the second dimension, the y-coordinate
  • the from and to fields of each dimension define a range that corresponds to the array dimension:
dim(s[[1]])
## x y 
## 5 4
  • offset and delta specify how increasing row and column index maps to x and y coordinate values respectively.

When we plot this object, using the image method for stars objects,

image(s, text_values = TRUE, axes = TRUE)

we see that \((0,0)\) is the origin of the grid (grid corner), and \(1\) the coordinate value increase from one index (row, col) to the next. It means that consecutive matrix columns represent grid lines, going from south to north. Grids defined this way are regular: grid cell size is constant everywhere.

Many actual grid datasets have y coordinates (grid rows) going from North to South (top to bottom); this is realised with a negative value for delta. We see that the grid origin \((0,0)\) did not change:

attr(s, "dimensions")[[2]]$delta = -1
image(s, text_values = TRUE, axes = TRUE)

An example is the GeoTIFF carried in the package, which, as probably all data sources read through GDAL, has a negative delta for the y-coordinate:

tif = system.file("tif/L7_ETMs.tif", package = "stars")
st_dimensions(read_stars(tif))["y"]
##   from  to  offset delta                     refsys point
## y    1 352 9120761 -28.5 SIRGAS 2000 / UTM zone 25S FALSE

Raster attributes, rotated and sheared grids

Dimension tables of stars objects carry a raster attribute:

str(attr(st_dimensions(s), "raster"))
## List of 4
##  $ affine     : num [1:2] 0 0
##  $ dimensions : chr [1:2] "x" "y"
##  $ curvilinear: logi FALSE
##  $ blocksizes : NULL
##  - attr(*, "class")= chr "stars_raster"

which is a list that holds

  • dimensions: character, the names of raster dimensions (if any), as opposed to e.g. spectral, temporal or other dimensions
  • affine: numeric, the affine parameters
  • curvilinear: a logical indicating whether the raster is curvilinear

These fields are needed at this level, because they describe properties of the array at a higher level than individual dimensions do: a pair of dimensions forms a raster, both affine and curvilinear describe how x and y as a pair are derived from grid indexes (see below) when this cannot be done on a per-dimension basis.

With two affine parameters \(a_1\) and \(a_2\), \(x\) and \(y\) coordinates are derived from (1-based) grid indexes \(i\) and \(j\), grid offset values \(o_x\) and \(o_y\), and grid cell sizes \(d_x\) and \(d_y\) by

\[x = o_x + (i-1) d_x + (j-1) a_1\]

\[y = o_y + (i-1) a_2 + (j-1) d_y\] Clearly, when \(a_1=a_2=0\), \(x\) and \(y\) are entirely derived from their respective index, offset and cellsize.

Note that for integer indexes, the coordinates are that of the starting edge of a grid cell; to get the grid cell center of the top left grid cell (in case of a negative \(d_y\)), use \(i=1.5\) and \(j=1.5\).

We can rotate grids by setting \(a_1\) and \(a_2\) to a non-zero value:

attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.1)
plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20)

The rotation angle, in degrees, is

atan2(0.1, 1) * 180 / pi
## [1] 5.710593

Sheared grids are obtained when the two rotation coefficients, \(a_1\) and \(a_2\), are unequal:

attr(attr(s, "dimensions"), "raster")$affine = c(0.1, 0.2)
plot(st_as_sf(s, as_points = FALSE), axes = TRUE, nbreaks = 20)

Now, the y-axis and x-axis have different rotation in degrees of respectively

atan2(c(0.1, 0.2), 1) * 180 / pi
## [1]  5.710593 11.309932

Rectilinear grids

Rectilinear grids have orthogonal axes, but do not have congruent (equally sized and shaped) cells: each axis has its own irregular subdivision.

We can define a rectilinear grid by specifying the cell boundaries, meaning for every dimension we specify one more value than the dimension size:

x = c(0, 0.5, 1, 2, 4, 5)  # 6 numbers: boundaries!
y = c(0.3, 0.5, 1, 2, 2.2) # 5 numbers: boundaries!
(r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y)))
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##    Min. 1st Qu. Median Mean 3rd Qu. Max.
## m     1    5.75   10.5 10.5   15.25   20
## dimension(s):
##   from to point                values x/y
## x    1  5 FALSE     [0,0.5),...,[4,5) [x]
## y    1  4 FALSE [0.3,0.5),...,[2,2.2) [y]
st_bbox(r)
## xmin ymin xmax ymax 
##  0.0  0.3  5.0  2.2
image(r, axes = TRUE, col = grey((1:20)/20))

Would we leave out the last value, than stars may come up with a different cell boundary for the last cell, as this is now derived from the width of the one-but-last cell:

x = c(0, 0.5, 1, 2, 4)  # 5 numbers: offsets only!
y = c(0.3, 0.5, 1, 2)   # 4 numbers: offsets only!
(r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y)))
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##    Min. 1st Qu. Median Mean 3rd Qu. Max.
## m     1    5.75   10.5 10.5   15.25   20
## dimension(s):
##   from to point              values x/y
## x    1  5 FALSE   [0,0.5),...,[4,6) [x]
## y    1  4 FALSE [0.3,0.5),...,[2,3) [y]
st_bbox(r)
## xmin ymin xmax ymax 
##  0.0  0.3  6.0  3.0

This is not problematic if cells have a constant width, in which case the boundaries are reduced to an offset and delta value, irrespective whether an upper boundary is given:

x = c(0, 1, 2, 3, 4)  # 5 numbers: offsets only!
y = c(0.5, 1, 1.5, 2)   # 4 numbers: offsets only!
(r = st_as_stars(list(m = m), dimensions = st_dimensions(x = x, y = y)))
## stars object with 2 dimensions and 1 attribute
## attribute(s):
##    Min. 1st Qu. Median Mean 3rd Qu. Max.
## m     1    5.75   10.5 10.5   15.25   20
## dimension(s):
##   from to offset delta point x/y
## x    1  5      0     1 FALSE [x]
## y    1  4    0.5   0.5 FALSE [y]
st_bbox(r)
## xmin ymin xmax ymax 
##  0.0  0.5  5.0  2.5

Alternatively, one can also set the cell midpoints by specifying arguments cell_midpoints to the st_dimensions call:

x = st_as_stars(matrix(1:9, 3, 3), 
                st_dimensions(x = c(1, 2, 3), y = c(2, 3, 10), cell_midpoints = TRUE))

When the dimension is regular, this results in offset being shifted back with half a delta, or else in intervals derived from the distances between cell centers. This should obviously not be done when cell boundaries are specified.

Curvilinear grids

Curvilinear grids are grids whose grid lines are not straight. Rather than describing the curvature parametrically, the typical (HDF5 or NetCDF) files in which they are found have two raster layers with the longitudes and latitudes for every corresponding pixel of remaining layers.

As an example, we will use a Sentinel 5P dataset available from package starsdata; this package can be installed with

install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de", type = "source") 

The dataset is found here:

(s5p = system.file("sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc", package = "starsdata"))
## [1] "/home/edzer/R/x86_64-pc-linux-gnu-library/4.4/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc"

We can construct the curvilinear stars raster by calling read_stars on the right sub-array:

subs = gdal_subdatasets(s5p)
subs[[6]]
## [1] "NETCDF:\"/home/edzer/R/x86_64-pc-linux-gnu-library/4.4/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\":/PRODUCT/nitrogendioxide_tropospheric_column"

For this array, we can see the GDAL metadata under item GEOLOCATION:

gdal_metadata(subs[[6]], "GEOLOCATION")
## $GEOREFERENCING_CONVENTION
## [1] "PIXEL_CENTER"
## 
## $LINE_OFFSET
## [1] "0"
## 
## $LINE_STEP
## [1] "1"
## 
## $PIXEL_OFFSET
## [1] "0"
## 
## $PIXEL_STEP
## [1] "1"
## 
## $SRS
## [1] "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]"
## 
## $X_BAND
## [1] "1"
## 
## $X_DATASET
## [1] "NETCDF:\"/home/edzer/R/x86_64-pc-linux-gnu-library/4.4/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\":/PRODUCT/longitude"
## 
## $Y_BAND
## [1] "1"
## 
## $Y_DATASET
## [1] "NETCDF:\"/home/edzer/R/x86_64-pc-linux-gnu-library/4.4/starsdata/sentinel5p/S5P_NRTI_L2__NO2____20180717T120113_20180717T120613_03932_01_010002_20180717T125231.nc\":/PRODUCT/latitude"
## 
## attr(,"class")
## [1] "gdal_metadata"

which reveals where, in this dataset, the longitude and latitude arrays are kept.

nit.c = read_stars(subs[[6]]) 
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
## Warning in CPL_read_gdal(as.character(x), as.character(options),
## as.character(driver), : GDAL Message 1: The dataset has several variables that
## could be identified as vector fields, but not all share the same primary
## dimension. Consequently they will be ignored.
threshold = units::set_units(9e+36, mol/m^2)
nit.c[[1]][nit.c[[1]] > threshold] = NA
nit.c
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##                                                   Min.      1st Qu.
## nitrogendioxide_tropospheri... [mol/m^2] -3.301083e-05 1.868205e-05
##                                                Median         Mean      3rd Qu.
## nitrogendioxide_tropospheri... [mol/m^2] 2.622178e-05 2.898976e-05 3.629641e-05
##                                                  Max. NA's
## nitrogendioxide_tropospheri... [mol/m^2] 0.0003924858  330
## dimension(s):
##      from  to         offset         refsys                             values
## x       1 450             NA WGS 84 (CRS84) [450x278] -5.811 [°],...,30.95 [°]
## y       1 278             NA WGS 84 (CRS84)  [450x278] 28.36 [°],...,51.47 [°]
## time    1   1 2018-07-17 UTC        POSIXct                               NULL
##      x/y
## x    [x]
## y    [y]
## time    
## curvilinear grid

The curvilinear array has the actual arrays (raster layers, matrices) with longitude and latitude values read in its dimension table. We can plot this file:

plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, 
         pch = 16,  logz = TRUE, key.length = 1)
## Warning in NextMethod(): NaNs produced
## Warning in plot.sf(x, pal = col, ...): NaNs produced
maps::map('world', add = TRUE, col = 'red')

plot(nit.c, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, 
         border = NA, logz = TRUE, key.length = 1)
## Warning in NextMethod(): NaNs produced
## Warning in plot.sf(x, pal = col, ...): NaNs produced
maps::map('world', add = TRUE, col = 'red')

We can downsample the data by

(nit.c_ds = stars:::st_downsample(nit.c, 8))
## stars object with 3 dimensions and 1 attribute
## attribute(s):
##                                                   Min.     1st Qu.       Median
## nitrogendioxide_tropospheri... [mol/m^2] -1.847503e-05 1.85778e-05 2.700901e-05
##                                                Mean      3rd Qu.         Max.
## nitrogendioxide_tropospheri... [mol/m^2] 2.9113e-05 3.642568e-05 0.0001363282
##                                          NA's
## nitrogendioxide_tropospheri... [mol/m^2]   32
## dimension(s):
##      from to         offset         refsys                           values x/y
## x       1 50             NA WGS 84 (CRS84) [50x31] -5.811 [°],...,30.14 [°] [x]
## y       1 31             NA WGS 84 (CRS84)  [50x31] 28.78 [°],...,51.47 [°] [y]
## time    1  1 2018-07-17 UTC        POSIXct                             NULL    
## curvilinear grid
plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = TRUE, 
         pch = 16, logz = TRUE, key.length = 1)
## Warning in NextMethod(): NaNs produced
## Warning in plot.sf(x, pal = col, ...): NaNs produced
maps::map('world', add = TRUE, col = 'red')

which doesn’t look nice, but plotting the cells as polygons looks better:

plot(nit.c_ds, breaks = "equal", reset = FALSE, axes = TRUE, as_points = FALSE, 
         border = NA, logz = TRUE, key.length = 1)
## Warning in NextMethod(): NaNs produced
## Warning in plot.sf(x, pal = col, ...): NaNs produced
maps::map('world', add = TRUE, col = 'red')

Another approach would be to warp the curvilinear grid to a regular grid, e.g. by

w = st_warp(nit.c, crs = 4326, cellsize = 0.25)
## Warning in transform_grid_grid(st_as_stars(src), st_dimensions(dest),
## threshold): using Euclidean distance measures on geodetic coordinates
## threshold set to 0.108545 : set a larger value if you see missing values where there shouldn't be
plot(w)

stars/inst/nc/0000755000176200001440000000000014644756215013001 5ustar liggesusersstars/inst/nc/timeseries.cdl0000644000176200001440000000415013777653456015647 0ustar liggesusersnetcdf timeseries { dimensions: station = 10 ; time = 20 ; variables: int num(station) ; num:long_name = "Station number" ; num:cf_role = "timeseries_id" ; int time(time) ; time:units = "days since 1970-01-01 00:00:00 UTC" ; time:long_name = "time" ; time:calendar = "gregorian" ; float pr(station, time) ; pr:units = "kg m-2 s-1" ; pr:_FillValue = -10.f ; pr:long_name = "Total precipitation flux" ; pr:coordinates = "lat lon alt num" ; pr:standard_name = "precipitation_flux" ; float lat(station) ; lat:units = "degrees_north" ; lat:long_name = "Station latitude" ; lat:standard_name = "latitude" ; float lon(station) ; lon:units = "degrees_east" ; lon:long_name = "Station longitude" ; lon:standard_name = "longitude" ; float alt(station) ; alt:units = "m" ; alt:long_name = "Vertical distance above the surface" ; alt:standard_name = "height" ; // global attributes: :featureType = "timeSeries" ; :Conventions = "CF-1.7" ; data: num = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; time = 10957, 11323, 11688, 12053, 12418, 12784, 13149, 13514, 13879, 14245, 14610, 14975, 15340, 15706, 16071, 16436, 16801, 17167, 17532, 17897 ; pr = 88, 54, 90, 35, 83, 19, 71, 38, 93, 65, 57, 16, 41, 42, 76, 77, 80, 52, 65, 12, 9, 37, 86, 82, 75, 67, 66, 75, 34, 27, 0, 84, 40, 75, 59, 48, 100, 55, 39, 44, 12, 56, 88, 69, 68, 36, 52, 75, 79, 44, 22, 43, 75, 23, 15, 16, 44, 75, 5, 21, 17, 58, 6, 28, 3, 39, 66, 9, 52, 94, 78, 99, 80, 45, 20, 9, 81, 42, 88, 92, 84, 25, 1, 9, 64, 50, 34, 56, 49, 58, 22, 31, 94, 32, 83, 28, 87, 94, 94, 60, 2, 69, 12, 89, 8, 50, 89, 22, 0, 47, 99, 57, 90, 24, 68, 87, 74, 33, 7, 46, 79, 39, 92, 44, 85, 40, 10, 82, 63, 10, 74, 60, 29, 73, 56, 88, 55, 98, 40, 30, 14, 10, 41, 30, 20, 98, 74, 46, 71, 69, 40, 26, 69, 69, 26, 62, 1, 58, 95, 86, 82, 55, 10, 51, 11, 98, 28, 19, 53, 33, 81, 8, 12, 74, 27, 71, 88, 8, 51, 56, 68, 24, 97, 87, 97, 80, 43, 81, 25, 40, 20, 81, 32, 80, 8, 7, 38, 52, 97, 87 ; lat = 68, 14, -20, -23, 12, 5, -77, 20, 46, -28 ; lon = -135, -102, 135, -63, -88, -5, 66, -165, 63, -168 ; alt = 0, 10, 500, 20, 75, -10, 54321, 63, 42, 100 ; } stars/inst/nc/bcsd_obs_1999.nc0000644000176200001440000077511413777653456015624 0ustar liggesusersCDF latitude! longitudeQtime CDIGClimate Data Interface version 1.5.6 (http://code.zmaw.de/projects/cdi) ConventionsCF-1.0historyMon Jan 7 18:59:08 2019: ncks -4 -L3 bcsd_obs_1999_two_var.nc bcsd_obs_1999_two_var.nc.comp Thu May 08 12:07:18 2014: cdo monsum gridded_obs/daily/gridded_obs.daily.Prcp.1950.nc gridded_obs/monthly/gridded_obs.monthly.pr.1950.ncCDOIClimate Data Operators version 1.5.6.1 (http://code.zmaw.de/projects/cdo)Metadata_ConventionsUnidata Dataset Discovery v1.0title+Monthly Gridded Meteorological ObservationssummaryThese are the monthly observational data used for BCSD downscaling. See: http://gdo-dcp.ucllnl.org/downscaled_cmip_projections/dcpInterface.html#About for more information.keywordsAtmospheric Temperature, Air Temperature Atmosphere, Precipitation, Rain, Maximum Daily Temperature, Minimum Daily Temperaturekeywords_vocabularyGCMD Science Keywordsidcida.usgs.gov/bcsd_obsnaming_authority cida.usgs.gov cdm_data_typeGrid date_created2014publisher_name$Center for Integrated Data Analytics publisher_urlhttps://www.cida.usgs.gov/publisher_emaildblodgett@usgs.gov institutionBVaries, see http://gdo-dcp.ucllnl.org/downscaled_cmip_projections/ date_issued 2015-11-01processing_level#Gridded meteorological observationsgeospatial_lon_minU<geospatial_lat_min@@geospatial_lon_maxRgeospatial_lat_max@Btime_coverage_start1950-01-15T00:00time_coverage_end1999-12-15T00:00time_coverage_resolutionP1MlicenseFreely availableacknowledgmentMaurer, E.P., A.W. Wood, J.C. Adam, D.P. Lettenmaier, and B. Nijssen, 2002, A Long-Term Hydrologically-Based Data Set of Land Surface Fluxes and States for the Conterminous United States, J. Climate 15(22), 3237-3251HistoryTranslated to CF-1.0 Conventions by Netcdf-Java CDM (CFGridWriter2) Original Dataset = bcsd_obs; Translation Date = 2019-01-03T20:03:59.756ZNCO`netCDF Operators version 4.7.6 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco) latitude  standard_namelatitude long_nameLatitudeunits degrees_northaxisYbounds latitude_bnds_CoordinateAxisTypeLat longitude  standard_name longitude long_name Longitudeunits degrees_eastaxisXboundslongitude_bnds_CoordinateAxisTypeLonDHpr  long_namemonthly_sum_prunitsmm/m _FillValue`xnamepr coordinatestime latitude longitude )tas  long_namemonthly_avg_tasunitsC _FillValue`xnametas missing_value`x coordinatestime latitude longitude )9Ptime  standard_nametimeunitsdays since 1950-01-01 00:00:00calendarstandard_CoordinateAxisTypeTimecB@BB@BB@BB@BB@BB @B B @B B @B B @B B @B B@BB@BB@BB@BB@BB@BB@©©©`© ¨¨¨`¨ §§§`§ ¦¦¦`¦ ¥¥¥`¥ ¤¤¤`¤ £££`£ ¢¢¢`¢ ¡¡¡`¡    `  ŸŸŸ`Ÿ žžž`ž ` œœœ`œ ›››`› ššš`š ™™™`™ ˜˜˜`˜ ———`— –––`– •C{CRCCCfCs3C=C$GC%C8RCCnCC*C+GC% C!C*O\C%=CuC޸CLCHC)C)C C C C!T{C!{C8RC {C C"C#CuCLCC:C \)C3CgC(C C%CCC ChC fBuCCC!O\CQCHCW C"pC)zC-nC$CCs3C&\C%HC@C=C!HCCCCC!qC&!HC$C(C#C&C*{C)LC$(CCC=qC C \C}qC )CC )C޸CBCC fC/CBuBaHCC =CW Cs3CECC!RCC}qCfC C*\C.T{C*C$qC!޸CCT{CzCC'C%5C=qC'HC%HC#C&=C'=C%fgC!)C{CC!)C&C'C%RCCCYCCRC)C)C .CLC CٚCC&fCCBChCCfgC\CLC'33C$C*qC.)C)CzCCC)C.pC0J=C8C8C.fC*(C%C'3C#:CHC!C)LC):C)cC,C!C C=CQC.CǮCCC=C3C C CCCCxRCJ=CYCGC&fC\C3CǮC)@C,\C*CǮCEC s3C)C,ffC/=C=C8RC0޸C*BC) C&{C))C$zC{CHC#QC.C1 C.pC* =C"Cs3CC}qCC33CfCC s3C CCC&C*=qC$0C C.C0CaHChC !HCCRC YCqC(uC6C#pCqCC#pCC'CnChC=qCxRCC(C)C%LCECC RC2&fC6C9C7=C.&fCC C%GC% >CCRC CCRCCC!C.C-5C*uCCaHCCcC 0C CCCC&fC8RC!aHC CqCCEC=qC)C CBuB)C aHCC#C\C\CT{C$0C5@C?CC@C<C<:C+C,C/ٙC-ǮC*CaHC}qCCǮCC#zC&C%{C-C2C.{C"CO\C+C{C)C C qC +C C>C T{C C CCCRCffCfCBBBaGBuB{C:CkC"C"QC"C+\C=C?\C>CC>C/C'C,3CRC:C\CC.CT{C O\C5)C:C,CC"{C/ C.C* =C!qCC uCC HCCCJ=CaHC:C{B33BBBuBƅBǮB8RBBB\)BuC }qC \)CC\CCs3CC'C.QC2LC7^C5C5 C8J=C;pCAW CC3CAaHC9HC8LC/.CCCCCC{C(3C?{CA&fC9hC2kC8ٚC7C7hC+=qCcCO\BBLC xRC C{CCCxRCC)B{BkB{BBB =B8RBW C{C C33C*3C0C)CCC$)C#O\C*)C2RC33C3J=C3fC<C?޸CGCH CEffC@ =C8C.T{C)C3CC C1{C CnC;=qCBCI =CECD!HCL CCkC.qC}qC8RBąBBC3C \CCfCs3C"\)C CHC BB{BBBBBBCCuC3CCCnCC".C%C/cC-J>C-C/C:HCA=qCHCMCJQCFCQCMC\+CYCfCeCSBCH{C#CC\C C kCs3C .CRCC4BC"3CqC{C (C5CBBBB{BBBffChC C3CCRCCpC CCGC LC%ffC5C<C?RCF{CI COCFffC5C33C\C^CfC T{CECHBBCCYC/CTCVC^C_CkCx\)CxCh\)CbCJ=qC2ٚC'C$BC(CCCuC1C< C0CfB\CO\CCcBuCs3BB)B.BCC =CC (C#C CpCECC J=C )C#C"C2C7C=CBCHuCNCFfC6pC"0C3CnCC\BGCQB۳3BpB=qC:CCDaGCZT{CQCa CqCluCqCz+CvC`YCQ+C9C0hC0 C")CCfCCBBB.BkC{CGC C3CCCC )CC:C CkCCRC CCzC =C \CC(}qCC^GCi>Cr5C)CRCC4{C0CnuCPqC9fC%kB)BB͔{B՞BLB33C+B8RBBC0C C C C\B{C)CffC.C=C CQCaHCqC\C2^C5EC2hC8GCCBBBЅB =B̀BfgBB.BCJ=C uC!GCCCnC :C.+C08RC-C)&fC+)C-8RC&C,RC833CC^CCCAC:uC%CCC YB\BfgB33BB>B3Cq C]0Cc{CtO\Ct >Ck.CeC)C CCChCaffCWEC;T{CTǮCC{CbYCJ#C޸C޸CBQB >BBBHCB=B8RBkBBڣB=qBBBCkC &fCC! C!C"C%^C4 =C.C+=C'cC%CBC>C#C0qC=3CCBCI\CGC5CC5CO\C\)BaHBBBBB33Cz CtCwCyCqC[5CXHCe=C\CpqCRCN CzCtCjfCE^C$CrCqǮC7zCJqC8C#C\B BW BBaHBBuBRBBBzBB=qC)CC33CHC&fC(ǮC(C*3C,C'C&(CxRCC C5C#BC*)C6 C;:C>ٚCC{CAC3T{CٚCffCCgBνqBB)BB33BB=qBBBǮCwECs^CvuCuٚClqCRC>LC@ Cc=CfRCNCLzCs3CHC|C3ٙC)CC CRC65CXC$\)C\C qC BǮBBB BBB\)B.BBCC =CJ=BC)CLC&RC*GC$CC\C=qCCCaGC)C#LC-xRC7{C>C<C:kC=8RC7!HC!cC(C BQBLBuBBBqB33BGBQB.Bس3BW CyaHClqCm CgC]nCEC6GC03C;:C1C*qC%}qChRC/\COkC1GC'0CQB=B.CMC5ٙCBCC^C^CCBǮB{BǮBBǮBǮBCCC{C T{C@C0 >C=#C!#C)CCC 8RC#>C@C)C%pCC,+C4\C95C9.C5C9RC)C!LCkC\B =BkBqB=pBRBB{B>BBBڽqB=qCw C Ce^CdC[C?(C8)C-GC+qC#{CxRC33CC C3C CC{BB(C$T{C_{CTW C0C+C=CfCBzBB➸BkBgBuBBaHC\CCC)C C)C)CT{CCC3ǮC50C"{C=C@C\CzC&C6C9C>LC:C5ٙC8RC,CCBBkBW B=qB)BfBBuB33BW CChCxCe&gC_\CWCK C:pC9=C#C .B\)CGBBRB=BBBBCǮC.CJBC:C*fC 8RC@BqC=CB >BɸRBBBffB >CCC CnC!C3CCEC)C\C8CAaHC"{CCC 3C >CC+C8CFC7LC-GCC$C/33C3C.C1C733C133C# =C"xRC ٚBB.B.BBeC^8RC[RCcCh)CoqCtCNGCE CGC6C$!HC\)CǮBHBaHBBڙBBԮBBǮC:CHC'HC' C-!HCJC,C \)C%C(cC!8RCBB)B#BBC s3C CC)CC C C C C3C 3C\C0C\)C.C!{C'\C&C(BC..C.kC4:C7qC.C#&gC#)CBfBB`B\)BB8RCKBCKQCQ=qCT=C[C]COCHCGC5C! CCs3B\CBLBfgB.B\BHCC RC0C(.CqC#C4C)33C8RC\C5CW C+B{CBfgBqBB=qCRC CcCQCCC}qCCYCqCCC%)C-33C-:C$GC"J>C {C+C/GC7ECBuC:C/C*C8RC=qBQB=B\)B3B\BW Bɳ3CJ8RCJCN\CYC]:Cb8RC]GCR+C@C# C!HC$O\C)C\C&fC hCB3B(C BC C' CC33C C*zC!CC ffC{CC C=qCnC)C\)BzBB33C8RC0C CC8RC$qCٚC C CBkCCٚC\C+CJ>C xRC')C#EC1CIC<\C)^C$3C*33CpCB=BuBB33BCK#CQ)CLzC[CbC^\)CZJ=CJC2 C!{CnCCYCfCqCCC qCHC\B(ChC =qC YC qC {CC33C C s3CCGC C CpBHBHB33BuBB8RB=qC\C \)CO\CC)CB#BͨBB]zBЀC ޸C cCCO\C\)CC"HC,HC,RC*C)O\C#)C$:C CBuBB㞸B >CS}qCMECJ\)CE\CJCKfCC\CF =C)C}pBzC%C,CkCCT{C!HC =CCpC\C(C 5CBC^C C\C C$W CٚC BBzB33C\C#C=qBB잹BQBB{CCٚC :C CqBBȀBpBuB C CCCHBfCQCٙCC'C->C&C(LC4)C"CO\BfBHBBkCECIECN CXYC>C>HC;(C?C.C%C C{CIqC޸C&(C%fC3CfC C\)C +C CC uCBRBkBǮBCECJ=C =C@BuB B؏\C=qC+BBpBaHBkB噙BBLBLBQCB=qB{B >C =CC{C {CB\BC&fCCqCRC.C$ C&C%&fCǮC ^BBW BHBzCO:CFs3CX >C[\)CVpCSCFCKJ=CCC3C CCa CT3CECHB{BC5C(C\CBuC0CqBꞸB#Bγ3B\)BLBCB#BBB33BӔ{C CqBǮB BBBޏ\BBBCT{C{CHC !HC@C ECCGB(B#BCCC nC0C CxRC ٚC)C3C C_fC` CiQCa޸C_LCQCE3CK&fCP CSYC]J=CTO\CQRCNCPCCB#CcC C#B(B{BCBBfBRBBBGBBLBfB >BHBڽpB BB\BHB#BBfBffBkC 8RC&fCCnC CqCC J=CBGBHBGBC@C@CC!HCCHCCJ=C>CLA MLAAMLAA AmAYA%AAk[AvAAMAAAA"(LA;AAAAAQA}1A AmAA(A/A1ZA6A6FA55A641A1SA/.A1%A/A,A4AaA9A0PA.A A yA 0AAA4dkAhA>nAA-A AAAA5AAHAPAaAeAZA|ArKA AAAA JANIA.?A A4AeAA!oA'0A(@@t@@d@7A@k@@@8@昜@g@J@'@ @M@ A A A qA =@ZA j AA >ACA AA AAA!A,A#CADA!6AAAWAAA&AAk[AkAAA(A)A%T@@pO@&Q@7@;!@|@(@J@o@ݚ@O@{@AgA{@@%@E@ @s@>@2@f@@@@AݦA _A PA uDA A A+AA2A AAAA A! A!aAAAhbAdAASAUA)AAߡA!A"A zAAA 2A!G@-@'@޽@q@Q@@?@QB@C@2@W@@+AzAA@]@K@@q@a@2@#@h @ @@*H@?AA @Ak@tFA{AAAqAA ;AiA(A7A hAjAA~AhAbAA}A AAdA@jAMA"A'A+qA(YA%bA#A IASAԺ@.@ҡ@JS@cm@ߡ@P@H@o@0@@@@&@ @;@L@F@+F@K@@)@@ @ @@@߫pAeA@o@ߏ@yAAA TAuAAeiAA WAbAmVA tAAߡA_A*AAqA` AA3AIAmA'dA0_A,A'tA"\ASAANAA@ @Ͷ@m@@@h@@@3@zH@sC@@=p@Y@@1@F@(@'@ޜ@k[@@]@@@G@݁@@[@)@$@KAA AAqATA"AAk[A A GA "A :A A.ASARAAvARAA-AbA[+A#UA"AAVAjAYA0AA_AA AffAa@;@H@@p@@B@E@q@@G@.,@~fg@x=@h @p@ÚC@ݺ@Y0@h@ر@ @y@!@.?@.@)J@-@T<@ٚ@@8(AAA lA FA 41A X2Ax=AA>ACA A AA A 'OA `A *HA A A .A fA A (A~AW5A9AE AnAAAAQAATAYAAA!f@g@@C@Cc@7@ @41@@@C@Z?@{X2@( @S#X@TKP@@@R@@@@l@D`@ҿ@ =@Ȣ@~@N@ƒx@ָR@IAqA"AA;A eiA ԺAHWA5A+AA KA&AnTA LNA >nA #A &QA -A j]A YA ]{AA ;A QAuAAňAoAXAWA[+AA\}ABA0A@o@z8@ff@@:@@@o7@l@Y*@P?@_@zn@?ޣ.@E @i@? @7@g@&@~@3@5@\)@Æq@9z@@Ђ@X@e@l@{@UA$VAMA A BAx=A AcA` Ak[AA A -AA$A AoAAA AAR@A RAޣAA 7AݦAAA=AAԺA @˽@ 6@R@U@I@@\?z@@nvA@9y@T*@E@@cG?7~?e@UG@b@@o@i @k@@JS@™@|@ˇ@Ԑ@O@w@/@Í@@@^yA}A9zAAvA@APARA>A9%AA #A7*A$VAI@xA bpAA#\A*3A"-A9%AnAKAzAaAAS>A 7A8(@D@]@@j@x@N@3@@c@@x=@@]@J-@2@??!@Q?|3@4t@@@x@NI@7*@$@K@@@pO@ގ @|3@@@"@/@(@n@k@@@d@ȁ@f@:#AAAWAAAAAf@2@EAA UAgdA!{6AA *HA#0AAIA5AUAaAdAAӽA_A$IA*@ @I@@@@=@G@Ѝa@~@{@V@ ML??n^z>&R9?j@`\~@<@R@@/@~V@ei@ߡ@@@$@,@I@ӑ@/<@ݢ@%T@@j@ @a@@}@y;@k@@ٖ@ @`t@@WABA %ACA18@` @\~@c@6AWAuA}AeAAA AAzA mVAo@|4@ո@@5@V@k@#?g@3@s@@)@Hv@@-@2@~@9z@@J@w@@@ʨw@p@ٝ@@@JS@~@-@ @OG@@m@^@ޒ@"@Q@@8@໠@@@Z@m@33@@A5/A8AAA/@?@EA@F @v,C@@ @7~@^@j@E^@@,@S@g@ȸ@ˤ@dk@}@@@|3@]'@ei@5@ĥ)@F\@@G@R@@AA"AR@A0AA)AZAMA A#ABAh AdA@gd@ @@@n@Ef@uC@~ @z @x|@C@,@F@V7@d@{@@.@@Z.@V@@@[@hGY@}?x?$?H@.R@c@Y@|@a@@QB@@@@@Ɔ@Ȗ@ĵ@%@j@9@@@ar@W@@v@]@@Z.@@AAA@@)@ @6@:x@}1A!AA "AAAAA@4@@W@T<@g@{5@Z#@_[@X@e@eG@`@xB@,@(L@(M@`@F\@q@m|@O@$@?@?Z?׉>$t?S?}1?܈@x@"E^@`*H@f@B@,C@<@@@@}@p@y:@bp@S>@GZ@@@PE@@~@@@c@@fA $A>A '@|@i @`@H@L@+@&A@gv@_@usH@;u@@|6,@} @rJ@nň@oDa@y@d!?b?ǘ>]?s? 6?h?@?@V7@#x@V<@rz8@@@@@@T@D@}@@@@@ @@m@@@@ر@@.?@|AA A sH@@.@@ٯ@vA@I@5@i@A A A "@F@(@C@hb@OG@S@w@@^@1x@al@7@s@I-@Y@S @>c@dR@n@b#@ot@\X@HT@.c@,hb@:?۾>ܩ?4;v?kB?5?B?W?8@@&@nҿ@@A@Ժ@-@w@@JS@p@@Ag@_@@5@5@GY@X@G@o@@ֱ@r@"@`t@@O@$@E@|@@@zAhA}1A >@$V@}3@0@hb@@!@S@cm@f@o@T@U[@5+@3A@%@+F@+h@!l@.@ns@x@Uu@2@@ !@1@)@?#?`??Ճ#@h?? ?P?*@L&Q@ei@j@@s0@q@dz@R@l @ ;@@mV@&@d@H@B@c@!]@5@z9@8|@!@S@z@<@B@=@R@{@@?@(M@Q@A!@@@@1@B@Ag@ҿ@y@@~@h@Gd@@E @28(@*@0*H@o@?? ?걷?݋??l?w@ @+@c@@ W@V@@3@$V@nfg@|DŽ@|@@@X2@LN@@O@T@@\@,@$@y@F@Я@ݭk@'@LN@@ @@㋺@s@v@сBX{BB#BL\)Bm BBw =ByzBrBkBqBx >BgHBXBQBFBORB_GBb BwffB)B3BOB{B\)BGBB0ffB1B4B:B; >B=B? B9B9GB,zB)QB^BSBIQB@B3 >B, B0BmBB)BBB{BHBBzpB|\)B=qBLBz33B_BNB9B4zBHBazBcBvBf\)BNB$zBHB1B6B&33B'B%B$33B-B7QB@pB8B;B;B@BCffBHB@BVB>B7GB0GB(=qBnB=qBBGBuBLBBgB{BBBBBBBtB\B7B+QBHB`33BhGBp=qBtzBaBb Bm=qBUBI =B:RB&RB% B#zB){B,B7B7HB1GB7(B[BoffBlzB]\)BU\BQ B8 BBB_B#BǮB=qB\BBffBB3BBBBQBy{BhBa\Bh Bj\Bx\BlBj=qBfffBn=qBr=qBtBXB@B*=pBzB\B&=qB8B<B7BIBY33BBypBnGBaBmBLB"B \B\)B33BRB{Bu B{BBBǮBffBBBpB8RBB.BBB)BB}\BmB`=qBrB=BBuBrGBUzB9\B"B(zB6B=RB?B?B6BOBBBkBǮByBu{Bb =B[BTpB>fgB=BBGBGB=BW BuQBV{BdHBo BqpBpBLBkB\BuBGBBBW BuB)BkBaHByHB~{BBB8RBuB{Bp =BxBgRBT\)BWBCBC(B)QBPBBfBBv >BvBXBKffBL(BJzBKBS =BRBQBB\BBkB|BnB=qB\)BB(BB =BW BBBBQBkB\B=qB)BLB~GB{BW B=BB8RB33B{BufgBaGBSffBA33B;\BV{BnBBpB\)BTGBB ffB,{BEGBKB[ Bg(Bc\B`RB BW BB)B8RBwBjB\B.BLB.B#BBffBBBBW BuBǮBgB~Bn33B{BBBBB)B}GBeB[33BPfgBJBI Bd(Bg\)BcBoBeB?zB,\B$B1ffB=BKBY(BdHBd{BfBdGBeGBmpB~=qB33BBÀBŮB\)BuB>BuBGBpBBHBfBkBW B=B8RBB>B\BB{BuBr\)BUBoBkBuB =B.B\)BfzB](BRBPzBQBSBZBg\BVBX =BIB[\)B[BOzBLRBaBe\Bf BgBdBcRB_ffBmBrQB)B{BGBBBHB33BB BBBBBBRB3B{BGBBQBgB8RBB(BBf{B=\B]BRBQBBBBrB\BBQBhHBY(BNBV33B[BUGBSBSBS=qBbQBqpBe\BeHBhQBf=qBhGBhBizBdBc\BpHBcBczB[BMBLB{BB3BB(BpBB{BBfBB33BuB\B >BBaHBBkBBx{B`BjBkBBBBHB.BBHBrBX{B`BXB[\)B_BZHBR(B;BR33Bk=qBjzBfBcB_Be(BizBqGBrBizBXBH33BPB@(B B<\)B(BB3B8RBBuB >BB33BLBRBvBwB =BBBBBBBBB33BpBh\)BUffBn{BB\BBzB\BB=B3RBQBI=qB`\B_HB_BVffBQffBMBT BcB^RB\\)B^BUGBWBhGBq(BoBjfgBgQBTGBI{BJQB?BABJHBPRB8RBpB\B(BBBkBqBLBB\B =BHBRBB33BB=qBBBB.BLBbBlBBffBB{Bv =BUB+ffApA\)BHBaffBWQBU =BLpBDHBCB?\BDBEpBGBQ{BEBGBQffB^pBeGBe33Bb\BY=qBYHBa BZBUffBM\)BMQBJpBHB{BLBpBC!HB.BffBfB=C33C'CpBBBBBB.B#BB\B=qBǮBuB BBB#B33B8RBWpB1{BB 33BB9BE BA B<B@BF\BIpBFB?B/HBM(B9RB)=qB;BGBVB`\BbpBZ(B[pB^BjpBdBVBTffBRBMBV BJBPBӳ3Bٳ3C CBB{B{BRBGC C+C"3CHC\B\)BBB\BЏ\B(B(BqBzBkBfBBB=qBpBuBo{B=BDzBK{BEQBU\)BLffBAB?GBB(BGBLffBRBUBM(BSB4B=qB)BLB[HB\QBXGBPBN =BPBU BW=pB\QBWBipBaBaBI(BJ{BMBU\BTHBDBB㙚C.CBBBBqBW C ffC}qC$ C!CLC C8RBBuBkBfBB\)B >BaHBBBBpBRBsBX\)B3BZB_\BbRB_QBWHBJBJ{BH\BO\)B^Bj >B_GBLB9B. B=(BOBUffBUffBQRB>\B3B4\)B9BB33BLGBlHBd\B]pBZBGBCzB=GB9B8GB2B&BaHBBBaGB3BfCC \C8RC33CC\O\C#C CzCBGBBBBBqBGBaHBGBqBBuBpBB =BqBLBwHBs\B] =BVffBOBM BPGBTzB\ffBc Bh\BjHBKHBCRBGBWGBYBSBJ\)B9B*B, >B1\B9RB^\Bc >B\BR\BOffBRHB3B/B#B!B)B{BuBBC C LCaHC!)C:#C0C0QBW C C-GC43CǮBBBBBBģBʽpBB\)B(B\)B=BfB =BLBBuRBfBg=qB]BW\BOHBTBWBZB_zBa33BcBi\B^BNHBEBGBPBM(BEB@B5B1B4GBFB[ffBaBPBZ B]zB`pB7 =B+GB B=qBffB)Bʳ3BД{B33B3CaHC9xRC*\)C)J>CCB8RCxRC nCuCaHC@BBB BęBBB BBBBQBBBqB >BqBpB`{BTzBG{B?zBV\BQ =BW >B]B` BiBmBbBNBFQBB(BIpBJBFHB<(B933B5B5=pB8HBWzB8RBB.Bq\Bc\B7GB/GB0 >B-QBBBB͞B=pB3C{C!LC0CO\C BBBC)BB{B.B(BBW B¸RBRB)B.BaHB> BSB}{BB8RBBsBjffBLpBM=qBA\B8 =B1RBB)BBiGBTB>RB6ffB.\B' B)HBGB B\)Bó3BzBpBхBB٣BBaHCCLC 3C hC\BԨC .BkBƸRBB~QBqBϏ\BBBBBBB` B]=qB33B\BBBpB| BFB5 =B)fgB+B.\)B5BEGBHfgBR33BXBT33BQB<(B*(B+B2B5 B5 >B8=qB;B:33B8B=BWB\zBkBOBHRBN=qBA\)B@B5 =B'B,B0 =B.HBBB >BÀBBW BBѳ3B.B8RB̸RBfBBBffC.!HCFLC"C BBqB{B B\B =B\BzBĔ{BB{BBW B{B =BLBBpQBD33B {BB6{B8\BEBBB?BHHBXBWBR\BFB9(B1B0\)B#RB2zB2ffB3\BBB>=qB2\BBA(BBBM BJBMBJ33B@B8{B4pB1fgB5(B-=qB&B'{B\)BB#B =B˙B =BLB\)BBǮB3B8RB33BCJ>CBfBBB\BBfBBŨBB=qBƳ3BBpB{BW B=qB\BpBmBLBM(BQ{BJzBKBHffBG BJBIQBNGBI\)BM =B\\)B[BJfgBBBD=qB>QB9=pB533BBBEBOBKffBEBtzBl=qBZB\(B_HBWBR =BYBRzB>HB6zB4pB9B7BBCBkBBBʣBȨBƊ=BBkBRB8RBB#B³3B >BHBBBǮB)BBB=qBkBaHBzBBǮBBGB=qBkB=BQzB\QBZ=qBP BJGBNGBQBH\)BEB9 B3B8{BZ BfQBVzBKzBB=qBFB:GB4BCBJB`BNzB*B}BxBvHBo(BaBYBLQBJ33B8QB-B. B2RB6BՅBޏ\BzB\)BBBpBqB=qBBqBBHBqBBQB3BBBqB >B#B33BuBRBBBqBpBtffBkBh BjHBq\)BsHBz\BqBa{BCB9QB#{B6 B<33B)pB3B =B@ Ba(BW BW\BQQBH\)B=B+B;BMGBKB>ffBBpGByBuB\BB(B}33B\\BQ\)B:{B034B=B9 B0B(B%\B<(BBx\)Bl(BqffBWBLB@BPffBXRBZ\B@pB!(B)RBYzBq\)B33BB` BBB"RBB(33B1GB2QBBBBHB33BQBuBB33BW BB#BBB{BBHBuBW BQBuB(BGBHBBνqBzBBaHB.BHB.BB(B{BQBGBvzBbBLGBIGBH{BJBQRBKHB?B7B{RBzBBfBBRBHBnBc\Be >Be=qBLB7B?BQQB_BlBzBnpBcBHB>fgB>B2=qB+zB8GBCQB=B\B.BBW BpBffBqBBkBBBBǮBuBBwBBpBW BBW BBB\BBBBBBBBBLBW BBBtB`{BT=qB\{BSBQ\BT33BRBMzBpffB{B\BBBGBtGBt33BkzBd33BbQBLB<\)B.B;QB[pBY(BcffBlpBB8RBLB} BlRBYpBD\BEB\)B{BBBGB#B BB)BB{BBB3BBǮB BB33B)B33B(BffBBBBB(BBBBB8RBffBfBBQBkBBq33Bl{BiBeGBVBNHBPGBERBGzBmBB.Bo =BPB: BD=qB@BHB>B9zB/\B,B0\)B@BJRBcB{B3BBpBBuBjBWBUB=qBBRB.BB33B.B=BB=pB~pBp33B\33BqBBBBBffBBfB\BB{BBLBB8RBBffBW BB(BW B=qBB#BzBBBtBiB\GBWBRBQpBg\BwpBsB[HB8B5=qB6pB9 B8pB. B,QB%ffB)B+(B+BAzBk\BBBBBzBqB=qBBtzBZB=qB=BaHBBBzBBB=qBB.B(BSBg=qB3BqBB)B{BǮBBpB33BBBW BB|B}(By\)BRBBfB=BB(BB\B(B =BB33BrBz\)BfffBjBeBe=pB_Bb33BMHB?(B/B(\)B*B$RB#33B"\)B!B!B"pB-B:BppBQBBBBBBBBp{BhBǮB=B)BrBv =B{BB=qBy >BzBBp\)BBǮBBBB BoBB#B#BQBgBBRB>BszBGffBDRB?GBMBSpBnBB8RBpBC7C BBlHBhBmBupBn\BnBlBnHBlB^BOBDpB3B)BB =qB BBB(BB;RBVHB3B >BB3BBBhBjpBZGBQBXBeBrGBwBlBBRB33BB}B{BjBǮBSBB(BRBypBnpBh33BrBizB:\B'B*pBB@BD\BYHB\{Bb BkBgBոRBRBBpffBjBrBHBBRBxGBr\BtB`GB\BZ\BFpB7QBB(AQBQB BBB!33B,BkB|QB>BBvpBwGA(;A AAAA~AA#A AEAA A$#A%pA&A%OA$AA"_A&hA'PuA'A)SA(33A(.A)`A*A1E|A5>,A7A)A83A3eA4,A02A+͈A3w9A:>A:\A7A/A-AAUALASA33AwA|XAAMAAHA`A!A"jA#4A A! AEA)A A!A%8A&A&cA&3A(ݟA(A(:A1cyA2IA3 A3gA5A8jA76 A42A1uA._A/}A49A8TA1A4:A0kA0Y,A A2A2AALAAXAmA A8RA?AiSA+AcANCA9AA"AaHA.A*AAlA$xA%A(IA)VA*xA,uA/A3A8A5A033A+A+A$A*A-OA/{A18RA3A6ATAdA A AAAAAUAykAAABAAAoAAdA^[ArA ]A CAA0A ,A؁AmA=A uAW AE@AS@Ϻ@@@@Pu@v~@w@@@o@U@ޣ@@^AQ0A@^@I@@^@ /A& A'A Av~@@@@\)@@@2ADA rAAVAA+Av~AgAAKVA+AA AAuA AiArA@ =@J@@@CK@ @-Y@A *A_A -YA AA @@4@@pAA|AAPAA @s@nI%@`@Z@ػ?AY@@@ހ@H@@ޱ@rAA@A@F8AJArA/A#A E|A A@SbA/A{A.AA cA A,@(@c@AA AA؁ALA c@rAA)AAlAEA Ab@(@0F@=q@֢`@Í@4@؁@@B?@o@e\)@@@\1@U@Z>K@>@@@@0F@@@ٳ@ڨ:@v~@#@@_AWA+@@@@ @_@2AABA@@@iT@5A=qA؁AiSA o@r@@@DA@@p@A.A FA *APAKVAUAAAA _A A A dA LAA A@@h@¿@(@ƻ?@CK@*l@ʊ@@@`@w@i?@^?@L@$r@=g@@{@r{@G-Y@@Sb@Sb@Pu@Y<@\@#@.@ֹ@lA@9 @1@_@b@@C@@?A@@cy@I%@b@L@A^AAEA@@l@@@@(@9 @@@A AGA AwAARA A eA SA A ҧAA IA }@@|X@_@@w@@"@؁@`@@v~@؁@@@@@)t@Z}@v@@!@ @~z@7@7@@*l@ @?@@@h@u@@@L@@ੱ@C@u@@@@ߍ@Y<@0@r@ff@@I%@Y<@9@@@ @(@7@L@@d@@s@r@@cyAA 6 A A AA #AAA@@F8@ҧ@@Ы'@]@џt@@& @m@@@橱@@@@"@:@M2?p@D@b@M@M@Vn@@z@U@+@@@T@@Ө;@Ѷ@-Y@@ @@6@D@T@I@F8@ʓ@ά@b@'@ڒI@@p@M@w@[@@؀@݆@ߦ@'@@_@@@AAAAA A ڲA AA AE@U@@@@@u@@^@@^@]@_@@ҹ@@{@ /@@@Ք@/33@"Ք@F@p@D& ?l@@>@o@@@@@@W@@@,@|@@Pu@ff@j@>@։@թ@B@&@*l@@@@p@ڻ?@z@ @0F@į@h@ܹ@W@0F@߿@@#@b@Y?(?4?;@+Y<@:@o@!@{@@@CK@@?@ =@؁@@@@@:@ /@s@2@Y<@@@_@@AAAE@7@v~@(@o@ğs@r@+@[@z@_AnAB@@iS@-Y@(@(@& @o-@#@c@;@}r@\@ @@&@@@D@D@#@i@M@@@'i@|X???@fg??W@@=G@{E@7@@2@@iS@7@_@Q@@:@(@ҧ@M@_@@@@yk@@`@ђI@*l@A+A@!@}@`@iS@{@@G@@@.@ @@B@V@@g@L@@5@r@mv@8n@n@L@+0@l@B@o@x]@-Y@@t @~o.@{@qY<@fu@fI@oD@ >L?\?d??!?v~??r@4(@/yk@yk@@@@@@o@@?@[@_@9 @C@@=q@VO@@@-Y@u@@^@1@4@@v~@VO@Ǔ@F8@7@ *@@@䙚@@|@Q@r@C@m@2@@Q@@Z@q@S@Y@Eg@B@C@E +@`@Em@Dz@{@cy@i@R؁@6@V@_p@N@5yk?6?J?D?L@?U?v@ t?>@\@4@{@@o-@@|n@g@ff@ @@@@@J@t@@Q@g@@_@@@w@߼@9@ɢa@@@@v@@߮@@@#@@& @2@@@-Y@\)@s@q @f@J@C@@U@;v~@2@ =@6"@f1@Ki@w@M@yyk@qVO@(I$?ڕ6@)>@2h@ @#@ r@o-@!m@@ {?1@".@&@myk@0@@-Y@@0@s>@@@@j@2@@@9 @ =@Y<@g@v@o-@@0F@M@l@@@߈ @ܜ@@@ۯ@Sb@z@}@@ =@_@@w|X@q@{M@~@@@@hU@@!@v}@i:@@Sb@y@^o.@M@D@Gg@(Z@?_?L???ff@&@!@0]@%&@/6!@!@u|X@\@@@G@@@@:@Sb@+@Y<@N@ +@$@@t@@?@@_@@@ @l@@A@L@F8@ /@@шBBGBBƔ{B˸RBрBGBuBՀBLB8RBBGB B33BpB33B)BBǮBBBkBoBhBkHBeBWzBVGBKB8B>B=\B?BcB3B8RBBaHBk{B^GB?zB/33B4pB=qBpBzB)B\BB{BfgBQBѮBW BBHBB)BRBǮB\)B =B3BB3B)BBq33BpRBB\BGBm{Bn33BuBzB_B>GBXByB\BqBBxQBBB\)Bu33BpBW BBqBB=pB=qBBBѽqBGBBBpBBuB3BBRBBBBzB{B#BHB{B{BBBBffBw\B33BB}pBnB~B)B{B33B{BB\)B B#B BBBBLB\)BB\BQB B(BBBaHB=qBQB\BBBBqBBQBfBǮBBzBpBB33BBB)B~B~RBBnBy=qB(BBB =BGBB׽pBBBRBBBBzBHBqBBǮB\)BpB\B3BBBfB=BB{BBBB\)B=BLB33B\)B BBGBuB.BzBBqBpBo\B\B BBԔ{B B#B\)BW BpBGBԀBBBBkBǮBBܳ3B.BBBBBGBBQBBBB8RBuBBBBqB#BB33B(B(BgB)BBfBkB#BffB B\B{BQBHB33BB3B>B\BBŽqBŞBиRB#BBBBQBس3BBBpBøRB BaHBW B͔{B.BRBB\B BuBBBqBǮBBGBǮBBBBpBW BBBBRBBBǮB{BRBW BB\)B.BB=qB3B½qBԣB.BB33Bس3BB̀B)BLB=qB\BBߏ\B33B33BkBBBuBBuBuBHBzB =B33B BqB =BaHBB.BBBBuBBaHB.BB{BzByB3BBQB3BBB#BɣBfBfBGBfBBaHBBBffBBzBB)B.B(BǮBǞB=qBB8RB֙B{B\)BfgBkBB(BBfBLBBB\B\BRBB)BB=qBpBBBQB{B >BBB{BBLBqB=B3B8RBB\)BGBB֔{B8RB8RBfBkBuB{BpB\)B}pB =B3BBaHBRBBBffB{BffB =B =BBaHBfB#BBB{BLBBuBRBB3BB.BBByBBqB33BfgBRBBBBB=qB BBBfBBzBBB=B{B8RBBBǮBHB3BBBHBfBǮBB8RBpB3BBǮBuB.BBqB=B BB½qBBBGB=BuB\BB{BBBB}\BtBǮB.B=B8RBfBffB{BBkBBBB =BBB{BqBqB(BBBQBBBzBBB =B\)Bl\BcBǮB(BW BB\BzBBԣB3BٸRB=pBB\)BBBRB{B =BB8RB B B8RBvBj >BwpB{BvBsRB={BEB}{BffBBBGBB\BHB(B.BBBBB)B{B\BBBB =B =B=qBqBB{B3B BHBB=pBBkBBBaGBfCT{BBB̸RB.BLB{BB=qBB=qBB#BB\BcRBIQBZffBY(BQBM33B+GAQABtGB8RB{BB\BqB33BBzBlQBuGBzQBqBBLBBqBB\B#BfB33BBBBqBzBBQBBBRBBBBpBB̊=B8RBBqC{CBBaHBaGBB(BBGB34B{BRBtBs =BH{BDBTHBMfgBH(BIB-=qB{B& =BZBwBffB=qBLBpBBHBBV(BSByBpBBBBB{B{BB)BBʮBBuB\)B\BBBuBB >BBBBGB=qBBBfBؔ{Bٳ3B\CaHC\C)C:C}qB=qB۞BB8RBЊ=B8RB{BzBdBfBEBBB?HB9BEzBDBGHB?B5Bl\BtBpBkBfB BLB\BBLB`33BLBLBBuB^BxffBB.B{BBpBQBHB{BB B >BBBBB\BǮB(BBB\B֮BpBB=qB=qBQCC!qC&C'{C$3C8RCnC3BB(BBLByfgB=qBBpBkBBrGBCBOBIffBIBIfgBV=qBf BrBǮB.BB33BB=qB{BaHBLBBBLBB =B(BBx B{=qBaHBRBBBBBǮB(BB =BBzBB3BB.BBuB=qB{Bس3BzBBBᙚC GCSHC+O\C>pCH\CFhCfC%s3BkBBGB8RB33BBBBfB{B3B~\BjB4QBOBPHB<\)BJ{BWQBtB\BǮBGB33B(BNJ>BBBBffB33BkBkBBB{BBk(BnBqBzB{ BBW BBGBuBffB\BBBBpBB#B3B#BkB\B33B\CC )C9C'!HC%RCNٚCe\CMfC= C: CBBuBQBpBuB B>B\BGB` >AAB zBB.B533B^BuBLB3B\)BBBBB\BqB\)Bϊ>BBB(B=qB\B|ffBeBNBCGBkRBpBBBBǮBBaHBB#BBB߀B(BǮBʽqBRB{BB8RB>CuC3CLC}qBϊ=CnCPC9C BBϮBřB˽qBpB\Bȳ3BBffBuB}GAzB33B({B(BBBpBW >B >B =BBQBLBBqBW BBƅBBBuB33BLBBg{B,B=pBK(BuBBBpB\)Bn\)BqBfB{BGBʳ3BրBڞB =B̀BzBBBzBBBGBC\)C T{C :BB>C3B(B\)BřB=BBBHB=B_ =BfBBBUGB*fgBB{B\)BB(RB1BB BB{B.BBBBW BBQBǸRBÀB B)BB.B#BNB7BNBjBmBu Bn\)BJB=BcBBBffBBffBǨBzB˽qBfB.BBB=qB͏\BBBB(BCCC+C"{BBkBBB\)BaHBzBBB=qB=qBYBV{BB{BǮBuBaBVB6pB+33B.=qB5 >Bb(BjRBBBBB{BQBW B=BBW B B(BzB\B8RBrHBfB^BZ33BuBqBjBNB'B8BvBQBB\B8RBB®BBBBGBBzBffB BB#BqB#BBzBC.&fCxRB=qBBҊ=BB33BBB(BffB.BB{BǮB.B{BBRBLBB =BlB/HB%BO\)B^BpBB >BpB >BGBfB\BkBpBǮB㙚BB\B\)B=qBBkQBBpB{Bz\ByBt BlHBtBBaHB\B33BaHBGBBBfB8RB#B BLBBB=BBpBRB >B8RBBBBQB33BB.BpBBB#CB=pB\)BkBuBGBBHBB`(BffBB BBu(BtzBnBcBeBwBzB|RBfBW BBBB =B =B33BB{B=B =BBB=BBBpB)BfB>BBB)B.BHB8RBBB)BBBBǮB.CfC C޸CBBBB#BB=qB\)BzB{BBB\B֔{BBffB\BQB B\BB#BLBBǮBuB\)BzB{Bq =Bb(BTBZpBl33BBB\B\BBBRBBǮBB)BpBW B3BBLB)BBB B\)BHB.BBB.B{BB.BBB=BBBCC +C C=C C#CCٚBHB#B\B晚BB{BBBǮBBBŠ=BBHB\BuBB{BB)BBB=qBBv\)BxBXBUBOBeB BBBmQBBfBBaHBB.B\BfBBaHBuB{BBkB8RBQB\BBaHB#BB\BBffBB(B8RC qC BpB)BfgB.CT{CCCBBHB33BǮBBBqBBBB{BBffB\BqB{B(BBB|BB} Bq\BVQBGHBORBV33BjB{BBBBpBQBBBffBʞBkB33BBОBBBBBBqBBBfgB33BRBBBǮB=BpBRBЙBLBB\B\B>BzBHBB B\)B=qBpBB >BB{BaHBkB\)B#Bf =B_HBB{BLB(BzBB\BpBB.BuRBQB|BnBT=qB>pBJzBbQB|HBgB33BB =B\BRBBkBɨBuC=BBB.B#BBBǮBffBGBBBBuB\B8RB#BHB\)B#B{BQBɨBGBqBBBBfgBuB\BبBfB=qBޙBB{BB\BգB3BBBs33BdffBGBBkBBBW B33B\)B#B(BBRB8RBǮBSRB8(BIGBg(Bn\)BffBBBBgB)BzB BHBBkBؙBŏ\B=qBBB\BGBBfBy33BURBuB{BBB\)BHB(BW BaHBB=qB)BkBB̮BǮBǮBaHB BBB\BB\B(B=qBBB3BLB{QB#BW BBBB~BBzB.BBqBBfgB3B{BrBb >BBx BrB~ffBpBgBBHBQB)B=qBwBBBfB\BB\)B =BkBLBLBBm{BQBB(BBBB{B{BǮBB`AA'BqBB.BB®B)BBQBBBB)B{BfBBpBB\BBB(BGBW BhzB B(B)B BBHB.BW BBpBǮBB)BQB.BBuB=BBBǮByffBGB =BBB=pB{BBLBBQBBW B8RBBBBBRB\BBfBB\BB\Bu B%{B+BuQB B#BuBffBLBBBBHBuBuBB\)BLBB{BBGB(B =BBBBW BB{BaHBBHB\B =BfBBpB.BW B{B >BB=BW BBBBBǮBfBB BB{B\)BgBBzBQB(BB =BffBB BRB3BuB)BpBuBBkB{BqBfBBB33BqB)B =BzBzBיBǮBBB(B{BB#BaHB{BBBBzBfB}BuBBB\BuB B B{B3BfBzB8RBBfB =B.BǮB B(BQBBBBB.BBBfBkB)B̸RBB8RBBB8RBB#BBQB\BBBBBLB(BpBǸRBuBB=qBgB)BaHB֙BuB{BkB3BpB33BBaHBB33BB{B\)BBB3B}B(BB=qBHBBHBB{B}QB}BBB)B.B.BBB >BW BBB3BaHBBB=qBHBъ=BHBzBB#Bя\BLB)BW BGA(bpA*nA6A>ڬA?` A@WAAAC;ADAGAFAEbAHMAGlAI4AGAC#A=(A:pA9A:kA$2A bpAAAA ]'A"vAA AhAA*AAA(>A('A*%A)A,NA+HWA)qA%.A)?A)lA*A/qA3qA3aA55A7xA7A:A>AAoABYA@ֶAAA@A=A<A;A;A;;!AAAffAAA ffA"A"j]A$A#AA!#AAA!uDA($A0A-A0A3 A5/A7GA9/AA@eA=\A:kA5A3A0ZA10A/5A/bA5dA:RA;qMA;PA9A8NA7AAA#A$ZA$[A#A`AfA}AAAA"A NA'OA!A']{A(A#AaAA lA"}A# A#`A-A-A+uDA*A.>A5sA:ZA=A<|A9(A1"A19%A2A/TA.0:A,A/GA33A66,A:#A9+A7ƆA6A MA A+A$AAJA6AA%AA=ADA A#A!AarA A yA# A"A OGAAAQA}1AA tFA$lXA(ffA,&A-R@A5 AA^AAbA;pA/j A)A*aA-A-ȂA,A,A-IA133A2A6DŽA7>nA9A5yA.A A A AtAA A4AtAA+AAAߡA%AAA*A(A7AXA AZAlAD`A41AAA4A#>A.A/` A=h AHz8A7j A.;uA'8A$2A%/nA5A4OA1AA0A*gA(-A#A#.A!rAAffAE^A~AGAvA^A+AtAffA JSA>AAA:#A%TAj]AcAAA!AA @A3AqAxAj]AAtAEAA!A)A A^yA3@g@@m@@S@k@~@ ;@@n@@Ǯ@#@gAWA A{6AAZAAAAANA)A.?A,A NA]A9AA^A-A`AAA%TA4AAAAA^A AXAAAfA.AIAnAA0A!#A$A$A%h ApAR@AA+A)AAAA%A#mAA9A?@@V7@@1@@@k@@C0@V@@@@՝@LN@cmAA"A[A3AߡA }AK@x@W@<AA7AaAgAAA AAAAAA*A5AHAAhAFAJSAAA# A AOAPA3A_wAwAdA41A5A#\@1A$@@չP@@@ @ @+@Q@X@L@s@5/@aG@LM@lDŽ@Y@1@a@s@ArA yAeA8@,@E@ AhAeAA*ArAAAjA@AAMApAdkA(AAkAA,AA%A-AAAAA-A"`A'oA$ASA@jAAA@AAA {A$@r@#@@C@o@y:@&@9@ce@ _@ @8@ =@@@@4e?b@(@#@g@ńv@2A A @ @@@8(A&A&QAAPA9A AA A AVAA'A~AA>AYAA^AA$AܨAA`AXA \)A A*AVA+@y@@N@ëp@b@@@ڒ@Ѐ*@18@薡@A =AAߡA yAJAYAxApA `A tFAAXA PARA A A xA AA i`A A @A ^A~A AAAgA AaAHAAAApA3A^$A A%TAyACAcmA%AlAR@ر@ @m@D`@Z@@@@ϸ@@t@g:@1?7?^@a<@8D@E@$@ =@A@jY@ @g@.@ހ@@ei@wAKA'AAA]'A$A UA A fA ?lA A-AgdAdABA=AvAA bAA tFAhA A+ACA E AAeAԺAAAR@AA~AA{AAyAeA.?AQBAGAA2AJ@@0:@Y@@~/@J@*@4@.?@ͅ@@y;@!]@Da@&@*@?@it@B@F\@X2@b@@׳@@4@JS@@@@@A@VAޣAfAAffA6,AZAA VALAFA 33AtAy;AAkA~A A TAA PA HAA JA ֶA ]{A ܨA tA[APAA AAċAAA\@"@\@T;@#@?@@v@c@ê@жW@h@@,@+@߂z@ǂz@Y0@@Zq?_w@G]@6@@>@f@b@Ҥ@N@@@&Q@@i@m@pO@T@FAQA)A yA AmAAm@r@@Aj AݦA\AA A[AAAR@A A A HA ~A (A ,A PA AXAyAMLA:#A&AXA A@@@ӽ@̗@@ۊh@@Ж@\)@X@Q@@g@x@@+@@^@@Z@@ =@P@@SA xA5AsAZA AA APA aA *ADA_AmAA!A @+@G@@J@*H@@@@@@)J@|@ @ٻ@@26@K@L@ @@h@q@}@ո@v@E?}@ 5@%A@2@O@@l@@!@=q@'@@q@@Q@)J@:w@f@ߡ@!@~@@ْ@Ɔ@U@i @c@AA /A5A>A!]AAA A A RAAdkAA AHAWACcAALA]{@N@7~@J@v@@$V@E^@9z@W@@)@ޣ@J@@@؀*@7@@d@@(M@LN@33@gy;@O@Y۪>]?@ <@! @B@x1@@?@W@*@¨w@GZ@A@@%@ @@y@@@@@Í@@b@m@x@{6@`A dA8|AkA-}AbpAaAvA@*HAAA&AA XAADA@@s@2@Z@5@@-@p@[+@o@)@ň@vA@ݥ@!@@R@-@@OG@@n@Q@#@`2@G+?-A?d@.@Fc@C=@GJ@q@ @{@R@@!@ 6@@\)@@ה@۠@ڔ@ܷ@@ܑW@ֵ@F@;@߰@z@l@@AA A9A"ABeAA iA_@.@@@ٯAuA 8|AzA"AW@0@@W4@@%@"@t@!@ո@s0@@7@p:#@V@dk@5@0@@a@ @@f@@J@@K@Ժ@U?Z??$@:x@D@\F@ Q@R0:@xv@gD`@P@dk@-@`@@}@@çy@ǣ@͍@A@A@8(@D @mV@1@@@ݴ@@JSAA Az8A AW@@g@@)A tA.A /A A@C@@!@8(@@@/@^@m@w@@@@HW@@xGY@gd@K@T@@C@%@*@z@^@t@@e@'%@X2@$ @7ݦ@b5@M@EY@>u@ a@@@!@P@@R@@@~@l@Ʉu@ў@Һ@ڬ@#@ΓS@׳@=@ڸR@4@]@AA ZA a@@@ո@ A AoAA A A z@5@@@nT@@T@^$@k[@K@@3@ 6@@"@ys@l.?@>.@vx@@F@R@.@f@@`lY@Q@V @`Y@7P@/9@C@Eu@\pO@X@B@&&@C@?]@R@X@_w@ǚC@@@@d@vA@ȗ@@@@ҵ@,@@۪@@Ҙ@@D`AA\)AAAA6AlAA@@h@@@@@'@Y@@w@@@@_"@'@x@Z@x=@Y@e@@C@j@y0@p!@sz@R2@&?H?{@nT@)Q@'O@AnAMA[A@ѐApA{AApA(BBGBB \)BpBpBA\AzAAzAQAA=pB pB!B-RB@GB>pB>{BPBHBpBBBBǮB#BQBuBBfB#B{BGBzB33CC8C=#BQB 33B pB B%B/B'33BB{BB=qBAAffA֣A AAAAB \)B,=qBCB= B=\)BHBpBqB=qB=qBꙚB䙙BB{B{B.BәBkBffBǀBaHCC8)C>CBnCBdzBB#B=C =BLB BBBB.BpB >B8RCJ=C*aHCDCV^CXs3COC<B3B9BIB\\BPBJBB33B8zB%B/B1B;zB9 BcB\BpB zB(\B8HBQB>B733B933BOBIBS(B[BnBxB}BiBQ B0\BQB33ARB 33BBMBnfgBuBHBW BqBBBBBuBHCCCfC$C%hC@CH{CHO\CS\CVǮCH=qCF+CG{AQAۮAυAGAGB(BB&QBf{BbBaBYB\ =BjQBt\)Bv\BgBX=qBPpB/=qBffBpBB$pBNzBk33B=qBB=BLB3B.B)BC=C{C\C+C"C&hC>CIC5uC1.C;CD CBC=\C;ARAzAApARB{BzB6BaBtzBhRBGpBVzBh\)Bw(BtGBxzBZB_B3B\B RB BSGBZzBZBB{BRBLBB\BǮBܔ{B(CC#C )CCCJ=C#BCaHCC/{C6HC5C5C/\)A=qAA؏\AHA(B%B4B3B`33BGBBV{Ba\)B~ffB}=qBBBBBB~(Bj BjBXBzB{BBBBșBBB{Bɏ\B=qBpBpBB(BCCzC:C hCffC )CCC1C5 C2C).C C CffCCEC$޸BfB%AAAB=qBB+\)BTBxB|BgzBhGBtffBW BRBBBB3B{BB3BBB B BB=qBpB\)B BW BkB\BBffBQC.CfC"CC#C3CC!uC,C3C/#CCC C}qC#C!fCB\B(B(B =B\BRAB 33B>BSQB^GB^ =B` =BkHBfBǮB8RBB#BBB)BBBBBǮBB.BƏ\BkB\)BGBGBBB\B̅BuB=pBBQBC(C {CBuBC\CRC$(CCEC CRCYCs3C C BW BEQBSQBHBDB6B"B3HBCfgBKBBBIfgBI\)BJ33BWpBǮBdB#B=qBBB BBQB\)B\BծBBBB BBBԽpBҞBB֏\BBǮBB)BGBǮBB잸B8RB֙BCC#C)CQC J=C!HC33C C@C=CfBaHB8RB#B{ =B_\)BZ(BMBFBU=qBL\B==qB)pB6\BJHBS >BoQBfgBpB3BGB\BB̙BzBzBzBҳ3BgBHB33BBBBBܞBB33BǮBW BBuB{BBuB.BBQCCLC 3CCB)B8RBCC C C CqB\)B=BB)BzBBuBrHB}Ba =BiGB633BFffBZ =BUpBffBB8RBBB3BḄBBֳ3BuBaHBuBqBBB8RBBBgC BBW B.BǮBBBBB Bۊ=BBCnCEC B{BBBpBzBffBۮBqB\BW BkB.B=pBBB BBB#B{BqBǮB”{BBBpBRBB >BGBӮB=B\BLBýqBB\BBffB{BpBHBЀBQBQBB)BB#BBBB33B33BW BQBkBCٚCLCT{B BBB޳3BpBƸRBB)B=pBճ3Bڳ3B =BBBBB8RBHB\)B)BBBqBh=qBaHBzBBuBBB\BpBRBBQBuBHBB =BBBfB{ByB B{BBB =BнqBkBzBBڏ\B\)BkBBB(B#BBC =CB33BBpB33BٙBє{BuBBBRB.BQB{BBBBpBW BfBpBBQBRBBaHB=BǮB=BBaHBBǮB>BBBGB>B\BW BhpBT\)BiB\BBQBBBW BB\)B >BB\BfB(BGBBΞBBBCEB33B)BB33BBힸBǮBQBָRBB֣BըB8RBzBBB\BBW BLBpB=BQB=BBW BRB =BBzBB33B\BBqBij3B =B{BBQBB =BB =BBkBBD B8 BS(Bz =BBB)BBzBB8RB8RBpBfgBBkBB(Bڏ\B(BLB.BBpBȊ>B{B{BaHBaHBfB\BB33BBBpBpB(BBB{B33BǮBB3BLBB>BB\B#B{B{BqBuBffBBĔ{BBB8RBܸRB#B{B >BpB.BfB{BLBBu{BǮBpB{B.BzB=B)BBB=qB.B8RBBBǮB{BqBBBB33B#BGB(B =B=BuB)BB\B\B=qBB{B=qB\BB =BB3B8RB=BBHBBuBpB8RBBBB#BHBB(BB{BffB33B{BBBBB8RBW BfBǮBB\BLBRBB8RBzBqB\)B B3BB =B =BBBGBۊ>BǮB\)BRBBLBQBGB{BpBBLB =BB33B\BqB3BW BuBpB =BzBLBB BBBBBW BB\)BҞBBqBGBB{B\BB\)B{B{BuB=B.BqB~BBQB33BBBB{BB.B.B.BB)B۸RBBCB\)BffBBɳ3B#B(B\)B¨BaHB=qBuB\)BQBBB =BB8RBHBBBBaHB)BB33BBBn=qB~ B\B{BrQB\BBuB{BB8RBpBأBŊ=BW BBBuBHB#BW BqBĨBkBBq BE\)BtBLBBB >B{BuBBLBӽqBB3BkBHBBCuBpB.BBB8RBRBkBRB#BȸRBB(B#BB=Bc BVzBiBB33BBRBBBǮBnBl =Bq =BdpBh >BmBl BjBaHBnBRBB{BϸRB{BuBzB=qBـBGBGBBHBW BB)BBuBW BHBpB`BpBkBBBBuBڣBBBBuBɔ{BϏ\BɮBQB\BBW BB33BfB33BffBkBW BpBܸRBQBHB8RBBHB^ BZ(BF=qBdBrzBwHBwBrffBr(BjBd(BaRBh =BhBaBYBRBN\BNBRBKffB >BB\)BLBB=BqBᙙBBҏ\BRB33BuB BzBBB(BffBW B#Bp=qByBaHB٣BpBLB.BB BzBǮBB)BҀBBBB33B{B\BӽqBBuBW BHB(BBBpBBBGBBGBaHBaHBB=BHB\BkBmBv >B}ffBzGBsGBpBsQBgBH(B0B4=qB= =BEBGBXBqB8RC8RCBB#BB®BfgB.B >B=qB33BW BW BBBBxBBB#BBGBDžB{BBBW BBBBB8RB\B枹BkBW B랸BBB{B33B >B֔{BffB۽qBHBBqBBkBBRBB\BLBQB`BiBr33BB|RBoBj =BgB\BFB6B;BEzBPRBWRBf=qBffBqBzBBBBffBBB)B(BHBB=qBB8RBaHB=qBBBaHBfB\BfBB.B=qBBGBB)B(B\)Bʔ{BkB䞸BQB =BBLB\)BRBBٽpBkBBBǮCC.BzB3BљBaHBB\B\)BGB=qB}\)B{\BsB_pBORBN(BO33BGBJGBLRBOzBBzBuBQCB\)B=qB\)B(BQBpB\B(B{BfB{BBHB=pBǮB33BB~BkBGB8RBBfgB{BpB=BBBBɊ=BLBBB =BQBBuBpBٙBBzBCC GCC aHCfBB BkB#BBBQBffBBBzBj33BSpBa33Bp{B_BV{BVQB]BoBtB >BffB{B\BǮB{B{BBBBB{BBBfBBB~(BB33B.B\B|B8RBuB3BBkBBBW BkBBB =BzBGBB=B(B\BuB33BӀBѸRBB\)CBC C@CqCuCٚC C\BB\)BBBBBBB#B\B{BBB =BBQB\BLBBBB#BBfB8RBBBfBRBqB\BRB)BBBuBnBLB =B>B~B(B3BBB33BǮBqB\BRB{BB™BBB=qBBBHBBBB#BBB{BLC BBBCCnCBBffBҸRB3BuBB=qBBBzB)BB(BBW BBB{BQB{BBBBBBB8RBRBBBffB(BzBRBBqBBǮBzBB\BBB8RBB8RBBɀBď\BB̔{BҙBpB(BBBuB3B(B#B3BffBB.B)C =C!HB8RB =B=qB33BBBBBǮBBBǮB#BW BBBfBpBB >BǮBzBBBBW BÞBB33BzfgBeBfB\B)BaHBB BkB.B8RBBBuB\BqBGB\)B=qBBBB˔{B=pBGBpC3BǮBBqBșB\)BBBLBB(BBBBfBW BBB\BffBBBC0BB33BaHBљBBkBfBB\BaHBzB)B=pB8RB\)B{BBB\BkB)B٨BBW BBfBLBBB\B8RB=qB=BBB33BBBBBB)BpBΏ\B =BBBѽqBW BBaHB.BB8RB.BuB\)BHBzB8RBBB\BBB8RBpBB3B =C C CxRBqBkB B =BׅBȮBBBaHB{B¨BzBBBBRB >BBGBRBBBB8RBBB(BBB{BBW BQB =BpBcBqBffBW BB=BBBBkBBBBGB#BLB(B\BB\BBB{B BBaHBBzB(B3BBgBuBHB™B\)BBCCgCC\BHBLBHB۔{B\)BBB.B BȔ{B)BfgBǮB{B#BB=qBLBB=B{B{BBB\BBpBB8RBaHBzBǮBBBW B)B=pBBBqBB33BBBqBzBBBRBW BBBBBffB3BBBQBǮB BkBǮB.BǮB=pB\BqB BBBB>BBaHB)BBƊ=BЊ>B˙B BB8RB A(AAA=AM|A;AAAA;AA DAA0AAFA8AAA&A9AA_AuA1A{A`AAWAMAAA7ApAGA7A`A\A(Ax&A0AAȴAUAAAAAsAAAAtA5AAyAOAAAAx&A A,A+A(AAA:AWbA6A2AQA#A+AAoA.AdAWA{A3AA8AAAhsAA\AAkAAVAIAm:AxA^AOAAAA#(A*AAA[A AAAAA}A{AA/AA}EAyA>AA(GAYAWAA~AGAWbAAA!A_A7LAAAjA(GAAWAC>A{AA$AA}AuAAA JAAQAhsACA A 7AsAI AA9AAA$ATAAAA,AAOAe AAA"AWATAdAAAqAB8A*AWA{A?&AUA%AUARAKAANAA;AgAAAA.ALAAA|AAAaA=A+YAAgAA$AAOAN*AAvAA/AFAAAUA.AAAA0A AAAKAqSA~AA/AA ATA7LAXA)MAA0A^AAAAAkAA*AAAAN*AArAA ATA!AAA&A>AwA)AAAfAA1AAA9AAA-AUUA1AWA$AAɺAA~AA݆A]A1~AAA#AJAaHAV\AAAAAAA~A A&AAx&A =AzA|AA7AŢA|?AAA)A8AAAAAnA"AIAHAuA,AkA AAAAAALAAAQ=A\)ARAhsAAAAhAAtAoFA~A~AAAAAAdAwAAŢAAA{A?&AAOAA@A9AAAQAAAAAAAkA>AKAvqA AJA DAAAAHAAy,AACA+AA_AAWAAAYA!A AV\AAArA AKoA(AANA1'A*AAZA+YA\AiAAAAgA[ADAAAA[A~BA{BAzoAAAVA.ArAAKA"A,ApLAAAj(AAAXhA!sAAH]AAaHAsATAmAHA PA ABAaHAiA.AAIA|AAKoAAuAA`AAFANAAdA AAvAAALAAA AAA|AgHAcAj8Ao>A~wATA+AbAA mAZAխA_AmARCAAUAAgADDAJiA!AHAAfAteAAvAAAlAFAALA =AVA݇AuAAAjAA`Ak}AoH]AfAfqSA]A^oAHWA]єA]A,AjAAAA6A"zAdZAqMAkAgAicAmAhDA^ASpA6@,A^AIATAT$ApoAkAA?AAqA AfAA'A~FAeAfAA[#AAXAAAZAAAfAߓAnAsAAEA΂AA{A?AgmAAAAEAAsAAAAAAiyA1AAAOAA[ARAXAA$.A}-AqZAhAZFAV%ALA:eA8(AbrA_PAAZA< AC'AWtAMBAax&Ax$ADAKoAAAvA|_A}խA~7LAaAAAAAAAeA]ANAA!sA݆ApArAA݆ALA&ABAA`AUA1~AAAuAA9AAA4A%A;AǮAAAI AAA!AoApA|AiA;AC5AVAJukARjAQAH(AYoA68AjA0WbAQAacAnpAv#AAA|eA}AyAx~A|pALA{AAAxA\AAVA]AiA!ASAA7ABARANA~A;ArA\AAA`AfA A.APA0A5AiyAcAA[A8AA/AAAmAjAoA7AAn@AiAjkA_A]AUJiAHVAF|A,&A#vA0KA2ALƨAdAe(A^GA}A?A{$ArAvA{rAsAFACAAA)AAABACAV\An@A*SA\A$A'AASAYAAhAoAAAk.AA:AAgAAATAQA{AeA A0AZA*A`ALuA ARCAA(AsAwAAwAA1'AoFQAP7A5ZA#AAk.AZA-AGAGAf ApApA[gAk;Al$.AnAhEAa1'AvgA}OAAuAA+YAAAA7LAbANAAs_A7LAAA[AA`A,`AkA3AAxAAA"zAAbAkAEA AǮAgAuAM|AAzAEAA AAaAA#AnA}A~A{yA}(A}$A}A}AuZAl$AhTAJ~AKAAABbA8A>A_EAeDDAOrAGA\UUAiAprAtEAo8As4AAdAލAA\)ATA5AvAmAYAjAAQANAHAJAAj(AnA:A.lApAAA-AAAAEJAԧAaAAߓASAA݆AAA2AAgmATOA PAA/AV\Ab Ak^Av!sA{aAzA|DDA|YnA~1A}AtLAtAA}Aw[AkkAb+A>AIm:ALARAQ*A1s_ARYnAf JAeAv*SAx@A{$A~\)A:A~A~4Ai"AAgmAA%A8RAA mAOA;dAjA?A[AA~WaADA AA}+AMAwAAZAA*A#A`A}oAAA5A~A'ASAAcAAEA$A*AXAhEA]AgJiAvH]Az Az@Av3AqWbAm\AvO1AA4AM$At$Ay@ApAd7AYAEA)7AAbNAPAX~AW>AFAa Av(GAyAqӡAgyAjDApPAwAA~$.A~VA)A5A;A#(A[AdACAOAyAAzAx[zA|A} A$.AAJA|*AxAy=qAyzA{|A|A~A|^A}ӠA AAA|AA:A)MA ANA|AVAjRAlAm}Al#A^AjArAnqAmBArAzA}Az`AA|As*SAfAYkA=OA<AEqANAC$.A/A6)AKAf&;AhrAeA\ AUAWWAeAl^AnAm}As^A{AAAyA~`A~vA{4AzPAxSAo~AnApAzTA{vAsApDAq4ApAuDAyVA{A}A{A}A:A`AA!AA AAiAn2AqAnA\ӠALAJ7A]uAj/AgAgAp0xAwAy(GAu Az AvAjA`AfAAgAa|AL:A?4AAXATcAaYAgAffgAg7AaA\xAV|AWAV\A>8A&A!A$MA(MA2-A7`BA(XA3;dAA1'A>mARA^^Ack.Ad`Ae|A^AhlAhAf_Aj;dAn5?AknAi5AgAj*AoAlwAlAntAj;AljAegAa4A]BA[nAV >ANcAMTAL>AJdZAGvA=vAO~KA_UA[AfjAg8A`A[ AGA6+AD-AG%A<A8,A9KA8A=A;A8A7qACAI1'AVH]A_:AcAhFAbnAYKAPAS;dAY(A]bA^AbAc,_A^A](A^AYAXmAYA^Ad;AkψAtiAo|?Ao:ArbAp6AjAj7Ag~AnAnukAuyAtJAp4AnZAhAk0A_{AZrA[8A[[A[A[<AT6A]AcA^A_QAoAmZAcAZASFAP/AOAGYnA;iA,|A,tA5ӡA5+A/A4!sA=-ACAA-ADABBAS,AcDDAhAdAX2A[.lAZA[A`Ab Ab*Ab(Aa^A[rAZ{AY-AYFQAXA]-AbKAj{Aq'AuAwAxoAu*AnzAmWAbA_c@јB=BpBFRBNBn =BBmGBAffB6GB;GB0B)zB2QB=qB\BQBv\BBB3B3BGBX33BA=qB zBB=qB4B?BefgBhB|GBBh{BABABCGBbQBpB33Bx =BIffBBB.BB^BcpB)BW BBQRB:B:=qB*=pB B# B B0BWBsBBBBBW B>B (AABffAB)\)B5BX\BuBB=qBp =BRABQBBC=qB\BBiB8 B)RB3\BB{B]BDzB.B{BkBoBF{B!B QBGBB%\)B5GB]QBwpBBfBBB`33B33A =AAffB\B GBBB? Bv(B B{BVQA\? >A-AfgB~zB BBQBhB=B >B >B=qBvB(B>B)BHBD=pB*zB(pB:GBHBP{B=GB]Bf33BlQBv{B^B9 >BpB QB A >BB QB HB BHBBTB.B{BTHB33A{BBuBBQBBuB܀B˸RB8RBB >BŔ{BB=B>BaHBW\)BT(BI\B=B9=qB1QB( B)B@HB$BQB{BB(BA(B =BpBI BYBV\)B>33BBgB{BGBt33BwBBBBBBHBBBB=B>B>BBǮBkBQB(B.BDB6{B*\)BJB?GBDzB6\B9B/B#33BBGB\)BpBApAA\ABfgB4(BAB=GBBBNB`{BcffBRQB-QBBEBpzB =BBBqBLB̅BиRBͣB\BB3B{BpB잸C33C!HB̔{BAGB%B/ffBI B[GBPB,RB.B)BBBHBB33B.RA\AGAAQA A33AAծB B3B<BJffBPffBCB9RB4B=(Bc\)B=B3BLB8RBB8RC@C:C4#CZ+CwqBBkB{BݨB#B\B8RB\)BuCRCBBQB5B5pBZ{BffB\BHGB8BB =A33B BGBBB=B B =A{AffAzA)A\ApB!zB7pBHHBb{B[\)BkffBeHBQQBIBB8RB)B.BхBC CW C1fCRQConChBC9BBpB8RBuBpBfBBW BW BBRB(BPzBO{BGB{BGBIHBzB A=qAAffAffAB1 B.GAB \)B AAT(AUpAAGB33BQBAQB]QBxRBYzB>BxBQBBB#BBBBߔ{BCC/3C=C?qC>)C,BBzB{BB33BӞBݙBLBuBBBBrBT=qBUB.BkBqBBffB+GBeB=BǮByBBLB#BB =BBGB33B=qBaHCkC'ٙC'!GCnC-C ٚC RCHBBW BCCLB=qBB{BBbB6=qB9GBVBt(BO33B>\B= =BAHAzAA\)B(B#B#GB(B(B! B(33B HAABB GB RB!BJ33BhBfffBBBǮBBB3Bó3B8RB\)B =BBzBCRCW CuC C!BB(C\CCW C.CLCBBGB B(BtB\)B2B7(BL BIBW=qBGzBA{AA(A{BB AA33ApA AA\)AzBHB{ApAABBB#B\)B[B{BBB =BuB >BRBW BBfBHBBBה{CqBBB݅BBqBQC {CCO\CC 0CB=BQBW B\)B{BBrBSBF BTHBRGBDpB!pAAQA A(B \)BA ApAffA{AAîA=qABffA{BBAA=pA{BB(33B" >B?GByBBqB3BzBB\BBGBBBpBˊ>B”{BepBf(B33B=BCCC! C(C#C{C  C!HC{B#BgB\)BўB=qByHBV{BVRBRQB=B33BQAQAzAzAApAAQA AQAffA AzBBAB=qBHB RA >A=qA33B B =B4{BEByBBBkBuBBB\)BgBuBBfGB\33BRBTpBiB\B\BBRBHC޸C":C0C1C:CqCǮCC{C CCfgC C BBBsBU\BP\)B*ffB{BffB BA{B"zBBB RA=qA=qA(AABBN=qBNB1(B6=qBCQBpAffA(AB zB\B5\)BnBBBB3B#BBB=BBfBaBE\B=B>Bc=qBB.BuB\)BǮBRCnCW C^C#QCC$}qCC=qCC%C&{CC CC-CBW Bw(BGB?B>(BB+pB/pB6B8=qB+B'B3ffB:B!AHAAA33B,33BE(BEB5B; B9 >B=qB {BB B33BMBaQBt =BWBLBTQBT=pBh B BBRBBs\B_(BLB+QB\BdB BzBaHBCCfC@CCC5C=qC"kC8\CbC7CKC+ =C*5CAC .B\B"ffB>B\)BOBfBpBgHB:=qB)33B"=qBB-B$AQBzB BBBQB&BB.B' =B$HB*=qB.\)B5BN(BaGBnzBgBeffB9{BBB-{B`ByBzBBzBq BUBSRBK(BfBuBBkBC0CC\CQCqCC$EC>8RCWYCEC@C"CC C)C5BB3B\B\BkpBGB\B\)B@(B&ffBB'pB$B"(BBB B >AGA =AA=qB B B =pB*33B+BLB]{BXBU=qB]B6\)AzAA{BGBCGBvffBpBRBpBaHBB\)BpffBnRBoB.BpHBBCO\CB.BCHCkC:C/޸C3{C+C(+C HCYC\)C!CBCCBBBBB.BBaQBpB QBB-B;B!BB \B(AGAQAA33AHA(BpB-QB@BTGBWBZ{B;pB {AAGAAÅB B(BSBBzBBBBBW BBBBaHBsBBBBuBkCW CCCCQC ChCC-EC)=C'+C.{C;\C&gC#CBBB B.BBǔ{B3BB?BRAA{B'B9BCB>B =B(A\)A(ARA\AA(ABB?(Bz\BB[\B AAAAۙAfgB (B =B?BkpBpBBB.B3BqBuB.B.BB\BBBBBBHB{C C.CC(CCqC C@CffC =CC CIkC@C C^CO\BBǮBpBBB\BIpB'RBA{AffB! =B.=pBEzBLBBGB+A ABRAEAABA=pAvHB4B{BBQB* >AȣAA AzA =AمB HB<Bn{BpBnBlBs33BǮBBBBLBRB BaHBfBLBHB8RB\)BB#C5C 8RC:BkB=C{CCCzCBBBីBBCC!HC zBB{BB(BHB=qB#BfB'GBB BE=qB;pB;BNBT{B8=qB5(B\A^ffA~HAB =BfgB BNBKffB=qBfBmzB GAHAzAȣB/33AA(ABKBhB_(BQGBPBPzBa(B{RBpBB{BaHBBBB8RBǮBBǮBkC CB#BBHCC ECkCBzB=qB8RBԀBҮB.BB(BӽqB BBBaHBlBzpBkBBRBffBvBkQBOBR\)Bb\BDfgAQAAB {B,B+GB,=qBH33By{BjffBL >A(AΣAAAzA\BBHB?(BQ(B;zBGBIBBBTzBBW B =BRBuB3BpBBǮB\B >BC{CC }qCBQBC:CB=BW BBǸRBƔ{Bɏ\B=B33B{BGBLB33BW BpBBBBBLB>BBBBffB~BBGBhzB, BGBAB =B?zB[ =BuGBC33B{AARAIAk33A33B BEBF{BTB>33B+pBffBBDBBHBRBW BBjBcBsBkB{B(B#CCs3B =B BBBBGB#BBBB BBBBBŽqBW BGBB\)B3B(BB8RBB#BBBBBBBB >BVpB+QB$BI{BW33BRB8ffB A\)A2{A@(AepA =B"BDQBQB\ BVBHAȏ\A{BBYBB| =BfB]=qBapBpGBuRB}QB=qBʸRB >B BBqCBpB=BkBЮBǮB3B(BB BRB3B{B33B(BRBW BzBBpBBfB=B~B}B =BB=qBBqB8RBɣB=qB.B\BBlBbfgBe\)BOBFzB AQA[33As AzBB+B6(BK =BjGBk\B A=qAȏ\AABBB{B B/By BuHBsBfffBaHBkBgBBW BHBGBGBBڮB{BǞB33BBBLBLB=qBW BB=BBB}BBBGB B{B33BB]BBBB=qB3BBB.BBQCC B.BaHBYGBZBHzB+ B"AQA\A A\)ABB"\B"QB-HB:B/B{A(A\)A=qAA=qA33AB RB.\)Bi =BW B{ffByBBʽqBGBGBB\BBBҊ=BʽqB8RBBB\B.B =BBBpBfBB{BBBuBBHBB(B\)B\BB.BB#BBBBGBBpB\B=B:B;B+AApA(AffAB BBBBB GB{B'BAffBA=qA A(AzAB B/=qBoBBBB8RBGBB{BkB{B#B BBBŔ{B)BBB33BHB\BzBB#BfgB{B\BpB3BpBǮBaHB\)BLBLB#B#BģBĞB\)BBC LB8RBBnB<{B6QB.BfgBBBBBpB=qBBB$\)BB{B0RB(B?HB(BB\)A AfgAffB33A߮B#Bt33BBB\BB33BBBB\BB8RBBBW B BBBuB3B BaHBB8RBB=qB\B33BBBB BpB{B\)BBB{B™BBW CB#B>B0HB7B9B0zBBB =B B >B RBB$B: BMQB:BBlB_(A}ACA^A%AA,A AA$VAOA]AqMAeAA7*A"A ArAsAzAAkA8A =AVAAJSAz8AjA"ARA,CAXAAAgA,A[Ax=A:#AA AAJRAlYAAAAMLARAnAAAA#AiAyA A(A AuAAAmA A'AAAgAyA|AAQAAvAuDA AdAA7A۪AJAAE A_AmAA3AKA}AsA~/AAeAgA AAwA|AAgAAƆAPAAlAIAAAA AaA׳A;AAoA =A AA AAaAAZAAeArKABeAVA-AAAAhA%TA|4AoAAF\A AAAAHWAHWAAyAAAOA>AAzA4AAkAAiAA@AiAmAAAAtAQA:AAAA"AA{AQBA AAAwA$AAA AYAUA,AoAqA<AAAQA*AvA4AEA AAAWA#AXAA _A-AAAKA<A7AyAh ANIAAxAmA'OAhAGAGA\A;!AAA4AAAJA>A,CA|A_A A&AAi AAAAAdAAOAA#XADAAAAA?AxAAA5AAA$AkA$A-AAAAA[AdkA(A,AeAYA @AA^A AA+ArAYA'OACArKA+AAyAA)AոANA-AAA2A#XAA2ARA{6AlA=AeAR@AAIA A?A-AAA(AAD AuA`AAHAALAAAQAA*A2A:#A{6AgA*AAJA*A}AHAAAQA)AA^AsA AAQAvAEAAAAA^yA$AACAAbA A9zAABAaAAYAAA}AkAZAAAAݦABA5AAAAvAMA AxA`A^$AӽAaAAOAAX2ApAsHAnAZAAAAgA]'AAarAA4AlAAaA4AJAvALAAYAA#XA[A AAtAJAAA AhAAfAarA\)AAjA|A?AAAGAIUAgAAarAAUAA|AAZA}ABAHAAHAAGAgADŽA]A\A!AmA} A|A}AxlAuAJSACA;uA,AATA^AzAAAAAAAAjAsA^AAAݦA9A,AXAAA=qA-AA A4AGAA:#AA)AOAAPAKAAgAAA}AA^$ALA@A!A!AgAAAA A"ZAӽAsAnA+FA?AAAAHWAAKPAWALAȁAAԺAAAAA>AAuOAt_Aj*A{)JAWvA5AMAlAeAAAnAAIAAAA:xAAY0AxAAAAA<AA AAbAAAwAxAA6AX2AAAj]A\A18AA=AAYA{A@ArKAFAAAX2AAA'Az8AmAfA ;AmVA*HA=qAPAmAAA[+A:A{AmAlaAP AH-ATcASKAlxAbAA}/A^$AAi_AAuDAAhAnAQAAAAIUALAAA'OAHWA(MAAASAAA6,AArKAAAAwA'AsAÍAYAAAZA!AAAA9AiAWAA)A-AHA-AZAAp ASAeArAw+AxIAlAAA41AAlA;AmAA6AAKAAA(A%AAnAF\A2ASAAKAAOAsAA۪AApOAAA(A4AAAbAPAMAxAIUAA 9AFAA)ANAAuAAAA 9ANAA[A8AAeAAxAi`A^AeA>AAk6AeAl*Au4AjAW#XAayAy=AMAҿA,AA7*AjAAAA0AAAAOGAAkAAhbAA$AA^$AA8(AA%TAvAA AAAAAXAAAUAA\AWAdA<AASA_AAȂAA8ABAAJAA]{AA AA~A-A7ABACA:AyAvcAmOAk$Ae 9AhAdAt-AzxAWAA,AHA~A!AA =AAA+ArAA-A'OAmABA A1AnA{AAA1AċA&AA+FAxAA AAAA\~AA2AA^AqA AAEA&QAAAARA(AA26AA.A9zAArArKAlA^AAٯAxAAA_AfA}AeTAPRASqASAjDŽA}@jAAAAS>AA,CAAWA2Ai_A AxAAAQADAkAA"AuAAAeAAgAyAAAA:A AABeAPA$AAANA[AAEA1AA AA[AA|ArAAJAA$AYARAA}1A"AAcAA^$AA9AA{D`Am,AjA8E^A>ffAPmAO$AYAAi Ao9%AmAAi_A$AUA"AAA =A ;AqA2AhA AA;!AtAAgAAAvA_AtA\AAA A-AA>nAAAhAA3AAAA%AA%A(ACA$AoAA[AAE^A}A#AҿAjA A!]ABA>AHAU9A9AApAAyAtHAhAQAMSAUbAZVAZTAZpOAf\~AoGA}E AAqMA*A\)AtAQAkAj]AVAA&A\ACA+FAEAA!ApA:#AAqMA.?A0AAAӽAi_A(AAIA5/AAA$VAAA?AA^$A7~AVA9A2AiAAE A\AABeA}AKAAA-AAAuAAOAA#A!A}AjtACR@AH)AJAPdkA\AabASRA`#AnAnIUAA3A#AA/C*CٙBBC {CCBCC @CGCCBHC)CCBfBBBBzB=BǮB{B33B BƀBBۙBB=C@C\C CpC BBǮB#BGBBLC HCC25C?C?}qC2zC(CnCRCCGC0C C=qBqBCC(C \BB BB)B{BffB̀BBBBuBB BzBB\BB C{CRB)BBRB)B㞸BkC< CnC\B\)BaHB\B\BaHBBaHB33BLC {C'{C)&fC*CC CٚC\C.C$J=C1{CC^B㙚BCaHCBffBBrQB!B >BaGB\)BĮBBBxfgBvBr{B^B^B\BCC;BC/cB߸RBǮB.B̮BBQBC 0C^C W Bܳ3Bس3B.B枸BffBB{B#BBCCC$CCٚC)C hCs3C(C6 CB=qBCCO\CBCBBfB B\)C }qCBCB(BQBHBlffBC B'zB>33B[BBCs3C CBB{BffBW BǮB(BC+CzC5BaHBBBBCٚC C+B{BRC.C" =C7=qCHǮC,CC C#C5C BBBBpB{B{BB{B{B =C"CoC%)CxRBGB3BBBhRB=BSzBt\BB{BLBBB3B(B >BCCC@=C )C^CC .C O\BBBkC.CO\C-C3=qC=C/8RC(C^C6&fC88RC$LC*C}qC+BBuBkB8RBBHB(B.BǮBGBzBBC"CCBW B3B3B| Bn{B[BvBW BffB =B\BBvB8RBBLBBCEC RCCuCxRC}qC C\C@CCCCqC!C+C\CQCJnCXqC^C1=C O\BC!HC"C {BBW BBBBzB BBBzB =BqBQBB5BTB=qBBB\B=BB.BBHB\B)BQBW BBBpBBkB BBBBCRBkB.BB{CC ^C#qCW C!C3C'C3(C;fCRCBC<޸CB>C3CGBB#BaHBB =B(B BB#B\)B(B)BBzBC.B{BW Bs(B{\B}ffBzpBB\)BBRBffBBBBǮBBLB\)B8RBB{B{B{BB3B >B B33B(BB =B\)B =CCٚC,HC,#C C xRC".CC+C3CIC/O\C C"C">CCqC xRCfB{BBB#BB\BBBBBQBBBuBB\BBB8RBW BpBBB\)B(BBuBW BBBB=qCHBBfBҏ\BpB.B8RBBBǮB >B\)B =BBaHBBpBЊ>BgBGCCC'LC.C?\C3EC7 C0C!YC/}qC,W C4ǮC )C()C0\)CFC{C4J>C3CCB(BBBՅBBBkBBpB8RB&ffBB.B =B =BBCC3CB\BkB33ḄBffBkBB(BQBրBB)B#B8RBkBffB\BkBfBRBRB(BLBGB=BffBžBCJ=C0CC$xRCO@CD8RCCfCYCZ\CcCgCdC]CcgC?ٙCMCC=LC$C! CBBÞBaHBBBBW BBB.BBBBaHBLBɸRBCC"C cBfB=qB.B=B)BBBB)B\BBBffB=qB\BLBǮBkB#BǮBpBffBUBpBBCC CC3C7HC<:CM\CdECCCCb^C/ffCKkCoaHCeCA.C>fCGfC. =CEBHBzB BkBpBţBBʞBBHBӞB=qBBffBȳ3B߅BuCCpB݊=B3B\)B~33BjBT BFB+33BI33Bq =BWBgB)B(BǽqB\BBBBaHBuBkB B#BqBBCQCffCCC/zC1C9CjCФCw:CbCRLC/C0C )C=pCnCPCC BBgBuBBB\BpCCB#BgB\BB#B\BǮBBkCB8RB֏\B BBd(BD BI33BOBQpBGzB,33B RB!(BNGBBBgBgB\)BGBfgBBBzBBBɨBzCC ޸C:C}qCCC% CFC40C>GCaO\CZECUCIcCECE)CB޸CF=CEBBpC&C! B\B=BBBaHBB33BBpBB)BQB=B8RB{CB)BBBj(BVQBF(BF33BZBbBQB1HBpB$33B*BBpB\BBҨB)BBBǮBB֙B#BսqB)BBB3BB\C CCGC!0C# C!ffC zC qC5CRCCCCtW CuC=!HCٚBkBBfBC(C@BLBB)BBzBҔ{Bӳ3BBfBBBBB#B3BBHBBQBj33BPpBJBO=qBa=qBaGBLB9{B*QB-\B,pB-(BT Bw=qBsffBB33B{B{BBʀB݀BǮB B8RBBqBkB\)BўBC,}pC*ǮC2cC9&fC8C9!HC-C =C$CxRCLCC33CȪ>CCHC?{C8GC^BB=qC RC=BBBuB\BBpBzBkB\)B(BBB3BW BpBBBgBBGBxRB?GB3\BJBU{B[ffB(\B*\B=zB,{B) B3B(pB,pB3RB/ B[BzBB3B BBHBqBBBBBţB33B垸BCV^CU{CK33C;GC< CBC5ٚCRC\)C8RCCC4CM CW8RC^\CAC&{B\BBRBBBˀBţB.BBuBB\BBpBaHBxRBwpBlBu\BBuB\B\Bg{BgBIB+GBBpB33BpB0HBB33BBBK >BJQB4\)B"zB'(B=BlBB3B BBRBpBLB#BǮBBBBCWT{Cds3CYC;>C5C.:C'uCaHCBCCǮC C8RC{CO\C CC"C{C =BޣB33B)BBW B{BB33BBBBBBBB~QB=BBBBBBnB BHB4 B\)BB=BPpB B=qB?33BxBkRBAffB \)BB= >Bs{BHB(BǮBBqBfB=BGBB.B{B(C]BC]!HCVpCLECEC0C,C0C1+C#s3CC\BBCC HC+ C9:C/CCaHCHB\)BB)BBB =BB)B)BLBǮB =BB\BGBLB)BGBB\B{GB%AB%GBB\BڨB\B#BBBBRBkBlB}B\B(B\BBBB\BB{BB33CnzCj>CaqCH{CPzCSYCACQ)CP!HCAGC3HC+CBqB\)C C(C)=CC{C=C )CCHB鞸BkC4uCBъ=BBBǮB)BB{BaHBBB8RBRBBBuBM(B'pB;B}RBBB)BՔ{B8RBBaGBpBBaHB(BzBĸRBBaHBHBBBB\)BffBLB.BCt}qCiqC_CX+C3YC95C9CG{CCgC;&fC;}qC63CǮB3B=BpBHBC {CfC.CC,3CaHB\C =C5BԨBB\BӞBBW BB(BzBHBLB(B33BBGBffBqffBQBFffBiffB =B<33BuBBfBi BffB >BRBBBQBB(BBBBBW B{BaHBBkBLBB=qCCoCTqCA(C6(C/CHCCC3CFCQ{C2C B33BB#B3B\)BfgBRCzC!@C=C{BGBfB>Bh B >BB.B\BRBBBBBfBBp\BfHBfB{{BwBozBrBd{B33BcRBkGBJB@\BYHBWGBa33BBBB3BB3B=BB =BQBB8RBB3BaHBBzCi#CkCOC?@C=CT{BǮBCCC%HC0#C}qBBǮBͽpBؽqBzBܳ3BBBBCC BBBBe33B=BkBHBxB|B(BpBfBcB]BR{B= BCQBR=qB^GBY(BXzBXpBUBJpBMGB0B$B7\B)(B3RB`B}(BBBzGBfgBBBdz3B33BBQBBlpBBGBCEC@@CEkCE5CNCB8RBQB CQCC)C >B(BƮBBB33B=qBǮBzBBBB\BBڅBzB=B8zBJBQRB/QB$33BS(B{BB#B]pBHBffB(\B/ B>\B<B@BGffB0pB B\B1(B4B;{BX33B?B<B^ =BPffBRGBBRBRB-zB.BBQB=pBLBB8RBqBuBBRCCC"C2C-aHBBB BC {CC=qC!HB{BB̊=B =BGBBaHB8RBBBBBŅBB\BB)B"BAB=BUBnBBB(B QBzB >BpBB%BBGBAQAB(B9{BqB=qB BzB=qBb33BHBCB7pB5HBgfgB\BBzBB(BRBBBuB.C!\CO\CCCBGBBBHB >BBBBBBBBrBNHBcpBpzBGBW BLBBBB}\)B =qBB ABGB33BABN33B9\B 33A5ApBHBBHB{BB ffBA\AQAAA B/B^RBx33BBB =B{Bu=qBe\B[HB\ffBZHB=qB{BBBBC$\C33C{C )BpBҏ\B33BBBʅB{B33BB=qBBHB B4B@BXBkpBz\B\GBMBpB9B,\)AQAzA(AAzB=qBRGBBB5AB =qBZBR{BBpAAQAAAHAA AAZ=qAB(RBPB{HBqBBfB#BBB\BRBBaHBBRBBŏ\Ay,AAAAWATAAAlAȴA'AAƨAoAAȷAǻ AQAøAխA(AAAǎVAOAEJAe ATA\AdA ApMAëAÓAЎA«AA&AęAVAKAAƿAAVALA!AAPAA_AAI AA4A=A4AAĦAKA?}AAEAïAuAľALuAƔAeAHA&AEAƬA)AAAA; A^A9XAAA=ADAwAoFAhsAA>AWAbAAխAW A$A=AAArA|?AA|ATAA_AlAAZtA&;AAAiAgAAiAAuAXA~KAÖAA[A!AmAyAAO0AAA~AIA`AM|AAA A A/AAAAAAAB8AA$AhsAA A!A?AsAwAãA9ARAhA7A AA.A#AAAAA¿AQ=AWAA%AšA]AfAA?AӠA}AAA=AAA.lAhAe`AAAЎAA7A.AAAvAAnAgAlAA%5AJiA&A A!AtAAdAAGWAAA^ADAƨAQA/AA$AA+AMA_;AAYA”$AAľAA+A`BAA5A"zA\AeA A0!A8RAhAAJAoA=AAdZA~A!AhA^AqA+ASAA AA33AؿAšAA!AkAAjAA/AmA(GAψA AFASA*AAAAAAAwAVA)Ai"AA=AA%A€WA„AAAAAYA6A ArAlAAAAşA A A!AASAҚAMA.AAHAW AAn@AbNAA?}AψAAJAvAֳA,`ADAA0A)AA3A#ArYA:A)MAUA|AAhAߓATA#ATAuAlAAA AA8RAAZtAAAfA 7Aw AÁAYA~AkA`AZAAQ=AխAglA_AuAKAffA¶A`AAA`AAbAAgAA@AAmA`BAAA1A׹A1'AiA$/AA$AA:AֳA]A׹A~A AbAx~AAAsAAJiA'AAfA1~AFAAAgA0!AC>AcTAA5AAAcTA`AA@A$Ax&AAAIA A)AdAdAl4A™A€A1AєA5@AxA6FAYAAAtAÃjAnAAtA_AQA[AAAAEAAAZAAYnAAψAMAcADADAArAAAA> AAx&AuApAAA""AAψAǮAAA*A,AeALAAAteAfALASAi!AEAAgA%ANA]AZtAH]AA_;AV[AAA|A}APAw AA.AeAeAkAbA mAAzAdA5A ARAխAAOAAA AN*A)MAQ=A)AєAJiA)ApLAֳA}EA'ADDAAl4AA3AoA&A!A JA6A`A#AAApAAVA9ANALA<AA>AAsAQANAAAsAAAHAAAxA8RAAAAEAAAuAAO1AASApAAAH]A0A\)AAtASAAiAB8AA~A mA AAA|AAA;AA AABAM{A1AAbAҚA_A%AAx&AxA}ALAM$AAAwAm:AA""Aj(A>A+YAiAiyAKoAA0ANAAbAhAAWAvqAAA5ArAA1'A}AAؿAA}A1A>A+AFQA2AA0ALAAA*SA DAAdA^5AqSA`A'AoAuAwAєA.AAA\A3A\A,`AAA(AAATA!AA$ARA{AFA#AAASAAUA$.AAA)AAAA}33AA^5AA{A AIA4ACAȴA9XA'A^AA+A=AAA~A݆AAA3AANAխAsA!A'ARCAxAJAdAAhsAAYAA\AA!A\AAAGAAA&A:AVAލAAHAALAAAA3AAAA?AAψAAJiA AuAAA`A|AOA~A7LAjAA]AAYAŢA[AB8AAWAjASAJAAaHA!AQAA@AA(AA A`AJA^A'AjA2-A1AqAdA+AAAA%A1~ADDAA1~AAAAw AA DAsAAAAAtAA@ApAQADDA.lAAfASA{AAAj(AAMAUAbAuAAAZAєAAAzA#A@AAdAyA/AteAAuAAAJAFAA{AYnAyA&AA AAA@AJAFAuAAAA>AHA7AҚAAAAPAҚAaHAlABA<AAAA A,A AHA>A DA AWAKA)AAAAbNAA<A]A@AAwAMAA&A A@ATAAA#(A/rAAAA{9AA)AAuAAA'AAJA^AAAtA`AA|AAAArYAA}AAy,A1'AKoAfA|AXAA DAAuA^A;AAQAgAuA_AAHAAA\)AIA AkA?AwAA|AfA\)APA1AAAaAAKAAXAAAArYAAAAA>AjA(A)AA,A[A*AAֳAV\A!AACAzA~KASAA1AAM|A AA]/Al4A>AAA AAAvAAA AWAAA`AAAA}AdAbA^5AADAAA2A mA A AAAA0xA(GAAA5AKAAyAA:A5AJAlAcTA7AhA%AqAǮAm:AA)MAbNA}A#AoA;AA=A5A]A=AW AeAψAAA!sAAA_AHAQA4ANAAACA{A5AAAjAnA$/AvqA?AAAAAM|AAXhAl4AgAeAAA7ANAUA&A#(AA<AAAAUUANAAAzAA'AjAAA:AAA&AZtA@AAyA$AAAAAAVAjA#A3A*A[AAASAA?AA,`AIA,Ax&AA; A"AA$AAA A[AApA A AbA\)Ay,A0AOAAAA;dAAAkAAOA]A AAA0A;A)AA A1AvAJA6AXAM|AJAA.AZA[zAAiAؿAAAAAAWAAAA}EAnAA1ANAxA$A!ArAA0ARAAAŢAAFAA*SAAJA=AgAAPAYAwAAbA!AAAoA{A ASAOA%AA{ASA8RAXA$A$A(AA?As_AA.A|A=AAA2AWA AiyAAAAlAAA.A0AB)BǮC@CYC3C CBaHBpC)C}pCC)C+ C BfBB3BB8RBaHB\C1zCrqChBBǮBBBB}QB4(B7QBBBEBXpB33BaHBBGB33BB BqB\\BO=pBBpBffC CCJ=BBʨB{C!HC/CRٚCB BGBBBuBBB#B)BkBBBRB(BBBB33C C pC-^C2 C2(B BBBBBB\)BzB =BBB.BBX{BpARB \AABBϮBfBrQBB=qBB)BHB=BBBBjBW B{BHBqBy(Bb(B#BBBąB.C C=qC%nC*GC"#BffBpB8RBBB#BLB.B\BB)BBBǮB#BE\)B!B B$Bw=qBC#HBffBqBHBѸRBBBB8RBkBBBw >B{B=qBaHBǮB3BB{BBBLBB{BQBCC5CT{CRBRBBfB\BW BB{BãBpBBBB3BB^QBNBzB=qBpB͞BBBB=qBʮBBaHBힸB)BfB\BLB{ BpBBGB#B B#BB{B=qBrBf B~B>B{BB3BLBBGBBBCC3C"BBW BBBW BqBaHBÙBLB.B.BBBGBBBBgBB >B=BGBBBffBRBpBBBB.BpBBLBBwB`RBnGB}BBB(BaHBBRBLBqB=qB׀BBșBBB8RBBCCCzC5BfBqB{BB=qB=qBBLBW BRBLBB{BW B =BzB݊=B螸BfgBB=BɅBŮB(BoBuGBHBBB3B`B=BB\BFzBMBi(B{pBB#BkBB|33BHBkBBǮB̨B.BLBՊ=BqB\)BCCBCB(BCBBЊ>C&gCBuBBBW BzBB.BBvBǮBLB陚BffB(BƔ{BQB8RBBV{B\{BUAQBMRBXzBcB:BBEBBB=B{BBRBBBaHBӨBݨBaHBĊ=BBBBB>BQBBBuC pBGBBGCJ>C uC!RC5BBkBBǮB=qBB3BzBfBO BazB{BB=BB)BRBB{B8RBBe BBBS=qBG\BDBE >BnBBB3B)BB.BܞBƳ3BBLBBLB#BB\)BfB\)BBB\BHBBgBBӔ{BB.CzCEC(HC"3C CBkBBB BffB=qBW B8RBRBY >BsBoBffBB\BzBĞBրBB BBBLBBgB]B]Bz =B(B}33Bp BBBBB{BLBBBC C)BfgB.BaHB =BBBBW BffB B =B#BBBLC0C CC C! C kB{BBBBGBHBB_ =BV Bg =BiBa =BiBnGBb BoB.BB٣B͞BkB=BBBBc(BmBZRBQ\BBC8RBBLBGCǮCpChC%CC C(B =BBBQBB)BQB{GBeB]GB5\)BGBWffBjBb{B@(BBBRBǮBfB#BBBBzBEBS=pB0B!B*{B@Bx33BBBjB_B} B.B=qBffBB=qBBQBQBBaHB\BBfB=qCHCCGB(B=qBƙBBBkBBCYCCfC3LCT{CBBLBBB3B\BB\)BB(B.BlRB9pB33BGBBS=qBPBV33BB#BBvB\B\BQB33B[ =B2ARBGBKGBpB\)BB}GBaBs=qB\BRBBBpBBaHBBBB\)BBBpCRC hCC zC)B3Bس3BB=qB BLBBRCC fCaHC )C \BGB>BB BĀB=BnpBBԞBBգBgBBffBGBuBB\)BpBBBgBEBqBQBffBBzBX33BB*\)BxBW B33BB=qBffBBGBgBfBǮB͔{BB#B؏\B8RBBCxRC C{CxRC0CT{B\BBBkB BfB{BB\)CB\BgBLBB.C BBGBQBLC3CBBqB)BÔ{BzBCRB.B`BzBuBBBBBBqB8RBLBz{B#BBkBaHBqB|BBBB BBӔ{BBGB{B=qBBBCO\CC)C'QCD(C)#C =pBRBW BԞBBCBCRCW C+BLBffB=qBBBԽqBHBB=qB(B33B3BBǮBpBB3B뙚BuB;\)BJ Be(B-B`B(BkB=B33BBLBfB=qBqB#BBB{BBzCBGBBBB BB\BףCcC C=qC=pC CC ٚCC YBBνqBBQBCO C-5C}qC(s3CRBGB)BB#B >CCCLCzCYBBfCC B=BCC BB=qBg=qBfQBn >B=BzBuBB3B=qBkBkBBƙBBBBpBqB\BLBBBǮBBǮB\BHBuBC C =ChCC\)BkBBB(B{BpBHBW BBBB >BHBCV CCC0:C CCuCCC {C)C4CmCW}pC&fC> CٚB#BBkB#C6hCkBffBB33BHBB33B BzBB|HBLB=BffBBkBBBBRBW B(BBٮBpBfBByGBB)B)BBC W CpB\)BqBޔ{BӔ{BBBBυBkCGBuBBBBBQBqBqBqCR8RC6{C.C'EC*!HCCCP0Cn#C#CfCGC:RCRCxRC C3qC B\B=BC<C:BW BܽqBƅBBffB{B\)B\BpBTHBqBaHBGBB =B{BBBBTBBB\BfBǮBrB3B8RBBB=qBB=pBǮBB̀BgBHB8RBGBzBՔ{BBB\BBBĔ{BB\BzBB#CA{C:C7CQCCBƅB\BBBڽqBfgBBBCFCxC9#CRC"qCPECl#CyCqC{&fC?\CRC6CvCCTBC/C' C!ffC&C<}qC:)C'CB)BBzCqBaHBkBW BBBvHBBB\)BǮBC#CB\Bߏ\BfBfBGBRBHB(BBQB\BBB =BBžBBݸRBW BB(BLBuBBBB8RCC@C(C^C0=qCEEC.C3CAuCRBCVCZCq!HC\CQC>33C3BC={CVRC:EC33C C3.CJ5Ca\CSC.!HC!:C)CHBqC C:Cs3CB{BB BB\)BaHBCBqBΏ\BBfB B#BBBBBzHBzB3BBw\)BhBaHBBB(BBBʏ\BףBLBzBBRCHC2{C>T{C'#C&CxRCC&C*{C7CQBC* C)CT{C)C )CqCC&fC O\CkCC>CWCHC#{C(CzCٚC fC0CRCC&fBǮCC8RB޳3BBBBBqBkBǮBBW Bǔ{BBBB{BBB(B~BzBBLBBBQBBBڙBBC\CJ=C3C CGC${C0>C-33C.#C2\C aHC}pCnCCC pCO\CCC8RC CC{C CGBB33BC C"W C$s3C {BBC =CqCpCCCCCC QCLB B\)B\)BB=qB{B>B.B=qB(B#BfBBB(B(BqB\)B.BB(B\B33B݀BBBfBffBCC C#C&=C9BC63C4O\C3\C2EC*gC {C(CO\B#BzBBkB(BzBHCC )CqBBBBQBBCC CGB{BHCJ=CC\CQCQCaHCCCBԏ\BB{BB33BCpC޸CC +C J=CaHCBGBBGB{B\B˞BB(C uCCCqC CxRBBBaGBǮC)C@CBCC. C4C4s3C6}qC5B8RCW B8RB(BBBB\BHBHBB)B{BB BȀB=pBBQB.BCqB.BBGCC C,C-3C,zCfgCffC QB噚BfBɅBC C QCC+ٚC)!HC ^CBBBBB̨BBB{C T{C]ECL.CB)C,C\C{C3BRBBuC C\)CC"fC1C/RC3=C1!HC1 BBB(B(BGBaGBGBθRBȊ=B#BHBGBǮBxByBW BBBԣBuB(B(B =C.B BأB{CCCRCbECUqC4CC kC{CqCC )CC3C+cC3C0C"!HC qB.BBBaHBBB۽qBC =C>޸CMBC?C6J>C0{CJ>B\BpBgB{C3CHC zC CHC73C0QC*=C.0B4ffB=qBP33BGBЊ=BBŀBHBfgB=BHB8BiB =B{B)B{BBBBڙBqBBRB=C.C)C5CCC(aHCC^CCW B =B.BHBمC33C/HC(CCBLBҏ\BBpBBLBB.B3BC C HC{C (C>=C,EC=CpB)BBC #CCC/kC=C8{C$aHCC!:B(AQBBT\)BaHB33B#BBBBLB.BLB3BB)BBBzB܊>Bۏ\BBBGBۅBpCaHCaHCRB\B(BGBݞB#CfB =BaHAg\)BW B\)BpBLBǮBBÞBpBգBgBRB =B{B\CYCaHCBBÊ=BHCnC C C޸C \)C#kC#pC!\C&C&{AB\B,B533BG33Bb{BBSB.B B\BLBkBbBBBLBuBèBBߊ=B{BpBzB{C{BgBCCHBBBBaHBBճ3BB{B\)B׸RBBW BW BBBzB{B{B33B BCBLBffBBBB{BqB8RC hC!HC3C YC'W C%kCC=CCAAnAtAAϣ.AqAA7AAܨAk[AA\)AGZAiAS>AEA+FAAA.AvAAoRARA٥A]{AhA|AoAȂA٠5AZA8AۏAuAUA]AAظA|Aڳ AܸAJSA.?AAAbAU9AAwAߪAJSAvA߻AХAAA(AAiAUA?A)A;uAдAҶAՀAע0Aؤ,AmAlAA՘A4A~A+A AחAWA4AvA'OA՘A+A֦{AeAfA?AA.A*A+AxA AAzA݇oAݗAlA(MA͈lA\)AlAARAϊhAvAcAcAAAޣA֥~AtAAgAtFAAnAS>A9%AҜ>A A,AAڞ:AA٤A3A#A׃#AqAަAEAAS>AܣA _A~A4A=A8(AܡA*AӽA˒A+A-A#AѝAACA%AcmAݦAў9A=AAA+AQAAAA`AA$A 9A[AAAAAܩ AٺMA-AAċAz8AOAߊA8|AzAA:AݑAܻAܕNAnAaAcmAAAF\AAAϹPA׳AA`ADApAњCAaA AӍaAծAlAaA֌A#A`AՃ#AԣAӹAj]A{AՏASAّAjAӽA;uANA%A݅Ah AkAAҿA{A0AAAF\AAtAܻKAAARAݓSA!AܛAAxA>AOAmVAѩAAћA&AфAAċACA׉A(A)JAԍAӭAHAԯA1AӬAӅA֭kA؉jA A?A7A[AAڴAaAeAAnArKAنqAuAPAܧyAܺA3AVAAAAAA18AIAS>AdAlAAAiAMACcAҎ^AYAA|AR@AAAAA&AԆqAոAZAAA7AډjAuDAדSANAܾA^A|3Aި"AAdkA׈AA5/ApA$AոA.?AAsAVAܢAپAفAsA؀*AA}A)A٠AٖASAAϷA>A AͿAϿAA 7AwA AzAԔPAtAҧ%AmǍAAiAA/A41AAAׁ(AvAJAAהQA =AAA@A&A[A`tA|AոAxAV7A܉A4A AAQAځ}Aؤ,AAOGAAA(AAƆAAڽFAGYA;A۪AA̮A:wAʇAA+AOAQBA҄!ATACAkAfA|AAAWA|AUAiA"A AAA֋AՆA1AڪrAXAڀA@AA>AA֯gAنqAAۭAA`AA25AArAүgAA1AӾDAA]AխA$A&ALA#AџAAAApA/AA0:AAA AiAڈA)AHADAؤA٠AOAڰA|4AىA٠5AOA/A2A١AA @A>AtARA+A,AcA7AAZ.AAݽA)JA4ArA-AŹAxAeAjAuDA,AuAS>A#XA*HA*AAw?Aã.AЁAӳ]A*Ah ABeA-AAՒAYAyA-A϶Aϲ`Aс(A:#A AIAIAwAA6,AMAAٯAoAIAْANAAA[AcA{A!AlXA$AAj AAcA٫A_AFAvA A"A٥)AAsAmA^yAzAA≿AeA3AˋAV7AiAVAA A)AZAA A'AEA5AnAALAjA{AБAӐZAQBAҩA=AKA̿ADA&QA18A AֶAאZAcA@jAA׊AA$A/Aڴ[A)JA؅sAشA.Aڟ7AۧyAAȁAnAA26A#AdAן7A$VAرASA#A%A+AqAAA~A܃A AЕAʴAЉjA^AƧAiA-ASATAhAA&QAƆAAAAA`AAApOAũuA{A;uA^yAA˸AvA̼A33A^$AArKAAA՟A$A։AAخA?A@AոA׈AAپAAxAݚAAِA!AAEA8A[AÍAAeA'AzA_AيhA@jA+A܎_AݮiARAvA33A΀*A@A[AAEA\AbABeAAAAA@AAAAAÍA"A A5A AʧyAcAAˎA/A8(A&QA A[A7A\A@jAfA׶A{A5/ATA:AۖAfAzAAڥ)AAAlAڡ2AڹPAAgAϙEA:AAΠ5AʹAy:AǿAAAvAAyAAA~/A]AABA-A!ABAAw?AeA5AeAAyAˇoA̸AΐAAUA#AA֞:AƆADA\)AfAeAAjAeiAץ~AmA֜A^AAؔARA՚CA#AqAuA&QAIAA7AۡA(ApOA.A3AڢAڡ2AڼIAhbA۫AF\A` AmAAĀ!AnAwAAAӃxAҀ*AgA,Aؠ5AׅsAոA֖A֪AZAkAċA|4A&Aײ AwA5A^Aw?AHA־A׆AA\)AoAAAەAܲAA"[AA5AʻAʹ[A AE^A,AyAA9%A$AHAȧyAE AڬAiAAWAeAA AqAbAwA׳AAɝA8|AlAAֶWA"AAҭAA%AxANAAaA}AA֥AA֙A{AZAՖAAۖAmAڿAڲ A25A@ABAÀAAA>AeA]'AУA-AɢAʽA̤,AΉA#AAA ALAA*HA6AֶAA*A^yAuAA AʆAǨwAŬA~AʐAAA1AA6AAA.Aɟ7ApAAȜAGZAÿAArA,CA<A\AAӣ.AӝAӖA[A%TAnA}AГAk[A֥~AְAҒUAPAAҜAQBA`AֽAئ|A{6A[A=AͰdA1AUAAʵYAiAYAǙA!Ak[AAD`A|AAnA{APEA%AqMAոA$AE^A A׳AAgAMAWA41A*AtAAAmAF\AkALAA/A̫AċAxA,CA{AAːAAoRAAaA@jAmAAεYAAA.AkAԐAׯgA[A33AՎA$VAԚAԸAA͓SA̭Aβ`AdAȁAwAͭArKAɚAAƷAMAA!AmAarAfAYA$AAAܨAAeAYAACAA^A^AqAmA7AQAKA?A<AtAAMA̢A AθA`A˲A$A+AΥ~ASAAMLAOApAЂAϗAA{A+AA&QA~/A|AAgA(MAֺAAW5A!A՘@ѯB(33B{B\BQ =BkBpBuBx=qBaB{B{Bf33BcB&B(BǮBffB#BBʏ\BGBBBCC$cC\BǮBffBBkCC{CYC%\C5&fC,CB#B\BBB =BÔ{BBB33BHBZ=qBU B_BtffB#BjBfBBǮBoGBgB@B?pBB\BCC B=BB4CChB\BըB8RBGBBHBGC=qC C C+{C,33CCEBBB#BzB\BpB A=pB-QB9B9BLBy{BnBo\)BtGBBB|(BnBX\)BXffBB=qBCC#BzBB.BRBBaHB{BaHBqpBVBkB#BzC CC2cCJaGC0O\CٚB)BBLBW B=C\BzB(B*(B-fgB4GB;QBL{BX >BxpBB{B)BtBd =BǮB\BW BB؞BBBBBSzBr B(B#BBB\BBpBC\)C CǮCC"BzBaHBB=BffBƀBzCAzAB {BRBB#=qB0BHpBZ(BkBGBBBB\BBBmBTBApAGAzB {B(zBkGBqBB3BuBB)BC\CCBBB{BǮBBqBBBkB8RBB8RBB{A{A(AffABQB B2pB>=qBiBQBBB33BBzB=Bp BpA33A =ẠABB B&B[ =B8RBB=BJRBgQBBW BծB)BB.By(BW=qBffBB=pBBB B.B.CCfA9pAAffBpBGB<BV\BeBuBffB#B\)B=qB>Bߊ>B֞BB9BApAAGAHB =qAB1{BRB{BXB@QB3B*ByffBGBffBzB{B\)B3BBBBBHBaHBCqCC C \AA33AB =B/Bs(B =BjBoRBfBBQBBBzB\B)BB$BffA{ApA BB&B=BzBo(B\]B433BGB{BDBLQBBkBǮBBfBkBqBQBBՙBBC CQCC$s3C(C ٚB=qCC CCCMfBBABB*HB7B2BEffBlHBwByB{BfB(BLB#BB3BTB*33B1BA=qB \)B9GB=qB(B{By\)B;B5B3B/HByBaHBB{BGBǮB\)BBBîBffCJ=CC-YCFHC>xRCT{B3C\C(O\CG@CQ#CRRB/B1\)B3=qApAzAzAB( >BtB|BpGB[HBWfgBuB\)BHBB\BBB3B(AՙBQAB HBZzB\BǮBBBBB/BJBpBqBBkBŞBpB)BB]zBBRBkC=qC"\)C.QC'C=C C)C6CQ}qC_\Cc3BBPzB?B =B =BfgBEBtBBBzRBUpBEBq BBǮBۏ\B8RBBýqBBIBpB BzB%33BVB] >BxBjB#QBBBn(B]BfBBBBaHBB~GBaHBpBBBBzC )CC@C C)C.HCH=qCc3CsCgCsO\A33AGA؏\BB\BBzBBaB\GB{BLBW BB(BB׳3CC33BqBGBCB.GBAzB= >B){B&RBK=qBW\)B4QB BRBB)BP{B=qBB B˸RBBpB\BBtHBǮB\BąBC\C hC C{C)CGaHC]=ClYCwQCu ConCiA=pAQBCBB(B\)BaHBcBHzB(B( B\B=pB:B[zB|HB.B=B(BŨBBHB1BNQB<\B{B B1B$HA(AAAAB'HB=B]ffBkBǮBzBB\B=BuB3B\)BBBCO\BfB{C CCxRCEpCGCQnCbCWs3CMgCAO\CiA]A BBBB3BHBqBFB"BzBr{BffBsBi\)BVpBBpBBBB\)B$HB'33B#RBBfgB+B"{AԣAypA =B pB =B B\)B#(B1BkB8RBBGBupB) =B(B.B =BBBaHB=qBzCxRCBC=C=QCB:COCFC:C C-RCI޸Cb3ATA=qBRBBHBBB\ >BwBYffBfB(BB BBb{B: B1B{B 33AHABHBBQBzBzB'(B.zB pB\)B>BQBJB6 B(33B&QBBy\BBǮB˳3BBBB{B{B\BԔ{BuB֨BB33BǮBB33BCW CW BBBѸRBpBLCC(qC>\CqxRC>CФCt{A\)A\AffBB33BB?B =BpBpB"BBZ >BBBBy\BB=qB}pB8HBR >BX=qB`BvpBdBspB`BB)B@BAzB>BDHB0zB/QB^=qBBkB.BBBBBģBǮBpB\)BB3BzBУBzBǮBǮBBBB=qBBBfB=qCRC%BC@C0C5B<A33BlRBtpBa{B-\B A AABBpB.BBuBǮBuBB=BBfBW BBBffBaHBB\BRBb >B-{B$BfgBpBB! BH BzBBBƸRBBHBffB.C RCpBB =B8RBBuBB\BBBBBƞB#BQBBB BC C:CkCٚBGB@HB8BBQB-AAиRA{A =A >B BIBPB{A B.B\)B{BB=pB BBffB.B =B|GBnGBnBypBf(B7=qBRAGB\)B+]BMQBBBzB\)BģBBCqC$C.CEBaHBzBBBLB8RB\)BBfBfBB)B=pBèB =B C8RCC :CnAB zB% B0HBApA=qA{AAA33B!BB \)A ApB =B\B)B8RBpB =BHB=B}BTB;RBL\BBW BnBRAB%HBHzBH33BB\B)B BB.BCkCC{B=BfgB=qBBBLBGB½qBW BB{BBzB{BŔ{BB{B8RB33C =C C@C]CNC)AzzARBffB3 B2pBAҸRAA\)AQBQB<BD =B;B A{AB"BKB BuB%BUByBvGBZB@BDBq\BBBffB)BffB\)B#BB>B҅BBBCpBBB.BRBրBkBڸRBBB#B=qB\)BǮB(BqBBBBިBۣBșBBBCkC HC CCHECKCg =C`AA=qB BFzBP33BJBpAHAABApB=ffB8GBzA=qBB=B2(BB+B(B2BaHBxBhBnHBVQBRBlBBBЊ>BУBffB{B(B=qBkCLCT{CBzB.B8RBaHBٞB\BB8RBuBBBBBBBGB8RB{BBB߅BuBB(Bڔ{BCCaHCC C){C* C)C,B]B3A{B^pBp{BJB,33AѮApAϙABB{BB BGBRB%fgB=B%(B=pBqRBVB[BcRBbfgBUBMzB?zBgBDQB8RBRBBaHBBBؽqBQCzC{ChCBBBمB=pBB{BB)B݊=B\)C uBBBBRBBBBB=BBƣB{C)CC&fC CQC%}qCV#CrBBBZBBpBi(Bk =BK(B*fgAAQA=qAfgBGB QB%B B{B RB(B$\)B=ffB^HB^BtRBoHBVBBzB~RBB[=qBBBB{BBffB8RBB33C@CCcC BQBfBBB3CBBB8RCCs3C@CB)B\B=qB8RBBqBBzB\BCC:CBCCC C3{B=BBBiBl\)Bt(BM(B9\B1\B$HBB B#B1fgB*B BpB-RBIzB]{BlB|BkBOBQ(Bu\)B33B =B\BW BBB3BǣB\BBB=qBQB=CCCxRC=BkBBB33BޅBpBBBʅCǮCH.C~CWǮCB=pBB B BfC C%uC!.C GCBRBGBǮBBB8RBB\BpBf\BiBVBLBa{BSB\BhBLGB'B#B,\B:BRBB{Bo(BqB.A(B{B BW BBGB˳3BѮB8RBŠ>B3BBBBB#BzBBǮBW BqB{BqB{B{B\BC$YCRC8C*&gC{C{C03CBC0CHC*xRCT{CC YCChCC qC 8RBBBGBB3BpBvBsGBmpBrGBy=qBk(B]BSRB<B(B =BRB3HB`(BjGBgBqBB)B =BBрB\B=qBBaHBzB8RBaHBfBfB=BBBBQBBBfBBB)B=qB\BzBQB:{B#B=CCcC )C =B>B3B٨C\)C\CC" CCRCC\)CCGCBBB.BkB)BkBB=B{BiBm Bt=qBfBeBC33B BBB B3QBKBSBrB B B\)B\)BkB8RCkC>CB\)BkB >B33B8RBBBqBGB\B{BB|Bq=qBBuB#BB[HBQB${B5{BBHC+BHBpBǮBQBǮBpBHC fC8:CK\CBnC#C(CECB3BqB{BxBn\BuBRBB~33BypB[33Bz >BGBBBB}HBd BLB7=qBB0HBPBo{BqB.BpBBB\)BzBaHB=qBǮBBkB{BB؊>BʞBB =BǮBBǮB&RB*BU=qBwBxBqB/{BRB&zB+HBD >B>B33BB8RB#BRBpB\CC,)CO =CQ+C<\C$C CCB BsBKHB2B4 Bp\)BBuBgGBSpBR{B|GB33BBpBBLB{BB@B4pBb{BB\BBB =B֙BuB =BW BBHBBqC+C3=qBLBB\BzB\BuBpBIffBB=qBRpBmfgBW >Bp=qBBC+BzB(B0BHBdBuBBBMRBEBIQB` =BB33BȅB >B?=qBZB3=qB3B6zBhQBwzBW BB3B3B\BBxGBZRB_HB=BBm B?33BA BGBQB.BQBB=pB8RBkBuBB >BGB{pBqBaGBBffB׸RBB)BfBBC CT{C5:C9\C=޸C?HC(hB8{B=HBdzBhBǮBB{BBBGBGApB!RB\ =B\B]GBs(BERB@B7\BNBjBlBdBB=qBW B\RB~BB=GB,ffBǮBBLBuBP33BGBW B3B\B{BqBffB\)BzBBaHBRB=qB`B=qBQBBB)BΊ=B=qBB >BBQBHC)C%(C#GCLBHB=AֶA۩uAܾAAċAەNA)JA٣AmAܯAބ!AZAZAuA\}AvASA'AߡAAsAEAAAA,CAnA%TAߒUAJAA`AbA)AA ACcAApA-AAAA⾙AAA(AAٶAٓAA A#AܨAHAAeAAAA䤀AAyAA♚AqAܨA*AAhA{A=AޡAոAj AoA26A|4AAA\AA畣AA-AXAPASAAQBAA؝Az8A:xAQBAؕAֻAA^$A}1Aס3ApAnTAݸAAAUAA≿AA:A0AxA ;AyAA4A;uAvAAىjA6,AAhbAA%AAAA"APEA㳲AAZA߆AaArAաAաA׳ApAأAظRAآA؀AAhbARAA8AߓAAߣ.AA݆A]AKAxAZA26ANAdAňAAARAU9AAGZAGA\A=AAdA)AgdAܠ5AӑA$A^AAܮiA܁|A۰dA?Aش[AEAAق&ANIA݊A(MA6A_vAȂAyAA]'AޡAV7AeAeAA|AnAkAAAAAmA AZA牿A+FAAAAAzAhbAFAA_AݛAY0AҧAAA݁}AAA18ACcAW5AAطTA 7A AYA:AݟA A!AAߞAޯgAݶA|A޺AgdAAA!A5AvAA7AAA,A18ANA猸AAgA~AA#A嶫AֶAAHWA0A,A'AA~AzAڭkAܤAbAAAFA0A5A41AAffA|A|Aܲ`AAҿAݥA޳^A_A$A ;A-AAňA#A?AAbAbAgA1AmA;uA%ApOAA*A@AE AnAYAMLA}AuA0AAAuAiAuDA @AջA׋A-AgAAZAmABA-A A7*AۑAA2AA=AܽAeA۟7A(AyAᓧA}AAऀAAAAAFA"A"[A⛕A~A߷AvAGAAdA]'ANA㘜AiA⮾AeiAAmA2A,AAKASAٽFABeA[A3A3AA;uA[+AA _AAA׿AaA/A,AڪAس AٯAsHAA[A6A A/AAAtAmAeAU9A{AZAA晚AAA޹PAAE AZADA AMAᜓA$A-AAAݵYAAA{A&A@A؎ AjAzAlYAӖLAsAՐAA"AїAaAѫArAU9AثAYAA؂A.AرAΛ@AYACALA{AbAHAAݺA:#AqAAӻAaA_wA7AzAZAA[+AQBA.AAIAOA*A AzAгAГAAXAӞAAnTADŽAqAFAňAUAKAAX2A AӘGAeiAA AyA8(AԮAAAӏA]AQCAұbAӧAgAԍ AAӽAoAոAȇAdA%TA,A(LAA-AĿBAAAJAA26AxAPAZAAAARAAAA|A@A!AarA˖LAABA26Aϧ%AAAAAE^AAV7A|4AsHAA7AA A4AߡA-A2AWA[AwADŽA'OA_wAw?AdA AӴ[AIAԡ3A25AeA;A,AAzAAӲAAҔA)A@jAAA^AoRAAw?AyAAgA˯A_AƔA-A†AjA0A;uAA^A>ACAD`AdkAgdAA18AA^$AWANIA׳A˰AzAʈAͨ"AASAoAΔAʹAAϑAֶA2AѵYAAѧAYAӍaAA^AsHAA=AaAA҈AA/A]{AT;AFAnAVA-AMA)AaAoRAɐAx=AE AsA4AA1ALASAYAAJA*HA|AxAdkAz8A۪AƁAAAAhbAĭAǗAA8AAAOAfAAAޣAРAAA5Aj AԸAӏA%AӔQA1ANA A@AѺAA41A&QAnA.AܨAoAϢAsA"[AӕARA4AҺAKPA/AANAAA A@jA-AQA×JAJAkAőAArKAqMALAAxAA[+AOA&AA*A=AAA AZ.AAbAA2A÷AĢ0AUAAňAˁ}Ai_A{A͑AAѝAfAA5A?AoAGArAШA>AqAYAAYA26AӆqAAAA}AޣAςAпA(ALAlAAAAAA,AA7*AfANIA-AäAA"ANA-AbAA9%AAF\A)AA:AAAUA"ZAAAi_AhAA!AA#XAAŻKAȊhA˩A.A"[Aj AԺAҰAЅsAͺA̙AAίAcAApACAAi_AaAA՘AuAXA̿AAA`tAQAkAѻKAAA_A ANAAӽA{AAA8|A~AuAAVAAAANANIAAqA AAARAD`A"AAA`tAoAIAƕA?A _AtAV7AA8AAˮA%A-AẠ.A͖LAβ AηA:AYApOA}AkAAϨ"AΜ>AAŴA6A0:AQA~AAю AҲ`A7AA}A]A#A!AGAGAAA)JAAA!AAAAdAhA AbpAJAyAcmAAnA{AAIAAbA}1A}AwAZARAAA8AAAޣAċAƫAhAmAvA AkA˖A̋eA˹PA4AA~/A7*AAJAϸRAVAAȵAȱbAʣ.Â&AͱbAA#A+AYAAyAAR@AAA1A|3AAvAAsAAA6AF\AHWAAA~A!]AAA>AAܨAAgAӽAYAAAbAtAAyA 7A >A18AA7A2A|4A]{A;AlAfAw?AA'OÀ*A,Aʳ A ARADŽAAHWAGAΓSAtAbpAċAIAˁ}AuAʖAi`AOA>AAAATAA AA ;A~AaA(A ;AAYAMAAEAD AAAAA%APAV7AZA{6AA^AȂA+A(A2AAA AeA2AwAA'A9zAA{ADŽAAARAGZAˏAɦ'A-ANAǡA6,AAʓȂAΡAmAΤAAA`tAˮA˓SA@ѶBfBNBG33B*=pB+B5pB=B=QB:pB/zB;QBBΨB{B\C"fCP=CfCIs3CLC CC\)CC 5CfCfgCfBCCCLCCJ=C$3C78RCU>Cb!HCvYCn&fC[3Cds3C=C9C BBQBBBBz{BPB9B?B:B2zBEHBpQBHBpC@CHC8C4CC QCxRC cC3CHCC&fCBzBfgB\)C )CW C{C zC!HC7+COC^ ClhCrCCBCCfgCCǚBzBÞB33B)B=BO(BQB@BC BDHBQB`B=BBaHC ٚCqCC >CCCCٚC C CCHBڅB=qBBC:C\)CHCBC6CHCMCUCC CCCcC/\B\BՏ\B\)BBB\BGBDpB>GBDBS BqBW BBBBpBBLB\)BB(B8RBCGCCJ>BBBBBսqBRBW BCW C1s3C@CtJ=CHC\CC\C͑C`CNB{BLB=qBBBqBpBB~Bs=pBBB\)BRBHB33BHBBBzBB{BQBBǮB#BB{B#B{BĮBLB{B♙BHCC8C>\)CACM޸C[\)Cx(C|pCNC\CC۫CHC˅BBB5(B5B8RBB B33B\B33B BBW B33BB >B{BBkB3B B3BBRB =BBB33BBЊ=B BBQBfCqC#hC4C;C>CJ=CSCm =CgcCC=C{CbC#CC8RA{BB&B0 B>ffBrffBoRB3B(BBpBBBaHB{BpB{B33B8RBaHBoRBBqB\BBBpBBBBBǮBuBffC5C&C,QC.=CBC \C }qCCC&C:aHC]5Cg\CjC`C\CǢC\)CHC CO\DDRD 3DeD.D6A\AzA\)BffB&BU33BhBffBpBBHB{BfgB.BzBBo >B(BW=qB9=pBUBpzBRB)BBBGB >B\)BɅBӔ{B.C{C$#C%C \CC)C1CI>C7QC:3CMCV(C7 CHC˅DDCCD DD,>D6W D01HA =BBBBBRBBvBxBzQBBzBBkBoBazB~B=qBx ByBv\B}\)BGBBLBBB3B(BkB{C>CBCCD!DA{B BRpBg33B<BP =Bj\BjRBS BQBvB(B}BMGB6pB[\B{HBLB33BBQBnBvHB8RBBB(B B{BBQC CC {CCnCHW CEC;kC,s3C3CDCFCKCQCi\C{CHCCCCuCbC.CfDD0DG DhRDAB{BB(B;B!zBMpBcffBbffBUBmB#B\BUBBBHzBB=qBaHBGBBBk >B3BvpBBC0C =CCCzBpC 0C5>CMqCB=qC9pC:CARCLCL^CcC|aHCUCYC)C CC(CC=qCAHD qDDDDD>DAv{ApB\BHB BFBdQBQBaBRBgB\BeHB&B8BqQBHBBͮBۨBBpBW BKBy33B B\)C33C:C޸CBBܳ3B8RBC>GCQ=qCHuCLCDCDfCQCS)CeC'CC=qCQCʂC֝qCT{CD)DAHDwD D\D D+D,D'DCT{ApAQB B#GB,B2QBd{BsBgBB =BB\Bn{BB.BffB =B(BB.BBuBQBQB\)BuCBCBqCpBGBB\C)CNCNCWC_ Cf{CRW CZ5C} C C/\CJ=C C=qCHCzCD6gDD*=D0DDZ=D DDDqC)CƠCHABB4B'B, B*=qB8\BHBD\)BBBBBffB BfgBB(BhBBBBuBGBW B8RBRBaHBBW B.B\)BBCN&fC\W C]!GC^CuC|)Cx>C)CC C'C&fCCClC֔{CRC =D3D{DD ǮD hDVfD)D DC=CYC.CqCCٚCfBHBIHB3B+B]B^ BZBY\)BV{B =B\)BBBLBǮB)BBw B[GBvBB{B(BBǮBffBBǮBÞBzB8RBW B{CC@CC{C}CqCC>CfgC:CBCC CC4{CZCcC#CCD HDpD1HD?\DDDo\D D JC߇CC3CHC{CC|B(B#33B)B)RBd{BmBg(B B.B B =B8RBK BBB)BBpB(B=qBBB=qBBBBBB =B.BBCxRCB\C<(Cs3CCCfCC>CYCfCCUCC)C8RC=Co\CȕC\CqD {DDDND" DqDxRDyDɚC*=CqCCCÜ)B =qB pB"B2RB833BWpB|(BpB\BBpBBRBoC^C#xRBQB.Bs\BBfBBuBkB>BB\)BոRBͳ3B\BBʀBݸRBڞC CDCi=CrQCCC=CCXRC)CfCĨCnC7 CźCɇCθRC߅CD DND%D+w D%~DɚDNDD Cw CUC"C\)CqAB BB B5BDRBeB{BGB=BW Bm{B)BK=qBk\BǮBBpBm(B|\BdfgB#BƣBBaHBBBffB)BBBzB\)B(C޸CC=C\YCpGCCCCt{CBCֆfC=Cȷ C*=CɈCj>CCUCD9DfD6fD<ɚD*DD(RD{D 8RDlCCHCYCo\ARBBBB%B8{B,BcB1ffBcBBǮB=BJBZB[BXB#B}Bn\BkB(BfB33BBBHBŏ\BqCLBBBLBGC CǮC#CJCnHC{C>CCC\CФC˗ C8RCFfC|)CfgCCFfCCDD*D0D& DD qDGDFfD#7DD J>CgCqCCC C[{A(B \B =BBB\)BB B+ =BBBBǮBU{BcBZB8(B,\B!B4BBq33BBW B#BǮBB B{B\BBB)BC ffCCC$hCM=CgcC>CaHC33CCC&fC CC!HCDCCRCDDHD!fD%D$GD D$\D&θD()D(D 3CC,C3C)C#C`C~T{C^J=BAA=pA AA AA\)Aԏ\B"\BaHB{C B{BB#BBBw\BW33BHRBZB3\)BCBuBBBBQBB3B33BBBkBǮC #C 3CLC)\CW\CzC)CRCCHCC⋅CCC|)CW DCCuD {D7DθD*l)D2l)D0D)RD&`D)W D" D\DzC۱CĵC'C{CCCoCaGBB HB=qAffAGA{AHAA\BffB?{BezBB =BkB{BBB\By\BǮBffBp(BR=qBh=pB~zBkBpBkBW B\B B˞BǮB\BBCCCCDC^YC^CjCfCLCYCDxRDۅD3D)DRDC)D)D(l)D*D:mqDGVfD?4{D6D3 D,D-SD!+DC Co\CCYC{CfgCuAB33B A AAAAARA(B({BbBW B{zB=Bm BTBNBq =Bw\)BB=BB33BBLBƳ3BBGBuBRBBpBaHB3BuC \C =C(ffCEgCN#C[J>CgaHClC\C3DqHDC:DD3DDvfD.D0D+${D3RD9eDT#3DBGDD ۅD!D+D,D+D1 D4xRD1`D4:=D-3DDYC{CO\CǪ>AffAAffAzABA\)AHA >A33B >BBAGARBBzB {B3ffBdBBB{B)BՏ\B\)BRBuBBBBfBBӣBBǮCCzC:C_>Cf^C{CCGCXRChC~C*>CC䢏C݇CxRCfgC!HD DD=D 3D%D!^D">D!{D1D'3DiCCC\)CnC3C\Av{AvffA{AAzA\)AЏ\AGAQA =AB=qB\)AA\AA=qBHBRB*=qB;HBSBpBGBҊ>BǮB)B\)B=qBB=qBBBqBCC"W C8 =C83Cc5CC CCqCٚC8RCC CCȔ{C|)ClC C"CxRD [D DS3D>DqDCDDaCCw CCC,CC3CCj=C%AnffAAAAAA(AfgAQAfgBRAAB{A =AϙAŅAAA㙚ABBOBwBB{B{B#BĀBCCHC C C\CaHC0CG\CBaHCICRCCCfC3CzC{CRCC.CC3CCC@CAHDSDDD}qD;D{C4{CqCC`CCC C\)CRCW C=ARAA=qAAGAA͙AffARB=qBBB$ =B2RBGBRAHAGAAAzBBBM33BszB\)BpBfBBݞC!HC#CcC#nC{C"C3ǮCFCDCO{CcCCj=CCCYCCCCCCS3CƌC˅CC{CDDD7 C+CCCCϑCO\C1CC&fCqCkCBffB'=qB B8B@pBRB BRB =qB(ffB"BAzBN BRffB@B#=qBB(A33ABB =B(B*\BGBe BB\BǮBBBCC#C0C>YCc.CHCB8RCMJ=C1CqCC3C0CHCxRC\Cs3C~CȞC׋CkC~CbCǣCYCC\Cח C1C๙CC0CD )DD CnCC =CkB>B^B[ffBOB.(B RB GB BBB{BNffBS BBVRB7pB"BQB$zB%BB=qB =B* BFBkBBBpBŊ>BzB=BC\CC2C}CnO\CP{CH)C\C C CCCC =CuC CCCfC{C C:Cя\Cw DmqC3C7 CC C>C:D}qD ${D D )C CCCB/zBW=qBN\)BL33B7ffBRABGBQB{B zB,BLQB:B,B!=qB BffB/=qBC=pBKfgBw =B{ffBkpBm\)BxzBRBBpBó3BW BpBШCs3C"C6C:!HCnxRCXRCwCzhCrCwHCECAHCS3CCC+C{CCCC]qC Co\C,Cs3CaHC7 CߨC)CNDD \D Z=D HDҏB B:\)BBpBARB0(B =qAzA34ARAARAڣApBHBQAffABB>=pBHBb\BBBzBB B=qBBBpBC.B#B\)CqC W C2C[YC\C33CyCjCjC`CeC\)CC=CC)CzYC=qC`CyCNCHCxRCpC CپCw C9C>CYDCRD)C=pCA AnAAAA]AǮA_AW AAAAyAAtAfAJA@,AANA\A&Aj(A|?AAMA; AÕA_AAA3A#(AA]/AtAA-ASIA{AA >A AUA A[AA\)AAAx~A$.AYAAAA2AMAAe Ax~APAA2A+AAAAdAoAAaA]AFA>wA[#AAe AA4A$AAyAFQAAA>wA=AЎABA0AXA"AA+AAAPAAA+AZA AhA+A]A0!A\AoFA/AA=AdAAA:A AAfA=A5?A:AAoAǮAψAA =Ak.AAlArAVAhsA,AKA AteAUAVAAAdZAAABAeAdAA+ZAA\AAPA2AAA >A4AA)A A,AtAADAbA+AA"AYASAAAA{AAN*A(AAA7A_;AAJiAGAhsAAŢAAAe Ai!AASIAAvA/rA8AA|A6AҚA9A]A=A}ADA A!AAA_A6FAxAZA AteAAխANArApAAlAsA6A?A4AԧAA0A`A]/AA AWAA/AA.A2-AWA`AAcAA7AAvAA(AAe AAAAhA,AA2A AAVAAwAANApAEAkA2A2AAoFAPAAvA\)AAzAAAuACAAaAA3AA(A4ADA7LABAj(ATAAAAtAQ=AMAuAލAAdAAAhAψAaAB8AmAA?AH]AAA'AiyA܀APA\A$ATA1AAAbA]AGA:^AwAhAuA5?AĜAwAoAAAA[AV\AkA\AzAAAAߓAAA݇A AA^A1A-AψAAAPArAYnA#ApLAQAA9XAnAAATAA&ACAjA0xAAjAAcAAyAAAAzAZA^5AA]AuAUUA6AA.AiA%AXA(ANACAA[AєAAHAAAAcTAxAAHAAA(AA#A~AA AA$.AAA|AdAPA`AĜA A+AAASAe A_AfAAAAAfAA[#AA`AAgAAAeAWA+YAdAAAA,Am:A5AoAA DAAKAAAIAAA;AIAP7A\A)A6AAA?AA,AAQAAHA?AGWAA3A/AA&A]AqA$.A'A1AA AAdAVAAAA}AjCAl^Alm:AAA AnAYAAAOAZADAaAANA5?AjAKAAA4AAAiAAAbA&A]/AA >AAAA1~AHAfAAcAmAe A*ADAKAEAAtAW A AhsAAAAUAkA_;AAAaAwAnAZtAe`AAZAUA>AkA~A{AA|`AAPtAYM$AlAi(GArzAAA!AAKAA,A AAcAJA7ABAeA3AUA#AAA0!AIcADAAOAx~A\A@A AAAA,AaAAxAdAd|AoAAuiAw1'AyApA`AAAAAKoAAAAAkAAAAAA܀AwAAPAAXAwAA8AAAA.AgAψAA+AGAUAArAUAAAAAaHAAAyA`AAAtAAAXALAsAZAA A.lAZAfAAfAbALuA*A}`AXPAatAgyAn]A||?A$.AtOAAdAQASAAgA&AA4ApAؿAAHA>wA,A[AvqA =ARCAfAuAAw AbAnAfAĜATOA0AAɺAA\A9A~ApAQ=AtAA""AAIAYnA3AAAEKAAAwAOAψAXhADAAAAAV[AuADA~AA AAA1A{AA-AGWA0AAAFQANAA'AA'A#AAeAA A#A7AAAAAAz(AAAA}>AOAAĜAAAyPA~AyAcAA@ABAI AψAOAAdAtA>AAzA'AN*AIAqRAAuAA|AA.A)MAAAA3ARAA(GAA&;APAA;AAAHA@AWAֳAALuAEA~A>AAAAAAGWAAAA-A~єAl2Ak7LAzZA~AzNAA 7AAx&AAAhAzAi!AAAsAN*AdA0xAAyAEA΂AkAgA&A{AAj(AVA-AAUAA$AAAAM|Az@Ѿ@B܀Bҳ3Bӊ>BuB33B\)BǮBQBBnpBo Bx{B|RBBzHBBBBqBBBW BB{BB{BBBpzBtBu\)B(BǮBBuB֞B8RBC pC ffC3CB#CC,BBB\BQB̏\BBBaHBLBrBdzBaffBe(BzB|BLB8RB)BBBBBBkBBڨBBBB BrpBvBjBl33Bt=qBs\BRBCfCO\CRC}qC\)CC{C+ǮCFpC]BaHBuBGBxBRBɏ\BB#BQB^B:BPfgBORBWRBUB^ =BkzB{33BBB.B =B{B =BQB BqBfBmB{HBtzBi{BrBBRCC>)C1CfCǮC C,.C3COC}BRBqBx =Bx\)BB#B >B B3Bq(B^33B[Ba\)BQ(B/\)B)B833BWBo{BjB}BBBqBBBPBVffBhBl(BpB{BBaHBzC ޸C$:C\CC\C#cC>C8hCn\CyBBuBB BBBB3B.BQBB#BBcpBB B B0B@BKBo >Bp=qB\)BBBGB33B9(B^33BepBtfgB\BB)BzBBBB BC \CC\CC:ECV{Ce}qCgnBȳ3B =B{BBB(BBQB#BBaHBBBgBFB#B$GB%B&=qB>\BZB#BB\BB_zB6(B?QB^Bz\)Bw33Bx BRBaHB=qBݨBfBԮBB C 3CqCYC zC CC.CDCG>CEGB{BBaHB#BffBQB{BBuBkB=B.BB>B\)B`BGpB.RB,B${B#\)BrB\)BB>BB\B\BSHBzHBB(BW BHBBaHBB=B BffBB(BBpC =C3C)=qCC&&fC78RB >BgBHBמBBpBBBB#B3BBQBLB\BuBw(BtBU{BB8RB{B=qBVBAzBcBqfgB B33BB\BBLB`Bv B3BBl\Bo =BN\B4B<B\)BGBǮB뙚BBB8RC{C&C. C<CBGC>C7#C4s3CQCzC ECCcB8RC3C\C%xRC!CCC qBB{BB=BBBBBqB\B{BBBǮB =BBBBzQBt >BBvBvffBBy=pBe Bf =BZ{B:B!HBBC&fBLBǮC C3C)hC0{C2C:\C>O\C:C7C/8RCC B=pBQC\BgC/O\Cf=CCC9hC73C.qC qBC% C>CCCC3CCBB#BBBGB >BBfBaHBHBQRBt >BBGBW B3BtBwBcB4B{BczBCC)CnC'O\C9CC!HCACD=CGC=YC8C0{C#}qC RB{BB\)BBzB.BHC&qC1\CDCICI\CKqCRkCdCLCdCaHCC'T{C@CC+nCCaHB\BpBffBQBBW BBtzB\BB=B`\BRBjHBlRBJHB#\)BuB)CRC  C%CH:CSuCT33CGxRCF!HC<C?C<=qC1@C4 CCCB\BC)CuBqHBBffCxRC.C8)CfCmCbRCvgCdCKC{C\s3C2(C}qCCC-!GC+fCC CǮC CQB8RB >BHBLBBGBhB<\BDBt\BpB_GBVzB_=qBBBHBuC3CRC]CRC==C=C6=C0C$CC!C!BC!{C&T{CfC(CfCpC CB8RBB{BBB{C)CF=Ch\C:!HC B C/Ce C>33C)CC5C>C$C,BC s3C&C2C,T{CB.BGBRB B\BsGBzBBHBxBW BaHBiQB~B\)BBW C'.Cx)C7qCBT{CCffC:pC:kC2\C!J=CxRC C+5C/!HC7C.C$T{C$C)CGGC/CzC>B=qBLBB\BBCJ=B3B\CC =qCfgC#CLCFC1C{C3C}qCCCqC%C*W C1CCBCCkBď\B\)BpBfgBB8RB\ByBy =B.BLBBB.BW C'޸C(HC;CC+CAqCA!HC;C0)CfC"GC)C0RC/zC6C>qCEO\CMCK33C;.C4uCC B >BHBW B >B#BBB{BBBBffBBó3C C.}qCNCJ#C8=qC-C@!HC#C"CCO\CgC{C EC {C CC=C0BpBBgBaHBB.B)BfBkBGBB3BBzCC&C1(C5)C7=C6C4(C3 C(.C+C+C.{C;W CBCI^CJO\CICL CN>CEC8RC'C)BRBBGBB3BǮB BfBB\BBǮB{BͅCL+C޸CD\C=fCI5C C%C{CC33CYB.BB CCRC+CzCffCB BB\BBBBpBfBffBpBGBBHBBLC@C&C C.C5&fC,J=C.RC/+C/ٚC2=qC9C?s3CBnCICG}qCIaHCOCI\)CK{C;LC@BǮBHBBBffBBQBBQB33BtBC0C.C=C\Cf=qC=33C(C;C!}qCBBaHBB8RBCRCfC C3BkBGC ^CHC&gC :CnCECT{B33BLB.BңB#BQCuCCC CqC >C'C*C-kC/ C2{C0C8{C@T{COCICIT{CLC=C'C+B#BBB.BkBǮBhQB)B\)BBW BǮB BǮBBЙC8RC:gC1C B{B(B…BB\BqBkBBB{BB#BgB3CC zC)C@CC.C(BB.B߸RBHBHBW CqCO\C C)C C#=qC"=pC*\C(}qC-RC,C,uC1.C*zC0cC?C<)C+C#J=CCBaHB8RBBaHBBsBBW CuBHBBaHB.BkBƔ{B#BRCEBuBQB)B3BqB\B{BBuBgB\BǮBkB3B{CC CC\CC'\C(BzBLBBW B(BBGBLBݸRBCCpCC!=C$!HC)LC*C,HCCCYC33C=C$CCC\)C33BBQBިBBʮB=qBBGB8RBB{B3B݀B =B\B8RBBBƙBBB =BpBmBBfBBaHB =B=BzBBkB)B\B)B۳3BRB{B =BB#BBHBѸRBB=qBBBGBzBBGBսpB)C&fC C C#RC&C,RC(CC B BCC-C*CGCC zC EC {C+BffBW B{BB\BBBB\BB#BB BBpB33BzBB3B.BxBqGBBLBuB.BBffBB\BB33BBBQBB\B=qBBRBB=qBBB=qBLB=B(BLBBqBBBBݮC3C C! C'3C*pC!CCcBBC!HCC"ǮC\C >C*C-C3C/CCCO\B#B.BBuB\BxzBq B(BBgBYB< =B]=qBfRBxGByBBBB|=pBB.B>BlRB BB3BRBBuBpB\B(BBBBB#BBpBaHB =BW B=qB)B=BBRBW BqB#B\BBˏ\BqCC"C$ C'CRC33CW C.C#&fC)=C2C:޸C1:C9\CE+CHCEC$3CqBhGBBB)B=qBwzBiHBiGB^ =B[BCB1(BCB/=qB&(BABRBNRBYzBBkBjBY{BnpBQB3BnB[pBtzB)B>B33B{B_ B\BBB =BBBBffBǮB\B)BBB\)B~\BxBiBkBB\)BBCCJ=C&uC#\C$&fC%!HC#0C&LC-J=C3C=kCKqCK}pCWCcCcGC^T{CHB^BGB{B\BBsBm33BzBBlQBX\B'B-(B%zB {B( =B3B>{BoBpHB[BH(B533BLGBkpBu\B\zB{BfBBpBuByRBzBtRBr=qB)BBBLBw >B=B33B|BBhB|\BBi =B`HBpffBB3BaHB̳3C+C\C C%C/{C-C2cC>CARCJ@CbCfCCu\BkBkBB >B(BkB.B33B >BvB`=qB<B1RB7HB5B1B3B6pB6BKBMGBxQBjzBa\)BTBbBh\BUB`BvB3BGBpBRBvBpBm BpBpBuBvQBwBnBn{BjBs33BB(BqBBHB{BB33B33BuBC:C-\C'C"cC5s4C;\C>\CWzCiC|#Cz.Cl{CZuCQBz BxGBBpB{BBRBuBBu=pBd{BS BAB/BA33BEBD BBBE{BNBTBTffBj=pBopBe >B[BX BDB?pB;HBIpB` =B|B\BW BzBp\Bb=qBP BSB^\Be33Bh{BeQBwHBx{B=qB(BB\BqB\B{B\)BfgBfBۅC33C C CC'3C9RC@LCZQC`)Cj)CqCbC\J=CccCXCYGB >B{B|RB8RBBBB{ffBoBnBiBVGBTBJ(BO{BSGBP\BQBX=qB^B[BV(B`zBn\BUBYB\B4(B0=qB>B7B3BV(B >B33BB BQzBK =BBBWGB[BeQBlB}B >BpBQBÅB\)BBzB\BqB\)BfgBBC@BCCC@CA(CU&fCNCP)CYffC] CVECWCcpCi=qBHBqBpBQBW BfgBXffB`zBh B}33BiBYBaBZ{BN BTpB^QBTBRffBY BRBJ\)B7B2=qBBBVzBrBUB8BARB: >B'\B<BlBBBwBVffBMB?BV B[Bg(BxBBBBLB#B\)BpBFRBBBBuBGBfgBBBCaHC3C?O\CTٚCT\)CMCPCWgCWzCU{Ck:CФBB B33B{BB{BX >BVBkBuBjB3BRBSB\RBY\)BQpB_\)B_(B]B\(BCB.RB =BB%BQ(BWGBNBLRB-BpB0BDGBa33BBkB =qB+33B.{BF >BU=pBfpBjBu(BuB~(BuBwBoBS\)BX=pBqBǮBB BBBBъ=B.C C0J=CF\CRW CK\)CJCW+C\(CZCfCB33BB =B3BBBo{BR\)BbpBpBpBqByzB =BPBl >BrBmBZBMHBb =Bl =BGB2BB B%ffB0HB7 =B9B? =B+GAApB B6 =BVBHBTffB(B& =B(B933B5BJ =B>BE{BIzBAB*=qBFBY{BffBkBBBBBBpBB\)BGC&C=cCSCPCMCR=CUpCMCUCjxRBBB.BB|BB)B\B\)BBzBBBuB\BlQB1{BN\Be\Bh33BmBcB`RBURBe\)BBGB=BRBGB"33BpBGARBHB2B7B3=qB. =B+B B B B$B/=qB= =B=\B;HB)B%B3=qB@(BcBBBǮB\)BBB(BRBBӞC CuC-(CCCECMBzB#B\)B3B3B=pBLBBBqBffBBqB\BǮBj=pB BBBw33By =BzBBW BpBB|QBBB(B ffABBffBHB \)B&B. =B" BQB(BHBpB%B%B*QBB#HB+=qB# =B)B<{Ba=qBq(BǮBffB\B#BffBBkBBHCC#C6{C6kC3\C1@AA>AňAjAALAGAmA%AAyAAAAASA<AzA:#A}AArA&AA6AWA-AAAGA\A25A(A@A A>nAAOA0AtAA7A4Ah AApAhAxAA*HAAiAAw?A0:AUA&A_wAA#AAF\A5.AFAAAVA(A4AAֶA~A$VA'AvAIAZAA\ANABAbAJA\AR@A.?AABeANA[AAhAbAmAAAAbAgAWAAkAAZA4AAAkAxAAJAA|AAAȂAMLAA[AA9%A A?A#A$A{A6AfAABAtAkAA^yAA/AAIAzAwAzASAAA"AGZArKAAAAALA >AAAdAAAABAaAwAA[AvACAIAj]AA)A^yAE AAAPAjAVA AA,AGAYAsAs"A{sA~KA`tAzA\)A&QAֶA[AAAtAAAcmAhA#XAAAA AASAcA+AA#XAAAKA AiAAAoA6AdA1AuA"AnA*A*HAhATAAA)AdAqVAwsAnAA AAD A18AA+AAbpAD AA0AAMA)AOAA A.?AAAAU9AA"AA+ArA`tAAzAAaAhA^ALA 6AAA^AA,A@AA+A"An-A|AUA@jAEAGYA|AAuAPAAA =A AAWA AAA?lAAAA"A\A)JAvAAvA~ATA|AoRAAAnTAvAAAƆAGAXA$A7AxAnTAA!A2A0A8AtAz5A}GA}A AWAAIA AAA6AZ.A~AA/AAIA*ApAmAA$AUARAbAFAAٯAAXA{AAKPA#XARAA2ABAkA_wA2A#AAlA25AMA'A(AF\AkAAċAeAoAA{A~wA~ A||A}A~`tA A}y:A|`AAmAAAAAoRAvaAusAWARA]'AA~A AAA^$AJABeAWACcAyA|4A+A AA>AUAJSA6ANAwAi`AAvA~A@jAA{A-AA=qAAgAHܨAO?A\ApApIAu33AA9%A.AsA4AAxAu%Ay(Ax\~AxYAuApsArkA{A| AtMApAyy;A~A~IAz^A~:#AAA~AMA}bA~VAܨA}AIAALAtArAhA@jAAnA5Ah A;ANAuAAA.AA` ApAtA]'AeZ.AT,CAVeANrKAGy:AKAMsAJAIA^(A_ AowAqKAzA\Ay9AvaAyA{ AAAfAxAuAr _Au}AwAvAuA~AdkACAAAgAAvAAA~A~]A]AAAAATAA0A,A!]AAA;uArAJAmAQAAAAx=A(AbA|AA}A~AmAMAGoRALeAMASAOߡAMA7.AKkAM AQwA[?AgLNAx2AuAt?AA~AIA_A/Az AsAkAn'AzAzUAqE AsApAq=AuAv*Az\~A~!A~dA|rKAy*A{A|ڬA{A~8(AA.A~A}A}A|_"A}AAcmAPEA ATAcmA/_A sAA5VA+ACABA8wAHA$oA(MAYA> 7AMpA^~A`AtnAjCA`ffActAc+AaݥAfkAmh AvAybAr#AoAmAmfAnJAp%Ap%Au-Au!Ax AuAvAu9%AvAwuAyA{cA{*AzY0AwAwA|AAA.?AANA AAfA!]AS>A@AtFAArAp)AqdAqAkFAbAO׳A% A!A A8AN_ABAAjA SArJAvAAvAA1AM&AP^AGƆAZA`S>AZ ARnA^!AcAjMAqQAqlAsKApNAl7~Aii`AhOAj,CAi?AlTAqBAn[AqaAs7ArnAsjAsh AoAoAu-AyAv-AufAv"[Az(MA)JAAlA(AVA׳AApA>ADaAAAoA!A?A0AAi*ApmAnvAAkAe=Af8Aa^AOA2[+AAA'AX2AkAy:AA2A0AJbpAVA`A@AAsA:W5A@ADAB6A]xAedAm9%An2AojAoAiAhԺAiRAiAkAmUAm18AoCAk{AnAlSAjOAlAoApܨAq=ArAtApÍApj]AuAyhA~{AAAYA-AA"AKAߡAA9zAAرAXAA!AGA8AKAWGAjXAjAhuAmGAp|AjaAdAZ.AQ&AWQA:?AL$AuA+FA-{A#A,AJAQIAC;A"ܨA/GA4hA@?lAQARAY'AfAky:AlaAmAldAk+AlIAm%TAnQAnYAlpAmAsoAnرAnpAeE AbrKAfAiAq+FAr%Ar)AxԺAsAmfAqxAvAxeAyTA}1AA'A AAdA33AQBAA,ApACAGAA` A6,AAPAYbAc*AiAnFApAp6AmAlyAejA[5AcoAecAa-ASX2AFA)A8CcA=9%ADdAHCcA*DA,)A=>nA?dASA\Ac\AerAfZAf AdAjOAl\~AiAjRAjAlE^Al_"Ak.AoTAlAjFAe7AdnAf0:Af _AhCcApAn>Al|4AsAoAmJSAo"ArAv*A~'AA AAAA]AYAuAsA;uAtAzAAZA ;AX`tALAgAUAf41AoAsPEAp}AkAj#Ai)AfsAa A^AVA0SA^A*$AEAXW4ASߡARAJABA@pALKPAPgANAM/AWAXAa\)Ad|4Aa~A^Aa+AdAowA|NAmVA~VA|AxAxcA{AA.A&A/ADAA^SAaCA\&QAP@A?;ADASuDA\JA\OGAUQATAgAS6AOIAa&AepAeA]AVSAYƆAXAQSA;^$A0DŽA-JSA)A.RA) A1JA.uAB@AFIUAGi_AF'AD5AFADyAHgAOݦAU۪A_AbAe[AenAfoAetA`HAXUAT(ASAWT;AW5AYpA_ 9A`-Ah(AzAA A5AzMArAu"AyjAxHAz]A"Aj A` AZA?AA_Aa۪AZ AS=AHeA>XAQAW׳AYjATDAQjAPܨATA_Ac AeQAb$A^;AUkAUAS'AV0:APA?A?T;A&AÍA7*A5A*j]A8uAC8AB{ACmVADvAAGy;AG+AFGYANj]AZ{A^sAaWAbAcA`HA^AVAOAM;AO]{ARAUAWlA\AkNIA~7A%TA+AAw!Ak0Am?Ao+AkAoAsAwLAlA'OAlYAAoAA^A^AW}AMAJA@A@$AI18AJAMAN>AMAQsATAUA^]AcOA]ASASgdAR(AVAOA6nA*A(j]@OGAAAAA'+A-j A?uDABAEKAGoADAEANoAXAaXAcAatA]/=AX&AURAPAOmVAN;AS9%AUAXrA\[AdAu4A| AtFA+A|;uAeAhAgvAdAgdAmApvAy8AjA9AA5A]ATBASAOAH1AB26AFAHrKABKPA9tAKAN@AO,AKոANuASAR&AQPAVCAZAR-AMAR7ANMA1ߡA& AAAAnA5A"A(A1cmA>yACAAHTAO,ATAL1AF*HA:OABZA@dA8MA1A*A^AwA!A)sA#A A!A >A3"AJaANAJABOAAASoRAX5AXA[NIAb>AjIAjqAgAhAiAjArWAy,Az6AA*AA_5/A\JA[PA[AXWAX-AR-AN.AKoAI33ADA@ ABMABffA=kA5GA)MA:)AIpAE۪AQJAT.AOAKRA8\}A%lA1SA4gA'CA%9A'^$A(A,A)BA#ӽAxA$A"A4A>*A;A@AC}A@bA=ACAJ$AN'ARAVAXAUAS?ASnAMAKoALFATDAZA`AgVAe!]Ae\AlAmbAoKAp~Au`A\A[A`\~A^A[arAXATAVAK-AEAEjAHAHQAH2ABAKBzBBHBBBGB)B BRB\BxBsRBs{BY =BYGB;(B#fgA\)AAAApA33AAAfgAAݮAA\)AAAfgA=qAfgB BffBBB-pBuB\B}BqB.BBLB{BBBQB=B=B=BW B >BB\ByBtpBPB2 =B =B GAHAAzAA >A癚A͙ADžAȏ\A\)AAřAAA >AzBB B(BGBBpBhBw33BzB#BRBQB.BBqBBpB\B(BxBwpBB|BRBkBI B#HBffBB pB B QAHARAGA(AAGAAABpBB(B {B =A{A =BffB\B B (BffBRBdB\BBGBkBǮBBB(BW B)B)BBu\Bu33BxzBvB)BLBEzB!ffB33BffBB9(B3 BB B >B.B\)ApApA˅B33B\)BB=qBHBBAHBB \ABpBzBzBB^QBBLByB#B.BfB̮BҸRBaHBBB =Bn >BYBGBhBkBt=qB-QB{BB\)B:BGfgBVHB/GBzBQBB AAABQB!(B0B1fgB&B&B\B{BzBBRAAfgA BB(B\BBkBBQB#BBGBBW BǮB{BkBB[BBfgBMGBN BD{B7 =B&B%=qB1BA B?33B.B AB GAHApAA\AAffB%\BI{BRBHffB4 =BBQBpAAGB\)BBpB pB.B@B^ BVBU{BFB"=qBL B3B#BzBBBڮB.BB)B\)BǮBHB BBvzBFB8BEGBBB; >BH BF B@ffB6B4\B%QB){B;33BSARAAAfgAB GB@pBIBJzBB \)B$B AA=qB BB${B9(B9B?{BYRBWBk =B[{B9(BJ{BBfpB BBBBȅBɔ{B#BfBB\)B\B3BpBMBLBF Bq=qBBBQzBH33B2B&B+BJ{BxB.Bp33B433A A\AمApA =B5BKpBPpB!AzA\)AffAѮAAQBB B!\)B33B' B6(BBfgBQBpB=pBpBppBe\)B`BB8RBBm{BIB-\B.=qB4BnByBdB=B7B$pB AGAffB(B=BzBZBGBA\)AA A\)A{ApA{A\)AzApBHB9BkBB33BHBBYQBQBjzB\)B\)BfBB#BzBBHBBW BB~fgBBbRBUBdQB~BGBBUzB; B9BF =BUB] BZzBQB5B)(AApABQB*GBZGBR(B. AA\AAAȸRAzA˅AHAfgAƣA(B=qB.{BBB33BBQB\)BzB_QBGBt\)B\B.B{BB=qB >BfgB\CBpBƀBB{BB^QBdfgBBBBr\BQ\)BM=qBXBZRB<B? BRzBOpB(\ARAffAABHBC(BCB;BHBB =BAffAHA33AAAәAB =BBYB(BffB=B\)BBfBB{A\)BBPB>BQB.B.BkBB=qB#B\)C:CfC C fBB=qBB33BQBQBǮB\BsBfBWfgB=33B?BcHBBIB"\)B=qB >BB;B=BBUB`HBLB8ffB1B'BAApAAAAəB BDBszBt =BnBaQB^BNBEBMfgBQB[33B^\)BnBxpBq\BY B8BBBBB8RBqBBBBgBB(CBC'kCLٚCm:Cj{C-ٚC B33BHB}BB\BǮB=BiBIBDB6QB.\)B#(B0B2QB+B1B-B1RB@BN34BSBNBKpBGzB0B)GA A =AAGAzAGB BJB| BnGB]BL\)B/=qB733B@ BC(BBBQ33B[zB]33BXHBRB =BHBqBRBBpBBLBBBC{BC aHCw^CHCbqCxRBBW B(B)BŨB>B\B33BM(BMBDB BB B=qB&B2B-B.B;{BDzBK=qBO\BVGBXBHBDQB%BQAAǮAAQA{B33B5B2(B*(B2(B/GB<B7 B>\)BGBN\)BHB@B9B9HBBHBzB)BBBBHBBBBB8RBǮBB=qCC[C޸BaHBC33BzBBǮB3BBlpBDBBB%B B4BV{B4B.B.ffB,=qB7HB>BJ33BTpBVQBSBIBBB>B B AA =A33AυAfgAB \BBB+BF >BS33BKBJBIB1(B4B,B4B BaHBBB\)BpBB\)BрBaHBٸRBzBǮB{B)BߞBRBQC=CRBCGCCHB B >BBByQB]B=(B! =B(B=BHB<B4zB/RB/B6=qBABIBG\BQBOGBHHBE33B<B@RBDGB*=qB RAADžAAmA(BBB.B9\)BNzB<\)B-\)B'zBRB) =B/BOGBL=qBMBhQBuGBW BBB#B\BBB8RB8RBBЏ\BB{C8RBBBpBB =BǨBBCCB=qBBW BŨB B\BXB;\)BEBIBIBDB6B9pB9zB:B?ffBCGBH >BF\BABBBI{BNBUBU BC\)B!(BpAApAQA =BBB.{B% >BQBB BzBB(BDB[pBXQBPB^ =BxBp\BwQB BǮB.BB =B\)B{BBB(BzBuBW CǮC%EBBBǮBB¨B{BqC hC !HB{B =BڸRB\)BBu{Bg33BVBKB7B6B6BD =BH=qB3HBBMQBHBDBKQBzGBr=pBqzB BƞBĨBQB\B(BfBB~33B8RB#B#BBBBBRB BBzC50C Ch0C$BGB34B(BrGB]RB[B7RBGB-33B%B)B\BB*ffB9B@B:\)B"B-=qBARBIBYBa BW{B$=qB B&BBHApB!B(QB'zB (BQBBBB"fgB8ffB8\)BBHBUGBUBJ\)BBB >BB{B~=qB{BBB\)BBBpB =B)CfCA8RCaC0CJ=BBBY=qBrB^B_BDpB>\B.\)B,fgB pBpB*B5HB;=qB9fgB+fgB* =BIBYB^(BqBoGB=\)BB {B zB {B BB!33B)BpB HB BffBB >B2zB2QB9\BKGBF =B133BBQBRB\)BGBGBBBuBGBBBRBǮB{ffBqfgByB{BHBzBffB3BB)B{BC{C\BqBfB =B(BBBzBrGB\zBQBWpBHB:B*=qB"GB(BHB1BKQBWBVGB\BD=pB8B$HB{BBRB\)BBBHB\B RB (BGB\B(B(B#B$fgB BffBzBBBuB\)B#BǮBB\BaHBzBB8RBnBa\Bj(BwBfBLB=BW BBB{B33C{C B(B\)B)B\B3B\B|QBjBo >BhzBOB;B*pB =BQB3QBEBM{BR33BMBSpB+A33B B&B!B&BBBBB=qB B\BGA{B RBBBB\)BRBB >B\BBB >BqBBfB >B\)BBB{BHBkzBd33BsBLB|BRBpB8RBB{BBC=pC:C zCٚB.BkBB\BQB|BHBhBO B8BB"{B6BNBXB\BUBVHBIRBH33BzB_BGffBW\BaffBF=qB+\B#BBffB BGA߮AA\)A癙ABB zBGB BffAzBBBaHB33BaHB{BB33B=BHBaHBqBBBBGBpB=BpBLBB3BkBB8RBB(BQBffC)C>CC)B#BBB=qBwzBSzB,B\)B&=qB6(BNBVBSRBWGBa =BTBSQBcQBcffBgBjGB\BKpB5B+QB%(B+33B+zB AA =AظRAA{BBpB!pB$BffB RBRBuBBBBBB.BBBuBpBBHBB=BRBBBLBzB =BBkBBBBGB˞B݊>BHB֣BB B癚B\B B>BqBm{B;ffB5\B=qB'B7\)BEBKRBXBZ >Be=qBi\Bc Bc BvBp\)BFQB=qBBBHB# B#33BAApA33A܏\AB BB-pBLB8zB,GB-BBfBBqBgB{B33BB BpBBGB”{B\)B >B>BBBBB{BfB\B\BpBRB{BЀBffB33B\BǙBBBǔ{BuB#B\)BjBMB#zA{AB4{B_BoGBuHBz=qB#By33BhffBZQB`B:BpBB pB\B GBB\)B BAzAQA\)ApBzBB4B6\B/ffB9BǮBpB\BQBfBBBffBB33BfB33B\BBaHBGB3B\BBB3BBB\)BǮBBBfBBpB33BkB#BkBqB\B=qB8RBB]B*=qB\BB7zBxpBBpBB{B B`QBSQB5RB%B&QBB B B =B >B =B33A(A\ABBB zB BBBffB+Bn\)B{BsBhBaB\)BBaHBB)B.B(BB33B BBL\)BqB)BBuBBffBBW BB{BW BaHBBXGBQ BAQBJ\)BUpBM\)B[BB{Bd=qB;B3 BHBl\B3BzBz >BwBr=qBdBazBVB>B$B B\B B B BRBQB!pBBGBB33B (BBLRBUBB33BMpB[33B|(BpBB=BzBBBGBBB3Bȏ\BBfB{B8RB=pB B)BLBBW BkBRB)BtBT\BAB6QB@B#BNB{=qB#B|BHBIzBY\B`(BiBs(BhBgBfpBhBjBeBMB;B#\BB(B RB!ffB$RB4fgB5B,RB'pB{B\B B#B$\AOAa0AgAcA_A\AXARAS,_AUaAUA]qRAb@AdAf9XAi:AjAexAeyAfAeAdȴAdMAgXAhwAgjAdTAgvAgbAd5AiAj[Ah!AhbNAdAcaAiZAmAuM$AyHA}AA9XA\)AAQ-AVAXAXAZ4AWpAWލATRAS/AQAM AUi!A^MActAenAdAc{AaA`A`AaAaAddAdAdAb<A^AahAaAboAaAdqSAdUUAcQ=A_lA^}A`AkArAvAFA~AzAzgAzO0AK ANKANtANjATvAXAYތARe AN7AJhAFoALATA\A^i"Aa.lA`AbhsA]FAZ@ATAXrAVATAVխA\A]=qA]7A[`AZA] JA]AaAeKAc.lA\bAVA[ AaAlAsyAwAx-AwzAwAH]AK2AI AM!sARAUEAV^5ATAPFAK7AIlANATB8AYzA])A\,A^{A\AWVAUhsAP APBAPTARAWUAYCA[ukA[`AZI AZ~A^hAboAk7LAnCAh|A`UUA]AhAkrApmAv-AzAlukAo+AqAoAjAk6AkAiAiGAi AikAiAjfAO""AOxAL ALAKAM)AH(GAJkAK>ANARAOANPAP+AJ~AD A6 A3?}AD*AHAIxALAIYALAOATAUAXAcAc~KAd|AiAjAgANAQAY9A`6Age AhAiAh+Af`AixAhAfAlAlZAkAkAjO0AiAitAhvAhψAjI AnAI\ALӠAGyAGAI\AJJiAGiAEDANAQ33AS ASASAZAS AN AUAN""AI AF~ALMAI^AJALQAMAO'ARzAUWbA`e Aa^AbzA`&A]ATA\AUAMAOHAW5A\A\Aa >AfyAioAk AfAAc3AbYAcAdAfYnAh\AhAeAgӠAjFAiAhAf>AgAidZAj|ARlAXMAR~AJ{AAX7AW7AGA@A9_A$$AAAtA+aA?LADuAIAYAWARARAV =AO AJMAKrAMALALdAI6ADSAFARaARAI]AElALAQuASASAZ+Ah Aj AbA^&;AVDAX A^A0ARAMAA!"ASIA A g@ݤAAaA A A1A2AOM$Af~KA_A\~KAXAVpANACAA^/A_ukA_>Aa"AeAhA<AHrA:[zA)A&oArACAPխAQaAG?}AIAKbAQ+ATA\@,A`B8AeAd[zAd33AbAA_z3A\TAX4AVxAZ7AZCAY:AY!AZ33AYKA]CA`,`Aa Ab33A`A\oFAXffAZA\A_$.A`Aa~KAbAcgA>A>oA=%A;gA-yA%@A\@խ@rAG@$A(GA AA[z@T@ @⪫AA%A4A8ANALWAE׹AEA?tA?kAA ADmAP\)AR9XAJ AHwxAK AK|ALAS|AZA_cA?XA:0xA6A){A@@AABA|A-@ݎ@v@Lu@/A \A'A)A%A?MAESA? A6ӠAAQjAOAN<AQ AV{A^Ab"AaA`tAa+A`YnA^/A^A_2AaAbrA^A_@AdAk*Ar:A7A>ZA<A8{A5yA7A6ƨA+ A@9X@O0@@@ @@*A׹ArA PA*|A5kA'cA-A(ƨA*oA)jA"AA8[zA=FAC AEAFAH9ACZADAEaAEtAHhsAJBAKqAPjANASkAQRANAM(GAIcAFMAIAOHAR7AKhsAI@,AMCAQ/AWAA[3A^A^A]OA[A\=qA^/A^A^A]ȴA\A\A]A`H]AfJiAlAqA$A8:A9A5dA81'A:33A8A5A,oA$A DAUA׹@@@@*@AUA%?}A2A2A2A A+A5eA28A6 A@[AD9AD AEAD,`AD4AEAFAGtAH5AG\AJAS&AOuAQ8ALtAJeAJ&AHAL1'AO-ARAAWAOAGoAJdAPoAVAZ]A[ƨA]WaA\A[VA[KA]z3A]A]ӠA\A\rA\+A\*A]dZA_|?Ag׹AnzAmAhsA(RA1*A6A8A: A:FA94A90xA0oA"A&A*{A%AA @AA/AO0A%A cAA)}A'JiA7A;AA`BAAABuABA>>AAMACAB?}ACoFACkAC&ADAGDAMgAM4ALpAIAJ8AIAIAAJ*SARAN\ATQAU AO>AHĜALgAQAV\AZ A[qSA_A]-A[A\A^MA^aA\AZz3A[A\5@AZA]'A`$AgFQA(\)AA$XA2A9CA:A8ukA7A8+A4\A-gA$A$uA7A)tA#=qA AA(@A KA/A#SA IAA.׹ABbNABhA9XA1A3+A5A8<A<8A:+A;A=wxAA33AC/AEpAG:AFAGAGEAE+AGjAFZAK]AH$AJAMAPcAJAGAH1AK&ANATMAY7A^AZAYoAZA]/A]LvA\qSA[ A\7A[wAZ2AXȴA\*A-OA- A)ukA+~A!PA.<A6aA1A.A-&A'(GA#;dA33A,EA.$.A,bA#hsAx@@wAAAA Wb@A gA!A7e A4A3A-A' A#A,єA0KA-^A,A1M$A9[zA=A@A?1'ABAFI AEAEADbA=A:єA<0xAE<AGcAEXAB@,AC'ABYnAEFAM =AS-AW&AVpAUӠASASAVAYȴA[A_B8A_pA\A-WA0UA)AAAA&;A(1'A'YA#H]A#JA"@,A A5pA6`AA0A%MAA#ӠA&uA!A KAvA A AA A4A=qA(ffA+ A,A*A'A(0xA%A+ A1}A7A@BAAAF AHAH!AGgABjA=^A;A=nA@A?uA?A@A@;A@(ADAGCANAUAV>ATAQ>AQAQRAT%AVtA[9A\AYeAVYnAT A-A/XA&A@,AA>AA#`A%A#AZAW}APmAP-AOgAK8AMFAOASKAUeAVgAU;AW AUAWA, A*A#,_AA A A qSAAVAAAA jA#1'A!\)A%VA)\A&A!8A$A|A%5?A !sA A +Ap@X@/A""@ukAAA~A&\A*>A-A/eA/SA0A7gA@-AJWbANAH4A@AA@$ABABmAHi"AN6AWtA`|A^AUOAP-ALAHIAGqAFoFAGFAKAN AS&ATO0ATWA!.lA#&;A AAYAAAAAArAA4ArAAAA MA A ~AA!#A@,ARA#A7AA O1@V@G@(@AA @7A eAA2A)A3CA6VA&HA vA$jA,A.A0,`A4KA7A7A=׹A<\A;-A;cA?aA@ AB/B'pB/QB'=pB zBBpA\A\)B6BfBwB BpB33B =B3B=BBBǮBBz(BjRBgB}BpBffBRBLBB\BB{BB)BB{BpQB633B\)B{BRB(GB({BGBpB!pBRBffAAA=pA(AHB4B8HBGpBvBB(B\BpBBffB =B3B33B|{B=qB)B)BBBx\)BNGB)BopB BBBpBBzBzQBG\B, B!\BB HB%RBBBB B33AGApA޸RAA\)B =qB B'QB^HBi =BBpBkB\BB=B33BuB33B\B.B=qBBhpBV{B=BxB=B(B=B8RB >BBt\BRpBBA\BJ B.BBBBB BpBBBqB\)BBuGBVBmBB3BkBBBBBxBiRBFB*B'HB&QB =BpBRBHBB=qARB\)B\B B BQBGBB*QB1pBIfgBBpBBBzBBqB.BQBfB\BBGBfgBBr BW(BgHBh\BtBuBpBBuBBBjzBUzB<B,RB&{BB(B=qB{B BRBBB\)BHBHB&BA\B7 =B&B.{BXBLBLB=qB=B\B.BBzBB\BBBBQBBBnBa\)B[BXGB\ BWpBaBaHBfB(BpBLBfBOB>B5\B%B({BHBBBB 33B pB\BBB GB5\B/=qB$BQBABwQBaHBB)BpB.B\B3BBBz34BqBBxBx\)Bp=qB~GBBzBh33BWpBHBCBV=qBBkBBBBBW=qBHBHRBL(BFpB4\)B:\)B>B233B%BB B BBffB33BHBzBB$zB?BqBz(BrBvBt\)Bd\BnBp =BeB_{B}B(B{BfB\BOB/ >B7B1ffBBfgB9BB=qBq\)B^pBSBIBQRBt33BLB\)B33B{B~33BhfgBbB[GB_BXpB`BP(BZzBgzBGQB.RB33B(BHBBB GB/zB4=qB3BDBYzBa\)Bi\)BOBLBDBDHB@BBRBcpBrRB#BQBBPQB& B3BpBpBRBpB5\BoRBkBs\BuBXRBABCB[ =BgBzpB|pB=BB.BpBfBc{BO =B6pBEB^GBwRBVpB3{B/{B&=qB"QB!BB\B&pB8 =B:B-\)B1\)BGffBDGBP\BN BAB(BB ffB%B7 =B[BqB}Br33BMzB<(B<\)B(B=qB\B{B2RB`Bs BBqBWpBQGBVBOBRBzGBB}{B\BB3B3Bo\)B[B?=qBOBTBVBLzB>B.B'HB$ BBRBRB =B8 =BCBTBH{BNpBKBN{BO{B[33BC B-B%BBB7(BH =BG\B;ffB9B5QBffBRB{B\)B{BRB2B=qBBoffBaHB|\Bg=pB`Bm\BBRBzBBBBBB33BBB)B BbBYBUffBD(B< B0B(HB%BHBB=qB%BIBbB{Bj=qBZGB_zBS(BLGBCQB1GBRB33BB"HB* =B+(B/RB)B =B\B{BB\BGB33BB{BSBQB?QBo(BB=qBB>B)BBB=qBB{BBBBBB#B(B.BBcB\zBT(BFB;HB8{B1B)BB(B33B7(BBBB#BiGBeffB]RBQ(BEHB7B-{B'HB+ffB-ffB0GB.=qB)ffBB33BffB{B =qBB zBB (B BzApApAQB+BmGB BW B>B{BBpBpffBBQB8RBfBW BBBBBBffBRBqBiGBHB@B:B6B%B >BBB3{BgBhBM >BEGBTpBQ B^B\ =B<BBDB8RB*QB-B,B'BB\BQB B(B BBBApAAAQA(AAAHB. >Bh33BǮB)BuB8RBB=qB\)BBLBB=B8RBgBpB>B\BBBBffBxBYffBFGBBB:(B.zB B >B\)B\BC =B=BCB=HB433BGBTB_ BcHBIHBQB5B QB& B+\)B%B+\)B{B BB B(A33AڣAٙA=qAzA=pAA(ABGBB)=qB\A{B%QBSzBp\)Bl=qBwBdHBaffBgGBB)BBڙBaHBBBB\B>BBBB\)BpBB{B{Bm{B733B\)B B =B zB33B(B! B*B1B/BB\Bh{B~RBg(BQQB=RB=GB<(BAB= =B1pB B ffAAAAAA(A=qARAAQA{A BRBGB1HBrGB B{BB/QB]BcB^B[B^pBoQBQBW BkB{C޸CBzBaHBBzBHB#BB)BkB\BfgB B{BoB{B pB BGBB"B\)B!GB" B-B6 =BIzBQ(BZzBZ =BRBVffBV\)BW=pBYBK(B$\B AGA(AQAA{AAQA AA AzA\)A݅A{B-BGB)BAA =A=pAB3QB'RB+B5\)B1{B' =B*BB~\)B}B\B}pB{Bj =BO\)BBLBBBGB=B}QBHB\BǮBB)BǮB Bl\)B7B9HBOzBApBAA=pAzAAAABzBBBQB@{B9B9 B?=qB)33B(B(fgBaffBlzBsBafgB^RBsB`HBrB}{BBRBBh{B\)BffBe Bw(BBB\B8RBBBc =BQGBM33BF=qB4 B3=pB$ffBQB =B\B=pB'BCBR\B_33BbQBZQBR\)BR(BIpBL(BV Bi33Be33B:BRAQAQAA A(BB$B4ffB#HBHB BB2RBBBHBCGBDffB@B*{B >B#B9(BdzBe =B`BpBBuBBrGB^B8\B#QBGBB\)BnBfGBbzBrBGB\ByBoBmBnRBaGB[33B1B.(B(BB RBHBpB+ B@BU=qB^=qBYBRzBQ(BSpBcBeBhHBjfgBrGBJBB(A33A A(BRB zB"pBAGB8ffBB GB RBB2QBiQBnRBBV\)BIBI33B;B,B"=qB\)B'=qB6B9zB@BBLBB>BkBaHBB(BBBw33BBmBXB?\BA=qBMQBI\)BKB^ Bq(BcHBT34B1 >B\)BB/B,=qBB =BB6B`\BjBZ(BP33BNBfBr33BtBn\BepB_\)BBW BfBd33B[Bc(BzBBRBNB.B33B!B!B pA\A\)AAϮA\)BzB^GB>B33BBfffB[GBbBdpBjzB@\)BJB_pBOB3ffB?\BOpBUQBDB6=qBBHBKQB>\)B=GB?QB>GB;33B-B,{B3BY(Bd\BjBg(BS\B8\B+GBRBApAƣA\)A(AQAA{B33B BHBpBB 33B \B3BqBBm\B~pBkBBmB_B5\)B0{BB\)BBpA33AQAzApABzB?HBI Ba=qBPHBUfgBI\Bh33BRB =BB1\)B6BO BYGBwBi\)BSffBK{BOBQGBLQBCB:B9B5B0(B>\B2=qB?\)BFRBRfgBRBWBUBF{B7zBBBA]BB QBHA{A A AA\B=qBBBkBB=qB`B:BL33BC=qBFfgB:B%BGBGBB{AABBB33BpB2B.\)B$RBAffBC{B2{BHB0 B?=qB7BHBbBBfBrzBu\B^HBX\BN=qBBB=(B:(BDRBXBopBBR BDGBUBO BVBYRB_BZ33B3(BBHB BB >B pAA\)AHA =B GBB\)BLB8RB\BGBBBg{BQ=qBS BIffBWBCB/=qB!B'B\)BBGARA\BzBBHB"QBIpBVRB>GBK{BFGBRzBT\Bf >BORBLBdHBwBBB>B{ffBbBPzB@B;B=RB?=qB`B^QB0pBGBQB:BBBKB](BmpBqBK\B2(B.QB'RB B =B{BA ABB=qBB"HB B# =BBBB~{B|BtffBbB_{BRBVB]\BZzBQpBEBC B9B)RB ffAABQBBGB{B8B=RB8=qBLBQ33BaByzBBs(Bc =Bd\)B}RB#BpB{BB`GBBB<BDHB?\BABWBSBCHBFBFB6B>\BBBNB[33BW{BKzBFRB:\B*B+B BB B (BBQBB BB$RBRBLBfBzB{Bv\)BdBUBWpBbzBQ BU BTRBTBMGBXBQRB&\)B =ApAB33B HB B+=qB:\)B@BLRBFB[BtHBwB]zBdpBqB=BBRB8RBGBJ\)BEBDBCGB>33B=BNBUBF{B9(B$zB'\B.B:B?BbpBxByB_B^=qBHpB433BB BB >BBBB\)B#GB3=qB\)B\)BkB3B\)Bk BRBLBFQBGffBMBvBhGBSB`BaBg33BZfgB5GB33B =qBHB HB(BB&B4GBEBCpBUBHHB'B#BMzB =BBB\B33B@\)BZ\)BqB^BMBI33BJBEBCfgB0B!B"B B B.B@BhBBLB\Bm\Bn=qBGB&BB B HBGB1RB"=pB$ B.{B:BQBaHBB=B{\B\BM\)BGB?B?BGBi33BkBVzBrBBB{BfB<(B:B! >BffB$ BB& =B)B@\)B,=qB0 B\)AB\B/ >BFRBZBB\B^BGBKGB|BBoBVGBVQBSffBM BHB3B'zB B BBJBo=qBzB=BGB=qB{\Bg =B2zB"BBffB#zB)B+B+B,ffB1\)BaHBBzB\)BW BuzBiBbBI=pBKBWBTpBuzBBBffB\Bo BqBZ=qBQ BFRB2B5 =B'{B$B4\)B3B0B"33A >AGA BRB"ffB.B-BcBhBGBpBfgB\BqBnzB^B\BYBWGBNB@B1B#{B.pBR\)Be =BuBB(BGBByGBJzB?GB4\)B) =B*(B' BǮB.BBBuBǮBBjpB~BspBpBnHBaHB{B=BkffBOBCBW >BVBQBGRBGRB8B2\)B=B;QB/(BCBHB-=qB$QBB BB$\BIHBQBDBb\BBBqBuB)ByBnBY =BQB[ =BVBFB;B9{B>B]QBb(BmzB}(BBB|\)Bj33BT34BMB7B6B0GB)\)@;AA A#XA_"A@2@@O@.@AňAZAtAWAAA.AmA >AGAJSA ATAHA A cAAZAA7~AARAAAPA~/A ]'A&A)A,zA,(A+LA&YA"8@@i`@@ @g@}@HW@mV@I@@`t@A4A)JA>A AA LA7~AAAKAcAAA !AAA A aA$VA&A @A$AAQA'A&A"]'A%A"A%` A7~AA?lA}@h @QB@ڬ@@Y@%@$V@V@D @@ҳ @-@@P@AgA.AA[@*@.@@@AAaAADA3AF\A AOAvAAAA;!AuAAnAA A{A/AA<@/@ @U9@_@R@F@E@@(@T@z@i @$@@a@|3@@ @@@*@(@@AXA\~AA}AAcA ?A -A1APA!]AhAlA A {6A A_"AAAAu@ƀ@OG@@AfA)@I@I@41@X@+F@~@/<@"[@.@@z8@<@?@@b@ @V@l@ԺAAZAAi`AAܨA XAA/A*AAA sHA AAAbpA 0:A AA AIAA.@k@ӗ@'AAsHAA8@@v@䎳@@OG@@1@9%@J@@O@'@d@5@ݔQ@ևo@>n@p@vAAeA1A3AA:AA A AAcA AlA A}1AAAwA dA AtFArKA YA @@,C@C@@F@9z@(M@@`@矌@w@B@=qA=@F@Da@KP@K@@:@]@@,@i_@@k@@v@E AaA0A 3AA3A[A^AA RA)AAKPAACAfA A VA pA 3A rA@Ǵ@@@خi@;@W@(@ @m@@ @?@A@lY@ =@ڎ @ح@N@6@@]{@y@@&@{6@5@6,@A&AcAIAi ArA AQA:A uA @@@@@A.A\AA Ȃ@M@ҿ@/@ƼH@<@ͤ,@]&@dz]@׿B@c@)@_@迖@P@r@@@m@@o@$V@C@|3@ܲ`@K@N@[+@P@ @b@V@Q@$@q@v@q@;!@@TAlA ApA A@R@@A@+@ @@g@v@@*A:xA`A@X2A@f@W4@n@]{@@@P@@*@@-@rJ@n@ޣ@&@ٯ@@?@@@6,@޷@٪@H@"@u@vB@ @N@@8@R@@J@G@r@.?@#@@VAqAyA0@J@o@@@@@m@@@@#ATADAALAAPAg@`t@ߒU@'O@Ǟ9@ @j]@@<@E@X@@Y@$AAdk@@`@i@S@>@P@ᡇ@@@$@n@@j]@ @-@k@E@ݮ@@ň@Ōc@K@@l@w@\~@T@9@3@/@)@@C@r@J@@NAA A hAA KPA A ]{A=A mA P@,C@ċ@@@NI@ @@<@e׳@|@b@@-@ɮ@E@@&@G@@ 6@y@@浮@$@ݖ@2@m@nT@Q@@Z-@@@H@ڴ[@g@ANIA"@'O@t@:@lX@f@y:@@X@@S@A@흑@=@ٮAA[A NAAWA A`tA:AA A A]@,@Ոl@M@@ 9@}@c+F@hC@wLN@f@i/@@d@@ɕ@9%@&@C@/@@k@u@ @A@OG@Ԧ|@@@"[@@@@=q@ 6@ @{A&A@?@쒪@S@@'@Q@@@@6@ֶ@쿖@s@@@ӽADaAbpAAiAvAA ,A A A bAPAAA3@%@@@k@ioR@u@q@ @{PE@ucn@^@w@\~@&@=p@J@s@ڐ@1@@@A@0@^@@ȓ@$@ͨ"@lY@]@@ @$@럌@8|@췩@d@u@@@I@ @'O@@@@}@ⱷ@ @@@9@@OAAAAAwAAAA >A A3ANA A _@9z@sH@Ȣ@@b @Y*@s%@uD@y`@l@8 ?m@^@@P@K @^y@@VA@@@@[@L@X@i@|@ @7@Ȃ@"[@Z@@B@u@d@-@ݦ@z@y@L@@/<@b@f@@@ @Ի@rK@4@坐@@@:@AA@d@ ABAXAߡA A A GA h@h @@\@ff@@r@hV@6ň@=׳@9U?¯?h@u$@lv??+@@y*@Uh@@Y@@@@״@R@5@@j@@ӽ@@:x@ߟ@E@}@-@z@@׳@Ag@@0@쒪@@`@@@/@Da@=@c@=@W@ݙ@G@@DaAA!]@(L@@A0A<A @A >nA GYA G@ҿ@ĥ)@@@ @GZ@l#?]f?0@B&@@On@G@@[?ĥ)?2@^nT@5@@r@ڌ@ǧy@X@@*@@@ɭk@{@~@^@ͅ@͙@3@ѩu@؛@ٶ@@@{@ @` @ޜ@ވ@,@R@@a@׳@@t@g@7A"ADAnA AkAAuAA_"AKAA`@D @k@@"@@pO@X@`_"@T^@BN@s @@i=@f??9s?Ƈ?i@H@@@=q@s@{@l@[@@ =@Ɔ@%T@@Ձ@R@@D@p@Ǩ@e@ч@۷T@`t@!@$V@@m@@7@Z@8@@ԾD@@KP@ۏ@@-AA!A:#AAZA^AZAiAMAA` AAA ArAX@E^@n@z8@@X@@v@h@@@"@i@25@@5@0:@@ݿ@&Q@;@5@(@ҸR@Y0@5@@hb@ؓ@̙E@%@ӫp@F\@[@X2@@@{6@j@A@y@A9A&AHAAgA AXAOA@|@41@7@x=@J@o@p@@,@~@;@1/@?Wݽ̂@?2@@d@Q@/@07@bo@lR@@ @@P@ @@@e@'O@h@$@/<@͏@ @@+@f@%@ޒ@2@@8(@@շ@^@޽@U@:#@"@@M@خi@ۣ@-@@,@r@@j@@J@A5AHAAPA!A ٯAkAA@O @vIU@0@@|@Ɔ@|4@@@ @@-@@E@#@C@oN?4@)@<@gs@y@:@]p@ff@׳@@@@b@C@@@u@+@g@(@Y0@ȳ@?@@uD@F\@:#@Q@D@@“S@b@@؟@?@௻@@^@|@ϼ@HW@t@i`@}@y@.@@;@@QAACA۪AAA tAW@ql@@i@i\@@@ar@U9@~@@j@%T@ _@@@@R@ @j@K?$u@77*@}@@t^@=@M@G@HW@@*@@y@Y@o@,@N@9%@@H@ @0@0:@χ@R@@@O@Z@¹@?l@HW@!@X@5/@\}@@"@՝@ڭ@ܨ@+@ߪ@|@ᕣ@d@W@AAA =AZ.A|A~AU@ @@+@@u׳@cm@$@@)@i@@@j]&@[+@@25@ @T?C?f@h@M@%~?@/@{@p@gd@i@Be@s@sC@6@@@@@m@@@h@@9@@@Ɔ@N@!@@@k@1@6,@7~@k@Q@؊@ݞ@@@*H@N@݃#@O@ AmAD A |AG@t@@Y0@n@4@#X2@N@e^$@nAg@Y*@_I@j~@^@c@3@GZ@ ;@q?@@ߡ@m@#(?@@$L@OY@)t@@@:@zO@@R@@K@~@j@"@@.@b@@@'@*H@Ѳ@Ŵ@(@F@.@@lX@#X@@@h @@ @_"@@H@-@'@S>@:@F\@h @-AAvA+AƆAs@x=@@-@@Dc@{@M}@\@aq@U @N{@O@e@|4@R@@ @@*@{@@yu@a@e@O >@r&@)?}?Ţ?D`@Bo@p25@0@@@"@@@@41@Þ9@e@⹤@y@ff@@@@@@h@q@N@.?@f@@@@DŽ@$@ @z8@@͹P@M@=@"[@@Ag@-AD`AYAAbAG@'O@@ݥ@ml@[%@%k@@2W@1@?@=@9Z.@P@it@{}@,@.@ċ@r@n9z@|^@@\;u@ ;@ @#zP>?>?o@K@56@7o@k5@n@S>@DŽ@r@@@ŋ@o@t@זL@{6@s@%@j]@J@y@h@b@Ժ@7@&@cm@#@@A41@Z@@<@ě@2@\@Ѩ"@;@@AA$VA)@"@P@J@m@Nx@-@=3@<@0?@7Y@<@G@Bֶ@ZrJ@v2@tu@m@|+@Q@j@]o@e@]3?ڬ@?`j?q?5.@x@?sH@'A@>Ah@cU@{M@@]@9%@IU@C@_"@@K@j]@m@GY@g@@@_@w@7@s@@NJh@X2@@{6@ٯ@k[@ֶ@Ȳ`@HW@@}@ΗI@߁(@bp@k@ @+@@@{ @h2@Q @\@Te@Y@6c?@4k@9?栉@0:#@7@"@@L0@fc@d&Q@n@QoQ@=@*%@(C@E!]?D *Q?Z?4?b?u@ ?@W5@/ո@$P@GZ@ >@b@@]{@K@Y@ @}@$V@@@@41@]'@PE@S>@'O@@ @H@.@Dz @D @,C@]{@Y@:@2@@@䚗@ⱷ@W@i@NI@@y'@ @@d;u@n@i2@Z8(@G(@6p@ ;!@$@@$ܨ@pO?÷T?~@ @*@u @a@^h@6.@D@!>@:B@5;@$;u@?l?ȶW??@@9@@?8@aB@@@@@@$@f@}@@@@@@@@V@@@>n@@0@@η@ @ڬ@+@rK@8(@מ:@-@@q@6@m@@,@I@@@@vvA@VS@?@/@?@Y@ ܨ@ ?H?@a@i@cٯ@5@@e@T@?@@1@G@ !@@E@+@@&@:w@W@%@1@u@6@GY@R@J@d@u{6@{@E@U@@`t@(@z8@x=@U@@]@@@ 7@@@@ 7@@ @P@V@2@Í@@`@5@@-@}C@@3z??@t@@#@ @FvA@e@]^$@lu@ @@{C@OK@8Y@.x@/a@@ O??@@O?*@@.@2 ;@%׳@3@*@?@0@J@@j@f@y@v@z@` @n@ @+@{@@}@i@c@@@OG@@@ד@}@ @X2@@ۚC@@@stars/inst/nc/sub.nc0000644000176200001440000002017013777653456014125 0ustar liggesusersCDF latitude level longitude time  ConventionsCF-1.6historypFri Jul 3 20:45:39 2020: ncks -d time,1,10 data.nc sub.nc 2020-06-30 07:07:13 GMT by grib_to_netcdf-2.16.0: /opt/ecmwf/eccodes/bin/grib_to_netcdf -S param -o /cache/data4/adaptor.mars.internal-1593500809.0007904-16187-13-88557124-d321-4eea-bab8-1367f56839fd.nc /cache/tmp/88557124-d321-4eea-bab8-1367f56839fd-adaptor.mars.internal-1593500809.0013933-16187-2-tmp.gribNCO`netCDF Operators version 4.9.2 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco) latitude units degrees_north long_namelatitude$level units millibars long_namepressure_level longitude units degrees_east long_name longitude$time units!hours since 1900-01-01 00:00:00.0 long_nametimecalendar gregorian(u  scale_factor?1D͸ add_offset@6|v _FillValue missing_valueunitsm s**-1 long_nameU component of wind standard_name eastward_wind (v  scale_factor?(А add_offset?1 _FillValue missing_valueunitsm s**-1 long_nameV component of wind standard_namenorthward_wind BPBOBNBMBLBKBJBIBH9R@@@@@@@@@zzwsq"p-qrtxfwtolllmnutpl&i8gfgeel-jQgd}c a_z^_]@[Z[d\]ZXY9RQtRpVL[^\VSSNPSTiZ~aNdaNXKQW[`dg#gbZS:ejlljgkd<`}\'lljohhDhj.l}o*lk@haffgirkdmn.liGffKfDeefRjigfff=cb a``6`cefb_]$VV[W\bbae2aZiSQR7TZ `Lc`DVLUWVYW[]3]HZbSK[]^^L[XVTQPtz}~|yGudqnuzyk{#yv`r.nSkj=qVss2pmjgfgek:ksj!h6eb``Ebb0`7^]\YVUWWuSRT VjWTcOMNL*N@RX\[YJQJOoQV[_^`>]UuNYu^cfff(da[fkJmm&jhe`cbfNjk&inf*ba a'behh f coa_`bdee'db`_`b^^s^d^_D^$\[D\lTS!S>VZ\2ZTPLfKMRX\ZeQHXMEORV{XY=VNFJRVeYZYW~TQMl;r,wb{|}E|{iy>qvyzy>xvuspsTsr_poxnmTmThJj-j`ji"fcbdvdKMOQRpPKIDLNQSTSSHQeMbglqCstuvTv[flpssgrrUrUqdhkllkjjj\_bde'd2ba6a=Z\_aaoa`\X:U]]~^__^XQJ_\YY(YZX$RfIBWSSLSSQMGBvO NPtRfSEST,RPIWZ]`]abNcd drRWh[5]^^^_`]QUDWYZ2ZHZ[]QiSwUXYKYX]X[TUWZ@[DYVTTWZUUVXWoSMIRO!NAOPQ!MFf?LJtJ{KLKKbHC>HI[KL^LmLKJHZ^wadgh5hijYX]boesfKeefRfKW[^``` ___QTWXY,X[WVUN8PSUVUSPPM;QBRU;WtXVS3M-GCTTbUfVVSNF*@kSQPPjNK|F@V<KHHNHG-G GQFcDT#V WY-Y`XXGXYJIMP2RR#QhQRRGSFIKLLLHLNOPGSHJKLKK~KM6JL2N9P#POMvK JNOvPQRdQaMHDlM LeLHLzLVJF+?p9HG F3EDHA=9[5BBB:B3A(??b?7>\I]]]^^`bmcUWY YZZ|\^I_OQSyTUFUyV4WMXGIKdLMMMMNACF=HZIOI#HaGlF@CAFKI2KGKIEBDLFSHK]MMIC?H HHhHIHD>;EVBA:@@AHA+@6>WWV~VU^UUtVVpHI4J>JJJjKLjM>@C&DCCDF8Hj;>r@B1BBBCJDy=<@CJFGGFDUC@1CnFIKKIuEnB8AC|EG|IfIE?9?@1@A&AA =573;.;&;<@<@;::19RZ]__^^`(b/d PSV?W-WWY\ ]H#JM&NOPR"SU&?ACEvFGYHHJ#79>;=?i@??@14W7;6>@z?>=w1j49w=BDD9@>+7(:>:@BDB?LW>>=\}\\ Z`XWXZ[JK2KK:JK2MOP;B[?@BD(FEH3n5_8:=3?I@AC037u;?IA3@@0A04j9I>bCAFEA@L16:?DH~GA,<4"7Q:x=f@B@?Z@O@AoBzCE346677!7E78)*-/M102223>#%r)"-145E45&).33b7w8766e-x/3 7;;9L8H8\e]^_^e]]_aSL|MqNmNNfNORWT=>?@<@CAGCFJ34h5686: <=>B5-.w0(2p46~798Z;])*x,/378~77%4'*/5;k8w&j*.E38<=:8a(-16w9d:99:XCW1U9R=OMPoUZP.MJ~I:IeKANRVFDCCE^GIL N=m>>>====>A^1}3J44r4?2113g"$' )`+R+*))[$+)',r,k*'3 "(9-11 .,!$(,/1122[]^ \Z WX[[_OONN*MNPcRNUBC~CC.B$ACaEaGKJ99::98838$8;=?h.../0|0X/04"v"#&*g,-,+9.#G)/)0P-*H &-"01/.;o Y&<,//c/1T3UYQoNO'PQ6R+UYLlGDEpGLGHLO>I<;;< =?AD./G0v01G3r6-8_; "$'2*,v.C1*3 $a'V*j7 $)J !'$-B &B '.5UQTR&TYi\]S]i_b$HIJN4Q0QQqRU":=?A+B.BDKFoIG+I.1{3347$9;>a"& )Q,q.0!3%]/H!#n%;'^  !M O#!i; :D %vLS_ЌR׏7ڎՐҺ"\\ؽۍlcܼ-[F{`Sb8.ϜԪ+˭ͧͼ˓[jZ̝>ӖҰhˣȀڨ@֩{҆3ǎŸƼȝj4vNrp2ϵȨ5. 3>$ɘ̱' 5o!Х•M-wˬ/8\ȓft?ׅsRQ*dٳo܈}V`Uۘ/]|SߧhވޗL #h۞"פڙHނp͞eՠQömМPɾ#=(D0Z͎׀ /ŃФՒh/Z]y$-,̯˵B6=U͕$h(yւ;ŭFeŷ;WǍŢպ87Oɖƈʑu̐-`+_cܪJҤ+J]ުO4xԘc߮zg3Xۑ`߹ګSםb;ߚ(ղҙӨ%c؍xH)Ԙʦ=ǘC2&dȒ2ЯVPdѷ oüȫ&նk·˜¢/ǰ̟dӍTΔuˤAKE,Իʀ2=Cˤ׿CʕǛeȁŻŜ)K 1%ˠQиW8̺[ѳmquϩQ'Ԙ]cOҭ+щ҃ӝXSn+fjqѨ͟иɌ5ZQwˁIJDx}Զ»3Kɂ=aLISǏ0Y3ÑgqĀͬ ՟b^@JۧޫxӿǏŅǤ֮а#n#`=DE*Ġc̿hȩʲW<&nI]Qk6:tZ:]Rp8E̶͇.=#j}wS/ֿb˒]>^4Nɧh`C( ̡Fhlɧ>}szÔŨNԝź侺É@؜™ĭΪӎׂ¸h`@E Xs *&k̿ _ ̪ c$x:|ͯȗ/o,tH>E]GQtټ55¼ņifT.Ơɏtݿ×ƵW~‚)Ļ߫Ct$(r?IưݬkI% Ƶɤ,sİǿ1ɤPj5]́"3S]ÄOhR`u .Qշ٫VǓ́im|Ǎ3uѤpηyU̖ˑʒxyΕpΕ]>HΛ=\rMo|=B'̠~1< 50a\[_4¡(1xNϹĆئخ5lVðؠy)(j 5TMת)?+ݷ>߻2bbiǵDѵǴnҴ? αjA!qO?. MB,@5Ǒ>{­ơɕԬf/L,6/]xɠpfį¯>I4a2_/|ą&G׷[şРZ۵:]gڱk.m?˶5 ;U (Ȅ̗φAUԾ_S_\W۲jԮBR߮,%Zo~lƷ:CXmXڼ EذVr=7vgmX:÷ǂˆ`NHιϳ>WO&c3˒°+\4˳= gO޶u[Z) >q,L?4ѺP/n+Ǿ̂3Ρ$A1c#ҕes٢Yѐ=Mܜ(Aޛomstars/inst/nc/ncdf_tidync.R0000644000176200001440000002061213777653456015422 0ustar liggesusers### The functions in this file are a work in progress and are ### ### not currently used by `stars` ### units_or_null <- function(u) { un = try(suppressWarnings(as_units(u)), silent = TRUE) if (inherits(un, "try-error")) { #warning(paste("ignoring unrecognized unit:", u), call. = FALSE) NULL } else un } unit_izer_ncmeta <- function(attribute, variable, ...) { unit_df <- attribute[attribute$name == "units", ] if (is.null(unit_df) || nrow(unit_df) < 1) return(NULL) unit <- lapply(unit_df$value, function(x) units_or_null(x[[1]])) unit_df$unit <- unit unit_df$unit_ok <- !unlist(lapply(unit, is.null)) variable$unit <- unit_df$unit[match(variable$name, unit_df$variable)] variable } # TODO # - allow stars_proxy to be pulled # - allow stars_proxy to apply select_var # - # examples # f <- system.file("nc/reduced.nc", package = "stars") # read_stars_tidync(f) # read_stars_tidync(f, select_var = "anom", proxy = FALSE) ## only works if proxy = FALSE # read_stars_tidync(f, lon = index <= 10, lat = index <= 12, time = index < 2) #' @importFrom units set_units read_stars_tidync = function(.x, ..., select_var = NULL, proxy = TRUE, make_time = TRUE, make_units = TRUE) { if (!requireNamespace("tidync", quietly = TRUE)) stop("package tidync required, please install it first") # nocov if (length(.x) > 1) { warning("only first source/file used") .x = .x[1L] } coord_var = ncmeta::nc_coord_var(.x) tnc = tidync::tidync(.x) %>% tidync::hyper_filter(...) if (!is.null(select_var)) tnc = tidync::activate(tnc, select_var[1]) ## FIXME: get this stuff from tidync object variable = unit_izer_ncmeta(ncmeta::nc_atts(.x), ncmeta::nc_vars(.x)) tt = tidync::hyper_transforms(tnc, all = FALSE) tt = lapply(tt, function(tab) tab[tab$selected, , drop = FALSE]) nms = names(tt) if (make_units) { for (idim in seq_along(tt)) { if (nms[idim] %in% variable$name) { uit <- variable$unit[match(names(tt)[idim], variable$name)][[1]] if (nms[idim] %in% coord_var$variable && !nms[idim] %in% coord_var[["T"]]) { ## we have a standard units thing if (!is.null(uit)) { tt[[idim]][[nms[idim]]] = units::as_units(tt[[idim]][[nms[idim]]], uit) } } }}} curvilinear = character(0) ## are we curvilinear? XY_curvi <- NULL if (all(c("X", "Y") %in% names(coord_var))) { cvar = coord_var[coord_var$variable == tidync::hyper_vars(tnc)$name[1], ] XY_curvi = unlist(cvar[1, c("X", "Y")]) if (all(!is.na(XY_curvi)) && all(tnc$variable$ndims[match(XY_curvi, tnc$variable$name)] == 2)) { ## AAND these are both 2d vars curvilinear = XY_curvi } else { XY_curvi <- character(0) } } curvi_coords = NULL if (length(curvilinear == 2)) { #grid = tnc$grid %>% tidyr::unnest() grid = tnc$grid %>% tidyr::unnest(cols = c(variables)) curvi_coords = tidync::hyper_array(tnc %>% ## FIXME ... tidync::activate((grid %>% dplyr::filter(variable == XY_curvi[1]) %>% dplyr::pull(.data$grid))[1L]), select_var = XY_curvi) names(curvi_coords)[1:2] <- curvilinear } ## can we create a raster? raster = NULL if (length(tt) > 1) { raster = get_raster(affine = c(0, 0), dimensions = names(tt)[1:2], curvilinear = length(curvilinear) == 2) } dims = vector("list", length(nms)) for (i in seq_along(dims)) { nm = nms[i] if (nrow(tt[[nm]]) > 1) { ## we are rectilinear, or degenerate rectilinear dims[[i]] = create_dimension(values = tt[[nm]][[nm]]) } else { ## we are simple offset uval = tt[[nm]][[nm]] ## so we can get an NA, whether units of not dims[[i]] = create_dimension(from = 1L, to = 1L, offset = uval, delta = uval[NA]) } } dims = create_dimensions(setNames(dims, nms), raster = raster) if (!is.null(curvi_coords)) { dims[[names(tt)[1]]]$values = curvi_coords[[1]] dims[[names(tt)[1]]]$offset = NA dims[[names(tt)[1]]]$delta = NA dims[[names(tt)[2]]]$values = curvi_coords[[2]] dims[[names(tt)[2]]]$offset = NA dims[[names(tt)[2]]]$delta = NA } if (make_time) { for (idim in seq_along(tt)) { if (nms[idim] %in% variable$name) { uit <- variable$unit[match(names(tt)[idim], variable$name)][[1]] if (nms[idim] %in% coord_var$variable && nms[idim] %in% coord_var[["T"]]) { ## we have a time thing dims[[idim]] = make_cal_time2(dims[[idim]], nms[idim], uit) } } } } if (!proxy) { x = tnc %>% tidync::hyper_array(select_var = select_var, drop = FALSE) ## always keep degenerate dims attr(x, "transforms") = NULL attr(x, "source") = NULL class(x) = "list" for (ivar in seq_along(x)) { if (names(x)[ivar] %in% variable$name) { uit <- variable$unit[match(names(x)[ivar], variable$name)][[1]] if (!is.null(uit)) x[[ivar]] <- units::as_units(x[[ivar]], uit) } } out = st_stars(x, dims) out = st_as_stars(out, curvilinear = curvi_coords) } else { ## if we are proxy, defer to GDAL subdatasets hvars = if (is.null(select_var)) tidync::hyper_vars(tnc)$name else select_var sds = unlist(sf::gdal_subdatasets(.x)) if (length(sds) > 0) { sds = unlist(lapply(sprintf(":%s", hvars), function(p) grep(p, sds, value = TRUE))) } else { sds = .x } out = stats::setNames(as.list(sds), hvars) out = st_stars_proxy(out, dims, NA_value = NA) #class(out) = c("ncdf_proxy", class(out)) } out } ## FIXME: this function should return unit-ed times, not modify dimensions ## it should also live in the units package (or RNetCDF, or PCICt or ...) make_cal_time <- function(dimensions, time_name, time_unit = NULL, cal = NULL) { td = which(names(dimensions) == time_name) if (length(td) == 1) { tm = get_dimension_values(dimensions[[time_name]], geotransform = NA) u = time_unit if (is.null(u) || inherits(u, "try-error")) { warning("ignoring units of time dimension, not able to interpret") return(dimensions) } if (! is.null(cal) && cal %in% c("360_day", "365_day", "noleap")) { if (!requireNamespace("PCICt", quietly = TRUE)) stop("package PCICt required, please install it first") # nocov t01 = set_units(0:1, u, mode = "standard") delta = if (grepl("months", u)) { if (cal == "360_day") set_units(30 * 24 * 3600, "s", mode = "standard") else set_units((365/12) * 24 * 3600, "s", mode = "standard") } else set_units(as_units(diff(as.POSIXct(t01))), "s", mode = "standard") origin = as.character(as.POSIXct(t01[1])) v.pcict = PCICt::as.PCICt(tm * as.numeric(delta), cal, origin) if (!is.null(dimensions[[td]]$values)) { v = dimensions[[td]]$values if (inherits(v, "intervals")) { start = PCICt::as.PCICt(v$start * as.numeric(delta), cal, origin) end = PCICt::as.PCICt(v$end * as.numeric(delta), cal, origin) dimensions[[td]]$values = make_intervals(start, end) } else dimensions[[td]]$values = v.pcict } else { dimensions[[td]]$offset = v.pcict[1] dimensions[[td]]$delta = diff(v.pcict[1:2]) } dimensions[[td]]$refsys = "PCICt" } else { # Gregorian/Julian, POSIXct: if (!is.null(dimensions[[td]]$values)) { v = dimensions[[td]]$values if (inherits(v, "intervals")) { start = as.POSIXct(units::set_units(v$start, u, mode = "standard")) # or: RNetCDF::utcal.nc(u, tm, "c") end = as.POSIXct(units::set_units(v$end, u, mode = "standard")) # or: RNetCDF::utcal.nc(u, tm, "c") dimensions[[td]]$values = make_intervals(start, end) } else dimensions[[td]]$values = as.POSIXct(units::set_units(tm, u, mode = "standard")) # or: RNetCDF::utcal.nc(u, tm, "c") } else { t0 = dimensions[[td]]$offset t1 = dimensions[[td]]$offset + dimensions[[td]]$delta t.posix = as.POSIXct(units::set_units(c(t0, t1), u, mode = "standard")) # or: utcal.nc(u, c(t0,t1), "c") dimensions[[td]]$offset = t.posix[1] dimensions[[td]]$delta = diff(t.posix) } dimensions[[td]]$refsys = "POSIXct" } } dimensions } stars/inst/nc/test_stageiv_xyt.nc0000644000176200001440000373676414214460066016747 0ustar liggesusersCDF timeyvxW # Originating_or_generating_CenterQUS National Weather Service, National Centres for Environmental Prediction (NCEP)#Originating_or_generating_SubcenterEnvironmental Modeling CenterGenerating_process_or_modelRRiver Forecast Center Quantitative Precipitation estimate mosaic generated by NCEP ConventionsCF-1.4historySat Jan 22 19:46:48 2022: ncks -x -v time_bounds test_stageiv_xyt_2.nc test_stageiv_xyt_2.nc Sat Jan 22 19:46:28 2022: ncatted -a bounds,time,d,, test_stageiv_xyt_2.nc Sat Jan 22 19:44:21 2022: ncks -x -v time_bounds test_stageiv_xyt.nc test_stageiv_xyt_2.nc Fri Feb 1 07:55:44 2019: ncpdq -a y,x test_stageiv.nc test_stageiv_2.nc Aggregated from NCEP Stage IV Analysis by dblodgett@usgs.gov 2016-01-01 featureTypeGRID_CoordSysBuilder#ucar.nc2.dataset.conv.CF1ConventionMetadata_ConventionsUnidata Dataset Discovery v1.0title9United States Stage IV Quantitative Precipitation ArchivesummaryMosaicked into a national product at NCEP, from the regional hourly multi-sensor (radar+gauges) precipitation analyses produced by the 12 River Forecast Centers over CONUS. Some manual QC done at the RFCs. The Stage II/IV job is run at 33min past the top of each hour. Hourly Stage IV is re-made hourly (if there is new input after valid time for the next 23 hours, then again at 1/3/5/7 days after valid time. Source: http://www.emc.ncep.noaa.gov/mmb/ylin/pcpanl/stage4/ Note: This dataset is not truely national. Some RFCs do not produce hourly precip estimates and others may not be present in the dataset. Please review the NCEP documentation for more information.keywordsUAtmosphere > Precipitation > Precipitation Amount Atmosphere > Precipitation > Rainkeywords_vocabularyGCMD Science Keywordsid stageivnaming_authority cida.usgs.gov cdm_data_typeGrid date_createdongoing institution,National Center for Environmental PredictionprojectVariousprocessing_levelPAggregated .grib archive from the NCEP. The original Hydrologic Rainfall Analysis Projection grid cell locations redefined by unprojecting grid cell locations using spherical earth projection algorithms. The cell lat/lon locations should be interpreted as being on a modern geotetic datum. This transformation is needed because the original grid cell location's lat/lon values were on a geodetic datum but were assumed to be on a spherical datum. See: https://pubs.usgs.gov/fs/2013/3035/pdf/fs2013-3035.pdf for more information. Note that this publication reverences the National Precipitation Verification Unit. The data represented here are aggregated from the same source as the National Precipitation Verification Unit used prior to being shut down. Data processing notes can be found here: http://www.emc.ncep.noaa.gov/mmb/ylin/pcpanl/acknowledgementyData originated at the National Center for Environmental Prediction: http://www.emc.ncep.noaa.gov/mmb/ylin/pcpanl/stage4/geospatial_lat_min24geospatial_lat_max53geospatial_lon_min-125geospatial_lon_max-66time_coverage_start2002-01-01T00:00:00Ztime_coverage_endpresentlicenseFreely availablecontributor_name$Center for Integrated Data Analyticscontributor_role#Aggregation and Serving via THREDDSgeospatial_lat_unitskmgeospatial_lat_resolution4geospatial_lon_unitskmgeospatial_lon_resolution4geospatial_vertical_unitskmNCO4.7.2 /Total_precipitation_surface_1_Hour_Accumulation long_nameCTotal precipitation (1_Hour Accumulation) @ Ground or water surface descriptionTotal precipitation missing_value coordinates time lat lonunitskg m^-2 _ChunkSizes<K standard_nameprecipitation_amount _FillValue cell_methodstime: sum (interval: 1 hr)iXlat units degrees_north _ChunkSizesK<_CoordinateAxisTypeLath|llon units degrees_east _ChunkSizesK<_CoordinateAxisTypeLonhtime unitsHour since 2001-12-31T23:00:00Z standard_nametime long_name!GRIB forecast or observation timecalendarproleptic_gregorian_CoordinateAxisTypeTime _ChunkSizes<?@????????@???У???????aG?????У?У??У?@Q@???@???????@@??У??????aG?@?!G?!G?aG??У??У?У?У?У@@@@??@??????У??????У???aG?@?!G???!G?@?aG?????У??@@@Q?!G?????????У??У???aG?!G?>\>\??!G?@?@?aG???????@@Q@Q?@????У?У????????aG?!G>\>\>\>\??!G?@?aG?aG????У????@@???????У?????aG?@?@?>\>>????!G?@?aG?????У????@@0?!G?@Q@@@?У????@?!G?!G>\>\>>>\??!G?!G?!G?@?aG????????@@0@P?aG@@Q@ @Q?????@??>\>>\??!G?!G?!G?@?aG?aG??????@Q@(Q@HQ@p?@Q@8Q@(Q@Q@????aG?>\>>\???!G?!G?!G?@?@?@?@?aG??@@Q@8Q@`@?У@@ @8Q??У?У?У??!G>\>\?????!G?!G?!G?!G?@????У?@8Q@XQ@?@@xQ@ @(Q@Q???У??aG?>\????>\>\??!G?@?????@@XQ@(@Q@`@P@@Q??У??aG?>>\>\>\>\>\>\>\??@?????У@@Q@8Q@@@Q@0@?????!G>>>>>>\>\>\??@????@@(Q@@@p@@?@?aG???aG?@>>>\>\??!G?aG???@@(Q@@@XQ@p@>\?@ ??!G??aG?>>>>\??aG???@@0@@@XQ@xQ@(@?!G??@>\??>>>>\?!G?aG???@@0@@@XQ@xQ@@@>\?!G?>??!G????@Q@(Q@@@`@(@@(@@?@?>?!G?aG???У?@Q@ @P@@(@@@@@(?@?@??!G?aG???У@@@(Q@P@@@(@(@(@(@(@(?>\>\?????@@ @HQ@@(@@@(@@(@(@(@?!G??aG?aG?@??У@@ @XQ@(@(@@(@@(@@@(@A{?!G????У?У?@Q@8Q@p@(@(@(@@@(@@(@(@(A A2{?!G@?У?@??@Q@HQ@@@@@(@@@@(@A{A8AHAB{?aG?@??@Q?@ @@@@A@A{@@@@(A {A4APA2{A{>>>>>??У@ @@ @ @Q@8Q@@(@(AAA {A{@@@@A{A8AF{A0A@>>>>>>>??@8Q@hQ@@ @@@@@(@(AAA{A @@(@(@A{A8AHA(A@@(>>>>>>>>>>\?@8Q@`@0@8Q@0@ @xQ@(A{A{A{AAA@@(@@AA6{A{@(@(@@>>>>\?>\>>>?@@0@(@@(Q@8Q@(Q@P@(@A{A{A{A A@@(@(@(A A,A{@(@(@(@(@>>>?@?>>??@@(@XQ@8Q@(Q@8Q@@(A A A"{AA{A{@@(@(@(A{A@@@@(@@(>>>>\?>\>>?@@(Q@@@0@8Q@0@p@@(AA"{A{AA{A@(@@(@A A{@@@@p@`@@>>>>>>>?!G?@XQ@(@xQ@0@0@HQ@(@(AA{A"{AA{A {@@(@(@AA{A@(@(@p@XQ@HQ@@>>>>????У@@@P@8Q@HQ@xQ@@(A A A{A{AA@(@(@(@(A"{A{@@(@(@P@XQ@`@HQ>>>?@?@?@ @@(@P@HQ@P@@(@AA AA {A{A@@@AA.{A{@@(@`@P@hQ@HQ@ >\?!G??@0@@p@P@P@p@(@(A{A{AAA A@AA{@A{A{@(@@xQ@p@@P@Q@??!G??@@XQ@@@xQ@p@(@(@A{AA(AA A{@(A{A {AA&{@@@xQ@`@xQ@(@P@??!G?aG?!G?!G??@8Q@@(@(@(@@@A {A.{A8A>{A(AA {AA*{A{AA"{@@hQ@p@@@(@0@ ???У???@(Q@`@@@(@(@@(AA*{AJ{AN{ADA$A{AA:{AHA$A{@@hQ@p@@(@(@p@(Q@(Q@P?aG??У???@P@xQ@(@@@@@(A A@AhAXA:{A{AA*{AXAV{A8A@@@@xQ@@@(@8Q@Q@XQ@>??@ ??@Q@HQ@@@(@(@@AAAhAAv{AF{A{A(AHAv{ApADA@@XQ@@@@`@Q@Q@(A(>??У????@ @`@(@(@(@(A {AAA:{A =AA =A\A0APA =A =A =A6{@@@(@(@(@@ @@HQ@(A`>?@?????@@@`@(A{A {AA$A"{A(AhAA =A =AlAV{AAAA =A@@(@@(@(@p@@0@xQAA =??@????@Q@XQ@`@(A&{A{A(A0A&{A4A|AA =A =AxAr{A =AA =AA@(@(@(@@(@`@ @P@(AA??@???@Q?@ @@@A,A(A.{A*{A(A2{AAAA =AlAAAAAv{@(@@@@(@(@P@(Q@xQ@(APA???!G???@?@hQ@(@@A4A@A:{A4A{A,AA =A =AAtA =AAA =AB{@(@(@@@@@P@8Q@@(ALA =?@@Q???@ @0@(Q@(@(@AA,ADAHA<AA,AAAAAAA =A =A =A{@@(@@(@@@@XQ@HQ@@A,A =?@HQ@p??У?@p@xQ@@@(@AA{A0A6{ADA>{AA,A =BA =AAA =BAA =A@(@@(@(@@0@HQ@P@(A {A0A?@p@(@(Q@?У@p@@HQ@@A {A(A0A0ADA2{AA,A =BA =A =AABAA@@@(@@(@@(Q@8Q@XQ@AAJ{Af{?У@@@(@0?@hQ@xQ@XQ@(@(A A&{A6{A.{AJ{A2{AA(A =A =AAAABAAZ{@@(@@(@(@@@@0@p@A(AdA>{?У@A@8Q??@hQ@p@XQ@@A{A:{A6{A*{A6{A*{AA&{A =AA =A =AAA =AA(@(@@(@@(@@8Q@(Q@@AAr{A6{?@(A?@@Q@(@xQ@XQ@@(A AHA.{A A*{A A {A:{A =AA =A =A =A =AAA{@(@@@@(@xQ@8Q@(Q@`@(@A:{A<>??@P@(?У@Q@ @xQ@xQ@P@@AAdAN{A A4A{A{A0AA =AAA =AAA =A @(@(@(@@(@hQ@`@0@@@@@A0>\?aG>\?@@@(?У@Q@ @P@`@P@(@AAr{AxAA2{A{A"{ADA =A =BAAABA =A{@@(@@(@(@hQ@`@P@0@@@xQ@`@>\??!G?@Q@(?@@8Q@8Q@XQ@8Q@p@(AAhA =A AAA,APAAB BBBB A =AD@(@@(A @(@hQ@P@P@P@0@8Q@@@HQ>???@ @xQ@?@0@0@`@@@p@@(A.{A =A2{A{A{A&{AXAAB B BBB!AAJ{A@@A{@@(@P@XQ@XQ@@@ @ @(Q>\?@Q>\>?@@@`@ ?@ @(@(@(@hQ@@(A{Aj{AHA4A A0AN{AA =BBABB9A =ADA{@(@@(@@(@XQ@`@XQ@hQ@0@Q@ >\@@(??>?!G@Q@ @Q?@@(@(@(@(@@(A{AB{A\AJ{A4A6{AJ{A =A =BBBB B?B AdA@(@(@@(@@p@XQ@@xQ@hQ@8Q@(Q?A??@>>?У@Q?@@@@(@(@(@(@A{A:{AhAdALAPAb{A =ABBBA =B7B8AA{@(A@(@(@(@xQ@hQ@`@xQ@(@xQ@P?aGA@(?aG?!G>>????У@@@(@(@(@@A A$AZ{AlAj{Ab{An{AABB"BA =B B7AA$@A{@@(@(@xQ@@`@`@(@(@>\@@(?aG?>>?????@@@(@(@@@AAPAtA =AAlAA =BBBA =BB5A =A4@@(@(@@(@xQ@xQ@xQ@`@hQ@(@(@Q@(>\?@@ ?!G>??@??@@@@(@@(@(A{A6{Af{A =AAA =A =A =A =BABBAAPA{@(@(@(@p@xQ@p@@@P@hQ@(>?@??@0?У?@?У????У@@@@(@@A{A*{AXA =AAAAA =BA =A =A =BA =A`A{A@(@(@@(@xQ@p@@(@P@hQ>??!G@(Q@Q?@?????@@ @(@(@(@@A"{AR{AA =A<AA =ABBAA =AA =AA{@@@(@@(@(@XQ@(@(@@xQ?@>?@hQ??@0?aG?У????У@Q@XQ@(@@@(@A,A^{AA =AxAA =BBA =A =AAA =A{@(@@(@@p@@@XQ@(@@(?!G>?aG@`??@Q?aG??????@8Q@@@@(@AAB{A^{A|@(AAB BBAA =AAA,A@(@(@@(@@(@(@hQ@xQ@(>\??@@@?!G@Q@?aG?aG?aG?У?У@Q@@hQ@@(@(@(AA.{A6{AhA =AA =ABBAAA =A =A>{A(@(@@xQ@@(@(@(@xQ@xQ@(??!G@HQ@(?aG?!G?@?@???@Q?@0@@`@(@(@(A{A"{Aj{A =AAABBA =AA\Aj{AV{A<A{@(@`@`@xQ@@(@(@`@(>\?aG>\?aG@(@Q?!G?@?aG?aG????@Q@HQ@XQ@(@@@(A{ATAA =AA =AAA =A =A A A>{A*{A.{@@@0@@@p@(@(@(@>?aG?!G@Q@p?!G?@?У@Q??У?aG??@ ?@xQ@(@(@AA{A\AAA =AA =AAAA{A {A:{A$A@@`@0@8Q@XQ@(@@(>\?!G?!G??!G@0??@?@Q?@?aG??@???@P@@(@(@A{A"{ATAdAAA =A =AAA{@(AA.{A@(@(@`@(Q@ @P@xQ@(>?@>>>\?aG>\?aG?@?!G?aG?!G?@???@???@HQ@@@(@@(A{AJ{A =A^{A =A =AA =A =A.{A*{@(A@(@@@(@(Q@Q@@@@XQ>?@?aG>>>>\>\??>?@??@?@?@?aG?@Q@@@@@@@A{A*{AAA =AAf{AA =A =AN{A,@(@@(@(@@(@ @Q@Q@8Q>>???>>>\??aG?@(@8Q???@???aG?@@@@hQ@@(@(@@(AAPAA|A =AhA =A =AA =A>{A{@(@(@P@(@(@(@Q@@(Q>>>?@?>\>>\>\??aG?aG>\@@@XQ????@@0@XQ@@@(@(@A{A,AV{AlApA =A =A =A~{AAAZ{A@(@HQ@8Q@@(@(@ @>>>>\??@>??@>\??@?>\?@(@??aG@??@@0@P@@(@(@@A {A@ALA =AA =A^{AlAv{AxA =A =A4@@@xQ@(A{@(@@(Q>>>\?@?>>\?У??!G>?!G?@??!G@A @p?@?aG??aG?@8Q@`@(@@@@@A{AN{A =B B,AV{A(A>{Aj{Ab{A =A =@@@xQ@(@A@@>>>>>\??aG?У@Q??@?@?@??>?A {A {@?aG?@0@`@@(@(@@(@@(A2{Av{AA =AAA{A(A =AAA =@@@XQ@XQ@@A ???@p@P?@>???@?@?@ A{@?@?@ @`@xQ@@@@(@(@(AA@AdApAA =A =A =Az{AADA =A8@@p@(@(@@(?aG?>\@`@@8Q>??У??@ ?>@A{@ ?@?@HQ@xQ@@@(@(@(@@(AA6{ATAf{AA =A =ApAtA =AAA4@@(@@@(>>\???@?aG?>?@?@@(?aG?!G???aG@@>?aG@A{@Q?aG?@(Q@`@(@(@@@(@(@(@A{AA:{AZ{A =AlApAhAA =AH@@(@@(@(@(>\?@??@??!G??@hQ@@8Q?!G?@??@p?>\?APA{@0?@Q@8Q@hQ@@@(@@(@@(@A{AA{A&{AA|A =A =A =AdA(@@(@A{@(>>\?!G???>\???@(@(?aG?aG???!G@P@@??@@(AA@Q?У@Q@P@@(@(@(@(@(@@@@(@(AADAf{A~{AA8A<A,A,@@(A{A{>?!G??@?>\??@?@Q@(@Q?@?aG???aG@xQ??!GA A =A???@0@p@@(@@A{AA{A{@(@(@(@A {A*{AAB{A&{A A{A{AA{A6{>\?aG????>\?!G>\>\?aG@(@?????!G?@`?!G?!GAR{A@??aG?У@ @P@@(@@(A{A {AA @@@(@(@A{A{A@A>{ADAHA{A AA >?????>\?!G?aG?!G?@?!G?@(@@??!G???@@@?AR{A =@?@@0@xQ@(@(@A{AA A A{A{@@@(@(@(A{A{AHAN{ALA,A{A>?@????>\?@@??aG?@@@(??!G?@??@?@(??A(An{@?!G?@Q@XQ@@@(@A{@A2{@{@@@{@@@@(@(@{A{@(@{@(@>\?????aG?aG@HQ@p@0????У@8Q?@?!G???@@@XQ??!GA0A|@0?O\)?@ @`@(@@(@AA{@@{@(@(@{@{@xQ@@{@{@{A =A{@(@?@?????@?@p@(@HQ?У????У??@???@P@Q>\?A{A:{????@(Q@hQ@@@@AA {@{@@@(@@(@|(@xQ@@{@@(@(@>??У????@?У@@(@@Q??У??@?aG???!G?@0?>\?@@Q??@@8Q@(@(@@@@(@@@@@@(@@(@|(@(@(@(@(@{>\?????aG??У@@(@@??????aG??@?@0?!G>?@@Q@P@@(@(AA@(@{@(@{@@(@@{@{@@@(@{@>?!G???????@(A@???????!G?????>\?aG?@Q@ @P@@(@(AA{@{@@@@@@@(@@(@(@(@{>???@????@A@??@(Q@HQ???!G????aG??!G>\?aG?@Q@0@hQ@@(@A{@{@@s @xQ@(@@(@@{@@@@>\?aG?@Q@Q??@?aG@@(A {@hQ?@@@P??@?>\???aG?@?@>??У@Q@P@(@(@(@(@@@(@xQ@p@|(@@{@{@@@@?!G??@ @ ?@??@8QA {A@(Q?aG@`@(@@?@?@>\????aG?aG?@?@@@xQ@xQ@(@@(@@@@@@c @|(@@@@{@{@{>?@0@0@HQ@?>\?@XQAD@??@@HQ@??!G?@>\?!G???!G??@?@Q@hQ@p@(@(@(@{@{@{@@@s @p@{@(@@@@>\?@@HQ@XQ?>\??@@@A"{@(?!G?@@HQ@??@???@??!G??@?У@8Q@ @@@@(@{@(@{@(@@|(@@@@@(@(>\@@@`@8Q???@P@(???@`@?aG??У>\???aG???aG@0@HQ@@@xQ@@(@@(@(@@@(@@(@(@{@(@(@(>\@Q@@ @>\??@8Q@(Q??@?@XQ@?@Q??????aG?>G>G??@\(@@@hQ@(@(@@@(@@{@@@@(@@@>?@@0@(@0?aG>\??!G???!G??@`@@?@@P@????@(??@?!G?Q@p@@(@@`@# @S @(@(@@A =@(@@l(@hQ@>>?@@XQ@@>>\?@???!G?@?@@XQ?У?@HQ@>\?!G>\?@HQ???@?>G??\)?@(Q@@@@XQ@ @L(@{@@@A{@@@@(>?>?@@@XQ???!G>\?!G?aG??@@XQ??@@??!G@HQ????!G?@?p??@?@Q@hQ@@P@(Q@(Q@@@l(@@{@{@@(@(@{>?>?@@@?!G>>\?!G??!G??@(Q@Q@Q?aG???@?У@(Q@??\)??O\)?????У@(Q@0@HQ@@@8Q@L(@l(@@(@(@{@(@{>>\?>?@Q?>\>>\?aG?@?@?@?@Q@(Q@?@??@?!G?@Q???!G??????Q@8Q@P@L(@XQ@l(@@(@(@(@(@(>?>\>?@ ?У?!G>>\>\???!G??@ @@@?@??aG?@>\?@?@?!G??aG???Q?@Q@0@c @s @@(@@@{@@>\>\?!G>\>?@(Q??!G>>\>\??>\?aG@@xQ@Q????>\>G?!G??O\)?O\)??@@ @`@@{@@{@{@@@>\>???aG@Q?У?!G>\???>\?aG@@P????>\>\>\>>>\?\)??Q?O\)?O\)?!G??Q@3 @p@(@{@{@@(@@>>?>\>?@0??@?@????!G?@??????У>?>>>>G?Q@ @P@???@ @@@@{@(@@p@c @>\>\?!G>\>\?@Q??@Q??У??aG?!G??????>?!G?>=u>\??Q@<(@3 ???@ @@@s @|(@@XQ@L(@XQ>>>\?@?!G?@??@??@(Q??@Q??!G?@??@??У?!G>>=u?=u?0??@,(???Ǯ@ (@3 @<(@3 @(@0@@>\?!G??aG??!G?@?aG?У@8Q@Q?@(Q?>\??aG?У?@>>>?\)?aG?Q?Q?Q?Ǯ??Q@@(@ @Q@Q>\>\>\>\?@??aG??@????@0@?@?aG>\?@??>G??Ǯ?Q?Q??Q@ @8Q@(@Q@Q>>\>\???aG????@?@??У??@(Q@ ????>\?aG?>\?\)??@# @ ?@Q@\(@|(@c @l(>>??!G>?aG???@>\>>??????@Q@P??aG?aG????0??@ @0@(Q@ @0@\(@|(?@?@?!G?aG???@>\>>???????@@(@???!G>>>\?0??@ @0@@@(@(Q@C >\?aG?@???У??aG?@?>>??aG?!G?aG??aG?@P@HQ?У??aG>>>>>>R>G?@?aG?Q?У@ (@# @C @,(>\?!G?aG???@??@>>>>\>\???@??@HQ@hQ@??>>>>>\>\??@??Ǯ??Q?>\>\>\???@??У???aG>>>\?@?@@@@p@0@??!G>>>\>\>\>G?!G?aG???>\>??@??@Q??aG>?!G?@@XQ@(@Q@Q@?>\>>=u>\??@?aG??@??????У??@?@Q@XQ@@?@@(Q??>\>B\>?\)?O\)?O\)?!G>\?>\>\???!G?@?@?aG?aG?aG????????>>>\>\????!G?aG?aG?????????>>>\>\>\??!G?!G?aG?????????>>>>\>\???@???У?@Q@Q@(Q@Q@>>\>\???@??У?@@(Q@0@8Q@HQ@@@0>>\??!G?@???У?@(Q@HQ@XQ@XQ@p@(@(>>\??!G?aG???У@@(Q@0@hQ@@@@@>>\??!G???У?@@8Q@XQ@xQ@hQ@(@(@(@@>>\??!G????@@@@`@@(@@(@(@(@(@(>>\??!G???@@Q@@@`@(@(@@@p@xQ@(@(@>\>\?!G?@???@@(Q@HQ@xQ@(@@@@@(@hQ@p@(@(>\??@????@@@@hQ@p@xQ@@(@@@@p@XQ@`@hQ@>??aG??@@ @0@P@@(@(@p@`@XQ@XQ@@@@@P@P@xQ@(@(>\??aG?@@ @`@xQ@(@xQ@@(@p@hQ@p@p@(Q@(Q@8Q@`@xQ@(@@(??@??@@(Q@xQ@@(@@(@p@p@hQ@@@(@hQ@XQ@hQ@(@(@@(A{>\>\??@??У?@0@@(A{A@@(@(@@(@@(@@@(@(@(A"{AR{Ar{A??@?@?aG??@@P@@@(@@@@@@@@@(@(@(@(A&{AV{AAAn{A\?aG????@ @p@@A@@@@@@(@@@(@@(A>{Aj{AxAZ{A<A,A@?!G????@HQ@(@AHAF{@(@(@@@(@XQ@hQ@@(@(A{AXA =ApAb{A"{@(@(@@xQ>\??@Q?@@p@(A@AN{A@(@(@(@(@xQ@@@@(A{AXAr{AN{A6{A{@@@8Q@ @>\>\?@@??@@HQ@@AV{A(@(@(@(@(@hQ@@@(A{AAHATA,A @(@@(Q@Q???У??@>\?@@@@Q@P@p@(@A@(@(@@(@@hQ@@(@AA$A{A@(@(@@@??У??У?У?!G?aG????@p@@8Q@(A@(@(A{@(@@(@xQ@XQ@@(@(AA{A@(@(@@@@Q@????@??У?>\?!G@Q@(Q@ @@(AJ{A{@(@(@@@@hQ@@@(A A*{A@(@@@`@0@Q@Q@Q@Q@@Q@(Q?@@@(?>\?aG?@Q@Q@`@AA{A @(@(@(@(@(@(@(@A{A{A{@(@@(@(@@@Q@@ @0@8Q@P@XQ@`?@(@???У@0@Q@8Q@(@(AA{@@@@@@(@A{A{AA@@(@@(@`@(Q@@@@@@@`@xQ@xQ@8Q@Q?aG@(@@0??@ @@ @XQ@(A A@(@(@@(@@@@(@A A@@@@(@@P@8Q@XQ@P@`@@HQ@??@Q@(@(@Q??@HQ@`@P@(@(A{@(@@(@@(@@@(@AA{A @@(@(@@p@HQ@xQ@@XQ@hQ@0@?У??@8QA$@(??У?@XQ@(@(@@(A{@@@@(@@(@(@(@(A{A @@(@@@(@hQ@`@@XQ@(Q@?У????aG@XQAj{@??@Q@`@xQ@@(A@(@@@@@(@@@(@(AA{@@@(@@@XQ@xQ@hQ@(Q??????aG?aG?>\A{A@?aG?@@@`@@(@(@@@@(@(@@(@@@AAA@(@@@@@xQ@p@0@???????>\?aG?AAX@HQ?!G?@P@`@(@@@(@@(@(@(@(@(@@(@(A{A{@(@(A@(@(@(@(@P@??????????@?A@(???У@HQ@p@@(@(@@(@(@@@(@(@(@(AA{A{@@(A@(@(@(@hQ@ @????????>\??@@p?!G?@@(Q@XQ@(@(@@@(@@@@(@(@@(AA A{@A{@(@@@@@@Q@Q???У??????@@@?@?@P@HQ@@(@(@@@@(@@(A{A{@(A{A$A:{AAA"{@@@@xQ@HQ@(Q@???У??????!G?@@A{@hQ??@p@(@(@(@(@@@@(@AA(A(ADAJ{AZ{Af{AN{AHA.{A@@p@p@hQ@(Q@Q@@?У????У??!G?!G@(A@?@Q@(@@A{A@(@@(@(AA&{A4AN{AtAtAAAAr{A,A{@(@hQ@p@hQ@Q@@Q@?????@(Q?!G>\@@??@@@(@@(AA @@@AAA*{ADAb{A =A~{AA =A =A~{A:{A{@@`@(@P@@@(Q@Q????@@xQ?!G>\?@p@(?У?У@8Q@@@A {@(@(@(AAA{A8APAtAAA =A =AAdA@@(@p@hQ@(@p@8Q@8Q@@@????У@(Q@>?>\?aG@@(?@@ @(@@(A{@(@(@A{A{A@ATAlAAA =A =A =A =AdA<@(@xQ@@@(@@xQ@XQ???aG??@P@????!G?@@@@@ @(@@A{@(@(AA,AF{AlAr{A|AAAA =A =AAZ{A@@@(@@@(@(@hQ???@?@Q@@>\?!G????@@(?@Q@XQ@@(@@@@A A2{A^{A =AA =AA =A =AA =AAF{@@(@@@@@(@(@`?У??@?У@(Q@@>\???aG?@(@?У@(Q@xQ@@(@(@@(A{AA2{AdAA =AAA =A =AA =A^{A@@(@(@@@@(@@XQ???aG?@HQ@(@>>\?!G?@?@(@?@0@p@(@(@@@(AAA2{AhA =A =A =AA =AAA =A:{@@(@@@@@@@xQ@HQ?У??@@hQ@(A>>?!G>\??@@(@@@ @hQ@@(@@A{A,AA*{An{AAA =A =AA =A =Ar{A @(@@@(@@@(@@p@@???@Q@@(A{>\>?aG?@?aG??!G?@(@@8Q@ @hQ@@(@(@(@(A0A,A,A`A =A =AA =A =AA|A`A{@@@(@(@@@@(@(@@?У??aG@0@@A{?!G>\?aG????@@8Q@ @@`@@@@(@A.{AB{A.{A`AAAA =AA~{Af{AF{@(@(@@(@(@xQ@(@@@(@HQ?У??aG@@@(A{?aG?!G>?!G>\>?!G?aG?@ ???@@Q@P@@@(@@(A*{AB{A0AlAAAA =A =A\A>{A*{@@@(@(@@p@(@@(@xQ@XQ@??aG?@(@(@(??aG>\?@?aG?@?@0?????@ @P@(@@(@(@(A:{AZ{A4An{A =AA =AAtA8A"{A @(@@(@@@hQ@(@@(@@xQ@??aG?aG@0@(@??>??@?@>\?@??@(Q?@???@ @8Q@(@@@(@APAj{A2{Ab{AAA =AAn{A*{A A@@@@(@@@@@@(@@0??aG?@?@8Q@?????!G?!G>>\?aG?@?@Q?!G?@???У@Q@8Q@(@@(@@Aj{A =AB{AhAA =A =A =Aj{A @(@(@(@@@(@(@@@(A{@@(@hQ@Q??@?aG?@@?@XQ??aG?@?!G?>\>\?aG??aG???!G???@ @HQ@(@@(@AAF{A =AtAj{AAAAApA{@(@(@(@@(@(@@(@(@(@(@@@(@@?????@@8Q?@??aG?У????!G??aG??@??aG??У@ @@@(@(@(@A AJ{AAAAAA =AAr{A{@(@(A@(@(@@@(@(@@(A{@(@(@@0???@@??!G??@?У???!G?!G??!G??aG?@??@ @HQ@xQ@(@@@ADAA =A =AAAAAN{A@@(AA@@(@@(@@(@(A(A @@(@xQ@ ??@@0@Q?aG??@??aG>\??????!G??@Q@@@xQ@@(@(@A<AA =A =A =A =AA =A =@(@@(@@@@(@(@(@@(AA0A0A{@@(@@@Q??@?@@(Q@????>\???aG???aG?@Q@0@(@(@(@(@A(A =AA =AA =A =AA =A8@(@@(@(@(@(@(@@@A{APAN{A6{@@(@@HQ????@XQ@????!G>\?@?!G???!G??aG>@@8Q@(@@(@(Q@(AAA =A =B7B'A =A =A =A<A{@@(@(@@@@(@(@AAXAn{AA<@@(@(@0@?@(@???@?@?!G?aG?aG??aG?@Q@@@xQ@@(@@(AA\AA =B=B8AAAAV{A@(@@(@(@@(@@A{A{A@A =AA =AD@@(@@8Q>\??aG@@(??У?aG???!G?!G???У@Q@@@@@Q@(@@(AHAA =B:BOBBA =A =A^{A@(@(@@@(@@(@(AA{A"{A =AAAAB{@@@>\??!G>\??!G@p@(@HQ@???aG?aG?У@Q@P@(@@@0@XQA{AA&{AAB.BDBQB A =AV{A.{@(@(@(A{@@(@(@@(A{A {A`AAA =AA@AA????aG?@(@XQ@??!G?@?@?@Q@8Q@(@Q@8Q@8Q@AA {AA =A =BEBIB:AAdA0A{@@A{A@(@@(@(@(AAB{AA =AAA =APAP??У???!G?@p@???aG>\?@?@?@@8Q@hQ@(@8Q@(@(AA{A@A =AB BEAA =A`A"{A{A A{@A {A@(@@@@(AAA =A =AAA =A?@ @ ??>\??@(@@???@?!G?!G?!G??@ @P@(@A{@AA{A,A =A =ABA =Ab{An{A{AA$AAAAA{@@@@(AADAA =BAA =A =?!G@0@@@Q?!G?@@@xQ?У???!G???@?У@Q@0@@A @A{A4AAZ{A =A =BAA =AA6{A{AAZ{A$A{A @@(@@(@@(AA0A =AB BA>\?@8Q@xQ?>\?!G?@@@Q@?У?@?!G?@?@Q@8Q@P@A{AA{A,A,A:{A =AAAAAAtA{AJ{AAXAAA@@(@(A @(@(@A0AAA =A>>\>>\??@@p@(??@?@@0@(@8Q@ ????!G?@@0@@@(@(AA AA:{A$AV{ABB AAAA0A6{ADA@A<AA*{@@(AA {AAAAA4A|A =A>>\>\?!G?@>\?>\?!G@`@@Q?>\???aG@(@P@p@??!G??@(Q@8Q@`@AAA A<A:{@(ATA =A =A =AA`ATA A {A{A @(AA8@A {A@(A A {A{A A*{A*{AP??!G???aG?>\>?@(@(?@????aG?У@@@@ ?aG?@?У@Q@(Q@0@@AA{A{AR{A*{A0A =A =A =AA|AZ{A>{A@@(A*{@@A{AA{A A{A{A{A{A&{AA4?!G??@??@?!G>\?!G@hQ@??@>\?!G?У?@HQ@(@(@P?У?!G?@(Q@0@@@`@(A@(AA4A6{AF{AAA =AAA\AJ{A,@(@(@(@@AA {A(AA{A0A"{A"{A&{A A(??aG?@(Q@XQ?У???@@@@0?@?@?aG??!G@(A@@ ?@@@@0@8Q@@(@(A {A$Az{ATA|A =A =AAAv{A:{A0A@(@(@(@@(AA A.{A {AA2{A2{ALA@A8>\??@@(@(???@@????@???@(@(@(Q??@(Q@@@ @`@@A6{A$AN{AA^{AAA =A =Av{Ab{A&{A{A@@A{@@@(A"{A0@A{A(A4AXAh>\?aG@@@?aG?>?@@hQ@???>\>\?@??@0@@?@@@ @0@8Q@(@(AA4A6{A =AAtAPAA|AhAb{A8AA{A&{A {A{A{@(AAADA:{AA(A{A*{AF{>??@XQ@?>\>??!G@Q@@???@??!G?@?>\@??!G?aG???@@@ @(Q@(Q@@AA,A:{AR{AAxAB{Ab{A =Av{AhAJ{A.{A&{A{A{A{A @@@(A4ALA(A6{A0A{A*{>>\?@ @@(Q?@>?aG???@@xQ?@@ ?????????@?@@Q@Q@ @8Q@XQ@@A{AF{AJ{Ar{A =AHA<AJ{ApAj{AhA*{A(AA{A>{AA@AB{A@(AA{A{A,A0A0??@@@??@??aG@@ ?@@(Q@(?У@Q??!G?@?@???@@Q@`@@@8Q@XQ@(@(A{A<AHAF{ApAz{AHA6{AB{AdA`Ab{A@A*{A{A@An{AA =AxA4@(@@@A{A???aG@ @(@HQ??@?aG?@xQ??aG@@0?@???aG?!G@?@@8Q@(@(@Q@Q@XQ@(@(@(A{A8A,A"{AN{A =A8A&{A.{AJ{AhAZ{AxA{A{A6{A =A =AAAJ{A*{A$@(@(A???!G?У@(@(@??@?@8Q@8Q?!G?@Q??@>\?@?@(Q@`@(@HQ@Q@0@(@(@A A"{A<AA AF{AJ{A{A&{A(AV{ATA\A*{A*{A2{Av{AAAA =AAZ{A A@(>\>\?@@0@(@(??aG?@P@@(Q?@>\??@??@@p@@@ @XQ@(@AA{A A&{AA,AV{A`A A$A:{ALALAHA0A.{A<AA =ABBAAAV{A0?@@`@(?У?aG?@p@@(??>\?!G???@@0@@@@@@(@@A {A{AA{AA$A>{A,A"{A&{A.{AB{AF{A8A@AHAZ{AA =A =BB1B@B A?У@0@?aG?@@@@p@8Q?>\>\???@??У@@HQ@(@@@@p@(@(@(AA{A{AA*{A@ADAB{A"{A A"{A@A<AB{AR{ALAN{AdA =A =BB$BEB>?!G????aG?@@@(?У>\?>\?!G?@`@@?@@@(@@@p@@@AA{A{A{A AA>{A@A(A{AA$A4A@APA`A\Ab{AlA =A =BB)BQ?????@`@(@(@XQ?!G>\?>\?>\??@ @(@(@@(@(@(@(@(@@@AAAA{AAAAAAA{A(A2{A@AA^{AXAB{A^{A =A =AB>\?????@@(@(@0??!G>>\?!G?@XQ@@(@xQ@@@(@@@@@@(@AAA AA A A {A{A{A(A>{AJ{AR{AXAJ{AHAJ{AtAA?@?У@@??@(@(@P?!G>\??@>\??@Q@(A@(@`@(@@@(@(@(@@(@(@(@(@(A{AA{@(A AA$A8AJ{AdAz{A^{Af{AV{AV{AtA????@(Q@?@Q@(@`?>\?aG??@>\??@Q@(@@xQ@p@@@@@@(@(@@@@@@(@@@{@(@(@@AAA{AA A{A{A =??aG?У@@@ ??@@(@P?!G????@>>\>\?@HQ@A@(@xQ@(@(@@p@@@@(@@A@(@@@(@{@@(@(@{@(AA =@{@@(A>\?@0@@@?У??@Q??aG?У??!G??@HQ@(@(@(@@(A{@@@(@@AAA {A {@(@@@@(@@@{@@{@(@{@(@{@?@@(Q@@`@Q?aG>\>\??!G??@?У?>?@`@@(@@@A@(@@(@(AA {A{AA@{@@@{@@@@@@@@(@(@?@p@(@`@?>\??@8Q?>?@`@(@(@@@(@@(@@(@AA{A"{A6{A>{@@@{@(@{@(@{@{@{@@@(@{>\?@0@@@??!G@Q?>>?@P@@(@@(@@@@(@(@AA A0A:{AA =A{@@@@{@{@@@A(@(>\?aG@@(@xQ???@?>?@@@@(@@(@(@(@@(@(AA0A4AF{A A {A{@@{@@@{@@@@@(>\>\?@@(@@?>\>\>???@PAA$@@@@@(A AA4AHAR{A{AA A {A =A =A@@(@{@@(@(>\@Q@(@(?>\>\?@?@@(A(A(A@@(AAA2{ADA^{A(A"{A{A =A{A{A =A"{A @{@{@@>\??@(@hQ>\?!G>\>?@p@(A"{A,@@A{AA6{AHALA A(A# =A(A# =A$A,A*{A A @(@@(>\>\>\>\?@(??!G>>>\>??0>G?aG@ @@(A{A&{A @(@{AA<A@AA A,AN{A,A(A0A4A(A =AA =A{>\>\?@ @?>??\)?Ǯ?p?@XQ@(@(A A(@@{AA&{A>{AN{A\An{A8A@ADA<A+ =A$AAA =A{>>\>\>?@@hQ@(?!G????Q?@@(@(@xQ@(@(@(A&{A A{A4AHAZ{ApA0A8APAPA0A(Av{A =A# =A,>>>>?>\?aG@`@P>>?@??@HQ@@(@@L(@(@(@AA,A<A{AA$A$A,ADADA; =A+ =A =A A' =>>\>\>\>\>\>\>?@ ??@ ?Q?\)?@?@hQ@@@{@(@@(A{A{A&{A8A {AA{A$A8AC =A =A3 =A$A A# =>\?!G?>\>\?>>\?aG?aG?>>>G?У???!G?@?aG@Q@HQ@(@(@@@@A@(AAAA A/ =A6{A3 =A2{A4A/ =A0>??!G?!G>\>>\>\?aG??!G>>\>\?>\?0?Ǯ?У???O\)?aG?Ǯ@XQ@(@@(@@(@@(AA{AA$A,A>{AF{ADADA8>\?!G?@?!G???@>\>\>\??@?Ǯ@8Q@ ??\)?@@hQ@@@@@(@AAA' =A3 =A@AN{AZ{A_ =AP>>>\?!G?aG?>??!G????>\?>\?!G??Q???@?aG@@P@C @\(@(@{@@(A =A# =A4A<AB{AJ{A\A_ =>>\>\>\>\?aG??!G>>>\?>\???!G?!G?!G?\)?0?@??Ǯ???p?@ @hQ@@@(@@AA =A' =A A$A\?>\>\?!G>\?????!G?0?O\)?O\)?O\)??@(Q???Q@,(@S @p@@{@A {AAA =AA.{>??@?!G?!G?@?aG???!G??У?У?!G?!G>\?O\)?p?0?0??p??У?@(@HQ@hQ@@{@@(A@A =A+ =??@?aG?aG??aG?aG??@?aG?!G??!G???O\)?0?aG????O\)??Q?У@@0@\(@@{@@(@@A{>>\?!G??????@?!G>\???!G>\>\?!G?aG?0?aG?????p?Q?@@0@\(@s @@@(@@(>\?!G????????>\???>\??>\>\?p????Q?У?Ǯ?Q?У@@(@8Q@\(@p@@(@{??!G?@??????!G>\?У@(Q@?!G?!G?>\?Q??Q?Ǯ???Q?Ǯ?Ǯ?Q?Q@# @L(@p@@>?!G???У??aG??У?@?@?У?>\?@??O\)?Q@(@3 @(?Q?Q?Ǯ?Ǯ?@@# @<(@c @??aG?@?@?У??????@??aG??@>\>G?p?Ǯ@Q@@@ @ (?Q@@ (@Q@8Q@XQ?@???@?????У>\?????!G?>\>\?0?p???@Q??@ @ (@ @3 >\?aG???@???@??!G?aG??У?!G?>\?\)?p????Q?Ǯ?Q?@Q@ @(??aG?У?У?@??>\>\?aG???!G?@????Q@ @ (@(Q@3 @,(@ ?!G?@??>\?aG???>\>\?!G?0?aG??Ǯ@ (@`@s @p@<(>\?!G?@??>\>\??aG?aG???0?p???Q@(Q@8Q@0>\>\?aG?У??aG>\>\>\>\??!G>G?@?aG???Ǯ@@Q>\??!G??@??????У?@@ @8Q@8Q@ @ @ @0@0@@@`??!G?!G?@?aG?????У?@Q??@0@(@`@XQ@hQ@`@p@(@@(@>\??!G?@????У?У??@@@ @ @Q@Q@@(@(@@@(@(@@@(???@???@Q@Q@@Q@Q@Q@Q@ @ @(Q@8Q@@@(@@@@@(A{A A >\???!G?aG??@@@HQ@8Q@`@@@Q@@ @0@8Q@8Q@XQ@p@@(@@(@@A {A"{A*{>\>\???!G??У?@(Q@(@HQ@8Q@Q@Q@Q@(Q@8Q@P@hQ@@@@@@@A {A{AB{A\>\??@?aG??@Q@Q@`@`@Q@Q@ @ @0@P@`@@@@@(@(@(AA8ATAdA|??!G?aG???У@(Q@@@ @Q@Q@Q@HQ@P@8Q@`@p@(@(@(@(@@(@AA2{A<A8AD??@???@@Q@Q@Q@@Q@P@P@@@XQ@`@p@p@xQ@p@XQ@XQ@p@xQ@(@(@(@(AA??!G???У@Q@(Q@8Q@Q@@8Q@P@p@@p@xQ@(@xQ@`@HQ@@@HQ@HQ@P@@@hQ@@(@@@>\?>\?!G???@8Q@@@8Q@ @(Q@8Q@@@(@@@(@@hQ@P@@@XQ@P@HQ@@@0@0@HQ@p@(@@(??@??@P@@@hQ@p@HQ@P@@xQ@@@(@@(@xQ@p@p@@`@P@@@@@@@P@0@HQ@P@HQ@@@p??@?!G??У@Q@HQ@@(@XQ@HQ@(@@@(@@@@@@hQ@p@(@p@P@(Q@`@0@HQ@XQ@`@@@@(@(??@?@@@xQ@@@(@p@xQ@@(@(@@@(@(@xQ@@@(@@@0@@(Q@@@p@@@@(@(@(@(@(?@??!G?У@@@(@(@@@p@@@@@(@@(@@@hQ@hQ@p@(Q@ @ @XQ@(@(@@(@@@@@@@?>\?aG@0@(@(@(@p@(@@@A{@(@(@@(@@xQ@0@ @@ @P@(@@(@@(@(@(@(@(@(@@@???!G?@(@(@@hQ@p@@(@A{@@@(@(@@p@(Q@Q@@ @hQ@@@@@(@@(@(@(@(@`@HQ@0@(Q?@@0@@@@@@(@(@@(@(@(@(@@(@0@@ @P@p@@@xQ@xQ@p@@@(@(@@@Q?????@0@(@@(@@xQ@(@(@@(@(@@(@@(@hQ@@@8Q@`@p@hQ@xQ@@p@xQ@@(@(@(Q?????aG?@?!G?@@@@@@@xQ@@(@@(@(@@(@@(@p@P@hQ@hQ@hQ@p@@@@(@@0?У??aG?@?@?!G?>\??!G@@@(@@@@xQ@@@(@@@@(@(@@(@(@(@@@@@@@XQ@???aG?!G?!G???!G????@@@@(@@`@p@@@(@(@(@@(@(@@@@@@@(@p@@p@HQ????aG?@?@?!G?@???????@@@@(@p@(@@(@@(@(@@@@@(@@(@(@xQ@hQ@p@P@Q?У?????aG???@@@Q@>\?>\@ A@@(@xQ@@@(@(@@(@@@@(@@(@@(@@@(@p@ ????????У@@@Q@Q@Q@?!G?>\?@@(@(@(@p@(@(@@@@(@@(@(@(@(@(@@(@(@(@(@HQ@Q@??????@Q@ @Q@@Q@Q????!G?@(@(@(@@hQ@@(@(@(@@(@@(@(@(A@(@(@(@@@p@0@Q@Q?????@Q@ @@@?????@???@@@@(@p@p@@@(@@(@(@@@A@@@`@p@@p@0@ @Q@????@Q@Q@Q??????@>\?!G????aG@Q@p@xQ@(@p@p@@(@(@(@@@@AA{@(@hQ@`@(@p@0@ @8Q@(Q??У??У@Q@Q@?????aG?aG?@??!G???!G?@@8Q@@(@p@@@@@@(@@@(A@@(@XQ@p@xQ@@@0@@@0@Q????????????aG?@?!G?!G?!G?@??!G?@?@@XQ@(@(@p@(@(@(@@@(@@@A{@@xQ@P@hQ@P@0@@@P@ ??У??@??У???????@?!G?>\?!G??@?@?@Q@P@@@p@@@@@(@(@(@A {A@(@P@@@P@@@8Q@@@HQ@Q??У?@@?@Q@ @Q????@?!G>\>\?aG>\>\??@?aG?@@P@xQ@xQ@hQ@(@@@@xQ@hQ@@(AA@(@@@@@P@HQ@P@`@0@Q???@@@8Q@HQ@0@Q???@?>>\?!G>??!G??aG?@Q@8Q@XQ@XQ@`@@@@`@P@`@(@(@@@p@ @@@XQ@P@P@8Q@Q@??@Q@Q@P@(@P@0???@>\?@>\>??!G?!G??@@(Q@@@XQ@hQ@@@@`@0@`@@@(@(@8Q@(Q@@@P@HQ@8Q@ @@@@Q@0@p@(@xQ@HQ@????aG>\>\???@??@@ @8Q@XQ@p@xQ@(@(@`@HQ@@(A@(@@(Q@8Q@XQ@P@HQ@8Q@(Q@(Q@ @(Q@XQ@@@(@p@@@Q??@>>?!G>\??!G?@??@@Q@0@@@@@@@hQ@XQ@(AA@(@xQ@0@`@p@XQ@XQ@XQ@P@@@XQ@(@(@(A{@(@xQ@(Q??>\??@>>\??!G??@@Q@(Q@@@@(@(@@@@@A @@@P@xQ@p@`@hQ@@(@@@(AA,A@@P@Q??!G?!G??@>>>\??!G??@?@Q@HQ@(@(@(@(@@@@A{@@@XQ@hQ@P@`@p@@@(@A AF{AF{@(@(@0@??@?>>\?!G>\>>\??@??@?@Q@@@(@@(@@(@@(@@(@@XQ@XQ@HQ@0@XQ@(@(@(@(@A{ATAHA{@(@P??@???>>\?!G?>>\?!G?aG??@@@ @@@@(@@xQ@xQ@@@@@(@@@8Q@Q@Q@HQ@@@@(@A"{AF{A@A{@(@??!G?aG??У>>>\?!G>\>>\?@????@Q@8Q@0@`@p@XQ@hQ@xQ@(@(@@(@hQ@ @Q?@@HQ@@(@@AA8APAN{A8@@???!G???>\>>>>\>\>>\?@??У??@Q@HQ@P@XQ@hQ@XQ@hQ@@(@@xQ@(@HQ@??@Q@P@(@(@@(A,AZ{AZ{AB{A>{@(@(????@ ?!G>\>\>>\?aG??У?У?@Q@HQ@P@`@hQ@`@@@@(@hQ@@HQ@@@@ @`@xQ@@AADA|Ar{ALA.{@@XQ??!G???@hQ>?@>??>\>\?aG????У@Q@@@P@`@p@XQ@(@(@(@hQ@P@@HQ??@@(Q@`@p@(@(AA<A^{Av{AHA@(@8Q?aG????@hQ>???!G?!G>\>\??????@8Q@HQ@`@hQ@P@@@@XQ@HQ@(@0??@Q@(Q@XQ@p@(@@A,AF{APAA@(@Q?aG?@???@Q@P>??!G?@?@>>?aG?????@0@P@`@`@HQ@@@xQ@8Q@8Q@`@ ?@@Q@0@P@`@@(@A2{A<A{A A{@@??!G?!G??@Q?@@@xQ>>\??aG??>\>?@?????@8Q@`@`@`@@@p@p@`@8Q@ @P@(Q?@@Q@@@XQ@XQ@@(A{A>{A^{ADA*{A{@(@(Q??@???У@@Q@(@(>?>\???????aG?aG???@8Q@`@P@XQ@HQ@XQ?@XQ@0@Q@HQ@0?@Q@0@HQ@hQ@P@(@(A{A8ApAhAB{A@@0?????У@@8Q@A{?>\??????!G>\>\?@?aG???@0@p@P@XQ@P@XQ@xQ@`@(Q@Q@8Q@8Q?@@HQ@HQ@XQ@`@(@@A<AdAr{AR{A&{@(@P?@?У??@@A(A =>?>?!G?aG@(Q??>\?@???!G?aG???@8Q@(@XQ@P@P@HQ@@@Q@(Q@0@8Q?У@Q@P@P@P@@(@@A6{Af{AAN{A4A@hQ?@Q@Q??@Q@AF{A?>\>\??@(Q@?>\???aG?@?!G?aG???У@HQ@(@hQ@XQ@hQ@8Q@p@@(Q@0@ @ ?У@ @`@XQ@`@@@(@(A2{Aj{A =AZ{AXA@(@Q@hQ@8Q??У@@(AF{A =?!G?@>\?@@P@(Q?@?>\????!G?aG?aG??@@@(@xQ@XQ@xQ@8Q@XQ@@8Q@8Q@ @ ?@8Q@p@@hQ@(@@A{A.{A =AAA =AH@(@HQ@@(@?@Q@AB{A =?!G?@>\@@@@>\?>\????aG????У@8Q@@xQ@P@@HQ@P@(@P@(Q@(Q@@@0@hQ@@@(@@(A{A<AdAAAAhA@@@@@@Q@ @pA Ar{??!G?@@P>\???У?????@0@(@@8Q@@XQ@@@(@xQ@0@P@@@0@hQ@(@@(@@(AA@AZ{A =A =A =Aj{A @@@@@(Q@0@HQ@A2{??@>\??@8Q???@Q?????@ @hQ@(@8Q@p@p@XQ@(@@hQ@xQ@@@0@`@xQ@@(@xQ@(@(@AA`AA =AA =A\A@@(@(@p@HQ@8Q@hQ@?@??У>\???@0?????@Q@P@@@@P@@(@@@@(@@P@(@p@@@xQ@@@(@(A>{AA =A =A =AAX@@(@(@(@@0@`@(?aG????>\?aG?@8Q@Q???@ @Q@HQ@(@P?@@(@(@(@@(@@(@(@(@(@(@(@@(@(@(A"{AXAA =AAAj{A&{@(@(@@(@p@8Q@xQ???!G???>>??aG?@@ ????У@@8Q@`@p@P@(@(@@(@(@@(@@@(@(@@(@@(@(@(A{A,AZ{A =A =AA =AF{A{@(@@@@P@P>\??@??!G>\>\>\?>\?!G??@@(Q????@Q@(Q@P@@`@(@(@@(@@@@@(@(@@(@@@(@@(@AA2{AxAA =A =A =AP@@@p@XQ@XQ@XQ??!G?!G????@?!G>??У?@@@????@@0@P@(@(@(@(@(@(@(@(@(A{A$A{@@(@(@@@(@@(AA A*{AHA =A =AA =A{@(@`@0@(Q@HQ??!G???????aG>>\???У?@@@????У@(Q@`@@(@(@(@(@(AAA(A4A@Ax@@@(@A{@@(@@A{A{A{AB{A =A =A =A\@@@`@@@@??!G?@?aG?>\?@?aG>\??@Q??@Q@0???У?@(Q@`@@@@(@@A{A$AJ{A,A&{AAH@@(A{A@(@@@@(@(A{AA:{A =AAA\A@(@`@HQ??aG?aG??!G>\?>?@?!G???У@(Q???У@XQ@ ???@Q@XQ@@@@@@(AA,AHA{AJ{AA&{A*{@(AA{AA@(@(@@(@A{A$A6{AhAAA8@(@@p??aG?У?????>\?@>\?@?@?>\?@xQ???@0@XQ??@@Q@P@@(@(@@@(A{A6{ADAF{APAAAAA{A{A{AA {A@(@@@(AA{A{A2{A:{A{@(@(@?aG@Q???>\?>\>?aG??!G?@@ ???@@?@@Q@P@@xQ@@(@(@(AAAV{Ab{A\AA =AA<AA{A{A(A{AA@(@@@@(A{A{AA@@(@(?@(Q????>\?aG???!G@xQ@p??У?@ @P?@@@@@(@@(@@(@@(AAN{Az{A`Ar{AA =AAA(A>{A*{A6{AAA{A {@(@(@@(@@(@@(@@(??У????@?У?>\>@@@ @??У@P@@Q@ @0@p@(@@@@(@A{AB{Ar{A6{AZ{AxAA~{AA4AB{APA\A,A{A"{AAA{A@@@@@(@(@?aG?У??>>\?>??У?>\?!G@P@xQ@ @?@0@`@ @@ @XQ@(@@(@@@(@(A{AV{Af{A8ADA|AA =AAxAdA`A6{AAA.{A*{A{A{@(@@@(@(@@>\???!G>>>?!G>>>????@@`@Q?@@(@0@Q@ @HQ@p@@@@@@AA4A|ATA*{A:{A =AA =AAAA>{A {A{AA,A{@(@@(AA {A@(@?!G?aG?>>>>?>>?!G@?У?!G@8Q@(@@@ ?@hQ@(@Q@@8Q@hQ@xQ@p@xQ@(@(@@AAf{AA8AA =A =AAA =A =A =A*{AA{A$A{A{A {@@(AAA A{>\>>??aG>>>?@??@xQ@p@HQ@@Q@@p@@ @hQ@p@p@hQ@hQ@@(@A{A&{ALAXA<Aj{AAAA =AAA:{A{@@A{A"{A{A AA$A0A A$>???@>?@@Q?aG?@@@@(@ ?У@0@?@@P@(@@hQ@p@@@AA{AADA8Ar{A|AV{AAA =AA =A =A,A{@@A{A{AA0A4APA<>>?aG?>\???У??@HQ@@P?У?@P@0@@P@xQ@(@xQ@hQ@p@(@(@A{AA{A{AA2{ALABABA =A =AAB{A"{@(@(@@(AA A{A$>>?aG>\?>\??aG?У?!G?!G?@@XQ@??@p@ @8Q@@(@@XQ@XQ@p@@@(AA{@@A {APA =A =BB"BPA =A =A =AF{A0A8A {@(A{@(@@?@?aG?@>\??aG>\?@@0@hQ@0??@Q@XQ@HQ@xQ@(@(@p@`@p@(@@@A @(@(@(A&{A =AB+B9B%AABAA"{A{A>{A4ALA(A(A{>\?@?@>\???!G>?!G?@XQ@???@Q@P@xQ@@(@p@P@XQ@@@@@A{@(@(A AA =A =B,BAA =BBAADA AA6{AXAlAR{>\>\?aG?@>\>\>\>\>>\?aG@Q@(@?У??@P@@(@@xQ@P@HQ@P@p@(@@@@@AA^{AAAA =A =A =ABBA =A2{AA {A,A"{A ???>>\?aG>\>\??@8Q@@??@HQ@@@@@p@@@@@HQ@hQ@@(@(@(@(AAA~{A =AA =A =AA =AABA =A`AA{A A >\>\>\>\??@??>\>\>\?@>\?@?@@(@XQ@@0@(@@@@@XQ@8Q@8Q@P@`@@@(@(@(AA{A =AAA|Az{AlAAz{ApA^{A =AAdA{A{>\>\>\>\>\?>\?>\>>>\>\>\>?>\??@ @@@@Q@xQ@@@@(@xQ@P@(Q@@@P@XQ@xQ@@@(@(AA^{APA =A =AN{A6{A8A@A~{A,AA AXAHAB{??>\>\>\?????>\>\>\>\??!G?@?@@@p@Q@hQ@(@@(@@@`@0@8Q@HQ@HQ@P@hQ@@(@@@(A{A.{Av{A =Az{AAhA@AA {@@(AAB{??!G?>\?!G?@?!G?!G>\>\?>>>>\>\????@?@ @@?@8Q@@(@@@(@@8Q@0@8Q@HQ@@@P@`@@(@(@(@(A>{AR{A =AAA =AV{A@(@(A{A A>\?!G?!G?>\?@?aG?aG?@>>>\>>\>\?@?aG?@??@?@@@Q@@`@(@(@@(@@p@@@0@@@HQ@HQ@XQ@p@xQ@@@@A<AR{AABA =A =AZ{A@@(A>\??!G??@????>>\>>>\>\?@@ @Q???!G??У?@Q@@@(@(@(@(@xQ@P@P@HQ@P@P@XQ@hQ@@@@(@@ATA*{A =A =AA =AAA@>\>\>\??!G?aG??aG>\>?>\?@@(@??@?@0@@(@(@@(@@@@C @`@hQ@`@0@p@@@<(@L(@@{@@{AAhAA =AzA =As =A,>\>\??aG?@>\>\??@(@(@Q??@Q@?@XQ@@@@@@(@@(@(@p@p@`@xQ@<(@ @(@C @@(@@(A6{AA =AAzAAz>\>\>\???!G>\>\>\>\@Q@(@(@HQ?aG?aG??@@(@(@@(@@(@@@(@@@@@xQ@0@ @(Q@XQ@l(@@@AA? =Ao =AzA =Az>\>\>\>\>\?!G?@??@??>\>\?@(@@`??aG@@0@0@@(@@(@@@(@(@(@@@@@XQ@3 @ @(Q@C @`@{@(@AA$A# =AtAz>\>\>\>\>\???@????>\>\>\??!G?У@(@@??@@@`@XQ@(@@(@@(@(@(@@(@@@@@`@@@8Q@@@@@l(@(@(@AAz{ATA>\>>?@?aG?@Q@Q??!G>>\>\>\?>\?!G?@(@(@xQ@?@?@(Q@p@@@@(@(@(@(@@(@(@@@@@l(@XQ@HQ@L(@`@{@{@(@A =ATA*{??@??@Q@??@?>\??!G??@@@hQ@hQ@(@(Q?@@@@@@(@(@@@@(@@@@(@@l(@`@\(@XQ@XQ@XQ@@{@A AA??aG???@Q??>>\?>\?@?@ @Q?@`@P@@hQ?@Q@HQ@@(@(AA A {A@A@@(@(@(@s @c @c @XQ@XQ@XQ@P@@{@(@{@(?@???aG?@?@??>\>\?????@HQ@8Q@xQ@(@ @Q@(Q@@@A{A{A AA{A{A{@@@@|(@(@(@s @l(@`@c @l(@@@(?!G????aG?!G?aG@????aG?@Q@ ?@(Q@Q@P@@@(Q@HQ@(@@A {A AAA{A{A {@@(@(@(@{@(@@(@@@@s @p???У??aG??!G@Q???!G?aG??!G?Q@@?У?@Q@P@(@(@0@@@@(@(A{A{@{A$A$A"{@{@(@{@@(@(@{@@@@(@@(>\?@XQ@Q??@?!G@?aG>\?aG??>G>G??@8Q???@Q@hQ@xQ@0@HQ@@A{@@(A(A2{A8A8A6{A0@{@@{@{@{@@(@{@(@???@P???>>\??>\??Q??@?!G??@?У?У?@ @8Q@(Q@@(@(@(AA"{AB{AV{ATALAF{@{@@{@(@(@A @@@{>?@??@@@??>\?!G?>>G?@@@0??!G??O\)??aG?aG?@Q@@(@{AA{ADA`Aj{AA{A@@{@@@@{@@@?!G??У????aG?!G>\>?!G???@XQ@(@??Q@P@(AAA&{AF{AF{AF{A@@@(@@A@@(@{@>?@?@(Q@@Q??!G>\>>\??!G>\?@8Q@(@0?!G?@ @(@(@AAA$@(@@{@{@(@@@@@(@@>>>??@ @HQ??!G>??>\>\>\?aG@Q@(@`??0?@(Q@(@@@A{@@{@(@{@(@@{@{@{@@{@{?>\>??@8Q@hQ??>>\?????@`@(?O\)?\)?aG?@HQ@(@@(@{@@(@(@{@{@{@{@{@@(@@?!G>>?aG?@hQ@@>\?>\>\??@XQ@0@@HQ@8Q??\)????@hQ@@@@(@{@(@{@(@(@@(@{@{@(@(>\>?aG@ @@(?>\?@@@(@(@(Q@Q@(Q@ ?>G?aG?У@Q@P@@(@@@@{@(@@@@{@@@(>>\>\?@@@(@@Q>\>\??@?У@@(@P@@@# @?\)?p?Q@ @l(@{@@@@(@@{@@@{@@@{>>>>??aG@ @A{@ >\?@?@??@ @(@@Q@Q@# @ (?O\)?\)?@Q@xQ@@(@(@{@@@@(@(@(@(@@>>\?!G??У@(A@P>?!G?@???У@@@(@,(?@ @Q??@?0?@ @HQ@|(@{@@@{@@(@(@(@@{@>>\????@(@(@>>?!G????Ǯ?У@ @@@Q?Q@@Q?aG?@???@# @HQ@p@{@@(@{@@{@@@@{>>\>???@@(?>>>???????????У@ @0@ ??@@ @0@P@p@(@@{@(@@(@{@?>\>\?@(@(?!G>>>?!G?@??????Q??aG?@ (@3 @,(??@ @ @# @<(@\(@{@@@@{@(@{????@@@`?>>>>???У???O\)??O\)?0??Q?Q??@ @# @(Q@ @(Q@HQ@`@(@@@{@(>??@Q?У>\?@(Q@8Q??@?Q???0?\)??!G?@?O\)?p??Q?@ (@,(@ @# @3 @S @p@@{@?!G?>>>??@Q@Q?!G?@Q@(Q?>?0??Q?Q?\)>G>G?\)?p???Q?@ (@Q@@(@3 @P@p@@??aG>\?aG?@0@8Q?????>G?@?Q??p?>G?0???@(@3 @,(@Q@# @C @`@xQ@|(?!G>\>\??@??@Q???aG??У?aG>>>>?O\)???p>G?\)?0?@@ @@@3 @# @8Q@HQ@\(@`>\>\>\??>>???@Q??@?@?aG???@>\>>>>>G??p?0?@>G??@ (@Q@@(@0@@@L(??>\>\>\>\>\>\>\>\?@??@???У???>\>?!G?>>>\>\>G?\)>G?@??Q??Q@ (@(@(Q@3 ?!G>\>\???!G?@?!G?>>>\??@Q?У?@ @Q?aG>>??aG?>\>G?\)?0?O\)??Q?Q@Q@ @ (@Q?!G?aG??У@@Q@@0@@@@@hQ@P@hQ@0@8Q@0@@@xQ@@@(@(@(@(@(@@@(@(@@(??@????@Q@(Q@HQ@@@(@p@XQ@xQ@XQ@`@`@p@@@(@@@(@@(@(@@@(@??!G?????@Q@HQ@p@@P@@(@@@@(@hQ@`@xQ@@(@@@@(@(@@@(@(@(??!G???У?@@(Q@P@hQ@(@@@@(@(@(@xQ@xQ@`@@@@xQ@@@@(@(@@@@(?!G?aG??У@@@@8Q@@@hQ@@@@@@@@@8Q@@@`@`@p@hQ@p@@(@(@@(@(@(@@(??!G???@@ @Q@@Q@hQ@@(@(@(@p@(Q@ @ @0@HQ@XQ@hQ@@p@@@@@@@@@??@?@@Q@(Q@0@8Q@ @XQ@(@(@@(@P@@@@Q@8Q@@@XQ@XQ@`@P@@@@XQ@(@(@@@(@?@?@@@8Q@@@0@0@0@xQ@(@(@XQ@ @???@Q@ @ @8Q@8Q@0@ @@ @8Q@@@(@(@@(@>\??@?@Q@(Q@0@8Q@`@@@@(@(@@@Q??У?У?@@@Q@Q@Q@@@??@Q@Q@P@XQ@XQ@hQ@`?@?@@ @0@p@hQ@8Q@hQ@@@8Q??У??У??У??????????@Q@Q@ @0@P@`@`?!G?@@@@xQ@xQ@p@`@xQ@(@hQ@P@Q????У????У?У?У??У??@@Q@Q@0@HQ@HQ@HQ@p@(>\??@ @0@@@P@P@hQ@xQ@P@0@????????????У?@Q@Q@Q@Q@8Q@HQ@`@hQ@`@P@??@@(Q@HQ@HQ@0@XQ@xQ@P@0@@Q@?У?????????@@@Q@Q@Q@(Q@HQ@`@xQ@xQ@P@8Q@p?aG?У@@(Q@0@ @HQ@p@`@0@Q@@Q??У??????У@@@?@@Q@@Q@@0@(Q@ @@??У?aG?@@@ @Q@0@@@@@Q@@??У?????@@Q@ ??У????У??????????@@ @Q@@ @(Q@Q@@@Q@Q@?????У@Q@ @8Q@Q@@?У??У?У@Q@@@@@Q@Q@@>\??У?У?@Q@?У?@Q@@Q@@?У?У??@Q@@@(Q@Q@Q???@@@(Q@P@P@8Q@8Q@8Q@8Q@(Q@@?aG?@?@@Q@?@@@@@Q?@@@@ @`@`@0@@@Q@@Q@(Q@@@p@p@p@P@@@8Q@(Q@Q@@Q?@????У???@Q@Q@@Q@Q@@Q@Q@(Q@P@HQ@0@(Q@@@Q@@0@`@p@xQ@`@XQ@HQ@8Q@(Q@@Q???@?????У???@@@Q@0@ @@(Q@8Q@XQ@HQ@Q@Q@@?@ @8Q@hQ@@(@XQ@HQ@@@0@(Q@@Q@@???@???????@@Q@ @Q@Q@0@0@P@`@Q@Q@(Q@@Q@(Q@HQ@hQ@(@@P@@@0@ @@Q@@Q@??>\?@???????У@@Q@Q@(Q@(Q@@@8Q@0@hQ@(Q@Q@0@(Q@@(Q@P@hQ@@@@@(Q@8Q@ @@Q@(Q@ @@@8Q@HQ>\?@?aG????aG??@Q@Q@@ @8Q@P@HQ@XQ@P@@Q@0@Q@@HQ@@@(@(@P@8Q@8Q@0@(Q@8Q@hQ@XQ@HQ@`@@@(>??!G?aG???@?aG??@@Q@@ @HQ@@@0@XQ??@@(Q@Q@0@P@(@@@p@`@P@XQ@p@@(@@@(@(@(@??@?aG?aG???@??У@Q@Q@Q@Q@@@@@0@@@(Q?@@8Q@(Q@0@hQ@xQ@@(@xQ@@xQ@p@(@(@@@@@@@(@(>?@?aG?aG??@??@Q@@Q@(Q@0@HQ@HQ@(Q@HQ??@ @0@0@`@@(@@p@@(@@@(@@@(@(@@(@(@(@(???aG?@????@Q@ @ @ @(Q@HQ@@@@@HQ@0?@ @HQ@0@HQ@p@xQ@(@@(@@@@(@@@@@@(@@@@P?????@????У@(Q@8Q@(Q@0@0@8Q@8Q@HQ@P@@@8Q@hQ@P@P@XQ@(@@@@(@(@@(@@(@@@@(@@`@?У>?@Q??@?aG??@?@@@@8Q@P@@@@@HQ@HQ@0@(Q?@ @`@P@@@HQ@hQ@@@@(@p@@@(@@(@@(@(@(@(Q???>\?@@?У?!G??!G?aG?@(Q@XQ@0@0@@@@@P@HQ@8Q@@Q@HQ@XQ@ @@@XQ@@(@(@(@xQ@`@(@@(@@(@@(@hQ@Q????>?@Q@(??!G?@??aG?@`@`@(Q@0@8Q@0@P@8Q@8Q@@0@HQ@(Q@(Q@HQ@hQ@@@@p@`@@@@@@@(@`@ @?У???У??@@hQ@(?@?!G?!G?!G?aG@@hQ@P@(Q@8Q@@@@@8Q@0@(Q@Q@(Q@(Q@(Q@8Q@@@p@@(@(@p@@(@(@@@@(@@XQ@0@@@ @HQ@P>>?!G?aG@@8Q??!G>\?!G?@@XQ@P@@@@@HQ@@@0@8Q@@@ @0@Q@(Q@8Q@hQ@@@@@(@@@@@(@@(@`@@@ @HQ@XQ@HQ@>>\>??aG?@?>?>\?!G?@ @P@P@hQ@HQ@P@P@0@0@@ @ @Q@@(Q@@@hQ@@@xQ@@(@(@@(@(@@(@`@8Q@0@8Q@8Q?У?У?У>??@>\?!G??@xQ?>>\>?@?@0@P@XQ@`@XQ@hQ@8Q@0@(Q@Q@ @ @@0@8Q@P@hQ@(@@(@@@(@(@@@(@xQ@HQ@HQ@@@Q????>??aG???@??@XQ?!G>?>?@@HQ@`@XQ@XQ@XQ@P@(Q@(Q@Q@Q@Q@Q@Q@(Q@0@P@hQ@(@@(@(@@(@(@@@xQ@HQ@0@0@??aG?aG?aG??!G?!G???aG???У@ >\>\?@@P@XQ@hQ@`@`@@@Q@ @Q?@Q@@@ @0@HQ@hQ@(@@(@(@@@(@(@`@P@ @(Q@ ??aG?aG?!G???aG??@Q?@??@@Q>\?@?@Q@P@`@(@`@XQ@8Q@ @ ???@@Q@ @8Q@HQ@p@(@(@@@@(@(@P@0@Q@0@8Q???aG?@?>?@??@@?@??@ ?>>?@?У@(Q@P@`@hQ@XQ@HQ@@@(Q@Q???@@Q@(Q@HQ@`@hQ@`@(@P@xQ@@@`@0@@@(Q@HQ@(Q???aG?!G??!G?!G?@Q?@Q@Q???@Q?>??aG?@8Q@P@XQ@hQ@HQ@HQ@8Q@0@?У??@@Q@8Q@P@XQ@HQ@@@hQ@8Q@xQ@@HQ@@8Q@HQ@`@`@ ???@?@?@?aG?aG?@0?@Q??????@>?!G??@8Q@P@XQ@`@HQ@@@8Q@ @???У?@ @P@XQ@HQ@(Q@0@0@ @hQ@`@?@ @P@(@xQ@Q???aG?????У@p?@@?????!G>?!G?@@0@P@hQ@hQ@@@8Q@8Q@(Q????@@8Q@HQ@@@0@Q@Q@Q@(Q@`@8Q?@@0@xQ@(@@ ????У@Q??У>?У@(@@Q@?????!G?!G?@Q@0@XQ@hQ@`@0@0@@@(Q@Q??У@@ @8Q@HQ@@@(Q@Q@Q@Q@0@XQ@(Q?@@@HQ@(@(@@Q?У??@8Q@ @Q@8Q>\>\?@(@ @0@Q????У?>\?@Q@8Q@XQ@`@`@ @0@@@(Q@??@@8Q@HQ@`@HQ@(Q@?@Q@0@XQ@(Q@ @hQ@HQ@(@@@Q?@@8Q@P@HQ@xQ@(>\???@@Q@ @ ?aG??У?У>\??@ @8Q@XQ@`@XQ@ @ @@@0@?@@(Q@@@P@hQ@HQ@?@@ @HQ@P@ @0@xQ@hQ@@@@Q@Q@ @p@p@@A2{??aG??@(@(Q@ @ ?????!G??@ @8Q@XQ@P@P@(Q@(Q@@@8Q@Q@@Q@0@HQ@XQ@`@8Q@Q@@Q@ @8Q@8Q@8Q@P@(@p@(A@(@ @HQ@`@@(AAPA{?@???У@@HQ@@Q?????!G??@Q@8Q@HQ@@@`@(Q@ @HQ@@@(Q@@@8Q@P@P@P@(Q@@@Q@Q@0@8Q@Q@hQ@@(@(A{@@@@@(@@(A0A<@(>???@?@(@xQ@@ ??aG????!G?@Q@8Q@HQ@HQ@hQ@8Q@0?@P@(Q@ @ @P@`@@@HQ@Q@Q@Q@Q@Q@8Q@0@(Q@(@@(@(A{@@`@@(@(A{AA{@?!G??aG?@p@(@Q@(Q??@???@?!G?@Q@8Q@@@P@xQ@XQ@P@@p@8Q@ @@@XQ@`@8Q@8Q@Q@ @0@(Q@@(Q@8Q@8Q@(A{@(@(A{@@(@(AA{A{A@(@(>\>\????aG@`@@Q@ ??@???!G?!G?@Q@8Q@@@HQ@p@xQ@XQ@(@(@XQ@0@XQ@p@hQ@@@0@Q@Q@@@0@@ @@@HQ@(A {@(@`@(@(@(@(ADA4A2{A @(A?>\>\@Q??@P@(@ @Q??!G?aG?У?@?!G?@Q@8Q@8Q@HQ@xQ@(@hQ@@@p@HQ@p@(@xQ@XQ@0@ @@8Q@@@Q@Q@8Q@P@A@(@`@(A@(@(A^{Av{AxA>{A{A{??!G?@0?!G@ @@8Q@???!G??!G>?!G?У@(Q@8Q@@@8Q@xQ@@p@@@@hQ@(@(@XQ@`@8Q@ @Q@@@XQ@ @Q@0@P@xQA{@(@(@(A @(@(A^{AA =An{A>{A&{?!G??!G>\?aG@Q?@?@(@p???>\??!G>?aG?У@0@@@P@8Q@XQ@@(@@@(@xQ@@(@`@P@P@ @Q@8Q@p@HQ@(Q@0@HQ@@(A{@(@hQ@(A{AA*{AA =A =Aj{Af{?aG??!G?aG>\@(Q??@xQ@xQ@Q?У?!G>?@????У@(Q@@@@@@@@@@@(@@(@@@(@`@HQ@P@ @Q@ @hQ@xQ@HQ@8Q@@@@A{@@(@(A A@A(A =BBAA?@?@?!G??@>@?У?@@@@`@0??@>>\>???У@ @8Q@HQ@HQ@(Q@@@(@@@@(@@@(Q@HQ@HQ@Q@ @XQ@@`@P@P@`@(A{A {@@hQ@(A.{AN{AtA =A =BB?aG??aG??aG?@?@?@`@hQ??>???@Q@8Q@@@@@(@(@(@@@(@@(@(@@`@(Q@@@ @Q@@@(@(@p@hQ@P@@(A{@@(@xQA{ATAZ{A =AA =B.?!G??!G@?У?>\?aG@??@P@xQ@?>\>???@0@0@0@0@(@(@@(@@@@@A@(@Q@@@8Q@Q@0@hQ@(@(@@HQ@(@(@(A {@@(@A"{Af{A|A^{A =A?aG?>\?@Q???!G?У??@ @xQ@HQ?>\>???@Q@ @(Q@(Q@(Q@(Q@@@@(@@A,A\B @@(Q@0@(@(@XQ@@(@(@`@P@(@@(A@(@@@(A>{A =A =A>\??@@@(Q?>\>???@?@(@??!G>??aG?У@Q@Q@ @Q@(Q@0@`@@xQ@@(@(A =AB @`@ @(@(@(@(@(@(@(@(@P@@(@A@@@(@xQ@(AAN{A =?@(Q@0@p?!G>\?aG?@>\?!G@p@?>\?aG?@@Q@ @Q@ @ @p@@@(@@(A =BB @@ @(@(@(@(@(@(@(@@xQ@@(@(@(@(@(@@P@hQ@@@@ @ @(@>\???>\@(Q@@8Q?@?@@Q@ @@Q@ @8Q@hQ@xQ@@@AB"B@@HQ@(@(A{A{A{@(@(@@@(@(@hQ@xQ@@@hQ@XQ@ @@@@>\?@8Q@@@???!G??@@>\???@Q@ @@Q@@(Q@P@hQ@(@(@(AB B%AN{@(@(A{A{A{A{A{A{@(@(@@@xQ@p@@@@0@P@XQ@0@ @0>\?@hQ@@(??@Q???!G@HQ@xQ?!G???@ @Q@?@Q@@0@XQ@p@AAABA@(A{A{A{AAAA{@(@@(@@(@@(@hQ@HQ@@@HQ@HQ@(Q@Q??@@@@??@@Q?@?@?@HQ?@??aG?У@Q@ @Q??@Q@@8Q@XQ@(A{ABBA =AAAAAAAAA{@(@(@@(@(@(@(@@xQ@hQ@8Q@0@P?!G??@0A{@>\?@0??@?!G?У?aG>\?aG?@@(Q@??@?@Q@@@(@A$AB6AAAAAAAAA{A{A@@(@@(@@(@@@(@(@p@P>>>>>>\>\>\?@@0@(A"{??@@Q@??@?!G>\>\?aG?@@ @????@@ @(@A{AXBAAA{A{A{A{A{A{A{A{A@(@@(@A{@(@(@@(@@(@>>>>>>???!G?@@A&{@?aG?@@???!G>>\?!G?@@@?????@@XQ@(A {A{A =A8AP@(A{A{A{@(@(@(@(@(A{A A@@@(A@@@@(@>??>>>>?>\???@A{@Q?@@??@?>\?!G?aG?@@@????@@@@@(@A{A*{A{@@(@(@(@(@(@(@XQ@(@AA(A {AA {A A"{A"{@@@>??@>>>>???!G>\??aG@QA&{@??@Q??@>\>\?!G?@?У@Q@@Q?У????@(Q@(@@(ALAA.{@(A{@(@(@(@0@Q@Q@`@@A A{A$A{A&{AA(A*{AA.{>?!G???!G>>>\??@>\>\?@?aG@A4@??@?aG>\>>??@?@Q@@????>@Q@hQ@@A*{AXA.{@@A@xQ@0@ @(Q??@HQ@(@(A(AA A$A(AB{AXA*{A"{>?@???>>>\?!G>\>?!G?@@QA{@(@0?У@Q??>??@??@Q@??????У@P@(@(A0A{A:{AB{@@(@@Q@Q@???@8Q@A{A{A {A {A{A6{AXADA8?!G?@???!G>>>\>\?!G>\???@(A@@@@Q?aG??!G??@Q@Q??У????@ @@A"{AV{A =A =A @@(@0??????У@Q@`@(A{A{AA"{A>{AJ{A<?@??@?aG>>>\??!G?!G????@Q@(A@(@Q@Q?У?>\?!G?aG??У@@??????@(@APAPAr{AA{@(@`?????????@ @@@(AA{A<AR{>\?!G????>\?!G?!G?aG???@@@@p@Q??aG>??@??У@@@Q?У????@p@A{A4A*{A{A@(@??????????@Q@(Q@`@@@A{??!G???@?@?!G?!G>\>\?@@Q@XQ@xQ@@(@p@Q??aG>\>\??@??@@Q@??????@A{A6{A4A{@(@(@@(???????????@Q@0@HQ@p@??aG?????>\??>\?aG@@@(A{@(@@??>\>\>\>\?@??@@@??У??У??@ @AA<A"{@(@(@@(@@Q???????aG????@@(Q@0??@?У?У?aG?!G??@>\???!G??>\?@@hQ@@@(@ ???>\>\?!G??У?@Q@@??У?У?У?@Q@hQ@A{A>{A&{@@@A4@(@XQ???????@?@?@????>\>\?aG????>\???!G>\>\>\??!G?!G?>\?@ @(@@@p@@@Q??>\>\>\?aG??@Q@??????@0@@@@AA8A{@(@ApA"{A@(???????@?!G?aG???>\>\??????!G?!G??!G>\???!G?@?!G??!G@hQ@XQ@ @@@(@(@Q??>\?!G?@Q@Q@Q??@???@@0@xQ@@(A{A"{A0AH@(A0AlA:{@(??????@?!G?@??aG?>\>\??У??У?>\???!G?@??>\?@?aG??!G>\?@p@Q@@xQ@@HQ?>\>\>\?@Q@ @ @?@Q@@@@@Q@XQ@xQ@(@A$AAAtAB{ApAJ{A{@(@(Q???aG?@?!G?!G>\?????У??!G?@?>\??!G???aG>\?@P@Q?@hQ@(@(Q?>\??@ @0@Q@@@Q@@Q@(Q@Q@ @HQ@(@A =A =A =A =AAV{AAPAp@@@?aG??@?@?@Q@Q?aG?@>\?!G?!G?>\?????aG?@Q@Q?У?@@@??@?@0@(Q@@@Q@ @(Q@ @ @Q@ @P@(A`APAAA =BAA`A @?@(???@?!G>\??@???>?!G?>\>\?@??У?!G?!G@???@(@hQ?>\?@Q@@@0@ @@ @(Q@ @ @Q@@8Q@XQ@(A6{A8AA =BA =A =At@@(@(??aG?>>\>?@@@??>\?!G???@@?!G??У???@HQ@ ?@?@8Q@XQ@XQ@@@8Q@0@0@0@0@ @@(Q@`@(@(AZ{A =AAAA =A =A*{@(@?@HQ@p@@p@`>\?>\>\?@8Q???!G>\?!G>\>\?@0??@?????aG???!G?@Q@HQ@`@p@hQ@<(@@@P@XQ@`@Q@@(Q@@@(A{AhAAAA =AzAO =A@{@hQ@@@L(@XQ@(Q>\>\?!G?!G>\?@ @P????>>\?@ ???????@?@?!G?@@ @P@xQ@(@(@HQ@C @(@@p@8Q@ @ @`@@(AW =AzAAAA =AAzA =A A@{@(@??@???@p@Q??!G>\?>\?!G>??У@ @ ???????@@XQ@@(@(@@s @(@(@(@(@XQ@8Q@8Q@hQ@@(A(A =A =AzA =A =AA߅AzAzAg =AA =>\?!G???!G?@XQ?>\>\?>\>\?!G?!G?@@Q@(Q??aG?!G????!G?@@P@(@(@@@@(@(@@(@(@hQ@XQ@hQ@(@(@{A*{AAA =A =AzBAAzA =AzAz?!G??У????>\>\>\?!G?aG?aG?aG@Q@Q???????aG?@(Q@p@@(@(@(@@(@(@@@(@xQ@(@(@@@{A{AXA =AB=pBB!=pB&=pB-AA??@?@Q?>\>\>\>\>??!G??aG?aG@??aG>>\?@?????@HQ@@@@(@@@@(@@(@(@(@@@s @(@{AA\AAۅB=pBB5=pB:=pB2B4>\?@??@ ??>\>\>>\???@?@?@Q@Q??aG?@?@ @xQ@@(@@@@@@(@(@(@@(@@P@\(@{@(AA4Ao =A =ABB B=pB$>\???@@Q?aG>\>>\????@?aG?@ @?@?@?@@@@@@@@@(AA{A{@@@(@@\(@`@c @(@@A =A(A =AAŅAA =??aG??У@?У>>>\?@???aG??@Q??aG?aG??@8Q@(@(@(@(A{AA{AAA@@@(@@@@(@(@c @@{AA$Ab{AAs =>\??????>\?@???@??@??@??@@@(@@A {A{A@@A {A A@@(@@@@(@(@{@S @HQ@s @@{@{A{?@??????aG>>\?!G???aG?@??>\??@Q@xQ@@A{AAA@@@(A{@@(@@{@@(@@@@@c @s @c @S @?!G????aG?>?@?@Q@Q?????aG?!G?@Q@@@(A{A{A{A{@@(AAA@@(@(@@@{@{@{@@@(@p@>\>?!G????>\?aG??@Q??aG??p?0??@?@@@(@(AA{A(@(A(A A(A{A{AA@(@{@{@(@@{@(@(@(@?>\>??aG???>\??aG????????\)?aG?У@(Q@(@@A@{@A{AA,A4A @@(@{@(@@(@@@{@{@{@>\?>\>>\?@??aG?!G>???aG?У?Q???!G>G??@HQ@@(@(@AA{AA A0A.{A"{@@@@@@A@@(@(@>?!G??aG>\>??@?!G?!G>\>>\?@?@ @ ??@?!G?@Q@XQ@L(@(@AA{A{A"{A(@@{@{@@{@@@(@@@@>\???@>\>???!G?>\>\??@8Q@??@??@??Ǯ@ @<(@@@A {AA{@@(@(@@@@@(@{@(@{@{>?@??У?aG>>\??!G?!G>\????@@Q@@8Q?@?aG??@ @hQ@(@@A{@@@(@{@@(@@(@@@@(@{???У??aG?>\??>>>\?>\>\?@@p@`??aG@@ @L(@@@{@A{@@{@(@(@{@@(@@{@{@(?@?@Q?У?@>\>\?!G?>>\>\>\?>\>\??>??@HQ@XQ@(@@@A@@(@@@@@(@@@>?aG?@Q??!G>\>\>\?!G>\>\??>\??0?\)?@??@# @`@(@(@{@@(@@@@(@@@{@(@(>?@Q@0??>>\>\???\)?O\)?O\)????@,(@(@(@@@@@{@@(@@@{@@>\?@@8Q??@>?!G>\>?!G>G??@?Q?Q@8Q@?@0@@@s @@@@@(@(@(@{@@@{@{>>?@?@Q@p??aG?aG?aG>\>\>?\)?@ @,(@XQ@XQ@@ @<(@hQ@@@{@{@@@(@@{@@>?>?@?@0@??!G>\?!G??@>>?!G?p?@ @8Q@c @HQ@0@0@l(@@@(@@(@{@@@@??@>?@?@0@@ ?aG>???@>>>B\>B\?@???@# @3 @Q@8Q@@(@{@(@{A@(@{@@?!G?>??!G?@@@P@?!G>\?aG????>>>B\>B\?O\)???Ǯ?Q?Q@ (@@@xQ@@(@@(A@@@(?>\>>\>\??????@???У?>\>G?\)?0?0?p?O\)?0?O\)???Q@ (@Q@Q@8Q@l(@@(@{A =A{@@>\?>\?????aG??aG?!G>\?@???@>G?0??Q????Q?Q?Q@@ @ @ @<(@s @@@A@(@>\??@????!G?!G??>\>\??@??aG?\)????У????@ @3 @0@(@# @C @@@{@(@(@(>?aG?@???!G?aG>\>?>\??@??!G?\)?O\)?O\)??Q?Q??У@ (?Q@# @@@XQ@P@,(@C @{@@(@@???>>\???!G??!G?>\???\)?0?p????У??@ @HQ@@@8Q@0@S @@(@@???!G?@?@?!G?!G?aG?>G?\)?0?O\)?p?O\)?aG?aG?@ (@P@@xQ@`@HQ@P@|(@{@(???@?aG?>\>\?@?aG>G>G>G?aG?Q@@XQ@hQ@l(@@@ @3 @hQ@??!G?aG???У@@(Q@P@@xQ@@@xQ@8Q@8Q@8Q@8Q@(Q@(Q@Q@0@8Q@8Q@(Q@@@8Q@8Q@ @ @(Q@0@0@8Q??@???@Q@(Q@`@@@xQ@(@`@`@@@@(Q@0@Q@Q@??@ @Q@Q@ @Q@Q@ @0@@@@@ ??!G?@???@@Q@0@HQ@P@`@P@(@(@@(Q@8Q@Q@??У??@?@@Q@Q@@ @(Q@0@8Q@(Q@Q???@?aG???@@(Q@8Q@8Q@0@8Q@`@`@0@0@???У???@Q@Q??@Q@Q@@(Q@0@ @Q@Q@?!G?aG?aG???@(Q@Q@0@ @Q@0@(Q@Q@(Q@???????@Q@Q@Q?@Q@ @Q@Q@@Q@????aG????@@Q@XQ@@@Q@?У?У???У??????@@Q@@Q@Q??@@Q@??У??>\?@?????@Q@0@ @8Q@????У????????У?@@Q@@Q???@??????@?????@Q@0@XQ@0@Q?У?У????????У????@@Q@@@???@@@Q@@Q?@??@@@@0@@@@Q???????????У??@@Q@Q@Q@Q@@@@Q@Q@@(Q@ @0@0@8Q??@ @8Q@hQ@@@8Q??У????????????@@Q@ @@@@?@@Q@@@@@(Q@hQ@hQ@xQ?!G??@Q@P@8Q@(Q?????aG????????@Q?@(Q@(Q@ @Q@????@@@@Q@Q@(Q@HQ@@(???@@P@@@?У?aG?aG?!G??@?aG????У?@Q@@ @Q@(Q@0@@?????@@@@@Q@@ @0@????aG?@0@@@ @???@???aG????@Q@@0@ @@@0@Q@Q??????@@@(Q@8Q@(Q@0@(Q@0@8Q@`???@?@?!G?aG@Q@p@Q??????!G????@@Q@Q@0@P@ @??????У??@@Q@Q@Q@(Q@ @@@0@0@8Q????!G?aG?!G?!G?aG@@@Q@????>\??aG??У@@Q@(Q@8Q@(Q@Q@(Q@@???У??У?У?У???@?@@@@Q@@ >\?!G??!G?@?aG?@?@?@@(Q?У?У@?>\?@?@???@Q@Q@@@@@(Q?@@???У???У?У?У?@@Q@Q??????@Q>>?@?@?@?@?!G?!G?@?@@Q??@Q@Q??>\?!G?aG?У@ @@Q@HQ@@@0@@Q@???У???У?У??@@?У?У???????>>???@???@??aG??У@(Q?У@@@XQ??!G?aG?aG??@Q@ @(Q@0@@@(Q@Q@Q@???У??У????У???????????>??aG?????@?@?@?@?@(Q@@??!G???@@Q@ @(Q@0@@@HQ@(Q@@?@??У?У??У?????????????aG?aG>?@?????????У@@Q@???????@Q@Q@@@XQ@HQ@@@Q@Q@@Q@????У???????????????>>?@ @@(Q?У???aG??@@P@0?!G???!G???@@0@HQ@@@@@0@?@?????@@??????????????У>>\?@(Q@P@0@HQ??????У@0@8Q?aG>\>\??aG?У?@Q@(Q@HQ@@P@(Q@??@???У?@?????????????@@?>\?@@@p@`@XQ@?У???@@P??>\>\>\??@@Q@8Q@`@HQ@ @Q@Q@Q@Q????@Q@ ??????????У@@Q??У??>\?aG@0@xQ@(@(@HQ@ @ ??@?@8Q@hQ?aG>\>\??@@Q@ @8Q@xQ@(Q@Q??@?????@Q????????У???У??????>\??@(@XQ@@@p@@@ @@???@0@@?!G?@?У@ @Q@(Q@P@8Q@Q?У?@?????@Q??У????У?У?У?У?У?????????@??@(@(@8Q@P@0@8Q@??!G?@p?>\?@ @ @Q@0@0@??У@@Q????@Q@Q?????У?????У????У??@@(Q???aG@@@P@HQ@HQ@0@0?aG??@?@`??!G?У@ @ @(Q@0@(Q@?У?@Q@????У@?У????????У?@Q@Q@@@0@HQ@`@P@8Q?!G@?aG?@(@0@(Q@@0@?@?!G?!G@HQ@?!G>\?@Q@ @Q@ @ @Q??@Q@?????У?????????@@(Q@(Q@0@ @0@8Q@0@@@?@0?@Q@@Q@(Q@Q@ ?У?!G@(Q??!G?У@(Q@@(Q@Q@Q??У@@@Q?????????????@Q@ @ @Q@@Q@@??@@Q??@(Q?@Q@(?@@@(Q?aG?!G@XQ>??aG?@Q@@@@@Q@Q??@@Q?????????????@Q@@Q@Q@@Q@?@@@Q@Q@Q?@?У??У@Q@?У@Q@@?>\?aG@>\?!G?@Q@Q@P@(Q@Q@Q?@@Q????????????У@Q@ @Q@Q@?@@?У?У?У@Q@Q@(Q@8Q>\?@Q??@@xQ?У?@0??!G?!G>\???@Q@P@HQ@@Q?@???????aG?aG?aG???У@Q@@@0@@Q@@@????@@Q@@>\>\?@HQ??@@??@8Q?>?!G???@Q@hQ@(Q@Q??@Q????aG?aG?aG?@?aG???У@@P@XQ@(Q@@Q@Q??????У???????@?!G?@@XQ@Q?У@0@8Q??aG@Q?@>>\?aG??@@0@HQ@(Q@Q??????aG?aG?aG?aG?aG???У@Q@p@@@@ @@Q??????У?????@>???aG?!G?!G@ @xQ??@Q@0?aG?@Q?!G>>\????@@HQ@P@Q@Q??????aG?aG?aG????@@XQ@@xQ@8Q@(Q@Q@Q??????????@?@>\????@>\?aG@hQ@??@@8Q?aG?@?>>\?!G???@Q@0@8Q@@Q?У?????aG?aG???У@@@HQ@@@p@P@HQ@ @Q@?У?????????@>\@Q@??@??@XQ@(??@@0?!G?!G?@>??@???@Q@ @Q@Q??У????aG?aG?aG???@Q@8Q@@@@`@`@P@0@?????У@@@@0???>\@`@@???@?@@@XQ?aG?@@Q@P?>\>\?!G?aG??@@Q@@@Q??У@??aG??aG???@@0@XQ@@@@(@xQ@`@8Q@(Q@Q???@XQ@(@P@Q?У???!G@xQ@(@(Q?У??@XQ@P??@@Q@@>>\?!G???У@Q@Q@@??????????У@Q@(Q@HQ@@(@@@@@p@XQ@`@(Q?У?У@HQ@(@(@HQ@Q??У?У?@@(@`@??@(Q@@???@0>>\?!G????????У??У??????@@P@XQ@@A @@(@(@@@(@(@HQ@@HQ@@(@(@P@HQ@HQ@HQ@HQ?!G@@@xQ@ ??@Q@0?!G???>??@???У???У??У??????У@@ @8Q@@(@@(A@(A @(@@(@@(@`@P@(@@(@@(@(@(@@(?@(@@@0?У?@@?@>\?@?!G>??@?????У??У??????У@@@ @`@(@(@(@A AA<A{@(@(@@(@@@A$@(@AA,AB{A<A?@@(@(@(@XQ??У???>?>\>?!G?@?????У?У??????@Q@@@(Q@(@(@@A {A$A{AN{AA{A A@@@A$A.{@A2{AA =AlA @(?@0@(@@hQ@@@@?>\>\?!G?aG???@?У?@?У????@(Q@ @@@@@@(@(AA$AAPA$A*{A A@@@A8A,A:{A =A =A =A2{@(@8Q?>@@@(@Q@Q??У?>\?!G?@?????У@@????@@0@@@Q@P@(@@(@(A*{A"{A>{AlA.{A@A,A6{@@(@(AV{A6{A =B B"A =@@8Q??@@@@(@@(Q@???>\?!G?aG?????@@ @??У?@@@@0@Q@XQ@(@@(AA>{A0ATA =APAJ{A:{A8@(@(A {AV{AAB;BA @8Q??@(@(@@@8Q@0@??>\?!G?aG??????@ @???@ @HQ@0@(Q@xQ@(@A{A{A:{AHAr{AAlAV{AN{AJ{@@AA~{A =B3BfB@(?>\@p@(@@(@hQ@HQ???>?!G?aG??????@ @???@Q@P@P@@@(@AAA ALAf{A =AAAr{AtA`@@A"{AA =BzBB@(?>>\@ @@@(@`@@??aG>>??@?У@@???@Q@Q???У@Q@XQ@p@XQ@@(AA{AA\A =AA =AA =A =Ap@(@A,A =BBBB!A{??>>>\?@(@A@(@`@?aG>>>\?@?@@???@@@??У@Q@XQ@p@hQ@(A{A A A"{A\A =ABAAA =Ar{A@(A6{ABBBB]A@(Q?!G>?@@(@@@(@`@?>\>??aG?У@@??@@@Q@Q??У@@8Q@@xQ@(A{A$A0A4AXA =A =B!AAAA =A,@A$ABBBBBBA??!G>\?@HQ@(@(@@@Q?>\>>?!G???@@@Q@@ @Q@Q??@@@@(@p@A{A2{APA6{AtAAB<B A =A =AAV{A{A6{A =BBlBBBBBB A@HQ>>>??У@@(@@@Q?>\>>?!G??У@@@Q@Q@@Q@(Q@ ?У?У@@(Q@(@@A{A4AR{A`AABBJB8AAAAA<A(A =BBHBBBB̀BB#A =>>>>\?aG@p@A@(@@??>>???У@@ @Q@ @Q@@Q@ ??@@ @(@(@@(A6{ALAhA~{AABBB`BAA =A =A^{A,AN{AB<BBB݀BԀBB>>>>\?@ @A@(@hQ??>>>?@??У@Q@(Q@ @Q@ @@@(Q??@Q@(Q@@@@A A:{A|A~{AAB+BqB2BAAA =ADA8A =B$BdBBBBBÀB>>>>>>??@A @@??@>\>????@Q@ @(Q@ @0@Q@@(Q@?У?@@@8Q@@@(A{A6{A`AAA =BB`BsBA =A =AtAn{A6{A>{A =BSBBBBBBU>>>>>>\>??aG@ A{@@(??@??!G???@?@0@ @0@ @@@@??@ @hQ@A`A`@(A"{AA =A =AAB^BB>AAA\AXAR{AAV{A =B@BBBBqB>>\>>>\>\>\?aG?@(A {@@ ??!G>>?!G??У@@@(Q@HQ@0@ @(Q@@@xQ@Q?@Q@8Q@(@xQ@@@AA =BAA =B3BaBvBAAj{A2{A2{A"{AAPA =BB/BMB->>>?>>?>?@?@QAA{@?aG?aG>\>?!G??@Q@@ @HQ@@@(Q@@@@@@Q?@@`@ @xQ@(@@@(A AXA =ABBPBYBWBAA<AA AAA$A|A =AA =>>\>\?!G>\>\>>>\????@A{@@?aG?@?!G>>?!G??@Q@Q@ @P@`@P@P@@@p@HQ@?@@0@@@@(@AA>{ATAA =B,B=B\B=AAlA,AAA@(A A`AxA>>>\>\>\?>>>\?!G>\??@0A @(??aG?!G>>???@ @(Q@(Q@XQ@@xQ@(@@p@xQ@@0??@ @@(@@(AA A0APA^{B,BB0BOB[B'A =Ab{A{@(@(@(@AAA>>>>>>\>\?@>\?!G?@>?!G?У?@(@??aG?@>>>???@ @P@@@hQ@(@(@(@@(@p@@p???У@p@(@@(@A*{A A\Aj{A`B+BBGBIBMBAAJ{@(@(@@(@@@(>>>>>??aG?!G>\?aG>\??aG@XQA{@8Q?@?>>>>\??@Q@P@HQ@hQ@@@(@(@(@@(@@Q??@(Q@@@A{A6{ADA`Az{AlAhBKBBDB*B"BA =A$@(@@@@`@8Q>>>>\?>?>\?@???@?!G>???@@(@(??>>>>\>\?@?У@ @`@hQ@xQ@@(@(@(@(@@(@@xQ???У@xQ@(@A {A AAlA =Av{APApB1BBAA =AA =A(@@@(@@(>>>>>\>\>\>\>\???@??>?У?@8Q@(@?@>>>>\??!G?@(Q@`@@@(@@@(@(@@(A{@???@0@@A{A>{ATAZ{A =A~{AR{AN{ApB(A =AA =AA =AlAF{AF{A A{@>>>>??>\>>\>\?@Q??aG?!G>\??@@(?>\>>\???!G?@Q@hQ@@@(@@(@(@(@(@(@@@??@?@XQ@`@A$A&{AA =AAn{A>{A8ABAAA =AAAhAHADA8A{>>>>\?>\>???aG@0???>\>>??У@@xQ@Q?>\?!G?@??aG@Q@hQ@@(@(@@@(@(@@@@@(Q??@Q@XQ@(@(A{A6{ApAn{ATA@AA =AAA =AAA =A =A|AF{A6{A >\>>\>\>\>\>\??aG?@@ ?!G?aG?!G>?!G@?aG@0@ ?aG>\?!G?@?!G?aG?@(@(@@(@(@(@(@@A{A$@(@???!G?@Q@`@(A{A&{AV{Ar{ApAF{A =A =A =AA =A =AAAA =AA =A =>>>>>>\??>\>>>\??@?@p??@??!G>>???@0?>>>??@?aG?aG?@(@(@@(@(@@@(@A {A0A @@???aG?@@@AA&{Af{A =A =A =AAAf{Ar{AA =AAA =A =AA>>\>\>\>\>>???>>????@??@??aG?!G?!G?У?@?>>??aG???@`@@(@(@@@@@@(A {AHA {@??!G??У@8Q@@AA,B B A =AA =A@AXAv{A =A|AAA =AA =>>???>\?>>>\??>>??aG?У??@ ?aG???@>???У?>??@???@8Q@@(A@(@@@@@A{AhAf{A(@?!G??@??@P@(@(A{Az{A =BA =AA0AHAZ{An{A =A~{AxAAAZ{>>?@?!G???>>>>\>>>>?aG?@Q@Q@(Q??@??aG?>@(Q??@>\??@??@Q@(@AA@(@@@(@(A,ADA =AF{A{@(Q???@?@ @P@(A{A6{Ar{AA =A =Ab{A<A>{APA^{An{AlAhAA~{>?!G?@?!G??>\>>>>??@P@ @Q@@??!G?aG??@?aG@ ?>>\>\?@?@ @@AA{A {@(@(@(A{A.{AB{AR{A =A2{@(@??@?@@@@(@(AAB{A|AA =Az{Aj{A8A>{ATAf{AAAz{Av{>\??!G?!G?>\>?@P@@@Q@HQ@Q??!G????@?>>>\?!G?@Q@xQ@@A {A{A{@@A AA{A,AlAlA @(?У?!G??@ @XQ@(@(@A8A~{AAAAr{A`AR{An{Av{AAA =>??@?@?!G>\>?@?@(??@@??@??У?>??@>>\>\?!G??@P@@(AAAA{@(@(A AHAv{AlAAR{A@???@@(Q@(@@(@(AAlATA =A =A =Af{A^{Av{Af{AA??aG?aG?!G>\>?@XQ@HQ?@Q???@???!G?>??!G??@ @(@(AAAAA{@(@(AHAxA`ApAhA&{@A{@p@@0@8Q@P@(A{@@AA AlAxAz{Az{AxA =AAlAj{>\?!G??aG?!G>?@@@(??У???????!G>\??@??У@@hQ@AAA{A$A @(@AAhAj{Aj{A|AALAR{A8@(@@@(@hQ@@(@@(@AADA\AXAf{AA =A =A =>??aG?aG?@??@(Q@0?aG???????>\??!G?aG?@Q@P@@AA A,A(A@@(A{ApA =A =A =A =AtA2{A,A@@(@(@hQ@`@(@@(@AAA8A>{AAA =At>\?@??@?>\?!G@@@????У@????@>\???aG??У@Q@@(AA{A"{A*{A{@(@(@A6{AAAA =A =AZ{AxAXA{A{A@@@p@p@(@(@(@A{A$Av{A =A =A>\?@?aG?!G>\?@HQ@ ?aG??@(Q@?aG?aG??!G>\?!G?@?aG??@`@(@AA{AA$A @(@(@(A>{Aj{AAAA =AAxA>{A$A<A@@(@xQ@@(@(@(@(A{Aj{AA =B>\?!G?aG?!G?>\?!G?@@???@@hQ???aG?@>>??!G?@?@Q@(Q@@AA{A{A$A{A{@@(@A{AxA>{AAAA =A^{ADA.{A&{A@A@(@(@(@(@(@@(A2{A =A =A>>\>\??!G?!G?>\>?@Q@Q?@??@XQ@xQ?>?>>??!G??@(Q@@@AAAA{A{@(@(@@A*{AlATA =A =AAAb{ALATA>{A(AdA0@(@(@(@@@(A6{AdAT>\???!G?!G?@?!G>\??@??aG??У@hQ@p?>\??aG?У@0@(@(@(@A{A {AA {@@(@@(@(A2{AAAAA =AAAr{A:{A*{A\AAr{AAA6{@(@(A0A{A >??!G?!G??!G?@?!G>\?aG?????@@@>>\??@Q@HQ@(@(@(A{A{AA@(@@@(@(@A:{A =AAB A =A =A =A =Af{A =AAr{AAA =ATA|A =Af{AV{??aG?????!G?>\?????@??@`@(?У>\???@@HQ@(@(@(@@(AA@{@@(@@(@(ATA =B A =A =AA =AzAR{Ab{AlA =AzAAA =AAŅAAs =>>\?!G?@????>\?aG@Q?У?@>\?!G?@@@`?@>?>\???@HQ@@(@(@(@(AAA@(@@(@(@(@(AZ{ABB1BA =A =AAAAAAAAzAADžAzAz>>>??!G?aG?@>\>\>\>\>>\@@0?>\>\??@(Q@@(Q>\??!G?!G?@??У@HQ@@(@@(A {A{A{A{@@(@@(@@AXAA =BA˅AzA =AAzAAhAs =AA =AA =A|A>>\>\?!G?aG?У?@>>>?@(Q@8Q?aG?@?@HQ@p?>>??!G?@??@@hQ@@(@A{A AA{@(@(@(@(@@@A{AAAzAzA =A߅ABBAzATA@AF{@(A4A,>?>\?@?@??>?@@ @Q>\?!G@Q@hQ@XQ?!G>\??!G?@??@ @p@@@A {A{A{A {@@(@@(@@@(@A@A\A; =A =AzA =AAAAzAzA8AdA{A{>?????У@Q??@??!G?@@Q@xQ@0???!G?aG?@Q@HQ@@@(@A A{AA{@(@@@@(@@@@(@A A*{AHA~{Ac =A"{A$A =@@{@@>>???aG?@(Q@(Q?!G>???@@(Q@(@(Q>\??aG??@@@@(@@(@A{AA{A@@@(@(@@@(@@@@AA8AC =A AA@@(@(@S >>??!G?@@@@>\>>\>\?@@ @@Q??!G?@?@ @(@(@(@@AA{A{A{A @@@@(@(@(@(@@xQ@@{@@(@{A,AK =A4AA"{A2{>>>?!G?@@@p@HQ?>>?>\?@@ @@(Q?!G??@?@hQ@@@(@(A {A{A"{A*{A"{AA@@(@@@@{@(@s @@{@{@A A? =A0A$AtAf{>\?!G?@HQ@(@>\>>>\>\>\?aG@ @(@ >\?@???@hQ@@(@(@(A{A A.{A$A{A A @(@@(@(@{@@{@@@@@{@(@{@A# =A >\?@?У@`@hQ?>>\>?@?!G>\??@?У@(@HQ>>\?O\)@(@(@@Q@@(A {@(@A{AA{A{AA@@@(@(@{@(@{@{@@(@@{@@(@@{@{>\?@?@8Q@?!G?>\>?@??>>\?>>\?@Q??>\?@0@@@HQ@@A{A@AA AA{@(@A@@(@AA{@{@(@(@@@@@@@l(>?aG@@8Q?У?!G??!G?!G?@?!G>\?!G?>>\>????!G??@?У@(@(@(@@@@@(A{A A@AAA@(@(AA{@(@(@{@(@(@(@@(@@|(>>?aG@@ ?aG?@?@?!G?@@Q@8Q?>\>\>\?!G?!G?>>\>\?aG??aG>\??@?Q@@{@(@(@@(@(@@@@AAA{A {A@(@{@@{@@(@@@{@@(@(>>\>>\?aG?@?@?aG?@?@?@0@xQ?aG>>\?!G?aG??!G>>\>\>\?@???>\?aG?@p@{@@@(@@(@@AAA{AAAA{@@@@{@(@{A@{@(@@{>>>>>>\?aG?У??@?aG?@?!G?@8Q@P???!G?aG??aG?!G?>\?!G?!G>\?aG??>\?0?Q@(@(@(A{@(@@(@@@AA {AA{@@(@{@@(@@@(@@@(@>>\>>\>\>>\?!G???@?@?!G?@?@0@(Q>\>\?!G??????>\?!G??!G>\??@?@?0?@Q@`@@@@p@@(@@(AAA{@@{@@@@{@@(@(@@{@>>\>\>\>\>\>\>\???!G?!G?!G???@Q?>>\?!G????@??@?@>\?@?>G>\>\>G??@C @@@l(@P@(@@(@(@@{@(@@@@{@(@(@{@@(@@{>??>\>\??!G??!G?!G???!G???@?>\?@??У???!G?@?aG?@?!G?@???O\)?Q?@# @HQ@l(@(@P@@@(@@(@(@@@{@@@@(@(@@{@{???>\??!G?!G?!G?>??>\??@??aG???aG??У???aG?@??????!G?O\)?O\)??@Q@Q@@(Q@xQ@s @@@@(@(@(@(@(@(@(@@@@(@??!G?>\??!G?!G?>\>??>\??@Q??aG?!G?aG???????У????>\??@?????Q@ @@0@`@@@@@@@{@(@(@@@{@@{>>\??>\??@?!G>\>>\?>?@??????aG???????У????aG?>\>\>\?\)??????Ǯ@@# @@@@{@{@@(@@@{@{@(@@>>\>\?>\??!G?>>\?!G>\?aG???@>>\?@??aG?@??aG??У?????>\>\>\?\)??????Q@@Q@HQ@(@@@@@(@{@@@{@@{>>\??>\>\>\>\>??@?@?!G?>?!G?aG?@?@?@?@?@??У????@??>\?>G??O\)???aG????Q@ (@<(@|(@@AAA@(@{@(@(@>>>>>\?!G>\???@?@?!G?>\????@?>\??!G?aG???aG?@?>\??@?aG?@??!G?p?p???У???Q@Q@(Q@`@{@@A =@@@@{@>\>\>>\?!G>??!G??@?>>\>\??aG?!G?!G?!G?!G?@????@?!G>G?\)?O\)?????Q??У@@ @P@@@@{@@{@(@>\>\>>\>\>>\?????>\??@?aG?aG????У?p??!G?0?p??????Q@ (@,(@\(@@@@(@(@{@(>\>\>\?>>\>>>??aG???>\??@?aG?@?aG????@??p?p????Q??Q?@ (@3 @`@(@(@@(@(@(>\?!G>\>\>?>\>?!G>\??!G?aG??>>\>\?!G?O\)?@?0?0?0?0??\)?p???Q?Ǯ????Ǯ?Q@(@<(@`@@(@@@??>\??>???@?aG?!G???p?O\)?\)???O\)??@(@ ??У?@@,(@C @`@s @(@(@?>\>\>\??????>???\)??p?@?\)>\>\?aG?Q@@(@ ??@Q@Q@3 @P@hQ@p@c @hQ>\>\>\>\>>\??aG?!G>>\>\>\?aG?!G??!G?\)??aG?Q@Q@ (@ ??Q@ (@(@0@C @\(@XQ@`>\>\>\>\??@?!G?!G??0?O\)?p?O\)??@?\)>G?aG?Q?У?Q?Q??Q@ (@(@<(@L(@S @HQ>\>\>\>>\??@???@?>?\)?O\)?p??Ǯ?Ǯ?O\)>G?0???Q?У?Q?Q@ @0@HQ@S @@?!G??@@8Q@XQ@`@@@@@(@@@@p@p@@@(@(@@@(Q@8Q@0@P@@@(Q@(Q@@@8Q@8Q@8Q@XQ@XQ@HQ@8Q@ @(Q@Q@ @Q??@@ @HQ@xQ@@xQ@@@@xQ@XQ@`@`@XQ@@p@xQ@p@XQ@XQ@XQ@XQ@8Q@8Q@@@P@8Q@(Q@8Q@0@hQ@XQ@`@XQ@@@8Q@(Q@(Q@ @(Q@(Q?!G?@Q@Q@(Q@hQ@hQ@(@(@hQ@XQ@XQ@0@ @(Q@ @(Q@HQ@0@0@0@(Q@(Q@@@(Q@8Q@8Q@@@8Q@0@0@P@`@hQ@xQ@HQ@@@8Q@@@@@@@0@0@@??У@@Q@(Q@P@hQ@`@@@HQ@ @Q@@(Q@Q@ @Q@@@?@Q@@ @@@8Q@8Q@HQ@(Q@(Q@8Q@8Q@XQ@HQ@HQ@`@@@P@XQ@HQ@P@0@@@P????@Q@@8Q@8Q@8Q@0@@@Q@ ?@@?????@Q@@Q@ @(Q@Q@Q@Q@@0@(Q@@@HQ@0@@hQ@`@hQ@@@HQ@0@(Q@HQ?!G???@ @Q@ @(Q@Q@?@Q?@?????aG?!G?@?aG?@@@Q@Q@@@Q@Q@@(Q@(Q@HQ@8Q@@@P@@@@@ @ @ @@@HQ?!G??У@@Q@ @Q@??У??У@??У?@?@?>\>\?@???У?????@@Q@@@ @0@(Q@Q@0@@@Q@@ @(Q@8Q??!G??@Q@Q??????У?У@??!G?????!G?@??????У???@@@Q@Q@Q@Q????У@@@ @Q@Q?!G?aG????У????????@?!G??!G?!G?!G?@?aG???????У???У??@??У????@@@@@??@???У????!G??!G?!G?@???@?@?@?!G?@?????????????????????????>\???@??aG?????!G???????@?@???????????????????????????@?!G??!G?!G?aG?aG?aG???!G?!G????aG?@?@?????У?????????aG?aG???aG????????????aG?!G?!G??@?aG?aG?aG??@>\???aG?@?aG????У?У???????aG?aG??aG?aG?aG?aG?aG?aG?aG?aG??????>\?aG???@??aG?!G????!G??!G??@?@?aG?????У??????aG?aG?aG????aG?@?!G?@?@?@?aG?aG?aG?aG??aG?aG?@??aG?aG>\>\??!G?У?У??@???!G??!G??@?@????У??У????aG?aG?aG?aG??aG?aG?@?@?!G?!G?!G?@?@?@?@?aG?aG?aG?aG?aG?!G?aG?@@??aG?!G?!G?!G?aG?@Q@Q@@@?!G??!G?@?@?@?@????????aG?aG?@?aG????aG?@?!G?!G?!G?@?@?@?@?@?@?@?aG?aG??????@????@?@?@@@0@ @@(@(Q?@??@?@?@????????aG?@?@?aG????@?!G?!G?!G?@?aG??aG?@?@?aG?aG?aG????????У@ @HQ?????@?@@@XQ@ @ A?У>\?!G?!G?!G?@?@????????aG?@?@?aG?aG?aG?@?!G?!G?!G?@?aG????????????@@Q@@ @@hQ@@????>?@P@hQ@0@hQ@(@??!G?!G?!G?????????aG?@?@?@?!G?!G???@?aG????У?У???У???????aG@P@ @`@`@ @p@HQ@Q@??aG?@0@hQ@(@(Q@@`????!G?aG????????aG?@?@?!G?!G?!G???@??У@Q@?У???У??????????aG@HQ@`@hQ@@(@(@(@0@Q???@P@@?@(?>??!G?@?@?aG??????aG?@?!G?!G?!G?!G?!G?!G?@??У@Q@?@@Q??????????>\??!G@@xQ@hQ@@@(@@p@@???У@hQ@(@P?@p>>\??@?aG?aG??????aG?@?!G?!G?!G?!G?@?@?aG??@Q??@@??У???????????!G?@@(@(@(@(@(@@(@p@@??@@@?@?У>??!G?@?aG?aG??????@?!G?!G?@?@?????У@Q??@@Q??У??????У?@@Q@ ??!G?@@(@@(@(A{@@HQ@??У@@(@(??@>>\??!G?aG?aG?@?????aG?!G?!G?@?aG???aG??@??@Q@Q@Q@Q@@ @ @@@0@0@8Q@hQ@xQ@hQ??!G@Q@(@(@A{@(A@@@@??У@ @@(?>\>\??@?@?@?aG?????@?!G?!G?@?aG???aG???У?@Q@ @0@0@0@0@0@8Q@P@XQ@hQ@@(@(@@(??@P@A A{A2{A{A{@@@@??@P@@Q>\??@?aG?aG?@?????aG?@??!G?aG?aG??aG????У@Q@(Q@0@P@XQ@`@HQ@P@hQ@hQ@xQ@@p@`@`@P@(Q?@@p@A{A6{A A @@@@??@hQ@(????!G???aG?aG?????@?!G?!G?@?@?@?@?????@(Q@@@P@xQ@p@p@p@p@p@hQ@XQ@@@0@8Q@@@(Q@Q@(@p@A{A0A@@p@ ??@Q@P@?>\?!G?aG????????aG?!G?!G?!G?!G?!G?@?@????У@ @P@hQ@@p@XQ@p@@@p@XQ@HQ@P@XQ@p@p@p@XQ@(@AA{A&{A@@XQ@Q??У@@ ?>\?!G?!G???aG??????@???????!G?aG?aG?@Q@@@p@@hQ@P@hQ@p@xQ@`@P@hQ@@@(@@P@?@xQ@@A4A{A2{@@8Q@8Q?У?@@Q?@??!G?!G???aG?????aG?!G>\?????!G?@?aG??@@@(@(@hQ@HQ@XQ@@(@hQ@xQ@(@@@@@@@??@ @@(A&{A {A8@(@XQ@@???У??aG??!G?@??????У??!G???>\???!G???@8Q@@(@xQ@XQ@XQ@(@@(@@@@@@(@`@Q????@@A AAX@@P@8Q?У????@?!G?!G???????У??!G>\????!G?!G???@HQ@(@@(@p@XQ@(@@@@(@(@(@@(@(@@@??@??@@A{AAP@@@@`@??????!G?@?aG?aG??????@>\>\?????@??@0@(@@(@(@P@@(@(@@A{@@@@(@@ @????@(AAA*{A@(@0@ ?У????!G??!G?@?aG?aG?aG???У??!G>????!G??@Q@XQ@@@(@HQ@P@(@xQ@AA@(@(@@@xQ@8Q@Q????@?!G?УAA{AA(A(@(@P@Q???@?!G?!G?@?aG?????У??@>\>\??!G?!G?@?aG?@0@p@@(@@@P@@@(AA4A{@(@@(@`@(Q@@@Q????@?A{A$A A,A@(@XQ@??@?@??@?@?aG????@Q??!G?@?@?aG?@???@P@@(A {@(@(@@@(@(A6{A =A4@(@@@`@@@0@@@@@HQ@8Q@8Q@Q?@?@(A{A{A{A*{@@`@??@?>\?!G?@????????@??@?@???У@P@(@(AA(A @(@@A A:{A =AA*{@(@(@`@`@@(@@@(@@(@`?@?aG@(@@A A{@(@hQ@??>\??aG???????aG?@?@?@???У@@@@A A$A{@(A{A{AHA =A =Av{A@@(@@@xQ@(@@(@(@(@(@XQ@@>\>?@?@@XQ@AA@@(@8Q??@>\>\?!G????????aG?!G?@?aG??@Q@@@@(AA A{AAALA`A =A =A =A>{AA@(@@A{A@(@@@@(@hQ>\>?@@@(A{A {@@@Q??!G>\??@???????aG?!G?@???У@Q@0@(@@(A{AAA2{A`A =A =A =AA =AR{A@A*{AAAA.{A{A{A@@(@HQ@0>>>>?@@(@@(@P@Q??!G>\?!G?aG????У??@?!G?!G??aG??@ @`@(@(AAA0APAf{A =A =ABA =A =Az{An{A2{A8AHAb{A@AB{A^{A$@(@@@?>\>\??@pA@(@(@HQ??aG?!G>\?!G???У????@?!G?aG?aG??@@0@@(@(A AA\A =AA =ABB#AAz{AAxA:{AB{A^{Az{ApA =A<A,A,A {@@??!G?@?>\>\?A@(@p@Q?aG?!G???!G??У?У?У??aG?@?@????@Q@XQ@@@(AA8A =AAAA =BBA =AXA =Ar{A,A>{A =A|A =Az{AA =A =@(@(@P??@?aG?!G?!G>?@(@(@0?У?aG?!G>\?!G??У????aG?aG?@???У@@@@(@(@@A(AR{AAA =A =AB,BAAv{AAB{A8AZ{AAxA =AB"BA(@@??>\?!G??@?aG??@@@(@Q?У?aG>\??aG??????aG?@?@??@@ @`@(@@(AA2{AhAA =AABB8AA =APAF{A8A4AlAAAB@BuA@HQ??!G????!G?@xQ@ ??aG??????У???@?@???@Q@0@(@(@(@(@(A6{Az{AAA =ABBJAA =AR{A8A0A.{AlAAB2BBBkA??!G?aG??aG??!G@Q@?У?aG??!G???????@?@???@Q@P@@(@(@(A{AR{AA =AA =A =BBHA =A =AF{AF{A(A(Az{A =BBBBBJ@???!G???!G>\>\?@Q??aG??!G???????aG?aG??@Q@(Q@P@@@@(A{AtA =A =A =A =AB BMAA =A8A4A{A,Az{A =B@BBBC@(?????aG??@Q??>\?!G?aG??У???????@@Q@@@@@(@@A,AA =AAA =ABB<AAA6{A@(A$AtA =B|BBBBBA {???????@>\?!G@@Q??!G??У????????У@ @(Q@P@(@(@(@(@A>{A =A =A =A =AA =BB-A =A =A4A {AA{A\A =BBBBA@Q?@?@?@?У?У?aG?@>\?У@??!G??@??У????@@8Q@0@(@@@@(@AR{A =AAA =A =BB#B6AA =ATA@A{AJ{A =BzBBBNBB6A*{????>\??@??>\?@??aG?!G??@Q@Q?????@Q@P@`@A{A{@@(A{Aj{A =AAA =BB#B7BPB AAxAA {A A@ABVBB{BA =AT@@?>\???!G?@@?У???!G@Q?>\?@?@Q@@Q@???@@XQ@(@A{A{A{A{A {AAlAA =AAB3BBBUBnB"A =AA@AA<A =BGBBBBAA@xQ???!G??@???@(Q??aG?!G??!G??!G???aG?@@@ @@Q@Q@Q@@@hQ@(@A{A{A{AA"{A APA =BAAB BRBgBBBHA =AA"{@A{A,A =BABBBBQAf{@@@hQ??aG?@?aG?@0???>\?aG?????!G?!G?aG?У@0@(Q@8Q@8Q@ @0@0@@@@@A{A{A{A {A6{A6{AhABBAAB:BqBBBKBA =AR{@@(AADA =BBBBBB*AP@(@??У?@?@??@Q?!G??@>\?!G?!G>\??!G?aG??У@HQ@P@p@xQ@`@XQ@@@HQ@@@A{A{A{A{Af{A =A =A =BBBABBGBBcBA =A|@(@A{A2{A>{A =BmBBBAB{@(@HQ????aG?@?@Q?>\?!G???aG???@???У@hQ@(@@(@@xQ@xQ@p@@@(A{A{A{ADAA =ABB4B(BABBXBBBB)A =A =A0@@(A$A*{A0ABB0B A(@@(Q?aG?У??@?@ ??!G>\???aG???@???У@hQ@(@(@(@@@@@(@@(A{A{A{AJ{AA =A =BB@B<BBBB/BBBBFB AA|A@@(A{A{AA{AA4@(??????@?@P?@??@???!G>\??aG??@@(@@(@@@@@(@(@(A{A{A{A{A\AA =BBBXBIB ABB$B`BBdB"BA =AJ{@(@@(A {@(@(@8Q??aG>\????!G?@@??@???@???!G??@0@(@AA@(@@@A{@(A{A{A{A{Av{A =AB B%BGBcBB BB$B5BWBmB0B A =AA{@@@@@@@(@Q??>\>\?@???!G>\@@0?????!G??@??У@@@AAN{A>{A@@(@(@(A{A{A{A{A{Af{A =AB BBB`AB*B.B BB2B4B@BBBA =AJ{@@(@(@(@(@(@(@@(@(>\>\>\????@Q?!G>\?aG???aG?@?@?aG?@HQ@AAdAf{A6{A@(@@(A{A{A{A{A@AlA =BBGBFAA =BA =BEBB.B B1B#BA =AAA@@(@@(@@(@xQ@xQ@HQ?????!G??>\?@?У??aG?@?@?aG?У@P@(A$Az{A =Ab{A$A@@(A{A{A{AAhAlA =BB$BMA =ABBA =A =B0B+B*B&B AA =AAlA{@@@(@`@`@@@8Q@(Q?>???>\?@@Q>???У????@?@@@(A{AlAAAN{A{A@(A{A{A{AtA =A =A =BBB6A =A =A =BB B ABHBB"B AAA =A =A|A@@p@@@0@ @@Q?@(Q?У?@????!G?@???У???aG?@8Q@(A{A\A =A =Af{A*{A@(@(A8AhA =A =A =A =B8BBBAABB A =A =A =B(B3B A =A =AAAAA @(@@hQ@HQ@8Q@ >\>\@Q@@??!G??>\???У???У???@(Q@(AA^{A =A =A =AF{A$A@(AAn{A =A =A =A =B%B'B6A =A =A =ABAA =B7BB>BAAA =A =A =A =A =A{@@@@p@`>\>?@(??????????????@ @(@(AJ{A =A =A =AxALA @(@(A>{Ar{AtAABB%B_AA =AA =A =AAAB0BBA =A =A =A =A =AA =AA(@@@(@>?!G>\>\@ @???@?>\??@8Q?@Q?У??@8Q@@A6{AA =AA =Ar{A@@@AAXAr{AAABB AB BTA =A =A =A =A =A =B AAAAAAA =A =A =A =AV{A:{A{A>\?>>>\>?@`@ ??У??@?!G?@P@Q@Q@Q?У?@ @(@A*{A =A =A =AAATA@(@(AHAxAz{A =A =A =B BBBBCB\AAA =AAAA =A =A =A =A =AAAA =A =AxAdAD>\>>?>>>\@HQ@hQ???aG?????@ @Q@8Q?У?@0@(@(AAv{AA =AA =A^{A{@@(A{A|A<A =AA =ABBB!B$BVBbA =AAAApAA =AAA =Ar{Ar{AAA =A =AA =>\?>\>>\>>\>>?!G@Q@Q?>\??aG??@?@?@ @Q?@0@xQ@(@APAA =A =AAv{A(@(@A{AXAz{A =A =A =AA =ABGBB@BdBMAAA =A =A`AAA =AAA|Ar{ApAf{AA =A =??>\??>\>\>\?@@0?>\?>\?!G?@8Q@(Q@@@@@`@@AA^{A =AAAAB{@(@(@A A^{A =AA =A =AA =AAB,BMB>B>AAAxAn{AdALAA =AA =A =A =AA|AA>\?aG?>\??>\>>\>\??>\???@?У@Q@hQ@Q@@?@ @`@@A2{AdAAA =AlA{@@@AHA =A =A =A =A =A =A =BBB*BKBqBB0B BAdA =A =A =AA =A =AAAA|A?aG?!G?!G?!G?!G?>>>\?aG>\?aG??!G??@@(Q@0?@@Q?@ @p@(A{APAZ{Aj{A =AA`A{@(AA Ab{A =A =A =A =AA =BBBB1BcBDBEB2B5B(BBA =AA =A =AAAA|A>\?@?@???>?!G>\???!G>\?@@P@ @Q?@ @Q@Q@P@(AA.{A@AXA`AdAlA0@@AA:{A =A =A =A =A =AABBBB/B5BfByBQBJBBA =A =AAAAA =AA?@?aG?!G?!G?>\?>?@?У?>>>?@@@@@ @Q?@@Q@@8Q@(@(AA4AF{AHAHAV{AB{A @@A{A0AtAAA =A =AAA =B BBBBDBnB B.B,B A =AA =A =AAA =A??aG?@?@?@?>\?!G>\?!G??!G???>>>>?@@p@ ????@@hQ@A A&{A8A6{A8A2{A4A&{@@(AA&{A$AJ{AAA =Aj{AA =ABBBA =B BBBUB;BFB2BAAAA =A =A>\?!G??aG?aG?@?!G>\>\?>???>\>>>?@8Q@@HQ@???@@`@(A{A A2{A.{A"{AA{A$A{@(@@A A.{AtAA =ApAlAZ{AABA =B2BB&BB9BZBTBOB<BBA =AA?????aG?aG>\>\>\??!G?@???>>>?aG@(@@????@P@@(@(A.{A2{A{AAA{@(@(@@@@(@A<ALA`AdA6{A,A =AABBBB BBB%B3BMBcB]B.BA =>\?@?????>\??>\>?aG??@ ?>>>>?@@????@@hQ@@(AA*{A{A@(@@@(@@(@(@xQ@AA{AAAA&{A(AA =AAAAABBABB/B;B.B*B'??aG?@Q???>>\>\?@?>>>>\???>>>\??@xQ@@??@?@`@(@@AAA@@@@(@(@@(@@xQ@@@@(AA{A*{A6{A<AHAz{AAA =A =AB AABB B B >??@Q@Q@Q??@??@?aG?>>>>?aG??@>??@?@@(@(?У??@Q@`@(@AAA@@(@(@@(@@@@@(@@(@(@AAA0A4AJ{Af{A|A =AAA =A =A =AB BA =A???@xQ@HQ@@??@?@???>>??@>?@@Q@(Q@8Q@(@`??aG?@Q@`@(@(A{A A{@@@@(@(@@@(@(@(@(@@(@(A AA(A4AF{AZ{A =AA =A =A =A =AA =AA =B>??@(Q@(@8Q@XQ??У??@???У>\>\?>\?У@(@@(@@hQ??aG?@ @p@(@AA@@(@(@(@(@@p@@@@(@@@@(@(A{A"{A.{A<APAlAAAA =A =A =AAA =>\???@P@p@`@8Q@@????У?>>\?У@@(@@@8Q??aG?@0@(@@(A{@@(@@@(@L(@@p@XQ@xQ@L(@@@(@{@@@@{@@A {AA(AN{A\??@?@`@8Q@hQ@8Q@0@ ?>\?@?У?У???У@(@(@(@@?@??@hQ@@@(@(@(@@@(@(@<(@,(@P@P@hQ@(@(@@@(@{@{@(@@{@@@{AAA =A' =A3 =A,A,>\?>\?@?@HQ@HQ@@@(Q@(Q??????@?@(@@@??aG?@8Q@@(@@@@@(@(@xQ@`@ @P@8Q@0@HQ@hQ@(@(@(@(@@@{@@(@@{@(@(@@(@(@{@(>\??@ @`@(Q@0@(Q@(Q@?@>\??>\>\?!G?@@(A{@(?У?@Q@hQ@@@(A{A{A@@@@XQ@XQ@@@Q@ @@@XQ@@@(@@@@(@{@{@(@{@(@@{@{@@??!G?aG?@ @ ?@0@@@0??@??У?>\?@p@(A @(@(Q?@(Q@xQ@@(@A{A@(@@(@@hQ@HQ@ @Q@@ @8Q@@@XQ@(@(@{@@(@@{@{@@@(@(@{@{>\?!G?!G?@?@Q?У?@8Q@@@??!G?@??aG??@@(A&{A"{@@(Q@(Q@xQ@(@AA{A@(@@(@@p@HQ@ @Q?@@Q@@0@8Q@@(@{@@(@@@@@@(@>>\??aG?@Q?У??@P@(Q@Q??@?@?>\?!G?У@hQA {Aj{Aj{@@Q@@@xQ@@@(A@(@(@@@(@p@XQ@HQ@ @Q?@@?@@@@`@{@@(@@(@{@@(@>>\?!G?!G?????@(Q@0@Q??@>\?!G???У@pA2{AA =@(@0@hQ@p@@(A{AA@@(@(@@xQ@hQ@p@HQ@ @???Q?@ @HQ@@@{@@hQ@p@|(@p>>??@?!G?????@0@XQ@ ?У?>\?!G?@?@@@xQ@A{AF{A@@p@xQ@@AA A{@(@(@(@@p@p@p@P@(Q@Q??Q??@@(@@@XQ@L(@S @L(@S @`??!G?@?????@8Q@XQ@8Q?>\?>\?aG@Q@(Q@@@AZ{A@@p@@@(A{A @(@@@(@@(@@@`@8Q?Ǯ?Q?Q?Q???Q@@ (@ @(@0@<(??!G?aG?????@(Q@8Q@0?У>?>\?@?@@@@(AN{Av{A@(@(@(@A{A {@@@(@@(@HQ@(@@`@ ?Q?Q??Q?Q???Q?Q?У@ @Q>\??!G????@?aG?@@@0?>\>\>\?!G?У@(@c @{AA"{A@(@@(@A {A@@(@(@p@c @(@(@@p@P@(Q??Q?p?p??????>\??!G???@??!G?@??У??@>\>\>\>\>\?!G?Q@ @\(@{@(A {A{@@(@(@A {@(@(@@@(@(@(@@@(@@(?Q???aG?!G?@?\)?\)?!G>>\>\?@??@>>??!G?@???>\>\?>?!G?@8Q@L(@@@@{@(@@(A{A@@@@@(@@(@(@0@0@HQ@(Q@?Ǯ??0?\)>>\>\?@??!G>\?!G?>\?>\>\?!G???@Q@`@@(@{A@(@(@(@@@(@@(@@@(@xQ@HQ@@Q@ @@?Ǯ??@?\)>G>\>\??aG??>\?!G?>\?????@@@hQ@@@@@@(@(@(@@(@(@@@hQ@P@?Ǯ?Q?????aG?@?\)>G??@?@?@?aG>\?aG?aG?>\>\>\>\>\???@ (@<(@\(@@|(@(@(@xQ@<(@P@xQ@(@@@(@P@(Q??Q???Q???O\)?0?\)?>>>\?aG????!G>??>\>\>\>\??!G?!G?@???aG?У@ (@HQ@@@(@@|(@p@HQ@(@3 @xQ@@(@@p@ ?????Q?Ǯ?Q???@?>>\>\?@?@?aG?@>\>\>>\>>\>\>\?!G??@>\?@Q@HQ@`@p@l(@l(@c @<(@,(@P@3 @L(@(@(@c @C @@???Q??Q?Q????O\)?\)>>\?!G?!G?@?@??@?!G?>>>?@??@>\?@ (@<(@c @l(@l(@HQ@(Q@# @# @0@XQ@<(@XQ@XQ@p@@@8Q?????????Q?O\)>\?aG?@??!G?aG??!G?@?!G>\>>>\>>\>\??@@c @@@l(@C @(Q@ @@(@(Q@8Q@L(@HQ?Q@(@?У??Q?Q??Q?Q??O\)??aG??aG?!G?@?aG??!G??>\>\>\>\>\?@(Q@xQ@(@{@(@\(@,(@ @ @(@3 @hQ@`@3 @(@Q??????aG?aG?aG?0>>>>????aG?!G>\?@>\>\?!G?aG?!G>>\>\???@S @{@@{@@`@@Q@8Q@3 @C @L(@@@# @Q?Q??aG?0?!G???>>>\>>>\??@??@??@?>\????????@0@hQ@xQ@(@\(@P@(Q?Q@Q@0@C @P@C @# @ (?Q?Q?0>G>\??>\>\??@Q@ ??@?!G?@?>\?????@??@ @P@l(@@c @C @(Q@?@@# @HQ@C @3 @Q?Q?Q??!G>G>\????@?@@0@Q??@??!G??aG???>\>\>\>\?>>\?@ (@P@@(@|(@S @# ???@(@@@C @0@ (???O\)?!G>G????!G?aG?@Q@ @8Q@Q?@?????aG???>>\>\>\???!G?!G>\?aG?@Q@3 @XQ@s @HQ@,(@Q??@Q@# @,(@# @ (?У??@>G>>\?@??@@ @HQ@P@8Q?@?>\??aG??@?>\>>??aG???!G>\?!G??Ǯ@ @8Q@3 @(@?Q????Q@ (@ (@ ?Ǯ?Q?O\)??!G?>>?@??@8Q@XQ@hQ@HQ@0?>\?!G?>\??aG????aG?@?!G>\>\???aG??Q????aG?0?0?O\)???У???Q??aG>\???!G>\?!G??@P@hQ@hQ@P@(Q??>>>\>\??aG?????0?aG?>\??aG??aG?aG?aG?@?O\)?0?>G?\)?O\)???????@?@?>\>?@??@0@xQ@(@P@Q??@>\>>??aG????@?!G>\??aG?????p?>G>G?0??????@?aG?!G?!G?>\>??aG?У@@@@0???@?>\>>\>\?aG???!G>G?@????p?\)>\>G?!G?@?@?@?aG??@???>\>\??@@@XQ@???aG?>?>\?!G?@??!G?0?O\)?0?\)?>G>G?!G?aG??aG?!G?????@@@@@(Q??@>?@>\?>\>\>\>G?\)?\)>G????!G?aG????????@Q@0@(Q@??@@@@Q@ @@Q@???@?@??aG?@?????У?????@Q@Q@Q@Q??У?У????@?@?!G?????????@Q@ @@@(Q?@Q@@Q@ @(Q@Q@ @Q????!G?!G?@?aG?aG???????????@Q@???У????>\??!G?!G?!G?@?@????????@@ @ @@@?У?@@??У?????aG?!G?!G?!G?@?@?????????????У?У????????!G?>\?!G?!G?@?aG?@???????У???У?@Q@??@@??У???У??aG?!G????!G?aG??У?У??У???????????????????@??!G?@?aG?aG?@?!G?@?????????@?????????У???@??>\>\??!G?aG????????aG????aG?@???aG??@?aG?aG?aG??@???!G???aG?aG?aG?aG?aG?aG???aG?????????!G???aG???У???aG??>\?>\>\??!G?@?aG?aG?aG?!G?@?@?@?@?aG?@?@?@?@?@?@?@?!G?!G?!G?@?@?@?aG>\?@????aG?aG??aG?aG???aG????????aG?@?aG?aG?aG?aG?????@>\>\>\>\>\>>>\???!G?!G?!G?!G?!G?!G?!G?!G?!G?!G?!G?@?!G?!G???????!G??У?@?!G?????aG?aG????????????aG?aG??@??@?!G?aG????aG?!G?>\?>\>\>>\?????!G???!G?!G?!G?!G?!G?!G?!G?>\>\??>\>\????aG??!G?aG??????aG?aG????aG???????@?@?@?@?!G?@?@?aG???aG?>\>\>>\>\????????!G?!G?!G???>\>\>\?>\>\>\>\??У??@?aG??У?????aG?aG???????????!G?@??!G?!G?!G?aG??aG?aG?!G?>>>>\????????????>\>\>\>\>\>\>\>\?!G??????@Q@Q??????????????@?!G??!G???!G?aG?aG?aG?@?>>\>\>\???????????????!G???!G?@???@Q?@(Q@@@0@@Q@Q?????????aG??@??!G????!G??@??@?aG?>>\>\>\>\>\?????!G?!G?!G?@?@?!G?!G?!G?!G?aG?????@@@HQ@(Q@p@hQ@P@@`@@???????aG?@?!G??????!G?@?>\>\>\>\>\>\???!G?!G?!G?@?@?@?@?aG?@?@?@?aG?aG?????@8Q@@@@hQ@(@(@(@(@P@ @@Q????aG?aG??@??!G?@?>\>\>\>\>\????!G?@?@?@?aG??aG?!G?!G?@?aG????????aG@0@P@(@xQ@@P@HQ@0@Q@Q?У???@?!G??!G?!G?!G????>\>\>\????!G?!G?!G?!G?@?aG?@?!G????!G?@?aG????????!G@XQ@`@@xQ@hQ@@@Q??У?У??@????!G??>\?????!G??????!G?>\>\>>\??@?????????@0@(@@@@Q??????????????>\>\???!G?!G???????>\>\>\>\???!G?aG?????????@@(@XQ@ ????????>\?>\>\>\???!G?!G?!G??!G?!G??????????!G?!G?!G?!G?@?aG?aG?aG?aG?aG????@hQ@@XQ@(Q??У???aG?!G?!G>???!G??!G?!G?!G?!G?!G?!G??????!G?@?!G?!G?@?@?@?@?aG?aG?aG?aG?@?@?aG?aG??@@@(@`@?????@?@>>\??!G???!G?!G??!G?@?@?@?@?@?aG?@?aG?@?aG?aG?aG?aG??????aG?aG?aG???>@Q@(@p@@?@??!G>>>\????!G?!G?!G??!G?@?aG??????aG?aG?aG???????У????????@8Q@(@@?@?У??aG>>>>\????!G?!G?@?!G?!G?@?@?aG??????????@@@Q@Q@@Q??У????>>@(Q@(?У?У@Q??aG>>>>>\??@?@?@?@?@?@?@?aG???????У?У???@@@0@HQ@P@P@8Q@ @Q?У????>>@(Q@@????>>>>>??@??aG?aG?aG?aG?aG?aG???????@@Q@Q@0@HQ@HQ@@@XQ@XQ@hQ@`@P@@@8Q@0@????>>@(Q??@?У?>>>>??????aG?aG?aG?aG?aG????@Q@8Q@P@0@8Q@XQ@p@p@hQ@P@XQ@`@hQ@hQ@P@`@hQ@XQ@0@??У?>>@Q??aG??!G>>??????aG?aG?@?aG???@Q@@@`@@@xQ@xQ@@(@@(@@(@(@@@p@(@(@p@XQ@8Q@ @?>???aG?aG>>???????aG?aG?@??У@@0@p@@(@(@(@(@(@(@(@@@@(@@@p@@xQ@xQ@hQ@XQ@8Q@(Q@ @?aG??!G>>?@Q@???aG??@??@Q@HQ@@@(@@(@@(@(@(@@@@@(@(@(@@@xQ@p@XQ@P@@@HQ@8Q@0?@??@Q@Q???aG?aG?aG??@(Q@HQ@p@@@@@(@@A{AA{@(@(@@@(@(@(@(@(@@@@@p@p@`?@??@@0@???aG?aG??У@(Q@hQ@xQ@@(@@(@(AA {AA$A A{@@(@@(@@(@(@@@@(@@hQ@8Q@8Q@8Q??!G?@@@(Q@ @??aG???@@XQ@@@@@(@(A A0A.{A0A*{A{A{@@A{AAA{A @@(@(@hQ@hQ@P@0@????@Q@8Q@Q?У??@Q@ @Q@@@@@(A{AA2{AN{APAJ{AJ{A@AA AA{A,AR{ADA(A@(@@P@XQ@@@P@(Q@Q???@?@Q@Q@0@Q??У@Q@Q@(Q@0@(@@(A AA(ATA\AB{ALA<A$AA{A"{A<A^{A^{A,@@(@8Q@(Q@@@`@p@XQ@XQ@P@P??@??@HQ@P@@Q@ @ @ @(Q@8Q@`@(@A A&{A0A"{A\AZ{AHA0A"{AAAA2{Av{AlA$@@(@8Q@Q@Q@8Q@HQ@@@@@(Q@(Q@8Q@(Q?@?У@0@XQ@P@@0@8Q@0@P@XQ@HQ@@A{A(A>{AZ{AXA =AtAxAB{A.{A:{AJ{AF{AAA@@@@hQ@@@ @ @(Q@Q@Q@Q@@@Q@ ?@@HQ@XQ@P@8Q@P@@@xQ@@xQ@p@(A {A:{ATA =A =A =AA =AAf{A\A|A =AAAlA {@(@@`@XQ@P@0@Q???????>?aG?@(Q@HQ@8Q@hQ@hQ@XQ@xQ@(@(@@(@A6{AtA =AAAA =A =AAr{A =AA =A =A =A*{@(@(@(@@@P@ @???aG?aG?@?!G?!G>??У@Q@@@(@(@xQ@`@XQ@@@@A {A`AAAA =AA =AA =A =AA =A =A =APA {@@(@@@(@ @?У????aG>?@?@@0@xQ@@@@xQ@`@@(@@(A,A =AAAA =AA =A =A =A =AA =AAtA@(@(@(@(@@HQ@???????!G>>>?@Q@P@@(@(@(@@@(@(@(@(AB{AAAAA =A =A =A =A =AA =AA =A@A {@@@@@(@P@(Q@??У?У???>???У@8Q@(@@(@(@(@@(@(@(@(@AJ{AA =A =A =AAAA =AAAAApA"{A{@@@@(@p@@P@`@XQ@`@`@8Q@?У??aG??@HQ@(@(@@(@@@(@(@(@(@(AR{AAA =Az{AA =AAA =AAA =A`A{A {@(A@@p@@@@(@@@@@XQ@ ??aG???@Q@`@@(@@@@@(@(@(@(A {Ar{AAA =AtA =A =A =A =AAA =AATA{A {@(A{@(@(@@A0A@@@@@@@p@Q?!G??У@ @@@(@(@(@@@(@(@(@(A*{A =AA =A =AxA =A =A =A =AAAAA>{A{@(@@@@AATAtA8A A@(@@xQ@`@p@HQ?@??@0@(@@(@@@@(@(@(@AAJ{A =A =AAAAAAAAA =AAA(A@@@@(A{AlA =A =A^{A$A@xQ?У??@@Q?aG?@@0@(@(@(@@@@(@@(AA$AdAAA =AA =AA =AA =AAAA~{A,A{@@@(@(AR{ABA =A<@(@P?aG?>\>\???У@Q@@@@@@@(@@@@(A{A,AxAAA =AA =A =BAA =AA =A =AtA*{AA@(@(@(ABAAA4@(?>\>\??!G??@8Q@XQ@p@xQ@@@@@(A {AA{A0AA =BA =AAA =AAAAAA =AlA:{AA@@(A A =BA =A =A&{@8Q>\???@@`@p@XQ@HQ@P@(@(@(AA{A{A&{A4A~{BBBA =A =ABAA =A =AAv{Af{A AA@(@(ATABBAAT@>>\?@?@0@@p@P@@@8Q@@@A A A A(A0AxA =BBA =AB'B AAAAAV{AB{AA@(@@(A<A =B=B)BA@??aG?У@8Q@xQ@`@HQ@HQ@P@@(@A{A{A&{A A*{APABB(A =AB)BBAA =A =A@A&{A A@@@(A2{A =BHB[B A@p?@??@??У@8Q@hQ@P@HQ@P@hQ@(@@AA*{A0AA{A>{A =BB(A =AB A =B A =AA =A,A{A0A{@(@@A,A =BUBgB8A@?У???@HQ@hQ@XQ@@@HQ@p@(@@A{A0A0A"{AAABB,BA =BAAA =A =AA:{@A"{A@@(@A{A =BBYB?BAf{@@@@Q??@?@@P@xQ@`@HQ@HQ@hQ@(@(AA{A(A2{A,A A {ABB,BBBA =A =AAA =AP@AA{@@P@(A{A6{ABB2B AA@(@p@ ?У??aG>\?@@XQ@xQ@`@P@`@(@@AAA0A6{A2{AA{Aj{BB1BB BB BBA =AApA@A6{@@8Q@ @(@(A"{ATABBAAj{@@Q???aG??@@@@XQ@P@`@@@@(A{A{A>{A@A8A(AA`AB BEBBBBBBA =A =A{@(@(@@`?У@Q@@A A{@(AhAA@xQ????aG>\>\>\??@8Q@`@HQ@hQ@@@(AA{A{A8A0A<A6{A`A`A =BBB B0BB%BBBA =A =@@(@(@@??@p@(@(@(@(@@@@????>\>\???@0@P@`@p@@(@(A{A{A{A0A>{A@A<A`A`ABBB7B.B'B'B7BBA =AA*{@(@hQ@(@8Q???@8Q@(@(@@p@hQ@(Q@??@ >\?>\??aG?@0@`@@@@(@A{A{A{A&{AHAJ{AB{A`A`ABBB4BnB7B2BBB0BAA =AF{@(@(@@@0@???@8Q@(@`@??????aG>\?@???@?@8Q@hQ@@@@@(A {A{A{AAN{AN{AR{AF{A`AABB.B3BKB/BFBIBBAAA =ALA$@Q@Q???У?@8Q@hQ@xQ@8Q??>\?aG?aG?!G>\?!G?@0@`@@@@@(@(A A{AA>{An{Aj{An{A`A`A =A =BB)BMBIBEBNB$BBAAA =AZ{A.{@ ????@Q@(Q@XQ@@@hQ@??>?@??@?@??@ @`@(@(@@(@(@AA{A{A<A =Ar{AA`A`AA =A =AAA =BBWBVB$B;BAA =A =AXA*{@8Q@????@(Q@(Q@8Q@`@xQ@p@`?!G????aG?@Q@XQ@@@@@(@@@(AA2{A~{A =A =A`A`AAA =AA =AA =A =BB}BAAAA(@AF{@(@XQ@Q@?У????????aG>\?aG????У?@Q@HQ@@(@@@(@(@(@(@(A"{AA =A =AA`A =A =A =AA =BA =A =ABBBAAj{A =AAZ{@@(@@HQ@@?????У???????aG?aG??@@@@@p@(@(@@(@(@@@(A{Av{AA =A =A =AAAAAAAA =B B#BB A =A =A =ApA =@(@(@@(@@XQ@(Q@Q???@Q@??!G???У??@?!G?@HQ@p@@@(@@@(@(@(@(APA =A =A =A =A =AAA =AA =AA =A =A =B ABAAA =AR{A@@(@(@@@(@(@`@`@@@@@8Q>\>\?!G?aG?@ @??!G??@0@p@@(@(@(@(@(@(@@(A4AtAA =A =AAz{A =AA =AA =AAAAAAA =A =BA =AHA@@(@(@@@@(@(@@xQ@P?>\?@?@@(Q@(Q@Q??@ @p@(@(@@(@(@(@(@(@(AATAr{AA =A =AA =AA =AA =A =A =A =A =A =A =A =A =A =BAATA$A@(@(@@(@@@(@@p?!G?!G>\?!G?@@@ @p@>\?@@@`@@(@(@(@(@@(@@(@(A.{AV{Az{A =AA =A =A =A =A =A =A =A =A =AA =AA =A =A =B6A =AA =A6{A{AAA{@@(@(@@(?@?aG?@???!G?У@@@`@?@?!G?У@@@(@@(@(@(@@(@(@@(AA@Af{A =A =ADA =A =A =A =A =A =A =A =A =A =AAAAAA =A =AA =AhA@A(A(A AA{A{A{?!G?aG??@>>>>\>>?!G?@ @p@Q@@??@@xQ@(@@(@(@(@@@(@(@(A&{A@AxA =A =AAAAAA =A =A =A =An{A|A =A =AA =BAAAA =A =AAZ{An{A`Az{A~{A??aG??aG>>>>>\>?aG?@(@P@8Q@HQ???aG?@HQ@(@(@(@@(@(@@@@(@(A6{Af{AAA =AAB AAA =A =A =BATAj{Aj{A =A =B8BAAB&BA =AA =AA =A =A =>\?@???@?>>>>>\??@Q@@(Q@0???!G?@Q@xQ@(@@(@(@(@@@(@@(AA:{ApA =A =AA =AAAAA =AAAAA =A.{A,ADAAABBBBBA =A =A =A =?????!G>\?>>>??@xQ@@Q@?@??@@HQ@@`@@(@(@@xQ@@@@A{AR{A =AAAA =A =AA =AAAAA =AA =AAAAAAAAAAAAAA =>\???У??>\>>?@@Q@hQ@@@?У???@HQ@xQ@`@hQ@(@(@xQ@xQ@(@@@A A$A\AA =A =A =AAA =A =AAAAA =AA =A =AAAAAA =AA =AA =A =A =?!G?У??@?>\>\>\?@HQ@`@??@>?@?@ @@xQ@p@HQ@`@xQ@hQ@xQ@(@(@@(AA,AdAAAAA =A =A =A =AAAAAA =AAAAAAAz{AAr{Af{Av{AtAp>\????!G?>>\?>\?>?У@@@ @?aG>>?@?@@@@@(@hQ@HQ@XQ@hQ@(@@(@@(AAA8A =A =A =A =AhAAAA =AAA =A =A =A =A =AAAAAAXAV{A:{AR{A\AN{>\??У?aG?aG?!G>\??!G?@@0??У?!G>?!G??@ @xQ@(@@hQ@@@P@@(@@(@(@(A{A{AF{AAA =AAAAAA =AAA =AAAA =BAAAA$A$A(A0A4A8???У??aG?>\>?@@@(Q@?У>>?aG@@Q@`@(@(@(@@@0@XQ@(@(@(@xQ@@AA ALAv{AAAAAAAAAAA =A =A =A =BAAAAR{A.{A{AAA{>\?@ ???>\>\?>\>\>?aG@@@@@ ?>?@??@HQ@(@@@HQ@(Q@@@`@xQ@@(@@@(AA$A:{A`AAAAAAAA =AAAA =ABAAAAb{AA =A`AJ{A,>\????!G???!G?>?@(@P@Q?aG??aG?@@p@(@(@hQ@@@0@@@P@p@@(@@@(A{A$A<AR{AAAAAAAA =A =BBAAAAAAAAAA =A>\>\????@?!G???aG?>\?!G>\>?@(@@Q?aG?!G?@@HQ@(@(@(@P@@@8Q@@@HQ@@@@@(@AA$AB{AAAAAAAAAAAAAAAAAAZ{A =A =A =A????>\?!G?!G??>\>>>???@Q?aG?aG?У@8Q@@@@p@HQ@0@(Q@0@`@@@(@(@(@A{A2{A<AV{AhAAAAAAAAAAAAAAAAAAA>\?>\>\>\>\>??@@Q??@Q@XQ@xQ@hQ@xQ@`@0@Q@(Q@8Q@P@hQ@hQ@xQ@xQ@(@A&{A$A"{AZ{Ab{AAAAAAAAAAAAAAn{A,AxA =A =>\?>\>\>\>\>>\?aG@(Q@(Q@Q@Q@P@P@`@p@P@HQ@ @@@(Q@@@P@XQ@(@`@@(A @{A4A<ALA =AF{A+ =A(A&{A(A(AHAJ{ALA A{A6{AAA*{A =??!G>\>\>>\??@0@0@HQ@HQ@HQ@XQ@p@@@ @Q@Q@Q@0@8Q@@@HQ@(@3 @(@(A{A*{A,A4A<A>{A =A{A(A(A(APAPAA@@{A' =A{AN{A@>\??>\>\??aG?@@ @@(@HQ@0@0@Q@@@Q@8Q@@@@@@@XQ@# @@@(AA AA$A.{A6{A{AA,A,AA@@@@A@AA =??!G>>\?aG?У@@@XQ@@@@@@Q@Q@@@(Q@HQ@@@@@HQ@XQ@p@@(@(A{@(A {AA{@(@A{A{A =@@@{A$A&{A =A@AL>>>??@Q@@@@@HQ@Q@@@Q@@(Q@HQ@@@@@HQ@P@xQ@(@@@(AA {A{A@(@{@(@@@@{@@{@@(@(AH>>\>>\??@(Q@(@(A@@(Q?@@Q@@ @0@8Q@@@@@8Q@HQ@xQ@@(@@@(A{A {@@(@(@(@(@(@l(@@@@@A"{>>>\??aG?У@Q@XQ@A*{A{@@Q?У?@@@ @0@@@@@0@0@P@xQ@(@(@@@(@(@{@@@(@@@{@@@@{@`@{??@??@0@AA{@@???У?@@(Q@@@XQ@@@0@@@`@@(@@(@@(@@@@{@{@@{@@{@@@{@(??aG??@XQ@@AF{A{@`???@@ @@@HQ@`@HQ@@@@@P@xQ@@(@(@(@|(@{@@(@@(@@(@@(@@{@>\?aG?У@@HQ@hQAAA~{@(@??@Q@ @@@P@HQ@HQ@P@P@P@XQ@@@@s @{@(@(@{@@@{@(@|(@s @l(@`>>\??@@<(@(AAA@@Q?У@@Q@0@@@8Q@0@@@P@`@Q@P@P@`@0@\(@@@{@(@(@{@@hQ@L(@<(@0>>\>\?@?У@# @c @{A =AtAf{@(@??@@ @ @@@Q@@ (@HQ@0@(Q@0@P@xQ@C @S @`@l(@p@l(@\(@@@0@(>>>\?!G?0?@Q@@@{AA@???У@Q@Q????@Q@Q@(Q@Q@Q@Q@Q@@ (@@ @# @,(@@(Q@Q@Q>>\>>\>>\?\)?aG??@Q@(@@{A@@,(?У??У@Q@?У?aG??????????Ǯ??Q?Q?Q?У?>\?!G?>\>\?@???@ @xQ@@(@{@c @(Q????У????0?0?0?0?@?O\)??O\)?p??>??@?@>\>\??@?@Q@0@hQ@XQ@`@`@,(@ ?У?aG?@???Q????\)>>\?!G?@?!G>>\??!G?aG??У@@@P@|(@\(@?Q??@?!G??!G?aG????!G>>>\?!G?>\?!G?aG??@Q@@@ @c @S @??0??aG???@>\>\??aG>\???@Q@(Q@@@@ @?Q??\)??!G?aG??aG>\?>\??>\>\?@?@@0@(Q@(Q@Q@Q???aG?\)?>G?@?aG??@?>\>\??>\?@?@@(Q@@@0@ ?Q?Ǯ??0?\)=u=u=u>\?!G?!G?\)>B\>>\?!G?>\>?!G??У@@ @???aG?aG?O\)?0>G=u=u>G>G>>\??!G?!G?!G?>>>?@???Q??Q?Q?p?!G?\)?O\)?aG?\)=u>\>>>>>\?!G?aG?@?>\>>\>\?>>>>G?aG??@???!G>??0?aG?aG>\>\>\>>\??!G?aG?>???!G?!G>>>>?@??У@?У?=u=u>?\)?O\)?@??>\>\?!G?@?@?@>>\?!G?@?@?!G>>>>>\?!G?aG???@=u=u=u?\)?O\)?O\)?\)>\>\???!G?aG?@?>\?!G?aG?>>>>\>G>=u=u=u=u??\)?0?!G>\?!G?@?@>\>\?aG?@>\???>\>??!G?@>\??@?@?@?@?>\>\>\??!G>\?@?!G>\>\??@?!G?>>\???!G>\>\?!G?!G??>\>>\??@??@>\>\>\>\??>\>\?!G>\>\?>\>\????>\>\???!G?@?@??!G?@?@???!G>\????>\>\?>\>\>\>\??!G?!G?!G?!G?!G?!G??>>\?!G>\>>>\>\>\??!G?!G??@?@?@?@?!G?!G?!G?!G?>\??>\?>\>\???!G?@?aG?@?@?aG?aG??aG?@?@?!G?>\>\>\>\>\??>\>\??!G?@?aG?aG??aG??????aG?@?!G?!G>\???>\>\??@?aG?aG?aG??????????aG?aG>>\??>\>\???!G?@?aG?aG??????@?????>>\>\>\>\>\??!G??@?aG??????У?@@0@ @Q??>\?>\>>>\>\>\??!G?!G?@?aG?????У?@@@HQ@@@8Q@ @>\>\>\????!G?!G?aG??????@@Q@Q@(Q@0@`@XQ@@>\>\>\>>\>\>\???!G?@?????У?@Q@@Q@Q@(Q@(Q@8Q@p@hQ>\>\>\>\>\???!G?@?aG?aG????У?@@@Q@ @Q@Q@Q@@ @XQ>\>\>\>\?????!G?@?aG?aG?????У?@@@Q@Q@@ @??У?У@(Q>\>\>\?!G?!G?!G?!G?@?aG???????У?У?@@@@Q@Q@???????!G?!G?aG?@?aG?aG?aG?????У?У?У??@@Q@@@@???????!G?aG?aG?????????У???@@@?????????????!G?aG?????????У??@@@Q@@Q@Q@??@?@Q?@@Q@@?>\?@???У?У?У?????У?@@@(Q@0@8Q@0@ @ @@@@Q@Q@Q@ @Q@ @@@Q???aG??У?????????@@ @0@@@8Q@@@8Q@0@0@8Q@@@@@8Q@8Q@8Q@8Q@8Q@@@8Q@0@ @Q???@@Q@@@@@Q@Q@@ @0@@@@@@@HQ@HQ@HQ@p@xQ@p@p@xQ@@@@@@p@hQ@`@P@@@ ?!G?@?@@ @ @Q@Q@ @ @Q@(Q@8Q@@@@@0@8Q@P@@(@@(@(@(@(@@@(@@@(@(@(@(@hQ@P@0>\??У@Q@ @ @8Q@0@ @@@8Q@0@(Q@@@HQ@@@XQ@@(@(@(@@@@@@(@(@@@@@@(@(@(@@hQ??aG?У@ @HQ@@@`@`@P@HQ@XQ@XQ@`@hQ@p@(@(@@@@(@(@@(@(@(@(@(@@@(@@(@(@@@@(@(?!G?@Q@0@xQ@(@@(@@@(@@(@@@(@(@(A {A{A{AAA AA{A{AA A A@@@(@@@@@(@?@@hQ@@@@(@@(@(@@@A@AA$A2{ATATA4A*{A A"{A"{A A A"{AA @@@@@@@(@@@?@?@Q@XQ@@@@A@@@(AA{A$A*{A2{A@AR{ApAAAlA@A$A*{A4A,AA{A @@@@(@@(@@hQ@`@p@xQ?!G?@?@XQ@(@@@(@@(@(@@@A{AB{A8ALAdAxA =AAA =ATAF{APAR{A@A{A {@@(@(@@xQ@XQ@@@0@ @ @ @ ???@p@@@(A@@@(@(@(A{A A*{AN{ATAv{AA =AAA =AAA =A =Ar{AF{A(A{@(@@(@@(@p@@@0@Q@Q@Q@?aG?@hQ@(@(A@A{@(@@A A{AA A2{A^{Az{AA =AAAAA =AAAAXA@A8A{@@@@@(@@p@HQ@ @Q@@?aG?@`@(@(@(@@@AA{A A.{A$A,Af{AtAAAA =A =AAAAA =An{AN{A.{A{@(@@(@@@@@@@`@(Q@@?aG?aG@0@Q@@(A AAA {A"{A&{A,A2{A6{A6{AhAA =A =A =AAAA =A =A =Af{AJ{A {@(@(@@(@@`@`@p@p@XQ@hQ@@@0@@?@?aG?@@(@(A{AA&{A{A0A>{AB{A0A:{AB{A@Av{AAAABA =A =A =AAb{AB{A@@(@(@p@@@ @Q@@@Q@(Q@(Q@Q@@??aG??У@`@AA&{A8AA0A*{A>{A>{A>{AF{AR{ApA =AA =BBBA =A =AAj{AH@@@@hQ@HQ@8Q@ @Q?@@@ @P@HQ@P@hQ@xQ??@?@Q@(@(A A2{A*{A&{A8A@A@A@AJ{ALA^{A|A =ABBB-BA =AAf{A4@@@`@XQ@HQ@HQ@@@8Q@Q?@Q@Q@Q?@@Q@8Q@(@?!G?aG@Q@@hQA(ALAF{A*{AJ{A<AF{AV{ALADAXAPAABBB2BA =AA~{A4@@@XQ@`@xQ@p@HQ@P@`@(Q@?@@Q@?У???@p>???@HQ@A@A:{A@A4A8ALAXA\AXAZ{AhA =ABBB(B7A =AAAF{A{@@@(@@@@(@@XQ@(Q@Q@???@???!G?>?aG?@@Q@`@(Ab{AB{AJ{A6{ADAHAN{AZ{ATATAj{ABBB&B;BAA =A~{A$@@(@(@(@@@(@@@xQ@HQ@(Q@ @Q@@@@Q@?>>??@Q@@@(AAR{APALAF{A>{AJ{A^{AXAN{AF{A =AB%B0B+B<A =A =AAF{A {@(@@@@A{A{A{@(@(@hQ@HQ@@@0@Q@@?@0@(Q??@>??@ @8Q@(@AAXAF{AN{A\ATAZ{APADA^{A =B8BaBTBdBSA =A =A`A@@@@AA A(A{@(@(@@(@@@(@p@8Q@?У?@@@(Q>????@p@AAAXA8AhAv{AV{APAXAV{Az{AB:BYBRBdB*A =AAB{@@(@@A{AA{AAA@A"{A"{A@(@(@@p@ ?У??@P?!G?@??@@ @@(A {AAF{A:{Ar{AtAPAV{ATAN{A =BB2BNBDB=A =AAdA"{@@@A{A(AA2{A{AA&{Aj{A =A4@@(@p@@(@`@??@Q?@??@Q@@@(@(@(@A.{AR{A~{Av{A^{ALAJ{AHABB9BGBAB8A =A =AF{A{@(@@A(AA A{A A,AA =A@@@HQ@Q@ @@@@@ ??????@Q@`@(@(@@A,AdAxA~{ATALA@AxABB4B@B;BA =A =A8@@A@A0@(A{A{AA =AAA.{@(@8Q??@????@??У@@ @hQ@@@@AAz{Ar{AATA^{AR{AhA =B.B8B9B0A =AAhA @A{@@A{@A@(A0ABA =@@`?@????aG??У@Q@8Q@(@@@@AAA~{A~{A\AXA\A =AB5B1B1B&A =A =AdA@A@(@(@@(@@ApB BA@(?У???aG??@Q@@@@(A{@(@(@AAAhA^{A^{A~{A =AB8B4B7AAA =AZ{A@(A{@@(@(@@A {ABAAd@??!G??У?@Q@P@@@(@(@(@AA =ApAj{AV{A =A =AB=B?B8AA =AAA{@@@(@hQ@(@(@(AAB"BA =???!G??@Q@ @hQ@@(@@(@(@A =AAtAdAR{A =A =ABB5BBAA =A =A@(@@@@@@(@A4A =B0B,A =@P???@??У?@ @(@@(@@@@A =AA =AXA{Av{AA =BB AA =AAA =A{@@(@@ @P@(@A0AB!B2BA?aG?@??!G?!G??@@0@@@@(@@(@A =AA<AA{A =AABAA =AAA =AA@(@@P@@8Q@@(A{A =BB:BA =@(?У?@?@>\??@?!G?!G?aG??@@@@@@@(@@(Aj{AZ{A2{AA@ALAAA =A =A =A =A =A =AA2{@(@(@0@Q@@@(@(A =BBIB(A =Aj{A{@xQ@Q???У??aG>\??aG??!G????@(Q@(@(@(@(@@(@(A4Af{AlATA<AV{AAA =AA =AA =AA =Az{A{@@XQ?@@`@@(AN{A =B]BLB"A =A6{A@(@(@`@?>\??!G???У???У@8Q@(@(@(@@(@@A:{Af{ApAR{A:{Ar{AAA =AAAA =AAA =A2{@(@hQ?@@P@(A{A{ABBUBEB)A =A,@@xQ???!G?@?!G?????@@@@(A@(@(@(@(A8AhAtAZ{AZ{AhAA =A =A =AA =AAA =AAXA@??@@@@(A{A2{A =BBFBQAA{@@@0??@?aG??!G??@Q??У@0@(@(@(@@(@(@A0Af{Av{Az{AdAhA =A =B-AAAAA =BAAAhA{?У?aG?@@@(AA&{ABBLB7BAn{@@(Q?aG?@????!G>\???@Q??У@Q@@@(@(@(@@A,Aj{AxAAn{AlAA =B-BBAAAB B A =AAb{A4@(?@?У@@@(@(A{AAtAA =A@@`@Q@?aG?>\???@Q@?@@xQ@@@@@AA.{ApAAAtApA =BA =B2A =AABBAAAAr{@(@?@(@(@(@(@@(@@p@@@Q???aG??У@0?????@(Q@@?@Q@`@(@@(@@(A{A8AlAA =Az{Ar{A =ABB0BEA =A =BBB'B BAA(@?@`@@(@(@(@@HQ@Q@Q@?@Q@8Q@P@XQ??????@@HQ@Q@@XQ@@A{@(@AA6{Af{AA =A|AlAv{A =A =B BBAB!B$B5BAA =AT@(?@(Q@`@p@(@(@(@(@P@8Q@(Q@0@8Q@0@>\>\?!G?@?!G??@@8Q@8Q@@HQ@(@A{@(@AA0AdA =A =AxAlAj{A =A =BABBBBB+B AAAl@(??aG?aG?@??@Q@ @XQ@hQ@(@@@@@@@0@Q??!G?!G?@>\?!G?@??@`@p@8Q@0@@A A{A{AA"{A\A =A =A =Ar{AhA~{ABBA =B2BB BB9B A =AJ{A@@8Q@Q@Q@?@Q@Q@@@(Q@(Q@(Q@Q????????@?@@HQ@p@p@(Q@xQ@A{A{A {A{AAJ{Av{AA =AtAdAdABBA =BBDB(B B$B*B)BA @(@(@`@@@8Q@8Q@@Q@@@???????@>\?aG???@?@@ @p@p@P@`@A A{A"{AA{A4An{AA =AAb{A`A =BBBAB<BFBBA =A =AAT@@@(@@hQ@P@(Q@(Q@ @ @Q@@Q@@@Q@(Q@@@P?????!G??@ @P@hQ@@hQ@A{A{A A4A A&{A\AA =AAtA`A~{AB B!BBBABQB%A =A =A =AAA&{@(@@@xQ@P@HQ@HQ@P@XQ@P@XQ@`@p@@(@@?@??!G?@?@Q@ @P@@(@(A{AAA{A,A$AF{AtA =AAAXAXAB BBBB!BFAAABAA2{A{@@(@(@@xQ@p@p@@(@@(@@(@@AA>\?@????@0@@@(@(@@A{A"{A{A.{A$A:{Ab{AAA =Ab{APAA =BBBBBAAj{ABA =AhA A{@@@@p@(@(@@@(@(@@(@(A {A{A<???@@@8Q@XQ@hQ@(@(@(A{A A AA&{A,A\A =AAAj{AF{A`A =BBBA =AAAAA =A =A =AB{A@(@(@p@hQ@xQ@(@(@(@(@(@@(A AA(AD?!G?У@8Q@(@xQ@@A{AA{A{A"{AA$AHA~{A =A =A =AJ{AR{AAB BA =A =A =AA =BAA =AAF{A{@@@(@@@@@@(@@(AA{A*{A8?aG@Q@hQ@@@@A@@(A{AAA6{AhA =AA =AtAHAf{A =ABBAA =A =AA =BBAAAA@@(@(@@(@(@@(@AA {A A {A?@8Q@(@@(@(AA@(@(A$AA(AJ{A~{AA =AAb{A\ApA =B BA =A =A =AA =A =BB A =A =AA~{A @@(@@(@(@@(@@@@@(?@@@@(@(@AA@(@(AAA{A4Af{AA =A =AAhA|A =ABB AAA =A =AAAA =A =AAAAn{A4@(@(@(@(@@(@@@@(?!G?@ @@@A{A2{A @@AA{A"{AJ{ApAAAAApA =A =ABBAA =AAA =A =B BBA =A =AAAAAHA{@(@(@(A{A{A"{??@?@P@(A A{A*{A<A{@(AAA{A*{A\AAAAAr{AAA =A =A =BA =AA =A =BBBBBA =A =A =AAAAAA =AA =AA|?!G??@(A{A&{AA<A0A @A{AA(AF{An{A =AA =Av{Ar{A~{A =A =A =ABA =A =BBBBA =A =AA =A =AAAA =A =AAA =A =A =????@@@A{A"{A"{A>{A {@@AA{A6{A\A~{A =AAtAhAxAA =A =AAA =BBAA =AA =B AAA =Ar{AXA =A =AA =AA =A =A =>\???@?@Q@(@A(AB{A2{A A@@A{A(AHApAA =ApAhAlAtA =AA =A =A =A =BAAAABBA =A =A =A,A.{A8A<AB{AZ{Ab{Aj{Av{?@?aG?!G??@Q@XQ@@(A>{ALA @@(@(A{A(A:{AXAlA =AAtAj{AdAxAAAA =AxABA =A =ABAAAA =A(A{AA{AA,A6{A:{A8>\?!G?@??>???@@hQ@(@(A{ATA\A{@(@(@(AA:{AF{APAf{AA =AtAhAb{An{AAA =A =AtAA =A =AAA =AA =AAF{A2{A{A{A {A A*{A0A,?!G?!G??aG?!G???aG??@P@(@(@(A.{A\A.{@@@(@AA@AF{AF{Ab{AtA|ApAV{AV{A\Av{A =AA =A =A =AA =A =AAAA =A>{A8A.{A2{A2{AJ{ATAPAR{??@?!G???@????@@hQ@@A{A,A4A{@@@(AA(A>{AJ{AV{AN{A^{AhAb{AV{AF{APA\AAAA =A =A =AA =AAAA6{A0A&{A.{A6{AF{AV{AN{A\>\?@?!G?aG???????@Q@hQ@(@(AA{@(@(@XQ@p@@A2{AV{AR{ATAPAZ{AdAf{AhATAJ{A^{Az{A =AA =A =BAAA =A>{A@A<A,A A$A,A@A>{A6{>\?!G?!G??@????@Q@8Q@xQ@A@(@(@`@@@(Q@P@(@A,AF{ALAN{AN{ATAdA~{Ar{A\AR{A^{Aj{AhAAAA =A =AAj{ATADA2{A{A{A"{A>{AHA<>\??@?@Q@Q????У@(Q@`@(A {A{@@@@Q@@0@@A A0ADALAN{A\Az{A~{Ar{A\AdAXAPAPAV{Af{AAAA =A =AA~{A`AA`A =AtA\>\?!G??У@(Q@8Q@(Q@?У?У@@@@@@P???У@Q@0@`@(@(A{A0A<AJ{Av{Aj{AAAhAf{A`AR{A\AZ{Ab{AAAA =A =AA =AA =A =AAt??@??@@@@@`@?@ @@(@(@(@ ????@@HQ@@@A{A*{ADATA3 =A =AAA? =An{A0A&{A&{A:{A[ =ALA_ =AXApAhAhA\AW =ATA[ =>\?@??У@(Q@(@@(@P@Q@@@hQ@@@??aG?aG??@Q@8Q@hQ@@@A.{A&{A$ALALAXAA =A\A? =A(A@AXA\A{ =A =A =A =Ak =AXALA@AB{>\?!G?@Q@(@(A(A@@(Q@`@(@(@@??@?aG?@Q@0@XQ@@{A{A$A*{A6{A.{A"{A$A(AV{A8Af{Ac =AlAA =AA{ =A =Av{A|AzAAz?@?У@8Q@@(A.{AXA{@@@@@(@P??@?@??@0@hQ@@AA"{A(A"{A{A&{A A{@AAAB{AAzAAAk =A~{A`AhA[ =Ar{?!G?@@`@(A@A =AV{@@AA @(@HQ??@@0@hQ@(@(@AAA A{A$A$A,@@A =A A# =A4A,A3 =A8A8AA>{AH>\?aG?@P@(Ab{A =AALA AA{@@hQ???@8Q@hQ@xQ@@(@(A{A{A{AA$@{@(@{@{A{A AA{A&{A,A4AA@?!G?@AA|A =AAA@@(@(@?У?@@8Q@p@xQ@(@(@(AA{A*{A{@(@@(@@AAAA(A*{A,A,A0??@(AA`AA =AP@(@@@(@@?@?@@@@@@(@(@@(A{A @@@{@@{@@AA =A =A"{A$A(>\?@XQ@A`A =AATA@(@(@@xQ@?aG?@@XQ@@@@(@(@(@(@@@(@@@@(@@AAA{A =?@ @AA{AAA\A@@`@??aG@@XQ@@@@@@@(@{@{@@{@{@@(@@(@@@(>\?aG@Q@p@AAA =AlA{@(@P??aG?@@@(@C @(@(@(@<(@\(@|(@@@@@@@(@{@@{?@Q@C @@{A4AAF{A @(@8Q???@ @p@XQ@@@HQ@XQ@p@8Q@\(@|(@(@{@(@(@@@|(??@Q@0@\(@@{A A.{A@(@8Q?aG?p@@@@P@8Q@ @Q@ ?@@Q@0@HQ@HQ@(@ @@ (?!G??@8Q@`@C @L(@(@@@@XQ???@(Q@(Q@Q???Q??Q??Ǯ?Ǯ?Q????aG????@@# @8Q@<(@p@hQ@Q?aG?????@?0?aG?\)?!G?0?0>?!G?@???????Q????>\>\?@?aG???Q?????aG?aG??\)>\>\??!G?aG?aG?????Q??@?\)>>>\?>>\?!G?aG???У??У?Q???!G>>\?>\??@???@Q????aG?O\)>G=u=u=u>=u>>\>\?!G>\>\?!G?@??У@@Q@Q@@Q?У?Q?O\)=u=u=u=u=u>>\>\>\?!G>???@Q@Q@Q@@ ?????\)>=u=u>>\>\>????@ @@# @(@Q@Q?Q???aG?>=u>>>G?@??@@Q@Q@8Q@0@?Q??>G=u>>\??@?aG??@P@hQ@<(@(@?Q??O\)>\>\>\?!G?@(@3 @C @0@0@# ???O\)?>G>\>\>\>\?!G????@@ ???Ǯ??aG?\)>R>\>\>\>\?@?aG??Q?Q?У?У?@ ?У?У???O\)>G>\???@?aG??????У??У???O\)>\>\??!G?aG?Q?Q?????Q???\)>G>\>\>\>\>\?!G?@?0?!G?0?????!G?0?\)>G>\?>\?0???aG?@?aG??aG??p>\>\?>\>\>G?O\)?!G>G>G?0?@?@??p>\>\?@?>\>G?\)?0?0??!G?!G?aG????????У?????@?@?>\>\??@?@?aG?????@@???????aG???@??>\>\>\>\>\>\??!G?@?aG???@@@@ @Q@??????????@?@?!G?!G?>\>\???!G?@?aG???@ @8Q@(Q@ @ @Q?У????????????aG?@?>\??@?@?@???У@Q@(Q@0@ @ @?У?У?У?У?У?У?У?У????У?У????@??!G?aG????У@@Q@ @ @Q@Q?У?У?У????????@@Q@@???>\?aG????У??@Q@ @Q@@????У???@@Q@Q@Q??@@Q@Q@ @Q@?!G?aG???У?@@Q?@@?????У?У?У??@@Q@Q@??@@(Q@0@0@0@ ?@??????У???????????У??@Q@Q@@@@Q@Q@8Q@@@@@8Q@0>\?@????????????????У??@@@@Q@@Q@Q@Q@Q@Q@HQ@HQ@@??!G?@?@?@?aG?????????У?У???@@Q@Q@Q@Q@Q@ @Q@Q@Q@Q@P@XQ>\??!G?@?@?aG?aG??????У??@?@@@Q@ @(Q@(Q@(Q@0@0@8Q@8Q@0@0@`??!G?@?@?aG?????У?@@@Q@Q@Q@ @(Q@0@0@(Q@0@0@@@HQ@P@XQ@HQ@@@p??!G?aG??aG?????У?@Q@@@Q@(Q@(Q@0@8Q@8Q@8Q@@@HQ@@@HQ@HQ@HQ@HQ@HQ@HQ@@?!G?????У?@@Q@Q@@Q@ @0@8Q@8Q@@@@@@@HQ@P@XQ@`@`@XQ@P@P@HQ@HQ@HQ@HQ>\?!G?aG???У?@@(Q@(Q@(Q@ @(Q@0@8Q@8Q@8Q@0@0@0@8Q@@@HQ@P@`@hQ@`@`@`@p@@@xQ>\?@???У@@ @8Q@HQ@`@HQ@8Q@8Q@8Q@8Q@0@(Q@(Q@0@0@8Q@@@HQ@HQ@HQ@8Q@8Q@8Q@8Q@@@@@hQ@(@(?!G?@??@ @P@`@`@`@hQ@`@HQ@HQ@HQ@8Q@0@0@@@@@HQ@XQ@XQ@XQ@XQ@hQ@p@hQ@XQ@@@@@8Q@P@p@(??aG?@Q@HQ@xQ@(@xQ@hQ@@@hQ@XQ@HQ@@@HQ@XQ@XQ@XQ@`@`@`@p@@@@@@@@xQ@XQ@HQ@P@hQ??aG?@Q@XQ@(@@(@@@(@@@xQ@p@@(@@(@@(@(@(@@@@(@@@@@@@@`@HQ??aG??@`@(@(@@@@(@(@@@(@(@(@@(@(@(@(@(@xQ@hQ@p@xQ@p@p@p@xQ@@@@(@(@xQ??!G??@@@(@@@@@@(@xQ@(@@(@(@@@@(@(@(@p@hQ@p@xQ@hQ@XQ@HQ@@@@@P@XQ@hQ@xQ@(@??@?@?@?@@@@@@(@@@(@(@(@(@@@@(@@@@@xQ@`@hQ@p@p@XQ@HQ@8Q@8Q@@@@@0@0@8Q@HQ@hQ@xQ?@?@?@??@@XQ@AA {A@@@@@@(A@(@@(@@(@(@(@@(@@p@P@8Q@(Q@(Q@(Q@(Q@(Q@0@ @ @(Q@8Q@HQ?@??@Q@ @`@(A{A"{A{AA{A@(@(A AA AA{A@(@@@@@@xQ@P@8Q@(Q@ @Q@Q@ @ @(Q@@Q@Q@(Q@0?@???@ @`@AA8A.{A&{A A&{A{AA {A$A.{AA$A AA{@@@(@@@XQ@(Q@(Q@0@@Q@Q@@@@@Q@@Q@ ?!G?aG??@(Q@`@AA:{ADA6{A6{A,A$AAA0A&{A$A<A8A{A{A{A@(@@(@(@P@0@0@(Q@Q@Q@@@@@??@@?@?У?У@(Q@@@(A2{AZ{APAR{AB{A,A{A{A$A6{A4A\A^{A>{A0A@ADA$@(@@@@p@XQ@@@ @@?@???У???У??@?@@Q@p@(@(A{ApAz{Ar{AXAF{A{A AAB{AJ{AZ{AhAV{A:{AJ{ATA8A@@@(@xQ@hQ@P@0@Q??У?У???????????@@@@AAXA =AAhAJ{A.{A{AAB{AR{A`A =AlAV{Aj{A\A8A @@@@P@0@Q@ @Q??????У????aG???!G?!G?@Q@`@(@A6{A =AAAb{A@A$AA@An{A`A =AAxAtAv{AB{A@@@HQ@???????aG?aG????????@?aG?!G?!G?!G??@HQ@(@(AAf{AAAAhAJ{A.{A6{AlAtA =A =A =A =Av{AJ{A{@(@`@(Q??????????????У?????@?!G?!G?@?aG?@ @@@A<A =A =AAtAdAB{A8A^{A =AAAA =AAPA {@@@@Q???У??У?????@?!G?aG?????У???@?aG?@?aG?@?!G?@@P@(@(AA^{A =A =AAhAR{A@ATAAA =A =A =A =AXA{@@0@Q?У?У?@@Q@@Q@ @??!G>\??aG??@Q@?У???!G???aG?@?aG?@ @`@A{A8AAA =AtAV{AB{A:{AZ{AA =AAAALA{@(@HQ@??У@Q@(Q@(Q@@@xQ@@hQ@hQ@@@??!G??!G??@ @ ?У??!G??????У@8Q@@AAF{AA =AAn{AB{A4ADA =AA =AAA|A<@@XQ@Q@@@Q@@@P@hQ@@@@(@@xQ@P@0@ ???@?У@8Q@HQ??aG?????@0@p@(@(A{Af{AA =AlA\A4ADAlA =AA =A =A =ATA{@@0@@@(Q@@@`@@(@@(@(@@(@(@@(@xQ@xQ@P??@xQ@p?aG?????@@@@(@AA|A =AAR{A4A*{AB{AAA~{A =A =A =A(@(@P@ @Q@0@XQ@hQ@(@(@(@@@(@@@@xQ@xQ@(@@p@(??@(?????У?У@Q@P@(@@A,AA =AAJ{A"{AAHAAAf{AA =AD@(@xQ@0@ @8Q@hQ@(@(@(@(A@(@(@@@@(@@p@@@@xQ@0?@@??!G?????@Q@@(@AA6{A =A =AAN{A A{Af{AAA|AAj{A@@P@0@@@p@@@@@(@@(@@(@(@@@@@@@(@@hQ????!G???@?@0@p@@AA>{A =A =AxAN{AA{Ab{AAz{Ar{A =A8@(@xQ@XQ@P@xQ@(@@@@(A {@@@(@@(AAA(A@@(@@@(@Q???@???@Q@@Q@@@(@@A ALA =AApADA A*{AAAn{ApAdA@(@p@hQ@@@@@@@AA{@(@(A{A@A8A {@(@@@Q@p@@@(@(Q????!G???@@@@P@(@(AA{APAAAtAB{A {A4A =AAV{AA =@@(@xQ@xQ@@(@@(@(@XQAA{A{@A{AdA\A@Q@P@(@(@8Q????!G?aG???У@@Q@0@`@(@AA2{AN{AA =AdA2{A{ADAAAAA =A@(@(@@@@(@xQ@`@PA{A"{A{A{AV{AAF{@hQ?@@xQ@8Q?У???!G?@?aG???У@@(Q@XQ@(@@A&{A<ATAAA`A(A{ALA =AAA =AAP@(@@@(@(@@P@8Q@`A{A6{A"{AHA~{A~{@(?@hQ@XQ@8Q????!G?aG????У?@ @p@@(A A4A@ATAr{Ar{A^{A(AAb{AA =AA =A =AT@(@@@(@(@(@@@0@A&{A@A8Av{AAd@p@8Q@@@ @Q???!G???У??У?@ @p@@(A{AB{AB{AN{AdAj{ALA&{AAdAA =AA =A =Av{AR{@(@@@(@(@8Q@@@AAZ{A\A =AtAL@(@0@8Q@ @?????????@0@@@AA8A<ADAXA\AF{A0A Ab{A =AA =A =AAAz{A{@(@@@(@HQ@XQ@A{An{AAAj{AH@(??@(Q@0@Q@??!G????У??@ @(@(A{A A4A<A8AJ{APA>{A0A.{Ab{AAA =A =A =A =AA{AA@@@`@p@A{AAA =Av{A2{@(@@@0@8Q@Q@Q??!G??@Q@?У?@ @@AA&{A,A4A&{A<ALA4A.{A<A\AA =A =AAA =AA$A&{A{A{@@hQ@@(A A`AA =A =A0@@@?@HQ@`@8Q@ ??aG??!G??@Q@Q?@@(Q@(A{AA$A,A6{A.{A>{ATA>{A<APAdAA =AB{AN{AA =A =A*{A.{A"{A@(@@@A {ALA =AA =A`A {@(@@@@ @(Q@xQ@(@hQ@(Q??@@?!G??@@ @Q@Q@@@AA$A A*{A<A:{AF{AdAV{AR{AhA~{A =AAN{AZ{A =AA =AJ{A(A,A{@(@(@@(AADAAB1BAA2{@(@(@@@@@hQ@Q??@(?@?У@@Q@(Q@(Q@Q@8Q@AA2{A.{A"{A8A8AB{An{A|Ar{AA =AA =An{A =AAA =Aj{A8A>{A.{A{@@@A"{ADA =AB B>BAA =A =A^{A{@@@(Q?У?@(@Q?@?@Q@Q@(Q@8Q@0@XQ@(@(A:{ALA(A2{A0A@AtAA =A =AA =A =A =AApAAAAHALAA$@@@AA0AA =ABBBAA =A>{@(@(@??@@(Q??@Q@Q@ @8Q@HQ@P@@A.{AXA4A2{AF{ATAv{AAAA =AA =A =A =A =AAAAj{ALA A{@A@@AA>{A =AAA =AA =A@@@??@ @@Q???@ @(Q@8Q@8Q@XQ@(@A{AR{ALAB{A`ApAAAA =A =AABA"{ApA =AAA =ATAR{AF{A@A@(@(A{A*{AN{AtAA =A =AJ{A {@(@P@XQ@xQ@XQ??У?@??@@0@@@XQ@hQ@(@AA<AlA\A|AAA =AAAAAB@(AF{ABAAAZ{A\Aj{A$@(@(A @(@(@AAA{A6{AZ{ADA{@@(@xQ??У@Q@(Q?!G??У@ @8Q@HQ@P@hQ@(@(AA2{An{AtA =AAAA =A =AAA =AAA6{AA =BAA =An{A =ALA@(@@(@(@(@(@@@@(@(@p@0@??@0@`@`@p???@Q@HQ@XQ@p@@@(A{A.{Ab{A|AAA =AA =A =AA =A =BA =A6{ApA =BAA =AA =AdA4A@(A{@(@(@@(@(@@@(@p@@@@@@@P@p@xQ@xQ@@?aG?@Q@HQ@p@(@@@A{A<An{A =A|A =A =A =AAA =A =ABAA,AdABBAAAR{AXA,A A{@(A6{AA @@(@(@@(@@(@@(@(@(@(@(@(@(?@??@Q@hQ@@@@(A(AB{A =AAA =A =AAAA =A =A =A =AAADAABBA =An{AF{A0AF{A.{AAV{A@A0A(A{A{A{@(@@(@(@(@(@(@@@(A{?aG?@Q@@(@(AA{A$A@A\A =AAAAA =AAA =AA =AAA@AABBAA =AR{AHA<AJ{A,A.{A|APA.{A"{A{AA{@@(@(@(@(@@AADAP>\>\?@?@8Q@(@A{A*{AA2{AN{A =AAA =A =A =A =AA =AAAAA{AA =A =A =BA =A =AXAA AF{A<A =A =AAhAN{A:{A2{A.{A"{A{AA&{A<ALAPA@A0??!G?!G?@@@(A{AV{A2{A,A<AxAA =AA =AA =AA =AAAA =AAj{AABBA =A&{@pA^{AA6{A =AJ{AA =AAAAA|ApAXAXAPAB{A,A$A(A.{?aG?aG??!G?@8Q@(AA\AxA>{A@An{A =A =AAA =A =AAA =ABAA =AAf{AAABA =A =AAb{A A2{A {A^{AlAr{AhAn{AlAlAb{AJ{A4A&{A(A*{A*{AA ?!G??@??@??@hQ@AXA =AxA6{AZ{AAA =AA =AA =AAAAA =AAA\A =AA =A =B A =AAAA:{@(AAB{AN{ALAR{AXA^{AV{A>{A0A"{A AA{AA{?!G?aG?aG???aG?!G?@P@(A(A =AA^{ADAf{AA =AA =AAA =A =A =AA =A =AA =A>{A =AA*{A =AA =A =AA =ADA{@A{AAA"{A.{A*{AA{A{AAA{A{A{??!G?aG?????@?@8Q@@(AN{A =AAXA<AtAAv{AA =AAAAA =AA =A =AA =A =AAAA =A =A =AAz{AhA:{A{@(@@(@@@(@(@(@A{A@(@@(?!G?@???У@Q@??@@(AAhA =A =A:{ADA|ApA =AA =AAA =AAA =AAAAA =A =AA =AA =A =AZ{A =AhA @@(@(@@(@(@(@@(@(@@@(@hQ?@?!G??@@8Q@(@HQ??@8Q@@ALA =AA~{A2{A^{Ar{AxAA =A =A =AAA =AAAAAAAAA =A =AA =AAAA{@@@@p@@xQ@p@hQ@`@P@HQ@@@P@P???@@@@@@???@hQ@(A*{A|A =A =ADA>{A`AhAA =A =A =AAA =A =A =AAAAAA =AA =BAAA =AA6{A@@@XQ@ @@@@0@(Q@0@8Q@8Q@XQ@xQ?aG?@@P@@(@(@hQ??@?aG@Q@(A {ALA =A =A~{A0AB{APAj{A|A =AA =AAA =A =AA =AA =AA =BA =A =BA =A =AAAxAb{A<@@HQ@0@(@@hQ@(@@@A?@??@8Q@`@p@(@@p??@0@A,Ab{AAALA6{APAb{Aj{A =AAA =AA =A =A =ABBAA =AA =ABB BAAA =AAv{A =AdAf{A>{A>{A4A@A:{ALAJ{A@???!G?aG?@@HQ@P@p@(@(@P??@?!G?@@@ALAr{AAZ{AR{APA`Ab{Af{A =AA =AA =A =AAA =A =BA =AAA =A =AA =BBBAABAAAA =Av{AtA|AAz{Av{??@??@(Q@P@P@(@@(???@?@?!G?@xQAAV{A =A =A =APAPAn{AtAr{AAA =AA =A =AAA =AAA =A =A =A =A =A =AABB B BA =A =AA =AA =AA =A =A =?!G??aG?@@Q@P@xQ@(@@HQ?У??@?@?!G?@A{A~{AAA =AZ{A^{AtAtAr{AA =AAA =AAA =AA =A =A =AAAAhAA =B A =A =A =AA =AA =A =Az{AtAj{An{An{?!G???!G???@(Q@p@(@@HQ@???@?@@@(@(AA =AAAj{AlAAtA~{AAAAA =AAAA =AA =A =AA =A|Av{AA =AA =A =AA:{AF{A8A2{A4AF{AR{AR{A`?aG?aG?@??@?aG?У@Q@HQ@p@`@ @0@Q@??!G?@@@xQA{ABA =A =A =A =Av{AxAA =AAAA =AA =A =AAAAAAAA =AA =A =AAn{A0A6{A8A8AF{APAdAj{Ap??@?!G??!G?@??@Q@HQ@xQ@xQ@@HQ@Q@Q??!G>?aG@@(A*{AAA =AA =A =A`Az{AhA =A =A =A =AAAz{Ab{Af{Ab{Aj{Aj{AA =AA =AA =A =A^{A\A\AV{APAf{Ar{Av{Af{A^{>\???!G?@?!G?aG?@@HQ@(@(@@0?@Q??!G?@@@A:{A =AA =AA|A\AV{Ab{ATAN{A =AAAA~{Ab{AR{AF{A.{A2{A8AV{AZ{Ab{AdATAPA@A8A4A4A8A2{A:{A@AHAJ{???!G?!G>???!G?@??@(Q@xQ@@??@(Q@Q?aG?aG?@(@(A4AA =A =AAf{AHAZ{AXA4A0AN{Az{AA~{A|Aj{AhA^{AXA0AA{AAA{A{A{A{A{A{A {A{AA,A0A(>\?>??>>\?>\??@?@@xQ@(@(Q??У@8Q@ ??@8Q@@(A{AZ{A =AAAlAHAR{AF{A&{A{A6{AZ{AhAtAxAz{A~{AlAHA2{AA@@@@(@(@@(@(@(A A{A{A{?????>>>>\?@?У@0@@@xQ@?@HQ@HQ@@ @P@@A*{AZ{Az{AAAj{A>{A<A<A,A A,A:{ALAhAj{A|Ab{AF{A.{AA{@A{@(@(@(@@(@@@(A{AA{>\?!G>>?>\?@@8Q@@@(@HQ@ @p@(@xQ@0@@(A{AA0A^{AAAdA6{A.{A:{A.{AA$A,AHA\An{Ab{ALA0A"{A{A{@@A@AA{A {A{A{A{A{A??!G???aG?@ @AA@@@@@(@xQ@Q@(@A A A*{AA,A>{A:{A8@A<A(AA @{ADAV{A\AAB{AAA@(@{@@(@{@(@{@@@{@@(?>\>\?>\?!G?@Q@AA{@@@(@@@HQ@AA"{AA{AAA"{A,A4@@(A0AA A2{AF{AR{AR{AJ{@{@@(@{A{@A =@@{@{@(@(@{@@?>\??@0@(@(@(@(@(@@(@@@@A(AhADAAAAA@A:{A4A{A{A6{A:{A<A<AB{@@@{@{@@@@@@(@{@@@(>\>\>\?!G?@0@@(@(@(@@(@@(@@@A{AF{Af{AJ{A&{A@A{AA AA{A{A A$A&{A0@@{@@{@(@{@{@{@(@@@@(@(??@??@HQ@(@(@A@(A{A@(@@(@(A {A(A\AF{A@(@@(A{AAAA {AA$A*{@@{@{@(@{@@{@@(@@(@@(>\?!G?@@(@(A AA0AB{A.{A{@(@(@(@(@@(AA0A@A{@@@AA{A{A {A{A{@@{@(@@{@{@{@@(@@(A{@?!G?@@@(@(AA,ADA$AA{A{@(@(@(@(@(A{AXA =A@A{@@(AA{AAA @@@@{@{@@{@@@@(@{A>\?@?@@@@A{A:{A @(A{A{A"{A{A{@@@(A{Av{A =AhA<A*{AA A(A{A{@@@@(@{@@{@(@(@(@(@@{?!G?@0@@A{AA{A{A,A<A(A@(@(A{A{A{@(@@@@A AA0A.{@(@(@(@{@(@{@(@(@(@(@@@??@@xQ@@pA AhAXAb{AZ{A<A {@(@AA,AN{A8@(A@(@(@(@A@(@@(@{@(@{@{@{@@(@{@{@?@?У@ @<(@(@{AxA =AZ{A8A"{A{@(@(@@A{@(@(@(@{@@@@{@@@(@(@@(@@@(@(@xQ@`>\?@??Q@0@s @A,ADA(A,A@(@(@@(@@@(@<(@l(@(@@(@@@(@@(@@{@@|(@hQ@\(@HQ@<(>?????Q@(@S @@(A AA A@(@(@@(@(@@(Q@@@@(@(@@@XQ@xQ@(@{@xQ@P@xQ@@ @?>\?>\?@@HQ@@@@(@@AA A{A {@(@@(Q@@P@@(@@xQ@@@ @ @0@XQ@hQ@P@Q???У>\????@??Q@0@@(@{@(@(@(A {@(@|(@,(@Q?@@HQ@@@@@8Q????Q?Q@ @p@ @ ????!G?!G??????@(@S @(@@(@@@(@@@P????0?@??Q??У?@@ >\?!G?aG?@????O\)??Ǯ@ (@HQ@`@(@c @`@hQ@@xQ@XQ@??\)?\)??\)?@?aG????!G?@?aG?!G?!G>\???У?@8Q@HQ@(Q@ @(Q@Q@ ???!G>\?\)?0>\?!G?aG??aG?!G?>>>>=u>G?@?p??Q??У?Q?????aG?>\??@???aG>\>>>>=u=u=u>G>G?\)?!G??!G?@??aG?@??\)>\??!G?aG?????>>>>>=u=u=u???=u??aG?@?@???>??!G?!G>>>>>>=u=u=u>\?!G?aG?@?@?@???>\>>\?!G?aG??@?0=u=u=u=u=u>\?!G?aG???@?@?>>?!G?0?O\)???aG?aG>\>\>\?!G?aG???aG>>>>?!G?@?aG???>\?!G?>\?aG???!G>\>>>>???!G?!G>\?!G?@>\>\??!G?!G>>>>>>\?aG?>\>\>\?@??!G>\??!G>\?@?!G?>\?\)?>\?>\?!G?aG???Q?aG?Q??p?p?\)>\>G?!G?@??aG?Q???O\)???>\?>\??0?p?\)>\>\>G??!G?!G?@@Q@???@Q@Q@??????У?У??У????????????@??У@(Q@0@@??@(Q@8Q@0@(Q@0@0@Q@ @Q@????@@???У????????@@(Q@Q@Q@Q@P@`@p@xQ@hQ@(@p@HQ@(Q@Q@?????@@@@????У???????@ @0@P@(@hQ@p@(@@XQ@HQ@0@ @??@@??@@Q@Q@Q@@???У?????@@Q@ @0@XQ@`@xQ@@hQ@8Q@8Q@0@Q?@Q@@Q@Q@@@ @ @ @ @Q@@???????У?У@Q@@@0@XQ@xQ@p@XQ@@@(Q@Q@@@@ @Q@Q@Q@Q@@Q@(Q@ @Q@@@Q@Q??@?@???@ @ @P@XQ@XQ@hQ@XQ@0@Q@@ @ @ @ @(Q@ @0@(Q@Q@@Q@Q@@@Q@@?!G?aG????@ @8Q@HQ@@@8Q@ @0@(Q@0@ @ @(Q@(Q@8Q@8Q@8Q@0@@Q@@ @ @ @Q@Q>\>\??!G??У@Q@Q@Q@@ @8Q@@@0@0@0@0@(Q@(Q@0@(Q@Q@@ @Q@@@8Q@0@(Q@ ?!G????У?@Q@@(Q@(Q@(Q@0@(Q@ @Q@@Q@(Q@0@0@0@(Q@Q@@@8Q@0>\?@?????@Q@Q@ @ @ @Q@Q@Q@Q@ @8Q@@@8Q@@@@@0@ @@@8Q?!G?aG????@Q@@Q@(Q@ @Q@@@@Q@ @(Q@0@0@8Q@8Q@8Q@8Q@0@(Q@P??aG???@Q@@ @0@0@(Q@Q@@@Q@Q@@@Q@ @(Q@(Q@0@8Q@@@8Q@0@0@P?@??У?@@0@0@8Q@8Q@0@ @Q??@@Q@Q@@@@@Q@ @0@0@(Q@8Q@8Q@(Q@(Q??У@@0@HQ@`@hQ@`@@@(Q@????У?????@@@@@Q@@@ @0@ @(Q>\?!G??@@P@@(@p@hQ@@@Q???У?У??????@Q@Q@Q@Q@@??@@@Q@?!G??@Q@P@(@@xQ@`@8Q@Q??У???????@@@ @0@8Q@P@hQ@hQ@HQ@(Q@(Q@@Q@Q?@??@ @hQ@@@@XQ@(Q@@?У?У?У??@@Q@Q@??@Q@Q@ @`@(@@@@@`@P@ ??@??@(Q@xQ?У@@@`@0@ @Q@@@@@Q@???У??????@(Q@HQ@hQ@@(@@(@(@(??aG??@Q??@8Q@HQ@p@@@@0@(Q@0@0@(Q@8Q@(Q@??????????У?@@ @XQ@@@(@(??@????!G?@Q@XQ@@(@(@(@@@hQ@`@HQ@8Q@@@(Q@Q?@?????????@@@(Q@HQ@@@(??aG?>\>??@ @@A{A{@@(@@(@(@@p@XQ@P@@@(Q@(Q@8Q@(Q@Q??@?@@@Q@Q@@ @8Q@`@(@(?!G?>\>\>\?!G?@HQ@A(A{A{A@@@(AA*{AF{A^{@p@hQ@p@HQ@8Q@HQ@@@8Q@8Q@@@P@HQ@@@ @ @(Q@(Q@0@8Q@@@`@xQ?!G>>\>\>\?@?@(AA<A0A*{A @AA{A{A(AR{AXAF{A.{AJ{@(@@p@p@(@(@@@p@P@0@ @Q@Q@Q@Q@ @0@HQ@p>\>\?!G?@ @A&{AF{A.{A.{A4AAA{AA{A,AJ{A^{AA =AA =A@(@@@(@hQ@XQ@HQ@0@ @Q@@@??@Q@0@`>??@@@xQ@(A{ATAdAF{AB{A(AA{AA0AV{A`AhA =A =AAAA =A@(@(@hQ@8Q@HQ@XQ@(Q@ @ @(Q@@???@@HQ>>\?@ @@(AR{A =AAb{ATAZ{A*{A{AA*{AJ{ApA =AA =AA =A =BBA =@@@xQ@HQ@@@0@@Q@@Q@Q@Q@?У?@@?!G@@@(@A<A|AAA^{AR{AB{A0A2{A8AA|A =A =AB BBB A =A =A =@(@(@(@XQ@0@???У?@Q@@Q???@Q>?@ @(@(A{AlA =AA =Av{AR{A>{A"{A2{AAA =A =A =BB BA =AA =A@(@@(@xQ@hQ@0?????????У?У@@Q?!G@@hQ@@(AdAAAApALATA2{A<AA =A =ABBBBBA =A =A@(@@hQ@@@8Q@@@(Q@????????У??У@??@P@(@(A AA =AAAXAhAJ{AJ{AlA =AABBBBAAAA@@@HQ@@@HQ@HQ@P@@@(Q@?У?????aG??aG????@Q@8Q@(@(AA\AA =A =Ab{AZ{A^{AHA\A =A =ABB%BB AAAL@@xQ@hQ@(@@@(@@`@????????aG?!G?aG????!G?!G?У@hQ@(@@(A<A =AA =AtAhAV{AHAJ{AA =ABB BA =AAA{@@hQ@(@AA{A@@(@xQ@(Q@Q??????У??@?aG??aG?!G?@?@0@@(@(A{AtAAA =A`AF{A\AJ{AAAB BBBA =AA{@@@@A{A{@@(@@@@@@Q?@Q@@@Q??У??aG???@??aG?aG@Q@`@@@(A$AA =A =AlAv{ALAV{ApAA =A =BB%BA =AA@(@(@(@(A A@(@(@@(@(@xQ@@@8Q@@ @hQ@@XQ@???aG???!G?@??aG?!G?@HQ@@@AA6{AAAAXA\AR{A\A =A =A =BBBA =A =A@@(@(@(A{A(@(@(@@p@@@Q@@@Q@@Q@Q@Q@P@(@(@p@???aG?!G??aG???aG@@hQ@(@(@(AAZ{AAA =ApADA\A^{AA =BA =BAAAR{@@(@@A<A{@@@@`@@@8Q@(Q@0@0@ @Q@Q?@@@(@(@p????!G?!G????aG?@@@@@(@(A{AAA =AA^{APA^{AA =A =A =A =AA =AA{@@@A@AP@(@@@(@A A@(@@hQ@8Q@Q@??У@@(A{@@ ????!G?@??У??aG?У@8Q@@(@@(A:{A =AAAv{Ab{A\AlA =AAAA =A =AAZ{@@@A2{AA&{@@(@(A@A =A =A =AV{@(@`@??@??@PAA@?????@?aG?@?У??@P@(@@(@(A2{A =AhA =Ab{Av{Az{A =AA =BA =AAA =A @@(A{A|AA{@(@ATA =B A =A|@@(@HQ??????@@A,@(@???aG?@@0@???@P@@@AA^{Ar{AJ{A =AtA|A =A =A =BA =A =A =AAD@@@(A^{AA =A @(A,A =B%AAJ{@@@@XQ@0??aG?aG?@`@(A@0???@?@Q@P@ ??aG@@`@@@A{A\AXA8A =AlA =A =A =A =A =A =AA =AA"{@@@A =AAxA{A AB9BHAA{@(@(@(@@@?У@(Q@A@`?>\??aG?@0@HQ@ ??aG?У@`@@@A"{APAHA:{A =Az{An{AA =A =AAAAAlA{@@(AA =AAdA6{AlBBBA@A@@xQ?????aG?@(A@p?>\???aG?@0@P@ ??aG?@`@(@@A*{APAA0Af{A =A =AAA =AA =A =A =A =A4A{@AAA =A^{An{ABjBAA@(@(Q??aG?У@(A{@hQ?>\??>\?@?У@XQ@@0??aG?@P@(@@(A*{APAA0APA =A =A =A =AAAAA =AAF{A {A{AAA =Az{AB#BBA =@(@hQ??У@A@xQ>>\??>\?@?@`@@8Q??aG?@HQ@@(@(A:{AZ{AA(A0A =A =A =A =A =A =A =AAAlALA{A&{Ar{AAAA =B]BBA@(?У?@@@(@8Q>\?????@?У@XQ@(@P???У@P@@AA2{AhA =A|AAn{AA =A =AAAAxAA =ATAA6{A =A =A =A =ABxBBA@?aG??@ @(@(?У>\??!G??@?@?aG?У@HQ@@`@Q??@8Q@(@(A{AHAj{Az{An{A{A\AAA =A =A =AXAtA =BAdAHATAA =AAA =BABπBBTA???@P@@(>\>>>\??aG?@?@?@?@?@@@@xQ@Q??У@HQ@@A(APAf{Af{AR{A8AB{A =AA =AJ{A.{ALAV{AA =AdAr{AtAAAA =A =BBCGBA =@XQ??@Q@@@>\>\>\>\????@?!G?aG?У@HQ@@(@8Q?У?@8Q@@A0AZ{AXAR{A@A,A&{AA =AA>{A,AN{A\AA =A =AhALA =AAAAB B4BBրBYA =@XQ?@@Q@P@(@xQ?aG>\>\>\?>\?!G????@??У@P@@(@xQ??@0@(@A$AXAPAHA<A6{A AtA =AXAAAV{Ab{A =A =A =Ab{A =AAA =A =A =BBB=BBBNA@(@hQ@Q??@Q@XQ@hQ@P@@?У??!G?!G??@?@Q???@@XQ@(@@hQ??aG@ @@AAN{ADA@A<A8A:{AxAA =A@A6{AhAA =A =AAA =A =A =AA =BB*B&B BIBsB[AAJ{A@@(@@@(@@@?@?aG?aG?aG?aG?@Q???@ @`@@(@(@Q@Q@(@(A{A<A8A>{A4A0A:{Av{A =AA =A|AA =A =AAAABA =AA =AABB:BABBB A =A =A8A@(@(A{@(@0??!G?aG?aG?aG?@?????@0@xQ@@@@8Q?@@(AA4A8A@A0A$A6{AtAAA =A`AAA =A =AAA =BBAA =A =A =A =B BAA =AA =A^{A:{A {AA{A{@@(Q???@??aG??????@Q@@(@@(@`??@P@@(A{A:{ALA>{A&{A*{A^{AAA =AZ{AdAA =AA =A =A =ABBAAA =AA =A =BAAAAAAxAJ{A{@xQ????@Q?!G????????@@hQ@(@@(@@?@0@@(A{ADA\AR{A>{A*{A^{AA =AAA.{A =AAA =AA =AA =A =AAAA =A =AA =BBBA =A =A@@ ????@??@@P??????????@HQ@@(@(@(@0??@@(AATAtAf{AR{A,ATA =AA =A|AxAAj{A =AA =AA =AA =BA =AAAAr{A =AA =AAA<@(@@(@@xQ@XQ@8Q@@@0@`@(>\?@??????У??@(Q@@@(@@hQ??@HQ@(AAV{A =AAf{A<A:{AAAA|AZ{AAAj{A =AAAAAAAA =A =A`A(A"{A2{A8A.{A{A@@(@(@(@P@8Q@@@8Q@P@hQ@@(???У?У?@Q???@0@@@@@(@?@@A{AZ{AA =Av{APA,AdAA =A =A{A8A^{AR{AV{A =AAAA =A =A =A =AAAhA2{AA@(@@(@(@(@hQ@P@XQ@@@`@p@xQ@@A(>\?@??У?@Q@?У?@0@@(@(@@@@??@A AZ{AAAAb{A:{A4AA =A,@(@@(APAv{A^{AAA =AA =A =A =A =AAAAdAF{A @@(@(@(@@@@@@xQ@(@A,A^{>\?!G?@@@0??@@A@(A@(@??@8Q@AhA =AA =AAHA4Az{AA^{A@(A{Af{A|AATAA =AA =AAAAAAAf{A:{A8A{@@(@@@@xQ@p@(@(A{A4Ab{A|>??aG@@ @ @HQ??У@`A{A:{A&{@@@ ?@0@ALA =A =A =A =AV{A2{ALA =A =A@(@APA =AAA A~{AAAA =A =A =A =AA =A =AR{A{@(@@@(@(@(@(A{A4ALAdA =A:{??aG?@P@ @@?У?@@AV{A,@@@XQ?@Q@A8AAAAAr{A8A@A =AAP@(@A{Av{A =A =A =AA =AAAA =AA =AAAA =A =Ar{ALA:{A@A:{AHAN{AN{AN{AN{A6{AA?@?@@@hQ@XQ@0?@@A8AV{@(@(@p@(Q@Q@(A4A =AAAAALA2{Ar{AAA@@(A*{AAAA =AAv{AAxAtA =A =A =A =A =AAAA =Az{AhAdAXAF{A4A&{A{A AA{?!G?@0@HQ@ @P?У?@`@(ADA{@@@xQ?@`A Av{A =AA =AAr{A4AXA =AAAA{AA\AA =AAAz{A\Aj{ApAAA =AAAA =AXADA@A8A4A4A,A&{AA"{A(ALAh??@Q@0@8Q@HQ@XQ@@Q@(A{A.{@(A@@HQ@ @(Aj{AAAAAAPALA =AAAXA{A{A&{APAAA =A =A =A`Af{Af{An{AA =AA =A =AAtAf{ALADA>{A6{A4A<AV{Av{A =A =???@8Q@p@HQ@8Q@(@@@hQAA8A4@A8@@@(AJ{AA =AAAAj{ADAxAA =A =A(AA{A&{ALAA =AXA =AAtApApAXAPA`Ab{ATALAN{ATAf{ATA\Ab{AA =AAA =A =?У@8Q@@@@P@HQ@@0@A{A|A,A A"{@hQ@HQAAhAA =A =AA =AZ{AJ{AAAAv{A0A A{A8AR{Ar{AAA =A =Az{Ar{AdAF{ADA.{A0A(A8AJ{APAlA =AAA =A =A =A,@?@hQ@@(@@@0@@@hQ@ADA =A@@@HQ@ALAxAv{A =AA =Av{ALAb{AA =AAV{A,AA,AV{AZ{ATA:{A`Aj{A`ALAB{AHA8ADA6{A6{AJ{AV{A^{Ab{Aj{A^{ALA6{A@(@@@0@@A$A{@hQ@@(@@(@AAtA {@@@(@(AZ{AZ{AlA =AAAhA^{Ar{A =AA =AXA,A6{A`AhAlAV{AN{A8A:{A,AA AA{A AAA A {A{@(@@(@@(@@AD?@(@(A6{A {@xQ@Q@Q@(@(@(A{AAXA@(@@AAJ{APA~{A =AA =AdAJ{A =A =AAA =AHA8A\A =AHAj{A =A =AA{@@@(@@@(@(@(@@P@xQ@(@AAj{A =B ?@Q@(A.{AZ{@(@@?@HQ@(@@A"{AxA6{@(A@(@(AADA\AA =A =AAF{AhAA =AA =AA^{A8A8AtAA =A =A =AAA{A{@@@@@(@@A{AJ{A =BB#BBB?@hQA {Ad@@Q@ @ @A{A@A{AhA*{AA{@@A{AHAb{AAAAAHAAAA =A =Aj{AtApA =A =AA =AAA =Ar{Aj{AAlAA =A =AA =B B6BzBBBOA?!G@Q@(AA^{@xQ@@ @A {A$A@(@(AA&{@(@@@A(A@AV{AAAAAHA =A =A =AAAAAxAA =Af{A =AAA =AA =A =ABBBB$BYBeB\BAAZ{A4?@(Q@A8A4@hQ@(Q@hQ@(AA&{A2{@(A{APA0A {@(@(@A A4A^{AA =AAA`AA =BAAA =A =Av{AtA\Af{A =A =A =AA =A =A =AAA =A =AAAPA4A*{A0AD>?aG@Q@P@ADA @ @8Q@`@@(A{AAAALALA@@AA A0AdAAA =A =A\AA =BAA =A =A =An{AAv{ATAf{A~{AA =A =AAApAB{A2{AA{A{A A&{A4AP??@Q@p@(AD@(?У@@AA{A6{A{AAAA{A{@(@(A{A$A@A^{A =AA =A =A^{AtAA =AAAAAA =A =Ar{AhAAAAf{AV{ADAAA A{A{AA,A@AF{>>\?@@@0@xQ@@@?У@0@AA,A@A@(AA{A{@A{A{AA*{A@Af{AA =AA =Af{A^{AA =BBAAA =A =AA =A =A =AAAAApAdAZ{A8AN{AXAR{AR{Af{>\?!G>\?@Q@ @@(@@0@ @@(AA&{A2{@@A@@@AA6{A{AAF{Aj{ApAv{Az{Az{A\ADAhA =A =A =AA =AA =A =AAA =A =AAAA =A =AAA~{AA =A =>\?!G?!G>\>\?@Q@XQ@@@@ @@@@AA{A{@@@@(@@(A{A&{A{A{AHAtAxAb{AdA`A`ADALAhA =A =A =ABBBAA =A =A =AA =AA =A =A =A =A =AA =??!G??@?@XQ@@@p@@(@@(Q@xQ@@(AA8A@@hQ@xQ@(@@A{A{A6{Aj{AxAtAZ{AR{AV{APALADAV{Az{A =AAABA =AAAAA =AAA =AAA =AA>??!G>\?aG??@Q@`@(@ @Q@ @@(AA*{AhAH@@Q@(Q@`@@A{A*{A@AHAb{Af{Ab{ATAB{ADAF{A@AHAZ{Av{A =AA =A =A =AAA =AAAAAAA =A =A =>\???!G>\??aG?@@@@@@HQ@XQ@xQ@(A{A6{A^{AA@(@HQ?@8Q@@(AA$A&{A,A:{AN{A^{A`ALA>{A4A0A0A8AR{An{AAAA =A =A =AA =AA =A =AA =AA =>\?!G?@????У?@@0@(@@p@(@A0AHApA =AA4@(@ @Q@@A{AAAA"{A4A\Af{AV{AHAB{A4A>{A8A8AJ{ApA =AAA =B B B BAAABB?!G?!G?!G>\>\?!G??У??@@`@(@(@(@(A$ATAF{A =A =AA {@(@HQ@xQ@@A{A@{A A$A>{ALA{AR{ADAB{A{ALA =A{AA,AK =AdAxAAzAAzAAdAc =Ao =>\?@?@>\?!G????@@@@(@(@@A(A<AJ{AAA@(@(@(@(@A@@(@(A{A A4ALAV{APAN{ALAA {AA{A6{A2{A8ADAPAC =A0A,A&{A{A>>\?!G?>\>\>\??!G?@?aG?@Q@XQ@@@(@(@A{A =AAAAAb{@@@(@(AA@(A{AA{A{A*{A6{ADAF{AN{AAA@(@(@A =AAAA{AA {A>\>\?!G>\>\>\???!G?aG?@Q@8Q@`@(@(@(@A{AAA =AxAAA\@(@(@A{AA {A{A{A{AAA{A{A{@(@(@(@@(@{@(@{@(@{@(@(A =A>\??>\>\>\?!G???У@Q@(@(@(@(@(A0A =A =AAA =AAApA$AA{A{AA AAAA A {A {A {@@@(@{@@(@@(A {@AXA{A>\>\>\>\???aG??@XQ@@(@(@(AAR{A =A =ABAAAAAA\A*{AAA {AAA(A.{A&{A"{@@@(@@{@(@(@AAA {A\A{>>\>\>\>\?@?@(Q@P@xQ@(@(@(@A{AlABBBBABA =A =AV{AA{AAA0ADAJ{A6{@@@@@{@{@{@(@{A@{@@>>\???У@ @P@xQ@(@(@(@@(AAv{AABBB AAA =A{A{AA A6{AHAPAL@(@(@{@{@(@@@(@@@{@{@>>\???@@HQ@@hQ@8Q@P@@(@AAB{A~{AABB'B*BAAA~{A^{APAN{AL@(@@@@@@{@@@@@A =>\>\???@Q@HQ@8Q@@0@p@@(@(@(A AV{AtAA =A =A =AAA =A =A =An{A`A =A@@{@(@(A =AA =@A@{@(>>\>??У@@(Q@ @0@XQ@@(@(@(A{APAAA =BBA =A =AA.{AJ{A2{A2{@{@@@@(@A{@{@@(@(@@>>\>?!G?@@ @0@@@L(@(@AA"{A.{AHAlA =A =A =B BAͅAA =Ab{A:{A*{A&{A@@{@(@(@@@@@@(>?>\?>\?aG@@@Q@3 @3 @@A{A"{AB{AHAN{Ar{AhAA =A3 =AdAN{AJ{A$A{AA{@@(@@{@(@(@@(@{@{>\?>\?!G?aG??@(Q@(@,(@(@@(A A{A*{A<A2{AB{A =A,A~{Aj{AxAZ{A:{@@{@@@(@@@@(@@@{>>\>\>\>?!G?aG?@??@@8Q@hQ@@@(A A&{A2{A&{@AA^{A|ApAf{A\A&{@(@@@xQ@p@(@{@@xQ@p@c @l(>>\?!G?@>\?@???aG??@HQ@@@(A A AA@{@A2{AB{AV{A^{APAN{@@(@(@p@HQ@@@L(@S @S @S @XQ@S >>\???>\??@??!G?@?@Q@0@p@AA@(@@{@@(A@A{A{@@{@@8Q@ @@ (@# @3 @0@<(@<(>>??@?!G??aG?aG??0??@@P@{@A@@(@@@(@@@(@@@@|(@3 @ ???Q@@ (@Q>??!G?!G???aG?@?!G?aG?Q@Q@S @(@{@A@@A<A&{A@A4@{@@(@(@{@p@3 @?Q??Q>\>>\??!G>\??!G?@?>\>G?@?Q?Q@ @\(@@@(A{AAA{APA\AX@{@@{@@(@(@HQ@??>>>>\?!G?@?>\??@?@??\)?O\)???Q@# @@@l(@(@{@{@{A =@@(@@@@(@@@c @c @<(>>\>\?@?aG?>\????\)?0?0?p?@ @\(@@@(@{@@(@@{@@@@@\(@(Q>>\>\>\>\>\?!G?aG?>\?>\>\>\?\)?Q@0@8Q@S @P@P@\(@`@@@ @<(@3 @ ?Ǯ??Ǯ>>\>>>\??aG?!G>\>\?aG??Q?Q??Q?Ǯ?????Q?O\)?aG?aG>>>>\>>>\?>\>\?!G?!G????0?O\)?O\)?!G?O\)?O\)?O\)?aG>>\>>\>\>\>\>G?!G?O\)??O\)?!G?0>\>\>\>\??!G?@?>>\??!G??!G?>\?@?aG?@?!G?aG??@>\>\>\>\??aG??!G??>\>\??@?>?!G?@>\>\??@?@?aG??@??@?@?aG??@Q@Q@???У?@?У?@@0@@`@XQ@XQ@@xQ@(@ @8Q@(Q@(Q@Q@@@Q@@@@Q@@??У?У?У?У?У?!G?aG???@@@???????@hQ@XQ@p@P@p@hQ@@@p@xQ@XQ@0@Q@ @@??@ @(Q@ @@Q@??????@?aG?aG?????@?????@Q@XQ@ @p@@`@(@@(@(@`@hQ@8Q@ @@@@@Q@Q@Q@@@8Q@ @ @Q@Q@@Q@Q@?!G?!G?!G???@????!G?@??@P@8Q@P@@@@@(@(@@P@8Q@(Q@?@@@@0@0@ @P@@@@@(Q@0@(Q@ @(Q@Q??!G?@??У@0@@(@@(@@@@@P@0@ @Q??@@@@Q@ @ @P@HQ@@@0@ @0@0@0@8Q>\??@(Q@@hQ@hQ@@xQ@P@HQ@@@Q@Q???@@@@@@Q@Q@@8Q@(Q@Q@ @0@P@`?!G?@@Q@8Q?@@@(Q@@ @Q?@@Q@??????@Q@Q@@@Q@Q@8Q@XQ@`>\??@?????????@@@Q@0@ @@@@??У???У?@Q@Q@0@HQ@P>\??@????????@@Q@@??????У??@ @ @0@@@P??@?@?!G?!G?@????????У???У?У??@@Q@Q@(Q@HQ@`>\?!G?@?@?@?@?aG?????????У??????@@Q@@P@hQ??!G?@?@?aG?aG??????????У?@Q@Q@Q????У?@Q@Q@XQ>\?@?aG??????????У??У??@@@ @Q@??????@@@?!G???????????У?У?@@Q@(Q@(Q@0@(Q@8Q@8Q@@@ @Q@?У???@??aG?????У?@@@???@@Q@(Q@0@HQ@HQ@`@p@(@(@(@p@@@ @Q????>\?!G????У?@@@Q@8Q@(Q@@@Q@@Q@0@0@8Q@HQ@`@xQ@@@(@@(@hQ@@@ @@@???aG????@Q@(Q@HQ@XQ@hQ@HQ@Q@@ @0@8Q@HQ@XQ@xQ@@(@(@(@(@@(@(@(@@hQ@@@0@Q@@?@???У??@(Q@@@p@@p@HQ@@@HQ@8Q@HQ@`@hQ@hQ@hQ@xQ@(@(@(@(@A{A {A{A{@@@@(@XQ@@@(Q?@???@@@HQ@@(@(@@hQ@@@`@XQ@@@@@@@HQ@hQ@(@@(@(@@A"{A8A(A(A{A{A@(@(@@XQ??aG??@Q@@(Q@p@@(@@@(@@@@(@xQ@@xQ@xQ@@p@hQ@xQ@@@(@A{A A,A*{A$A AA @(@(@?!G?aG?@Q@@Q@ @`@(@@(@@(@(@(@@(@(@(@@@(@@(@(@(@(@(@@(A{A AA$AA@@@@(@?aG?У?@@@0@`@(@@@@A@(@(@(@(@(@@@A{@(@A{A{@(AA {A A{A$A6{A$A{A{AA AA A??@@ @(Q@XQ@@@AAAAA@(@(AA{A {AA A,A"{A{A{A{AAA{AA A$A:{AHA@A8A&{A$A&{A A{A{?@?@(Q@`@p@@(@A{ALAHALADAF{A4AB{ALA6{AB{AR{AZ{Aj{Ab{AV{A2{A4A@A8A,A.{A&{A,A6{A<AJ{ALAB{A>{A*{A(A.{A0A.{?@(Q@xQ@(@@@A*{ApA =AAAAAj{A`AlA =AAAAAA =ATA*{A,A"{A AAA{AA{A{A,A@ALA6{A4A:{A<A<@@p@(@(@(AA<A =AA =A =A =AAAA =AAAAA =A =AAA<@(A{A@(@(@(@(@(@(@@A{A8AR{AHAV{APAH?@8Q@@@A AB{A =AAAAAAAAAA =AA =A =AA =A =AA:{A @(@@@@p@XQ@@@P@(@(@(@(A$A2{AR{A^{Ah?@?@@(@(A AN{AAAA =A =AA =A =A =A =AABAA =AA =A =A =AF{A*{A@@(@@(@`@ @@Q@8Q@(@(@A A@AR{Af{?@?@P@(@(AA,AA =AA =A =AA =AAAAAAABB BA =A =An{Ab{ATA>{A>{A2{A.{A@@P@?@@0@(@(@AADAZ{?@8Q@P@(@A Az{AAA =AAA =A =AA =A =ABA =BBBAA =AA =AAA~{A`AXAdA.{@(@@0@(Q@@Q@0@@(@A{AP@Q@P@xQ@(A{A`A =A =AAAAAA =A =AAAABB*BA =AAA =A =AAA~{AN{A<A:{A @@(@P@`@XQ@0@ @hQ@@@(A.{?@@ @`@(@A"{AA =AAAz{A =A =A =AA =A =AB BB0BAAAA =AA =AA =Ar{AHA A&{A{@(@@`@XQ@hQ@p@`@0@P@(@A???@P@@@(A`AA =AAXAA =AA =A =AA =BB B)B A =AABB+BB A =A =AA =AtA*{A@(@(@hQ@HQ@P@xQ@@@@HQ@(A{@???!G??@Q@p@(@(A{AAA =AXATA =A =A =A =A =A =BB4B9BAABBB BBBA =A =A =AA =AA0@@0@Q@(Q@P@P@(@p@`@AA,?????!G?!G??@(Q@xQ@@(A*{AAAA,A`AAAAA =AB/B9B AAA =B A =BB%B!BA =AA =AAAAd@@P@@(Q@P@@@`@(@`@@(A{>\????!G?@?!G??@HQ@@@AJ{AAAN{A{AlAAA =A =A =B B'B A =AA =AABB6B>BA =AAAADAA{A{A{@@8Q@0@0@0@HQ@p@`@xQ@A?!G?@?!G?!G?@?!G>\@Q@p@@(@(AXAAlA$A"{AxAAAAABBA =Av{A =A =AB BHBVB8B)B3B>B%AAAPA(@(@@(@@@@(Q@ @ @XQ@p@(@@>\?!G?@?!G?@??!G>\?@8Q@xQ@@(AAb{Aj{AN{A A.{Ar{A =AA =AB BAAATA =ABBOB~BwB{BBBxB*AA =AALA@(@@@ ??У@@Q@0@XQ@xQ@@??@??aG?aG?@?@>\?@HQ@@(@A4Ar{A8A*{@(A0Aj{AA =AAA =AA =AB{Ab{AA =B<BBBBBBBA =Ab{AdA<A{@(@@`@Q@??@@Q@0@P@p@??aG????aG?@>\@Q@P@@(@(ADAHA A {@(A4AAA =AA =AAxAPAAN{ABBjBBBB߀BBBBBAA2{@(@@ @ @P@hQ@`@(Q?У?У??@@Q@0@@@(>\?@?????@??@ @XQ@(@AAHA@(@@A<A =A =A =AAAv{ADA&{A{Ab{A =B=BBBBBB.AA{@`?У?У@(Q@0??????@ @ @?!G?@????aG?!G?!G?@(Q@XQ@@(AA0A{@@@AB{AA =A =A =AhA@A,AAA =BBfBBC!GC@BA =A@0??aG?@?aG?aG????У@Q@Q@??@???aG?aG?aG?@?@0@XQ@@A A@@@@A"{A~{A =AAb{A0A*{AAAA =B BBBBBC!GB~A@0??????У?@xQ?!G?@????aG?aG?!G?@Q@XQ@(@A&{A{@@@(@(AAXA|AV{A&{A A{A{AA2{AB+BBBBBBVAT???????@hQ??!G?aG?aG???@??@(Q@`@(@(A6{A@@@@A {A8ATA:{@(@A {AA {A6{AB4BBBɀCGBـBB@A{?aG?aG?aG??@XQ?!G?@?@???@????У@(Q@`@A A*{@@(@(@(@A{A(A*{A{@(@(A{A{A{ADABHBBBCBBuB=Ah??aG??@P>\?!G?aG????@?!G?!G?aG?@?@0@`@AA@@@(@(@@(A{A{A {@@A {AA{AJ{ABRBBCBB B'A =@8Q?@`>??????aG?@?@?!G@@8Q@p@(A.{A{@@(@p@xQ@@(A{A@(@@A A$AAF{A =BCBBBCGBA =A =A@?@?aG?@??!G??У???aG?aG?aG?@?@@Q@0@A{A>{A@@hQ@8Q@P@@@@(@@@@A{A{A8A =B;BvBBBBBA =A$A"{@??aG@@(??@?????aG?@?@?@?@@Q@8Q@AAJ{A@@`@(Q@0@hQ@(@(@(@(A@(@A{AA.{A =BBLByBBB@@@@?@XQ@(???@Q@??aG?@?@?!G?aG@Q@HQ@(AA6{A@@@@@0@P@(@@(@(@(@@@A {A0A =B BDBRBXBMBAn{@`@??@ @@>?!G??@Q@???!G?@?@@@`@A{A(A @@(@P@@@HQ@(@@@@@(@(@@(A&{A~{A =BBBB6B$AAAD@ ?@`@A{?@?У??@@@??!G?!G?aG?@@Q@XQ@(A"{A.{A{@@@P@@@@@(@@@A {@(@(@@A{AAAB AABAAR{A{@hQ?@8Q@(@A{?@?@ ?@HQ@??@?!G??aG@@P@A$A@A{@(@@P@HQ@HQ@(@@@A A@(@(@AA@A =AA =A =An{AAAAN{A{@(@Q??@ @p@@(A{?aG?У@Q?@0@???aG???@?@XQ@(A AB{A A@(@xQ@XQ@P@p@(@@A {A{A@@(@(A{ApA =AA =AA {AJ{AZ{APA*{A{@(@(@ ????aG?@Q@P@@@A{?!G?@8Q@@ @Q@Q??aG???@@@(A,A8A&{A {@(@(@p@`@xQ@@(@A A(A@AAAA8A =AAApA{@(@@(@@(@(@(@(@(@?У?@?@@8Q@@(@(AAD??@0@Q@Q@0@?У????aG?@8Q@(AA*{A(A@@@@xQ@@(@(@AA(An{@(A{AA{A$A\A =AA =A{@@(@`??У@@????@(Q@(@(@(@(A.{A =>\?@HQ@P@Q@HQ@Q@Q??@???@0@@A&{A4A{A{@@@(@@@(@(@(AA(A AAA{AAHA =AA|A:{@(@@0?@Q@p@@(@(A:{A =B->\?@@(Q@(@8Q@hQ@Q@ @?@?aG?У?aG?@@@(AA6{AR{A2{A{@@@@(@@@@AA{A:{A(A"{A{AA(APAA =AlA@(@@?@ @hQ@(@A{AZ{A =BB;>\?@?@@HQ@P@P@0@@?@?@??aG?@ @A{A>{AdAR{A,@@(@@(@@@@@(A@(AR{A>{A0A,A8A:{A^{A =AA>{@@(@P@Q@@?@ @`@@(@(AAv{A =BB-B1??@Q@xQ@xQ@@XQ@hQ@?@?@?aG@@(AA2{ApAlALA@(@(@(@(@(@@@(AA&{AZ{AhADADAR{AtA =AA =AA`A,@(@@(@xQ@p@Q@@@@(@(@A{A AB{A =B BBB ?@?@@@(@XQ@@??!G?У@A{A0AlAz{AhA0A{@@@@(@(@@@AAF{A\APADA\AAAADAA =AAxA<A@(@@@(@@@(AA4AZ{A|ABBAA?!G?@(@(@@p@@@hQ?!G?@@@ADAtA|Ar{AN{AA {@(@@@(@@(@A{A*{AHAB{APAHAdAXA~{ADA{AAA =AA =AdAB{A:{A"{A$A,A4AF{A`An{Av{A =A =AA =A>\?@@@(@(@@`@@?У?!G??@ @(A:{A =A|Aj{AV{A<A{AA{A{@@(@A{A{A{A8AJ{ADA2{A>{A\AZ{A"{A.{A =AAA =AAlAZ{AN{A@AJ{APALADAPAhAAAA =Aj{A`?@ @AA{@@@@?aG?@AAz{AAhAZ{A@A,AAAA"{@@A{A,A.{A<AHAF{AB{A:{AXA(A2{AZ{AAA =AAA =AAA =ATAhA^{Af{AtAxAR{ADA@ADA^{An{?@?@A{AN{@(@xQ@@@P?aG?У@p@(A6{A =A =A^{ADA4A$A A{A>{A2{@@A{A(A2{A<A@APAHALA8A A&{AB{ApAz{AA =A =Av{Az{Aj{ATA\A<A@A&{A{A{A"{A4A6{AF{Ap??@0@(Af{Al@(@@@(?@?!G?@P@A"{AA =AlA>{AF{A:{A.{AA.{AtA&{@@A {AAR{ATA:{AB{APA{AF{A8A0A A(A$A"{A.{A{AA {@(@@A{AA"{A.{A2{A@ApAhAV{?@Q@AV{AAL@@(@@Q??@@(@(Aj{A =AAZ{A^{AXAB{A@A4AXAlA @@(AA$ADAHAF{A<A:{AN{ApAAj{AXA0A{A{@@(@(@@(A{A"{A6{AF{Aj{A =A =A =A`A =?!G?@P@Av{A =A@(A@(?!G?@?@`@A.{A =AAAtAAlA`Aj{AV{AA^{A2{A @@(A A`AhAZ{A^{AR{A\AAAA|ApAXAHA>{A(A&{A4AtA =A =A =A =AtA`AAA?!G?@Q@(A,A =A =A$AAF{?У?@@(AA`AAA =AAA~{AAA~{A =A~{AJ{A{A{AAB{A =AA\A`AR{Af{Az{Ar{AlAB{AXApATA>{AB{AHAb{AxAn{ATAXAdA =ABBF??@8Q@A&{BA@(@(@HQ?@?@8Q@(A4AA =A =AA =A =A =AA =AA =Af{AR{Af{AR{An{AAA =AAA:{A4A.{A,A A*{A.{A6{AA"{AAA<A\AAA =BBBBIB:??@(Q@p@A:{BAn{@(@???@@`@A<A =A =A =A =AA =AA =AAA|AJ{Av{AA =AAA =A =AA =AhAZ{AJ{A@@(@A$AAhAA =A =ABBB&B.BB??У@Q@8Q@hQ@pA =A =A8@(@0??!G?@Q@(A{A@A =A =A =A =AAA =AAAA =A^{AZ{ApAA =A =B4B&AAA|A =AApAn{AdA =A =A =AAB BBBB%BAA =>??@(Q@@@HQ@xQA =A =@(@(@??aG@@hQ@(A{A2{AA =A =A =AA =AAA =A =A =A =AR{AtA =AABBBBBDBB.BB9B B(B'B7B:BHBBBB*AAA =A =?@?У?@ @P@`@(AAp@(@@??@??@P@@(AAB{A =AAA =A =A =AAAA =A =AA~{AA =AA =AA =B BB"B'BCBEBCBTBBB9B-BA =A =A =A =AAA =?aG?У?У@(Q@XQ@p@(A<A2{@@(Q??@>?@@@hQ@@A{AXA =A =A =AAAA =AA =AAAAAlAF{A6{AR{AZ{An{A =AAA =A =BBA =AAAA =A =A =AAAA>\>\?@???@0@hQ@p@HQ@(A{@(@ ??>?aG?@@(AA(AA =A =A =A =AAA =A =A =B A =AAAxA>{A$A&{A(AdAAAA =A =A =AA~{AZ{Ar{AA =AA =A =AA =>\>\??@??@@@@XQ@8Q@ @(A,@(@HQ@8Q???@?@hQ@(A*{AN{A =A =AAA =AA =A =A =AA =AA =AAtAV{A8A ADAR{A^{Aj{AtAhAJ{AF{A,@A{AA^{AJ{A^{A =A =A =>\>\>??aG???@ @XQ@(@`@P@(A8@@xQ@XQ?@?@??@@A{AZ{AAA =A =AA =AAA =A =A =A =AA =AR{A0A(A{AB{A8A.{A(A"{@@@(@(@(@A A(AN{Av{AxAf{>\>\>??!G?@????@@@@(@(@p@A$@(@@hQ@Q??@@@xQ@(A{AtA =AAAAA~{Af{ALA$A.{Af{AA =AA4A{A{@(A@(@(@@(@0@0@@@@(A{A{A{AAA{>\>\>>??@?!G?@???@@@(Q@P@`@`@XQ@(@(@@@`?@Q@p@@(AAlA =AAAAAhA*{AAA{AA"{AHA<A{A{@(@@@hQ@8Q@ @ @@@hQ@(@@@(@(@(A{A>>>?@?@?aG?????У?@Q@@@(Q@(Q@P@(@(@@@?У@Q@xQ@(AA6{AdAn{A =AAA =ADA{AA{AAAA"{A$A&{A{A{@(@@@(@(@(@P@(@(@@@AA(A:{>>>?!G???@??@Q@Q@@Q@ @0@Q@ @HQ@p@@(Q@hQ@(??@`@A{AXAXAXAZ{AlApADA(A@(@(@@(A {AA A{AAA{@@@(@(@(@@@(@(A A$A8A>{>>>>?aG????@Q@Q@@(Q@0@@@@@0@0@p@p@@@???У@`@(AAV{ATAB{A:{AN{A4A(A*{A A {@@@@(A{A AA{AA@@@@@(@(AA {AA&{A4A2{>>>>>?????У@@hQ@P@`@P@@@HQ@hQ@HQ@p@(@@P??!G?!G?У@0@(@(A2{AZ{AB{A*{A @A A*{A @(@{@A@(@{@@@@{@@@@(@{@{@{@(@(@(@{@>>>>?@?У@@ @Q@ @@p@@@hQ@XQ@p@(@(@(@p@(@@`@0??@Q@(@AA8ADA"{A@@AA@(@@(@@(@@{@(@@@(@{@@@{@(@{@@{@@{>>>>??@0@HQ@P@ @@@`@@@P@@(@@@@@(@(@xQ@8Q?У???У@0@(@A$A,A{A@A@(@(@@@@@(@@@{@(@@@@(@{@@{@{@{@{@??@0@XQ@XQ@Q@@@@P@@(@(@@@(@@@(@hQ@`@ ??aG?@Q@p@@(A {A{A{A{A{@(@(@(@@@@@@{@(@(@@@{@{@@@{@(@@{?aG?@@@XQ@@@Q@@@@@@@(@@(@AA@(@(@p@???@Q@XQ@(@@(A{AA(A$A"{AA@(@(@(A@@@@@@(@@(@@(@@(@(?@@HQ@`@HQ@(Q@Q@Q@(Q@8Q@P@AA@@A {A{A{@(@8Q??У@@(Q@`@(@(@@AA*{A8A6{A(A$A&{A(A2{@@@{A =A{@(@{@@(@{@{A$@{?!G?@@@@xQ@p@`@ @Q@@Q@hQ@(A{A{AA AA&{A@(@@ @ @0@@@xQ@(@(@(@@AA{A{A,A6{A:{A:{@@@@{@@(@@@@@@(@??aG??@ @xQ@(@P@8Q@Q@@8Q@(@(@AADAF{A$A {A A@(@(A @@(@@(@@@(@(@(AAA"{A*{A*{@@@@@(@@@@{@@@@{?!G????@@@@0@0@XQ@P@hQ@@@AA A8A\AAtADA*{A{A {A A"{A*{@(@@(@@A{A AAA@{@@@@(@@@@AA{A =A??@?aG??@?aG?@@`@@@@(@(@@xQ@(@(@(A&{AA =AA =A =A`AA@@@(@@(@A{A{A@(@(@(@@@@{@{@(@@(@AA{?!G??aG????@@@p@@(@@@(@(@@8Q@# @S @@(@A&{A`A =AAA =APA{@(@(@@@@(@(@{@@@{@{@{@{@@@{@A =A{???aG??aG@@xQ@@(@(@@(@@xQ@l(@`@,(@@@HQ@xQ@@@@AA$@@@@@(@(@@(@@@(@@(@@@{@@(@@(A??@?aG??aG?aG@Q@p@@(@(@@{A@{@{@@@(Q@ @@@Q@xQ@@A{AA{A{@@(AA{A@(@@@{@{@(@@{@A@(@@(?????aG?@@ @HQ@xQ@A{A{A.{A,A@(@XQ@(@ ?Q@@Q@@@@@@(@@(@(A{A@@(@{@@(@@{@@(@@@@(?????@ @Q?@XQ@@(AB{AtA|A{@@@{@@(@@@@(@(@{@A{@(@@@@@p@p@p@|(@{@@(@{@|(@@?@?@@Q@Q@P@@A.{A`AAA0AB{A@A"{A{A{A(A@(@AAV{AN{A(A*{A{@{@@xQ@\(@P@HQ@C @L(@HQ@L(@`@`?!G???@(Q@(@A{APA|A =ADAF{ADA@(A{A0AF{A =A*{A =A6{AhAb{AxAf{AJ{@@(@(@`@S @@@<(@<(@@@C @@@<(??@?aG?aG?@Q@`@@(AAV{AAA =AAAzA =Aw =A =AZ{A @{AA$A$AV{AL@(@@@@c @@@@@@@HQ@HQ@P@XQ@`??@??У@(Q@@@@A(A =A =A =AA =A =AA =AAZ{AA.{@AA@@(@@{@{@`@HQ@3 @@@L(@P@\(@p@(??!G??@ @8Q@xQ@(@AA6{A6{A>{AF{AHAC =A@ATA8A&{AA6{@(@@(@(@(@(@@@\(@@@(Q@0@,(@@@XQ@s ?!G???@Q@0@XQ@@(@AA{AA =AA$A2{A$A# =A{A{@@{@(A{@@@@xQ@L(@XQ@0@(Q@# @(Q@8Q????@@ @8Q@xQ@@A {@(@AA@(AA{A A =A$A"{@@@{@(@@@{@`@<(@# @ @(?@?aG???У?@Q@(@C @s @{@@(@@(@(@@A{@(@@{@@@@{@{@@@hQ@S @3 @# ?@?aG?p??У?Q@@@`@p@C @@(@(@(@@@{@@(@@(@L(@(@(@# @(Q@# @?Q@# ?aG??@@Q@@HQ@(@(Q@<(@8Q@L(@L(@S @hQ@L(@(Q@(?Q?Q??Q???Q@Q@(Q>>\>?@???@Q???Q???У@?Q@Q@ @Q@ (??Ǯ?Ǯ???У???>\>\>?@?@?@?aG??????Q?Q?Q?Q@@ (@Q@ ??Q@Q?@ ?Q?Q>\>\>B\?O\)????Q??@Q@HQ@(@(@@{@@@0@\(@P@HQ?0?aG?aG???@ @|(@(@(@{@|(@@S @|(@{@(?0?0?aG?p??Q?@(@,(@3 @(@C @3 @,(@HQ@Q>>?\)??0?@?@?@?@?O\)?p?p?p?Q??O\)?p?@>\?\)?aG?p?@?@?!G?O\)?aG?@?\)?\)?@?!G?\)?\)?\)?\)??aG????У?У@Q@(Q@(Q?У??!G???>\?!G?@??????@Q@@Q@@Q??У?????????@Q@Q@@????У?У??!G?!G?????@@@Q???@???@?@@Q@Q@(Q@0@8Q@Q?????????????У@@@Q@@Q@Q@@??>\?!G?aG?aG??aG??@?????!G?!G?!G?aG?@@ @ @@@????У?????????У?У??@Q@@@@@Q??!G?@?@??aG?aG??@@??????????@Q?@@Q@@@???У??????????У?У?@Q@Q@@Q@Q?@?@?@?@?@??@?????@??!G?aG???????@Q@Q????????????????У@?@Q@(Q??@??aG?@??aG?aG????!G>\??!G?@?aG???У@@Q??У????????????????@Q@(Q>\>\?!G?!G?@?@???aG?aG?aG?@?????!G?aG???У??????????????aG????У?@?>\?@?>\??!G?!G??!G?!G>\??@?aG?aG?????????????aG?aG???У????>\???!G?!G?>\>>\??@?????У?????????????>\?!G>\?>>\??@????????????????У?>\?>\>>\??@?????????У???????@>>\?>>\>\?!G?@?aG??????????У??У??????У>\>\>\>\>\?!G?@?aG???????У?У??????У?У??????>\>\??!G?@?aG?aG??????У?@@Q@@Q@Q@Q@Q@Q@@?????>\??!G?@?aG?aG???????@Q@Q@ @(Q@0@8Q@0@ @Q@@@@Q@Q???>\?!G?aG?@?aG?aG?????????@Q@0@XQ@`@p@hQ@p@`@HQ@0@ @ @Q@ @0@ @Q?!G?@?aG???????????У?@@ @@@`@@(@@(@(@(@hQ@XQ@XQ@@@8Q@0@(Q@8Q?????????????У??@@Q@@@P@xQ@(@(@(@@@(@@@@@p@HQ@0@Q?@??????У???У??????@Q@@(Q@(Q@0@8Q@xQ@@@A{A@(@@(@(@@`@8Q>??aG???У?У????@@Q@(Q@8Q@0@ @Q@Q@Q@Q@ @(Q@(Q@ @8Q@p@(@@AAA@(@@(@(@(?!G???У?У?@@Q@@(Q@0@P@XQ@p@p@P@@@P@HQ@XQ@XQ@hQ@XQ@XQ@HQ@@@P@hQ@@(@(@(@@(@(@@(@?@???@?@@ @@@P@@@(@p@@@xQ@XQ@hQ@p@P@HQ@p@xQ@@@@@(@(@@(@(@(@(@@@@?@??@@ @Q@@@@@(@A@@(@@@(@@(@(@@(@(@xQ@xQ@@(@@@(@@(@(A{@@(@@@@(?@?@ @0@P@`@hQ@@@A*{AHAF{A<A0A&{A2{A6{A8AB{A*{A@@(@@@@(@@(@A {AAA{AAA{@@(@?@@8Q@hQ@@@(@@(A$A|AAAr{APAdA =AA =A =AAAj{AB{A$A{A A{A@@@AA2{A8A:{A<A{A{@@@?@0@xQ@(@(@(@(A{A<AA =A =AAj{An{A =A =A =A =AA =AAA@AA*{A2{A{AA A{@@A,Ab{AtAdA\A2{A@@(?@ @(@(@@(@(A{AV{ABA =AAZ{Ab{An{A =AA =A =A =AA =AAj{AHAb{Af{AB{A.{A{A@@A{APAAA =A\AdA"{A?aG@p@(@@(AA{AAtA =A =AA =APAxAA =AAA =A =A =AAAAAAA =A =AAlA*{@@@AApA =AAr{Av{AA<?@?@(@(@AA2{A<AhAA =A =A =A^{A =AAA =AA =AAAA =AB BBB A =AA =AAj{A{@(@(@(@AtA =AxAAA =?@0@@(AA(A>{AR{AA =AAA =AAA =AA =ABBBB)BQBUBAB'BBA =AA =AA =AB{@@@(@(@(AAAlAA =?@?@0@hQ@(A{A,APAPA6{AA =AAAAAAAA =BB(B:BkBBgBBB'B)BBB BA =A =AA`A8A&{A {@@A:{AdAA =A =?@?@Q@hQ@@(A{AHADA$AAAAA =A =AA =ABBB+BMBxBBB]B&BBB!BA =AA =AAAA`AV{Ab{A.{AA A A&{AA =A =??@XQ@@A {A,A.{A&{A>{A =A =AA =A =AAA =B B&B!B+BQB[BBB BBAA =AA =A =AA =AAb{A8AHA^{ADA8A(A.{A =A =A =??@@@(@(@AAB{A A{ATAA =A =AA =AA =B B<BBBB+AA =ABAA =A =A =AA =AAA =A~{A{A{A:{AZ{AhADAJ{AB{AhAB ?aG?@@(@(@@A{A{A A AA =A =A =A =A =ABB0B(A =A =AA =A =AA =AABA =AAA =Af{A,A*{AF{A @(A:{Av{Av{AV{AZ{A:{Af{A =B??@XQ@AA{A{@@AADA =AAAAA =A =BBAAxAA =AA =AB B>BuBBBBBBHAA =A<A @A{@AATAhAV{AF{ADAPAB>??У@@@(AAN{A&{A{@@A {AlAA =AAA =A =A =BA =AHADAhA =A =A =BB~BBBBBBBBBBcBAA @@(@(AA(APA8A.{ALAPAB >\?!G?@(Q@(@(AR{A`A4@(@@A0AA =AAAAAA =A =A{A{A&{AtA =A =B BBBC#CaGBBB0AABB.BAN{@@@@(A{A(A:{AA&{A>{AB ???aG?@XQ@A{AXAB{A@@(@AR{A =A =AAA =A =AAAT@@A>{A =A =B-BBCC@CGBAA {@@P@Af{A =Ax@@(@@(@AA A{A{A&{A =B$???@Q@xQ@(A{A8@(A {@(@@A`A|A =A =AA =AA~{AN{@(@(@(Ab{ABBBC aGBBBA@xQ??aG@hQ@A{@(@(@@(@@A@@A{AxB????aG?У@HQ@@A{A2{A@(@@AA^{AA =A =A =AA>{A*{A{@@A{AABqBBB݀BA =@`?У?У?@XQ@@(@@@@@(@@(@(@Ar{B???@@hQ@(@(A{A,A@@@AA^{A =AxAAAV{A{@@(@@A.{AB,BBBɀBBB:@(????@0@HQ@`@p@(@(@@@@@(A\B???>\?@Q@@(A {A A:{A*{@(@(@@(APA~{An{AA =A.{A@@@(@Af{BBBBBBBBKA@P?@???@(Q@8Q@`@@@@(@@@Ar{B#??>\?aG?У@0@@A{A*{AJ{A0@@@@A<Aj{ALAb{A`A{@(@@(@(A{AB7BBBBB]A =A@ ?aG?aG?У@@(Q@Q@P@`@hQ@@A =B'>\>\??@???@8Q@(@AAB{AR{A4@(@@(AA@A\A6{A6{A>{A{@(@@(@(A,ABVBBӀBBAA =A$@?aG?У@@@(Q@@@8Q@(A{A =B<???!G?aG?@>\?@@P@@(A{AHAXA"{@@@A{A@AJ{A2{A$A&{@(@@(@(AA@ABBBBBBB*A{@@????@Q@0@(A"{B BA?!G?@?@??aG??@?@@`@(@AAN{AHA@(@@AA<A@A*{A"{A{@@(@(@AAlAB&BBBB=A4@?aG?aG??@@(Q@AB"B/>\?@????!G>\?@?@ @`@(@(A{AN{A<A@@@(@A A8A{A{A@@@@(A2{A =ABB'BPBB3@@Q?@??@@0@A =BB>\?!G??????@?@(Q@p@(@(A{ALA2{A@(@@@A{A.{A{A{A{@@@(AA*{ApAAAA =AA =@(?aG???@`A&{ABB?!G??У@??@???У@(Q@xQ@(@A{APA,A@(@(@(@AA*{A A{A@(@@(@A{AXAA =ADA@A{@?aG??@Q@(A =AAB3???У@@Q??!G?@@ @p@@A"{AZ{A0A{A@(@@A {A$A*{A{@(@@@(@A AB{A`AZ{A{@(@`@@@0???У@hQA(A =ABBq??aG?@Q@(Q??!G?@@(Q@(@(AA&{AHA,AA{@@AA{AA.{A @(@(@@(@(@A{AR{A2{@(@(@(Q@Q@??aG?aG?@@@(A =A =A =B*B?@?@@8Q??aG?@@8Q@@A{A(AF{A8A{@@(@AA{A$A:{A"{A@@(@@(@(@AA@@0@Q?@?У?aG?@0@A =A =A =AB6B?aG?@Q@@@(Q???@@HQ@(@AA4AJ{A4A {A{@(@@A{A&{A8A:{A{A{@@@(@(@@@(@(@@??У????aG?@0@(AJ{AAv{AAB=B?@??У@0@@????@@@@(A*{A8A@A@A{A {A@(AA{A"{A8ALA:{AA{@@(@@(AA{@(@0??У????????@Q@A{AB{A^{AABB,B>\??@Q@@@(Q?У??aG?@(Q@@A{A:{ADAR{AA {A {A AAA&{A:{AN{AR{A0AA@@A {A6{AF{A@(@Q?????????@(Q@AA{A@AABB'BA?@??@0@HQ@Q??@?@Q@@(AAJ{ATAV{A&{A{AA{A&{A{A,A4APA^{ATAA =A =A<A{AHA =Av{A*{@xQ??@?!G?!G?>\?@xQ@@@(A*{AA =BBB A =A =?@Q@0@(@XQ??@Q@XQ@@(AHAAb{A<A"{A&{A"{A(A{A"{A2{AF{A\AxAA =A =A{A"{AF{AA =AA&{@???@???@HQ@@(@(@A,AA =B BBAAA?!G?@(Q@hQ@@8Q?!G??@@@@(A:{A =AxA`AJ{A(A8A&{A{A{A0A4AV{AxAn{AAPA*{A4AHAdA =AA =A(@(@XQ????aG@ @@(@(@A:{AA =A =BA =A =AA =B>\?@0@8Q@(@(??@?@(Q@@(AAAAxAhAB{ADA4A{A{AA8A@Ar{AAA =@(AHAXApA =A =A =AAN{@@(@0@Q@ @(Q@XQ@@@AAn{Az{A =AA =A =AA =A =AA =A?@XQ@(@@??@Q@xQ@AApA =AAtAn{AN{AR{A{AA{A(A:{ADA =A =AAA =Ab{Ab{A =A =AAAAv{A"{A@@(@(@(A{A,AN{A =AA =A =A =A =A =A =A =AAAA =?@HQ@(@@?aG?@?@P@@ALAAA =AxAlAV{A4AA{AA*{A@A\AA =AA =AA =A =AAlA =AA =A =ATAf{AF{AJ{AN{APAf{Az{AAtA|A =A =AA =AA =AA =AA =@ @@(@(@ ?@ @HQ@(A,A =AAAA|Ab{AZ{A$A A{A{A8APAf{AAAAAA =A =AtAA =AA =AAA =A =A =A =A =A =AV{A`AhA~{AA =AA =AA =AAA =@8Q@(A {@xQ?!G?@(Q@pAA =A =A =A =AAtAtAF{AA A0A@A@Aj{AxA =AA =AAA =AAA =@(@(A =A =A =AA =A =AA =AA|A =ApAr{AAA =A =A =AAA?@@(@?У?@@0@(AtA =AAAA~{A~{A\A,A{AF{A^{A4An{AA =A`AA =AA =AA|A =AAAAA =A =A =A =AAAlAdAj{A|AAAAA =A =A =A =A>\>\?!G>\>\?aG@@(@p??@?@Q@hQA{AAAAA =A =Aj{AJ{A$A,AxA`AJ{AxAA =AJ{AhAtAAAAAAAA =AA =AAAA =AAAAA =A =A =A =AA =A =A =A???!G>\?@??@?aG?!G>\?!G?@(@hQ???@(Q@(ABA =AAA~{AhAb{ALA8Ab{A =A =AXAb{A =A =AXATAv{A =AAXAA =AAAA =A =AA =AAA =A =AA =A =AAA =AA =A =B??aG?!G??aG?????!G?@?!G@???@@(AA =BAA =AAb{AHAr{A\AXAv{A =A =AR{Av{A =AAf{Az{AhA =AAAAAA =A =AA =AA =A =AAAAAAA =AA =A =B2Bz?@?aG?@????@Q??@?@??!G?!G?@HQ@AlABA =AA =ApAv{AxAAtA =AA =AAhAB{A`A =A =AA =A =A =AAAhA =AAAAA =A =A =A =A =AAAAB.BIBiB]??????@@P@Q??@?!G?aG@Q@(A{AB AAA =AAA =A =AA =AA =A =A =A =An{A =A =A =AAA =AAAAAAAA =AAA =A =AAA =A =B<BZBWBBB>\?????@ @(Q@8Q??aG???aG?@@@(A`AA =A =A =A =AAAA =AAA =AAA =AAAAA|AA =AA =AAAAAA =A =A =A =A =A =BBB#BDB(BAA =?!G?@Q??@@0@HQ@@??@?!G?aG?@@A{AA =A =Av{ApAAz{AABBAAA =A =A =BBA =AA =A =AAf{AAAA =A =AA =AA =BB6B:B)B&A =AAA =A???@?@Q@(Q@`@P@0?У???!G?@@A8AA =AAB{A`A =Az{A =AB%B*BAA =AABBBA =AAj{AHAb{AA =A =AB"B.BBBB AA =AA =A =AA =A?!G?@ @?@Q@p@p@P@ ???@??У@@@A.{A =A =A\A6{AB{AdAj{AAB<BOBMBEBB B BAAA =AAlAA =AAAAAA =AAAAA =A =AAAA =A8?@?@0@@ @P@@@`@Q?У????!G?@Q@@(A>{A =AA>{AA4AN{AV{Af{AtBBJBgBjBByBTBABBA =Av{A =A =B#BEBqBcBMBSBYBGAA =A =A =Av{ALA @?@@Q@ @HQ@p@(@xQ@XQ@8Q@@?@??aG@(Q@@A^{AAf{A(A(A6{AJ{ATA:{A =AA =BBDBBBBBBBxB'BA =BBB4BNBBfBzByBvAA =AAAb{AA@A {??@ @P@P@hQ@@@p@@@0@?У?>\?!G?@8Q@XQ@(ApAA>{A8A\ATAV{AV{AF{AtA =BB.B#B%B5B8BGBPB`B~BkBrBoBBBBBBB%BBB AALAPA =A =A =>\?aG@@P@@(@@(@(@@xQ@`@(Q@8Q?>>>?@?@ @(A.{A =AlA2{A>{Ab{An{Af{Ar{ALAz{AA =ABBA =AAAA =BAA =A =AAA =BBB*B BBAAAA =A =A??@?@ @8Q@hQ@(@(@@(@(@hQ@(Q???!G>\>>??aG?@hQ@(AV{AAB{A&{A6{AN{APAPAHA\Aj{AlA =AA =AAA =A =A =AAA =A =A =A =AA =B A =AAA =BBBB0B????@Q@`@`@@@(@@p@P@Q?aG?!G?>\>>>>?@Q@P@AHA`A6{A A0A:{A@A4AHA:{A4AlA =A =AlAn{A =AAA =A =AAAA =AA =AA =ABB5B8BAAA?aG@@Q@Q@(Q@P@`@@@(@@xQ@8Q@?aG?!G?>>>??@Q@hQ@(A6{AB{AA{AA$A@AB{AB{AJ{AN{Ar{A\A4A0ADALAf{AA =AAA =AA =AA =A =AA =BA =AA =A =Aj{?!G?@Q@0@`@P@xQ@xQ@(@@@@@0?У?aG???@?@Q@P@(A*{A{@(@(@(AA{AAAA,A.{AA$A,A8AXAz{A =A =AAAA =AA =AAA =A =AAtAPA:{A&{>\?aG?@Q@xQ@@(@p@hQ@`@@@@`@???>\??@?@@ @`@(@(A@@(@@(@@@(A{A{A@(A{A{AA:{AR{A^{ATA`A =AA\APA\AN{A4A$A&{A{A"{A$A"{???@Q@XQ@(@(@xQ@XQ@p@xQ@@@(@P@0???>\??aG?У@@0@@(@(AA{@(@@@@@@(@(@(@(@(@(AA(A<A2{A&{A"{A$AAAA{A$A{AAA{A&{A,?!G??@`@(@@(@@XQ@8Q@XQ@hQ@@(@(@xQ@??!G????@0@hQ@(@AA{A @(@(A@@(@(@@@{@@(A@@@@@(@{@@{@@@@(@@(@@(@(?@@(Q@hQ@@(@(@(@@@ @(Q@0@@@@@ ??У?У?@???@Q@XQ@(@@(A"{A2{A$AA{A&{@(@A{A A{AA{AA A@@@@{@@(@(@@(@(@@@{@(@(?@?@@@`@@@(@@@@@(Q@@@Q@0@@@(Q@@Q??@@HQ@xQ@@(@(A&{AB{A<A:{A:{A>{@(A"{AAA&{AA{AA{A @@@{@@{@(A{@@{@@{@@{@?@@P@(@(@(@(@@@@hQ@Q@@@@ @@@`@ ??@??aG@Q@p@(@@(@(@(A A.{A.{A2{A6{A$AA A {A{AA{A{A{A{@@(@@{A{@(@@(@(@@(@(@@(?@@HQ@(@(@@@(@(@(@@HQ@Q@@@Q@Q@Q?????@?@@@(@@@@AAA {A AAAAA {A{AAA*{A8AN{A =A A AA =A@(@{@@{A@@{??@Q@HQ@(@@@(@@(@@@xQ@HQ@Q@@Q??aG?aG?@Q?У??aG?@hQ@@@(@(@(@(@@(@(@@@(@@AAA{A8AJ{AXA =AA {AA{AA =@@{@@{@@s ??@ @P@@(A@@(@@(@@@(@P@(Q@Q??@?@?aG?!G?@?@?aG?@Q@p@(@@(@@(@@(@(@@(@@(@(@A {AA*{A2{@AA{A =AA{@@@@(@@s @L(?@?@0@xQ@(@(@(@(@@(@(@(@@@@@@Q?@?!G?@Q@(@@(@@@@(@@@@(@@@(A{A AA@@{@(@@{@@(@{@@{@c @L(@0??У@P@@@(@@A@(@@(@@(@(@@ ????@@P@@(@@@(@(@(@(@(@@@(A{A {A@@@@@{@@(@(@@c @L(@XQ@l(?!G@@(@A{@@@(@(A{@@(@(@@HQ@HQ@0@@Q?У?@?@(Q@hQ@@(@(@(@@@(@(@(@@(@A@@@@{@@@|(@p@hQ@XQ@|(@@l(?!G@(Q@A$A@A@(@(@(@@(@@@@`@0@ @Q?У??@?aG?У@@@(@@@@@(@@@{@@@(@hQ@\(@P@HQ@S @XQ@\(@|(@{@(@@hQ@<(?aG?@(A{ADA<A2{A(A@(@@(@(@@(@@HQ?aG?@?!G?@(Q@@@(@@@@p@l(@(@@@(@@(@@@S @hQ@(@(@@|(@`@<(@(??@Q@AAPAR{ATAR{A@A2{A@(@AAA {@@{@(@XQ???@@p@(@(@@@p@(@@(@(@@(@@c @p@p@l(@(@{@(@HQ@@@8Q?@@P@(A8A^{Ab{A2{ATAb{A@A:{A<AJ{A\AhALA =AAz{AD@@0???O\)?@??@Q@`@@@p@@@(@@@(@L(@`@xQ@p@(@(@@{@@# @Q@Q>\?@?@ @(@(A A@A@AB{Ab{A`AF{A^{Ar{AhA =AAA =AA =AV{A4A @@{@(@P@`@@@hQ@3 @P@@(@@@@(@(@@@{@@@XQ@@ @(@(Q@L(??@??У@(Q@(@(@A A,A>{AJ{Aj{A[ =Az{A =A =A =AAAAAzA =AAA|A@A<A>{A@(@@(@(@@(@(@(@hQ@p@XQ@HQ@<(@(Q@ @@ @@@?!G?aG??@@0@`@@(@(A A4A7 =A>{AV{A =A =AAAA =ApAA =A =AzAA =A =A? =A {AA {@@(@@(@@3 @(Q@(@@Q??У?Q?Q???O\)??!G?@??@@0@`@@(@(@@(AAA2{A6{AZ{A`A>{A4@(@|(@@@(@{@(A{A"{@@{AA@@(@@HQ@0@# @ (@Q??Ǯ??Q?p??p?p????@??@Q@8Q@hQ@(@(@@(@(@(@(@(AA@@(@(@P@ @<(@XQ@`@l(@@AAA =A>{A@@(@@8Q@0@ @# @ ?Q???Ǯ??>>?!G?????!G?aG??@8Q@XQ@hQ@(@@(@(@(@@(@(@(@@??Q?Q@Q@(@(@(@AA4@{@@(@@@@xQ@l(@XQ@HQ@3 @@Q?Q?@Q>>\?!G??????!G?aG?@@HQ@@(@(@(@@xQ@xQ@xQ@(@XQ@Q@??@# @@(@@(@(@@{A @@@@(@(@xQ@@`@HQ@8Q@??Ǯ???>\>\??!G?@?aG??@Q@@@0@8Q@HQ@XQ@XQ@hQ@(@p@hQ@?@8Q@hQ@l(@@{@(@@A{A {@@@{@@@(@|(@C @ ?Q??>\?>\>\?!G?@?aG??У?@Q@@(Q@8Q?@XQ@0@3 @Q??Q@ @ @0@xQ@s @{@@@@(@(@{@@@@S @<(@(Q@ ??Q>????@??У@@Q?Q@Q@@@Q@??Q@Q@Q@(@HQ@hQ@P@P@,(@,(@,(@<(@\(@hQ@xQ@XQ@0@???>\>\??>?@???@Q@Q@Q@??Q?????Q?Q?Q??У?У?Q@Q@,(@8Q@# @# @# @ @ @# @ ?>\??>>?aG???У??@Q@Q???????Q??Q??aG?Q?Q@ @ (@(@@@P@@@@@8Q???>>>?@?aG???@Q?@Q?Q??p?O\)?@?O\)?O\)?\)?!G?0?Q@ (@(@Q@# @0@(@ (@(???@?aG???Q??Q??@ @ (@3 @3 @l(@@??Ǯ?Ǯ?У???У?@ ?!G?!G??@?Q@@ (@Q@# @@@XQ@@@@(@(@@,(@ @Q@@?Q??Q?Q???!G??@?Q??Ǯ?@ (@ @ @ @ @# @Q@Q@ (?@@@ ???@?O\)?O\)?!G??!G???!G?0??Q???Q?Q?У?Q????p?@?0?O\)?@?@?\)?\)?!G?@?@?!G?!G?!G?aG?Q??Q???Q?@?0?\)?!G?aG?@?@?@?!G?!G?O\)????aG?@?\)??@?aG?aG?aG?!G??!G?0?\)?\)?!G?aG?@??!G?aG?@????@ @xQ@@@XQ@(Q???aG??aG??У??@(Q@8Q@8Q@ @Q@Q@(Q@@?У?У???????aG?aG??????@?@?@?@?@>\?@?!G?>\?@?@?@?@?aG??У@@(Q@XQ@(@@Q????aG?@Q??У@Q@8Q@P@P@HQ@0@Q@Q@@Q@Q@???????aG?@????????aG?aG?aG?@??@?>\>\>\??@??!G???У?@@0@`@ ???!G???aG???@@P@hQ@@XQ@8Q@Q@@Q@Q@Q???????aG?aG?aG?aG??????????aG>\?!G??>\?@??!G?!G?!G?@?aG???aG?!G?????!G?У???У@0@xQ@(@XQ@8Q@(Q@Q?У???У???????????????????>\??>\>\??!G?!G??!G??????!G?@>\?@Q@0@ @Q@Q@@???????????????У???У?????>\??>\??@?!G?@>\??@???????????????????????????У??У?У?>\>\?!G?!G?!G?!G>\?>\>\>\>\?!G?@?aG??У??У?У??У?У????????????@@@??>\?!G?!G?>\?>\>\>\??@?aG?aG?????????У????????@@@@@Q>?>\??!G?!G??!G>\???!G?!G?@?!G????У?@@Q@???????@@Q@Q@Q@Q>>>\?aG??!G?@?>>\>\???@?aG????@@??У?У?У?????@@@Q>\??@?aG?@?!G>\>\??!G?!G?aG????????@??У????@Q@(Q>\??aG??aG?!G>>\>\??@?aG???????@@??У?????У@ ?!G???!G?>\>??!G?@?aG??????У?У?@@ @Q@Q@Q???У?@(Q?!G>\>\??!G?!G?@?aG????У?@@Q@?@Q@Q@0@XQ@xQ@`@XQ@(Q@?????!G?!G?!G?@?aG???????У@Q@Q@0@P@@@@@P@xQ@@hQ@@(@(@@p@8Q@??!G?@?@?aG????????У?@@ @Q@ @(Q@P@(@`@XQ@XQ@hQ@p@p@@(@(@(@(@hQ??!G?aG?????У?@Q@Q@@@ @(Q@8Q@8Q@P@P@p@@(@(@p@`@0@0@8Q@8Q@8Q@hQ@@(@@(??!G?aG???У@@@@(Q@(Q@@@P@P@`@`@`@p@@@(@@@@@hQ@HQ@0@0@HQ@@@8Q@hQ@@@>\?@?@?aG???@@@8Q@P@HQ@XQ@@(@@p@xQ@(@@@@@@@(@@@@(@@P@@@0@0@P@(@(@?!G?@??aG???@@8Q@XQ@hQ@(@(@@@(@@(@(@(@@@@(@@A {AAA{@@@(@@P@0@8Q@hQ@(@????????@@0@(@(@@(@@(A A{A{@@(@@(@@@(AAAA{A{A A@(@@@XQ@@@P@p@(??@??У?У????@ @@@p@@@A AA A&{A<A,A$A0A0A{@(@@@(@@(AA A{AA{@@(@(@hQ@XQ@hQ@>?aG?У@Q@Q???У@@@@p@(@@@(@(@AAA\AAA =A =A =AdA8A{A A{@(@(@@(A{A A&{A@(@@@XQ@`@hQ?@?@@@P@@??@@P@@(@@(@A{A{AA{A2{ADA =AAAA =AA =A =A =A`A*{A AA {A AA8A>{A@@@xQ@HQ@HQ>\?@?@8Q@@(?@Q@0@xQ@@(AA{A$AA AA&{A(A@AR{A =BB<B,BAAA =AAAdATA4A&{A A{A,ALA@A{@@@hQ@@?>\??@@(@@Q@Q@`@(@AA(A@A6{A(A A{AA(AHAf{AA =BGBcBJBA =A =A =AAA =A =AAJ{A4A"{A4A>{AN{AJ{A@(@(@P>\>\??@Q@@@(@@`@@(@(AATAlA\AB{A"{A{A {A{A4Ab{AA =A =BAB8B%BAA =AA =AA =AA =A =AlAV{ALA\AdAhAR{ADA{@(??@ @XQ@(A@(@(@(@A,Af{AAhATA@(@(A{A@AA =AAABB A =AAA =A =A =AA =AA =A =AA =Av{Ar{AAALAN{AV{@??aG@ @p@@(AX@(AAA:{AlA =An{ATA$AAAAHAAAA =Az{AN{A =A =AAA =A =A =AA =A =AA =A =A =AAA =AA =A^{ALAdA@?@@@p@@A@(@AA.{A`AlAf{A`A@AAA&{AV{A =AA =A =A|A\AHA =AAAAAA =AAAA =A =AAlAA =A =A =A =A =Ab{AV{Aj{?!G?У@(Q@AA @(@A A4APAR{Aj{AXA`A,A {AAXA =AA =AAf{A^{AXBA =A =AAA =A =A =AA =A =AA|AdAAAAAAA =AAf{Al?!G?@0@XQ@(A{AD@(@A"{A(A4A^{AhA^{AXAA AXAAAAj{APAPAHABBBBBB A =A =AAAxA@A>{AF{AlA =AA =AAAA =AAz{?!G?@0@HQ@(@AA\@@(A{AA.{AZ{ATA^{A A{AJ{AAA~{A\AB{A2{A{A B BBB?BTBUBMB6BA =AA =AH@(@@(AtABB A =AA =AA~{?@Q@@@`@A{A8Av{@@@AA8ATA:{A6{A{A0An{AA|A0A{@(@(@AA =BB>BQBgBeBWBIB<BA =AAA{@@XQ@(AABBBAA =B?!G?@Q@@@(@(A:{Af{A =@(@@A"{AHA:{A&{AA{ADAv{An{A"{@@@(@(AA =A =BB9BbByBBBByBOB4AAAA@@@@(APA =BB BBBB???@Q@HQ@(AAR{A =A =@@(@A(AHA"{AA{AAPAXA{@(@(@(@`A:{ApAA =B0BWBBBBBBBBBB(A^{A6{AJ{A(@@AAA =BBB$B;B&>??@@ @`@(A0AlA =A =@@(@A*{A6{A{AA{A{A:{A@@@P@QAALAA =BABBBBC@CaGC GBBBBBZA =A:{A A,A @(@(AABB(B9BZBG?@?@@(Q@@AHAA =A@hQ@(@(A&{AA @(@AA@@(@(Q@@(AAn{AB.BBBBBBBBBBBBBMBBB AAA{A@(@(Ar{ABB*BEBaBR??aG?@@(Q@@(A`AA =A@A @@A@@(@@(@(@(@@8Q?@@(A:{ABBwBBB4BBFBTB/A =A =AA =AA =AA2{@@(@@(APA =BB*B<BlBt?!G??@Q@0@(AA`A =@(AA@@(@(@(@(@(@@@(@P@@xQ@@A =A =BBAAf{A =A =A.{@(@(A{A8A =A =A =A =AD@@@@(A,A =BB,B4BzBB??У@@0@P@AA =AA@A@(@p@@@(@@@@(@XQ@0@(@XQ@hQ@AABA =@@A{@@@p@p@8Q@pA"{A =A`AAF{@(@@@(A{A =BB+B3BB??@ @0@HQ@(A"{AAA0@@(@hQ@(@@(@(@xQ@xQ@`@0@@@HQ@p@A =AA =@@hQ@@(@8Q@(Q@8Q@ ?У?У@(AR{AB{ATA2{@@@@(A AA =B,B:B~B?!G?@@ @0@P@A,A =A =A$@(@@hQ@(@@hQ@`@XQ@XQ@8Q@(Q@(@@@@p@AlA~{@@?У???@Q@Q@Q?@A&{A$A"{A{@(@@(@(A{AA =B,B?BBB?!G?@@ @8Q@XQ@(AJ{AApA@@(@`@@@XQ@P@@@8Q@Q@@(@@HQ@p@@@(@HQ??@???@A{A@(@@XQ@hQ@(AAA =B)BCBB?@?@ @(Q@P@hQ@(AxAAN{A@(@A {@@(@HQ@8Q@0@ @@@(@(@HQ@P@XQ@p@`??@?@(@(@(@(@`@ @@@xQ@A =AB0B?BBB?aG?@0@@@P@p@Az{AA8@(@@(A@@p@8Q@0@Q@@@@@(@XQ@HQ@(Q@???@ @(@(@@XQ?@@ @pA ABB6BMBB~?aG?@ @0@XQ@(@A =A =A@@@@(@hQ@`@0@@@ @xQ@xQ@p@(@(@`@P@0????@HQ@`@hQ@HQ???У@@pA$A =BB(BOBBY>??aG?@@0@XQ@@(AAA{@@@@(@`@XQ@8Q@HQ@0@xQ@`@p@@@hQ@(@HQ??!G??@?aG?aG?@@0@0@(Q??aG?@Q@(AJ{A =BB BGBwBB???@Q@(Q@HQ@@(AA =A@(@@(@@`@p@P@@@@(@XQ@xQ@xQ@(@xQ@@@(Q????????У??aG?@8Q@AAA =B BFBAB'???@Q@HQ@8Q@xQ@AA@(@@@@@@p@XQ@@(@@HQ@xQ@hQ@(@(@@??У???@(A6{A =A =A =BBGBB >???У@Q@P@HQ@p@AZ{A@@Q?@@@@p@hQ@@@@XQ@hQ@(@xQ@(@????@8Q@(AA =A =BB=B7BB>>>\??aG?@@0@P@`@A:{A{@(@Q?@@(@(@A{@@(@@@P@(@@(@(@0>\@@A\A =ABB,B6B#B"B:>\>\??aG??@Q@XQ@p@@(A@@Q??@(@(@(A{A {@(@(@(@@@(@(@@`??@(AB{A =A =BB+B:B,B!B#B>\>>\?aG??@@@@@(@ATA@Q??@HQ@@AA.{A@@@@(@(@@@hQ@Q?@(A0AAABB7B>BBBPBB>>>\>\>>\??aG??@Q@8Q@@0@(AtA@`??@@@(@A {A8A.{A@@@@@@(@(@0?@Q@(A0AA =ABB"B4B%B(BHBBB>\>>>\?>\>>\?!G?aG??@@@@@(@ATA&{@??@ @A{A{A*{AHA$@(@(@(@@(@(@(@(??@pA{ALA =A =A =BBBB$B)BMBBBL>>>\>\>\?>\>\?????@Q?@(@AA8@(??У?@P@A(A,A:{AF{A AA {A|@AA"{A@?>>>@@(A{A4AA =AB BBBB+BfBBBrA =>>\>\>>??>\??aG???@Q?@`@p@AJ{@(@??@@A {AF{A*{AB{A2{A{A{AAAA<A^{A4@???У?>?@(A{AHAAA =A =BBBB@BsBBBDAA>>>\>\>\???!G>\>>\?aG??@Q@Q?У@Q@xQA Al@@Q???@HQ@ATATAB{A2{A&{AA{A{AA:{ApAAj{@@@?@8Q@Q?У?@ @@A>{AA =A =A =A =ABB\BBBBB2A =AA =>>>??!G>\>>???????@?У@(Q@(Q@Q@@@(AV{A =A.{@P@Q??@Q@hQ@(Av{AxAPA8A&{A{@(A$A>{AV{A|AAAV{@@@@@@AAJ{An{Az{AA =AA =B9BbBoBtBaB'A =AAA"{>>\>\>>??@?!G>\>\?>\?!G??!G>>\?@?@?@`@XQ@@??@pA$A@A @@P??У?У@(Q@(AAAAALA.{A$A0ATAA =AA =A =AA =ADA(AA&{A@Af{A`ApAABBCBdBeB[BABAA =AHA,AR{>\>\>>>\?!G?@?@?!G>\?!G?!G?!G>\?@??@p@@(@Q?У@`@(A^{AR{@(@Q?У??@@XQ@(A8A =A =AAR{A8A@AF{AxAAA =A =AAAAAA =A =A =AAABBB<BRBRB,AAAxAV{A*{ATA>>\>>>\??aG?@?!G>\>\????@>>\??@0@(@@XQ@HQ@`A{AAA@`@P@P??@0@`@AtA =AA =AlAR{AB{AlA =AAAA =A =ALA =AAA =A =A =ABB BB(B B AAf{AB{A:{ADA<A =A>\?>\>>\?@??aG?>>\?@?@?aG?!G?aG?У@ @(@@@p@P@(AN{A =AP@@P@p@@Q@Q@@@@(Az{AA =AAApAA =A =AA =A =A =ABABBAAA =AA =A =AAz{AZ{ADA@A*{AHAlAAAT>\>\>\?!G>\?!G???aG?!G??@?aG?!G?>\?@Q@p@A@@xQ@(@(A =Az{@@P@@@(Q@(Q@HQ@@@AAA =AAA =AAA =AAAA =AAAAA =AA =AA>{A6{A*{A*{A ADA*{AF{AA =A~{AF{A >\?>\?!G??@?aG???aG?!G???!G?@?!G?!G?@@AA@(@HQ@Av{A =A@@(@(@(@P@P@HQ@@A {A =A =AA =A =AA =A =A =AAA =AA =AtA =A =A"{A{A{A{A A A$A2{AhA\AR{AXA<A @(@(>\>\??aG?@?aG????aG?>??!G?>\?aG@Q@AA{@@(@A:{AA.{@(@(@(@(@(@@hQ@p@A@@(AA{A2{A A{A{A.{A@@(AAA =A{A&{A{A$AA{AB{A{A&{ALALAZ{ALA*{A{A {@A{>>\>\?aG?aG??????aG>\??!G?!G>\>\?@AA{@@@A{AA0A A@(AA.{A @@p@(@@(@AA {@@A<A.{A A(A@A:{A2{A0A>{A4APALAA$A,AHA>{A4A>{A0A A @(AA{AV{Af{>>>\?!G?aG?aG?????aG?!G>??!G>\?aG@A{A{A"{@(@(@A*{A$AATA0@(A$Ab{A2{@(@@(@@@(@@(@(A.{A{A{A:{AB{A@ALAF{A0A&{A:{A:{A A{A(A"{A,A AA{A {AA<An{A =A|A>>\>>?!G???????@>>>\>??@@A"{A{@@(A$AA{A,ALA$A<A<A^{Av{AZ{@@(@(@(@>@(A {A{A,AZ{AXATAPA`AF{A,A$A&{A0A{A {AAAAAA,A =AAA =AA>>\>>????????@>\?>>\>\>??@@ @(A A0A{@A AN{AAA {A,A =AALAHAA`A@@(@@@(@@(@(AA.{A6{A<A.{A<AJ{A"{A {AA{A{A{A$A{A{AA =AA =A =AAAB/>\>\>\>\?@???????!G?>\>\>\>?@@Q@(Q@@@@@(A A*{A{AA{A{AxAf{An{AlAhA =AF{AA =Ar{A {AAA @A$A*{AA"{A$A AAA^{A\AV{A =A =AA =BAA =AAA =A =B(B9?>\>\?@??У?????@???!G?>>??@hQ@@@(@(AA8A(A {A*{A{AA,A<A@A =AZ{AlAtAv{A =AAv{A =AA =ALAA^{AlALAAF{A^{AAAABA =BAA =A =AAA =B,BCB B>????@?@?У????@>\??@>\>>\?@xQ@@@@(@(A"{A8A{@(A2{A.{AN{AF{A6{Av{AA =AAA|AAA =A =AA =A =AA =A =BA =BBB B AAAA =AA =AA =BB$B'BA =AF{>?!G?!G?!G?aG?У@?????!G>\>\??@?@@(@(AAAA@(@(A*{A$A0ADALAA =A =AA =AApA =AAr{AAA =AA =AAAAA =A =A =A =A =A =A =A =A =A =B'B AAAR{@@>\?@?!G?@???????@?>>\>>?@@@@(@(@(@@@AA*{A{ATA =AA =A =AA =AA =AA =AApAA =A =AxAAA =A =AA =A =B^AA =A =BA =BA =A =A{@hQ@Q??>???!G??@????>\>>>\?aG@0@@(@AA@@(@(@A(A`A =AlAv{AAAAAAA =A =AAj{AAA`ApAAA =AAA =AA =AA =A =A =A`@@(@Q????!G>\>\?!G?aG????????>\>>?aG@XQ@A{A{A$@(@@@(A"{A<AdAxAdAA =AAA =AA =AAA>{A0AXA.{A ADA*{A:{A~{AxA =AA =AAHA{@(@0??@???>\>\??aG????@?У??У?>\>>?@?@XQ@@A.{@(@(@(@(@A$AtATAAA =AAAz{A =A =AtADADA6{@@@(@@(@(AA6{A4A A{@@??@HQ?@8Q@Q?!G?@>\>>?!G????????У??У?!G>\>\>>\?@?@(Q@A{A {@(@(@(@(@A{A"{A =A =AAA =A =AAA =Ab{A =AJ{@@(@(@@`@(@(@@@(@(@(@(@p@(A@`@xQ?>\>\>>\?@?@???????У??>\>>\>>\?aG?@ @@A{A@(@@(@(@A {A<AHA =AAA =AAAAA =A =An{Af{A =AXA {AxAXA\Al@A.{AF{@@(@(@XQ@(Q?>>??!G?aG??????У?У??aG?!G>>\???@hQ@A(A@(@@(@@(@(@ATA APA =AABAA =BAA =AA =A =AA(A4AX@@(A*{@(@P@@0?@?aG>>>\??@?aG???????У???>???@@@A A$@@@xQ@(@(@@@(@A<A0A$A =AF{A =AAA|AA{@ALA@(A&{@@(@@(@@Q??!G>>>>\?@???????У?????aG>>>\>\?!G??@`@A{@(@(@@`@`@(@(@@(@@(A{@@A0@@A@@(@(@@`@0@P@ @Q???@?@?!G>\>>>>>?!G?aG????У??У?У?????!G>>>>??@p@@(@@(@p@`@hQ@xQ@p@@hQ@`@L(@@hQ@(@p@S @p@8Q@P@ @??????p?aG?0?@?@?0?0?0?Q?Q>\?@???@@@Q@?У????aG?>\>\>>?!G?@(Q@p@@(@(@@@xQ@xQ@XQ@@@HQ@(Q@8Q@,(@3 @@@P@HQ@0@(Q@Q?@?У?Q?Q??p?aG?p?aG?p?aG??@ ?Q?Q??@???@@ @@Q?????@?!G?!G?>\>\>\>\>\>\?aG?@@xQ@p@XQ@@@@(@XQ@0@8Q@ @8Q@Q@ @Q@@@Q??????p?O\)?@?0?@?O\)?O\)????p?@??Q>\?aG??У@@ @ @HQ@8Q@?У??У?У??aG?@?>\>\?!G?>\@(Q@p@8Q@8Q@@@HQ@HQ@P@`@HQ@HQ@0@ @(Q@Q@????????@?p?O\)?p?aG?p???????O\)?Ǯ?>\??@Q@0@HQ@hQ@(@hQ@8Q@Q@Q@P@8Q????aG?!G>\>\?>??@?@Q?@@Q@ @(Q@ @ @0@(Q@Q@??@???У???@?@?aG?p?p????Q???O\)?>=u?@@@HQ@@(@@@@(@hQ@hQ@@(@@(Q?У???aG???У???У?@Q@?@Q@Q@Q@ @Q@@Q@?@@?У???@?@?0?\)?!G?>G>R>R=u=u=u?@@Q@hQ@(A{AA{@@(@@(@(@@(@(@Q????@>\?@@@XQ@xQ@@@Q@Q@Q@Q??????У????У???@?!G?>\>??У@p@ATAhAb{A$@(@(@(@@(@@(@p@Q????!G??!G?@??У@(Q@XQ@@(@@(??????????aG?aG?!G??>G>R>=u?aG@Q@(AHA =AA\A@@@`@@@@(@p@Q???@>\??!G?!G?aG?@8Q@(@(@@@(@(@(@?????aG?aG?@?!G??>G>R>=u>\?@0@ApA =AAR{A{@(@(Q@ @hQ@(@@@@Q??aG?aG?aG>\???@@P@@@(@(@@@@(@(@(@@xQ@p@hQ@`@8Q@?Q?aG??@@@(Aj{A =A =A:{@(??@@8Q@(@@(@@XQ@Q???@?!G?!G?@?aG??Q?@@(@xQ@p@@@(@(@(@@@(@@p@@8Q@Q??aG?O\)?!G?@`@AALAdA{@hQ?У@?@ @hQ@@@@hQ@@ ???????@(@@@(@@@(@(@(@(@@@(@3 @ @(Q@???@?У@ @(@@A@@??@@Q@8Q@@(@@@(@(Q???У??p?@@hQ@@@(@(@(@(@@@(@@<(@xQ@HQ@ ??У?>\?@?У@0@8Q@?У?У?@???У???У?@Q@Q@(Q@P@0??У?У?@@XQ@HQ@\(@(@@@@(@(@c @P@(@P@(Q@???@?@@?>\?@??!G?@??aG??aG?aG?p??@@@(Q@Q@ @@?Q@@Q@XQ@p@(@(@xQ@(Q@8Q@@@`@(Q@Q?>?????@>\?@?aG??????У?У???@?Q?У?@Q@8Q@XQ@XQ@@@ ??@(Q@(Q@(Q@ ???0?\)?O\)?>>??>\?@??>\??@?aG??@@@Q@@@Q?????Q@ @@`@ @Q?????@??У?У??@?\)?\)??Q@0@# >\>??!G???>\??aG??Ǯ@Q@8Q@`@`@p@hQ@XQ@8Q@8Q@ @<(@ @ @Q????Q???У????Q??aG?@?@?O\)?p?Q@Q@<(?Q??p>\>?!G?@?!G>\?@???@(Q@hQ@@(@(@(@@xQ@@@{@hQ@(@c @HQ@s @@(??@??Ǯ?@Q?Ǯ?Q?Ǯ?Q????p?Q?p?@>\?>\?!G?!G?>\>\>\?!G??@@HQ@p@(@@@@(@(@@(@@@{@(@@@(Q????Ǯ?@Q@@Q??Ǯ??Q?Ǯ?????>\?!G?!G??aG?>\>\??aG??@ @HQ@HQ@`@(@@@(@@{@@{@@|(@`@ @# @@ @??Q??Q?Q?Q?Q??Q?Ǯ???Q?>??!G?aG?@?aG?@?!G>\??@??@Q@@ @(Q@ @@(Q@XQ@hQ@xQ@xQ@hQ@\(@L(@Q@8Q@,(@Q@ (@Q@Q?Q?У???Q??Q???O\)??>>??@????@?@?!G?!G??!G???У@@Q@Q???Q??Q???@@ @(Q@ (@Q@XQ@(Q@ @?@ ?Q?Q????Q?Q?Q?>>\>\?@??????aG?@?!G?!G?aG???У??Q?Q??@Q@Q@??У@Q?Q@Q@Q@Q@ (@ (@ @ (@Q??У?Q?У?У?Q??aG????@????@?!G??@?aG?????????Q??Q?У??У?У??@??Q???Ǯ??????Q?Q?>\>>\??@?!G>\?!G?@????????Ǯ?Q@Q@Q@ @P@(@@(@P@L(@(Q?Q@@ ???Q???@?????Q??Ǯ@ (@HQ@C @p@{@@{@{@(@c @L(@8Q@0?Q??У??>\?@???????Q?@ @ @Q@0@(@(Q@3 @@@<(@,(@ (???????!G?0?aG?O\)?!G?0?p?????Q?????????p?aG?@?\)?\)??!G?0?p??Q??Q?У??Q?Q???aG?\)??\)>G?\)??@???\)?0?p???????O\)?0?!G?????0?O\)?O\)?p??O\)?0????!G?!G?0?!G???>G??aG??????????????@ @p@@@p@xQ@hQ@(@@@(@@@@@@@(@(@p@Q@@@?У?????aG?aG?aG?aG????aG????!G?aG??????????У?У??@ @xQ@@@(@@@@@@(@(@A@(@@p@@@hQ@XQ@HQ@ @??У?????aG???????aG?????!G?aG??????????@?@@`@(@(@@@(@@@@(@xQ@(@(@@(@@(@`@(Q@@Q??У????У????????????????>\?!G?aG????>?@?!G?@?@??У?У@ @xQ@`@@xQ@P@XQ@hQ@@@xQ@@@XQ@ @Q@8Q@@@P@Q@Q@Q@@@??????????????????aG????!G?@?aG???aG?@?!G??!G?!G?aG???@@8Q@P@8Q@ @8Q@P@(Q@ @Q?????У???@ @HQ@HQ@HQ@ @Q??У?????????????aG?aG?aG?@?aG???!G?@?@?@?aG?aG?!G?!G????aG?aG??@@ @(Q@8Q@ @(Q@ @?У?У?У????????@@8Q@XQ@@@(Q@??У???У?У?У?У??У?????aG?@?@????aG?@?@?!G?aG?@?@??>\???aG??@@Q@Q@(Q@Q?@??У????aG?aG?????У?@@Q@0@ @ @ @0@@ @Q@@??????????aG?aG>\?@?aG?aG?aG?@?aG??aG?@?!G?>\??!G?!G?@?????У?????aG?!G?!G?!G?aG???????У?@(Q@hQ@xQ@P@@@ @(Q@@@?????????>\>\>\?!G?aG?aG??@?aG??aG?@?>\>\???@?aG?????!G?>\?!G?@???????@Q@HQ@(@xQ@p@hQ@HQ@0@ @Q?У?????У???>\?>\>\??@?aG??????!G??>\>\?!G???!G>\??@?????????@(Q@p@@@@XQ@8Q@0@Q@?????У?У?>?>\>\>\?@?@??????!G>\??!G?!G??@?aG??????????@ @XQ@p@@@@(@(@HQ@Q?У????У?>>\>\>??@?@?aG?aG????@???!G?@?aG????????У?@@@HQ@(@(@@(@@@(@Q?У????>\>>\?!G?????!G??!G?aG?aG?aG????????У??@Q@8Q@hQ@@(@(@@(@(@(@`@???>>\>\>\???@?????????????@@(Q@P@XQ@p@(@@(@(@(@(@(@`@??>>\>\?!G???aG????У?@Q@0@8Q@8Q@ @8Q@@@@@0@0@P@XQ@(@@@@(@(@(@(@@@@Q?У>\?!G???@????@@HQ@p@(@xQ@@(@(@(@@(@`@XQ@p@xQ@@@@(@(@p@hQ@XQ@HQ@ @>>\>\>??aG???@Q@@@@(@(@@@(A@(@(@@(@(@(@(@@@(@(@@@@XQ@HQ@hQ@P@ >>\>\??@??У@@HQ@(@@@A@(AA A&{AAA{A @(@@(@@hQ@@@@@(@xQ@@@XQ@xQ@8Q>>\>?!G?aG??@@XQ@(@@(A {A"{AA{AA*{A0A*{A{A{A@(@@(@@(@(@@@@(@@`@0@XQ@P>>\??@??@@0@p@(@@AA8A>{AJ{AV{AR{AXAPALA6{A2{A0A<A(A {@(@(@(@@(@@(@@@0@0@HQ??????@@0@`@@(AA0AHA\A =A =A =A =A =A =AA =A =A`AXALADA(@(@@(@@@@@(@hQ@0@@??@?aG?@??@Q@8Q@0@`@@(A{A{A6{A*{A{Ab{AA =A =A =AAA =AAAr{Ab{APA>{A@(@(@(@@(@@@@p@@?!G?@????@Q@@@P@xQ@(@AA{A{@(@(A{A0ATALAlAAAAAAAAA =A\A>{A(A @(@(@@@@(@(@`???У??@8Q@hQ@@(@A A(A6{A*{A.{AN{AR{ATAXATALAxA|AAv{Av{AA =AAAAAxAHA$A{@(@@(@@@(@??@?@?@Q@@@@(@A{A<AxA =Af{Az{AAAAA =AA =AAAA =A =AAA =AAAAAn{A>{A{A{@@@(@@(@>\?!G?aG@@ @ @`@@AA.{A^{AA =AA =A =AA =BBB BBB,BA =AAv{AA =AAA =AAAAtAR{A{A@(@(@@(@(>\??aG?@ @0@@A A8ALAhAA =A =AA =A =AA =A =AB B$B.BHB>BA =AA =A =AAAAA =AAAAZ{A@(@@@(@>\?@?aG?@hQ@@(A>{A^{A^{A =AA =A =A =AAA =AA =AABBBB&BBBB B A =AA =A =A =A =A =AA =AAXA{@(@(@@?>\?@??У@Q@(@A.{AXApAAAAAAAA =AA =A =A =AAA =A =A =A =A =BB BBBA =AAA =A =A =A =A =A =A4@@(@(@????@??У@Q@ @@(A6{Af{AlAA =A =ABAAAAA =AAAA =AAAA =AAA =AA =BB5BA =A =AAA =A =A =AA8@(@(@(????@Q@0@P@(A4A|ApAf{A =AAA =AA =A =A =A =AAJ{A@A`A~{AA~{AA =AAA =AAA =BBAAAA =A =AAA =ADA"{@@???!G???!G?@?@?@??@ @P@A{Ar{Aj{A^{AAAAA =AAA =AA@AA{A*{ATAAA =A =A =A =AAAAA =A =AA =AABBAA =A =AA6{A,@(>\??>\??!G???!G?aG??aG??@@0@p@(A,AAf{A|A =AA =A =AA =AA =A$@(A{AA8A =A =A =A =A =A =A =AA =A =AAA =A =A =AA`A =B-BBA =AA =A|@????????!G?@?aG?@???@Q@@@(@(A<A~{AhAA =A =AA =AAAA2{@@@(A {AHAAA =AAA =A|A =AAA =A =A =AA =AA$AxB%BABBA =AA =A?????!G??!G?@?aG?@????@(Q@hQ@AA4A\AtAxAxAA =A =AA =A @@(@(@(@@A*{An{AAA =AAAHAB{AlAA =AA =A =A =AV{A =BBlB1BA =AAA =????!G?!G?@?@?aG?aG????@8Q@xQ@A"{AAAJ{AB{AN{Av{AtAv{Af{AtA0@@@@(@HQ@HQ@(A {APAA =BB B AA =AA0AAA =Az{A =AABBxB^B$AAA =A?>\??@?@?@?aG?aG????@Q@`@(@A.{A{A{A{AATAn{AJ{AdAHA&{@(@xQ@hQ@@@ @8Q@(@AA"{AXA =AA =AA =A =AA*{A*{A =A =A =AA =A =A =BpBwB=BA =BA??>\?!G?@?@?@?aG????@Q@`@@@(A*{A {@(@(A"{AXAV{AXA8A0@(@(@`@8Q@Q@0@(@A{A&{AJ{A =AxAXAZ{Ar{A =A =AA =A>{AtAAA =AAA =B^BBHB"B B A?!G?!G?>\?!G?aG?aG?aG?????@HQ@(@(@(A A @@@AA@AB{APA @(@(@xQ@(Q@ @(Q@(@A An{AAA =A|AR{A:{A<A`AAA =AV{AXA =A =A =A =A =ABKBBZB&BBB?!G?@?!G??@?aG?aG??????@(@(@(@@(@@(@(@(AA2{AN{AJ{A@@P@ @@Q@`@(A{Ab{A =A =AA~{A4A{@@(A A>{AA =AF{ALApA =AAAAB5B}B]B5BBB%?@?@??!G?@?aG??????@(Q@(@@@(@(@@@(@(A{A>{AJ{A<@(@xQ@ @@@Q@HQ@A"{A =A =A =AP@@@@@@@(ADA =A2{A,AV{ApApA =A =AtB%BnBUB,B%B9B1>\>\??@?@???!G?@???У???@Q@`@(@@(@@@(@@@(A(AHATA{@@`@?@@Q@@@A:{A~{AF{A{@(@@?У?@Q@hQ@@AAhA(AAXAhAhAAAdB,BdBLB>B9BTB9????@?@???@????У?У??@@@(@@@(@@@(@@(@(A"{A,A,A@(@`@?У?@@8Q@ApAA"{@@xQ??@?@?@Q@p@@APA(AALAXA^{AAr{A^{B2B:B<B8BHBkB<???>\?!G?!G??????У??У??@(@@(@@(@@(@@@(@AA$A{@(@`@@@?У@@ @P@A =A =A@(@ ??@?aG?@HQ@hQ@A,A$A ALA@AN{AxAZ{Av{BBB0BEBfBuBD>\???>\>\??????У@@?У?У@@(@@(@(@@(@@(@@A{A @(@(@@@XQ?@@@Q@8Q@(A =A@@@(Q?У???@Q@0@P@(A(AA A@A@A@A`A6{AABB%BNBBBK>\???!G???!G?!G????@Q@??У@(@(@@(@@(@@(@(@(@A {A@@(@8Q@p@0@@Q@Q@(Q@(ABA$@(@8Q@ @?@@Q@8Q@@@(A*{AA{A>{A@A4A@AAABB&B[BBBQ>\?>\?????@?aG?@ @@Q@(Q@??@@AA{@@@@(@@@(@(A @@@@@hQ@HQ@Q@@ @HQ@(AB1A@@P@8Q@(Q@@@Q@@@A A,@A {A*{A>{A&{AA A =A =BB(BoB~BkBG>\>\>\>\????@?aG?@0@0@0@8Q@Q?У?@0@AA@@A@(@(@@@(A{@(@@XQ@P@p@ @Q@0@(@ABBBA =@@XQ@@@ @Q@ @@@AJ{A@(A{A<A&{A@AHAA =BB0BwBbBFB(>>\?>\?!G??@(Q@0@0@0@ ???@(AA{A{@(A@(@@(@(@A{A{@@XQ@XQ@p@0@@@@@HQAAB.BAA{@@hQ@XQ@A AhA@(@(A(A@@(@(@(ATAB BBOBmB@B(B>>>>\>\>\?!G?aG?@ @P@XQ@@@(Q@??@xQ@(A A&{A{A"{A{@(@@(@(@A@@@P@p@XQ@ ?@Q@(Q@A{AAA =A =ALAA{APAF{@(@@AA{@@(@(A {An{A =BBBgBYB.BB >>>\?!G??@(Q@(@@hQ@HQ@Q?У?@@@(A A6{A4A2{A.{@@@(@(@(A A{@@XQ@@p@0??@@0@@AF{AAAlA4A$A@(@@AA{@(@@@AABB#BJBeB.B5B B>>>>>\??@??@ @(@@(@`@??@Q@(@(A0AF{A:{A2{A{@@@(@A {A(@@(@`@(@P@Q?!G?!G@@8Q@@(@(@(@@@(@(@@@@@(@xQ@HQ@@(ABB0BBBtBHB7B2B B >\>\??@??@ @(@(@(@(@0??У@Q@p@A{AN{AN{AB{A0@(@(@(@(@A&{A @(@@@(@P@?!G?У@0@(@@(@@@@@@@(@(@P@(Q@(@A =A =B(BOB|BcB:BEBAA>>>\?!G??У@Q@(@(A@(@p@Q?@@`@@A<A\AZ{AN{@(@@(@@A{AA@@(@(@(@HQ?У?!G??@HQ@hQ@(@(@@(@p@P@(Q@@@(@(AA =B BIBpBbBPBMB+A =AA>>?!G??@0@AA"{A@@0?@@0@(@(AAN{A\AdA@@(@@@(AA"{A{A@(@(@(@(@@??!G?@Q@0@XQ@hQ@@Q@??@@(A{A =ABB;BYBRBCBFBFB A =AA =>>>??@@@@A A8A&{@(@`@ ?@@(@@AAHAb{Aj{A{@AAA A AAA{A@(A@(@?????У????@?aG?@p@ADAA =B B@BUBBBABAB@BAAAB >>\>>\?aG?@8Q@(@A<A@@(@(@`@?@0@@@AAZ{Aj{AhA{@AA{A A*{A{A A@(AAA{@(@XQ@@@HQ@P@8Q??@@@xQA ADA =A =ABBEB?B!B/B>BGBA =A =A =BB->>>?aG?У@ @(@A:{A\A@(@@(Q?У@Q@(@@@(A<AXA =Ab{@(AAAA A*{AAA{A&{A*{A&{A A{A@@(@@(@AA<A =A =A =A =B+B0B$B"B*B2B*B A =AABB%B>\>\?!G?@@xQ@(A0AlAF{A@@@?@@@(@(@(AALAtA =A\A@(AA&{A.{A,A{A A2{AHA@AHA>{AB{A`AAv{Az{AA =A =A =BBB BBB"B5B.BAAAABBB A =>>\>>\??@HQ@A*{Af{AA$@(@(@hQ??@xQ@@(@A"{ALAn{A =AlA{@A{A<ADAN{A{A8A@Aj{A|Aj{AXAZ{AZ{AtAn{AAA =AA =A =ABB(B(BA =AA =A =BBBBAA =>>?@?@@(AA^{AA>{@(@(@(@P?@Q@@(@@(A8AHApA =A~{A0AA{AV{A|AA~{An{Az{AAAA =A =A =Ar{A =AAA =AB BB(BA =AA =ABBBBBA =A =A =>>>\???У@HQ@A =A =AtA&{@@(@(@8Q@@ @@@(A {ADAF{ApA =A =A6{AA.{A\AA =AA =A =A =A =A =BA =A =A =AABBBB AA =AABBBBB A =AA =A =A>>\??aG?@P@AhA =AA<A @(@@(@p@ @hQ@(A AAAN{AF{AV{ApAv{AF{A$A,Ab{A =A =A =AA =BBB+BZBQBTB.BBA =BBB B!B1B4BBBAAAA =A =A =A =>>\>>\>\>\?@?@@@(A:{AAAN{A{@(@@@@(@XQ@(@(A(A{AAN{ADAJ{AV{AV{AR{A<A.{ADApAAAAB BBOB2B>BBBBBBB@BIB>BAA =A =A =AAA =BBB#>\>>\?!G?@P@A@A =AAdA{@@@@(@(@@(@(A$A:{A{A{A<AB{AF{AJ{AJ{A^{AdAf{AV{AJ{ALAj{AAA =AAA =AA =AB BBBB B BA =AA =AA =AB BBB>\>\>\?@@A:{AAAA0A{@@@@A {@@(@A*{ADA(AA(AB{AHADAHA`AA =AtAdA\AAAAAAA =AA =BBAA =A =AAAA =AAA =BBB BB >>\?@@hQ@(Aj{AAA~{A(A @(@(@AA"{A@A{A>{ALA6{A(A&{A:{AB{A@A:{AF{Ab{A~{A =A|AA =A =A =AA =AA =A =AA =AA =A =AAAAA =BA =AA =AA =A>\>\?aG?@P@A{A =AA =AdA2{A(A0A{AA {A{AAA{A8AR{AR{A6{A A A$A8A6{A*{A(A.{A:{A2{AXA =AA =AA =AAA =AA =AA =AA =AA =A =AA =A =A =AAAz{>\>>>>\??@(Q@@(A>{AAA =AdA8A(A4A2{A>{A @AA A$AR{AZ{AXA\A.{A @(A AAAA{A{A{A&{A8ALAdAlA|AAA =A =A =AAA =A =A =AA =AAAAAf{Ap>>>>>\>>>??@@@(A&{A {AXAAAAb{AHA*{AJ{Af{A`AHAAAA{A{A2{ATAJ{A*{AA{@(@(@AA{AAAA {AA8AN{A`AlAdAf{A^{Ab{AhAZ{AZ{AXAR{A^{A`ALAJ{AZ{AdA =>>\?>\>\>\>>\?!G?@@@(A{@(A\AA =A =AAxAf{ApAApA^{A^{A&{A@AA$AR{AXA0A{AA@@(@@(@(@(@(@(@@(@(@AA{AAA{A"{A&{A&{A(A,A2{AF{An{AA =A =>???>\>\>?!G??@(A@(A AB{AxAxA =A =A =A =A =AtAA\AhApA.{A(A{A$AHAdAV{AB{A<A*{A {@(@@(@@(@@@@(@(A{A{A$A*{A.{AA{A A<AXAAAAA =A =>>?!G?@?>\>\??aG??@xQ@@A&{A8A:{A<Av{AAAAAA =AATAZ{Aj{ApAdA<ADAb{AdAlAf{AJ{A2{A&{A{A{A{A{A {AAA.{A6{A<A@AB{AN{A^{AJ{A|A =AAAAAAA =>>?aG?@?@?>\>\?@???@(@(A A{AA {A Af{AAA =BAAA =A|ATATAPAHA*{A4A<ADALAPAJ{A:{A.{A*{A&{A"{A&{A2{AV{AtA|A =A =AA =A =AAA =BA =AA =A =AAb{>>????aG?@??@?У?@ @@(AAA{@(@A0AABBBB4A =AAAA =A =A =AV{A:{A6{ALAHA0A"{A{AA A$A2{AhAAAAAA =A =BBB AAA`AJ{A@A\Ap>>\?@(Q????>>\???@Q@ @XQ@(@(A@(@@@A`ABBBBBBBBQAAAA =A =AAAtAtALA*{AA{AAA(A^{ApAAB:BB BBA =AhA(A{A{A*{A =A =A>?@@@XQ?У???!G?>>\???@0@Q@Q@HQ@@(A{@@(@@AAV{AB;BBBCGBBBBYB<BB+BBAA =A =AA =A =AAA =ABBB A =A =A\A@@@APA =A =A =A>>>??@ @(A{@??У??!G?>>\??aG????@0@(@@@@@`@p@(@A6{AA =A =BFBBBBBBBpB=BAB9B-B"BAAAA =AAA =AAA\A{A@@@(AB{A =AApA>{A>>>\?@@@@(A$@@???!G?>??!G???У??@@@(@(@(?@0@`@@(A{AA"{A^{AA =A =B+BSBwBBBBjBKB4B AA =AAj{AlA^{AJ{A4A{@(A@A"{An{AF{A*{@@@@@`>??!G?@@@A{A.{@@????aG>??!G????@Q@hQ@(@@(@(@XQ@Q@0@hQ@(@@@AAAAA$A^{A|AAA =A =AAf{A@AA {@(@(@@(AAAHAF{AZ{A@@(@p@P@Q@(Q@Q@Q?>\??@8Q@(@AB{A,@(@????>\>\??!G?@???У@Q@XQ@@(@@(Q@@Q@@@hQ@(@@(@@@@@(@(@(@@@(@@p@p@hQ@hQ@`@p@(@(A A(A{@@p@Q@???????>??@@Q@(@(A"{A@@Q?????@>???!G???@Q@@(@@hQ@ @Q@@Q@P@`@(@@@@(@(@XQ@XQ@HQ@HQ@P@HQ@@@HQ@XQ@P@xQ@(@@@@`@0@????aG?aG?????>?@ @A*{AR{A6{@@P@Q????aG?>>\??!G????@HQ@@@@`@ @??@Q@(Q@P@hQ@@(@@xQ@(@hQ@P@@@8Q@@Q@0@@@`@@`@P@@@?У????????>\?@@QA{AF{A`A2{@(@Q?@???>\>\>\??@?aG???@@@@(@p@(Q@@@@@@0@P@XQ@p@(@@hQ@hQ@XQ@(Q@(Q@@Q@@Q@@@?????aG?aG?aG?@@@AAAr{@hQ@ ?@Q@@@Q???!G???!G?@??У@ @(@@(@8Q@@ @HQ@XQ@0@p@XQ@8Q@@@xQ@@hQ@S @@xQ@(Q@ ?????@?aG?@?@A0AA@@?@Q@(Q@XQ@P??!G?@?!G????@?@@hQ@@@p@Q@Q@P@@@@@@@@@(@(@@{@(@@(@8Q@hQ@Q???@?@(A<AA@@?@Q@(@@@8Q?!G>\>\???!G?@?@@HQ@p@@(@(@P@@@XQ@hQ@`@XQ@(Q@p@(A{A"{A4A(AA(A@@@hQ@0@Q?У??!G?@?@pA{AAA{??@Q@@(@@(Q???!G?!G?aG??@0@(@(@@@hQ@XQ@@@0@HQ@P@@(A0AB{AB{A8A0ADATA"{@(@@@xQ@`@??0?!G?@QAAA =A??!G?!G?@xQ@?>\??!G?@?aG??@Q@xQ@@(@@(@@`@(Q@(Q@hQ@@(AA{AA{A@A.{A$@@(@(@@@@Q@???>\?!G?@A{Af{@(?>\>\>\>\>\?!G?@?!G?!G?@@P@xQ@(@(@@(@XQ@8Q@HQ@XQ@(@(@(@(@(@@(A{A {@(@@@hQ@HQ@HQ@8Q??Q???O\)>\?@@ @(@(Q??!G?@???@Q@P@(@(@(A@@hQ@@@(Q@8Q@@@P@XQ@(@@@@(@xQ@XQ@P@ ????aG?0?>\??aG???@@Q@P@@@(@(@@`@???@Q@`@@@@(@8Q@8Q@ ?У??>\?!G???У?@@ @HQ@p@(@(A@@HQ??@Q@Q@xQ@p@p@@@Q@0@Q?У???!G?aG???У???У@ @(@@(@@HQ@ ?@@Q?@Q?@@8Q@Q?У>\?!G???@ @(Q@# @8Q@l(@(@@(@@`@ ??У?@@Q@0@ @?????O\)?0>\??aG???Q@Q@S @@A@(@(@(@P@8Q@(Q@hQ@(@xQ@0?Q?O\)???>\?\)?0???У@ @8Q@(@@@@@@(@XQ@8Q@ @0?@Q???????!G??!G?aG???@0@Q@8Q@@@(@@(@@\(@l(@@XQ@?У>\?????@?@???!G?O\)???Q@ @HQ@(@@@Q@ (@`@HQ@????aG?aG???!G?aG?aG?@>\???!G?aG?aG?????p???????p?!G?0?0>\?@?aG?@>\?!G?@?@?@??aG?aG?!G?@?@?@?aG?p?O\)?O\)?\)>\>\?!G?@?@>\?!G?!G?!G??@?!G?!G?!G??>\??@?aG?aG?@>\????>\?!G????>\???!G???aG?????>\>\?!G????У???@>\?!G???\)?aG??!G?aG????@Q?У?aG?!G?!G?>?!G?!G?!G?O\)??Q????>?!G?@????????@?aG???@?aG???aG???????Q??>G???@?aG????????????У?У???@@????aG?>\??!G?@?@?@????У?@Q@@Q@@Q@@?Ǯ???p>G>\?!G?aG???У???@@Q@ @ @ @ @ @??Q?O\)?aG>\??@????????@?????Q????0>\?0?@???!G?aG???У??У@?Q?Q?Q?У?У?Ǯ????p?0?0??\)?p?????!G?@??Q??У???У?У?У????Q??aG?0?\)??0??Q@ @(Q@0?>\??!G?aG?aG??????Q???O\)?@?!G?!G???p?Q?Q@ @# @L(@,(?!G?@?aG?O\)?O\)?p???Q?p?!G?\)?@???@Q@@ (@@???!G?0?@?O\)?@?0?0?0?\)???!G?aG?Q?Ǯ??Q??????@?!G?@>G?!G??0?O\)?O\)?0?0?!G?\)?0?aG???Ǯ?У?Ǯ??Q??Q?>\>\??@?!G???aG????@?!G?!G?aG??????@Q@ @@@HQ@P@@@8Q@(Q@@Q??У???aG?!G?????????>\??????@?@?aG?aG???>\>\?!G?aG?@?!G??@??!G?!G?!G?!G??!G?@?????У?@?@Q@(Q@Q@Q@@Q?У????@?!G?>\>>\>\>\>>\>\>\>\?>\?????!G?@?aG?aG?aG?!G?!G???aG??aG?!G??@?!G?!G?????!G??!G?!G?aG?????@???У??aG?@?!G?>\>\>>\>\>\>>>>\>\>\>\>\????!G?@?@?aG?aG??@?!G??!G???@?!G??!G???!G?aG?????У???У???aG?@?!G?!G????>\>\>\>\>\>\?????!G?!G?!G?@?@?@?aG>\?@?@???!G?aG?@?!G?!G?!G??>\?@?aG??????????У??????@?aG?@????!G?!G?!G?!G?!G?aG?@?@?@?@?!G?@?!G?@>\?!G?aG?!G>\?????????aG?aG?????@????У??@???????aG?aG?@?@?aG?aG????aG???aG?@?!G?@?@>\?!G?@?!G>\?>\>\>\??@??!G?!G??!G??У@XQ@@xQ@@P@p@8Q@(Q@@?У??????????????aG?@?aG?@?aG>\>\?!G?!G>\>\>\?!G?@???@??!G?@@@(@P@0@P@0@0@@@0@(Q@ @?У??????????aG?????>\>\?!G?>\>\@Q@????????@(Q@P@@@8Q@(Q@hQ@xQ@@P@Q@Q?У?????????????>\??>\>\?!G??@?aG?aG???У?@0@Q@(Q@@@XQ@`@XQ@`@XQ@(Q@???????????????!G?>\>\??@?@?aG?@???У?@ @ @(Q@8Q@HQ@XQ@8Q@ ???У????????aG??>\?!G?!G>\?????!G??@?aG???У@@0@(Q@ @@@ @ @Q@???????aG???!G?!G>\>\>\>\>\??!G?aG?aG??@@@@Q@ @(Q@@@HQ@ ?????????>?>\>\>\?!G?@?@?????@Q@0@0@(Q@0@HQ@P@XQ@ ?У???????>\>\???!G?aG?aG?@????????@@0@P@`@P@`@`@p@p@0@??????>\>\?!G?!G?!G?@?aG????У?@Q@Q@@Q?@Q@@@ @@@HQ@`@`@@@@(@@@?У????>>??!G?!G?@?@???aG??У@@Q@0@(Q@@Q@P@`@HQ@Q@0@8Q@@@P@P@P@HQ@XQ@(@@(@p@@@Q@???У>>\??@???У@0??@?!G?@?????@Q@Q@(Q@@@8Q@XQ@`@hQ@p@(@@hQ@HQ@XQ@`@P@@@XQ@P@8Q@P@xQ@@(@@XQ@0@Q@Q@>?!G???aG?@P@(Q@@Q@Q?@Q?У???У@@@ @P@XQ@p@@(@@@(@(@@@p@XQ@P@@@0@HQ@hQ@p@hQ@(@(@@@(@`@(Q@@Q??aG??@Q?У@HQ@P@XQ@P@8Q@(Q@Q@?@@(Q@ @8Q@HQ@hQ@(@A A{A A"{A{A{A@@@(@hQ@`@HQ@@@P@@xQ@xQ@(@(@@(@p@HQ@Q@>>???aG>?У@Q@HQ@@@@(@(@HQ@0@8Q@(Q@@ @Q@0@8Q@HQ@@@A*{A8AdA =AtAdAb{ADA2{A{@@@@P@HQ@0@8Q@hQ@p@p@@@(@@`@(Q@??!G?@??@8Q@(@ @8Q@@(@@hQ@@@ @8Q@HQ@0@8Q@HQ@hQ@@@@(@@(AA8AJ{AXAtAr{AB{A.{A$@@(@@P@8Q@ @(Q@XQ@xQ@p@(@@(@(@XQ@0>>\??!G??@@(@@P@XQ@(@(@@(@XQ@8Q@HQ@p@XQ@XQ@(@@@(@(@(@@(@(AAA:{A^{A`A<A"{AA@(@@p@`@@@0@8Q@hQ@@xQ@@@@hQ@HQ>\>\??!G?!G?@??@@PA@@@A{A@@(@(@@@(@(@@@@(@@(@(@@@A{AA:{AdAj{AZ{A:{A8A&{A {@@(@xQ@`@P@@@XQ@(@(@@@@p@HQ>\>\>??@?@?aG??@@A@@@(A A$@(@(@(@@@@(@(A{A{@@@(@@(@@(@AA(AN{AZ{AdAR{AlA>{A A{@@@@XQ@HQ@hQ@p@@xQ@@(@@hQ>\?>??!G?@?aG??@@(@(@@(@(@(AdA&{@@@AA{AA8ALA0A AAA{AA{A{AAA{A$AAAA{AHATA4A@(@(@@(@p@@`@@(@@@@(>?>\?!G?@?aG???@8Q@A{@(@(A$A*{AXAA AA"{A,A.{APA^{AN{A<AHAz{A =A =AAAAAXA6{AA@@A{ATAb{AJ{A@A.{A@@(@@(@@XQ@@p@(@(@>\>\>?@?@???У@Q@(AA{AA"{ALAxAF{A,AF{A>{AN{Av{A =A =AA =A =ABAA =AA =AAAA =AA<A{@A AF{A =A =AA =ATA@(@@@(@(@@p@xQ@@>>>>?!G?@?aG???@XQ@(AA{A(Ab{A =A<AB{AHA0AN{A =AAAA =BB"AAAA =AAf{AhApAA =A =AAhA{AA{AR{A =AAA =A(@(@@(@(@@xQ@`@p@@(>>\>>\??@????У@ @hQ@(A@(A.{ApAA4ALA*{A:{AA =BBA =B.B2AAA =AJ{A(A{A {A{AA ADAf{AA =A =AN{A.{A{An{AA =AA(@@@(A{@(@@(@XQ@@(>>>?!G?aG???@(Q@P@(A,A@A,AA =AAA>{A`A =BBB B%B3A =AA =A6{A{@(@@@(@@@AAPAn{A =A|A>{A"{A$AAAAZ{A{A {A{A{A @(@(@(@hQ@>>>>?aG???@@@@`A A6{A{AA4AA =AAA:{ABBBB!B*AAA =A2{@@@(@@@(@@(@(@(@AAV{Az{AF{A0A$AF{A =AA =AV{A@A{A*{A2{A{@@@@>>>>?@????@Q@8Q@A@Ad@(A{Ab{A =AJ{@(AA~{A =A =A =BBAAAA"{@@(@@(@@@@(@@@@@(AAJ{ATA*{A(A<AAA =AF{A@A<ADAPA$@@@(@>\>\>???У??@ @HQ@(AV{A0@A2{AA =A6{@AA =A =AABAAAz{A4@(@@@(@@(@@(@(@@@(@xQ@p@A A<A$A ADAtAAxA AF{A\Ab{An{ADA{A {@A{>>\>\>?!G????@@ @HQ@(AXAAALAAA{@A{A =A =A =AAA =Aj{A(@(@(@p@(@@@@@(@@@@(@@xQ@xQ@(AA A{A(A`AAA =AAA =A =A`A*{A AA(>>>\>>?@??У?У?У?@0@P@(AZ{AAA`A =A =A @A0A =AA =A =AADA@@@hQ@@(AA,A AA@@@(@@@@@p@(AA{AAV{A =AAAAA =AAAHA2{A,A.{>>>>??aG???У?У@Q@(Q@hQA{A =A{A*{A`A =A~{A@AHAA =A =AA8A{@@@p?@(@@@@(@(A\A*{@@(@@(@@@(@A AA&{AJ{AABBA =A =A =AAtAJ{A>{AH>>>???У???@@0@`A AXA{A{A`A =Ar{A{AA@AtAAAA{@@@p?@(@@(@A{AAAAA~{A@(@(@(A {A{@@(A{A4AHAA =BB$BAAAA =Av{AHAb{>>??!G??@??@Q@@@xQA&{AR{A AAPAA =A A {A>{AN{A =A =A"{@(@@hQ@(@p@@(AAV{A`A>{A(A{A =AA =A{@@@A@@(A{A(A>{AA =A =BBA =A =AA =A =ATAp??@?!G??@@?@Q@`@A.{ATA@(AB{AAxA{A{A*{A(AlAB{@@(@p@hQ@ @(@(AAr{AAj{AXA@@(A{AA@@(@@@(@(A"{A{A6{AA =A =B BAA =A =A =AAXAj{?!G?@?@?aG?@Q@@@Q@ @@(A0A8@@(AJ{A =Aj{A{A{AAAPA(@(@@p@@xQ@A AXAAAv{A{@0?@@@(AR{A0@@(@@(@(A"{AA6{A =AA =BBBAA =A =AAtAj{?!G?!G?@?aG?@@@Q@@(Q@xQ@(A:{A6{@@(A<AAf{AA{AAA6{A@(@(@?@(AAXAAAA8@?>\?@(A>{@(@xQ@(@(@A2{AA8A =AA =BBB AAAA =Aj{A`??@?@?@?@Q@Q@Q@@@hQ@(AA6{A@A8A =A =AAA{@(A@@@(@@@(A"{AAAA =A{@Q>\@QA{@(@(@(@@(A>{A{A>{A =A =ABBBA =A =A =AAhAx?@?@?aG?@8Q@0@ ??@P@@(AA{@A&{A =A =A A@@(A {@(@(@xQ?У@(Q@(A2{AA =A =A =A{?@@(@(@`@AA{ALAAN{A =AA =BBAA =A =A =A =A^{A>??@???@0@8Q@Q?У?@P@(@(@@(@A{A =AA {A@(@(@(@(@?У?@ @A,A =AA =AA ?aG>@(Q@(@(@8Q@(A{A2{ADA"{Af{A =ABBBA =A =A =AAAtA>?!G?@???@ @0@Q??@`@@@A{A{AA`AA&{@(@(@@@(@(?У?@ @A&{A =A =A =AAP?>\?aG@(@@XQ@0@(A{A`A:{A:{AAA =BB BAA =AA =AA =A>???@??У@@@0@HQ@??@@@(@(@AA AALAA`A{@@@@(???@@(AA\AA =AAn{@?@?@@HQ@@(@ @hQAA6{Ar{A2{Aj{AAA =BBBA =ABAAAA>\??!G?@??@Q@Q@8Q@p@??@ @xQ@@(AAA {A,AA =A@@@@?@Q@Q@Q@AA2{Af{A =AAz{@(@P?@0@@@@@ @A2{A =A\APAAA =A =BA =BABA =AA`AA?!G??@@(Q@HQ@HQ@XQ@ ??@Q@p@(@A{A{A{AAb{AAD@(@(@(@?@Q@ @(Q@P@(A{A*{ADA`AR{A{@@p@@@@Q@(Q@A6{A =A =AXAAAA =B ABBA =BA =A =AV{AA??aG?У?@Q@HQ@hQ@HQ@P@@@??@@@@(A{A{AA{ALAA =@(@(@@@?@8Q@@@0@(AA A&{A{@(@@@p@Q@@HQ@@AxAAAb{A =A =A =AABAB ABBA =A =A =AA??!G?aG??У@@8Q@hQ@HQ@P@hQ@??У@(Q@@(A {A{A{A{A2{ATA|A8@@@(@?@ @P@P@HQ@@A A{@@@@(A{A {AB{A =A =AA =Af{A =A =A =A =AAA =BB A =BA =AA =A =A =A>\??@????@(Q@HQ@0@P@@0??У@@xQ@(A{A@A{A&{A8AZ{Aj{A@@(@@@Q@0@hQ@@@@@@(@@@@(AA{A =AAA =A =AA =A =A =AA =A =AA =BBB%BAA =A =A =AB>\??????@ @HQ@`@P@@p??@@XQ@(@@(@(A{A{A A:{A^{A<@@@(@@Q@@HQ@hQ@@@0@@(@@@(@(@@@@(A =A =AAA =A =A =AA =ABBB%B9B A =A =A =AAB>\?????У@@ @XQ@`@HQ@hQ@(@ ?У?@@@(A{A@@AA A{A8A^{A@@(@@Q@@@P@`@0@8Q@xQ@(@@@(@(@(@(AxAA =A =AAAAAA =A =BB2BVB,A =A =AAABB>\>\????У?@@8Q@xQ@@@@@0?У?@8Q@AA{@(@A{A{AAAB{AlA@(@(@(@@@@HQ@@@(Q@8Q@@@@(@(@(A =A =AAApAtAr{AhAAABB@B\B,AA@(A{A.{BBA =>\>\>\>??@??У@@0@hQ@p@(@(@(@@P?У?@Q@@(AA@@(A{@(AA$AdAdAA{@@(@@@(Q@XQ@p@Q@@ @@@`@pAF{ATAR{AF{A@AB{A:{AN{AAA =B B0BABA =A =@AA8Aj{B1BA>\>>\>\?!G??@0@@@(@(@A{@@XQ?У?@Q@(@(@(@(A{@@(@(AAA:{AxAb{A.{A{@@@ @8Q@XQ@(@@`@Q@?@(A{AAA{AAAZ{AA =A =BB BA =AA =@(A{A>{AdABA =A>\>\>\>\>\???@0@(@@@(@(@A{@(@?@Q@XQ@@(@A{@@A@A{A&{AN{Av{Av{AHA"{A{@(A A{A&{AN{A`@(A@A A(A"{A{A{A A,AA =AB B BAA =AA =AA AHAXAAlA:{AAr{?>\?>\?>\??aG?@ @@@@(A@(AA {@(@8Q?@Q@0@hQ@(@(@(@@(@AAA{A6{A`A =AAb{A<AA{A{AA*{A<Af{A|A|A =A =A|AxAABB!BABAA =A =AAA{A:{ATAxAA`A8AAA:{?!G????>\?!G?@Q@@@hQ@A{A A6{A,A(@@Q?@ @HQ@xQ@@(@@(@@AA{A{AB{An{A =AAAhA`A{AF{AB{@(@@@(@(@@@(A*{AN{AXAhAZ{AA {A {@(AA*{A@AF{Ar{AAr{ADA =AAhAF{?!G?!G?!G??!G?>\?aG?У@ @XQ@(A {AF{A =AdAdA @@??@(Q@hQ@(A@@(@@(AA{A{A&{AR{A@(@AA{@(A{@@@(AA{A$A&{A$A{A&{A.{A:{A6{A{AAA A"{A8AN{AdAz{AAtAB{A =A =AlAr{A?!G?@?@??!G?!G>\?@Q@P@(@(A<A =A =AAz{@@Q?@Q@`@@A {@@@(AA(A{AA(AlA =@(A{AA{AAAA{A"{A@A4AN{AZ{Ab{A0AHA(AAA {A{A0A@A^{An{Ar{AxAj{AN{AA =AAz{A =A?!G?aG?aG?@?!G?@>?@?@@@@(AAB BAA0@@?У@Q@@@A@@(@(A{A.{AA{A$Aj{@@AA{A$A$A"{A(A0AR{AJ{An{A =AtAtAJ{A$A{A$A2{ADAR{AdAhApApAR{AHA =A =A =AAAA =?aG????@?@>\??@ @@@(A(A =BRAAA @@??@0@@(A{A{@(@(@(A"{AB{A$A{AAP@@(A{A{A{A{A6{ALAXA =A =AA =A =AA =A|AAf{Aj{ApAn{Ab{Ar{ATA8A =AA =A =A =A =A =A =??????@??aG?@XQ@(@p@(A0AB~AA@(@`@Q?@@`@A{A{@@(A{A,A@A&{A{A{A@@@(A{AA"{A0A2{ATAAA =AAAA =A =A =AAA =A =ApALA0AAAdAAA =AAA =??????aG?@?!G?@?@(Q@`@(@A{A =B#BBA =A{@`??@@XQ@@(A {@@AADAF{A*{A"{A4AV{Ab{@@@(A{A{A0A\AAAA =A =AA =A =A =AAdATAV{A4A{A =AA =AA =A =A =AA????????>\>\??!G??@@HQ@P@(@(A2{A =BSBB1AA.{@(Q??У@@XQ@@(@(@@AATAb{AN{A*{A4A*{A<AV{@@(@AA.{A:{APAR{AdAF{ADA:{A<AZ{AHA:{AA {A =AAA =A =AAA =A =AA =?aG????????>>?!G?@?!G???@@HQ@XQ@(AA0A =BSBBnA =A@?У??@hQ@@@(@(@A*{Ar{AAlA{AA{AA&{A*{@(@(@(@(AAAAA*{A{A{A{@@AA =A =AA =AA =A =AAAAA?aG??@@Q????@>\>?@??aG?aG?У??@@8Q@(A&{@A{ATABBBA6{@`??@Q@@@XQ@@(@A{A4AAAlA6{A@(@(@@A{A{@@@(@(@@(@(@@(A{A =A =AAAAA =A =AA =AA =A =A?aG???@@????>?????У?У?@@XQ@A@@(A"{ABBBBA@(???У?@ @hQ@(@(@A>{AAAf{A8A{>@@@@(A A@`A<AN{AV{Aj{A =AAA =AA =A~{A =A =A =AA =A =AAA =A =?!G???У@@??У?У?>\>???!G???@@@@(Q@hQ@(@(@(@(AABaBBB @??aG??@@ @HQ@(@(A(AdAz{A =AR{A*{A,A A@@@(A A,AF{AF{A<AJ{AA =A =A|A =A =AAA =A =A =AAtAr{AdAR{??aG???У?@@ @`??aG>>?!G?!G????@8Q@@@ @@0@0@hQ@(@(@ALB BBBCAR{@HQ?????@@`@(@A"{ApAlA^{A^{ADA>{A.{A{AA.{AA{A:{AJ{AJ{AAxApAxA|A~{AA =A =AAAR{AJ{AHA>{A*{?!G????@@XQ@@HQ?У?aG>>?!G?@@?@Q@`@P@?У@@ @(Q@p@p@@A =BVBBOAA @??aG???@@8Q@hQ@(A{A(AJ{AXAZ{AJ{AJ{ADA,AAAA"{AB{APAJ{Aj{AxAhA =AAA\A<A8A:{A2{A0A&{A8>\?@??У?У@@0@(@(@ ?>\>?!G?@Q@(Q@ @Q@Q???@ @8Q@@@8Q@HQ@p@AB1BBbB A =@@Q?aG???@(Q@HQ@@(@A A2{AB{ADA<A4AA{A A A:{ADAN{ApAxAZ{AV{ALA6{A8A6{A.{A2{A2{A0A&{A6{?!G????@@xQ@@?>\>???@0@0?@@Q@??@Q@@@@hQ@(Q@P@@Ab{B-BB]B AA:{@???@Q@8Q@p@(@@(AA A$AAA{A{A$AA {A {A,A A{A{A(A:{A>{A(A"{A{A0A(A{Av{??aG???@@8Q@@@XQ?>\?!G?aG?????@@@Q@0@Q@Q@@@(@@xQ@XQ@@@P@(Af{A =AA =A =AAA(@p?У@@(Q@XQ@(@@(@(A{A A {A{AA&{AA{AA{A{AA$A A{A{A AA"{A(A&{AJ{AP?!G?@???@Q@@@(@(@??!G?aG????У@?@@?@@@Q@xQ@(@(@@p@p@XQ@P@(@(@(A@@(@(@hQ?У@Q?@Q@8Q@xQ@(@(@@@(@AA{AA{AAA{AA{A@(A {A{A{A{A*{A:{A4A =>\??@????@Q@@@(Q?!G??@????????????@Q@ @P@@(@(@(@(@xQ@XQ@@@@(@(@(@@xQ@(Q?????@@0@`@@@(@(@(A@@(@(@A AA {AAA{A@(@AAXA =Al???!G?@??У?@@ ???@????????????@@(Q@@(@@A&{@@(@@@(Q@ @@@@A@(@@??aG?aG???@Q@0@XQ@xQ@(@@@(@@@@(@@@(@(@A {A*{ATAr{A.{@(>\??!G?>\>\?@??@@Q??!G??????@?У@ @???@@ @p@(@(@A{A,A`AR{A@A @(@@@@p@p@@(@HQ@ ??У?aG??@@Q@8Q@`@p@@(@(@(@@@@@(A{A$APAdA2{@(@@xQ>\??!G?>\??@0?!G????????У?@Q?У???У?@8Q@HQ@(@@(@AF{A =A =AA =AAr{A{A6{A{@@(@0@ @@ ?@@ ??@Q@XQ@(@(@@(@@@@(@(A {A(A$A{@@(@p@ ?>\?!G??>\>\?У@????У@@?У???У???У@@ @@@p@@(A A{A Az{ABB.BBBBBA =A =AAAN{A =Ar{A,A<A(AR{A0An{APAZ{AA @(@(A$AB{A@(@@@P@(Q???!G?!G?>?@??У@@@?@Q??У???@Q@@@(@(@(AA A {A{A AA =BBOBBBB|B^BBMB.BBB BBA =A =A =AAlA{@(A,AA>{A4A@@`@@@????@?>>?@??У@Q@Q@0@Q@Q@(Q@?У?У?@@HQ@(@@(@(@A{A$@@(@@(A4A{A$A<@APA{A{A6{Aj{A2{A =A =AJ{AB{A<A"{A{@(@@@(@P@ @@??У??!G?!G>>>?@????@Q???@??У@@(Q@XQ@@@AA{A{@(@@@@@@HQ@8Q@@(@(@@(A{@(@(@@(@@(@s @@(??Q??Q????p>B\??!G>\>>>>?aG????@@Q@(Q@??У@@8Q@`@xQ@@(@@(A(AA@A:{ALA{@@(@xQ@p@HQ@Q??Q@@ @@@8Q@HQ@Q??0?0??\)>>>>>B\?!G?!G>\>>>>?!G?@?aG???У@Q@@@(Q??@@(Q@@@hQ@(@@AA {A{A"{A2{A6{A$A{@(@(@(@hQ@P?Q@????У???!G???@?aG??У@Q@8Q@Q?@@ @8Q@P@(@@(@(AA{A:{AV{A*{A{APA8A,A&{A{@@@@(@hQ@(Q????p?O\)?>\??aG???@ @Q@Q@@(Q@hQ@@`@(@A {A$AZ{A.{A{A{A{A{A@(@(@@@(@HQ@XQ@@@0@(Q??У?>\>\???@???@(Q@ ?@ @P@hQ@xQ@@(A"{AAAA =AAhAn{AJ{A"{A$@(@(@(@(@(@HQ@@?У??aG?aG??aG??@@@XQ@xQ@@(@(AADA|A =AA =AA =Ar{A<A"{@AA@@@@(Q@0??У??????!G??@Q@@@(@@(@(A{A&{AF{AA =AAADA4@@(@(@(@@(@(@XQ@(Q@Q????У??!G?@??@Q@(Q@P@P@XQ@(@(A"{Ab{AV{AN{ADA:{A @(@@@(@@HQ@8Q@Q???@?@`@?@?@????@ @@AA{A"{A4A{A AA@@@(@8Q@P@8Q@Q@??aG?!G?@8Q@Q?@??@?O\)??У@XQ@(@@(@(@(A{A{AAA{@(@@@l(@@XQ@@@ ??У?Q??????!G??\)?@?Q?@@`@(@(@(@@A@(@@(@(@@(@(@@@@@?Q?O\)?!G?????>\?\)?@?@@8Q@P@@@@(@(@(@(@(@@@xQ@8Q@0@Q??!G?aG???!G??aG?!G?aG?!G>G?\)??Q@@HQ@@@@(@@8Q@XQ@p@8Q@Q@Q@?aG?0?\)??@???aG?!G??aG??aG?!G???0?@?@@@@XQ@`??Q@@(@HQ@P@HQ@ @8Q?Q???O\)?!G??!G?@?@?aG??aG??@??@??@?????@Q@`@(@HQ@`@@@(Q?Ǯ?aG?aG??aG???????У?У@???O\)????????p?@???У????@>G>\?@??@Q@HQ@(Q??@???aG?????Q?aG???aG????@?!G???@?У?@Q?@HQ@@?aG>G>\?@?!G?!G????@@@??@????@??@@@@??У?@?!G?aG??У@Q@ ?????>\?aG????@@@?????@????@@Q????!G>\???aG?aG??@@@@Q??aG>\>\?????aG??aG>?aG????>\?!G>\>>\??!G?!G?!G??????aG?>\>\???!G?@?aG?@?!G?!G?!G>\>\>?aG?0?>>>>\>G>\??@?????????????????@Q@@P@xQ@@@(@@@(@@(@0@P????????>\>\>\>>>\???!G?@?@?aG????@???У?У???????????aG???@(Q@p@@(@@@@@@@XQ@`@hQ@`@ ??У??????!G?!G?>\>>\>\>\??!G?@????>\??@????У?У???????aG??@?@?@?@Q@P@xQ@(@@(@(@@@@(@(@@@p@xQ@XQ@ @Q????aG??@?@?!G?>>>\???@?aG??>\???@?aG??????У????aG?!G?@?>\?@??У@ @@@Q@@@hQ@P@XQ@(@(@@(@xQ@@xQ@(@HQ@@@8Q@0@?У??????aG?>\>>>>>??!G?aG?>>\??!G?@?aG??????????aG?@??!G???@hQ@HQ@`@hQ@XQ@8Q@@@(@@(@(@(@@(@(@HQ@hQ@(Q@(Q@(Q@Q??????aG?!G???>\>\>\>\?!G?>\>\>>\>\?@?@?aG???????????!G?>\??aG???@`@XQ@@@`@@@@@@(@(@@@@@p@P@hQ@HQ@0@0@??У?????aG?@?@?@?!G?!G?>\??aG>\>\>\?>\??@?@?@?@?aG???aG?@?aG?aG??@?!G>\??@?@?aG??@ @@@`@(@(@(@@(@@(@(@(@@@(@@hQ@hQ@@@(Q@Q??У?У?@?У??????aG?aG?!G?!G>\?!G>\>?!G>\>\?@?@?!G??!G?aG??aG?!G?@?!G?!G?!G>\???!G?!G???@@Q@@(@(@(@@@@@(A{@@@@@xQ@@@Q@?У?@@@@??У???????aG?aG?!G>\?>\>\>\?>\>\??!G?!G??!G?aG???@??>\>\>\????!G?aG??У@ @8Q@@(Q@XQ@@(@@@@@@(@@(@@(@XQ@?????@?@???????????aG?>\?>\>>\>\>???>\??@?@?@?@>\>\>\???>\?!G???@@hQ@hQ@@@HQ@(@(@@(@(@(@hQ@p@XQ@(@`@8Q@@@Q@??@Q@@Q@Q@@@Q@Q??У?????aG?!G>\>\>\>\>\>\>\>\>\??!G?!G?>\>\>\>\>\??!G??@ @XQ@0@ @P@(@@@@(@@p@`@(@`@XQ@HQ@0@(Q@(Q@(Q@@@Q@@@@@ @8Q@@@XQ@P@(Q@??????>\>\>\>\>>\>\??!G>\>\>\?>\??!G?aG???У@8Q@(@`@hQ@(@(@hQ@(@@(@(@(@@(@P@@@`@8Q@8Q@@@Q@Q@Q@@Q@HQ@p@@(@xQ@`@8Q@@Q@@??У>>\>>\>>\?>\?>\>\>\??>\????@@ @XQ@@(@(@@(@(@(AA@@@(@(@(@(@XQ@HQ@HQ@Q@Q@@@ @(Q@XQ@(@(@(@@(@p@@@(Q@@@Q@>\>>>>\>\>\??>\>\??@???@@XQ@HQ@(@@@@@(@(A A@@@@@p@`@p@XQ@HQ@ @Q@Q@Q@(Q@8Q@@@hQ@@(@@@(@@HQ@(Q@Q@Q@Q>\>>\?!G?@???!G???@@@(@(@(@@@(@(@@@(@@(@@@xQ@XQ@XQ@XQ@XQ@HQ@P@(Q@@Q@(Q@0@P@xQ@@@(@(@(@hQ@8Q@Q@Q@>>>\?!G?!G???!G?aG?aG?@Q@@@hQ@p@@(@(@A@@(@@@@(@@(@@@@p@@@xQ@hQ@HQ@ @Q@Q@(Q@@@hQ@(@@@@(@p@@@(Q@ @ >>\?!G?aG?@?@?@?@??@@HQ@p@@(@@(@@(@@@@@@@@(@(@(@(@(@@@@@XQ@P@(Q@ @@ @8Q@@@hQ@@(@@(@@p@@@(Q@(Q>>\>?????aG?aG?aG??@ @p@xQ@@AA{@(@@(@@@(@@(@@(@@(A@@(@@@(@@(@XQ@0@@Q@Q@0@P@@(@@@(@@XQ@8Q@8Q>\>>\?aG????????@P@p@(@(@(A@(@(@@(@(@(@(@(@(@@(AA$A{AA@@(@@(@@@P@Q@Q@@Q@P@p@@(@(@@(@p@@@@>>\?@?????????У@`@@A A0A@@(@`@@p@xQ@(@(@(AA$A8AJ{A`AV{AF{A2{A{A{@AA {@(@`@(Q@Q@(Q@@@hQ@(@@(@@@xQ@P@@>>??????>?У??У@@(A {A4A>{A @(@@@hQ@`@xQ@@(@(AAAA2{AV{AlA =A =AAr{AXAAAA@(@@Q@Q@HQ@p@@@@(@(@@`@@>>?@??????@@Q@@@@(A(ALA$@(@(@P@`@@@(@(@A {A{AA{@A AA{AJ{A =AA =AtA$A@A@(@@(Q@HQ@hQ@@(@@@(@(@@P>>?!G?aG?????@@ @@@8Q@xQA{Af{AB{@@@(@@@@@(@A {A{A@@@(AA{A{AA8Av{AA =A =A@@A{@(@@`@(@(@@@(@(@@@`>>?aG??????@Q@`@(@@A{AJ{A {@@(@(@@(@@(A A{A{AA{A"{A$A*{A,A(A$A"{A{A{ADA =AAA$@(A {A@@(@(@(@@@@(@@(@>>??@??У??У?@@@@@@(A =AT@(@(@@(@(A{AA(A&{A(A&{A*{A2{A8A>{A6{A4A2{AJ{AXALA.{A&{ALAAAA{AA@(@@(@@(A{@(@(@(@(@>>?aG??У?У??@Q@@@xQ@(@@(@AtA,A{@(AAA{A(A@A:{A6{A2{A0A6{A>{AF{AXAtAdA^{AlAr{A\AB{A.{AA\A =A =AXA{A @@(@@(@@(A{@@@(@>>\??У?У??@@0@XQ@(@@A^{Af{AN{A{A&{A&{A(AF{AXAtAZ{AJ{ALA>{A AA A{A(A>{ATA =AAz{AR{A>{A6{AB{AdAr{A =A =Af{A*{A{@@(@@@(A{A@(@(@?!G????@Q@ @HQ@hQ@@A6{Az{AAz{APA`Ab{AlA =AAAhAb{A<A(A@(@@(@@(A{A\AA =A =AJ{A:{AhA =AA =AAATA{A{@(@@@(AA@@(@?aG??У?У@@(Q@XQ@xQ@xQ@AAJ{A =A`APAN{A =ApA =AA =A =A =Aj{AV{A:{A{@@(@@@@(@(A{Af{A =AAr{Ar{AA =AA =A =A =A*{@(@@(@(@(@(AA{@@>\??У?У?@Q@@@hQ@p@(@(AAhA~{A{ATAPA =A =AA =AAAdApA^{AHA,A@(@(@@(@xQ@(@(A {A6{A =A =AAA =A =AAAA8@@A{@@(AA"{A {@@(?!G???@Q@8Q@XQ@p@p@@AA|A<@A,AdA =AA =ApAdA^{Av{A =A^{A>{A*{A$AA@@@@P@XQ@@A{A =AAA =AA =AAAr{A@(AA @(A A{A(A{@(?@???У@Q@HQ@xQ@(@@(@(A*{APA"{A{A$Av{AtAtAF{A4ATAf{A~{AlAF{A A{AAA{A A@@p@(Q@@@(@(AA =AA =AtA =A =AA =AR{A{A AA{A {AA&{A>{@(??У??У@ @XQ@hQ@(@@@(A,A6{A*{AA<AAv{A>{AADAZ{Av{AhAHA>{A8A>{A@ALADA<A0A{@(@`@@P@@A&{AA =AA|A =AAA^{A,AA.{AA"{AB{AR{A =@(????У?У@@@hQ@p@(@@A{A*{ALA:{AAF{A =AhA(A(AB{A^{AdAF{A\AAA =AA =AxAr{ATALA*{@@0@Q@`@(@A0A =A =AtAA =AAJ{A8A<A8AA2{Aj{Av{AAx>\?>\????@HQ@`@p@(@(@(AA<A^{A>{AA8AXA@A*{AXAdAhA`Aj{A =AA =AA =AAAAA =Af{A{@(@@(Q@hQ@@(AXAAn{AAAAAdAhAj{A&{A<AxAAA>\>\>\>\>\????@0@0@p@(@@A{AF{A^{A0AAA(A(A8AXAV{AJ{ATA =A =AA =A =AAA =An{Aj{A =AAZ{@@Q@@HQ@p@(A.{A =A =A~{AA =A =AA =AAN{AN{Az{AAA???>\>\>???У??@Q@Q@p@(@@AAHAV{A A{@(A A,AXA^{A:{A(A:{AxAb{A =AB ABAAAb{AR{A =AA2{@xQ?@0@P@AA`A =A =AAA =A =A =AA =A =AAA =A?????!G??!G??У??У@Q@@P@@@AALAV{A{@@(AA,AHA0A{@(A{AdAAB'B!BB BBA =AN{Ab{A =Ax@@@Q@P@`A{AJ{AA =AAAAAA =A =A =AA =A =A>\???@?@?>\???У??У@@Q@XQ@@@A"{AdAPA{@@(A{A0A*{A"{A @(A>{AA =BB0AA =A =Aj{A =A =A<A{ApAz{A{@(Q@@P@PAA6{AAAAA =A =AA =A =A =BAAA =>??@?aG?@?!G??!G?????@@0@@(@(A{AR{A2{A@(@(AA4AA{A{A{AxABBAA =ALA@@(A{@(@(AA8A @`?@@@PA{A2{AAA =AA =A =AAA =A =BBB A =>??@?@??aG?@?!G?>\?@??????@ @xQ@@A"{ADA$@@@(AAAA A{A,A =AB!B AA~{A{?У?!G?aG@@xQ@@(AA@xQ?@0@HQ@A2{ApAAA =AA =AAA =A =B BBA>>\?@?aG????aG??!G???aG???@Q@XQ@(@A{AB{A@@(@(@A{@(A{A&{AJ{A =B B"BAxA{@??@ @(AA{@`?@Q@P@A6{Aj{AA =A =A =AA =AAA =B B%B A =>\?@?aG????@??>\??@?aG?!G???@ @P@@(A{A4A{@(@@(@@@AA2{AtABB4BA^{@xQ?!G?@?@?У@P@(@(@0?@@hQAA<Ar{A =A =A =A =AA =A =AA =BBB B >>\?aG?aG????@?@?>\??!G?@?!G?@??@Q@XQ@xQ@A{A6{A@@@(@@@A {A8AZ{ABB7B0Ax@XQ@(@xQ??!G?aG@P@(@(@Q?@Q@A {A8AlAA =AAA =A =AA =ABBBB>>\?aG?aG?@???@?>\>\??!G??@??@@P@`@@(A,A{@(@(@@(@@AA4A\AB B/BCA =@@(@@?aG@(@@(??У@0@(A{A,AdAAA =A =AAA =A =A =BBB B!>\>\???У@Q???aG?@?!G?>\???@??@Q@8Q@@@(@AA{@@@@(@@A{A4A*{A =BB$B=BA@(@@@xQ?@(@(@0?@@XQ@A{A4AtAAAA =A =AA =A =A =B B BB">\>?aG??@Q@????@?!G?>\>\??!G??@@@0@(@AA{@(@(@@@@(A{A6{A{A =A =BB=B,A@@(@@(?@(@@(??У@@A{AATA =A =AA =A =A =A =A =AABBBB ?>?!G???@?????aG?!G??>\?!G?aG??У?@@`@(A A {@@(@@(@@@(A8A{A{AB B8BNB A =AN{@@@(Q@(@@(??@@XQ@AA:{AhAAAAApAAAA =AA =A =B A?>>\?aG??@Q@??У??aG?aG?!G??@????@0@(A{A{@(@(@@@(@@(A(AXAA$AB BWBUB6BA =A\AA{@@?У@@8Q@A{A(AJ{Az{A =AAAtA|AA =A =A =A =A =AA =A =?>>?!G??@Q@Q??????@???@????@@(@A"{@@(@(@@@AA,AN{AhA{AADAA =B-A =A =A =A@@@@(Q@8Q@A{A,A.{AlAA =A =A =Aj{AA =A =A =A =A =A =AA =A =?!G>\??aG??У@Q@ ?@Q?У?????aG?????@`@(A{@(@@@@(@(@A:{AXA^{A`At@@(@A@A{@@@@ @0@HQ@xQ@A*{A,A{AN{A~{A =AAAlA =AA =A =AAA =AAAA =?!G>\>\?@??@Q@HQ@ @@???@???!G?@????@(Q@@(@@@@@@@A{AJ{A^{AR{AN{Af{AZ{A@A @(@@@8Q@@@P@xQ@A4A$A&{A*{AF{An{AAA =ApAA =AAAAA =A =A =A =AAh??>\?!G?aG?@Q@`@`?@Q@???>\??!G?aG???@Q@xQ@(@(@@(@@(@@(A{A>{Az{A|APAHA>{A@A&{A{@(@(@@(@A(A"{A&{A<AF{Av{A =A =A =AlAtAA =AA =A =A =A =AA =A =Az{An{???!G?aG?aG?@HQ@hQ@Q@ @8Q???@?>\>\?!G?@?aG?aG??@P@(@(@@(@p@(@(@A{A8AlA =A|AN{A2{A6{A(A"{A{A@(@AA(A.{A:{AR{AAA =AAr{ApA =A =A =AtA =A =A =BA =A =Az{AZ{Ad?>\??@?@?@@8Q@@@ @p@HQ???>\?!G?@?aG?@?aG?@0@(@@@(@(@@(@(A{ALAdA =A =AtA`ADA4A*{AA A.{A:{ALAZ{Av{A =A =AA =A =Av{AA =AAA|A~{A =A =A =AAAAz{Af{AL?>\??!G?@?@??@@8Q@XQ@(???>\>\??!G?@?!G?@??@xQ@@@(@@(@@A{A>{Az{A =A =AAAv{AHA6{A,AHALA\AxA =AA =AA =ApA =AA =AA =Az{A|A =AA =A =AAA =A =Aj{A??>\??!G?!G?!G??У@@p@@0???!G>\>\?!G?!G??!G?aG?@0@(@(@(@(@@(@A{A0Af{AAAA6{AA =Az{AhApAr{A|AA =AAAA =A =A =A =AAAAtA =A =A =AAA =AA =AA6{A{>\?>\???!G?aG?aG?@@8Q@@@??>\>\?????@?@@@@@@@(@@(AAPAA =A =A =A =AAAAA =A =A =A =A =AAA =A =AAA =Av{AZ{A`AA =A =A =A =AAA =APAA >\?>\>\??@?aG?aG?aG?У@Q@HQ@(@(@@Q?@>\>\?>\??!G?aG?@p@(@A{@(@(@@(A{A2{ApA =A =AA =BA =AAA =AB*A =AAAA =A =A =A =AhATAb{A =A =Az{Av{AdA =A =A =A^{A AA{>\?>\>\?!G?@?aG?aG?@?@Q@ @p@(?@ ?У>\>\>\>\>\??@?@P@@A {A@(@(@A{A ATA =A =AABBAA =AA =A =AAA =AAA =AAtAHA~{AA =ApALADAtAA =A =A:{A(A,A{>\?>\>>\?>\??aG??@?aG??@Q@P@(@?У??>>\>\>\>\?!G?@Q@(@(AAA@(AAA&{AB{AxA =A =ABBBBBBA =AAA =AA =AAAAA =A =AV{A8AHAAA =A =A`A6{ADAB{A>\>\>\>\>>\?!G?!G?aG???????@HQ@(?У??aG>\>\>\>??aG?@`@AA{A AAAAF{AV{ApAAA =AA =AB BA =A =A =AAZ{AlAf{A~{A =A =A =AA0A,Ab{A =AA =AAATA>{AR{A.{A6{>\>\>\>\>\>\>\?aG??aG???????У?@ @XQ???!G>\>>\>\>\?!G?@0@A {A AAAA*{A:{AlA|AA =AA =A =A =ABAAA =AAAAAA =A|A~{A\ALA =AA =A =AAAhA|AZ{A.{A(AF{>\>\>\>\>\>\>\>\?@????@@??????@(Q@@Q?>>>\>\??aG?@XQ@AA A A A,APAz{AAAA =A =A =AA =A =BBB BBA =A =AAAR{AXA =A =AA =A =AAA|AAlA8A*{A>{A >\>\>\?>\>\??!G?@????У@@XQ@@P??У????@@?У>>>\>\>\??@Q@@AAA AA2{Ar{AAA =A =A =AABA =B BBBBB A =AAAAAAAAAAAtAn{AXA>{AAA@?>\??@??@?@hQ@Q@Q@hQA@??У????aG?@?>?!G?@8Q@@(A{AA{A2{AN{AA =AA =A =A =A =A =BB BBB2BBB BBB BAAA =A =AA8AF{ADA4A{@A@(@?@??aG?@Q@Q@HQ@HQ@(Ah@@ @????aG??>\??@@p@AA A*{A@A`A =AA =A =AAA =A =A =A =ABBB&B"B*B*B'BB A =AA =Aj{A4AA A@(@(@@(@AB{>>\?!G????@8Q@(@@AA@(@Q@?????????@@@(@@A0A*{A>{A\ApAA =AA =A =AA =A =A =BBBBBBB A =AA =AdA4A{A{A@(@@@@@(AB>>\>?!G?????У@P@(@(@hQA.{A =@(@????????@?@Q@hQ@@@(A(A*{A A(AB{AlAtAv{A =A =A =AAA =AAAA =AA =AAz{A*{AAA{@(@@(@p@@(@AB6BB>>???aG?????@ @(@@(Aj{A =@@Q?У???@????@@ @@@@(A(A{@@AA{?@A2{AhAA =A =AAAA =AA =AXA:{A$AA@(@@(@(@@(AApB B;BB>>???!G??????@hQ@@A{A8AV{@xQ???@?@?@?>\>\?@?@(Q@@@hQ@@A{A{A{@@@@A A$A8AZ{AlAAAv{A\AHALA6{A6{A6{A@@(@(@@AATA =B#BZBBBB>>?>?!G>?@??????@hQ@(A*{AJ{A(A2{@?У?aG?@?@?aG?@??aG@@P@p@xQ@@@AA {@(@(A{AAA A*{A<AXA =A\AHAb{AdAF{Af{ALADA,A$@(A A:{A =A =BB;BeBxB"A =>>>?!G????У?????@8Q@A{A`AtA.{@?У?aG?aG?aG??aG??@Q@xQ@(@@@(@A{A{AAA"{A$A,A4AHAXA^{AB{A,A(A*{AJ{AF{ADAN{A`Az{AAAA =B B+BJB<A =Ab{A>>??!G??@?@?@???@Q@A0A =AZ{A8@(@????aG?@??@@xQ@(@@(@(@(AAA{A{A{A2{A&{A*{A.{A AAA{A*{AF{AZ{A~{AAA =A =B!BB B BAA|A(AA???!G??@?????У@(Q@A&{AA =AH@@(Q??aG?!G????@?@?aG?@Q@XQ@(@(@@(AAA A{AAAAA A AA*{A:{Ar{A =A =AAA =BB#B&B A =A =A\A{A{AA A.{>\?????У@????@Q@0@(AALAb{A$@(@xQ??У???????!G?@@HQ@(@@(@(@(@AA{A AAA {A {A"{AV{AhAAAAf{AAAA =BAAAN{A AA{A&{A,A(A"{??!G?@????У?@?@Q@ @p@@(A4ApAz{AT@(@hQ@ ??????@@HQ@XQ@@@(@(@(AA{A {AA A{AAA{A&{AB{Af{AA =AA =A =AAAAR{A{AAA{AAAA{A{?!G??aG?aG??У?У@@@@0@(Q@hQ@(@(AA,AxAtAN{A{@(@XQ@???@?aG?@@@HQ@p@(@(A{A{A{A{A{A{A A{A{A{A{A*{ADAhAxAxAv{AxAj{ALA(A{AA@@@(@A@(@??aG??@?aG???У@@Q@Q?@Q@@@(@(@(AA\A|A~{A>{A{@(@`@Q?@?!G?@@(Q@P@(@(@A{A {A {A{AA{@(@(@(AAA4A0A6{A8A8A(A&{@@@@(@@(@@@@??!G?!G?@????@P@Q??У@@8Q@(@@@A{A A8A|AA<A{@@Q?aG?@ @`@8Q@P@@(@(@@(@@(@(@@(@@@(A"{A&{A0A"{A @@@@@@@@@(@(@???@?aG????????@@@hQ@@@@(@A*{Av{A =AAA,@(@(@XQ??У??@Q@(Q@HQ@hQ@@(@(@(@(@(@@@(@@@(@@@(@@(@@(@(@(@@@(@(@(?!G?@?aG?????????@HQ@@(@@(AA{A8AABAAAA<A{@(@@(@(@@@p@p@@@@(@(@(@@@(@@(@(@(@(@(@(@P@@@(@(@@(@(@(?!G???!G?!G??@????????@@@@p@(@(A{A$ATAV{AA =A =A =A =A =AAtA:{A@@@(@(@@@(@@(@@(@@@(@(@(@(@(@@(@@@@(@@@@(??!G?@??>??!G?!G?@?aG?????У?У?У?@@Q@0@(@A&{Ar{AtAAAAA =AA =AAA =A =A =A{A*{A@@@(@@@(@(@(@@(@(@xQ@`@XQ@hQ@p@hQ@HQ@HQ@`@hQ@??!G?aG?@??!G>\????!G?aG?aG?????@??@@Q@0@@(A{A@Av{AAA =AlAz{AdA =Az{Af{AB{@{A{A@(@(@@@(@@(@<(@hQ@ @?Q?Q????@?Q????Q@??!G?aG??@??!G?????!G?aG?aG????@Q?@@Q@0@@@0@8Q@p@@(AF{AAA =A =AlAV{AlADA.{A{@{@@@(@hQ@p@p@8Q@(Q@0???????Q?????????!G?@???@?@??@???!G?@?@?aG????У@@Q@ @ @8Q@@@P@p@@@@(A@(A"{A{AA{AA {A*{A{@@@p@XQ@@HQ@Q????0?0?0?@?!G>\?@????@????aG?!G?@?@?@?aG????У?У?@Q@Q@@@@@(@(@(@(@@@(@A{A@(A@@(@@@@`@0??????aG???aG?@Q@ ??!G?!G?@?aG????У?????У@Q@Q@@@P@XQ@@@@@(@(@@(@(@hQ@ @P@8Q@Q??>\?!G?@????aG?@Q@(Q??!G?@?aG???У??????@@@@@@@XQ@p@P@xQ@XQ@@@@hQ@ @@Q@@@8Q@ @@????>\?!G?@????aG?@(Q@@???@???????@???@ @0@@@ @Q@ @@Q@0@HQ@HQ@@0@@HQ@hQ@ ?У??????@?????@ @8Q??!G?@?aG????????@(Q@HQ@xQ@xQ@xQ@XQ@8Q@HQ@`@XQ@P@(@Q?У????@?aG????@@@Q?aG?!G?!G?!G?!G?@?@?aG?aG?aG????У?У@ @HQ@hQ@@@8Q@P@XQ@@@(@HQ@Q?aG?Q???p?@??!G?!G?!G?@??@Q@ ???aG?@????@?@?aG?aG?@??aG???@@ @P@@(Q@(@xQ@@Q??????@ ?@# ?Q??aG??@???????>\>G>G??aG????@?@0@(Q@8Q@@@@P@Q?@8Q@Q@(Q?Q?Q??У????@??У??aG>\>\?\)???@@?У@@@@@@??@ @@@??p>??!G?@?!G?@???!G?!G?aG?0??@?\)?\)?\)?0?aG?????У@?@@Q@???p?Q????@?!G??!G?@???????@?Q?Q@(Q??Q?У@Q@0@??У?@?aG???aG?p?????>\?@??aG?!G?@?aG?O\)?aG???p??У@@???O\)??@?\)>\>\??!G?@?@?@????O\)>\>\>\???!G?!G>\??!G?0??У??aG?p??@?!G?!G?@?!G?>G?0?p?p???@ @# @Q@P@0@????p??!G???!G?!G?!G?@?aG??????У?????p?p?!G>\>G>\>\?>G>\?aG?!G??>\>\?>\>\>>>>?>>?>>???aG????!G>\?!G?aG?@??aG??aG???>?@?aG?aG?>??>>?@?!G?@?@?aG??!G??@?!G?@?@??p?aG?@?O\)>>?!G???@?!G?!G?!G??>\?!G?@??@????????@>G??>\????@@@Q@@(@(?У????Q?Q?!G>G?\)?\)>\>\???@?Q?@Q@3 @S @# @# @# @# @# @ ?Q??p?0?@>G>\?@??У@@@@???@?!G>\??aG????@Q@0@@@P@@`@`@@xQ@@(@(@@@@@(@@(@@@hQ@@@Q???У???@?!G?!G?!G?!G?@?????aG??@@?У???@?>\??aG???У@@Q@Q@ @Q@(Q@0@0@XQ@@@(@@(@@@(@(@(@@@@p@P@0@??@???aG?!G?!G?@?aG???>\>\??@????????aG?>\>\??@????@@Q?@@Q@@@(Q@@(@(@@(@(@@(@@@(@(@(@hQ@P@Q????У@Q???@?@?@????>\>\???@???????aG?>\>\??!G?@?aG????????@@`@@(@(@@(@(@(@(@@@(@(@(@p@P@Q@Q@Q@??У?@?У??@?@?aG???>\???!G??????aG?@?>\>\??!G?@?@?aG?aG?aG????@Q@p@xQ@(@@(@xQ@@(@(@@@@XQ@@@Q?@@@@Q@?@Q@???@?aG???>\??!G??aG?????aG?@?>\>\>\>??!G?@?@?aG?@?@?@?aG??????@@Q@@@@Q@8Q@`@(@@(@(@hQ@??@@@Q@Q@?@@@???@?aG??>>\?!G???aG??????@?>\>\>>\?!G?@?aG?aG?aG???????У??@ @@8Q@P@(@@@(@(@@@P@8Q@Q@Q@@@@Q@@Q@??У?????>\?!G?@??!G?@?aG???aG?@?!G?>\>>\>\>\??!G?!G?aG?aG??????@@Q@Q@Q@HQ@@@p@@@(@(@(@@@@(@XQ@0@@@ @ @ @@Q??У???????@?>\??!G?@?aG?@?!G?!G?!G>\>\>\>\?!G?@?aG?aG?aG??@@ ?@ @HQ@P@@@p@p@(@@@(@(@@(@(@@(@(@`@@@0@(Q@0@(Q@(Q@Q@@??У???>\??!G>\>\???!G?!G??!G?!G?>\>\>\>\>\?!G?!G??!G?@?@???У@@@@Q@(@(@xQ@hQ@(@@(@(@p@@(@(@@(@(@@(@p@P@@@@@8Q@HQ@8Q@ @?????>\?>\>\>\?>\?!G???@?@????>\>\??>\>\??!G?@?aG?????@0@ @@(@@@(@@@(@@(@@@@@(@(@@@p@xQ@xQ@@p@XQ@0@Q?????>\?>\>\?!G??!G?aG?!G????>\>\>\>\>\????@?aG?aG????@Q??@(@p@XQ@@(@(@@@@@(@@@@@@(@@(@(@xQ@hQ@HQ@ ?????>\???>\?@?@?!G?!G?!G?>\>\?>\>\>>\?!G?!G?!G?!G?!G?@?@??????@Q@@xQ@p@(@@(@(@@A A{@@(AA{A{@@(@(@(@xQ@hQ@8Q@?У???>\?>\?!G??aG?@?@?!G?>\???>\>\?!G?!G?@?!G???!G?!G?!G?@????У@Q@@@(@(@(@@(@(@@@AA$A"{A&{A,A,A@(@@@(@@P@ ????>>\?@??aG?!G?>\>\??!G?>\>\>\???!G?!G?!G?!G?!G?!G?@?@????У@@(Q@(@(@(@(@(@(@@(@A{AJ{AXA2{A(A&{A{@@(@@@@`@(Q@Q?У??>\>\?@?aG?@?>\?@??!G>\>>>\???!G?????!G???У?У@@8Q@@@(@@@@(@@(A{A(ALAZ{A@A*{A@@@@(@@XQ@(Q@?У??>\>\?!G?@?@?>\>\?@?@>\>>\???!G?!G??!G??@?aG???@(Q@0@`@@(@(@@@@(@A{AA6{AR{Ab{A:{A{@(@@(@@p@XQ@0@Q???>\??@??!G??!G?>\>\??!G?!G?!G?aG?@??????У?@(Q@@@HQ@@@(@@(@(@@@AA A4AV{AN{A{@@(@(@@@hQ@HQ@(Q@Q??>\>\?!G??@>\>>\>\>\>\>>>??!G?@?>\??!G?!G??aG???У?У?@ @0@@(@(@(AAA@(A@(@(A{A(AJ{AF{AA@@@(@@P@(Q@(Q@Q?У>\>\????!G>>\>\>>>?!G?!G?>\??!G?@?aG???У??У??@@XQ@hQ@@(@AA {A{@@@(@(@(A{AV{Ab{A@A@(@@@@XQ@0@Q@Q?>\>\?!G??aG?>>>\>>>\?????@?@???????У@Q@@@@@P@@(@(A {AA{@@@(@(@(AA0A\ALA(A{@@@xQ@HQ@0@@Q@>\>\??@?aG?!G>>>\>\>\>\>\>\?!G?aG?????@Q@@Q@Q@@ @Q@@@P@@(@AA,A{A@(@@@A A4AN{A"{A{@(@@@XQ@8Q@Q@Q@ ?!G?aG?@?>>>\>\>\>\>\??!G???У?У@Q@0@8Q@P@p@p@hQ@P@P@0@Q@@8Q@@@(@(A A$AA@@@@(A{AN{A:{A A@(@@p@HQ@ @(Q@(Q>\>\?!G?@?>>>>\>\>\>\>\?!G?@?@@@@@(@(@(@(@(@@@(@@HQ@@@@@xQ@(@AA {A A{AA"{A{A{@@(A,AHA{A@(@(@p@P@(Q@ @(Q>\??!G?@?@?>>>>>>\>\>\???@HQ@XQ@`@@@(A{A {AA {A {@(@(@@(@@XQ@HQ@P@(@AAA{A A$A(AA {@(@AADA*{A @(@(@p@XQ@8Q@ @0>\??!G?@?@?>>>>\>\>\???!G?@@Q@(@(@A{A*{A(A,A0A2{A.{A,A"{A$A{A{@@@@@@A{A@(@(A{A*{A{A @(@(@(A*{A4A{@@@@XQ@8Q@0@0>\??!G?@?>>>>>\>\>\???!G?aG?У@@A A$A4A8A>{A@AHAB{A6{A(A A&{A&{A A{@(@(@hQ@(@(@@@@A{A8A$A&{AA@(A{A6{A {A{@(@(@XQ@@@8Q@(Q>\?!G?!G?!G>\>\>\>>>\?>\??!G?aG?У@A*{Ar{AA^{A:{ADATA\AXATA:{A,AA{AAAA@(@@`@(@@(AAAA8AXAN{ADA{AAA@A{A{@(@(@HQ@HQ@@@0>\?!G?!G>\>\?>\>>>\?>\????@XQ@(AtAA =AF{A@AhAAxAdADA"{AA{AA {A {A{A {@@@`@HQ@(@AAA(A0ApAv{Aj{A&{@(@(A.{A"{A {@(@(@HQ@HQ@HQ@HQ>\?>\?!G?@?>>>>\?????@0@(AAAZ{AdA@Az{AAAv{ALA8A2{A"{AA{AAAA{@@@xQ@0@XQ@AA{A*{A0AXAAz{A<@(@AA6{A {@@(@@@@HQ@HQ>\??aG?@?>>>\??!G?!G?aG?@Q@A AAF{AV{A~{A =AA =An{ALAN{ALA0A{A{@@(@@A{A@@(@(Q@Q@@A{A{A"{A4An{AhAHA{@A A<A{@(@@xQ@p@HQ@@>\>\>\?@?!G?>\>??!G?@?aG??У@XQ@A{AA<A =AAA =AdAN{AV{An{AlAXA@A{A@(@(@@AA"{@(@8Q?@@@A@(A"{A$AR{ATAHA&{A{AAB{AA@(@@@xQ@@>\??!G?>\>>>\?@???@Q@(A A4AATA =A =AAf{A\An{A =A =A =AAn{APA8A2{A{@(@@A$A@?@@A{@AA A>{ALAB{A{@A{AHA,A$A{@(@@@@>\>\>\?!G?>>>??@??@@(@(A,A:{A"{AtA =A =A^{AlAn{A|AAAA =AAAn{A^{A,@(@(@A{A{@(@ ?@A @@A A0ALA<A{@AATA:{A"{AA@(@(@>\>\?@?@?>\>>\?!G?aG??У@8Q@A{A@A8AF{A|AAAdAF{Aj{AAAAA =A =A =AA =A`A$@(@AA"{@(@XQ?@PA@(@(A{A$A<A8A>{A"{AF{AA~{ALA8A{A{@@>\>\?!G?!G?>\>\>\?!G??@@XQ@A"{ADATAXAf{A =Av{Af{A^{AAA =ABB BB B BA =AP@@(@A"{A @(?@Q@@(@(AA$A>{A@ApAAAA =A =AhA:{A{A@>>\??!G?@>\>\>??@??@0@AA{APA`APADA^{AA\Ar{AA =BBB+BA =AA =BBAA{@(@AA{@(??@@@AA6{ATATA =A =AAAAAAA6{A A{>\????>\>>\??aG?@Q@(@A{A"{AR{AdADA2{AAAZ{AA =BB=B2BAADAAA =BAA,@(@A {A"{@??@(@(@A0APAlAb{A =A =AAA =A =A =A =A^{A{A{>\????>\>\>\?!G??У@(Q@@(A A4A\AdA =A =A =AAdABBAB>B0A =A@`??@A =A =AX@@hQA{A.{@??У@@@A.{AJ{A^{A\AAA =AAAAAA =A(A,>\????>\>\??@??@Q@(@(@A:{A`AA =AAxA =AdAB&BkBOB!A =@Q>\??@(A{A{@@pAA6{@?У?@@(@(A{A6{AHAf{AAA =A =AAA =AA =A>{A6{>\?>\>\>\>\??!G??@@Q@@@(A@AJ{AAAAR{A =A =A =B=BzBgBA<?>\?@0@@(@`@AA4@(?У@Q@@@AA&{A@AtAA =AAA =ABA =A =Af{A`>\>\>\?>\>>\>\??@??@Q@(Q@(@A{A.{A>{A@AxApAF{AA =ABDBBsB@(???@@hQ@(@8Q@A&{A2{@?@ @@@A{A(AF{A|AAA =ABBBA =AAxA =>\>\>\>\?>\>>>\??!G?@?@@@0@`@A{A0A2{A8ApAhA6{A =A =A =BGB{BsB.@(?@>\?aG?@@0@0@`@(A8A@P?У@8Q@(@(@(AA.{AB{AA =AAA =AA =BA =A =AA>\?>\???!G?>>\???!G??@Q@ @8Q@hQ@(AA,A2{A8A2{AA<A =A =A =B.BrBjBA{?У?@?@?@Q?@@8Q@pA {A6{@@ @@XQ@@(@(A{A0AHAAA =A =AAAAA =A =A =A =>\????!G?!G?@?!G>\>\>>\>\?!G??@??@Q@ @@@@@@(A&{A*{A*{A*{A =A"{A =AA =BBUBZBA@??@(Q@(Q@8Q@(Q@P@A"{A@(?@Q@@(@(@(A{A"{ADA =AAAAABAA =A =A =A =>\???@?@?aG?@?@??>\>\>\??!G?!G?aG??@(Q@8Q@0@0@(AA$A"{A&{A2{A{A:{A An{A =A =BB]AAAt@(@hQ@(@hQ@`@p@(@(A{@(@ @@@@@(@A {AAAhA =AAAA =A =AA =A =AAA>\???@?aG??aG?aG?@??>\??!G?aG??У@(Q@@@0@@@@(A$A,A$A0A AV{AHA0A =A =A =BB%Ab{A@@@(@@@(@@(@@@?@Q@(@@(@(A{A A4A =AA =AAAA =AA =A =A =A =A>\????!G???aG??aG?!G??>>\??@?aG??У@(Q@P@HQ@XQ@@A$A@A.{A.{A2{A{AXAA*{A`A~{AABA{@@@ @(@(@(@@(@@ ?@Q@XQ@(@@(AAA"{An{A =AAAAAAA =AA =AAA =??!G???!G????aG???@?!G>\>\??@?aG??У@@@XQ@XQ@xQ@xQ@(AAJ{AHA.{A4A AAA =@A A*{AlA =A =Ab{@(@@@(@(@p@Q?У?@8Q@(@(@@(A{A{ALAA =A =A =AA =AAAAAAA =A =??!G?!G>\?!G?aG???aG????@>\>\??!G?aG??У@8Q@XQ@`@@@AA2{AJ{A>{A*{A*{A*{A =A =A^{@(@@(@A A$A{A @@@XQ??У?@0@`@hQ@@@AA<AAA =A =A =AA =AAAA =A =A =AA???!G>\??@????????!G>\??!G?aG??@(Q@XQ@p@(@(@@AA<AN{A.{A,A:{AA =AA(@0???У@@Q@HQ@(Q@Q???@Q@HQ@P@(@@A {A0AxAA =AA =A =AAA =A =A =A =AA =AA>\?!G?!G>\>?????@??aG?>\>\??@??@(Q@hQ@xQ@@@(@(@(A{A>{AHA8ADAn{B B A =@(@p??aG?@?@?????@Q@ @8Q@(@@(AA2{Ar{A =A =AA =AA =AAAAAA =A =A =A =AH??!G?@?>??????@(Q??@???@??У@ @hQ@@@@@(@@(A AR{AXALAr{A =BB A =A8@???aG???У?@Q@Q@P@(@(@(A{A@A =AAA =AA =AA =AA =A =AA =AA =AALA >\??!G?>\??aG????@8Q@??@>\?@??У@Q@hQ@(@@(@A@@(@(A{APAtA =AABBA =A6{@@?@@Q@@ @@@p@@(A{A(A^{AAAAA =AAAAAAA =A =AA =A =AxA{A&{??!G?>\??@???@Q@0@ ??aG?>\?!G?aG?@Q@P@@(@@@(@@(@(@A"{AA =AAAA =AA =A~{A2{@(@(@@p@p@AAA>{ApAtAA =A =AA =A =A =AtAA =A =AAAAA =A =A AA>{>\??>\?!G?@?aG???@8Q@(@0??@>\??@?@Q@0@xQ@(@@@A@@(@@A6{AAA =A =AA =A =AA =A =AF{A6{AA8ADAJ{AlAA =AAA =A =AA =AA|AA =A =AA =AA =AAA,A,AN{A*{>\??>\??aG?aG???@(Q@@(@Q?@??@??@8Q@@@(@(@(@(@@(@@(@(A6{A =A =A =AAAA =B BA =AAAAAAAAA =A =AAAAAz{AAAA =A =AAAAA:{A*{A<A<A>\>\>??@?aG???У@0@@(@(?>\>\?!G?aG?@@P@(@@@@@(@@@@(AA6{AA =A =AAABBBB AAAAAA =AAA =AA =AAb{A~{A =A =A =AAA =A =A =APA8A,A{A{@xQ>\>\>\?!G?@???У@@xQA{@(??!G??aG??У@(Q@(@@@AAAA @(@@(A{A:{Az{AA =A =A =ABBAAAA =AB:AAAAA =A =AxAz{AA =AAA =AAAAHA@A.{A{@@@XQ>>\??@??У?@Q@@@A@(??@??@Q@p@@(@A A&{A:{A.{A A{A@(A{A.{ApA =AA =AA =A =A =A =AA =AA =AA =A =AAz{A =AAA =AA =AA =AAZ{A*{AAA@(@hQ@P@ >??@??@@(Q@ @APA@????@Q@0@(@@@(AALA\APA8A0A(AAA.{A`AAAA =AAA =AA =AA =Af{APAN{Ab{AdA~{AAAA =AAAj{A$A A@(@@(@`@hQ@8Q?>>\?!G???@@Q@`ADAj{@p?>\??@?@Q@0@@@(@@(AA8AAAn{AB{A2{A6{AHAV{Ab{A|AA =A =A =AAAA =A =AAA~{AJ{AA|A =AA =AA =A =ADA{@@@@@@XQ@P@8Q@(Q@`>>\>\?!G??@Q@(Q@XQ@AA2{@8Q?@>\?!G??У@8Q@HQ@p@(@@A{AN{A =A =AA$AAA*{A<AZ{ApAA =A =AAAAAA =AAAAn{APA =A =AA =A =A,A{@(@@@(@(@XQ@@@Q?@pA =???aG??У@@ @@An{A??@??@?@@@@@@(@(A{A$AXAr{AALAHA>{A@AJ{AlA =AAAA =AA =A =BAAAAABAA =A`A0A@(@(@@@(@(@(Q@Q@Q@@XQAlA>\>\?!G???@Q@@(A>{A:{@(??>\??aG?@Q@XQ@(@@@AA AJ{ApAAXA\AlAtAr{A`AxA =A =AAA =A =A =AAA =A =AAA =Aj{A6{A{A:{@@@(@(@(@ ??@HQ@Af{A =B >\?>\?@?aG?@?@Q@(@(AAhA@?@?!G?>\>\>\>\?!G?aG?@Q@(@(@(@(AA{A A&{A`AA&{ALAj{AAAAAAAAA =A =A =AAtAB{A*{AA =AApADA{@(@(@(@hQ@@@(Q@XQ@(A =ABA>\?>\?>\??!G??aG?@@@(AA"{@?У??!G??>\>\??@??@@@(@@@@(@@(AA(@AAA<AZ{Ab{A|AtAAxAz{Av{A =AtAb{A`AB{AAA =A`A8A@@@@xQ@Q@Q@xQ@(A*{ABBBAr{>\>\>\>\???!G?@??@@@A{A@@(??@?@?!G?!G>\?aG?@??@@P@@(@(@@A{AA{@@@(@(@AA"{A"{A"{A&{A<A4A4A6{A.{A{A ApAZ{A8AA{@@@@@HQ@(@@AB{ABAAApA>\>\>>\???@??У?У@8Q@A{A{A{@(@??!G?@?!G?@????У?@ @hQ@(@@(@@A{A{AAA{@@@(@@@(@@@(@@@A{A {@@@(@@@(@(@@(@(@(@(Av{A =BBAA =AA?>\>\>\>>\>>?!G?aG?aG??@@AAlA.{@@@HQ???@?aG???@HQ@@Q@8Q@p@@@(@@(AA{A{AA{AA{@(@@(@@(@(@(@(@(@@@(@(@(@@@(@(@@@(A{A =A =BA =Ab{A =BBA>>>\>\>\>>\?>>>?!G?@?aG???@ @A2{A =A"{@@(@????@Q@XQ@HQ@hQ@`@P@P@@(@@(@@@AAA"{AA{AA@@(@A@(A {AA{A AA{A{@@@(@@(@(A"{A =AB$A =A =A =BBAA =>>>\?>\??>\??>\???@??@Q@P@AAX@(@(@@???@@p@@@@(@(@xQ@(@(@@(@@@(@(@(@(@(@@@@@@(@(@(A AtAA {A{A{@(@(@(@A0Az{ABBAAB/BNBAAA{>>\>\>\????????>\>\?!G?aG???@ @(@A*{A @@@(@???@0@xQ@(@(A@@@@(@(@@@(@(@(@(@@(@(@@@@(@@@(@A{@@(@@@A{AAAA =BBBB%BDBBA =A =A"{@>\>>??!G?!G>\?!G?@?!G?!G?!G?>\?@???У?У@HQ@(@AA{A{A{@(@8Q@?@@(Q@@@AA\AXA0A{A@@@@(@@@@@(@@@(@(@(@@@(@(@(@@(@AlA =AxB B"B BB/B4BEB5A =AA@@hQ@Q>>\???@?@?@?@?!G?!G??!G>\??@???У?@HQ@(@(A{@(@(@(@@ ?У@Q@Q@Q@XQ@(AAJ{AxA~{AxA8A&{A@@@@@@@(@(@@A{AA,A<AF{AN{AV{AAb{A =B%AB"B B9B/BPA =AA =AA{@(@(@0@>>\?!G?@?aG??@??@?@?@???@?aG??У@Q@HQ@(@(@@(@(@(@(@P@@@@Q@(Q@XQ@(@A{Ar{Az{A =AAz{A6{A@(AA AA&{A(A8AdAAA =A =A =Ab{AA =AA =BB$B6B1B(AA =AA\@(@@@p@`@@>>\??@????!G?aG???@??aG?aG??@@P@@@@(@@@(@XQ@Q@0@(Q@(Q@`@(@(AAAXAz{AAAAJ{A AA A&{AAPAr{A~{A =AAA =A =AA =BB+B+B5BAA =A =A6{@(@@(@@@(A{A {A>\?!G????aG?????!G??!G?aG??@ @8Q@hQ@(@@(@`@@@@P@`@`@`@p@(@A{A>{ALAz{A =A =AA =Ab{A"{A{AA2{A:{AN{Ab{A =AtAAAA =A =A =A =A =A =AXA$AA{@(@(@(@(@(AA A@>\?!G?aG??????aG?!G?@?aG??У?@@HQ@(@p@(@hQ@@@(@p@hQ@@`@@@(A.{AAAA =AAAA =APAF{ADAPAHAF{AV{AA =Ab{AA4A(ALA{A*{A,A{A {@@@@@(@@AA@@>\?!G???????aG>\>?!G?@????@ @8Q@HQ@(Q@@@xQ@@(@@(@XQ@XQ@(@(@AATA =A =AA =A =AAAA =A =AA =A~{Ar{ApAV{A{@(A{@(A(A"{A{A{@(@@(@@@@(@@@@@`>?>\?!G???????!G>>??@????У???У@@0@xQ@@(@(@(@(@xQ@p@(@AAN{A^{AdA =A =AA =A =A =A =A =A =AAAAdA"{AAA{@(@@@(@(@@@@(@(@(@(@(@(@XQ@(Q>\?>\?@???@@Q?aG?>>>>?!G?@????????@Q@HQ@(A{A<AB{A{@@(@(A{A4AR{AA =AA =A =AA =AA =A =A =A =A =AAxAf{Ab{A4AA@(@(@(@(@P@@p@hQ@hQ@`@P@0@ >\?>\??@??У?@Q@?@>>?>?@?!G?!G?@?@?aG????@@@@@(A{AR{A =AXA{@@@A{A8A|A =A =A =AA =AA =A =AAA =A =An{A`ATA&{@(@@(@@p@hQ@`@P@HQ@@@@@0@ @>\??!G?@??@@@?>>>>>?>>??!G?@?aG???@@8Q@(@(@@(@@(A {A @(@@A{A,A0AN{A4A.{ALAf{An{Af{Az{AAxALA0AA@(@(@xQ@`@P@@@8Q@@@8Q@(Q@ @??>\?!G>\?!G??@Q@Q?У>>>>>>>>\>\??!G?!G?aG?@Q@ @@@@(@@(A{A(AHA6{A{AA{A{A{AA2{ALApA`A3 =APA$@(@{@(@hQ@(@ ?????Q?Q?У??p?aG?@?p?>\?!G?aG?@0@Q?aG>>>>>>>??!G????У@@(Q@hQ@@(@@@(AA"{A.{ALA4AHA{AA"{A,A<A*{A{@(@(@@ (@Q@S @|(@@Q?Q?Q?Ǯ???aG?@?@?O\)>\>\>\?!G??У@@?>>>??aG??aG?aG???@@@xQ@@@@(@@@(AA{@@@(@@(@(@@(@@@@<(@XQ@0@ (@Q@<(?Ǯ??O\)?0?!G?!G?\)?\)>\>\>\?!G????>\??!G????@?@?aG??У@@0@(Q@0@0@8Q@8Q@0@`@@`@`@XQ@@@XQ@(@@(@@@\(@p@@# @<(??@?p?>\??>\?@?aG?????@>\??@???aG?!G??!G?aG???У??У@Q?У??@Q@@(Q@(Q@@@(@(@@@@(@L(@# ??p?Q?@8Q@?У@@ ?У?>\>\?@?aG?!G???>\>\>\?!G?@?aG??aG?aG?aG??@?aG?aG???У@Q@0@@@hQ@`@hQ@(@(@(@@XQ@(@(@8Q@ ?@ @(@{@{@(@|(@(Q@ ?У??Q>\??@?!G??!G?!G>\??@?aG??У??@Q@Q@@ @XQ@0@@@0@p@hQ@(@@(@@(@@@(@@(@@@{@A {@{@{@\(@Q?Q??Q@Q?p??????aG???@?????@@0@@@p@@(@hQ@@@(Q@0@(A@(@(A {@(@@@@@c @C @ @ ?Q@Q@ @S ??Q?0>\>\??!G?!G?aG?aG??aG???@@@(@??@(@(@@@@`@p@8Q????0?Ǯ@@C ?@ ?p??!G???aG?@???????p?p?@????@???>\?!G??>G?>\?O\)?Q?\)?O\)?aG??0?aG?0?!G??@???>?!G?\)?O\)?O\)?p?Q???@@?Ǯ@# @l(@`?Ǯ?!G?!G?aG?@?@?aG?\)?@?\)?!G??O\)?Q@ @`@@(@(@{@(@(@p@L(@?Ǯ>????@?@???@??\)>G?\)?\)?@??p?@`@(@{@{@@{@hQ?Ǯ@Q@??0>\>>>?>G?aG?O\)?@?0??Q??aG?!G??Q?aG?O\)>G?O\)?@0@ ??У?Ǯ?Ǯ???Q?!G>G>G?0???@C @C @(Q@Q@Q@@HQ????????O\)?aG?aG??Q??@?@?0>\?!G?!G>\>>>\>\>\>\?????aG?@?aG?aG?aG?????У?@ @Q@ @@@0@HQ@HQ@8Q@@HQ@0@@Q?????????У?@@Q@Q@??У?У?@@Q>>\?>\>>>>\>\>>>\>\???@?@??@?aG????@ @Q@p@P@HQ@HQ@8Q@8Q@P@0@Q???У?У???????@Q@ @ @Q@Q???@@Q>\>\>\>\>\>\>>>>???!G??aG?aG?aG????????@(Q@(Q@@@@@ ??У?У?????????У@Q@0@ @(Q@ @@??@Q>>>\?>\>\>\>>>\>>\???!G??!G?@?@?@?aG???@Q?@@Q@Q@@?????????У?У?У@ @@@HQ@8Q@0@Q@@@>>>>\>\>\>\>>>\>>>\>\????@?@???????@@ @@Q@???????У@@ @XQ@`@hQ@@@ @Q@Q@Q>>>>>\>\>>>>>\?!G?@?aG?@?aG????@Q@0@P@P@8Q@Q?????У?@@ @0@xQ@@`@8Q@ @Q@Q>>>\>>>>>???!G?@?aG??@Q@Q@@@`@xQ@@@@(Q@Q?@@Q@(Q@HQ@P@P@(@@xQ@HQ@(Q@(Q>\>>>>\??@?aG???У@@Q@ @hQ@@A@@(@`@8Q@8Q@HQ@XQ@p@hQ@xQ@(@(@@HQ@0>>>>>>\??@?????У@Q@8Q@(@@AA@(@@(@hQ@hQ@(@(@(@@(@(@@@>>>>??@?aG?aG???У@@(Q@hQ@@(A {AA@(@(@(@@(@(@(@(@@(@>>>>>>>\??!G?!G?@?????@ @P@(@(A{A<A@@@(@(@(@@(@@@(>>>>>>>>\>????!G?!G?@?aG?????@@@8Q@(AATAn{A4@(@@@(@@@@@(>>\>\>>>>??!G??@?aG?aG?aG?aG??????У?У??@(Q@(AA6{AZ{Af{A(@@(@(@(@(@(@(@>>>>\>>>>>?>\?@??@?????????У??@@(Q@0@hQ@(A"{AJ{APAhA{@(@@@(@(@@(>>\>\>>>>>>>>\??@?aG??????????@@Q@8Q@P@8Q@@@@(A0AR{AV{AHA@(@(@@@@>>>\>\>\>>\?>>>>\>>>??@?????У???????У@@0@P@`@`@@@`@(A {A6{AB{A<A@(@(@(@(@(@>?>\>\>\>\>>\>\>>\??aG????aG?!G?!G?@??????У@?????У??@@P@xQ@xQ@`@P@(@A A$A&{A{@(@@@@@>>\????>\>\>?!G?!G>\???@?@??У???У??????У??@@@Q@(Q@@??@@@0@(@@(@hQ@p@(@(A{A<A.{A{@@@(@@(>\??>\??>\>\>>\?!G?>\?aG?У@Q@Q@(Q@8Q@(Q@??У?@@Q@ @0@8Q@HQ@hQ@p@hQ@P@@@Q@@Q@@ @`@(@(@(@@@@ADAN{AA@@(@(@(>\??????>\>>??!G>>\>?!G??!G?@Q@8Q@0@HQ@8Q@8Q@8Q@HQ@(Q@HQ@xQ@@@@@(@(@(@@@@(@XQ@0@Q@@@@@@(@@@@@AADA4A{@(@@@(??!G?@?!G??>\>\??@?!G>\>>>>?@???У@(Q@XQ@xQ@@xQ@p@@xQ@(@(@@(AAA@(@(@(@(@@(@@(@@`@HQ@@@@@xQ@@(@@@(@AA{A.{A@(@@@`?!G?@?@??>\>\>??aG?@??>\>\?!G?@ @?@Q@hQ@@@@@(@(@@@@(A A2{APALA8A@@(@(@@@@@@xQ@@hQ@@(@(@@@@(AA {A(A$@(@@@hQ??@?@?@?>\>\>>>\?@?@?!G????@?@(Q@XQ@xQ@0@(Q@(@A{AA{@(AA@(@(A{A{A.{A>{AN{APA6{AA{A@(@(@(@(@@@@@xQ@@@@A{@(AAA{A&{A{@@@hQ>\?@?aG?aG?@?>\>>>\?!G?aG?aG?!G???!G??@XQ@(@@hQ@A{A>{AB{A.{A"{A<A:{A@A>{A<A&{A&{A,A0AF{AhApAv{AtAhA(AA {@(@@@(@(@(@@@@(@(A{A{AA&{A{A@@@XQ>?!G?aG??aG?!G>\>\>\>??!G?@??@???@?@@0@(@(A{@(@A\A =A =Ar{AA =AAv{Aj{A`ALA@A*{A*{A&{A,AF{Ar{A|A =A =Aj{A2{A {@(@@(@@(@(@@@@A{A AA$A{A{@@@HQ>\?@???aG?>\>>>??!G?aG???!G??!G??У@P@(@@(A2{A6{A {A =AAA =A =AAA =AA~{A`A4A(A{AA A2{APApAr{A =AAF{A @@(@@@(@@(@@@(A{A.{AA2{A{@@(@p@8Q>\?aG???@>\>\??@????!G?!G??У@0@(@(AA&{AN{A =AA =AAAA =A =AA =AA~{A\A6{A A{AA{A{A0AF{A`AR{AHA*{A {@(@@AA{A@(@@@A{A6{A{A2{A4@@@hQ@(Q??aG???!G>\>\?!G?aG???@?!G?@??@p@@A"{APA =A =B B=B7B(AA =A =AAAAAAlA:{A"{A AA{A{A{A8A0A{AA@@AA6{A>{ATA$A{A{@(A{A<A"{A,A8@@(@`@(Q??aG??aG?>\>??????@?@??У@0@A{AAR{A =A =BAB(BBA =A =AA =AAAAtATA2{A6{A{A{@AA{AA{A {@@(@@A A,AN{A~{AR{A @(@AA^{AF{A"{A0@@(@`@Q??@??@>\>\>\?!G?????aG??@Q@@(A{A6{AhA =ABA =BAA =A =AAA =AAAAr{AN{A*{A<A&{A{@@@(@(@(@(@(@@@A{A{A<AAtA,@@A{An{Az{A(A8A@(@HQ@Q??aG??>\>\??!G???????@HQ@(A{A"{AHA =A =A =AAA =AAA =A =A =A =A =A =AA =ATA{A {A,AA{@(@@@(@(@(@@@(@(A{A$Af{AtA>{@@AAxA =Ab{A>{A @@P@Q??aG?aG>\>\>\>\??@??aG?aG????@(A{A(AF{Ab{AA =A =AAAAAAA =AAAA =A =A =AA:{AA{A A{A{@(@(@@@(@xQ@HQ@XQ@(AA{AF{A|AF{AAA"{Az{A =AALA@@xQ@Q??@?!G>>\>\??aG??aG?aG???У@ @A{A6{Aj{Av{AAA =A =A =AA =AlAA =A =B BBBB AAv{A{A{A{A{A{@@(@(@(@(@XQ@0@ @@A{A4AAL@(@(A{AAAAj{A4@@(@??@?!G>>>\??aG?aG?????@8Q@A"{AHA~{A =A =A =A =A =AlA`A =A|AABB+B=B4B7BA =A =AD@@(AA@(@(@@p@(@8Q@Q@Q@xQ@(@A<A~{AR{@@(A {A =AAAALA{@@(??@?>>>\??@?aG????У@Q@(@AAPAA =A =AAAA:{AF{AAA =BB8BUBRB'AA =AA =Af{A{@A{A{@(@(@(@`@@(Q??@XQ@@(A0AxAXA@A,AA =A =A =A\A{@@??!G?>>\??aG?????@HQ@@(A$AtAAAA =A =Av{A"{A4AA =BB<BiByB;AA$A{@(A2{AXAA{AA@(@@@`@@??@P@@A:{A~{AZ{A"{A.{Af{A =AAAAA{@@(??!G>\>>\?!G?aG????У@@P@@(A,ApAA =AAAAR{A{ADA|A =B'BlBBBB%AF{@HQ?У?@ AAB{A@@(A@@@(@XQ???@HQ@(@AV{AA^{A2{AHAAB A =A =AA$@(@??!G>\>>\?!G?aG????У@@XQ@xQ@(A{Ab{Ar{A =AA =A|A:{AAN{A =AB>BBBBB @?>\?@@A*{A@@(A{@(@xQ@(@8Q?У??@HQ@(A{AhAAZ{AB{ATA =BBBAAA4@@??@>\>??@?????@Q@`@@(A{AJ{ALA =A =A =Aj{A8A"{A0AA =B8BBBBA@?>\?@P@(@@xQ@A@(@@(@Q??@?@HQ@(@AZ{A`AR{AHAZ{A =BBBA =AA0A@(>?!G?@>\>????@?????@0@p@@(A {A6{A4AAAAA>{A&{A:{AA =B$B|BBA@(??!G?aG?У@Q@(@xQ@(@(@(@@(@XQ??aG?@?@@@AADAF{A@AR{A|A =B#B$BA =AdA>{@(@(>??@?>>\?!G??!G?aG????@8Q@(@@AAA4AxA~{A =A@A0A$A2{AABBMB~BA =@@0?У??@Q@@@`@A{@(@(@@Q??!G??@0@(AA2{A6{A8AV{A =BB$B7BA =AJ{A8A {@(>??!G>\>>>\>\??!G?!G?aG????@0@p@@(@A {A8A\AtAlA,AA{A,AAABBCB=A@@HQ@?У?У@Q@HQ@(A@@@@@??!G?!G?@@0@A{A"{A&{A8AV{A =BB%B0B A =ATAAA>\?!G?!G>>>>\??@?aG???@????@(Q@`@(@(@(AAAHAf{ATA4A{A{A A~{AAABBA =A$@@8Q@@ @xQ@A@@@@xQ?У?@?aG?У@@XQ@(A A{A{A0A =A =B B!B AAtALA{A8A >\?@?>\>\??!G?@?aG?>\????@Q@(Q@@@(@@@A{A0AXAF{A4A{AAAN{A =AA =A =A =AAB{@(@(@(@(@(@(@(@(@(@xQ??@?!G??@(Q@@@(A{A{A4ABBBA =AA<A0A{ALA>\?!G>\>>\>\??@???!G?!G??У?@Q@0@@@@(@@@A$ALA>{A*{A A{A{A4A =AAA:{A =Ab{A{@(@@@(@(@(@@@XQ?У?!G???@@hQ@(@(@@@A\ABBA =A =ADA$A{AZ{AF{A {>>\?!G>\>\>\??!G????@>\?!G?aG??@ @8Q@HQ@hQ@@(@(@(A{AHA0AA@@(A{A6{ATAR{A @(A@@0@ @@ @xQ@@hQ@(Q??!G???@@@@xQ@@(@@A {AA =BAA =APA"{@(A<A|A.{@(>\>\?!G????!G?@?aG???aG??!G?aG?@@ @8Q@@@HQ@@(@(@@A,A0A"{A@(@AAA*{A{@@(@(Q@@@Q@Q@@HQ@ ???!G??@??У@@ @P@@@(@(@A^{A =AAAAhA*{A{A{A`AJ{A {@(>>\?!G????!G?@?aG???>\?!G?@?aG??@(Q@@@HQ@8Q@p@(@(@(@(A{A8A0A {A@@A{A A{@@xQ@(Q?У????@???aG?!G?aG???@@(Q@p@@@(@AB{A =A =A =A =Av{A"{A&{@A@APA{@(@>\?!G?!G???!G?@?aG????!G>\?!G?aG?aG??У@0@HQ@XQ@HQ@`@(@@@@A(AB{A{AA@(@@(A@(@P@Q?У???aG?@??aG>\>?!G?aG??@@@XQ@(@(@@(A8AA =AAAlA(A"{@(A {A:{A{@(@@>?????@?@?aG?aG?@??!G?@???@@@@XQ@HQ@HQ@@(@@@AA8A$A@(A@(@@(@(@P???aG?!G??>\>\>?aG??У?@Q@@@@(@xQ@A(AA =AAAlA{A{AAA6{A(@(@(@@>\??!G??!G?@?@?aG?aG??@?>\?!G?@?aG????@0@`@p@P@hQ@xQ@(@@@A{A$A{AA {A@@@(@(@??@?>\>?@?aG?aG?aG???@ @HQ@`@p@@(A$A =A =A =AAdA,@@@A<A&{@(@(@@@(??!G?!G?!G?@?@?@??@8Q@0??!G???aG???aG?@Q@`@(@(@P@hQ@(@(@@(@(A {A"{AA{AA&{A@(@@(@@?У??aG?!G?????@Q@@@`@p@(@AADAA =A =AATA&{@(@(@A0A&{@(AA{@AA>\??!G?!G?aG?@?aG???@@Q?aG?!G?У?????@Q@XQ@(@@@P@p@@A@@A{A A{A"{A@AV{A*{@@(@@@Q??@Q@@@(Q@(Q@@@p@(@@(A{A`AA =AAr{A@A@@@AAAA.{APA.{A{A {A>\??!G?@?@?@?aG??У@Q@P@XQ??@?@??????@@0@hQ@@@XQ@P@@AA{@@AA(A6{AF{Af{Az{AF{A@@(@(@Q@Q@(@XQ@p@@@@(@(A A6{A`ApAr{A^{AB{A@(@@xQ@(AAA{Ab{A =AxA4A {A*{A:{??!G?@?!G?@?@?aG?У@0@ @@0??@??У?????@ @@@`@(@(@p@`@(@A{A@@(A{A>{AXAv{AA =ALA(A@(@@hQ@(@@@(@AA{A&{A@APATAN{A.{A A@@(@@A.{A{A{A>{A =A =AB{A2{ADAF{AJ{>\?!G?!G?!G?@?!G??@8Q@hQ@hQ@p???@ ?????У@@ @@@hQ@(@@(@@(@(A{A{AAA.{A\AtAA =A =AA^{AF{A4A,A A"{A A{A{A$A4A0A.{A2{A(A{A@@(@(@(A{A,AAA(Af{AAdA2{A>{AR{AF{A\>\???!G?!G?!G?aG?@HQ@@hQ@@(Q@Q??@(Q?У????@@Q@@@`@@@@(@@A"{A*{A0A,A8Ab{A|AA,A4A,A~{AAz{AhAB{A*{A"{A$A&{AA{AAA{A@(@@(@A A(A{A*{A>{AhAAtA@A`A^{ADA`A =>\??!G??!G?aG?@@@(@@@@??У@8Q@P?????@Q@@0@`@(@(@@(@@(A8A:{A>{AB{ATAA{A{A,A0A{A{@(@A2{A{A{A A{AA {AA@@@A{A*{AA AA0A8ApAAdAhA~{AZ{A0AJ{A =A =>\>\???!G???@XQ@(@@@XQ@XQ@@@?У????У?@Q@@0@p@@(@@@(AA*{A:{A>{AV{A {A A{A&{A:{AZ{A>{A{@(@(@(A{A A{AA@@(@A{A{A8A4A*{A&{A.{Af{A =A =AhAHA^{AJ{AA8AAA =>>\???!G?@??У@ @@@(@@HQ@0@Q@Q@ ?@????@@@Q@HQ@@(AA{A@@A A<AJ{@(A {A{A2{A@ApA =A`A4A{A{@(@A{A{A{A A"{A@ADAf{A\AXA0AF{AAA =An{AF{AF{A0A{A*{A =A =AAV{>\>\>\??!G?@???@p@@(@(@(@p@P@XQ@@?У?aG????@@@ @HQ@@A A.{A"{A{AAA>{AAA{A A"{AN{AV{AXAdAJ{A6{A@(@(ADA6{A:{A`A^{AA =AZ{A\A =A =A =Av{A@AA*{A{AA8A =AAAPA>\>\>\?!G?!G?aG??@0@@(@(@(@(@(Q@ @0@??aG????@@Q@ @HQ@(@(@(A(A"{A{A"{A&{A4AA(A0A*{AR{A^{ATA\ApA\A>{A\A:{A(A|AlAPAR{AZ{AA =A =A =AAlA>{A{A@(A"{A0A =A =A =Ab{A{A??>\>\???@@Q@ @@@A@HQ@0@hQ@@???????@@ @HQ@p@(@AA{A{A,AB{@(AA0A8A`AhAj{Aj{AtA~{AV{AlAR{A2{A{A"{AA =A =A =AAAAR{AA {A{A{A6{Av{A =Ab{AV{A6{AAlA =>\>\>\>\>\>\?@?@0@(Q@p@(@(@(@@(@`@(@XQ@???aG???У@@Q@0@P@`@@@(@(AA@@@A A8AR{AJ{ALAPAHAdA =AA|AXAz{AAAAA =ApAJ{A*{A{AA{ALA =AAA =A.{@(A`AA>\>\>>\??@?@@@@0@@(@A"{@(@p@(@@HQ@??????У?@Q@8Q@`@p@xQ@@@(@(@@@(@(AAA4AR{A\AlA =AA =A =AAAj{ALA{AAAN{ALAHA*{AHAr{AAA =AA{@(A\AB)BI>>\>>\?!G?@@p@(@@(@A {@@@(@(@8Q???????У?@@@@xQ@@@(@(@@(A{A(A0@@AA&{A6{A0AN{AN{AR{AdA0A{A@Az{AtAr{ALADAf{A`A =AA =A =A\A@(Ab{AB BtBv>\>\>\?@@8Q@@@xQ@@(A{@@(A{@@(@XQ@Q????У??@Q@@@p@@(@@@(@(A{A"{AF{AB{AHAHAB{@(@(@(A =AAAxAv{AZ{A^{AZ{A`ApA~{Ab{Af{AAtAr{A"{@@AhABOBBBV>\>\>?!G?aG?@@P@@@@@@A{@(@(A{A A@XQ???????@@(Q@P@(@(@(@(@@(AAA&{A2{AB{AV{AhAxA =A =AA =A =A|AAA|AtAdA.{A*{A$A,@@@(A@A =BBSBBBLB>>\>\?!G??@@@p@@@p@A@@(@@AxA @??????У?@@(Q@HQ@xQ@(@@(@(@(@A {AA{AA$A2{ALAHAZ{ALA@ALA:{A"{A{A@@(@(A@(@(A AA =B(BBBBBLBA>\?!G?aG?@Q@0@8Q@(@@@A@(@@A{AR{A0@`??@@???@Q@(Q@P@p@@(@(@(@(@(@(@?@@@@(A{A {AAA@(@(@(@@@@@A{A =B8B@BMBBB`BAAxA{??!G?@@0@xQ@@@@@A@@(A{A6{A8Ax@(@XQ??@???@Q@(Q@HQ@hQ@(@(@@(@@@@p@@@(@@@@@(@@(@@(@(@(AXABBEBuBBBB[B!A =A =A =AA>>>\??@?У@ @xQ@@@@@(@(@(@(@@A A.{AAT@@(Q@@@Q@Q@Q@Q@0@P@p@@xQ@xQ@@@(@(@@@@(@@A"{@(@A A{Af{AA =BBFBVBjBxBPBBAAN{A(A A{A>>??aG?@Q@`@@(@(@@(@(@(@@(@@(@(A4A|AxA {@(@xQ@(Q@ @(Q@8Q@HQ@`@xQ@@@@@(@(@(@(@(A {A{AA.{ATA|AA =ABB;BNB_BbBEB4B)BA =A =AxA4A@(@@>\>?!G?aG?@Q@0@(@@(@(@(@(@(@@@(@(A{A(AHAAPA@@(@(@@@@(@(@(@AA {A{A A(A2{AdA~{A =A =A =A =ABBB1B:B=B3B%BBAAA =ADAA {@@(@@>\>\?aG?aG?@@P@(@@hQ@@@`@@@(@(@(@(A:{A$AA<Ar{AhAxA~{ALA4A&{A@(A@@(A{A A{A8A0APAlA =ABB BBB"BAB?B!B#BAAAAPA>{A2{A{@@@@XQ@HQ>\>\?!G??У@Q@HQ@(@@0@ @(Q@HQ@(@@(@@(A8A>{AB{AHAlAA =BBAAAA =AAn{A =AhAlAAAAB BBB2BDBBBRB9BA =B$AA =AA =A"{AA@(@@p@@@8Q@0?>\?aG???@(Q@@hQ@0@@@ @(@(A{AA@APATAv{ApAxA =BB6BNBfBpBSBDB3B+B*BB.BABeBfBgBBnBaBJB(BA =AA =AAA =Az{Ar{A&{A{@@@0@Q@(Q@0@(Q??!G>\?aG??У@Q@@@@XQ@XQ@8Q?@@P@A{A{A@AdA =AAA =A =A =BBCBsB|BXBjBiBRBuBsBBBBBBBBBSB8B&A =A =A =A =A =A =A~{A^{A:{A @@@@@@@Q@ @(Q@Q>\?>\??@???@@8Q@@p@ @@Q@XQ@(@(@AAAABBBBB BB=BJBUBdB`BBrBtBBBBBBBNBAAR{A A0A6{AHALADA$A @(@xQ@ ??@@@@???!G>\>>?aG???@Q@ @ @@@@Q@XQ@xQ@@@A:{ABB.B;B>BMBJB4B5B.B-BLB9B3BBA =A =An{A {@@(@(@(@AAA A{@@hQ@0@Q??У?У???????@?>\>>??@???У???У???@Q@HQ@`@@@(@@AlA =A =BB*B@B&BAAAAZ{A*{A*{A{A@@@@(@(@(@(@@@(@P@ @??????aG>\?@?>\>>>>??@???У????aG?aG@@ @HQ@p@xQ@@@(@@(AA8A\ApA~{A =AAA =AA^{A{A@(@(@(@(@(@@(@xQ@P@(Q@?У??>?!G?!G?@??!G>>>>\>?!G?aG?????aG?aG?aG@@@Q@ @8Q@(Q@`@P@@@(AA&{A8AdA`An{A =A =An{AZ{AHA*{A{A @(@@@(@@`@ ????@?>\?>\???!G?aG???aG????????@@@Q@HQ@(@(@(@(AAA{A2{A:{A0AHA>{A<Af{AR{A(AA@(@(@P@Q??>\??!G??@???aG?????????У?У@@8Q@xQ@@(@(@(@(A A@AF{A:{AJ{AlA{A,A{A@XQ@hQ??O\)>\?@?aG?aG?@?!G?@???????????@ @8Q@8Q@P@p@@(@(@@@(AA{@@(@XQ@Q??=u=u=u?!G?@?@?!G??!G????aG??@p@(Q??????@Q@ @XQ@(@@@@(@`@????@?@?0=u=u=u=u??!G?!G?????!G???@0@hQ@(@(@ @????@@0@HQ@ @(Q?????У??@?@Q?Q??p?Q?Q??O\)=u=u>?aG?p??!G?>\?!G???У@Q@8Q@xQ@@(@(@@(@@@P@Q???????aG?@@p@XQ@(Q@ (?Q@ ?У??@??Q?@Q@XQ@P@(?!G?!G>\?@???@@@@@(@xQ@(@(A"{AAALALA0A&{ApAXA{A {@(@@@@(@(@@{@@ (@Q@@@xQ@@@@(@(@{?!G?!G?aG?aG?@@@p@hQ@(@AA<A~{A =AAf{A =A =A =A =A =A =AA =A =AA =A =A? =@{@@(@(AA A(@@@c @0???@???@@@P@(@(A2{A A{AAZ{Az{AdA^{AA =AAA =AA =A6{A4@@@AA =A@@`@ ??Ǯ>\?!G?!G?@??@Q@@@p@(@@@(A{A&{A{AF{Aj{A =A =A =AAA =AXA*{@(@{@@(@P@(Q@ (?У??@ >??aG??@Q@@@@XQ@XQ@p@(@(@@(@(A{A8A0A<Ah@@@C @<(@l(@ (?Ǯ?Q?@,(@{@(@{?!G???@@Q@Q@0@0@HQ@HQ@p@@L(@(@@@HQ@3 @(@ (@(@ ?@8Q@3 @@@xQ@?aG??????У?У?У?Q?Q??@@@(@p??@# @3 @XQ@0@@{@@>?@?aG???????У@@XQ@Q??Ǯ@# @@# @(@(@@`@\(???Q??aG??Q@ @ @(@Q@?У??aG??Q?Ǯ@Q???O\)?\)?@?aG??Q?p?@?\)??!G?O\)?O\)?@?\)>G>G?\)?\)>G??O\)>\??\)?0??!G?O\)?O\)>G?!G?O\)?O\)??!G?O\)?O\)?aG>?>G?aG?Q???????>>>>>?!G?!G>G??Q??Q??Q?Q>\??!G>\?>\>>>>>>>?aG?@@@{@ @ ???????O\)????Q??>\?!G?>\??!G?!G?aG??@????????@hQ@@{@@(@{@@{@(@(@\(@,(>G?\)?O\)?p?aG?aG?O\)?!G?aG??aG?@???aG??У@ @@@@(@Q?@ @L(@S @C @0@ (@HQ@(@,(@HQ@L(@Q@Q?p>G?\)?0?0???!G?!G?@?@?@?!G?!G>\??У@ @0@XQ@hQ@p@\(@s @(@{@{@@(@@{@@ @Q@ ??@?!G??>\>\>\>\>\>\>\>>>>>>\?!G?!G???aG?????@?????@?aG????aG???@?@?@?@???????У@>??>\>>\>\>\>>>>\????!G?aG???aG?!G?aG?@?@?@?@?@?@?@?@?aG?aG??aG?aG?aG?aG?aG?@?aG?aG?????У?>\???>\>\??>\>>>??@?@?@?aG?@?!G?aG?!G?aG???@?!G???!G??!G?!G?@?@?aG?aG?aG??aG?aG?aG?aG?????>\???>\>\??>\>\>>>>>\??!G????@??@?aG?aG?????aG?@?!G??!G???!G?!G?@?@?@?@?aG?aG???????>??!G?!G?>\>\?>\>>>??!G?@?aG?aG??aG?????aG?aG????aG?aG?!G?????!G?!G?!G?@?@?!G?aG????????>\??!G?!G?>\>\??>\>>\??!G?@?@?aG?aG??????aG?@?@?aG?????@?!G??!G?@?!G?@?@?@?@?@?@?@??????????!G?!G?>\??>\>\?!G?@?@???????????aG?aG?@??????@?!G??@?aG?@?@?@?aG??aG?@?@?????????@?@?>\???>>???aG?aG????У?????????????????!G?!G?aG?@??aG????aG?@?@???У??У>\?!G?@?aG?!G>\???>\>>\??aG????????????@@@0@???????@?@???????????????!G?@?aG?@?>\??>\?!G??@???У?????У????У@@(Q@ @Q@???????aG?aG???????????@@Q>\?@?@?aG?!G>\>\>\>\???aG?@?@??@@@ @@@@Q@ @ @?@?@@0@0@ @Q@?У???aG?aG??????????@@ ??!G?@?@>\>\>\>>>\?@?!G?!G?!G?aG?У??@@P@P@XQ@HQ@@@HQ@@@8Q@Q???@Q@@@(Q@@@8Q@Q???aG?aG?У@Q@@@Q?????@Q@@>\?!G?!G?@?!G>\>>>\?>\??@????@?@ @0@@@@HQ@(Q@(Q@@@0@8Q@(Q@Q@Q?@Q@(Q@P@8Q@Q?????@@ @Q@Q@Q???У?@@XQ>??!G?!G?@>\>>>>\>>\?????@?@@0@0@ @(Q@8Q@0@(Q@0@@@P@p@hQ@(Q@Q@Q@Q@@@(Q@@@ @Q?У???@ @@@0@8Q@(Q?У??@@(Q>>\?!G?!G?@?@>>>\>\>\>\?!G?!G??@@ @P@hQ@(@(@@@xQ@p@xQ@P@P@xQ@(@@@XQ@0@Q@@@Q@8Q@@p@ ?????@HQ@8Q@@@@@??@@Q>>???@?@>\>>>\???@?aG?!G??!G?aG??@Q@p@(@(@(@@(@@(@@(@(@(@@@@(@(@@P@Q@@Q@8Q@P@`@(@@ ????@ @HQ@HQ@0@(Q@Q?@Q@(Q>>\?!G?@?@?!G>\>\??!G?aG???????@ @P@(@(@@A@@(@@@@@(@(@@@(@(@(@@`@@@0@@@HQ@P@xQ@@(@Q????У@(Q@HQ@0@8Q@8Q@Q@Q@(Q>??@?@?!G>\>>\???aG?@Q??У??У??@`@@(@(A {A@(@(@(@(@@(@(@(@(@@@@(@(@@@p@@@@@XQ@`@p@(@@hQ????@@8Q@8Q@HQ@HQ@(Q@Q@ >\?@?aG?@?!G>\>>\??@?@?@@ @Q@@Q@HQ@@AAA {A{@@(@(@@@@(@@@(@(@@(@(@(@(@(@@`@XQ@HQ@P@@@@(@hQ@Q?У??У@ @8Q@8Q@@@HQ@Q@Q??@?@?!G>\>>>>\??@??@@Q@8Q@p@hQ@P@p@(@A{A(A$AA{AAAA{A(A.{A4A&{A,A<A6{A0A$A {A{@(@(@@p@P@@@Q@ @@@@(@p@??@@ @0@0@@@ @?!G?@?!G?!G?>>>\>\>\?!G??@Q?@Q@`@(@(@@(@A A4A8A&{A@AXAxATAb{Af{APA<A6{ALAlAdA^{AZ{AZ{ALA{@@(@(@(@HQ@XQ@0@Q@ @@@(@@HQ@?У?@Q@(Q@0@8Q@0@Q>?>\??>\>>\???!G?aG?@Q@Q@Q@8Q@@(@(@(@(@(A>{A:{AN{AhAAAPAdA`AN{A<AF{ATAR{AF{AB{A*{A{APAb{AN{A{@@@(@P@@@`@Q@@Q@(@(@hQ@Q??@@ @@@P@P@ >\????>>>\??!G?aG??@Q?@(Q@@(@(A{A6{@AAb{A\A =AAAR{Af{A =A^{Ab{AxAr{AdA`AR{A*{AAAJ{A =AAlAB{A@@(@(Q@0@0@Q@@@@@@XQ@Q@?@(Q@P@`@hQ@8Q????>\>\??!G?@??У@@@Q@0@hQ@`A{AF{A^{A*{A{AA =A =AAr{A =AA =AAAA =A|AxAlALA>{A>{AN{ApA =AAAHA@(@hQ@ @@@Q@Q@8Q@(@@(@0@0@@(Q@`@xQ@@@????!G>\>\??@??@Q@Q@Q@0@XQ@@(A$A^{A =A^{A{A =A =A =AAAA =AAA =AAAAAAv{AXALAF{AN{AAA =AA8@@(@0@Q@@@@ @HQ@@(@P@HQ@(Q@0@xQ@@@XQ>??!G??>\>\?!G?@???@@@Q@P@(@(A{A6{A`AAA@A =AA =AAA =A =A =AAAA =A =A =AA =A =Az{A\AHAb{A =AAAN{@(@(@XQ@@@@ @@0@@@@P@@@XQ@@@@p>\??>\>\??@???@@@Q@XQ@(@A:{A =AAA =AAAA =A =BBBBBAA =A =A =A =AAAApA\AB{A(AB{A =AAA,A @(@@@@@@?@ @@(@@p@`@hQ@@(@(@xQ>>\?>\>???aG???@Q@Q@(Q@p@(A{A^{A|Ar{ABBBB B+BBB+B#BBAA =AAAA =AAAf{AR{ADA@A*{A =A =AAB{A{@(@@@@@XQ@(@@(@@@@(@(@(>\>\?>\??!G?aG??У?@@@HQ@@A6{Aj{AxA =A =A =AB BBBB+B6BEB:B#BAAAz{AtAAv{AxAR{A>{A*{A{@(@AJ{A =AA^{A,@(@(@@ @Q@0@@(@@(@(@@@(@>\????!G??У?@Q@Q@@hQ@(A{A@Ar{AlAA =A =A =B BBB#B'B\BnBdB^B1BAAxAJ{A^{ApAb{AN{A6{A{@(@(@(A AA =AdA,A@@(@XQ@@(Q@(@(@@@A{@(@@>?>\>\>\?!G???@Q@Q@HQ@@A AXAr{A`A =AA =AABBBBYBBBBBTBAA`A6{A<AV{ALAHA2{@@(@xQ@@(AF{AAPAA{@(@@@ @P@@(@@(AAAhA>{A2{>\>\>\?@???@@ @p@(@(A0Aj{Aj{AdAA =Az{AA =BBB3BBBBBBBfB3BA =Ab{AA&{A0A4A8A.{@@@8Q@XQ@(A A^{A6{AA{@(@(@@@@hQ@@(@(@AAr{An{AJ{A.{>>\??@???@Q@(Q@(@@ALAlATA =AAn{A`A =AB)BBaBB߀BBdA =AA =AA\A AA A*{A"{A$@(@0@@0@AA<A"{A@(@@@@8Q@XQ@@@A{A^{A =Aj{A^{A{??@???@(Q@@@(@(A{ADAr{AR{AAAJ{AXA =AB4B%BBCBBA@(Q@@A$A@(AAA{A{@@?@@`@A{A{@(@@@@@0@0@(@AA2{A~{A =A~{AN{A{?!G?aG??@@0@P@@(A AF{ApAZ{AApA8ADA =AB5B4BBBBBBBBA =@>\?@p@@(@A{AA{A@hQ??@@HQ@A{@(@@(@(@@@p@@AAAN{A~{A =Ar{AJ{A>??@??@@HQ@XQ@hQ@AALA\AZ{Az{ADA*{A.{A|ABB3BBBBA =@(??@XQ@@@@(A{A{@(@Q??@Q@P@@@(@@(@@@(@(@(@A{AAf{AAAtAPA{>>??aG??@ @@@@@HQ@A(AJ{A\AN{Af{AA&{A"{AV{A =A =BBlBBBmA =@(@@xQ@(@(@(@@A @(@?У?aG?@@XQ@(@(@(@(@(@(AA @(@@(A{A {A =AAAlAJ{A>???aG??@Q@XQ@(Q@hQ@A{A:{AR{A:{AT@(AA$AHAAb{A =B-BrB{B&AA@@@@(@(@(@@(@@(@?aG?!G?У@Q@P@@@@@AA*{A{@(@(@(AA0A =AAAn{AJ{A{>>?????@@8Q@0@hQ@(AA*{A0A,A<@(@A"{A>{AXA&{ApA =AB%AAA@@@@(@@@@@??aG?@(Q@@@xQ@(@(@(@AA0A@(@@A{A4AA =AAdAL@>>>???aG??@Q@P@0@p@(AA&{AA{A@(@(@(A{AXA {A{A^{AAA =AD@(@@@@@(@(@hQ@Q??У@@0@8Q@`@@(@(@A*{A4@(@(@(@(A{Aj{A =AAAf{A{@>>\>>\>>\>\?!G?>\>\?aG??@@@@ @P@A{A{AA A{@(@P@(A{AB{A*{@@(@(@@@@(@@`@P@`@XQ@ ???@Q@(Q@ @0@XQ@@(@(A{A6{AB{@(@@A {A$AA =AA =AdA@(>>\>>>??@?aG?@???!G>\?@???@0@ @8Q@(@A A{AA@@(Q@(Q@A2{AB{@@xQ@@(@??@Q@@????@?@@ @ @Q@0@XQ@(@(A A"{AJ{@@@(@(A {AB{A =A =A =Af{AP@(@>>\>\>\??!G?@???@???!G>\?@???@ @(Q@0@@(A{A @@(@@XQ@@Q@(A{A$@@(Q@P@P??aG?aG?aG??@??!G??@@@@Q@8Q@xQ@(@AA2{A@@@(@A2{Ar{A =AAA =A@@>\?>\??!G?@?aG???aG?!G??!G??aG???@Q@@@0@@(AA{@(@@@(@?У@@(@@(@`??У?У??@??!G??@@??@Q@(Q@HQ@(@(@(A{A@@(@(@(@(AA@A =A =AAAV{@@A{>\???!G?@?aG??У???@?!G?aG?!G>\?@???@@hQ@HQ@hQ@A@(@@@(@(@8Q??aG?@Q@HQ@`@ @Q?У?У??????@Q@???У@@Q@8Q@@(@(@A @@@(@@(A$Az{A =A =AAA{@(@AT>\?!G??@?aG??????aG?aG?@?@?!G>\>\?@??У??@P@XQ@`@@@@(@@(@@p@??@?!G?@??@@@Q@Q???@Q@Q?????@Q@(Q@`@(@(@(A{@@(@@(@AATAA =AA =Al@(@A{Ah??!G?!G?aG???@??У??aG?aG??aG?!G??!G??У??@ @`@hQ@@(@(@(@@(@(@(@@@Q??!G????@??????@?!G?aG???У@@Q@P@@(@(@@@(@(@(@p@(A&{AAAAAA@p@AF{AJ{>???!G?aG????@???????@?@???У??@@`@@(@(@@@@@@@@0@Q??aG???@???@@8Q@hQ@@(@A{@@(@(@XQ@AA^{AA =AAA.{@(@xQA{ApA$>???!G?aG????@Q@ ?????????????@(Q@@@(@(@@@@(@@(@(@@@Q???!G?aG??У@Q@0@P@XQ@xQ@@(@@@@P@(@A8A =AAAAj{@(@hQ@(AR{AH@>???!G?????У@Q@XQ@Q?У??????@?????@Q@`@(@@(@(@@@@(@(@@@`@@@Q??aG?!G???@@0@@@hQ@@@`@XQ@XQ@8Q@XQ@A{AAAA =Av{A@p@A(Ad@(@(>>\??!G?@?aG???@Q@(@P??@?@@??aG?????@0@hQ@(@@@@(@@@@@(@@@@hQ@ ??!G??@???@@Q@HQ@@@@@@0@0@8Q@A{Ar{A =A =AA =A @@A {ATA,@(@XQ>>???!G????У@@p@p@(Q@@Q@@Q@Q??aG?????@@@@(@(@(@@@(@@@(@AA@@@`???aG?!G??!G?!G?@???@Q@HQ@???У@Q@@@@A {A`A =AA =AA8@@hQ@AXAX@@XQ@8Q>???!G?@?aG??@@p@@(@0@@@Q@@0@HQ???????@(Q@`@(@@(@@@@@(@(@(A"{ADA@(@XQ@(Q@ @@?У????@?!G?aG????@@0@AA^{A =A =AA =A6{@(@p@(A@AZ{@@(@0@0>\??!G?@?aG???@@@(A{@`@@@(Q@@@@`@0??????@@@@(@@@(@@(@@(@(@(@A"{A>{A @@@`@XQ@HQ@8Q@0@Q@ >\?!G?!G?!G?@?aG??@XQ@(A AhA =AA =A =A@@@xQ@A{Ab{A"{@@ @@0>\?!G?@?aG???@(Q@(AV{@(@@8Q@Q@ @XQ@`??????@@ @xQ@(@(@(@@(@@@@@(@A A{A{@@@@@p@xQ?@????@?@???@0@(A(A|AAAA|A*{@(@@AATA @(@(Q@@@Q>\??@?@???@@@PA A@@@ @Q@`@@P??????@@8Q@(@@@@@@A@(@(@(@(AAAA A{@@(???????@@0@@A4A~{AAAAA{@(@@xQ@AV{A@@Q@ @Q@@>\??@?aG???@ @HQ@(A*{@(@@@@@8Q@p@p@0?????@@@P@(@@@(@@(AA A A A{A AA&{A$A {A(@@(@hQ@@@ @Q@ @`@(@(@(AAAAA =Ab{A&{@(@@@(A0@(@(@ ??@@@(>??aG?aG??@8Q@XQ@AA(Al@@@8Q@`@@??????@Q@(Q@(@@@@@@AA A8A6{A8AB{APAPAV{A@@(@(@(@(@@(@(@AA>{Ar{A =AAxA{@(@@p@@A {@(@P@Q??@@@@p>\?!G?aG??@HQ@`@0@(A6{A>{AA{@@XQ@@@ ?????@@ @P@(@@(@@@(@@A.{A^{AdAtA =AAA>{A0A4A2{A{AAA&{A{A8Ab{AdAb{A@ADA$@@@@(@(@(@(@HQ??@@Q?@(@@(>\????@0@(@@P@(A4A =ADA{@`@XQ@p@XQ@Q????У@@ @@@p@@(@(@(@(@(@A{A6{A`A =AA =AtAlAhA|A =AlA\AAb{A`AB{AF{A8A{@(@(@(@hQ@@@@(@hQ@Q@ ??@@?@@@??@??@8Q@@@HQ@(A A*{AATA4@@hQ@`@(Q?????@@8Q@`@(@(@@@(@AA@AA{A{A:{A^{A`Av{AA~{AAtAR{A@A>{A@@(@(@@@p@(@A =A =A@@@(@(@@@(@(@@(@xQ@hQ>\?@??У@@@@@HQ@(A4APA =A^{@@@(@(Q@????У@@0@XQ@@(@(@(@(@(@A{AA6{A@@(@A A*{A&{AA>{A.{@@@@p@8Q@(AA2{AF{A0A.{A6{A@@@xQ@XQ@(@(@@(@(@(@xQ@hQ@P?@??У?@8Q@@(@p@A&{AHAAAd@(@@@0@Q???@@Q@HQ@p@@@(@@@(@@A{ADAn{A =AA@(@(@@@(@@@(@HQ@(@(A {AA&{A,A2{AA@(@@xQ@p@p@xQ@@@(@@`@HQ@??aG?У??@XQ@@(@XQ@(A|ApA =AAx@@@P@0@???У@Q@0@`@(@(@(@(@@A{A&{A$A:{A6{A^{A =A =AA =AA =AAA =A =A{@(@(A$A`A =A`A*{A@@(@@(@@(@(A{@(@@XQ@`@A{?@???У@0@(@(@(@(A$A =Az{AAA =@@(@0@Q????@ @@@hQ@(@@@@AAAAN{AhAb{AAAAA =A =AA =AAB{A>{AF{AlAdAZ{AB{A0A@@(A{@@(@@@(@(@@(@@(A@??@?@?У@hQ@@@AAXAAA =A =At@(@xQ@(Q@???@Q@0@P@xQ@@(@@@@(A{A.{ATAhAApA =A =AAA =A =AAA =AAdA,A.{AAAA4APAN{A{A<A&{@(@@A {AAlAN{A A{>\?@???@(@@@(A6{AAAA =AAPA{@(@8Q@Q@??@Q@HQ@hQ@@@@(@@@(A{A<AR{ApA =AAA =AAAAA =AA =Av{Af{ALAF{AhA =A =A =AtAlAZ{A@@(ALAAtAA8A @>\?!G?aG?@(Q@@A@(A AAA =AAAA =A@@@8Q@(Q@Q@Q@@@@@(@@(@(@(@A{A$A@AN{A =AAA =AAAlAA =A =AAAA =A =A =A =A =AA|AlAA {AA =A =A =Az{A>{AN{A@>\???!G@@ @@@@A0AAAA =AAA =A {@@@@p@8Q@@0@p@(@(@(@@@(A{A4APAPAj{AhA|AtA =AAAAAAAA =AA =AAAAA,A2{Az{A =AAA =AAAR{A"{A@(>?????@8Q@(@(@(@(APABA =A =AAALA(@(@@@@p@8Q@@@(@@(A{A0A(A4AdAxA~{A =A =A^{A =AA =AAAA =A =AA =B B BA =A =AA =A =A =A =BB AA =AtA(AA"{@>\?!G?!G?!G?@?@HQ@@@(AAxABAAA =AA =AN{A"{A{@@@@(@(@(@(@(A(ADAtAA =AA =AA =AA =A =A =AAA =BBBBAABB B&B BBBB AAxA6{AATA @@xQ>\?aG??!G?@@Q@@(@A{AAA =AA =AA =A =AA^{A0@(@@@(@AA&{A@A<ADALAAAA =A =A =BBBBB B&B>BABBBABlB_BLB'BB%BA =Aj{AR{A A{@(@@@hQ>\??@?@?aG?@ @(@@(AAj{A =A =AA =A =A =AAA =A =A6{A@@@(A {ALA`AA =AAAAA =A =AA =BB BB*B=B>B<BIBMBbBWB,BBBBAAR{A,A{@(@(@(@hQ@`@p>????!G?aG?@Q@@0@A ATA =A =A =An{A =AAAAA =AA =AV{A&{AA$AB{AR{A|A\A|A =AA =A =BB"BBBRBOBDBNB]BTB\BBB+BBBBA =AA =A@@(@(@xQ@XQ@p@(@xQ>?!G???aG?@?@?@8Q@ @(A{AZ{A =AA =Ar{AA =A =A =A =A =A =A =AA =Ar{A =A =AA =AABB B'B3BOB>BTBVBABDB-B BBB%BAAA =A =AP@(@@(@@@`@(@(@@P>>\?!G????!G?@???@0AAAAAAv{A\Az{AAA =A =AAAAA =A =AAAA =BABB0BIB>BGB)BABBB'BAAAj{Af{ADA @@@@(@xQ@p@(@@(@`@HQ>\???????@ ??@`@A@A =AA =A|A2{A8AdA\AlAb{ApAxA =AA =AAAAA =AA =A =AAA =AAA =A =AAZ{ALA&{A@@@@(@@@@(@(@@@XQ@P@@??!G?@(Q????@Q?У?aG?@hQA,AA =A =A =Aj{AAAN{An{A =AlAR{AXAxA =AAA =A =A =A =A =Az{AAAAN{A.{A{AA{@@(@(@@(@(@@(@@(@xQ@`@HQ@@@8Q@0@Q>???@????@(Q???aG?@(A AAA@(A{@(A{A =AAAdA.{AAA{A A{AAAA {AA A@(@(@@@(@@@@(@(@@(@(@p@P@8Q@(Q@ @@Q@?У>\?@??????aG?????aG??@Q@(@(A8A$@(@@A*{ATA =Aj{Az{ATA8AA@@(@@@@@(@@(@(@@@(@(@@@(@p@XQ@8Q@Q@@Q@Q?????>\?!G?????aG?@?@?@???aG?@??У@@ @(Q@0@8Q@@@HQ@HQ@P@(@(@AA*{A AA@(@(@(@@@@@(@(@(@(@(@@@@P@0@??????????>??aG?????@?!G?@?aG?aG???aG??@@@Q@@@?@@0@P@(@@@@@@(@(@(@@@@(@p@xQ@xQ@p@hQ@XQ@@@ ?У????????????>>??@?????@?@??!G?aG?@???????У????@Q@@ @ @0@HQ@0@0@@@(Q@ @@@0@Q@@Q@?@?У???????aG?aG?@>>>>?!G?@?aG????@?!G??@?@?aG?У???????У?У???У@@?????????????aG?aG?aG?aG?aG?aG?@?@>>>>>>??!G?aG????aG?aG?@?@?!G?!G?aG??????У?У???????????@?aG?!G>\>\>>>>??@??????????У@(Q@HQ????@@ @??????????aG?@>\???>>>>\?aG????????У@@XQ@(@@@???@Q@@0@HQ@0@@@HQ@xQ@8Q@Q??aG?@>\??>\>\>\??aG?????У@Q@ @8Q@@@hQ@(@(@8Q@HQ@ @8Q@@(@(A AA$A{@@8Q@(Q@0@(@(@hQ@xQ???>?aG>\??@?>\>\>\>\??aG????У@@XQ@HQ@hQ@(@(A(ADAXAB{A@@@(@(@@@@@@(@xQ@@@(@(@8Q??aG?aG?aG?O\)?aG???>\????!G?@?aG?!G>\>\???У??@ @Q@XQ@(A {A {A$A =AA =AA =A =AN{@@(@(@XQ@HQ@`@(Q@@HQ@@XQ@8Q@(Q@HQ???@ (?У@ @@Q@# @HQ@ (>\??!G?@?@?@?@?!G>\?aG?????@@@@(@(@(A {A6{AJ{Av{A~{AZ{A4ApAZ{A{@@@(@@hQ@P@P@@`@@???@ @(@{@A =@(@(@(@c @Q@ @L(>\??@?aG?@?!G?!G?>??@????У@Q@Q@ @HQ@XQ@(@(@(A @A{A{A{A@A{A8A&{A4@A{AA0A =AlAAzA =AAA =A@@@@c @|(@(@(@{>\?@?aG???aG?@>>\??@???????@Q@XQ@@(@(@@(@(@(@(AA@AA =BAB<B(B;B;BA =AAAzAhA@(@@@@(A@?!G?aG?????!G>\??!G?aG?????@Q@0@XQ@XQ@8Q@8Q@P@hQ@(AAAB%B)BB&B BA =AA<Ar{ApAA =A =@{@{@@{@{@p@8Q??aG????aG?>\>\??!G?!G?p??Q@Q@@@Q@(Q@HQ@(@(@(AdAf{AxA =AAALA~{A>{A"{@(A@{@(@{@{@HQ@P@3 @0@(Q??>??@?aG?aG?aG?>\???O\)???У@Q@P@(@(AA4A*{A$A.{@@A{A {@@@@XQ@ ?Q??У?Ǯ?Q??!G>>\??>\>\>R???У@Q@@(A{A{A{A A*{@{AA&{A@@xQ@@8Q?У?Q??O\)?O\)?0>>??p??@@@@@@(@{@{@(@@(@P@(Q@ (???@>R?\)?O\)??@0@xQ@xQ@8Q@XQ@@XQ@HQ@0@?У???O\)>\>R>G?\)?0?@?????Q????????O\)?!G>R>\>\???!G??0?O\)?O\)?@?!G?aG???@>\>R>G>G>\??!G?\)>\?!G?@?aG?aG?!G?>R>R>G?\)?!G?0?@?aG?aG?aG?aG?@?!G??>R>G??\)?\)?!G?0?@?aG?aG?!G?>R>\>\>\>\>\>G?\)>G>G>\>?>>>??@?>G>?!G?0>>>>>>\>\>\>\??!G?@??aG?p?@>G>\>R???!G>\?>\?>>>>\>\??!G?!G?!G?!G??>G>???!G??>>>>>???0?@?0?0>R>>>\???>\???\)>>\?\)?\)?\)?\)?\)>\>R?>>>>\??p?aG?0??>\>\??\)?\)?>R>>>>?@?!G?0?\)>\?>R>\>\??\)>\>R>>>>>>>>>>\>\>\>\>\>R>R>R>G?!G?0?!G>G>\>>\>\>>>>>>>?>?>\>R>\?\)?!G>G>G>G>R>\?!G?@?aG?!G??!G>\>\>\>>G>R>>R>\?0?Q??p?\)>R>R??0?!G>??@??@0@p@(@p@(@p@0@ ?????@>\>>\>>\?!G?aG???>>\??@?aG??У@ @(@(A@(@(@(@XQ@ @Q@???aG?!G>\>\>\>\>>>\?@???У>\??!G?@?aG??У?@(Q@hQ@@(@(@(@(@(@xQ@8Q@?У???@?!G>\>>\>\>>\????>>\??aG?@?aG???У@@Q@8Q@hQ@(@p@p@@@(@@0@Q?У???@?>\>>>\>\>\?!G??>>\?!G?@?aG?aG??@?У@Q@8Q@@@@@@xQ@hQ@@@(@hQ@@(@0@Q?У???!G?>\>>>\??!G?>??!G?@?aG??У?@@ @Q@8Q@xQ@HQ@`@@@@@(@@(@@@ ?У???aG?!G?>>\??>??!G?@?aG??@ @8Q@@@@@HQ@p@p@0@XQ@(@(@@@@@HQ@ ?У????aG?>\>>\??@>>\>\??@??@@HQ@(@@(@hQ@p@hQ@xQ@@XQ@@@@@(@@8Q@Q?????@?>\>>\?!G>\??@?aG???@ @(Q@8Q@hQ@P@P@`@hQ@@`@(@(@@(@(@(@@(@`@0?????!G?>\>\?!G>>\??aG???У@Q@@0@@@P@(@@(@@@@xQ@(@@@@@(@@(@(@(@8Q@Q???aG?>\>\>>\?!G>??@?@???@Q@Q@hQ@(@(@@@@@@@@@(@@(@@@@@@@(@(@XQ?У??@?!G>\>\>\>?>>\??!G?@??@@hQ@@(@@@(@(@@(@(@(@@(@(@(@(@(@@(@(@@(@@@`@???@?>\?>\>\>>\?>\?!G??@@@hQ@p@(@@@(@(@@(@@(@(@(@@(@(@@@(@(@@@@@XQ@@@0@???!G?>\>\>>>>>\>\>\>\??!G??@Q@HQ@@@(@(@@@(@(@(@(@(@(@(@@(AA{@(@@(@@`@0@P@p@hQ@p@@@??@?>\>\>\>>>\?????@??У@@`@xQ@@@(@(@@@(@(@(@@(@@@(@(A{A{@@@(@@P@(Q@0@xQ@xQ@@hQ@0???@??>\>>>>\???!G?@???@Q@(Q@(@(@@(@(AAAA{A@A@(@@(@(@@@@@@(@(@@xQ@@@(Q@P@hQ@p@XQ@ ??@?!G?>\>\>>>>\>\??!G??@Q@ @@@HQ@@@(@(AA{A"{A(A4A AAA$A{AAA$AA{@@(@@(@@(@@(@hQ@(Q@@@@hQ@hQ@P???!G??>\>>>>>>>\??!G??У@ @p@hQ@XQ@p@@(@(AA(AN{AXATAPAAA{AA(A&{A2{A.{A@@(@(@(@(@(@@(@@HQ@Q@@8Q@XQ@HQ@??aG?!G?!G?>\>>>>>>>??!G??@@hQ@(A@@@@(A A<AdA =A =AAlAXA@A4ALA:{A2{A<A$A{AA(A{A{@(@@(@@(@hQ@ ?@@P@p@HQ?У??@?!G?!G?>>>>>\>>\?!G??@@`@AA,A{@(@AA:{A^{AlAA|An{AtAPAJ{An{An{Aj{AR{ALAPAR{AJ{A0A>{A4A{@@(@@@XQ@@@@@ @(@@ ??@?!G?!G?!G>\>>\>>>\>\>\>\?!G??@@HQ@(AA{A,A<@(AA*{AJ{AN{AJ{ALADAN{ALAj{AA =A =AAAAApAN{A<A4A.{A{@@@@(@(@P@0@@@@(@8Q??aG?!G?!G?!G>\>>\>>\>\>\>>\???@@@@@A A,A@AV{A{A{A A(A<AN{AN{AdAxA =A =A =AAAA =A =AA =A<A2{A0A{A{A@(@@@(@xQ@0@?@Q@(@HQ?У??!G?!G?@?>>>\?>\>\>\>>\???У?У@ @(@(A2{A{A:{A:{Ab{AA{A4APA\AlAA =AA =A =A =A =A =A =AA =AAlAtAxAhA>{A4A,A{@(@@(@(@@@?@Q@@???!G??@?!G>\>\??>\>\>\>>\??aG?У@@0@p@(@A{A{A4A6{A6{A@AA:{AAA =A =AA =AAA =A =A =AA =A =AA =A =AAAAv{Ab{A0@@(@(@(@@Q?@@0@(@(Q??aG??!G?@?>>\??!G?>\>\>\>??aG?@Q@(Q@XQ@A{A&{@A{A A8AlAA AA =AAAxA~{AxAAAAA =AAAA =A =A =AAA =A =A =Af{A$@@@@@8Q@Q?@@@p?У??!G?!G?!G?>>>\???!G?>\>\>>\>\>\??@??У@@0@@(A&{A,A {AA A>{AA =ALA =A =AA|AA =AAB BBAA =AA =A =A =A =AA =A =AAA =A{@(@@@(@P@8Q@Q?@P@@??!G?!G?!G?!G>\>\???!G?@>\>>>\>\>\??@???@(Q@@@A$A {AA$A>{Aj{Ab{A =A =AA =A =A =AABB2B-B#BBBA =A =AAAAAA =AAAA4A@@@@@hQ@(Q@Q@(Q@(@8Q??@?!G?!G?!G?>>???!G?@?@>\>>>>\???!G???@Q@HQ@@AA6{A {AA.{AJ{AR{AdAA =BAAA =AB@BcB[B8BA =A =A =AA =AAAA =A =AAAAApA6{A{A @@(@@P@@Q@xQ@p?У?aG?@?@?!G?>\>\???@?@?!G>\>>\>\>\????aG??У@@(Q@`@(@AA$AA A,AHATA =AABAA =AB=BnBBBBmB5AA =AAAA =Ab{AAA =AAA =AAAdA4A{@@(@@@@@HQ@@Q??aG?@?@?!G?>????@?aG?>\????!G?!G?@???@Q@HQ@@@A0A&{AA{A&{A<AHAAABAA =B BBBBBBBBiBAAz{AdA =AADALAdAtA =A =AA =AAz{AV{A@@(@@@Q?У@0@(@ ?????!G?>\?!G?!G?!G?@?!G>\?????!G?aG???У?@ @XQ@(@(AATA"{AA{AA2{A4AA =A =ABBBgBBCGBBBB_BAA8A*{AN{Aj{A8A A<AF{AV{A`AdAn{AhA\AV{A{@@(@@@ ?@(Q@@@?????@?>\?!G??@?aG?>>\??!G???@???У?@@@@(@(@(AATA{A{A{AAA>{AAAA =B+B#BDBBBBBB|AA2{AtAp@(@(A{A,A&{AA{A$A(A8A@AJ{ALATAN{A@(@@(@(@8Q@@HQ@(@p??????!G??@?!G?@?@>\>>\??!G?!G?!G?!G?aG??@@@ @XQ@@@A AF{A{A{AA{AAF{AAA|ABIB+B/BBBA =@?@hQ@@(@@A{A @(@(AA{A{A"{A2{A8AF{AR{A @(@@@@0@@@@@xQ@@@0@?У?!G>\?!G?!G?@?@>\>\??!G?@?@?@?!G?@???@Q@(Q@@@hQ@@(@AA@A{@@AAAF{AAA@ABNBBBBLB(A@(Q??@p@XQ@@(@@(@@(@(@(@A{AAA0A>{A{@@@(@(@(Q?@(Q@@@Q@@@p@0?У?>>\?!G??!G???>\??!G?aG?aG?aG?@?@??@@Q@0@XQ@xQ@(@@(A A4@@(@AA{AF{A =An{A{ABA =AA =A =A =A =@(?@@@@8Q@XQ@(@(@(@@(@@@@@AA"{A(A{@@(@(@@XQ@8Q@p@(@@8Q@(@(@@?У?>\?>\?>\>\?@?!G???@???aG?@?aG??@Q@(Q@P@`@hQ@(@(@(AA@@@AA{A*{A =AlA{A A =A =AhAA AZ{AJ{@(@@@HQ@@@@@XQ@(@@(@@@(@(@@(@A{A A*{A{@(@@@(@@(@(@@@HQ@(@(@HQ@Q@>>\>\>\?!G?aG?aG>\>>\?!G???aG?aG?@?@ @8Q@`@XQ@@@(@(@(A@@(@(@A A AAZ{A@(@@(@AZ{@@(@(@(@(@`@XQ@P@@(@(@xQ@XQ@XQ@P@`@@(@@(AA{A$@@@(@(@(@(@A@@p@(@@hQ@Q@0>>\>>>\?aG??aG?>\?!G?aG???aG??@@@@@@xQ@hQ@@(@@(@@(@@@(@A{AAn{AX@(@(@0??@(@(@Q@HQ@@(@xQ@`@`@`@HQ@@@0@8Q@(Q@(Q@HQ@xQ@(@@(A{A A"{@@@(@@@@(A{@(@(@@(@hQ@0@`>>>>??aG??aG?@??@?aG?????@8Q@`@xQ@@(@@@@(@@(@(@(@@(@AA:{A`@@@HQ??!G?@HQ??У@@(Q@0@ @@@Q@Q@@@@@@@`@(@(@(A{AA{@@(@(@(@@@A @@A@@hQ@HQ@(>>\?!G?????@?@??????У@XQ@@@(@(@(@@(@(@(@(@(@(@(@(@(@(A6{A>{A {@@P??!G????aG??????????У?@@@@p@@(@(AAA@@@@@@(A A(@(AA{@(@p@xQ@>?@??????aG??@???У@@@(@@(@@(@@(@(@@(@@(@(@(@(@@@(A @(@@??@?!G?!G?!G?@?@?aG??????@ @HQ@p@(@@AA@(@@(@@@@(A&{A{A{A@(@@@(@(?aG???@?У??@@Q???@0@`@@@@@@(@(@@(@(@xQ@@xQ@(@@(@A{@@HQ???!G?!G?!G?@??У@Q@(Q@P@hQ@(@@(@(@@@@(@@@(A{A,A {A A @(@@@(@(>?aG??@@@??У@@?@Q@@(Q@HQ@(@(@@(@(@@@@(@(@@p@hQ@xQ@(@@(@@@HQ???@?aG?@@@0@HQ@`@(@(@@(@(@@@@@(AA"{A{@AA {@@@@(A>{???У?@@Q??@Q@@Q?@Q@(Q@@@(@(@(@(@(@@(@@(@(@(@p@HQ@`@xQ@@xQ@`@XQ@P???>>>>???@@@(Q@HQ@@@(@(@@(@@@(@@A A"{@(A{A@(@@(@@(A>?aG???@@@0@?@8Q@HQ@(Q?@ @(Q@@@hQ@A@(@(@@@(@@@(@p@P@8Q@0@@@8Q@0@?????aG?@>>\>\>\???У?@Q@@8Q@xQ@(@(@(@@(@@(@@(@(A{AA{AA{@(@@(@(@AR{Bn>?aG??У?@Q@ @HQ@ @hQ@`@(Q?У@Q@(Q@HQ@8Q@(A{@@(@(A@(@(@@@p@HQ@0@Q@Q@(Q@@@(Q???aG?@?@?@?aG?>\>\????У??@@0@`@@(@@@@@(@@(@@(AA6{A{A{A{@(A@A{AB+B>\>\???У@@P@P@Q@(Q@@(Q@?У@0@8Q@(Q@XQ@(A{@(@A{@@(@(@@p@@@ @Q@Q@ @8Q@8Q@???aG?!G>>\??!G???@@@0@XQ@@(@(@@@(@(@@@(@(@AA.{A A{AA A@@ABBBB>>>???@Q@xQ@@`@XQ@@P@Q?У@0@ @Q@@@@(A@(@A{@@(@(@xQ@`@0@@Q@@ @(Q@ @????!G>>\????@@Q@0@HQ@XQ@(@@@xQ@@@(@(@@@AA$A$A"{A{A&{A(A {@AB4BB>>>?@?@@(Q@XQ@xQ@(@@@@xQ@(Q?@0@Q@Q@8Q@P@AA @(AA@@(@(@hQ@@@Q@@@@Q@@Q@Q@??У???У?У??@@Q@(Q@8Q@HQ@P@XQ@P@`@`@(@(@(@(@(@(@A {A@A4A{A4AF{A&{@HQ@0ABBBBBh>>>\??@Q@8Q@(@(@`@(@(@@@Q?@?@(Q@`@(@A{A @AA@(@(@xQ@8Q@@??@@@@Q@@Q@Q@@Q@??@Q@ @(Q@(Q@8Q@8Q@8Q@8Q@HQ@P@p@@(@(@(@@(@(A(APA2{ADAPA8@XQ@ @(A =BBB?>>>\??У@Q@XQ@(@(@(@(@@hQ@Q??У?@@XQ@p@(@AA{A{AA{@(@(@`@ @???У???@@@?@@Q?@Q@Q@@@Q@ @ @(Q@8Q@XQ@@(@@Q@ @ @Q@@@@AR{A`AdAF{@hQ@0@A =B BB#B>>?@@@ @XQ@@@(@(@A@(@0??У@?@@@hQ@@(A {A,A A{A(A{@@@HQ@????У?У???????@Q@@@Q@ @Q@ @(Q@@@hQ@???У@@ @@@@(@ATA =A =A|A&{@8Q@xQAXBBB]AA>??У@@@@@@hQ@@A@(@8Q@??@@@hQ@@@AA{A{A&{A*{A&{@@(@@@Q?У??У?У?@@??@@Q@@ @ @ @ @(Q@0@P??????У@@Q@0@@@A =A =A =A6{@P@A`BBA =A =A =A =>>>>?@@@(Q@XQ@hQ@(A {A @(@xQ@@??@Q@XQ@(@(@@(A{AA"{A$A>{A6{A@@HQ@??У?У?@@Q@@Q@Q@Q@@Q@ @0@P@hQ?aG????????У@0@(@(@(A =A =A =@@XQ@xQA =BB*AA"{A~{AXA =>>>>??@ @@@`@(@A A&{@(@ @@?@@@`@(@(@@(@(A{@(@A{AHA.{@@@hQ@ @@Q@@@@@Q@Q@@ @0@@@P?aG?aG?aG?aG?aG?@?aG???@P@@(@(A{A`A$@(@@Ar{B(B%BA\@A>{AXAz{>\>>>?@@Q@(Q@@@`@AA8@(@@@Q@@Q?@`@p@(@(@@(@@@(@(A{AdADA {@@(@@@@@@(Q@(Q@0@0@(Q@ @ @8Q@HQ?!G?????!G?!G?@?@@p@(A{A{A>{AA4@@@AB*B2B A@@A8AB{A.{>>\>>\?!G?@Q@HQ@HQ@@(A4@(@(@0@@@Q@Q@@hQ@(@(@@@(@@@(AA`AhAF{A{@(@(@(@@@@0@0@XQ@@@ @`>\>\>>>>\??aG@Q@hQ@@(A*{A<A\AXA*{@@AA =B9BFB A@@@(A>{A{@>>\>>??aG?@ @@@@@(A2{A{@@Q?@Q@@@(Q@@@(@@@@@(@@(@A$AN{A =AtAJ{@(@@@XQ@(@@p@xQ@(?@????!G?@?@0@@@AA"{AdA^{ALA@(AA@AB3B<BA@(@@@@(@(@(>>\>>\?@?@@p@@(@A$A8@(@0@@@8Q@HQ@`@hQ@@@(@@@(A{AAA"{AJ{Av{AA =AXA0A@@(@A A$@@@8Q@8Q@XQ@@@@A{A{A@AR{AZ{ALA<@(A{A&{AB BWBGA =A =@@(@@@(@@(@P>>\>>?@?@@HQ@XQ@@AA<A@(@HQ@ @ @HQ@xQ@p@xQ@(@(@@@@AAA{A*{A2{An{A =A =A =AAAZ{A6{A{A4AA A A6{A4A<AV{ApApAn{ApAXA.{A@(A(AlA =B5BcB5A =Ar{@(@P@hQ@@@(@(@xQ@(Q>>\?>???@@0@@@(AA*{A{@@XQ@(Q@(Q@xQ@@(@@(@@(@(@(AA{AA*{A6{ADA@ATAA =A =AA =AA =A =A =AA =AA =AA =AAN{A0@(@A.{Aj{ABBIBVBAA:{@@@xQ@(@@@@p@Q@>\??>?aG??@8Q@@xQ@(@(A$ATA@(@@@@xQ@@(@@@@A{AA {AAA4A8A.{ADA@AR{AhAhAAAAAAA =AA =A =AA^{AA{@(A4A =A =ABB)BAAA @(@@@@@@@P@Q@p@@>\??>\?@???@(Q@XQ@(@A{A6{A:{A@(@@hQ@(@@(@(@(@(AA{AAAAF{APADA2{A@A:{Aj{A\Ab{A\A<A4APAJ{A@AB{A8A{A@AA{AHAAABBA =AA2{@(@@(@@(@@(@@@?@@(@(>>\??!G?>\???@@@@@hQ@(A{A@A0@@(@@(@@(@@@(@AA*{A(A{A,A>{AN{AlAV{A>{A2{A@A(A A"{AA AA{A{A{AAAA =AAA =AA =A =AAXA @@(@@(@xQ@(@@HQ@8Q@P@hQ@8Q@@>>\??!G?!G?>\??@??@8Q@hQ@(@A{A4A&{@@@(@(@(@@(@@(@@AA{A,A"{A>{APAj{Ar{A =AAhAxAB{A6{A8AB{ALA4Ar{BB'ABBAAAAAj{A,@@(@(@(@@@`@P@@@Q@(Q@8Q@@@(@>>\??!G?aG?aG>\???@ @`@(@(A@(A.{A"{@@(@@(@(@A{@@(@@@A{AA"{A6{A:{APAxA =A =A =AAAAAAAA =B,A =B A =A~{AAA>{@(@(@@(@@XQ@p@@0@8Q@@@ @P@hQ@(@@(@>>?!G?!G>\>\>\>\?@?У@8Q@XQ@(@@@A&{A*{A A@@(AAA{A{@@@(@(@(@A{A{A,A`A =A =A =AA =A =A =A =AA =AA =AA~{ApAB{A>{A {@@(@(@@(@(@8Q@ @@@8Q@hQ@(@hQ@xQ@@@HQ@>\?!G???!G>\?!G??@8Q@`@(@@@A*{A>{A AA{A{A$A*{A8A{A@@@(@(@@@A {A8AJ{Aj{A =A`ATAtA6{A^{A@A<A$A&{A,A{A{@@@@hQ@`@P@@@(Q@@@Q@@P@P@(@`@@hQ@p?У@Q>?!G??!G?>>?!G??@8Q@XQ@@(@xQ@A{A,A0A:{A4A:{A@A4ALA<A(A{@@(@@(@@@@@(@(@@@@@(@@(@@@@(@(@(@hQ@p@P@???@P@(Q@HQ@(@@(@(@(@p@Q@Q?!G>\>?>??aG?@??@?@?@@ @@@@P@(@(A{A,ALA6{AN{AB{AHAZ{ADAR{AB{AJ{A{@(@(@(@@@p@`@hQ@p@P@hQ@xQ@p@(@@xQ@p@xQ@`@`@@@Q@Q?У??@@0A@(@@(@@(@@@@Q?@?aG?>\>>\>?aG?@?У@8Q?aG?aG?!G?aG?У@?@0@p@@`@(@A{A*{ATA\AV{AR{AJ{AN{ADAf{AF{A&{AA @(@@(@p@`@0@ @@@ @8Q@hQ@(Q@8Q@@@ @Q@@Q@??У@@@@@(A {A@@@(???@?>\>\>\>>????aG????@?aG?aG?@@@@HQ@`@@(@(@AA8AZ{AhAZ{APAn{AXAXAPA`A4A{A@(@@(@(@@(@@@P@HQ@P@Q@XQ@Q?@@ @P@(@(A@A4@(A{@@@??!G??!G??>\>>??@???@0???У?@?aG@Q??У@Q@@HQ@p@(@A{@(A{AB{AZ{AhA|AxAxA =A =AdA~{AV{AR{A2{A4A{AA{@A@(@(@@@@@@AA>{@A,A {A{AB{A{@(@Q@Q?aG?>\??!G?>\>>>\?@???????У???aG???У@@@HQ@HQ@0@(@(AA@A{A.{AV{A =A =A =AAhA`A^{AHA^{A~{Ar{A~{A~{A =A =AlAdAJ{Aj{A(AAA {AV{A"{@APA@(@p@(@Q???>\>\??>\>??@??@ ??@(Q???????@@@HQ@8Q@XQ@P@@(@@AAA{A,Ab{AA~{A =A =A =A =A =AAAA =A =AAV{AlAB{A.{AV{A(@(AA*{@@@@????aG?>\??>>>\?!G??????aG?!G@ ???@?@??@@8Q@8Q@p@p@@@@@(@@A{AHATAHAZ{A =A =A =AAAAf{AApADAAHA"{A @(@(@hQ@@@Q@??aG??@?!G>\>\>>\??@?@HQ??aG??aG?????@???@ @HQ@P@(@(@(@(@(@(@(@@(A{@(@A {AA{A0AA{A{A@@@(@(@@xQ@HQ@P@??aG??aG??>\>>>\?!G??@??aG???@??!G???@?????aG?@0@XQ@`@(@(@@(@@(@@(@(@(@(@@(@(@(@@@(@@(@@@0@Q?????aG?>>>>\??aG??У?@Q???!G?aG?aG???????aG?@?aG?aG?@@0@`@@(@@(@@(@@@@@@@hQ@hQ@p@0@(Q@ ?У??????aG??>>?!G?!G?aG??????@?У?@?@?У?????!G?aG??У?@P@xQ@@@@@@@(@@@@(@(@@`@XQ@@@P@(Q@ @Q@Q???aG??>>>>??@?@??????@Q??@@@Q@ ??????aG?aG?@@HQ@P@p@hQ@@(@@@@(@(@(@@(@(@@xQ@p@8Q@Q@????@?>\?>\>\>\>??@????У?@@HQ@8Q@Q@Q@ @ @????@?У????У@@HQ@HQ@xQ@@(@(@(@xQ@(@@xQ@@@xQ@p@HQ@0@@Q?????@???!G>\>\>??aG@@0@P?@ @P@(@HQ@@@ @Q@????????У@??У??У?@Q@ @0@@@ @0@ @(Q@(Q@0@(Q@(Q@ @@?????aG?@?>\>>??@@@(@@@@0@HQ@XQ@(@`@(Q@Q@Q?????aG?aG??@Q@?@Q?@Q?@Q@Q??????У?У?У??У????@?!G?!G>\>\>??aG?@?!G>>>\>\??@@Q@(@@hQ@ @ @XQ@@`@0@ @@??У?????У@?@@0@p@@@A@?????aG??aG??aG?!G?aG?>\>\?Q???aG?O\)?@?@=u=u=u=u=u>??!G??!G?@0@(@(@(Q@Q@0@hQ@`@HQ@(Q@ @8Q@Q???@Q@??@ @0@`@(@@A@@@(@(@@(?У????@(Q@0@ @@Q@????0=u=u=u=u=u=u??@?@?@?@??@@@8Q@@Q@ @XQ@`@`@@@(Q@Q@Q@Q@ @(Q@???@Q@(Q@(Q@`@HQ@(Q@8Q@8Q@@@HQ@HQ@`@P@ ?@Q@@@?????@=u?@???@?@>\??aG?????@ @@Q@@@`@XQ@`@P@ @8Q@hQ@HQ@8Q@0@P@8Q@P@Q?У?У@Q???@?aG????????@?@??Q?Q@ @(?O\)????@?aG???@@(Q@@@Q@8Q@P@XQ@P@XQ@hQ@HQ@ @@@Q@(Q@Q????aG???p?@ @{@,(@L(@Q@(Q@0?Q@?Q?p>\??@?@@0@@Q?@@@Q@ @(Q@8Q@ @?@@Q@Q@???aG?????У??@P@hQ??@(Q@8Q@@@(@S @L(@|(@@`@# ??У?Q?@HQ@XQ?>\?!G??@ @HQ@(Q??@@0@P@HQ@ ???@@Q@(Q@Q?У???aG??@8Q@hQ@p@0@P@(@(@P@hQ@@`@HQ@(@@(@@(@HQ@0@,(@S @@@l(@c @XQ@@\(@(@p@ ??@?@Q@ @@@Q??@ @HQ@hQ@xQ@@@0@(Q@P@`@XQ@p@xQ@ @@`@(@P@(@@(@@@(@A A @@A@@(@A{@{@{@(A {@(@{@@@@@@@Q>\?!G?aG?aG??У????@ @P@@(@@@(@@(@@(@@@(AAV{AxA =A =AA =A =A =A =ADA^{AV{A@AB{AxAAK =AR{A =AA{A{@{@(@@{@3 @(Q@ (>\>\???!G?@?@???@ @HQ@p@@@(@@A Ar{ABBB ABBBBBAA =AA =A =A.{A,Aj{A =A(A =A{@A@@|(@<(@,(????>?!G?aG?aG??@Q@ @`@(@(@(AAB{AW =Ac =A =AA =AAAA =A =A =AA~{AJ{AF{A*{@(@(AA @@(@{@@@\(@ ?????@??@?@???@Q@(Q@HQ@@@@(@(@(@AAA4Ar{A8A"{A$A@(@(@@@l(@C @(@xQ@(@@(@@s @l(@Q?Q??p?0??!G?aG???У?@@(Q@ @# @ @Q@ @# @P@XQ@(@@xQ@hQ@(@@@@`@P@ @0@(Q@8Q@HQ@XQ@XQ@p@# @ @ ???@??@???@@@@Q??????Q@ @@ ?@Q@(Q@`@XQ@(Q@Q?У?Q@ @@@@?Q??Q@@?Q?O\)>\?@??У?@Q@ (@Q@@???У?Q??????@Q@???Q@Q@?@?????Q???@>\?@???Q?????У???????Q???????@???????O\)?aG?aG?!G??aG??Q????????aG???aG?@?0?@?@?!G?0?0?!G?@?@???aG?!G?\)?>??aG??????aG?@?!G???0?\)?>G>\>\>\??!G?!G??!G?@?@?!G??@?@?@?!G?@?@?!G?>\>\>\>\>\>\>G?>\>\??!G?!G?!G?>\>\>>>=u=u=u>\??!G???>\>>>>>=u=u>>\>\?!G?!G???>\>>>>>\>\????!G?=u=u>>\>\>G?>G=u>>>\>\??!G>\>>\>\??!G?>>>\??!G?!G>\>>\?!G?@?!G>\>\>\>\>>\>\???>\>>>\???!G?!G?aG?@?!G?!G?@?@??@?>G>G>>>\?!G?aG?aG???aG?@0@@ ?Q??Q??Q?aG?Q?@?\)>R?>\?\)?>\?@?@???@Q@C @\(@HQ@hQ@\(@s @p@HQ@@@ ?Q?Q?p?aG?!G?>\>\>G?>>???У??Q?У@P@s @P@@(@{@@xQ@\(@<(@,(??Q?p?O\)?!G?>G??\)??\)?\)>>?@?У@@@@@HQ@|(@|(@s @l(@S @(@@S @Q@ @Q?У?Q??aG?p?@?@?p?0?0?\)>>>\?@?aG??@ @ @3 @P@L(@@@(@(@(@@xQ@0@(Q@ ?Q??Q????0?!G?!G?>>>>??0??Q@ @(@3 @l(@@@@(@@(@{@{@@(@L(@\(?У??>G>\>\>\>>\>\>\?>\>\>\>\>\>\??!G???@@@@XQ@P@hQ@?У?@?>\>\?>\>\>\>?>>>\>>>\>\???>\>\>>>\??!G??@Q@@ @Q@0@0@@@@@ @??aG?!G>\>>\??>\>\?>\>\>\>\>\>\>\>\???>\>>\>\???!G?!G?@??@Q@@@8Q@P@0@P@p@8Q@ @???aG?!G>\>\????>\>\>\>\>\?>\?>\>\>\>\>\>\>>\>\??@?@?aG?aG??aG???@0@HQ@`@@(@@p@XQ@(Q??У??aG?!G>\????!G?>\>\>\>\?>\?>\>\>\>\>>>>>\>\??!G?@?@?aG?????@?@(Q@@@(Q@ @HQ@(@@`@(Q????aG?!G?>\>\?!G??!G?!G?>\>\???!G??>\>\>\>\>>>>>\>\???!G?@?@?aG???????@@(Q@8Q@(Q@Q@@Q@@@hQ@hQ@`@(Q????aG?!G?>\????!G?!G?>\>\???!G?>\>\>\>\>\>>>>>\>\>\>\>>>\>\>\>\?!G?aG?@??????????@@ @XQ@0@P@HQ@`@8Q@8Q@P@P@HQ@8Q@???aG?!G?>\>\???!G?!G??>\>\?!G?!G?>\>\>\?>\>\>\>\>\??!G?!G?????>\????@?????????????@Q@Q@ @(Q@HQ@hQ@hQ@XQ@@@8Q@8Q@`@xQ@p@Q???aG?@?>\>>\??!G?@?!G?!G>\>\??!G?!G?????????!G?@?aG??aG?@???aG?!G?@?!G?@?aG??У??@Q@@@@Q??@@Q@(Q@ @HQ@@@(Q@HQ@P@P@`@HQ@0@HQ@hQ@xQ@@`@???aG?!G?>\>>\?!G??@?!G?!G>>\>\>\?!G?!G????!G????!G?@?aG?????У????aG??aG???@Q@0@Q@8Q@ @(Q@0@0@`@(Q@(@@hQ@@XQ@(@(@@`@`@P@XQ@@@`@XQ@hQ@`@@XQ@???@?!G?>\>\????!G?@?!G>>>??!G?!G?!G?!G?!G?!G?!G?!G?@?aG???У?У?У@Q@??????@Q@Q@(Q@(Q@`@0@hQ@p@p@(@@(@(@@@(@(@A{@(@@@(@(@@xQ@hQ@P@@`@hQ@p@(Q????aG?!G?>\???>\?@?!G>>>\>\>\??!G?@?@?!G?@?!G?!G?@?????У?@Q@Q@Q@Q@8Q@0@0@ @(Q@8Q@hQ@hQ@HQ@@@@@@@@@(@@@@(@(@@(@(@@(@@(@@p@`@@xQ@@@(Q@ @????@?!G????>\??@>>>\>>\??@?aG?@?!G?!G?!G?@????У?У?У@@0@ @ @@@hQ@@`@p@`@xQ@(@(@(A@A {A A&{@A@(@(@@@@(@@@@(A A@@@(@@p@`@HQ@0@HQ@@?????@?!G???>\??!G>>>>??!G?@?@?@?!G??@??????У@Q@8Q@HQ@@@(Q@0@`@p@(@@@@(@@A{A4A*{A:{A2{A2{A8AA @@(@@@@@@@@(A{A{@@@(@@@hQ@(@hQ@XQ@HQ@ ?У???aG?!G???>\??>>>\>>\?!G?@?aG?aG?!G??!G?@?????@@0@HQ@HQ@8Q@P@p@(@@@(@(@@(@@(AA&{ADAPALAR{ALA4A$@(@(@@(@@(@@@@@A{@(@(@(@@@@(@`@P@HQ@Q?У???@?!G??>\>\?>>>>?!G?@??@?!G?!G?!G?aG????@Q@@@P@HQ@HQ@`@@@@@A @@@@(@A AA(AHALAN{A`A\ALA@A,A@(@(@(@@@(@@@@@(@(@@(@@@@p@XQ@@????@?!G?????!G>>>\??@?aG??@?!G?!G?@?????@@@`@hQ@HQ@P@@(@(A{AAA{A{@(@(@(@AAAF{AV{Aj{AhAb{AV{ADAZ{ALA6{AB{A8A@(@(@(@@XQ@(@@(@@@@@@@hQ@P@8Q@Q????@?!G????!G>??!G?@?aG??@?!G?@?aG????У@@HQ@hQ@`@P@hQ@@A {A"{A"{A*{A@@@@@(A A,AN{An{A|A =Ar{AdAf{Af{Ab{A =A|Ar{A\A0@@(@@@@(A{AA @@@(@xQ@`@P@Q@Q????@?!G?!G?!G??!G>>>\??@?@??aG?!G?!G?@?????@ @8Q@@@@@`@`@AA{A,A*{A A@@@(@(@A{A@Av{A =A =AAtAxApAlA =AAAAXAF{A<A"{A{@@@@(AA@@(@@@XQ@`@0@0@Q???aG?@?!G?!G??!G>>\???@?aG??@?!G?!G?aG???@Q@ @P@HQ@0@ @hQ@(@AAHA"{A&{AA AA@(A@(A4ATAhAtAhAf{An{AV{Ab{AA =A =AAAAlA|ATA:{A*{@(@@@(@(@@(@@@hQ@p@@@@@Q????@?@?!G??!G>>>??!G?@?@???!G?!G?@????@(Q?@(@p@(Q@ @hQ@@A {A{A{A A$ADA{@AA{A$A4A.{A$A0A8AHATApAAAAAA =A =AATAlAN{A.{A{@@@(@@(@@(@@xQ@`@@@(Q@(Q@Q?У??@?@?!G??!G>\>>?!G?!G?@?@??@?!G?!G?@???@@HQ@xQ@(@xQ@8Q@@@@@(@AA AA{A{A{AA A$AA{AAA{A{AA@A =AA =AAAA =A =A =A`AB{A>{A4A(A@(@(@(@@@(@(@@P@8Q@ @0@(Q???aG?@?@??!G>>>??!G?@?!G?@?aG?!G??!G?aG???@(Q@p@@@`@8Q@@@(@@@(@(A@A{A(A6{A.{A{AA AA{@@@A{AN{AA =AAA =A =A =AA =A =Ar{Ab{Af{AJ{A @@@@@@@xQ@P@HQ@0@8Q@8Q@Q???aG?@?!G?!G>>>>?!G?aG?@?@?@?aG?!G??!G?aG??@Q@8Q@(@(@@P@8Q@@(@(@(@(@@@(@A{A>{AF{@(A{AA{A@@(@(@(AA<Av{A =AAAA =AA =A =AAA =A =A =A@@(@@@@(@@@XQ@XQ@8Q@@@@@Q???aG?aG?!G?!G>>\>>??@?aG?@?@?aG?@?!G??@???@Q@HQ@(@(@@(Q@0@@@(@@(@@(@(@(A&{AF{ADA@A {A,A@@(@A{A {A,AZ{A =A =A =BA =AAA =AA =A =A =AAr{A{@(@@@@@xQ@P@`@@@@@P@ ?У??aG?aG?@?!G>\>\>>??aG?@?@?@?aG?@?!G??@??@@8Q@hQ@@(@`@Q@HQ@@(@@@@@@AA A(A@A"{A{AAA@@(A AAADAlA =A =AAAAAAA =AA =A =A =A =A{@(@@(@(@@p@`@XQ@XQ@P@P@0?У????@?!G>>>>\??!G?!G?!G?@?aG?!G???@??@ @XQ@@@(@`@Q@(@(@@(@P@@@(@(A(AB{A(A{A"{A{AA2{A&{A@Av{AA =AAAAA =A =AAA =AA =AAAAAA =AB{@(A{A {A@@(@@hQ@hQ@hQ@P@0?????@?!G>>>>\??!G?!G?!G?!G?@?!G???@??У@0@xQ@(@@(@P@(Q@(@(@@xQ@0@p@(@A A0AN{A"{A A$A8Ar{AAAA =B(B+BA =A =A =AAAA =AA =A =AAA =A =A =A =AA0A*{A,A@A$@(@@p@xQ@p@XQ@0?????@?!G>>\????!G?!G?@?!G???aG?@@HQ@(@(@@@8Q@(Q@XQ@(@p@Q@Q@p@@A{A8AJ{AA A"{A&{AA =AB+BfBBrBWBAAA =AAAAAA =AA =A =A =AAA =ALA<A4A\AJ{A @@hQ@xQ@@hQ@@@????@?!G>>>>\?????!G?!G????aG?@@`@@(@(@@XQ@8Q@@xQ@0@@@`@@A A*{AAA A.{A>{A =A =BBBBBBBBBaAA~{A =A =A =AAA =AAAA =AA =AAAXAF{A<AdA^{A,@@@p@(@@8Q@???aG?@?!G>>>\????!G?@???@??@(Q@xQ@@(@@@XQ@8Q@p@`@@@@(@@(AA{A@A.{APAb{ABBGBBBBBBLBATAB{A =A =ApAR{A`AAz{A =AAA =A =AAHAHA:{AZ{A<AA @(@(@(@xQ@HQ?????@?!G>>\????!G?!G??!G?aG?@@(Q@@(@@(@@XQ@0@`@hQ@@@@xQ@(@A{A @AA8AlABBBB}BBBBBBQA =A =ApA{A\AAZ{A8AF{Ar{AxA =A =AA =AAA:{AJ{ALATA:{A"{A@@@@@P@Q?????!G>>\>\>\???!G?!G?@??@@HQ@@(@(@@(@p@@@P@8Q@@Q@@@@(@(@@A {ATA =A =BAA =B6BPBpB^A@AA"{A{A:{AxA4AA>{A^{Af{AhAXA =AAAA8ATAB{AHA@A2{A @@(@(@@XQ@?У??У?У?@>>\>\>\>\??!G?!G?@??У@Q@P@(@@@(@@XQ@ @@@ ?@@Q@(@@(@@(@(@AhAAPAAA =BBBA =A@(Q@(@@A(A6{AAA*{AN{AR{AB{A4AhA =AAn{A:{APA@AR{A@A8A(@(@@@@P@Q??@??У>>\>\>\>\??!G?!G??У@Q@(Q@XQ@@(@(@(@(@p@(Q@@@??@@(@(@(@(@(@@AdAhA2{A{AV{A =A =A =A =A =@(@0@xQ@(@A{A{@@(AA>{ADA$A&{AXAz{A~{A`A:{AN{AB{ATA:{A6{A6{A {@@@(@@@??@Q?@>>\>\>>\??!G?@??@@0@`@(@(@@@@xQ@8Q@@@Q@??@hQ@@(@@(@@A{A*{A@(@A{A2{A*{A|AAPA{@(@@(A@(@(@(AA:{A.{AA*{A\Ar{Av{A^{AJ{AZ{APAn{ATALADA0A.{@(@(@HQ@Q??@Q@ @>\>\>\>\??!G?@??У@Q@0@`@(@(@(@@@p@(Q@8Q@???@HQ@(@@@A{@(@@(@(@@P@(@(@(@@(A @(@(@@(@@@@A(A,A{@A$APAdApA\Ab{AhAlAr{A^{Af{A>{ATADA@@0@@@Q@(Q@HQ@0>\>\>>\??!G?aG??@(Q@@@`@@(@@@@hQ@(Q@HQ@?У?У?@0@@@@@@@@@@@@@Q@8Q@0@ @0@(Q@HQ@XQ@xQ@@xQ@P@@A{A{@@A.{A8AV{Af{ALAhApAtAxAF{ApALAHA>{A@@(Q@Q@Q@ @@@P@(Q>>\>\>>\>\?!G?aG??@0@@@hQ@@(@(@(@@p@0@P@???@@XQ@@(@@(@@(@(@@`????У?У?@@@ @(Q@(Q@ @`@(A{A@(@AAA,AZ{ALAB{A`AhAf{ADA.{AdAXALA:{A@(@0@@(Q@@@`@XQ@8Q>\>\>>\>\?!G?aG?@@(Q@@@`@@AA@@xQ@8Q@HQ@??У?@@0@hQ@xQ@@(@A{@@p@xQ@Q?aG?aG??????У??@(Q@@(@@@(@@A{A4ALA&{AHA^{AV{AHAAF{Aj{AXAPA6{A@@(Q@ @8Q@P@hQ@P@@>>\>>>\??!G?aG?@Q@8Q@(Q@`@@@A@@xQ@(Q@0@Q?У??@@@P@xQ@@(@@@@xQ@HQ@Q??aG?@?@?aG????@Q@HQ@@(@@(@(@(@(A{A2{AA{AN{ALAF{A$A {APA^{AHALA2{@(@hQ@0@@@HQ@`@p@XQ@@>>\>>>\??!G??@ @XQ@@@P@@(@A@@@ @@@Q?У????@ @xQ@@xQ@@(@@@8Q@??aG?@?@?@?aG???У@@0@0@@@hQ@@(@(@(A{A{@(A2{ALA>{A&{@A{ATAF{A@A@A @@HQ@HQ@HQ@XQ@p@p@XQ@HQ>>\>>>\?!G?@?aG?@ @hQ@hQ@`@(@(A A@@(@8Q@HQ@8Q????У?@Q@8Q@xQ@(@p@(@@@????aG?!G?@?@?aG???@@Q@8Q@XQ@p@@(@@(@A{AB{A2{A{@@(A4AHA:{A2{A*{@(@@P@@@HQ@`@xQ@hQ@`@>>\>\>\>>\?!G?@??@ @xQ@@xQ@@A{A@@@p@P@p@Q????У@@(Q@XQ@(@(@hQ@hQ@(@@`????aG?aG?aG?aG??@@(Q@@@HQ@HQ@`@p@(@(@(@AA,A{@(@(@A{A.{A"{A>{A{@@@0@ @P@xQ@(@p@xQA2{>>\>\>\>??!G?aG??@(Q@@(@(@@(A A4A@(@@XQ@(@XQ?????@@P@@xQ@P@(Q@@8Q@8Q@??????@@Q@Q@(Q@0@8Q@HQ@8Q@hQ@@(@AA{@(@@@AA$AA"{ATA {@(@P@Q@8Q@`@(@@@A>>\>\>\>\>\??!G?aG??@ @(@@(@@(AAN{A:{@@(@@@(@(Q?????@Q@`@@P@0@Q?????aG?@?!G?aG??У?@Q@Q@(Q@(Q@8Q@XQ@`@xQ@(AA{@(@(@@@AAAAB{AB{@@(@0@(Q@XQ@xQ@(@p@(AXB?>>\??>\>\?!G?@?aG??У@ @(@(@(@(@(A{A8APA@@(@(@(@??????@8Q@xQ@p@HQ@(Q@Q????aG?@?!G???@Q@@@8Q@8Q@HQ@XQ@`@@@@(@@@@AA A{A"{Ab{A{@@`@0@P@@@@p@B"B>\??!G????!G?@???@Q@(@@@(@(@A*{A<A8A@@(@(@@`?????@Q@@@@xQ@XQ@0@Q??У?????У?@@@@(@(@P@P@hQ@(@(@(@(@(@(@@(AA{A{A {ATA<@@@@@P@xQ@(@xQ@@pAB`Bo>>\??!G???!G?!G???У@ @@(@(@@@A{A.{AF{A,A{A{@(@@(@ ????@Q@(Q@XQ@`@hQ@P@0@ @ @ @Q??У@@ @8Q@HQ@(@`@`@p@@(@(@(@@p@xQ@AAA{@(AB{AZ{A{@(@XQ@XQ@p@@@@pA{B B|BP>>\??!G?!G?!G?@?@???У@@p@@(@@(@(@(A{ADAJ{A8A(A A@(@@????@(Q@P@P@P@HQ@0@0@@@P@`@HQ@0@HQ@P@P@XQ@`@hQ@xQ@@@(@@xQ@xQ@@@A@(@A.{AhA(@(@p@hQ@xQ@@(@@xQ@BB`BNB#>\??!G?@?!G?!G?@?@??@0@`@@@@@@(A{A4A`ALA\A{AA@(@????У@Q@(Q@@@@@HQ@@@HQ@`@`@`@XQ@HQ@P@hQ@hQ@p@xQ@(@@(@@@@p@xQ@@(@(@0@(Q@HQ@(@@@8Q@p@xQ@@@@(@A =BeB8B1B>??!G?!G?@?!G?@?aG??@(Q@XQ@@@(@(@@@A&{AB{AdA\AN{A"{A&{A@@hQ?У???@@ @@@XQ@`@`@@@@@@(@(@@(@(@@@p@`@`@`@xQ@(???У@Q@0@@(@(@P@(@(@@@@(@ALB3B5BB#A =>>\??!G?@?!G?!G?aG??@@HQ@(@(@@@@@(AA8AR{An{AdAf{A&{A(A(@@HQ????@@(Q@HQ@XQ@p@@@(@@(@@@(@@xQ@`@P@HQ@P@hQ?@???У??@@@(@@(@(@ @(@(@@(@@(A:{B BFB/BCB A =>>\??!G?!G?@?!G?@??@Q@0@`@@(@@(@@(A {A.{A.{AV{A`AxAr{AB{AF{A&{@@P????@@8Q@HQ@hQ@@@(@@@@(@@xQ@p@hQ@p@(?@?aG????@@8Q@@@(@@(Q@@(@@@(@(A BBKB4BJB+A =@(>\>\??!G?!G?@?@??@ @0@HQ@p@@(@(@@AA A8AN{AHApA =A =AV{AV{A8@(@hQ????У@Q@0@@@@(@(@@@(@@@@?????У?У@Q@Q@@@(@@@@8Q@@(@@@(@(A A =BBB/B5B!A =A.{A2{>>\>\???!G?!G?@??У@@@0@@@@@xQ@(@@(@(@A A4A\A0A^{AA =AtA^{AhA$@(@@??@@Q@@8Q@xQ@@(@(@@(@@@@(?????@Q@(Q@@@@@(@(@@`@@@@@(@@AAB!BB'BAA6{A<@>\>\>\>\??!G?@??@ @P@@@8Q@@@(@@@@A{A:{AXA<A@AdA =AA =A =AtAB{A {@@`@(Q?У@XQ@HQ@P@(@(@@(@(@(@(@(@Q??@ @ @0@@@(@(@@(@(@p@xQ@@Q@@(@@(A{A =BBBABAAZ{@hQ@(A>>\>\>\>\?!G?@??@ @`@xQ@P@HQ@@A@(AA{A2{AN{AAR{AZ{Ab{A =AA =AA|AtA&{@(@(@(Q@0@(@@@(@@AA{A{@8Q@P@hQ@XQ@hQ@p@@@@(@@(@(@(@p@P@(@(@@(A(A =A =BBBB'AA@@AA {>>\?>\>\??@??У@Q@@(@p@XQ@p@AA{A {A{A>{AN{AlA:{Af{Aj{AXA =AA =AA~{A =AF{A6{@(@@hQ@(A{@(@(AA{A2{Ah@@(@@@@(@(@(@@(@(@p@@@@0@0@(@@A4AA =BBQB*A =A =@(@(A.{A4A>>\??!G>\?!G?@??@@P@(@@p@@(@(A"{A6{A"{A,Ab{Af{AAPAn{AlAdAAA =AAAdApAr{AB{A.{@(AAAA =A =A =AA(A6{A>{AB{A,A{A{A@@(@(@XQ@@@ @ A8A6{@(A =ABB*BJB%AA =@(@A {A {A&{@(>>\?!G?!G????@@P@(@(@(@@@(A{AR{A0A,ALAz{A~{AA =A =AlAn{AAAA =AAdAhApAV{AdAdAb{A =A =A =A =ATAlAhAZ{A\AB{A A@(@(@(@hQ@HQ@0ATAdATAZ{A =BBB'B'BA =A@(A"{AHALA(@(@(>>\??@?!G?@??aG?У@(Q@(@(@(@(@(@(A{AB{A\A8AhAf{AB A =A =AAA^{An{A =AA|A =AAAdATAj{AxA =AA|A =Ar{Av{AdAb{AF{A0A{A @(@(@@XQA\A =A =AABBB%B%BBBA =A{A{A {A{A(A{@(@(>\???!G?!G?aG?aG?@@p@(@@(@@@A4An{AhApA\AABBBAAF{ALALAPAV{A =AAxAn{Af{AtAA|A =Av{Ab{AZ{Af{ATAB{A<A&{A@@@@xQA =A.{AhAA =AA =B,BBBB@(A{A>{ALALAF{A{@A@>\??!G??!G???@?У@ @xQ@(@(@@@A{AV{A =AA =A =AAAB AAAALA4A A2{A8A4A@A4A4ALAdAf{AB{AB{A0A{AAAA =A =AA =A2{A.{AA =A =BBAABBBAA(A*{AA{A$A"{A{A{AA{@>\??!G?!G?!G?!G?!G?!G?@@P@@(@(@(@@A(AAA =A =AAA =AAv{A =A =AAA =BA =A =AAA =AA =AA =AAAA =A =A =A =AA =A =AA =A =BB$BAAB!BAA&{A{A{A8ADALA AA{A2{AA{@(>>\?!G?@??@?!G?!G?@?@?@@XQ@(AAAAA{A*{A =AAAAAV{A0A4AA =AAA =A =BB=B<B;BBBA =A =AA =AAAABB.ABBBB+B.BAAAA*{A{AA&{A{A6{A:{A>{ADAA{A&{A<@(@(@0>\???@??aG?@?!G?@?aG??@@(@(A$A&{A,A A{A4A =A =AAHAXAF{AB{A*{A{AA =A =AAA =BBGBmBrBBBBzB^BjB^BJBAB7B>BFA =B'B:B/B BAAAA{A{A {A.{AB{AR{AA>{A8A4A.{A<A{A0@(@?aG>>\??!G?@?aG?aG??aG?!G?@???@@P@A{A,A8A0A0A AAJ{A =AAA4APAf{AR{A @@Av{AA =AA =AA =A =AA =A =BBB.BAB.B&BJA =AAA =AA{A(AAAA$A:{A =Aj{A\A^{A<A8A"{A A{@(@(@8Q?!G?>\??@?aG?aG??aG?aG??@?!G?aG??@HQ@@@xQ@A{A{A4A8A.{A{@(AA^{AA =Af{Az{A~{AR{A(@@(@(AA =A =AA =AA =A =AA =B BAAA@AAAAA {AA{A{A A"{ATAtAtA =A^{A*{A.{Ab{AdA`A{@@@?У?aG?>>???!G?????@?@???@??@ @`@p@@A {AA,A<ALA"{A@(A\AA =AAA =A~{Ab{A@@(@(A =AAAAAA {@(A{@@@(A A{@AAAA {A{AHATA`A`AAAZ{Ar{AF{A =AdA(@(@hQ@Q??aG?!G>>\??@?@?@?????@?@?aG?@?aG??@8Q@xQ@@(@(AA"{A,AHAF{A{@(@(A$A8A =AApAz{A =A|Ab{A0@@@@@@A@@(@(AA AA{A{A(A{A {A2{A2{A.{A<AdA~{A =A =AA\A\A\A4A{@(@Q???aG>\>>?!G????????@???@??@@@@@(@(@A{A{A.{A>{A6{A@(@(@A$A>{AdAA|AlA =AAlAN{A6{A4A"{AA,A AAA{AA$A$A&{A&{A:{AJ{A4A@APAr{AdA =AxATA^{AJ{A@(@(@ ????>\???aG??????У??@?aG?aG??@Q@@@hQ@xQ@@@@(A{A{A@(@@(@@(@(AA"{A*{APAb{Af{A~{Ab{A~{AxAtAxA~{A =AlAApAf{Ar{AV{AdAdAj{AAb{A^{AA\A =AhA{A@(@@HQ@0??@?!G?>??aG???aG?aG???@@????@@8Q@P@(@(@@@@(@AA{@(@@@(@(@@@A{A{A0A,A>{A^{A\Av{AAA =A =AlAn{Ab{A$AR{Ar{A^{A =AN{A<AXA{@(@@@8Q@0@?У??@?!G>>?!G?aG??aG?aG?aG???У@ @0????У@@0@@@p@@(@(@(@@(@@(@@@`@P@HQ@@@@(@(@(@AA{AAA"{A(A&{A(A(A"{AA4A^{AA{A{@(@(@xQ@8Q@(Q@Q?У????@?>>>\?@?@?aG???У@Q@@HQ@0?????@Q@ @@@XQ@(@@(@(@(@(@@@@P@`@XQ@`@@@P@(@(@(@(@@@@@@(@(@(@(@(@(@@@(@xQ@`@(Q@@??У?У???@?!G??aG?@?@>\?!G????У@@Q?@HQ@8Q????У?@Q@Q@0@HQ@xQ@(@(@(@XQ@@@@@(@@HQ@`@@@hQ@HQ@`@@@@@@@XQ@`@XQ@HQ@HQ@@@XQ@@@@@HQ@(Q@(Q@Q@@???????aG@(Q@??@?@>?aG????@ @Q?@8Q@P?????У@@ @ @0@P@`@XQ@HQ@@(@@(@(@@(@@@(@@@0@0@0@ @@@0@ @0@ @(Q@(Q@(Q@?У????aG??@?@?@?@?@Q@??>>>?@????@8Q@Q@@@ ???У??@Q@@@ @0@(Q@(Q@XQ@@@(@(@@(@hQ@XQ@@@@p@@(@hQ@P@@@@@Q@Q@Q?@@P@@@ @Q@Q@@????????>\>?????У@ @@Q@Q@ ????@ @@@Q@@@Q@(Q@HQ@hQ@(@@(@(@(@hQ@0@(Q??У??????????aG@Q@Q@@???У??????>\>\>>??aG???@(Q?@@Q@?????@@Q@@@@Q@0@HQ@@@P@`@@@`@`@8Q@`@hQ@ @????@??@?!G?!G@Q@Q@@??????aG?@?aG>>\??!G??@Q@@Q@Q@ @Q????@@???@@@ @8Q@hQ@(@ @Q@@Q@p@@@xQ@(@Q@0???aG@(@hQ@(Q@0@Q@@?У????aG>>\>\>\?!G?aG?@Q??@Q@???@?????@Q@(Q@8Q@@@@@@0?У???@Q@0@hQ@@@@(@(@@`@XQ@ ??У??aG?@?@?!G>\>\>>>\???????У?????@@ @P@`@@@@@A{A A@@@hQ@0@@@P@XQ@HQ@8Q@0@(Q@(Q@Q??????????aG>>\??@???????????@@0@hQ@(@(@AA{AA2{A@AN{ALA2{A$A@@hQ@HQ@8Q@Q@(Q??У???????@??aG?!G??\)?!G?0?\)?@??!G?@?@???????????@(Q@@(@@@(AAA{AA2{A8A:{AV{A4A2{A&{AA{@(@@C @@0@Q@Q@@Q@?У?Q?aG??@ @ @@ ?Ǯ???p??!G?@?aG???????aG?@?!G?@?@@0@HQ@P@p@(@(@@(A A{AA{A{AA{A{AAA{@(@@hQ@@@(Q@@8Q@@@@@|(@(@l(@@@@0??0>\?!G?aG????@Q@(Q@??aG?@?!G?aG????@ @HQ@XQ@HQ@(@p@XQ@HQ@8Q@(Q@8Q@@@HQ@hQ@@@8Q@P@P@hQ@@@(A A*{A:{A{@(@@s @P@ ?0??@???У@Q@@@@XQ@Q@???@?!G?aG???У?????aG???@@(Q@HQ@(@@@(A(AA A0A4A<A"{AB{A{@@P@?Q?Ǯ?У??p?>\?!G?aG??У@Q@hQ@@@(@@(@p@0????У@@????У?@(Q@hQ@(@(@@(@(@@(@@A{A(AAA@A AB{@@s @C @Q?Q@(??У?У@ @# @(@,(>\??!G??У@Q@@@`@(@(@AAA{@@(@(@xQ@XQ@HQ@ @Q@0@@@@@(@(@@(@A{AA{A$A<A0A:{AdADATA(A {AHA @{@@@(@@{@A A{@@@@?Q>?!G?@???@Q@8Q@`@(@(@(@@(A{A*{A"{A@(@@@HQ@`@@@(@(A{AA8ATALA\A =A =ALA@A6{A:{A@A4A{A{A@@(@(@(@@@(@(@@(??\)??aG????У@@(Q@@@P@hQ@(@(@(A {A AdA~{A\A,A@(@(@(A{A2{A.{AAA>{ALA@AXAhAJ{AA{AA"{A{A@(@(@l(@hQ@S @8Q@Q@(Q@3 @ ???!G????У?@@0@XQ@xQ@(@@@(A(A*{A.{A,A8A6{A{@@(AA{A{@(A{AA{@(A{ADAZ{A@@@(@(@A@P?Ǯ?Q?У??>\?@?????@@0@8Q@HQ@`@hQ@@@(@@(@(@@(@(@{@@@(@@@@@@(@@@(@@(@xQ@@`@(@(??\)??@????У??@@(Q@0@0@8Q@P@XQ@`@p@@xQ@`@`@xQ@XQ@@xQ@@@(@@HQ@Q@ @(Q@8Q@XQ@XQ@0@???У?>\?!G?aG????У??@@(Q@(Q@@Q??@@Q@??Q@Q@@ (@ @Q@ @Q@Q?У???У?У?????p??aG?@>\??aG?????У?У?@@ @@??????aG?aG?aG?aG?????Q??Ǯ?Ǯ???????p?0>??!G???????????????!G?!G?\)>\>\>\??!G?!G?O\)?aG??Q????????aG?>\?!G?@????У??У??????@>\>>\?!G?aG?p??Q?????aG?O\)?aG??aG?@?@>\??@?aG????У@??У???aG?!G>\>>\?0?p??????@?\)??\)?!G?!G?>??!G?!G?@?aG?????У????aG?>>>\?0?O\)?O\)?p??p??>\>\????!G?@?aG?aG?aG?aG?@?!G?>>\??!G?@?0?!G>G>R>\?????????>\>R>R>R>\>G>G>R>>>>>>>>R>R>R>G?!G>>>>>?aG??@?@?@?>>\>>?!G?????У?У??!G>??>\>>>\?@?aG???У???????@?@?@?>??@??@@@Q??@8Q@ @@@Q??>>?!G?@?@ @@HQ@`@@(@@`@(@@8Q?Ǯ??aG>\??@?@??@@@(@@(@@(@@{@@8Q@# ??!G>G>??!G?@?aG??@Q@@@A @(A@@{@(@(@@C @?Ǯ?O\)>\>\>\?!G?@?aG???@0@(@A`AA{@(@@A =@{@@@c ?p?!G?\)?0>G??aG?@????@Q@XQ@@(@AAA AA/ =A @(@@{???@?!G?>\??@???У???@Q@0@p@(@(A{@@{AA =@{@(@@c @?Q???p>R>\>>\??!G?@?!G?!G?@?!G?!G?@?!G?!G?!G?!G?@?@??aG?@?aG?!G?!G???!G?!G??@ @XQ@(@(Q@@Q@Q@Q???@>\>??@?aG?????У>\>\??!G?@?aG?aG?aG?@?@?@?aG?aG?@?@?@?aG?aG?aG????????aG?@?aG??У@P@hQ@(@@Q??@????!G>>\>\??!G?aG????У?>\>\??!G?@?@?aG?aG??aG?aG???????????????У??У?????У@@P@p@`@hQ@Q?У?У??У??@?>\???!G?aG????У?>\>\>\??@?aG?@?@?aG??????У??У?У???????@@@Q@@(Q@Q@Q@Q?@Q@@Q@P@@@`@0????У???!G>\>>???@?@?????>\>\>\?!G?aG?aG?aG?aG?aG?aG???@Q@Q@Q@Q??У?????У@Q@Q@(Q@@@`@hQ@@@(@@p@8Q@HQ@0@XQ@0@@@@(Q???????!G>\>>>??!G?@?aG?????????aG??aG??????@@HQ@P@(Q@Q????У@?@@0@`@XQ@p@xQ@(@@@@@@@@@`@8Q@8Q@Q@Q@Q@?@????!G>\?>\>\??@?aG?aG????>\???@????????У@Q@@@xQ@xQ@XQ@(Q@@Q??@Q@@@P@p@xQ@(@(@(@@@(@@@@@(@(@@`@HQ@(Q@XQ@??У?У????!G??>\>>\??@?aG???У@>\>\??!G?aG?aG??????@Q@(Q@`@(@(@xQ@@@(Q@?@@@@@@P@@@p@@@@@(@(@@(@(@(@@(@@(@p@P@HQ@0@ ??У??У????!G?!G?!G>\>???aG???@>\?>\??aG??aG?????@Q@0@P@p@@@(@0@@8Q@0@8Q@@@0@P@XQ@(@AA{A2{A@APAZ{AHA:{@(@@@@@p@@P@Q@Q????@Q@Q?У??@?!G?>\>>\??aG????????@?aG?????У@@ @0@`@xQ@p@@(@`@(@`@0@0@Q@HQ@HQ@@@A A{A A8AF{APApAhA|Ab{A>{A@(@`@@@xQ@Q??У?У???@Q????@?!G>\>>>>\?!G?@?aG??У?>\???!G?aG?????У@Q@0@@@@@@@XQ@P@XQ@`@HQ@P@P@(Q@Q@hQ@@@(A{AA,A.{AdAtAAAA =AAAA8A {@@(@xQ@8Q@??@??@Q@Q???!G???>\>>\??!G?aG????>\??!G?aG???У?@ @8Q@@@P@p@(@(@hQ@HQ@@@@@ @HQ@8Q@@@@@@@@AA{A2{A:{AZ{Ab{Af{A^{An{Aj{A~{Ar{Av{A|Ar{A@@@(@`@Q?У??????У?У??@?@?!G?>\>\??!G?aG???>\>\>\??@???У?@Q@@@HQ@HQ@P@(@@p@p@XQ@0@Q@ @Q@8Q@8Q@`@@@@@AA"{AF{A^{Ar{Ab{AXAV{AJ{AJ{A:{APAZ{AlAN{A@@(@@XQ@?У???????У??aG?@?!G>\>\??@?aG???>\????@???У@Q@@@`@`@P@`@hQ@xQ@(@`@@@@@ @8Q@(@@(@xQ@@(@(@A{A2{AHA`Ab{A =AAA =AN{ADA2{A(A.{AHAb{A2{@(@(@(@HQ????????????aG?!G???@?aG???>\>\??!G????@ @P@p@`@XQ@p@`@p@`@@@ @@(Q@P@(@p@@@@@@A$AHAdAz{A~{A =AxAAA =A~{An{AHA0AA<A\AJ{A@(@@xQ???У????У@?????@?!G?!G?@????>\??!G?@???У@@(Q@@@P@P@(@(@xQ@p@XQ@ @Q@HQ@hQ@P@@(@(@@A{AA,AJ{A|Az{A =AA =A =ApAb{Ab{ApAb{APATA>{A0A2{A2{A{@@@(@hQ@?????@Q@?????!G?!G?@????>\????!G?aG???@@@@@@8Q@`@@@@XQ@ @@(Q@@@XQ@p@A@(A A"{A{A&{A@AZ{Av{AxA =AA =Av{AZ{ADAR{ADA<A`AAXA4A(@@@@@@(@0??У???@@Q@????@?!G?aG????>\??!G??!G?!G???@ @HQ@XQ@P@HQ@HQ@hQ@@XQ@0@Q@Q@0@HQ@`@@A{A0A@AA*{A2{A6{ATAhAxAr{AAn{AR{A2{A4A*{A&{ALAn{AxA =A8A@(@(@@@@(@@8Q@????????У???aG?aG???У?У?????!G?@??@Q@XQ@(@(@p@HQ@P@hQ@8Q@Q@?@@8Q@HQ@@AA(ALA A0A,A2{A0ALAZ{AtAz{A =A`APA2{AAA8AF{Ab{ApAV{A<A,A{A@(@@(@@(@xQ@Q@Q??@Q?@Q@??У??????У?У>\??>???aG??У@8Q@@(@(@@@@P@(Q@Q?У?У@Q@ @P@@(AA6{APAHAb{A:{A<A*{AN{A\AtAhAdATA\A*{A0AF{AHAB{A<AV{An{AlAv{A<A&{AA@(@(@(@(@P@??@(Q@Q@Q@Q?????????У>?>\>\>\???@?@@xQ@(@(@@p@@(@hQ@(Q????У@@p@@(A0AZ{ALAtA =A>{A0A{A@ATAhAV{ATA@A(A.{AF{AF{A@A,A:{An{AAtAhAb{A2{A@(@(@@@(@(@(Q??@ @@@ @Q@????????>\>\>\??@?@@@@(@(@(@(@(@@8Q@(Q????@(Q@(@A AHAj{AxA|ATADA2{A(A8A:{ALALALA8ALA@A2{AA(ALAdAlA =A =AJ{AB{A6{A{@(@(@(@@@@HQ?У?У@HQ@P@Q@@????????>\>\>\>\>\?!G?@@`@@(@@@(@(@hQ@(Q@?У??@ @`@@(A*{AlAhA =AA`A@A@A,A6{A2{A"{AA{A@AV{ADA0A(A.{A>{A`Ab{Ab{Az{AtAXAdA>{A{A@@(@@@p@?У@P@hQ@(Q@ @Q???У????@?>\>\>\?!G??@ @@(@@@@@@(Q@Q?У???@XQ@@A{A{A@APA|AAlAtA<A6{A<A$A@AA{A:{AhA =AZ{A$A(AHAn{AA =AAAtAdAB{A(@@@@@(@HQ@@@(@8Q@0@Q??У?У????@???>\??@??@0@@@(@(@@(@`@Q????@@(@@(A&{AV{AB{A@Aj{Av{A =AB{A2{APA`AHA&{A8AR{AJ{A0AV{Af{A =A =A{A8A =Az{A =A =AAA =AAlA{@@@@(@@0@@(@XQ@8Q@(Q??У?????@???aG?У?@HQ@@@(@(@@(@P@????@(Q@(@(@(A0A`Ab{ATAHADAAj{A`AA =A =AAA =A =AAAPA\AAd@AR{AA =A =AAA =A =A =A{@(@@(@@@@@@(@p@(Q@0@?У???У?У?@Q?>\>\??@@P@(AAA@(@(@8Q?У????@@@@(@(A,A@A@A>{AR{AHAn{A =A =A =AAAA =A =A =A =AA =ATA^{AA2{AA|AA =AA =A =AAA"{@@(@@(@(@@@@(@@@8Q@Q?У???У?@@>\>\????@@p@(A.{A{A@(@@ ????@@`@(@@A A*{A0A@AF{Ab{A =AB B%B:B:BBA =AAA =AAAHAHA^{@(AZ{ApAAAA =A =A =ATA@A{A,A{@@@(@@@@@@Q??У??У?@@??!G?@@ @(@A,AA{@@@ ????У@@xQ@@(@A {AA0A6{AXA =A =B A =BRBhBlBXB=BAAA =A =A =A8A{AN{@A$AV{Av{A =A =AxA =AAZ{A*{A{A,AV{APA@A{A@@P@HQ@Q??У??У?@@Q????@?@@0@@A>{A(A2{@@@Q????@(Q@@(@(@(@A{A A<APAAB BBBBBBBBXB%AAADA,A.{AP@A @(A{AJ{AR{Af{AtAz{AAA`A@A,A2{Aj{A =AlA4A&{@(@XQ@P@ ??У@@?@@(Q???@?@ @p@(@@(ALA.{@@xQ????@@8Q@@(@@@A A"{A>{A|AA =BB%BB€BBB<B%AA =A @(@A,@(AA {@A0AB{APAV{Ar{AAAr{AV{A{A*{An{A =A\A>{A.{@(@@p@ ??@ ?@@0@???aG@@@@(@@(@A8ALA@xQ????@0@XQ@p@(@p@@(A {A>{ALA =ABB2B[BBBBYAA =AAr{@(@@(@@(@(@@A{A4A0AF{AV{AtAtAtAF{AA&{A~{A =Ar{A8A4@(@@@0@@@ ?@Q@xQ@Q??>\>\??@@@@(@@ADAhA{@(@(Q??@Q@XQ@hQ@`@@hQ@@(AA<AXA =ABBIBBCGBBBGAADA^{A&{@@(@xQ@@@(@(@(AAA{A>{A:{APAdAXA6{AA.{A =A =A|APA8@@@@8Q@@0@0@Q@p@@?!G?!G??@Q@HQ@p@(@(@Az{A =A@(@@@Q?@(Q@hQ@xQ@hQ@(@P@xQ@(AA4An{A =A =BBTBBBBBB:AA{A{@(@@P@XQ@@(@@(@@(AAA"{AA<AR{AF{A @A6{A =A =Az{A^{A@@@xQ@p@8Q@ @HQ@XQ@@@(@(@(?!G?>\??@ @P@@(@(@A =AA,@@`@Q@Q@Q@p@`@hQ@p@P@`@@(AHAn{A =ABBDBtBSBmBB4AA*{@(@`@8Q@(Q@P@(@@@p@@(@(@(A{AA4AJ{A<A@(A\AA =A|AhAN{@(@@@P@0@xQ@xQ@@@(@??!G??!G?У@HQ@hQ@(@(@@(ApAA.{@(@`@ @Q@@hQ@@@XQ@p@@@@@@(AF{Az{A =A =A =BB.A =A =AA =@(@hQ@(Q@Q@Q@Q@P@XQ@(@(@p@(@@(@AAA2{ALA4A {AA =A =AAA =AhA@(@(@`@p@(@(@(@@(@??>\>\?@?У@HQ@p@(@(@(@AdA =A8@(@p@(Q@Q?@P@P@P@`@(Q@(Q@@(A6{A\A =A =AAA =AV{@@@@@@@Q@??@ @8Q@P@(@HQ@p@(@@@(@AA6{AB{A&{AA@AA =AA =AA~{A$@(@(@xQ@(@@A{A@(@(?????aG?@P@@@(@(@A\A =Ah@(@p@0@Q?@ @@@8Q@(Q@0@(Q@xQ@AADAr{AtApA@(@@@(Q?У????@@ @(Q@@p@HQ@hQ@@(@(@(@(A{A>{A8A{AAn{AAA =AA =AtA.{@@@@@@AA@(@?????У@8Q@xQ@p@@@(AhAxA\@(@p@P@?У@Q@ @Q@@(Q@0@xQ@@AAHA^{AN{A@@xQ@@8Q??У???@Q@(Q@hQ@P@0@HQ@(@@@(@(@AA4A{@A$A =A =AA =AAAtA2{@(@(@(@@(A{A{@(@@(???!G??@8Q@hQ@xQ@(@@@ADAn{@(@`@@?У??У@Q@Q@@(Q@@@XQ@@(@A{A4ADA@(@XQ@8Q@@Q@Q@@@Q@0@`@@@ @0@HQ@(@(@(@(@(@(A,A@(@AN{AA =AAA =A =Ar{A4@@@@A{A*{A@@@(?????@??@8Q@xQ@(@@@(@@(A{@@`@0????@Q@ @Q@XQ@XQ@P@@@(AAA{@@p@0@@@@ @0@8Q@0@(Q@Q@(Q@8Q@XQ@p@@(@(@A{A@(@A{A =AA =AA =AAAv{A&{@(@@(AAB{A(@(@@(@(??!G???!G?!G?aG??@8Q@@@@@@(A @@(@hQ@(Q@Q???@@ @@@@XQ@8Q@@@@@(@@(@@0??У?@Q@@??@Q@ @HQ@XQ@p@@(@(@(@@(@@AN{A =A =A =A =A =AA =AlA{@(@A A2{AJ{A{@@@(@ ??!G?!G?!G?!G???У@@HQ@@@@@(@(A&{@(@(@(@@@Q????@@Q@ @8Q@HQ@P@@(@(@@@@@8Q@Q?У??У?У???@Q@ @HQ@XQ@`@xQ@@@@(@@AA =AAAxA =A =A =A|A2{@@AADADA2{@@(@(@0@??!G?@?@?aG???@Q@`@@(@(@@@(A{@@(@(@hQ@0@Q?У???@@@0@@@HQ@0@hQ@(@@@@(@hQ@`@P@(Q@?@@@(Q@xQ@(@@@@p@(@@@(@(@(AHAA =ApAj{AhAA~{A>{@@(@(APAV{A0A{@@(@ @?У??@?@?aG???@@(Q@xQ@(@@(@@(@A {A{@@@(@XQ@8Q@???@Q@@ @@@8Q@0@Q@8Q@P@HQ@@(@@(@@@`@hQ@`@hQ@@@@@@@@hQ@(@@@A A =AAr{AdAF{ApAv{AV{@(@@ApAxA^{A@@@(Q@8Q@Q@Q>\?!G?@?aG??@0@P@0@@@@(@(@(A{@(A$A @@(@@P@0????@@Q@ @0@0@Q@Q@Q@(Q@(Q@@@P@XQ@XQ@XQ@HQ@HQ@@@p@@xQ@???@@(@@@(A{Ar{Av{Az{A\A8AdAz{AXA{@@(A>{AAA2{A{@@(@0@Q?@@??!G?!G?aG??@@@@@(@(@(A{@@@AA"{A@@@@(@@XQ@?У????@@@8Q@@@@@@Q@Q@Q@@ @Q@Q@@@8Q@HQ@`????@(@@(@A{AlAr{A`APA<AF{A\A\A4@@A{AAAXA@(@(@P@@8Q@`AR{>\?!G?@???@Q@hQ@(AAA,@@(@(@@AAF{A2{@(@@@@XQ@Q???У??@@ @0@@@(Q@????@@Q??У?@0@HQ@p????@(@@(AAZ{A^{AZ{A8A,A2{ALATA<@@(AAAAn{A{@@@`@(@@(AJ{BR??!G?@???@Q@xQ@(@A"{A6{A4AF{@(@@AA<AB{A2{@(@@@@HQ@Q?????@@Q@0@P@8Q@(Q@ @Q?@@???@8Q@P@xQ???@(@@A{AJ{APAR{A*{AA&{AF{AF{A8@@(AAA =A~{AA@@(@(@@`@B B^??@?aG???@Q@P@(@(A&{A4A2{AB{AR{AH@@AA.{A\A4A@@(@xQ@8Q?????@@Q@Q@8Q@8Q@8Q@(Q@(Q@(Q@8Q@HQ@0@(Q@ @P@`@p???@(@A6{AB{A@A8A$AA$ALAR{AB{@(@A{A =A =AA$A{@(@@@(@(AABB??!G?aG???@@(@(AA{A&{A6{A<A>{AF{AA@(AAF{AR{AF{A{@@@hQ@(Q????@@@ @ @ @ @(Q@(Q@8Q@HQ@hQ@hQ@`@XQ@XQ@xQ@@(@@PAA,A4A@A0AAA{A8AN{AB{@(@A{A =A =AA8A{@@@(@@@ABBBc??!G?@?aG??У?@Q@(@(A {A{A A4A*{A2{A8ADA{A@A{AV{AAtA@(@@`@ ?У??У?@@Q@(Q@(Q@ @(Q@0@@@`@xQ@@(@@(@@(A{A(A,A.{A(A*{A&{AAA<AdAZ{AN{A{AA2{AA =A =AN{AA {@(@(@(@(AAb{BBBBB"??@?@?aG??@@Q@P@(AA&{A$A,A{A,AF{A`A(AAN{A {A2{A =A =A =A@@p@hQ@Q?У?У?У@@Q@ @0@0@8Q@HQ@hQ@(@@@(@(@A{A{A{A{AA{A{A {AA APApAj{APA$A{AXAA =A =A<A A@(@xQ@(@@A =BvBBBBB??aG????@@Q@8Q@(A A8A&{A&{A A{AJ{APAB{AA>{A&{A AB{AAAA @(@@p@0@?@@Q@(Q@(Q@(Q@0@@@hQ@@(@@@(@(A{A {AAAA A AA8An{An{AdALA"{ALAv{AA =AtA6{AA{@(@(@(@(A{A(B[BBBBBLB A??aG?????У@Q@(Q@A0A@A,A"{A{@AA4A0A@Af{A {AdA{AZ{AAAA$@(@@(@@@Q@@Q@Q@(Q@0@@@HQ@hQ@(@(@(@A{A{A{AA@A{AA,A@AZ{AB{AF{A>{A6{A~{AA =A =AZ{AB{A*{A{A@A@A8A =B>BBBBBA =A{?@?????@@(Q@A&{A,A"{A(@@(A{A:{A@APAN{A{A@A =A"{A =AAA =ALA@@@hQ@`@XQ@XQ@HQ@8Q@P@XQ@p@(@(@(@@(A{A{A{A{A@AV{APA>{A>{A8A2{A:{A\AA =AA =A`AHA(A {@@(@(@(AABYBBBB}BHA =AP@>>?!G??????@Q@@(AA.{A2{@(@(@(A Ab{AHAXA@Az{ApAA,A~{AA =A =A =A6{@(@(@(@@@(@@@(@@@@AA{A,A.{A A\Az{AtAb{ATAN{AZ{AdAAAAAV{A<A.{A{A@(@(@(@(A:{A =B,BBBsB!AAR{A@HQ>\>\???????@@hQ@(@(A0A:{A@(@@(AAHAB{ApA =A =ADAAAR{AAxAz{AAdA$A@(@A {A*{A:{AJ{A<A&{A&{A&{A.{A8ADAHATAv{A{A@(@(AA =AA =A|AdAV{AB{AA {@@(@`@hQ@(A4ABTBBBBjB7AAD@@(@HQ>\?>\?!G??????@@(A A&{A<A{@@(@(@(A<A~{A`Av{A =AV{A =AAA2{Af{AZ{ALAb{AA =ATA.{A$AB{@(A{A,A{AA{AA{A{AA*{ALA@AHA2{A:{A&{A =AA =APA<A(A{@(@@P@p@AAA =B7BiBvB?BA =A4@(@(@@(>\?>\>\??aG??????У@(@@(A{A{A,A @(AADAV{A =A`A =AA =AA@(@(A2{A.{A4A8Af{A =A =A =A{A{A(A8AN{AZ{An{A =AAA =AA =A =AlA4AAAxAj{Af{A$AA{A A{@@A {AB{ABBpBBPB*AAxA@A"{@(@@>\??>\>\?@??????@Q@P@AA"{A&{@(@A {AN{A>{An{A =AAA =A =A@(@@(@(AA{A.{AZ{Az{A =A =A"{A.{A@AB{AF{APAR{A\AV{AhA|An{ADA @A =AAN{A&{AA{@AA@AAdA =ABB\BaBBB A =A^{AA{A.{A@A {A&{@>\??>\?!G?aG?aG?????@0@(@(A{A{@(@AA,AB{An{AA =AA =AAAA^{@@(@@(@(AA8AF{AlA{A A{A$A(A.{A:{A6{A8A>{A$AA,AAz{A~{A>{A{@(@@AAA*{ADAA =BB5BIBcB6A =A =A>{A,A>{Ad@@A{A =A??>\>>\??aG????У?@@Q@@hQ@(@@@@(A{A(AAAA =A =AAAA@A~{AV{@@(@(@@(A A{A{A{A&{A8A<AXAXAV{Ar{A =A\A|A =Aj{A@A:{A{A{@(@(@AHA AABBBIBXBCAA =AN{AA AAhAdAF{Af{A4An{@>\???>\?>\?!G????У@Q@ @(Q@0@ @@(@(@(@@A{Av{A^{AA =AABA =AN{A{AdA8A\AXA@@@(@(@@(@(@(AA {AA {AA{A{AA{A{A{@@?@ ?@AXA =B%BBBTBBB,BA =AA0A =A =Az{AJ{AV{AAA,AH@>???!G?!G????@???У@@(Q@HQ@HQ@@@xQ@(@P@xQ@@@(AV{ApA =AAA =A =B AA =AAAAf{A"{A{AA{@@@(@(@(@@@@p@p@@P@xQ@@P@ @XQ@Q@8Q@A@A =BBB8BBBKBA =AAZ{A =AAA =A =A =AA2{AV{@@(@p>\?!G?!G?aG?!G?>\?!G????@@ @@@@@@@(@(@@(@@(A,Aj{AAAAA =BBA =AALAA AAA{AA@@@(@p@@@P@XQ@@@@@`@8Q@XQ@@@(@(AA =A =ABB=BOBZB$B A =A =AB B A =A =AA =Aj{A@@(@(@(@`@@??@?@?aG?>\??aG???У??@(Q@XQ@P@P@@A @(@@(Ar{ATAA =A =BA =A =AA =A =A =AA.{A {@(@(A@(@@@@@@(@@(@@@@@P@@(A =BB'B1B1B?B;B0AA =B BBBA =AAAAT@@(@(@p@0@@>\?@?@?@?!G>\>\?!G?aG?????@ @8Q@@@P@(@@A@(AJ{A@A =AAA =B AAB A =A =A =A =AxAAAXA\A4A*{Af{AA(A =ALA<@(@@(AA{A{BB B)BHBNBIB)B BB BHBNB;BA =AA =APAA@@(@xQ@(Q@Q????@?@>\>>\?@???У@Q?У?@@@0@XQA"{@@A{A@A&{AA =AA =ABBBBAAAA =AA =A =A =AA =AA =AA =A2{A4AHA@Ab{AB%B3B@B8B=B*B6B3B?B{B}B\BAAAAn{A2{A{@@(@(@P@Q@Q??@???>????@???@Q@(Q@@@p@(@A$@(A4AB{AA =A =AA =ABBBBBA =AA =ABAAA =AABAAlA =A =AB4BIBDB7B6BXBcBUByBBBBfB6BA =AADAlA*{@@(@(@@XQ@0@Q??@??!G>\>>\?!G?aG???@???@Q@ @P@pAA{@@AA4A A`A =AA =A =AABA =ABB A =B BA =BBBB&AAA =B8BuBuBOBBBBBBBBBB{BcBNBAAAXA @(@(@@(@(@(@XQ@@@??@>?!G?>??@?aG??У???У?@ @@@`A@A {A{@(AHAAA =AA =A =A =A =AA =BBABB<B.B4BRBMB@BEBfBZBhBBBBBBBBByBrBNBqBA =AAA*{A{@(@(@@(@@(@XQ@@?У?@>>\?!G>>>?!G?@?aG?????У@@ @8Q@0@A AAAAj{ATAv{AA =AAA =AAAA =BA =BB8BB.B"BB"B.BGBKB=BABiBPBABYB)BB BA =AAAj{AA{@@@@@(@@@Q@Q?>\>\>\>>>>?!G?aG?aG??????@Q@(Q@(Q@(@A{A {ADA<A =AA =A =An{AAN{AJ{Ar{A =AAABABBBB4B"BBEB+BB@B"A =BBAA =A =AA =Af{A.{@(@(@@@(@xQ@Q???@>>>>>>>>\?@???????@Q@Q@0@ @@@AF{A =A4An{Ab{A =A =A =A =@(@A&{AJ{AV{AAAA =ABA =BBBB AAAA =A =AA =A~{AAb{ALA>{@@@@@@0???@?>>>?!G???@@@@@@Q@(Q@8Q@8Q@@@(@AA:{@(@(A {@(A@(@(@@AAA*{A{AHA =A|A =A =AAAAV{Ar{ADA&{A,A ATALAB{A6{A.{@(@@@`@@@P??aG?>>\?@???У@Q@ @(Q@Q@Q@ @HQ@XQ@8Q@0@XQ@xQ@(@XQ@@(@(@(A @@A@(@(ADA{A {A(A(A(A.{AA{A"{AAA{A{A {AA{@@(@(@@@@hQ@(Q@Q???@?>>??aG???@ @@@8Q@0@0@8Q@P@XQ@@@@?@Q@Q@Q@XQ@xQ@@@(@@(@(@(APAZ{Aj{A A{A{@(@(@(@(@(A{A@(AA{@(@@@@@8Q@????!G>\>\>>>\???У@Q@0@HQ@HQ@P@P@P@P@`@P@8Q@???@@HQ@@@(@(@xQ@@Q@`@AA$A4A{A.{A @(@(@(@@@(A{@(@(@@(@hQ@0@??@Q?>>\>\>>>>\?!G?@@@@HQ@@`@HQ@XQ@p@p@(@HQ@(Q@8Q@@Q@8Q@0@Q@@(@`@@(@HQ@@Q@hQ@@(@@AA A{@@(A{@(@@(@@(@@XQ@8Q@ @Q??>>>>>>\????@8Q@XQ@xQ@xQ@p@P@`@hQ@hQ@hQ@XQ@`@Q@@Q@@P@`@@@P@(@@(@(@@xQA@@@@(@(A@(A{@@(@@(@hQ@@@(Q@@???>\>\??!G?@?@Q@8Q@hQ@@@@hQ@0@0@XQ@`@XQ@p@XQ@ @@ @0@ @ @@@Q@8Q@(@ @@@@@@(@(@(@@@(@(@@p@P@0@Q@Q???>>\??!G?!G?aG??@ @XQ@(@@(@@0?У@@@8Q@hQ@0@@0@@@@Q@p@@@@`@@XQ@8Q@(@(@(@(@(@@xQ@(@xQ@p@@`@@@ @@?У??У??aG?@>\?!G?@?aG??У@Q@ @@@xQ@@(@P@ ?У??@?@P@Q@Q@?@Q??@Q@Q?@P@xQ@(@@@(@`@hQ@ @(Q@@@XQ@@@@ @(Q@ @0????aG?aG>\?!G?@?aG??У@Q@Q@(Q@HQ@hQ@(@@(@(Q@?У???@Q?@Q????@ @(Q@Q@(Q@8Q@Q@(Q@0@@ @8Q@ @Q@(Q@@ ?У@Q@0@ @(Q?Q?У???0?@??!G?@?aG??@@@0@XQ@hQ@(@@(@@(@p??У?У?У????!G?aG?У@Q@@@Q@Q@Q?@@Q@p@XQ@0@XQ@(Q@@@`@ @@ (@ @0@Q@Q@??>\?@?aG?????@ @@@p@@(@@(@@@(@P@(Q???У?@@@?????@@@@Q@0@0@8Q@p@XQ@@HQ@ @Q?@@Q?????@?aG?!G?aG??????@ @P@xQ@@(@@(A{@@(@@HQ@0@ @ @@@P@hQ@`@p@hQ@HQ@8Q@hQ@@@(@@A@(@(AA2{A8A6{AF{A{A,A {@@@@@Q??!G?@??????У@@Q@HQ@xQ@@(@(@A A,@@@@(@(@(@(@@@A@@(@@(A{A"{A A(ATAdAtA =AAA =AAn{A$A{@@@0?>\?@???????@@0@P@hQ@@(@(A{AR{A =AHA@@(@@(@@A{AXA =AdAN{AJ{A^{Ar{An{AlAf{A@A*{A{A,AAA{@(@@(@(@8Q???>\?@????У??@@@@ @8Q@P@P@P@(@A ALAlAAtA0A$@@xQ@(@(A0A<AN{AZ{Ar{A =A =AA =AlALALA@@@(@p@(@(@0@0@XQ@@8Q?@`@ ?@@p?aG?aG??@????@@(Q@0@0@8Q@@@8Q@8Q@8Q@ @@Q@p@A{A"{A2{A0AB{A>{AA{@(@(@(@@(@AA{A{AA@A@@(@(Q@ @@Q@(Q@?@@hQ@@@p@@@xQ@@@\(@{@@ ?O\)?\)>\?@???У?@Q@0@HQ@P@HQ@P@XQ@`@P@0@Q@?@0@xQ@(@@(A{@(A@@(@0@(Q@@@`@8Q@0@`@@xQ@p@P@@@ @(Q@@Q@Q@ @(Q@XQ@@(@@@@(@@L(@p@(@c @l(@ ?@>\?!G?aG??У@@Q@0@HQ@XQ@hQ@`@`@hQ@P@0@??У??У@@xQ@(@@@@p@?@@Q@???@Q@Q@?????У???@@8Q@0@(Q@HQ@HQ@8Q@8Q@@# @(Q@(@ (?Q??@??@@ @@@XQ@hQ@p@hQ@XQ@HQ@HQ@0@??У????@0@@@xQ@(@xQ@@@Q@Q????Q??????@?@?aG?@????????O\)???????@>\?@??У@Q@8Q@P@`@`@`@@@(Q@Q@@Q@??У???????У@ @ @(Q@?У????p?@?0?>\>\>\>\?????@@(Q@8Q@HQ@P@8Q@Q??У?У?У?У?У????aG?@?@?@?@?aG?????Q?aG?O\)?0?\)>R>>\?@??@@Q@(Q@0@(Q@?У??????????aG???@?!G>\???@?!G???>\>\>R>??!G??aG???@@Q@????aG?@?aG?aG?@?@?!G?!G?!G?!G?@?aG?@?!G?>\>>\>\>\>>\>R>R??@?aG???????aG?@?!G?!G?!G?!G?!G??>\>\>\>\???>\>>>>>>\??!G?!G?@????aG?!G??>\??????!G??!G?!G?>>R>>>>>>?>\??!G?@?@?@?!G?>\>\>\>\>\>\>\>\??@??@?aG>>\??!G?!G?>\>>>>>>\>\??@?aG?@?>>>\>\>??@?!G>\>>>>\>\>\>\>>>>>>>>>>>\>\??>\>>>>>>\>>\>\>>>>>>\>\>>>>??@?!G?@>?@?aG???!G?!G>>>>>>\???@Q?@hQ@ @HQ@(Q?!G?aG?!G?>>>>\??У@?У@XQ@(Q@@XQ@@@ @ ?У???>>>\?!G?!G?@ @@@@@@(@8Q@P@Q???>>??!G?@?@@@AA<AA"{@A@(@hQ???@>>>>>>\?@?aG?aG??@Q@8QA{Av{AF{A.{@(AA@(@(?>\>>>>>\>\>??@????У?@@(A<A&{AHA&{A^{A0AA@?!G>\>>>???>\?!G??????@@(AA(A*{A`A:{A<A{@(Q@0?@?\)>>???!G?>?!G???У???@hQ@HQ@(@Q@ A{A<AXAA@xQ@0?@?>?>\>\>\??!G>\>>>??@????У?У?У?@??@xQ@@(@@(@P@HQ?@?!G>?!G?>\??!G>>>>?!G?@??У@@???У?У?У?@@Q?@@XQ@xQ@XQ?Ǯ?>\>>\??>\?????!G?@?aG??????У?@@@8Q@(@hQ@@(@(@@@@0??@?>\>>\?@?aG???aG??У?У?У@>\??!G?!G?!G?@?@?@?@????????????У?У?@@(Q@XQ@hQ@p@(@@(@xQ@HQ@??!G>\>\>???aG??????@>\??@?aG???????????????У?????@Q@@(Q@HQ@P@`@xQ@@(@(@(@8Q?У??>\>?!G????????>>\??!G?????????????????????У?У?@Q@@@ @8Q@8Q@HQ@`@(@hQ@p@P@Q??@?>?@???????>\???@?????У?????????????У?@??@Q@Q@(Q@ @ @ @(Q@ @Q@Q@HQ@`@xQ@p@8Q???!G>\>>\?aG??????У>\??@???@@@Q@Q@???????????@@@@@Q@(Q@Q@@@HQ@8Q@hQ@0@(Q@8Q@(Q@Q@8Q@XQ@(@HQ@??@?>>??aG?aG????>\??aG?@@@@@Q@(Q@Q@?????????У@Q@ @ @8Q@0@8Q@@@@P@@@P@`@(@(@(@p@p@P@@@p@hQ@P@Q???@>\>?!G?@?aG???>\?@??У@Q@ @Q@Q@(Q@0@(Q@??У?@???@Q@0@ @@@@@p@@@(@@(@@(@@(@@(@@@(@@xQ@HQ@HQ@HQ@ @?У??!G>\>?@?aG???У??@??@Q@ @8Q@P@@@(Q@Q@@Q@ @Q?@Q@@@Q@0@@@@@@(@(@@@@(@(@@@A{@(@@@(@@(@@(@ @@`@@???@>\>??aG???>\??aG??@@ @@@P@XQ@8Q@Q@@(Q@HQ@HQ@Q?У@Q@@ @8Q@P@@xQ@@@@(@@(@@(@@(@AAA@(@(@(@@(@@HQ@Q@0@(@0?У??>\>?!G???>\???У@Q@@@8Q@`@XQ@0@(Q@8Q@0@HQ@XQ@0@Q?@`@xQ@p@@(@@@@(@@(@@@(@(@(@@@(@AA0A {@@(@@@@xQ@@8Q@@Q??!G>\??@??У???У@@ @ @@@p@XQ@@@(Q@@@P@`@XQ@HQ@(Q@HQ@p@@@@(@@@(A A&{A@ALADA0A@@@AA{@(@A{AR{A$@(@@(A@(@P@ @xQ@P?У?@?>\>>\?!G????aG?@Q@0@ @@@(@hQ@@@ @8Q@8Q@XQ@p@P@0@`@@A{@(@(@@(A AAF{A\Az{AA =AAAf{A*{A@(@(A{AAAALALA{@(@@(@@P@ @@???!G?>\>\?!G??У>\?aG??@ @0@8Q@xQ@p@@@ @(Q@(Q@P@HQ@@@8Q@HQ@@@A@@(@A{A {AA(AF{AF{AXAn{Av{A =AA =An{A,A@(A{AA{ADA =A^{A@@(@(@P@Q@8Q@0??@?!G?>\>??aG???aG??@@ @Q@ @P@@@ @@@(Q@8Q@8Q@0@XQ@@@@@(A {@(@(@(@@(@AA {A{A&{A(A$A4AB{AV{A\AF{A @@(AA0A`A =An{@@@@(@@@8Q@XQ??aG?!G?!G>\>??aG????@@Q@(Q@ @@ @ @Q@Q@Q@@(Q@(Q@ @HQ@xQ@(@(@(@A A{@@@@(@@A{AAA{A{A@(@(A{A(A:{A0A{AA{A A0ATAlA{@(@(@(@xQ@HQ@P@ ??@?@>\>>??aG????@@0@8Q@(Q@Q@Q@(Q??У??@ @(Q@Q@0@XQ@(@@(@@(A {A2{A @(@A{A{A0ADA4A0A{A @(@@@@(@A(A\A2{A{AA{A$A2{AdA{@(@(@(@HQ@HQ@8Q??aG?@?>\>????@??@Q@0@@@0@@Q@??У??@@@ @P@@@@(@@(A"{AA0A{A A8AB{Aj{AA =AAV{A,A{@@(@@@AA0ALA{@@A{A<Av{A:{@(@(@(@hQ@8Q@HQ??aG?@?!G>\>??????@@(Q@8Q@@@(Q@Q@(Q@??????@ @`@(@(@@AA"{A0ADAxA&{A{A2{AJ{Aj{A =A =A =AAdA{@@(@(@@(@(A A A A{A A{AB{AhApA@(@(@(@ @ ???aG?aG?>????@?@@(Q@8Q@8Q@@@Q@ @ @???У???@@P@(@@A {AA@ALAj{AJ{ATA0A2{ADApA|AAAAZ{AN{A{@@(@(@@@A {A2{A"{A*{A AHA`AA2{@@@@ @Q@Q??aG??!G>>\??aG????@(Q@HQ@@@HQ@8Q@@Q@Q@Q@?@???@Q@@@XQ@(@(A{A6{A^{AA&{AlApA,A:{AB{Af{AhAv{A =Af{AXA8A>{A8A@@@@A{A(A"{A0A A(AB{AN{A<A@@@0@@??aG??@>\>\??aG??!G?@Q@P@XQ@8Q@@@(Q@8Q@P@(Q@@@ ??У?У?@@(Q@P@xQ@@(A6{AdAv{A =A =Az{A =APA`AdAAAA~{ALA"{AF{AR{AF{A @@@@(AAA{A{A AA0ATAhA{@(@@@@Q@??aG?aG?@>\>\?!G????aG?@0@`@P@8Q@8Q@@8Q@HQ@0@@@????@Q@@@p@@(AA6{AhA =A|A =A =Af{AdAhA =A =AAA =AN{A6{A<A,A0AF{A6{@(@(@(AA{AA8ADA<AdA~{Aj{A,A{@@(Q??У??aG?aG?aG?>??!G???!G?@(Q@P@p@XQ@@@ @@0@0@`@0@???@@ @XQ@@(A*{AJ{AN{ADAXALAtAhA^{AtAf{A =A =A =AAAA^{A&{A"{A6{ALADA@@AA0A*{AXAb{Af{A =A =A =AF{A{@@`??????aG?!G?>??!G????aG@Q@hQ@@(@hQ@@@Q@Q@@@0@(Q@ ??У??@@0@p@(@(AJ{ATAr{AhAV{ADAV{A\AAA =AA =A =A =AA =AA|A{AA2{AB{AHA@@A$A$AZ{AA =AAA =A^{A{@@(@?????@?!G?!G>\??@????@ @@@@hQ@8Q@@Q@P@8Q@ @Q?У?У??@@8Q@hQ@(AA2{ALA^{An{AlA`AJ{A =AAA =A =A =AA =Av{AtA =A =A>{@(AA(A:{A@(@A A2{A\AABAAAD@(@@(@?У????@?@?@?>\?!G?@???!G?@0@@(@@hQ@0@Q@@P@0@@????@0@XQ@@(AA2{ADAHAN{A\ATA =AB B;BBAA =AA\A*{A:{AN{ADA@(AA{A{@@A A0A^{AA =A =A =AA`A{@@(@ ?????aG?aG?aG?>>\?!G?@???aG?У@8Q@xQ@(@(@hQ@ @Q@XQ@XQ@Q@Q?????@(Q@XQ@@(AA<A8AB{AtAXA|ABB7BBBBHBAAr{AA{A{A{@(@@(AA@@@A(A\A =AAAA =AA`A@(@HQ@ ?У??????!G>\??!G?aG????@@@p@(@(@`@Q@@XQ@HQ@????aG??@ @XQ@(@A&{AA4A@A|An{A =A =BBjBB|BBAA =AA:{@(@(@@(@(@@@@@@@(A{AR{A =A =AA =AAA|A{@@@@????aG???!G??!G?@???У?@@@@p@(@@P@@Q@`@@@Q?У???aG??У@ @p@@(A0AA0A<AAA =B B/B{BBBBA =Ab{A@@(@p@@@(@P@xQ@(@(@`@xQ@AA@A =A =AA =AA =An{A{@@(@`@Q???aG???!G?!G?aG?????@@8Q@hQ@(@@P@@(Q@(@@?????aG??У@ @HQ@hQ@(A*{A$A*{AF{AA =A =BBABBBBBBA =AD@@(@@0@@xQ@ @HQ@(@@P@XQ@A{A8Av{AAAA =A|ADAA@(@P???????@?@???????@@8Q@hQ@(@(@XQ@@0@HQ@@@Q??У??aG??@ @0@p@A$A{AA>{A =A =ABB]BBBBBDAA @@p@P??@HQ?@0@(@xQ@0@@@A AB{Ar{AA =AA =ATA4AA@@8Q?У??????aG????У@?У???@@@p@(@@P@@8Q@`@XQ@ @@????@Q@ @XQ@(A A"{A{A>{A =AAB;BlBBBBB}B)Az{@@@XQ@(Q??@Q?@ @hQ@0@ @HQ@AADAj{AA =A =A =ADA A{@@p@Q?У????????У?@Q@P????@@@hQ@xQ@xQ@P@@8Q@hQ@p@0?@ ?У????@Q@P@AA(A A6{AAA =BLBkBlB[BBA =A<@(@xQ@0?????@(Q@0@@@HQ@(A{A.{AdA =A =A =AZ{A,AA@(@HQ@?У???aG????У@Q@Q@hQ@(@p?!G?aG?@8Q@P@`@hQ@@@Q@0@(@(@HQ@@ @Q????@Q@ @(@(A$A(A{A =A =BB*B?BTBA6{A{A8@@@ ??aG????@ @?@@@@(A"{A^{Av{AA`A*{A@A{@(@0?????????@Q@8Q@(@(@?!G??@(Q@HQ@P@p@P@(Q@(Q@(@(@p@Q?@0?????@@@AAA(A~{AB+B*AAA =Ah@????!G?@???aG??@??У@(Q@(@@A A@AdA\A,A@@(@@(@Q@@@?@@?У?@Q@0@xQ@@(@?!G?aG?У@ @@@HQ@`@hQ@8Q@8Q@@(@(@0@0@@?????У@Q@8Q@@AA0ATABB'A =AF{A A{@?У??aG?@?@?!G?@??????@`@@@(A{A4AF{A @(@(@@@@p@Q@@(Q@@Q@@@@Q@(Q@`@(@@@(?!G??@@8Q@@@`@p@@@8Q@(@(@@HQ@ ???????@@p@A{A"{A.{AA =A =A@A@@HQ@0??aG?!G???!G???У???@ @hQ@p@(@(A A$A{@(@(@@@(@@8Q@(Q@XQ@8Q@Q@Q@Q@@ @@@hQ@(A&{A@@(??aG?@@(Q@8Q@P@p@8Q@0@(@(@(@hQ????????У@@0@(@AA APAAA{@p@HQ@xQ@(Q?У?aG?@?@?@?aG?????@@HQ@HQ@P@(@(@A@(@@@@(@@@HQ@p@@ @@ @@Q@HQ@hQ@A.{AA(@@(???@Q@0@HQ@`@8Q@ @`@@(@p????????@@Q@P@(@(A"{AA>{APA:{@(@@ @???????????@(Q@0@(Q@HQ@(@(@(@@(@@(@@(@@@(@@hQ@HQ@8Q@(Q@Q@@@p@@A =A =A {@(@HQ???@Q@(Q@HQ@P@0@ @@@@@XQ@Q????????@Q@Q@P@(@A&{A A{A\A6{@@HQ@ @Q????У?У????У@Q@Q@ @0@P@(@@@@(@(@`@(@(@@(@@(@p@p@@@(Q@8Q@p@(@(A =A =A =A {@@0?@??@@(Q@@@8Q@8Q@(Q@ @@@@(Q?????????@@ @P@(@(AA{AA@(@@ @@@Q?У?????У@@Q@Q@Q@0@P@(@@(@(@`@HQ@xQ@@(@@(@(@(@@`@8Q@(Q@`@xQ@AA =AA =@@HQ@Q?!G???@(Q@8Q@8Q@0@(Q@ @p@@(@p@?????????@@@@@@@@@@@XQ@Q?????????@@Q?@@0@P@p@p@p@P@8Q@HQ@@@(@@@@(@(@P@(Q@@@p@(@(A =BAAj{@@ @????У@ @0@8Q@8Q@0@(Q@`@(@(@(@0?????????У@?@Q@8Q@XQ@(@(@(@@p@@@ @@Q@Q@@@Q@Q@Q@@??@@@@@@@P@8Q@ @ @hQ@@(@hQ@@@@(@@@@@@hQ@@(A2{BA =A =A@(Q@ @Q??aG??@Q@0@8Q@@@0@8Q@XQ@@(@@`@Q?????????У???@ @@@p@xQ@hQ@@@(@@(@hQ@P@P@P@0@(Q@Q@Q???@0@ @ @@@hQ@(@p@@@p@@@@(@hQ@(Q@@@(@(@ABA =A2{@XQ@(Q@ >????У@@0@@@0@@@8Q@xQ@@(@(@(@P@Q??@Q@?????У??У?@@@@Q@@Q@ @HQ@`@HQ@?@@ @ @ ?????@Q?@@8Q@XQ@P@XQ@XQ@@@(@@p@@@0@@@ABAA@@(Q@(Q@>?!G???У@Q@(Q@@@8Q@8Q@@@p@@(@@(@@(Q??@@ @(Q?У??????У?У???У?У??????У?У?@@?aG?aG?aG?aG?aG@Q@Q?@ @8Q@@@@xQ@(@@(@@(@XQ@@@`@@(A,BB9A@(@8Q@Q@ >\>\????!G???@@Q@@@0@8Q@@@`@@(@@(@@`??@Q@HQ@XQ@0??????????????????????@?@?@?@?@@@Q@(Q@@@0@XQ@p@@@(@(@(@XQ@8Q@XQ@@(A$ABBA =@xQ@ @Q@?????!G?@???У@@Q@@@@@8Q@8Q@@@p@@@@@(@(Q??@@@(@xQ@XQ@??????????????У????@?@?@?@?@@Q@ @HQ@P@XQ@@(@@(@(A@(@Q@@@XQ@@AA =BGBA =@(@0@@???У??!G?@?aG??@?@Q@8Q@P@P@0@8Q@HQ@@(@@(@@`@(Q?У?У@hQ@@@(@8Q@Q????????????У?У????@?@?@@Q@(Q@0@0@8Q@P@@@(@@(Q@p@ ??@@AA =B&B4A@@XQ@@Q?@?!G?@p???!G?@?????@Q@0@P@XQ@8Q@ @0@P@(@@(@@p@P@Q?У?@XQ@(@@(@hQ@ ???????????У????У@@Q@Q@(Q@0@0@@@`@@(@(@@@0@HQ@@?У??@Q@Q@(BBWB A @@(Q@Q?@?@?@HQ@>\???!G?aG?aG???@@@8Q@HQ@`@hQ@(Q@ @8Q@`@@(@@(@hQ@8Q@Q??@@@@@@(@p@0@??У???????@@@@@@XQ@P@HQ@p@@(@??@@Q@8Q@(Q@???@Q@Q@A"{AA =A =@@P@0???@p@@(???!G?@????@Q@Q@@@hQ@hQ@@HQ@Q@Q@ @P@@(@(@(@HQ@ @Q@Q@@(Q@(@(@(@(@@(@@@ @Q@Q@@@Q@(Q@`@`@@(@@(@@(@@(?@@Q@Q@ @0@ ????@@@8Q@AJ{AA =A6{@@hQ@`?aG?@0@A{A {@(>\>\>\??!G?@?aG???@@ @HQ@XQ@`@p@p@8Q@@@(Q@@@p@(@@@HQ@ @(Q@Q@@Q@`@@@@(@@@xQ@xQ@xQ@(@(@@(@(@(@(@(@@(@@@0@(Q??@@ @8Q@ ???@@@@(@(AA =A =AH@@hQ@@???@(@(@A {@?>\?>\?!G?@?@???У@@(Q@8Q@`@@(@(@@xQ@@Q@ @P@xQ@@(@(@p@(Q@Q@ @@Q@@@hQ@@@(@@@(@@(@(@(@@@@@p@p@`@(Q@Q@Q@Q@8Q@HQ@0@???@ @(@A Av{ApA =A6{@(@p@XQ@Q@ @@A$A<A A@(??>\???!G?!G?aG???@ @@@p@`@(@(@(@@(@Q@Q@Q@P@@@(@(@@0@@@@Q@(Q@P@`@P@`@hQ@`@`@hQ@xQ@(@(@(@`@hQ@8Q@ @Q@0@HQ@p@XQ@0@ @Q??У?@p@A {A:{A0A =AXA(@@@xQ??@(A{A{A8AF{A@(@(?>\????!G?@??У?@ @XQ@@hQ@@(@(@(@(@P@(Q@Q@ @@@`@@@@(@HQ@ @Q@@ @HQ@`@P@@@8Q@0@0@8Q@P@XQ@XQ@8Q@0@P@`@p@(@@@p@8Q@Q@@Q@@hQ@@(AAHAlA<A8A@@@@`@(@AA@A^{A:{A@AA&{>\???!G?!G??У@Q@ @@@p@p@@@@(@@@p@@@@Q@8Q@hQ@xQ@(@@@hQ@`@8Q@(Q@0@@@`@`@@xQ@hQ@hQ@p@@@(@@(@(@(@(@(@xQ@hQ@P@@@0@(@(@A{ADA8APA:{A$A{@(A@p@P@`@AF{AXAlA|AHAA{A$A4>\?!G?!G?aG?@Q@ @HQ@@xQ@(@@A@@@@xQ@P@@@0@hQ@p@(@(@(@p@xQ@@p@p@p@@(@@(@@(@(@@@@@@@(@(@(@(@A@A4A:{APAF{A^{A @(@(@@(@xQ@p@@AAF{A`AA|AJ{A"{A>{A ADA@??!G?@??@Q@@@p@@@AA$AA {@@(@(@8Q@@@ @`@xQ@@@hQ@(@@@@@@@(@@AAV{A.{A.{A"{A{AA(AA"{AHA<Av{A =AA =A`A~{A@A@(@@@@@(@(A{AB{An{AAAAz{A,AAADA2{A{>\??@?aG??@0@hQ@`@@@A A<A{@@@(@@P@Q@@(Q@@@hQ@xQ@@(@(@(@@(@(@@(@(@(A{A {A:{A2{A>{AHAHAj{AAA =AAA =AAATA$@@(@@@@(@A*{A$A\AhAj{A =A =AxAlA8A8A{A8A{A{>\>\>\?!G?@??У@Q@`@@@(@@AA&{A.{AA(A@@@??@Q@Q@HQ@xQ@(@(@(@@@(@(@A{A{A:{A A*{A(AJ{Aj{A =AAA =A =A =A =AA\A<A@(@@(@(@@A6{AR{AhAV{A =A =AA =A =AHA8A$Af{A{A(@@>\>\>\>??@???@ @xQ@xQ@@@(@A{AZ{A`AHA6{A{@@XQ@?У@@@ @P@`@xQ@(@(@@(@(A{AALA8ATADAr{Az{Av{An{A =AA =AAZ{A<A{@@@@(@A{A{ADA =Af{A~{AhAz{AAAAA2{A2{AA2{A{@@(@(Q>\?>\>\>\?!G?@??@Q@@`@(@@(@(@(A,Av{A =AAtAF{@(@@??У@@@ @8Q@P@XQ@p@(@@@AA{A*{A>{ALAR{AF{APAJ{A2{A0A"{A{@@(@@(@@(AF{AZ{AtAtAAtAAAA =Az{A`A6{A4A{@(@(@@(@(Q@Q??!G?????@??@Q?@@(@(@(@@A{AV{AAA =AA`A@@hQ@Q?@Q@@@Q@ @0@P@hQ@@(@@(@(@(A@(@(AB{AJ{AJ{A\@(@@A {@A*{AR{AA =A =A =A~{Af{A`Ab{A^{A^{AAAF{A{@(A@(@@xQ@HQ@?У>\?!G?!G?!G??!G?!G?aG????У@Q@p@(@(A@A&{APAA =A =AA =AXA {@@p@Q@(Q@(Q@(Q@(Q@(Q@0@8Q@HQ@@@HQ@hQ@p@p@@(@(@(@@@(@A A{AZ{An{AAA =AA =AxAv{Az{Af{ApAAlA<A{A@@@(@@(@8Q?????@?!G?!G??!G?!G?@?????@XQ@@@(A{A"{AF{Av{A =A =AAAA:{A*{@@(@@@xQ@hQ@hQ@P@P@P@`@p@(@(@`@@@@(A{AA.{AdAlAtAAAAA~{AhAb{AJ{AJ{AlAN{APA8A{@@@@@(@p@HQ@Q?У????@?@?!G?!G?!G?!G?aG????@ @@@(@(@(AA{A8ALA =AA =AA =AAlA>{A8AA@@@(@(@@(@@(@@(@(AA{A(AZ{Az{A~{AA =A =A =A =Av{AAv{AN{AV{AHAJ{AJ{A@@(@(@(@(@@@xQ@HQ?????>\?!G?@?@?!G?!G?@?@?aG?aG?@??@@`@(@(@(@A {A$A@A@AhA =A =AA =A =A =A =An{A<A$A{A@A@A A&{AF{AXAA =AAA =AA =A =AAtA|AdAZ{AHA0A8A{@(@(@(@(@@hQ@@@hQ@8Q@@?У????>??@??@?@>>??????@ @HQ@(@@@A{A AA(ALAA =AAA =AA =AAA~{AhAJ{AR{AR{A>{AAAA =A =AAAA =AAAtAZ{A2{A{AA{AA{@(@@@(@XQ@(@(@@p@0@Q??У????aG?@>>\?>?aG?aG?@??aG???@?@?aG?@@XQ@(@(@(@@AA{A&{A8ATAA =AAA =AA =A =A =A =AAtAJ{ApAXA6{AB{A4A&{AB{A>{APA^{AJ{A&{A{A{A@(A{@@@@p@(@(@XQ@`@p@XQ@8Q@Q??????aG?@?aG>>\>\??!G?@??aG??aG???aG??@?aG?@ @`@(@(@@@@(A AA{AR{APAf{AAAz{AA =Az{A =A =Af{Aj{ApAJ{AF{A\A6{AHAV{AN{AJ{A\A:{A{AA@@(@@(@@(@P@ @@@`@`@XQ@8Q@??????aG?!G?!G?>>>>\>\???!G?@?aG???????@?!G?@??@@@@(@@@(@(@(@@(@AAAF{AXAlAxAA =Az{A =A^{AlAlATAN{Az{A~{AlA\AXA<A:{A{@@@(@@@@@XQ@P@XQ@@@XQ@`@P@8Q@?У?????aG?@?!G?!G?!G>>>\???!G?@?@?aG????У?????aG???@Q@HQ@p@(@(@(@@(@@(@@@A{A,A6{ATAr{An{AZ{ADAZ{AHA,ALAHA2{A2{A@(@@@@(@(@@@(@@@@0@@@XQ@`@(@XQ@@@??????@?aG?@?!G??>>>\>\??!G?!G?aG???????????????@@@@(@(@@@(@@A@(@(@(@AAAA{A(A{A {A {A@(@(@(@(@(@(@(@(@(@(@@(@@@(@@p@`@HQ@HQ@8Q@ @Q?????@??!G?aG?@?>\>\>>>\>\??!G?aG?aG??????@Q?У????????@@P@hQ@@(@(@@(A{@A&{@@(@(@@(@(@(@(@(@@@@@@(@@@(@(A@@(@@(@@(@@@@@@@@ @Q@?@?У??@??!G?!G?!G?>\>>>>\???!G?@?@?aG????У?У?@Q@?????aG?????@P@(@@(A{A@(@(A{A{A{A{@(@@@@(@@@(@@@@@(@@@(@@(@@@@@@0@@@@@8Q@Q@Q????aG?!G??@?>\>>?aG>?!G?@?@?@?aG?????У?@@Q@Q@??@???aG?@?@??@@8Q@(@@(AA A A@(AA{@(@@@(@@@@@@A {AAA@(A{@@@(@@@@@hQ@hQ@Q@Q????????!G?>\>>\?!G??????????@Q@0@0@(Q??aG?!G?@?aG??aG?aG??@@8Q@(@@(AAA{A{@(@(AA{A$A{@(@(A{@@(@(@(@@(@(@(@@@@@(@@(@xQ???????aG?????>>>??@?????????@ @(Q@HQ@@@??aG?@?@?aG?aG?aG???@Q@8Q@P@(@@@(A{A{AA.{@(AA@A{A@@@@@@@(@@@xQ@xQ@hQ@HQ@8Q@Q??????@?!G>>>\>\>>>\?!G??У??У?????@Q@HQ@p@`@`@Q???@?@?@?@???У@Q@HQ@`@@(@(@(@(@@A@AA{A{@(@(@@(@(@@@hQ@HQ@@@0@ @@?????aG?aG?!G?>>>>?@>???@??У???????@@XQ@@@xQ@Q?У?aG?@?@?aG????У?@(Q@(@(@(A{AAAA@(A@@(@@@(@@hQ@P@@@(Q@(Q@Q?У????aG?aG?aG??>\>>>\??@?aG???@??У?У?@@0@HQ@XQ@@@`???aG??@ ?@@@@@(Q@8Q@@AA{AA.{A*{AJ{AA(A{@@@@@(@`@0@@????@?!G?@?>???aG?@>\>\?@????@@Q@@??@Q@@@xQ@hQ@@@@HQ?????У@Q@@@p@(Q@ @P@HQ@p@(@A2{A0A(ALAPA:{AB{A{A{A@(@@(@(@@@Q@@@@@0@HQ???aG?@>>\?!G?aG???У@@Q@Q@ @Q@Q@(Q@0@P@@@(@(@@(@Q???У?@8Q@@@@@hQ@HQ@ @ @8Q@@@hQ@@(@(@@(@(@xQ@(@`@@@@@(@3 @@0???0?@>>>>>\??@?aG???@Q@@@(Q@0@0@@@P@@@(@(@@@@P@@??@@8Q@hQ@(@(@@(@@@@P@HQ@`@XQ@xQ@hQ@p@p@0@ @Q@@Q@@Q??Q?@??@?!G?!G?!G>>>\>\??!G?aG????@Q@@Q@Q@(Q@@@HQ@xQ@@@@(@@A@(@p@8Q@(Q@ @ @0@8Q@XQ@XQ@@@(@(A{@@@XQ@@@@@Q?У??????aG?@?!G??!G?@?@?@?@???@??!G>>>>>\>\??@?aG?????У??@Q@@ @8Q@P@p@@(@AAHA@(@@(@XQ@Q@Q@Q@ @ @ @@Q@0@`@@(@@@(@(@@P@(Q@Q@@Q@P@@Q@Q@HQ@(@xQ?@@@Q???aG?aG>>>>\???!G?@??????У??У?@@Q@Q@8Q@p@(@@(A{Aj{Av{A0@@p@0@@0@@@0@ @ @Q@Q???@ @P@ @p@HQ@@@@@8Q@@@P@@@(@@(@@P???>\????@????У?У?У?У????@@@@ @(Q@XQ@(AA,A =A =A|@??@Q@8Q@XQ@(Q@ ????????У???????У?????aG?!G>?>?!G?@?????У?У?????У?У????У?@(Q@hQ@(AA@A(@(@P?У???У??????aG?aG?@?@?@?!G>>??!G?!G?@?aG????????????У?У????У@@hQ@(@(@(A@@HQ????У?????aG?@?!G?>\>>??!G?!G?!G?aG?aG?aG?aG?aG???????????????@@P@(@(@@(@`@Q?????aG?@?!G?>\>\????!G?@?@?@?@?@????????????@?aG???У?@Q@P@hQ@8Q???aG?aG?aG?aG?@?!G>\>>\??!G?!G?!G?!G?@?aG?@?@?@?aG?????????aG?@?@?@??????aG?@?!G???>\>\>\>\>\>\??!G?@?@?@?@?aG??aG?@?!G???!G?@??????@?!G?!G?@?aG????aG?aG?@????>\??!G?@?@?@?aG?aG???@?!G>\>\???!G?aG???aG?!G???!G?@????@???!G>\>\??!G??>\?!G?@?aG?aG?@?aG?aG?!G????>\??!G?@???@?!G????!G?@?@>\>????>\??@?@?!G???>\>\????!G?@???aG?aG???@??>\>\>\??!G>\>\???!G?aG??aG?aG??????!G?>\??@>\>\>\??@???aG?@?@?aG??У????>??@??>\>\>\???@???@?@?@?aG?????aG?!G?0?>\??!G??!G????!G?@?@?!G?!G?@?@?!G?@?aG?!G??>\>\>\>\>\?????@?!G?!G?@?!G????>\???@?!G>??aG?У???!G??>\>\>>>>>??@???aG?!G>\>>\>>>\?>\>\??!G?@?aG??!G>\>>>\>\??@?@?@?@?!G>>>>>>>>>>\>\?!G?aG?!G>\>>>>>\??>\?>\>>\???>\?!G?@??@>??@?!G>\>\?!G?!G>\>\?!G?@??aG?!G?@?@??@?@>??@?@>\>??@?aG?>??!G????aG?!G??@??У?@>>\?!G?!G>>\?!G?>>?!G?aG??У?У??aG?!G??!G?!G?@>>??!G?>>>?!G?aG??@Q???aG?!G>\>\>>>>\?!G?>>>??!G?aG?@Q@Q??У??@?>\>\>\>>\?!G?aG?>\>\>\>\?????У?У?@Q???aG?aG??aG?>>\>\?>\?!G?!G??>\>\?>\>?@??????@??????aG>\>>\>\>\??!G???>\>\>\>\?!G?@?aG????У?У?У?У?????@?>BBBBBYB'BBBrB+BBxBi7BYBJzB;B+B8B BHBBBBθB)BBB\BBqBaaBQBAB29B"wBBBBIB-B"B BBFBڝBB?BBB BvIBeBTBCBƌB\B&BBBzgBkB[BLwB=B-BYBBB BBBBBxBBLBsBd BTdBDB5B%MBBB B=BlBƖBBBB BwBg*BW1BG3B70B'(BB BBBֶBƑBfB7BBBuBeHBUBDB4bB$ BBPBBBBB'BB(BBoB^BMB=XB,BB oBBB\BȡBBBVBBtBcBBدBvB7BBB\B} BmB^RBNB?B0B B-BB-BBBÆBBRBB Bu^BeBUBF;B6{B&BBBGBmB׎BǪBBBBBwBgBWBGB7B'BBvBQB(BBBBPBBBu{Be*BTBDzB4B#BNBBnBBzBBsBBYB~Bn,B]BLBB-BB BBBBBBB @B 1pB !B lB B SB B %B ąB B 7B B B vB f[B VB FB 6B '+B RB sBBB׹BBBBBBwBgBWBGsB7QB'+BBBB]BBBB?BBBt4BcBShBBB2B"BBBBBtBBEBBB|[BkBZBJDB9B(BB7BhBBԻBBBB'B7BoAB^GBMHBBHB7B'BuB6BBB[BBBRBBBtBcBS5BBB29B!B*BBBnBB-BBB(B{rBjBYBI1B8hB'BBBB/BHB]BmBxB~B~Bm|B\tBKhB:VB)@B%BBBB B tJB dB U6B EB 6 B &qB B (B |B B B WB B B B 1B yZB i~B YB IB 9B )B B BBBBBBBzBVBy,BhBXBHB8SB(BB{B(BBuBBBBBB\BsBccBRBBUB1B!4BBB]B޶B BZBBB*BzfBiBXBGB7%B&IBgBBBBѳBBBBB|BkBZBIeB8FB'"BBB >B B .B vB gB WmB GB 8'B ({B B B [B B B B :B dB B B zB jB ZB JB :B *B B BBBڳBʕBqBIBBByBitBY2BHB8B(NBBBBBBzPBiBYBI5B8B(_BBuBBvBBdBB>BBBr`BaBQB@UB/BBBWBBۻBB B,BHB_BvrBeBTBCB2B!B|BlBYB@B#BBBB~BvIBeB B B wB B 9B B B 4B }B |B lB ]8B MlB =B -B B B B 4B CB LB PB PB JB >B ~.B nB ]B MB =B -B ^B *BBBmB$BBB*BBzjBjBYBI%B8B(2BB,BBB}BBEBBBKBqB`BP%B?dB.BB B/BUBwBɓBBBBBtBcBRBAB0BBBuBTB-BBBBeB'B +B B B GB B B FB B B B PB ~B nB ^B OB ?$B /?B TB dB oB tB uB pB fB VB BB (B  B nB ^B NB >ZB ."B B BYB BܹBbBBB>BBzaBiBYqBHB8lB'BTBB'BBB?BBB*BoBpB_BOB>PB-|BB BBBBB(B.B.B*Bs!BbBQB?B.BB B[B,BBBB@B LB B .B FB BBCBB}BBB.BBz5BiBY(BHB8B'pBB1BBB-BxBBB9BpBoB^BMB=B,7BQB eBuBBׅBƆBBzBmB[BqDB`(BOB=B,BB WBBB֠BZB n B ^nB NB ?#B /vB B  B MB B B B !B IB kB B B qB aB QB AB 1B !B B B B nB LB %B B B B VB pB _B OB ?4B .B B $BBVBBtBB}BBrByBiSBXBH B7B&B.B~BBBPBBBB$BMBnpB]BLB;B*BBBBBBBBBBhBoDB^BLB;B*BFBBBtB B B p?B `B PB A+B 1oB !B B B HB qB ҕB ³B B B B B rB bB RB BB 2B "B B B `B 5B B B B UB B B pwB `#B OB ?kB /B B 1BBFBBGBB4BB ByqBhBX,BGB6B&BfBBBBPBBBBB~BmB\-BK:B:AB)CBAB:B.BBBBBBB~SBm!B[BJB9nB((BBB B _B B B rOB bB RB CB 3CB #sB B B B B B "B ,B 1B 1B ,B t!B dB SB CB 3B #B tB EB B B ҙB UB B B kB B pB `RB OB ?~B / B B BBB܇BBaBB(BBxBh,BWyBFB6B%ABzBBBB-BMBiBBB|BkBZBIB8B'BBoBVB7BBBBBVB|BjBYBHMB6B%B ҃B B +B wB B B t:B dqB TB DB 4B %B 1B GB XB dB jB lB hB ^B PB B .FB B BRBBB1BqBBBBv@BehBTBCB2B!BBBBBBBBBBwBfmBUGBDB2B!B}B?BBܴBgBBBeBB 7B 'PB B B B EB uB ȟB B B B B y#B i-B Y2B I2B 9,B )!B B B B B ؜B qB AB B B B wNB gB VB FbB 6B %B FB B pB B ӅB B B B qB B pIB _B O B >gB -B  B WBBBBRBBBBBuBd5BSJBBYB1dB jBkBgB^BQB>B'B BBBuBdjBS6BAB0B|B5BBBBBBB%B XB HB 9B )NB B B B B (B DB ZB kB wB }B z~B jzB ZpB JaB :MB *3B B B B B dB +B B B aB B wB ghB W B FB 6@B %B aB B nB B fB B JB B B zB oB _+B N|B =B -B QB BBB(BQBuBBBBsBbBQB@B/BB BBBڋBkBFBBBBsBbCBQB?B.oBB BpBB׮BFB z B jPB ZB JB :B +%B MB oB B B ۶B B B B B B {B kB [B KkB ;GB +B B B B JB B B tB "B B nB x B gB W:B FB 6SB %B XB B HB B #B ŠB B GB B B o=B ^B MB =B ,>B rB BBBB+BABRB^BeBrhBaeBP^B?QB.@B*B BBBآBsB@BBBBqDB_BNB=UB+BB ;BBgB B B | B l?B \nB LB YB .hB rB wB vB qB eB UB ?B $B B B }B mB ]MB MB B -B +B B /B B B ʏB B `B B B wsB fB VB EXB 4B #B B BB pB B ϽB B B B B {&B j,B Y-B H*B 7!B &B B BBBЅBZB*BBBz}Bi9BWBFB5RB#BB@BBqBBBBBB CCB 3mB #B B B B B B B B B B B sB cB SB CdB 38B #B B B VB B B tB B B cB B oB _#B NB >4B -B 0B B B B B LB B B RB B vB f+B UiB DB 3B #B /B SB sB ߎB ΤB B B B B yB hB WB FB 5B $lB LB &BBBΘB_B!BBBxJBfBUBDHB2B!BBB:BBFBB?B dB TB EB 54B %JB [B fB lB mB hB ^B OB :B B B tB dB TB DLB 4B #B B DB B B FB B B B B 6B oB _?B NB >3B -B B yB B :B ڒB B 4B }B B B v9B enB TB CB 2B "B *B AB SB _B gB iB gB `B TB xBB g,B VB DB 3B "B tB @BBB̈BABBBOBuBdBS2BAB0\BB rBBvBBfB ^B vB fB VB FB 6B &B B B B B ְB ƗB xB UB ,B B uB eB URB EB 4B $xB $B B nB B ҢB 4B B IB B IB oB _5B NB > B -oB B 'B {B B B ZB B B B ;B ufB dB SB BB 1B B B B B B B B B B B vB evB TMB CB 1B B wB6BBۤBTBBBGBBs{BbBPB?&B-B*B BBB B B %B x9B hGB XPB HSB 8QB (IB B B B o_B ^B NB =RB ,B B B OB B دB B B B 1B EB sTB b^B QcB @cB /^B TB EB 1B B B B B B QB B rB aB PZB ?B -B mB BBUBBłBBB!BBnB\BKB9vB'B B 'B 8B CB IB IB EB {;B k+B [B JB :B *B B [B &B B ٫B fB B B vB B wB gWB VB F}B 6B %B B B B qB B DB B B YB B nB ^?B MB B -B B B B hB B FB 6B %\B B B KB B B B BB sB B }B lB \B KB :-B );B CB FB DB =B 1B B B B B ~B mB \RB KB 9B (B eB B B B )B B nB B B {1B iB XFB FB 5GB #B 4B BBuBB3BBqdBajBQkBAfB1[B!LB7BB B B ЫB {B EB B B B o9B ^B NB >8B -B qB B B B ۥB %B B B B B xUB gB WB FgB 5B %B IB B B B 0B \B B B B |B kB ZB JB 9 B ( B B B B B ҸB B uB LB B |B kB ZuB I4B 7B &B PB B B @B B sB B B B xB gB UB D B 2|B B NBB BeBȹBBBrBbBRBBB2B"BrBIB B B ѫB lB (B B B :B oB _B OB >B .CB B TB B QB B 8B B B lB B xB gqB VB FB 5GB $B B B B EB iB B B B B {B jB YB HB 7B &B B B fB BB B B B B GB {B iB XtB G$B 5B $uB B B JB B jB B wB B pB uB dWB RB A*B /B B CBBBBBB}BtkBdSBT5BDB3B#BBQB B B ҇B 9B B B /B B pbB _B OB ?B .B B ~B B ]B B (B B B 0B }B wB g B VGB EB 4B #B  B 0B OB iB ~B B B B B zB iB XB GnB 6UB %8B B B B B XB B B B LB xB gB VOB DB 3B "&B B GB B UB B PB B 7B B s B anB OB >%B ,zB B B.B(BB BBBuBeBUcBE2B4B$B|B4B B B >B B ~B B B 8B pB `CB OB ?:B .B B B B EB ۞B B AB B B B wGB f|B UB DB 3B #B 6B LB \B hB nB pB lB cB VB yCB h+B WB EB 4B #B hB 2B B ޷B rB )B B B .B vB enB TB BB 1)B B 8B B 3B ٪B B B B TB B p B ^aB LB :B )CBBBׯBǚBB_B9BBvBfBVlBF,B5B%BIBB B 6B B dB B |B B B pB `mB OB ?FB .B  B dB B B SB ʘB B B IB yB vB eB TB DB 3B "/B B B B #B {fB iB;B*BB BBpBBBBBBTB BxBhhBXBGB7LB&BtBB B B ԄB B lB B ?B B pB `SB OB >B .8B zB B B !B NB vB B B B B tB cB RB AB 0B B B B B ۋB fB =B B B B tdB c!B QB @B /;B B B (B B XB B tB B }B B orB ]B LTB :B )"B B B 4B B B B ]B B B\BLBB -B B )B RB vB ٕB ȮB B B B B sB bB QB @B /B B sB OB 'B B B B PB B B r{B a*B OB >yB -B B KB B hB B rB B iB B ~LB lB [B I{B 7B &.B B B B YB ͘B B B~BBn'B^BMB=B-BOB BBB@BBB B -3B XB xB B B طB B B B B B rB aB PB ?aB .>B B B B B BB B B oB B B poB _B MB B.BRBBBaBB̦B@BBeBBzsBiBYmBHB8QB'B BB B .B ~B B B MB B B oB _B N=B =^B ,yB B B B B ״B ưB B B B nB qQB `/B OB =B ,B sB 8B B B gB B B iB B B n>B \B K^B 9B (kB B cB B HB дB B {B B 0B xB fB UB C_B 1B B B AB mBBaB9B BBpB``BPB?B/B/BBvBBݨB9BBJBBFBzBj,BYBHB8^B'BB_B B B 2B mB B B B 'B oIB ^eB M|B BYBoB B B ѐB B B B uB |aB kHB Z*B IB 7B &B ~B FB B B ЀB 4B B B 2B yB hmB WB EB 4B "B (B B B ܐB B gB B *B B rB a+B OwB =B ,B =B uB B B B &B GB bB yBiBYBIJB9B(BqBBBgBBƚB+BB>BBt;BcBS"BBB1B!TBBBWBޢBB)BeBBByBiBX?BG[B6rB%BBB B B ЌB ~B kB SB 5B {B iB XB GB 6VB %B B B GB B ΢B GB B B B wB f8B TB CBB 1B 8B B B B B IB B B KB B oB ^!B L_B :B (B B %B JB kB χB B BhB{,BjBZBJWB:B)BQBBBBקB.BB.BBBtBcBSMBBB2B!SBBB)BeB͜BBB#BEByaBhyBWBFB5B$BBB B zB cB FB %B B B yB hkB W0B EB 4B #_B B B bB B ̟B 6B B VB B uaB cB RXB @B /B:B*vB B B"BB#BǜBB}BBIBtBcBSRBBB1B!+BiBBBB*BMBkBBBxBgBVBEB4B#BBvB ZB 9B B B B B IB x B fB U{B D,B 2B !B !B B VB B wB B B B |B rB a`B OB >1B ,B B FB B B .B qB B B B {OB izB WB EB 3B !B  B B "BμBwB.BBB}/BlB\jBKB;B+BB BB B{BBIBBBVBtBcBS2BBqB1B B B6B[BzB̓BBBBBwBfBUBDB3B"sBSB.B B B ̠B gB (B B B vMB dB SB BDB 0B {B B B &B ٫B *B B B B B p]B ^B MB ;rB )B B \B B B B OB B B B wB fB T*B B=B 0LB VB [BhBBB~B%BBbB}BmB]BLB<B+B B }BBNBخBB^BBB=Bt}BcBRBBB1GB lBBBBBBBBBBvBeBTBCqB2MB!$BB B B KB B B rB B B tlB c B QB @8B .B QB B WB B HB ŹB %B B B LB mB [B JFB 8B &B B NB B ߵB B B +B IB aB tuB bB PB >B ,BBBvBBB^BBBB~BnB]BMBB ,B B zB B YB B #B B B .B |}B jB Y B GLB 5B #B B B DB gB ʅB B B B B pB ^B LB3B#rBBB^BBыBBB%BBBnB]BMcBB6B *BBBBBBqB@B BrBaBPHB>B-BWB B B 9B B aB B uB B tB mB \_B JB 96B 'B B SB B B DB B B B ?B vqB dB RB @B / B %B :B KB VB ]B _B \B TB HBw"BfBVjBFB5B%-BB>BB8BҮBBBBLBBnB^IBMBHB-(BB BBuB;BBBoB!BBotB^BLB;LB)BlBB xB B pB B TB B $B zB hB W6B EB 3B "B ]B B B B 5B _B B B B oB ]B KB 9B 'B B B B B BB$BBPBxBhfBWBGfB6B&PBB$BBB9B‹BBB^BBnB^BM-BBB -B B B oB B +B B wB f!B TiB BB 0B #B WB B B B B B )B :B ~GB lOB ZRB HPB 6JB $?B /B B B8BBgBBBByBhBXoBGB7FB&BB^BBBFBˆBBB/B[BnB]BLB;B*BBBBBBBBBBzBoQB^$BLB;B*|B:BBBSBB B>BBlB|BkBZ BHB7B%{BBXB B B |B B &B tB B uB c?B QxB ?B -B B -B NB jB ԁB “B B B B zB hB VB DB 2vB \B >BBBB̞B$BBBBzBikBXBH/B7B&B*BsBBB-BaBBBB~BnB]#BL0B;9B*;B9B1B$BBBBBBhB6BmB\BKB::B(BBGBBB%BBJBB[BzBiWBWBF?B4B#BuB B *B }B B B XB B B rB `7B NcB BjBYBH0B6B%cBBBBߊBBBB`BBv,BdBRBA8B/BB B XB B B B 'B NB qB }B kB YB GB 5B #B B B B ۻB ɧB B rB PB )B nBcBRBBB1B!BBB]B޿BBtBBBYBzBiBYBH?B7kB&BBBBBBBBBB|BkBZBIB8vB'MBBBBqB,BBBABBzBi&BWBFPB4B#eBBfBBRBB*BBBGBsBaBP7B>}B,BB 1B cB B ӸB B B B &B z5B h@B VEB DFB 2AB 8B *B B B B B B oB ?BBtNBcBSGBBB2*B!BBVBBBPBBBBPBzBiBXBGB7B&,B>BKBRBTBPBGB9B%B B{BjBYBHsB7@B&BBB=BBϝBEBBBBxBg>BUBDJB2B!BBB&BBBUBBBVBBpB_)BMfB;B)BB&B IB hB ЂB B B B B vB dB RB @B .B sB WB 5B B B B BBBBtBdeBSBC4B2B!BBBBBB]BBBB BzDBiaBXzBGB6B%BBBBB{BcBFB#BBzBiBXcBG&B5B$BPBBBJBBBBB-BvBe1BSBB B0BB `BBBsBBBXBBBnB\BBJpB8B&BBB B B 'B -B /B +B #B sB aB NB B.BcB BBbBڬBB0BjBBBuBeBT7BCOB2bB!pBxB{BxBpBcBPB8BBBvBeBTnBC6B1B BmBBBtBBBLBBlBrBaxBOB>oB,BQB BB}BB,B{BB B|KBjBXBFB5B#ABcBBB۪BɸBBBBBoB]BKB9tB'VB2B B B ުB sB 7B B B eB qBpB`WBOB?B.lBB BNBBBB.BXB}BBuBdBSBBB1B BBBBܨBˋBiBBBBBuBdoBS-BAB0BGB BB2BB^BBvBBxBpB_gBMB<@B*BB_BBBPBBBBIBy{BgBUBCB2B (B;BIBSBWBWBQBGB7B~#Bl BYBGB5B#sBAB B B ڎB IB B B \BBBqqB`BPB?hB.BB ,BcBBڿBBB B6BEBuPBdUBSUBBOB1CB 3BBBBۺBʎB]B&BBBtcBcBQB@pB/BB MBBqBBƀBBzBB_BnB]/BKB9B(ABBB%BfBϣBB B:BbBvBdBRB@B.BB BBBBBBBBzcBh;BVBCB1BlB +B B B NB B BrBB*B~BqBaBPWB?B.BB +BRBsBڏBɦBBBBBtBcBRBAB0{B[B6B BBڦBkB+BBBJBrBaBP:B>B-jBB B BBB|BBYBB~ Bl|BZBI%B7qB%BB8BpBޣBBBBB5B&BtBbBQB@B/B]B (BBBkB!BB}B#BBq`B_BNB=B+BBB BBBRBBBhB{BjBXPBFB4B# B>BlBBۺBBBBB$Bp)B^+BL'B:B(BBBBߦBBTB#BBBrtB`/BMB;B)EBBB 0BBNB֟BB/BoBBBr Ba6BPZB?xB.BB BBBٻBȳBBBzB]Bs9BbBPB?B.wB8B BB^B BƱBSBBBBoB^,BLB;+B)BBBBMBѪBBVBBBy0BgoBUBCB2 B 6B[B{BBثBƼBBBB~BlBZBHB6B$pBOB(BBBɘB^BBBBnDB[BIB7?B$BwBB BZBBBBSBBBBqBa BP"B?1B.:B?B =B6B*BBBBBBmBr;BaBOB>B-;BB BCBBփBBBB-BB BBoBNB(BBBBWBqB_BNB=1B+B}B BBHBB`BBbBB}OBkBZ'BHB6B%EBBB3BxB̸BB(BYBBsBaBOB=B,BB%B(B%BBBBBBwBeBS^BA/B.BB B@BBӫBZBBBGBwBewBS B]HBLB;B+BKB ~BBBBB(B:BFBLBqMB`HBO>B>.B-BB BBB^B(BBBgBBoB^tBMB;B*RBBvBBBB~BBbBB{2BiBWBFAB4B"B"BcBBBB2BYB{BBpB^BLB:B(BBBBBΟBBdB?BBsBaBOzB=BBBUB̨BB=BBBsBb)BPWB>B,BBBBB BBB BBxBfBTBBB0BXB *BBBՄBCBBBaBz BgBUSBBB0BB B/BB1BjBӢBBB(BJBfBn|B]BLB;B*BBB|BfBJB)BBBBnBn2B\BKB:\B) BBUBBBBB3BB4BzBiBWBEB4XB"BBbBBBB,BBOBBB~B.BBB!BuBcUBPB>uB+BBB|B5BiBBBBBB)B5BnBBaBBnBBeBBGBxBgBUsBCB2!B oBBBBsBBBBB0BFB}XBkdBYjBGlB5iB#`BSB@B(B BBBBfB0BmB[BIpB7&B$BB*BBiBBB$BB2BlBZ-BGB5BIB8B(B>BXBlB{BӅBˆBBBqB~_BmFB\)BKB9B(B{BABBBuB%BBwBB{BjHBXBGdB5B$jBBZBB5B̛BBVBBBtGBbBPB? B-?BpB BBBBB)B5B=Bz?BhBBBۇBBJB B%B9BGBOB|RBkOBZGBI9B8&B' BBBBpBB֙BBBB BB BB{BjBYBHB7B&fB7BBBBGBBBYBByBh:BVBE_B3B"nBBhBBLBʶBBzBB(BrwB`BOB=EB+BBB B2BRBlBBBBxBfBTBBB0BqB WB9BBBÿBBTBBzBhBVABCB1B>B ByBB՟B+BB4BBy)BfBT BAsB.B7B BBBBBBBBBBB{zBjXBY0BHB6B%B[BBBB-BBtBBBx7BfBUHBCB2DB B*BBBZBȵB B[BBBp+B^fBLB:B(BBBBB}BBjBWBz*Bi.BX,BG$B6B%BBBBBPBBBB[ByBgBViBEB3B"FBBhBBtBBkBBLBBsBatBOB>B,lBBB4BlBӟBBBB4BzLBh_BVmBDuB2xB vBoBbBQB:BBBBB}zBkDBY BFB4B":BBB=BB{BBB2B|Bj>BWBE6B2B B BBKBզBBOBBBx(¡8¡$¡       $ q9 ]P Ik 5 !  ŸŸ!ŸOŸŸŸŸ'ŸoeŸ[ŸGŸ43Ÿ ~Ÿ žžržž%žžžIžož\žHž4ž!qž eesr ^KN7$+œœzœ&œœœ>œœvœcsœP7œ<œ)œœc›6› ›››››}o›jZ›WG›D8›1,›$› ššš"š*š5¡/¡¡       { h T @3 ,N l ŸŸŸŸ5ŸgŸŸyŸfŸRNŸ>Ÿ*ŸŸižž ž_žžžržyžf9žRž?ž+}žžeZ\k{hUA.Jœ)œœzœ'œœœAœlœYœFyœ3=œ œ ››m›B›››››s›`›Mk›:Z›'L›A›9š5š4š6š;šD¡&¡   ֦ ¥    r ^ J 6 # +ŸKŸmŸӒŸŸŸŸHŸp~Ÿ\ŸHŸ51Ÿ!tŸ žžOžҞžžGžžžp\ž\žI$ž5ž!žjTJNr^^K|8$@œœœ#œœuœ"œœvœc?œOœ<œ)zœ?œ››ܡ›s›H› ››|›i›V›C›0x›h› ZšPšJšFšFšJšP¡¡    } y y { } i U A -  ŸŸ#ŸFŸlŸŸŸzŸg$ŸSZŸ?Ÿ+ŸŸSžžž/žžž)žzžfžS@ž?ž, žtžR=5|:hULA.kœ2œœrœœœjœœlœYœF9œ2œœ v›<››››s›I›#›r›_›L›9›&››qšdš[šVšTšTšY¡¡x h [ Q J G G tJ `P LZ 8g $v ŸŸŸŸŸŸ@ŸjŸqŸ]ŸIŸ61Ÿ"kŸžž,žsžž ž\žžqž]ažIž6 ž"žV5"r_"K85$Vœœœ œÿœaœœœv\œc œOœ / "    k W C /$ 1 AŸUŸlŸˆŸŸŸŸ|Ÿh9ŸTgŸ@Ÿ,ŸŸ>ž{žݼžžHžžž{2žgžSž@:ž,žž_3ʡ|}hU~B.œ<œœkœœœKœœlœYHœEœ2œcœ ›››`›(››››rf›_?›L›8›%›šššكšuškšdšašz`¡@ '      u a M 9 % ŸŸŸŸ3ŸNŸlŸŸrŸ^ŸKŸ72Ÿ#cŸžž žIžžžždžqž^žJZž6ž#žm5Ԟ zbr_XK8[$kœœœœóœNœœœv0œbœOœ<0œ(œœM› ››ȉ›N›››{›h›UY›B2›/››šššύš}šqšhšbšp_        l X D 0  ŸŸŸŸŸŸŸ}.ŸiPŸUuŸAŸ-ŸŸ)ž_žޗžžžTžž{žh/žT~ž@ž-'žž<ޟpM|i7UB..3œEœœdœœœ+œœlkœYœEœ2dœœ ›z›3›››q›7››q›^›Kp›8G›%!›šššتšŔššsšhšy_šf[   Ǯ   o wa cV OM ;I 'G IŸNŸVŸbŸqŸŸŸŸsŸ_ŸLŸ83Ÿ$\Ÿžžž žYžžžžr^ž^žJž7Ež#žIj<s_L8$œœœœèœ:œœgœvœbœOEœ;œ(œAœ››Z››››T›{›g›T›A›.X›0› šššΰšššršešoZš\S  ҕ w \ D 0 n Z F 1   ŸŸŸ ŸŸ&Ÿ8Ÿ~NŸjgŸVŸBŸ.ŸŸžBžrž˦žžžSž|žhžUžAhž-žž[ k0}irUBY.MœNœœ\œœxœ œœl:œXœEwœ2œœ k›››}›5›››n›q3›]›J›7›$g›<ššššIJšššnšx^šeQšRH ݂ ^ =    x d P < (  ŸŸةŸįŸŸŸŸtŸ`ŸMŸ95Ÿ%VŸyžžžž(ž\žžžs ž_LžKž7ž$#žqp*sZ_L58%œœœœÜœ&œœCœuœbnœOœ;œ(Gœœ›>››Ǟ›R› ››z›gG›T ›@›-›r›Ešššššš|šfšnTš[EšH9 K $    o [ G~ 3n a  WŸQŸNŸNŸQŸXŸbŸoŸkŸWŸCŸ/ŸŸž'žNžyžžž ž}EžižUžBž.Ežž(z)}GiVB.fœWœœUœœ`œœyœl œXœE6œ1œpœ ››`› ››m›#››p›]X›J›6›#›yšJššššššsšw[šdGšQ5š>'     z| f` RF >0 *   ŸŸŸŸŸŸŸvŸbŸN$Ÿ:8Ÿ&PŸkžžžžž#žQžžsž_žL-ž8lž$ž=,9s_Ld8%;œ œœœÑœœœœuœb9œNœ;aœ'œœ5››~›'›››8›y›f›Sf›@'›,››}šLššššššgšmMšZ6šG"š4   | V q3 ] H 4    ŸŸŸГŸŸŸŸŸlŸXŸDŸ0ŸŸž ž+žMžsžžž}žj)žV_žBž.žžX50}iVIB/œ`œœNœœHœœPœkœXeœDœ1œœ ›U››Й›@›››I›o›\›Ip›6/›"›š~šJšššššxšvXšc;šP"š= š)  a 5 |  g S ? + q \ŸJŸ<Ÿ0Ÿ(Ÿ#Ÿ"Ÿw#Ÿc(ŸO1Ÿ;=Ÿ'KŸ^žsžžרžžžž:žtgž`žLž9ž%:žxCŽ-s`4L8%Zœ.œœœÅœœ{œœu~œbœNœ;œ'œ@œ›q››Ʊ›U›››yW›f ›R›?w›,3››š|šEšššššgšlEšY&šF š2š L   r ^ Jr 6P "2 ŸŸŸŸŸŸŸŸmŸYŸEŸ1ŸŸ žž ž"ž?ž_žž~žjžWžC1ž/ežžV̛.}}j$V}B/8œiœœFœœ0œœ'œkœX,œDœ1>œœ ^›››&››g› ››ob›\›H›5{›"5›ššvš=šššš|šuSšb/šOš;š(š   } ip UD A ,  ŸŸ܆ŸrŸaŸTŸIŸxCŸd?ŸP>Ÿ›+{›3›ššmš2šššš~gšk<šXšDš1šš    tM ` K 7 # xŸWŸ:ŸŸ ŸŸŸŸnŸZŸFŸ2ŸŸ žžžž ž#ž>ž\žk~žWžCž/ž%žWA~j`VC/Zœsœœ?œœœœ~œkwœWœDrœ0œzœ ›› ›ϳ›J›››"›n›[m›H›4›!x›-ššš`š#ššš~štNša"šMš:š'ššu k 0 j V B .g = ŸŸŸɵŸŸŸrŸycŸeVŸQMŸ=GŸ)EŸFŸJžQž\žjž|žžžužažNž:+ž&SžQtY`L9B%œIœœ œnœœBœœu$œaœNœ:œ'œœ››1››V›››x'›d›Qn›>›*›r›$ššݓšPšššš}ešj3šWšCš0šš j™L  u a Mk 98 % ŸŸŸgŸHŸ+ŸŸŸoŸ[ŸGŸ3ŸŸ žžžžžžžžl)žXEžDdž0žž4h~WjVC./}$œ|œœ7œœœiœ~œkFœWœD0œ0œ'œ ›-››?››`›››n)›Z›Gk›4› › hšššӂš=ššššsHš`šLš9š&šcš?™  l XG D /  uŸHŸŸŸŸŸŸzŸfnŸR]Ÿ>NŸ*CŸ;Ÿ6ž5ž7ž=žEžRžažvtžbžNž:ž&ž+U׃ô [t`M 9i%œVœœœbœœ&œœtœadœMœ:Iœ&œ<››<››J››f››w›d(›P›=e›* ››Zššܹšnš&ššš|cši(šUšBš/šaš 8™™ wl c) N : &t >Ÿ ŸŸձŸŸcŸAŸ"ŸqŸ\ŸHŸ4Ÿ Ÿ žžžХžžžžžlžXžDž1ž7ž X|.d~jWCZ/5œœœ0œœœHœ~œkœWœCœ0`œœ M››I››R››h››m›Z#›F›3\›› šJššҤšVš šššrBš_šKš8š%cš4™ ™™ػ n Y E 1I   ŸŸmŸ?ŸŸŸŸ{ŸgŸSmŸ?VŸ+AŸ1Ÿ$žžžžžžžw$žc2žOCž;Wž'nžBqtaMP9%œdœœœWœœ œhœtœa.œMœ:œ&rœ›[››R››V››g›v›c›P›<›)O››š6ššȋš;ššš{_šhšTšAš.jš5š™™™΄ d Pi <$ ' ŸhŸ0ŸŸŸŸqŸIŸr%Ÿ^ŸIŸ5Ÿ!Ÿ žžž}žwžtžužyžmžYžEž1žž 6[~kWKC/Gœœœ(œzœœ'œ~œjœWEœCœ0œœ›f››W››V››c›l›Y}›F›2›?› š{šššoššššq:š]šJš7vš$;š™™™s™J [P G 2 w  6ŸŸŸͅŸQŸ ŸŸ|ŸhŸT~Ÿ@^Ÿ,AŸ'ŸžžžžžžžwžcžOž;ž'žž$=ZzuaKM9%0œqœœœKœœœBœtœ`œMYœ9œ&#œ››m››Y››S››v[›b›Oq›<›(›+›šbššǨšOšššz[šgšSš@š-Fš š™™g™7™  Q = )Q   ŸŸFŸ ŸŸŸqŸsDŸ_ŸJŸ6Ÿ"Ÿž}žhžVžGž;ž3ž/žn-žZ0žF5ž2>žJž ZmΝ&kQWC/Yœœœ!œjœœœ~ZœjœW œCiœ/œ.œ››p››X››M››lP›X›Ea›1›› ššFššš,šššp1š\šIš6Uš#š™™_™*™™ H 40   ŸQŸ ŸŸŸVŸŸ}ŸiŸUŸAgŸ-BŸŸžžžȸžžžžxždžPž<ž(žž7u\aM9&Fœœœœ?œœœœtnœ`œMœ9uœ%œ6›››q››S››D›u›bB›N›;N›'›g›šš'ššcšššyVšfšRš?iš, šš™\™!™™™ ? * q $ŸŸٓŸPŸŸŸŸtdŸ`2ŸLŸ7Ÿ#ŸžhžIž/žžžžžnžZžFž2žž 1MlkWC08kœœœœZœœœ~1œjœVœC&œ/œœ:›››m››K››7›k›X0›D›17›› Lššnššš;šššo(š[šHš53š!š™]™™™™p™> 5 !O  ŸŸ_ŸŸŸŸMŸŸjŸVŸBqŸ.CŸŸžžݫžɍžsž\žIžy9že,žQ#ž=ž)žž'2AShuaM:&/\œœœœ3œqœœœt@œ`œLœ9.œ%œ›;›››g››@››u&›a›N›:›'››-ššJššvšššxPšdšQš>Jš*ššc™™™ʛ™_™'™ ,3  Ÿ0ŸŸƔŸKŸŸŸuŸaJŸMŸ8Ÿ$Ÿ~žTž,ž žžžžžož[zžGnž3ež`ž ^`emykWD0,S}œœœœJœœœ~œjMœVœBœ/3œœ›9›››]››1›~›k›W›D›0›› š šš#ššJšš~šnšZšGfš4š š n™"™™Ӕ™S™™™ " `ŸŸŸ_ŸŸŸ|Ÿ7ŸkŸWŸC}Ÿ/EŸŸžžމžcž@ž!žžyžežQž=ž)žžٟťuaN:-&Nsœœœœ'œ]œœœtœ`VœLœ8œ%5œ››3›֎››O›››t›`›Mo›9›&`›š_ššmšššššwJšcšPš=+š)š}š,™™ܒ™K™™™™|P C ŸŸ/ŸŸŸ:ŸŸvŸbcŸN"Ÿ9Ÿ%Ÿsž@žžžžžržSžp8ž\žH ž3žž lXD40Omœœœ œ:œmœœ}œjœV[œBœ.œ3œ››)›̂››>››~›js›V›CQ›/›>›š9ššAššWšš{šmšYšFKš2šš :™™™H™™™v™6™q ŸdŸŸҪŸRŸŸŸ^ŸmŸXŸDŸ0HŸ Ÿžžiž:žžžžzžfžRež>Nž*:ž)ž   v b.N@:U&mœœœœœHœyœœsœ`œL^œ8œ$œ-›y›››s››*››s›`W›L›91›%›ššš׎ššš#ššvBšbšOoš< š(šLš™™I™™™e™!™z™g FŸŸŸ!ŸŸoŸŸwŸc}ŸO3Ÿ:Ÿ&Ÿiž-žžտžž^ž3ž žpž\žHž4ž wž dTH?978=lEXQD`0rœœœœ)œTœœ}œiœV!œB\œ.œœ%›n›߻› ›`›››}q›i›V8›B›/ ›|›šfšš^ššcššwšlšXšE.š1šdš ™™P™™™Z™™™p™]DŸŸZŸŸŸ7ŸŸŸn3ŸYŸEŸ1LŸŸžžIžžžž}ž{Sžg+žSž>ž*žžznfa`vbbgNp:}&œœœœœ4œ\œœsœ_œLœ8Xœ$œ››_›ժ››I›››sS›_›L›8{›$›Ršš7š֯š*šš+ššu:šašNVš:š'šš™[™™ƨ™T™™™yl™f&™RŸ;ŸŸiŸŸŸGŸxŸdŸPEŸ;Ÿ'Ÿažžž֛ž`ž)žžžqž]mžIFž5#ž!ž ШlXD0œœœœœ;œ`œ}œiœUœBœ.Oœœ››M›˕››0››|›i2›U›A›.S››%šššzššošš~ršjšWšDš0š6š ™j™ ™Ϭ™R™™™Y™o ™[™HŸŸCŸŸrŸŸŸoRŸZŸFŸ2QŸŸ žož*žžžqž:ž|žgžSž?ž+\ž:žvbN:&œœœœœœ?œbœsœ_œKœ8œ$Dœ{›››7›}›››c›r›_ ›Kg›7›$'›šš`ššBšš2ššt0š`šM<š9š&Vš™~™™ش™U™™™J™w™d™Q_™>Ÿ#Ÿ˲ŸEŸŸuŸzŸeŸQXŸ<Ÿ(ŸXŸ žžxž4žžž}žrGž^žIž5ž!ž lJ,lXD0œœœœ œ"œ?œ}_œiœUœAœ.œ5œj››››a›››|?›h›T›A=›-››Yšš)š˖ššzšš}lšišVmšBš/{šš™+™™\™™™@™™m™ZD™F™3Ÿ֑ŸŸŸBŸŸpsŸ\ŸGŸ3WŸŸ žZž žž|ž9žž|žhžTNž@ž+žžvV9vbN:&œœœœœ œ!œ<œsYœ_zœKœ7œ#œ"›U››››B›››r›^g›J›7›#h›š$šššYšš8ššs&š_šL!š8š%+š™B™™h™™™;™™v™c-™O™<™)?ŸŸŸŸŸ{9ŸfŸRkŸ> Ÿ)ŸQŸžžVž žžzž7žrž^žJž6Ož"ž |\?&lXD0œœœœœ œœ}5œiPœUnœAœ-œœ ›<›p›ʧ›››a›{›g›T:›@›,›3›ššLšʱšššš|fšhšUUšAš.Sšš_™™y™ ™™:™™w™l™X™Em™2™ŸdŸŸvŸŸqŸ]*ŸHŸ4^ŸŸ žEžžΜžLžžž}rži0žTž@ž,žKžǞ|\Aw(cO:&œœœœœœœœs*œ_CœK_œ7~œ#œ›› ›Q››››8›qz›]›J ›6W›"›šSšš šošš>ššrš^šKš7š#š™™™™ª™>™™o™u ™a™NS™:™'™WŸŸMŸŸ|`ŸgŸSŸ?Ÿ*ŸKŸžž4žžž=žžsž_ežK$ž6ž"žuBvXm=Y&E1œœœœœœœ} œiœU3œALœ-iœœ›››/›a›››{ ›gL›S›?›,!›o›ššnšš*ššš{^šgšT=š@š-*šš&™™/™˹™F™™l™~™j™W?™C™0™1™ Ÿ*ŸŸ0ŸrŸ^DŸIŸ5eŸ Ÿ ž2žžvžžžwž~)žižUžASž-žžf3wkcNO4;' œœœœœœœœrœ_ œKœ76œ#Pœn›››› ›9›k››p›]›I[›5›!›3ššš+šššBššqš]zšIš6[š"šK™™H™™T™™m™™s™`.™L™9l™&™˜bŸŸŸ}Ÿi ŸTŸ@"Ÿ+ŸEŸžvžžŵžYžžžt\ž`žKž7~ž#;žQm{Y[E>1%œœœœœœœ|œhœTœAœ-œ4œO›n›ݐ›ɶ›› ›=›zq›f›R›?"›+d››š@šܐšš;šššzVšfšS$š?š,štš™f™™f™™t™™|™i#™U™BU™.™™9˜ŸŸ]ŸsŸ__ŸJŸ6nŸ!Ÿ žžžQžžž7ž~žjžV;žAž-ž`žܣk6wcOe;F'*œœœœœœœœrœ^œJœ6œ"œ›-›I›i›››› ›p=›\r›H›4›!&› išššHšššFššpš\ešHš55š!š™™™|™™™™™r™^™KB™7™$v™˜˜^Ÿ8Ÿ~Ÿj-ŸUŸA0Ÿ,Ÿ@Ÿž_žžƌž'žžižuž`žLež8ž#ž<ҼJmYEk1I+ œœœœœœœ|œhœTœ@œ,œœ›› ›>›^›››y›f›R8›>n›*››%šiš۱ššKšššyMšešR š>nš*šAš™"™ܘ™™™™™{™g™T4™@™-\™™˜3˜ŸŸuŸ`zŸKŸ7wŸ"Ÿž žž-žž[žžžk:žVžBž.9žžW[$wcO;n'J(œ œœœœœœœrœ^œJœ6œ"œ›››››-›O›u›o›[›G›4-› e› šššdšššIššnš[NšGš4š sš ™H™™,™™™™™p™]+™I™6G™"™r˜ ˜˜LŸŸkNŸVŸB>Ÿ-Ÿ=ŸžIžžcžžž%žužacžMž8ž$Yžn'g.mYE1nF "œœœœœœœ|œhœT~œ@~œ,œœ››ܰ›››››y;›ea›Q›=›)››VššššZšššxCšdšPš=Kš)š šs™™K™Ǽ™0™™%™y™f'™R™?7™+™V™˜˜˜ʾŸv'ŸaŸM Ÿ8Ÿ#Ÿzžžž žž&žžOžkžWžC(ž.žuž!݂9px5cO;'i?œœœœºœœœ|œrnœ^dœJ]œ6Zœ"Zœ^›e›p››››››n›[!›GH›3s›› š šCšЀšššKššmšZ7šFš2šCš ™™o™™H™™0™™o'™[™H+™4™!>™ ˜_˜˜ӏ˜,ŸloŸWŸCNŸ.Ÿ:Ÿž4žܶž<žžRžžvvžb žMž9Gž$ž7ӓGvn8YE1b 5œ œœœœœsœ|_œhOœTBœ@8œ,3œ0œ2›7›?›K›[›n››x›d›P›=›)+›W›ššš+šišššw8šcšOš<'š(}šš6™™™e™™A™™x,™d™Q%™=™*,™™A˜˜e˜˜ŸbŸNŸ9Ÿ$Ÿsžžhžžjžž{žžlžX.žCž/bžžJɠQxyd8O;'Vœ'œœœ®œœoœUœr>œ^,œJœ6œ"œ››› ›› ›1›E›n]›Zx›F›2›› š6šfšϚšššLššlšYšElš1šš i™™$™χ™™W™™5™m™Z"™F™3™™ '˜˜?˜˜e˜ŸXŸD^Ÿ/Ÿ8Ÿžžݘžžžžžw+žbžNKž9ž%yžYX nwZ3E1} Hœœœ̼œœqœQœ|4œhœTœ?œ+œœ›››››››x›d›P0›qWydP^<'œDœœœ•œbœ3œœqœ]œIœ5|œ!bœ K›9›*››››››m›Y#›E1›1B›W› oššššššLš~~šjšVšC(š/hšš™=™™™3™™™~I™j™W™C™/™a™˜P˜˜N˜˜[˜˜vŸ1Ÿ6Ÿžž_žž8žžžxždžOž;ž&ž%DrPnZFO2 mœ)œœ̬œsœ=œ œ{œgœSœ?gœ+Gœ*œ›››››››v›b›N›:›&›šš-šJškšššštš`CšLzš8š$š2™w™™ ™Z™™™^™s™`™L™8™%X™˜<˜˜.˜í˜/˜˜>˜uŸ( Ÿcžž žՄžžVžž7žnžZ&žEž1"žž.GoyEdP<;'œRœ œœ‰œMœœœqœ]œIWœ51œ!œ ›››Ч››››z›lw›Xx›D}›0››ššššš%šKš}tšišUšBš.;šwš™™=™ˇ™™$™y™|™i,™U™A™.T™™,˜˜˜̋˜˜˜ ˜~˜kŸ7Ÿ žžDž˥ž žržžyMždžP6ž;ž'-ž3Fio7ZF}2% œ3œœ̤œbœ$œœ{œg~œSMœ?!œ*œœ››x›a›M›>›1›v)›b$›N#›:%›&+›4šAšRšfš~ššššsš_,šKZš7š#š™5™u™Ը™™I™™™r?™^™J™7V™#™!˜˜˜n˜˜^˜˜]˜s˜`jŸ`žž žežž$žžžo_žZžFBž1ž4ž4߹B_ye%Pœ*œzœO›(››››››u›a|›Mr›9l›%i›jšnšvšՂšššššqš^šJ9š6bš"š™™)™d™™™*™t™p™]™If™5™"™y˜˜B˜ӭ˜˜˜˜z˜q˜^v˜JŸžžFž›žžOžžpž[xžFž2Qžž 7,ˬ/Aye`P<(+œoœœœpœ"œœœqNœ]œHœ4œ gœ 6› ››Ϲ››x›]›E›k1›W!›C›/ ››šš šš!š2šFš{]šgyšSš?š+š š8™i™ܞ™™™R™™y™f'™Ru™>™+™v™˜4˜ܘ˜˜k˜˜M˜z˜g>˜S˜@=žžž_žžž_žzžfžQž<ž(Rž3" ,o[FF2o  œGœœ̔œ@œœœ{ZœgœRœ>œ*Yœ!œ››ْ›i›D›#››t›`›L›8›$›šššԝšššššpš\šIš58š![š ™™™™E™~™™™oA™[™G™4%™ x™ ˜*˜˜˜O˜˜%˜˜p ˜\˜H˜5|žž(žtžžžkžpž\#žGž2žQž , zeQ)<(Lœ~œœ־œdœ œœjœqœ\œHœ4Pœ œ ››p›A››››~›j›Vt›B_›.M›>›4š-š*š*š.š6šBšzQšfcšRzš>š*šš™ ™L™|™™™"™x`™d™P™=2™)™™$˜}˜˜8˜˜˜l˜x˜eL˜Q˜>;˜*žž<žžž!ž{tžfžR&ž=ž(žK!֑|vo[~G2% œQœœ̌œ/œœœ{-œfœRœ>Lœ* œœ›S›››››n›tK›`,›L›7›#›šššӷšššššoš[šGš4 š 'š F™h™™и™™™L™™m™Z™FC™2™™ $˜v˜˜%˜˜˜H˜˜n˜Z˜F˜3u˜ž žMžžž)žqyž\žH%ž3žž BezYeQ\<(lœœ!œֺœWœœœBœpœ\œHNœ4œœ {›<››››d›7›~›i›U›A›-›w›cšTšHš?š;š:š<šyCšeMšQZš=lš)šš™™™!™L™z™™v™c™OZ™;™'™(™t˜˜˜n˜˜'˜˜v˜cY˜O˜<7˜(˜#žžZžžž|-žg{žRž>!ž)zžž5jJp9[G62A œ\œœ̄œœœ\œ{œfœRVœ>œ)œoœ*››ت›p›9›››s›_›K^›7=›# ›ššššššššnšZšFš2šš ™"™@™a™™™™ ™l>™Xu™D™0™1™ w˜˜˜_˜˜ ˜h˜˜l+˜X˜D˜1l˜˜ Tž'ždžžžr.ž]yžHž4žož %Q,zfQ= (œœ'œַœJœœ|œœpœ\bœH œ3œiœ ›››P››››}r›iC›U›@›,››šzšešTšGš=š7šx4šd6šP;šž*žažo5 pz[Ge2^ œfœœ|œ œœ9œzœftœRœ=œ)hœœ›}›6›››w›>›s ›^›J›6›"[›9ššššššššmšYšEš1šš ™™™™$™D™h™~™j™V™C™/R™™˜ ˜O˜̗˜˜4˜˜}˜j:˜V˜B˜/a˜˜9—ž5žlžžrž^%žIjž4žž OU{zfQQ=7(*œœ-œֳœ>œœ]œœpœ\(œGœ3lœœ ›n›!›››O››|›h›Tj›@:›,››ššہšgšQš?š0šw%šcšOš;š'š%™0™>™Q™g™™™™s™` ™L9™8i™$™˜˜N˜Ր˜˜!˜n˜˜s˜_m˜K˜8*˜$˜—`—ž7žjž}žhžTž?]ž*žž97Up\%G3z œpœœtœœœœzœf>œQœ=vœ)œœe›››u›,›››rh›^.›I›5›!› kšDš ššššššlšXšDš0šš™™™̮™™™™}™i5™U[™A™-™™˜R˜ގ˜˜˜Z˜˜{˜hF˜T˜@˜-U˜˜——ž5žežsž^žJ ž5Mž ž  nn{+fQ=a(Bœœ2œְœ1œœ>œœpZœ[œGœ3 œœ a›››^›››|›|8›g›S›?›+M››ššڝšzš[š@š(švšbšMš9š%š™™™™™™.™G™rc™^™J™6™"™(˜Z˜˜˜˜J˜˜˜q$˜]u˜I˜6 ˜"|˜—>——ž/ž~]žižTž?ž+8žyžOÝFp\^G3+ œzœœlœœlœœz|œf œQœ=.œ(œbœ››L›››W› ›q›]›ID›5› › šlš?šššššškšWnšC_š/TšMšH™H™L™S™^™m™™{™g™S™?™,™;™h˜˜˜˜?˜~˜˜z˜fQ˜R˜>˜+F˜˜—]——)ž%žtPž_žJž5ž! ž ^+w{qfR*=(Zœœ8œ֬œ$œœœœp)œ[œGAœ2œiœ ››?›››7››{›gP›S ›>›*›P›ššٸšŌšdš@š šuš`šLš8š$š™™™ԣ™™™™™p™\™I™51™!T™ z˜˜˜˜8˜q˜˜˜o2˜[z˜G˜4˜ h˜ ——x——?žžj@žUlž@ž+žž@~ؿNq?\G3Q œœœdœœRœœzOœeœQZœ<œ(uœ››8››x›››s›q#›\›H›4K› › šš^š,šššš~šjkšVOšB7š.#šš™™™™™™ ™z™f(™R<™>U™*q™™˜˜˜7˜j˜˜˜x˜dZ˜P˜<˜)6˜˜—3—ڏ——Ržuž`-žKVž6ž!ž YΗ j{g R^=)rœœ>œ֨œœœœzœoœ[yœFœ2œœ ›7››i›››Q›z›f›R[›>›)››Fš ššĝšmš?ššsš_šKš7š#šm™^™R™K™G™G™J™Q™o\™[k™G}™3™™ ˜˜˜;˜g˜˜˜˜m?˜Y˜E˜2 ˜S˜ ——I—ϣ——ažjžVžA<ž,ežž0l6q\H!3w .œœœ[œœ7œœz!œeœQœ<œ(#œ›:››`›››5››p›\+›G›3›C› šš|šAš ššš}|šiTšU/šAš,šš™™ܣ™ș™™™™x™d™P™<™(™™˜ ˜C˜i˜˜˜˜v)˜bb˜N˜:˜'$˜m———\—ij——mž`žKž7ž"Dž o=z{gFR=)4œœCœ֥œ œtœœQœoœ[>œFœ29œœ C››\›››››z\›f›Q›=V›)››qš,ššíštš>š šrš^šJš6iš"Iš.™™™™™™™™m™Y™E™1™™ ˜3˜P˜p˜˜˜˜˜kJ˜W˜C˜/˜<˜———j———tžVžAž,ž žGr١ Dq]HQ3 AœœœSœœœœyœefœPœ›o›[~›G$›2›{› ,šššVšššš|lšh;šTš?š+šš™d™N™:™+™ ™™w™c™O™;™'*™9˜K˜b˜|˜Ú˜˜˜ ˜t7˜`h˜L˜8˜%˜P———&—u———xžLž7ž"ž Dp |EgR> )VœœIœ֡œœ]œœ)œoœ[œFuœ1œfœ›e››s›››%›y›eX›P›<›(B›ššMšš½šzš<ššqš]šIfš5:š!š ™™™Ж™™o™a™W™lP™XM™DO™0T™\™h˜y˜˜̤˜˜˜˜})˜iS˜U˜A˜-˜#˜`———/—|—— —|xžB}ž-žž<ir]AH3  UœœœKœœœbœyœe/œPœ< œ'œ›q››s›››››o8›Z›Fn›2›› Zšššiš ššš{\šg"šRš>š*š`š9™™™™™™™u™a™M™9™%™˜˜˜մ˜˜˜˜˜rC˜^l˜J˜6˜"˜2—m———5————qtž8Vž#jž.[|gR>7)wœNœ֝œœGœœœobœZœF0œ1œœ››x››{›››y›d›PE›;›'}›ššnšššš8ššpš\wšH?š4 šš ™™\™:™™™™~™j™V™B™.™™˜˜˜˜˜˜˜{9˜gZ˜S˜?˜+˜˜=—v—ܲ——6—~——z—flž.,ž<žQiڅŤrH]zH3' iœœœBœœœ>œyœdœP\œ;œ',œ› ›››y››~››n›Z#›E›1N››š+šš|š*šššzKšfšQš=š)Vš#š™™؞™z™Y™<™"™t ™_™K™7™#™˜˜˜˜˜˜˜3˜pN˜\n˜H˜4˜ ˜ —E—{—ѵ——4—z——o—[až#ž 2Kh|hS/>b)œTœ֚œœ1œœœo/œZœEœ1Pœœ#›››{››t››x|›d›O›;$›&›Qššš1ššš4ššoš[XšGš2šš i™6™™™™™r™}W™i?™U+™A™-™™˜˜˜˜˜˜1˜yG˜e`˜Q}˜=˜)˜˜—H—|—ƴ——/—r—w—d—PRžž 'Efr]H4E |œœœ:œœœœylœdœPœ;yœ&œ?›››Ԅ››p››j›m›Yt›D›0››šOššʎš3šššy9šdšPšSd>)!œZœ֗œœœbœœnœZPœEœ1œ`œ›(›ޒ››p››^›w›c[›N›:g›%›šššGššš/ššnšZ8šEš1šdš %™™™~™N™"™™{™g™S™?~™+h™W™I˜?˜9˜7˜8˜>˜F˜wS˜cd˜Oy˜;˜'˜———D—s————uV—a—M—:(ž\ajwr]I47b œœœ2œoœœœy>œdœOœ;/œ&œ›B›› ›v››W››mG›X›DF›/›U›šrššɟš;šš~šx&šcšOš;3š&š™b™$™™™™R™'™q™\™H™4™ ™ v˜f˜Y˜P˜L˜K˜N˜T˜l_˜Xm˜D˜0˜˜———<—i———~—jB—V—B—/!'1>O}dh}S>)0œ`œ֓œœœBœœnœZœEbœ0œœa›››ɂ››V››w9›b›N+›9›%,›š=šš]ššš)ššmnšYšDš0tš(š™™[™™™™™zR™f(™R™=™)™™˜~˜o˜d˜]˜Z˜Z˜u^˜af˜Mr˜9˜%˜——— —0—[———r—_+—Ki—7—#s^(IA4^ œœœ)œ^œœœyœdSœOœ:œ&3œ››5›ӓ››Z››0›l›X›C›/ ›› šš šȯšBššsšwšbšNZš:š%šc™™™Ԏ™O™™™™ox™[L™G#™2™™ ˜˜˜΂˜t˜j˜e˜~c˜jd˜Vj˜Bs˜.˜˜————!—I—u—{—g—T—@K—,—і}hS>)@œeœ֏œœœ"œ[œnœYœEœ0dœœ›R›ݩ››c››,›v›b›Mv›8›$e›šcššqššš!ššlUšWšCš/?šš™L™™ɽ™{™=™™x™d™Pk™š™™'™™™4™™™lc™X%™C™/™™T˜)˜˜˜˜˜˜zz˜fj˜R^˜>V˜*R˜R˜V—]—h—x————v—b—O$—;N—'|—––aQF~>i:T9?=*DO^œqœֈœœœœœn2œY_œDœ/œœ;›|›››U›››uP›`›L ›7n›"›?šš!šЗšššš~šj šUšA?š,šmš ™™O™™™T™™u™a{™M;™8™$™˜_˜2˜ ˜˜˜˜˜ot˜[b˜GT˜3I˜C˜ @—A—F—O—\—m———k—W—C—0"—N—}–– s^I4 œœœœ'œCœbœxœcœNœ:œ%7œm›››'›l›››T›j›V›A^›,›#›ššgššRššLšsš_VšJš6pš"š ™3™™s™™™p™!™j™V™BL™. ™™˜g˜7˜ ˜˜˜˜x˜dj˜PV˜š*dššu™™ؖ™,™™d™™r™^V™J™5™!j™ $˜˜˜g˜0˜˜˜˜kz˜WV˜C6˜/˜˜———————z—f—R—>—+—,—J–m–ۓ–ǽ–tf_LJ65#  œœœœœ œœx'œc;œNSœ9nœ$œ›››2›e›››~›iV›T›?›+4››š4šؒššXšš.šqš]šHš4šš ™™ ™Ͱ™C™™v™|™g™S`™? ™*™m™$˜˜ٝ˜_˜%˜˜˜t˜`f˜L?˜8˜#˜———Ӭ—————o—[—G—3—— – –+–O–w–iT?*œœ|œzœ|œœœmœXœCœ.œœ›7›_›Ƌ›››&›sb›^›I›5,› w› ššošš(ššš{[šfšR;š=š)*šš)™™8™™V™™™q!™\™Hf™4™™ k˜ ˜˜Δ˜S˜˜˜}˜iz˜UN˜A%˜-˜˜——ܔ—ȃ—v—l—g—xe—dg—Pm—›}s›h›S›?)›*m››šRšצššZšššpš[šG_š2šIš ™C™™L™™e™™z™f(™Q™=h™)™™f˜˜˜Æ˜D˜˜˜r˜^`˜J1˜6˜!˜ ———i—V—F—:—2—m.—Y.—E2—1:—E— U–h––͛–––j9U?*œœyœlœdœ`œ`œmcœXkœCvœ.œœ››› ›1›\››r›]›I,›4j›› š:ššš.šššzEšešQš<š'šd™™Y™™]™™q™™o™[,™F™2f™ ™ ˜\˜ ˜̾˜u˜0˜˜{˜gx˜SC˜?˜*˜˜—s—T—;—$———u—a—M—9—%—–––5–N–k––_J5r P 2œœœœœœœwœbœMœ8œ#œ›››;›[›››|›h›S4›>k›)››(šošֺššZšš šoišZšF1š1š š{™™j™™i™™x™y™d™P+™;™'a™˜˜O˜˜˜a˜˜˜p˜\Y˜H!˜3˜˜ —i—E—$————~—j—V—B—.——––––––5–{XUH@*œœuœ_œMœ?œ5œm/œX-œC/œ.4œ>œK›\›q›Ŋ››››r›]B›Hr›3›› š[ššš3šššy.šdšOš;Lš&š™™™x™™r™™{™n™Y™E'™0™W™˜˜>˜˜˜H˜˜y˜eu˜Q7˜<˜(˜˜d—:——————s—_}—Kr—7k—#g—h–m–u–ӂ–––––oJ5 n Fœ"œœœœœœwœbœMœ8œ#œ›››Ͽ››››|0›gU›R›=›(›šMššššZšššnMšYšEš0dšš1™™™ɂ™™v™™wz™c™N™:™%™J˜˜˜)˜˜{˜+˜˜n˜ZQ˜F˜1˜˜ e—4—————z—|`—hK—T9—@,—,"——––#–-–;–M–c–x}–d@H+œœqœQœ6œœ œlœWœBœ-œœ››› ››4›O›qn›\›G›2›› Eš{š߶šš7š}ššxšchšNš:š%wš™>™™™™™w™™lv™W™C™/™™8˜˜n˜˜˜]˜ ˜w˜cp˜O(˜:˜&˜j—2————|—X—8—q—]—H—4— — ––––––––m–Y65  [œ-œœœœœœwkœbXœMIœ8>œ#7œ4›5›:›C›O›`›t›{›f›Q›<›(›BšrššššYšššm0šXšCš/+šš™H™ܰ™™™™t™u™am™L™8w™$™˜#˜˜T˜˜˜;˜˜l˜XF˜C˜/˜t˜7———ʔ—f—<——y—e—Q—=—)——z–s–q–r–w–––u–a–M+9œœmœDœœœœlœWœBœ-œœ››ق›Ĉ››››p›[›F›2›E›nšššš;šxššvšbFšMš8š$9š™™N™ѳ™™™™l™j™Va™A™-e™™z˜ ˜۝˜5˜˜q˜˜u˜ai˜M˜8˜$˜?———ӊ—U—%———n—Z—Fn—2U—@— /–"––––––~)–j8–VK–Bb  oœ8œœœœœ[œw;œbœMœ7œ"œ ›››››››z›e›Q›<.›'M›ošššš!šXšššlšWXšBš-šCš™™P™Ʋ™™™™ta™_™KQ™6™"P™ ˜_˜˜~˜˜˜J˜~˜j˜V:˜A˜-˜M˜——܄—I————w—c^—O;—;—'—–––ּ–µ––––r–^–J–6œœiœ6œœœœlœWsœBWœ-@œ,œ›› ››› ››p›[.›FB›1Z›v›ššš š=šqššuša#šLgš7š"šI™™™N™™™x™}™iR™T™@<™+™6™˜@˜˜Z˜˜˜˜s˜_`˜K˜6˜"`˜———B————e—l7—X—C—/——–z–h–[–Q–K–J–{L–gR–S]–?k–+} œCœœœœcœ5œw œaœLœ7œ"œ t›a›S›I›B›?›A›zF›eO›P\›;n›&›šššš(šUšššjšV0šAqš,ššK™™™H™™™j™r™^?™I™5$™ ™ ˜˜˜Φ˜2˜˜W˜|˜h˜T+˜?˜+x˜$˜——@————I—u—`—L—8—$m—M–1–––––––o–[–G–3– œœfœ)œœœœl]œW4œBœ,œœ››ؑ›Ä›z›u›s›ov›Z|›E›0››šššš>šhšštš_šK9š6wš!š ™I™™™?™™™|X™g™S(™>™*™}™˜u˜˜|˜˜˜&˜q˜]U˜H˜4˜ :˜ ——C———p—2—}—i—U—A`—-6——––ܵ–Ȟ––}–s–xl–dj–Pl–š+yšš™C™؎™™1™™™qB™\™H ™3x™™ Z˜˜M˜˜O˜˜b˜z˜f˜R˜=˜)U˜˜—K——í—d— ——r—^i—J4—6—!— ––h–L–3–– ––l–X–D–0–– œœaœœœœ_œl(œVœAœ,œtœR›2››››››n›Y›D›/››šš š"š?š_ššsš^šJ š5>š wš ™™9™͂™™™s™z™f)™Q™<™(V™˜3˜˜!˜˜˜˜+˜o˜[H˜F˜2v˜˜ —W——̭—^———{—gI—S —>—*—t—H–!––––––u–a–Mx–9u–%v–{•œœ˹œpœ*œœvœaqœL<œ7 œ!œ ››j›L›3›› ›x›c›N›9›$›šš šš2šLšjš}šhšSš? š*<šrš™™+™q™™ ™[™o™[ ™Fi™1™1™˜ ˜{˜˜k˜˜k˜x˜d{˜P ˜;˜'1˜—j— —ղ—\— ——s—p-—[—G—3t—>— –––ΐ–n–Q–7–~"–j–V–A–-––•œ^œ œœxœ3œkœVœA~œ,Iœœ››מ›}›`›H›3›n"›Y›D ›/›› ššš+š?šVšqšrš]šHš4š5š h™™™™]™™™y>™d™O™;D™&™˜n˜˜I˜˜4˜˜/˜m˜Y:˜D˜0U˜˜——޻—_———b—y—d—P—˜ݧ˜˜˜˜r˜v˜bp˜M˜9~˜% ˜—1——g— ——W——m—Yk—E$—0——i–2–––––^–{@–g&–S–>–*––••œœœWœœkœVwœA5œ+œœ›R›$›››››mw›Xa›CN›.@›5›/š,š.š3š=šKš\šqrš\šGš2šš ™H™z™ʰ™™(™j™w™b™NG™9™$™I˜˜ ˜p˜˜H˜˜1˜k˜W*˜B˜.3˜˜K——u———Q——v—bQ—N—9—%v—5–––Ԋ–Y–-–––o–[–G–3u–d– X•P•K•KœJœœœvJœ`œKœ6nœ!,œ ›››O›!›››w›b›Mz›8e›#T›Fš=š8š6š9š@šKš{ZšfmšQš<š'š™™3™b™™™™F™l™W™C™.k™™˜r˜˜5˜˜˜x˜t˜`c˜K˜7_˜"˜k—————O———k<—V—B—.N——––H–––––x\–d9–P–;–'–•••׵•òAAAAAAAAA A(A0A8A@AHAPAXA`AhApAxA߀A߈Aߐstars/inst/nc/timeseries.nc0000644000176200001440000000411413777653456015505 0ustar liggesusersCDF station time  featureType timeSeries ConventionsCF-1.7 num  long_nameStation numbercf_role timeseries_id(<time units"days since 1970-01-01 00:00:00 UTC long_nametimecalendar gregorianPdpr units kg m-2 s-1 _FillValue long_nameTotal precipitation flux coordinateslat lon alt num standard_nameprecipitation_flux lat units degrees_north long_nameStation latitude standard_namelatitude(lon units degrees_east long_nameStation longitude standard_name longitude(alt unitsm long_name#Vertical distance above the surface standard_nameheight($ *,;-/013]46779:;=Z>@4ACD|EBBXBB BABBBBBdAB$B(BBBBPBA@ABBBBBBBBABB BBlB@BB\BB0A@B`BBBBBPBBB0AB,BAApAB0B@AABh@A@@BBABPBBBBB4AABB(BBBA?ABBHBB`BDBhAABBBABBBBp@BA@BABHBAB<BBdBABBBB@B8BBBB0BB A BB|A BBpABB`BB\BB AA`A B$AABBB8BBB ABBABx?BhBBBB\A BLA0BAABTBBAA@BABBABLB`BABBBBB,BAB ABBBA@BBPBBBA`A@@šAB8C|°B%B|(A CAB GT1B|B(Bstars/inst/nc/reduced.nc0000644000176200001440000040375413777653456014764 0ustar liggesusersCDF lonlatZzlevtime CDIC@CBCDCFCHCJCLCNCPCRCTCVCXCZC\C^C`CbCdCfChCjClCnCpCrCtCvCxCzC|C~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC²®ª¦¢žš–’ŽŠ†‚|tld\TLD<4,$ pP0@?@@@@AA0APApAAAAAAAABB BBB$B,B4B<BDBLBTB\BdBlBtB|BBBBBBBBBBBBBD[c^XZdeffgfbWMLLLLo\MTVZfmmgyz}rd\]ehw|~~z|rst}}{hbevr}xzi\`is^a^Xf{r_^eggdbbfiqr{]V~mdabgotvsmidbfbemu|w^RTnuf`oumez~k{tqjc[Z_gjiigedbacmurzuijiglzxwstlge_[bijighouvurtsqkealov~zg[Ybijfbrqovwsi\]]]yl|xfdjlhilmtzwtwtq~kWU]QNUX~yj]xkynmgfkihjqpi^[YX[bwqe`cirywputt{~}iqosuhvqW]UW`VW\aaem~u~ejshjzeoqd[mnk }x~|ywmry{{s~  _QPQQU]lz~vrtt{~& +G9cRk(;dxwj)&+BiE/k~d>4@)RcS,vrwvm,2?:N~|\r}kh\E<8-<8:l%  ?^.l)e3^qNENpNnwyspbj  heYl~^#*Vwx VXSzUAMg+Nq_  `qUH3YhyC6#jA gU_dbgbh|yt , .BWMRhH /9FHMTV+=YP h - v=|5Q'SXF^= Co|7jw[peg[<wz!  F  n}whTbcp#Sd{wop{jfMLL> FrC,E\1CLn`Ky<:M{LY7LX2UG' u # %"TO^s I ^T !#5ZZS- e*Tgh MN)!9<)YQHFdfp>iXY+DPZP|G=Zr3?#(Oj> nBA.6&UM@}T ~XB:oiW?$BbLq f _(qI*`:#dRUjxhci_[T >KZ>6E=26EL^bJRGAMA= I" zGT@nXOSz*'@"W9!X~v@ME9-:-6=WQ.M|}-%D_ 3UAM6O[i=N 7p8R_ &gTrhV(R_!j~v <~nO4hn+?gtiw( "qc|3b|plROAhqd[]TFU;%/DYP9&pQv'%e[=?EczQ29'I #OMWr_&vC-fRUCQP^jk>Xbr7U[W}c. <>4 vP5tAXPHqI~_9(KmTptI~!B"gpTT$:~~Wi39y~R%; (D]u[,9v=BX|\~e Ju$l)z +1 I8  +|}i36$15(,7.+   #'}s$;>\u1#A5 Xx}s]}S^]=Xw\5T7'ekO]~o"))~w VCf,SrVw@7{}}c|eXmluzsn{+p|ellbH 1m)67kNAS5q+UJD}D{tWKp/)pC#a2W7&_38fE74[p$+U.2G3^M5OW%.#;H 0-R  <&`mQ{XDLO])5L/3C:&X]av it#tkvznyxV-/[3|lQ=#w?yU3(jg`gt{~Uhg  2]Y?8(;q5&A:KOU=^ oJ $5XJY[<2K?lpiY8R |jE^<-2iHYl<yk$:oH/Cu?G(48!TM* -  NXVA$zVQ 5|.zqBG9]j$kk~)# > _x_4#=cjTD%CKkuNUoy @5TktM22;{wuu}nzNSmS0trxhR.TH?   XHBT)$;.sN`<)Ng! E8LtaH]#gl[oy{}B%+UFs .1:)vZ @O,^|\IV#+*8 2)*;GuYU93 9OYL7r>D349N 1}}S 5&3kE4521*eME +\|Mwwy?c x [ #;<J)ysT?ps  <[{zH@(\i c(&9^K\GGr T @  a K 9 H W x SgK/ZJI>c"3 ? Z  w=4xfHZ,"!dwsUN0MvdQ<#gh` j   % ik$w }  y Z \ | >6*mJ @ . u o c   B 4 D 5 ) O > ;aO & ` u I A " ] *r</<^p$Z ] ~ E D ! E U V N f y A J < N U T 0 P I1Mm2   C G 9 E } " /  y I G 2 >BBJ i@,^eM X  k R ^ | S i K I n 2   1  ; O   { G - 7 ` u |  M $hIfX$* h t v [ ~ u t h o Y E > PbF&1{  9 ] v \ T A w 7 0  Y [ b <  Uy > D q @     w f m I D J + H V w B m 8 bfG v  k U z P 2WIY/(-  D 3 } _ E ,  s 3 * D >      [ 3 x  K  # 2 T F F  : 7 ^ B D , {   6 4 J i m {  B  [ ` 6 6w@L? ~ -    p d I "payIE7%-  ` _ F   v U Q / e J ] j A . i -  \ , 8 S  C  N k w | r , - $  2 I v 7 E _ a ~ x x P I i [ w R 2  leHG  6  | v W F &{hYC9I$ ~ x D , 8 S ` @ !  ] )  f b ~ ? 0 l  Z A o 1 6  > | d 3 9 > R 8 { H i } l r r 1  h-bT S V P A s \ B sVx  S Q q Y P | ~ V T Y P . Q 3 3   $    ) / S   h H f D x < z } { o H "  1 %   ] 6 s[8G'&  _ i i 8 ' v i N J 1 4 I 7 G } z ~ e X 8 ' z o + j q ) [ M J a  ` Z / f m N  B      c B /    ~ U > exVR]dI ] v O T ~ ^ 5    ) - ( P v w E 2 Z z E S   4  ' g 0  _  A e  i O O -  a w z _   &      U #   * % ; ' .    &  m W Q 1  m G D B | Z j . b 5 " 5 9  g l r > 3  9 V 5 v  h v q ^ n  0 G F l    U M S i < a b W M E   m N [ B &   % I 6 = G : #   #  O 1   U H A - , L $   z w & o y r d {  Q N i  w p  < . j   / '  & , / q $  U +    = L 6 @ q Z { W  | @ d d q  U ^ 8 0 4 X V  %  ' %   b   ~ _ L S S S @ E E W K U o d D   b 8 n % o o O X N 7  $   2  a C / N Z c % / 7    U :  H e   c } k L { d g T X h D &  Y :   p i a Z a r r ^hr g P D 8        P 1 / A | #   e k ~ 7 -   s  ] y b %    z  7 7 4 . x  N o Z V w w r z o z f } b J 1 E c : d p x P K q 1  ~ t y gg z X C > H = 7 O L f [ k T 4 0 &  i T     $ L ^ 7  o 6 , F ^ ` ] ? % F g , ; J J O J @ C o _ ` r _ v A J ,   "  C R r y y p    g `  r | n c | x q q f *   S h k s j [ P R M i n l f u  i N x }   \ j    9 . L 4    # T j " $ z ] N  4 Z  } v y x _ > 6 6 F * '  e U 7 E E 2 ! , @ ) f | x { ` ] i X r Q 8 + Z   Q \ n q q ^ f h n [ o v ` m     # ; 1 / P   1 = / = T 0 :   V M S   8 R 4   4 ! w  A V E a u < W # * g W #  " +  h d e J  " -    }  q d ] d |  l g     G Y B $ < c I ' ! / a   ' x 5 +  + v H *     A d   u j p T      c & . t R x <   A ] F .   / T 3 !   + s   \ n v a q  ` 1     & 4 8 B C 3 , X \ < # . f M  J 5  3 )  Q y    * 8 A h \ > k K Q b H \ t o P W v e  ) h 4 f ` : / ^ f #  } V j [ h #  S _ r t 2  7 e r u o U k b  ; 9 H >   ; / 1 Z U  '  v      E K  ' ) . F E g a ` ` > % . 8 N C : A a K F k b ,  Q [ O \ ? " /    v 7 ~ n w X ] b J b i U f V S d i  !   T U 5 X ~  ( < M M d } ! 0  ! U 1 # & A 8 > F P > 7 < "     = ! ! 3 E 9 2   s w l e r W _ | ` l  g ] _ a P q O B 1 C A \ 2 5 ; g Y   E  % ? R ~ V ! } w f % D   * 2 . 6 / * !       { t o h [ D ! " W v    " c e {  } X l m I Z U h Y 3 5   O 0 |  6 s = i   # ' q z S  Z n ; `  ( - !     l \ g u c 9 7 4 + 0 G      d   5 P c  e 0 x q ] P  %  I S  { c }  T     k T H ! \ ] %  I ~ ' - > 0      T a ] [ K ` V 3 % 2 6  ,  L v ? f Y " 3 v s J  e v q ;  a j m + [ s ) H  \  b z  $ (  m q R F + Y D . 1 3  u  B o o 5  6  r r o K :  r ] P ' - N % l  [ .  ] 5 1  " "  c  9 0 % ( i 5  i _ I 6 @ >  F = @ ,   Y * B ~ m ' "  ! J  2 6 :  ' N r ] P G u ] e c [ E L M )   o D '  q %  } f ) X 4 T ? SR h f  ] g M f  ,   w r 2 U R #   r ~ p ` d V 0    \  k ` , .  D 7 %        ~ z d K / w c  Z ~ *P   Y D & j M  P v W | K 9 1 * 9 7 z s j W E C > ' = ZKGSE| / 6 F ! o h F W F , sN M :  = q t n4r  G  n Y Q A 5  s f o 7 + ( ; % U J !   n_GdL A4 ` e  c  f j p = 1 H 4    Q ^ e  ,Jje(  T !  ,   f  1 <h0Zmo+3G= ]   7  v { ' @ s /  %  c W T   6 % k_A/v9]])%$`*Vl|m* qI@?KXI\F&lc' Wo  F P/o]qf`XK>)@3\A}\+%,qA  i`h"WN8@oPL~t3AL@= [= !g"s Y8.5)Pk@VYclIR;4']@-:Obc#Og{4rCp%TFyU$w SPE z}b-;&d3*x 60wiO@w##IX@Uq?R*~!I9-K4Yl^i1 fcFTmn&*2]0)B+  `dym]DL/_%@M=K^0$*FxpBtBvMn'Xpo\x|d\6l|kkE=Y?Yc$~\#Z5tbPta,HTDh 2IqEVqFk4E=sd^USB'7=r]dyO +j9E53:eaO%`qM %"y t 2~%!fy!)|Q`\946.7J}w,5$IeIq&|^8mb;vze4}74iveqB'L}4]-zcGQvQZ!%(N6Df2fYW -UZ[% 7?o?M\!+g R]cvx\S(y (x/$"dx#+EsO#1T\vl|OuC8j:7ZIPgtzsXgWF)WJCh7/I!0%Teo*8=H2&`2 W{]<AxhSo O^cc49'EZ?UvvPg15/w^nmDak |pa:jbmcio Av-T*Su<!yXv@*C}@f|kzH+I%'2gbJlk R[ hpb\j']8s AGbK13Cdk=!/osBj/ K>&Gv`T^b]^{"`tCrn>oTPhgwQ#IM.Zmk[6=)I.N.5Di+^YPRRQTv#J #h9&XZYxyZnQ{5 ~t{ \#Be]NOTUZs uZSn6.F3  c=|,4fpZd1yfYX_pt8&O?>5C&YVL"eohx}^lis{~ymY1H-*.=?w`YWNUWWYXY\\PSRRWZ[Yd~ra~f^m}4iuSIMh 0D9X*`~p[QPPP`[VUVUPPQPNQSTSQOONQYb`\NOVWRPPPSRQQPRSSVWXYYY_cc^YYcvqfwhVznjisfgiwE u#]$pF<o\QPPSVUTTTRa^YZVSQYQPPOQQQOONQVTXUPNNPQQQRRRQOOONNMNNNNNNNONPRTXXYXV_VUXW^_[]f}{_`ok\[agifyYkyut>1o>VR`u{vVRNNMMRQPONOPQOPNOPOQRRSVVVVYTTVWUURRPQOOPOMMNNMMMNNPPPPPPPPPQRQPQPPOONNNOOOOOOORXWYWTRSX`UXa`ciamntusvg\VSSTYgQdtms =Fb-C 6 Ulm{|paWVcggVSPONMMMNOONNONNPQPOONNOPPPPPRW\ZYWSRPOOOOONNMLMMMNNNPQQPNNOONMMMNOOPPPPOOOOOPPQRTUUWXZXXUTTWZ\^cddeis}vrvurhgjtllgfHX&4rb^[YXVSRQQQTVSUUQNMMMMNNMNOONMNNOPOONMNNNNNNNOQPOPVWVSQNOOPONNMMLLMNNMMMLNPPMLLLLLMNNNOPOONONNNNOOPPRSTVUSRRQRRUUWYXU`aYi_UY[_brHG1}bxtk_YURRTY[ZWTSRRRPOOOONNNNNNNMMNPQQQQRONNMMMMMMMOPRRRRPNMNNNNMMMMMMMLMMMMNMLLLLLLLLNOOOONNNNMNMMMMNNNNNNOPPOPRTTSRTXYY\YWV]b_`Ts[`o\^\YTUYd vutsmkfb_ZX\`_ZY\^]YVSQPONNNOPPQQRTUPOPNNMMMMLMMNOPQQPQQPOONMMNNMMMMLLLLLLLLLLLLLLLLMMNNOOOOOPOPOOOOOONNNNOOQQQQPQRRRSUY_baa_c`]X`ZMMMT[jpogbel}lmmlkjifa^]^____^]]\[ZXWVVUUUUTRQQQQQPPQQQQPPPOONNMMMMMMMMMMMNONONOPPPPPNNMMMLLLLLLMLLMMLMMMMNNMNNNNMNOOPPPOOOOOOOOONNNOOPQQQQRRRTUVWXYYXZ]``^]^][WTUbicWUSTX`TVZ]`beknmfa]]\]abefijmqsrqpmga]__^]\\\\ZXWVVWWWVTSSSRRRRQQPPPPPPPPPPONNNNNNNNNNNNNOOONOOPPPQQQPPONNMMMMMNNMMNNNOOOPPPPPPOOOOOOPPPPPOOOOOPOOOOOPPQQQQQSTUUVVWXWVY\^\[\\[YXWWVUVUTSTTTUX[]_aehgecbdcceikihj`abbaa`]ZYZYYXXXXXXWVVVVVVVUTTTTTTTTTSSSSSSSSSSSSRRRRRRRRRRRRSSSRSSSSSTTSSSSSRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTUUUVVVVVVWXYXXXXXWWVVVUVVUUUUUUVXYYZ\]]\[[\\[\^_^]^WXXXXXWWWVVVVVVVVVVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVVUUUUUUVVVVVWWWWWWWWWWWWWWWmkG><@NE=Ybdc\_jnt+    % 18=/)  "#   N#, B4   C\?<*M\PC"  .    *   rK)[ 1.% )#",lLQtc)02Ok\$UMW 83)'>`b~t  %#th $&gdt*wum0S $302hnjQt~sm}yv(  ?l.RC6QX&p//?*$ugoBa[`^O&"3y#G 0))F *:  ):4 No .E!/Nnfzmqe n?cgTCoy n"MS:TL>6?*0:V=,n-F6  58"Lsu>K0Z;.v zL/L5?@TqPdrx=H1 Pd &)9XD;EV: 8)E H'X? !1 0Ot~)?$.y$? i'Sj{    yirY~>* :BQU:<WH1Gw zT6KGa(lRKC<@1N'g_0$4; -&o,ug!7,n+!'EW$-x{ '/x2B 7=8e   (00*1$Q:y-\9jn,9_H!(#R"FI%=2)v */!gO  QD(2I-#%"#@ B5DI*79 OV5LSILY8 AE*'03;-^W*TZvo03##"2|.6Y)" )!*G0' ?%9fo! ? #;7li-i;^:7gim?+(,"8:KF[S8 d=GF' +:.2"}7aq>h;* f;nuWec>,K$Q;K'C}^O!cs =!J #4- 7",V8s@HrH;B`c7DwnW$wz2FK% ~a.gestue9O}Pe8Vnq+", 5'F. M%K%Ka Vg>dwK2B:` nC .Pw%V=C0%Glf|cuB)-;IMj$}{rhzI{dG4O*}m\U^OFOrlc|qj? I35,5+@*#^xcy 3!R7 '.?"1 yvh H B9Dmr/ZayY^:A<tnXPvy?L@b|fJFAqihauxs$B a_s[qQVlM )UU!.6q7! %fi]f|eg?bDGx! \CCpovsUa99 r~X8+aUChjHn;"x&lyZ #_\&>4%)cYM:7rvo+mUorSM'jI1OR@=sJMtwV* aHbNqD\v qgn\]Lljy eISjjVE%@4$yl#0 {30 <Mi~|j9>} /S4vhRSrc5.6N+2U u`2D1- Z]yp La<g9_W+<TgzEI<;!fXB5@3hC] 3U )3RKORdN@NipNTd%(Kt+KqN{z%M:[abadD*IVpa=r\hg&5[EH?d||= .[h~ lwV;J,^#,$oc )9G?.E\&2.J^l]j9 4*4#}E. Z')`M:Xqk{oc4#/]k  6{lW ZNjA|F7J_?) ##8 m6  j7~<> PcgyxYzU4 +1EW?<!d^6D`xzZ 46>J& 7 %%QDCB"L+Q`J#CF ex7</. )*W??&s ()@EQeoLJ[C+ )50 !u$O-1 GLq/8$&R8I '&RC9!)@X0:xT%E $8 )z,2v{f  y;.lPp]X^QXEV#*  t N5U'YG|VUuM,z}  -78}] #1 WB%UlA 4wlsmPlbosv W   5/":`T-d(;RG_R72*]trk_0CFN]u  < '3!!C&;p+m1y93el{lNP%"6"gi4!L19RMuf-"rV`W, y"uT@pc Mv] &x%   ;TFZzC.QC% $S06@z=v {6,.@%^:&8 .@ #1$BHtSU^ y iBX5?A#AE:!XKrO>?F<!+.&/pjW %E9 5<3,J4E47B0\K/2{s#?:&0SP2 !6Dond&n<?&*9^A&/66LbUd\2, A;&9.G{]M}lW0%f\g+nWBZWH76D/,=IInUsV>+%Ue=ERMP[\K=;H2&3G qt'L?.TwlS>_D&} IS&INB/2o-!{ J>">35L='1PB^3lo zy6")z5  8-.>60) #/!0(K')S XK#! $)P>8]U#LZUiO5G.#60<aV4? ,  9#>+   =3  .=2.5 "69 [C Nd|xeNR QOx932*q!Eikmqppud8",,89:6,$?L/12&X~acWUU 3S <2" &7 E^N  /'0U)gyN} 2+:55.9;GQ<HJEB9';ipmaLE&9NG+5==G^2 6EW,Oe].4++C\QO=)!+I1<$%$ Hg!lGT~ >EYQ8<:=/Vb\cTC<9=.!9n`9?IA]V<<VdLh< %))2B;Q)<O,1TP\$!*H( 3@/?]Y]U:7pynf|q~-  09'6-U_DBNDFCCOL5ZGB8) eF@9IW(7YU)IK #(/S KNX:F.BAq.0^L3=Yq`IH" 7xh 5zDV897:8a5M^$*OQK92PG+( %B@MDEB7XLIKN%(md! &8/ "62`e&!)47,>L6*6R" (}#7\mM oA: 9A,dz*4ZUJL@F"AF:/#ACCUXKI8U3,!  ,'E/k +-9f$eCZq.'mk/$5 `CZrAjB637QY!7'60".DEo`RV7=N-'.B-<)%0!!&>[t z/Y']0s=Y"Z#&$8 3. !, 5K;IL]dD4 >#' 0,0HXCi^}mY,Q Z'2v[G(+0)4&&@9X1VIWAC8 *3-&  &8*+8?hR8'Q(A[~f B4?l=%L}pK#)*.?LL4Y 1) `|8 b6 OIDm#^0)R  #5@]I,9~BA\ )V>NQ B#)p .6`:'yS5AM"d!!1$w>,*mo?~+S6 =x A (B m/g[6a@~f!Gn['2D T -_4kQQUdHo\Y$"+%, I7evm*Jam?  a= }A<_ YYejhnGg.<vPnhb!pk)~Or W%<`vVp\')`&{n$5Wub (!'MWwoXRpsU0 %FJf) %,'x |cGA )6YA.E;9OSN[P6eNMJ$&X R(5Z{c52C4L44&ZGll, , z558~hLIwpDdJ|ZDN clG ` )< 074H<p %'5mUgEQJ^r+UR+8g-0 5 &O"'?sB  A>6$ 0;:qb-j@L! "91[.{)#C4]mO& pnB,N_=D\fc`AA< EQ%pY !|- eQkvt-mZP=#L/@Z`?%+{qen->!4 !-:S1 G# xvP%nEI!$i~uW$%DA)2=W-}H0#7gm}p ' 0E/:-%:/<4MVzl  %(8,!~{cb;2LYH3i[lglnWu     /, 4.Bj_$ ) O%G 19!4Q        /')%&  0tzqG|wt% (B]     %04%!&#$Fio&vb1|z   CM1cbe_PT t   XM1    >``eb>3 DE         ! !%'&%$          """"""""""""!!! """""""""""!     "!  !"""" !"" ""! !!! !!!!""!!!!!!!!!! !!""!!"      !!!!!"$#"""""#$%&'''('('''''(&&&'&&%#""!!! !   !!  !"!        !!!!!!!! "#"""!"'))'$$##$&''&')+,.//01111334550.,,,)'&&$#""!!    ! !!"""! !  ""   ! !!"#""#"!!""%&$$$#$%%##"$$#$#!!"!!!!!""###$%$##%+.(##$%%$%$%&',10-+,.1365679:=A@97;94230/,)+('$%#"!""!!!!!"#!  "#""##$#"! !!"###"  "#   "#$$##%%'&&),,)(*-+'&&(&))**$#$$$###$%&&'+,.+(&(.&#$$%%%'')00389235565779;=@DDB><@95388631,'&%'#""##"!')%*+"! ! "$%'%'''&%$"#"   !!"" """!! !"  #%&&&'()+.00/255000-+*()+-&%$$$$$%'()+-.1.*)&%+% "$%$'+-0/6<85:22788;>EDBA@=<=>6101,))'%$#%!  !")), !& #,.-'&'" ! !!###"  !$#"%#!$''),012475791361-.+*0/&%$$$%&*.-,/023-('%%! #&)*,./.850/3;;:FD>??<;8;@<6.+(&%#"! $&#',+-,-131)-,#'&%%&%&##)'&'&'*(+-04;>?>?9840-00/20($$$$&)--/-1535+%#!#  "#$&'),6;34<=5987896695587,&&"!!!  &&'( 1/431(#') ')'('' &!!!""+.+%%'(+/4<9;;?:1.-.,'$%$%#"#"',(0/0310-%"!  (-**/430011111233474&#)"!# &%('!+/.-)& !$#"%*'$"&"%)#!  **! +,(-.39978.,+'%! !!$ ",###$,+#!!()/)*++,--.000/*'$! '$"&'$'&%-,&#,+**)))*)*+)!)%  '%(0.&,.--/2/)#"!"((!$$%'$$#"""$$$#"&)&+./,+)*+--,-//.+)&#!"!$&&%)!($-'-!!$&, *)'&++')* #) %,+&#"" '( %$$ !&('$##(+')'',&!),-./0)%(*+-/.0//.+(&)"$ ###%&'''"--$ %,0#30"''!   !$ !&'(##"$'&'&)0+"#!$*+*'$%,10,./1210/,(%$"! $.%")&##%'$" %.$%'(!  $//&-( 1672#+43"("$"##"# "'$%&'04/# #(&)'!$$)1./1356552/+(+($%''')''(%#""$" 2,-# #1.2//357733+%14641"#" ! )' #%,-*'#"#!(%(()*$ $(00258;>??=:7311/1228761--&"" ()   %1)1/2236763)$"++*&#"$$!'())+)(,/8:8<@DHKKIFC?=<<>?AFDB<43(!! !%  -)"*)$. $&!  &")!!'()*+.26:>C@DHLQSSQLIFECEJJGMKC:6/& %$#$($ $$() '()+-048<AEHKLORTSPKGEDEFKMJJE?;4,$'!'   ')*&  ( !" $"'# "%'#',.158<?CHLMKJJJFA><>>?B@@?=:5.& $  %)   %$ *   %&&$(+-/2469=@BB?:99651//2863332/*$&  (! #  ##      ! "%&'')'#))(,033+(&&%%"!!#-0,)((&"$ $ !  "#   "#  !  $&''$"() &()( %'  &% !!  !  !#!   ! %&&&#"!"# #% "&%  $"  !!#  "  !""# &&&&"!     $## (%%#"! # $$ #$  $#$% "'&&&#    !#"! (("%$$ &"$  &% "'! &&'( #%''&&    !!  #%&%  &($% )&  *$  (")* )&&!)&') !  $'#"! #$&('$ '*(% ,* .1 +" +*+,#,--,%"*+)'"  $#,! !$ )( *,+*(' '--  * !---...,(+,*$ && $$ +- ,---.-&/& (%  ),.)+/%*,)(  ,  !   (/- '.'& ').! * $+-0-./01-  ',"+"  (    ,0 ), *00'%!  # 0-"-0.*,"  !)    ## && +*%  .00+ & )1) 3+ %-!           ),0)#'%&0$%  !+ "4#    *      $# +&&"("(      ,1       !%,/#-2   #    "      $"$     -%" #       '    "  -& ,)$.*//( *'           ,- -,+!                 #,,,+'   -   &          '+++*     "     *      %%)(      !   !%      %#!!  %          " !%-#         ,  #  !!#'+,-,$          # !'$  "&  ## +/-' &   ! ),-'  !(  #-*$ "'   & +&20+#)(#("$(" %&   !  $+) '$  ! '(*'##!  ('#     &(##%%   !.*$)$ )((& "  !$%!++,)! !!   "$* 5!%)& #&&&%  '.'50--)#$(#   #)!*  *& ")($!&$ ""+-,, !(&   $, ./*)1) ,'%#)) # 011!'%'(  #-/+0')."*!! (&  "%%+#+!,,(&"$&!  $!$ %"$,01), $#)+,*(!,'*'(&%(3""6611-*)+(,&)##$  (!-$ /&  4(1,$00/.10/%&(''(#%!*-'*,-)'% $$'-4>!2).33425(1/($   #/1101 """ 3!(.*,&-41/0-'!*+&%+'//)* %%#-)D@B<=.-8:+!#92.*'#   -.32",4%"$< "01-0,(..-.) ,,-.,&) !1ACE4< ,54-#4+## (275??*41(-0-," )&%$$)(! ++)  :/91?D(  /    32/,.0-**,&#!!!"""&!  $.4;*'$   /1,1)%'&('%(''(&$ ""  % """ "6(1.31'!!%'&&"        &')145 (342"!$%&    !1     )*)**%',1: (--&++(   +0& $#%(-((.))29@@DD     )-- #!$ )" 202=@@BD$   -$)!'(  $"#"&'%)() 4457#  -! #'$"##:;< !    !)''&!!"#"     ' !,,1""(!!!09::631$ !    "    #'" #$$+2,.56892)#   " !  #    %&-443-&!!"''#"    "'+&""     "'**&$&!   JSTO,   .<I+941@B?=8048://8.% $2:CGIC:7BCL[ZVE5?//.SNJW]-DKNYYUSRQUUQMGC<55;C?@- ,CLOOJD@@AEKRSRUPKF>Eac`N6:86W^LAMcdccdb^SBT@IUZZ\\YSQRRRSTTUSK:$!7=ASVSXSUROE88<<4;<;=GJMRVPGGHKLLHIGEEDFKPSUNFCFT\\XRNSXTZ`a`aba_baSNa^^ZXUQPQQPNICFE@DE<98:7+->OP@C 044*%+?R_\Y`c`]) IUREOFBNTQRQMNONHFKUWYZXP6*1BNSQKEBBEACD?>>EMILJCA>?5)!$#".6966<P\b_b`ddc_[WWUOC2  (373+',-0:?5$  $5FWN;?ALVZI ?9(/'+J  c_C*TRY=.R35GLH@8><$&+0@=:+&,(..*  %).*-*$%1(&%##+!% " !-851Dbdcab_[PC/  3=99C</ " (%-I&)7$!*;B<-54?.' 5* "$   #' WI<DJMJA3!   !#).' &            ]6  c*    2) 9/ ^- 7  =C% [\  ^]\^5 ZNZX+  HDHK6  \[WUN  <;BF@: "^b_^``[PV;@:*%   -"%F^`ccbcb[UOJR8#   C/-X,)5MS  -BHR0P[^ccbba\UHQLE@8 % HaU ! 2OVQOTV[``_[ZXQLTTWWJSRD 'XW^(/%;_O/6DKW]_[ZQYVX^\TU[[XW\U' F7($    d<%$>G8C`RQ`^`^\\[\\YZa___]^\_]VX[`ZUYW`a]YW@($OTTH<1    6CMXaaa`MQUY^_bbaba__`abcc`[UVaaZY^`__^^``a_^_]\[\]^\[[_aa^Y]^[W^[]^^\TC-#]]\XK@:5   &6BK[bba^ZYYZ\Z[[^]_`a^bbccbbabbca]^\^accbaaa`a`abbbbcccbbbbabaa`_]ZZY[[V^___]_`_]ZX\^aa`_^_Z</-/`[XWWL83+!   %5* 6JL_acccc^___aa^\]^_^__`___]_^_^```___aabbccbcddcccdcccaabaaabaaa``aaaaaabbbaaa``aa^Y[Y\^__]\^^Y\\\]Z\X[]\^`abcccb^U<4_]XZXA*,:@+ .;5$-LXVOLQY^_VSS^`aacccbb`_`a`__]_`abbbbabaaa_]^__`abcccbbcccdddccbca`abccbbcdccbbba```aaa```__^]\][ZY[\^___]^]\\^\]\YY[\[\\^^^\REZ\\P6!.>8 #KRQRSMISX\]^^^_``aa`^]^^]`bcbbba`aa^^`a``]ZZ^abababbcbbabcb__`abcccbbccdddddcccccdcbbcdddddccbbb`aaaabbaaaa``^^][\^`````_a__`b__a\TQRB<HMNSPPPa``_^ZTA(" "@NWZ\]_`abba^]]^_````abaaaabaabaaba`[[[[XU\_`bbbccccbbaaaabcdccccccccccdddcccccddddddddcbaabbbbbcbccccbbbbbba``a`^]^__^]]^]````^__EP_a`[]__`ba`^TH4QKNNNMOPNRZ\[ZZ[]\\]^_\]]_]ZWX\^^_`aaaa`^]\\XTQ\]]^__aaccccbbbabbbbbcccddcccdccddddddddddddddddccbbbaaaaaa`aaaaaaabbaa`___```_____]\[[\__^`WROLMNQb^\YZ\^^]Z\]]]]^__`aa`____^__^^^^^^^^^^^__`__^^^^]\\\]]]]^^```aaabbccccbbbbcbbbbbbccccdddddddcddcddccccbbccccbccaa````aa``````abbba``_``_______```a`___````abbb`^`abcbaaba_^\\[WVX[\^___^^]]]]\[[\\\]_`a```````_`````_^^____``________^^^^___`aaaaaabbcccccbbccccccbbbbbbbbccccccccccccbbbbaaaaaaabbbbba```aaaaaaaaaaaaaaa`````````````aa```aaaaaaaaaaaaabbbaaa`__^]\\\]]\\\\\\]]]^^^^^^____````````````````````````___________``````aaaaaaaaaaaabbbaaaaaaaaaabbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``````````````````````````aaaaaaaa``````____^^^^^^^^^^^^^_____`````````````````````````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa````````````````````````````````````````````````````````````````````````````____________stars/inst/nc/test_adaptor.cams_regional_fc.nc0000644000176200001440000000416013777653456021300 0ustar liggesusersCDF latitude level longitude time title/PM10/PM25 Air Pollutant ANALYSIS at the Surface institutionData produced by Meteo FrancesourceData from ENSEMBLE modelhistoryTue Apr 28 08:16:38 2020: ncks -v pm10_conc -d longitude,245,255 -d latitude,210,220 -d time,1,1 adaptor.cams_regional_fc.retrieve-1587939061.8606012-22402-6-64f0e215-609d-4ca6-b65c-a9ef7dc53370.nc test.nc Model ENSEMBLE ANALYSISANALYSIS#Europe, 20200101-20200102+[12H_12H]summarysENSEMBLE model hourly ANALYSIS of PM10/PM25 concentration at the Surface from 20200101-20200102+[12H_12H] on Europeproject-MACC-RAQ (http://macc-raq.gmes-atmosphere.eu)NCO`netCDF Operators version 4.9.2 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco) latitude  long_namelatitudeunits degrees_north,,level  long_namelevelunitsmX longitude  long_name longitudeunits degrees_east,\ pm10_conc  _FillValueyspecies PM10 Aerosolunitsµg/m3value hourly values standard_name1mass_concentration_of_pm10_ambient_aerosol_in_airtime  long_nameANALYSIS time from 20200101unitshourslBKBKffBKBJBJ33BIBIffBIBHBH33BGCfC3CCC=L>>>33>ff? APAPAJA>A4A/ܷA-iA5ؠA?4 A9}A7AKFAAA2A+[A.$A2A*A+A1SA:!ADAF]A1_A-gA&>A*gA0_A' A&A%onA'5A@#A\CARBAW"uA,u;A',A(A*A+pA+pA*AN $A{3A|Ao[A\A^߀A]pAUuAOAJXAJ0ACtAA_A Az9yA]AX`ANVADeABHA?A5B)BB)CB)FB)GB)IB)LB)NB)PB)PB)QB)TB)UB)VB)YB)YB)ZB)ZB)[B)[B)\B)\B)\B)_B)_B)_B)_B)_B)_B)_B)_B)_B)_B)\B)\B)\B)[B)[B)ZB)ZB)YB)YB)VB)UB)TB)TB)PB)PB)NB)LB)IB)GB)FB)CB)BB)>B)=B)9B)7B)5B)2B)/B)/B)+B)'B)#B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)DB)FB)JB)NB)PB)TB)XB)\B)^B)aB)cB)gB)hB)kB)nB)qB)sB)vB)xB)zB)|B)}B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)}B)|B)zB)xB)vB)sB)qB)nB)kB)hB)gB)cB)aB)^B)\B)XB)TB)PB)NB)JB)FB)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B) B) B)B)B)B)B)B)B)B)B)B)B)!B)"B)#B)#B)&B)&B)'B)*B)*B)+B)+B)+B)+B)+B),B),B),B),B),B),B)+B)+B)+B)+B)+B)*B)*B)'B)&B)&B)#B)#B)"B)!B)B)B)B)B)B)B)B)B)B)B) B) B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)vB)zB)}B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)}B)zB)B)B)B)B)B) B)$B)&B)*B)-B)/B)3B)4B)7B):B)B)BB)CB)FB)GB)HB)JB)LB)MB)PB)QB)RB)UB)UB)UB)UB)YB)ZB)ZB)ZB)[B)[B)[B)[B)]B)]B)]B)]B)]B)]B)[B)[B)[B)[B)ZB)ZB)ZB)YB)UB)UB)UB)UB)RB)QB)PB)MB)LB)JB)HB)GB)FB)CB)BB)>B)=B):B)8B)5B)3B)0B).B)*B)'B)%B)"B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)AB)DB)HB)KB)OB)RB)VB)YB)[B)^B)aB)eB)gB)jB)lB)oB)pB)sB)wB)wB)yB)|B)}B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)}B)|B)yB)wB)wB)sB)pB)oB)lB)jB)gB)eB)aB)^B)[B)YB)VB)RB)OB)KB)HB)DB)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B) B) B)B)B)B)B)B)B)B)B)B)B)B)!B)"B)#B)#B)&B)'B)'B)'B))B))B))B)*B)*B)*B)*B)*B)*B)*B)*B)*B)*B))B))B))B)'B)'B)'B)&B)#B)#B)"B)!B)B)B)B)B)B)B)B)B)B)B)B) B) B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)sB)vB){B)~B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)~B){B)vB) B)B)B)B)B)B)"B)$B)(B),B)-B)1B)2B)6B)7B)B* AB* BB* CB* EB* HB* JB* LB* LB* NB* OB* PB* SB* TB* TB* UB* XB* XB* XB* YB* YB* YB* \B* \B* \B* \B* \B* \B* \B* \B* \B* \B* YB* YB* YB* XB* XB* XB* UB* TB* TB* SB* PB* OB* OB* LB* LB* JB* HB* EB* CB* BB* AB* >B* :B* 9B* 5B* 4B* 0B* /B* +B* *B* 'B* "B* B* B* B* B* B* B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*?B*CB*FB*IB*LB*QB*TB*WB*XB*\B*_B*dB*dB*hB*jB*mB*oB*pB*tB*wB*wB*yB*{B*|B*~B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*~B*|B*{B*yB*wB*wB*tB*pB*oB*mB*jB*hB*dB*dB*_B*\B*XB*WB*TB*QB*LB*IB*FB*CB*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B* B* B*B*B*B*B*B*B*B*B*B*B*B*!B*!B*!B*!B*$B*%B*%B*%B*&B*&B*&B*&B*)B*)B*)B*)B*)B*)B*&B*&B*&B*&B*%B*%B*%B*$B*!B*!B*!B*!B*B*B*B*B*B*B*B*B*B*B*B* B* B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*rB*uB*yB*|B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*|B*yB*uB*" B*"B*"B*"B*"B*"B*"B*"#B*"'B*"(B*",B*"0B*"0B*"5B*"6B*"9B*";B*"B*9@B*9AB*9EB*9FB*9IB*9JB*9JB*9LB*9LB*9OB*9RB*9RB*9RB*9TB*9UB*9UB*9UB*9XB*9XB*9XB*9YB*9YB*9YB*9YB*9YB*9YB*9YB*9YB*9YB*9YB*9XB*9XB*9XB*9UB*9UB*9UB*9TB*9RB*9RB*9RB*9OB*9LB*9LB*9JB*9JB*9IB*9FB*9EB*9AB*9@B*9>B*9B*P?B*PBB*PCB*PGB*PGB*PGB*PKB*PLB*PMB*PPB*PQB*PQB*PRB*PRB*PTB*PVB*PVB*PWB*PWB*PWB*PWB*PWB*PZB*PZB*PZB*PZB*PZB*PZB*PWB*PWB*PWB*PWB*PWB*PVB*PVB*PTB*PRB*PRB*PQB*PQB*PPB*PMB*PLB*PKB*PGB*PGB*PGB*PCB*PBB*P?B*P>B*P:B*P9B*P8B*P4B*P2B*P/B*P,B*P*B*P&B*P#B*P!B*PB*PB*PB*PB*PB*P B*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*TB*YB*YBB*YFB*YJB*YLB*YPB*YSB*YUB*YYB*Y\B*Y`B*YbB*YeB*YfB*YjB*YkB*YnB*YpB*YqB*YtB*YuB*YyB*YyB*YzB*Y}B*Y~B*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*YB*Y~B*Y}B*YzB*YyB*YyB*YuB*YtB*YqB*YpB*YnB*YkB*YjB*YfB*YeB*YbB*Y`B*Y\B*YYB*YUB*YSB*YPB*YLB*YJB*YFB*YBB*Y>B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*^B*^B*^B*^B*^ B*^ B*^ B*^B*^B*^B*^B*^B*^B*^B*^B*^B*^B*^B*^ B*^"B*^"B*^"B*^#B*^#B*^#B*^%B*^%B*^%B*^%B*^%B*^%B*^%B*^%B*^%B*^%B*^#B*^#B*^#B*^"B*^"B*^"B*^ B*^B*^B*^B*^B*^B*^B*^B*^B*^B*^B*^B*^ B*^ B*^ B*^B*^B*^B*^B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*]B*bnB*brB*buB*bxB*b|B*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*bB*b|B*bxB*buB*brB*gB*g B*gB*gB*gB*gB*gB*gB*g!B*g%B*g(B*g*B*g-B*g1B*g2B*g6B*g7B*g:B*gB*~?B*~AB*~DB*~FB*~FB*~HB*~KB*~KB*~MB*~OB*~PB*~PB*~PB*~RB*~TB*~TB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~VB*~TB*~TB*~RB*~PB*~PB*~PB*~OB*~MB*~KB*~KB*~HB*~FB*~FB*~DB*~AB*~?B*~>B*~B*?B*CB*DB*DB*FB*IB*IB*LB*MB*NB*NB*QB*QB*RB*RB*TB*TB*TB*VB*VB*VB*VB*VB*VB*VB*VB*VB*VB*TB*TB*TB*RB*RB*QB*QB*NB*NB*MB*LB*IB*IB*FB*DB*DB*CB*?B*>B*B*@B*CB*CB*CB*FB*HB*JB*KB*LB*LB*OB*OB*PB*QB*QB*SB*SB*SB*SB*SB*VB*VB*VB*VB*VB*VB*SB*SB*SB*SB*SB*QB*QB*PB*OB*OB*LB*LB*KB*JB*HB*FB*CB*CB*CB*@B*>B*B*CB*EB*IB*MB*OB*SB*VB*XB*\B*]B*aB*bB*eB*hB*kB*mB*nB*qB*rB*vB*wB*xB*xB*{B*|B*}B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*}B*|B*|B*xB*xB*wB*vB*rB*qB*nB*mB*kB*hB*eB*bB*aB*]B*\B*XB*VB*SB*OB*MB*IB*EB*CB*>B*;B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B* B* B*B*B*B*B*B*B*B*B*B*B*B*B*B*B* B* B* B*!B*!B*!B*!B*!B*!B*!B*!B*!B*!B* B* B* B*B*B*B*B*B*B*B*B*B*B*B*B*B*B* B* B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*kB*oB*qB*uB*wB*{B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*{B*wB*uB*qB*oB*B* B* B*B*B*B*B*B* B*"B*&B*)B*+B*.B*0B*4B*5B*9B*:B* ¥:¥7¥4¥1¥.~¥+b¥(F¥%+¥"¥¥¥¥¥¥h¥ M¥ /¥¥¤¤¤¤¤m¤Q¤6¤¤¤¤¤ݩ¤ڎ¤r¤V¤:¥ܜ¥¥c¥G¥+¥¥¥¥û¥¥¥h¥L¥0¥¥¥¥¥¥¥l¥Q¥3¥¥¥¥¥¥¥q¥T¥|8¥y¥v¥r¥o¥l¥i¥fu¥cY¥`=¥]!¥Z¥V¥S¥P¥M¥Jy¥G^¥DB¥A&¥> ¥:¥7¥4¥1¥.~¥+b¥(F¥%)¥"¥¥¥¥¥¥g¥ K¥ /¥¥¤¤¤¤¤k¤O¤3¤¤¤¤¤ݧ¤ڋ¤o¤S¤8¥ܝ¥ف¥e¥J¥.¥¥¥¥ý¥¥¥i¥M¥1¥¥¥¥¥¥¥n¥R¥5¥¥¥¥¥¥¥q¥U¥|:¥y¥v¥r¥o¥l¥i¥fu¥cY¥`=¥]!¥Z¥V¥S¥P¥M¥Jy¥G^¥DB¥A%¥> ¥:¥7¥4¥1¥.~¥+a¥(E¥%)¥"¥¥¥¥¥¥d¥ I¥ -¥¥¤¤¤¤¤i¤M¤2¤¤¤¤¤ݦ¤ڊ¤n¤R¤5¥ܟ¥ل¥h¥L¥/¥¥¥¥¥¥¥k¥P¥4¥¥¥¥¥¥¥o¥S¥7¥¥¥¥¥¥¥r¥W¥|:¥y¥v¥r¥o¥l¥i¥fv¥cY¥`=¥]!¥Z¥V¥S¥P¥M¥Jy¥G\¥D@¥A%¥> ¥:¥7¥4¥1¥.}¥+a¥(D¥%(¥" ¥¥¥¥¥¥d¥ I¥ ,¥¥¤¤¤¤¤h¤L¤0¤¤¤¤¤ݣ¤ڇ¤k¤N¤3¥ܢ¥ن¥i¥M¥2¥¥¥¥¥¥¥m¥Q¥5¥¥¥¥¥¥¥p¥S¥7¥¥¥¥¥¥¥r¥W¥|;¥y¥v¥r¥o¥l¥i¥fv¥cZ¥`=¥]!¥Z¥V¥S¥P¥M¥Jx¥G\¥D@¥A%¥>¥:¥7¥4¥1¥.|¥+`¥(D¥%'¥" ¥¥¥¥¥¥b¥ F¥ *¥¥¤¤¤¤¤e¤J¤-¤¤¤¤¤ݠ¤څ¤i¤L¤0¥ܥ¥ى¥l¥P¥4¥¥¥¥¥¥¥o¥S¥6¥¥¥¥¥¥¥q¥V¥:¥¥¥¥¥¥¥t¥X¥|<¥y¥v¥r¥o¥l¥i¥fv¥cZ¥`>¥]!¥Z¥V¥S¥P¥M¥Jx¥G\¥D@¥A#¥>¥:¥7¥4¥1¥.|¥+^¥(C¥%'¥" ¥¥¥¥¥~¥b¥ F¥ )¥ ¥¤¤¤¤¤d¤H¤+¤¤¤¤¤ݟ¤ڂ¤f¤K¤.¥ܧ¥ً¥p¥R¥7¥¥¥¥¥¥¥p¥U¥8¥¥¥¥¥¥¥s¥V¥:¥¥¥¥¥¥¥u¥Y¥|<¥y ¥v¥r¥o¥l¥i¥fw¥cZ¥`>¥]!¥Z¥V¥S¥P¥M¥Jx¥G\¥D@¥A#¥>¥:¥7¥4¥1¥.z¥+^¥(C¥%&¥" ¥¥¥¥¥|¥a¥ D¥ (¥ ¥¤¤¤¤¤b¤F¤*¤¤¤¤¤ݝ¤ځ¤d¤H¤,¥ܪ¥َ¥q¥U¥8¥¥¥¥¥¥¥r¥V¥:¥¥¥¥¥¥¥t¥X¥;¥¥¥¥¥¥¥u¥Y¥|=¥y ¥v¥r¥o¥l¥i¥fw¥cZ¥`>¥]"¥Z¥V¥S¥P¥M¥Jx¥G\¥D@¥A#¥>¥:¥7¥4¥1¥.z¥+]¥(A¥%$¥" ¥¥¥¥¥{¥_¥ B¥ '¥ ¥¤¤¤¤|¤`¤E¤(¤ ¤¤¤¤ݚ¤~¤c¤E¤*¥ܬ¥ِ¥s¥X¥;¥¥¥¥¥¥¥t¥Y¥;¥ ¥¥¥¥¥¥u¥Y¥<¥!¥¥¥¥¥¥v¥Y¥|=¥y ¥v¥r¥o¥l¥i¥fw¥c[¥`>¥]"¥Z¥V¥S¥P¥M¥Jx¥G\¥D@¥A#¥>¥:¥7¥4¥1¥.y¥+\¥(@¥%$¥"¥¥¥¥¥z¥^¥ A¥ %¥¥¤¤¤¤{¤_¤B¤&¤ ¤¤¤¤ݘ¤|¤_¤C¤'¥ܯ¥ْ¥v¥Y¥=¥!¥¥¥¥¥¥v¥Z¥=¥!¥¥¥¥¥¥v¥[¥>¥!¥¥¥¥¥¥w¥Z¥|?¥y"¥v¥r¥o¥l¥i¥fx¥c[¥`>¥]"¥Z¥V¥S¥P¥M¥Jx¥G\¥D?¥A#¥>¥:¥7¥4¥1¥.x¥+\¥(@¥%#¥"¥¥¥¥¥y¥\¥ @¥ $¥¥¤¤¤¤z¤]¤?¤$¤¤¤¤¤ݖ¤y¤]¤@¤%¥ܱ¥ٔ¥x¥[¥@¥#¥¥¥¥¥¥x¥\¥?¥$¥¥¥¥¥¥x¥\¥?¥#¥¥¥¥¥¥y¥\¥|@¥y#¥v¥r¥o¥l¥i¥fx¥c[¥`@¥]"¥Z¥V¥S¥P¥M¥Jx¥G[¥D?¥A"¥>¥:¥7¥4¥1¥.x¥+\¥(?¥%"¥"¥¥¥¥¥w¥\¥ ?¥ !¥¥¤¤¤¤x¤[¤>¤"¤¤¤¤¤ݔ¤x¤[¤>¤"¥ܴ¥ٗ¥{¥^¥B¥%¥¥¥¥¥¥{¥^¥A¥$¥¥¥¥¥¥y¥\¥@¥#¥¥¥¥¥¥y¥\¥|@¥y$¥v¥r¥o¥l¥i¥fx¥c]¥`@¥]"¥Z¥V¥S¥P¥M¥Jx¥G[¥D>¥A"¥>¥:¥7¥4¥1¥.v¥+[¥(>¥%!¥"¥¥¥¥¥v¥Y¥ =¥ ¥¥¤¤¤¤v¤Y¤=¤!¤¤¤¤¤ݑ¤u¤X¤=¤ ¥ܶ¥ٙ¥~¥`¥C¥&¥ ¥¥¥¥¥|¥_¥C¥&¥ ¥¥¥¥¥|¥_¥A¥$¥ ¥¥¥¥¥z¥]¥|@¥y$¥v¥r¥o¥l¥i¥fx¥c]¥`@¥]"¥Z¥V¥S¥P¥M¥Jx¥G[¥D>¥A!¥>¥:¥7¥4¥1¥.v¥+Y¥(<¥%!¥"¥¥¥¥¥u¥Y¥ <¥ ¥¥¤¤¤¤t¤W¤:¤¤¤¤¤¤ݐ¤s¤V¤:¤¥ܹ¥ٜ¥¥b¥F¥*¥ ¥¥¥¥¥~¥a¥D¥'¥ ¥¥¥¥¥|¥_¥C¥'¥ ¥¥¥¥¥{¥^¥|A¥y$¥v¥r¥o¥l¥i¥fx¥c]¥`@¥]$¥Z¥V¥S¥P¥M¥Jw¥G[¥D>¥A!¥>¥:¥7¥4¥1¥.u¥+Y¥(<¥%¥"¥¥¥¥¥t¥V¥ ;¥ ¥¥¤¤¤¤r¤V¤9¤¤¤¤¤¤ݍ¤p¤S¤7¤¥ܻ¥ٞ¥ց¥f¥I¥+¥¥¥¥¥¥¥c¥F¥*¥ ¥¥¥¥¥~¥a¥D¥'¥ ¥¥¥¥¥{¥_¥|B¥y%¥v¥r¥o¥l¥i¥fx¥c]¥`@¥]$¥Z¥V¥S¥P¥M¥Jw¥GZ¥D=¥A!¥>¥:¥7¥4¥1¥.u¥+X¥(;¥%¥"¥¥¥¥¥r¥V¥ 9¥ ¥¥¤¤¤¤q¤T¤7¤¤¤¤¤¤݋¤o¤R¤5¤¥ܽ¥١¥ք¥h¥K¥.¥¥¥¥¥¥¥e¥H¥+¥¥¥¥¥¥~¥b¥E¥(¥ ¥¥¥¥¥{¥_¥|B¥y'¥v ¥r¥o¥l¥i¥fz¥c]¥`@¥]$¥Z¥V¥S¥P¥M¥Jw¥GZ¥D=¥A!¥>¥:¥7¥4¥1¥.t¥+W¥(:¥%¥"¥¥¥¥¥r¥U¥ 8¥ ¥¥¤¤¤¤o¤R¤5¤¤¤¤¤¤݈¤l¤O¤2¤¥ܿ¥٣¥ֆ¥i¥L¥/¥¥¥¥¥¥¥g¥I¥,¥¥¥¥¥¥¥d¥G¥*¥¥¥¥¥¥}¥_¥|B¥y'¥v ¥r¥o¥l¥i¥fz¥c]¥`@¥]$¥Z¥V¥S¥P¥M¥Jw¥GZ¥D=¥A!¥>¥:¥7¥4¥1¥.s¥+V¥(:¥%¥"¥¥¥¥¥p¥S¥ 7¥ ¥¥¤¤¤¤m¤P¤4¤¤¤¤¤¤݇¤j¤M¤1¤¥¥٦¥։¥l¥O¥3¥¥¥¥¥¥¥h¥L¥/¥¥¥¥¥¥¥e¥H¥+¥¥¥¥¥¥~¥a¥|D¥y'¥v ¥r¥o¥l¥i¥fz¥c]¥`@¥]$¥Z¥V¥S¥P¥M¥Jw¥GX¥D=¥A ¥>¥:¥7¥4¥1¥.s¥+V¥(:¥%¥!¥¥¥¥¥n¥S¥ 6¥ ¥¥¤¤¤¤l¤N¤1¤¤¤¤¤¤݄¤g¤J¤-¤¥¥٩¥֌¥n¥Q¥4¥¥¥¥¥¥¥j¥M¥0¥¥¥¥¥¥¥f¥I¥,¥¥¥¥¥¥~¥b¥|E¥y(¥v ¥r¥o¥l¥i¥f{¥c^¥`@¥]$¥Z¥V¥S¥P¥M¥Ju¥GX¥D=¥A ¥>¥:¥7¥4¥1¥.s¥+V¥(8¥%¥!¥¥¥¥¥m¥P¥ 4¥ ¥¥¤¤¤¤i¤M¤0¤¤¤¤¤¤݂¤f¤H¤+¤¥¥٪¥֍¥q¥T¥7¥¥¥¥¥¥¥l¥O¥3¥¥¥¥¥¥¥g¥J¥-¥¥¥¥¥¥¥b¥|F¥y)¥v ¥r¥o¥l¥i¥f{¥c^¥`A¥]$¥Z¥V¥S¥P¥M¥Ju¥GX¥D=¥A¥>¥:¥7¥4¥1¥.q¥+T¥(7¥%¥!¥¥¥¥¥l¥P¥ 3¥ ¥¥¤¤¤¤h¤K¤.¤¤¤¤¤¤¤d¤G¤)¤ ¥¥٬¥֑¥t¥U¥9¥¥¥¥¥¥¥n¥Q¥3¥¥¥¥¥¥¥g¥L¥/¥¥¥¥¥¥¥c¥|F¥y)¥v ¥r¥o¥l¥i¥f{¥c^¥`A¥]$¥Z¥V¥S¥P¥M¥Ju¥GX¥D;¥A¥>¥:¥7¥4¥1¥.p¥+S¥(7¥%¥!¥¥¥¥¥l¥N¥ 1¥ ¥¥¤¤¤¤f¤I¤,¤¤¤¤¤¤~¤a¤D¤'¤ ¥¥ٯ¥֒¥u¥X¥;¥¥¥¥¥¥¥o¥R¥5¥¥¥¥¥¥¥j¥L¥0¥¥¥¥¥¥¥e¥|F¥y*¥v ¥r¥o¥l¥i¥f{¥c_¥`A¥]$¥Z¥V¥S¥P¥M¥Ju¥GX¥D;¥A¥>¥:¥7¥4¥1¥.p¥+S¥(6¥%¥!¥¥¥¥¥i¥L¥ 1¥ ¥¥¤¤¤¤d¤G¤*¤ ¤¤¤¤¤|¤^¤A¤$¤¥¥ٳ¥֔¥w¥Z¥=¥ ¥¥¥¥¥¥q¥U¥7¥¥¥¥¥¥¥k¥N¥0¥¥¥¥¥¥¥e¥|H¥y*¥v ¥r¥o¥l¥i¥f{¥c_¥`A¥]$¥Z¥V¥S¥P¥M¥Ju¥GX¥D;¥A¥>¥:¥7¥4¥1¥.o¥+R¥(5¥%¥!¥¥¥¥¥i¥L¥ .¥ ¥¥¤¤¤¤c¤F¤'¤ ¤¤¤¤¤y¤]¤?¤"¤¥¥ٴ¥֗¥z¥]¥?¥#¥¥¥¥¥¥s¥V¥9¥¥¥¥¥¥¥m¥O¥2¥¥¥¥¥¥¥e¥|I¥y*¥v ¥r¥o¥l¥i¥f|¥c_¥`B¥]$¥Z¥V¥S¥P¥M¥Ju¥GX¥D:¥A¥>¥:¥7¥4¥1¥.o¥+P¥(3¥%¥!¥¥¥¥¥h¥J¥ .¥ ¥¥¤¤¤~¤`¤D¤&¤ ¤¤¤¤¤v¤Y¤>¤¤¥¥ٷ¥֚¥|¥^¥B¥$¥¥¥¥¥¥u¥W¥:¥¥¥¥¥¥¥n¥Q¥2¥¥¥¥¥¥¥f¥|I¥y,¥v¥r¥o¥l¥i¥f|¥c_¥`B¥]$¥Z¥V¥S¥P¥M¥Ju¥GW¥D:¥A¥>¥:¥7¥4¥1¥.m¥+P¥(3¥%¥!¥¥¥¥¥f¥J¥ +¥ ¥¥¤¤¤|¤_¤B¤%¤¤¤¤¤¤u¤W¤;¤¤¥¥ٹ¥֜¥~¥a¥D¥'¥ ¥¥¥¥¥w¥Y¥<¥¥¥¥¥¥¥o¥R¥4¥¥¥¥¥¥¥g¥|J¥y-¥v¥r¥o¥l¥i¥f|¥c_¥`B¥]$¥Z¥V¥S¥P¥M¥Ju¥GW¥D:¥A¥=¥:¥7¥4¥1¥.l¥+P¥(2¥%¥!¥¥¥¥¥f¥G¥ *¥ ¥¥¤¤¤{¤^¤@¤"¤¤¤¤¤¤s¤V¤7¤¤¥¥ټ¥֟¥Ӏ¥c¥F¥)¥ ¥¥¥¥¥x¥[¥>¥ ¥¥¥¥¥¥p¥R¥6¥¥¥¥¥¥¥h¥|J¥y-¥v¥r¥o¥l¥i¥f}¥c_¥`B¥]%¥Z¥V¥S¥P¥M¥Ju¥GW¥D:¥A¥=¥:¥7¥4¥1¥.l¥+O¥(1¥%¥!¥¥¥¥¥c¥G¥ )¥ ¥¥¤¤¤y¤[¤>¤!¤¤¤¤¤¤p¤S¤6¤¤¥¥پ¥֠¥Ӄ¥f¥G¥*¥ ¥¥¥¥¥z¥]¥@¥"¥¥¥¥¥¥r¥U¥6¥¥¥¥¥¥¥h¥|K¥y-¥v¥r¥o¥l¥i¥f}¥c_¥`B¥]%¥Z¥V¥S¥P¥M¥Jt¥GW¥D:¥A¥=¥:¥7¥4¥1¥.l¥+N¥(1¥%¥!¥¥¥¥¥c¥E¥ (¥ ¥¥¤¤¤w¤Z¤=¤¤¤¤¤¤¤o¤P¤3¤¤¥¥¥֢¥Ӆ¥g¥K¥-¥¥¥¥¥¥|¥^¥A¥$¥¥¥¥¥¥s¥U¥8¥¥¥¥¥¥¥j¥|M¥y.¥v¥r¥o¥l¥i¥f}¥c`¥`C¥]%¥Z¥V¥S¥P¥M¥Jt¥GV¥D:¥A¥=¥:¥7¥4¥1¥.k¥+M¥(0¥%¥!¥¥¥¥¥b¥C¥ &¥ ¥¥¤¤¤u¤X¤;¤¤¤¤¤¤¤l¤N¤2¤¤¥¥¥֥¥ӈ¥j¥M¥0¥¥¥¥¥¥}¥`¥B¥&¥¥¥¥¥¥t¥V¥9¥¥¥¥¥¥¥k¥|M¥y0¥v¥r¥o¥l¥i¥f¥c`¥`C¥]%¥Z¥V¥S¥P¥M¥Jt¥GV¥D9¥A¥=¥:¥7¥4¥1¥.j¥+M¥(.¥%¥!¥¥¥¥}¥`¥B¥ %¥ ¥¥¤¤¤s¤W¤9¤¤¤¤¤¤¤j¤M¤.¤¤¥¥¥֨¥Ӊ¥l¥O¥2¥¥¥¥¥¥¥b¥E¥&¥ ¥¥¥¥¥u¥X¥:¥¥¥¥¥¥¥k¥|N¥y0¥v¥r¥o¥l¥i¥f¥c`¥`C¥]%¥Z¥V¥S¥P¥M¥Jt¥GV¥D9¥A¥=¥:¥7¥4¥1¥.j¥+K¥(.¥%¥!¥¥¥¥|¥_¥A¥ $¥ ¥¥¤¤¤s¤U¤8¤¤¤¤¤¤¤g¤J¤,¤¤¥¥¥֪¥ӌ¥o¥R¥3¥¥¥¥¥¥¥d¥F¥)¥ ¥¥¥¥¥w¥X¥;¥¥¥¥¥¥¥k¥|N¥y0¥v¥r¥o¥l¥i¥f¥c`¥`C¥]%¥Z¥V¥S¥P¥M¥Js¥GV¥D8¥A¥=¥:¥7¥4¥1¥.j¥+K¥(.¥%¥!¥¥¥¥|¥^¥A¥ #¥ ¥¥¤¤¤p¤S¤5¤¤¤¤¤¤¤f¤H¤+¤ ¤¥¥¥֭¥Ӑ¥q¥S¥5¥¥¥¥¥¥¥e¥H¥*¥ ¥¥¥¥¥x¥[¥=¥¥¥¥¥¥¥l¥|O¥y1¥v¥r¥o¥l¥i¥f¥cb¥`C¥]&¥Z¥V¥S¥P¥M¥Js¥GV¥D8¥A¥=¥:¥7¥4¥1¥.h¥+J¥(-¥%¥!¥¥¥¥z¥]¥>¥ !¥ ¥¥¤¤¤o¤Q¤4¤¤¤¤¤¤¤c¤E¤(¤ ¤¥¥¥֮¥ӑ¥t¥U¥8¥¥¥¥¥¥¥g¥J¥+¥¥¥¥¥¥y¥[¥>¥ ¥¥¥¥¥¥m¥|O¥y2¥v¥r¥o¥l¥i¥f¥cb¥`C¥]&¥Z¥V¥S¥P¥M¥Js¥GV¥D8¥A¥=¥:¥7¥4¥1¥.g¥+J¥(,¥%¥!¥¥¥¥z¥[¥>¥ ¥ ¥¥¤¤¤m¤P¤1¤¤¤¤¤¤¤a¤D¤%¤¤¥¥¥ֲ¥ӓ¥v¥W¥:¥¥¥¥¥¥¥i¥K¥.¥¥¥¥¥¥{¥\¥?¥!¥¥¥¥¥¥o¥|P¥y3¥v¥r¥o¥l¥i¥f¥cb¥`C¥]&¥Z¥V¥S¥P¥M¥Js¥GV¥D6¥A¥=¥:¥7¥4¥1¥.f¥+I¥(*¥% ¥!¥¥¥¥x¥Z¥<¥ ¥ ¥¥¤¤¤k¤N¤0¤¤¤¤¤¤}¤^¤A¤#¤¤¥¥¥ִ¥Ӗ¥x¥[¥<¥¥¥¥¥¥¥k¥N¥/¥¥¥¥¥¥|¥]¥?¥"¥¥¥¥¥¥o¥|R¥y3¥v¥r¥o¥l¥i¥f¥cb¥`C¥]&¥Z¥V¥S¥P¥M¥Js¥GU¥D6¥A¥=¥:¥7¥4¥1¥.f¥+H¥(*¥% ¥!¥¥¥¥v¥Y¥:¥ ¥¥¥¤¤¤j¤L¤/¤¤¤¤¤¤z¤]¤?¤ ¤¤¥¥¥ֶ¥ә¥z¥\¥>¥ ¥¥¥¥¥¥m¥O¥0¥¥¥¥¥¥}¥_¥B¥#¥¥¥¥¥¥p¥|R¥y3¥v¥r¥o¥l¥i¥f¥cb¥`E¥]&¥Z¥V¥S¥P¥M¥Jr¥GU¥D6¥A¥=¥:¥7¥4¥1¥.f¥+H¥()¥% ¥!¥¥¥¥v¥X¥9¥ ¥¥¥¤¤¤g¤J¤,¤¤¤¤¤¤y¤Z¤<¤¤¤¥¥¥ָ¥ӛ¥}¥^¥@¥"¥¥¥¥¥¥n¥P¥2¥¥¥¥¥¥~¥`¥B¥%¥¥¥¥¥¥p¥|R¥y5¥v¥r¥o¥l¥i¥f¥cb¥`E¥]&¥Z¥V¥S¥P¥M¥Jr¥GU¥D6¥A¥=¥:¥7¥4¥1¥.e¥+F¥((¥% ¥!¥¥¥¥u¥V¥8¥ ¥¥¥¤¤¤f¤H¤+¤ ¤¤¤¤¤v¤X¤;¤¤¤¥¥¥ֻ¥Ӝ¥¥`¥C¥$¥¥¥¥¥¥p¥Q¥4¥¥¥¥¥¥¥a¥C¥&¥¥¥¥¥¥q¥|S¥y5¥v¥r¥o¥l¥i¥f¥cb¥`E¥]&¥Z¥V¥S¥P¥M¥Jr¥GS¥D6¥A¥=¥:¥7¥4¥1¥.c¥+E¥((¥% ¥!¥¥¥¥s¥U¥8¥ ¥¥¥¤¤¤d¤G¤(¤ ¤¤¤¤¤t¤W¤8¤¤¤¥¥¥ֽ¥ӟ¥Ё¥d¥D¥'¥ ¥¥¥¥¥r¥T¥6¥¥¥¥¥¥¥c¥F¥&¥ ¥¥¥¥¥q¥|T¥y6¥v¥r¥o¥l¥i¥f¥cc¥`E¥]&¥Z¥V¥S¥P¥M¥Jr¥GS¥D6¥A¥=¥:¥7¥4¥1¥.c¥+E¥('¥%¥!¥¥¥¥r¥T¥5¥ ¥¥¥¤¤¤d¤E¤'¤ ¤¤¤¤¤r¤T¤6¤¤¤¥¥¥¥ӡ¥Ѓ¥e¥F¥(¥ ¥¥¥¥¥s¥U¥8¥¥¥¥¥¥¥d¥F¥'¥ ¥¥¥¥¥s¥|V¥y6¥v¥r¥o¥l¥i¥f¥cc¥`E¥]&¥Z¥V¥S¥P¥M¥Jr¥GS¥D5¥A¥=¥:¥7¥4¥1¥.b¥+D¥(%¥%¥!¥¥¥¥q¥R¥5¥ ¥¥¥¤¤¤a¤C¤&¤¤¤¤¤¤p¤R¤3¤¤¤¥¥¥¥Ӥ¥І¥g¥I¥+¥ ¥¥¥¥¥v¥V¥8¥¥¥¥¥¥¥e¥G¥(¥ ¥¥¥¥¥t¥|V¥y7¥v¥r¥o¥l¥i¥f¥cc¥`F¥]&¥Z¥V¥S¥P¥M¥Jr¥GS¥D5¥A¥=¥:¥7¥4¥1¥.b¥+D¥(%¥%¥!¥¥¥¥o¥Q¥3¥ ¥¥¥¤¤}¤`¤B¤#¤¤¤¤¤¤o¤O¤2¤¤¤¥¥¥¥ӧ¥Ј¥i¥J¥-¥¥¥¥¥¥w¥Y¥;¥¥¥¥¥¥¥f¥H¥*¥ ¥¥¥¥¥t¥|V¥y7¥v¥r¥o¥l¥i¥f¥cd¥`F¥]&¥Z¥V¥S¥P¥M¥Jr¥GS¥D5¥A¥=¥:¥7¥4¥1¥.a¥+B¥($¥%¥!¥¥¥¥n¥P¥2¥ ¥¥¥¤¤}¤]¤?¤"¤¤¤¤¤¤k¤N¤/¤¤¤¥¥¥¥Ө¥Љ¥l¥M¥/¥¥¥¥¥¥y¥Z¥<¥¥¥¥¥¥¥h¥I¥+¥ ¥¥¥¥¥u¥|W¥y8¥v¥r¥o¥l¥i¥f¥cd¥`F¥]&¥Z ¥V¥S¥P¥M¥Jr¥GS¥D4¥A¥=¥:¥7¥4¥1¥._¥+A¥(#¥%¥!¥¥¥¥m¥O¥0¥ ¥¥¥¤¤z¤\¤>¤¤¤¤¤¤¤i¤K¤-¤¤¤¥¥¥¥Ӫ¥Ќ¥n¥O¥1¥¥¥¥¥¥{¥]¥>¥¥¥¥¥¥¥i¥K¥,¥¥¥¥¥¥v¥|X¥y8¥v¥r¥o¥l¥i¥f¥cd¥`F¥]&¥Z ¥V¥S¥P¥M¥Jr¥GS¥D4¥A¥=¥:¥7¥4¥1~¥._¥+A¥("¥%¥!¥¥¥¥m¥M¥/¥ ¥¥¥¤¤y¤[¤;¤¤¤¤¤¤¤h¤I¤*¤ ¤¤¥¥¥¥ӭ¥Џ¥p¥R¥4¥¥¥¥¥¥|¥^¥@¥!¥¥¥¥¥¥j¥L¥.¥¥¥¥¥¥v¥|X¥y:¥v¥r¥o¥l¥i¥f¥cd¥`F¥](¥Z ¥V¥S¥P¥M¥Jp¥GR¥D4¥A¥=¥:¥7¥4¥1}¥.^¥+@¥("¥%¥!¥¥¥¥j¥L¥.¥ ¥¥¥¤¤w¤X¤:¤¤¤¤¤¤¤d¤F¤(¤ ¤¤¥ ¥¥¥ӯ¥Б¥s¥S¥5¥¥¥¥¥¥~¥_¥A¥#¥¥¥¥¥¥l¥M¥/¥¥¥¥¥¥x¥|X¥y:¥v¥r¥o¥l¥i¥f¥ce¥`F¥](¥Z ¥V¥S¥P¥M¥Jp¥GR¥D4¥A¥=¥:¥7¥4¥1}¥.^¥+@¥("¥%¥!¥¥¥¥j¥K¥,¥ ¥¥¥¤¤u¤W¤9¤¤¤¤¤¤¤c¤E¤&¤¤¤¥¥¥¥ӱ¥В¥t¥V¥7¥¥¥¥¥¥¥a¥B¥$¥¥¥¥¥¥m¥N¥/¥¥¥¥¥¥x¥|Y¥y;¥v¥r¥o¥l¥i¥f¥ce¥`F¥](¥Z ¥V¥S¥P¥M¥Jp¥GR¥D4¥A¥=¥:¥7¥4¥1}¥.]¥+?¥( ¥%¥!¥¥¥¥i¥K¥+¥ ¥¥¥¤¤t¤T¤6¤¤¤¤¤¤¤a¤B¤$¤¤¤¥¥¥¥ӳ¥Е¥w¥X¥:¥¥¥¥¥¥¥c¥D¥%¥¥¥¥¥¥n¥P¥0¥¥¥¥¥¥y¥|[¥y<¥v¥r¥o¥l¥i¥f¥ce¥`F¥](¥Z ¥V¥S¥P¥M¥Jp¥GR¥D2¥A¥=¥:¥7¥4¥1{¥.]¥+=¥(¥%¥!¥¥¥¥g¥H¥*¥ ¥¥¥¤¤s¤T¤6¤¤¤¤¤¤~¤_¤@¤!¤¤¤¥¥¥¥ӷ¥З¥x¥Z¥;¥¥¥¥¥¥¥d¥F¥(¥¥¥¥¥¥o¥Q¥1¥¥¥¥¥¥z¥|[¥y<¥v¥r¥o¥l¥i¥f¥ce¥`F¥](¥Z ¥V¥S¥P¥M¥Jo¥GQ¥D2¥A¥=¥:¥7¥4¥1z¥.\¥+=¥(¥$¥!¥¥¥¥g¥H¥)¥ ¥¥¥¤¤q¤R¤4¤¤¤¤¤¤{¤]¤=¤¤¤¤¥¥¥¥Ӹ¥К¥|¥\¥=¥¥¥¥¥¥¥f¥G¥)¥ ¥¥¥¥¥q¥Q¥3¥¥¥¥¥¥z¥|\¥y<¥v¥s¥o¥l¥i¥f¥ce¥`G¥](¥Z ¥V¥S¥P¥M¥Jo¥GQ¥D2¥A¥=¥:¥7¥4¥1z¥.Z¥+<¥(¥$¥!¥¥¥¥e¥F¥'¥ ¥¥¥¤¤o¤Q¤2¤¤¤¤¤¤y¤Z¤<¤¤¤¤¥¥¥¥ӻ¥Н¥}¥_¥@¥!¥¥¥¥¥¥h¥J¥*¥ ¥¥¥¥¥r¥T¥4¥¥¥¥¥¥{¥|\¥y>¥v¥s¥o¥l¥i¥f¥ce¥`G¥])¥Z ¥V¥S¥P¥M¥Jo¥GQ¥D1¥A¥=¥:¥7¥4¥1y¥.Z¥+;¥(¥$¥!¥¥¥¥d¥D¥&¥ ¥¥¥¤¤n¤O¤0¤¤¤¤¤¤w¤Y¤9¤¤¤¤н¥¥¥¥Ӽ¥О¥̀¥`¥B¥#¥¥¥¥¥¥j¥J¥,¥ ¥¥¥¥¥s¥T¥5¥¥¥¥¥¥{¥|]¥y?¥v¥s¥o¥l¥i¥f¥ce¥`G¥])¥Z ¥V¥S¥P¥M¥Jo¥GP¥D1¥A¥=¥:¥7¥4¥1y¥.Z¥+;¥(¥$¥!¥¥¥¥c¥D¥%¥ ¥¥¥¤¤k¤M¤.¤¤¤¤¤¤u¤V¤7¤¤¤¤м¥¥¥¥¥Р¥́¥b¥C¥%¥¥¥¥¥¥l¥L¥.¥¥¥¥¥¥t¥U¥7¥¥¥¥¥¥}¥|^¥y?¥v¥s¥o¥l¥i¥f¥cg¥`G¥])¥Z ¥V¥S¥P¥M¥Jo¥GP¥D1¥A¥=¥:¥7¥4¥1w¥.Y¥+;¥(¥$¥!¥¥¥¥a¥B¥$¥ ¥¥¥¤¤k¤K¤-¤¤¤¤¤¤r¤T¤5¤¤¤¤к¥¥¥¥¥У¥ͅ¥e¥E¥'¥¥¥¥¥¥m¥N¥/¥¥¥¥¥¥v¥V¥8¥¥¥¥¥¥}¥|^¥y?¥v!¥s¥o¥l¥i¥f¥cg¥`H¥])¥Z ¥V¥S¥P¥M¥Jo¥GP¥D1¥A¥=¥:¥7¥4¥1w¥.X¥+:¥(¥$¥!¥¥¥¥`¥B¥"¥ ¥¥¥¤¤i¤I¤+¤ ¤¤¤¤¤q¤S¤3¤¤¤¤з¥!¥¥¥¥Х¥͆¥h¥H¥*¥ ¥¥¥¥¥o¥P¥1¥¥¥¥¥¥v¥W¥8¥¥¥¥¥¥~¥|`¥y@¥v!¥s¥o¥l¥i¥f¥cg¥`H¥])¥Z ¥V¥S¥P¥M¥Jo¥GP¥D1¥A¥=¥:¥7¥4¥1v¥.W¥+8¥(¥$¥!¥¥¥¥_¥A¥!¥ ¥¥¥¤¤g¤H¤)¤ ¤¤¤¤¤n¤P¤0¤¤¤¤е¥$¥¥¥¥Ч¥͈¥i¥K¥+¥ ¥¥¥¥¥p¥R¥2¥¥¥¥¥¥x¥Y¥9¥¥¥¥¥¥¥|`¥yA¥v"¥s¥o¥l¥i¥f¥ch¥`H¥])¥Z ¥V¥S¥P¥M¥Jo¥GP¥D1¥A¥=¥:¥7¥4¥1v¥.W¥+8¥(¥$¥!¥¥¥}¥^¥?¥ ¥ ¥¥¥¤¤e¤F¤'¤¤¤¤¤¤l¤M¤.¤¤¤¤в¥&¥¥¥¥Щ¥͊¥k¥L¥-¥¥¥¥¥¥r¥S¥5¥¥¥¥¥¥z¥Z¥<¥¥¥¥¥¥¥|a¥yA¥v#¥s¥o¥l¥i¥f¥ch¥`H¥]*¥Z ¥V¥S¥P¥M¥Jo¥GP¥D0¥A¥=¥:¥7¥4¥1u¥.W¥+7¥(¥$¥!¥¥¥|¥\¥>¥¥ ¥¥¥¤¤c¤E¤&¤¤¤¤¤¤j¤K¤-¤ ¤¤¤Я¥)¥ ¥¥¥Ь¥͎¥n¥N¥/¥¥¥¥¥¥t¥T¥6¥¥¥¥¥¥z¥[¥<¥¥¥¥¥¥¥|a¥yA¥v#¥s¥o¥l¥i¥f¥ch¥`H¥]*¥Z ¥V¥S¥P¥M¥Jn¥GP¥D0¥A¥=¥:¥7¥4¥1u¥.U¥+6¥(¥$¥!¥¥¥{¥[¥<¥¥ ¥¥¥¤¤b¤C¤$¤¤¤¤¤¤i¤J¤*¤ ¤¤¤Э¥+¥ ¥¥¥Ю¥͏¥o¥Q¥1¥¥¥¥¥¥u¥W¥7¥¥¥¥¥¥|¥\¥=¥¥¥¥¥¥¥|b¥yC¥v#¥s¥o¥l¥i¥f¥ch¥`H¥]*¥Z ¥V¥S¥P¥M¥Jn¥GN¥D0¥A¥=¥:¥7¥4¥1t¥.T¥+4¥(¥$¥!¥¥¥{¥[¥<¥¥ ¥¥¥¤¤a¤A¤"¤¤¤¤¤¤e¤G¤'¤¤¤¤Ь¥.¥¥¥¥а¥͑¥r¥R¥3¥¥¥¥¥¥x¥X¥8¥¥¥¥¥¥|¥^¥>¥¥¥¥¥¥¥|d¥yD¥v$¥s¥o¥l¥i¥f¥ch¥`H¥]*¥Z ¥V¥S¥P¥M¥Jn¥GN¥D/¥A¥=¥:¥7¥4¥1t¥.T¥+4¥(¥$¥!¥¥¥x¥Z¥:¥¥ ¥¥¥¤~¤^¤@¤ ¤¤¤¤¤¤d¤E¤%¤¤¤¤Ш¥1¥¥¥¥в¥͔¥t¥U¥5¥¥¥¥¥¥y¥Y¥:¥¥¥¥¥¥¥_¥?¥ ¥¥¥¥¥¥|d¥yD¥v&¥s¥o¥l¥i¥f¥ch¥`H¥]*¥Z ¥V¥S¥P¥M¥Jn¥GN¥D/¥A¥=¥:¥7¥4¥1r¥.T¥+4¥(¥$¥!¥¥¥w¥Y¥9¥¥ ¥¥¥¤}¤]¤=¤¤¤¤¤¤¤c¤C¤$¤¤¤¤Х¥2¥¥¥¥е¥͖¥w¥W¥8¥¥¥¥¥¥{¥\¥<¥¥¥¥¥¥¥`¥A¥!¥¥¥¥¥¥|d¥yE¥v&¥s¥o¥l¥i¥f¥ch¥`H¥]*¥Z ¥V¥S¥P¥M¥Jn¥GN¥D/¥A¥=¥:¥7¥4¥1r¥.S¥+3¥(¥$¥!¥¥¥w¥W¥8¥¥ ¥¥¥¤{¤\¤<¤¤¤¤¤¤¤`¤A¤!¤¤¤¤У¥4¥¥¥¥з¥͘¥x¥Y¥9¥¥¥¥¥¥}¥]¥=¥¥¥¥¥¥¥`¥A¥"¥¥¥¥¥¥|e¥yE¥v&¥s¥o¥l¥i¥f¥ci¥`J¥]*¥Z ¥V¥S¥P¥M¥Jm¥GM¥D-¥A¥=¥:¥7¥4¥1q¥.Q¥+2¥(¥$¥!¥¥¥v¥V¥6¥¥ ¥¥¥¤y¤Y¤:¤¤¤¤¤¤}¤^¤>¤¤¤¤¤С¥8¥¥¥¥к¥͙¥{¥[¥;¥¥¥¥¥¥~¥^¥?¥¥¥¥¥¥¥c¥C¥"¥¥¥¥¥¥|f¥yF¥v'¥s¥o¥l¥i¥f¥ci¥`J¥]*¥Z ¥V¥S¥P¥M¥Jm¥GM¥D-¥A¥=¥:¥7¥4¥1p¥.Q¥+2¥(¥$¥!¥¥¥t¥U¥5¥¥ ¥¥¥¤x¤X¤8¤¤¤¤¤¤|¤\¤=¤¤¤¤ӿ¤П¥;¥¥¥¥л¥͝¥}¥^¥=¥¥¥¥¥¥¥`¥@¥ ¥¥¥¥¥¥c¥E¥%¥¥¥¥¥¥|g¥yF¥v'¥s¥o¥l¥i¥f¥ci¥`J¥]*¥Z ¥V¥S¥P¥M¥Jm¥GM¥D-¥A¥=¥:¥7¥4¥1p¥.P¥+1¥(¥$¥!¥¥¥s¥S¥4¥¥ ¥¥¥¤v¤W¤7¤¤¤¤¤¤z¤Z¤:¤¤¤¤ӻ¤М¥=¥¥¥¥п¥͞¥~¥_¥?¥ ¥¥¥¥¥¥b¥C¥#¥¥¥¥¥¥d¥E¥%¥¥¥¥¥¥|g¥yH¥v(¥s ¥o¥l¥i¥f¥ci¥`J¥]*¥Z ¥V¥S¥P¥M¥Jm¥GM¥D-¥A¥=¥:¥7¥4¥1p¥.P¥+/¥(¥$¥!¥¥¥r¥R¥3¥¥ ¥¥¥¤u¤U¤6¤¤¤¤¤¤w¤W¤8¤¤¤¤ӹ¤К¥?¥¥¥¥¥͡¥ʁ¥a¥B¥"¥¥¥¥¥¥c¥D¥$¥¥¥¥¥¥g¥F¥&¥¥¥¥¥¥|g¥yH¥v)¥s ¥o¥l¥i¥f¥ck¥`J¥]*¥Z ¥V¥S¥P¥M¥Jm¥GM¥D-¥A ¥=¥:¥7¥4¥1o¥.O¥+/¥(¥$¥!¥¥¥q¥Q¥1¥¥ ¥¥¥¤r¤S¤3¤¤¤¤¤¤v¤V¤5¤¤¤¤ӷ¤З¥A¥"¥¥¥¥͢¥ʄ¥d¥C¥$¥¥¥¥¥¥e¥E¥%¥¥¥¥¥¥g¥G¥'¥¥¥¥¥¥|i¥yI¥v)¥s ¥o¥l¥i¥f¥ck¥`K¥]*¥Z ¥V¥S¥P¥M¥Jm¥GM¥D,¥A ¥=¥:¥7¥4¥1m¥.N¥+/¥(¥$¥!¥¥¥o¥P¥0¥¥ ¥¥¥¤q¤R¤2¤¤¤¤¤¤s¤T¤4¤¤¤¤Ӵ¤Е¥D¥%¥¥¥¥ͦ¥ʅ¥e¥F¥&¥¥¥¥¥¥g¥F¥'¥¥¥¥¥¥h¥H¥'¥ ¥¥¥¥¥|j¥yI¥v)¥s ¥o¥l¥i¥f¥ck¥`K¥]+¥Z ¥V¥S¥P¥M¥Jm¥GM¥D,¥A ¥=¥:¥7¥4¥1m¥.N¥+.¥( ¥$¥!¥¥¥n¥N¥/¥¥ ¥¥¥¤p¤P¤1¤¤¤¤¤¤q¤Q¤1¤¤¤¤Ӳ¤В¥H¥'¥¥¥¥ͧ¥ʇ¥h¥H¥'¥¥¥¥¥¥h¥I¥(¥¥¥¥¥¥i¥J¥*¥ ¥¥¥¥¥|j¥yJ¥v+¥s ¥o¥l¥i¥f¥ck¥`K¥]+¥Z ¥V¥S¥P¥M¥Jm¥GL¥D,¥A ¥=¥:¥7¥4¥1m¥.L¥+-¥( ¥$¥!¥¥¥n¥M¥-¥¥ ¥¥¥¤o¤N¤.¤¤¤¤¤¤o¤P¤/¤¤¤¤ӯ¤А¥J¥)¥¥¥¥ͪ¥ʊ¥j¥I¥*¥ ¥¥¥¥¥j¥J¥+¥ ¥¥¥¥¥j¥J¥+¥ ¥¥¥¥¥|j¥yL¥v+¥s ¥o¥l¥i¥f¥ck¥`K¥]+¥Z ¥V¥S¥P¥M¥Jk¥GL¥D+¥A ¥=¥:¥7¥4¥1l¥.K¥+,¥( ¥$¥!¥¥¥m¥L¥,¥ ¥ ¥¥¥¤l¤M¤-¤ ¤¤¤¤¤m¤M¤.¤ ¤¤¤ӭ¤Ѝ¥K¥,¥ ¥¥¥ͬ¥ʌ¥l¥K¥,¥ ¥¥¥¥¥k¥K¥,¥ ¥¥¥¥¥l¥L¥+¥ ¥¥¥¥¥|k¥yL¥v,¥s ¥o¥l¥i¥f¥ck¥`L¥]+¥Z ¥V¥S¥P¥M¥Jk¥GL¥D+¥A ¥=¥:¥7¥4¥1k¥.K¥+,¥( ¥$¥!¥¥¥k¥L¥+¥ ¥ ¥¥¥¤k¤K¤*¤ ¤¤¤¤¤j¤K¤+¤ ¤¤¤ӫ¤Ћ¥N¥.¥¥¥¥ͯ¥ʎ¥m¥O¥.¥ ¥¥¥¥¥n¥M¥-¥¥¥¥¥¥l¥M¥-¥ ¥¥¥¥¥|l¥yL¥v,¥s ¥o¥l¥i¥f¥cl¥`L¥]+¥Z ¥V¥S¥P¥M¥Jk¥GJ¥D+¥A ¥=¥:¥7¥4¥1k¥.K¥+*¥( ¥$¥!¥¥¥j¥I¥*¥ ¥ ¥¥¥¤j¤J¤)¤ ¤¤¤¤¤i¤I¤)¤ ¤¤¤ө¤Ј¥P¥1¥¥¥¥Ͱ¥ʏ¥q¥P¥/¥¥¥¥¥¥o¥O¥.¥¥¥¥¥¥n¥M¥.¥¥¥¥¥¥|n¥yM¥v,¥s ¥o¥l¥i¥f¥cl¥`L¥]+¥Z ¥V¥S¥P¥M¥Jk¥GJ¥D+¥A ¥=¥:¥7¥4¥1i¥.J¥+)¥( ¥$¥!¥¥¥i¥I¥(¥ ¥ ¥¥¥¤h¤G¤(¤¤¤¤¤¤f¤G¤&¤¤¤¤Ӧ¤Ї¥S¥3¥¥¥¥Ͳ¥ʓ¥r¥Q¥2¥¥¥¥¥¥q¥Q¥0¥¥¥¥¥¥p¥O¥.¥¥¥¥¥¥|n¥yN¥v-¥s ¥o¥l¥i¥f¥cl¥`L¥]+¥Z ¥V¥S¥P¥M¥Jk¥GJ¥D+¥A ¥=¥:¥7¥4¥1i¥.I¥+)¥( ¥$¥!¥¥¥h¥H¥'¥¥ ¥¥¥¤f¤F¤%¤¤¤¤¤¤e¤D¤%¤¤¤¤Ӥ¤Є¥W¥6¥¥¥¥͵¥ʔ¥s¥T¥4¥¥¥¥¥¥q¥R¥2¥¥¥¥¥¥p¥P¥0¥¥¥¥¥¥|n¥yN¥v/¥s¥o¥l¥i¥f¥cl¥`L¥]-¥Z ¥V¥S¥P¥M¥Jj¥GJ¥D+¥A ¥=¥:¥7¥4¥1h¥.G¥+)¥(¥$¥!¥¥¥f¥E¥'¥¥ ¥¥¥¤d¤D¤%¤¤¤¤¤¤c¤B¤"¤¤¤¤ӡ¤Ѐ¥X¥7¥¥¥¥͸¥ʗ¥v¥V¥5¥¥¥¥¥¥t¥S¥3¥¥¥¥¥¥r¥Q¥0¥¥¥¥¥¥|o¥yN¥v/¥s¥o¥l¥i¥f¥cm¥`L¥]-¥Z ¥V¥S¥P¥M¥Jj¥GJ¥D*¥A ¥=¥:¥7¥4¥1h¥.G¥+(¥(¥$¥!¥¥¥e¥E¥%¥¥ ¥¥¥¤c¤D¤#¤¤¤¤¤¤a¤@¤ ¤¤¤¤ӟ¤~¥[¥:¥¥¥¥͹¥ʘ¥x¥W¥8¥¥¥¥¥¥u¥V¥5¥¥¥¥¥¥r¥S¥2¥¥¥¥¥¥|p¥yO¥v/¥s¥o¥l¥i¥f¥cm¥`L¥]-¥Z ¥V¥S¥P¥M¥Jj¥GJ¥D*¥A ¥=¥:¥7¥4¥1g¥.G¥+&¥(¥$¥!¥¥¥e¥D¥#¥¥ ¥¥¥¤b¤A¤!¤¤¤¤¤¤_¤?¤¤¤¤ֽ¤ӝ¤}¥]¥>¥¥¥¥ͻ¥ʜ¥z¥Z¥9¥¥¥¥¥¥x¥W¥6¥¥¥¥¥¥s¥S¥3¥¥¥¥¥¥|p¥yQ¥v0¥s¥o¥l¥i¥f¥cm¥`L¥]-¥Z ¥V¥S¥P¥M¥Jj¥GJ¥D*¥A ¥=¥:¥7¥4¥1g¥.F¥+%¥(¥$¥!¥¥¥d¥C¥"¥¥ ¥¥¥¤_¤@¤¤¤¤¤¤}¤\¤;¤¤¤¤ֺ¤Ӛ¤z¥`¥@¥¥¥¥;¥ʝ¥|¥]¥<¥¥¥¥¥¥y¥X¥9¥¥¥¥¥¥u¥U¥4¥¥¥¥¥¥|r¥yQ¥v0¥s¥o¥l¥i¥f¥cn¥`L¥]-¥Z ¥V¥S¥P¥M¥Ji¥GI¥D(¥A ¥=¥:¥7¥4¥1f¥.E¥+%¥(¥$¥!¥¥¥b¥B¥!¥¥ ¥¥¥¤^¤=¤¤¤¤¤¤{¤[¤:¤¤¤¤ֹ¤ӗ¤w¥b¥A¥!¥¥¥¥ʞ¥¥^¥>¥¥¥¥¥¥z¥Y¥9¥¥¥¥¥¥v¥V¥5¥¥¥¥¥¥|r¥yQ¥v1¥s¥o¥l¥i¥f¥cn¥`N¥]-¥Z ¥V¥S¥P¥M¥Ji¥GI¥D(¥A ¥=¥:¥7¥4¥1f¥.E¥+$¥(¥$¥!¥¥¥a¥@¥!¥¥ ¥¥¥~¤]¤<¤¤¤¤¤¤y¤X¤9¤¤¤¤ַ¤Ӗ¤u¥e¥D¥$¥¥¥¥ʢ¥ǁ¥`¥@¥¥¥¥¥¥|¥[¥;¥¥¥¥¥¥w¥V¥7¥¥¥¥¥¥|s¥yR¥v2¥s¥o¥l¥i¥f¥cn¥`N¥]-¥Z ¥V¥S¥P¥M¥Ji¥GI¥D(¥A¥=¥:¥7¥4¥1d¥.E¥+#¥(¥$¥!¥¥¥`¥@¥¥¥ ¥¥¥|¤\¤;¤¤¤¤¤¤w¤W¤6¤¤¤¤ֳ¤ӓ¤r¥g¥F¥&¥¥¥¥ʣ¥ǃ¥c¥A¥!¥¥¥¥¥}¥]¥<¥¥¥¥¥¥x¥X¥7¥¥¥¥¥¥|s¥yS¥v2¥s¥o¥l¥i¥f¥cn¥`N¥]-¥Z ¥V¥S¥P¥M¥Ji¥GH¥D(¥A¥=¥:¥7¥4¥1d¥.C¥+#¥(¥$¥!¥¥¥_¥>¥¥¥ ¥¥¥z¤Z¤9¤¤¤¤¤¤u¤U¤4¤¤¤¤ֲ¤ӑ¤p¥j¥I¥(¥ ¥¥¥ʦ¥Dž¥d¥C¥"¥¥¥¥¥¥_¥>¥¥¥¥¥¥z¥Y¥8¥¥¥¥¥¥|t¥yS¥v2¥s¥o¥l¥i¥f¥cn¥`N¥]-¥Z ¥V¥S¥P¥M¥Ji¥GH¥D(¥A¥=¥:¥7¥4¥1c¥.B¥+#¥(¥$¥!¥¥~¥]¥=¥¥¥ ¥¥¥y¤X¤8¤¤¤¤¤¤s¤R¤2¤¤¤¤֯¤ӎ¤m¥l¥L¥+¥ ¥¥¥ʧ¥Lj¥g¥F¥%¥¥¥¥¥¥a¥?¥¥¥¥¥¥{¥Z¥9¥¥¥¥¥¥|u¥yT¥v4¥s¥o¥l¥i¥f¥cn¥`O¥]-¥Z ¥V¥S¥P¥M¥Ji¥GH¥D'¥A¥=¥:¥7¥4¥1c¥.B¥+!¥(¥$¥!¥¥}¥\¥=¥¥¥ ¥¥¥w¤V¤6¤¤¤¤¤¤p¤Q¤0¤¤¤¤֮¤ӌ¤l¥o¥N¥-¥ ¥¥¥ʪ¥lj¥h¥G¥&¥¥¥¥¥¥a¥A¥¥¥¥¥¥|¥[¥;¥¥¥¥¥¥|u¥yT¥v4¥s¥o¥l¥i¥f¥cn¥`O¥]-¥Z ¥V¥S¥P¥M¥Ji¥GH¥D'¥A¥=¥:¥7¥4¥1b¥.A¥+ ¥'¥$¥!¥¥|¥\¥:¥¥¥ ¥¥¥v¤U¤4¤¤¤¤¤¤o¤N¤-¤ ¤¤¤֪¤Ӊ¤i¥r¥Q¥0¥¥¥¥ʬ¥Nj¥k¥J¥)¥¥¥¥¥¥d¥A¥"¥¥¥¥¥~¥]¥<¥¥¥¥¥¥|w¥yV¥v5¥s¥o¥l¥i¥f¥cp¥`O¥]-¥Z ¥V¥S¥P¥M¥Ji¥GG¥D'¥A¥=¥:¥7¥4¥1a¥.A¥+ ¥'¥$¥!¥¥z¥[¥:¥¥¥ ¥¥¥t¤T¤2¤¤¤¤¤¤n¤L¤,¤ ¤¤¤֧¤ӈ¤f¥t¥S¥2¥¥¥¥ʮ¥ǎ¥l¥K¥+¥ ¥¥¥¥¥e¥D¥#¥¥¥¥¥¥^¥=¥¥¥¥¥¥|w¥yV¥v5¥s¥o¥l¥i¥f¥cp¥`O¥].¥Z ¥V¥S¥P¥M¥Ji¥GG¥D&¥A¥=¥:¥7¥4¥1a¥.@¥+¥'¥$¥!¥¥z¥X¥9¥¥¥ ¥¥¥t¤Q¤1¤¤¤¤¤¤k¤J¤*¤ ¤¤¤֦¤Ӆ¤c¥w¥V¥5¥¥¥¥ʰ¥Ǐ¥n¥N¥-¥ ¥¥¥¥¥g¥E¥$¥¥¥¥¥¥_¥=¥¥¥¥¥¥|x¥yW¥v5¥s¥o¥l¥i¥f¥cp¥`O¥].¥Z ¥V¥S¥P¥M¥Jg¥GG¥D&¥A¥=¥:¥7¥4¥1a¥.>¥+¥'¥$¥!¥¥y¥X¥6¥¥¥ ¥¥¥q¤P¤/¤¤¤¤¤¤i¤I¤'¤¤¤¤֤¤Ӂ¤b]^OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>)>v>]>>>>6>V>M>>->D>>>V>0z> >f>FxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>PH>i(>˹>;>>:?3|?j??~?ip?=a?C>??d?s>\>K>Li>_>>VB>N>U7>}s>5>#>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>S}>>>7>>>>I>?|?j?h?=?`?n?>?E?=i?nj??)C?z?U??? z?z??g?>#j>B>_>]>QOOOOOOOOOOOO>1_|>;:>R#>Z|>\X>g0[>P >D`OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>>Ս>W>Ũ>φ>}>>km?m?$??? ? "? C? Ǜ? A? S? ?? t? 9?'??/K?$X?c?X?%?I?k??>>Y>i>7>>pTOOOOOO>WtR>^,b>u,>x>.J>>>@>r<>]>i>l/OOOOOOOOOOOOOOOOOOOOOOOOOO>}sb>>W>_>^>Ub>?>>S>pF>L???*? RZ? uz? 3? ?q??s?/? m? 9? u? ? Ƨ? /? ԣ? [? ? ך? `? C? n? m?q?)?-H>>L>q>>>c>>Xd>8]>>7>2>P>Uy>/>>>%K>ԫ|>>iY>Ռ>OOOOOOOOOOOOOOOOOOOOOO>`&>>j>>.>>ِE> > >HN>7W>t??=?S? ? t? ӌ? b?]?B'??\=?u;?w?Y??+?M?{??M?I?#????'*? >? ? e?~?~3?>>>|>>ϩ>Ê>)f>N>>8p>:~>3>JD>|8>m>תT>5>>Ķ> >S>S>DR(OOOOOOOOOOOOOOOOOO>eH>W>ĕ>B>S>'>؟v>6>n>>+G>/?R?-?? 2? e? U? >O?D?O?{??\?P?=?^?? ???:??z?0?? q?m?n??xI?? ? ?@??J>ر>4>@>>^> >>>~> >_>>>D>'>ڳ>ҷ&>ɔ>>>>>~>OOOOOOOOOOOOOOO>_5>~>o>s]>S>>Y,>|>n>>+>>?g?? 3?T? E? a? ? _?*???? ??t????S?w????׮?$? ???H?g?(???ռ?E? ? Z?L?6?I?a>8>>> B>~>>0>V>)>k>*>&u>%>Ӭ1>>‡/>Y>><>zOOOOOOOOOO>n@>{s>6W>q>a>|)>'>f>7>ǑU>Ь>㯘>V>ۙ>??=?? ?? ? (5? `? K/?n??Z?x?$?7??v???x?w(?a??$g?*q??Bk?0?%%?7{?Vq??H"?H?&?? ? ? b? NW? ?x? ?">k>&>D>3>>r>>Q,>>5>>>~{>Q>G%>>>'>rOOOOOOO>u>f>>K>:> >+>>1>½k>>>%>2>>??0?|;?5? ? 6? {? ? Fm?M?fp???#???0??J?c????"?.^?B?2|?X?{?x?k/?`>9b>> >ŧ>5>>>>u>9^>r><>r.>>>r>k.>>Q?OOOOOO>&N>|>$>>`>G>U>h>t>@>1>5k>+>>?'?}?F??? ? z? ? _g?-5?&2?P'?~??"??`I?(?-?f?n?=j?X?0B??DF? ?J5?d?_?G??#?q?? ? \??-?z?? V? J? נ?@?(??>X>j>>~>R%>ۦ>>>>ׄ>N|>@>B@>W>>>k>{OOOOO>W> >+>2>z|>σ>[F> >}S>;>N[>g>Z>Q>Mr>x?!>???7? *? c? Y? 4? ??;?%?n?M??un???V???-4?n?? I? ;? ?l??c??|?M??AN??D??ܔ?V ? ??4? ? ??A?+?>>>>E>><>>)>>׀>e>><>> d>7f>>>DOOOO>>J>>hD>IZ>">"=>9>ϑx>ֵ7>e>o>!>>w>?q?B?ו?? /? ? ۍ? ?5?}2??,?^J?n?????'.?Gp?|???U???G???1C? ?V???I?h??:??N??? @? X???b?>j>U>>>q>l> >>>>>B>3>>E>>Ib>>b;OOOO>F>Ol>>T>>>:>Ǜ>&>ׂ>:>*>'>-3>}?.Q?L?@????>??(??L?/?~???~M?t8??H?!?^?G(??o*?0?p?r???U? $|? F??a??Z>G>d!>h>!>&>I>A>xv>V>>iO>>>>>w>v> V>wqOOOOO>>_>9>n>->i0>>6>>&>'>+> 9>ş>:?~??}?? +? ? ;?>?,3?{??F??/?H?,n????R??k?]??z?P??(?($?ʉ?ի?5??^?J?߬?[??Lc??2c? q? \-? ;?K=??j>>n>>>x >>$>O>楉>Z>>0>~>>o> >%>>x>i>2נOOOO>V>o>>޺>VB>>:>.>֐H>^>;>>'>I>?z? ?ME?? Ӌ? ? Df??-??h?R??a??`?^??&??B?o??³?؄?^?\p?#??}??`?|?t?c?1?O??f? w? ? ? ? ,x?Zq?>A>L >S >X>(>7>'>@>yx>>۞>Щ>>C:>%>GL>+>}>D>@>Đ>6/OOOO>7>f-C>y>v>4Y><>k>>n>_->^9>j>$>u>f??z6??? ?? ?? ? ?9???@?G%???l?E8?'??[ ?$?~?w?[??3?y???ì??Ӈ?jT??}???? ? ? ? @? ??]??>>2>ra>1>>O>s> >q*>>@> >>Ќ>ZA>n>>>1>f>yR>2lOOOOO>,,>h͌>>I>>b>9[>@>UZ>م>M>cy>xt>r>J>?c???9?2? H? ? H???΍?C?SN?Ɛ??6?m???*?x???o?k?K???!?T??7?J ?%?:??&? S? ? u?r???2?#>>!t>>>6>5>>;>,>><3>f>u>>?>>d+>>>/>~ >^5>'OOOOOO>+>yu >k>,>GA>Ӵ>T>>>5>N>8>>c?e???? ? ? ??G??J4?]???Γ??$???F2??r?&q???g?Q?nc??'?.o?????x? iu?? r??Q?;??/>X>>0>녹>>>ҝ>>>G> >7><'>>>g>(>ɵ>Z>]>`>>;>?(OOOOOOOO>c> />r>u>n>G>3> ->,>֕>%L>Wp??dk?{??? >? m?C?j?.B??,?z?T????S ????Ȃ??S??F??ʌ??c?V?V@?-??}? x? ?>jj>>T>g>>4o>t>㾴>J>ۓ.><>$>~>>D>l>9>.>>v>m>A> OOOOOOOO>GȖ>n>>v>!>i>N>Y>>>6>SI??e??7? ?? ? K? G?/?=?b?r???g?{?:??E??L??l.?P?X`??C? ?%?T3??k_? ? ? '??i?Q>=B>}>f>>8^>4>ޫ>>ބ!>`>_b>ۉl>T> >><>P>>>;>w>m>>|˴>>Ǚ>ى=OOOOOOOO>=>j>Ɨl>Ւ>8>s>>w>>6>(?j9??9?"?z?? t? ?l???c?0??%Z??E?W2?zy??h?|???\?e? ? ? O? $? 7Z? l? U? ? u?&??Ta?^?A>Pd>>>5(>m>*\>>>ׅ>E>֋>o>ױ>g^>i]>Ƀ>P>>>O>j>\>B>:>2>L>?F>P=`OOOOOOOOO>>@N>ѰL>o*>!>>H\>*_>#>??>?Dd??W?? y? {e??bZ?0??? ?J>??|???O?a8>>O>>I>{>{>d>=7>y}>eg>S>w>>=y>>'>È>>N>W<> >!>I>,>>>~(>9D>h=OOOOOOOOO>>P>|i>x>C>V>>U>3>U???n?ي?G? ? ? p? ??-?7S?Ai???ܾ??JI???]J??D?y5?tF?> ? *? S? ty? F?v??rI?(?;[???z>L>?p>}>>>>5.>;>5c>r>>ɸ>R$>;>>Į>X_>E>> L>>{q>P;>9>ֹ>D>0d>5>z">@a>?Z=@OOOOOOOOO>>>#$>>\>g>[>>>`>m>2?E?|??u? ? K%? D? ?AQ?N?[?$??F?O4? ?&?UA?m??-k?[>> >G>/>>(>'>5>ǀ>ѵ;>ӓ> >>s#>>>]>>">=>>6 >> >O>>>>W}>t.>D=1OOOOOOOOO>>f>QN>>>J >T>>o?B??%b?n??I??B{? .? Â? ? ?]???C?T???d???H?D? ? 6? ? em?e??\?'??Y>Z>>62>F>@>I>>`]>}>p>ҷ>>ʌ>(>H>>>v>`> > >7>A>>>>>>>z>|>`4>9>:==襭OOOOOOOOO>Vҍ>/\>A>} >%>Sd>c>>15>cC? ?Zu??}?u6?K>>)>P>O>̔>>@`>>R>>D>X>Y>%>>u#>>>>0q>x>P> >f>i">>w4>y>>uF>rH>Py>@vA>=OOOOOOOOOO>>6>5>p$>z[>X>$~>h>^P>c>?Z?ː?$d?E?=?d???,? "? ? q? ? u? ^? f? f ? V? ? y? c? G? V? ? 1I??W??R?]$>>.>>>~Y>>ݯ>S>i>>3>> r>ʹ5>k>\>+>;>3>Y>?>(>r>y>V>hZ> >y>>B>~>taa>b&>Vs>Ix>/=ݢOOOOOOOOOO>i>j5>@>}>~>Q>T>>-{>>V?9?=J>N*>?O?{V?U=???h/?;?P? I\? ? ? >? Ԥ? @? ˠ? Z? ~? Gh? ;???s?}? ?KI> >?>>\>j>u>Re>J>L>>Ո>>ӱJ>>j>n> >>`|> >b>>>>y>{>>>@m>+>|>k#>`^>Y>Q"U>>UOOOOOOOOOOO>u>sQ>>ҙT>ڕ>>&>6>w>Cy>F>>>oV>? >(>ǃ????.c????ß?Rp??? ? N? ? ? ? ??S?Q?q?l?>>J>1,>v>P4>Щ>>#>U>={>Э>bW>Ϥ>I&>l>{>>>i>+9>g>r)>>h>|>^Q>Xi>Y)D>s<>6>z>0 >z8>a >[g>Lp>>]&>1OOOOOOOOOOOO>*>'>Ο> >ރ7>$>S>9>L>S>Ա>x>c>>>q>u?B??w?@??k>J>y>w>b>>>>8>|>37>#>ɍ>Ʌ>>>'>>>N>>h>>>x8>b>TKm>RD>U >`Y>L>t>>t>]>P>.e>Z>6>OOOOOOOOOOO>"'>d>>>{>>#>L>>0>[>WE>>V>>>L>+>0>???ξ??[??E??k??- ?]?B?y?ԝ?e|?>>>ꆧ>ib>N)>@p>^>c>0>E>-&>†> >r >9>>>>?>Ӓ>>wx>oT>_ ]>Uo>NT/>M>Q >`>y0>I> >sE>]>G==H=b=OOOOOOOOOOO>r >W>q>,>YO> >>?> >">=>>$>:> s>>>&u>D!>>l>,>{>r>>??v?m?`?>?36??&?ݿ>1>>>$>">ӟ>@>f>>|>>z>z>Z>>g>>>s>u>U>l>c>^m>V*>K/>AMU>AE>C>Nz:>]3>u(>c>">tXU>[>A)OOOOOOOOOOOOOOO>6xD>t>а>>5>^>߂F>j>@Q>>> >>^*>N>R>$>]>{>>>Ic>q>h>>>^>2?i?i?t)???f>$> >>>!>[>Q>/^>>>i,>~>m> >>>M> >A> >}>l>`l >Us>O" >Dn>;h>4[>4u><| >I>]>s)>x >w[>r>aR/>DO>=nOOOOOOOOOOOOO>d> >#>>5> > M>>>!p>~>n>>Q>=>o>R>i0>p,>˸>i>t>(b>]>s>H><>>>•>K>P>y>>_>>>>>|>>x>|> > >{>>>l>j>u.>@>v>n >c>]9>V1>K^><>->#?@>#ho>(:>= >Uh>g>l_>ln>l>_>P><> ׾>'OOOOOOOOOOOOO>k>>>n>ȁ>i>Yy>߱z>⏪>$>^S>ZV>/>>_>>>iQ>_7>>t>#>>P>o>Z>Wp>mG> >>g>ub>>g>>>>h&>l >z>>>>>>J{>Z>$3>vٱ>v.>tK>l>h~>c8I>\h>Y>S$>E.>0P>!> >1>C>1$>Iy>R՗>\>`2b>d>bp>Uh>L>7>}>)OOOOOOOOOOOO>A>>->à>y>3>Լ>lb>>ޙ>>>`>}>>EQ>>>]>R>X7>>쯾>ナ>>:>>>jb>%>>>%k>(>3>>>գ>W]>,>>,J>>}>@>>W>>`L|>aa>e!!>k-S>g 8>e>^(>U>M >F >67> X+> !f>>> > >53>D>JS>Qe1>WA>U,>OC>Fw3>3r>`?>%)OOOOOOOOOOO>}>̄>5>> O>̍>>Ԙ>?>nf>ܳ>ޱW>g>\R>@u>#|>>%>>>g>\>篛>s>>>׭>^>w>?`> >]>2o>>LO> >[>P>Z>n>>$>J2>"t>J>>r->Uc>]Ap>a'Q>kb>ky>eY>b`>Z\>O >;>.>> >>>> >>)r>7W>E}>IQ>N;}>Ji>DΥ>3 >)>OOOOOOOOOO>yc>>>]>>->Ȼ6>(>Б>Ӫ>&>IX>)>>G>߱>ɂ>>>F>>/>Op>כ>W>->䈪>B>y>ߨO>ތU>_e>L>%>U>P>Ƈ>F>>>[>>]>6 >v>|>V>J>SI>YF>`>e>f>a2>]>U>DK>'> 0>Z =$>%>T>9g>E>Wn>[>>>7 >>w>A>A,>@A>),>=>=BOOOOOOOOO>SWE>,B>K>S>ň>>G>Ŀ>>ff>X>Ѻ>>>Շ>@>u>:>4>>>v>a>;> >v&><>>>޺>/>>!>>׾B>d>Q>G>#D>> >>9>>>>\i>Uhn>J>HL>GE>RU>[>ab>a>]p>X'X>N4>>S>===`==:>>h=D)=V=.=2Y> *>,>/N>0>3;>b> >OOOOOOOOO>0]> >j>S>|>>5>>ĬG>>զ>q>>о>҆>O>->J'>> >{T>0>41><^>>܀>i>X>>֯>Ա>k&>(>>޴>u;>޾>0}>Q>>]>;M>0>9%>c n>I>9>4t>=x>F@>U>Z>Y'k>V>OX>>J)=>8=2>-O=ɣp== =6!=p=`==OO=>`>f>Wo>!F>>A=ΤOOOOOOOOOO>u6>3>ۦ>>v^>%>s8>f>Ä>>V>(>>Ͳf>υ>D.>O>/>2>8>D>صv>X>%>>>>,+>"6>>'>_>6>>X<>r>$>!>A>xD>i>H>X>}>\1,>=>%q{>P>&2>:B>F >Oa<>L>K>A/>@>4+>=8KO=뵝===/== =(5OO==0(=z=T>}> =OOOOOOOOOOO>^~u>+>S_>B>3>>>ʎ>>J>bT>+>>>ʹH>vO>/>ܴ>e>2>EA>Ԩ,>)>қ>9>>>p>>yj>>>>!>>>o>>!>D=>x>>>rNL>TH>3N>WG> >>!i>4:>;>;/>;M>>, >*>=N> (b=ǻIO=!(=kO=瓚=t==q==ROOOOO==-=bOOOOOOOOOO>m>^}O>N>d>/v>3>>J>E>'>:>s> $>>>>ƌ>">ʁ{>>T>>>`>>̘>|>P>>>˯>>Ʃ>3>>E>>>>G>aZ>>)>?>bR%>G>([`O==>n>>:>"c>#`> > ,>=OOOO==^=@c==ë=OOOOOO==0OOOOOOOOOO>v>Q&>,>>>f>'>H>>i>>> >$>!>WO>:>ă>>ƪ>>a6>}>ʹ>ɋz>ʯ>)>ˍ>w>q>0>B5>Ô6>>'>*n>>Y>$>m!>X>}s6>|"=>u>S9>;$>#+O==ׄ1=j==܄>/> =əM=~==vOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>=>t>h>>>>ō>=>>‡>>p>>8>>>>>">>š6>>G>ŬO>>I>ƫ>Ƶ>X >>>Ģ>>>@ >7=>->E>>>p >na>mی>e׳>KJ>0>/OOO==ʉUO=Ņ=ѮOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>1 >iN;>P>>Og>C>h>C>I>>g>D>\>>>ɀ>8>Ed>>>R>>qG>n>M>H >>>>i>ݳ>s>>k>4>x>|o>>7>|(>_j>_'>O>;">)¹>>zOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>(>V>p>|>K>Tp>Q>>>>p>pn>>h$>>_\>4>Z>>N>/>`>>)>@>>Ӵ>7>>>>>x>(>p>6>]GL>h:D>o|>t>qEE>P2]>M>@>1YO>y0>J>ROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=>>^>]>wC>>>H>H>>T>Ƿ>G>z>F>!>!>>z\>>'>>>T>/>>>A>Ea>=>>f>f>y.>T>-d>f>k&H>mc>dW>?]J>8>=>+[>==ROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>MԤ>e >z> v>>>n>B>>w>>S>7>>>>&>q_>>.>b>g>,>[>R>_><^>`>j>V>T>C[>3>?><>O>\U>\+>+A>*>5}w>>=C=EOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=1$>;>T>h>y>O>>j>h>@8>>B>">>>> >P>>Q>nP>L>>s>G>>h">> >>v>OO=>>3%y>E&>K{>">>%^ =j=ѵOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>Bl>U>:>goP>uT>~j>m>>>>c>>C>>m>f_>>>'=>>>!>A>\)>=>>Z>sJ>> > >OOO>ܜ>#>+>&1)>"=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=钁>(xF>@>R>a>k>r>x~>~b>>>Y>i>l>w>_>'>&&>>>S>>>`0>j>i>ݟ>6>>C>>̓>qrOOO=6=4>OT>;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO> >)_>;j>L>VG>^U>d>i>qU>H>>>>H>>A>n>:> >g>>>>Ŝ>R>T>t>?X>>>X@>O^OOOOO=꠽=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=f> u>! >3Z>?c>G»>N6>Sw>[ >hK>w6a>>,>>>>'9>l.>Qs>&>_ >C~>>dt>%>>1>E>n>n>`M>()OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=M>N>n>&-M>/x>6{><>C>P,>^>mz>z3>]>Ĝ>>E>G>~>b>>>>~>>؅>3>->g>ih>Kg>(eN>sOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=Ԭ+>x> >>>"u>)Y>6)K>E>R[>a>v>>f>}>C>>O>>n>b8>~,>p><>;E>$>d/>C>+>>>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==$=+=B8>>>Vw>9>)D>81>Dv>b>>a>I>=>)>W]>>#>E9>8b>T/>>R>>1N> H> >=/%==OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==Ä=a={H=@==L> >nV>{W>f>_>>}>>>>,>>4Z>|>ef>n>R>_wOO=c=k===.=qOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==;='==²R=ȿ=c4=ڢO>bM>^>>d;>*>=>>]4>L>>Vg>|h >x'>r>j>C6OO=}*=2=͊=a=W==;=s=>=uOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=m=F==UH=v=+=`O>M>zu>>>H$>9>o>@>>>}4>zm>{> >V>mx>U>MOOOO===H=f=M7=f=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>TZ5>xx>>Th>aE>ɤ>>>X>|n>w@(>uj>}@A>>i@>LA> 3OOOO=4=2=T]O=,=gcOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>T8>ot>ő>>>5>7V>>X>v>pl>k+z>kA>q>X2>@@>"{>>_OOOOO= =^=zOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>>>^B>>>>H>ϰ>f>Y>}>m/M>f>];;>I>P:D>8>%>>t>>OOOO=†k=AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=b>Q>5>_>>>`>>A>m>k{M>\>Kz>O>>3> >>6B>>!>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==XO>>_>>{>T>v>t>pL>VB>1O> Ƕ> "=qS=N=>>>zOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>xH>f>v>>>@>l>m3>sf>U>*:O=S=O=<='=/>>>gOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>@>Od>q>wn>t>>>7>s0>ͬ>m>YE>3]OOOOOOO=e3=E=POOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO><>6.>`{>p>w>6]>>>>u>'Z>kݟ>bo>J> 1> s>!'>JOOO=E=ԑ=y= eOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>$><>G>S>e>tZ9>e>?>Њ>)>P>>>h>ZD9>-r>%>g=.=~OOO=+==OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>>k>*}>.>7+>B>NK>[ю>m>>>C>>=>`>S>im>a >>ڀ>+'> b>=OOOO==OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>zf>>"->+P>7>@|>M>]>k>>K>`>&L>>W>-A>>pjc>fջ>M)>9Lp>;+>f=ƭn>>F>(9>3>? >GO>V>dn>{%>>j>i>>q>>>>zX>r>`>Ky>%4>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=mN>>$>$3>0DK>;*>B=%>J)>`>q>z>/`>>>>> >w,>{E>n1>c4>M>F'>S>^w>3=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=A >e>)>:>'ɏ>2N>;?>?}>QC>a>j>q>w>{>}>{>o9>h>>s!>y>o>f">c}>usX>b= OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=">W> >0>!~>(>2IA>?.>P>Y*>`f>g+a>lD>o>r>>q#>a>^>q&>p>a>\/Z>o$s>gOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO===> -]>2!>~e>T[>-&>;>D>MA>Sw>Y>^V>c>g0>gjJ>WRB>LI>UG>`Dy>O>e6w>]>I2>8OO=z=YOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=C=="=t=k>>G>!>.{>7d>?K>Em>L2>Ss>[>b&>_[>I>5 >^n >SS_>U>K[}>+<>$OO>0>#=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO====n=\=->I>w>$">,>3L>;6>Dh>N>W>[z>YL>gq>[I5>O>@1>4ɻ>0̑>1K>&\8>'>!>>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=G=OOO==>>!>>!}>*>>6H>@>Ht>LuE>HU>E>HP >:>A[>=>7>2>0 >27> >V=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=>T$>H>dy>w/>'>1>8:><˲>=*E>9>8+>/y1>2Q>/[>(L>&t>!d>x><=Ie=w-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=X=ፏ=/ => =>f>!>&>'>'n>(bC>(> >&?d>>>> 1(>~==ă'=eOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==˜B=ֹm=->t>$>V>D>D> >Q > >B:>1>r=e==F=-Q=~2=WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO={3=k==̿=&=}==_>{>>z=Y==ԓ=श=`-=7U=~a= .=hOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=6====П,===L==ݓ=== UOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=~==@= ==o~== =p=h=8OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=^|=g= ={z=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==YOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOstars/inst/nc/d.nc0000644000176200001440000000000014344372470013526 0ustar liggesusersstars/inst/nc/test_stageiv_xyt_borked.nc0000644000176200001440000037347413777653456020311 0ustar liggesusersCDF timeyvxW time_bounds_1 $ Originating_or_generating_CenterQUS National Weather Service, National Centres for Environmental Prediction (NCEP)#Originating_or_generating_SubcenterEnvironmental Modeling CenterGenerating_process_or_modelRRiver Forecast Center Quantitative Precipitation estimate mosaic generated by NCEP ConventionsCF-1.4historyFri Aug 9 07:01:02 2019: ncks -d time,10 --3 test_stageiv_xyt_borked.nc test_stageiv_xyt_borked_small.nc Thu Apr 11 20:56:11 2019: ncks test_stageiv_xyt_coords_2.nc test_stageiv_xyt_data.nc Thu Apr 11 20:55:36 2019: ncpdq -a x,y test_stageiv_xyt_coords.nc test_stageiv_xyt_coords_2.nc Fri Feb 1 07:55:44 2019: ncpdq -a y,x test_stageiv.nc test_stageiv_2.nc Aggregated from NCEP Stage IV Analysis by dblodgett@usgs.gov 2016-01-01 featureTypeGRID_CoordSysBuilder#ucar.nc2.dataset.conv.CF1ConventionMetadata_ConventionsUnidata Dataset Discovery v1.0title9United States Stage IV Quantitative Precipitation ArchivesummaryMosaicked into a national product at NCEP, from the regional hourly multi-sensor (radar+gauges) precipitation analyses produced by the 12 River Forecast Centers over CONUS. Some manual QC done at the RFCs. The Stage II/IV job is run at 33min past the top of each hour. Hourly Stage IV is re-made hourly (if there is new input after valid time for the next 23 hours, then again at 1/3/5/7 days after valid time. Source: http://www.emc.ncep.noaa.gov/mmb/ylin/pcpanl/stage4/ Note: This dataset is not truely national. Some RFCs do not produce hourly precip estimates and others may not be present in the dataset. Please review the NCEP documentation for more information.keywordsUAtmosphere > Precipitation > Precipitation Amount Atmosphere > Precipitation > Rainkeywords_vocabularyGCMD Science Keywordsid stageivnaming_authority cida.usgs.gov cdm_data_typeGrid date_createdongoing institution,National Center for Environmental PredictionprojectVariousprocessing_levelPAggregated .grib archive from the NCEP. The original Hydrologic Rainfall Analysis Projection grid cell locations redefined by unprojecting grid cell locations using spherical earth projection algorithms. The cell lat/lon locations should be interpreted as being on a modern geotetic datum. This transformation is needed because the original grid cell location's lat/lon values were on a geodetic datum but were assumed to be on a spherical datum. See: https://pubs.usgs.gov/fs/2013/3035/pdf/fs2013-3035.pdf for more information. Note that this publication reverences the National Precipitation Verification Unit. The data represented here are aggregated from the same source as the National Precipitation Verification Unit used prior to being shut down. Data processing notes can be found here: http://www.emc.ncep.noaa.gov/mmb/ylin/pcpanl/acknowledgementyData originated at the National Center for Environmental Prediction: http://www.emc.ncep.noaa.gov/mmb/ylin/pcpanl/stage4/geospatial_lat_min24geospatial_lat_max53geospatial_lon_min-125geospatial_lon_max-66time_coverage_start2002-01-01T00:00:00Ztime_coverage_endpresentlicenseFreely availablecontributor_name$Center for Integrated Data Analyticscontributor_role#Aggregation and Serving via THREDDSgeospatial_lat_unitskmgeospatial_lat_resolution4geospatial_lon_unitskmgeospatial_lon_resolution4geospatial_vertical_unitskmNCO`netCDF Operators version 4.8.1 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco)history_of_appended_filesXThu Apr 11 20:56:11 2019: Appended file test_stageiv_xyt_coords_2.nc had following "history" attribute: Thu Apr 11 20:55:36 2019: ncpdq -a x,y test_stageiv_xyt_coords.nc test_stageiv_xyt_coords_2.nc Fri Feb 1 07:55:44 2019: ncpdq -a y,x test_stageiv.nc test_stageiv_2.nc Aggregated from NCEP Stage IV Analysis by dblodgett@usgs.gov 2016-01-01 /Total_precipitation_surface_1_Hour_Accumulation long_nameCTotal precipitation (1_Hour Accumulation) @ Ground or water surface descriptionTotal precipitation missing_value coordinates time lat lonunitskg m^-2 _ChunkSizes<K standard_nameprecipitation_amount _FillValue cell_methodstime: sum (interval: 1 hr)hlat units degrees_north _ChunkSizesK<_CoordinateAxisTypeLathTlon units degrees_east _ChunkSizesK<_CoordinateAxisTypeLonhVtime unitsHour since 2001-12-31T23:00:00Z standard_nametime long_name!GRIB forecast or observation timecalendarproleptic_gregorianbounds time_bounds_CoordinateAxisTypeTime _ChunkSizes$ time_bounds unitsHour since 2001-12-31T23:00:00Z long_namebounds for time _ChunkSizes,?@?@?aG??@Q@Q@???У?@?У?@@0@@`@XQ@XQ@@xQ@(@ @8Q@(Q@(Q@Q@@@Q@@@@Q@@??У?У?У?У?У?!G?aG???@@@???????@hQ@XQ@p@P@p@hQ@@@p@xQ@XQ@0@Q@ @@??@ @(Q@ @@Q@??????@?aG?aG?????@?????@Q@XQ@ @p@@`@(@@(@(@`@hQ@8Q@ @@@@@Q@Q@Q@@@8Q@ @ @Q@Q@@Q@Q@?!G?!G?!G???@????!G?@??@P@8Q@P@@@@@(@(@@P@8Q@(Q@?@@@@0@0@ @P@@@@@(Q@0@(Q@ @(Q@Q??!G?@??У@0@@(@@(@@@@@P@0@ @Q??@@@@Q@ @ @P@HQ@@@0@ @0@0@0@8Q>\??@(Q@@hQ@hQ@@xQ@P@HQ@@@Q@Q???@@@@@@Q@Q@@8Q@(Q@Q@ @0@P@`?!G?@@Q@8Q?@@@(Q@@ @Q?@@Q@??????@Q@Q@@@Q@Q@8Q@XQ@`>\??@?????????@@@Q@0@ @@@@??У???У?@Q@Q@0@HQ@P>\??@????????@@Q@@??????У??@ @ @0@@@P??@?@?!G?!G?@????????У???У?У??@@Q@Q@(Q@HQ@`>\?!G?@?@?@?@?aG?????????У??????@@Q@@P@hQ??!G?@?@?aG?aG??????????У?@Q@Q@Q????У?@Q@Q@XQ>\?@?aG??????????У??У??@@@ @Q@??????@@@?!G???????????У?У?@@Q@(Q@(Q@0@(Q@8Q@8Q@@@ @Q@?У???@??aG?????У?@@@???@@Q@(Q@0@HQ@HQ@`@p@(@(@(@p@@@ @Q????>\?!G????У?@@@Q@8Q@(Q@@@Q@@Q@0@0@8Q@HQ@`@xQ@@@(@@(@hQ@@@ @@@???aG????@Q@(Q@HQ@XQ@hQ@HQ@Q@@ @0@8Q@HQ@XQ@xQ@@(@(@(@(@@(@(@(@@hQ@@@0@Q@@?@???У??@(Q@@@p@@p@HQ@@@HQ@8Q@HQ@`@hQ@hQ@hQ@xQ@(@(@(@(@A{A {A{A{@@@@(@XQ@@@(Q?@???@@@HQ@@(@(@@hQ@@@`@XQ@@@@@@@HQ@hQ@(@@(@(@@A"{A8A(A(A{A{A@(@(@@XQ??aG??@Q@@(Q@p@@(@@@(@@@@(@xQ@@xQ@xQ@@p@hQ@xQ@@@(@A{A A,A*{A$A AA @(@(@?!G?aG?@Q@@Q@ @`@(@@(@@(@(@(@@(@(@(@@@(@@(@(@(@(@(@@(A{A AA$AA@@@@(@?aG?У?@@@0@`@(@@@@A@(@(@(@(@(@@@A{@(@A{A{@(AA {A A{A$A6{A$A{A{AA AA A??@@ @(Q@XQ@@@AAAAA@(@(AA{A {AA A,A"{A{A{A{AAA{AA A$A:{AHA@A8A&{A$A&{A A{A{?@?@(Q@`@p@@(@A{ALAHALADAF{A4AB{ALA6{AB{AR{AZ{Aj{Ab{AV{A2{A4A@A8A,A.{A&{A,A6{A<AJ{ALAB{A>{A*{A(A.{A0A.{?@(Q@xQ@(@@@A*{ApA =AAAAAj{A`AlA =AAAAAA =ATA*{A,A"{A AAA{AA{A{A,A@ALA6{A4A:{A<A<@@p@(@(@(AA<A =AA =A =A =AAAA =AAAAA =A =AAA<@(A{A@(@(@(@(@(@(@@A{A8AR{AHAV{APAH?@8Q@@@A AB{A =AAAAAAAAAA =AA =A =AA =A =AA:{A @(@@@@p@XQ@@@P@(@(@(@(A$A2{AR{A^{Ah?@?@@(@(A AN{AAAA =A =AA =A =A =A =AABAA =AA =A =A =AF{A*{A@@(@@(@`@ @@Q@8Q@(@(@A A@AR{Af{?@?@P@(@(AA,AA =AA =A =AA =AAAAAAABB BA =A =An{Ab{ATA>{A>{A2{A.{A@@P@?@@0@(@(@AADAZ{?@8Q@P@(@A Az{AAA =AAA =A =AA =A =ABA =BBBAA =AA =AAA~{A`AXAdA.{@(@@0@(Q@@Q@0@@(@A{AP@Q@P@xQ@(A{A`A =A =AAAAAA =A =AAAABB*BA =AAA =A =AAA~{AN{A<A:{A @@(@P@`@XQ@0@ @hQ@@@(A.{?@@ @`@(@A"{AA =AAAz{A =A =A =AA =A =AB BB0BAAAA =AA =AA =Ar{AHA A&{A{@(@@`@XQ@hQ@p@`@0@P@(@A???@P@@@(A`AA =AAXAA =AA =A =AA =BB B)B A =AABB+BB A =A =AA =AtA*{A@(@(@hQ@HQ@P@xQ@@@@HQ@(A{@???!G??@Q@p@(@(A{AAA =AXATA =A =A =A =A =A =BB4B9BAABBB BBBA =A =A =AA =AA0@@0@Q@(Q@P@P@(@p@`@AA,?????!G?!G??@(Q@xQ@@(A*{AAAA,A`AAAAA =AB/B9B AAA =B A =BB%B!BA =AA =AAAAd@@P@@(Q@P@@@`@(@`@@(A{>\????!G?@?!G??@HQ@@@AJ{AAAN{A{AlAAA =A =A =B B'B A =AA =AABB6B>BA =AAAADAA{A{A{@@8Q@0@0@0@HQ@p@`@xQ@A?!G?@?!G?!G?@?!G>\@Q@p@@(@(AXAAlA$A"{AxAAAAABBA =Av{A =A =AB BHBVB8B)B3B>B%AAAPA(@(@@(@@@@(Q@ @ @XQ@p@(@@>\?!G?@?!G?@??!G>\?@8Q@xQ@@(AAb{Aj{AN{A A.{Ar{A =AA =AB BAAATA =ABBOB~BwB{BBBxB*AA =AALA@(@@@ ??У@@Q@0@XQ@xQ@@??@??aG?aG?@?@>\?@HQ@@(@A4Ar{A8A*{@(A0Aj{AA =AAA =AA =AB{Ab{AA =B<BBBBBBBA =Ab{AdA<A{@(@@`@Q@??@@Q@0@P@p@??aG????aG?@>\@Q@P@@(@(ADAHA A {@(A4AAA =AA =AAxAPAAN{ABBjBBBB߀BBBBBAA2{@(@@ @ @P@hQ@`@(Q?У?У??@@Q@0@@@(>\?@?????@??@ @XQ@(@AAHA@(@@A<A =A =A =AAAv{ADA&{A{Ab{A =B=BBBBBB.AA{@`?У?У@(Q@0??????@ @ @?!G?@????aG?!G?!G?@(Q@XQ@@(AA0A{@@@AB{AA =A =A =AhA@A,AAA =BBfBBC!GC@BA =A@0??aG?@?aG?aG????У@Q@Q@??@???aG?aG?aG?@?@0@XQ@@A A@@@@A"{A~{A =AAb{A0A*{AAAA =B BBBBBC!GB~A@0??????У?@xQ?!G?@????aG?aG?!G?@Q@XQ@(@A&{A{@@@(@(AAXA|AV{A&{A A{A{AA2{AB+BBBBBBVAT???????@hQ??!G?aG?aG???@??@(Q@`@(@(A6{A@@@@A {A8ATA:{@(@A {AA {A6{AB4BBBɀCGBـBB@A{?aG?aG?aG??@XQ?!G?@?@???@????У@(Q@`@A A*{@@(@(@(@A{A(A*{A{@(@(A{A{A{ADABHBBBCBBuB=Ah??aG??@P>\?!G?aG????@?!G?!G?aG?@?@0@`@AA@@@(@(@@(A{A{A {@@A {AA{AJ{ABRBBCBB B'A =@8Q?@`>??????aG?@?@?!G@@8Q@p@(A.{A{@@(@p@xQ@@(A{A@(@@A A$AAF{A =BCBBBCGBA =A =A@?@?aG?@??!G??У???aG?aG?aG?@?@@Q@0@A{A>{A@@hQ@8Q@P@@@@(@@@@A{A{A8A =B;BvBBBBBA =A$A"{@??aG@@(??@?????aG?@?@?@?@@Q@8Q@AAJ{A@@`@(Q@0@hQ@(@(@(@(A@(@A{AA.{A =BBLByBBB@@@@?@XQ@(???@Q@??aG?@?@?!G?aG@Q@HQ@(AA6{A@@@@@0@P@(@@(@(@(@@@A {A0A =B BDBRBXBMBAn{@`@??@ @@>?!G??@Q@???!G?@?@@@`@A{A(A @@(@P@@@HQ@(@@@@@(@(@@(A&{A~{A =BBBB6B$AAAD@ ?@`@A{?@?У??@@@??!G?!G?aG?@@Q@XQ@(A"{A.{A{@@@P@@@@@(@@@A {@(@(@@A{AAAB AABAAR{A{@hQ?@8Q@(@A{?@?@ ?@HQ@??@?!G??aG@@P@A$A@A{@(@@P@HQ@HQ@(@@@A A@(@(@AA@A =AA =A =An{AAAAN{A{@(@Q??@ @p@@(A{?aG?У@Q?@0@???aG???@?@XQ@(A AB{A A@(@xQ@XQ@P@p@(@@A {A{A@@(@(A{ApA =AA =AA {AJ{AZ{APA*{A{@(@(@ ????aG?@Q@P@@@A{?!G?@8Q@@ @Q@Q??aG???@@@(A,A8A&{A {@(@(@p@`@xQ@@(@A A(A@AAAA8A =AAApA{@(@@(@@(@(@(@(@(@?У?@?@@8Q@@(@(AAD??@0@Q@Q@0@?У????aG?@8Q@(AA*{A(A@@@@xQ@@(@(@AA(An{@(A{AA{A$A\A =AA =A{@@(@`??У@@????@(Q@(@(@(@(A.{A =>\?@HQ@P@Q@HQ@Q@Q??@???@0@@A&{A4A{A{@@@(@@@(@(@(AA(A AAA{AAHA =AA|A:{@(@@0?@Q@p@@(@(A:{A =B->\?@@(Q@(@8Q@hQ@Q@ @?@?aG?У?aG?@@@(AA6{AR{A2{A{@@@@(@@@@AA{A:{A(A"{A{AA(APAA =AlA@(@@?@ @hQ@(@A{AZ{A =BB;>\?@?@@HQ@P@P@0@@?@?@??aG?@ @A{A>{AdAR{A,@@(@@(@@@@@(A@(AR{A>{A0A,A8A:{A^{A =AA>{@@(@P@Q@@?@ @`@@(@(AAv{A =BB-B1??@Q@xQ@xQ@@XQ@hQ@?@?@?aG@@(AA2{ApAlALA@(@(@(@(@(@@@(AA&{AZ{AhADADAR{AtA =AA =AA`A,@(@@(@xQ@p@Q@@@@(@(@A{A AB{A =B BBB ?@?@@@(@XQ@@??!G?У@A{A0AlAz{AhA0A{@@@@(@(@@@AAF{A\APADA\AAAADAA =AAxA<A@(@@@(@@@(AA4AZ{A|ABBAA?!G?@(@(@@p@@@hQ?!G?@@@ADAtA|Ar{AN{AA {@(@@@(@@(@A{A*{AHAB{APAHAdAXA~{ADA{AAA =AA =AdAB{A:{A"{A$A,A4AF{A`An{Av{A =A =AA =A>\?@@@(@(@@`@@?У?!G??@ @(A:{A =A|Aj{AV{A<A{AA{A{@@(@A{A{A{A8AJ{ADA2{A>{A\AZ{A"{A.{A =AAA =AAlAZ{AN{A@AJ{APALADAPAhAAAA =Aj{A`?@ @AA{@@@@?aG?@AAz{AAhAZ{A@A,AAAA"{@@A{A,A.{A<AHAF{AB{A:{AXA(A2{AZ{AAA =AAA =AAA =ATAhA^{Af{AtAxAR{ADA@ADA^{An{?@?@A{AN{@(@xQ@@@P?aG?У@p@(A6{A =A =A^{ADA4A$A A{A>{A2{@@A{A(A2{A<A@APAHALA8A A&{AB{ApAz{AA =A =Av{Az{Aj{ATA\A<A@A&{A{A{A"{A4A6{AF{Ap??@0@(Af{Al@(@@@(?@?!G?@P@A"{AA =AlA>{AF{A:{A.{AA.{AtA&{@@A {AAR{ATA:{AB{APA{AF{A8A0A A(A$A"{A.{A{AA {@(@@A{AA"{A.{A2{A@ApAhAV{?@Q@AV{AAL@@(@@Q??@@(@(Aj{A =AAZ{A^{AXAB{A@A4AXAlA @@(AA$ADAHAF{A<A:{AN{ApAAj{AXA0A{A{@@(@(@@(A{A"{A6{AF{Aj{A =A =A =A`A =?!G?@P@Av{A =A@(A@(?!G?@?@`@A.{A =AAAtAAlA`Aj{AV{AA^{A2{A @@(A A`AhAZ{A^{AR{A\AAAA|ApAXAHA>{A(A&{A4AtA =A =A =A =AtA`AAA?!G?@Q@(A,A =A =A$AAF{?У?@@(AA`AAA =AAA~{AAA~{A =A~{AJ{A{A{AAB{A =AA\A`AR{Af{Az{Ar{AlAB{AXApATA>{AB{AHAb{AxAn{ATAXAdA =ABBF??@8Q@A&{BA@(@(@HQ?@?@8Q@(A4AA =A =AA =A =A =AA =AA =Af{AR{Af{AR{An{AAA =AAA:{A4A.{A,A A*{A.{A6{AA"{AAA<A\AAA =BBBBIB:??@(Q@p@A:{BAn{@(@???@@`@A<A =A =A =A =AA =AA =AAA|AJ{Av{AA =AAA =A =AA =AhAZ{AJ{A@@(@A$AAhAA =A =ABBB&B.BB??У@Q@8Q@hQ@pA =A =A8@(@0??!G?@Q@(A{A@A =A =A =A =AAA =AAAA =A^{AZ{ApAA =A =B4B&AAA|A =AApAn{AdA =A =A =AAB BBBB%BAA =>??@(Q@@@HQ@xQA =A =@(@(@??aG@@hQ@(A{A2{AA =A =A =AA =AAA =A =A =A =AR{AtA =AABBBBBDBB.BB9B B(B'B7B:BHBBBB*AAA =A =?@?У?@ @P@`@(AAp@(@@??@??@P@@(AAB{A =AAA =A =A =AAAA =A =AA~{AA =AA =AA =B BB"B'BCBEBCBTBBB9B-BA =A =A =A =AAA =?aG?У?У@(Q@XQ@p@(A<A2{@@(Q??@>?@@@hQ@@A{AXA =A =A =AAAA =AA =AAAAAlAF{A6{AR{AZ{An{A =AAA =A =BBA =AAAA =A =A =AAAA>\>\?@???@0@hQ@p@HQ@(A{@(@ ??>?aG?@@(AA(AA =A =A =A =AAA =A =A =B A =AAAxA>{A$A&{A(AdAAAA =A =A =AA~{AZ{Ar{AA =AA =A =AA =>\>\??@??@@@@XQ@8Q@ @(A,@(@HQ@8Q???@?@hQ@(A*{AN{A =A =AAA =AA =A =A =AA =AA =AAtAV{A8A ADAR{A^{Aj{AtAhAJ{AF{A,@A{AA^{AJ{A^{A =A =A =>\>\>??aG???@ @XQ@(@`@P@(A8@@xQ@XQ?@?@??@@A{AZ{AAA =A =AA =AAA =A =A =A =AA =AR{A0A(A{AB{A8A.{A(A"{@@@(@(@(@A A(AN{Av{AxAf{>\>\>??!G?@????@@@@(@(@p@A$@(@@hQ@Q??@@@xQ@(A{AtA =AAAAA~{Af{ALA$A.{Af{AA =AA4A{A{@(A@(@(@@(@0@0@@@@(A{A{A{AAA{>\>\>>??@?!G?@???@@@(Q@P@`@`@XQ@(@(@@@`?@Q@p@@(AAlA =AAAAAhA*{AAA{AA"{AHA<A{A{@(@@@hQ@8Q@ @ @@@hQ@(@@@(@(@(A{A>>>?@?@?aG?????У?@Q@@@(Q@(Q@P@(@(@@@?У@Q@xQ@(AA6{AdAn{A =AAA =ADA{AA{AAAA"{A$A&{A{A{@(@@@(@(@(@P@(@(@@@AA(A:{>>>?!G???@??@Q@Q@@Q@ @0@Q@ @HQ@p@@(Q@hQ@(??@`@A{AXAXAXAZ{AlApADA(A@(@(@@(A {AA A{AAA{@@@(@(@(@@@(@(A A$A8A>{>>>>?aG????@Q@Q@@(Q@0@@@@@0@0@p@p@@@???У@`@(AAV{ATAB{A:{AN{A4A(A*{A A {@@@@(A{A AA{AA@@@@@(@(AA {AA&{A4A2{>>>>>?????У@@hQ@P@`@P@@@HQ@hQ@HQ@p@(@@P??!G?!G?У@0@(@(A2{AZ{AB{A*{A @A A*{A @(@{@A@(@{@@@@{@@@@(@{@{@{@(@(@(@{@>>>>?@?У@@ @Q@ @@p@@@hQ@XQ@p@(@(@(@p@(@@`@0??@Q@(@AA8ADA"{A@@AA@(@@(@@(@@{@(@@@(@{@@@{@(@{@@{@@{>>>>??@0@HQ@P@ @@@`@@@P@@(@@@@@(@(@xQ@8Q?У???У@0@(@A$A,A{A@A@(@(@@@@@(@@@{@(@@@@(@{@@{@{@{@{@??@0@XQ@XQ@Q@@@@P@@(@(@@@(@@@(@hQ@`@ ??aG?@Q@p@@(A {A{A{A{A{@(@(@(@@@@@@{@(@(@@@{@{@@@{@(@@{?aG?@@@XQ@@@Q@@@@@@@(@@(@AA@(@(@p@???@Q@XQ@(@@(A{AA(A$A"{AA@(@(@(A@@@@@@(@@(@@(@@(@(?@@HQ@`@HQ@(Q@Q@Q@(Q@8Q@P@AA@@A {A{A{@(@8Q??У@@(Q@`@(@(@@AA*{A8A6{A(A$A&{A(A2{@@@{A =A{@(@{@@(@{@{A$@{?!G?@@@@xQ@p@`@ @Q@@Q@hQ@(A{A{AA AA&{A@(@@ @ @0@@@xQ@(@(@(@@AA{A{A,A6{A:{A:{@@@@{@@(@@@@@@(@??aG??@ @xQ@(@P@8Q@Q@@8Q@(@(@AADAF{A$A {A A@(@(A @@(@@(@@@(@(@(AAA"{A*{A*{@@@@@(@@@@{@@@@{?!G????@@@@0@0@XQ@P@hQ@@@AA A8A\AAtADA*{A{A {A A"{A*{@(@@(@@A{A AAA@{@@@@(@@@@AA{A =A??@?aG??@?aG?@@`@@@@(@(@@xQ@(@(@(A&{AA =AA =A =A`AA@@@(@@(@A{A{A@(@(@(@@@@{@{@(@@(@AA{?!G??aG????@@@p@@(@@@(@(@@8Q@# @S @@(@A&{A`A =AAA =APA{@(@(@@@@(@(@{@@@{@{@{@{@@@{@A =A{???aG??aG@@xQ@@(@(@@(@@xQ@l(@`@,(@@@HQ@xQ@@@@AA$@@@@@(@(@@(@@@(@@(@@@{@@(@@(A??@?aG??aG?aG@Q@p@@(@(@@{A@{@{@@@(Q@ @@@Q@xQ@@A{AA{A{@@(AA{A@(@@@{@{@(@@{@A@(@@(?????aG?@@ @HQ@xQ@A{A{A.{A,A@(@XQ@(@ ?Q@@Q@@@@@@(@@(@(A{A@@(@{@@(@@{@@(@@@@(?????@ @Q?@XQ@@(AB{AtA|A{@@@{@@(@@@@(@(@{@A{@(@@@@@p@p@p@|(@{@@(@{@|(@@?@?@@Q@Q@P@@A.{A`AAA0AB{A@A"{A{A{A(A@(@AAV{AN{A(A*{A{@{@@xQ@\(@P@HQ@C @L(@HQ@L(@`@`?!G???@(Q@(@A{APA|A =ADAF{ADA@(A{A0AF{A =A*{A =A6{AhAb{AxAf{AJ{@@(@(@`@S @@@<(@<(@@@C @@@<(??@?aG?aG?@Q@`@@(AAV{AAA =AAAzA =Aw =A =AZ{A @{AA$A$AV{AL@(@@@@c @@@@@@@HQ@HQ@P@XQ@`??@??У@(Q@@@@A(A =A =A =AA =A =AA =AAZ{AA.{@AA@@(@@{@{@`@HQ@3 @@@L(@P@\(@p@(??!G??@ @8Q@xQ@(@AA6{A6{A>{AF{AHAC =A@ATA8A&{AA6{@(@@(@(@(@(@@@\(@@@(Q@0@,(@@@XQ@s ?!G???@Q@0@XQ@@(@AA{AA =AA$A2{A$A# =A{A{@@{@(A{@@@@xQ@L(@XQ@0@(Q@# @(Q@8Q????@@ @8Q@xQ@@A {@(@AA@(AA{A A =A$A"{@@@{@(@@@{@`@<(@# @ @(?@?aG???У?@Q@(@C @s @{@@(@@(@(@@A{@(@@{@@@@{@{@@@hQ@S @3 @# ?@?aG?p??У?Q@@@`@p@C @@(@(@(@@@{@@(@@(@L(@(@(@# @(Q@# @?Q@# ?aG??@@Q@@HQ@(@(Q@<(@8Q@L(@L(@S @hQ@L(@(Q@(?Q?Q??Q???Q@Q@(Q>>\>?@???@Q???Q???У@?Q@Q@ @Q@ (??Ǯ?Ǯ???У???>\>\>?@?@?@?aG??????Q?Q?Q?Q@@ (@Q@ ??Q@Q?@ ?Q?Q>\>\>B\?O\)????Q??@Q@HQ@(@(@@{@@@0@\(@P@HQ?0?aG?aG???@ @|(@(@(@{@|(@@S @|(@{@(?0?0?aG?p??Q?@(@,(@3 @(@C @3 @,(@HQ@Q>>?\)??0?@?@?@?@?O\)?p?p?p?Q??O\)?p?@>\?\)?aG?p?@?@?!G?O\)?aG?@?\)?\)?@?!G?\)?\)?\)?\)BBA=BbBB6BƌBB ;B*BKBmMBB BkBB 0B 5B VB xbB B 4B ܠB B zB @B bZB B >B ƳB (B B +B LB n B B B ҃B B B 7B XB z B B B ޣB ,B !B CCB dB ^B B ~B B B.7BOBqdBBB.BBeB;B\B~BBBB'BB&qBHBiBhBBμBhBB3BUrBw"BBB8BBBAYBcBBBB`WBBBŏBNB B*BLBnTBBBӢBiB1B8BZB|BXB%BBB%BG]Bi.BB"BD@BeBB&BvBB B-lBNBpBoBB"B}B B 89B YB zB [B B #B B !B CYB dB .B B B wB B -YB NB p?B B +B ԣB B B 9B ZB | B B B B B #B EB fB %B B 8B BOB/BQkBrBBBׯBCBBB8BZB|BGB BBB%\BG$BYBB%BG!BheBBB=BBB0 BQnBrBBbBֵB B aB :B \B }lB B $B B B $BB EB gB lB B 9B B  B /vB PB rOB B -B ֞B B B :B \nB }B ]B B QB B %JB FB hGB B IB B PBB1[BRBtkBBB BB&B=B_FBBjBBB(B(BJWBkBB%BB^BB5BW=BxBB$BBmB!BBBdeB BBcBB B.lBPBqB}B/BBBKB<B]BpB(BBBXB(BIBkBOBBBBSB6B'BdBB7BY$BzgBBB6B~B BBBc^BBBJBB B +AB LB mB DB B B SB B 6 B WmB xB /B B B \B B A+B bB B jB B EB B +%B LB n B ~B B jB B [B 6B XPB yB IB B HB B!LBBBdSBB_BBpB B-BOBpB,BBMBBqB:B[B}/BB^BBB%-BFBhfBBBDBBB2*BSButBBBiBBB?hBaBBoBBB ~B+/BLBnBJBBӵBlB$B8BZB|RB BBBEB%BB)BdB(BIBkB\BBB$BjB2BSBuBBBB&BtB B =B ^hB B B gB B B &qB GB i)B B B FB B  B 1oB RB t:B B B uB B MB B``BBuBBBB)BK>BlBbBBыB!BB6PBWByBBBWBB!BC4BdBwBBɽBbB B.BPWBqBBSBBBXB<B]BfBBB{B/B'BIBkOBBBwB0BBBB BYB:B[B} BFBBBB#JBDBeBBbBɫBB BB -B NB p-B ~B B %B yB B 8'B YB zB 4B B B MB !B CB dqB B 9B ȟB B oB ,B NDB oB B B B lB B 8QB YB {;B B )B ߡBB"BDBeBBBBB B.BPBqB)BB;BBQB:B\jB}BBBB>B%BGfBhBB*BB]BB2BT0BuBlB BڬBNBB?Ba8BBB+BB |B+&BLBn|B)BBӅB4BB8BZGB{BBaBBBrBǣBB B+@BLwBmBB$BaBBB5BV_BwBB+BrBB B ?NB `B B 5B ąB B (B ({B IB k&B }B B /B B B 3CB TB vB bB B (B B B >YB _B *B B B mB B (IB IB k+B B B υB BrB3BUcBvBYBBSBBRB?BaTBB[BBgBB*vBKBmBBB/BBNB6BXoBzBB*B޿BVB!BCBeBBUBBB ,B.BPkBr BBQBBB?B;B]B5BBˆB3BB'BI9BjBBFBBB+BYBوBBB=B^RBBBB1BlB%BFBh%BeBBB-B sB /B QB rJB B B -B |B B :B [nB |B B kB B B #sB DB f)B B B DB B B .hB OB q1B B B hB B BB#BB BB`HBBVBBfBB)zBKBlBBBB BB7LBXBzBeBB%BB BBLBcBB}BBNB B,"BMBnBhBBFBB(B7BYBzBBmBB\B!BCOBdBEBB?BB =B-BO>BpBBBBJBBVB9B[dB|BvBBBB$BF1BgB8B=GB^WBiB{BBBB$BEBgB#B@B^B~B B-BNBp B/BVB~BB B 6B X+B yZB B B B B TB @B aB B 1B lB B B )!B JaB kB B $B gB B B 38B TB uB B _B ٫B B GB =B ^B :B B B 6BB&BH;BiBBJBͦBBbB1BS"BtBBIBخBBzB.B_B*BB)BB,B(BJ2BkB;BBGBBWB4BViB B-BNBoBBBB+B?B6TBWkBxBBBBB B?,B`MBoBBöBB B '+B HTB i~B B B B 4B dB 0B QB rB 1B hB ֟B B B :MB [B |B B CB B B #B DLB eB B B fB B B -FB NB oB /B ~B B !BtB7BYBzsBB#B|BB!1BBBcBIBBBjB B,/BMBnB^BB-BBB7kBXBzDBBBގBB!pBBBdUBB>BȳB*B B-BNBp BBBBB{B8BZyB{B|BBBB#BEBHBOB?WB`aBlBxBÆBBB&BGBhBB B B9BTB/oBPBqBBB B-B RB 8wB YB zB B B CB oB B AB bB ,B ^B ƒB B B *3B KkB lB B B VB B B 4B URB vB B B aB B B >8B _B B B dB BB'PBHBiBFBBBEBB1BSMBtBB^BػBBxBB _B 8B |B B BOB'BHBj,BxBBB`BB2BSRBtBBMBآBBPBB6BWBySBBBpBB 3BABbB]BB(BB B+^BLBn2BBBuBBPB6BX/ByBBBBhB)B BB"BCBd B B B B B B*BKBlB&B0B:BFBRB2`BSpBtBBB׹BB B :B \B }/B JB fB B B "B CB eB (B LB qB B B +B MB n=B iB B B B $B 5VB VB wB B 'B ]B B B ?B `CB B B B :BzB'BHBj@BBBBWBB1BS2Bt}BBBdBBBB VB pB B B 3B TB vB B AB dB B B B_BBhBöBBUB'BHBjHBBBCBBB2DBSBtBLBaaBBB#BBBB&BGBhBpB[BHB6B %B.BOBoBBBBBB5BVBwBBBڳBB B =B ^B B B B B B $B EB gB B "B 2B CB VB -iB N}B oB B B B B B 6+B WGB xeB B B B B  B ?.B `SB yB B B BB'FBHqBiBBB*B[BB0BQBs&B[BBBB9B:sB[B|B%BcBBB#BD_BeBB&BkBB B-;BNBoBB]BӨBB>B7BXBz'BvBBBhB BB Bc`BBQBrBhBHB'B BB7BXByBBjBTB?B+B?B`BBBBBB%BFBgBBBʕBB B -B NB oB B B ҙB B B 5B VB wB B B B B B >B _#B 6B IB ^B tB B %B FB gB B B (B EB dB .B OB pB B B 2B WB~B7BXByB#BMBzBBBABb4BeBBBB1B)gBJBkB BFBBBB31BTnBuBB+BkBBB=1B^tBBBEBBB&BGdBhBBDB̐BB*B0xBQBsBABbBBB`B=BB'BHBiBBBlBSBZB _XB VB UB UB WB YB %]B FbB ghB nB vB B B B -B NB oB B B B B B 6)B W>B xUB lB B ۞B B B >B `B .B MB mB BB&BGBiBEBkB̓BBB0BQ=BriBBBB$BUB9BZB{B#BXBߎBB!BC6BdoBBB!B^B B+BMBnYBBBBaBB5BW/BxuBBBLBBB@)BatB29BSBsBBBlBGB#B9BYBzBBBcBGB-B@B`BBBùBBB&BGsBhcBVBIB=B3B *B ."B OB pB B B B B B 6B W B x B B B B #B +B >4B _?B IB VB cB qB B %B FB gB B B B B B .8B ORB pmB B B B BB7BX?ByaBBBBBB@@BahBBBBB?B(lBIBjBB+B]BBB1BS-BtcBBB BCB}B;B\B~0BnBBB)B$jBEBfB/BrBʶBB @B.BOB"wBCHBdBBBƖBmBEB)BIBjBBBmBNB/B0BPBqBBBԑBzBeB7QBX>By,BB BBB B >B _B B B ·B B B %B FB gB B B ʩB B B -B NB oB B B B B B 6B WB xB 0B AB SB fB zB >B _B B B B B"B&>BG[BhyBBBBBB/>BPbBqBBBB#BLB8vBYBzBB'BVBB BABcBJB}BƱBB B*RBKBlBB3BnBBB4!BU^BvBBBZBBB>BB3}BTKBuBBB׎BbB7B:BZB{BBsBOB-B B@BaBBBvB\BBB'+BHBhBBBBB B .B OB pwB kB `B VB NB FB 6@B W:B x6B 3B 1B /B /B 0B >3B _5B 9B >B DB KB SB %\B FgB gqB }B B ʘB B B -B NB oB B B +B BBYB6rBWBxBBBBB6B?VB`wBBBBB'B'MBHsBiBBBBABmB0BQBrB#BSBփBBB:B[MB|BBB#BZB"BCBeB?BzBȵBB /B,lBB#BDwBeBBBBǪBzB LB*BJBkBBsBLB%BB0BQBrBvBWB8BBB7BXByBBBmBYB FB ?4B `#B B B B B B %B FB gB B B ʮB B B -B NB oB B B ҨB B B 5B VB wB B B B B B > B _B 'B 8B IB [BoB%BFBgBBBBB *B.EBObBpBBBBBB7@BXcByBBBBBGB@pBaBBBBHBvB(BIBkB4BeBΗBBB22BSgBtBB BBB{BBBB4BUeBv-BBB؎B[B)B:B[B|BoBCBBB BABbzBUB2BBBB'BHBitBXB>B$B B B .B OB pB B B B pB aB 6SB WGB x;B 1B 'B B B B > B _B B B B B B %B FB g B B B B !B )B -3B N=B oIB UB bB pB BB5BVBwBBBBB/B>HB_`BzBB°BBB&BG&BhEBfBB˩BB B/BP:Bq`BBBBB*B8TBYBzBBB5BdB BABbB(B[BƎBBBB_BBB4XBUsBvBBBBB%B=EB^fBBBBBcBBB&}BG3BgBB\BBB B,MBM BmBBPBBBB2fBS.BsBBB[B(BB8BYBzjB>BBBB B ?nB `GB "B B B B B %wB FWB g9B B B B B B ,B MB nlB WB BB 0B B  B 3B TB uB B B طB B B ;B \B }B B ~B zBvB"sBCqBdpBpBqBrBuB xB*|BKBlBBBϝBBB2BSBtBBBB BB;+B\=B}OBbBvBBB"BCBdBBB.BHB dB+BLBmBBBBpBBB~B70BWBxBMBBڻBtB.BBABEBJBOB!UBB\BcdBlBvBƀBBB)BJBkBBBBBB2!BS4BtGB\BqB׆BBB:B[B|BBBxB"BBzB'(BGBhB9BBʟBTB B,BMzBn3BBBfB$BB2BSeBt'BBBuBB _B zB GB B B B $B EXB f+B B B ȪB B YB +2B L B lB B B ~B \B oB_gB_BYBRBMBHB%EBFABg?B=B=BB-?BNBBoEBIBMBRBXB^B5eBVmBCBdfBBB9BBvB(BHBi[BBBIBB B-BBMBnBEBBСBQBB2BShBtBBB@BBB8lBY(ByBBaB!BB B >gB _+B B B |B DB  B #B DB enB ;B B B B wB *IB KB kB B B nB FB B 0B QB rB B cB AB B B 7B XB yB B gB KB 0BB>B_BBB BBvB%cBFPBg>B-BB BB B,BMBnBBBѪBBB4BUBvBBzBvBsBpBB%B BB4BUBvBBBuBbBQB<@B]/B~ BBBBB"BCBdBBBǫBB B*BKBlBBB~B|BzB2xB#BD?BdBfBBƑB(BB(ZBHBiB-BBjB B B-NBMBnBB OB oB B lB :B B B 4B U{B vMB B B B BtB;LB\#B|BBBߊBfB!BBB BbBBBŜB}B_B(ABI%BjBBB̸BBB/nBPWBq@B*BBBBB6BWBxBBBqBbB[BB4gBTBuxBBBBB6B8BYVByB{BBۥB;BB=kB^B~B;BBuBB!BBUBbBB>BBB1B&BGBh,BBB1BB B ,>B LB mB TB B ϽB sB *B 1B RB sTB B B ՇB DB B 7B XB yCB B B ۋB OB B =B ^B jB 3B B B B #_B D,B dB B B hB 9B B)BJBkB[B0BBBB0BQiBrCBBBBBB7qBXPBy0BBBBBB>B_dBJB0BBBB$BEBfBBxBdBQB6BB$:BDBeCBBPBBbBB(xBIBiB"BBCBB iB,BMBn)BBZBBB*B1BReBsBBEBBB.B6BWyBx BBqBBB rB <B \B }|B +B B ߎB AB B AB b^B B B ĄB =B B &B GnB h+B B B fB 'B B ,B MlB n0B B B ЀB GB B 2B SB tlB 7B B B BlB9;BZ BzBBBRB&BB?B`B|BSB,BBB%BFBgoBKB(BBB B,BMBneBFB)B BBB3BTBuBjBRB:B BBB4BU BuBBBBB&B8BY9ByBPBBkBBB=B]B~BBBmBBB!4BABbhBBB?BB~B&BFBgdBBBRBB B +JB KB lB JB B ΤB SB B 0B QcB rB B |B 1B B B 6UB WB wB B =B B B sB <2B \B }B rB 4B B B !B BDB c B B B aB *BB'BHBiWB$BBBB `B.1BOBoBB{BPB%BB4BUBvBYB2B BBB;B\zB}XB5BBBB!BBBcuBXB:BBBVBB$MBDBeHBBHBBKBB(TBHBiaBBrBBB B,BM/BmBOBBtBBB11BQBr`BBB-BBfB6BVBwBBBB(BB oB ;B [B |cB B B _B B B @cB aB B pB B B B %8B EB fB WB B B B 8B *B KB liB &B B ΢B bB !B 0B QB rfB )B B ԲB xB>B7BWBxB`B*BBBB=ZB^(B~BBBfB8B# BCBdBBYB.BBB)BJBkdB=BBBBB0BQbBr?BBBBBBB4BUBu{BBuBBsBB8vBXBy}BBBBB BB2 BRBsB{BLBBBB8BYjBz?BBBBBqB?IB`"BBBpBBTBB$=BDBe*BBBƗBBB( BHBi BBBʒBB B,!BLBm1BBEBB]BB0yBQBqB*BBPBBzB5BUBv@BBuBBB IB 9B ZB {&B B iB B B TB >B _B GB B B BB B #B DFB dB B PB B B cB )B IB j}B 2B B ̟B VB B .B OB p;B B B pB -BB4BUkBv,BBBsB6BB:B[B|KBBBޣBlB 6BABaBBdB1BBB&BGlBhB ^B tB ,B B BXB#BCBdBGBBBBCB)BIBjBIB BBB[B/!BOBpBwB@B BBB5iBV5BwBBBjB9BB;B\B}zBBZBB1BB$ BDzBdB\BBBBB,B'BHBhBBBBB B+BKBlBBB BBB/BP%BpB9BBPBBlB3BTBuBBABBiB B 8B Y-B yB `B B ەB 1B B =lB ^ B ~B LB B B 2B !B B{B c!B B oB B B jB 'B GB hmB B B wB &B B ,B M9B mB B TB B BuB2,BRBsBVBBBBBB7BXBy{B:BBۺB{BPB^BMBBMBBQB!BBYBbBeBBuBB B &B FB g,B B HB B hB B *B KB kB GB B rB B B /;B OB poB B B CB B B 4B TB uaB B B HB B B 96B YB zB +B B }B 'BB>}B_)BBB2BBB#ABCBdBVBBƼBpB%B(BIBjGBBBoB(B B.BOWBpBBBIBBB4B@BaBjBB#BBB#@BCBdBgBB1BBB&hBFBgyB _B B ?B B qB  B "B CBB cB |B B ŹB YB B 'B HB B fB B B (B 1B RXB rB B %B B ]B B 6B W6B wB tB B ٶB XBB;B\BB|BB1BBB (B@BazB$BByB%BB%BF-BfBB:BBB LB*BKBldBBB΀B5BBB@NB`BBIBBBNB"BCBc]BBBuBB5B%BEBf\BB&BǍBB]B(BI1BiB BwBBUB B,7BLBmBBB|BBkB/BP^BpBTBBNBB LB 3B TMB tB QB B YB B eB 7B XtB xB B B ڜB (B B 1B ^B LB B iB B B "B BB c?B B fB B B&B&BGTBgBBBɸBSB B+BL'BlBbBBΟB?BB0BQ!BqBfB BӭBQBB5BVABvBB6BBBB/NBOBoB(BsBпB BZB1BQBrKBBBDBBB4GBTBtBSBB BhBB7%BWBwBHBBBuBB:ABZB{B{BBQBB*B=B^B~wBBZBB @B B A)B aB B B B B B $uB DB enB B iB B hB B (kB HB ipB B xB B B B ,B MB mB .B B DB B ]B 0B QxB rB B 'B ӸB IBB5oBVBvB,BBWBBB:BZB{PBBBBBXB>B_B0BBnBBB#OBCBdB4BB{BOBBB?B_\BBB0ByBB!BAZBaBBEB•BB8B#BCBd5BBB:BBB&IBFBgB_BBBBB)CBIBj BqBB>BB B,yBLBmPBB*BΘBB wB /B PZB pB @B B )B B B 3B TB tB B tB B mB B 7gB WB xfB B gB B lB B ;rB [B |}B B B B B #B ?B `7B B NB B hBB#BDBdB4BBWBB|B(BHBi9BBdBBB *B,BM[BmBB)BB`BB1BR7BrBsBBBBTB.BNBoBYBBB(BoB0BQBqJBBB.B|BB3BSmBsBBfBԻBBgB5BVBvrBB(BׅBBAB8BYBybBB'BڋBBUB;B\#B|BB_BB6B B ?B _~B B ]B B @B B "&B BB cB B B rB B cB %B FWB fB NB B IB B FB )B JFB jB IB B OB B WB -B NcB nB qB B ЂB BB2 BRBs7BBQBBnBB6BWBwB?BBdBBB; B[B|JBBwBBB>B?B`pB BB\BݖBB B>IB^B~BBFB߈BB B@TB`BB(BqBBB"RBBBbBBBB(BXB B,BLBm BUBBBB2B.kBNBnBB\BϛBBB0]BPBpB'BmBѳBBBB2BRBs!BmBBBVBB4BUGBuBB@B֕BBAB7BWBxJBBB[BB B :rB ZB {1B B B UB B B =B ]B ~LB B B ߂B B UB @B a+B B B qB B NB #B D.B dB B B B jB B 'SB GB h@B B /B ɧB B B+BKBl BBBBB{B.BOzBoB{BB~BBB3BSBtBBB՟B&BB74BWB{=BgBB۽BBBB^GB~BBB0BlBB?B`(BhBBB.BrB!BABbCBBBBeBB#BDHBdBB2BłBB #B &uB FB gB pB B B rB B )"B I{B iB 0B B B DB B ,B L_B lB B B B DB B / B OoB oB :B B B oB B 2AB RB sB B B XB B2B5BVBv~BB^BB@BB9$BYBz BBBiBBUBB B B #B C_B cB B ?B ċB B %B %sB EB fB aB B B VB B 'B HPB hB B QB ɧB B WB *B KB kbB B B sB B +B-BMBnDBBBcBB$B0BPBqJBBBuBB>B3BT BtpBB>BզBB&BFBfB BB1BDBXB'mBGBgBBBBBB(8BHVBhuBBBBB B)@BIeBiBBBB,B WB*BJBjB B8BgBB B+BL.BlbBBBB:B rB-BMBnBYBBBB NB /B OB p B MB B B B ZB 1B QB r*B qB B B JB B 3B T*B tuB B B ]B B B 6JB VB vB =B B B 5B B 8B Y3B yB B 7B ڎB B@B;B[B|LBBB_BBB>uB^B2BBBPBB!BAsBaB7BBBB(B62BV=BvIBVBdBsBBB6BVBvBBBB&B?B7XBWsBwBBBBB%B8FBXhBxBBBBBFB9nBYByBBBBBpBB:BZB{,B]BBBB*B<_B\B|BB%B ^aB ~B B B YB B B @B `\B B B &B kB B !B B=B bB B B _B B B $?B DB dB $B rB B B `B &B GB gQB B B IB BB)EBIBiBGBBBMB B+BLXBlB BgBBB{B.BO5BoBBOBfBkB%qBExBeBBBŞBBB%BEBeBBBB,B@B&VBFlBfBBBBBB'"BG@Bg_B~BBBBB((BHMBhsBBBBB ;B)eBIBiBBBFBvB B*BKBk;BnBBB B CB ,zB LB lB #B ]B ͘B B B .LB NB nB B GB χB B  B 0LB PB pB B \B ѢB B /B 2vB RB sB PB B B 0B |B 4B UB ubB B B NB BB7?BWBwB4BBB/BB9BZ-BzBB0BۇBB7BB ^B B TB B B B \B @B `B )B oB B B CB "B BB cB eB B B FBB$BE*BewBBBbBBB'RBGBgBFBBB>B B)BJ:BjBBBBB#BCBcBBBBBB#BDBd BBB)B5BCB$QBD`BdpBBBĥBBB$BDBeB'B@BZBtBB%BEBeBB%BFBgBB&BFBfBB?BfBBB'BH Bh4B_BBȹBB B )CB IsB iB B B :B mB B *B K B kBB yB B B "B [B ,B LB m B HB B B B >B .~B NB nB ?B B B B IB 0B PB qB \B B B 0BwB2BS BsRBBB1B|BB5BUaBuBBJB֙BB7B7BWBx(¡8¡/¡&¡¡¡ g¡@    ݂ K    L   k   wl n d [P Q H ? 5 ,3 " C  FŸŸ;ŸŸ#Ÿ֑ŸŸdŸŸ*ŸŸŸ8ŸŸŸv'ŸloŸbŸXŸO4ŸEoŸ;Ÿ1Ÿ( Ÿ7Ÿ`Ÿ Ÿžžžž žž'ž0ž5ž7ž5ž/ž%žžužjž`žVžLžB}ž8Vž.,ž#žžž\Qǵa Otj9_UHJ@H5+9  œMœœœ^œ˱œœJ¡$¡¡¡ ¡x Q '   ҕ ^ $   a    0 u l c) Y Pi G = 40 * !O  ` ŸdŸŸZŸŸCŸ˲ŸŸŸŸMŸŸŸ]Ÿ~ŸuŸkNŸaŸWŸNŸD^Ÿ:Ÿ0Ÿ'Ÿ6ŸcŸ žžžžž(ž<žMžZždžižlžjžež~]žtPžj@ž`-žVžKžAž7ž-ž#jž<ž ža!іJQ6~tfi_UJ@5+  oœCœœœaœ˹œ œ]œœ¡¡   h >   Ǯ w =   | 5  } tM j a XG N E <$ 2 )Q  q   ŸŸŸŸŸŸiŸŸEŸŸŸvŸŸ0Ÿ}ŸsŸj-Ÿ`zŸVŸM ŸCNŸ9Ÿ/Ÿ&Ÿ6ŸhŸžžž ž*žFž_žtžžžžžžž}žsžiž_žUlžKVžA<ž7ž,ž"žžžQj'HF~t"i_LTJg?5r* n [œ8œœœfœœœpœœœWœ     [ /    \     V |  r ip ` V Mk D : 1I ' w     $ŸŸ0ŸŸ/ŸҪŸ!ŸŸŸrŸŸBŸŸŸ|`ŸrŸi Ÿ__ŸUŸKŸB>Ÿ8Ÿ.Ÿ$Ÿ8ŸmŸžžž žDžež̂ž›žžžžžžž|žržhž^žTžJž@ž6ž,ež"Dž ž ži2йw1H~>siy_TJ6?5K* P Fœ-œœœiœœ)œœœ*œxœœœvJ   ֦ } Q "    D   z| q3 g ^ UD K B 98 / &t     6 ŸQŸŸ_ŸŸ_ŸŸRŸŸ7ŸŸŸuŸŸ{9ŸqŸgŸ^DŸTŸJŸA0Ÿ7wŸ-Ÿ#Ÿ:ŸsŸžž ž7ž_žՄž˥žžžžžž!ž)ž|-žr.žh+ž^%žTžJ ž?ž5ž+ž!žž ožGڅK >M}si:^ToJ?5#* 2 2œ"œœœmœœ6œœœGœœœ3œvzœkœ`   ¥ y J    o 0 x o f` ] S Jr A 7 .g %  > ŸhŸŸŸ ŸٓŸŸƔŸŸŸŸoŸŸGŸŸzŸpsŸfŸ]*ŸSŸIŸ@"Ÿ6nŸ,Ÿ"Ÿ=ŸzŸžžžOž|žԤžžž ž$ž;žOž_žkž{tžqyžg{ž]yžSsžIjž?]ž5Mž+8ž! žž žrDŤh'O}sUh^T9I?i4*  œœœœqœœDœœœcœœœ_œvœkœa7œVwœK    y G    wa n d [ RF H ? 6P , # =  uŸ ŸŸ0ŸŸFŸŸPŸŸKŸŸ:ŸŸŸŸxŸoRŸeŸ\ŸRkŸHŸ?Ÿ5eŸ+Ÿ!Ÿ@ŸŸžž4žhžݘžžžž8žVžržžžžzžpžfž\žRžHž>ž4ž*ž žyž ^ž@١p<E}dsh^bTI?=4*g œ œœœuœœQœœœœœ5œœvœl(œaqœVœKœA5œ6n    { G  u l cV Z P G~ >0 4 + "2  x ŸŸHŸŸmŸŸͅŸ ŸŸŸŸŸ|ŸŸ^ŸwŸn3ŸdŸZŸQXŸGŸ> Ÿ4^Ÿ*Ÿ ŸEŸ Ÿž žIžžܶžžž?žfžžžžžžzžpžfž\#žR&žH%ž>!ž4ž*žžž ž~Y0i.f}rh}^(SIr?4*Dh }œœœœyœœ_œœ6œœœ[œœw œl]œaœVœL<œA~œ6œ+œ!,    } tJ k a X OM F < 3n *   q  ŸWŸŸŸŸձŸ?ŸŸQŸŸVŸŸMŸŸ7ŸvŸmŸc}ŸYŸPEŸFŸ<Ÿ3WŸ)ŸŸKŸ Ÿžž_žžž ž<žjžžžžžž7žyMžo_žemž[xžQžGž=ž3ž)zžožaž Ož9 ؿΗl= [|rh>]SIA>4*"O nœœ|œœ|œœlœœMœœœœœw;œlœaœW4œLœAœ7 œ,Iœ!œœ  $ { r i `P W M D ;I 1 ( a     \ŸŸŸ:ŸŸgŸŸŸŸŸ ŸŸŸŸŸuŸkŸbcŸXŸO3ŸEŸ;Ÿ2QŸ(ŸŸQŸ Ÿž2žvžžž-žcžžžžž=ž^ž|žxžnždžZžPžFž<ž2ž(žžž žnO+zD |rHh]SdI>4^)6 ^œœwœœրœœzœœdœœ?œœ œwkœlœbœWsœLœBœ7Wœ,œ!œœ Qœ› q9 h ^ U LZ C 9 0 'G    W ŸŸJŸŸ܆ŸŸɵŸHŸŸcŸŸqŸŸqŸ}ŸtdŸjŸaJŸWŸN"ŸDŸ:Ÿ1LŸ'ŸŸXŸ ŸžEžžžžQžƌžžž&žRž{žžžwžmždžZ&žP6žFBž47) Oœœqœœքœœœœ|œœ`œœ5œwœlœbXœWœMœBWœ7œ,œ"3œtœ œ›!›R› ]P T J A 8g /$ %  I   ŸQŸŸŸ<ŸŸrŸ ŸŸ+ŸŸAŸŸIŸ|ŸsDŸiŸ`2ŸVŸMŸC}Ÿ9Ÿ0HŸ&ŸŸaŸ Ÿ žZžžž4žvžŵžž'ž[žžžžžw+žmJžcežY}žOžEž;ž1ž'žžž oU7j6{qg]ARH>b4)b @œœkœœֈœœœœœ œœœ`œwœm/œbœWœMIœBœ7œ-@œ"œœ œR››››$›O Ik @3 6 - $v 1  ŸNŸŸŸNŸŸГŸ0ŸŸaŸŸŸŸŸ"Ÿ{Ÿr%ŸhŸ_ŸUŸLŸBqŸ8Ÿ/EŸ%Ÿ ŸiŸžžožž žVžΜžžžYžžžž%žOžvvžlžbžXžNžEž;ž1"ž'-ž4ž7ž 73,!nF{qgF]RH>73)E 0œœeœœ֋œœœ'œœ'œœœœwœmcœbœX-œMœBœ8>œ-œ"œ,œ tœ››2›j›מ›››! 5 ,N #   AŸŸŸVŸŸةŸNŸŸŸ(ŸŸTŸŸrŸŸzŸqŸgŸ^ŸT~ŸJŸAgŸ7Ÿ.CŸ$ŸŸsŸž-žžž*žxžž žLžžžž7žižžužkžb žX.žNKžDdž:zž0ž&žžž֑jQ5{qq?g \RHQ> 3)w' |!œœ`œœ֏œ!œœ9œœCœœ=œœx'œmœcœXkœMœC/œ8œ-œ#7œœ œ›a››››L›}››› ! l + ŸŸUŸŸŸbŸ ŸįŸQŸŸŸ#ŸŸIŸŸycŸoŸfnŸ\ŸSmŸIŸ@^Ÿ6Ÿ-BŸ#ŸŸ~Ÿž@žžžIž֛žž4ž|žžž=žwžž~žužk:žacžWžMžCž9ž/ž& žž%ž.342,"{U{+pf\R^H!=3)V  iœœZœœ֓œ)œœLœœ^œœbœœxVœmœc;œXœNœCvœ8œ.4œ#œœ4œ›››S›ؑ›››3›`›››   ŸKŸŸŸlŸŸŸqŸŸŸXŸŸŸ"ŸŸxCŸnŸeVŸ[ŸR]ŸHŸ?VŸ5Ÿ,AŸ"ŸŸŸžTžžžižտžž`žžž9žzžžž~)žt\žjž`žVžMžC(ž9Gž/bž%yžžž߹մˬ|eJ, zpf\^R*G=3w)4 UœœTœœ֗œ2œœ^œœzœœœœxœmœctœXœNSœCœ9#œ.œ#œ>œœ›5››› ›I›Ä››››H›o››wŸŸŸmŸ#ŸŸˆŸ3ŸŸŸ&ŸŸbŸŸŸw#ŸmŸd?ŸZŸQMŸGŸ>NŸ4Ÿ+AŸ!Ÿ'ŸŸžhžž,žމžž:žžž)žqžžž7ž}ržsžiž`žV;žLežBž8ž.ž$žžž&4>DGFB:/  zpzfQ\%QG=3Q) AœœœNœœ֚œ:œœoœœœ"œœ2œxœn2œcœY"œNœDœ9nœ.œ$9œœœK›››:›ق›››B›z››› ›3›xW›mw›bŸ!ŸŸӒŸFŸŸŸNŸŸŸ8ŸŸoŸvŸlŸc(ŸYŸP>ŸFŸ=GŸ3Ÿ*CŸ Ÿ1Ÿ Ÿž}žžIžݫž žcžžž^žžž:ž}ž|žrži0ž_ežUžKžAž8ž.9ž$YžužžvzYp9f[QG=a3+(r .œœœIœœ֝œBœœœœœBœœ[œxœneœcœY_œNœDJœ9œ/&œ$œœRœ››\›››C›Ĉ›››?›u›››x›n"›cC›Xa›MzŸOŸŸŸlŸŸŸlŸŸŸ~NŸtŸkŸbŸXŸO1ŸEŸœœ֥œSœœœGœœœœœy>œnœdSœYœOYœDœ:Pœ/œ%7œœœv››7›››;›Ŋ›››`››››zF›ov›d›Y›N›D ›9(›.@›#TŸŸgŸŸŸjŸ|ŸrŸiPŸ_ŸVŸMŸCŸ:8Ÿ0Ÿ'KŸŸQŸ ŸJžž5žžž}žžGžžž\žžžSžzžpžg+ž]mžSžIž@ž6Ož,ž"žžž<Wn݂ӓɠyowe`[FQ)G<2(^* œœzœ8œœ֨œ[œ œœ]œœœ>œœylœnœdœZœOœEœ:œ0œ%œœmœ›@›››_›з› ›[›››4›t››z›p›eO›Z|›O›D›9›/›$ ›5›FŸŸŸHŸzŸqŸh9Ÿ^ŸUuŸLŸBŸ95Ÿ/Ÿ&PŸŸ^Ÿ Ÿ^žžQžž7žХžžwžž;žžžIžžyžp8žfž\žSžIFž?ž5ž+ž"žKžuž'9GQX[[WPyEo7e%[PF<2(lA œœpœ2œœ֬œdœœœtœœœbœœyœo/œdœZPœOœEbœ:œ0dœ%œWœœ;›››t››2›Ƌ››1››››O›{›p›e›[.›P\›E›:›/›$›››/š=Ÿ'ŸyŸp~Ÿg$Ÿ]ŸTgŸKŸAŸ83Ÿ.Ÿ%VŸŸkŸžsžžnžž\žž=žžžtžž3žžžy9žožež\žRežHž>ž5#ž+\ž!žž žBfܣҼ  yndZPF<2o(L% œœfœ-œœְœlœ$œœœ7œœœ)œyœobœdœZœPœEœ;/œ0œ&3œœ)œ››|››K›ѭ› ›e›› ›\›››|0›qn›f›[›Q›FB›;n›0›%››› šš,š8ŸoeŸfŸ\ŸSZŸIŸ@Ÿ72Ÿ-Ÿ$\ŸŸyŸžž žž ž؂žžjžžEžžžužž/žxžnže,ž[zžQžH ž>Nž4ž*ž!ž:ž lž3QkxndZPF}››|›r›gU›\›Q›F›<.›1Z›&›››ššš"š.š6Ÿ[ŸRNŸHŸ?Ÿ61Ÿ,Ÿ#cŸŸŸžž'žž+žרž"žęž ž|žžRžžžyžwžn-ždžZžQ#žGnž=ž3ž*:ž wžž žJv6J[gpvxynwdrZjP^FO<;2%(  œ~œQœ!œœַœ|œ>œœœlœœœzœz!œoœefœ[œPœF0œ;œ1Pœ&œ`œœa››R››5›ҡ››l››)›››&›}s›r›h›]B›R›G›<›2›'M›v››ššš šš*š3š9ŸGŸ>Ÿ51Ÿ+Ÿ"kŸŸŸ)žžBžžNžžMžž?žž#žžžažžw$žmžcžZ0žPžFž=ž3ež)žž)ž dž,V|Ǟ$.x5n8d8Z3P,F!<2' œoœGœœœֺœ̄œJœ œœœ>œœœzOœoœeœ[>œPœFuœ< œ1œ',œœ?œ›B››5›ݩ››ȇ››U›››l››~›sb›h›]›S4›Hr›=›2›(›E›o›šššš šš+š6š=š@Ÿ43Ÿ*Ÿ!tŸŸŸ>žž_žžržžyžžsžž_žž>žžžvtžlžc2žYžOžF5ž<ž2ž)ž`žž žT9\|wmcYOE;1' œaœ=œœœ־œ̌œWœœœœ]œœœz|œp)œeœ[yœQœFœk›3›(››B›nšššššš"š2š?šGšKšKŸ ~ŸŸ ŸSžž{ž žޗž ž˦ž(žž#žžžžž\žužl)žbžXžOCžEž;ž2>ž(žžž ^žHzШ?\vwmcYOE;1' mœRœ3œœœœ̔œdœ/œœœ|œ9œœzœpZœf œ[œQZœFœ<œ29œ'œfœœ› ›››ޒ› ›ɂ››c››6›››T›t›j›_P›T›I›?)›4j›)››› Ešršššššš.š?šLšVš[š\š{ZŸ Ÿižžž,žݼžIžžYžž\žžQžž:ž~žužk~žažXEžNžDž;Wž1ž'žJžž ž` ?n&AXwkm{cYOE;1'}n ZœDœ)œ œœœ̜œpœ@œ œœœ\œœzœpœf>œ[œQœGAœ<œ2œ(#œœRœ›q››››Ԅ››v››Z››.›››uP›j›_›UO›J›?›5,›*m››› šMš{šššš š(š>šQš_šjšqš|sšqršfmžžžOžžsžžžžžžž žž}žtgžjža<žWžNžDdž:ž1ž'nžžž Zž'eٟ 9fw(m=cNY[OeEk;n1n'ibV Hœ5œœœœœ̤œ}œQœ"œœœœBœ{œpœftœ\(œQœGœ=.œ2œ(uœœœ C››e››x››{››p››V››,››u›kQ›`›V›KT›@›5›+4› w›› ›(š[šš߶ššš!š=šUšhšxšš}šršgš\šQžrž žҞž/žžHžžTžžSžž}Ežsžj)ž`žWžMgžCž:+ž0ž&ž7žž ž$m2mť 7avlcY&O4E>;F1I'JF? 5œ'œœœœœ̬œ‰œbœ8œ œœœjœ{-œpœfœ\bœRœGœ=vœ3 œ(œiœœ ›:››^››s››y››p››W››0›v›k›aX›V›L ›A^›6›+›!A›› ›š:šoššššš;šXšqššš~šsšhš]šRšGš<žž_žžž žžžžž|žs žiž_žV_žLžC1ž9ž/ž&Sžžž X=Ay8`vlbXOE;1%'*+( "œœ œœœœ̴œ•œsœMœ$œœœœ{Zœqœfœ\œRVœH œ=œ3lœ)œœbœ ››7››\››s››{››t››^››w9›l›b›Wd›L›B›7n›,›" ›U› ›ššRššֺššš7šYšxšššštšiš^šSšHš=š2š'ž%žžGžž\žždž{žr^žhž_LžUžL-žBž9ž/ež%ž%žž+|ZΝS=vblbXND:1'  œ œœœœœ̼œ¢œœbœ=œœœœ{œqNœgœ\œRœHNœ>œ3œ)hœœœ aœ››8››`››y››››~››j›w›mG›b›X›Mv›B›8-›-›"›#› m›šš4šošצššš3šZš}ššššušjš_šUšJ š? š4š(ššžžžž)žž{2žqžh/ž^žUžKžBž8lž.ž%:žžžWU6z1hv lEbgXND:0&œœœœœœœ®œœxœWœ3œ œœ{œqœgIœ]œRœHœ>Lœ4œ)œiœœ œe›››?››i››› ›››››x|›m›c[›X›N+›C›8›.F›#››?›šššVšؒššš.šZšššššvšlša#šV0šK9š@>š5>š*<š5š*š ™žžržžzžqžgž^žT~žJžAhž7ž.Ež$žžxž34׃[Mulb.XQNpD:0&œœœœœœœºœœœqœQœ.œœ{œqœg~œ]HœSœHœ>œ4Pœ* œœoœ œ›n›››L››x›››››%››y›n›d›Yt›N›DF›9›/ ›$e›››bššš<š}šκšš(šZšššššxšm0šbFšWXšLgšAqš6wš+yš wšrš h™Z™H™3žIžyžp\žfž]ažSžJZž@ž7Ež-ž$#žžžXohôB7lukaXN@D`:}0&œœœœœœœœœœœoœQœ.œ|œqœgœ]œSMœIœ>œ4œ*Yœ œœ {œ*››}›!››^›››››5››>›y›o8›d›Z#›O›D›:g›/›%,›››8ššš!šgšϩšš!šXšššš šy.šnMšchšXšMšBš7š,š!šš š™™™z™bžožf9ž\žS@žIž@:ž6ž-'ž#žžqž=V֭Q.q&u\kaWND4:U0r&œœœœœœœœœœœœsœUœ|4œrœgœ]œSœIWœ?!œ4œ*œ gœ!œ œ›<›››6››u›››7››Q››z\›o›eX›Z›PE›E›;$›0›%›U›› šcšššPšЗšššUšššššzEšoišdšYšNšCš8š-š"šš š™™™™™ʰ™ž\žRžI$ž?ž6 ž,ž#žžž[(C̛A d~ukQaWMD:-0O&mœœœœœœœœœœœœœ|œ|_œr>œhœ]œSœIœ?gœ51œ*œ œzœ 6œ››S››ت›P›››,››W››s›z›p›f›[~›P›Fn›;›1N›&›››š=ššš8šфšššRšššš.š{[špšešZšOšEš:š/+š$9šCšIšK™I™C™9™+™™™™žHž?ž5ž, ž"žžmžIz5Ž5[~tkaKWMC:0,&Nmœœœœœœœœœœœœœœ|œrnœhOœ^,œTœIœ?œ5|œ+Gœ!œœ œO› ››p›››p›››O››|› ›{›q#›f›\+›Q›G$›<›2›'}››Q›ššršš šqšǾššMšššš=š|pšqšfš[šQšF1š;Lš0dš%wššš™™™™؎™͂™q™]™D™(™ž4ž+}ž!žtžž_< p,.~~WtjaWKMC90&/Ssœœœœœœœœœœœœœœ|œrœhœ^dœTBœJœ?œ5œ+œ!bœ*œ œ›n›(››ْ›A›››9››w›››|8›q›gP›\›R[›G›=V›2›(B›››ššOššš]šȯššHššššLš}šršgš]šR;šG_š<š1š&ššš™™™™™™™™™™™j™Fž!qžžjžV5ޟk)-}~tYj`WMPC9/&8\}œœœœœœœœ œ œ œœœœ|œrœhœ^œT~œJ]œ@8œ6œ+œ!œœ Kœ›››M››Ϲ›i›››d›››>›|›rh›g›]›S ›H›>›3›)›{›› Zšš+šššGšɟššBššššZš~šsšiš^5šSbšHš=š2š'š šš1™>™H™N™P™N™H™?™1™™ ™™™w™lž žeR3Ԟj*0}tj``VM CZ9/%Fkœœœœœœœœœœ"œ!œœœ} œrœhœ^œTœJœ@~œ6Zœ,3œ"œœ œr›9›››x›0›››D›››7››}r›s ›h›^.›S›ID›>›4K›)›C›› ,šššnšš1šʎšš;ššš!šgšštšj š_VšTšIš>š4š)*šIšdš{™™™™ܰ™ѳ™Ʋ™™™™™s™[™y>™n™b™WeT5ʡ p09}sj$`lVLC.9i/%0Yœœœœœœ œœ)œ4œ;œ?œ?œ<œ}5œs*œiœ_ œTœJœ@œ6œ,œ"Zœ0œœ››e›*››Ч›a›››x›#››n›~›s›iC›^›Tj›I›?›5›*› ›› ›qššMššš|šš3ššš)šsššušk;š`všUšJš@š5<š*dššš ™™™™™™™™™™™™™z™o™d™Yo™NG™CZ=z<}Gsi`4V}LC9B/}%Gœqœœœœœœ'œ:œHœTœ\œ`œbœ}_œsYœiPœ_CœU3œKœAœ6œ,œ"œœ^œ2››››\››››M›››]››~›tK›i›_›U›J›@:›5›+M› ›P› ›Fšš,šššišš*ššš/š~ššwšlUšašVšL šA?š6pš+š šš š)™C™Y™j™x™ɂ™™™™™x™j™|X™qB™f)™[ ™O™D™9™.keJ"M}sZi_VILB9/Z%5œdœœœœœœ3œJœ]œmœyœœœ}œsœiœ_zœUnœK_œALœ76œ-œ"œœœ›e›7›››є›W››››>›››E›t›j›`,›U›K^›@›6›,›!›› ›šš š|ššVš½š ššš4šššx&šmnšbšWšM2šBlš7š,š"š,š Sšu™™™™™™™™™™™™}™r™g™\™Q™Fi™;D™0™$™\5b|sir_VLdB8/8%x$œVœœœœœ!œ?œZœqœœœœœ}œsœiœ_œUœKœAœ7~œ-iœ#Pœ4œœ›››p›?› ›››U››››1››u›k1›`›Vt›L›A›7=›,›"[›› k›šlšš^ššAšíššzšš8šššy9šnšcšYšNZšCš8š. š#>šmš š™™™ ™8™L™]™i™r™v™w™t™l™ta™iR™^?™S(™H ™<™1™&™x™I™sN|}ri7_UL5B8/%ZœIœ|œœœœ(œKœjœœœœœœ}œsœiœ_œUœKœAœ7œ-œ#œœnœO›-›››ܰ››K››››W›››z›v)›k›a|›W!›L›B_›7›-›# ››9›šDšš?šٸš,šĝš štšš<šššzKšošdšZ8šOšDš:š/?š$xššš ™3™X™y™ؖ™Ͱ™™™™™™™™u™j™_™T™I™>™3x™(V™1™™˜˜rk|:rh_XULBY8.%;œ;œsœœœœ0œWœzœœœœœœ~œtœjœ`œV!œLœBœ8œ.œ#œœœ››n›I› ››››[› ›››\››v›lw›b$›W›Mr›C›8›.M›#›w››ššš šڝššŌššmšš>ššš{\špšfš[XšPšEš;3š0tš%šš šR™™™™™™,™C™V™e™q™x™{™wz™lv™am™Va™KQ™@<™5$™*™™™˜n˜>˜ ˜{r^h_"U~KB.8.%fœ.œiœœœ œ7œbœœœœœœœ~1œt@œjMœ`VœV[œL^œB\œ8Xœ.Oœ$Dœ5œ"œ ››››ݐ›i›>››››n›1›››we›m›b›Xx›N#›C›9l›/ ›$›>››cššzššہššzššdšš?šš š|lšqšg"š\wšQšGšš4 š)Vššš %™b™™™™1™[™™™™™™™|™q!™f(™[,™P+™E'™:™/™$™™ ™˜˜u˜M˜!˜˜˜˜H˜KNA8.k$kœœNœœœœNœÅœœœœBœiœœ~œtœjœ`œW œMœC&œ9.œ/3œ%5œ3œ-œ%››››››ʧ››a›9› ›››u›y;›n›d›Zx›P0›E›;›1B›&››4›šnššš*šӷš?ššGšš?šš(ššušjkš_šU/šJš?š5:š*šš#š i™™™$™[™Ԏ™ɽ™™™4™T™p™™}™r™g™\™Q™F™;™0™%™™™z˜_˜@˜˜˜˜˜k˜4˜˜˜x7.J$VœœEœœœœUœÑœœœ0œ^œœœ~œtœkœa.œWEœMYœCiœ9uœ/œ%œœœ›y›n›_›M›7››››››k›=› ›y›o›ea›[!›P›F›n›4-›)››W› ›šašššJšš~ššš2ššBššyCšnšd6šYšOšDš9š/Tš$ššmš™™d™™™:™z™™™"™R™™™x™m™c ™X%™M;™BL™7Z™,d™!j™m™ k™f˜\˜O˜>˜)˜˜˜˜˜˜W˜&˜z˜o˜d{˜Y:˜M˜B˜7_œzœœ#œrœÿœœNœœœ œCœyœuœkœbœX,œNQœDrœ:œ0œ&œœœ›››››››››››››c›|?›r›g›]›S›I[›?"›4›*› e›› ›š6ššš-šškššš,ššFššzQšošeMšZšP;šEš;š0š%šMšš™^™™™N™Ж™™™Y™™™™'™zR™ox™d™Y™N™C™8™. ™#™ ™ $™$˜ ˜˜ ˜˜˜˜˜˜q˜J˜˜|˜q˜f˜[H˜P ˜D˜9~˜.3˜"œ&œzœœœaœœœ+œgœœuœl œb9œXeœNœDœ:œ0œ'œ'œ<œ M›[›f›m›p›q›m›g›]›O›>›*›››|›r›h›^g›T:›J ›?›5›+d›!&›› ›Vš ššfššδšVššš%ššIšš{]špšfcš[šQZšFšœ'^œzœœ ››››››››››››››}q›sS›i2›_ ›T›J›@›6W›,!›!›› i›%šššCššϚšAšššššKšš|išqšgyš\šRzšGš=lš2š(Pšš%š™™H™™™K™ș™™+™o™™™"™}W™r™g™\™R™G#™š4 š)šš`š ™0™™™L™ԣ™™G™™™ ™a™™~™t ™i?™^m™S™H™=™2™(™1™D™T˜_˜g˜k˜k˜g˜_˜S˜D˜0˜˜˜˜w˜l˜ai˜V:˜K˜?˜4˜)U˜˜˜—1——œ>œœœœv\œlœbœYœOEœEwœ;œ1œ'œœ@œ ^œy›››››››››››››~›t›js›`W›V8›L›A›7›-›#h›3››šš@šš۱šdšššišššMšš~~štšiš_,šTšJ9š?š58š*š 'šš šs™™>™™™S™™™G™™™™W™u™j™_™U+™JV™?~™4™)™™™ ˜˜)˜2˜7˜9˜6˜0˜%˜˜˜˜˜y˜n˜cp˜XF˜M˜A˜6˜+x˜ :˜˜ —j———u—œœAœvœlœc œYHœOœEœ;œ2œ(Gœpœœ œ›› › ›1›?›J›R›V›V›S›M›D›7›u&›k›`›V›L›B›8{›.S›$'›››šSšššܐšHšššZšššLšššušjš`CšUšKZš@š6bš+š![šš Fš™"™™™Q™̮™™^™™™J™™™w™lP™a™V™K™A™6C™+h™ ™™ ˜˜˜˜˜ ˜ ˜ ˜˜˜˜˜˜{˜p˜eu˜ZQ˜O(˜C˜8˜-˜"`˜$˜ ˜—W— —޻—g——œvœlœc?œYœOœEœ<0œ2dœ(œœœ œ5›U›q››٠›ϳ›››››››››u›k›a›W›Mo›CQ›91›/ ›$›››Yš$šššnš+šššKšššKšššv,škšaZšVšLzšBš7š-š"š š š™h™™@™ئ™™g™™™m™™ ™Q™x™m™c™XM™M™B™7™-™"4™W™ v™˜˜˜˜˜˜˜˜˜˜˜˜}˜r˜gx˜\Y˜Q7˜F˜:˜/˜$˜M˜˜——K——ղ—_— ——OœcsœYœOœF9œ›`›~›Й›Ʊ››››››››v›l›b›X›N›D›:›0›&`›>››ššš`š)ššʱšoš*šššFšššxCšmšcšYšNšDKš9š/hš$šwššw™™i™™L™и™!™™™D™™™G™{™p™f(™[k™P™E™;™0T™%™™™˜!˜?˜Y˜o˜΂˜Ð˜˜˜˜˜˜˜v˜kz˜`f˜UN˜J1˜?˜3˜(˜˜j˜7————@——í—^— ——W——œ<œ3=œ)zœœœ œM›z›››› ›'›@›U›g›v››››w›m›c›Y}›Oq›Ea›;N›17›'›››ššfš7ššš˖šYššššBšššyMšnšdšZ7šOšElš;š0š&!šš2š™5™™)™ܞ™™|™™L™™ ™h™™}™rc™g™\™R<™G}™<™1™'*™\™™˜˜˜˜9˜P˜d˜t˜˜˜˜˜˜x˜mx˜bi˜WV˜L?˜A%˜6˜*˜˜˜ e—2———܄—B———d———b——v—k<œ)œ œ?œ vœ›› ›3›Z›}›Ǟ››››› ››"›x'›n)›d(›Z#›P›F›<›1›'››› š_š9ššš֯šzšBšššš>šššzVšpšeš[NšPšFš<'š1š'Pššjš™w™™u™™d™™E™™™z™™7™~™s™i5™^™S™I™>U™3™(™™9™h˜˜˜˜˜˜7˜L˜]˜j˜t˜z˜|˜zz˜ot˜dj˜Y]˜NK˜C6˜8˜-˜!˜˜ ˜d—4———ӊ—I———p— ——s—y—m—bQ—Vœœ œ›<›n›››››5›R›m›››››x›n›d›Z›P›F›<›2›(››g› L›-š ššš׎š^š*šššzš8ššš{^šqšfš\ešR šGš=Kš2š(}ššš .™™=™™=™Ը™/™™™~™™L™™ ™ud™j™` ™U[™J™?™51™*q™™™ ˜K˜y˜˜˜˜˜"˜8˜K˜Z˜e˜l˜|o˜qo˜fj˜[b˜PV˜EF˜:2˜/˜#˜˜ ˜—i—:———ʔ—U————2——{—p-—d—Yk—N—Bœc››››4›`›ȉ›››› ›#›8›I›yW›ob›ei›[m›Qn›Gk›=e›3\›)O›?›+› ›ššššmšAššššoš2ššš|fšršgš]zšS$šHš>nš4š)šCšš i™™™™™ ™ˇ™™t™™R™™"™™v™l>™a™V™L9™A™6™,™!T™™ ™˜3˜b˜˜մ˜˜˜˜*˜>˜N˜Z˜~c˜sg˜hh˜]e˜R^˜GT˜›4›* ››› ›šššnšJš#ššššcš+ššš}lšs&šhš^šT=šIš?š55š*š sš š š6™™P™™\™™Z™™I™™*™™™x`™m™c™Xu™M™C™8i™-™"™;™ z™˜˜ ˜P˜|˜̤˜˜˜˜˜5˜F˜T˜u^˜jd˜_f˜Te˜I`˜>V˜3I˜(8˜#˜ ˜————T—$———|—<———e—u—i—^i—S —G—›4›*› ›› ›š{šbšFš'šššššWš#ššš~ršt0šiš_šUUšKš@š6[š,š!šAš šs™™™$™ح™3™ô™3™™$™™™t™y™oA™d™Z™OZ™D™:™/R™$™™(™h˜˜˜˜C˜p˜Ú˜˜˜˜˜1˜D˜wS˜l_˜af˜Vj˜Kj˜@f˜5^˜*R˜C˜/˜ ————ܔ—i—;————X———w—l7—`—U—J4—>—3t—(——5—›››H›s›››››{›q3›gG›]X›Sf›Ip›?w›5{›+{›!x›r› h›ZšJš6ššššššvšJššššwšu:šjš`šVmšL!šAš7š-*š"štšš™H™™o™™χ™ ™™™™™y™™{W™p™f'™[™P™FC™;™0™&?™™™˜Z˜˜˜˜;˜i˜˜˜˜˜˜3˜yG˜nW˜cd˜Xm˜Mr˜Bs˜7q˜,j˜!`˜R˜ @˜*————Ӭ—ȃ—V—$———z—8—y—n—c^—X—L—A`—6—*—>——i––››› ›I›o››{›q›g›]›T ›J›@'›6/›,3›"5›3›-›$ššššššǨššcš;šššš{švBšlšašWšM<šBš8š.Sš#ššKš™™"™™K™™e™™q™™o™™^™|™r?™g™]™Ru™G™=2™2™'™1™™˜˜R˜˜˜˜7˜g˜˜˜˜˜˜{9˜pN˜e`˜Zn˜Oy˜D˜9˜.˜#|˜s˜ f˜V—A—)— ————v—F————|`—q—e—Z—O;—C—8—-6—!—t— ––2––H››››#›|F›rf›h›^›T›J›@›6›,›"›››ššššܹšҤšȋšošOš,šššš~šwJšmšbšXšNVšDš9š/{š%+ššš&™™f™™ܘ™,™Ǽ™H™™W™™W™™~I™s™i,™^™T™If™>™4%™)™™(™ w˜˜ ˜N˜ގ˜˜˜8˜j˜˜˜˜ ˜})˜rC˜gZ˜\n˜Q}˜F˜;˜0˜%˜˜˜—p—]—F—,— ————l—:——~—s—hK—]—Q—Fn—;—/—$m—— —H––q––Ԋ–›››|›r›i!›_?›UY›Kp›A›7›-›#›››ššššݓšӂšnšVš;ššššššxPšnšcšYšOošE.š:š0š&Vššš_™™™H™™|™™™0™™A™™D™™u8™j™`™U™J™@[™5™+™ x™™ $™t˜˜ ˜O˜Ր˜˜˜?˜q˜˜˜˜˜t7˜iS˜^l˜S˜H˜=˜2˜'˜˜˜———~—h—O—2—————g—2—u—j—_}—T9—H—=—2U—'——M—––!––E––Y–›}o›s›i›_›U›L›B2›8G›.X›$g›r›y›}š~š|švšmš`šPš=š&š šššššyVšo(šdšZšPšFKš< š1š'š6šš™B™™™/™™f™™™™™0™™5™v™l,™a™W™L™A™7V™,™"™v™ ™$˜v˜˜˜U˜̗˜˜˜J˜~˜˜˜˜v)˜kJ˜`h˜U˜J˜?˜4˜)˜˜˜————ܣ—я—x—\—=—————xe—m.—a—V—Kr—@,—4—)—@——–1––h––ΐ–––-–›jZ›`›V›L›B›8›/›%!›0›<›EšJšLšJšEš=š2š#šššššššz[šp1šfš[šQšGfš=+š2š(šdšš ™~™+™™y™™˹™T™™™™™%™™x,™m™c%™X™N™C™8™.T™#™™y™˜*˜}˜˜˜_˜ã˜˜!˜Z˜˜˜˜x˜m?˜bb˜W˜L˜A˜6˜+˜ ˜˜ ——————Ȼ———m—K—%——z—o—dg—Y.—M—B—7k—,"— —— /––z––ܵ–L––n––––›WG›Mk›C›9›/›%››› šššššššššššššš{_šq:šgš\šRšHš>Jš4š)ššLš š™j™™™h™ ™ª™F™™t™™™™y™o'™d™Z"™O™E™:™/™%X™™!™˜˜4˜˜˜%˜n˜˜˜4˜n˜˜˜z˜o2˜dZ˜Y˜N˜C˜8˜-˜"˜˜ ˜———— ———————]—}5—r —f—[—Pm—E2—9—.—#g—— —z–"––h––Ȟ–3––Q––^––x\›D8›:Z›0x›&›››šššššššššššššš|cšrBšhš]šSšIš?iš53š*š š}š :š™™[™ ™ش™\™™™>™™m™™™{™p™f'™[™Q%™F™<™1™&™a™™,˜˜˜B˜ܘ˜˜8˜˜˜ ˜L˜˜˜{˜q$˜fQ˜[z˜P˜E˜:˜/˜%˜#˜2˜=—E—H—H—D—<—0—!— —————ts—iI—^—R—G——3—(—E——–m–––q––µ–Q––}– ––~"–r–g&–[–P›$›A› Z›qššššتšΰšIJšššššš|š~gštNšj3š`šUšKšAš7vš-Fš#šššc™"™™™I™™ƨ™R™™™;™™o™~™s™i#™^™T4™I™?7™4™*,™™™ ˜˜P˜˜˜n˜˜˜k˜˜˜H˜˜˜u˜j:˜_m˜T˜I˜>˜4˜)6˜S˜m˜————ܲ—ѵ—ƴ—————u—]—yA—n!—b—W—L—A|—6I—+——— U–––u–#––r–––K––s––u–j–^–S–G–;› ›9šPšdšušكšύšŔššššššxšgšuSšk<ša"šWšLšBš8š.jš$;š šš™]™™™ܒ™H™™™T™™™@™™w™u ™j™`.™U™KB™@™6G™+™!>™™ '™˜˜i˜˜.˜̋˜˜:˜˜˜%˜l˜˜v˜l+˜ad˜V˜K˜@˜6 ˜+F˜ h˜˜ —————————————{—p—el—ZJ—O$—C—8—-—"e—,— —–h–––ӂ–-––w–––J––xl–l–a–V–J–>–3u–'šš5šJš[šjšuš}šššš|šsšgšvXšlEšb/šXšMšCš9š/š%cš5šš™™\™™™Ӕ™K™™™Z™™™J™™v™l™a™W?™L™BU™7™-\™"™V™ ™A˜˜˜˜˜N˜í˜˜^˜˜˜M˜˜x˜n˜cY˜X˜M˜B˜8*˜-U˜"|˜˜ ˜————&—/—5—6—4—/—%——~—r—g—\—Q—Fv—;N—0"—$———J– –––5–––;–––––{L–o–dj–X–Mx–A–6v–*–d–šš4šFšVšbškšqšsšršnšfšw[šmMšc;šY&šOšDš:š0š&šaš4š™™™_™!™™ʛ™S™™™e™™™Y™w™m™c-™X™NS™C™9l™.™$v™™r™˜_˜˜?˜ک˜˜s˜˜/˜˜˜-˜z˜z˜p ˜eL˜Z˜O˜D˜:1˜/a˜$˜˜˜——3—I—\—j—u—|——~—z—r—f—uV—jB—_+—T—H—=—2—'|—N——––m–+––͛–N–––M–––~)–r–gR–[–Pl–D–9u–-–"o–– X•š"š6šFšTš^šdšhšhšešx^šnTšdGšZ6šP"šF š;š1š'ššcš 8™ ™™™g™*™™™_™™™v™!™™yl™o ™d™ZD™O™Em™:™0™&™™™˜ ˜˜˜e˜˜8˜˜˜[˜˜ ˜]˜|˜q˜g>˜\˜Q˜F˜<7˜1l˜&˜˜˜—>—]—x—ڏ—ϣ—ij———————w—l—a—V—Ki—@K—5)—*———}–I–––ۓ–O–––k–––c––u–j8–^–S]–G–˜~˜s˜i.˜^v˜S˜H˜>;˜3u˜(˜˜ ˜9—`—————————— ——z—o—d—X—M—B—7—,—!f—?— –––z–?––ǽ–w–,–––5––x}–m–a–VK–J–?k–3–({––{–•k••K•׵š5šDšPšYš^šz`šp_šf[š\SšRHšH9š>'š4š)ššš šu™L™™™ػ™΄™J™ ™™™>™™™|P™q™g™]D™R™H™>™3™)?™™W™ ˜b˜˜^˜˜L˜ʾ˜,˜˜˜a˜˜˜v˜u˜k˜`j˜U˜J˜@=˜5|˜*˜˜#˜ T——————)—?—R—a—m—t—x—|x—qt—fl—[a—PR—E?—:(—/—#—— —}–O–––կ–r–1–––V–––{X–o–d–Y6–M–Bb–6–+}– –– •••p••K•òA0stars/inst/nc/reduced.R0000644000176200001440000000036713777653456014556 0ustar liggesuserslibrary(ncdf4) nc = nc_open("reduced.nc", write=TRUE) ncatt_put(nc, 'sst', 'units', 'degree_C') ncatt_put(nc, 'anom', 'units', 'degree_C') ncatt_put(nc, 'err', 'units', 'degree_C') ncatt_put(nc, 'ice', 'units', 'percent') nc_sync(nc) nc_close(nc) stars/inst/nc/lcc_km.nc0000644000176200001440000007546614236716405014567 0ustar liggesusersHDF  6{`OHDR " E*lambert_conformal_conicuprcptimex!y#PFRHP#( L?BTHDd(u&4ABTHD  d(u䛸FSHDPx(7%%9֝BTLFX 4&Jl3-KHX qdd;곁407uX Q.0-w/ZJ g\?wqLJB;mX 3AᎨBTLF 4JB;K?Q.ww4mX X X uX J JjQOHDR U  ?L h y FRHP  ( @:$BTHDd( BTHD  d( PFSHDPx(7BTLF`]XKX B:P,vPD\JPVvP`A[`מ`9 ǢGúe`X5BTLF `vPP`vPXGe`B9 :mOHDR o89k9k   || 8shuffledeflate?T9k 9p9FRHP_ ( <|LD` \"i?ļ^1_}~p cTc#3_BTLF TjLL\^1?BL\"~p 4 pBOHDR    || 8shuffledeflate` Q fj-FRHP'/ ( 88/BTHDd( UoBTHD  d( U8 FSHD'Px(7AbBTLFDc bGL 0 4 ;$0<,x/R9)2yF%_k4e >>i! xBTLF 0F%k4,0>9)bGD4 ! ROHDR kk   || 8shuffledeflate6 0CLASSDIMENSION_SCALE "NAMEx 4 _Netcdf4Dimid  "unitskm B long_namex coordinate of projection ?standard_nameprojection_x_coordinatejOHDR 99   || 8shuffledeflate5 0CLASSDIMENSION_SCALE "NAMEy 4 _Netcdf4Dimid  "unitskm B long_namey coordinate of projection ?standard_nameprojection_y_coordinate>?%/0"SdAA $AA DAAAx 8؁ X ^aValza5VJXa,%fggf&''&FGGFz{{z:;;:Z[[Zjkkj*++*JKKJ rssr2332RSSRT %))11!!>>..66&&::**22""<<,,44$$88((00 ёLvp077335511662" tuut4554TUUT~_>o^zO?zwnߺyW._xgN:yG:x /'+#-%)!.&*",$(@EYPsSTREElAL9kTREE*QTREE QkTREE'y9x^Sqnݮ7]BݺqvAGGːy:HM 'Id / ($,"*&.!)%-#+'i۶عk8xǎ8yz_op򕫆F׮߸y?xϞxc߾4337wppttrrvvqquussw  OHHLLJJNNIIMMKKO/((,,**..)AJKh -++/ohhlljjnniimmkko_X%ayH\Y!VW5 e}J3`  7 0@  4@2P@  6/ ?5)*.stars/inst/nc/3B42_Daily.19991231.7.test.nc0000644000176200001440000000326413777653456017141 0ustar liggesusersCDF lonlat BeginDate 1999-12-31 BeginTime 01:30:00.000ZEndDate 2000-01-01EndTime 01:29:59.999Z FileHeader[StartGranuleDateTime=1999-12-31T01:30:00.000Z; StopGranuleDateTime=2000-01-01T01:29:59.999Z InputPointer3B42.19991231.03.7.HDF;3B42.19991231.06.7.HDF;3B42.19991231.09.7.HDF;3B42.19991231.12.7.HDF;3B42.19991231.15.7.HDF;3B42.19991231.18.7.HDF;3B42.19991231.21.7.HDF;3B42.20000101.00.7A.HDFtitle9TRMM (TMPA) L3 Daily 0.25 x 0.25 degree (TRMM_3B42_Daily)ProductionTime2016-07-20T15:34:37.000Zhistory2019-08-01 19:35:54 GMT Hyrax-1.15.1 https://disc2.gesdisc.eosdis.nasa.gov:443/opendap/TRMM_L3/TRMM_3B42_Daily.7/1999/12/3B42_Daily.19991231.7.nc4.nc4?precipitation[381:589][0:267],lat[0:267],lon[381:589], Manually edited for testing in stars R package by dblodgett@usgs.gov  precipitation unitsmm long_nameaDaily accumulated precipitation (combined microwave-IR) estimate with gauge calibration over land coordinateslat lon _FillValue?origname precipitation fullnamepath/precipitationP@lat units degrees_north long_nameLatitudeorignamelat fullnamepath/latlon units degrees_east long_name Longitudeorignamelon fullnamepath/lon>=u=uGFEDC©@¨¨@§stars/inst/nc/plot_bcsd_obs_1999.R0000644000176200001440000000212013777653456016437 0ustar liggesusers## data-getting is described here ## https://github.com/r-spatial/stars/issues/94#issuecomment-459583295 f <- system.file("nc/test_stageiv_xyt.nc", package = "stars") library(stars) x <- read_ncdf(f, curvilinear = c("lon", "lat")) brks <- c(0.129999995231628, 0.879999995231628, 1.5, 2.12999987602234, 2.87999987602234, 3.5, 4.19000005722046, 5.05999994277954, 5.80999994277954, 6.75, 7.87999963760376, 8.88000011444092, 10.1300001144409, 11.25, 12.5, 13.75, 15, 16.25, 17.5, 18.75, 20, 21.25, 22.5, 23.75, 25, 26.3799991607666, 27.75, 29.1299991607666, 30.3799991607666, 32.25, 34, 35.6300010681152, 37.75, 39.629997253418, 42.129997253418, 45.25, 49.25, 58.75) qu_0_omit <- function(x, ..., n = 22) { x <- na.omit(x) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } plot(stars::slice.stars(x, index = 17, along = "time"), border = NA, breaks = qu_0_omit(x[[1]][,,17]), reset = FALSE, col = viridis::viridis(22)) plot(sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg"), add = TRUE, reset = FALSE, col = NA) stars/inst/nc/EURO-CORDEX_81_DOMAIN000_mask_int.nc.zip0000644000176200001440000014275213777653456021350 0ustar liggesusersPK6U O 3$EURO-CORDEX_81_DOMAIN000_mask_int.ncUT Q]Q]ux   yn%aM6wHՒZK]rҩ-fF$i6}-GJJe9+$$C$d ̂+̄$d N$f`ptL @b'׼uN{{ֿ{<~cWK} ?=x~쳯|ozۗso:zG~p÷?s>걧zzrsg_3/wk_x3?y{V}tїϼϼSŏ=~m^>O~O~O=?䋟~}n?۟'y_A?{{'>Уw\/S/W=]}3\㝫wo4n;دaЏ|P[k\|~{w>{Vx띫{/G?/~'zv5 '۟zf^zR]&}+?Sy?^/0 0 ?~>|So}on?_yroxO <܋zO23O=3yO?䋏r_=W^yǟG.S|~7/G/Yvgnòyṧ_Y .>a8>?_=/{g_[5éOx=<7/ʍq={Ǿëfؾbe}}c[=sO|ꃫ{a'{O<<ᷭ Sч|]/_{cps˽sx͓=ǟzvW.Vb_/ρg/q~rb>\9}0^~/ye]ݗ_?:|0}k>3 ^{q+/ozƱ~[wa{^Xsyaqx?/'1yNn?p>?6'>ԃ{ʇ>ѿvhԳAe]x}}'xzxվ^?}k^k^ &?Ͼp1?O߾7__u>rӫ˻/,p+p?mZ#= ­{cO8ui.?w_<_9{8\+:9q?rc1c1=}_c?K}<c1mRc{dž1c#1b1ئJ}c1)R+cmyNj1c;#1c1؆H}c1R7c+qc1XZy`1Ƹh=1^*c1XRc5%y`1ƸkI}c1R c1~-`1Ƹ[H}Nc1VRcۻ1n)a1Ƹ[J}nc1nRc۹1vn-a1Ƹ{H}c1nR#c۸16!9b1Ƹ{H}c1nR#c۸16%yb1Ƹ{H}c1nR#c빷1z)b1xJc1mMc8[z\0c֥1oc1ƛEqcu{z0c|ޤ/1_ڣc1K{z0c|iRc/Q1c?\1cI=^c1~`oRc/Q1cJ=ncqv{z0+_1cW c1nRcޥ?18K=~cqFGz,1L(b15\ Øc&b15|_w|Q_1xK}-1q1p ێz}Tc1b֏zTc1R~Xc<1J}M01.S1z~`1c%ucVa1JeJ}1޶ 8Fk1y9αR_W1ƸqNb1-mEuc1ni+tscqm[]"5ck[%/Bk1װJsc1j<skcR 1x~c6ZK=G0u[Psi-|cZHC1߷JΧc1ndI18{)Yza1֊|n֤KcsEcqPs(c1^Rgs&c1^Rgs,5c=>W9{`1R✽J}m0p/SyFcm\o,'9NQ5|_#8ˆJsk8Vs=^5|z`l,_sRY4-9g+㤞'{5O35QKXjnE3SfϢ헕RϕR} دI=x|ws4~Ⱦsc˶&xieߪA(uNVN=o0hR 6_<Զ}zk[Sٚで͗>ju.ؚI=x\YsQ;߅cK&xGm[[zLyb<z`۞+}z/X0+=J=f=6+x7iJ=co5^[J=w0}RkR߻*O} I1Fk0`%Rn7z`n]`:ڈj[UqbռTFC7/{s33J=p^t-Rk\(<9iʘg{āLR#WghkUw<-& R%;jJ=K=pL#dAab/zE4+±eWzME1+±PTזwR-Ez]y6-1PTזGR1Ez]y3#\PDו7\R7Ez]y2'ñPDו'R?EӘ9^wVЅ7BѴkכ%#Kh5͒+\vPD5gMzb{F(ʋ#ŶPDו#4W깋mR-/FhswVK&#]5-^WPtט#Tz}EuoPoט'#TC撹^cPtט'#TCޮcPAFpI<Z4֏A=#bjSEFոn\R//*Ơ<7zhѾ_>pʓ*V^K} R5/F"͵%ؚkqEmsm{a3z^  =Ц]/ |B=?{1B]xaxzI=٥?{1Bm"N(9Z  YR9|+bץ+yT똂sE׾9{3k:e]a}\f#B"s:]9Z:^sC}bZy6SS1/Fh~q?ubjK=߶5Eq]#T[9k3mil\jn:sL{ g#TS+[pm;oc`z_6en87 Vw^2mzN=fl+j|Px<:9+&Ay>W-CzߨmQ\%롏"|6}Oǭ+xRo嚪)-Z|v>W?wuwgDq}׃)>X8kb{:3x8>crhRckӚt<\5r\3N&|W"ձ[oY5eMO;-#PÚ%>>11u_DZi v<[3BuC>xQ?X5XX-ъ[FB9oiEױ}-oX[z_ViطCK="o:=_On+W1YPB.z6-s2rsw~5<bmX^Ǡ55[|z7}z]XFh]9iܗ^%y~uEG4 2B֜Au5ge6I=/:kk8TsikFfp|#Mi>Oׯ=}^38%fVV[cssC^p#O9jh]XƼGG;HFhsԺxc>w1:ڨ}]ǁw_vI=O٣ZVIj8>7{Rc>cyݮұP}}#\ljuW=wj)RWﶪVel-9σ-o;]"|`}=ǮǸkk0jJ=g#ؒZcRϗmct<ǎ\m#4U9U8zc|aH=o=ۢjgR+pߨ1BsmMK1]=\2Nj9R[ﶪi|־;>Yw Bs^AS3Wado\#j{F=,a<Ǝ BSA3بRKQ;BSAE=,q?nާ#4Gյ\e߫eϑc>+Fhs׳H-򸽻![ys^Ӗb>Hn)asŖzFq1n%qhֺ[K}~8n5p,- szcXc4F?o߱ xj=-Q5<֤^2V=9nzJ+z^2V=6ձ"`{&=Uc-չt3OsN#{{=,i9:)笾.^P yoc}paUI/L#zʘlﵱǬ6.9]־b5,`c$]ZY6BыǎmhЂI&{8c-ZqB(k҃mǨQ1cs^>{ŀwoER_Osy2ruGu ezmbҨו %=K}M;^0j'e zbڨחVuZcm6j+ud dK8qKR\C Bvpz\^AhFutR]},ؖ˞ߡR_s!tS굩H}{%u&n`Ƣz~Bs!K.q>%F+yzmbt/)?/\AȓҪ<%gV5,ڴf%[J58iu>?.b#kkꜲ"ujf&ƖDq{|R޲B^[)?{RK-zԟ3!tSuUcq 5 יEz-ble/՜cwc?ky R?~ޔQUdogI11wK>o5WUT9P#ƞ\־ߦ1uScK"\|ݤQSk!_GqYgcߣcRGT~ZR#6K61ƻ]SS?W}q=Eܘ2=0\Kb~\W5G_*9[7Bhj-ثˌ.bP}M]_8G[)!Ryo![Nqc. vo-mc^1ҿ*9!dKS֨:`lͥlSlMM]X_UWֿ>R#Kg0V\Z6Q9R-OPcjJIsS%B(qh^xZE:aROsC:&aW>}kO61 . h\>ݘU%tZ6BM9X:3u|ĸK}5EyN*x)+11cp\|p*Y?>ZK3qb|ջ>>סB=K֙q^o2BZK`eףBJy]W0}K! 6-uq}UcRCȳ,uñ] ~mj1"Mցugn!/ljy ꘆqd_cu|5j. c>Dzkָ!Qs\j91v1p ^|_j/BI-ܦQb,^j5^E:Xszɖǫ,B^-ݶQb1 d]WZp0pqZB :>D:}8P{ƙ\ þ!kǃ-zcq cϵdx++:*u|RY8zkk1㠥؛k1 4Ut]KB,T][]v5ǰjIi]zcq1p ێԟTTxAc뜿Xbv[ )?%깞ƼʚVh'uxculKlYs'qcpccw|K\jmy,T\:.b-ǰJՖz-8ju~k_[W{bT's:z{.Q/ͽ88FHkug=,kiWc<1X4Bߛ~y ;Wjc/QYЮssKƣXc.b!kRgJ7sƥXc.b!+2׳)s߬Rb!K9?5;enjSbl1X4Bknnݘ}vmSbl>kFțsu-9MsI}+_Kl<g\גsW5c1^՞㬟u2v8m8FțjqΥjkE8mayӦ9c0bLZir{/-خc``MԮ~5x+/Pd&9X~8ԌQ:beϼVϯ׌Q_}`ez|ke8B8F(X37UkR_l>F(X34njV_#,Zz-cTqW_#,:𕵳_cϹuK:cekgƞ*N-&w#M6Rũc15b,bԗ*F-sA1X1B+uZr-~:vccbv ȮUs|^9XR#IW}5k1=Kggc7ֺ8+F(69?f]DZ3bbpO;>+FWkZ_-Ŕ8}-m{ϚqVqky+FMu#VbkjhԎ꘏_K1X3B(Zǹ=66a-Eku=68j/1JjZ量od1gwB(Z uj[sU{og~ bJ_ıZVV8ZFu-=>sJ},֍ ߫cM8>WwNÃBm׈xe-Wc`P,m~=ZѦ^gqB՗j}~nٻyO׶nqf?ߓBZ__ycaSm'[/ 6꽾ךr.5> c\}֍%uL{Tq`^Ǡ^猽nPɔS5 5ś{)WZ8FѶ8w]SM=KO}l-yӹ9'!?ڱe%kǶ~]ci.:1c>9\CR8j!ՐcTy`X{9OyP cR8el˾ucI},8lP,>ka5B(1rRr̙\ P >}k!Kk[gĨ)loʞn:R6}cǸBtuu!k=&leTqt}[)0昧H}cB+nlskʖ!hi7X_?M?kqk[>x5B:NՌe?s{[oF#cU͘^w|cZ cU͘o Ypݹ!4VxU3)}l}{+i1~m2B͕:~-k9o6}!4UVci3B-:-mS5BStUO9ű9b!DV#)o߱zL/ΟB5scڜ;sBhzƭ1m{Xjh!D]#YWyǹ95v^!ձ˙KiϜG%;k{8zj'BՐ:.֌kwc9]*B5isZǖP^tPm%ߣjzƶǫ{I1r=BK\DRǴ%jgX8ǃ+_=9x:VP 1Oх,Ǿkǜs}?}^cBK FhdWɌujI=G>=v6ix^-׾^G\:15V61w.~#^gS{LcnO9F/1oXz;mk3BsżESupkSRcWZK}8#-mrVϹuzloMju)xFvͧ߭Ͽ]y_*۩fVmj|Z/]ۃ+_x״qRS̵|zͷ͉qQsFhWhv ugf\Wkƈ9ji3r:񚚱]=&8=qGׂkh|6Ա{ԎqA^;֯Ӷj_=f S3dzuy=Z\MWϙMDz-wb9cUWq:]:#[u le-ky!r^9uE;2k:UBEU_˖u#Bh:UÞqjW g:X>ҹ!UDEcltc!d[S>Ry#lj=>]:FzTe\\ʮMkt}^)/LyG10斕<B)>^WLTfE[ys1cjaܭj}|~|Bڵ7eLTqng;7]lY!d[1s>f:+ _#/BcbE\}K6Nu}q[MǨ9qazӘ{CspZվ9xI}BvoMc8=zz=YjK=.e73O1X~NX}Y- cfklo1߻w]Vmi!{+~ZSæؽ=zk1(fqkZkk|Bu\#^/sPd\n8 R1qE#"khI6^eյyuju-9TqhAq;V_BZDzn={mڒc1vjGȳ6uʹqXْc-o{ BhݴwukE\S]6FVimm?CצuimzD5M{{EO+RC1:߬_;<`}0枧:.cs"X,Mfk/BhvMvFץ̪=cs=x۱ӮGYҮm͢Z'ql R_cZuV-*9GRy[KS:.v&xFO<9˹[zL̵\JR7D9hM1j"I׮1dE$/B(Ĝ^35%cjM1lKcuY=-cd.Yem>U~ s R g\a^"Y5qj)[>sϽM"kc/Ϸ*׹Pt-]K>W՟oY냧ͥ}]]k_2x[z94u^y:XmL:߷Xzsv.ůmrܽH}mkEqRǦ5-݃OOS\9&uAkͣsn{"J,y}<w?vye"~ߌ{lO5~ui4GB_Pϱ>&csjk!G57e7mnj7~s*D͗:ngI]9ڮ]CI3gByo[W])5׫\P|b'KǛcU4mX5׫cղwe:XMGz qyg!zIu,Z?_kdK\w^fYզ5sMcМؔՑKfNFYҘ5oNYWǟ9q۱oNcަ]3tm~d=yWގxxz qB5v YS>g*Ԕ(R#n?O~z~^c?18}?Hs#yck6:߮a.k_ׯپ8jk1a%XspWl]9P/]OӼyKCد)E5ԮUc5#j=E=޸<^yP YkV57ԌCKś`{cݦ׭ !tScחg;ZZwM)/~[ХƨZugЮm!tSK3G|%c>2911jřVmYtqQ_nB4eDU-;־;.]C(j[ZegcE}}pweДU-bK//7p7WbX[YX}OL젞cAS1ƗVǂlyg y`WU\ ׳zBA}=qz k^^e)wO^Ӱ~^B}A=2q:b/pL; OrVnu{gPzDűf=2ձQϏhܠcb1)Wjfbq:>YކZ=7Yp^ ;xC8s܂ձpc^+p\ы)`[ /<;mffPo[F3d)znfu8k=.q,cAPLs,23cdv V]vcGdP0z (7c^5ѸB}/T쐓q̃K {:&E =RA='"p:>Y~[=G-Y L;duQY}La)`_ܠ'pۭ^3mA=a}Ǹk{L;fu 0YV3r)2zfbu 8k;[Y֘veڅ0eu,{) g^}1c+8SDf qfWc \SM=o"p:Ya1)Wj6ɂ.9k+ +;3Y=a *S53 ؿkљnku0o{+`젎Zl&Pߋ<2X-zfu8kcvc'X}x1!*Waxv[>rndu {)2znEu` 55pO`xa= sX:69v 긤X=a _\S|lZ}_x5W<kf0eZ-LL;ش:N z-fc &*Sdd\ W.\)`x^~^둹B} 0_ful{51ѫV_[VSv 8g&=ZYssE&5l깩:6y ?7nP%Gz㭞M)z zC8s;+OA`굑-Ա? Sp7zm0b: ׳z-Fd x®z Duثk)젏]a&k;Wd` 53pPz'cG)|CfvPaaS {̱:xL^ATV0[c WxQ9A`9 [cydA2rz 0EO{P'z {K^CB}ۘ";(Afr:c5W9H;u؋k5 Wd`^9 7;cTsVi\S07 ]k+32z.{uf=۬pL 7!92:6+"O9Al9 [c7La`V-8Gzgc uL-vP ܠo`<Wa <;eu0o0EnPrY&pEQA5ԱcVa.O`; B[=^"2SQAa^aĀձWviu\TyY=` 7Sd`?z k܄-1:"Of !7=Z=3L'`젎Qp`ڈ0={p `V)'SXQA_[Lч'CvvPxVY\)zԱ^olFz{ b9S ; 3EV/L(<2z ح]V \)Ԍ; a*ձ2W3{}^:eg<; ^ꞁTYqL`8ܠ'`\+VǰL'k* 3c=ƽrluSsEV[ʡձ0SX 7;YM(^9:V"?vVGZZʁ142S |_:nbcWƭySxL2luZ=7#ED'b7 s;Wy~X/`V\)vuen)2쐇qV1\S !;co dXzzMZ(L'fk;_~/VWq^Pm+\S v`51 Sdl; p^b0<?hAZ= x OyA+"1<і`젎il0E3V1\O !>;c0ߖ1hZ"2Ox!/3ElPDf~ؒR7kWxg <?h!;;c+rzGg x"7?D=DfPð}h-O~A r>Z= =Sd;=VO\S xǴzX x/S}v0ni)  ?bulV%ע5'D&~b:N1Vx~P o׶+ ;<`N8Ca\<?p[=GsE4'rC$vPܠVm"Sx @6;cYp<ї)j;x=V\)~ z3>HV1\'Z1W5^^0<?ֹA8V_lO73'f[=碰E4'nRW)U~ 7 ؃s-%KXAx 젎}fZOMd!.;ϵz*OnBݣkWqy"+?D={U le 9 x~XLV_k?S~8 #`јvPX8g )tLa'^A}~p<ѓ'-?dau'`1^^ ֹhk~c+ <?A=VLOLe ~ x^ok[hvX IJg B^y~`!s'[Dc x.CAc3k>Sd .;u QPXzqryj ?d`uyB]3`VLO v {s^;ָ3Sd@?;Uácf5f)a "V"3OCTnP߯?' ~-vPJx[z[ x-OԼ_[c;uׄE)`zdb xOvA3l;Y=^cj]~ضehLO vPǧ̠⸼^0WV5Sx"?f7o[z3Lя'jD7~F(L':\W #ĶznD` x"O!;c23LOX !~vx"L/G'< 2CdvPVxzZ L'Z&,CMt젎0VZ=ǭq;Y0E5r 젎/q$'C9A}ű9s=x~Sx"?bl1^S+SD K !^np5"O0VX=-0<%v[\),?젾OXY=V^3јDrX" ?dO1Fc5ޙ2ODM(":?x= pBDG-"O,e 9l1V'&< ^=YVv {kܵ"*KX ?u<po縚) ;!";c1Z=-rG' ?dg} zZa<K!;;?8s;2SyB! ;c'̀-YT\)"%PC-r[=vrj`̠[De LOd P!젎0w'DZ9;زqLOXa1<?jvPlx!s:W.𞃀:& xsWvxJn3?Xe;U؟sPP3; ؚs;*SY?bns_D܄`?ޙ`<њ%A젎0}gVy;K ~'IJzx` xXsknX=rGVxKn3?bԱ^#SX CXᇚ ` zFg SXe(,!Goc.[yBv"p+` urvP~#WDkP [; 0<ѓ'&A燈젎B.UxBD; {VYsZ ?d} ۷z"+OXuxMYA}?qј":ODMxeKЂ!: s7SxhK,1`C,[&ZWܐ ?\O %K懥 ?FdDXzo^YrYv[}?ž^sJ~xV!\OYBsvZ=20e 7! 73ePy ~P+8*WxQX X1Va-3zX` /<%&0`ԱfaRr<;7f ~P:~ ~f x^B]ǀ[=G;8 Oxsxa @=?v0܀=~<Cd;c֎y~h 7dW6UXC,nP߳=Z} 7%`aX,ѓ!C Oh0Dagcc La%Թ XO/9pj\ l'&Gg zz%l2D:FV~{Z}n"+OdeJ^s=YbODdu 챃c+ r^=X";CDcA}h5W3E8\ u ,C) X!<: qC=2O1YvPp't<Kc .lZ0Dd~PӰZB{ ,CP܀:"SX r>Y1`Dc x0D:~a+2:G&!ADNl,C`;ɑV" Oz{!2CfvPc3[}1E$8\=Y s7SX 5KxMXf /CXAd= +a xp$!` <Kdc 1wefCXV V_{SXf <%!AxfcyBKxp3 !C܃s%Dv^pyB]0O{;"SXc unX0D:-9ODM,Ͱ<s߅ pLgb {PtN,q8YCNVsx09 yг%`A}lX}{3Ed%Dks u  Nl+V8у%` ? W6{f( A#6? 8Wd qY ? X^x"sn"3Ks0=`m>bX0<37KI~" ?V#"&OZ!19[Ec'"%泄50oV_# L'`:ы%`A}EvP&z92 !2>3"2O1X]ǀV <%z9` }{!젾Gb\OM̽wXd G~2D.3 chL'`,q8VYYn*GaH<Kf CDADaSX 5K, X-K9zvY3OXM>Xk.W_%u\ ";Os=8c% ![Vߛ#X} ; XB0 bL젾fd XfKv{!b;lO XbG0D~uD|hYϘz0Dl!^xs0D<+ X;KxgDerL%D48}0 ?d3`xd<Kb >CXAx}##de xB% !~2<KDf C,!![x,1'` 3#` ![d X.K̹ONp j3D~Pc3Z}ͽDD8,CA}PC=DL!` 7`\KYRO Q!d xbG}"?u8&WX X K̹YgL  cXAVw5xBU&??k#'FeqHݑ{#G?uiGӫF``_=¯׎//׍GKFKGFG+F ##U#GWGGkFkGFGFGFz5XfE QpD֜qOe8":GcIMTM9^{*#j> #,sF$R(8چ-jqD^K83Ke^(9D 8#r<Kr8BHp^ z#4MP>Kzm#K^1QG#rވ 䈽 QpDwYۀ#lpώF8ieAm{6: G4:4fPۈ 8"[{5;w՚FV8fm"GXܳG8Oz#Va%k G8kK8"[N e8"GXܫ7b5asTۀ#FpA%9:Kv{?8>GcIMcCKcpF lةmpD4Zӈ$z6rGXRӨQX"G`φ/pAo5* Qq?鵼/8h+Gd(m9b,KXmD={U #pD\DtQe3GDIdmx푀#%GPӠ"GEm#GZ7NM7GPӰ*aG"j%GXF QpDچWȜ#8uo\DjHWچ78^ 8VM&G߳GXg z$ 8"GP3_}# 8#9#V#Qbsچ 8#q5 z#4v9wD^2N8b K9;5 j/GP۠r K9ҳ,_7|.,Am 8c GPӨMjHY#<3DtHW(9jm#rDDp}ϧ\D5#"<' 8##< U(v9={UƩGa 8#lq5 ;1%m#y'Gc#i,dR#mPۀ#8GXc5b#m{UGa 8"i#2"2pF%#j7P$pDgPQӈ᪦QtO8#i#zFiKv9jmX{68#i`2#mmgHdFW/`gVk]rE6O{6jp#{5"4WQ%m#86GPӠх!J;P۠GG\#<k:GX#,٨cX# ћ#"Wa9'ᵶGpϲN."GTEQ3'#z%g#2q5 j8r9 8ўGETiaAD^2N=8b K1,Gj(9{c'GD̹ SӸ[s ?-qD^K/1%A a6Qp 9 8AG5 E.bGxIP۠r]pDL숌=k㈚9 8#L9QvsߒF O=~p=9"CM-GP۰GGpGiAmG,d#ưDo}c 2#m^=pGꍈc19Qq {,#"Z8gGci#z4WAN'GDث_pGEM9 8#z,mqD\DF#H=8ƞ}1%8r%5 2#mIk2NpG#L"%Gsr9"Z%G(8˳#FX ћ#Wa5'aa#RHq#pKz#4J\ۈ#rG资#AM#PM<j8RpDgPY鍰sMc+C#HU/8X荰XX(9jN"jm#Z^}QGQ݃#4V(8fNG9"^ O5ZAMcC=GP۠G"➍}Q#|s5r#m G\G/{5re>GG9³,3Q!zsD\ෞ9ѫGb~=pa#XFc.&GEeAe,Qۀ#OaTja#ы#j$m#m>g#51Qp =ppgGd걤ᰦQsD=>{-qDG9R.bMz.rz$BZ#(ώcIM3#&"J蝓z$#"K"Zm#J{6a'"T5'#,68koDAMc&Ca1'a#z6Hk Gvk^8ʢ爞,Am^M#Ao5* QqDaGb~pAoʲ#mmx葀#8P"4We%"6ȶW#so5 1orD=6bHX쵄#A.FM[.jpGdz#𹈲#,$mg ==erĒ^]Y833XXj\D䈿vNN" GD쑈Kz$8ވa1+Qr~Kz$ـ#rpDQ{# !VfmpGdX1q.L^9 jHX赜~fſ^AMy.\^9 jqOe8"Gz#24W.EADچrG,m1eI#"jpDe;GdIx或 8RQ8b3$AoMp(8JN{j{-~93豤*1ANFN"Gة[p#iE*2#$|6r8T.9 uچ k-8O8^h=nj_9:QvsDD~l aFh(68!,#Z9BWGa#"~oi%m{$x#{5Vz>ANB[۰jl99BcIMGEqa%'Ѻߒچo#Gވlixl(ߟk Gx(Ϡ7FY2#$m葈k Gka7b4 "oAn}8"sM#GDiXgi.Lr~kYz$AoDKj~+2D^r9cmZGK4"t 'Y9B#aGXh41D\D$r6qDGAMB.B5rFm(z$赜9ʞO8όM 'Am^#GO{5!E#'t( ߵ 8PpD\#K"O8O1#ijseGXIPۀ#8AM@.9 {@=6葨p?#FiXg#$6xvpg'N#2$mPxYe$zr.j(=k+-|x9"zNq!8K.G"G=r9emO83-ሶъ#ih8b2CK$mꑀ#pgPAM{e\D$$葀#|Ϡ="vs9 ]N #[9bKpDOv8bM:C9 z$b>C AMCQ#'aYkz$"są8"^ z#4 ћ#$26"HD],1#vs9"3ሾF\Dr6I9=~9bMC_i>19 ae#XK ъ#Z42W.E#'a#T9 ksGx%ч#1Dx{YBomx GY850#$mIXٳ1#j? 8"FM#{r6p=8bKv8J%hj"s9 sGX54#*'mxirn~9Ojyjb*GDIP۰X"Glc8ވ GiE:f jq8De-8"GDk"nr_9'')'#Zݚ#G5#ZѳG|챌P4<"16ȜG[pu5:Qs9 jh{?%zp6Q{,W;%Qs99aGbv9{?8"koD\DjRۀ#l#豤[.{@鷴#G8"jo= QsDk#jHD뵬sE#!+C=G(s-sײGd豤A.b Gw$mf9{6Gd걤7\l(68"[N;G#q)8-Glc8~oj-1D+ܩ]fh9 K 8={,3"4$ Qp՜D~K =9bND8"S%5 [5 r#,IP۠GbND#Fxa2(8cNKG(8Bkor8B$#޳G7<VjsBVz6e8-m G#9=pD\!#"fPچ%GXWBoj#p Qlr9 uV#pgGD5 kse;GY[N;GԮm~9"Keވ%>Qvs>oig=8hajr,r69O8#|XZkre?G,eh9Hsz$jqĜ=p aS9Hp~gK5=E爿|NN"Gdm4,G7ãհ^Ӱ_$Q!J '#.TK5EG刚=4EHsGDIdVkUefx9gMSe\Ds9vmC5{${6rD=pmcIM\#IeL(pDgb+jD\(79bKXIo#jHxϐgYz뱤aw\Ni1'a2SmUeٮ|U6P>;j)re3G,e rs,۵#zZу#ik{="JXr8"ZmCkQei~Or\D$6z *G^,k\D(8eN=HD#|qrFވ5 K #"n4SmG^K8"6Gث#EEANγ$Q# 'ѣG^˺ 8?G({#iu>#<$Z<+zm 8:Gc7bÖk""fP\FIPۀ#8jar GxIXmXI(kpD^K8὿Rh[Ys9 [jYۈ#Gk у#jFidEHe?G$'/ϠA..]GȕGvMI9F}\ !Qs9 H9jzzELbr.j{$"r6hX#i2#Z9 ]m 8;Gxث7"SM\(8eNb KXIxGb~NbvܳGaA.RoeVrjQQ otQӨ^s8"}.\爥,%'AmC[0*G8b5kW:E~K}m#G\Glc +1T8Kj-8Z.zo?z>#"$"[mx GK{51D\ȞX8Dߜ 9 ϐўA5qao5 +r{o9 -mXݳGjk+"$e?Gd9 jp6Z`ϧ=湈#T a!'ѣeg5EGثa!.!Z"-u8"{}WN׽pD\Ȗ\ Q!Qs9 6t{6>a}'55 ^[.\rK$z$[f∖{62#<\Ix뷴Vz$rĔ^K8B =4E(r, oI#^ a\爟9o$b6Z8"zoD\ Q#=$=KkmBD=pgPY+3"V$'qa,IxﷴR0#Qk GLٳ#ϲWZFȕ:Go$'aG%7GD鍈ZӨ_91QsD՜ߒ M%ў#հRӈ_i!ᢞQ6s9 8ͳ6qĔgQu9Bo5 }."t={~# r>8"JmCg ={3/,IxjaGG,ݳGiѲ7 C(99( u%#2FDEȹQ Qshzmjgk#ZP9( =7T6kGسa#615hW#BogF蟋x_KeNRU#qCeѢrio5/ #oIPsąfm[o,I=,,ay%oGڞ 8߳,] 1!n 'a;'ѢGڞ 83FrM\m^XD~˞=l|j"pDzFy|hs.+ z$(ܫѢBMC_i1}$(8b KV#qCek7\D\ QsZ#G=jX퍰_!jrzW$l[Zm({$<#X.퍰\ !u '#Z$6资#qjqrbGXb^=$6#lqDވ{ixa2#Zo驶A%#ZFXi[Y1Dr^rj.{$fm9"z7J53~$|6HDM,#<"Zpވ=re9GevgIx#|qD7rMCEgIdIm({$$eAo5 :GXb^=^z뷤GfpDgF"Jz.-$,[m##ثAM\ʍ Qsą3$,[FmXM,GK т#4<",&GXb ruskpDgcG(ѳ*C(88b.KXIXc oj Glb Ox55 +{=="\3lr6s-[6YpDgPY5 r9Cћ%^,a-'ay( {?8"RM\\D-Xr}#ZN"smG\TgHd^ #4E|qFĜDFTa#""z4"jtU(8/avprLlj}kzFgYsDoUs!'z^Cg-GXoXIX~FgZ}8C\6GX$aQnr%xi7,$ 8(A.m.v=:C᡾AN\p5 Qsni%,72$Ե9 {?ώ7B_11e3GDo%'Am豴Ꚇ=9+ь!v>'aahFg[Zsi#Vӈ0U(9KXIb9( qTXEԨiED魔1DYDچ= 8nךd#si9'Y8ie,8GXݫ1#2",31DyYDDچ^˲Y!#zcIM\DzF-XW}Zϥ=k9bkqĘ+:GX\ȒU(}8r}kNbek G{5"F(A.B:GPhr%aײO8'GDi蟋Y8"b}VeD~K 7Tn*GyvDKc7E\D}l],A}WNچMY9:CiDEga까T۰##Z>;B%zQ#!nR 'AN3rFl5 rGWYW}Κoi#jH4,Gh8sj-1)k ᪞QsD^ eeƜ~K=꽟s 8/sf<9,᥾ANOu%G(kgF32DYS}rNBoiaM)9bKX{5,FXEXrڹ Qnr^ uNR 8"GѷA.C䈹,ANO93jqDĚF p,u9r}#RNW#!,Uc#<"Z̔ Qs9 ^z$ѳDzwoj=r\2#D9 ;9=z-fzwWeoFJ˹"L3,A}vNGچ;G3ѯ7\D\I(86KXo6rĘ^K8bG#,"1DzF5(87Ko$lqDg[Z둸rSpDgPY޽b G0Q6s=-rFhk GV{5F]=l,oXIz.UFQy{Ĝ+:GD鍨YȐ[qy~#\9 ϵ YD,87GXmp& QrDV 'aGKώAM\!v^߈QGO֘z,4ԹzF히Q QvsW 'e޵ 뽖7Tn jXmpF\eD9^{6͞Ok= nY) O Qp\+ѺANbKXmXPol}z,iEXgTc#7ZRۀ#lrD{#Z4"3d=e3GXa k ==跴Mz-MeĶ4",<CԮgbu~#JԪosQj]z-f-9ϴz,[_%ѣQ'b'CѳW"S}CoYk^k*G{>#FԬiXgyODYD~K뵍=7Tn*+GxK~Orѣь!J}+#9 _jz-[<aW.zF2#JX۰#GϠchYӈ^QsKdoDIxmhgų=z#j4EaI QpD r}RNwmֳ-UQײQT-8BѲA.O.3+kDldr#沄^ (9 ݞ=z#4""3Dѓ%JdIDm#lc顦=Q!],WBNb)Kx#ѢM6jXmך\zzl(9rDDmo٪aײǞ 8BWRoDF\zFw(9"3KKYDGBgciѺ2b.CԮgb#2JXoIX跌#cў#T=s8VM#j.roeuϞf ڜDچ=pDc٫7K_{EH:Ge 9sk=z$ܔ58Frg˚F\ 1!usgIm葨DgYzYhSZϨQ!M.k\l* j=z$PpDވѻ'bC x++ssjV{$ٰ-z#4"Le3Gdf r6-Hk#zXfiDExg8ѓ%Tr-6ZHk GXm0> o=;2#,]FoM;'aaG#ZF̩iѳCBٟ9%<7>+rmB#ZlUӰ_imzFr#D^ uNKxIXmpk5  Qs+ѻANbzNJmCkYn z,Wla9ѳF=CWY!MK K=~K+ o=pfh1̚VhW>YK)'aٳ#4jpĜF\J QsDZ߰Q#GO5L^={l爞,Ѻj}JNgچgXg rUv3_i!3Db#,]R𑓰RۘSYjX썰^ӈє!%GŜXo齶qMa-Q#Z=3"K.U=CGd UDK[='a2tmXgAMcGXEx魴!er#沄žK =s--6=9#Fj"D4"30DzoI~^k*7GݫѲ7bU4WEdgdr?u%,7IIxس1YTpDK빈95 u."Z=#J_ (8'KѪWz}ComtٳQn*#Gګ7"s.ų"Z3B0DXb,9ϒk Gh8eoDʈ=5fTe{~#,^ rrz-ϐPsDgYz豴SP"gf#沄=z%$,6,Z}8"ro\JbCKoXx^vR#9#Y7GzvD˚+3""Dd]eGDaZ@UϥR$zH굄#s"fg#~,z?h^ K=-r8bI'o~ZZ{>h׳V."k==Ca%^xi=r*rĔgQEZ{5TjS虋Sr-{"wX:GXf$l$,H#ZXZ1ᥞa'*C u^z𖓨oiGڞ 8b:GhYӰ3k.e3G>r=zGuyϠVoD"z"2DQXݜz$v豌\ӨKO'.8KP7If K{6]oĪةi9'aya9SeCK/DgKdoX^0kYn"G^YsVz+ 1uo9(8#Kd핰XJmV#v=GXRӈRϰ!31DXJߥ^Z9^?ZjXA.O=sODU%J=rj{-Ѫ7[MCCLgg#` 9 {6r:KxOKjjP3,Uve#沄g^zxiImr]93,X #C1DD^ rk^˱kFv쯴[ٳ'p]0D?uX"z}DFQ޳#jѪ1ᩞCL`r#` {,a 9 UmR1#,XZi,e9ᡞѫ'Ω #1DXUߥWg}>О9V iѻ7bUb4,",3zDeorD/lMqUmRDϽ83,qF\ a!vPK 9%{$z٘!#ZXZisz+3DXۛф!nz%<$6zkyM,sė8bU4WEDgxl#yl+oXI규[۰k9vg4W#jMC=s0!(8[ 'muei#5 o{"3D=蕓PD~npĮ^KQ2JMCsr{"B0%]Z깴Qۨ#ђ#.Gh8ZM#b."B=#%CK黴VP$6ZsQDzwoDJ5CEXb=b?e;G9r=j{$\ mS9bοً#Ys={+aC%"JdZ۰k#c97bU4Z>w*c=W_crg KXDF1vFzFn\o,jG˞ k=-H,ݳ#K|jj虋5*]1DDD~ kK!#ըc97bn.bIM#b.BorDdwa߲eDfX,^={#4WbL.e=CWYci(9bK,my٪1GbўrSprѢa%S!n=.{7$^k*Ղ#v=CG,}ҽJu."C=p20uzK껴Vߨб9?Z#>;W՚F\V=#Cls QpeKK5'Ѣ߲vmciD=S9bWmC5|鱬Ѣ9ѳa%C Qs,aWF}>V9ֵ^=5{-#s=K{,kFT"jVsrSbT/'zTYP\ZIm,푨k#ZZ㈥{>X说XϰC%zTP]X#Qײ\Xg2GܫѲ7wMR.Uoze#`e{87"$Z6jHXyc魦)ѲC4frwĜU)Xu:'ѲQGHbMk.bNoez Q!~&_r,aWF}cieF +{62pDވU[[ٲ'B3,CKcZrj{-:kQz"1;DP7^,a9'ѫyT\Q#FԮi$A=Nk 1bW6s>zoxImt(#,ըixENXO1%'T-k5fk*jrjhYψA#>>% xaWE}{NemGDDXXsj"t=02M>XKXoIYۀ#|r=gْ!C(9'KԪsxe V9Kkz$r~ss-yx'p30:ƚ?z~#,aR}cnNBo齶G^5=)l爹 XbKx앰#,F쯌Qπ!φᏖQ%ZX-XZ𔓰T۰WY+GXE\X]ӰTϰp Q.9Oz%2$j6H9*KϠRӨ_Y+aaXr#` ,oDIx{#4,""31D=e C'B#aehĜ~˥ϒ6uyH=,= CLd~#&`|,;'ѫ$G\Us0^G`=^X~P+L9=-ll}Ϣji~\zFJbY/ ~(79b OYBwių{?۲ze{6jsĦgY∥jKs0D[>=S/{^-YBeל OiW#KMg.bJ=CWi!j4 .9cDVVhRPZZ9ϠRXNidE%&Cc{Ps:%z>["R}BNUmWGuo\DJ W CTfr잣Ĕ}r5ksz$qD˥sk=bl.c=0 8KpoXIXmܳYT9bNe*1諄!0d~:G, ,1e/G-PP7\*rk-{-rUjrڞ9{GvXQKM%T9=Q9we뚆\ʹ uODT ^a{.gw}o:<='-'?vrwONϞ//Փӿ;'?rr?ok'NN=9NN?trW{r'/=yr3_ӿNNo?9so:9O~|V'_WĿ? ڏ o?2G𞷆5|ƭn yk[1pLc5Xo |k8[9pNs5\o |k8[0&5ѭan cvk[0=hȁ?p-kr4\ hfGõ;p-kz4\ۣ hGõ?09q4̍a sh3G909u4̭a shsG;09y4ͣa shG=09}4a shG?Ѱ5q4a khX3G9Ѱ5u4a khXsG;Ѱ5y4ͣa khXG=Ѱ5}4a khXG?b p4Ć!F hGC8bKr4Ė! h9GC9bt4Ħ!F hYGC:bˎv4Ķ! hyGC;b x4ƣ!F hGC<bKz4֣! hC=b|bˏ~ýx<돇{p?x` 68x`v8`8#8#PK6U O 3$EURO-CORDEX_81_DOMAIN000_mask_int.ncUTQ]ux  PKjjstars/inst/nc/test-1.nc0000644000176200001440000000174413777653456014457 0ustar liggesusersCDF xyc3c4c5 a@Dxyc3c4c5?@@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8?񙙙@@@ffffff@ffffff@ffffff@ffffff@ 333333@"333333@$333333@&333333@(333333@*333333@,333333@.333333@0@1@2@3@4@5@6@7@8@@@@ @$@(@,@0@2@4@6@8@:@<@>@@@A@B@C@D@E@F@G@H@?@????stars/inst/nc/d0000644000176200001440000006403414344372455013153 0ustar liggesusersnetcdf sub { dimensions: latitude = 9 ; level = 2 ; longitude = 9 ; time = 10 ; variables: float latitude(latitude) ; latitude:units = "degrees_north" ; latitude:long_name = "latitude" ; int level(level) ; level:units = "millibars" ; level:long_name = "pressure_level" ; float longitude(longitude) ; longitude:units = "degrees_east" ; longitude:long_name = "longitude" ; int time(time) ; time:units = "hours since 1900-01-01 00:00:00.0" ; time:long_name = "time" ; time:calendar = "gregorian" ; short u(time, level, latitude, longitude) ; u:scale_factor = 0.000270934372177591 ; u:add_offset = 4.15255160556782 ; u:_FillValue = -32767s ; u:missing_value = -32767s ; u:units = "m s**-1" ; u:long_name = "U component of wind" ; u:standard_name = "eastward_wind" ; short v(time, level, latitude, longitude) ; v:scale_factor = 0.000187186943937716 ; v:add_offset = 1.28458200467256 ; v:_FillValue = -32767s ; v:missing_value = -32767s ; v:units = "m s**-1" ; v:long_name = "V component of wind" ; v:standard_name = "northward_wind" ; // global attributes: :Conventions = "CF-1.6" ; :history = "Fri Jul 3 20:45:39 2020: ncks -d time,1,10 data.nc sub.nc\n", "2020-06-30 07:07:13 GMT by grib_to_netcdf-2.16.0: /opt/ecmwf/eccodes/bin/grib_to_netcdf -S param -o /cache/data4/adaptor.mars.internal-1593500809.0007904-16187-13-88557124-d321-4eea-bab8-1367f56839fd.nc /cache/tmp/88557124-d321-4eea-bab8-1367f56839fd-adaptor.mars.internal-1593500809.0013933-16187-2-tmp.grib" ; :NCO = "netCDF Operators version 4.9.2 (Homepage = http://nco.sf.net, Code = http://github.com/nco/nco)" ; data: latitude = 52, 51.75, 51.5, 51.25, 51, 50.75, 50.5, 50.25, 50 ; level = 825, 850 ; longitude = 5, 5.25, 5.5, 5.75, 6, 6.25, 6.5, 6.75, 7 ; time = 1031161, 1031162, 1031163, 1031164, 1031165, 1031166, 1031167, 1031168, 1031169, 1031170 ; u = 31398, 31456, 30677, 29690, 28962, 28717, 28933, 29394, 29935, 30822, 30620, 29704, 28623, 27888, 27671, 27815, 28082, 28306, 30122, 29834, 28818, 27686, 26936, 26532, 26215, 26049, 26093, 27693, 27217, 26395, 25725, 25357, 24968, 24442, 24204, 24478, 23872, 23425, 23202, 23396, 23800, 23822, 23267, 22748, 22841, 21198, 20852, 21104, 22092, 23461, 24211, 23555, 22099, 21255, 20189, 20563, 21609, 23166, 24910, 25840, 24910, 22603, 20758, 22409, 23526, 24817, 25804, 26403, 26395, 25285, 23238, 21306, 26035, 27159, 27902, 27888, 27268, 26475, 25660, 24701, 23591, 27896, 27787, 27247, 26821, 26692, 26814, 27182, 27773, 28458, 27860, 27456, 26721, 26252, 26245, 26540, 26994, 27492, 27910, 28206, 27795, 26951, 26338, 26187, 26180, 26108, 26101, 26194, 27283, 27031, 26533, 26317, 26367, 26173, 25596, 25120, 25041, 24601, 24630, 24789, 25365, 26072, 26129, 25322, 24342, 23844, 22215, 22107, 22475, 23650, 25185, 25906, 25048, 23145, 21501, 20968, 21047, 21703, 23051, 24652, 25502, 24644, 22201, 19613, 21847, 22244, 22871, 23455, 23859, 23880, 23138, 21444, 19375, 23462, 23967, 24298, 24140, 23484, 22684, 22042, 21523, 20816, 29829, 31234, 32215, 32453, 31948, 31047, 30052, 29122, 28409, 30074, 31083, 31523, 31191, 30304, 29230, 28243, 27529, 27197, 29014, 29569, 29490, 28920, 28156, 27327, 26599, 26325, 26469, 27450, 27507, 27169, 26678, 26094, 25280, 24602, 24645, 25258, 25136, 24631, 24242, 24047, 23744, 23016, 22187, 21949, 22454, 22389, 21423, 21149, 21517, 22122, 22303, 21603, 20464, 19880, 19974, 19498, 20032, 21200, 22620, 23507, 22858, 20868, 19138, 20335, 20890, 22151, 23391, 24299, 24638, 23816, 21877, 19996, 22901, 24220, 25583, 26253, 26282, 26152, 25792, 24862, 23528, 26291, 27466, 28036, 27942, 27380, 26630, 25952, 25505, 25289, 26190, 27163, 27430, 26990, 26154, 25325, 24842, 24871, 25246, 26010, 26651, 26637, 26125, 25455, 24835, 24554, 24799, 25318, 25750, 26017, 25895, 25621, 25275, 24820, 24510, 24720, 25224, 24244, 24179, 24164, 24301, 24388, 24100, 23573, 23364, 23660, 21728, 21281, 21310, 22016, 23061, 23602, 23047, 21749, 20690, 19558, 19392, 19947, 21194, 22766, 23739, 23141, 20964, 18520, 19781, 20250, 21202, 22139, 22759, 22845, 22016, 20178, 17994, 21216, 22117, 23004, 23278, 22946, 22398, 21749, 20913, 19868, 27707, 29228, 30562, 31514, 31989, 32069, 31925, 31593, 31038, 29142, 30461, 31124, 31240, 31038, 30742, 30432, 30079, 29610, 28688, 29524, 29589, 29279, 28918, 28536, 28162, 27988, 27988, 26698, 27181, 27232, 27152, 26914, 26302, 25566, 25343, 25718, 25660, 25595, 25516, 25501, 25228, 24298, 22935, 21969, 21868, 24990, 23995, 23469, 23418, 23432, 22863, 21407, 19626, 18559, 22863, 21515, 21169, 21522, 22034, 22063, 21039, 19158, 17644, 21162, 20506, 20902, 21594, 22012, 22048, 21443, 20088, 18711, 20953, 21515, 22625, 23476, 23793, 24016, 24161, 23764, 22863, 24154, 25314, 26381, 27174, 27491, 27383, 27088, 26756, 26287, 24276, 25480, 26237, 26576, 26489, 26093, 25689, 25494, 25415, 24197, 25033, 25401, 25480, 25300, 24932, 24716, 24910, 25343, 23908, 24377, 24730, 24961, 24846, 24377, 24045, 24363, 25098, 23981, 24002, 24182, 24435, 24363, 23707, 22834, 22474, 22856, 23065, 22315, 21962, 22178, 22647, 22604, 21630, 20268, 19453, 20701, 19828, 19691, 20275, 21256, 21818, 21162, 19381, 17565, 19518, 19230, 19713, 20405, 20924, 21104, 20607, 19273, 17608, 19626, 20124, 20974, 21493, 21522, 21443, 21320, 20837, 19922, 25217, 26623, 27892, 28995, 29665, 29925, 30105, 30292, 30299, 26133, 27654, 28807, 29463, 29543, 29348, 29269, 29269, 29160, 25779, 26839, 27538, 27877, 27834, 27582, 27380, 27308, 27380, 23804, 24554, 25239, 25751, 25895, 25650, 25217, 24886, 24893, 23055, 23696, 24417, 24943, 25015, 24576, 23682, 22586, 21779, 23984, 23934, 24201, 24511, 24554, 24071, 22745, 20755, 19039, 23768, 22961, 22824, 23004, 23062, 22564, 21094, 18895, 17129, 22276, 21433, 21324, 21469, 21397, 20928, 19883, 18318, 17014, 20236, 20121, 20596, 21094, 21317, 21483, 21548, 21202, 20553, 22456, 23234, 23991, 24669, 25044, 25166, 25346, 25613, 25714, 21216, 22376, 23349, 23998, 24236, 24229, 24272, 24452, 24669, 20913, 21828, 22513, 22924, 23090, 23112, 23198, 23501, 24042, 20841, 21367, 21965, 22542, 22859, 22802, 22621, 22730, 23313, 21684, 21973, 22499, 23104, 23364, 23011, 22239, 21641, 21699, 22362, 22009, 21958, 22218, 22528, 22383, 21410, 19940, 18923, 21014, 20257, 20033, 20250, 20668, 20769, 19860, 18022, 16371, 19623, 19060, 19067, 19276, 19406, 19298, 18635, 17352, 16069, 18664, 18779, 19226, 19550, 19565, 19486, 19385, 19103, 18584, 23231, 24183, 25005, 25783, 26374, 26677, 26872, 27067, 27225, 22698, 24032, 25199, 25971, 26187, 26093, 26093, 26194, 26187, 22417, 23433, 24233, 24716, 24760, 24587, 24522, 24515, 24450, 20989, 21638, 22273, 22756, 22828, 22619, 22431, 22229, 22006, 20024, 20636, 21400, 21977, 22042, 21761, 21328, 20622, 19771, 20802, 21184, 21819, 22388, 22554, 22229, 21299, 19757, 18243, 21696, 21602, 21862, 22179, 22157, 21487, 19973, 17962, 16491, 21422, 20874, 20723, 20586, 20139, 19324, 18048, 16470, 15374, 19216, 18611, 18510, 18438, 18221, 18185, 18257, 18019, 17609, 21539, 22029, 22483, 22829, 22880, 22707, 22599, 22671, 22858, 18893, 19737, 20530, 21013, 21027, 20840, 20818, 21063, 21481, 18151, 18879, 19448, 19694, 19629, 19528, 19672, 20047, 20631, 18259, 18677, 19081, 19391, 19484, 19405, 19326, 19384, 19766, 19102, 19506, 20025, 20515, 20688, 20414, 19830, 19211, 18973, 20133, 20342, 20623, 20933, 21092, 20833, 19960, 18627, 17516, 19722, 19557, 19528, 19578, 19542, 19117, 17963, 16240, 14806, 18612, 18187, 17971, 17812, 17480, 16839, 15866, 14683, 13775, 17055, 16925, 16954, 16947, 16680, 16356, 16226, 16183, 16046, 23625, 23979, 24029, 24022, 24087, 24303, 24707, 25197, 25593, 21903, 22450, 22796, 22991, 23042, 23164, 23575, 24137, 24527, 20230, 20886, 21369, 21701, 21830, 21881, 22068, 22349, 22530, 18349, 18839, 19300, 19704, 19913, 19927, 19913, 19949, 19985, 16864, 17361, 17981, 18522, 18767, 18723, 18529, 18284, 18053, 16618, 17217, 17995, 18738, 19271, 19372, 18839, 17894, 17137, 17484, 18003, 18630, 19293, 19898, 19942, 18925, 17318, 16265, 18442, 18457, 18536, 18687, 18868, 18637, 17584, 16107, 15133, 17750, 17080, 16698, 16582, 16633, 16712, 16683, 16438, 16092, 22431, 22301, 22142, 22020, 21854, 21760, 21876, 22041, 22128, 18581, 18740, 19006, 19172, 19115, 19050, 19230, 19562, 19965, 16022, 16620, 17190, 17428, 17341, 17312, 17557, 17976, 18538, 15316, 15986, 16591, 16945, 17067, 17111, 17147, 17226, 17529, 15676, 16411, 17226, 17925, 18329, 18322, 17940, 17493, 17348, 16433, 17262, 18127, 18855, 19381, 19439, 18805, 17774, 16952, 16671, 17276, 17817, 18300, 18790, 18826, 17831, 16145, 14811, 16361, 16433, 16534, 16678, 16851, 16649, 15669, 14270, 13261, 15150, 15142, 15301, 15424, 15424, 15279, 15070, 14897, 14674, 23182, 24004, 24465, 24458, 24256, 24263, 24616, 25135, 25611, 20623, 21423, 22079, 22317, 22295, 22439, 22944, 23564, 24025, 18467, 19116, 19750, 20176, 20385, 20616, 21026, 21466, 21798, 16348, 16824, 17336, 17782, 18078, 18265, 18453, 18676, 18979, 14207, 14654, 15245, 15814, 16233, 16406, 16341, 16290, 16543, 12794, 13399, 14257, 15158, 16002, 16506, 16362, 15872, 15735, 12650, 13558, 14711, 15814, 16910, 17660, 17465, 16543, 15915, 14120, 15036, 15930, 16543, 17069, 17422, 17119, 16204, 15447, 15267, 15555, 15728, 15771, 15814, 15959, 16096, 16031, 15793, 23677, 23749, 23561, 23136, 22660, 22501, 22775, 23215, 23540, 19178, 19250, 19330, 19258, 19121, 19250, 19719, 20252, 20735, 15170, 15473, 15963, 16309, 16540, 16915, 17448, 17989, 18609, 13166, 13663, 14363, 15048, 15667, 16201, 16540, 16799, 17311, 12467, 13188, 14197, 15264, 16201, 16691, 16605, 16432, 16770, 12424, 13418, 14665, 15970, 17217, 17938, 17672, 16857, 16460, 12676, 13829, 15062, 16287, 17628, 18558, 18176, 16684, 15386, 13346, 14161, 14968, 15718, 16525, 17030, 16619, 15437, 14334, 13426, 13808, 14262, 14752, 15163, 15372, 15401, 15358, 15134, 22475, 22670, 22994, 23463, 23830, 24046, 24407, 25020, 25604, 20038, 20262, 20694, 21199, 21574, 21891, 22461, 23261, 23910, 17746, 18085, 18546, 18957, 19217, 19476, 19981, 20658, 21249, 15569, 15886, 16218, 16463, 16600, 16751, 17018, 17400, 17883, 13197, 13507, 13824, 14019, 14084, 14113, 14149, 14235, 14588, 10667, 10970, 11525, 12109, 12592, 12945, 13039, 12952, 13118, 9153, 9586, 10530, 11683, 12757, 13493, 13637, 13442, 13586, 9968, 10681, 11827, 13154, 14199, 14581, 14286, 13846, 13925, 11640, 12210, 13067, 14264, 15108, 15122, 14668, 14408, 14509, 23653, 24035, 24259, 24323, 24165, 23963, 24057, 24468, 24915, 19580, 19825, 20077, 20150, 20070, 20106, 20474, 21079, 21721, 15853, 16091, 16365, 16444, 16451, 16711, 17324, 18109, 18967, 13272, 13416, 13719, 14036, 14390, 14858, 15421, 16084, 16949, 11686, 11895, 12328, 12912, 13517, 13950, 14137, 14426, 15197, 10504, 10872, 11412, 12205, 13294, 14231, 14462, 14224, 14274, 9524, 10122, 10886, 12040, 13784, 15428, 15896, 15211, 14455, 9834, 10756, 11845, 13085, 14498, 15550, 15637, 15010, 14433, 10446, 11521, 12782, 13943, 14692, 14865, 14721, 14721, 14865, 22595, 22321, 21817, 21053, 20238, 19942, 20591, 21896, 23186, 20526, 19733, 19070, 18746, 18789, 19265, 20159, 21211, 22271, 18147, 17657, 17282, 17333, 17758, 18349, 18940, 19488, 20144, 15725, 15934, 15891, 15841, 15841, 15790, 15783, 16078, 16734, 12669, 13130, 13332, 13426, 13375, 13051, 12676, 12676, 13159, 8927, 9446, 9994, 10592, 11090, 11227, 10989, 10729, 10751, 6491, 7139, 8069, 9259, 10535, 11378, 11371, 10758, 10210, 7219, 7947, 8949, 10297, 11695, 12560, 12553, 11933, 11292, 8603, 9381, 10369, 11486, 12251, 12560, 12741, 12935, 12928, 23528, 23953, 24076, 23758, 23052, 22475, 22619, 23499, 24566, 20370, 20363, 20219, 20010, 19938, 20161, 20579, 21070, 21826, 17278, 17321, 17198, 16932, 16888, 17249, 17761, 18251, 19001, 14827, 14906, 14791, 14553, 14387, 14372, 14582, 15165, 16232, 11936, 11929, 11929, 12159, 12412, 12376, 12210, 12455, 13313, 8822, 8944, 9211, 9903, 10855, 11496, 11539, 11287, 11150, 6551, 6969, 7726, 9031, 10739, 12073, 12368, 11763, 10934, 6472, 7142, 8331, 9961, 11554, 12477, 12563, 12203, 11835, 7279, 8281, 9788, 11280, 12058, 12131, 12195, 12628, 13060, 21849, 20847, 20098, 20263, 20689, 20790, 21035, 21921, 22945, 19564, 18382, 17553, 17776, 18252, 18367, 18634, 19470, 20379, 15945, 15592, 15289, 15253, 15369, 15621, 16147, 16861, 17582, 11779, 12103, 12406, 12449, 12615, 13170, 13869, 14431, 15109, 8095, 8217, 8859, 9450, 10034, 10755, 11382, 11843, 12586, 5939, 5651, 6026, 6588, 7331, 8340, 9313, 10070, 10906, 5060, 4844, 4714, 4851, 5687, 7078, 8376, 9407, 10625, 5067, 4426, 3568, 3582, 5031, 7042, 8643, 10020, 11678, 4930, 4245, 3366, 3813, 5954, 8376, 10200, 11923, 13653, 20820, 21030, 21657, 22889, 23791, 23891, 23913, 24468, 25124, 18643, 18903, 19191, 20020, 20784, 20914, 20849, 21195, 21794, 15097, 15789, 16301, 16683, 16942, 17151, 17483, 18031, 18759, 11081, 11910, 12667, 13107, 13518, 14116, 14722, 15255, 15969, 7571, 8097, 8926, 9740, 10577, 11377, 11910, 12321, 13093, 4701, 4911, 5704, 6655, 7614, 8472, 9070, 9531, 10130, 2214, 2142, 2806, 3981, 5343, 6554, 7398, 7945, 8465, 1357, 729, 1011, 2438, 4276, 5711, 6691, 7664, 8702, 1385, 1083, 1306, 2618, 4420, 5884, 7059, 8392, 9676 ; v = -7562, -6649, -7092, -8365, -9889, -11292, -12148, -11950, -10353, -7713, -7369, -8209, -9586, -10864, -11590, -11230, -9445, -6633, -7588, -7332, -7938, -8934, -9774, -10051, -9331, -7572, -5533, -7145, -7171, -7692, -8511, -9247, -9524, -9028, -7891, -6821, -8480, -8997, -9513, -10170, -10791, -10885, -10144, -8877, -7807, -11548, -11934, -11976, -12242, -12800, -13035, -12388, -11094, -9962, -13781, -13395, -12889, -12868, -13421, -13989, -13974, -13478, -13155, -11970, -11370, -11261, -11600, -12184, -12800, -13405, -14208, -15346, -8976, -9023, -9560, -10176, -10583, -10885, -11642, -13322, -15612, -14116, -13261, -13542, -14450, -15713, -16954, -17393, -16443, -14179, -14638, -14095, -14742, -15974, -17100, -17424, -16266, -13595, -10162, -13615, -13198, -13835, -14878, -15629, -15504, -14137, -11769, -9202, -12238, -12363, -12854, -13553, -14168, -14283, -13522, -12040, -10464, -12749, -13250, -13532, -13928, -14315, -14127, -13135, -11737, -10464, -14628, -14836, -14721, -14795, -14993, -14815, -14064, -13062, -12123, -15337, -15087, -14868, -15087, -15723, -16307, -16360, -15827, -15139, -13449, -13396, -14033, -15160, -16141, -16506, -16328, -16036, -16141, -12322, -12833, -14189, -15410, -15514, -14732, -14273, -14868, -16245, -10363, -9507, -8589, -7598, -6575, -5688, -5334, -5788, -6675, -9805, -9617, -9080, -8323, -7525, -6826, -6560, -6951, -7504, -9643, -9726, -9320, -8657, -8099, -7739, -7556, -7525, -7441, -8365, -8490, -8281, -8088, -8250, -8568, -8553, -8052, -7348, -6899, -7389, -7760, -8344, -9314, -10206, -10332, -9575, -8454, -7864, -8574, -9194, -10128, -11568, -12898, -13211, -12309, -10848, -11563, -12074, -12565, -13347, -14511, -15434, -15251, -13848, -12132, -13744, -13890, -14333, -14813, -15043, -14808, -14057, -13091, -12476, -13008, -12966, -13107, -12914, -12085, -10984, -10368, -10739, -11985, -15985, -14973, -13627, -12124, -10862, -10246, -10392, -11217, -12291, -16413, -15526, -14243, -13053, -12323, -12062, -12260, -12803, -13084, -15964, -15495, -14556, -13596, -13011, -12803, -12803, -12824, -12500, -13137, -13387, -12990, -12490, -12552, -13032, -13251, -12834, -11947, -10257, -11060, -11311, -11780, -12907, -14044, -14232, -13272, -11655, -10622, -11540, -12229, -13366, -14931, -16058, -16027, -14889, -13032, -13356, -14128, -14921, -16069, -17321, -18041, -17759, -16444, -14451, -14942, -15359, -16194, -17195, -17696, -17352, -16329, -15025, -13930, -14712, -14910, -15745, -16204, -15369, -13679, -12427, -12302, -13168, -12499, -11936, -11477, -10913, -10141, -9046, -7606, -6197, -5248, -11779, -11581, -11612, -11477, -10934, -9891, -8534, -7345, -6719, -10444, -10632, -11007, -11112, -10809, -10141, -9202, -8274, -7814, -9369, -9494, -9745, -9933, -10152, -10298, -10037, -9327, -8680, -8096, -8054, -8263, -8733, -9557, -10413, -10726, -10339, -9630, -7877, -7658, -7762, -8294, -9432, -10830, -11623, -11352, -10475, -10715, -10141, -10099, -10632, -11821, -13240, -13783, -12812, -11112, -13658, -13042, -13251, -13824, -14440, -14847, -14586, -13501, -12238, -15066, -14492, -14377, -14190, -13595, -12750, -12113, -11946, -12280, -16304, -16137, -15772, -14885, -13539, -11849, -9971, -8458, -7905, -16982, -16722, -16273, -15428, -14165, -12506, -10826, -9877, -10013, -15689, -15720, -15710, -15313, -14416, -13153, -11932, -11379, -11692, -12652, -13195, -13560, -13550, -13404, -13247, -13028, -12725, -12475, -9428, -10044, -10503, -11077, -12026, -13080, -13696, -13518, -12600, -8207, -8708, -9480, -10806, -12517, -14019, -14781, -14572, -13404, -10305, -10941, -12068, -13675, -15386, -16649, -17003, -16252, -14437, -13362, -13873, -14906, -16242, -17264, -17431, -16795, -15647, -14207, -14917, -14948, -15595, -16252, -15908, -14551, -13237, -12788, -13007, -15067, -14138, -13408, -12719, -12104, -11551, -10789, -9641, -8253, -14097, -13512, -13356, -13293, -13126, -12709, -11853, -10643, -9359, -12427, -12375, -12542, -12719, -12761, -12521, -11905, -11112, -10403, -11498, -11165, -11029, -11185, -11603, -11989, -12072, -11895, -11645, -11363, -10507, -10152, -10413, -11154, -11989, -12563, -12698, -12438, -11801, -10497, -9871, -10017, -10768, -11864, -12803, -12897, -12104, -13940, -12291, -11467, -11530, -12198, -13231, -13961, -13439, -11770, -16611, -15182, -14524, -14472, -14629, -14869, -14910, -14211, -12844, -18750, -17613, -16642, -15797, -14890, -13950, -13251, -12959, -12980, -16567, -16045, -15670, -15138, -14449, -13614, -12331, -10547, -8731, -17360, -16964, -16671, -16254, -15659, -14626, -12967, -11047, -9535, -15565, -15471, -15513, -15503, -15232, -14345, -12884, -11507, -10849, -12571, -12446, -12529, -12769, -13093, -13218, -13051, -12811, -12811, -10432, -9910, -9785, -10254, -11277, -12519, -13552, -14094, -14052, -9305, -8491, -8533, -9608, -11329, -13103, -14449, -14971, -14428, -10547, -10046, -10578, -12112, -14094, -15837, -16891, -16786, -15325, -13802, -13625, -14240, -15555, -16828, -17433, -17339, -16598, -15200, -16285, -15899, -16139, -16692, -16536, -15388, -14167, -13646, -13625, -16041, -15728, -15300, -14810, -14226, -13495, -12577, -11502, -10261, -16803, -16177, -15791, -15509, -15050, -14278, -13307, -12285, -11148, -16417, -15666, -15133, -14758, -14278, -13620, -12963, -12462, -11920, -16072, -14779, -13829, -13360, -13130, -12921, -12796, -12754, -12483, -16093, -14486, -13443, -13078, -13067, -13193, -13485, -13777, -13610, -16542, -14653, -13422, -12963, -12994, -13328, -13819, -13986, -13516, -17773, -15592, -14142, -13589, -13547, -13746, -13913, -13464, -12274, -18848, -17085, -15832, -15102, -14622, -14393, -14361, -14048, -13151, -19818, -18618, -17304, -16020, -14820, -13913, -13506, -13443, -13453, -15959, -15750, -15468, -14936, -14258, -13538, -12526, -11107, -9531, -17743, -17180, -16710, -16157, -15479, -14592, -13309, -11712, -10084, -17503, -16460, -15719, -15187, -14655, -13830, -12630, -11378, -10366, -15688, -13976, -12860, -12349, -12192, -12015, -11712, -11451, -11253, -14248, -12036, -10637, -10230, -10554, -11222, -11994, -12693, -13027, -13121, -10742, -9490, -9531, -10470, -11681, -12787, -13611, -13862, -13142, -11232, -10397, -10804, -12015, -13319, -14300, -14728, -14331, -14790, -13444, -12881, -13309, -14185, -14801, -15114, -15249, -14884, -16084, -14988, -14613, -14874, -14842, -14122, -13496, -13590, -14018, -17004, -16827, -16420, -15851, -15267, -14777, -14255, -13452, -12314, -18434, -17703, -17229, -16843, -16331, -15684, -14970, -14083, -12951, -19524, -18710, -18074, -17427, -16556, -15570, -14688, -13937, -13196, -20969, -19566, -18403, -17443, -16457, -15465, -14667, -14104, -13561, -21627, -19743, -18345, -17380, -16514, -15742, -15319, -15173, -14881, -21621, -19389, -17745, -16780, -16206, -15836, -15664, -15418, -14808, -21830, -19342, -17474, -16483, -16065, -15799, -15408, -14672, -13603, -21397, -19383, -17750, -16603, -15877, -15418, -15095, -14667, -13916, -20948, -19597, -18032, -16436, -15184, -14401, -14031, -13916, -13744, -15864, -15510, -15051, -14398, -13731, -13183, -12510, -11393, -9933, -17581, -16803, -16151, -15484, -14769, -13976, -12974, -11680, -10214, -19083, -17909, -16850, -15791, -14638, -13360, -12035, -10825, -9813, -19882, -17763, -15922, -14445, -13183, -12056, -11159, -10548, -10131, -19725, -16772, -14451, -13005, -12171, -11790, -11868, -12176, -12338, -18567, -15275, -13162, -12265, -12087, -12312, -12854, -13423, -13678, -17544, -14471, -12651, -12035, -12176, -12651, -13219, -13595, -13506, -17445, -14894, -13240, -12645, -12739, -12964, -13198, -13491, -13585, -16960, -14993, -13819, -13444, -13251, -12734, -12296, -12505, -13152, -16770, -17615, -18116, -17908, -17099, -16243, -15591, -14824, -13776, -18789, -18847, -18852, -18341, -17313, -16332, -15711, -15064, -14031, -20584, -20104, -19634, -18993, -18043, -17010, -16129, -15226, -14120, -22806, -21800, -20939, -20250, -19348, -18090, -16749, -15440, -14120, -24445, -23072, -22008, -21127, -19937, -18440, -17125, -16087, -15064, -24982, -22864, -21085, -19702, -18450, -17355, -16556, -15795, -14840, -24617, -21998, -19927, -18628, -17819, -17193, -16525, -15508, -14261, -22864, -20600, -18998, -17991, -17245, -16640, -16165, -15550, -14673, -21487, -19911, -18497, -17073, -15685, -14668, -14250, -14099, -13770, -16002, -16029, -15736, -14902, -13744, -12799, -12152, -11375, -10264, -17369, -16623, -15898, -14933, -13759, -12773, -12043, -11125, -9799, -18611, -17474, -16618, -15689, -14417, -12997, -11657, -10248, -8777, -20442, -18778, -17458, -16232, -14703, -13018, -11474, -9992, -8652, -21877, -19571, -17724, -16274, -14844, -13597, -12794, -12090, -11250, -21793, -18773, -16649, -15335, -14297, -13634, -13535, -13498, -13102, -21032, -17839, -15705, -14448, -13592, -13191, -13300, -13363, -13003, -20484, -17615, -15397, -13874, -12883, -12429, -12434, -12481, -12366, -19086, -16681, -14683, -13243, -12231, -11516, -11135, -11104, -11406, -16092, -16572, -16921, -17365, -17772, -17918, -17787, -17433, -16770, -17855, -17793, -17949, -18215, -18085, -17568, -17167, -16843, -16076, -19326, -19290, -19410, -19436, -18904, -18006, -17328, -16754, -15758, -21194, -21184, -21184, -21053, -20490, -19525, -18424, -17120, -15528, -23829, -23453, -22785, -21914, -20829, -19535, -18142, -16687, -15210, -25305, -23312, -21105, -19274, -17840, -16619, -15539, -14548, -13650, -23390, -20182, -17709, -16483, -15878, -15283, -14715, -14162, -13614, -19827, -17297, -15993, -15925, -15925, -15461, -15095, -15033, -14876, -18940, -17307, -16186, -15748, -15174, -14182, -13603, -13807, -14125, -15359, -15558, -15521, -15187, -14598, -13899, -13116, -12245, -11384, -16752, -16293, -15824, -15083, -13935, -12761, -11885, -11097, -10085, -17634, -16684, -16001, -15140, -13794, -12422, -11410, -10393, -9052, -18943, -17608, -16763, -15949, -14775, -13471, -12193, -10669, -8927, -21056, -19528, -18265, -17055, -15787, -14592, -13466, -12213, -10894, -22648, -20399, -18197, -16314, -14895, -13961, -13319, -12740, -12167, -22877, -19945, -17201, -15213, -14206, -13904, -13846, -13591, -13027, -21557, -18865, -16502, -14869, -14128, -13899, -13747, -13445, -12970, -18964, -16945, -15239, -13951, -13179, -12469, -11640, -11160, -11269, -17118, -17765, -17833, -17812, -18047, -18626, -19393, -19925, -20003, -18626, -18156, -17697, -17614, -17822, -18334, -19095, -19513, -19132, -19320, -18991, -19001, -19346, -19502, -19393, -19299, -18934, -17927, -20274, -20118, -20316, -20728, -20671, -19935, -18939, -17807, -16362, -19633, -19461, -19544, -19716, -19393, -18386, -17134, -15861, -14343, -18355, -17760, -17342, -17108, -16576, -15563, -14447, -13320, -11797, -18626, -17029, -15699, -15110, -14687, -13931, -13117, -12287, -11092, -17050, -15057, -13748, -13544, -13524, -13002, -12308, -11729, -11171, -15240, -13920, -13054, -12553, -11818, -10732, -9872, -9626, -9960, -14632, -15185, -15697, -16250, -16834, -17335, -17356, -16646, -15519, -15957, -15916, -15937, -15874, -15822, -15905, -15644, -14497, -12785, -17105, -17022, -16907, -16260, -15227, -14298, -13370, -11961, -10281, -18597, -18044, -17491, -16500, -14945, -13370, -12128, -10918, -9509, -19056, -17606, -16291, -15144, -13798, -12441, -11533, -10772, -9551, -18837, -16594, -14601, -13203, -12034, -11012, -10500, -10177, -9269, -18733, -16229, -14027, -12535, -11533, -10949, -10980, -11179, -10782, -17909, -15832, -14204, -13161, -12410, -11711, -11293, -11179, -11074, -17011, -15331, -13985, -12973, -12003, -10657, -9280, -8612, -8873, -18213, -19862, -20524, -20973, -21182, -20994, -20806, -20910, -21025, -20811, -20863, -19924, -19277, -19163, -19366, -19857, -20457, -20728, -20754, -19711, -18818, -18239, -17812, -17759, -18234, -18683, -18495, -18886, -17853, -18088, -18521, -18453, -18323, -18464, -18344, -17446, -17405, -16653, -17175, -18166, -19131, -20008, -20394, -19742, -18062, -17347, -16919, -16841, -17034, -17561, -18067, -17832, -16758, -15302, -18782, -18698, -17765, -16617, -15954, -15433, -14462, -13434, -12704, -18098, -16622, -14008, -12094, -12031, -12615, -12365, -11546, -10690, -13737, -11322, -8708, -7450, -8113, -8922, -8478, -7581, -7117, -13422, -15696, -17877, -19620, -20559, -20684, -20277, -19651, -18931, -16281, -17585, -18169, -18461, -18722, -18827, -18597, -18086, -17501, -16855, -16886, -16740, -16322, -15759, -15342, -15060, -14601, -13829, -15874, -15342, -15540, -15415, -14611, -13860, -13505, -13004, -11846, -14768, -13296, -13265, -13714, -14037, -14402, -14632, -14121, -12597, -15143, -13182, -12493, -12639, -13036, -13276, -13119, -12587, -11711, -16740, -14799, -13213, -12253, -11627, -10907, -10125, -9822, -9895, -14851, -11888, -9519, -8643, -8883, -9060, -8664, -8184, -7871, -11001, -8549, -7057, -7005, -7704, -7808, -6921, -5920, -5523 ; } stars/inst/tif/0000755000176200001440000000000014314310266013145 5ustar liggesusersstars/inst/tif/olinda_dem_utm25s.tif0000644000176200001440000014140213777653456017214 0ustar liggesusersII*oo S  DN x8888884~!@&`^ν̞V@̞V@5!AD<eaA!V!#     > )#@TXAr@UTM Zone 25, Southern Hemisphere|GCS Name = GRS 1980(IUGG, 1980)|Datum = unknown|Ellipsoid = GRS80|Primem = Greenwich||BDBBBB\BB|BBlB`B8BBBAAAAAAAAAAAAAAAAAAABAABAAAA,B`BdB\B BAAAB$BA BAAAAA0AAA@@AA A0A AA A0AAA@@@@@@AAA@@@@@A@@@@@@@APAA`APAA@0A@AAAA@A@8B0BBBBPBBBBBBXB0BBBB BBAAAAAAAAAAAAAAABAB$BAAAABXBlBhB thematic Layer_1 p@p@ߗGA@#       )#      =@F@7@Xr@@TXAAlbers Conical Equal Area|NAD83| *** * * ZZG_G* *GQ***G*GZ  __GG*****GG *QR_**G*G**G*****G4Z * GGG_QGQ***Q***G******* **** *****GGG****G**4* G** ___****GGG*G4*GGGGGGGQGQ_ *4 G GGGQQRRGGG***GG***GG*QQGGGZ *G R**GG***GGQ*GGG*4****GG**GG4G* _GRRG**RR*G*GG**G**G4*G**G*GGGG*GQ ZGGGGQG**QGQG*******R*GG*4**GG**GGGG*GGGG G*G**G*****************4G*G*G***4QGGGGG****G*4 GRGQG*******G*****G******GG**G*G4**QG*G*G*G*GR_ G*****4G*GG*************G*GG44GGGQ*4G****G**G G*****G GGG******G*G*GG**GG**G*GG*G****G***** **GG*GG****Q****4***G***G*******GG***GG*** GRG*GGGG**GGG******G***G**G**G*GGG*G*******G*** GG**G*GG*G*G******G**G****G**GGGGG4G**44**G *G***G**G**G*********G4*******G*4**GGGGG*GG G*GG***4G**** *****GG*****44GGGGG*GGGG RGG4***G****************444GGGR Z **GG****4**G***G*****G*GG*GRR RZ **********GG**G*4G*R RR _*****************G4*G_ G**G*G**G4*****  _GG**G**4***R GGG***GG*GR*RZ* G G**RQQG4G*GG* G**GGGGG* G44Q  GZ stars/inst/tif/x0000644000176200001440000010461414255305546013356 0ustar liggesusersDriver: GTiff/GeoTIFF Files: lc.tif lc.tif.aux.xml Size is 84, 46 Coordinate System is: PROJCRS["Albers Conical Equal Area", BASEGEOGCRS["NAD83", DATUM["North American Datum 1983", ELLIPSOID["GRS 1980",6378137,298.257222101004, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4269]], CONVERSION["Albers Equal Area", METHOD["Albers Equal Area", ID["EPSG",9822]], PARAMETER["Latitude of false origin",23, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8821]], PARAMETER["Longitude of false origin",-96, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8822]], PARAMETER["Latitude of 1st standard parallel",29.5, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8823]], PARAMETER["Latitude of 2nd standard parallel",45.5, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8824]], PARAMETER["Easting at false origin",0, LENGTHUNIT["metre",1], ID["EPSG",8826]], PARAMETER["Northing at false origin",0, LENGTHUNIT["metre",1], ID["EPSG",8827]]], CS[Cartesian,2], AXIS["easting",east, ORDER[1], LENGTHUNIT["metre",1, ID["EPSG",9001]]], AXIS["northing",north, ORDER[2], LENGTHUNIT["metre",1, ID["EPSG",9001]]]] Data axis to CRS axis mapping: 1,2 Origin = (3092415.000000000000000,59415.000000000000000) Pixel Size = (3000.000000000000000,-3000.000000000000000) Metadata: AREA_OR_POINT=Area Image Structure Metadata: INTERLEAVE=BAND Corner Coordinates: Upper Left ( 3092415.000, 59415.000) ( 67d 8'38.61"W, 19d 9'50.50"N) Lower Left ( 3092415.000, -78585.000) ( 67d31' 6.31"W, 17d55'44.35"N) Upper Right ( 3344415.000, 59415.000) ( 64d57' 3.09"W, 18d25'57.50"N) Lower Right ( 3344415.000, -78585.000) ( 65d20'59.11"W, 17d12' 9.45"N) Center ( 3218415.000, -9585.000) ( 66d14'16.57"W, 18d11'23.67"N) Band 1 Block=84x46 Type=Byte, ColorInterp=Palette Description = Layer_1 Metadata: LAYER_TYPE=thematic Color Table (RGB with 256 entries) 0: 0,0,0,255 1: 0,250,0,255 2: 0,0,0,255 3: 0,0,0,255 4: 0,0,0,255 5: 0,0,0,255 6: 0,0,0,255 7: 0,0,0,255 8: 0,0,0,255 9: 0,0,0,255 10: 0,0,0,255 11: 71,107,161,255 12: 209,222,250,255 13: 0,0,0,255 14: 0,0,0,255 15: 0,0,0,255 16: 0,0,0,255 17: 0,0,0,255 18: 0,0,0,255 19: 0,0,0,255 20: 0,0,0,255 21: 222,202,202,255 22: 217,148,130,255 23: 238,0,0,255 24: 171,0,0,255 25: 0,0,0,255 26: 0,0,0,255 27: 0,0,0,255 28: 0,0,0,255 29: 0,0,0,255 30: 0,0,0,255 31: 179,174,163,255 32: 250,250,250,255 33: 0,0,0,255 34: 0,0,0,255 35: 0,0,0,255 36: 0,0,0,255 37: 0,0,0,255 38: 0,0,0,255 39: 0,0,0,255 40: 0,0,0,255 41: 104,171,99,255 42: 28,99,48,255 43: 181,202,143,255 44: 0,0,0,255 45: 0,0,0,255 46: 0,0,0,255 47: 0,0,0,255 48: 0,0,0,255 49: 0,0,0,255 50: 0,0,0,255 51: 166,140,48,255 52: 204,186,125,255 53: 0,0,0,255 54: 0,0,0,255 55: 0,0,0,255 56: 0,0,0,255 57: 0,0,0,255 58: 0,0,0,255 59: 0,0,0,255 60: 0,0,0,255 61: 0,0,0,255 62: 0,0,0,255 63: 0,0,0,255 64: 0,0,0,255 65: 0,0,0,255 66: 0,0,0,255 67: 0,0,0,255 68: 0,0,0,255 69: 0,0,0,255 70: 0,0,0,255 71: 227,227,194,255 72: 202,202,120,255 73: 153,194,71,255 74: 120,174,148,255 75: 0,0,0,255 76: 0,0,0,255 77: 0,0,0,255 78: 0,0,0,255 79: 0,0,0,255 80: 0,0,0,255 81: 220,217,61,255 82: 171,112,40,255 83: 0,0,0,255 84: 0,0,0,255 85: 0,0,0,255 86: 0,0,0,255 87: 0,0,0,255 88: 0,0,0,255 89: 0,0,0,255 90: 186,217,235,255 91: 181,212,230,255 92: 181,212,230,255 93: 181,212,230,255 94: 181,212,230,255 95: 112,163,186,255 96: 0,0,0,255 97: 0,0,0,255 98: 0,0,0,255 99: 0,0,0,255 100: 0,0,0,255 101: 0,0,0,255 102: 0,0,0,255 103: 0,0,0,255 104: 0,0,0,255 105: 0,0,0,255 106: 0,0,0,255 107: 0,0,0,255 108: 0,0,0,255 109: 0,0,0,255 110: 0,0,0,255 111: 0,0,0,255 112: 0,0,0,255 113: 0,0,0,255 114: 0,0,0,255 115: 0,0,0,255 116: 0,0,0,255 117: 0,0,0,255 118: 0,0,0,255 119: 0,0,0,255 120: 0,0,0,255 121: 0,0,0,255 122: 0,0,0,255 123: 0,0,0,255 124: 0,0,0,255 125: 0,0,0,255 126: 0,0,0,255 127: 0,0,0,255 128: 0,0,0,255 129: 0,0,0,255 130: 0,0,0,255 131: 0,0,0,255 132: 0,0,0,255 133: 0,0,0,255 134: 0,0,0,255 135: 0,0,0,255 136: 0,0,0,255 137: 0,0,0,255 138: 0,0,0,255 139: 0,0,0,255 140: 0,0,0,255 141: 0,0,0,255 142: 0,0,0,255 143: 0,0,0,255 144: 0,0,0,255 145: 0,0,0,255 146: 0,0,0,255 147: 0,0,0,255 148: 0,0,0,255 149: 0,0,0,255 150: 0,0,0,255 151: 0,0,0,255 152: 0,0,0,255 153: 0,0,0,255 154: 0,0,0,255 155: 0,0,0,255 156: 0,0,0,255 157: 0,0,0,255 158: 0,0,0,255 159: 0,0,0,255 160: 0,0,0,255 161: 0,0,0,255 162: 0,0,0,255 163: 0,0,0,255 164: 0,0,0,255 165: 0,0,0,255 166: 0,0,0,255 167: 0,0,0,255 168: 0,0,0,255 169: 0,0,0,255 170: 0,0,0,255 171: 0,0,0,255 172: 0,0,0,255 173: 0,0,0,255 174: 0,0,0,255 175: 0,0,0,255 176: 0,0,0,255 177: 0,0,0,255 178: 0,0,0,255 179: 0,0,0,255 180: 0,0,0,255 181: 0,0,0,255 182: 0,0,0,255 183: 0,0,0,255 184: 0,0,0,255 185: 0,0,0,255 186: 0,0,0,255 187: 0,0,0,255 188: 0,0,0,255 189: 0,0,0,255 190: 0,0,0,255 191: 0,0,0,255 192: 0,0,0,255 193: 0,0,0,255 194: 0,0,0,255 195: 0,0,0,255 196: 0,0,0,255 197: 0,0,0,255 198: 0,0,0,255 199: 0,0,0,255 200: 0,0,0,255 201: 0,0,0,255 202: 0,0,0,255 203: 0,0,0,255 204: 0,0,0,255 205: 0,0,0,255 206: 0,0,0,255 207: 0,0,0,255 208: 0,0,0,255 209: 0,0,0,255 210: 0,0,0,255 211: 0,0,0,255 212: 0,0,0,255 213: 0,0,0,255 214: 0,0,0,255 215: 0,0,0,255 216: 0,0,0,255 217: 0,0,0,255 218: 0,0,0,255 219: 0,0,0,255 220: 0,0,0,255 221: 0,0,0,255 222: 0,0,0,255 223: 0,0,0,255 224: 0,0,0,255 225: 0,0,0,255 226: 0,0,0,255 227: 0,0,0,255 228: 0,0,0,255 229: 0,0,0,255 230: 0,0,0,255 231: 0,0,0,255 232: 0,0,0,255 233: 0,0,0,255 234: 0,0,0,255 235: 0,0,0,255 236: 0,0,0,255 237: 0,0,0,255 238: 0,0,0,255 239: 0,0,0,255 240: 0,0,0,255 241: 0,0,0,255 242: 0,0,0,255 243: 0,0,0,255 244: 0,0,0,255 245: 0,0,0,255 246: 0,0,0,255 247: 0,0,0,255 248: 0,0,0,255 249: 0,0,0,255 250: 0,0,0,255 251: 0,0,0,255 252: 0,0,0,255 253: 0,0,0,255 254: 0,0,0,255 255: 0,0,0,255 Red 0 6 Green 0 7 Blue 0 8 Opacity 0 9 Histogram 1 1 Land Cover Class 2 0 0 0 0 255 26354184 0 250 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 71 107 161 255 2699704 Open Water 209 222 250 255 0 Perennial Snow/Ice 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 222 202 202 255 276905 Developed, Open Space 217 148 130 255 681953 Developed, Low Intensity 238 0 0 255 423575 Developed, Medium Intensity 171 0 0 255 65682 Developed, High Intensity 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 179 174 163 255 61135 Barren Land 250 250 250 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 104 171 99 255 0 Deciduous Forest 28 99 48 255 4488931 Evergreen Forest 181 202 143 255 0 Mixed Forest 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 166 140 48 255 0 204 186 125 255 268166 Shrub/Scrub 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 227 227 194 255 2800770 Herbaceuous 202 202 120 255 0 153 194 71 255 0 120 174 148 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 220 217 61 255 261221 Hay/Pasture 171 112 40 255 219027 Cultivated Crops 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 186 217 235 255 116186 Woody Wetlands 181 212 230 255 0 181 212 230 255 0 181 212 230 255 0 181 212 230 255 0 112 163 186 255 156312 Emergent Herbaceuous Wetlands 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 stars/inst/tif/olinda_dem_utm25s.tif.aux.xml0000644000176200001440000000532314160627600020563 0ustar liggesusers -1.0445 88.0445 1000 0 0 1|0|0|0|0|0|0|0|0|0|0|2054|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|204|0|0|0|0|0|0|0|0|0|0|315|0|0|0|0|0|0|0|0|0|0|0|429|0|0|0|0|0|0|0|0|0|0|506|0|0|0|0|0|0|0|0|0|0|670|0|0|0|0|0|0|0|0|0|0|634|0|0|0|0|0|0|0|0|0|0|552|0|0|0|0|0|0|0|0|0|0|0|407|0|0|0|0|0|0|0|0|0|0|282|0|0|0|0|0|0|0|0|0|0|219|0|0|0|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|0|0|0|0|188|0|0|0|0|0|0|0|0|0|0|151|0|0|0|0|0|0|0|0|0|0|161|0|0|0|0|0|0|0|0|0|0|168|0|0|0|0|0|0|0|0|0|0|137|0|0|0|0|0|0|0|0|0|0|0|135|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|132|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 88 21.665205746287 -1 20.974640760798 100 stars/inst/tif/geomatrix.tif0000644000176200001440000000133213777653456015676 0ustar liggesusersII*k{skkk{ssk{ssk{{c{cs{sks{kssksk{{s{s{s{ksksssss{{{kk{s{ksc{skŭc{sc{{s{s{{kssksc{cck{ss{s{{csc{sskccs{kksks{{k{{c{kcs{{k{{{k{{{k{{ssZkkkkkc{sc{{k{ckksskckk{ccsccs{c{kZkskZc{sss{{sc{kkkscscckssZ{ssZcsZcckcck{cs{Jsc{c΄k{{k{k{skkkkksck S؅ :?hv7]t~}rë]ݒz:E!^]!P&J Bp ͭ c a$D8 7&UQs}'b=-ch@_)=t۶DZ ȾL%T!rʉ8 ɲH ^ J,_O V캒 =Uߕ^[KC_{c㫮Ҫ?Or8m7'+^L}{:kvRMj,YՖk;IjЫ{xx^dBN*7L0mUkW w]łFC3']硇=Ro_YmKMɒ"~,qےfS< >#v蠙IJqBݑ)4S[WX91dFLHo,7RAXEҡ.2> V9p.2"tAkp:"p:S"L'lSBP"dc(0ݰu$@=UWd/ROp*(5VT@n@\+. e-d hNMl Jlt 7cBd7Sk>=I9Gl9&8.s<߷ۜ{*W#=˱]-]lxȠ:n~dhydz31p~v+Mn (VO\x1N_t22G%:yYVH~qxzs.z>vuq?o)p0v0Ӯf37cWO=^M]nǖ|` ٧fziKw9ߏ Fn{M> 1hlIS+':x=!P\M:ft7GhXqVGRKg[ /ڵ(ݳOлNl0)+ oom35}sGV[oSGShvviaӞ/G֔{=~_% s`4 LT.s/L 7_4ńT^3a% _z;󒨤4(Br,d%@Ea|G$#Cdg41p6~ D~WaP# $/BD2(Fa[oAЃ:sk*faf2`Akpj]Yу̃ F %PI+H6VlOm 8 apeB@] c/ d ͅ-8TWl̙כY5,|$U)IWSDs,ZCV‚xv$VZ^fb2nm)uq~;9SxDy۝ >Mz̛㊇=>˝Ow[;6p<;ȶ;mrggq?O_%.wL,p!I(xcP1*5R7BLCD9-IV`MPy+⾞7Wb5u(cbԳpvKrcx-ˉ~+Ά\&Xaf/}Zl-S#»'nf4R>iABCz "& UhYbLx>+IdXxMT'l=ǫE`c5 ~:{3TYV($EB-BSpy]<A " !ݼx˻W#7n4+_M]^mwvv#W3ac]/Z]߫ΪXDj*Hv[ReoUsOk7#ӮhЧ7޿v=~18{:%sZUt*oJaO!dbRzޒ nj:ve2~5! =(2ŰNJO9!m F޳RH%9hY0h]}pE5A;#8+KTGl' 0Ȑ\CѮ;FW` H_ `[©M5 YܭChIj.p \%?_;-b\^zePa@):A&Xh@N sxz *PK2p하rb"&~Ŗ,zG7X8oy(5 S(dJ!4N/zPj jEZ낫LW$7_gԪ+$"0)o8jyÑ HmlnPW`[ZBPDv ê :/a%t"xD$" M[3$p(\ ` h?pKH:ckHU t}fM Yd [:&Lx^] $5{eZ$20;!~Иp 63!Ymה&\I]NP<ׯ=),fYw,\D.땶50.>X]D >6wZ1{䯗9d?tw;93R 8:Q@n9eQBD㚥ZXW(w#)؈2,Hrm 踄 F'$!LE<"iLHCH1a)RAT p!Na$_,\AƂrTuϕ vK8a(r>$^ $EEwD\=H$)Qk'=iO<ɩ=3O7S=Pr=]ɝw:g731O4t)6ay*_lV jt y [/6#BO.oBl~뉂Sz߲y6lK:|͞ӁЗsg 7ۗpr _ uN&gov\je tLN Kej#B֡ܺQ$p(6`sf&h@ЂX1)h1*!$ςkB` b${ZHbRhe#$lׄ"% lj1 #@]-y2e=1Fb);\C</E{U/;Y zL͆eeJr1PmfòS'p~⥬ij|K ɉR]«ʛ=> 6:UI׌fj)6y5h $O&33Ex>{5w3 ٷ$abdcw:% w Cߟ r89x{ٷD>M`W.9!Ur}-7'T(Ggtcz41̱ݓ>ʸLut#ZVU$mo=ф _u< :wTm J|ʇكٴTp3_i=?L͝Tng-^A` a6a#fVr)31@nYY&Rć`T6l怉Ք#$9]K&H *7dFd+gw;9z6v Ö~b\7n__ouv:m_=j<ԓUP`aH"XH3 R~&tPkll@n|w7꺟U\%`e Hh\NIpmDd$S "¹u*3}53)6sA%x=4/b +P,Z`L-P1ׂh!AW@se8I5kmS%h! W_˵eR_.fCKP:`k"52iA^2_ BBjT&h)&QS/n/6 t7TS^sd9  YL e̔Z#>n˅%}5q>o }oz՛VosțwF;站73]LZSxdʐɷ L| x5sYvƟ׵2% H9s99$ D4أPe]*\/s5VNJG%NHM;_C[x5V3(YR1"-nc 5RJdbp>3ZOt !ӆE@I[ Cv)lu4 uF$UQbu]ڧE`-iTg%dɲJM ŰF5뺗w $K$X?21(U+JFqPd[-De0{,Ut$)$**zY%qfOue{LdE#A&y座2qм|+:S2o{ %džJsO ׺6qz{Bȍ=O[==n%6F գ^ 9락6p/O? *~Zž7ꆼ]1Lbس=^k_UEw#4~i3*n3vILi(ac\Zp* ƀ^hv&b vIwL@?Nзs7Ưn)Kz^`o [G:rF3+^UcTKObմeo%%rVx%mIQR0@_m*`5PVNVʪf+&U!c&b&򺕋8N_ӫPYK/ÛFC57,&U22k[Scx6f H!2cL %R#R#%jUty%.Ό,Q8WtJea&/cH6d7MRDlQ&:!Ү~(j,=F VXL{YIhLBl0hAwpodҟ߯F<4Υ]ٜN-;7 bzB̺Sȑ\q8/:K}#מ?Du֩-e7r+vb7fyF'gqQ * iSۙA3]by3< vz ϜՁ.vY(?")rwn ⻉ݮvva_Z={}]t0q#CMq`-qL+Mx Am+~Тپ"[})C72>A7=!W3} 3]nC`oҍ2Ec~aI>y[9a4NX_uȅ-=Av\~0lj>`٥@sᏻ́Ũr%ܡ~3( ʯ6CHGk")cecDIQ4R T::}| s-DS4~BZ)vn%QbK+T%E_y ׹sc~TaVbހ3}j ʭ8sx+l (tWVāW U4ud F l QyvFCW]Ih)2p PxO3HBPU<>V^Y}[(,t~ SΡb˲~u aGհ7,v^{zr֝ >z ɬ3Bv6w1җWwt֟ڬc}NZln&**Op\o^Ah++ hlVZR$1O5ER!bYQR%ۥYMRTFz$+_'&C&㟖% }>t8x v$ad/@ml‰B LW1v\fM ˱%xGS(cF*;I}iN cmb) 3pdWցWӦ"Y N ^I&VK&R~@nQazX5iBZ زak( ֚!oxd 6WbEzfmm`*~ .|+$_w8t#ir X! AI!S<2zhTU)@ȇߖ!Qr֧`I(E1$TZY;,J6%"A .D%#gĩg,&ПoO#N#Ob`tnۡ淣ցڌ\$n6nh66iG'1#j:rl0r C۽&L (^ÏQ(RuQR=wp#dUr u=0DC'|f-/{?9nB]OIj_O;Ҹ\{}Wl^zr8vG% a>gXGes(&,5 ]٪^$c /*`|@HyS4qOZ~  8uQoX#yMgJo|O?Af@q&VJE@ I@1ȉ'P>"$Rxd 2.SxaH?+DqCF Q: b t`^Ak+$:W'@6#*pHx!kD 䑤AE~TYV ҄*b:5Xnj8T? 5nmsX iThG5>L d/.\2:ogp.`'kb*vD '~>[~/-Ͽ,E'l֛d¸k|aGňz'Po/(M[Dr Xko!pH+,oV9ҭ>jbE,b\iHyDO'$8O:pxTl^CiL)QYF:.ZzZ>4%y\dƻ94j- Ѭ&oҭjEƒNi%NU3$beHv#xή"OlL-?g5F+k_mIcoʗGBLXY%Y uFnhwm=ɼi ,d[KWAݮ۾wzcr/Yn wKw{0ZpC!Cl7CjcODp@ +ac; ^o q&(:]Or3݂憌gj #[oFF q(y(b<]TjzI$ SDDot P 48>/xvZdg[ l9j$yΠ>I=+ ׀ Y\ -5~(Hq[Skx-Iw?*ZJ-nTh*0svjWTPn'ۅNxSX1e+qYS#0VcA6] NuTGmgeg]GP` =}M5@q%ݷUC`oѥ)d)?Bg-1 MӠȱ69e.߸S~᪯e'uݗpXLӾWſ:sz:x?6-<ئʮhiTqx5j8J-tțڰ*\/x=5bT-PD+{fX#+)E+9*Yg@km:ӏoWRTy]AcT3iQu68fҬM}=?=n'Krg{I?}I^O]$ ~5y R~nR^Wҷ#@1-7hHHSqbd|-GJz Ƿ pyh/ r)Zj/b|eW3$ 6B?^~b>Hc\ c W2*^gbyNHi/%LKGsJiE1 q7X)ޣJƀ i[U@!fdk9.R"fA 2Xg2F1XVt#쩢eOUj'=TiF:9,tޏ/¤#ۗ yb:7\O}gO717#ORѻ*; tUm6&LcDMzO'x%gWY@.ۀrF99I aL4mUՓjMOYa~\_bp9{?[h9b!5Ekaka,bDC&VO\?u|UrIyb%:MnFլRʱ@cD_ᕴ%JFqH%i1$\LD -[D%"¢eAK+4CqSp$pӜL6WWՏp:R)p1c[H!./RZgbXkYP-$3:/W0ZEcGp6R=ajPJdyUOgYctݩeOqsƮ سd5`UzfMZ%n1rwTGٌ 0[;\[\ZXXܯ[V7Gnj=?_.T% s4L,E I4Y>.UL\yt9c%I-j"nODpԧ4izFwG&`/Ig8 w i2v1tD]_ /ykn]Xt $r9Ũvlt,RMZ]C\h!1qbQ/Fiv&͇XbjU~6\Xt.DLt-Fl *,bܬH<&@O⍜gZʱ`V=+csaق2!΅KhgA_@NPmܫ1B߯&ed^u~_Ѭ:\Y|{h{K$.GͲ}#,72p$\ sEDihW q2FBFIPyv-. xW$Eϩ8]9W졦 J>a 6uOѷhVdÙ,)}Z}l1tjdz}߮|Q^/z#Th|uy^&!34#dd}0ut&5a@xm&|'l4mzBıZrGkuLDzz'Fv_JDݡ; _NH[6PܮDJS[EؑHZat|yt)z1)Ff+߯Ɨck_l}<~;eȫ2q)bn7e58745w^J0g`3Jvʇc4vRH.m5#Az)mw3O+#rOB8HnHـ17쯝|p>j7bB_8gsl%QM^;h%DT2D9QI@1V8HňJbX):H)bk|xV}N}pX DzN"sZeZ%{fs I8b">B*mT3\;Tn'%-[xOW [Nsvb+т{;ySSceHsTwn=~<@XH5V^gx>Zs^uwѷKe[4 fR{uJwr_#_{=f?InfFu&VhAkn{V˩N^gh9C5B -(ƶK+"@@+@C$Jx+& N (Tߤ9JJ OVY`p˦B*)Hy+bO~M%﶑BZp~[j=s%C/AasDj?l:[N&"p>a0 *J>A&RyAuC+,KtNЎ-Y2?NcodLJ힌s»"y;(|S"qpvL~?vd{ٺJNo;ʍӉ˫ϯ=Qkʢx4<ȓlc+S@)L_r'JrX'&~7Yz=q z4޳<ϼqw86+=G_NkfD!Ejj|6v$99 -EQ{joLG _'3 0'KP"xj(6di-`]+SA m(ZMstjEDv.زj&BAl#8 <` m ?k6#?DKq4+A5;KgB{dlKPvK?d(NOLH7lȀjb6>E*ZJRcqӱp+M9LYNuN0_ 6spv /zwvApc`[X^%GSۘߎT~?5DOk`.R`]᧌,K8M"sAevysDrK]]AY>Y]7]o*%Kc`Гn)a-jוlLfn0*~5\ TQ9[0KW f뙱'Q1@]"QKiAw:M(cv$z5~+y&lhtiͼzܛIOBc$WZ9.?hL*W0s12h^8  6f  ?H%1AD#="Nʏ4wSc2EjEm! 8!?Bd;2d&$,YzTt_~8ϯ'ػ@Qh3o6'Vowz0W@+wY0%= 4r4R% )#Z*EOcW}?"iúBZű!:C#`VCc1AճUBQEVo͝ըDRS+ nǁ(ER)'|JqJ)թsjUf=0 Eg&ip0*pWGU@k%]KmB-`@&نQD`^B6:`e<1<$8lol>!Fs\X~! $%-(=(r!+]MhRѿ߯4ZTAuc bƻEW4o6n',Άރ@(wN=͂:tDt>*| _/l#-HLN6ݞZt.rtH %} Hd5 Ƞi bLU(?vfj9 $G~38P%C F3`4IEؕ1\ ͊ S$`gN;bY@%- b$\ILhwA 'USQjA '0 z) ?]&[/rVio UzYW4Obh w! "^v2[|-4_܈hk"~ p!䂉|Fch9f 'L1AʖI=U^ls|C2}C#dm΅NZw~ktO7[̀Q> iuGаef2"q5'], j"S-fbI:z>Q0L^#n'3{UZgK#j`OcgW9rE |4h $ [;-̂1}ep3y{ԒLn5}z`Ix7W42[NmT=GTw/h51Sƻ\FsLl)7Z|!'9QLhd-.AK̀~jOvQLjyqrinRNMVyhf8<hR1.P6'-~vcmv;-`>ORIlʋƒx16JJ/=+8Mڲ/}of֣%?{cT=/"x-GsYvt7M@yK{o+ ` C 6NDZ(fꕨ͍̬J=绉%EIȓaVn*D=3d3SKT:vqba'FW,R.ݫ~<%«*qWGJŨV1RT3 F(7mܦLSl}Wbc5>R½!mJaF!C= ߆nB..&K1XͅK'x1wV")gBxHahL)Z! IW 8rHǍJİ˱IqەD%;3 J辜;xP'yp-Wz5z;x5Xz?(}Y>,- ]Ua CD:d W-'jȗs5.Wz-V~zi8h@>ҶD7X i$ٻw|%8v ]Lpi~=IF|={MeEs(ž A k]iXdZ&ʂz6x-*)PNl 3YȑꗈZNJP'y̠嘍<'kiW%J\fh9qfZ/bi>GQRTj)MˠMFJ§H9:`"C*ˆ3$m6gb#z5Zi>"}/Gl6 G P0]N9(5NUK-- ldL}}@_Ng]#OMVFv5 $J99TV|i}niCۍ‡ ?U^ťτvP%_/3JP' $Z%$xj.ޥ}Yۭ''_ٜF<g_Lr68-'g7Sk'cg>^LJ)P%f,3sa[h"Y[ag$;)7䒰QO$,h$VOM@ERd3EeJ`%:pW j,v:&}$^x90̧#OԅNi`Plno:ogIPOfl|H'C͂ZR'cx-e0 9 $zNx%I7wFgL IQ4өxb'RheVThOxh=.NwrBLhy/(f2S\DgEe`>Tһ۝8Az5X;Zr]Mܮ''̷܅8cpRi1h{׭4wH'.(.<ť-1HPU{bQdz)?Y[!?b尞v}b܏韾Wdr\O>! PJGfJ-=-Kjz U{A5wRIFs ^qHD`^L6vrdR&Ѭm%ᙻt+ZL((GwVamA(L6D#Fa Ƌa& |Y!taĤbq651"hO?>O0CځlKӠ9n9,WW_ϗosD'Jak*N:dG{X>Id} zF⠞3젧`9_9)s'+EVUˈbV%B3 T'hixHj|WsZRc8s<ƑP[Jz@3cn"%GH mlwh91aQd ٬u̥BX9fбEt+FWomD$jF z{ܧztV[[h6\=D!=1 %gBswc ޙd` 3d}D&X̅]%cbX1hw3yy8%{8+pd 1s=yxN/^ۜ?0|rD|h|$n! yl̳D\,F@n(}H A_/ǁ_Ozr{;لZM}:QpۃӻY*8N[tcCtjPbxFlzFށ=a;V@\Py]'V#ziaÓ6i\/<s6Tw<>>(f.n6nOJP͂vd=Cֶa 'x!~DJ;^PM* <3QIc?},<+('j)lX{NV>'_+jzL gΆд\]&fxmPRlA&*Q 4B a +lk]Ba *$꼭e|zJVH}t[M] _ݫPtT 3U"8w Au`ՄE`IĉEW =I@L¹υo8S-R\D7_ mx*?S4+B";H6[b\&a:tgA7QYlrHV/'~F2!4/w㵂#Q%3C㘵%$ǵ (p9ɫR~>&W0%ˁArY}91(w=߻]Y}<}h70ln߀A]5V!l"nǎ S:%ˡ+ەO'œu`_}Z;dTFpۅňFcCm@}9N o_)#l%Ti}3Z%+3KFy V N=9G[ٲ^O<*ߧN o}b-]#=x_}W|\W=%tW]siV0:K9BTS&WԩԜOT,RIkՆHLeM:2Gd_xI:(.a`3esJTg7⛜rZh>b܆sb%6|j:U*VdŠy],թz8*M5+Ck.ڇG'YIRS3\+qةC"өXfQDZBQ@cc/vOӥ?\W:>̭Q/ͻ{'3Wgs悻+BM=w]NEa\kS~5KԸמSQnIZP?%J1/~ t`SvSOr|LIv3A4dSxYH^I=o&S+V9L#~ZUD%QO?d;+_NE2ڡ(A0:>j!'d Ao /(̯{'9!:[n\(8(F Q^ (!q! %J{ElJЛRo>b +CК[Kht8%ܯ F_]%07wZS rɱ- uhЁ\?_z_Q _bbO=_ȍx-rvom:H0y09sӓ1@H(RtT]>o|aoWSxU{o[]WY!+:Aj+=iBD[`|j%SLWz(X%JqVTSђ"0 CQ%n5*&P/~,(E*^lmhOiQV cG$R~M WdtOcWT;}I'&/-Cݥ/盓MņoxT##O|e T,'hh_n-d/-N/&'ӗ@u/[O'&Rw:%WKMGev=q׎0L~>ve텊ݜgLuKc%b-gڃԌ҂\AXBx&\/U7}ç;,QOQM8YMkbelen~jWYg ;i3&)M^kYLJʴRIJqQ59D%>x>$SkD!L՞B՞Q0BWŨ5V TAELφ| +Ɲݫ-ufGMRR! -) {"jtʅb%GRϵu]ܚFQd%z)6{11Z9A}<Y.5 L_*poqHlL= i$d;4M̵5y Z/&Hb*shɞy#mr*t[ΑMT׷<׮NBKq C*jo$wZu޸+I<Q0QχփKTU3ksU6RjKچKu{E t q&sQEzU180y&+4:dV\W|W^kP5נNd:R,# },!d)e!.k[[17A2=CTgc v=sEpKv#WhoΈ)s$Md_^ZM__VA!GSW諹˙vc2~5nfefmnߖl@ُQ?u9IˈPdTR]G "_ϩlWDnAuT;\tP=5t`=CҖN5FP+ETMFeT'*Y͡ZJ։ZSA{ȻJ̄~D^+Gԃ/0V 0Ԁ=J <lmA+ ]oB +*D" L"Z]TjԒ=/ۨ I*I%ч62Zi2VTvЦhҷqNtC'>2M]صvfGH$_fDG\mK~\0p(0@ cW`5}Y%=S"0v[y5ZS KCK3kY@+r6JD\&+/7lF%/Cs̿ﲟ/̀߷0_ NfĻ7\L,Jŗ>/}<_-^]MF{j *'hO8L qTO}<$tȦ3k h=kF-3fǗÉI$J <ERIM1aY6R 4?!va']Jp͊VNUvLZQV,Y˺jh&Nvkyu ZbmtY9MAP+TS\^i>f(R@`~yJ0 q`T#=׹Vqhu-n %7[#˓ u{ɋ' ;~8wG':o-^gN69s7+d-p6ȝ/][*9 Z/~U7Y yeݤ *dˈfF+ JUCl#6BRL5B\J1LjVIad5geVןcN=+v{2Jυ^UgE%C-1I֒>QVq zd57׀4*SM7dJZ)*T5'D&@Pu xψGRxDrbypRo%2P|[~Fr 4ʡ"?Pl1ki];t{R5U-8b0’Ȯ',')ISLl8OOێ.nN_w_̞K;+g'XN:0~o}drO=8\ L^]OKxNg#Pn!8g+yZ6 QMM`Vt=/Vj~UI:˷M;ʶ%kYIHIdG2ZSCU93M  "j لsX<@u w%ERbln<20P]W8~Rp ?8uKIBH:g )0$v:%: 8ny\^*sWxznKu Ӡ/'&/S/:/sBH!S)?$D/S2 SGX:SqLvan4R͝Q)j~_@A6xbOԖ|70HQͬ4R }:kgx9>`jGGLhJ CCP0j.?#YiZckBDS3@%Dp@/5Am:9omie2 Rќ,ЂaVI7^&D/;RTE/0r S#kTIMn3kЛCOdG2~!{1U/_i־oRl РcRg˷8sefNЙQ_.&^%L [ pu5.ӭ9VM"IeSvx=|tq|>59Ax fJ}Wg+ G#k.3p ~sSo[u̔OGs |,vbq>ݶ6!KZ[}.F4S'QOm2:eiZ']:*Q2-ZZu&bqhݎjNTt)ndy}$Q<jPT3vjЩZg-9 gkK WLPZΙQ-v\Y:LWm&rj/sze*''t)'c b16> &BV3&9TM+\3Kީ?Y[1NK5o1d8Ȃ▕18\My#ořnSL g"UO| t=+G*YK ŰAbŘ$CEn2KИVvhbd)|ȥX:DU:0|cX!a$eZH.ax !B aŰHRTgx1bȭM4ZX!a;h%ap1Չ0Z.^6VLd,ux=b#p~91;$Wpz:![ܧS4G*Aut `=SP/{ǫbS?\ۜB849w2G3=P,_3odc?ߪ^8My*Pd~i*jirxGZwҜL>e_ mQf9O\KCa5bюwLv 􃲀ֱȣ-iXKsd=k Iө.Lgu9MBD:2ԙ?O jtwճyG+\cEnDf$ԃYj'KӖkiCL&zJSD5mIaұ,Q:[p# Gx)<&vRhDbtv'Sy=3*ЍGxv7\Hmc݆ammY.h}!BNpdvq xKiq딭#f5@󢙣iQˀvQ<܂Yn jK*D$82pDK]LV.'B\%/h- t2=d锄 ɴIͳͩ͋=xNojj fsuDul.wC?|%_yڈ}zkOq}O O|'ܑ=۳{O7=W vt١'j%IUK-`aQqٔL`҉.t'+1 ‰4L0HRY$Jq$JTBE2D&1h3u^JHt.Wd ˅אSr4KcZe,FNL=Y*YAgZFz'&Vo^$zODzfHDVn9,,w_gը2 -G'3D5ew% H_p}q??=]U,^ےg"2Oo"[Xo͍/:{r,;}7{=ߏs$: V"a(I VUĚ2rG%bI DJch`=ASdv;UC˰2ŨR|B`Wd9!gK!%QKZG,R@^_wpM%I3 I_JQ@@Pd肏)ݒazF/n,ߦkEC+nR8YޢK 5^GT=*qSשP~dP$Dbzc}!"E=bCr[Dʞkv93Q-YJ7SsWq3c쌘g3;vUOyjڲ_ww8ipՂz~Zg17Tߙ⋇: x@cЍ6mll( 4`}tۤS95ِ+Qw$xט6Dk/1^eEź9%/,Zg{uӠAJCB QIZ\(' 6"&qKP$KO1D2x%>x1X!Q$ZH.Lu!Dx*B2ݟ߆db 6 10DrRwMi}e"ňn㕰|$Ð4ddE6^.UXdM -Z.*i}ļ9rhniΨwG&4W JpKS{蒟.~dxǶRoT~u<֓#XfO&YzR<}?}<ᑎyhW='* vJPJ˨<E#!R(;9hi nPf EԇWӮ$*kI/KV# 7f}!o F@n}EޞO_럞 fn˅kSCcCsT5ai)Hi*)rB9nKnm:[|lCf-C˱A$H+!aM, )jc -Edf$6ry޵c y X-Zd%iS[x9i;t-Y }-YUIJD-1FW2eCv]٣xpI:d`:W.ylCEGck1\T}⟯1r58F յy^o/^E·/a{O釛wL’3ԝqoN'qWNB5иd A;S܄v -PKQj@c  Y]biY0"׮+vim X́fQ3t#gYUtXz&=)SRw Y Ar.00fAnn@IU36Ns9ЍKGv4HaC}t5>ndzw9ԏsBzc38ws#ql]9=< wc[*0u՞rl}n 3ddui"aEQ a]2 ( tF)<6YJ`1 Q.;3_4]$+q"{rk))X\٩h]2[FƘzځ YIp"rxݜ܅rBnS4#STIimfA U]p߉YLj/!ɯ K(.R1M A?.̳Jk Y &jT9E򎐱X:6neׅN[=UoGsg⋃K3ĞoVgZ82ϏtZtpp~t]__/ϟ&IhiA7~c `h:P)ZsS|ZT&Ӝx.&,QV8V=E[b yZ2 0b n "x!! M*D3WRV-y-k[1qEC7i4Lt a cف +qv(2AaG@"#prTz\R[t) @bG#x |!R\j=ڛD9έED9;0JguhqX˛w50[c8XexrjTc$;Sde~:4ݹkPƶL nAVKYH(E dGC J62UC}9%+% 94"K6as `9IeKDwuE&.d0Yvfh7JonUs" DGTSgJOw@~yO c×ӓ׷xR00?bf޷s0*TQ91,ॄjbH &Aد}?,!]Λۅ$d[j8P F Q6q%S΂~at.l:s5u8[|}`HvS9F|X{weE:% Ƙ&/O/(:#+Z EX@ _2kc *ƴ5-_ٝZjkN@jQP 1b"3;)/b#;=6$# Bj.ƨVa AgM 0+r4ʒ =H9S)i`bT=V%M@t3!(H 4> g+1t4̑LTqq 1!S)%"^`zEw kcRJ@ۦY09='~|>4ӓ :^嬯t[_9'7>a~w% 8y5a<=}y@Gx6v[=?ӂDvM'X@3,yr.-^pdN]2䔦ivQ Ŋ"e$EWRX1Ng~L^ : DBK*Щ\V@Z搚)tTU.obpZ|Ax~ZsB9<&`f - QaVmz'=;/1m d*ծ d9jC~+#0H _Ce1R* T%J"|.|& )>zA tX`Xt_=]r0O̴GȞwS[}31N;OF3{~r~} ݟi'М3_nC>Br@r^vs@x5WwW-Ӷd"s(Bs@!H%1(Q-wKnL˼Ϛsy9 P.9woQK .^O؞AKP[%4Cǂđ>\sIG" eǨܠS44-t .K"9͒+enU t&5h.≬leoZMZAVlB Y".Vsx+0D+(iBhcJ@_".ZnL1G󺘧Y],@dD=c=4\=VF;d+)^ -21 7#}U+Ñɉ*f׋@??Wh}y]O=^-#͒ޮ\^%/|z/͋yL'qF(DA35Ws,ӫ\:~SQagMMjօaOj0vo꘲%!|<,Q #˱ N3Bӱ'JC;tXQ7'ʼ٪}J&&qC2'4"nlT䊅ϕa 'hT!5C%yG]mB[voV&3d śޣTĥv·lf\vMv763eݾ5D "1;lUkN Bu+^`a Vн Lb[2F&ZBK[z9+bu(9poKwB%৑+lf8HԚ /@˻|_ľ`=YHȍp\;~SVN/#2|jΉu"Ҥ},.o37rwsM^(3Ia6d|tbϔ3Oe!% fU6d7mrܰ ̠Py]4t(k͔FJ1Fp$1i =6k`P] d'..,o̔8F-) ڲ` Y(3ݪf8Tc{t3cgт/dQH|am(d:s9W^_9ʉeTz6A,Sc9OKzI,7-ƱvjTzє,NOJOt9s1qqx>^v. kd%Q iO<^^mΊt,1YC:q3i5灧E= n U_;bs[+^/ s# PfQ .3gMAep!Y()#AD[)PHN'Q~jU56*v^އ^=FYf5tIocs{P ?{EBw1ix"yܥ9U,ù &H|lD뜱lD58RU&-:zBsQd0(A@2:*wnEUJܨ%eew`3v^÷U[e]/݊VXO^[@DΓ[e(TPD[⠣.BNtimvPcl/Zhfu!?a oC ʅRl1KR`QM GX5͏v~Ȫ'J؋;/}`%黍2ҕS22yMik `"q>a[\0m#q >5 k l8Gb8;]~T,۫V|%' :|,c8{æcդq׏: _^&aoZ6IRّ5Ŗ;@ssKԸ+\҈&/OlOPWG؟,h :fTAaٹi6Vԡn)}bT&b.։0W+`r+oK9|X8Mt;@Lr"-pOi_(?zNjL>uRԨNn"ei13F]K۲SZE٣:[N풦Yaotd 7H3-Phfî2hv̰5_)vH&Ԁ*Q29s7N ȤfY*z2<09IꜬ[,c>s3&,v,lQg|_1}`gG &',''#> 58 E89g <}7ďNx67?NX ËX ;Gw&9dT'MU支^fz` )(Q< x{,Դ9ڡ9Owg@R~\*UnZ=P):EOѭqo(Gs㉿4=-M# HtϬ9 `lb ",7j2;' x2Jl,r3T.ӂ-_޹gؽwMÀ,fp`Ѓ;w^-6JfibEꁪp~ hd?3Aӎ|@%g/j9VrA9=o5z43V$ U#P W&։[ЯRfA 6E EpHn`-}0D#f?AW>Mu zٰ҆nuo8( y͌>eUOԃFvV›i ]vAQYKQN–Q MI$SW9V;5m(\X,>#4P0h^m.wKVLR+R-*F4Y=fTuM"M,)FVL k%zT fnPfPk>Ρڃ̥E"r*dw`?=3Yie*%);H̻Ǟ6!x^=]͟j#c̙2vE3TXzaUZ~WWZ:nKOs;OQb +O6(vzAf֤V֡fl* j`4nh52C̨2Z.ݯNYFĩ7SjA1NC5gflefA"h[PR<вu# 'Z%U'(ݲ> 0D )=5~">Ri.gI`ު^dѺjՙ~M]&:g}9P6A9(xl;~>sct>q / H"%{{R XPY` WE]HH Z +lj],M5 RP ^O=`YGX#mbt+ț6lȦ`6f|Di*#P@GuTF5 1O($SMF!Y9!a]-}@ފ)jO@X.A6IO9 ;#Nt[YiGE 7g6/"r_ROV78q pZ&vd) v[^5 9bhK53! t43V1P=3?lng=^r ޒ) E}-:l)~u X߈zJ?A]dH6N¨|j1Y_StTH->^XHPS0E/;1^/?WK'"$Ɋcq|v?WGBM޽>ag2Ľ;_X;O}a;@ Lwo @x-sWvƫXɶHB@hIŔlɒ%۲d&J$/A4/PE|4 d˫fcڋ'J#Z9_P|hNѷ4"9CwBDqP@`]eAlD6]>CsoX]9+Y^Ys"YK.V\sty]"өY5ʣu(mu-iph[N w̺r6Y͈mJҝg~#\u^%4n5+d;?Ѳt3(9iE,QMǕiUqϔF1DѽTepobDQC z#D>*bH2t'Iy)|C9OwʡJ aդ҃hk CD:mz-}֔MgJXqW+j]cO7@&+]=[燞2?^8JxG23 <<# Q̵9w36»3OQ@{fYMv!NJV [9kK̨ڶ]fuӮҬ+hOh5[ԝNI™;dog$'Z=)oW0A41 M<vˆ|F3^jLg/P ԣE3>ji!j%J2$aU.irB41:"۫nF$J!%(3lAkDJǶ Y Z tM+Rt36 l(eKϓ Dj%cyplbsv1q%Y?e[03'Hf${:.*ߟ/ϸo&뻥>YY޳po"g?MW{>1tZp!c{Ź U:0poia94J$kh.26 .:^= R9UV<[Y_:Sl9f{),L(UbkzZ:@Wx= HfgtrjYɯg‚M\Lv1 >`;%JH%2qXƷQf+Ԗ4&cI1DhA}v}:auj0l,8aP~`$l蛕H(/f3@c&@u@ Cs¾Mtrΰxhj׷3wxxlOgPxw VKˏBDM 4YߎlҰ%9A['Cd3Y?]U_+7Tll9ԋYC[z&3(N6ha 5i1z]v0nOt;ݬ,TAiT#+忀V_B/zZ+׊n]mD+L5~4t;x#=wV<^0d3=#&I$YMϰZj6wfn.%N)RIqk^vj,PdBC) ٤YAv?jn>*-OF _<.Kw~N'ѕ@d5;i+Ej oz=~~yA22?|; ;&;a)t]m ;[PI&~s_>{)}0|z=^$o͓^Y_0ݪ甙l|d<!U,2=Q"ٞ't&#qb|H8na1B/-ׯǕE˳1yft@9I&}}GfHÎ>:F<ي=RuP"k1N"@H3hi4A>."MUټDތ]!_j"+Gô3z)xo:b>GW by$UZ ʋ#YXe4`8bd2y aqa?UW.,W14U v:J>#8ԛ`o.y{r<;S_S/љo?GO~4顧Xιk4|yC2DaqiH[w6R )vh\i4>UYn%eqL:{Zd>s@?D\UC1*3`ob|6cf`*e׈ ,3(τ׭=Hڸ $ڗ5UOG.Tmay̆$4·=<2A ^T,xƗ6@Yg6%K٢B&~4zu˪ I4GƩ2#xJBWI̥ Rp2|4]cs!:sÓ86"PM=?ZS0ZOcfN@ ߞM9cg;tקh_W|E| XtqFGr}Zۇ0':&XHL /,W܊d=N^GⷳHsW"Po AD!zD兞7JPiؕk|A/(X7ȪNz !|!{r(܇TRJ%᱌FPCDS(&? &IP}p1A#ib.ȌPK%afI&p w^ul@T=Y-ˮÎ73[yϐ|*\i;![686LrpU{}EV>LZ+ Kj@U=TT4`9#6t͂ɻi=_G?߮&BZu7{wEbOb?ڲ8]om-@9!y!|d݅r}sݫJ *pVк8k#O4׉Ve:ӭR` [0-"^IYt x^&7݊mC|"US``-2`F /r<#9Pe 7$U!7s64v!`%(ݺ3nHyuԝuĞ4` [PՇ;0EvI>!$1S otCC`.G Î@e2ȁ+5Lt֐@5w5S{bk_ IJk|E WfCC娪`TdKbWU#(nAcS0sFӄy̷xxjbgH(̤UH]ՎL#۫;f.|%swe?"N16ٴ9QEC!ƊbeTANl1C4cZEK|:kR0Goc5VIȗ0'J9Ά6@.߸}IiqNI7Z9bD+0nH.27Q@Jm4ۦk9K0ͬv^f"RhLf7ϩ Vizz?3"1&}W_.gނU_9K!H|e <: `BR:s29܎FԘtN&Ϧ/ƺ<[̬: J ^Fz?F~s۩=op% I3U,HSj ds:}~K& ~2 L! Gj )~P9ѳ%-}nP/wW)j3R Z{DBKН+u7|eKiCXq<&n&;C,V`h:0 <<<Ǜ g6^_z̼`~{+Ǘ+w<\zcaEw`dt(_Io/Z|$sׇG/_>˫[>,93&#dE* %xs+:q;0CA>_~\}'.G:fTasʰksiAM,Z"_qCžIa]jOENFB.=YsF^-|"W-+5MItk &7"hi[ ӛEnɂB"*E5䟞-3sf.tJj!u'fv5X=0"S6m7n]@#Hkplli)K+uiUfػ{ -6]G ZknDOa* *jC03!2ޝXu)mYx׿?>=7'ܽIq}v'PϷ%0 3w? T;S;w(cx-gsWv?K)$&癞:@RED׻U[.?grkpN{9M6q M[)s<@%mPV)TStLU_a0sn%+L333}0}{x->C$QP.׻ORJD, d-%)QK$QIr} @{"Rd=˱Yt@R< kIO")OLՄԃIv[|j=Jճ#9ʹ[y[SͥZ&5HzgH$Y[Bc1%;^E3_ Y/,j|t϶c.)b-iY,cNʐ T]cSO~E˕#_lQ9Gg cKqu_z9lK0Teܫ;?AΘFxh??E??;__zoG +6¿::-Ց+Eܰy{Aӱbʼny GZIo*UgqEkG*VQiraGJRkز%z;rtWffȺyWŠCJu(fj+A-֡kb>4W8)7?O\xMS٘x_.CqTEqW%s$>k"^5!#9ǡW_dSŇ~T4da 2oKr5, jx!$YoKqYO1$-[{I6+ R|jE UE)۫~C+0[r_G[h5ԙ__/us_]M9pb͸R̙/'ʏOVThFԛKoFBl3f0_>`;ejM1ރcѶEy,eAo ^PHV zDMn[_A{Z䔅AõK|it D| ?S\Wwz~3ɚ/!yҗ\3$0el|=SӰДcRP _|~ZyPnqΝ;Lܾ#o2)(n)g> zgQNջ\4 J({HDǟaZÚ@iǚt֬ ZDVKL #iO 夌Ԑ$FzVRLhY@#%G! LMb>L-F~=j?Mk-mzu_enF"~Bȧ95S0G$oQ]Hoa1P4X~ 4.I@c8H^ 3l,sb$/8_դx'cw%bpvj"2)ܛ[dlU7 Pe@4Y"\#-@8ҐIQHABSl{A՛>L˱z‘h:&uƢΜmx¾MR݇IӰYudF&VIUjohj'NQ]U**bNǤP*GS|UMJȂf>VP.d^ '@vmcg팟Ĭ ep[@#i[N>$c-{$64Br!&zΠiھUCG")I2na^hFAgt)\xJ(ˋȰáa%R-alR46^sP]Ǵ#Yti/3$cԆGګ.hʥoJxyJ Z/ԷgxJ7͑N7+VϹ=fnᅟs+'GVA@< 5ף Y"3}/c=ƆN돴`jjthӍ\b9Љdas,h/nGiS6k٘f0׳!Ϗ aSt3Ͳ^Q\PESpvEllXeR+I:2VR1RCDˇvt;'\΁o߇|:PA wx^=S5P%PqxNYWcOq6$g7Y" <Aʩ ԪZ`^b09+:؎D`;d~Y?\c7s~ypΩw3' g^.NC®1^Ǿ}0&ӣ#ËM_/sg,>l5>yy:=~}7WgsX_j?܌.VJsz| |< [/630AZ_6 }EJ?]^&KcJ#Q/X];Pfq#-(F+^(Mu MC*$8@ACvNV}`{))JU ڶ]'7a6,Cؿj q ]Iip\7z gU`<̍w]-3*weھCnwoNRh{3/Ԕ:7ٲcnc+&CSZp[dX>|7~Zڞ'w>q%mW$|b;;[:ےܹuklh}v%x-gWvZ3GMcuW9Ǯa{''3@PbXJݵb 2 _a__[}>bW\ĩ=uQ)hR"v<ۭxVkW;'McX=jldjD9cd)fӫx9P5VU!i o4fgW5v Dc"*'1Y#q`U9jP8VJ|"kD1*aTo,\^\i-]WS:+D!vx!Ř]y*Q0&8f<#KU J .d#d9f2Q^yt&])uku^%|e\)E鑛aڅiXZ DFQifFNVe8G7*Yq(ViG^kF#T6}`h@Rn8i)4i*E3ۺ؀r8';өpD5:껪%r3E5J;]ftT?ֻmST'ߪaJОe3Ks.)V+ZHrhzf(]by 4(FmTDYGMRդĨJBƣL-e XO1hV2bn8% vh7#՟b+nuFQ4Ai)Z+q_%Q\#bg$bD%V#K IR@3Y|}u5e$]MJL#Ք^ItTW%+Qoq}QA?! ZZ(BRL* e+x)g'"WrdE`fg,̓t$k H}ct1=W[gSO6-'[L'}Q%6-c5Ƞi|S= Q՞dԎ uwGCK}4m"̽Jqّd#uLGNBC}%9"wnYpfNJ2̾`[0tߌ<~fd٘ 6OK/uC~yk_>򵫨Ε']ka;ek*FB2ezzGbj@D@E$5m%|\A98\$$U*dvVd9ik$f]NcUQԥ ړ,S- Ii*f@1\N?pk: O\L:RH ? 5VMsVûLԨ4&lua'Գ/H=T{ dDcV4SgC~dOO?$~H&{+s jbn'}gC;_M쐼zPǡG@1Ƭpˡ# Jcx%1p6&#qPոD)xMӎ-y# 1" ERb<ÊQb*l)IQI{ U.YpE*bhxodD%q"ƶW|?‹qCL TGIU*mR v*d@pO|u]'M B -餙v~:3LfR|S״wQw#*VخZ V "Z.&IV=({1Ul)Vt#4\7,g3Ql oVŰE֋[PIN#Ͽܾ5k6f`q4K}(閨K/O70FpOؖYmf ]|U;o=TS,]y-y+mXŞM5xden~M"=B~r>_TmO`o9, (;5L=@N?3RYp8W$\ YzzfL=g0*ҩ5 Z\#iJV,JA&ЂlM d2t{%cqC3N! uKU>)i\j $ GC˷lG;S@ǣH47֋q\?=[gCoK|n zr˕n.YB׵oIoCzd>|*Xˇ~[#K_u"/{R8 bb%bѝc@}u$3:_u~rpaGWa(Exs<  _?m3} ;3q~:ٛH?\7=d ʕvG/=dJ= m62s`iidB7bBDքZtGj"7V9s*wvYXV:hS[H=2R_w;:^UM)U ()VEQ2 `иEZxtS\jӯ}ͯӿhPn0wudM.WֽNo29l:h0a~S"1;h/e.!-Ef% NYV.)5d.K) b'bѲBcx!ζ׀ Q)R\ "7E]C9=(8 dh%QSFe*n9]v9qGuO9q`,o)\A48uiǺn#ˠ'iGv; ^8ySx?[w$Mr⛾~9$0yIzOYLcВ96w` &?fE5F5k2487%U9ռBe$MYoqSLQږ(ۆFѢ+.@Ljl €tqrZƔFTJvd f+;o> <{3tlTn/ϴ˞ 婚)tToa6f>f~eu[ɽEfOO_zq|O'[&KcAs 88MZ-=M59~R"M<4:󞘢鱔'Jj&6jI@'ZS\Ċ9Vk"]dyMMcd֙]_ d\FRlr‰)v$ovh*蜇MazwlJW_ >_X{o&6 7t^@|諺xu?]?<3ߎ=ov`NȯxJ VHou? {:2{6 vvG3#'χGg۲_r4?^͂] F<ߞ̩ӛ? w6L (ӯ&鋯2'#WԄW:q':ISs :\mSɆ?h,S*_MDR. r#~G }U>-et(bɇz$6+״NmĹzVFVJ)VxAk\,s$%Kݺ x,5r aHL>U^s GLCԖS򚗹 ]{@WRnt+v!$V1]K2hi,/.GFma2IX{tؠ|_'I,=z "Ż7~gv+eLsx魏&?;>vO/&ܷ&qV(ٕ6eo[$~Mo o߼ [7Rh)x5gsȖ=Ζ,9$HL s D*˲-c[;S{nmn[_Nn} ;_8*ŨIu}$d'!߮9| ,:d%5-Ъx~Qj!^µ+ByFu Z*A-D$^ ڛd9iNb,u!EBgZg*' >AJR8nqڛl9%I Ib( )C6E|/lx@U36':*oR$b2PR$k)zNo"e0dljR'2aj fM继i*:u-\S9,AO@o]'?wՐ80owK?$x1y#8]G%X`kT5W\om͠I9ONMر!ƍ)-K,x6gᰯV]-h\&:}y8-_V>0;X?R崄ǘJAs\ U,X4% 4#+\"U-ʶfEsgy]Z0BT,묋,ɌƎ$qrW6ۏ}e[<]Fm b,$QLd)!֩r\H$J\'H8[ t!ɵ` 2jf$Y4y\,'h"F\{*$ȥus!#iDRs7Kr*)U1-iHqhXX62<,9&IJuAr::oE\&CzO<3}#C!oj:/h][םS%aQ\1Qd /C>Dzޞx5:-GT}o'ȠKB$ _Ё̽ s ]D|Ê 3b%WpPh c/nh꩓cUK*s zvgG=`> #w|<cIE䇋PoOBY'ëԶē:[ L`qs\ĉ9P,*[fj%+PUa3,$]|)H#3Q V!JqhKB T0&RL@0y)t5qFT.qP+j\yhЭe8fs_Ʊ`%hܡv;⻝Ș?>c٤;+w]|8DUvt#n?<>ώ9Н1LUOBG8;bl`:Ӂ0U> 5{ו-|wC4T} G_y4莧 M g$M>9u?}3'B~{2?̣=? J_ϻ3בtvȆm~ޮL#^n: QVʷ艼YNl&)-֡*fFWVڝR:u0tq -lD ?T;º(:܀6-h 5pm$-=ЬݥѴ "R>ȹ{4Vq+}D2nW˸M\xa. @EP8@b]H2*ܡĠp&F]Q5tÕDR(&RXՊ[TYJhi Y}pi=jxOO(_ŸwOkw߅_*=I,֮Z׮ـn\i̓Ue@](x 譂F,UYV mJKXc[4Ӯ9g0zjh .]7Ʒ׊ۨi&O[a =jeЃHo'ۀW y ҹ\[h@BУ_m0dd$Ӵzux{,Ӏ|7k\U[f9XuNȓ. VK&%R`KڴVRWV)75$]JAcAf!46͓3iB7Z֔SWߙL6[%WjZ;nw&%׺Oq:++OW\i ԷI08%Iz3}럏LQ1_゙Lq>x}GcÊϵׂ΄, [VWH[D{UO45ѨJ*vLhr];$^:Nb$`Y<Vxz? f3M.EyQH(D3i+"Ŀh(&hy^ %S+bjYZĹ,S.Ա[!zs PA΁Z ,, ྊ)Ԅfk<BUirABE0@ Yxi4>׸fgtswL_7Nm}w$=8cᗧ~:pҟ={eGOO]ޟ phG6th42=t:pOOVD::]H.3'$vG=g/h=[Ѳ;a_O'YGޜȲksa2x~tq1:VG|{ҟ=ɗ?F|:́K_"3ғށj t`>_k<9tL|lϧg2VtgrhFpPIB,:YH;@j" x[[JaCl=3l-jʆn7{Z5>p˔zCNk" Rݡn6,p,?$B@ DV.'CK~]_BܯsdIb}KxM5,+5]P;sKZ@HhquܼuSnVܶY-/5DZzt\_ -nz2ԴjɐP Nֵ$~uܺqfI9x-YVv #zb-,V;/}/^Zjɲ$ےe3x$$3r˚$/9RͲ6*L8r\4@i[2RemFbPBS%8leo#o"W-V\E.1tBv 4h] 9 &RL5KD!5$ݼCjwZX!JI},']*B,S%JB%f U]Su IJAR&*MuK q*&D6QNQJ +DaY_)?I []2UN2ǮPՌ j× $A/žxu_(tY`mH{VUpiz(e-^BBD, \_4;C'fl)t'}r?chU2^0(Z4ȹrFd`טz6ط{ Io9b I][u(NSv8C4Stf`,rF_puШ3GaXvMQeO&'r*ARǶKXgi-ɨ8jI@ڥdl#˖6H_eUh4H ""r(*Q^U%TԘ$QIN$fuʺ_bEYOtKdYV4}d92(F8Tf zF2"IzX3)QM%gS_34]Yf,7re+x uHS'xl?o^J>^=uT=r/c`;>O`ߘ1{;=?vRO] 2_ag7|ljt dzp |?S㣾 _Ej : 䀽;tS|zy?$щӃI;=M>FDpsOI7-^aj{+){[ۓYwg<`4gC?{ $p<P6lޘx1QBŭ9 ò;FYQ:5${Gn!%DRhVSMEIIEg"$"ܹJn)k;tu7o匟oP:foH^AVVkMGq}8Ʌ Jb⹖h-Y\W|`4tcTL^DK7Xm5+˷zoNUW08o'/qݨN^UDb35h3įYVjAdrr %4 Щ𛼌5gSKH @fXs5l-aWA aJ9!8\:}YblRci6]&F˙!̌ !  CCo%I *YJJ*)9纰IZd:ɘCZ2P7eUL|so% HePxaEńޅ~=M*d%KT9mt9itpU.yAB$jG2>aPzc ~&1p${0\V/e`dNEfYV 1e0R+䛓soFA̟ P|ٳ#Д|E<.AU*Tƾ1\")~Gs2P7Td(UMALW KJz[U*qh6L/DVL Cw9oh;UI@l6*L&aWw_P95e2`_ teE-SjWbp.Tp!o2x(8=($+i*#UY&* 'Ԝ {!$f0sURƐjP 4idwLI8Kmz_peFٶKLu)fL<Ϡ.fꚩ˜ y-0hJ|e 1) dwEu[w \;72L3,-%jJNq;G\8Wī;7+bh<ATu{ ,0%6~ߊo-Y6.bfF*fQl=_qIo_ɩ'Z8?~xr{wG>NMlv^ lp}v3GΨmQvGP(L9Tv1ggGv@/{=]\M' :_zy @o4%/tZt54 F;4)ӮЮ1Eu$ K\qTWA5%lpgMc,Հ"mtW @vt 2fr҈ښϬ(l۟P+zmn"^=6$i9MOqŋ?>xțgWޙ}{&r_ b_ez?3+~} C_] HX,Gއ-rh2'~ e?PnJo}ďURִ@Nb~In׫{bߖ2_ *-n b9} epsBO8 :$jd*iB6@RQ&$`N /3{&9' t2naؙ ͗Wo(YE$|wVH4 43x"DŽ!7ZyDrGݼpC_Jű__D^mXS>e !WW훋ZxZgx *2YZU{B*-de>j8OF S,&hVlkh!S3N}nk"o i[R)`E+Fki蠐V .dmx-+T)4TglX@ .`JsBFP=gjFWr$Ty9IBhiza~RUNi^\;[& l9iKp=s)%g|ƗJST- {ZN$[#! 'pܖ,jqdw;*TQB#fkY[Z άC8J@9 Ոz|v~]b I`Y4VڮܶaZ 3 sg@#/ ]wu8H[Tk<9Auj.oy{4,TȮH§QM/QդI ɷʒϨ5c@6Ш͒ z_ oJxq͆"L6]djYŀ1injujb-QY%*A4 toYC øɂNqnmVHNǎ }f%zYՊb> ]÷. WbI{*Ǜ°xSLXlp|x۱@":`q4t!'?4_80{=g}w+f^OMN+G?_?_/99^ Ug]lFA!ZS5YAXi"CnzAwu!ș70mtifꇆ8T쏗xzʐ: @ᔠq%́t;2º'fڻuS`NB$pY i8'Z;hܐN8 l`zRhL-*f#ts=Uf6a6.vvhwd~ڒ<8i$ۼ)ƶwbAdܫ8ڐ9'W={"lyY#ÓOvN^!5=zWhvM#wHy[1~qGYd7$x/0O]ċʊ=ӏ/8:>rfFS>؟M?݈{{[W$3ݗ_G x9{wՉ2.1j**1T <ʝھ(Fu"ή^s,+EUovmxB 8aEtF֙ uWX + {ERv&Ty7Z@2œ1M-4fH(Z}-;> ̡Ko.X#[oB#;]MtB0;Gѡtp~v׫}2f<ؗ3$T W 4-M C*|MVM!c5]Gǰ~<==9oOр8"DŽ.zD%d: WFQF }@bnWL]Xf| D4cfE u_9; i ۜ>NȊwG,Pq͋TTZtjEM#znfXx愶ɶ'ҽ+8cɁ 5忽OBgIs'#gο8rgOck~dO7WsD>?1,̛ˁ3&=w?wv 5d%8}(6voƀ~;٦_vMɗ]M)xחh7z Jw1L_cY,}ӑ;8yg`=cS4M\x>0Н5~y1gw}oN|ui!`J=mxvy?y<4FրGEifAd1KHF2E:kbnɽV' CmݬԓL#WݸI7rV򦕿/ nd?jgo` 9N3o"Yŵ͛B]͖|J[rr (7,*[TU?sY Bʾv|Wkd`0xAHOhЈfօv#jo+ ;gÿ>͏o]OTa TYUv e5WO;4*,*&uJRR~"AO~;vU+T=gt,H8j)M FHk49D u Y D"Q L˞) bD=Ui:Ġ@N%5JR@/A+@@ch1IeѼETlh%`@* UeRhy]BVI%š܁sDRH2k8l6 I9-vVZFDFVZ:|;B)_H`KښǬa׬"v`rLKw[I.팭dv~dnaeiUF&H1W&JP+$!FICx>^{MʈC[ԉW;"sUj0lRN3ijni@35 V'+ʄdmCx}C&XyC!X=f\m"I5g1Pqг'iAs:u?](ݽ\bX!XpDfyhU:@rPQs* Nbޤ# `dѺwJDh!I?k6PqpL"q ";LXu]ehDؾ6S(j?͙)ċCWhlĽ~dMATCF#qhIp!nos ^n/Yԟ#* w`M*p[5'=m "%{Mz ЈMTiD#Vw:L t` "szzdm@^6Mb8n@ ¯i!x{)$M@"t;':VN2:\L/q ud &62ViP*ֈ5@ oD8V ]VRf.F֯GV:`F$jzd$A_*kfli1%S73[_?rD330OM ͐͒fABn[<ͩ-cr |>V >UF|ه[q϶aTqCNU^0'HGx-57sx3=XuÑs\$Zh]f`ɦ>F! x-\Ii-Yqd/]Ǣ $=v^qhRxqjaKثF$5&.pCj]NCazb{57(BhjRFt`r0! y^aUI 7žlfr  zw)DAh-yBDaAw @޹iIY *..pnXgJB:ի[CJ"PHx?Z C4%Iu Q$eC2-nt+JA$ժhnl] #]M/vWdc #Ӈ[TH| | K#,>DKm_MIYM}:եxc0h}Ֆ-Vд3=a xd' )*4~[ݎvwCէlGZ+Zy0/C}|}?6y0.g͂NH1xj@7˓E8_{~yk6p?}5:S~y\ܵ|9_܍?`_x?,ڏ\p?^(v[p>/u<\n?Ngҏ&c_r!cmh^3/>ƹϿ:;Oww_o?0סE*.-ͅ枨cU٫Lkq-Z÷ #Ϡ9,98=[NXN5IvJ%n){){Kv+/ +6efe~GybSBwj2em&E GZepdH+]M̢!zz28H1("P^͛ ٵ'Ʊʼp$bEæ.p$aJ-;Rx>|1pdybNPkg^ٸdfsn6~Pz |cuO~w (x-wIv_mzx(&I9F7 LGҤMxk/~_{p  ުѝM. x3H*@Ӵj>~3Mfɓr.U_[F5ˢX%kW"[L7K^-a"mncX`QFTЫcۭ1tX%%/"y/E~//Ry9@q7xu D O~y&Ѝy?U "DԊotLmb\2U2#YPX(PXe |^Yy,auc}9V!@Mnv\Z5Q(aKORPe+X}9ZRFuCZǫ^$*6J"jc/ifW]^`$w:\k >ݞ>}=ʯE(Dh4iPI-Kpb}@*!Bu:T-R݊1MC6ui oL"3U@DzNN48` 9wuQptK`#S4x$ahQ9U2*iJ Nƭ0MK_zM٢ZUY5YXcѭL]W d8$L7.=F9aBM]Ʋ#ڑ$o19QV-qXtLICR$n,cD== ;`ϸ";Ԯ\[TS_cyvXW;fxjļ)A=8Oķgy}zcyfWC#?=!'pJG#( @v/;䀸=L}w;be{.W-$/xG wy>Qlzγdg|n~8ؙk'm_~Otv퇿~;.̟Zƽ}CI^};9xw>w7\ %.3OW'x{1lkW3#G4WҗsEj<5c,oseb24u`B'& jC?4rQEPG84YqHR%*w^I^e64ǚL2@"V b9HNP1k"3BNn Nai#xG7,nxs% F])<+#KfC+aK3W8C"Rչԫk_I,~_Z˥Ղ֝#R"km.` +/]ls~-bViVţ2ݲ/-fs;2ΜЉēx{B%9^z"ix۽IfU1lA=m@:x`P ,]<]NZ#7m.jo}iC%kU|sYڲවZDPY[rkxHaE0rXeAA%XP勩QZI!Px۳4~uX"!-`Ds%Vqh@ENUЮZ5djtL#WMJgak.y5T:ݷ3d{#wȎa&y$3h Xߜ!AXr΀D.?-T򮈴D&]6T `7C⻏a6 H&#CD!: 5 rI=C>?8|{aB1MP:5DRЫ-ЯX%lM ]RWY|S6A+ H (dyClJԼ}M83oDĀ ѡ^}1}`Jt/p)^]J?28^dIo tklYtctb%5[13H ~4 pai4Ԑ@W,6@;F*}w $atK TѓtJm@$YjtJ8EF8h5(h6tŸh(c[2SWv&)3ҽrhbȅG "V!(ŭR͈/BZL~78zt9t6BnEbliBli:m9|pw]aI$k̺NST辽iM8!d> bcݰgڮ w(WwXKwF%]R=L݁,Zf+jOdfhpu(n"\'aY-qEÃӑ/}́w=alO7ߞքp{/c#e~0&oRH5$^_Z?-O3?.wZ,kȶ(vߍT}q ĪGLCեGr/w'OWy;OD}N#7zY϶G#ǽ-dϠ_lHH:ևD.onbzxu!M6';Tʨ8E:bo=_BZ@/3C(Il$Ԃ|?~ yZDtO ooBs4)C6r +/h.[ΆԻM!} fi釓=9Jys'7\7ٔ$c&gg18?wzy&tMWY~w?2ýL' \5^@zxyh~68vT{opJŊMQ91uφ3~{0:ȁ?=)xd.Cӣ_vttd8Ow'YO Sg Seۉ<‘~9~oCuJˉ+̫s Nك?\/ߧg?E~8@MaroGͳ$>~t:8eB+5o/-~H%Ip$8idmAcsfyh00, @thtZop'Ck@>$mfI&s 4G8 agǰCWC%C=Հ}>'F>ݏ܋S4iJVQǚ^m.qbZvJZwRDa%bZ֘Fr EZVf7IQ'=.), 0HaVJ2jUY ւ8 6Z5$mF  $ڇwM- PՂTDeWkhrt=ȯvz }G֤3o]NcC>zǾ-#ow=c8tֱ{[ɛ%h~i gdžuMecyQ)vw$=bݥ[jboΛzL|%'-+fOx24>ۛ~wOgg·Qp:hӖ0Pg3OPu]% [֓8(hw;sTQj,or߱U=%d}GPNўã~8ߟDVi؟Ztx5D3gBc@~x<G-wpp+%lŔEOCKA*&{Em{#fu'ۣrFz}1}5hZmzʟű7ޟƔ Olre1l7Pj!m䣁-- x.|r+m㥫Bj?CXnU[{@Yaa}7ƺ$ 7GNR҈e[?r;юu dDyvɅ2$&`_}fk?lg2ҷtlik%o \/n<3pz.Ո(Гh3 ({;\;`{VuLhC>8P|zAg*q;VgwUHH'D9owXvp&IqKZ;hc'd3QNA7pq$]8tiI.#E[ ^D6](E"VEaɭ( $QEzNȽFzQA0ԤHj`B, D-@7=i%'8#Q~Ar30eE {(^V˃ h=(`z+n Uxv(d5+\pe=q{}lȁ<-٠G#NPoe9^H̩|dd'ejHV:76B9*\ Aa*څ$LD ZCJ;i/gNq]͑ĻSS / A.BOiT$m`Ԯ!y0Ih.E%En{"Yi@C?KUG2N*h}'ºA/5Kŵ 龺*à(kT==5W]EH0RNj( $6[8 V^"__W 6%a)+t5` !R򦦯S j֒B$|J%48>L&+c @ 6 iZa50#``}stnGa4fSLǨ>44^f C~q 'AUCj!-#&lgB ⣞.( =)/`y$jmlrvmQtaB鱱ڀFiZWU֎+:Ct*bjfTEGkmOcSc#6\q7bQJQ<ҰTu/O3ffS䠲xzHD R;ݺ2@O8z*(q0Ge 8w2Z!`MK8:K{) ]cokR7Zuj9_Ͽ<{B~du6FVr*' +ޤ!*z$g}'awڑ%zW)ZR"Akƙm4/fd~ ,I@s^r^9sH-I/(8 BZ 4KdV\y]v$ ֪%rʗjNU6zA2rT=gyУoUQ]_0,P 7.K4X*ȮOؚeGOY7z£؛oid7#f/GO^E@ r"[j%i>/>tzg -a!ؑx:-OjlJBi$uZGo4. e`O4AoGjB{)x(J2=#;Tlhvֲٰ͢[/B E;(P R혃61@O4n-|-L+$OUxfb8 QZ" erMnW8?;Y&F7'A/.5KxiPš*a UZ%늺H&򆥃n:VZWU]u -9IC ˒ C67ª ncqӒשZ L=gy9$@IdJH,ݎ%^0ORkγXe㺭|ݗڱ8&{lSg0ؠL xsTIVMN#fq ^ م<]3n Oۜ-qfP*fX^!J@B6RCym $Źp4Ȗ8S_$F>ӂ[8vˁ&ޞ$Qׄd W>DC?(xCo s{@eU-dY3x:DWYaeG@F'eN-%7SPkzsL"#JchsOd8h4P!bř%jZgfjWP A<cx:Şa>!㵣ԇg^?Y7~x@>ZO_M"@7G[f<GzԬ}zC?O>Y<-lD$JX%C d ZXbZ"|R-ZHEy, V0i RL2ZLXq%H!Lb"b*dVHP.e1OZd+\. 0C9mKX9cH1KD=YyU2,nְ5ep[k(&-hB9aP0kM܂ʓŵkU D;W"c(y<ǽ U?ƛύn#Co&4^Y%UNhme< GcLPv1r_"R] Up% h>S{WNi> 2P]x=-ťuP+|!tQ/c,z8MlC^NƞEU7*F0g!Q[wu2@R2l%L [U{ mRY녋XR@Rkd,͝ R~22Hi/.Q,*hHCHehjENBv+,q(li4-3EK WD1V"VWd $.9ej +h9((a:*Nhd,-3cюuH&j X1 ΟlWyQ݆.֑~kfp^M,o&JX"8|(JG*l w2I2Q+lfB:A6sB-t]!E)Rͼk}y*]dsڇ,I5 |=%ene Rw27r&g09kd4YlJofŖх,1rPQKTik hM71[  0cC^c w5`,2g=R]q7m3_e ͠^NCt\Ը 6xk :ySDp_lZ~^I$YHdWz95%WZO{oNL#3ẇgozJHMp.,0̛cOpajD xw^bmb3!W.g/\է>Z|ɦ|=M=#Y8#{NNg//v} SíG#oB_OG]L[Gܻz@jsE}37wޑg`r1껱|5$h 4\%[*[֚JBQ-{S׾>|ޠޟƘO/};!ˑ S힣cB!6zFv/ٶ菱Z깻;;^τφ֔~s;c9&x+w|%>M|w.}{"u5ViL@5cNFw䒯Lm_1O9d^?q~u,>^ w}}Bc,|k4&7mx`yP:2gGHУV!#knG7$O&-f v.O(n`L_%o`Į>5h?zp/4_uj! ֽrN@75| .%$h),)-N.HSֱʪF-u } S MkyHWQЀP (  4H'{_ NR2/g2R}8.&#t=A5[BJiE`Wv$n (ZG8X +@%*y3!E,p?ɡI*XyE2233T$6|BC!)!zIB{Ձuc,d9@>t_zڰ!S?p>N-t9kt%3Z@5Qtn7rw`tf~Qxu5bx+*+Tp+t)Q`Yˉ2]/rLPy(dƐu 4ڶKC. v BV̶vR)90]ܕ  2\JIY/#LAt%(չ]e2y41C#^tլ'܀IፕO|__5+(2:ۯ3Tjq`w9 jA~2V'*U'a#Z&5& MbeNȁ39n~lFAld\g Ƀ,J?&kY]#kkUkVD )LSJwd}N>KIPD9mިdy)':UG_#j=elEj*SvRff>:!yd3ڥNbˇ{aO=#ތyy0=d_Om`O=_}͗U}nz1"#f=WzXvldrSGu0\9vn{a>-z3_e!99J<, ou^٬ɟh`x͛ÁWGnmȉ7#o$^϶fgwΟGk,_,{=K9 YAPS>p9:UH9l7Ǿؼ~}6irqT6ISe|UH@eKH[IHnO‰(ԑ*8=I&ve z$ծ,Z n n!.=.,@@W>S$Zů%E>e-Z,G!Ռ(erV@mBbA@AO"@̧<Ђt=ŵ^ג|cRh)a3@/*+5#Ҡx9C씩VѴ(G)ӭb.Y}X1R-zVꀯ(PH\ F!?(+\D **):,Jmy.O7P$yI͒ȁZmͯ``b҂>ӑzJ>P P =[!b1':(pbwjֽadyƨ̝ erۊi AE&9*p'y^E-~LB9UqA, 2Wf;P 5V<^= rD';,8yaTY՗^.,g&jFRtd%zUn{,q YO `Q(2K^i13>&RYXJj&q@JfxF\ǛʁunŴK$VŒd]ު8% Se:3+7]̻IL+jNLY0Ӿ5__~'&oW;}-ڬ?er?~0ϸ/'zfLx=Fԇs@,˽i8;DZoO}3pU<ܳ>fs?lNMCk  M9UnvBeȾ?LoѶAoܻ lOg*?\Fj E&H~&y6GH80nϖCV>GΠs0ntƀ_O(g^lv$j2(~⾟?9͟hCUV]8yqYS3}[ >a~w>zJ|$ĵ8}1$}=nw&^C-{y,]Ul|6cA_gcWɓqߒ|ż[S $TLÉN a[50I#';ѐx6tG h/)e@T 'Kԭ >ʖإ{x<+}p/_=Y:0oK%ٍhx-Gs\u#H3C49:L fr,*JU+];o|ajsWyN՞x *ۧa-y2?M*e_c%E\39aMwQ剀 `7Brc kH&"k哎 i Z{hyVzdLRp6Fq4$|hp^jLGzCc(TZH>K2h 'x"nxn)$Y*bdmf/¹@=2q YJ f:Q6bXE&·עlpp&FC=8E4Kp>BdK`lzt-Ϩyj)IWaI$(kP} /gQ6jS Ђp4\ -nJ)(^*Z\8^L2Y[8Q\r],d:" ^)ҍ%Z@>^ِ((:YN/fD1GT6 Rko@enNL0L>pJްX9 icVIH‰FԲ C &JP2T5+y^0z% yǪ=oX5_k:VY3J0\gɠl$g"&AW%^,(ivCQ>ªb8 Cd)hy.i6 RZu5l#a ` m5WY 񞲊W5EnH7Ŵg[EdZp"*遗a%aHc3(I4]']g_H3Cr:nDS4eWgLNpEk}9E)2 VV^QR\8Z\6QN\u/@%gXuE CA$ ',- 2 T^5V5G@ڔޯ$\6[*+ǖ'RX}a!Qdx)9#y1@=QJH40$iKahm5XQYu*Q:9]k4,UbxZw&aE+2af6( RSLmYӟm? 5AN-Q3C'Mį}ն/mU;׾U[a% z˒j=G2Qr϶ywK`ݥN'\ڈlna.t6=pk̑WO{{i ?lEvDU#G;+__Ϳ[xG;OHcr L` YbcѐJX X,|udcJu` q%"jh )$\d <fpiy(*ϯ`e el\᠆Ϋ8zu7HahƱ\jF&r}c-0j>7S_L9pn88ɥVLI2)grZgSDyMVU&W(ʣ/B-$L2ebZ+$H.At5kMlmVCpִ) jKvS ?q,c5>jc/6E6=A"L3y)Fe[֤+X)q)`Y9͓/1͚>it^AO"XF-m )2e8Q)됎1!K0 i<0DE^SY QNV8'~[Q v/0p-g$51UJZ64T㻈ؑ+!D8 Y(6QEGA#U$Hza8)L!`~5SS(JpciU78!`,ki] \guiCC JRvUVg.,"g& ܆[k<*?*}+ hmhB?W=e+.D).Z\18VNmFUxP5>vE(Ž&88!+zj L.QU*ߨ`zMXYN`qOx>Mwk(,"`}V=EP8;Ubx)$ⵎH * FffVienhSqm&pͪܭ0%CAnUŠ*Pn<;^5qBINl[!_  NOZr-H]N8cѡWL_}Fyǒ4jSE|׷޸3fu>b7Vo~?M:x w5Y=;Ov?O_r6ۯM@7m!?nP<Vx2Wht.,2#D~8mosxΜNz=oZ7}բDR7%z5{߶vOe_xmzO3O,Eo|9=_=S|akt|~vv?~T_~,Ѧ/&-Qah2;P^ٜKx&dlx8|.#ofR1#נזIh5g%"͓D>%8]lE󫲖Fߥێp<$Q%E>S\Xf(_,(šllrq %]Amq(I0 Eh=&n} 2g6ϱѥLDAnը(os Z1 ÄDDnWZG:@e_o!n\,P/k"^5-aY*o x ':bUnj# @jשFu7z&sh9e˫haE9gk:'JpGN{\RZ^\$ׄpM q;OI7k.6Ԅ LH|[1k3Uo>$C]wDO %7NGJMgs֙!ROڊ]x@@ͮJ>p0gGwwGۣnsn&髏Pnxp۞#]ѧmt lvqlS7TcnAvxaƵ@2-ԴXl ̾=QEͺTI]" fhݞgޜlߟS2.OTmmz?T7llzwMB=Khn7a}þ o=N#}<[=wE~u7v΄aל3?\wftwdqW@ Ǟl Gԙݿۂ4>F.;ظn[ xwӱdQӞe=8nJ*h{ J*LL3i454Zw-SNO5xhڂI?X<r[%f䕶σQDYw, OF~epDӻ 2\S-~zGC_EV<靶\X$Рw??x-ד\uƟ\eDQa9ݹ9N؀"DHe9T.[~G~sZkA៤_w}n8|~*D/Dq3V3JMńKbJn iIsQh3tѤ{U>HyKBXm bTYYRRjRH!,#n3N6k\0TrM[ Y߶$V2d Q ,Mo::5ܢ5NkЭ 2DZ}EHecF`wZ'p%iHeKT'Īiufw:DukĥZf%F63X}ghݲ(kT;E%mYٮAh7r%;5sXIN؆ QHp&gkp9t{[G*ILXD5 rrn Ln^ϱV--I"/nl۬jh !u[wۍ`:5*6nq!SQ&,tu%$#C"i)z*( ݗ4NV)$Pmv 8~n]'8C(Rz$a-Ҋ~e)d<583h1SؙL6sXA&ƪ;G;#:9ߦze)mdFV0MT_Ȁ emKCgf8:Np,,[sېM-7^S6*/qڅGVQ34XΐAK\FfXei6X` =I Qcpxg8h} Q "ډ0AIK"c2dVN7& UL-B6]#g@},.vLFvk^tp-I-7sdQS=ݞl^z?[:K8x}2 ,O~z.*2ǤFI36o6g/jH:d~tUpRM^ߞcKoO@}s{g3fKCoKt 9}2P#OLٗ?i?v>i@7L|1<$Z ~8ѩo W&#oW}s,!YsTw}kMj8@q{q2g菂Ȏù@y8=OWa^{)^?[r^{tsd:yr`W,[Z4թnjvl35wualU1Ku]U`LĈF^'NJ,և]w]^,Y-|NA$L9b cu>b]T.ѭ*TFY8`&4(JRoTi+Z R͙g1 8!wnv ^hX-v<* ~-<`'.]MB[FJINńVJ9,TҚ3N>ic bg 8TNldD*LYL+ܒM@55 K5˄\`1[BCQA T)2Vv7L`@Y*"hgHh u 7x aeGs[aYe$1[_:k'#Ġ`{uspWRT,h`& FG"Lw*aءEG8͔`lb'ͬmʖd-Md>h,.ν,㊯HJ]ūxñB.0%nAoZAսamD&Xmk4&ϸ9 ޛg^Pp8$r(uIA#o /K<6F-Ub*ݪafjHH4 K6wM+P L%Z%n 9A! ȄVɐs< qy*ENxyў1`cLAι}sz`Ou/O{Ẻ-mvLkDZ@>ۼJ6}ScGu'37ߝLӣY_7?,罭:ڳc8ZJ?]Ggφf)G+ 1^_-Ca/<G+]#ϾޛOr|h)益$ܩf1|ikeTS0˫4Z0-pSkb3qѧ9îj_MaF\${yJr12^F{pL'*$+H5hh4|37x> N`6|sf:{9 !blO-#}&5*{ O%G6cdb}lڐ}{{Sy5OCTM߾B7>sDj{kno2TK jVX__WkWyfd7?|зnޤ,p$G |k.6WuKwe aɛeU;DŽpViɧJq4@űm+-PNd|u mZMSh7ޮY$ŠqPbB$-H(xSKB+A`VwP!ީTh' UĩV4Ԯ+ ,ZX9\7 M&DR*Kf*972ٮFEb81h#@7Ȫl8M]ZXmGXudD #؅2wp$.@#ZEB*}jӤ"v,8 vX+PB'hbN@"Y%7ʫʎkqSvg]+K #݊dJ2>..Nk'Xe}tL[Xkʂ6J&Q :&{8vHJ8 Ii 1^NidˤX%q3!biDyj3@-:hna* ïC[h-Gr;h=OہFiu<qA6]:M*B+}t"[P. dD5~ȱH߇d4)8ݮ1r i2P:u蒭 RqpOA;Sy̻;P_֏G_OBw"~8{+wWd r3WMb08Xo(\h?s&wH߿r(=wVs#ؓ48`Wfl!D?> 1bdO'`D<_3C|M)y~j>\)>Df@&xn&A$P G6px}1P|٭{bCǓPzjh|>_݀9{qϕ3G4's1ٗ`u` -Z<yr`lr}YN|ӀEIx{u`>OOz޳=uF||<Dcb<Iڝлu ݺsB_~vfWRO'z6L\~wB=[om捛K߾ϒx-WdYR_gzvF3U{T2]]]1,h1Z H<!!x@-o|^m^BW7"Nq/,YHx150̮ygu%:mO?.`ζ[Cc';Q(B nZ5dX7RLBp1&1( An.-}+F \JB-'U+d-DU$t/͆gp.7nB0\_x{im0Yz^.5o~ #L$[|zbŷJdh=HI0R\p)j[H>GJLgbH5!1 c-ZZ#D94#NǡUx`6ѝhҽp\C4 ]UQٮHAjl@.)ZDiw8Y/}#(VʙFogNJ}7OwUEDKJh[5sW$`}A\IH'JJBh%a7,`TʠX\==QI}p3K`%jn%yO & IjrFsY R/WfQsr<5CF $\' +>!śɁī)AȠդD@D*rܣp9#NTi@MX|Q"ed;%Nnifrd;<,JxKI 8kZȁR_afsx# YG6j$NˊUe>H7e  ڊ;Yˌ Ug|ht fB0\d.Pte: tk YJ7" X%#3qSmJSԸ1VSK FiUZ:Vd|)I63}%FA`Xq'ތ]Y2œ}o8,S+T(enI."xc wL{aqX2 kDU:MI=_6+j/gDL GKW001ddoџɱj08|ޯVw~_ݥz_etՉ-ؓ-b50ܩ?qf`l{F=ڢ>Zcdpgo~l1:8`GCw,:8](|}G hѐ5LIJ_ژ~s9wOoL/_L)lgrͬ8odkv4ٟ%Le}ɴMg}ycrvo,A_R>/1óGM!nlazdxMw-eNyc-/mM}y87ZR|ŀxz60@c# Fֈzu*yTvu}٢=ˋ#V;N eDuu˳ڑ2vwέSmf"OMolbLh=F>ԮE!YM#UNArm~ Բ^͡Cn\{7 O.oMMk+]I!/_ro~󿗿<i_k%| ؄ oZU>r^D%IeP!d7+GUП!Ыlu(Ӿ΢:v9we2X5>V8PpYD)=E ½Bo QD/~hD ^g )1pKꭹ^Q\6RM8芊 :CTCCgن|c!lvn…չ&JI•Gb@#46vk\YRXr 6H7ZrHEbBDԡ1Tu kQjlI6T&9r*{5 mN%u$Rzx+=önѵ+4ܑwjVz @eDr[%q8_*D5kp%6"h)6V d$nv.YU"+ ۀ<,8pHmk$ j|EzPaC!Z=E4T7gy$t" 8J5*aYhkiN KGj!bT,ECzα@C^uѓ)\?duxG4J wL~j{uǮZP=]xʤrRx-`ZANDJ RLNjl!TcSpbf_3Ub@a-5JkݪJlViRB| ]u1 QXV=eoF)_uV1NT'/};#068> 4\4Rs^3"b.@(DK8z)ճ3[b2(CD=/05KyO7^O|wؖ‘ 3W ?P"ҽ]U,h38@ve>DKbǪ+(؎b:0.ob/NlV$/'Cs$Kg-ǣRt茍7{;?~i=ۂɾطEyvd p^\c {9` ЯOg>.sg@>z$`3##`EJ…?4]OpzKZOD],$ll?{%N4A>@;!t0>Yvo;m@c1+O:Oܜ_?rXq66ē;{ bhtWxX }»XdxЮm6|45my3rg ^/Oف>fߜڂN]Me갌12v7X66'Pאaxo]QOvLJγ4ll}öTsscCk)75@ bߐ$цn>ޤO7ߓZ76=yء67M-\;\Հ'80Lپ78}1_C+S J^5  PrE`0#hs}怶CP!B^1!0OR 36RJ\̉Ej)OςI$pJ,Zg Sxy0t .&`r$v@*veY@ݻZyAX/jn !Hbkr dguo!ڂ1 L(x 6bD"gP17q0)[ @\7\|f5!YeZ`XFk龖 ̭4$psۃ "7K=sK~lͲ"(.No ͢f޶2,+ -˯ ЗFYOa[f_ItQrչAk"6 59Kr멀  0'T%M4+[":Uޫ*5hѭ 1S*;iͲ֯SH-rts}лfM.JmMD#K`}J^g3i@볣\DR),LdRM#IeoPJ_I`(^DC=Kv [1t0^Yd$^lO4ȠFFURXdwd%W$UД< 7{":R7kڧuԎ @]rD#:(/('lz 4݊A PH^X5i亐=R``@Q +sYR |+$F: n1XgB]1Cw[3PNvaԭDJT)F<b!z.kV]"Xy1ԛANZ<5 [KTwTv qN5kS%.}5!tᨖp#;uw'>Õ0P;ĞOF= ī#+`<ى/8=_'sЫ;?t<^MTt;i-v t ~lpt2jAprk|?zC߬'?ܠko\S׮ T6y}0}}cvx-vוom$[I9W9 (QhYegns56UT {U ,]F15D+ΰtx®[{>*3K3C@\Uzfjg&Ӻ H~S7`p]{lMz6( D`!R#Z̳A#q(Yxbe")S 94s3+&[̗z%RzX=)I$#peSERC*6]d \\IXh9evvszw$|fkf)M42ƪiMl{iQ4ZϋRjC|q(*2t.Th%nA6EFݦ:ЫoU~Kt,Q_0BZbX-ch#dz[ь"-[Nm3Gʎz%.୒Tqe]Su°ܢO[G@U9np3`\] u_<ӫfASe`HqjԠlk%nV7u ezP23v#0n9d;ii]I)[`o;VoC)R&VD#:57VzFmB9PLaP5X+'iэO&4Yo3$PS%<ͥɛRPU1+k=&Y[c*E B@`D4R`Fh+[<3=ijx{5G}AYAItOHR`1 }`,VF,ӅH2*t&3h;w p4Xg:~-k\'uikQ4XĶ['*bAo:Xχ{[6ui04}(v&̇@rwѯg'?||ץƇihΘ1~;O}-ftC엷>d~{˶zee&i'LT5z“id Ջ0ݑ7O͉7H4*;#|NGێhӯ]C}$<]z@]'0˳gМx3c_QXJ?$M؉oΎ٫A֬Ib(X"9KGAhgZZtgS) =HP;шyo0;@=ġ(),`#yO,eVJT&95"ݫk 8˧ꦉm*4 e% `6vKtie[SݮRTMH *+SEWr UMMu5Y0-<9Vvel*I%5! Ƨ&boN͛i*Roh si"AB9O@':P 5=ru2!#{hrȴN6֒ʑ-yOYQ~:6X=l:Mc& 'ZP)=?c%@ݦtF Ed멒}Uths"]_e@sL c:R d9G*U%X- *UQA Cv4b\-~U%4 f!CW}͉%7<ٙv%3dv8Cp}#ОœpGM w9\^n$}=m3f<=X)-]凃g~*:7Q#I0{=;}xx?=~?=ԇJ(ܟ|bWbWcrKVח >>jbǓdc[|;DZcZ`֔{ Ay1 Tg'ɑ(f]3gY-|w47zL\/'ù[Է4"~I㥯cg$e Ld/oy~=ϳ]jձ#x7MFX ˩Xc~̈dۓ|͉'[7{6!?K#s|{I!xs#$ޜ!`ۛ ߝ[B@SCŲLRIlҶs{0u=qv&\,SO}>n/ДtKh|~TYUgwVuߠ3쭥EukQN7ܖVn +g+Y]YӂYYD ̶: gzGGI O ,KgAL.EBEU(Й 2li48RI|04rd+9%g4萩xV&SIĉE'ZɡzΡ84I.?3< g L'1(fst.\٠:Z2X%-^5ikH-4bPJHmC}P50[(T=vjf"_S 96ʬ[EeGoQ;19Uw)RFmf&@},R͢ v8T U @&WNd J:p*EvJ&l5U̧H􊱑c{(eї*(Zh` ?Sa,5 Xc-z5WrI :GUC8!,h*dx*MxA;T/ɯQ08N?5&} .n`3A`o"z5{w06DX(̢Z/sGx3)px' w,Ȫ&8kNŴTg{A} ]Ut4Bi]ǛyK-ͬŀN<Ȩ  7m<4Eg:]CۦZEȀ:%w TdYқr2SrogGjB-ez!ˆYq"I(?D0@n#!Kulr dNaaTy'M#qd4~ӷ%o: @m""-/$.1c%ibPXj!"س6o)qolթjE,0zf2ݙ7D$)e1OV>btW=9㈼?U~j(p0+ 6/&3@sЩ,a-hG=<&AG< KVfi G=nU U<{=f!.Q`EvmaE /~yhhV6?T׫,5iU';ۺg%[*4f:{˹ϡV?Pض(kii~3 $ رv;K]Ȉ$bfy%.$MzƿCbn's,^WڱKDF^1v2 y4Jқtx~>H0#Ж@_^.ϤO`xN4/ aB.?4}ȟ{Cf9t萛G3$0b3U=~:'/c/a?N9;⯧)"c$~HsDS|9G ӑ#kB5IXS۽Pfo|.NyvI\ɡOl^lWQ3%wWjj:jy8oOg9{䗷>!%t qw1uwcws^{\Oɧ^Lfނ뱻C|:z|'qw?^On2Ej.P]١#-p vxN9p9z5iy0A:X1ڃCd5?ڟ߮F4PZⱫ+@zϯqmyMY* ,-RX=-n&RT  ʛ"T4 ZJ'GD5GEG|US2A6JShuFRH%7uIPWpOHB$rY.ׯe|l@ ͜JZȘ:׭JYcBX#k9UtmГ&C&[ǪK*NZte:xYW7 =hXV\Jde;TlGP=`ܠLuWzM-nl1Pm*v5AvjfR᚛@lwx_B,Fל8Ɓ("@kpP׳?81Sy*FMdkh+[F@9MMfU@;pX͓DНD3 7)YaPVrt 9ifljNFf@0(=H8\2s 722P1pVՠrFh(yG+[&PܟT OFnHD:8ڥA揰u J)ɏ`]vgh4)z"!{>Vs$.| _-G șDPvioӝʾ.CO.e:.*mMQHR>tA4<=V"瀒iB? Ӯ^#Դԁ.c#V)p5ζܸ nAZ`ϫudNs|r-hZ:/׎sǑ4uLbVD7m/iqA!'mWA!@Qk6\YPN$)tVѶEgHEYPtu .CNC@JӠ: 9P,\5,xE@S"jYTG:EX>Ybvn~cMAQ@tY~썖py9 0>V?0o/؎.E˽;odzɵyd:;k`&ϼ)pd§Gċ3|2vF\#Guhr,i99SGgC{m-ބ|9E|A~~t;%;J 2y{sl掰W5BN9&>^xr@x>/wsTlVOܱ0G#3&_F38 q=>~`̜$0(8AU S E6Y;BE^\!|rE_lZwp<njRO{hQ?=0]}갽oE*ZooU kA,=\yڃ'<_[[e)Ff^cTs[b ݘlmAWMm_U@qoej^[1k"d$Ehf0sO%O D=9 4\ ĜvK0|jU85ҭmY*;޳49 3ˡ d7DZB9F&}\qwQ0_N'(O؝h;%1J =8ݩ@@co.'7 "6n%;)?/&xJ/>9 D@y9 5vğ+af.x('A`Wa8{6[_=Ѥd/y8n'S{~\8@I~ I_f${=dx3oϨWGSwH9@;O=ߍvHKOPGyb瞒.,JH=x3@Dƕk ǻMy'3OzӯH_b=ÙY8--j@&MG2.yY&CYX5ˡ'J?w?n;wrӕ߮Tkl}co'f'-Dq>%=_j+w++`l3Vpmuqk&h&Sx-YoWvG$eg<(}ﮮk}M6)"EK(ɒ-y<8Af&@K!@0&_%Q^b{9}CH"zZwM ] mt.L1۽l*;k;DƠ|(Vղ X%+XmMT ,Tߡ 3l>LfQX#ϋ{h-MZDp^ tf DmFT"3`\SEr)(4ՉfafYyD7=` :5(rH/(@Fwf^TJS2HB4r*KQ:hZm[fQA k4{MՂ^Ӱl-1LJQšZTK3p8upꉼ533vLrw^̈%[&@  *SR&mJ nqo yP5g$V4X͂($j,cG呶0@gJf8bNtlk\ DF:S'Z*pg-ݴjQ7Kk09"MKZapou{jB:EKsɊA|L1ݦ1t@]̨jdM[3"Y;dM(YFm"d'D׎ Q\Nu*]moDtNSv]aUՍ pQk 2\4,Lj_ۥЫ`P֖3Thsے\SIZXh/rgNE0&/J0lQPƨy૚puw|eȼ 'Q'c?^Z>g ;Me ӛy]&|p퓯ObΈw:?| ̗} y8<+_r뇶oO}}:go윌_7z7WKh}d8ƖlFdVv0 bdj2TԁG$*GJECkzi}<9\t=`NB԰gwhcs #_sS||`ܫ|+ ~KWwL}#6$.1[[RGmZJK6 bfQrh&Ы|vcj [qaTuv[Z5# ၷvVb؍Tr ٦ ImؘtzV3XewJ nS@,v9 dž9*Jm]Wg= *jUL:yo 2/]m.JtwrdG'| ob8l͵Kxje CSĚEC/PIk)^(aqmN;zc54€qf *uKƐqG[X2"{GB>В.ݮVh.V &{BkP pY . ͌QÐ$U)4^LO/ϋCOjIx*Ud͹ueSfqa{8x{_Lc_#WY` z5yyt8B0YKΦYlٿ13WoO5ނ3wF<,@2+C3硯cWu__+.S%ݩ-*΋#v,'^,ѐ:NMaVc'J7S{_-|u}$Y$[HQb[.v6xq?HDٕ(6^$>g>,^@ y>Wzw\<3r0H_SJ/ :}yWCw7,z# t EUͯVu]nthf3n|cܼ3IZ-_<dvh) b]iK+LR9Lh0evWݨ TK}5j݊֩vS u}w KCm=?>g;'ĉ*vڬ;1V +O4O.V s n4yU I4Iyk`3tvs*h!p#\-ÙHMsh'<ӅMgҕP( @Z5,!KjNl)bׯ,JT8a܌ ! eW_oVW޿+:u>CGϯlQn=NY?$Ū:DApxY"V~ _+T[  q| ]<sD]W fqѕt>; >Lߏ??ŃF؛/Gcom` ?>Rh=dLZd( 'C͡^MF>z?۳$<~~ x4Ze߬#m~{22"LQ~,_ >9gvL^c#^C'/Wtf7C%= egp2 ]X6Mwvjeě kNVVl8DXFS0EI(skuЂJ'r9\O!z%"\ǡ6t [d2tJN>cpmgk#{6nN/϶&1!NnmL#nƸYx-׏$u_ -gT)ι:T9窮3==9mMrI.L,K l@a~0W/B{N{W>0&Αs-oG;B7cJvl78I!0T&CQ8s̮x״R NPCg # &%ny1t ׶-u{PdFn풮7inMSL2(vf%A$rX(SN@|=dҜBT~}X׉vuT[ `:kq?wR#7vS+O"[~\fzd7vI6K4R7*m#n7uM4KX;1(?{x(R : ]X%(bO{0 XF]n0hE)G6 IuUڕClXmS2<)b#5߯p(4҈mk#ؿl-l%|oU~Lv%y`{dymHIr fA -ɂkNSB{JDߘU4,(^OXF谌áBѽ4T}8|%riJ. ɉ7L3#'eRl)%*xFJSnMst۠m1jAvSa 5j+]*18WAJl D󒴃ArCA%,PI*RX-*3ݶli*Xa76)!i%ivU5p7 e,hWPye)Y-rÛE %nPr$R8Vw^iiKWf(bke[ʔзYX;¾Y,?lY^|3?I=ש5T*p\`?#ɑ7[g0 oѿGPD&qqs}T3'e(6qSɨwWkO2]T}拇(EgEDQpIUz{6{zWgz9ao'M=GLg_* goBs[ҔOFYL/oS//2&}>Z(XZBu<4O-8xh-/$ǟu暌 ms*bOM=~uZc(DS> V} 2LZd\LLTMLv`( iNgHN2ӕOi:f؛vWӑ?O37c-Vl18].Nї QeKi8Od$ n$kT5?'f_.Ƕ<"IqU y=T.Q4\eDe,:GfϜXC3^(IG &Put~q_ݽ)R@Wہ\A7 kk|=vǡ{\ϼ{ZO=IȮ;X6F*\HR~:O#F+ָ~G{,f>XڜhQi*{a [/Do(V6kly/Ᏹچ:ǂ.5ZXe6vr<Xb:{Mn^Mm3DީRhUTJ`Gf~P۴4: U &[W)M0]4ԶouӌLf0WfPEU_6.*Vt~ k5fol"nbmRcI)]0%&l樫ySe2GlqA@1*-[X2t#8:u}f1 nV@uv8f &-uhmb 5a /b1DAWSQiѳh} 0$D$hUU!D*(ٽL<7'"+ >&4VdE2#ӯ"MIW.O=7PNv)D)5Xkz{u>La n'/vE+" Lwu]* Ft.Nw@^Qye)^¢Ww%I< U]pvK-::૦h}udkGvVATd3/t;/@|{0?60:\u 5A;5ch{;&225 4T4-3-EE*b<νX\Q8pDE56A|x#; #i ѽ2L&cQ"1(,9mBє8cD8@>nuPvDz-ӫS'=;)Asn-&mZiOycpzDh_3W}s5Gx5x^fUnL',4aug5"kRl4}adj3gIvBz^˦dW.fk~O W؃z5 z(zv8n_8j/Q7Ĺɦٙ$:Kx\NpO=l1>7>EK(6]P9^+cν/ I/U[3C)pOo.35zX8PuV}ʤ'̟/{?g#+d-<XHVSpno&0u3@FF}LԖȳf_y|)yO+CŸ''/Ok,l'^Z@_foO{}<X{{9rKWP}tdQO1O0П^J/ YO'LLHZ;e-ԙ =wiZXI#R :3'OcO2&CXydEF[*[ fe w\5A?Z%sD]k l:G#E_QAx Эk}15z ʶo jU@VSh#A3[TEYЙS1C8 SjNǪfUF.`5/*b]́Uzhe Qm6pd,US*ݭ8Zhma[c)'e4g\e^;S;S/CpN>'Ky0sחManGzDqJ1J'W3CK✱X٩w=վ{![1E ǖc戓~lչA}hg2<~v̿{ 0\hOѾr=9H5`|)qt-|>q냑7_"O=S}.e<'/t>{Cl fK-RTv.; MU{|;VElK$ű! yihO2#{Xl8Ŕn(ҥiD?\7(h?Zdm:G)4{GW?fȝO`d6}nB|ma[}x5ٓ$UƟ==lYx}-r}ګzߦnhF#, 088< x"sr^)Mv7nWj4 zh122V24M⏈F%6fSd#iSSȚR2&9Z''O[%U)P&Vhy3PCnQ~+KX-s9*znZ#2|`UX9cK\FG4^/jnFvlW*"wGty׬|/i C.&DvK"Z9׾ $2ZMYQ!B&f2p) rd`9vU [ T!%Z\$U3 &V(blf n ǔʮS(zI [K'1{qpS5+t)%P"խ^Y P3 މwD'e 4 )2sHyPP7NL-.qii3jEw&tD=V9T'e6BZ zlƸDg Wѣ>w{.w[؎"Q ~hIH?e, s3TXh)j*zv Ly粄l-5rJThyŷ5#;ҎD7(ƴ=#82IE`aDP^f2TY;ƌ^$F!X-pZV7VYvJtriWy  QKVKs(0\k79&# QE;7'ȁCi{DC57CȺ:WeB5+]ϊ]oi*}ۿyɿl_ W_O8xf%*:ٿlE8Gq U 2}3&|Yb//Tx;c'` 5C?YSFV' aԏ;[ሼ>yM1rM9L"ɀOcɐ;.~~m%] \H+Ϩ Qū(`UD@CwWޱ9Ɛw+4YYY&wgUyﭥύw>wG2 wb|gKwWWʦ V+*pzRʹFEzNTp˜wi+t%U^Luv\#;EM 6$p in}C{=@ cYne-)M U&%ͫi kʑVuV#PPF. H5IҦ= Thfz*tB>D,6@vJnV BX)5:{5HecP CO.Dlpz)Z%hU  <آ X9l G|e6MԳ6fR" Xj%4/DYsBaPcᖨn BҨJ$!zbhD6Eu ۇv^}080MdjiYUA- [4`j"Ev3!5ӭDW#*JuFPXp*۶Qn(0FKU Xiߒ{͑Y)/r,Q,wU5C[iڤH)G1B@ZZ9H89+G^0xэBt(ycChtO^FeMS4av_p>?7{`Tm,9V jtQW٬V8̥ڦD።(du~S!!E U]C`n=Hh#D=oJ$}I$/nƳxy]=YYL93O7JI(kj) Ps&|:qdGt#ONw~sNsytY6 e5S-n *S&; fvĬͼ/'mm3Ee0js@kkl2Ue8V }iif +0)BRCnGDx2ntdC\$PeB*)O֟߄|=?W1tvT;a3?Onzf6{fr&啭EыD$TstKzW]&ؼ$ g^ehpJQU\JOSKﭪ4 i1$BQP(]{ASv(>">togez#+x5ktYqڱaPN L3MYқB|'`ЬrlVυ?rz _ ՏMzv$ e2P 06iMH橅y:4{< s:jhܧ=ɒFXjq?;#iE r=Eݍ/9?!C#CP XrS s'+H/a>5Xx239M7+V/ v٥ah0/O=I[+G^E}v1}Ey~4t3W gbatCkϘi$\z*J n;_zgn}5lf.js|ME.᭒nfN3x3c)ѱ ,HvS; wQ:kd"qyֲÚ9(-W+R}y) {8TQ)DVG랼662!H]y ebkѠ;R|zUYTE^x Q$T*FD*cP^8T^+b%L:oi 5UΒfq)<$u}Բ( ZשvQs 79Mu3ns$,Up) (:ОdvC L =GN4i $oDQ lXm9mzfl|!!m0c \ݢNؖrz.Tw*ٛn7aeFEП{:0>A!'p=9&(ݬj t|  *jiph%"g9r\jO[篎m_}iWz8W^"7^d-bY xAQHm$]1Ϋr ԩ6bx(l )0`)Җ$4ǁ) A\ YSȁ\~2 z71(  ̔>B (]։VWx%Y[Z)8BgydFګyh̟>6T@c9HTm QBrKK^d]FR3O+]$ɇ\fjUk)vЅV c‘pt-~"jړ:.v DH)ZDp&T}.k(an;;e8\PS`8:uLHK`4pe^I{ߧoǛd:go>?.G?M'WWc0 H+>] 8g#Ϋ`gF2(@Gڡ1 tu3 !1,_ǾKʙosl3qf* kl3*C qh}f l/I AN ?B+p"GsGq+~P6 UE ػňϰ]5Ҏqx|v@;-?;Yo|vɛěs=fUzd"dI&$'ЯN,"xu8czLctCv!V yo9#N^N=fn^Nm>D=o"ij/Ov(ތN<s =OV8CnvA/3oH^<ϖcw=~gj8 帆N֚G lˏ-(𦠳q}$[̮HB6@#j?]b TDg[YwU*{oMŏmg~6 Kղ vSN=AJHS-nUd(\[,1- n"BUY튈`QyN3l!-#j)?ˣ'?:Y>W_w ~4\Z?=zj|+xgnnC&P44nƖφ"Bu wkq@}ёUYءrG`) ,O{zjzUMj*^8҉k {V=k25Ƅs>j~قΣ%Su*[:Evf#[@ b$D#d+Q2I*^9 ׋Gݣ٥pGx뼷i3TM"M̅fM "x'G?,gv>۞W^_ъa Zs/@D\-"kJl]˩7_?u2sW/C}!}2}> o-30]A!qorN/lZmؠlnr&C@վ n-jcЇcG:_E+̑mp:ph!4Tlr2g k(˧zϘր{4D8 ˳`gS(? ^ +ܖGp{u://=1z{؍ojy{{}8q'=,\Irˑzк6p(@8>%7cxhmx`+s}њuܺe lm2֯osieu1$ I{ʭQ$ݚF8Vo 0WWW.L1b.ThRFX!.P&A3 @+)Mî)cIl@` QiF&FCԊRchnDŋͭz7w_C D9Zi0Dh*IBfciie@!$T&V*ג^\uQrf 7uXq#kY(e`(׮JFi]Ujr48(brB h1p}CNid7d9U<U,48A҂x=UAp.8:K-$e>d n`r8ʨ,qUť"ߦ5˫͒tH-O3j^ /]T r4NH` ;" uUS3zIW\hvH.Ky@GvvPC-lԆ4xn1bk {S+nm;=j5Q !NJ8 o/&*Frk) 3(!u6aVPxO ;eO$bZP1fQ%%*2H̢m}%kETFE0L=+9Ϫ滈DžK5*ڰ !&=i] ޳i57t.^IzFd5n%FƗ68 RMmX"'η3[/8O]@C7 2Fu·j^XVߑǤL`L2v-(Vk7M+y]N]:oN=D#d%j|9sU[!,=؅&tj2X0̻;"{ep4ޜS|1p*;G44cM[/8芥Qw}oOwgG'WQTǻ;7W: ~zhʊ@U;e/h;Up]|~sHN 3@uϏC-$^L<ےߜ ӂR\j F}4.5 vO}16eM8 5TO _sex)z75Q#=@=`EjK>{<<"0r&›-9w#o> E\L]b_Ro/iT7Aj ՙ"3c} ^]=*-kEoΘ-|xkpOWV,~f \V,pSck ,(TԐ;RfˡZyqi_Y[[䵕Q$灰7\HuT=Ex%I^ΈB+$$96y3 Vq=u8w8ZxiJZ ٭t[6,j-J1lVNtpߓ6uuRIа3k%U2(p/zs(A"5ɨ )kF%9OҐjb&dZb5~Rjլ)Ne!9.C햍i.*KVϩN_a?i[US5M$Q0=e8^͉JmוR2C:30\A1/2(2>) qQ\*'U}[XEMA!u0i™bd5K)iK#A[Ewθɴ j(Vw )̈3DnG{k+.w3xtZlqiPZU;JJţ=ɐC08QNLC0<™Fd@%Ź,@(n CMi,pӀQs.wod< =-I4ӻNne{Vo$5u; WwG;?|؟XL9},?k pQu-S=ir+'y6-oJ )JA2T  3 `3Lh5ۑ)[.YJ2eeb!MBTmF9ig@]W }=n,gx%6HݕJޥBx>9Dn=#peu?M 74|-/pX#zSTepe]U4whUc`E0TWb„!qU%5E,ܹg bUbO=ėKUD$],`Ūq4,3R4LTM=2"RpFޘIS^ѣM[c:ֹs0;ti\+LG׼RL猵t~;ct28_,O~v;LO]3n-DZڄ0x^WY8 {ZѺ>DUUʲ fUd W#T;8TH !3ОߑSiHO Gé<4[L-g ׻ɏW1r9 ߎfjB -I#ݣwas[Qo>Z07gCpz*}\N#eڐ9yw9oq166X:&+})PD(mvOvE/uY΂O =]N?7e۫g?YD6~KGU+ \[\-z_޾5۷W&zkSVWF=ʰ'յ[Jx-דuƟ\*C.@1&;۷sӓF؈H$ ,V*_˩~gn/^@; ת򊙡)SM H~AI3nsZFT%qjnѥ )0m M*pnm't9e+T%-+Օ[݉UNJ*n$Kdu-ՋQ`a@]a -PMTVs%"VE,SQ SNbu5UԴh1)4+JK4a5UU= Wiֲ﵏]I]6.J"&MKa-{¿j'J2er^7jJIOJJ]"2F 2!u 2W/+QR-Ӗ",Q] k7OX{Pj> _'>Q$S:L[ޙe#}h:͹`#^y"]GU&zv5%9~ P[3W!:tJ=mu_7Roо.RL! J7J񉩰xD7%$bLd#{"%DѴB3*~0#tSySgشEh򉉨4B=k)p.fٓba9;/ߢۯ~_P_ip1#iXtgNڔ˛H??X¯/3姗+Tf/wW}7_,W |oMtؓ^n\`oM =vb>qx: HzĄ2|dGl\ɔ^t V ,a 5YF_|3ڗI+vz_lIӎ@W֪7/('"ز g܍gh,1s6?_{3 =fѳgݡ}tāضDYWVGhdvB$1Ȉؓtsb?6y_!vw-}-6~ϒ9H~nA.=G>s3{wNPe*.r riL_ٍ~|wꣻX^_;{6{}|nq.{LT=7ɆUJ0T-y®j_ҍ(Ldr2Ft9H["SIc~i{Nohy?! @ާJ)¼k㎒ekYS+͢J 9[P^eȷ)K$ǯ ^f& L͂jfp*|=iaHqجz#J@3B/C3IKJcwQ'(;}+Vҡ%+ 7p[۱ UP JD R) gR,AUR"ղ_g:E&hq4kZ0&u("*@Teoˀ5Dv 7VƎL5^94Q@}k>!k&L1ݓn3 ĕ G+Y:' OB4۪a#k9$ -80HANPՔIV3B6(EWr&.& o~"V!+)ӌtZc=1Urg6v[ kwq}k! NBtIعUr5n3SƋ~ԿI>~0ˡ$"%F Z`,UQ (v'vzxw3bJۖ$rtiC^- QBaYmO t; k#G;7+stS1A Ma 2tO׎l:BSQL*H؇*G1!tSٶ $(8qGEoH:(T[Yᙏ-i,8HU[F*'=SFA_r98bNz{&MdP\1Y##hM9V 69=NɎDfaNx$ 8'p$ML8^h'07o2L{BÙ;a|,~*R+A|nplGvaJ3c 'ЖQUlrX>>ogkNb({i0 p3$:SuTYZ>5 +م= ׵1),HNI\tj^zG*pѨ+H"VkVY&Gd-'@ ufX o} ^1X b ; r%A7Ӄ1a:Yi<ߟˁ |<#3g''+^/cn}_RxHPo/BL_>B8}꾻p}2"b׃x:3jh{bx[1y5Yj0p<"/\=W,l2 Y<Ӊ gB8$cC|5TW~C!NݸƮ}Seup=YE8EŞESX톡\ 7Ft_< c>M&M⴦/k=^5'x <f1R37Ѓ'@||)sw=>]3Ez5 2UO7L,'ildq7kzm҃kkw&}imaNP1'Lښwn;u.vC4J]J ȔvwJZd[pC-PSlyVP剢yyLYHrDN3r )Ve0JRÌQ1mL>+׷1Nq$A 렑"1^ Nہ=aFwKb؛L=yD'5>' )SM&G=-4khm˻]mЬVy l D ;B(eۛTzs};ΰuJ &Yyح,mqҒ-tOLP4wy W#Es'J“3d- mZ҂Ir9 }Pn`zgdХ힐1 ]KbK}ScycyoU,M倖:p Xk/cUJr6Sfڟw2lo רAm`Cd<#)T+R.[ωRNYEiZX|Ю~EhU~Kv1'$Ӓ&hԤ 5nas:]ۉ4PI1b]m`S4:2> N۫Jt<>*6i"]l}u1=%I*eUG^oe32ᔌ P%L,Ih<0_ ]F5DM7vw?ΖGofߎ¥j:oB ^[Q&$1:Yi U!G܇\|レFx6(seaq΋Y BY?ЂFw]\/ ]Ilx!1MC^d˥ v튧@+׳b+[e{^kdq PK)&z5bEU =v)tC說{- sAĪU~o}ulAc\JW':x^O#}~p;rܕe=mGz 髃Ob㞯hOw#7TylįWt_zjUll{(S+Se ٘fѾ60~ d<0lj6 gaKKoP<bUm .G:e<c/g#; |مJrS!?ɂ[}jwە?}Uߛ7dGH?K߻9s{힫I n~n_Z\d&o%>^$O{;X^[_TLc?;̰{Mx5Ws#Wvǟ]͐&s#5s H`I$jVj+r\eS~9U.sٮ]ZyTq¢~# ,p4E$v9Ť!̶JX&$ӪzRN7=fke{ZAf1Had3Bꦧ%:߹׹ڇd")e#!'$>6$MRu!7p(-R,\S/HBREm,)< -%YѣVI:^M Lh,3O֋[I(CiVD5 d9ek1uV VM3YMI&% fKn͒((oE Jv$}m 1AJI?.P""sHsX) Pi 0a188@ZJ52ټJSdZI0Ӫ n^ta8E fRgmQ^I؆6ZՠOO|~YG"r3aܴ$?%V@QNTY$Ӭaoׄ1dB1ҁDTrG* 䰲l8R%&%cMt#ei ωJ5S{JkIu <#C 7&Ȓ౺e׸68dv9e/gFQx%MInWm" \cYU"ȨzjT#K7W %E3pYp*d-'YY<ۮB.Rdi,$C=qyxG7Ĉxy%uCM)qMrQOF& z[(rhӜs*C9sN [^M5 7Z:dיvVe  fh\W􋑀4Y.ritB5!˫i:DBgtfEѨŢP/JT+# C0et⪮rǓ,[b"~HN3뇁1_̡۱~f׷z΄NQ4^d D!ZtPNsfaR4=09;«Ugq0_u5wU9=;/{^G7_,C5BzEX˃@qѧ@WC+^yK8 Uz׳z]Gӡ-.}40 $uLWFIm9C_L"Y GPm_.ڕY]ǵ@7=y1p\{nw7Oo\>;:C,UXH_agKo#U |{4ՕKӮ:INIOxm2p1,^uDDmJ#byg[-qG`&hRdZ'GZoGv [epsc; SM$tWX< 4Vpt&mp-1 \XeS։M` l6TSwxq0fz8_G2zeb?OrVXĪ*^JMeO1&F5v/%Id ZAJd5}ȿɘ O@K H)RRo#*GAC/zq2ۮSXĚC7U(1שGȕ\941 e6ZB"Q6nc=rb 7Jx{CBQoiMIGu@sn=jJ)yh{"829GHspE"lT -ǶJQUq7Cی! Ǖ1RA ؒyзzYhX[x+r.|}yhH6#~I(-f}[h!ӝɑOgp}{1w)ͽș=sOF9Ņ'>vO`K5d=LD[ɶ5 M9t8t,E.BW1S(0` 5 r--PEJw[9tYeY+* uף+뻞OLf~kV헨N+x+X0:Jg LI$ w(#]I@v3%:0/x=\Qm2-ȊBd볁YQZءeê1r6Z:VjB @<CY[orb% m=k~qyop="UqtăeU(pF$-[Lyz<PQ=nGCoFS!Pg9%u%;TK3\Nh?k/>Sy8]N}oOw?gq 20ʟR/{7^LC5&>qov? >x1vkTNPuH 4˹DtGj!fn,m׫r&oFn jc$ׁ2< ^v`o};VpHL ȗLPo@d}~3>6~z2I]q?>xsGgx_󳞿#x;ٸw(|8mw瓣/oGHj\Aq;0t,+]^gpB+,H ki^LT!o@I:9"~I`T9mHQ4$,I2p"Q!jƮhE]"ݑz|3 R*z' eĬݒDTf(DcU/IDǟ|nt؁)v`9d=v: @ 3XQ~4@҃-mybs7F>L3 Z\iMh@ SBJg"۲'3T'; 1o Z[e%, J \b AP$_tqǿ~W6d.=}~|w.bk<>GqcZ>x-gV5iǪerot|ltzu 뫗VuoTr_"y%IJ [YQJ}._|x7ӮqK_ ;㮼ry /~ x%WsWǟǖ(˞ZE"99`(RT, N05Nzf]5/_ck?^^N.{=̥fVeFoӝAmHU5"EsN!Iv1wXGUk6A[ajN3d3r)<΅Vl)Hub`H^t4 %4R)H&̙rje41KS =(^LQ[d-5@SD=ɂ$Ѧ{(QZ6?g>j64 $[dne(,V۷VNl͢Z抬 &MO3"YRV緩zvv)=qUþ0HJT4]B" 1ƾW#閇IAjmV-63F )RLY"`}j̲ |aeWя^͐,Rs)>@1 yʱ79ASuP"4!\oAQyJSf"ۭJ\HM7-^ᐊ,` xlCCSD|kX9]t<+ {`JiSp )"lۮJ5 T&X<wT+(AnUJJQ")"*)$j[qhb.Ʌ:z]z!i4%G62+[ZiZ[&Ү3~ 0.CceT6O59Sq2kZR^!Hl)j <VNjԊBR 25ׯiJl64|,px>a}1.]3K$PwSBv)X -'$Nn7ȑ H2t+*kF+XC{,ۉ!jҫ]Gw+8 ̑G<Gvb}h2\x4?y g!txɩE'p)?]/._&^$Ygo/VWۃp_~2 u95FKt25^MuRds6`fZـ5^U1  'JmUaз:oX:hVCVMd(b&?.,5;{<"N&]@$OvۯQs7h$n0[ hucM?Ϻ3JS=e㪖|쪺v)hnqd`'6խ,R캄bmy{"HPSн{ř{kæXZM0)>k6x|x* (Og!&!`@Ytj9+3<4 G?_^e./?v,~y4yϧ,8/w'Dy}"u VK̓K9%+؋P-AN|&hpb,ٞOgG qV%c&P>`VH#].U_f|qlrh@9mxŸrϏT:IHX`^Z<3J:a ԧPXD=' J"wmGG=aDV2cěh/ɡw냃5" lol7>Ƈdoܰ%o|I(߽尃*v[7f>XDg];_ ?m\`Dqc0\߸76͌ƤZJc>5%U4<;hXa[ L:L7rt8e{Z`ӯL(mAULL (r9#Z') dZ[T |e4:N0өڋL #[BZe(m;f^WM<{UrBԴ 2۬x4RI*\SΆ @GsdMSHj/-jAJ MUgdt=- nҾ,{'Ƒ{,ɆvaMk6܉gVrd-k wja!' vl4jK:P&Xځk#o3͌ޢK3,5po"(B/vt:|p5kRkUK᩷FƢ6nuHe;^f.B2,AoiOȒtH kyRҬyh0 ]g)k thsjX+L0+ڰt]=5Բd3HۃfzlaGL*&MV&m |@ߝxE霧0HRhR=1box߷vԿtH|klQ L5/&J3p,vS𷷳˗;]Ow/Ic $!8.[W`L㇚g#ҾçN12K8cD)5lpCQeBseər޷VMHbO =F%S6Mx@ v?Zw>MR{]ce=^%F~P.闫o9=Gϗǟ֒;>ThVx浡&2 [BuC]wc.'jbܼ1Mčק#, 53ܘ%רz!YQb2 ~NZ Lb"N2 91#u4ˠد,Z c{ԥRCzfZES)PaU]rA6t&fBT´+ݹ [VC)j2 %P2UJ LDU&^›$T迾I•o==P?ҁ?m=4>0e꿑<FHAˋ3VWLwщw ӝRxZvQbg0SNƉz{Sշ='Nc3 =d:]>4m9? 2>GêqvMX]4D%sZˎljγ(2C թHnI$s_wU+iWD a\/QK4i)'˾ dt&_m)ya]ز?% h<_& K ݁Yi\%5R i5CM,Q Csq'[*TxZ!Ki]PF˱/'\|u0?'ܷx?6&É~xػφǽ&UlhxuSyçnZֹ&%վ4)ĻP\ՀQ|FT' OɫEķ<=mB; Z^F}Ycq}p |q||7>=j1-r:ӽw<=ozq|}"G/s/cs&=G0qly;jWU k^"cr:wDяsӡyH6{'/WYH5qM%ڟ}tɽxqvrXy,pmƇ;0^>y(\Dx-s[?o,Rv,wp XEQ$Tlr;dƉ8~p_Xrrs;+lWFx)V3$*y]HRZsd9CG;d#9O@K6l <+OcnP(UH9UB kla(qo$ZJ*"+J d%++ =ԵA;."uWdY23h"'H1*5>JINpʗH>*7p(P1ZY*H.ZQMjw!AiaHDRB%rVd9+ZN\kՖR2d g5Pf0xҬ,YɨjMӆgeȚ>=I,SD5 (-Xct$u:gE=WR&jYOP7lrD;oh;o(b`/IJ8ODRTǷVMWKմiFQTSd$8Epr.2ͪz1h55%vj"Y*ok)V`)pJ- BIpzr`$j'R2Ha*},"u˅f&4UfNE]>r/XTL:y--0L'O'%7旯w'}39~1?tQ>/1yL^۞zrdSݡ$m[TeΨdn !4 !gePg#)Q!'Q;ŀ*LVyV?fEF%*s<ő2Aq}U&oc-ָVr|K)Ô*9QլE:yõ-!m@; aDh] IJ"q3٫&'zF6ALA;ʠnRp!AxH oIB}!)҄aX9o2,w<^I4UK ]/VԗCL }mE87< h?>{GC|x0guh]ڔN{uvx{:ܓ-jSTnn<=ҺZ \5sװ/NCyW|6¾p ev`"~Y~8a/COTrr|ybdn!ǡGx Z`߽ 3ݟ}o2r%Cs*17f]zm|;\(I`)hz5 -Jmg &LET 1D1{2lVC5E6`nooOv'٩YEK +)U2I<3(=Ҡ %6`,bQ(մ%3]7䶴K[d)DuZS"pE跁/A"iL cQ4GJQ`P¶Q82' 2zmp-x* JƈRJrz9s| 摑?: CUᄆD'+R^KLլ)}kuWS: 5%U$a Nid"#mITp*CIsn²4&rڱ 2EA4 YqPgEلy)QF8P:MCNU#^-r%*5K\*;) XtCsฒ~.ѵ6m鱫MrśYj&T+d:oc0h˞d=Qvk"-&110z_x 4Gҳñf|H~bDG1{W/wo{Mh_ڒȁ=CG0]t`F{sϓlՁΈ轞/ʝcOZvj7 4,VlS#)=GL:׋"W'1}}h1vɝOf_Z\nKمk Wy9 z1P_ a!li!e_xup\x6 43} nXLlߺrEJߺsvGGU7~gx|#DwNc7no~0 &r¨ǬMCnm}mgnz1v/KD/g;>+#5n1h0(à6 :ĥz^ UUH2琦:FWͶYE"'jE]\d/[|Q=ps}XxZ;eAmRRE88hNM25 ũ5Hl}5ApFq"8y."s1 \UHؐe;34p,' 10-NLT8 |}8=]VgdbҢ6;mD]xstQtdw+dr ~2 d~Zes9Q$&,-fb2Z-(v)'$z Usѭ!t qE0K6RP MNHhjfD9# &Qᣫ$q`< p]5S<-8!h P'--WR3Pj/xt\I2Cog PIEB mr``r ZJw8Tqh9I]Uc'ەu!nG&)zH0*#t-/W#W;@beL刱"() (NJT b%Bb3HaK?Jz A'¶=]l:Vu&%ըEF&l+E/ H4ʚz('=10hyO cՌ#)!5mQH(ΟvyOyQ2^J&Rӝ N1Ley%C M(SےTlE4ovλVP9d׸v`~{K+Y??ÉotOm=tx~3?FCzqKb1~zs|>,O>/wΖkx6uH[T5#1p; Jq M7_HC3ʀcMUavkD3G_}YAQlfx F$ k/Yj}iJaCF[jXxF>4Y3](ڼ'3͋Ya:uѭmWoQkUAj@ ӝ|)mmHSJ410~^#]sN7keO|DŊq zfYtkT=zBr@Ql?"ζGAVf{O ln;e0XНkKYgY~î5}/SwG{䫳;.ڐ~O_`zh1x1^O9b*oԞlwVşz~f.m ` ݥW&+.~u<1|SO6g XzwheO֨'3WKS;-"C@ |M3Pыw#QO@C@! [g8b$8vN.v? C, j 8 `D1wAVɹbm0#{9쏝1Wta>ݿǗ'O7SO,}#؇&6opk}W=7Lz;TФn޺1=8nBnk''C~PD(vx-W[u_c3$%Ep zEh+pTN GH$,-ˊ8NV|[9_=UKi̠4l@%.$%$mRby㌧,ٸUS"[eM^O ;laY%ɃzԳx <RV˙\|ckqưjac`g7 ҢhK#Q(.2E2*)WJZN k.مbvVJKKFQKX%k9WH$Pa5w6p(MTnFx-b6ۨJ#e=jإc0 Pw*&A1* L(n^5 "!5|W)ݵ^9v֨:$+Մd´ʦVoVQ $ L(Xrtʁ]m!JAf.QB*g Ako0S i|`/slO `&Ю@D ~bx'8,2jke- ˆf:h[}4@tfj;] Ǯxj)j=oO{? ^C2xvP϶w"2wy1_·'Ÿ^Ά'ގ߿:g~dOh1g@.R"V5'E4ZM S(ZW<ٰ Α2cUQ\ax[<5mck2|E䦢. cK$iX!1eiBM!7rbUń^S@ɇ=pAT'Q<3])w%ϝ'S?־ 9Q,n+"loAK1}9tl@G4έc"2"r!vGҫR'1O#' CE/AMPzqR;z Zz_>x]> MjH՚ޗu4&'6 8?\>1jo~z=W$+7VWMwۖWV]C+t!w놯i(VbK[h禦=7WVcʵy$=+++2 +צ}iux;HߞF5um#ckmu.\Ayr;Z@(\n%F%,.fFpJ@kD9GamXsk@\=:73*qSz{h9Ѫ)QDmZjoTsn0FYK4ܔթ. 04D .Up°U-8YU14 CzXS(JZ\0Q54`qZOd*v`m`iU2GKI$ $VOltC)KtATkh1Iv6jaӀ+d6+ V8Q=eVFOB!p1dMrUVPvNK$t]$\ )ĉ8Ԥ4Yʀa~T )Y@ ݺ8\@AW;8 \҈^Ikx$*@˼V![Ez n$I| DR22 g/kWgLҖ#- _ qXkjZjk$GFhlb RI&X62D N!,ZJX[`gu,WhU^C{̗vZ̒vZ@["EA u@:Lgfjl 0#+*2 z`%'v4Z|!X]*;Pfη3h- Ug5wqP*ȑdxmt*WR6{ [FfqS/ 8هթKQSRVD1j$=RYOY^`<Bi1ʶ`I RMPBÞuގT*' >j1x$L1u5xDDԑ,ڗsE< pW'K߿۾qf~4e| ȁݳݡ cr'2Αg,gFvlQp~&i9Qr feqΙ}y ߵxtvhSv4QЂ71mTl*%Uuw{-csݺBL]4]KZ 6dE, ^r"I)PUhVڥ 2.U]x/#?^Ø&TIP H{TԺ m!*I}k& $bAy@v[LOǓFûgB3ւpٲܷ|Փ>,x; 'Мtw}`p?| c0Lk!y=ugدG˫ ?W^_C`dSG@('`w}7ǡ"X{~\'@3KG'8"P; u gpHvv0㟟V$|v,bߥm̀zr8Yi_6#f9>~yyY!l>?.O/g~^jrL13z1wql^wڻϢm5W|Woh7W޲D6vmo|oPI8U#+S偪d{'ڼ1k+Hl0p:%'eVk_aUtI?@ xlVa<-8%DNV<^-tڛx^"InXY0(;MjT)7(S@[Ӗ«_'ցZT&RI n"5r $:MFTNU׈Ӿ˜%[?"pɇalp9Z\["ڐ痩F^c.p!A4Q LVktDf:uօvlB%@5؂ ~ R6 eI&]RE L\[οT -f%.IT=RXpţ>ߝ}h0Y&O|xء`E_^FvD}0??Rx1vONo>f><8nK_\i ։*߫y`cZt%@g3ݩGLY+Iҹ)]Pc˷ fA[0& MӭKOD6żpL!h9U Qs`^Y/̉Tgd&AԳ:c5-*S˺ hGdEbIB4Nƹ(zOU C!k2(1!! )]A"l]%NY@ 1s>O{W%Υbɶq,۶o_kfq|ؓ"@Q_=1h?ܳ?_|8 w{}= 'ǁFތ[0hF&/S:N>;kbח^<ԈyyԷ'%jƪk*'6oRu6׋9UqݪA%}y!^`ܫ}KhP5KVK&5:B-"/v"=b.PxzgDž?C5[Ugpiެ4K IR,TSňJ<2 Z n{B1H] *,Rwz*tL1swK??R(dO}[}q/<~8<2zw:=7lgvW3Wȑؙ糣;ԟNN_^ly1̿?s>4e~ptɟ.~|pO|k i߶2b 2eE0(դ0A A1ݞYf\;ֵgJaj h%9aN5KSu;ZТ66dƄThg5V̕|Ѥp}?YH_ooC{cgB=w=G+C?0hSoҞ3t|t'O9b_.m|{> {FQ{D6Ṃ2dʵ#yMi(QG\YeYg7gҍ%OܼKM4wKLZz˓h\mg{Bw.usiE߾^ÕAZZXY9,M3\Y Q_p헰Jol/mp4nSQ< v/ Y2pA7 ta␎:mմ+-`*vQɁ.)SKM0PQ-pW=iDpnPz=`N<㵔gm@sU [mg[Xtlg; z8:"'BgUڮՌ(%rڐ9"-ۃ={NLVm*NVr-&Mَ&*YNb$ır6KπJJzAWsT 0E =5 !Z[M KR٨1v3ѓL+O5Eq_ %ic"PFJ7b6-q$ X=;VPя@ PլeщvoF>)B7*!$Q81 "HDӓҕ"%1(ndh*%0U,ݩVI&YK&YI& '_'z HlٟRd53q50[V޴`' R=>CbuCBֻXZLq(v.vjA a6rZLdFDsMdb^,HMK !ֵd3X^r VĸPg4VIL-nN.tn$.LMfo&Ni ~?nn\̬M,O90z/%ZJo*Kd 9@Ng)]jrm@Y.츥kZFEc`ZJ T74fPP ˶۬ҟ='a򋉯g[=w}>G{÷˃N7;c0TOvg~Ox~t|tkp'˃y~~58`z1~z(89[<-fOώ-h, @K x!m^t\,iDL E-WJRU`456+։.;LAx,$TA>1a lUYt"ۮ&ǰ d93168ؘnBR[Ri )-گݺ`\.%RYL0ˠ-kf,3TZNn7D12]+;)pҳwS#`*C;-]-uD o.&9>;ξntkCqPvG{ 1/m).}}@M [''#3juo04]}򎯘vj~Ili|jxEx3ؗ}cSD<6`O=n O摦 St="g#+Ўc/=/F{>ż/x1wb(i DF XQx0 }0 ,0Hg r}oGyk"7Etl4VKw%gfҶ8u9`+;o;ۻ_bw6W{71+7=4gb+7V"\YZrw,X_^*NXb]2YJ 5{7w{KO[9;2 7Fw 'L#p4VVnN S +7f=;Ĉx5דu˥] "NΩ'w9<9XbH$$A )"%Rl\. ˩[3}~F&d59hmc($rB}TL.^-pB4@X(:H`Б{X-S)*RBoVD1G\"~oWh6KeʣN'1(H;|l,!m2:BEw#2gHiY"<̉ZR f2 hd%[V {Bj-@t ]bV05AUߑ>VK}q [uݚ-̐L3t*#X#-L5SrRPb*ZkY_mFC&݇b%~#Ul~_KjlrjX{\SbA&%V;TJ-]9r5eѮDfh9#P*C.̙MYe^ܠUu$ȭWVMsa;r%jRX3eiyJtrhd &I˖s,]*̚:Hs=")^ȢpQKd#j'oP$6.l)C42dmcBk)~\l}P@{~^qgd*ɴSc82y'.HA }Gt ўLr'=YT<FNT h##IU"Ф,9V V$ۅ@p o*Pgk}b odM!AO@i aJog@!$ٖS:(^OKȏٿC]gpTЮy2l {ΗD#mX5##X#Te[ =ꀳ"a[5Qγl^U7K WI]z O۪fKhS@3lw]YiFZR|{(ݮo{82b~8U|74G}3sệ3W??wCχ_Mp8~tlry;o t\zxpJ:ڙw.}i8r5kxL xk\6tt+S*:RsU]<ݩXF@;0EV{m~f|ْ|CI} sOpAAʛl ws"ӭJnL)M5s&UѹݩJhBfAg hSQ3-!Q ғ՚0hzQ@FȘ>xm \pm}*zawd6 * Pa5FMPC!=c a{T4Q6qGq]ʿ_v׋i< /W/lRǁj{jEd~_(7N(tvmZjD}d?2tz 5Kˮa(#[GȰųat莸B٧onS|7"=iIVl gn=L6 TGv9v9wv 1cҽ'A`c`=nHXT%CCae0mHD*Z%kIʤvMQ*E1@PIrUlj  *`'zF}]mr^FGef{8*S*ϔ,go֓RY$`D-cbS>;WAx.9Wk 5GI޽ <ѣ oehY թb7;th\(hpHVY?ut^hbhA6 2nnRA;,Ns:a?>-_( }\c /&K#+]`UMSp lQӛ g:u.j4ƚm@%cJ,FޫI> xÕh= Я5f$l@+dj@3r&h-g ʛDlM!GuZ`USΈhO+2E}또D^Uѫljep&ӫZ#-m[f^c`U]R(=Bлh<>$4VNG gɉ$LXfsﺯ'۳#cS9w9_M*bIb3]s_D} Yh9Υcy:#Klqώ@:lQʡfѶXv.93o̾>%s\f@_bqx1uG\H2G'Oqh+XPo=9zC˽W_)tuBp/)uxLy}hRdg^l'#s[0s3SWGֳid/wCuzwv&$+> \ JsUK˷?X4P7{x5&'?V6ڭ[rk7~>0,״2 ~q+[[]7`M#5|oRY7;H)!vn4̐Gq@50݃N+*`*f\g:6鱽28al$ i~U)h!6Am)sR9Bݰ <mx \Y0M *sEk8Ar0 50AyOc,.xթv5P>0[lW#dJ0Çі{z1Eݓ4Q K6kz踂? 4'N\hJ qLsQ]EO{*k~bTO֢6p=2R*^Q!6K\9 ۓGZ)=qY OKL{p@g72T4A`: ]ӂ&p1TwzZaxhgp(p.M(oky {D#Y .V M[g!#rBl|rVMZJw_*4qlUd FU8[Miउ1~%ܳu-m;D=ϱy@mBe94TVOu@Je (Am<2݅T9p(PvJD#)@$B {~pq(g I vfJ&AቓeeTd“( I闷- $p5KzVCALKǧ/`GsZtp=lPPRN=A&]p Up *J@`sy^4epq<]xЁ-X??zx0_]񷗑5{9KNjȜ;~508p~z5:>oO}7KOCsLrh'Cgfhn-ׅw=,f&ct %qYSݩ8JB~AuApH((rĚyL݆*Uh%o.z\.׭j|Q3%}\C:]Si4 H^E4Y ,px֓)*i.[S}Z7'Io?^O=rm9:8&|I$2Ctf-KVB훃3ҞD:><m;8$ub-Wm%~ܛ|2P+&N|9#+8ׇcg}}&rd94#@'Vڋ)Z'Θ>|uƾ} HzW{O/oGy~wۋW«h;^_XOݹl'4gd-Ya.)}9 e{p2d?2wþJs/mܛӗ;C-M~/#}8+V]Lwsw9?~`wiOuoZ[k|ykWkĖܲ9b}哑J.7,HAM~f(}vc{j~vsx;t(WWVƀ$F1 8!AwUWDv  >dx4Vbå~2c~oz~ }*ki1DÐwvL!95D#ԫp%4 R2 bhX&C4r~ #;%7j|(N14i$2S; :QD\)yY?4H Q&:Y=܆9Bܞji#)4iİLJز/%SPSEL'IvIPw:a\hc\a9ǃ%FmK|dr#o+dN0݊ \2-oR@EcLAZc-~}H FN[)R2`mܧ[>:ާzqp!M[wJDhy&P"?FD̳SV$AO#>Cu| Y4MYcA!J@]"T&UHL[Ln]r.d)N5פ&?q)( S/˅%2Xy=Iµgl '3/t#piQ?W.'HLT< |~yo7Tx2Y7zVngiYU.FCC<_MQHZI"2_E Q&:$ `hݪfnMEouD-kq$[٘2y@y<`#oYj,)Owm(M SR@ʃ5M,Ѩ"y gCGYOPg:5F>- .{fTn`VgTfo6&G˙g3Il6>?@da"gb? VKU/oDZ3V~:(YWגSL{9_꾑/]X<EoUU 0W|{~.sr<2} hFϣE4^LnO_ Q8S.Éx쯘%e(Ss?m;?d?>x+xͽ. }8+Bz;VOw8s*T|݉OA+kg7Fg AC62FMWtam(o%ߟ<[+""q=_݉^d+_^ih? %26N*Z<{8sr{UݝQ$ޙ,vwf b$Nc~wgwݙG&9ϧ}-Tpz1w8hhrPX5DSU2Ѯ\X⭢\D< ;,k9.` *H =o$SP2ح_q2mCeqTcEEA]!a*EH,7B4f!th$ J9Aוg #Hh>҂NSL1AaLM6kZW5}s"[Ǭ9ţ+DDt'} ia,!1'CsM[k6lt;fI;\2M5_yaF߃ g@k̀k=n8` Q |~)-z"HSwZDD+?r̰&-9pA̠UW5J MF¾?5Y:5 N&M_3soNB=a߭\cht9J_';g~SIdKgSG1!#WLy/OH/s""hnT$&89HҫUxgph-!Ujp>bNf\fH[7K`Nq}@UЖk4cX#T {$G}G | MϭsuY;vNMqg(b$]@huK2`W0X.,!}ZbCP+<-I^ڞ[?.?҂}(=Aghu#e ȝ97$:$Jy%~3~yӦ`ogg^,҅nۮ,x׳m:a^_f_\Lث'֍ Wy35o$s7@v%MzDV|]OOEߞV,?,/LWכhibE_dK|8w˳Ynpάy<܏txCcjb2xͅ.fRrӕ㩫xWit[ƈ k>Ct4zԓLė&u@"qކg?^?{IoRO5ڻtDg4&IԪ=^eՎ\%&[inD^._~fbzt>L[NPvwg7iwow Wy"ܮy"QYM}H^<< 7̄AwigJgRnkbtf=BL("\.1}.}Ôt\lMW{x 062o 4u7KVlsx9zj1vBSŬ"*+Z؞tQ-Q Q|:a_ ݭiLV l ooT~ 1|"E gm8nCہYfdTW"&dAJjbpĘ@*ͼ*4AU&HuEB?K%/LiY tZ2%Lqe"džD'c^Hf`1!%L3 \9wh#:Th 2T \3aηGZu3A\& kRe"8Wf &w'!ۻU^(,=lB*Z9TwA ?$ŬAܠcO`fصb>m3hjnh"rQoxVeL*T'[EU+ѝuXf.k:Sc,aKr4UTK7#R& L.Y@)RM1GrlKLꐄr~~ԎvYor*(bP [u zH *D˺{Yڐb`<.-ԟ'e4 ̀&2p]%ϱ6zac*\@z`ݫ^u+T:v':@:Mہt uGō!0mOZR*.\y97&qB"SX@40BZےK^;I]R{HzTvTQd>O,J?^.ҍp~,9JSX[Ҿ"ke~NNW˓36ĺ";~ZF)xe(fY-y gɪ:l>oIEq@g&`1sHلjwռЃL k|; \r>f"2P IA*V;>l3G UC/krP.^M \!VZ T<4QKڪFײoчtu]jkKcM)4yLΨ9G]wn}hi}?Oܹjc204 2xYcoၹޟz 17?|woKf+Tk]Jݬ9z9J`uVxEK̛d(2Yq7o67?iQda<.̑Wt/:;I AK 6]XM4FVJ<;ItiÓt2%I#æ_""]6,t^WjƜ뷇B]b|Ć&Տqb{bnaS77uw'ۗӇJ7ٯ/;wvc#,tZnlrȰ*QRk{(;X{gwv罽E|2MOv("v7O) Irf%ݖ@x-Gu n*{oD] )i8P0Zh_H7Yܜ@\} S>/x .X[;lA{ `3pǙA{hOA].PGO J'L Uiʿ`Y 22 9Ō`-S+Q1"ŚBm(p"8+tn CUR|bnhcV蜐>8G0Paa̰+Sc"RT4 JA5(ݪ*^Ŕ ,ܶݶ #ˈǡxȣp򲲊T2.V meb>sؓQim?0D+2966;i^bD [W{ ͮ`,"Eghлda9rԍ*E="VQa2hPodokD*Kv֣e3*u3:'],׎7 .Z3]jpjhWyL . Gx`2p=wUby5NU D'HH#Cu]*CEɐPK԰ef 6=lNhعvNdp"& %ãP2oHpڣs;3A [#D+k YP=[2,8ʻZZD_̐!C,Hkq ziTĻE߭Uy9%E~u\;eѽ:i6Q4`*I.ѩxV TftH0l,!n <sП-F_N^$_m[ toV3+C3Q>,"jOm¬x9NK4<&O`IdˇɅ?mOώV‰GέgVx:8L*, P(oTBbq\c̠-h6u@ruBth1Ɏm?y@bsdlTm_>ieT%B3 w&KvmìÎb6~]J 67t׌0+N1U.yX,)Tdzgl w՘}.O_:&0tc˜%ퟮs*b|8Rə?}qT /ėOvafh ŸN\}$cf軳D/dz zrN>5'NH'k&>&o&K>ٜ@\6-b}Û'כXg"'/҅J wN?Y$S[ӱ|?uo-7@1ΕΠAq=Quׁ}ۆu^@Z(-WY" (Oa͌NeƾC (ʮ]: ͜ Z*e_>ܷO?{T;w}tKPnMb&-@)mmU2 UfGڤ ;Z&ukݚjaSSKAȗ, C95؈vz"Yز,q"{)g`+->HrA@ 4O_j Я"v4թV#Fa+X?e Tߴ}yg=nSbm*c MfF^>n0_nYQQ,V/Xj&a$y^>ÀŮupK1`©RhP { SmveC>\z̶]bE ٮKj|S[X1bB@W=jR!m=]- 탊Z˚>\V7 .&_4թp<ݩ Pfqr4(ɫRdw%aEvA.dӧT'-xv f D́M(nJT;r~*pT# OnAtKPK}rt>Jebq2G8_"ޫV(:9!n~kRqRv#L@թ]J Trʶڪ`vNa@/U άE_0x+;A|nE[Os%@ ~w[¨}jqV6y 5: N"1BͱÅ" 24Rkj4`4g*%P/W(Czx#}wLIt$ͼ X#IuŖ'{ϟ~w>zx8+OgӏhCߟ1EpctlP*5r&=;v,$[ eОlvmy.5E, *|pX<.zR՘^Ӱu 訞:&_9_/O^{,b#ohJ~kPQ4qV+-g?_^ǦWRy?8_V׷?:se:HU񣮀"N|9 uWxX GS*:?W^ǚO>4Hp x|34yLX$Kx\SCzO'sˣ7W:^_[ز=&;QYDavԖ B:@TL&J|ϡٕ_×ooהMQT7_b^j+Rc~V⹵Oq=fsפ#O2RXrݣ~z>־^f8t*= Y'fJoB_S_-h!{ӱJS`l@e(nBnt *&uvpeG?o5/O$ RB1n~,6wKʞL}kdh C a$5 P՗`0mmz,*0{áBT{@ywsߣV젧/65hYN5T@ ^mSUA:Eq}MA]VjX.4nd C샓E @ 5Y2w,yjX;j@&*pgW`.t`ٍ {xCdF=0Þdf]W ٫$QDˬ09T.Ќ2$(5\R`FkjV:=.`ՇhC̑S! 8Cm^BQP,,H}2(`|bdνG@Xs `bt|<(p6v X, ;DlxiEi4/@f^";[:@ʻ ȸJe/Kf4n0ǁQZ :rܘԱVV2p#aYP, "רq&}[*x.WI:cЅ1ӃVdZ?F{H!zK4~[I"ȋ%gz&Ctx!s 9OXu_u٫zuܮ,V=_q L'= ^_#=S@EKςfW" xil,le]1 MΑgV2d;X+oY܆Z›@ E#CQfH#F=_I0LތN bbܒ@-qDƛHcJ #|Q N'jBρL?~~xw~yw4U wK4mSZfY>ZGagD\+8jPq)-6Ƞ7AAEtL(!0ԥa[p!@Y\dYz0!j/6 + d0X71;D+qO킼bf =.W v;FM kFjrq9=,߸u/Ӝ{Hhn،ʱ &|6tnD4eb_icV0KSpګ`.kx7S˜Gsa=K&ë4Z.WɑLcDv^(0G ψxkU0GOe_hOۋO/o7kԢ]6PSܻwo+Fc{ zoo-(^82Zo#My^ؿ4Z$"Do!RRPLSMRMoݛޚt:ݩϥ#.}oky,ݛHe:x-ג#Wr\Cri o By}PoۻK\nH#n֋n2:y2˃lOTE&۳k>ffT#zYcO\;R=Ep*.NVI5P^9kuEcC OUNSx1$CY^_\:q"Z١_ jvD6RjP$PuD$!(M*LB]Qę" iv:xh:)k(s]!Qe-0d,<*NmC"`M=ih`T0 DuE6O)s}d:MN* \CD+͒bH(-D=3xwrt׼28Du&1DV3FWq#jAF #;7+CT!VU: Hs !ӂ:Mճg.rX4hxyYTS<!{jdt-/)k׎QJ1;ͼΤnSv"R6)Yzr j+H9;J.߮ VUL0#F@`ԑD_4\*UtZh!"}-0WX[*ȒnUh(-Քb4RP *g8ڋ[T33Th Sv*\n=dEqLx[<^y9/8U8aC7&)GWF3TD5sbY[Nzj!RÅzD2#ERV6c[W8dZz!7#gZmd{RB *a =.ρnUA]GTܖJI 4GRebdCڲ[CKFw3XRrjjpf_s4<=/3 O&_Ξx?]̒B6ƣy|sXWw3/,􂺌V{Z/<[[K'ق'n-pЍT@RNСI9T֙FSdD>fd3q@r=fӡvi80Dh1pf< v%vY2O PۦR' U_ hʹ|Z-"08;<|X~i:}lŸ IK2TT`(L\ ӁL.tLs=XXۃ>Å2ob?0_YTlZ38VԷεSLlϿv4alϽ8ʫ1t9\7#KuʺƆ=YM l|$o7w_N؛dѽL!LǧC<% ߝO׷K)zFHsfn̖ =;Sjyq"#rq5`_{Yȭ-Gq '~xuzp1:+_?E 7?྾؞%Blc ӜMGUqg܂xQ'$+%ɹq[6| V">ŴUYW8 nb;Q?n4wurכYʹ&(>ٚvv&= = ;[>m9I,Ob=1QXd>GˢW"J4D*~+p.ZcSCgt1TYKK +P: F0 -Fgb` өLfu 9O< )ySK(Z7V>D-#Y0nG ݶ4DӦ YBhe겧#*˱L`R 87bFΑBlNq:=9IZK97&A]h\8n>Kv#|UT~zf(YckN!r |mcmCob9#"-׭**̠_:Fsi@>]?2#ޤƣ cc>ӂGl"0NL?3#g4/Q x,dpceʣnUx8u! h/\5m%{''.lQNSG`$osja-'@]1#s(4]u*BģA` 8|*^TrZfl":7< !s$PF0mHvˀU)h4@%H&Pga3BV2x#e{tPZ@d (zj"VY3L Sve]8 kV9_ni3aTR{'4 jR";9& Ilb#4 =-p (5H=YOɂjS06ICQp [W[ep_]i&(=-" y,YKħ`wpFfv~ffYpJ6ʓ%%`~N@+j2Rd0z#u_~5 ܾ4O~\ZKFer?~~3oLe.xR{9$WUډu"ȼ&Xtב yΟ@ S7V/#^$w1Ujld@6=5Mxd{x-Ӏ2C@ޔ՘^Rt#GL!vUʪvfVVwo&~\?^=g#BcVh_lz)iku[Q5 h1x}dEVKXW<5ߘ`{%hi}S< 5b_tMDZ@ ~gl'W$r jnd%R2s)|y&3%"mSB:ҐP\LfG][z &{gɞYz:PJR"p5ڢ]CZf%S-#(ޫ(\v}Fx)H.)JGAc057r Va:M'w)ʡx(8 Xn}CG=7fu/1D%a+S^hm]qh]v9i* bx'stIwZ,֊6@_aZ¡T~ ȍ1Q:.؅)ebXn!8TQBʃv>$t~XӋ\)۽ .)RpvZj>v7Ds2c -Q;һ8tGzk-~\b \] t>M5lзKg0׭[r= TE:&F:8kEIheFu-O팀V~E!qoHz.=G@YD'/#;V9P}3%w߾\^0B0x3?e)~T X1#JsEP jid'C{DrvH5\#TZ%\Q?3%mmA)bpy*)k!n5LŶ|v=99* mOcMa?D985|s^˨[󾯪6\Et`xF;X$;)#tVzO pK.e8q/О̸.ՠOCo&z3S1RLbG_I+MQGF~I~ny0?[E^`ѯ]sul'ms2rc)DUjz|8<سWQ_c$vRL19`꣏wB hAo?~03BW^T>{jƦY~BptѣgC뗀" |,I'l7 0$d{~`1b4^1x5s$yşEK.st;=y03&,w@\ʱT~r>_˩ = ^I]U, iƞX#35n$a=){ḍKTK8QRntJx#SU2հ)17Yȱ#@AynfRKSxR*1rhd:Q:( ]67c8jh_+ F*I܇k7]Y,jr$OԒ2ULDen4*Tp] }uCRU $>lJ@Bðm(T? tANdD j]U\+,W o/C+xj#DQÓTyԯZLЛcolx^r뛋?~5˳Oj<_,C{=A^V8qЅgT:T4RT0 yl~NS pT;Ki)ZË+;v$YzKC4sj 1H--vcֽۦۗHܘ$ZKS4RXVeUPZܷdӶl[k{+Fsw< >/~ߋ}ٿ练ߍ$ϝY.~C4CeD )0D >Ӗ  ~[z^сbUǸHhBv{/ uy?W$8~<ׇCgD 7#e&lu/=^y*Y\MRq '׏h ˱-$lx,v `d##B,}z!|-W' Ez6LAÖvONjo&wh,^WưS(B<1 ȒkPՃYk8\}xK^{͵%>]84{?'ԾРvNl[bˮvrozN츕N"Tb}pU-#ӭqnݽ; 譻B'y͈ߌ֝1ԍi>piݺ3͍Gtl<]HRb*K5~&"#Ed:amAeA }s )Ej5jy6+,p:` MLjl70J7+ք)B{z]&@e$5Y止CJ6Ou[r؇]ƶx=AGY =j@f]Sǒ-#Ӏ|s0Ym{Tbe )Г ^ |nW];A H)dF2:psCbݒp{(`Ё2(0 36NW~&b {<;M: dp'*![`f&Jʅ6BA_?!Q odc=Ct~X`Mڮ 'AWw[A4R#)72K d{U[ѭ *XB#@ y y [V 6Nv d{UI\pA' 7x5™ҁtQIGLT-+S!yQC |+u'%h3gpPj׋ oPgq.ӳgpe2+ހVcIvNY[X#zQ©c NNӃ\ϲhi!-,Bi [t$C%N!dI's9g[Z,'S{l%eB5cr= Mu%-b]iZ.v⫫p~f8{ <~7t{9G G@ ]oVF_:g vð*`-Ӭ(G}KqCZf(3qH+LP)]"v_a9Ӫ̼pb&e4S`b`m]LVÿtքzXxszl{&BGuӃSgcG߯F'Է} ;;dh+ 8]j&:]ؼͩi ^,5)xs9VP.5dGKu;z(_2ޝ9|$}Z19y9DZ}׳+MO_|/(}< cb%fX51fToFfx w 5Ҙ77CnjJ=P7*{:j,U:&U'~޽3ͭтlmA616c77Lv2 ?LR$61q -l\rsσ}UsJ(9e<^Mf,%t M@q vy Ӗ>n"b1̘{Anj`Z:%0.M[ ] < DQW@`[U Աl؂06x5i0 Y@N Y&o%\XkNjh|%7Fį0R;YUU"ӪZ6q{1 `w.`]0'Z/q&/97 5gsXQ,I۰[՟؀0SK qi XaWe~K ғY:QObT=ē3j  =0KzU 8UX报uChYu@֊aҹM :.V\j+Soioff2Y KV dZ)xu9I󞖂̃k]BuKS[iZt`9bp eu–H#ѼoH 4x9r]4 מ!WЙCObw*`vtNC;ގmAtGВdyL*Tmz^3w+`hٷǖ,WgxF+k)vú>+[6 &A뉈Cuѹ$c'M~gL{T'ua$~JQ;ٙs-F>R'ai7N z\%:8/[9Žlc&)+B$r]ߞdx._y_]:K/z0TlCh4Tp9M+Sh[c0B1%|l{WL"vaxƆQ UW&mhws~d7ˣ |6|:y6x{v͈wh=;KjkgěpnCݑ-( Q&t8B܉EXđ.u9Zxh:q壩9>9Q\EloΦpkn|/7Vf.Ff$XL#hѯV9ޯ-A<ׯSXZb2 >Z^+8z!G`zj:WsH]/ɨ74O3h L@՗PT06t!څDȍ6o1-; TFvK>S$ڥ`􈁚lGi5K_Ļ.0XZ [sJEDfhDe&Z TttSxczlUhieCBµ('쒭4|D6w6^տě;2-.GvTۻ:[ ;*XUS*25nMqH[@aHqDOG`O d;dO@إJ~qvE"G]ڦEۡE1'$\]_J.7Gќ~{j u3vM~Fq!zέ[jru0?f$Gu@^en_mNoPNbWigNS+n]3 Ӂj/c'bNy28;~D*A̷S(3&:љ"ۺiƽX羼#ŭ-@0sG}Fb3PgO~u"ߜ4bobfkk+ͭYŘڸksc[[FH&w}?'ֽ,6772gYnn ‡}~8,Hc8z6I$]ufA#1ڈB8.u&e~S6BI҅iJW("8"N׊$=#]V:fK%B^fا\Dcn_G:+'zu`*j#‘hZc}g!}gK.:G$WQ=,ɦ;,?т2BF0BCjܹ󌒈bd$B-øAr "Z}W _%Yo/\2IA 'X+dHtK&%ͳ^hE0s>D{s4\ \w"ݩ:RS$Ze[*Մ";4MA@U]85¶UOp^/TeBMY1&ppVQf,\#F%rL0C0E2=MoҜoeW-&E٥{ G*Wr@Q;%z@Ղkm~| 0 XgKP.o[^-6Dd O%BK +9 AyiC nAE;ժԠMؾY966 uwPjwy ]YXJCah@W/tvԝ`FHzn)c_'Z`w?cE;AԤ+%bQ_=ƛyr<&E{` xk=aepC7[ c}m7ЃfYM8Uо2A8g-Xɀ#@ߥSfjW)>1wNP(őrx`ۀKUr-~䷵ ۍBvw' Ϡ4vvY6EdoEُ$eߥL>xDofc?s_ZȖm™S*{˯ƿ?\>~3xtٿ^N_Naoor~O_Y[ #$ `ٜʍ]=)Os@AyJk fX>V $\]I9*%:cCV6w(C D $˧#DmܟM_>|`Iqc4*2N*ati˿$DE0d.3: WBp 3!@f$F5r4?2#6O\͜ z o.}'_ơ~81"%r^#Fr&n]Dtev4YNL"2WyXohͿ[\aoͦ;5tS:}IeƁb#'٩' _>HInEF(H}_H:Kݮ5rSOC-jD?GM^NCInYϢ?݆V0W!mGV LXl(Ex gx-νsByvPm~v/47>K-sSìW8{VcT}|(?x7[D9pMf N"vs󯴰1 -wߛ؜GO0~ [wqG71sVF9UнG2k]e{(XbBpkG": kJAǤD䩫"QX}f,!p2Ht*^Tt.u&ZRΈMz"b$(a,%I*ݞk&HmtU@e|P@Qڌ*4_yEhbzM‚dh/9&8Ljj6UƱcTH)<wY'b#tQQNUC6ŏkyZrpU[x` _|H"-xneY-zP2DߥzU]+^ sCX@erп{Hh.(T1eU.ܖ>5$^$Qy<)(GܠQyaSyYe}"N`ђt4>a-pI{+3gXudbKw.| Vmco NA=[Sې 7sΐ% Nim:D6zD)Ui+G7OjF z-TN2W@JYb9m*l^!Öm(ep|2OK>#(˚P[.-~6k*rp%'b5WBs제xu&ISXfh}(:iks?i.Gͼ8xv@J$;5( VF}fajuniidLˢuk-f2  NBu8R%,`2/M@ WVn 4n]pFC! 8XS,y| R`p[<63ST:8d1$Β'J~"?yZ":/SڒḏdCt`l6eMש''9|D:f=W0hY7NĐA6 E2Rhu hp{ Ҟޅ`dq8R:Ǚ>r8;x̭=8=}Fa51#bř'Qr*DNY!OvˇZ 1G =, N*f6/6 1yHC 逺F2:'JSEHD^ f $] R{~Ln?.>;ӳ쟟ڒn:R);dל+y4X"-6 UGHUS@@oţiLSIؘّ,=Z<վY,nDZ742yN񐆊iG$aiXz̃9q=Yτ+ۋB镯7GzvοZhΨgNH\&SC΢ {3 =MVg׉j/O'f~bGȷ@xsgD,KpW#4'8H 5|6$5"j+&rF'o/_eY_f'GX`)P$}> ӫ>\bxadͣWƫ ?3_Eb[TKXuMN旑 od_|׿\NoM#qkk^ha1w B[{D f__R}޽6$}&6]?}ox%׏$}ǟpfxiN===sι'{#$Gme ~m0'MP鮪_~~8&?wQ`SYU|qyneVY \ED2!m*I[efߒB9d8cqaZҀߡZERlޢe{@`^x=߅0LzJD92ަ*YݡdVL-vȋD^tvUrDimݡ%3$LActt[, I3Y"pzBJ?%"Fgv6^U ) sY趔 |A5q2+ЅHC%KS\,gjN#xKc9r%[%pl' ؛J= l+=1mTF C*J8 "MΌvGY2ƲބHW۠?xntSp"TNԤMAXXʍ= Fj6t NWstld̋U]] UD-r8Ny]ִ ^Ɲ ]-2;xm%ZV#֞GݧyϪQPѕs Z{9)GAivl]*D6^3{=0g〃!Gő%dy(~G kB48/G+ /`KuxC8O^ ̒lz|fhD}8-_dl[ *@Z}a.9>.!WYS\* ZWcy6 e}K$=Q[&V94|XuݧB6OMi+u8FbϻW5 x  zznh-Or׳ȰWc+ќ#[TT: :eɁqĖ-e*tf{J}N2G%}:P@p5>%yp^,%ϢYD?<}`|6;\}j~{9HwOwI}q9p/_VL=OeKr/ˈ;, ]gwǶ|Rz̎qo*w2&6q eيAts׾fbk)?}x}ս6g1͍[866ׇ!6 Q`]_[DvH뛣TؘQĭoL#z}|ֻO'6޺GDk#GCa; *yn, ro,@EASQoshk(2렶C*dGJKA CBASBdzewVCTvz=P*$U)<3t%qpޣ BUDQ(o$ND Ð&.(nhA`sBe&:Rzde# 1hc]U,b UBF$ tPrʚ<ھ1WQ`˹"XdC-1fo\+#{gAI -X vZWF4nin%5D3gi>QޑT$pei:} T{sRc<9)Mdm D-`JyǃKPoUZ'RpLN{*t>+l_N deox&C4 2ᐊzBX-QѶCcǢH>) E H!L6 2K->^u{lIw=)>CTp2ݔճ q#y'=0mcb*L(Ahaᰥ\3D%~ 4<D 1erAL 7lEݷi?&ѡ8=<KWsSЕtRh]R CQ(Z2 هL Nк°*N98IK>U^|6KgǏdRy32fޱ.??LO?"x)"1=[+rY)T'vNH\&)yTl܎ЫO#q>(4߹2V},c,)N5]^hX^ ؚ}ˋ?Z8f|69x7pp|>̡zb)v30}j -k$jfmb5O }a#v[{MzQdw'a$Kiߌ8Ry?CFe:#Xxy.]آM>I#g^L'}#.ngNMϦ38ݹb2ώ#=zȑ9`ȡ(B“4QX$_ڌN\|I&>|b;Qr:>$ gs?BqbdVѤ}:Dץ0ltfݚiNܻw~33c/awFzK hz g>>Odq~o`~4K,x!Zp(^egp<^xO޻ŧrn7}&Anl cfm6(0?iX_%: @1i*mlܚ&+h#{OzŭnMX'#OYW)?@%t,ֽ(.t6ݪ#-ꑍfҌ+t+, ?Yg.+M%-iH׊liEJqk@).1dD^'ڞ)n]{hI.2C,ݪaր^[;r6PY4"ש> &|ه -$T1B 9/RNzbvMamG(ϱkn,ȍ я(3iw [σ{s,G.٩zm:Q]@[7Zpk{

 0K4ͰtjU{< eözwJl3p@DJI-P,2&$ _**GE'۩VCZܥ[fQ(48 £QT&ݖtWUD~]4"v! 6qpȶ+*ñs@ΨkJ l{EHPeH99DS," yn ?G^F:v8&UlCCT]xTqB;2 imyJJXb*DP8Y0<ڴ*ۃMɯҿ[Doa[Gљ_ӿLuo=rN'QdgOoΘ[eJ^m8J]R"aheMB}5 x&N۱@D}6I$5?xPQ㮌w1 e uYChr?NOy/W_ſ9JO]b34 ,PUoqpH[3[=@%t G((7Wwpd4P RThڛar߉[' ,!: ,N-UIiQ Lcw}4U"_(.3ΕuH2]|}1~iӟ_ސJ[oB%DU&n>Fɾ"bWW~=XYC+$~}2]D#48®v1 ݗyi5G0:>rY: lvQj15N f>Km1Nwwn_s½FAT #7Хpl-\܃y j켿Zﭯ=}p՝7}issm2~zpkam}t=~l0y03 @5c$`DX5`0qxM\h!7n?*x-WsWvǟM`iHDgz:virBd )QZ*jke{[\*_ Q/tp GE;ĄT j\eMuC|`HrNI;A*xX/ d4$Q&+nn,V|iTgRYۍvF}(*&5oBXK*НL@oJJVv7Ƭ܅4Th㑣ӹN\3D*VU5X|kYT RRJ*srUiIS:!6zc<#NtQbPߡm鉆<=M>dYOͱE4XNbO"mu2]:7=ՀuV0Nbx5L%CmSVA#-Sw-¢XQU6WYUXe,"m  &@cZ 5"hT4f!){BYsU%0 lVwMōPmsGA1*GGP|L| T] 8ºBl v=),Qp1 ЕU]H'idr%YNB޲ )c5KRfdUTv2ҔUm[纉/TِvVUD~#[2lEI]hoNI¶l[h]kSlD.>hWCgGgi#'ZF7IATՈ9M]RP<|sx2hHt;`2YS&jNPP:U[ {*#Ik_HP1K*DǙĤKl6Ns+04WUW.1ItoXaHDTAѶ)̶> <S82YH0|09\g1z}s +uv¸JUUUtqڱ$8ϞI*2Lzm@wKlnhP_oiA&6,[ mMFmԋc}S'Xd=,G'ɀ2=5=dUfpC^\y(׼ FدV4o4o@ /,0W^y'cZ t_|LD:A v)r6.7]k4f,tlE(pلSX"qD^N,t}5D[edB8s7*>:37c=N«Y[*6}x6t^ $xOϫǯ^/>,8vIX8^'LJ_{Mώ>›tԙl}:~ 6ֺǭNVQ /{1XW\ omVkccJghgAij>75RlΣd<~puø//1 ղjfD ҧFa^J!&L- @&ަL3|cu5/pM'h^..N:/vƇߟvuikT dd}8Tܾ5ܹ?H]u}6ݕIY_G0*VVo8a(oO yiey!6Xh|q4WnH@[F.&]syIVW䕕[ Nv+Vn/rie6ޅRJ!euK f\'߾e k_w3ؒ:&H=3+b>ك ҀJi4mؘc8Hd9N"4% Έ3dCԁ4H!f5,tL>UC***RQ6 ّY BԑhrGJp,ƞlP^&'A*P6$.rH}@u,#%:TA{#XtK}^@ `GXFJ51$m2c 1*veYT#c[&꾴56uCHc@+GIl(So lɆu6BXI!t 'ZHP E_r}nR,sNTK2,Y` )Yìn)vgZRlmjoHD7ζgl%BwvIhn*\7{bk5aILaۖvw^p(UT bii!zD † UmySniOs"QNBh"VEƖu4%I[*29 ŃTU Xلh)oMK΀V9"*[uQ.PY@y= C`1TkH; FVyMl&W{] hnMjm#ضNŔutܚJQx Ust+ HVPЍ5"_bT;K[ Ue 8ԋQF89me ѵ@VIR޹0(lNO=56@Tl[Ю!ݤcR8}QE,eĸNAY2H"".e)?T}MMNsZw:#Ghd";oT ^4wSy߳Qg??_t}M2HTDU" *BMÇO`_ً&݉6zQ̉=GAjaZ5VCv\$u3E~3uw|!AFhL*k!z#v7ﻧ~&0~?{랧{U#*L]E8=}u 2 򼺰lWNƩ~é扲|&V]澪z k@96U>Y+ʵ%oSwG`bW^2‡L jZ=<=.'Kl/_W?}Y2D\` tOc3P_i6>=H{:f{pa~v>\?^y?~9towGOf+O'3wϧ3 =}wOqO2y?t']S6 RCvӑp1z;rr⎘vg7ƃvnGNbƴ=dغ>|s| c㽻wuokfPKD~T;ޙڝ[󃻿XY5D0ouQ,0CW/+LBiB޼ۅ+HϸA[`eiiDRƙx-גGvELrAcz|{WffU}x?a R7VB!wXYDEuVfnH\F׉}ǯ,lսWe>SnȒz-?LACQJ%-.5 cS(%IUh>J:b۽ICH,e3~ ) 0naچȸ1TheHPܶܕΎ *Oi /MtijLF4hV^%4WY 1q퇦m>y!MNMQIyI@w!{{/B[O5SC+fNm.v UM}yjo0žz;&{"K1ڱ OYiЍx *;ˮ4˚\ɜb]"[S13ꈕU]+EDK۲&շzIm}KnhN+S\'ReI5{6*R}z$,$w{,G`I<'bs]G+bsUiEb*O +D`D`n >9H4iB-V] S -{dNf=u ;5ㆤqftA{}?Q_g^YS^CVH򢖣Bn<ȇ}.[*;R-DZQl*`ʃplt]dl*W9 O~?gCt\\{^蚟'G)W_N jiۏMӹg`Z ^v~xc׸h|8ci/3G/'3|sg1s2nҾ [ߝgVO ߞ ' nF(g_M]I֩*g'j1D6Mpj9'Qza9Yg=&g/Wo]\5qQhW괻%}dc)DžG.G G_-.ߞ? ´ȯDY\|H\gRa0J0 GT- !T]$fxq0y Nfd`qa a,.(,49FCɲ>$AdGRd "Ð_McÕ WaGށ:U"yYF?C[15/ʭl Gq˳$i!cEnCSuH+>pЁ7\-.c,ʤ(l;\y)EZS]A&"21_w4\wOx̳H\kŮLz+r}]ER3^t%)+bm-?'\ˍ Wܒxm y8BVv{SzՏQg:k%=]+`s!!+rcGGR}SkP Miiyu:6Q)!*Yh|=F5$YU-t% UTw"7LHe6ý鍪D}c]mJQo*Qg["F :5;lh<yM>xT$Wۥ(2I9#Ѿh\:UeF@J.R5ڂ|ˍ |oTJoECZ[AT J}[E.k|(1_\)ac, 8ږv)ֆZuc>ZU[)6KބT vonۻp"7 h&UC`)BٷK*uu&M5ٷ+k[7Frs036!֞1:F7 WuY{ E0jx>b~vk\=)-k;i 9G7p=1 *m`?d[7v u]ь-Np z|3}K]1ִv___>YwngD˙ gN= Sm9T6d=E ߜN3I>r_ 2A Ď]zq`nXy9qzmۖ С3&}"6YNGV]!"*4GEX4]Cd)&Nck{b*'fen(\Μw;A}k.I"MBَڞnFԉȉ+gKL'^$ , Fݒ&t^#fO쿾Ⱦu|8U/& G~/Lw'd%mҺ D5>bhUNc?iL7h\暻G]~\ߞ}_^T&(?{[M^kP'>!ڿ\o >OZ<=yŋ_.Z Ņ}' 0̔Z a"D '($%#¨!O]èfcɳ$2'јCaq嗀mVF)ꢨP34nb?KM&lWš16!a?!u&4]ͬK_>8f eG\"E+ęceC}VzBV6dRba{S7N7ۂo2 ^D3Vj/0b鷷jw_} :dW5k@=16d:ƑEx^!g_ T$#]tlP=GQH2 vL1xz#RqYۖ>@d1T,m<7L4i19VK8ukE<,K_M)%Ԫx[dmR6s& l\{GPX$ZU6Q5l_5G_-M+|me,?%N6RƎ75frͮM.~ rI-OnbFJre_'UP_Weiˀ.[6qZT*k,Պ4'lUO^ƚcng:*Jmj w-W}M 0t"<7[؊=貱6Kw2 H]ݎ”;&65=#3%HvH~ )wE*%1,: <i۹m/w( [&]:oD)ET,Z*SOM]=J:}8-JUM1Y$eOz8b eR[%BZ$*f%uIYFhofaՔp*HF.I#,xje;],0>Tf6&J*XGVdY9{)%kwSo5_]Jͮ*6|NxՒɝCv@9w'"m5]S0d/[ ixHN@wۜ=Ip B.6ܻ }~.}Em23*6ISZՍ,wc0o|ssuy\Ek}8y0K`<ڳMUL!4EaGJQ:q~3&wi4s"W#MzGV$EqY2|Y&VH=3,2FD,eTCdWCL<Α*9v)5Q̹ԝJӮ-Z֟aguMh6a?k&eĉ vЧ,(Eqӱ;sI΢nzp;sxŧnXq8jR'TL烆I~~oFA*lw^[7G/+^F~&9x`w'7~}}x~}uz#7~}MAzrp={]p?{rǦB7E\o:Vj9 %f˪ݨ>?G]v'vS4&*]o{5K=h~oW._.޼Owgr'뭭QVv "S/~w -<gŸvQ꧟xw}0&Z_X#'b@"!'f w&g ' F' G ?h@yv '>ԅ1´'?ʙx-ǓF۪b˅L2d   Ydy]N-eVHڙ=eb6b/wnz./De~_j-é$(-ݑ=Rq^Y2ԑkR"VMn>䐇'/k ^29HHv~7v8dw?z&oVjj\h{>áF}Q 23yd-VPɁ2bh%U.o|$M%[Иĕ529NZeG'<, J 5X FԵlt@3Y Pd )L139.9 ƞ8B=N~~rz@NW>,%IC0ȡ%/}w*A 08,J`lYRL'y]"*[_O<qT͋H#}abI["óV@šD +۾8C36Dڏgbr/ʁQ;6`Z/7Űڰ8V]FdimAeDgq?lLc̞c}mD87G85i>4fM9IBeqruˬ@`Ǡn&᲌f/gGOXϓ q.>9'NF]st|zץ\ln.r~+y"nV6)G7*yo>677𹲹+B}'R?ϕ}8 {ݍyFJe/TLi"E/4`v]eL)؊*_zcb$"P;,@8削0#oiC[3U(z!=pr4l%֝Ǭ BoO5u U{|{P>dGB}XC ,eĕ; ( #]tITH+4E!ʹ:""L#1- i,xŵiA.8 ~q:_ɮ,׎#UZ.qPs̴_+V`^t0mFOB>N?dmk#*bn _Q3mI6'|^r2S4p_YzFNƁ&a z-aȣ:u-VRGx;"Rw6 PnUeͶ n8>+P:Нo/٧B؆z)89;}4J=ASA[`:;l!B>)2:)SAquG"T-h. G'Z}% ]a6 @f0-_tx+ " rǻkr`yd- [dh 23LBDa iܝ h.eޑ+{YseH/],)&ؼ1 J;>d9i[ʨ0!YޘYiA[Sc}#6nMB3`c4*C7dmɾ߭!⠥mۇj܎5;=%*D:l*d"EKς?_j,H 8hXfMb2C3S!*;x]zj5!LJյd@4U C!ƆoN.YϔT ,?BǙ 3,q8q$6ڃ^!wtvOeO.MC1Ʉ;,gѕ0Q2.v}kz&cΧ|^'3D4n;;0aeȕOyyUhy}xB Je@ظ9K#͍El,x9U67*G;#e.ݍcÖB|F4ͭ -lsu@a+x_OFkPۏХF$G3› ߞ! K G7hDvpӀ>WPqI4n'Xc#:QֹQtpƬ))Ml U rb[m@Ue'95%.tΰR18: UtyFY G&s%6(=Im# 2*"(#,TY#]tU e R9Jk5`*dWӷJ):"]Ď I3U#Y}^F*#TLXK`9>L5NLG̕ Yuʽ-Ww/,Arn#m4-Lp=jSڕyb"Q/"$)dQޚWMkuw/I5qw$?;[٢C*۫+$@;Ԭ6$ƍqj}X"lo_BI"h*cIG@%[ ޴--hʣPh

!+Ӹz+zݼ:qntZ뎉{PR"icx {EM_+Cb䡩o~RKOK7nk5qcJ6^7[V}pEtY01GG8cz$su'`A|_ި/[lóPAHY (1dug̿t Ԝ\[K.CeI``Jv** t:Fjw,n_V Q] O5Jh`y"3>01v9`[3"to^2tΧEσͤL>;팶%DSw+yw11|*91Ϯ-{5AU"BOĴR=IJK(QDtAbb:HcoR+B͛OYI+pl[+ڳzR?QAٰRhU>FMGd@ n͓N=O%{xW=6AJ2uu @_GQN|y9Bq;~RhQ({]LC^S}4ѫ1iBسB>Qa1nLuڟݓK/~9$x]Yj<қ3'lT3,\Ve" /Ԡ6R mDTУ_f'p#~s7$04+ۦ"ER'7}q#6z")$ͺrP**IMT!!D)ܸzV#qo5 Tx(P ?EI#!_PL# ?GMS E=ap-7.Ec$i6+EǢ] z ă˺e:ՙ\G FWg`/|b z69@^=J~:lO16r\!Å?;]/iJ[^9*}Px/3?+YՑ޴:8ܬ]YpP S!@n~#B!<4vglj*DNZys*Č<&L13Dg׾=t}#6)DD,h(*j0eB_iW’GH؀xkB3/I1qlPX QsV8ѡ;-^N4ĊweKj97Qo?*$3 ?WɾuH\V7#p[ oC'MjڌcmD l0 mt#EIc@yK[fO ^͊ w.K`Yvґs[ "5#h>R>4y& ~c`j% :˞jWwib0 o?_>?_o}F:2Ң QbsO t(EeZ{}Ka1$(_A5& >v,iqV4)F3qi ߀k5çRbSr(^tbBqTyA&vLNWƜ9hZ/|fVKA&}KnZvqJXV4-& E&2$)!iD,D9ɑ t|=FܻP=d[l}T)ݫ!0ҳ4 Es/@åj=9rHQ]%RپIc654,/فFCURX.7s<=6rEҿ2w~'x{-&A.j(0a2MpB(`qfDtg,j&ϡ[Janf4cIBHZ Bh_)KAa]IŨ4>9; ۆ-y 4hel@LhŇNǺxݝxqtǹHZuZ35oz%/wˁ>HF;x(1[a|pQ0Xq)]bcW Һn@SfJn6$ΖEôDRgER0)x$bs`MQt/ќi$Ϳ׳4@i{..)(龎*T52UolEr)MI puOĺxcf>Ӝzx?4$zP>5`&tU HvJ]'x%YQ=ca^T:)QGYT'YeQ`2]-"mxK шu/2d^+xބ4?4j':O[P)0tpd$fN ySvQ+TȠ.V{vfw%o$*UGn0Sػ(ƽoO6*: t' *4|h'G5T@J&SZ6;GCVz:P9eoEL7[@"w@Prj1jziG-op{Ye* wyT:L'U]}̌u!?BB)Rt&ؗekՊ/ߗus ^ޔx(" A1ީzrݧ$顆?rMX^_5=SL`uCʬ bv%@kj{1(udL/Z5D K|̣BY4dx8)$]sݛ x'p9~=I􅘈4+UZE~*ٱ φ"yu\kC [6ZK/RU_PfEpO07f{8d!oz|#~*{2=UkSIToL9jśw{ֶcTcD<{ş}/Ҩ/Ҩ\Wwc٥y|n*&~Й_22j)p6! &7 ωw/mz%v kƫ1):A*6jYBR$AWܣ;GzW@b }j !A^O$(זa#lwDkt^z>I~8"ڬ>k҈\)ٯGX#^Ѥe}^eR9TzPֻS 2s%tHPnQ (҈eHQ<9F&CO^?it f3b#9zmK.kʹՕ·w v&,\_>Y9msmJa+NڞT%vVFS`TMOÁMtշ;PR#ή&]eo -khlìT52 ⸋Zڨݐw9OМd"PIfsBwFüZ띺3);Z`TccT!ةS]g/uxdy7=@?}}u[.@Q#uZP KT+k'$(ݲE @pJ[^29\4^]()Zۨ7oܞ؁GZݼv׈+p5{yɮH:#jLjTdK:c_:yxh+sпẠ-1AN2b͛Y6٪h,+2zX%YӾ~t5VP\{|mxeڐhġ󽜲<(JJ5߇mE($@ckXaAn†ȮDDN?K9ԧ(F:M"ӁRt\:{N{b N|)/-cRI<fӘIf-#TaTKXv.Z:q9k{ڒ(ȶ!br:6lmr+|M^i[R+7Ҹw:3At͢,c=cΖ]$#z=)\&,\_~Eq@OBZ#P9D1/a6u;ڥzX&t>EEn[Dx))qXd^J{l CN{iiY?0KPq!W;D/Ф9d%Ǭ@1ܶ$+fo+ZZ}ׄ3;fI~3uZPν ${L~^(x4(})u[ODf͛L*:djY&y.]V撣:; * Y*Ȇ 䔛%̫H;U2`{uJw46\"_a་-;Gmu%cM]ilߠ25a;eBOO(n3Mwqcj?X:;hñhwf-^-刬sn$wF0Y&uiL"-H4A_7isNq\Pwfʂ,ԙǖ?J,Tw3%MV6FeYz&npQNT%rgMTKBܿ. {ZEkQFbQ Mfտ͂Yݤ榇P*Y~WKt;)Z}{t7 @^l*98V VsC>C2#L3LMo Q\󍫓Ahפ:Ml%4|qL7OL>tEi{nRht0l4mlO<_ TL8YշÿׇKZR4/כp>?أrFpgnXxx=z[5lon[hGVQ2U ,ՀPۏ:p9{ H'7G;|:hyu]oV w ~a7S\jmU?vN[dWcdI~{T&5[ks IDATCZCxʽңb9:%)^L-$T@1ߓs.?'Ef0CW٤/BA^o▶tՐ6z.tN~TKG# Di3O]&(4)rnɖù%~֧i5U6 4V_TMш #bzT7|L&ܺ %̈́^Ki9XN2*.xX"u4:lmRax.qS%/PHԧT12BTRI7<㲎9p}}=b/7>aeê"GH0bV=}fVMO1؍RĠx~"-ah̭:#2$L"HK@[7xVG> @?kR"S4iucH$bmң"#Bg[E*:" G9GV9\9v mViZp~wu(zjgg]ӢIo ŔH'SCE笕P.忺QkR&%pq;Efn; ȯQsHW=Y|Ao72fiԒ|&lo$#VX xsc 0q{JvLѯ1.ڠ⣪m{(VF0wO#~N4M<5et`oiiW9M|N&pÈAAzؕ+|$l߾(׭95ǶeAU ]L%:wSzX.vR ]tr 1Gaĵ AEG&bv?x=gFFJo@RlFOYi9H+6Nh * {gW;jg mtP mkGh%kOVęhs(Zdf܉>*D5~d5hmLGE]]:Mi#k"(z5\Oksx&t$g0',EɽlORxd7- =z]9$VՉʛ,&aREF¶02eޙ:MFWd^Mh8&`! I7&#ɤWM[,pgx @Coe~TB?q_I!4jR(6JfnwT!mbZɦ{=,™wlKR3Ï+&ꨤ+~)E.rntWNѕn(ell<0[M@ޅlʣ2Q$Q}?^]~*Kmd/m:tΕ=~H-e8Hۻ4DBl. FzRMZ[v*SՌ8[[QoLws#^MNi!X:+8':B җ=6fO\Wo6gw$Ov:e{,ɛ^t(J GjmJg{%?VPPAЁ[6hUxXKGAfG-]HMn ǀnW~oA(QjtdnF䭲ov~G@ڊ,~&'D3,| gx~o/&,\_PhDCcuv_dUj1Sɞc&2?B)NfYc!z5Z񚆸݄'N|>;ĩXt~:&3Jm`b~u1+o 3oEcILɖs"ARvˍ_0QfG-6S՘IduLgP4 %S)3ՏiG 孬̣o }X&4'c!;+2&#"%]Qk dي~*/`|7TFɴ@?|8sQI%, z_ʌs1gRau5:냜{+7zKiMxfL.g\dL%\~;ƏDN܂ۚSM1?t*M^a񋻰l:`/UvӊlސuStoE^X4M <źQ.ɵIf*vh#pev3L5` #nKͩT;,sU(P =hVϔ\nnӊYY$U Z_&(i{|Lvji}&I*/Yyb1NߞLkzZekp=ǟT k}ׯPϤw~*j(vt9}EStc[.XX !ݧ ? ={kN4sA\VTڅ4[L-eu3XtXVԙ ,ǰyK{ӯRD(Żxq"l DĦO/H<2 7x/Ac!qFd$>>(QDAbtO6Lj)}FUa#uQ`>Re^I',[WײOYvg0/OW6kfHȩ{ʤnaT!@,eE?n`] Ro5%by葘AQeuJqy/>}?l範so'7$~޳VIt06SV?)ݯKB8 dO)2j-7DGZ2O7jS?GBZ.I9Y56~S72Y5(dx~ fA_.߄.,>Io55B0REy`K]CYd#)^LyM au[m ,,?C>\38'oޕ Zا'[u{/F)o!IO+5\1hb\2ByBF"hk"5ڋ=gCe2>Vkz;:n9թW~D%+40?Qi={=դI[~C`zbٌ~ô-1["=k3By5ws!MXx*k{#MYbWIsf|v; P0+@YӖ}apƌ8li"c:MW?JǬ R&>/[%b&wd+ ڝԠC5mSғ?3Ax't?;{昲di0'I vT3ЦC-GOQ.$J.1thZДW~2Aq>49]Pwm҃Tg߶;ŏ[u~jTKz* O\S/d\L"\CMXcŞuze%(=`߾_Φ]bv?Vk }34ݩN-@Mzra"o> uDTz=pg^${DQo Pz׬Ӏ7lbai-W9Vi^T(%(w&z4w>ha[Y@.qPiG &gCzvϒ`F7P l *a/U8zT˿ !+!|kt7a=9kv g:ֵEiђ4_I W7̈́˗,hb sW q!nRXޖ膖d}-QM?aPOf]t67zvxTuF蝙y s՛~$/G oGΩI IR)O͉ک^ڊLnܗL J˱ "0RBl <&b€=ʩ; Y4 &}\,@uO)IzWSw/9iL5z za&,z#@+}vI ŽF0|w[zK70 {ϱ`V6}Iii'j[K(Բͽb0?[u)G#u\t}eO!tUJ~9_ǧOo[7S%8_zi1,8'us<֖SM'!'RKJƀѵ*]bDZ\8$} .F];K:ڶVaYI}cxC9UZ;-;1e r ˧Z~]۫NF^>8L#՜M焱qcЃb&EtpjSS~xmKI]u Ŗ6TA􋧧-8I6&:c5ִًAiXyu ays&,z&6wAW-)'ͥIGńRr}Pm!Q&N 8x@ p>ZiX9V 됢=yJe|qOCO|>ޏ@}Ahxi̔uwsӇo[@?!]h9,kź;B#_=rwB!+[_49@ŮʲZ9Ag'֨5/mZ]fS59gÜk_J xiPk>CtJYt߄^o}u#~ƿv2%3.Ѕ #\YV"GU"UC?v_~Gd94RFV4TA3A*jӨTք쾫8Ԗq8<_g1\3ȧk oh}Mtyk2nfޞVM3ξ$@>QX.!뛝й׀ %LTR_ȴTdžNDS ӛ~`~ˢ364ւYqJ ;''p<a8z'E2A|?y\,Gy|0G-B o@3ه",\k Q#lXJ.W 6WQW+f?X CTAg>#/:Vt 5-kR~*F b&:p$CxZ"&ǔ%=֮ɺdz 6AbQE٭@w;da|#yy辈z$s%כ@@S6XN'\gXڽi"ӖHL5T}"b<ɮ~kTL(:z뭭*x֒#$Wh/z>"oEc`7VקQwn#i44gz4|e) sT+(В^0wN,h=V*VV/Qw mi裄JpXVy:fE.щ+ZiMGI10?d@XV?/R'O`B9|>_yCW ]M>1= @ocwc>b;"wP ,liyjZY(AT`0F3#\p,,yٱ1Ov(fP;^LQ,6V_5M$- *x2!y)\3A Йsv{dY^1%u"me;8l% :PWQU'4W5z+*Tb;1sHvGIPfQ]kh)v=(=@HIIIk2,!{E^svNxG @ i;7aBˌU=PݿV^4- 2vQK^w}Br資[ :zM5H(z:cQۃ$H('S ؍Jv4F4e:W[jpܨ3>a{9ܟ U_x/;TrPGKêMYZ jB|PW*tf{u;uʺ38dRzh3H$9 h͓'Z]yƭe+'jk@qJ$oUW͇V ''t^N? _h% \StD>;+=<4 R[SANVzb(*T ݣnM<a$ +S2E+|rHA#Ui-ykup>~ <o>%;e[TTg9)ђ$2k:uBϒcBc9,):ys*b"TSВe*5/&4usd7)Y+]XK|'D g o޸'aXL072 JM35yVS]$tc䙚+Z|ܮ1UXέGͱ[n'l@VDɯ*qi?Z94H`& 6B#72HIn}a^;4$zD?=1brC5s} Kx&O`B6Bh<`ז=*l?H<.'hz8ׯ*󉮡yF@?пz ~OغYz/1)׊JNir|XSsĔt&F]n Ah%5{hϽbO1o~ %/ztT>Z5oxJr2F?V[E p*sf[4n70}D^t? 4{=x2MOpj͝V/}cAfqrL&#'B.H&GRoV,& T,OAS0.! q&)Uj8mPVd4tѓp<^ee4FfE%NןP`(d{0a(0o#x޿%:>T9ٻiO]Ylt!%Yz|7RNR &L]$CK8ô{< o*Lyz7B=Pm:51˗z.[}=Fr#*mQݒ(uv`bgz0ElM䙓ws2ns, >K5 k.6$5}on2'w$3{vS[pjKTHiIN@Me -ȓw<zr&uM3ydUK<o[Mh׃LWԹ_ըؿBb1nQ<PTm;Z7ZCT^@W{,*NCָ2a,L 4[Ht(}C{\m[{u|39D_ y_Av?K?#֨a7I~9i]wOu-qiZB%~N䤀Ѯʐ4>]MJ ؊ܾC}5t"*ȆLݛU>0'8%L&<ʭh9N 4*Eq9Oa4!G?T_)=l$f`pƉCYfx[n4&rOM)Fn]XA I";ۘXVz-r{qӔGFmU$eS[i0KSzRuWfGY_u?QoetH@HAUZ|(7rs ^DPt$U^[d'ޤNe:M<'*ŗx[iyZj1_$jhAsD.,|\G}(]PD30C{f3}_rJ1(AdjM榌)l|`7$已,Moe0@/'|s$[z`#[F^K8]ű&Ԥ,:1,Sk neOM^*oz|n_e6!@7);{VL ҆ *-՞`R,rK7ϠW枹VǢxؑ~ h}+3lTD͜T|_,/&xGG#oi897h2LQ qڠA$1oQo ª՘3⤼cھ-Y)\Tlq{aR+Й&)hx)%՚ ;]cSX`F7#mP3Fk]:`ImH9RENڟA?/ިII K6m H z]T )22>Rsl+GSZJ!G#W|Ieو)y* n8qutuUU1(ȝN|91 Hu]K4WSE*`RPHk6!pL"2}U$s=@ɮEF]0m嚛4+Y ]jt?V vmoh\A ӤHtz N-t6w!WAK}S~F`~~-:!'TGSM"!̍jn9]>I5FE5̵x+<%+-m#َg~]dGqz2{[PmI?]|i ͤo0v1og:J>سc+=}9|Eg>/ޫg.YpbtB + ľ6-"gWj=D1p=%D.!OdrͮJeEQPDC۝ R nU"1 (#r+n{dPR"ep>sc6N{_OS(FnME5עo|zwORAq_]5ԔݐGQXjC]:zC^Āk P3(GB^: K3ª& fN~XW{gJ*S)te(r['"e*ݎ̊}q8e 6%XͳhvqV-dI늞guv ?鹈:ϟX'2]o[@?sE=Qu,mgI)o&I,$qt{&i x9ErMrI2/ͦxKc|F.0N |Ӄ*J"(}wi5(#dd^8z4^h,15h8iMX" RA7m|x$4H9k&H^7dzDw)oDӠ $@)>tsi@_pǴC;>nOh13)2y3V,aM,k譱%9Zz,2GAq:A{]o˱-}W{$ 9lsI\=#Y6]CicWҒ1od2RqW/@ kO=_{? vd zRi+ceŤsa/w3/wj&5}t,^Vr%N9^)hn1e>;v4n<>>2Uxjx/Їy9Xz}bꩅ"2~x[T]51-WjjIN`&gltIt(1CE*2QR wM]m~{„)-ψJXNGt++y}_9p37(q&,P7 ]oO-V)$ӯrYy:7:%(t Tͯ,flmM)co>ruG߷un1zZm2 G82:\l˅K9 D'wϪc b^8/r3m,;޵+LWalg߻R32 cEu-:=wȣ!SeEtN6~\X\V2,)T#E for more information." ; "Atmospheric Temperature, Air Temperature Atmosphere, Precipitation, Rain, Maximum Daily Temperature, Minimum Daily Temperature" ; } \keyword{datasets} stars/man/contour.stars.Rd0000644000176200001440000000145413777653456015327 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{contour.stars} \alias{contour.stars} \title{plot contours of a stars object} \usage{ \method{contour}{stars}(x, ...) } \arguments{ \item{x}{object of class \code{stars}} \item{...}{other parameters passed on to \link[graphics]{contour}} } \description{ plot contours of a stars object } \details{ this uses the R internal contour algorithm, which (by default) plots contours; \link{st_contour} uses the GDAL contour algorithm that returns contours as simple features. } \examples{ d = st_dimensions(x = 1:ncol(volcano), y = 1:nrow(volcano)) r = st_as_stars(t(volcano)) r = st_set_dimensions(r, 1, offset = 0, delta = 1) r = st_set_dimensions(r, 2, offset = 0, delta = -1) plot(r, reset = FALSE) contour(r, add = TRUE) } stars/man/st_mosaic.Rd0000644000176200001440000000405614604601360014436 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mosaic.R \name{st_mosaic} \alias{st_mosaic} \alias{st_mosaic.stars} \alias{st_mosaic.character} \alias{st_mosaic.stars_proxy} \title{build mosaic (composite) of several spatially disjoint stars objects} \usage{ st_mosaic(.x, ...) \method{st_mosaic}{stars}( .x, ..., dst = tempfile(fileext = file_ext), options = c("-vrtnodata", "-9999", "-srcnodata", "nan"), file_ext = ".tif" ) \method{st_mosaic}{character}( .x, ..., dst = tempfile(fileext = file_ext), options = c("-vrtnodata", "-9999"), file_ext = ".tif" ) \method{st_mosaic}{stars_proxy}( .x, ..., dst = tempfile(fileext = file_ext), options = c("-vrtnodata", "-9999"), file_ext = ".tif" ) } \arguments{ \item{.x}{object of class stars, or character vector with input dataset names} \item{...}{further input stars objects} \item{dst}{character; destination file name; this will be a VRT file with references to the source file(s), see details} \item{options}{character; options to the gdalbuildvrt command} \item{file_ext}{character; file extension, determining the format used to write to (".tif" implies GeoTIFF)} } \value{ the stars method returns a stars object with the composite of the input; the \code{character} method returns the file name of the file with the mosaic; see also the GDAL documentation of \code{gdalbuildvrt} } \description{ build mosaic (composite) of several spatially disjoint stars objects } \details{ the gdal function buildvrt builds a mosaic of input images; these input images can be multi-band, but not higher-dimensional data cubes or stars objects with multiple attributes; note that for the `stars` method, the `dst` file may contain references to temporary files that are going to be removed at termination of the R session. uses \link[sf]{gdal_utils} to internally call \code{buildvrt}; no executables external to R are called. } \examples{ x = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) x1 = x[,100:200,100:200,] x2 = x[,150:300,150:300,] plot(st_mosaic(x1, x2)) } stars/man/expand_dimensions.Rd0000644000176200001440000000137214576033423016171 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensions.R \name{expand_dimensions} \alias{expand_dimensions} \alias{expand_dimensions.dimensions} \title{expand the dimension values into a list} \usage{ expand_dimensions(x, ...) \method{expand_dimensions}{dimensions}(x, ..., max = FALSE, center = NA) } \arguments{ \item{x}{object of class `stars` or `dimensions`} \item{...}{ignored} \item{max}{logical; if `TRUE` return the max (end) values of the dimensions intervals} \item{center}{logical; if `TRUE` return the center values of intervals, otherwise return offset (start) of intervals; if `NA` (default) return centers for x/y dimensions, offsets for all others} } \description{ expand the dimension values into a list } stars/man/st_coordinates.Rd0000644000176200001440000000222014600276652015474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R, R/tidyverse.R \name{st_coordinates} \alias{st_coordinates} \alias{st_coordinates.stars} \alias{as.data.frame.stars} \alias{as_tibble.stars} \title{retrieve coordinates for raster or vector cube cells} \usage{ \method{st_coordinates}{stars}(x, ..., add_max = FALSE, center = TRUE) \method{as.data.frame}{stars}(x, ..., add_max = FALSE, center = NA, add_coordinates = TRUE) as_tibble.stars(.x, ..., add_max = FALSE, center = NA) } \arguments{ \item{x}{object of class \code{stars}} \item{...}{ignored} \item{add_max}{logical; if \code{TRUE}, dimensions are given with a min (x) and max (x_max) value} \item{center}{logical; (only if \code{add_max} is FALSE): should grid cell center coordinates be returned (TRUE) or offset values (FALSE)? \code{center} can be a named logical vector or list to specify values for each dimension.} \item{add_coordinates}{logical; if `TRUE`, columns with dimension values preceed the array values, otherwise they are omitted} \item{.x}{object to be converted to a tibble} } \description{ retrieve coordinates for raster or vector cube cells } stars/man/st_tile.Rd0000644000176200001440000000223114166576214014125 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tile.R \name{st_tile} \alias{st_tile} \title{Specify parameters to load raster in blocks} \usage{ st_tile(img_rows, img_cols, x_window, y_window, overlap = 0) } \arguments{ \item{img_rows}{number of input raster rows (integer)} \item{img_cols}{number of input raster columns (integer)} \item{x_window}{number of rows in block (integer)} \item{y_window}{number of columns in block (integer)} \item{overlap}{number of overlapping pixels (integer)} } \value{ matrix with specified \code{nXOff}, \code{nYOff}, \code{nXsize}, and \code{nYSize} parameters for every block } \description{ Helper function for specifying the block parameters (\code{nXOff}, \code{nYOff}, \code{nXsize}, and \code{nYSize}) required by \code{RasterIO} argument in \link{read_stars} } \examples{ \dontrun{ tif = system.file("tif/L7_ETMs.tif", package = "stars") r = read_stars(tif, proxy = TRUE) tiles = st_tile(nrow(r), ncol(r), 256, 256) for (i in seq_len(nrow(tiles))) { tile = read_stars(tif, proxy = FALSE, RasterIO = tiles[i, ]) # write tiles to separate files write_stars(tile, dsn = paste0(i, ".tif")) } } } stars/man/plot.Rd0000644000176200001440000001742014576035610013441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ncproxy.R, R/plot.R, R/proxy.R \name{plot} \alias{plot} \alias{plot.nc_proxy} \alias{plot.stars} \alias{image.stars} \alias{plot.stars_proxy} \title{plot stars object, with subplots for each level of first non-spatial dimension} \usage{ \method{plot}{nc_proxy}(x, y, ..., downsample = get_downsample(dim(x)), max_times = 16) \method{plot}{stars}( x, y, ..., join_zlim = TRUE, main = make_label(x, 1), axes = FALSE, downsample = TRUE, nbreaks = 11, breaks = "quantile", col = grey(1:(nbreaks - 1)/nbreaks), key.pos = get_key_pos(x, ...), key.width = kw_dflt(x, key.pos), key.length = 0.618, key.lab = main, reset = TRUE, box_col = NA, center_time = FALSE, hook = NULL, mfrow = NULL, compact = TRUE ) \method{image}{stars}( x, ..., band = 1, attr = 1, asp = NULL, rgb = NULL, maxColorValue = ifelse(inherits(rgb, "data.frame"), 255, max(x[[attr]], na.rm = TRUE)), xlab = if (!axes) "" else names(d)[1], ylab = if (!axes) "" else names(d)[2], xlim = st_bbox(extent)$xlim, ylim = st_bbox(extent)$ylim, text_values = FALSE, text_color = "black", axes = FALSE, interpolate = FALSE, as_points = FALSE, key.pos = NULL, logz = FALSE, key.width = kw_dflt(x, key.pos), key.length = 0.618, add.geom = NULL, border = NA, useRaster = isTRUE(dev.capabilities()$rasterImage == "yes"), extent = x ) \method{plot}{stars_proxy}(x, y, ..., downsample = get_downsample(dim(x))) } \arguments{ \item{x}{object of class \code{stars}} \item{y}{ignored} \item{...}{further arguments: for \code{plot}, passed on to \code{image.stars}; for \code{image}, passed on to \code{image.default} or \code{rasterImage}.} \item{downsample}{logical or numeric; if \code{TRUE} will try to plot not many more pixels than actually are visible, if \code{FALSE}, no downsampling takes place, if numeric, the number of pixels/lines/bands etc that will be skipped; see Details.} \item{max_times}{integer; maximum number of time steps to attempt to plot.} \item{join_zlim}{logical; if \code{TRUE}, compute a single, joint zlim (color scale) for all subplots from \code{x}} \item{main}{character; subplot title prefix; use \code{""} to get only time, use \code{NULL} to suppress subplot titles} \item{axes}{logical; should axes and box be added to the plot?} \item{nbreaks}{number of color breaks; should be one more than number of colors. If missing and \code{col} is specified, it is derived from that.} \item{breaks}{numeric vector with actual color breaks, or a \code{style} name used in \link[classInt]{classIntervals}.} \item{col}{colors to use for grid cells, or color palette function} \item{key.pos}{numeric; side to plot a color key: 1 bottom, 2 left, 3 top, 4 right; set to \code{NULL} to omit key. Ignored if multiple columns are plotted in a single function call. Default depends on plot size, map aspect, and, if set, parameter \code{asp}. If it has length 2, the second value, ranging from 0 to 1, determines where the key is placed in the available space (default: 0.5, center).} \item{key.width}{amount of space reserved for width of the key (labels); relative or absolute (using lcm)} \item{key.length}{amount of space reserved for length of the key (labels); relative or absolute (using lcm)} \item{key.lab}{character; label for color key in case of multiple subplots, use \code{""} to suppress} \item{reset}{logical; if \code{FALSE}, keep the plot in a mode that allows adding further map elements; if \code{TRUE} restore original mode after plotting} \item{box_col}{color for box around sub-plots; use \code{NA} to suppress plotting of boxes around sub-plots.} \item{center_time}{logical; if \code{TRUE}, sub-plot titles will show the center of time intervals, otherwise their start} \item{hook}{NULL or function; hook function that will be called on every sub-plot; see examples.} \item{mfrow}{length-2 integer vector with nrows, ncolumns of a composite plot, to override the default layout} \item{compact}{logical; place facets compactly (TRUE), or spread over the plotting device area?} \item{band}{integer; which band (dimension) to plot} \item{attr}{integer; which attribute to plot} \item{asp}{numeric; aspect ratio of image} \item{rgb}{integer; specify three bands to form an rgb composite. Experimental: rgb color table; see Details.} \item{maxColorValue}{numeric; passed on to \link{rgb}} \item{xlab}{character; x axis label} \item{ylab}{character; y axis label} \item{xlim}{x axis limits} \item{ylim}{y axis limits} \item{text_values}{logical; print values as text on image?} \item{text_color}{character; color for printed text values} \item{interpolate}{logical; when using \link{rasterImage} (rgb), should pixels be interpolated?} \item{as_points}{logical; for curvilinear or sheared grids: parameter passed on to \link{st_as_sf}, determining whether raster cells will be plotted as symbols (fast, approximate) or small polygons (slow, exact)} \item{logz}{logical; if \code{TRUE}, use log10-scale for the attribute variable. In that case, \code{breaks} and \code{at} need to be given as log10-values; see examples.} \item{add.geom}{object of class \code{sfc}, or list with arguments to \code{plot}, that will be added to an image or sub-image} \item{border}{color used for cell borders (only in case \code{x} is a curvilinear or rotated/sheared grid)} \item{useRaster}{logical; use the rasterImage capabilities of the graphics device?} \item{extent}{object which has a \code{st_bbox} method; sets the plotting extent} } \description{ plot stars object, with subplots for each level of first non-spatial dimension, and customization of legend key } \details{ when plotting a subsetted \code{stars_proxy} object, the default value for argument \code{downsample} will not be computed correctly, and has to be set manually. Downsampling: a value for \code{downsample} of 0: no downsampling, 1: after every dimension value (pixel/line/band), one value is skipped (half of the original resolution), 2: after every dimension value, 2 values are skipped (one third of the original resolution), etc. If \code{downsample} is \code{TRUE} or a length 1 numeric vector, downsampling is only applied to the raster [x] and [y] dimensions. To remove unused classes in a categorical raster, use the \link[base]{droplevels} function. When bitmaps show visual artefacts (Moiré effects), make sure that device \link{png} is used rather than \code{ragg::agg_png} as the latter uses antialiasing for filled polygons which causes this; see also https://github.com/r-spatial/stars/issues/573 . use of an rgb color table is experimental; see https://github.com/r-spatial/mapview/issues/208 when plotting a subsetted \code{stars_proxy} object, the default value for argument \code{downsample} will not be computed correctly, and has to be set manually. } \examples{ st_bbox(L7_ETMs) |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt hook1 = function() { text(pt[,"X"], pt[,"Y"], "foo", col = 'orange', cex = 2) } plot(L7_ETMs, hook = hook1) x = st_set_dimensions(L7_ETMs, 3, paste0("B_", 1:6)) hook2 = function(..., row, col, nr, nrow, ncol, value, bbox) { str = paste0("row ", row, "/", nrow, ", col ", col, "/", ncol, "\nnr: ", nr, " value: ", value) bbox |> st_as_sfc() |> st_centroid() |> st_coordinates() -> pt text(pt[,"X"], pt[,"Y"], str, col = 'red', cex = 2) } plot(x, hook = hook2, col = grey(c(.2,.25,.3,.35))) if (isTRUE(dev.capabilities()$rasterImage == "yes")) { lc = read_stars(system.file("tif/lc.tif", package = "stars")) levels(lc[[1]]) = abbreviate(levels(lc[[1]]), 6) # so it's not only legend plot(lc, key.pos=4) } tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) image(x, col = grey((3:9)/10)) if (isTRUE(dev.capabilities()$rasterImage == "yes")) { image(x, rgb = c(1,3,5)) # false color composite } } stars/man/predict.stars.Rd0000644000176200001440000000166414576035610015253 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/proxy.R, R/stars.R \name{predict.stars} \alias{predict.stars} \alias{predict.stars_proxy} \title{Predict values, given a model object, for a stars or stars_proxy object} \usage{ \method{predict}{stars_proxy}(object, model, ...) \method{predict}{stars}(object, model, ..., drop_dimensions = FALSE) } \arguments{ \item{object}{object of class `stars`} \item{model}{model object of a class that has a predict method; check with `methods(class = class(object))`} \item{...}{arguments passed on to this predict method} \item{drop_dimensions}{logical; if `TRUE`, remove dimensions (coordinates etc) from `data.frame` with predictors} } \description{ Predict values, given a model object, for a stars or stars_proxy object } \details{ separate predictors in object need to be separate attributes in object; in case they are e.g. in a band dimension, use `split(object)` } stars/man/st_apply.Rd0000644000176200001440000000734714145541611014320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ops.R \name{st_apply} \alias{st_apply} \alias{st_apply.stars} \title{st_apply apply a function to one or more array dimensions} \usage{ \method{st_apply}{stars}( X, MARGIN, FUN, ..., CLUSTER = NULL, PROGRESS = FALSE, FUTURE = FALSE, rename = TRUE, .fname, single_arg = has_single_arg(FUN, list(...)) || can_single_arg(FUN), keep = FALSE ) } \arguments{ \item{X}{object of class \code{stars}} \item{MARGIN}{see \link[base]{apply}; index number(s) or name(s) of the dimensions over which \code{FUN} will be applied} \item{FUN}{see \link[base]{apply} and see Details.} \item{...}{arguments passed on to \code{FUN}} \item{CLUSTER}{cluster to use for parallel apply; see \link[parallel]{makeCluster}} \item{PROGRESS}{logical; if \code{TRUE}, use \code{pbapply::pbapply} to show progress bar} \item{FUTURE}{logical;if \code{TRUE}, use \code{future.apply::future_apply}} \item{rename}{logical; if \code{TRUE} and \code{X} has only one attribute and \code{FUN} is a simple function name, rename the attribute of the returned object to the function name} \item{.fname}{function name for the new attribute name (if one or more dimensions are reduced) or the new dimension (if a new dimension is created); if missing, the name of \code{FUN} is used} \item{single_arg}{logical; if \code{TRUE}, FUN takes a single argument (like \code{fn_ndvi1} below), if \code{FALSE} FUN takes multiple arguments (like \code{fn_ndvi2} below).} \item{keep}{logical; if \code{TRUE}, preserve dimension metadata (e.g. time stamps)} } \value{ object of class \code{stars} with accordingly reduced number of dimensions; in case \code{FUN} returns more than one value, a new dimension is created carrying the name of the function used; see the examples. Following the logic of \link[base]{apply}, This new dimension is put before the other dimensions; use \link{aperm} to rearrange this, see last example. } \description{ st_apply apply a function to array dimensions: aggregate over space, time, or something else } \details{ FUN is a function which either operates on a single object, which will be the data of each iteration step over dimensions MARGIN, or a function that has as many arguments as there are elements in such an object. See the NDVI examples below. The second form can be VERY much faster e.g. when a trivial function is not being called for every pixel, but only once (example). The heuristics for the default of \code{single_arg} work often, but not always; try setting this to the right value when \code{st_apply} gives an error. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) st_apply(x, 1:2, mean) # mean band value for each pixel st_apply(x, c("x", "y"), mean) # equivalent to the above st_apply(x, 3, mean) # mean of all pixels for each band \dontrun{ st_apply(x, "band", mean) # equivalent to the above st_apply(x, 1:2, range) # min and max band value for each pixel fn_ndvi1 = function(x) (x[4]-x[3])/(x[4]+x[3]) # ONE argument: will be called for each pixel fn_ndvi2 = function(red,nir) (nir-red)/(nir+red) # n arguments: will be called only once ndvi1 = st_apply(x, 1:2, fn_ndvi1) # note that we can select bands 3 and 4 in the first argument: ndvi2 = st_apply(x[,,,3:4], 1:2, fn_ndvi2) all.equal(ndvi1, ndvi2) # compute the (spatial) variance of each band; https://github.com/r-spatial/stars/issues/430 st_apply(x, 3, function(x) var(as.vector(x))) # as.vector is required! # to get a progress bar also in non-interactive mode, specify: if (require(pbapply)) { # install it, if FALSE pboptions(type = "timer") } st_apply(x, 1:2, range) # dimension "range" is first; rearrange by: st_apply(x, 1:2, range) \%>\% aperm(c(2,3,1)) } } stars/man/st_intersects.stars.Rd0000644000176200001440000000231413777653456016523 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom.R \name{st_intersects.stars} \alias{st_intersects.stars} \title{spatial intersect predicate for stars and sfc object} \usage{ \method{st_intersects}{stars}(x, y, sparse = TRUE, ..., as_points = NA, transpose = FALSE) } \arguments{ \item{x}{object of class stars} \item{y}{object that has an `st_geometry` method: of class `sf` or `sfc`, or `stars` object with an `sfc` dimension} \item{sparse}{logical; if TRUE, return the a sparse logical matrix (object of class `sgbp`), if FALSE, return a logical matrix} \item{...}{ignored, or passed on to `st_intersects.sf` for curvilinear grids} \item{as_points}{logical, should grid cells be considered as points (TRUE) or polygons (FALSE)? Default: FALSE and warning emitted} \item{transpose}{logical; should the transpose of the `sgbp` object be returned?} } \value{ `sgbp` object if sparse = TRUE, logical matrix otherwise } \description{ spatial intersect predicate for stars and sfc object } \details{ curvilinear grids are always converted to polygons, so points on grid boundaries may intersect with two cells touched; for other grids each cell boundary or corner belongs only to one cell. } stars/man/merge.Rd0000644000176200001440000000200413777653456013572 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R \name{merge} \alias{merge} \alias{split.stars} \alias{split} \alias{merge.stars} \title{merge or split stars object} \usage{ \method{split}{stars}(x, f = length(dim(x)), drop = TRUE, ...) \method{merge}{stars}(x, y, ..., name = "attributes") } \arguments{ \item{x}{object of class \code{stars}} \item{f}{the name or index of the dimension to split; by default the last dimension} \item{drop}{ignored} \item{...}{if defined, the first unnamed argument is used for dimension values, if not defined, attribute names are used for dimension values} \item{y}{needs to be missing} \item{name}{name for the new dimension} } \value{ merge merges attributes of a stars object into a new dimension; split splits a dimension over attributes } \description{ merge attributes into a dimension, or split a dimension over attributes } \details{ split.stars works on the first attribute, and will give an error when more than one attribute is present } stars/man/read_ncdf.Rd0000644000176200001440000001015414576033423014365 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ncdf.R \name{read_ncdf} \alias{read_ncdf} \title{Read NetCDF into stars object} \usage{ read_ncdf( .x, ..., var = NULL, ncsub = NULL, curvilinear = character(0), eps = sqrt(.Machine$double.eps), ignore_bounds = FALSE, make_time = TRUE, make_units = TRUE, proxy = NULL, downsample = 0 ) } \arguments{ \item{.x}{NetCDF file or source as a character vector or an nc_proxy object.} \item{...}{ignored} \item{var}{variable name or names (they must be on matching grids)} \item{ncsub}{matrix of start, count columns (see Details)} \item{curvilinear}{length two character named vector with names of variables holding longitude and latitude values for all raster cells. `stars` attempts to figure out appropriate curvilinear coordinates if they are not supplied.} \item{eps}{numeric; dimension value increases are considered identical when they differ less than \code{eps}} \item{ignore_bounds}{logical; should bounds values for dimensions, if present, be ignored?} \item{make_time}{if \code{TRUE} (the default), an attempt is made to provide a date-time class from the "time" variable} \item{make_units}{if \code{TRUE} (the default), an attempt is made to set the units property of each variable} \item{proxy}{logical; if \code{TRUE}, an object of class \code{stars_proxy} is read which contains array metadata only; if \code{FALSE} the full array data is read in memory. If not set, defaults to \code{TRUE} when the number of cells to be read is larger than \code{options(stars.n_proxy)}, or to 1e8 if that option was not set.} \item{downsample}{integer; number of cells to omit between samples along each dimension. e.g. \code{c(1,1,2)} would return every other cell in x and y and every third cell in the third dimension (z or t). If 0, no downsampling is applied. Note that this transformation is applied AFTER NetCDF data are read using st_downsample. As such, if proxy=TRUE, this option is ignored.} } \description{ Read data from a file (or source) using the NetCDF library directly. } \details{ The following logic is applied to coordinates. If any coordinate axes have regularly spaced coordinate variables they are reduced to the offset/delta form with 'affine = c(0, 0)', otherwise the values of the coordinates are stored and used to define a rectilinear grid. If the data has two or more dimensions and the first two are regular they are nominated as the 'raster' for plotting. If the \code{curvilinear} argument is used it specifies the 2D arrays containing coordinate values for the first two dimensions of the data read. It is currently assumed that the coordinates are 2D and that they relate to the first two dimensions in that order. If \code{var} is not set the first set of variables on a shared grid is used. \code{start} and \code{count} columns of ncsub must correspond to the variable dimension (nrows) and be valid index using \code{\link[RNetCDF]{var.get.nc}} convention (start is 1-based). If the count value is \code{NA} then all steps are included. Axis order must match that of the variable/s being read. } \examples{ f <- system.file("nc/reduced.nc", package = "stars") if (require(ncmeta, quietly = TRUE)) { read_ncdf(f) read_ncdf(f, var = c("anom")) read_ncdf(f, ncsub = cbind(start = c(1, 1, 1, 1), count = c(10, 12, 1, 1))) } if (require(ncmeta, quietly = TRUE)) { #' precipitation data in a curvilinear NetCDF prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") prec = read_ncdf(prec_file, curvilinear = c("lon", "lat"), ignore_bounds = TRUE) } ##plot(prec) ## gives error about unique breaks ## remove NAs, zeros, and give a large number ## of breaks (used for validating in detail) qu_0_omit = function(x, ..., n = 22) { x = units::drop_units(na.omit(x)) c(0, quantile(x[x > 0], seq(0, 1, length.out = n))) } if (require(dplyr, quietly = TRUE)) { prec_slice = slice(prec, index = 17, along = "time") plot(prec_slice, border = NA, breaks = qu_0_omit(prec_slice[[1]]), reset = FALSE) nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") plot(st_geometry(nc), add = TRUE, reset = FALSE, col = NA) } } stars/man/st_transform.Rd0000644000176200001440000000322214642501343015172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform.R \name{st_transform} \alias{st_transform} \alias{st_transform.stars} \alias{st_transform_proj.stars} \title{transform geometries in stars objects to a new coordinate reference system, without warping} \usage{ \method{st_transform}{stars}(x, crs, ...) st_transform_proj.stars(x, crs, ...) } \arguments{ \item{x}{object of class \code{stars}, with either raster or simple feature geometries} \item{crs}{object of class \code{crs} with target crs} \item{...}{ignored} } \description{ transform geometries in stars objects to a new coordinate reference system, without warping } \details{ For simple feature dimensions, \link[sf]{st_transform} is called, leading to lossless transformation. For gridded spatial data, a curvilinear grid with transformed grid cell (centers) is returned, which is also lossless. To convert this to a regular grid in the new \code{CRS}, use \link{st_warp} (which is in general lossy). If array values contain geometries and an array as a whole is of class `sfc` and has a non-missing CRS, array geometries are also transformed. } \examples{ geomatrix = system.file("tif/geomatrix.tif", package = "stars") (x = read_stars(geomatrix)) new = st_crs('OGC:CRS84') y = st_transform(x, new) plot(st_transform(st_as_sfc(st_bbox(x)), new), col = NA, border = 'red') plot(st_as_sfc(y, as_points=FALSE), col = NA, border = 'green', axes = TRUE, add = TRUE) image(y, col = heat.colors(12), add = TRUE) plot(st_as_sfc(y, as_points=TRUE), pch=3, cex=.5, col = 'blue', add = TRUE) plot(st_transform(st_as_sfc(x, as_points=FALSE), new), add = TRUE) } \seealso{ \link{st_warp} } stars/man/st_rotate.Rd0000644000176200001440000000372014576033423014465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rotate.R \name{st_rotate} \alias{st_rotate} \alias{st_rotate.stars} \alias{st_rotate.sfc} \alias{st_rotate.sf} \title{Transform rotated pole long/lat regular grid to unrotated curvilinear grid} \usage{ \method{st_rotate}{stars}(.x, lon0, lat0, north = TRUE, ...) \method{st_rotate}{sfc}(.x, lon0, lat0, north = TRUE, ...) \method{st_rotate}{sf}(.x, lon0, lat0, north = TRUE, ...) } \arguments{ \item{.x}{object of class \code{stars}} \item{lon0}{longitude of the rotated pole in degrees} \item{lat0}{latitude of the rotated pole in degrees} \item{north}{logical; if \code{TRUE} the pole refers to the North pole, otherwise the South pole} \item{...}{ignored} } \value{ curvilinear stars object with coordinates in regular long/lat (North pole at lat=90) } \description{ Transform rotated long/lat regular grid to unrotated curvilinear grid } \examples{ if (require("starsdata") && require("maps")) { # data downloaded from https://esgf-data.dkrz.de/search/cosmo-rea/ nc = "netcdf/ts_EUR-6km_ECMWF-ERAINT_REA6_r1i1p1f1_COSMO_v1_mon_201801-201812.nc" f = system.file(nc, package = "starsdata") m = read_mdim(f, "ts") print(m) # NOTE this function is obsolete when reading m as # m = read_mdim(f, "ts", curvilinear = c("longitude", "latitude")) if (require(RNetCDF)) { x = open.nc(f) lon = att.get.nc(x, "rotated_latitude_longitude", "grid_north_pole_longitude") lat = att.get.nc(x, "rotated_latitude_longitude", "grid_north_pole_latitude") close.nc(x) print(c(lon = lon, lat = lat)) } else { lon = -162 lat = 39.25 } m1 = st_rotate(m, lon, lat) print(m1) h = function() maps::map(add = TRUE) plot(m1, downsample = c(10, 10, 5), axes = TRUE, hook = h, mfrow = c(1, 2)) # curvilinear grid: downsample for plotting speed m2 = st_warp(m1, crs = st_crs("OGC:CRS84"), threshold = .1) plot(m2, hook = h, mfrow = c(3, 4)) # regular grid: plots fast } } stars/man/st_xy2sfc.Rd0000644000176200001440000000166013777653456014426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sf.R \name{st_xy2sfc} \alias{st_xy2sfc} \title{replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize)} \usage{ st_xy2sfc(x, as_points, ..., na.rm = TRUE) } \arguments{ \item{x}{object of class \code{stars}} \item{as_points}{logical; if \code{TRUE}, generate points at cell centers, else generate polygons} \item{...}{arguments passed on to \code{st_as_sfc}} \item{na.rm}{logical; omit (remove) cells which are entirely missing valued (across other dimensions)?} } \value{ object of class \code{stars} with x and y raster dimensions replaced by a single sfc geometry list column containing either points, or polygons. Adjacent cells with identical values are not merged; see \code{st_rasterize} for this. } \description{ replace x y raster dimensions with simple feature geometry list (points, or polygons = rasterize) } stars/man/st_dimensions.Rd0000644000176200001440000001141514451263410015330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensions.R \name{st_dimensions} \alias{st_dimensions} \alias{st_dimensions.stars} \alias{st_dimensions<-} \alias{st_dimensions<-.stars} \alias{st_dimensions<-.stars_proxy} \alias{st_dimensions<-.list} \alias{st_dimensions.array} \alias{st_dimensions.default} \alias{st_set_dimensions} \alias{st_get_dimension_values} \title{get dimensions from stars object} \usage{ st_dimensions(.x, ...) \method{st_dimensions}{stars}(.x, ...) st_dimensions(x) <- value \method{st_dimensions}{stars}(x) <- value \method{st_dimensions}{stars_proxy}(x) <- value \method{st_dimensions}{list}(x) <- value \method{st_dimensions}{array}(.x, ...) \method{st_dimensions}{default}( .x, ..., .raster, affine = c(0, 0), cell_midpoints = FALSE, point = FALSE ) st_set_dimensions( .x, which, values = NULL, point = NULL, names = NULL, xy, ... ) st_get_dimension_values(.x, which, ..., where = NA, max = FALSE, center = NA) } \arguments{ \item{.x}{object to retrieve dimensions information from} \item{...}{further arguments} \item{x}{object of class \code{dimensions}} \item{value}{new object of class \code{dimensions}, with matching dimensions} \item{.raster}{length 2 character array with names (if any) of the raster dimensions} \item{affine}{numeric; specify parameters of the affine transformation} \item{cell_midpoints}{logical; if \code{TRUE} AND the dimension values are strictly regular, the values are interpreted as the cell midpoint values rather than the cell offset values when calculating offset (i.e., the half-cell-size correction is applied); can have a value for each dimension, or else is recycled} \item{point}{logical; does the pixel value (measure) refer to a point (location) value or to an pixel (area) summary value?} \item{which}{integer or character; index or name of the dimension to be changed} \item{values}{values for this dimension (e.g. \code{sfc} list-column), or length-1 \code{dimensions} object; setting special value \code{NULL} removes dimension values, for instance to remove curvilinear raster coordinates} \item{names}{character; vector with new names for all dimensions, or with the single new name for the dimension indicated by \code{which}} \item{xy}{length-2 character vector; (new) names for the \code{x} and \code{y} raster dimensions} \item{where}{character, one of 'start', 'center' or 'end'. Set to NA (default) to ignore and use \code{max} and \code{center} explictly. This argument provides a convenient alternative to setting \code{max} and \code{center}.} \item{max}{logical; if \code{TRUE} return the end, rather than the beginning of an interval} \item{center}{logical; if \code{TRUE} return the center of an interval; if \code{NA} return the center for raster dimensions, and the start of intervals in other cases} } \value{ the \code{dimensions} attribute of \code{x}, of class \code{dimensions} } \description{ get dimensions from stars object } \details{ dimensions can be specified in two ways. The simplest is to pass a vector with numeric values for a numeric dimension, or character values for a categorical dimension. Parameter \code{cell_midpoints} is used to specify whether numeric values refer to the offset (start) of a dimension interval (default), or to the center; the center case is only available for regular dimensions. For rectilinear numeric dimensions, one can specify either a vector with cell borders (start values), or a data.frame with two columns named "start" and "end", with the respective interval start and end values. In the first case, the end values are computed from the start values by assuming the last two intervals have equal width. } \examples{ x = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) # Landsat 7 ETM+ band semantics: https://landsat.gsfc.nasa.gov/the-enhanced-thematic-mapper-plus/ # set bands to values 1,2,3,4,5,7: (x1 = st_set_dimensions(x, "band", values = c(1,2,3,4,5,7), names = "band_number", point = TRUE)) # set band values as bandwidth rbind(c(0.45,0.515), c(0.525,0.605), c(0.63,0.69), c(0.775,0.90), c(1.55,1.75), c(2.08,2.35)) \%>\% units::set_units("um") -> bw # or: units::set_units(µm) -> bw # set bandwidth midpoint: (x2 = st_set_dimensions(x, "band", values = 0.5 * (bw[,1]+bw[,2]), names = "bandwidth_midpoint", point = TRUE)) # set bandwidth intervals: (x3 = st_set_dimensions(x, "band", values = make_intervals(bw), names = "bandwidth")) m = matrix(1:20, nrow = 5, ncol = 4) dim(m) = c(x = 5, y = 4) # named dim (s = st_as_stars(m)) st_get_dimension_values(s, 'x', where = "start") st_get_dimension_values(s, 'x', center = FALSE) st_get_dimension_values(s, 'x', where = "center") st_get_dimension_values(s, 'x', center = TRUE) st_get_dimension_values(s, 'x', where = "end") st_get_dimension_values(s, 'x', max = TRUE) } stars/man/st_join.stars.Rd0000644000176200001440000000253713777653456015306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom.R \name{st_join.stars} \alias{st_join.stars} \title{Spatially join a stars and an `sf` object} \usage{ \method{st_join}{stars}( x, y, join = st_intersects, ..., what = "left1", as_points = NA, warn = TRUE ) } \arguments{ \item{x}{object of class stars} \item{y}{object of class sf, or one that can be coerced into that by \link{st_as_sf}} \item{join}{the join function, which should return an sgbp object; see details} \item{...}{arguments that will be passed on to the join function} \item{what}{"left1", "right" or "inner"; see details} \item{as_points}{logical; controls whether grid cells in \code{x} will be treated as points, or as cell areas; the \link{st_intersects.stars} method by default will derive this from \code{x}'s metadata, or else assume areas.} \item{warn}{logical; if TRUE, warn on 1-to-many matches when \code{what} is \code{"left1"}} } \value{ If what is "left1", an object of class stars with the (first) value of y at spatial instances of x } \description{ Spatially join a stars and an `sf` object } \details{ When there is more than one match to a single x value, the first matching record from y is taken (and if \code{warn} is TRUE a warning is raised). If what is "inner", an object of class \code{sf} with all matching records of x and y. } stars/man/L7_ETMs.Rd0000644000176200001440000000127714144045432013632 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets.R \docType{data} \name{L7_ETMs} \alias{L7_ETMs} \title{Landsat-7 bands for a selected region around Olinda, BR} \format{ An object of class \code{stars_proxy} (inherits from \code{stars}) of dimension 349 x 352 x 6. } \usage{ L7_ETMs } \description{ Probably containing the six 30 m bands: \itemize{ \item Band 1 Visible (0.45 - 0.52 µm) 30 m \item Band 2 Visible (0.52 - 0.60 µm) 30 m \item Band 3 Visible (0.63 - 0.69 µm) 30 m \item Band 4 Near-Infrared (0.77 - 0.90 µm) 30 m \item Band 5 Short-wave Infrared (1.55 - 1.75 µm) 30 m \item Band 7 Mid-Infrared (2.08 - 2.35 µm) 30 m } } \keyword{datasets} stars/DESCRIPTION0000644000176200001440000000557414645437762013151 0ustar liggesusersPackage: stars Title: Spatiotemporal Arrays, Raster and Vector Data Cubes Version: 0.6-6 Authors@R: c(person(given = "Edzer", family = "Pebesma", role = c("aut", "cre"), email = "edzer.pebesma@uni-muenster.de", comment = c(ORCID = "0000-0001-8049-7069")), person(given = "Michael", family = "Sumner", role = "ctb", comment=c(ORCID = "0000-0002-2471-7511")), person(given = "Etienne", family = "Racine", role = "ctb"), person(given = "Adriano", family = "Fantini", role = "ctb"), person(given = "David", family = "Blodgett", role = "ctb"), person(given = "Krzysztof", family = "Dyba", role = "ctb", comment=c(ORCID = "0000-0002-8614-3816"))) Description: Reading, manipulating, writing and plotting spatiotemporal arrays (raster and vector data cubes) in 'R', using 'GDAL' bindings provided by 'sf', and 'NetCDF' bindings by 'ncmeta' and 'RNetCDF'. License: Apache License URL: https://r-spatial.github.io/stars/, https://github.com/r-spatial/stars/ BugReports: https://github.com/r-spatial/stars/issues/ Additional_repositories: https://cran.uni-muenster.de/pebesma/ LazyData: true Depends: R (>= 3.3.0), abind, sf (>= 1.0-15) Imports: methods, parallel, classInt (>= 0.4-1), rlang, units Suggests: Cairo, OpenStreetMap, PCICt, RNetCDF (>= 1.8-2), clue, covr, cubble (>= 0.3.0), cubelyr, digest, dplyr (>= 0.7-0), exactextractr, FNN, future.apply, ggforce, ggplot2, ggthemes, gstat, httr, jsonlite, knitr, lwgeom, maps, mapdata, ncdfgeom, ncmeta (>= 0.0.3), pbapply, plm, randomForest, raster, rmarkdown, sp, spacetime, spatstat (>= 2.0-1), spatstat.geom, starsdata, terra (>= 1.4-22), testthat, tibble, tidyr, tsibble, viridis, xts, zoo VignetteBuilder: knitr Encoding: UTF-8 RoxygenNote: 7.3.1 Collate: 'aggregate.R' 'cubble.R' 'datasets.R' 'dimensions.R' 'extract.R' 'factors.R' 'geom.R' 'gt.R' 'init.R' 'intervals.R' 'mdim.R' 'mosaic.R' 'ncdf.R' 'ncproxy.R' 'OpenStreetMap.R' 'ops.R' 'plot.R' 'prcomp.R' 'proxy.R' 'rasterize.R' 'raster.R' 'read.R' 'rotate.R' 'sample.R' 'sf.R' 'spacetime.R' 'spatstat.R' 'sp.R' 'stars.R' 'subset.R' 'tidyverse.R' 'tile.R' 'transform.R' 'values.R' 'warp.R' 'write.R' 'xts.R' NeedsCompilation: no Packaged: 2024-07-14 14:12:14 UTC; edzer Author: Edzer Pebesma [aut, cre] (), Michael Sumner [ctb] (), Etienne Racine [ctb], Adriano Fantini [ctb], David Blodgett [ctb], Krzysztof Dyba [ctb] () Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2024-07-16 09:40:02 UTC

f#1[2֔Rɾ^pг`>%h( XcN0ʣuU*lIx_3”A/+mZ mmY !ohUEЏ`Lv5G:;H r.6dR,%C(Q3J{,)jZؑ",P}nN$$)&zV{O 2$t{+1jeƓ^I&3)< 2aW-0V %eb^:</?_\Ow!RUQ8FH9?c(9xxę/bp|0=ޔ立UWyOY8aϨ$2Uw%ulO1)`_4h\Q~cQoHĩi0!$}I.R؀U]&') SQfJ!Q{scKz S?2gXs1B2T/&G X!Ȧ(2l@m_P` M8 /ie4W]n,/}iMyrz{,߿],KҷH?Bܙ*_B{w2,2) w"Lt`,Zu"Dr:K y'pWc뛣2̌d -GGCmhR40SE)6jC5zf ŠV|$5QwGY=]/Ns2},:90X;t!dɀF۫FWC̡@B}1Bf +U5OgCES7LCcB9OK]1zpc gNjJ)4%&Lh6u[|AJ\Hz.djZ,ǎ8%Ci*4\:O狁oι s9HĒFVp`&NxEh  Hպb.se@|2467y 圧m>ڛ-jڙcɒ6ʼn$c=5:M;yW¡:D͹(Cmþ-\9|U@ 68_"H- Xf+b@~ ? ,y_4h,=~u"P5!ʰ}lVA#٧b@5SX}vCga0l`M\)c S)AR5iشF^4juYgY `An¬ j !WQ_x=}z2mvt)[ciKf3G_7o1=e~XflVtbv̼_<+VغHqHg{nnz}_GEq~$}7 ;z>2ypUM<DPJ&G*phAF"7XZ |jz.bbYR!Ǟxf*3#׎@07"UAɺj48Z=%Œu]bqmqbzZ$$Gilh8.^]ݦoM~}Z"a:` /ghמ>z8^ܸ\m⫱1p8酞b6rBtY:U !Dsڐ,FbFCʥ/NsP' uh (Nsqr~" Zt7oYz8q,=4nFMwJ85ȐnUX6^ah&i{\6]UNl$Y4"u3+iA(#T {LA'B_i5|*2QAGG$5äu*t3="Q{GRF :zVaӏn%m NRkl_$*ts Mc+" ^p+F {R]Bo=ey*FgeUY, C$E_"^%™L^/–@f~şwG9Yܝ5?e2gN[V'oˢ>TU>m8BYڀc-0<4d?x告޾M~ ۵ &$ Y M#Gk\)C; `*Ƣ_*bmS,=rhut_[P?SH4q[7Q:Wmزf_P梁옧)6w5~(ϗa߯|Ui{oPC$ԿAg52ɗ6#QKƫ@V*YjLꖀG[b,ִ`$QKXRv˕Ou8$Pkfc332)R%ť TNʢȐ~)B!t 5pMW'.{뛊4mQlf$l&QtNHUU8]z/I]>mI/ڍ[=m^/5W#JDi=l֏-$N;VBMVer r&`2VVjYȗȋTY=Gn`>E^1k.z<:>]kܬN~.< r5M._-˨ Oec㏴pp/wӷ?Hqd1m>I|A2K_"?qv`wg5rpj?ݽ>^|}˛g재"8P뗅Y6 l|Ma+t =6}~.>GȆ%̭; ۋL#;BކDڰBY x5GHv/Pt)C HxAo,elJ mĄtePЇ>B7O1Jv^#4 ͱ2s1{o>mk. k<v(Bhu$py]|@O5釂%U"e\&(:KQ2,>.8R9Yaئl:3$.Zײݲ1ḦHHcqJHȮȲ7甅\ܘFK&[]6-!JQeiۨj@Vk@MeG ´$ޅwCS@xm@<G} :(UHWaS&ӦH6"bI&zKVpMӖU6vD(]7+G`Z@WYMk{nGgߤ7TYN}3؁9Es^|k>*xsthVm|qOl~vuNKмIUD찋VU^]yאtCcE{4O lfiCV# -mW#*"QJ#[OòЭMW2zQ\4>S](wg Zbnń8Dڭm8׉Ƽ9J@5h;8sQj,n×Jh~:g!ٞl Zձx6>Wt\(^d5@vהyVgGtɑiicjvv15Pе#mfޢ)y>g|+oOV@vil g.\&Rk xdꙒ }#FaZU?Q\pODWS̹82vYrnUF1‘Dpܔ diFV _ͳEdZ SbBqВ^XPw_NMƾG?څTg>\hhG:~O u[7C9_" #8*i*lugƒq=M\mO78Ip1xhځ 1P2Om-4O'-m].*Sk iciŽpDJ nia Ī7"!+2C hڻʹR|}Iuߦv`u;llw!ZHi *8{QhDgw/_?9@`j7:I#m@ UU-xɃ"^CG%`e_>YViQlU鮻n#pē~HD] S|toeCRaJzT f`.dXcLY,gɒ_J2uxhy4cEpXs뇛ݑ2^< 558H8UYR$-ŧiky5e>6 1c ^4FtߍCU'Rj} fjewj}O~0 BaBl(>T^>+,ehƇ#qKsDrO9WT VXm{[97<ׇ]C˓/DՅԎ~XKri?unScq_.+߳T]IS7aiz3u6~}5#x*E".%`XCg~)xyCx'+"2bz'~w;~fzNǧjr͋ox|Y|?(woǎw. 5{O!Ohwx~۹\f_x<,.sdvVcm"*"RVwsqHn ;l$lK@6;m9aGr;eY[ZX|v䁯hʩaR5WBR.PռftՔɺkWQ̚B ;?aՐ ;!ʡzO H: 9Zz7Q ,Rar"2SլT+K՜&;>XE^Y&]7gR^3!u"z/nP,JڈU{8p*)~a s1風xı~F~P0#I\ZI&/e%¨v5m Î c\aI[B$ \\ zZ96 iW:ԯ{xu Ccg;y֑5QζK јoK򩌴%-H5QߑjlKAMeHwZϷ_Dk)Z`_x.%S8r@Eĭz JYjA=ݚ9%M˞)՛ Q DH5.4]qWϸ֡G) ?A|*v+ZD5Nn@j0%r=8 Einh*&ȣ۰[U P/}3 *WV$PU Yu p>0e'"xtmW%=N  LxAWLjP$[U^ǎ"(Ѻ@"A3Ja񼯱$Pvd,Ń utɦdڳ5&pBφ+ qwOr;O?Oή_?pX?zdNsQVZD&Eb^ |o86+.P9nTu0Ƃڧ+v uH݆krŘ#U:*SVtcE܎4[vf?2 &~EW'te:宒o_ܴS[z.Y3u̢0LyDxF ͼ X~=AUKܸ5d]>A86#SsمPY~d:ƛBG ćw3OcyZ::珿X$2O|xˋg@|7/wjnOF]DD#"$ٖ̆=lAq 6xսiDGx-G\uǷgzH3=s|9ޗs' A dKe*/\./T奫F>MhspOG3hJ{&OgV78^U朌wNdTM+;\ d̖4l1֐kWXdڥ<^dC앣1}a#thβ(g=BOb`%SU?hr}JaЃ} xlv8n@1wMFӾ& rӶ2deMҨ9 AQpҕdD4K&-dDr6q CS@Rq>ID;7*"ޚX''Yv2%k~xZTaEVlXT#D%Nq-Q%0N #"[Q)<&b'O4N%q4jZCzחa%r]HtI[I 5d:GpC2N _~ou+)dVu4fC(1m^ @ܗ55fLBrܦ8Hހ6XU=i*؞ 3Eւ5B=,kOE[6寖lc9Ϝ\y0?lzwY*Mֹ~}wogw_Ķ-tegO9?/Uz9_7N 3<$9OǺ 5Cemfv,Uj׿D|1?__AHCUu衮;ő!S aYpLv-qVwd?"r_x^&kY4hj I04d "0(ϔ"^EvO#ѱj8(2(M> Uk^6=ۺ@.O4VJj>cTA\J LQ17H!Cu@7W^ U4l"ј1,ę&%'^ ~t2'B& eW1ULT:G|,׉~3c]T|c!h4<27*'1MOai- lCmw@F( zlTwu;nA2vN*Ɠbq}ə0qd0ZkN2"qN'?yeX8AWǵ LXl$~dd'۪@bRvStW _"$@BBV]*ӄ~4n%dӾH=l.M[ X_P2ӑ{\bP)[s{VBz '`|59;FѫWMIoLY"jn՜E 4hBl$VY7 Z5ȩ huW~;uW9VܺDtl mUc"Ug#Tu%{+0fP G {ܰ( o$VMx r.8]'gѭDwuH%=hgf^wl̮X#6ҫHd7[JVe#b2MT70eϴZStq;UEGɲ~Eɜmuv*.fʻDO`K 8P_ʞZ/i'E?>}:arJ K_J z2;&3b>;ۊrqa^;e:<7.83/^eK),R+P\dn=XfRzgȦnhX{ïiLi/H7b^G"[QQa{Z,hYoGS̓ RQ,h;YX,էF˾x 7Ҩ EȸTP#aXZG:Ož_Z9ep钐 n O_>z,qSҸ:"jq<Ʌw_LW}sjye$%]OmOxuf?^]Nܷg[x8KϥzIZ7U:vw;_~ݛrwśt[EBgU|PAa*©~釅"6i_:W_<Ã?|nNℙsX_C 09 ~ @Sv6`S ߑD u*}`uƬg<<|G2H%0ʄݵQUj9tcAP%%=)HTzxtc,5GS$nބ =Tr$LB;ϫ$ q}QzQє9qߕ0xܼ4A]WP1tF jyP絡bua4<rKmA !Q-Q%z8 PuAqLjL8Sv1qy2%~9(sT6,;uǿvƏѨMM`v& vh52tӛ *јyEՉ\THyPEpm鬏o&iTiE*K}}?e[Efk!!)i}}^dEz(;Qza͠֎yZWȱ34vSBRܿתaU796BVR4`!=&ׁ֊Exǟ<[e#g sy@D+¸-8ۭ;."ZUo% aPeslwPƺՔ|ha6'k0SRc`*8mP'z`h/- q؈Տ` =jL00$;upE`|{+4cɏʓ%p(Aȳt1f%!kg *Žp(u @4݉>% ƗtuOT:ְl~3u z}& f(t, 崭msxa| f ^gԾ6"7RjGS?Byj.51`WRۺ;n]J_-R'6$ɾ=-_&njO"OѬW _5idηˉ?^x"8oVBr> k+ \)h~7%f{kʩYSɖm(vǦ;$z=s4A Q$ t|eBO̊8$|ajte{ cX8~7TEgl6,Pt0[qB6g1Ps͒^UeW՘m5SowDoWa'dub&dYr<=2+v9_.WBz6]G9l5=,2cU!QM~>.;wCrvLm|]_?gŷonU>[Wr;f-y|{M*֎_\}wo*oWϮ>y-fAun|pi.3LhAz V_h+@LE&QH5~P*x-wȕƟctnI}'VHvɲn{:'L&7)h;)$8!xu{dAD;їܯC~P5 ۮYvnT*9=[faG,]q -½xKFxNK2I&gҨc2މ7lxFU k4m .p4pސc@úc6uQ_u"senmFMn&4\FM(Ԯq}A]_.n?/߿}h0Z$6|=.,3cwNb1_ sua'_?*q˫Wץ?߾zf-gnRqg⯖P,[ߠT*RXx׋\IQ wEp|q|P\%"U&J%nSۉr>$Q_shPF _y:)/ [d!W(ԩ""ChjPȁ Yl.M\9X.Y. 'T|Bkm8Q~2TY<\a Iؗ< 0L{<>tya X1W!=c >$j׸^Ee!38Rwې Rm5Erdƌ9O*C8;OZ~hq/tڎ&_+pO436q_%zx5n4DY0Ν" GRƄ4q/Ywo'?l΄.,7lh`6N!7[T .Mhe.{8$Xa"%,72wtΝh}{Mϸ,m̛ioq~\FˍS2ۨ7K2[KWb@k>̤8ڇnᐦ./!O{0v9SĖ%cb~]YNP7KdPת]%jcw染Tad+?0,vEY:"^|9`o377sEn+܋NS3:DCx9}cIGԏ>86eDzپ o׾zqm> ˉ`1QvWTXO:3J%֯ 3zRܙA7zo~xwtnwwBq=UJ*JrBLX髄+¯  e*B>W$i! 2챳c R*؁`:kp5-1wbPWcXL` /TjЕ 1 }+!vy1a o2|k\"ĺC_O`ON;y4 維XS黙0]"ZqYCWq`zl7XZT`NG$D;6<֘"[NZ=ZQủYI_/C^+&B]P+l8UotH խ[enT[sN =N/-SAR=X<F:P=?hɢmQkpJEI;v=)e]&zږ UPX,)<eԲj{LSpG\xtdxA0ާͩ)zApyI9u5OVw m9opOH؟o7ќx:IW< qbe9 lKtY$)lm~*:dޥ_,'fNS+TWs?_W;]kİש#qSGNH*)S: pkŪw_&`zG]GWċW *1V:}eT߁fqzl\n/uKⷺ.1{Q[.0Rz/ y/Z*A%ҽ4v`Yx&sd~D]*h/3߮ŐJlʛ|/7`8XIB%b~yajfv`IoϮm,}sv;>nIw3gg&pxR|SU*BUʻS\f/qPͧFXSj:*-*tqۻp{qq;KK:SKG/xT2h +,k@"1Ba/k+<->$az=?[\k9Hcx-׏cGv N=V3Ӊlpyyssdw'GiFaV+Za,O?m\9ƍLeJl-QRV7h\P4 S3`mN918`*8^_"nS j"嚄-P4 mf["zI$ 5OH2>#L'z2Q5 L/[x"+TD7-E_;ׁw5Kt$ jp u؂,99X%Mo6[+E6D.{)4-qg^W7Du7<'xruy4)jJQ[ڦلђ'}`QÑqñO mzCwh!cCR*$ԎN08:S¤;u0j<?OaFܠH$t:pYVf*(("DӨo&:-whLv!#3"by٧Z䵉_80N^ H>U?[LQ⥥ғٚR(dmnt4I0j"ɭS m%!XU]?L2HV ez1yУܤȇ7)S Py2I40²2 hs&X7rZdm"@ĩ.AR.4%&8F)mmJW!Q\:(OC_׍2_(_-xwip6h8G헉Q TU~= R+|,/7RX(f23W=*#C")Wej?\}L-zlz̴m<bòy')sL":O'3MtR\T|Yz:ibX4Ƙhx@LaԴ/ TrD&85jLG0CCyԴ*s.-\rd[F/}KW!NηMW/R/TOfm7rsׂ>r{*QDl\3*_j0nnu\fYESzzzQ^ԟ~VإݓG_>M?(Ϲ_?]/w:y{?/EA u X{3w7}{?{GogUa?.j){w֥unu5sսݿ[]Ƀ{{+x-ϋʬ9黯'n^F̮Vk{RVvjΪꪔ+;L܁++wVWW[*SWք=77w)w+Z٫ yR:{=]2w`XG[Z0D26GflkJ)8jg d9a!"/R%K`E|iԜyd~K6u@D;M~|_HvkXw:))#)3`뚹/g68k¨P}5E*X<(P)R>dB bIV4b}iYH"e1PQR?3၄unӖlȯI [o=4\1K 5=sZ~sLOcjux u.\m2+A5 "*[ƭhx;w֎LzQ'C8W"pPHΒZJh,m @U@5!TR_i#q֓~<c4_,ioM&zdE۟T8V4Gd]-pw jqc~Tܠ)¨k-a@[&3|^Ըc :Jdv *5k^)lt}0ja'ڬ3[)>?NO!gscG!Yu< N"5-m񔿢MO!NsdUy҂Oxia1(do;ۦ߽|ckpʕy2 LfS zuTbCKD&yօ4nEVqRoCjEJ㤘LJt$ h)d?JiI;::rE>T(ɖ*˜҅(}Nz꧶;)WX̘-z@F\#{ 71% ˣua4HlӸ03^O=YV_:K+O]OͷIyi딿s_'7*Ӱ>\f#,q^Źx'.>Д3?#$ss Y ]^d!k?>]g/Kտ؆~elYmxK/Ot<HvE`Yw-ǂ زDD~ǕA|>8y.2y7_?sTxA9[ZPn`%,!'V M'0 .Ɨ։DuvӮwCӞ*O˧  &eҁ9ye^u[$曱 犴,| Yk#4핔;6Wϟ-G|9Korãߝm+t3WR_>[K6^O֗&HudnY0fzWu!ԏi]*սqwP͝jB.oo_bU!d5o6㟺o݋#H .TEpC sov߰TTBe urRsP-nVaϛv*̰)=HWr[PV~ujg =U2ӱKRx Ne(yJ 6b#Ҡvc a.YaS&?\C/86Sv%DzDCX9i͜:`P-嗴S Y.OpOT3\J8jBf]&l,tњ:\-6xh,[ZGM7#qSkkaz rĆk!}S;GґJrb0zFdi ~^fd}$<Ce͘^ *EB,6$)vKÆ. SK<\mM N`P>Q BΦ}VAK.@݇*_ i-Oޑp/M}q3 zVܼ6ǰ^8 ^m0Ή0_5omu} 'Su&@@N9@wtddwahJ 27ypk!kO޵Z+顀,m!O VmcC|E(˰Y8Ͻ,x"*9.S4R};[t})ҳ+Qp>d]H#Q2PqM3ܡ0ihB]m3pe`4Cg7.=1r>f6Du n`=Ӟc5ezqҴ;8=SmvS"Ih3-2)3@"۱xY"k~[$a)\H&3\ޕF>3K ] b"?17n(5BV﹚B8nl7eLh-4 SοtZKq Sa\"R yH>fx/2[NW:T7܈ fWՆmVVCe"4F3]>\~)Nh<%Ε 5UA)yzSPю)SDQ:31ÉʢA<m( qTDݒЎrCvm)a%KގZW™Em/jx}@t3Tߑƒޚ[uivG_434@\޻ʖ95)E:UIOrlSisASD[ѐN` $@P3lh2z%7ȴF#^>=βFT21  ( h#ŜqQLḁ' 5qQ~|/PrcK9002SaR'ܸ+iN\{Nd M^ڿY@^xj(yf'ב? ̾}= *ϼ_ؿjD>Y>sk#P<ґD0Y*Pt]n03bӲ̰*u//NU5"Dr_LUEIKws/s.vƎ.΍/.ک &밝Zvqgx~i:++Z:flkIzyw% OJmt?W=ȭ& o~{/ ݁xf؀XW.]~GS)@ .0uбEl/11-t0*u3ӡFnXb V:[/d#$s&~I=\*;x[:?/_n/^qom'O6V{X̌ۙV>8̭ZGLͺWML?{㧟?O+Q~>VK!ga=|`0V+BlKPUw3mOv\VwRe`FKs[8hH.p>53b ?i*UelKbzÜg )Sېna9c {0WHD{7:kMơ@@uizG 9[gudf`7-B|X Q;Be/Ą09B*ؠH>e/ M*Q!% W`é2`zIg:C32D"vCgyb ;:Sn|P/کv&lHKΠƩ Ϧ`e/~Uv\aæ? %Ck 9Oսob_* I@@cF$b()GTrlAjb AtvwRɎau 4ꍛp"@~S"1L4`D9UO[{9mh }ii3Aq76d8џ{MovL;'? 8 ļtx2+g¤O ˑcu̶+5m}k4Ag]HA*d? ~@ӣo8O6/2ւ3T<8"](*3-0-%1 SIsԛKjAQUXh0xFcyVXuIK ."I⺡Փ΅iUL%N:C Pw^$ .hۅ %qw>ډphgyęK8 $d@>򭯜j$J;(MH:$Cb?NpgŚx7/G>L D!w91RHp#F Nl6k+?pDfy fKt+CJ["60cNp uҍJ-}Y(Rn!2mU&.CenD/}t;LwчMd72 YRD s۲_w`Y^}?_^~"fw߿Hn:WMMiBykegܕr󸘽?"q87{*^\Ѧ_p7{&K6 VK F2bHΛQՍ0ݭu u 4ex^] /~a:.m9hK Z 4"/,%.OۋÏO wgK:y.N;нgA˸H]=}*U/ Ag:h9Y(ϋe<\œ׎;L tnZW`|{qxnWklͮ IvaeS굇mi@BXGp߅ 䇿ݪ<=lyQ`#ǿ՛_ԾOw׫?_Ő .7Z 0/QڣPjm )Z >+yV$+HǖbZbZYg|R٥BZkl RySp\efB!u| ȟؘ61ƈ3gaFA[# #>6'=6-!c2LN;C(wxtդ7XwS ̮#H9>G/ݨWJMKbx"otOy?h0w8#U/myc'Ҹ?Bc(ixqNGfLB9?fWDMrʍ*\DF:xu7jr)@:w%]M /)qҗ2˝J:G]nsi,$ J 4Kz(Rh1vJ&Ga2e_1:33c ] "ڶJR4$1u*wR =GM?Jr2ҕA#-=d/ile胒 IQU>YL!;9w{S?B]fNSQ7`*dق9[S+^kpmp N mڞpUm3pt'+,^+3ZF Xct)wgiW@ہ#>Iž 썮qPg L+&&)ɞVi4 υ"6y}mB'sw~. OIhO A\ًDρր-9Sq$1ģmrw-V1Hrg.T@ x+kLn[G> D kkw 0?ځ;p&?E:(R@0:!F42zBw! PzKq=U/9ŭiVzvP*H e1p% 'd`Af#a}^/_C3T~x@Np/w^nfڡMl97,?,mˣ?^ٹ.67i?5R`)ce :r7[OR/tn d?g~n pBUj:֫ nK3O6<[v{b=EH-kwG:|D{.g{fs4vp;r8*dHR4{oH7mT;RŸk%n՛o}/v-@p=]hj Ejse} Gm@.i$6JsnZA6A&Ft:ܥ2YO߿|^ޭg_Rlrn9hD :Unνg -s|kaycH =ٮ>~B-BW9r,j#Kdlf[>DX֪Vx5דGr@X7fǻiofY#,Ax8<:]H!)zУ^'+dtTgWWeUb^к!hx:SE!p̔q;2DYHH>ζy.n ^w-pc *j2Wm˵ѳ Z{uɮ^]KqKUa̴Ƹ5,iF2sE_[JbDp# tk\eŵYڅǶzn.-z`qi vY=TSIn4eG#)ۑ%ƛ4s4%:e纂wpTS*K'F€c䶌hj@0=EU S%1zgN[҅og6е+-oR=bC78|((ӭ2N^EE[|vw ,Z +j #iu5L "_xYM2@eE٥l WJ1I<>+ž ӫJQԫHI[-Ӕe u]GG?1W=W"(Pu~ǡ Y.rAm:[+-7xmUlllj޶@[ ǀut"ǵ<ϵs MI-,mISkC*^ŐAkC#ʑYJ5]3=/GZecR$QG~Y@]-ׯT?LyI\{_z@.x}2jft~+H["NS" (U)bU}a(sPޥT=:Z#~f\mXs݅;\hݧSr=z H)э=pjjL}_uWSc CWpјK2)"`5S*YXrUU XSSZRЪup&BbQӨA0#@*HRaJQJ9^?g.<갯҄h4 s)$9,+#(EkDxri[k#ibх, 8[Kw :3kb#7 a T|@Ɯt{skq!=:IsR iy#DW8//Bl,ŏ]Ԟׁ-4SylW̲#9,i a:1,3d=Ե/A0Jv{s%'&GOr7uCc?^<П&*1F "&ֶCVglDW8fY~+ɷbq69,s=Up&ۛZ::fdYe*e5 PY2P4is!0p|Iyp`p}O=Ltݿ߼hx4iyF]W<[?Əg+Ƕ@  oTиAX.Բ3ͤ{^%ЊcI Z9$[:@@<=:#$Gb '^-&pȌ9|UFH_y7ˣlfm2q{Tۺ,;MV>7O@Ww\dI0A3yk׍_̆mo;h/Vn16n'Vn[1ۡ>ab!fl\>4|iYr)cy?4$a,arfz.3yMSrV8*$U1"cCD"BBe0o5%]pIh MOMsO2Pԕ1CZHplN^?|[k:*=/ƾk$E]Ǡaf*rL*TjSa~CX95SXT`;L`ywЫFJl"ǶK@PE>INIhKuG S$ԵS,2.4k sWTnjX,S`p-fNmH%-.pj*?-+&x2ѕ)c[PIbw 'mmm) J*YEoVn%TK0? ێЗS %}3w _ WAX5GUѪmrh9J"Z傀5FfEU-6K$Cv]{Q`q@92~B/PUϨBZ:7 H4sT(e_g{š[PnGjP”A_~;n?[DcU5Kp.NP~|x'~D}8 W2c>ԟ8. []?^45T8 zqq73'F1_N|yte<\ųlXm_dg^d{[ qFacpW:z?j8"`!뷃/k<>Ŀwg67T0q! 'lo/FvΆ 9 -4r(Cy tsw;K61KC[K (b4!WLs2 ߙF""r8d,Y BZ64"混%qڀP1*2f}$Jy")Ve: q6]N꿘@)$ßX` *y89җU<5 ]Y׆#ĉo *=⿽Ttb?>u|85}=3hĉ#5'issh=[L4 +ZMrG&3`M=o-@" CXSV, X{ttGV4H0uRB mCWv5Y䫦Ik/,ujxf*|$4"ɉTBg!2fd8R y2,w`4uȣ0B ipX9}WRM$ШDG*>@wnU zƞ?d !Џ~G|øu*Yfv~SŲ5:"jiNݢgqϡ l80/e+0*^ɗdg-ЫRu5Ū $xiu"ۗ -(xORC3yeū4f}B@e숃tA46:'=TƗ%s1Շpu<agNU4kNp[ZHRaeD&(u9 bCY**lx}|xPH`Vcݡ)t"ohBE"eHVlдqq0nMFxNB+_FAb}ECEx#'|ΧǓ?wt+{";EOfo_/`qY2z?ۋ,?.-[4[\"Rpӫp%ډ,e.:uSH :;ԃr<%މU,v$U>/cf}sKg' So* WrdͿ|tq#;94 Tl 率D??O{Ǔo]D2h7[Z{лug9!-,vPھ[PPf`$>(c&6',p$w1wgF6+8yr۳0 <3 ̡? Qܝ'Kx-ǓGr/ HPu01{ӯx \CjC&tXtQ."tz^2*+eH~n)*l$iE]euSᥲt{UlKXI`zL1B  ެdTeSJI@:Pi=鬀Y@AoHvq0TmniP pxdÁ^ֿFz@Fw3Sػ46D]-Y.=ĥ)G7ʺ\1DS ^ے *h9 Z!%&(D|!  tX .]Ř3ځn(*Y4W*reޭ=?\-Ac %>\p* t1r=o<&bp~;I?F@B5Ui}c#LU_X*{R:.oN Փ#3JGVhϼD Yf4$FSʡ.xqH}5i^k(4[a]F3Ę19Vat HC+Bb%] KNb0CAl({l&{\E7¨&0 DWZ|֗tHPϹn]v~vJljyU]])N}(-ͮݒVJ<:U XZ2uRD$g8V] +CjѶaD*V9hi,/*/q'E2E׷}9 ЯJFGY7I2 W3~nVg^AV7ӯn )hnM+HRwa e+̶vh:HvAS #Kt*t49=W]kOvﰝ'plxԺtezM.o3͂vY[ƹ-'bOƮ?a[m'T}y$F t &kO>6*p NPJtc#s=ئj[LwX 㨔iX"MRɁfvte+,:\َ@Y8ڎ4j1#2N3TDݖl 3mV8;g'L/NV2/X66\$bE; 18x{44}57pz ^p Iv}{=~oǯ﯏Wܛl9\^fdRys37`sD6Gz4rp67ؿ(8`{R9|noptscFn.b81IXG^n'OhGsCXh [ϓo=RA[HH<ڥ|TAQl KH2g@ PsN .%m!\]"Hx.$&ARw2|.~3*BjH.zHYYVHL3%>7~95XYڡG#(M&Ӝp4K/t[R~h ڕbJQHT_ [RLJL q?,4P',^t%hܤ@X K^.S/&c?r:;٢N 2!}y&1>W=YSxgJ5 9tAU;LaP1{,(o\ضh 7L0w{J1'vŢBS ; TԠAY$C|ۜhf!qxxiV[[Q2"IyJ%PPdy5 \jP=c%)]-RLvh[tk#^^@S*8z 3R~SjWVnj 5SڃcB]% f*{o܆kW zoaU}iP-XR$95߫S٢j/LWlsq^g 5G!'^Z̖A bKtsO!I.+ziliMP+Ѡʡ]bre? &]SAE!5dK}h .s oZEѰ+_{uU2=݅cOkHgl0v~uVQǷNA^0va zBq %ʋ6W5z;6V^' A?@ "6Ы~mcaOno)▀T´l")rܶϝT4Go萑$qJA9&:$]*|nDfZs3Ph"1O$nSlH8C5f'BZiU~s!zl1|YL/͠Ū)F'ݎv$\-CLJEb.M ę,s" A,-kZ/41׎aI+饦+Ly__]_ߟۿtMӿ?$48l~sQ~iJ@5Oȸ\AW7 #mHHMasמeO}ɤQgL%e#'H—cwy?>z~_,\Q^gHhƩBV?Ɔ-YeL|Jmfg2}6[l?Y0WwLѻI#}buIJY)SO>Zxc Ʊz!4b666ƉWl2U)ߞD/?~43*?ׄ0 Ǐ567>@Y3 y@ acPg)$I&@m~<BC}&4hAacy!"1O~j'prMcH $תL#_ZKmiRj[5pԮh5^UA$:&V$3qDIi IWUDF;H*EN׏ egZ0},R]~ [<|'Zd"M 1X(6QCSˁ<ҰXT(L :H'ٿ; 9$*SIp{źJIbJ\H͟jj뗦C=OuzgR愅sWL5YmR[ѥu%Sx2vW@"l∛!T(>%$AQ:mxW)v4u4v]9SӰl(;<u¯"/n۩S%k@U$IMz~WѴGy+5-* R5)km"6Yʴ Ǵ *%S}@ WLN=[_%*g$)UХX#+YPg\eQ⺅{![KϠkXߍ1!"iZ{Yj /Uh;lcG@ E͢ʽ`EMeeqBo: GkqSa {S(gVlX66L7;&ҭ'g_%v&CiJ3%,\v4; SW_&MnP {;pU> #Ү̌둣ɕ%aVe_\Wy^Ye!M?+OcWt`4^ʿ`Sg*~{K ' _fDySQx 0꿹z3Lr OH.12s"os7NU4ɔ\N.9u$kk*򀂶mfiUni)rnxaK`ݨsȞ8d7"ZFuk*mVV}ej"f{]ʮ 8d:˙cTguΊh[lkjަ@2Ϯ?v$T *[`hT}âW#OCf]4jnI:,+vvLʢmwR]eel]K)Z`WhcluyH{*hlC-ҠoUUHZ^jmyC %.7'tOXk&#Fvb fl 'm2=( ܦrmpH56N%7O=qD\c[خqݡSF6ް_Dݠ;a#[-=3fƦ߷Qk,TU264ΞLcᄔzPYl&5cIee?ǪUVnHݕֆMthNj<_I=Hvdザ v"]"\;vj87˾o sVQ9ޗ\γco3o_R 셣ӈ; > +-ht M4i̽ؑ'}G#~V0KEfL4(Iɱ3]gT<0)N|lز$=M_]ۙ5Jx X$u*qa'dϕMUk|e;ñ(N0ӿDGw KeYrM sclفfrRHw'Pu3P:~9g _P3;x93c}(r؟?>zN”;>őxjW'co]):^b8JH<JJq y qHw) yHWJ/ >DX9Jҧwvw3RiAŻiu:^δKǕ-*4y9,F!/t۰O8jOHv^=n!NPF58&D㠝vFH%H,eTĎc1n rX? FĞkyP?:0,u4j ,}Y'.raWLc)ȊDXA-KYơPR9ڿu3@Jօnɲym У!-t8JTlbТ%"qzVsqlc]6>MAeMG/6QLU-I)~$dW2/@Hz +cHo$I Uk9VߣZІ7{tՔT0PD9dc°x`4UD1!pEnvSo7;; t"6lA&iT3C ؊a] M 24nS$pIx':|w/7Xh#2[ҭ*'nUuҌ|oU^= n($j;=]Y-f"Hb$#6)>EEgP MūlWT,:VPfCWM{[=q0oBg+ҳbEiZli} i%Nb~13O>=3$o#.1y262sٰ?_.T%0Ќ uჿ9Z8^̺L/Vƙd2PKƙV*T-O@,T\)?@0t@)$aiDJc%F>  ;O(~^6It b4[V90"]Ӣ!se_d& bsV,z*lhuĀQn/W%GRetgqU6Z:pLmp ?EjANOA1dIyBG4-j7^f[mۜMWPXS)\3-֕b;2LteȒ+$]N_Bڥv') #җM,r2z4ʇ4[ݕk3Š ~z^/87ʳ#'I=Bx>y }?菑W':"lwxKܑ4|ᘒ+8]dlcNטzen/ U{rTaV6 cǒËE 8y X۬թFG q_4S$n27Wy I[hCR2kǪB PI9 F6PUzV­-YcP.Q{,;5Cao= Ҷ.M yp(Bv~nm&^_Wd}}\m݆aH]wh`ݚ 8 mz-~ mUNemPYcjM&}\ : ez(n2nUF u㮳3hβfUHpУK`دnۮNlWX퓫|*2 9ôeܦ-_ZgFm:u itв$(߭)ƞЅ(vWUZFV$] e3I|k1Ji0b,<pT_/ ߜ˾&}y0y;6`a<>S39͍+Jt"9Lفj'aXe _&D tߜM|[>zwN$zj@% ;OB}gɅ'8= ZϢO2ЋHDZމ窮{ee|>ߎ/^>_f\tl > |qF[ -$Oc=4JfX{3 O0 '\,OM`/nN_1Woh̫Qw¿ar'VcWVy`m- CD w )d>Us'ص͝__JD9^)ݝFXo٠T |`}?B6xP@?1Ýi=7nO&mo*|$ .^,ݽq@<+wo%R?~Xfv9x-דq_y7wo7n*@[q;y<'E*B?Oջ|ɨ( } GI /++ [46T R̻A2crՠ/|D*8e %3N%kZRM.Y7ɎT+jWE$T+~xx9=!yP>sBaM T-WY8j@AQ cBt!L#<&Gt#CGX8<駃PoԆp=,.@e;"ċTuJpxxQϦ-^P*"y oo~nS/Wq:y;Of2K eK:uPr^n!Pد$}UwAsF9- Ǣ%U+ј t9ξM8utBѕ++4Y#nbSɇCV# A&Ӵ:Utj9QK|,kO4n= +[(> .H,aǔ5"1Ր׫iN'+Gq&Tmp_#i'rI^: (3M˯:=1< O)j :uE N%CVsh0FayFW|i[$GL5U B{VKj_NoQ*;zT5>7)ΐ!)q;dDe;\u'Rb5KJ۠~lDMX nXE9BL݊N)TBHʎDjǾ+R}j$ѵ ' ^&ŰSJkm_C=שF\ygnK?YLvMe 'Y T-1s_'Ǒ+8.jVEb ~8¢(""O@" ܓBWk'IXq( ' hm4/C)$H!-7]s:lIY!/52}pU^V~nu.O/&wmjt%SfN6b2#nҳ~d \9gY|7,N9DcFjV[I6S/=sG;OAp?)?:H:]M \ޞFBdo.wם&uDֻlܙ.ϣ]?Nj:j4$OdIÕ2U<±hq]ۡ&GOr0lsaԮB!43B|/–?0rtrܞy{3ł]Qjl^`"Py*::23GXN:2{(O֙L,ԆP:K2ÒS3Pn{̂0=QFbDp 6dת{B֏rn˸-fˣ}ݽ-Ilv8뼾~_/_瓋i=b_}O]066loXhcm㞵n >Ebk;_Nzgkynn-gkcmб66F]{MmQvlKDpDM b--Bݰo2KqvǶk. +#zI )ɬJ1](&~nAzp .}A7Am<4zLu|uѶ*%(#x!`ln5ɑTuT>H+Qr*KK=d! .#9d)vNY RdG^›a *8Q b`22Ui5dsddT-"EY<3\IᖉLđU_|ԨXRWFnbZmQo^QX7ZfNwƪiE zɶ} kGr$ X+*hOjNPF%x^hg!bđq.st@,bъ@&#Aޙ0VLkBuvʮ <+;بyQta Cvk:9J{-T0Z|tSI"Y;wM5^h9b/s%zKړȲdp:$bjvZB͚ӪJ eIP?PoYXWDd 0Zu//jֽ>!RǶ [51XIQ޸!7Av-5k ˇ0}L/[P US/y=Lș}(R $u :KDKIfNOlB*ȍB9FڪG34y< QhA|ʻ{O$J]ATM( ZH &=%4mu⁴:~.;: ؋LmR|*POҳ7݁ƔSYw)ǎ7Nwz~=t=g9x|:s닺8pgɅ3?|K\_I+N%kztǙX?=|k_^t5$^tpsV}<.on#)}A:tÚeyn?{t|1A9lY.$&?ƝywuE?o; n#L5O(breՙ *Gzƥk4SP.fղ#r#~FbߵٙokPAvlְo}wͭ-`BHf `_[ 0'19lb~c[y̬'p{xdbncn<Õׇmo t}xaE@LtG)b:G=^fAPxҍ873Ƒ q,̱TOpZu< QҠȁ+IT Q%]8v< lPCP+PRE$M%Z-sUtz 9۬pPds`j<\&i!":I/q"&y 5޴CCAhmખxݎTC DF\՘jQ86"R]eӡUVue x5?L '&؉K*?F>MpѺa^MȾX6z>tNPѨ:|ns`"3/)H,F/Wm4a«pk9BMH&|鋝4HX&*B@L):`LU*6D9BbB6w0g@ oOu7dJ;Xw%oAdbx'VʡH\P&^وQ=*PD',~ ~(|T꾁QE%B0qn%-a2jc?<vf1Vk0p`¶a-|7ZhĐ1Q|V\k+l+& :4$ iTwՕ]MYqu"y)Jv\U=`R:>wd=dAѷA("UC摅)G QdpAW>^`甌)nbsF ,@}E*~Uq[^0fږYJ _CG8zC5=_Q΢&478ڷ۽"Z.fEGtapAECC|yҊOfJl!$0%yQ}MX֋5MW /0!w}jPjMfMu ]yt&t^߿ޭw`,}͌o~G}îdTWOO9}Dzx$vWa 5,MG$- 5-A!^"acܠijnL)b "bFhhPphv:!m`^ 8ǒp\V `bI:c*$Ƈ%Zh=Vv ;TmFb+$ #m *}X܎}+=#᧗Y8af&q#YDY9 +.}7cI\6(J -NTSc O'$[+7-P/5*[ {K/tNfd!߭^7\.Ph: ɷkD*PbAu6>u%@=nvخ7j}+TЪBK3<#>9@2]&U0u.&Uq%IHm=(m\ie}J 0SN&MJkdu[jЖJhK);3O6Ld[}L" u 3Kۢ-47unlSgٻ\z*>%zDVWTu!>I\hsWRЪnN 0:d S0f>c)qM}LU )k⺀4u#|вCo+B$ ^c[o:k1OjP@]0DL2i"R5Bev[|-U^Cě`p)-iYZa^;&R\7-T.+Fdj =7g3| ͰHG)s[d=?_!};^"6 Q7AoZR+W}`5b0ra/']q~D ^įWN-o|1ڏfj<V=g?(=lՊV=3X(RXXͻrqueµV1WlGlXp~ !vue|Zja%_ BZzwBagP, c09\%fOh uܾ%.԰ˑ/HűBW`l`ӂ7!có"YZ3 6Bݥ\Q`{ZHYv|.m܇y(ߞ>}.)bwp(7}Aa^e |=22+۱M7t sđ1dLOo7qwiPӤ)?O;NGɁp'VꞤ93(e44w@`j;o-L8w=]QV!iK6X oSn.%-ۑnwyWw:y" mֽՙ 6eAH.IH X {Pc`qxN]_Tآib K=:WFpCk5;m†*LB6:4:m&% *7iCAp,O]AZK4U)QFԡ"yUi;tzI6K#n2iU*È'JUZgqZ@brIO5Qwש+̄U=`CCcH:6%CQcPh6$8};~uzAt_+e2v"cGXUXbS1q@g/OPSߑ\B@p%#LP$R]~fS ő4[Tzo!h.~75]ШZBI@s m&[2a^^QЁve;$m5O}#5MޓpRi&>)-?1ڤiֿe+hkd .+nn31_[\x&Du!wp:S٠LsWOfZ)3Nf)sxÉM}xS*w!(;{Z0["?l/ڎ%Az:I"N\m?灾TqmlU{f24zkz:'ī}93pԢ7Asf/g[f3)~H ʛ'Pg 9TX VHgy +Y }iQjG}a8;Q~CX Þ󠰒  B?UŕQ_DBW!PP{],@>YTXcn#?0#hWa? 9,=_]XG]dr?-$2͗%x-sǝڭlH&X$s=}& ۖlGNf݆BիLϷ{}޸x59jܷ[ՁcX#ID y(5-FDuXdȑji BmZ EDYtƹF]ūAC>H]p*g#j1\Y,Ӵph `+i܅a@\:8^*6G3Z@ʹ)RH0aZ#DJW @+J#*k5W%hܩsQ;,YGYl0M8&OMUl@ªNRe+{Koc8V&S==+uxיԏ5 M;$2T"1slLXЬqE} 9aL )k^])%wФ۴N7K_扪Ӯ xmDM- \CǶ]#;(C)BP+6csES{kEڦ[@6 D8|&UkǾ*zVh4JQ9T6[[ݷ'le Hpn s wаűnZDKՁdɶzi ŖsבNj̨f'jm狚_w|'`@>:T\afe ȋQĻYyԫS{%MtWht}ڹ`8207yG*o]Y'ab/\W:s?h[PY_ ? UmGKއ~~?MӞF|-u^8ŅpTv ِ9bV#0Ml qm=7<|J[4Oܞ|ڙi67C_%•6};R4rdLwGTT3Pg};.>q[ I%~>OMugC;Qye=w5=ߋ풫OV\~T.[j7ea;6o6ΓI׹az-?_îU>Emg-ڃZ~|\RA[WzOj=rl2\]˪B*_K* \> qx}'$Y"6`_z->er*9;pw[ [x?(P{; erx9y?MI6Vb:^v XB8[/Gc :KRaI6":jLZB}(`8QUpSٕ,,$^֤LG[<7ǜ֩EҬh+%T~ֆ'pY)=HT~7TiHt{8\l($_-;~i+@pߦ(h4JAA([?29E|kB]R]Vgx S&x7ꇪA\x1)Ѥ8lQ0l Ⅻ8|OL&o}k"& Q ֖CZb$#`v:wmNć+e:n3j42 ]l޶uR0c#4 FB:RYY*ΐwdalJ+#25k޵ZqjiQ ]_=%^h OS)8x`SݗX1 R܎S mY {*j$FXB Cu0ͨе};Ë[=[;m-><6c o(# 4eJ7TmiM-:* G3,,>j}Q2C 23[uNԋjTkEFT^ixv2]wmkG4<}4 fhcXglC&}+[HEACNjXA 8" :S:.S+U6+zRfYv+ZC0e?-x-J+#A$aug D"ZNti;diErxe^TR#,$;Yp֞ jW$\EJ(5!`(߬qAKqZz<^ʣE9!_Vá7[ʴP;&S΄ O 15l^8ޜ,Lryضc6)x>nف~Mm?e/pҿO1Qxc׉P?>z?!bO#٠NܶBF7'ϹEKWqtގ' w9!޳\] &C+ә4KgCG45cd\Z7>74,ٰU9 Ckيl hܺDorH!Tx%BdVt _NauV[-bOKi>;ϺA?Ù6! #;o"OU %Pd"%N*fZ^닟.w y8U7QM|rwI?ߥz,.櫗Ah,1s8&+ZQA\E;UI=߰SVmut^tv)XwJɣ <ʞDCca7%xf%Q]eL }=IV3zeZi]acPG-|HPQDMX/*{<^u ?,!  ˙:]uM Zոp)Ε0У5ZqmHA L> n,߿TWrT]zblx]'^NjEce|,spS"\Zu*Njl&Y[ |w YyFն9joW5"N1W'"-C|ŴSqTMa"\1A6HT6jZJ4D*2Ю̽28ټtU^hFSi̷!ѯqhKJ`EԤ)m0pYVU3LfnʛxiYG_bť~Fsbhižai |:zAVיsr~I*Vtm4cﵟ"q;dL-Eں@/'kd})+<~ 6V+k<҈--[(U)ukvInKV:NeۨpH6wxny;,Y2hwMeT}CdKP ǓgIL#w;ޞ)Ax =%psMky$t% : vluFD(T:{cT\A g9&Vs:M*3}IFLu nr̷*\ij"URƊεs={92~8:߿W\M\^b}ۅ~8I =;i]dc/en@k[ L8;E:Z(~s_둅w=Pȧϥ./ͥUQ|į v> Wq s}_{qGu>u|nU a$eЕ|?wel i`F2wH4 |d>?\. ؀YB6s?{,g9gЏ@̥1S(1 C:ta5 s&Ͷߎ|^O7#e?:~71iu=0h:;VcSբk\2 $ ;oz<޴1d!5PU0'ZT;plVD{,T%Ɛ܉P8ee s8 m7 en:T ]qelkQg|y{; o *~ll).oe ]D r \[ࠊ5к!ک!R8ɍHD7ya$]_NYPH—Pe Uj.75kE]9*JPHtklܙ({u~Vȝt{2qSt$xĠ"]cmjmXQHJ`DU :&73QE }w1(vbd$P9Ul^uvp#[/6DU,!>4:P"ZfJՋHCeaU:Om8Ngԁn~fBߤ#F\M]&cN%Tq2tyfjb X}+v9vڦoL-0]ۦ;:ʶv5@%Y;MV 5u!;x}_-UZ+F쬠De_4 9WE xk)M!8V&`Fܤm͒an,#VKT^@+>Rz,I+Q-5+}UHgSZIVmu/28Ȱ53"#T2O1pI[ö)A.m>EhAjaQ[WٹágdeUBX%n1m C p6)hKWי֎m%'$O"ѪUVзZUe$JCg?*o CqO/-޼39xi@fa%rMU"E (]ҳzӾ7ޞN#^H R-ӎ`8'6/x_'Za}g ϧ| 0s_zΈ}ԟoGA <uӞRQGt‡D&!k5 Wǒ-Rk'Np聭"\߬JQ#i/\D#Pq= j-wIhJ$Ps:ir4qr?]I^v,A/r0|{=? ~373N#W{egC훾L՟.?:wIǦEi+$JŻILvI"AFv,id1][%h(>r;z~|޺Gn9iyl:<܏gϾ:ܿs=g8!0]g =:77DYDrs@}vo-$q^f~W`Zy?'B<Z B sȓ/jgI'!t>s\!B}@_h0d~ W!y smӐBYf bpSZPǁ { 4 }P&[x3%zȡqX߷(u3(=p6q-:Q*M b AMloTSLkBԠuE@ǰƱgL*1)Zzgr7v8Z>5CvIɵkt$\tF KnɴsGpȐH\K #Yi4E2uy1J0TQ}8w2ƹ&+5bw ^YukkT u8]bEQD@^cy!Z CrPWhhtihYD-U_boc;]k$Sډa} 40Ґ z%Dz("+cCAVdnZ0Ubw_յD]kBv`6Ų@,ZN e<"8duMQV* GkxuK"P=V lCgbɣD4vDwn:ږ͙?'t@bMV68aoزnZE8cW%Ux,ӮNo**iSqBNqf3C[ .@bl[%xۄMˉsAMmh'kkn9λTKkK.QGٷ{='?NȺ^>I$1=Hz.sepm%a~K!pCd/##x1ROW@񙿾YI ɐ$uNja'Q_fO a8L_b;~C8oB-Qu:"GoѨЕf?m:h$ c}&25 %%1>&}+>Ol$Ouׅ!gz\CB:azJf7 39WZ&M<|0tn~F (|+vK@Tybqv2OnY̧N s|p >cZ +p@Y@xcvϐ@{n> )@x?O9G 7㇈nҧ 0j-?`x-Wsz\+VA9MI=9'3%JDIҮX*_ ܼ5i}ϤAy`8P1|χz}r="=S7@ /Y=[$M040:`CG S!2&$lHd] vT0M+ %Z.p@.g"Š,.Qe^T lD-p6="_d_%|U{%JwD.} %>P vnvkJyZ*쳐J1#ɮe+ZDT9?n[GNTǶA^@@cZz+XLnX]x T.Īp$f[81$C|A=%]!s{D> "^ 78U|;+*ՋL`̩0pslTh"hT ]N]t=Eog7U%|`Wi:twTQ\%_ px Ccw~zUHo= PfVAyҊtnTvA%[Fh@mbzT[$Bmg n E*Q\"U%9'+3u7,P#1[p*VE{Z Xۚ5/q2lւܧ +H ."W$_͇~Hn.oз`QbH}*^e{(_;:)CuZnW-ARmFIm *[jŷ>]PxLäLmu-#<2Ԓ%GQ`^a3 CD'S"߸V)j-XyCTcKH3Ag(@K)rv !GHt՝bt1["G<,. 2t+2CCNh=,nἭ77'#iw|jJЌ4T+-cbSTî+UU{9bO@(r9={Ic~CYR kLS`brO,ګl}chnHT>,pݼ)P <_o&-Óc+_Lvxы퐛mݧz(1OH֘H[Z % %9 Nv̓NYհoak"~8Z!y q= 6cfBxwry?b7iNƺUfHGâ~!mL٘FV~МtJa*gOos\?ݻ⎻ڏGmOwmNg.NO3Ks3ӶCҩOͥ>H:!Jljnܝ2o0O'|:kkL4B:ׄ\/f%!ȤF%dT:] wf3Luo}4vdXZ<)UBUakқ ؃=.ak7D[ ]ۀ8& &AI9QTj3\{l7Ǎ=q;4Vc+趹R/: !:iIо&P呎skhgQhj6.8\Ղ׉L3/C)pov:v< Z#:,2ӽ@հ65seaUh/P\]Aw5N#K(_AP6$pqOA'BXJZ)xk怫_ke6j# CM%e&W1MYy_j%1JLn/[Cj{(|Ke]ba>L1HU )j|dzy62Z{"lpkTs뺵An/:[Z@kd1@ ^3:+^;Om/H#bwP %VIb-(= 9 x] 9cJJVCu8V4{8SlL~EV::2 u2Q[ M(bV'Һ% [e2(o ܊J68mۃ,$5t |aRȆ*\ɒCWm[囩AE7-mAh櫎+86˞;f!l"oډ4/l?}OOWϮXI͖4D&=G1延P45K:6n/2:쇓q4q2:Ucz}})[ZmBI^$9>_W?%Ѩv-_%-"n4w}\5@G#icM'ib3*$֣h|[_ً$C%^O|9o{^)>Xuљ1~?Op/=-4G1EFP9d99`kU%3U]^gP[nc!fMmklC%+u8c`8}EfozUej,Y͝JZ!)R0ߖ?MlyWe,.xsw_>v 8 0PPx]foͳu1u ɆP:V]ObE&V~۱'{][rqIw=As$>{":4Z۳d^j8s/B̡:˝=`!Кc׉َ p2r׏؀M/w|=o]뮭(9ZA8t-Iv}1.V%MyKCKD/,#5 jC!UtV9=[Z77fyO<.;--6dǖ=tW_3ϕL4E>D($ŀك&@%ŸiԻ8o{Ptft;e]b'P7G=;ZHbUlś˲ňu{1$ +vDt=ۯta6v[CU{}uZħӞqgLl'T}.%UR_8q'I2=8foө;?ziq#E\|po~Π}[hH-yI,K3g A42qH&;3*hh!3diH&o9M'>mf7g~,d2󽖐N |f mf*, QoY!3Ǿ=x%ɓGv#cZ3Y(Qlu+QU} (@7zovMRH=cb/? "|*x˾É_)G5Sh8 '7D4O5&n;M-(mjy3d?48~KQ?l\$2Cyq([̪$?;L۾"e/ݎUFffyܱ#$N>K V [2?ӰMMo<76ߟ~AjLOj<}HiqdЭw0ՂȮc0"6?jU  څjU(<e.r2eﰥ* u"y "Gy5 LgMzIH d Gן[W |$4NT@DU=6M^Rl[)Mly5tx=df z#r%6J^v$ 'ƎEDnm86S N$WmbyM 0=Щ6WZ) Eёb2y eTVDQiEZ"]Q"DMv$'ry"wVү:4b+LAА땪ŝRmYm?a J r̀E*~TJk] _qOGv!_1GgZcl3~L7e+|"{ N5[[^EV y/<#|1|Lwxi 5U/f sGa)Dj;Wyht Tty0j6Uc|gE, @׶e/T68nyv}w:{deC?e+$ HX5R;ڡy,P-z5*U5ϡX1'oQMLU pD ,Zr=8tm8{&,M{15+QDpD вթ5}0j<貞=iqG9z:s749 "QսhґkK͝ygدGjJo긭듖nyOfNh0FQ|qF=Mj)/wܖ0;v\ ٴ=_NN{1\cە/;$7S䳸I{?Jp7vfשӣWy8&ܷntv"6 p( 7q9LNh w&'3G>@3 If% aDHow%ڡ١tl, Cur߃EPAx "z86#YkV@v䰧ɨ=fb/v=U_'.!3KK-ifdmd$../i41sٴ-giK].>FB.qr:Y$撀۰샶Cd3bgsdkK}87L.L&l&l.H5"Ar˝f>^œI ג$4X8M o"74y!{Y, _vt瞈D5ĈWcKO ]$N7/>}dΡuAcjU)FU }3ۿqLlA S ˜F jy[~nzڲ'%TtD=ۖ^$h;WʫQȞ>}X_5wWD3t{V↧5? 5P0թʁhumX߷ ޠBqxqDVjU*tiիNQ(R=:yQkXaTޓ9&\2JzoF3ѨŴ/! uV&N][ w3S#Me$~('㥳P@ TyBtm~>꿦 Oi3œUҠ1O45Oko:.UݴuRʆƮM\ee.E$inXf [tmG77zQswin6k2B쮀#ro]qH J9\NnYM4mH>YlsoN ec~XUv{H+<\bwW-;e~wwJ6b u3}1 SK6W}SmD0Y=LG~[5b͓σp}ehډ}iȷ6ҙ:K]$cƛ?3e$qI ̠9^y5e]z-==|[Gp"N^;'`,!I:ϒy{ ;^_EF[NKrĿCvcա|qh|=]܎-#@@םnKى>jͅO'/kqK5 6aE{w)@)1#9U89Iiԋ;h_Z( =N;>2? i=>xL/uy9Zhtv٥C]^C&@rXZFCM,~Ig,Ŷr`>|_N3riG_em=t[rKtw^Pl2dn@rdx~X'*paU9-Ou2vrA>y/8 !O斗d`?PSt"ObW瑂ፁ dʻu&3tZ/S CC3ZjѺC~>wdKȟb5J| ? "S00l TMˣPkmͮ<q(FRHGR&Q9*"ŘB ߅ڍ8\hCWT ~z< xXY=N~,@E*u]ORv:Ը.U &deصةʖ q{lY$L~oÝ ccI0(*)W*nmjQuL쮂o+x!^XUE=씘!o0-[y6}kTeShaq[b9c5y(=1UF!eȚyeH -jvo]յ sB|p+T IаZvvmM \-X%WEm| I +[I]P`=-M١UЊm Uj[p4k*nRVn1剚6DVq{L40C¹:^yGnBhd 1oW1w6?:Nw[_ RJskn`"d9THKy{rqXjY4w#ÞF/a%Њi}IqEO:Ġ7\Ly4AjuE"1T-r X*KЌ07eUfgjx<ٞ :`>#.wog cn z!LCyZ |KYS\0]C1bjru'fȼ<8;kvܺ$۳ٮۢR3tLI*̻/D k :4QW3Pj;]%!*2Ǖ -jn%`x^vA g(v\f22{C_.d@=Д~O7;u?Z^%r6;PP,PmV@CnAn k`1m-\?$<[J3,h!i;[Z,AfXJ NwdrxC3U䰜exEsu/kn#ͦ! 4W^Y{7h !GYơ";'? R _|Y}WRFۜB4"N#6[_m) 19޷x}35y|p:x:". #hy?If؋g=6#5>43ƌ= JKǪ a CC^Q]TEM0"6BY^U' [f$Ka0zҮ>صOp, W\6@k}C,?oȕ6%Kc0˶J4!h - ٲRb9cDnQ>4R\Zuʮu 6*AaȖ+4uU(@MusHTpB^뫠ؤb uni$CmZ:#O2P!qb ( 1?~W2su$He8ICf#-ĢFC]=h>4I|TO #v$5kuZH34mҪ4Rj$z>,Vl^ǦG\m\4n*̦0?yadv ɋA]EG&ii]H\kg]Zft kfVWHz-/X[ybW+B\[[AsU !5ע[+xi,[2^'4$Ks"Te@VTeY@W琪+t}1UQyz@WuyԋQњAmPV?XҮ{/ۚ$G*zVZe5XHYsntmTH01!?U+Y[[JsKM.j]/`-mc(Ifme$Qڦ#ktm!r%Y|D7+KzZm,+DVh|p6xc!JxO3 ,V5hzIݒ$gWuUG$1 T.8CmGjMK&ߠ˾2G>Cc'Gd̔$]~Sn;= b߿ܝ^%;[_mE'[nd,u3j{CǗ۶ocO؊qnÁc{qڱ#t;L-R^Opblüeꎅ'-pvIׇbW{gԊoG6/KϺ6G~b8i薰ik+m/Wtr$c8L:ڡȶrÚinʑi9[HZz,nCk]R!pT M)@!i)$Mb Xj ;tu`Rt4Z2UMP1e_ȐZ?6}|zR{/ _u*W @>oL0A.kT>?5ͬu>Yjk_~@`ӻ3N!?󹭍wrmP"EB6Th8lP\f.u?B!\p|sn@"1[pOf ~ٍ|?&?rMcMER BNhv!3H!*Q'-̋+w&+/3}Ţ.&WS[O'ϧtP,Iff9YFr fYP'jj`HmOc{movtgۤyaEg,L舼91~Fl: jh}CK/},Br]L#^.-)5]l**Z\l@O: N"mqRk]W?VnH24$lƴD dVNܘ2rMq( SYYVi NDQ#-< VMKꑈQ^vU(Lg :&ϩ;#L5߬IQՃz 4ӜԤpt@Sd~5RZ6mx A7;R f\R3IfViϗ,> s'ZC'L†$ҤICö$=O4ߜVb{z'/“eQ d(vT!7*0n4j RZזUG+W7Tygda2FH3 -* P!eA[y 5ˊ]DײJ#!Y(KZJW5m/2 hZ(X<@kFXЪᯉuGոr= IJ(_pDjLmYȵ%]~(ῤa>Ux֋? kUЦ8fEjL[e26bRS+*4ʈQ"b:ZkN$5eO,Q WFe!BZ(- “@%Ibv8@j]msyy vjFmm60FOe:Tl("RotEְxy=t4a=ȄֶbK4'-2ǑJ1+YS^*5[=2UZZkn0&?7M]Hј5M@a[uӫ?B,{%Qц4yɁ-h#\E&U!3dBQjP.S%mnJD z7` U]* $m[@"ъЮ*"E÷+\`[Kv[6M V0^ShWtt+~AWoHaujL{Qn2yFޒkL}K2cFg2> VUl"dH##Uwƃm*JCY>u. oޞE|opd.ka#Φfb<g|dNzD|;]Gp< ~ˆxz!9VLibAK=˄[fd:-Ygboo#k~6D}[vgn L|BSy3wq?n/烸0.fiUTnP;#[ͧXދ|jrVdTym bU)R0XNlZ{d˯|f=qS8p, נra #lM%Ic"Kx]pHa^1EY4dUC:"ӎQG'%pΞsCIHg7"5^Z>8L&G GG+oYaQ$7,IমH?LTz3vRz;D~;'#/#a iiľء82:u>F&GPjH:юaﮧEPI+fNɭervfQo4NƧ_߃^lL*!Eڇ3sÀ-˃)|TܕrZk{-0l'Jϫ oWMGG+;OʓIrpwN26v>+%6U*]朻RlyJ/. ?07WJ؏sr?Rߧ˥+A1RRJrisS殌R0W:P+E*sE̖JQ¡k0QaeAWۭL+K:F.X\,j7MA 32dlذ;8=Y?~l 6J7<onWn ȡ:g<;+ZJ= 0?= !~&|nFP"j];+iKuK6S VU^/wKgiY~.BkB]-j6E RB " ^&FVm'j@ѧ-(t|: (2rݹw>Ft!q&xSRX᩽`8bKlhJ7:_veTcՆpȓp\F8]G m3Y{QX݋=}:gS[4vFߍdH.9Oaf;25i[3V9ϴF&8l30hC [cT we/ ;6գDt5}瘃prU b+þ1g@s!"sM>Cq/TX\+X6HJ戬/9H'qşc_3DsyG fh枣T!JD5`}~t8%{\@pH;>юy̡?s@\[JC hR!}8/\Ay=y9Dh.R% 4hhRtj>xAH]G&:.DJ X59w˩Dƶ{?9xTXֽطX{<% q';]KԱ;BӉnltHr5x=Lz^n<@M(J.֖sBp>Q׶S!Cvbn6NҭSt{&= {*F.F̫H盡f盶(;!zAϠHzF~(7fќRxf\^`< 5V!/wCHS}Y鎇r-TqzkٚW?> 2n* z}4^i/(~hd!AKw"M#KI`dpwdw8l7o` y 57ApÖFѢ-&ޒB^Twd!8BpQZbk?Fy8A15=oNa qz#qrgW(uCE]jѩAMAn,hrP|nE^39Dxܷ$<1d6P$p$ ?Xia4ʨp,7A18\j62FboEf`^{b}԰э /Ѭpj#Ae^>A<I)ܓ ͇t&⫃@qų@~Jd$49\㟬yzζA_:̆Q?("eno%(̄'*P45 %2: OYfDMɃxsz̼_?Zwƞ?liCڍtyD 1R+P({OF~" ~VKwg\-__-/}~uwR_D=8=]׃"Q!?77Wh= 'xeaܣR|D j8aQ_C24]f+y_f(3B1 b˥ AQ_=x-r#u/m5p4I&+v%*kWT(,HlܚeԚh+ovnN m>Men[JL[ ўWۡQgsC%_z)ّҗ@cA{-ʊ'<"y/ }.Eyl#T0$"x'|"06sw?p՜፧f'yMㇷa{2v|{ub/l%wz DЏAkS*DS+:E4bMpb M[Dv ș4@"r%Z ڲa$_^²(^4̀ݳ?KM^ O:őa $nP3Wҹ˱DyUR-sOp 2>\iX닙7VenAepgxr6&y.KC;5Za 梀j|֖S] |}pTWz} T8K Ug2ZUX+\uIuT~A+Wkˑ-/A 6*M&[U. nVMV%됦!&msdM*S*߬0V3k4"I=cTxѩCRʌ8 *' ~vn uG^[͊J6uH7E,k;! 4UЪ^;2e,^3 K"7 GW rf 'NO;$Jz/X]Ki9#EGoRG&Q?rhoyCr8a xḣPmw[NXO]r?3'n2/5.G/`$1v"hGy^s;́9x/{*Àh<ز|-^J,t5y3Q4Yact8_-An^lfFbwW`p*~ku4aK; S$(Pe>np'idz_v+x x<y?-d![,"P,!, D*?Lsҵ//RcxBiw>-?,O~ZFrxoR @X\T臠8_#c,v#9|B bTx/ba.Bq2hΰV. *+(Kb{!]+ cT, #4Ohto7/; ^ҚJB'XtW[Qd˽D _tt|wv3`n>Ne PKjOň{@UeS] iAci)4ctHH6uwr|۱n9xyJPz`+RH=Ԉo8WOUU[xQmxԮ1 Vs 5-h4E!Az(,GGB{COiH4hW-u} 岆qhآ\oftx{ZaW#՟ N.ߨ4<u~RMl^ L/ 3YĀX2֠gJ¶+v(a[gY:i;뤈"Z1C{dOĎK7ǘ8i~-am!$vY6 ۑ\fK:P#D K*A)#a-/XIR=a}j(8MDsw)q=je#H2Vu`LόDˉN1ؾ?وSı3{_.`fc6Ɔ(,eL kqU"1g@^|78v<=޶Eq0 U!p&̔mɕǁ!|kU3 <*KT*$ P8yKAEHW {i#"\O1pPߨʛ\m. U.!F `U%!PQ"a2EI#osM *F)U;f-@SRB55M]WȖ>E3w]=2CT`m۞/е:KZl2?[_I_<Qh},*xʡJsy:* )R wW=mz^&P7]KkݳVGf9CYb#^yX=KGnW8<+8mp%fP{A:qhطCj"^-܎-Q' Cj?@^,Kjcnf %ZͲ -7|a<O {9a+;v>R9ȥGxHW#p F6l,3d}՞goB˾?c5{iP~,sdQG8r?YX}!xmqL=ץƺJIJCoDHF5hȇ@uM, F~(C8}毆 _j4 NCP~SFL^35|ݖo2̗ol>k :l,6j%yynIPLgB@ed\H=嫎°҉h}:@^u0'}v @$(Mĕ\|7-[=Uܒ'&+TOțT@6/F`70/m0*ASD%#w&a0,;|DgPw#mb,FLC#r[$Cja$o89hLbh8"d'☉ 6A5fsV2O0'Wƿa93O/MSҝhJqFmn ~s+|c]і 5X 2'Y@雖S訚| (hݺ@45u7Wk\Ƙ'(+j_r6@hGZ$SMJ-auސiR53&.V2A9#M, h+2h5)Q*˚'ZȄphKD=c|]7p|"'I^ ,K͐8$&r7ޞz3,,EkG% ukqUر!uNvW7VpKBu":>ux5$o M MVI'oF^Jwζ^?N"WQ"wGF(菳mʌ۱ogf~;ȁj8LlQǮdb3ODg$z99ctL;38}n+F:wǮl/wGboN 说PDǸbB[*KhUʶ0< ѵ kv/?.YjLX>}x1s>337ѳSjlL LA!g9v"%L͓/ԓ=sDzL;G _tT|5uyh8c=%/cMS>NŀNglŎy7Q?{ŜƝQ3_4⽟dH sY#u'|Ń#ǟ#` vjT{7a\?'1,;M-D4G#R#!;MGHQDP?2D*ߋ8D =(ҏP$"Qz0Aw NʣE#/ ŻQڔx-sXƟmw;ȶ,[Ą3pAD`@*˖,9ȡ ;U3Svke?ܫּ|u=\ Hz[44SVy@gt@Vj*|'V\1p(QTteE4 @\.СQ+sy\sڣxdmhzl8UjOa!t1fE܇y 4LlM'ص&XñV D׈Lίklب3-3L4p4Kxس.% LJDG4ˁ,g붤H" ̻qR>L}Bmji';B&/F:Ǩǡ ^53JI$]$*A瑌cmr2"w[]ѥ>hH$#\Y6T|i;[yq$;[?)ך<}Ќ@w]6ro.&r][אW|Ж-0 6uލ&GC +^axm^i'ENCG&o&E\U[^X֖HUnDjv{.?e4^uo ܸ]= i[0F5XiS1$L DDR YC #397uk1/ v@=uESO#u٫!LP#M(3.u5vZ]@էMr06NC"PGHb |uU튀4sYh2T$"Ih k|mg,i.IZV8`tl~fC&ZjL$O42Viۈ؏DZ?dif68BF|y4hrR܋rv"f+)L<9 x C9C)h_fk˂N=L=zi!CjxLqTDHKʜ~GT>U3o#CZ {u\1GV= ݧ76`Y@׽S mtRmA0E`daO^taN\ek`<Qw3UkA@C!PU6Ĺb]X<^{ĭU0V ӡ7]MCCs3.xllj\@},qAl&? $ЀN*I i֗3Zz>f* cf)!mE%Y8n"Bcx ÈfH~G#I  p]\ ~4̵DmFU #TaGYk7FƏL}ձ Ey(=o3S͓W_'mgOȔ#MP&I-Ta*]7ԇR9'Ѹmgl"ӊmlۅoh?el°y|,ĵV!`uP`Ǻ|zp.x>k XB[aUXVY{P i<yLQd⻍QNi܋n pىl EvG~zu|欛;p60@*)XZ+)ޑO|l7VqYR/<|76hY?~H͌tqԟk]:V q+Ͱ9VN~:I.A+,M@z3܂zwxZ1vu0 hs;fC uhxaB1ZZ!+Oэ5#HXݟঢtO^1~چЂ+o+椾h@m+6>왼f䦨N[vIbևIma7M V(e]A屋r-{cdF-̮77{:I3&gK{#lmK#f\ĒykM|P߰XV:ado Gt&);GwzORU]av 5yi{9E9躊mk{bU,yNtۉ0 stN@P0 NMxS[Pks6"cN@ 7ۅg."3f^ˑ-zˍ6#ml׋A{m'8a}[A|cئ ^C;F bFm$_ c_U.J]˥c<̖RƷrl-!cffgm<;ι̇n~懙,`ƒpit; ̭~ROk6kN(B<4dnt@5Wۛx vL[TɔѰYHL)꣱8GV6}BTcb^s|b_/+Tf #VZ]|e= *s8k; U](LH OƂEy]HLo*@HX["Vӵ%BygM.lHMS`uZXQ_,Y]l0|}s0E\<ӕ h8b}u0kZHl-I2\15zSK!)aHXO ў77:GFƉ 4hgR\cOnhAAӂU.|]Oժ+ w:A=]!98[kLВ&b7a6||wν099 uv'[㍎i>q6B#1ml`fT;dFNSOvۮ7_=h:܄BZ8ZP6`o%r c-n$`i߶MA$%u rlreIn*˹bo7-%Nb=IB-ǕtrɁx5tu?::`eb$O%PRFm .E>i`sl).,re^U(c(- qmX!<lb:{ [m&0qR2vuW9"{ *$}=0/Y @m}<^|ˬ/oqS& rD9;㟽Oϴ~p?x icמC ֪4 1vxS=Yh48s^9jN?$B"ΚKL"E*O2-=ekDh.3_؆|{ QL.tWd~:Y9U2r!ζ=dgN?/Q2C~pc' rs?/ǭMב](}7 &vbͩYu"NǴNPUپ3r=-r Lˀg1NOQT/F=?Oa}!w}GŪr [72#&>jL\m)qwv[W=LbSe5l/f y՗Mk7O4{+zl;g9=@7!<LQg <ݟ>O'aܹKfʷ:>IE@2e0?ob|}p}:ZizcC0jn$lxErIԳ&[-r-!=%lofv^nF#mB9udVK=[uА5},*R"*6ѭXn*ZjKr/aKb |u+,s`mYD _HbOE | 6Sn [_ehK zJlˆ5U^V a1"lbք%;[ZV*Ml,W+re`3TdrAp*v٢]:2N!XdYںK6lXj:e/cX#z p$j$U*V(㞈i"U2u!I@TۆN!:PLgGer' F`uKD]*Se d_G4w8RY" /yp=J$i_(L\ۛleR_`J+K/ںdӥ^xMgtu7VeM%(k\uEHxI Gnq?~ߋN?<4m-[44PH\]Fc 'X,iuc,w(FV(iϷWÖۣECas>dN("j'5\ I?QߟjBw q2LM9nv̰ZN:ÝtNw]򬿓v+H;لm)v=mVOBѮ_n|{,Cը7F"\v2+n0GDYԟYC3o|-o{v(I =u&xג<I!bLZرy鴁7uBPxi8,Q7CGp@v e6/2MR<ɧ6YI3|B;H,>-4|7֧8ʟE|m,"I#`eG?/{K6I[+Ix1SuN)@ 'a`Cj->-)SZٗ"Rb-& U=d}QuPu;Px:D7So\*[-.lBTP䁪5K tH`ITʈhY/+6g/{*NNZ ԑ*T8~9}=Qfg.n+m089M=YfŰt2$. udGQݷUEUQ !VEꦆW"mbȖ :D &' wL\c'},579:$ Ṳpn۲p_ՍXsH,׮gzV#+eNs^+ƫX\i ,b(9Ly]V DR75Q|ɯe T(jUpmⱒ,,Oԍ]5 vyhյH}T{*$ @U˯k$&JPP$ '"~lMp@ 쯷!ןFO=۳hדA:~Q݌G1ZflN&=i9C~:Y? wn0d~}7l۽~Ow"E}of=?]3#ۏ$v1:_NbÏ;;.g>Gz?f>F+Ul>3ZͰ)?|+a='{܇#M#RuvAF8Zf)8鄢K}'n&ս$mjHTH `tä {Ix9Z_? xK-PxϜ4Q *5tX'&>85燆 -sןYaa?+Z>9\ dn֟3C擅B}p? 䁅ܜr93<=~ذQ$cfN1k1\3&as >/MOTyؼK 2CCE"gl=wE|-,j ҂ } 9ls٦֗Tt\Y$+Kts$T+BK391g9l_%F/,1ϰ HnHX|Önd ;F  &e+HQXtJֹڦn3-]c7 X$ϗTۜﶠ-Wu=ѨC٩Q>J]NNcmC6Gԣ-z]<TQ T8B\UDGFqxdlxf*@V[:AXKʛX ale sPi\ "@m o9^wuVѿ@U"S'kfX۱+ի_6w_*g]InR5e2mfMǨjrJ43h~TpweS ZpjGKV_MVB/3[YG$_95~ jՓVY_N! [~ FOv,VvVBHRT9-ކаkc!Q:6\׃POA+BnSN'󷅏0yoWAf|zH >{L|kz`PBc{P[|dh; %h8~9Љٛ3F}x5WsYz%$@ȝsι@ ̤F9VZ.ֿf} xԇt>_SP! R B3J" ˛Vz]UeHqE%gm_@wW4f]gXqр;KT @<(@3z YO+.m|+ Z\E$"O?c{:\!kpv,\e sZ$2i&E?PX5EIvR+SÙ!HKyi)Njh\ei(蛾bAgEɕOW4HGFę Ǟ *iUb9v-A5;2܄ǚɋ1>Rzs?`r$ԩB,Q;L Tw0l/֡uzhK|jRDBi|m*;[6ҕMb['*nnlv*X '=Ӯ֩@m]܇Jfvu#3L`b %o2j-18a(OuJϺ*͢CC#Ydڒ0z'cͨ#CШOCFu+ęC7eB$ꇉJcׇAͻԖ}췩/Gk7rIKP }٦^ #GsW.rF)qiRTE9]D6 VQyH7mvl<@w|qm9 Ype7[qNz _v+D^FjM\.]+įӦ>GfMq9M?}~z<2)z_U^R_'u:,ޠxɾ>h;qI-S$ѨnLUO)K:|1i;=Wc#Gnv6vwTNC_uػ#(Q)a"qfй7-vE;2, Hl1 G.q왢b f٢recb3)2=*$YcAUF();8lV}Ӵ8+8&Q z9 e$BӃNbW˷a~b:Kw-gߌTtT%;#4a2\'ԛodYg ֘z7hMgM#[k{3c.Gr# =kP.~'bb" ?]z\Q1ÎǃQFGsÎGNs>ډ4`s!'gD>OY$v0 rCA"` Sn2  ?G`W,يY‚+Xܠ"nXt[-g62\m>Evxg>AcHq@Β;2LLRn|:`(%w"TAډoRLy:4_; ui^D`@% C03 ffyr~|T|?|}:EԚF1[FF?LV"σVBӡf8ڼ1pƌJ3h+6/R#`##0r)0H)B؛h5tyHڼvi^+ˀK6S-54sOPP99 [~.o2] p^Sؠ\7-i[ue|ou^GXr`pVwo(T-s<%v(YBWG^z[dmcoҍaoXS 2}oTPTIoUuõ)h݈m(n7P@|+ekPDri6tۏ>O}8}fjx0mi{>z28~H;u/rc*qԿ[xB+ԯwC~μE~?{ȴv?Imwq|wbj r.y9 o#xT<1;,㎭r~?'G[νz.^ g~K *f i%v~Xw$rxȇԹc0'wZ0jӧE HOuD vqx9Ӗb\J0NX-ܹo&;u,N"nA e3d3጗[K@w!h#-:+$s$O O139%c$C|OZ̹Y>>]e_O龗=0&.;B&ae&@ؓ4 w*rD8##/PUOqɳ0qxt&yi<Vq#3s٨=? ~Kl˹ƀS0C7|9C@ߘea>8hw=~ c~4{C]qass;> \M8%s~\4 wg2v"7ut[3\A}؏٨o:7ZE3Nl>pF Xb.G 6hrCjᐆ5 +*c’/[y@;Dh{A@K ),"RXdgA [ψݟy3+ds X)P-,S(#ϐe]W5wXxqewglHQi^b&Y֕ I ^1,i+% 1#tՑ!@O_nɈNE PT1Wf-Ln޴mFlӼ+IϤUH(,&R]1 fzԼ:f*ImQ~:tȨl(ZkR J+&jLmæ{N;-\&QMV9T͇eTu \LUynU5Vhg*E2[hx 쭧1<3`z`v= D\v 1A A7_ 5l&-WL2m*@pLXz|{h1\2fe D;>.O #'03vp }=kGS7LB5^[GOK]WJvs}XKי ml,vhVBѫةrb;H_/׆.@fW dTJciVX~ݑ5cB$&ṯ~DH^P(Zi)LhDyֈfH//vM)@HCKooؿ)0lrΉȣYT=4#oWh:9Ec}YZ-aLm;-(Ny*aé"WxeqChif y@;%@5!Aqp|}hy;FP >V0bLTA0$,NN=֨/"y;Mzh1"}0x6S[HʋT")3IDʑ27arȾ? ,#җP)Dk WTZ&wϺIv߯ӂḊ@OӖw=(u&§4<~9\:3#4$l$+D~&Qժ V>n91n1# 9: ԑ/5!ߡWUWE!#[X;L[LÞb۫.m A[ p[dU9hvxhwmЄPPQCvX|Z,]D,Tש6T}[CT񑿼9a\T2=/hH}:O.E/XDz~^Cl$äOB##>]ZLr9#ߟqi0q/h? M^{8\<!qh$RCd;6-ŧQhM,:C:1CS te^ܧH$5tyJl1^FI6Zjcœ-Jr֍U:ͻ]+q'a"Oz E6#3*3WX,y =q48rM,[M8G6]l"`Z KL(E@ШHfrݦ/IÓ\^wc* xypU%,x~‚x'fusݘ[^W:sLTKYa*;=7up3kx釦Mcc ];Pk}y}>֐]G}{t{ՂVgՀ~y XA k~ |n> PX7 Wq5|yĮ"Ҥ1%aD"+{ _ajZD*\)@ey 5;H_ :"TTↀ D=]VC<jNH 6+fQ(9՛A(n勡E Ne?uv9t8/g-7~VhˡXehrh$OuW ^1Dop]ej{Y$UЈ5*6eFN*MLJV0v5? @%orsG%Xrz @UwfvRqA6nMãHh&r]ї ~ĉsMH2",Q&J22iv W?б}]5\F2$Q? PK ;4tG*cˠYh䅦W?[G_t%?:B A#u(*cT38i۬DEaLG6m6Z4:3o:Qs_gD|1<0$"<șoh,8uǞDWP0kǪ׎0Y۸M ,Z[YkEli-날5a:]:Eh 5)RY$N69Ia@b|z%GVhʜ 4\ [U GbNQ1N4DQ(j*P4(;F$⸕q]*ߟMM/ 'o㿴KՊnǔ_y&UWTuۡ7*K9f8ZH1vBcӥMޢjRxzw$Gҙ18R0TBJޕbKf($6k;^9$ƼЂK8,%IH]LAo[Vv*W#YodB@vgM;?u 6uZ/שQ/g̗/o??Oq#ŀ=vS3$OCO#CPǑ#J@rE\@ vg]P>|=(Ɇ5ھ5i%TuQڎTVO=uA/= ݱ(mq3;b Q=h9QRm\:#Յ6ԱD9 =0aKhjEweYeɉSW_XAr c FALJ^5A6~lXё_1_i1m7Qs~1\ajK?CďHѐyi`w:-"NS:E/IY1nO&u (ah:0# ^ԩfOgǻۧD IIY z]0 5Z8ulaOEsK,$_>nN,t/% Eڂ+b0F.s'f7旾lEb/P'vE>y O,<&qR梋;AжhyxzU[>`#- ޢ'~haiA\By0W*oy]E% 5lxL [ 뵭z4ZQ|5WO! aí!^AW<) y+ _A4)S n=+"O2 g =`[3 V3;?38*\XKXҎ ͫ>V|/ƮЍjRKPՍwc nR>AD֧((H*p"ʱ |>}i|>8x 8|6pXzn[ImijNaj utEdэtm76]Q#%%ŽPY/@bʻEz.?AJYB8ꥂubYg˲2V45U%,ץ H)!}װG&N@&Λk>24 ,O* ylroL $Eui"4sJhKps~ݸ ے8q׷H~Jd#OQ(dF{F0DH) SM  @ԁ5Pdԗ1D8@0yib+*{t5[rM!B=}涼x]2g-(7W'BbXc8| 1З41QtGͪ:aGKg]#z#axIkAi7 ?wU>;ϫڑФݰ&rVZ L"Z56D uA|mugx#B ڻMH g`tK?'',Rmj^jl5Wt.nmI+pYBf8ViAhΉf0Cw>}sFjvr|t {ޘF*n(>oSV̮=Q/ھca #wl>r-/~$RqԧyJ,6\YkBry{)>oZ^i/׮ n#F}_AG5yV@2zMdzJq @u9 ;uz*nXKMDO%X6m*mmEtd;lt=O34GIʹذXY)qDÆ|uoAb@udz$HdGbx:lPy]M^jXxT|dh˼y[g\`?:MRATR ITm3f{" I u/cnfFć='@ԹvH fs)zC0'0fjD3w"8J>6ɯ' #z@3,YtqʑkBVɷ}t1^3B[m!mY9dl`^|%тstqN.3  wx5y?X%"A49#A朹 w"ThteQ6ZC~lҫk]7*aUt>}.]]u)4q ELcZE[wCbtN{6.!Y;m% Ue͸%׻"-Wȓx:T'W2 ҨW)|<=f /譗4BƪYWh)/*69&595%Iy/2"o2+'M|c?N_X>MJ#NeEuM1:&#XC6d\H WXhfUaůF\egMי+{Fl_X%P!U#֤ZWWQriF&k`E@(hP1dA(~~{\FK=V MD4WЁnq:qIŁ-WPHiؒiV;:n]S _=[#$ @]U'ذ8ߵL^Ʀ.@R"lB:bl:vef H-;.Њ!C˸zjǘζPGӨo.i9o"KTefnZ+au _+!nj4&m m+^0OU=7,}O9[bʶ4JyhR~Q^5R 6vm:ΪƒdJ&sG%FeAO|;L\]ekƞ`s97=ɘҬ+O)YY 5^?zboi׳r㾧%#5a[a{]~nأ"ȉ']?\fp)nac>fuGɾGGdhfO_dlיaayEo TQJ(OEL L>磷WRǛaЧĎN}/;޻oG;ASsɮ ~:Nr/"0+dWJ*M{mo@x!*8B悌Bl&*t%婶k~ Drb Cͥ.z-ɦ4dBUF+2J硕DxNW' Cwݤ>*h(ڍ/y7ohwrn,^rljɂڑ3;M͈R@;H؏<ſ;jy}uOȷ{&'jr:vo?7ZɠuՕ<2W%B,?(&UM hdTd_M6R*-OKArDJRh`Tr)TRPGK"0:58O\bY*M%`rRөAL\n8O4]JɓLz, 򘚞*blEt N"D1;1 `m'_uR~\nGثH&D<].답sj 1ŢlL D=ֹm +bF 66i ZyÀ fm1<+gy3p,O-`O\!:3|}bBP',#0 謂s|>YrAˬ["[wI+㽶YxKa_MZm_\+qzq[mATՄ.qC87K^MsŠx*S?m涇f3#G!%|d,N&Hx3 8j;2AX;HfXNe,IQ^-ٖΑar%ka@&aY{zD OP&-s0 J7ڲg. vܬВ/ #\mU)d-vYx) #9YӕmMovuOݸKM,4SۋA<ƿhif5a}E= p6!|>'IH<מ$,6xܘ˸9tq .Qnx!Ήm)&rez6EM{U&\f*'^έnv레 eO]9h[rKFKjHvY왞0+.j&%'Xwff}E_|SWEU !mM(kng_ϟ#Ód Hv;i[~78ݽ~wW*a`$O<ݡ/N ;a7èO-~W7PM)n;$OVՁZNjj4Cb9y>Ez츈4U(t%Ft5측cY~G]\˦βN~)Į[:rn@5mNos clwZ|#/jz^Aټ j7S!r;Qѳl|{z](vUhtta@ũ_"y9KKĀK t pB\>B XTάI;u&N*0(pB'L@0'vRnY0!2| { 0ěPJZjG'.z);=q|pNTSPDw"NrTn\/fFz2,T r$mKbgXu[/էXyQWmB-c li^nz~pQ0Kn'Nّ։H.G?E}xIPO8dK^JJ)ѶjPCމZ*Ҏ|GNj{k{kҡ.q;REt;3ۑ=a~ d{·2unM:K^UfՂ_T}15REjlLnhZBq&EpZ}7ZoZN;E_b-nޢnѷ0׻a*pڍvS7ӽ~=> >TIkP5pxe-5'0&O8A)5?Hg~5~9Ã˙KS&,ymiB 0șDK'x1tꠀ(=C) $_$4)^_0^Ɓ:X*2(c0NwZx!|'.&,nń"$ٙx=IsYrnLxn@{(HHlRz,uc{96G!|R/YjuiKD`EK$ Œ #p#LW_k,`Kw,sHP{l<39xcAG .n.W ͛>gs֢C=E7JxeoA6li\4ybmBK"6O;KnixJF?7u>º-V!/sdVQi@=Dh3FNI&(=[42jmSA'uhȔ`kà#W\cR24q> 8NdbDUd8Ճi;I>:ǿn~A}Dmټ~8 9oWŁחwk v}m@Ip$>#w_H~]Aq+al3,4rB' QWit9dld V(bS?% }76X 6Cmd?Ud$Dt(K؊4)Zf]57iNƷJސ'd򊮯z۴k+#[P""e"<\!)|$C.E(Cz)y?tN\"h)- NS_!I1(]̓} aHD0/KyPg-OGFcc[Y';[@'?MMVza~yU ᡣK;VTWj* M#$27T=d=tƴ!u%Kb;Z9)6 F* j,е>!{A5ZTpDvÓ;orG4E!1kDhË'̈ұu1ܧʹwwOI7@]%L%K.̡Pzk HS)tl,Ϝ=a9bz%fU71oS|ȭ&$\ȗ}4CiE?] :@7])bs Ƃ|*C,ztcɫ}GTKǛ鞀:_k ~ϱE'Sz \%tk1斿Zlgѝ^&[8enq|8gNR_t3Npi$Th^^" CeY~7#zäͶ64A՝vi _nu^a:ldx4Ν'h@5mj޴mQgb\XQi'ܷ"+8,yC7r]ߟҞp>'hFZ,冻kʡv(;-3Z![p2rE} 6mQaJ;.#?Fω 'q{9z Eϻbᅒiyf̍_Mɟ/SM|zݲ#i-ӵ+U*wJJt9-&g(18]!3";MmFǞ/DuKzىF>_uNm%=r38ER@8-kʣ̧+RQߔ'(Ƽ#k11!+O6E7axt\9r^ȧOEpWJ_-=W1aDr->Pmx :R/GŲE$(z9Xz\ X#{I:Y{6ꤽ+ Hju$a:54Fdz!DG#wqmb(:"n&@0jo&6;罯oa?`Ǝm iF8 ZjȰMpIq\†v9:0T ԉ XS:lMIq}:̐JeBL$*8]+'s+<\}\Yt*\*\}K` Y8ς \Yî:jEdxcѳT-p良*8Kl% "oG1.(ٖDBA)e5Wy]Nh0"z_%&#']+,]8e+{aҪRߴGoYLf1)1 seҥ(]R)תogE`I*1W5f  =e*on @c#s3̺̏ξ҂L~Ҵgy@ `#kC)$ATmY=Ҝޫdk"J0D-WE{_a1U//k@?\?rc#o{O=!>_%=D I;Cf_4+n-l{)&{EbTylsQ=ErnEmȒ\r]+[SlGa:e Yd R@-}9wMzn[fj&`ۆdvRTF,u[@jZV_r?GNAX@쫍5(9-&ars|Җ4"[N*l.b/uD3h4}ual &uߵ8y۵e{?)={s7P,#̊G0ۘ:3ӱܡvsu/V5qBg m;ŦL /@G$EbMBĝ/M'?H/'t3eɁmQxH<#twn7o;QN~o1WͶGpk yrT[Ɂ$ە-FbM˗ćsOIa`qv#TpPAo'Ï _yn#j]EMzoRA"SsРkߢ+s{g,:?#Ic}~;-jEvZ&O6^UPS'w=STDaPiICg#*u(Ch*a}{W+4vZW{LT eШMttF,OTf[P;/D2f'*⸸~ƆnSSL -.}h_49|ӱE|+&ڊF ]ҠkOin]&ǁ^OK&8)]xᅢ/f7ʡVH,ǖJMUo#!M= ` DfFQfi4ô|AFNȉA\QWxy0\^( `ׅG Y!OC2 UDn(U$%NKԙ/a96t&'[un &nFa>L^ƬBC d F_6:2ސ"%ҜuD٢fC3^kR=Aո-mmyǹb(]Q ٲMtKS49A=!M46`5=m(Dq!!-Sںmj n,9x["hyU9i՗MlC0'_<2reӰŬo_ ~El12 ș3nn73*UiJ>i+#{a yxEiWZ-_ܞ0tx`AA1W꼹;tk1s6KXoSOA bB.N8ޡދ^"_" ZV*O&3^2zoOXVIL ͓5| YϟbB_|EcrI^sx!a1(=QoZ2ѿ6(04XM\ T/S}cM}u<L\@_ĩ 2;>NFxFt-Iu?DF)~RphK&uF/]ܻ>;\ZEE#TxiV;]>waMi8olaw)˨P<me04wFA겟Lnإތcu6SWr ( Քxmhh jG$n WZh^oJ?#[Il l|BfϨ ~Qb xFB)sf~q ,6'D֌1HT1FۀE֌6fD Iڭj7E=.LihK1Ǐ)?\e6+f ::lIg P<$LT&LA.U~u^RR]x-rIvEv7.;C@h[{}A!ggVNBЍnz/e##뤩LbfE $(^Wb{Z%v!jޫ6LHgU:ߤ?-#l  Ɋ+Jn ^#6Fk~ ϰ+{[aUdem'+*MU{{!ϑUzAU BRA:d-C_wCلLBZpHZ<IAGێAb44hV2AS'Lc$:l{[ !/3ZwcJq&y %p[:IRse:: MF]%ͺu0aGrQdrl"q(vuy81V5R ɛtofF:QXs*J`WQu0ORh<X{?qv%b6W Rg BhF3bfyC]D6'3WWroj #[QʐzhCն5m{"jI#TU&CCR3$6,s颡Q`ײ.1hrkDVBߥ )Vl'&ĎQ?%{(LhW6[t* ˿q]En=&`ypEV]ai!jJ#M S5k.Jf$ Yt"V _f @3Ԥx*u{#7rn)roC-7>Jy2Ѐ]g_xV%W}+/ *A:7 ǎV^(D&r=$<9;ld/OqC`Oܖt0Y>M^/cWԤOuYxO.D(=C-灑qziEdq;~/TIk$)3iru8;MћYjzġ{c'P:"%q{vSX~-}Nh| ͑_8akQbu_#X4nyzLWrqbeafp&Ӽ{"<ј8D3Y%E(:y]ݔ:;M¾SP7E/˼a܇'uIͣɨwNImwu.=M\YR)E^-W*+l*̂K'Ȏ*@L >uRqA'\)gOjcR`R9vrr RrK-E&U*Ky/R~:LJIr%OJI?c+0+rʥy&^"Rt8^lQTʃ*E'9hFJDJ@~lVj3(*4gw$BիReITOOZHЦs(D;L&<ULT5 C[͗852BoWb-moPzzɷ~¶WO>f9c|^EtdN|Wлͩ![6ʵm 20JrE~yZ*Ia<nG6q6'f؂ :IlF9 eb02 -V̱X*I89s:si) sEI;s!X#(w=(v3rxeoEQ>`[Pf8*(<+WHqxu4LyYxQ?{ٜ1F29xSuUx8xu( F<7NegA;)xȤp@^֎uf흎I5:Z:U4tmG~C7@QPLii88QtBo2/ݤ32_PuRD@P 2< *STwA 8m3de"68Q>L7rhw9^,;}C oK@]㭊tᮻp}E1vVeY$+c*쐙,SbRBF{Neyua{p}FttG0m"ҍUmT#(h!:w Zs.xwuW Ƙ+p@gS >a'Gf)9t"- GCCP`\Y?&9 ˇTFūy -eW+XP%g&q`"hУ[lgGiN^vANaB}\3@ 2N`?՗.3҃;+. .slwǿ3bOtmH\%^_;1|Cj2xѯ=ǣcLf芔Λۧ4 Ǟ~*,<9:M)dH>Cn&ʶӪ48N첶(s+EJ:};|8_@C[D[҈U>eDQah.TI8InȰ"RT 5~kwݞE<]bbYL _r ^_ y}'n Uf -c-_8Юq39{^'7~Msd ?~gQCf> |-Mo3Pnia2a?MnfWT͙g0 ~ y;Cp9 ':]!2 {pAx2:?Nf__& 48~?wl4x:a-Dn[Nnk/w5Ee]Dﴌ6erOֲX#|-e}boSp= 9KErPw`Uk"` rsDkr @I24x9wu?-xJ(Z=۽/(d=о%nfV[];nݎYo_h`tv $%8c;T09mRl*cDݧ%Zb4H/|hPDg%ފ]SE_B8Yi(~cvRw6if yĮ(}s!<a   'Ze^9u{MJ7xs@[s5\F(o{}Gr:-GFM$@mz*Cw]nrGЇ'0] URL3)NG9V3D(JLWk/]:(WVl뵪PY(tt-Zpa9ޏ#v8 +$ΆVCzkL<_ f<|L;KݡwBR2e 3%m,Legj)R;u,UNO _iw": u0Tq+@[JsPϋ v"`Gkqnx:y2oTڷþAx筞3NFϜug}>9'Zq:t\Ni.~n;~Nl/z^N=܄<5h NR7N{^d QC87X E]8P45~JOٜ/s\w$|:)~1s(9PY>QlwAx8ᬜR # 恾."j4#/4 MAPJ/k(&Ԓ0p!jζBAn6MCGN]p8Y\!f9xA mLw˗6ֆO<%13'6LJEOI#2s_3uloU3þbg&hclg|Wފf[k0+tK=Vl : TGOmwފ}MZ7xkd'[,H,ҼNhlL `K@۾!bڔH4,}[;d/楿NGccES(H^?w(,CI=^_Fd$dh/<A10p+'>BӖ/PV7Y µop6f 7AUU8f~Ux2sWX/\9Mef򁡑3lwTdy7Ab/Wc?GtW8r1C<&/<1T!fM͡崸xjaV:)a:ˤpFŬOL9% /1p4͹lNԛғ=&E>2+M3OcW2SwNi4&ܕb *q6[ojx8أ_S?e9ڣznj#jZz#FVFtr"ikrjE@jkN$w`0e뵇㔫k宇Q.kqslz /2yJBO^2~jmB] (;2yRhIr=rP UwuV]ރʯ2}m5G KDghr$.:+17m7!ɴ*\k?C66·Wͯxx=CSBL<=QSѷ+jma3\pu`/8G:SҐQ/9ct/=ᗥ  ABovU@}E5\E3849T}ؼN}E/BO3M%)iH;t!IJ_o4[vep]@aExlRLeL{jޟ#edd28 cՁqa,VMUWͨL#1rq=8NTβU:dmc3$t i8&jx*/%_ѣpœt¼zM{(ٕ$CM$񱕘.rUL_ z^XnFjʥHzYfh}FfJKO`i*h'7v3M}M7.HmT#'Du y/xI}^H2[F+4q,P+x80A Lf2 8!#/ߌ5 :рk4uy6-nz"DoRP`:MCxJ6}7 ?$iL{]"V5[|>&%;B+|gl{_/-[|)` `xL3PG/#,kLo+b2}|=!W3:jY X|*Yϣͱ݉#Qcrd1d]/Xh;t9d{!FlX<˙]"d^ @ȩ |\ /0!R!x(|77Jى`^:N0N9 ``A#.@Ѕ sn-8R|X pX*p S8`8LMĖzH|7%$ЋtCoƽÃ쏣X4Aj.v?M82Q2cgf~:tYEғ‾Rd:=/x|8!Nظm`sGOUo|ɣĊعes&~:Q;NݎSy==yg6@^?=UdF`_72 ZṔk9`Fr$"`ET2b:!PZ xԒ"V2ѨBjިjz*G@ 8럵GgHp8Y@.ni33̰ø\2qX1+]ޡ6Nc*z($d@`9<5=QaЂͮHTB@Syઃ(0 מJ@jsM a {f(x_1sbnVYXn, DMxHW\SWE-;2] t|\j,~{ν WO FD!fpSv3t *&jb$RI0z{dvR}WJ0BZ`L+yS[Ј+]͖B!csoCB{B b*I( 92YmQ;v}h$9AU+*{IE B si63Qh0MEk_ ӛcߟ,;M'X%;<^D:M/Lדe\|YOY:G>.8 &~YcdMBQO|qELH6XB?R 6s¡}aPĪ&S4gò[gE;$1Ԅe=nxk/$tMA]r&2iuGEeVlE2K8+. M_MlNaNEe-T0_I6-eh22b$4|r 6w=:cC @2S+DM7&#/q)٢.$רAEW!f8j;Ծ;HtbW.B_wȒ}PxU5>QH^ AW:*%g 6WB3R>M wHƗ,$P<(aF›J–ۓ!1<%­*S1q=m-`$Ge=yXdsnuc[} -` ih7K0W}A68kR% Mp%8KoLt U5YaS  -Ԇcb~CrϨj"⭵BX![:2 _XDi%`'#biI/;!Yq'xsI<{hsqD78-u`4 z"=kIp7َ6 ifP%8p-^O%$SČTPo@M'<ȇ9+"i L΢b3ތ-?-urfJE︚o̊s<2Pͯ!uZ@rP:zpY@|VyV@U-p~BHP?w9, y>`Z.ÈXڐb൥ 9A:>7jFN^5jK N~ ϝ0 ~9K~,W֗,ȡXjTa./s0FI)58Ζ{{Px5G#IvEw6Um 6m;&,]Um{fv,]A$NEw}ACix N kn4TmVf,VS [zTFFSx!$hZ}3[Nu&@FJfyYM'8mrs!/[eb9I8*4S_UnYKژ5ڤ^I^X{B mMQg=yOF1z: iz`Ul3u*BG\7,i&IP\8ֺL׶9O؃ Ti[o<(nt%ӑB ^a @72ΈHDr>-ln]@kTAq.chmdX0oQ)rR]Khid9d̸>vbؚ0n];:k'=?#Q">ws=Aء>HxgMMԓlIH[yLR˧/#奆jLlop̋L~t`SQ>iLի]cO7? T pS];g7N:QAa:3LV–u6#$a'=ϗ uW]îJrD3ۿ8wOlۦ ⪈ov}_;4NW3}EiW8= -Av$hjxqH k6)#/ȩ3_O`TlL'L#+z1@=bxb Jo./3S (Ár_teIІʅChq% ST+&MɅ+qǎ€8mpW!Q]ߐ6?2rうCrcŠ[+ K eo>r𿢪+z JW^#|`?#[OM_2\ODž| . W|BXn69*tΠI`OoUlMNS'۲V7\R]Q3AElS.v1)= z lxj# -S4a =YgDfuD츲Ilg/b_Rӑ u" T d|F+ws`5(& ψ t;#5ޔPx7DSEvdz8CG֬C8?7sz:0{V&EWBp9u3f3~fu"ҷѢe܏yq4LKsg:LFWyj:a:b=ŏ ɓ~Y0iYZx9qi7]cY~^;X\vgȨ*_fT)V{r7RdR HKܭ!vt'rl/HʹǖKKyHKE JCԏR/gL@Oh+%7E*WJГ1RM/r2ga"݅\T }UcXc]ŶH0\869=#3ij rQ|Owo_bЌԈOCۙoԛ+yŚ@v5)UaS;ΧNϿ'oWo><*ll]e>\mc4lo"$6o:- ԶS$+ߞ,BO:!XH}?v蚊DCNoxnRLfNPHi`̎)7'̖p:dtwMfNpձa:ؼ 936\<)ž|v2Mf=DZXZosQcAWx.j%Mn?f{Ӗ%:5\UOmlW~|>͔x?tR߻PO{ (L4 h@҉8}zg>ˢ pv,t0Yf4ch]&d @`ގlٰD1>Wƪ#Л/ɧEo=ekW=Q&+)Q`l8AuT'2\\!sX@Uiֲ}Cl<_c\k8Z/ ndxцٖݹم{v`$:e|:1u )Y]pȍ1+k8G%dۄęU~Ke48,<67dW*KFML 罶iU BVIBZ*63 hIhm <@$ f桬295&ϓ}k5(0EFq0@y`s 8-bHtyC3R062ö#m~^rkѱ)ǰFYBuPupp;%9nwPKߟd޾BoGПCťovz6x=yfLPGi$(l騉C&Nulq}m'y} q2 mk/DuRdcP[c zRXJ@]ԣ`o7dP);!P3Z-NA-B GUTz $WE չK3R v* 𹗲?1'п|~XEt܅˃2d,B݇``z3ZRe9RG<,Q]b+2KT\6 oMݮB򵳡.ȻOqd.*PD%3Aʶa" hHKBEUE īg-n|-h 8FPRhliSgA 8 P(Lc`2QT'6 /\ PAؑ42 5E̿a_딖HV5y" ޡ1Q]jfh6.'oCR ԛʩ߽OܘM}ЂFLO5S'ǜwm^!O3X^"4p}w??o*J!{ lwUț5Lm\ HMdڣgL;rW?W w IrkTۀ^ 5^Q[/8vYpV퀛 !ͳ~仹e7=U#[qLvC[~dND@,s݇:|{'i\!0GvaUCwlH>t d\ 81Y~qGPS,㞧zWy 3~;R8*ڡmO913Gƻav]"PذxR0pڌD(qj̮ሲv߿I~^j9U\wy48+Qb$Tj1# =CD5 GO0a:t1y씙]7/;K|;>^dqTkW´;2nb_>|U39CQ K2U{@^sx6W-NQG:ɳbOYpt}>TJ?&(CPl|MTI=l#\ZXt?6Us$+<%EZ}#j'Lu`lpF_g۫,]e5~i8S\zZo5&d([)c-g4OZC(FbrǥSVP:7`n,AfNX{j=o5D08d2ǾƈT:r- gp$U`LKIǠYj׶Y*"HPJgqGױh # |[q d@gde59M~]p^}V^$3)hed˦vw<3_)]Q0&NQq1EzSwH__f n$^3?^ǐn':)agG27/))菳.o R+ݮדLx?ƍz(0ݝΈ9R7܊H^lF"D F Z6R*-J/H\Bۉ~A-z҂J-ĝnDJ"Qvq@[PAj/n[)vq %X rWʳ/c_pB/h$]$ E$EG 0_ PReI- x-GGzϋB E/ 1muyキ]]g{ f0 .$"$7t9E?@We{y"*/ɔIZ)Xώe:ZF?N>WOԊ B9 9LA&.d{\#Mii}\(Ȑ1D3xE ]$ f9ϐ}QkL1uJPq>L%lo9P!q¶nTk bP#)":7WDG/AǪ]oi0Hp dm`t|dq8EOmj0#N!bL M`F7V+kXƊB`|j.o@qIՖ%iqLQy=lI5.DKA䘔zufx <|dy1-ĖEb3G#llFe'qX 8>*OVN) \^Af'譓 x/VJ]d+ar2AKnlP5utZAHw`492pz30X4E%TtZ;$ʕԧ˯A"U\?+ !gvHV李5b^pTҍu\Uyb*#þ=M~ F*!9y1KC7WDCjJ#Lz]<$`WMO:/s]ړub:8+;ưض$;7u$fa8"vl]uF&^&' 4;WH}?m.e-Gs5|EGch+#E%5e=T(9L^G#ڐ@{Dwz~UIn !u/37þ.zq;E?3rkArh|hsRdN v}99yꌙYz:{l]^t2=bēŨ`ihwV?*Ti?S7!ʺ25.3G6wU붾!5|RimzǞ=#&2Mg' 45w u<>7'#1sl㡂%jLS|}A/,E.4cinq_{O{ ţ<{RݯlY4:pbԂx7EyюIZg_OmryN䠕Ą˥h+j*K̆KrǣKu"\Z#RYzRGR\\(XtR RԍryrS@ J/&r/wE̗+n*/ zeg1RR/Z賈Rxs ti A*UJ^GZ <юJe4X,r3@oTTuD KrjD,#DNW̗`!}bF>׬$HкKk8h`Zɠַ<c3 I$uaȵBAO9mW!y\}B4c ~ɶʴ[:|ٰÔXGуM⤰9<P6ݑU!G pΙKM:9Vu)xzavLv9:lZub́6nrSiո>e193"۵.oo뛏Bj|Am,WZnaTk/Xڏ%F’H~h ۣZR!j$YiCC:p? X2TǖɭSУ?E3T!Ȧ3L~N]Fo&CW[V=Dt81Ehueᙝ~;˽}W{۝Q(7G&Ir$M0 %9K͇fEay}qKo?4#ׇ̭´ߟ:_]+..;>l6[+ wd$5&eС]0dXd 5LG֟ښANЉUgThyɸ`hr/4?AuUEef(!vifkp 摗PJ߼#/bP2 0Vmh8? Ȋ'h,W)yҸ-VLH S`;kTjux7]'kGG{Nt18Rʹps⻣P^ԗlr|>͈>>u;~3Htۍݾ0ooIps~ԽؽF(Cmo &G5VيLD;wc=Ϻ21Wʴ|FZJ٢_q[byؑz^5ݜn/ǎȅ73gm~៓6~|,@7J] 7]dxϨꗑ{~'7C庫*C9vh(ڀܐٶm@JM7UX#PA1XtF-_e7]Q;d5zj*vqE=j j 84h?/+Tiny]VsW1GO%qnKb![lA޵ NNB#-x#S ٱ"hHQe{+!ɤ50J*xE ΊCN5QKa"bFqc8h-;ΐ;؉EZ~1~>Ԍu ^d :R!Ș_|[yZ#,yWWmDS3T|墛G="i+KFwfI9Zrb-!P2*U*y(.8!Q*%FeOO>)sʥg^ur) yFR/"@A?^'h!Y@pPR$W^*: -K h?‚.E +BɂGZwz((Jʢe]|y0]i*4cC&02ՎYdf7WjЗ`5ڏ?*Rg멌kLmpu\7 ]_#UU\!VcC+TsS:ۆh 2 h6vH!f<єrJ$b&” U[%S[C,ZKƶ 2 T*mHTθx\{{rUL"X,;EDrD uN!Iנ)uy&mQr_2{#VA"ӰH9 5hNfQ {|%PZQlNfH'9v Favl&՜%V1Ơ.vHݔuCnP:uT3Ȗ "@ '"OrG]G#vjn?3bۓ R_ٔQI۩|}o" ͯSì_Y8w Xo?80,obASۓ$2)a5v.'>Maƛ@nS$6yn- 6=q>_O@&: j 4\7Q" 5zB`Ju([56p=W1ZWC_w6+v]O{NJgfp;*5|4Hsq0{tt%G"Q+ƔD>R$1]B&Nx]QPEPߜ)} o/2;'Td0T{=[v.ˣ_nzf=zf)6|5txىiX$i>ާjgk}?`ڠhfm0orPUu7DGA#RMajDϝwC-GiA!ξ!fi#$-G|leI&q :I|'qrq, T9#Z_Gx&S͟Kx㑌|?IDc.W}jcW>u=s{lG?`ZH[NZl a#٢{!I9=鬣Q51lF j!#-'KpC4kHZEs=61fuD;4Z!3(࿢E|32JqyzpDU=T$af'gYܗN|=~sp Zx50YQ8 ${XqTܷ etSԕv3xI>vT-KےŮ7S8IO#9r'+tgb$e-Nv_|uA#x 0[dulw\:IG1D[&k &g&JN~wT ȋ^ +h~*1b(KQ6'ޘ}&d PAY=t3_ krQjcRj%S)ˉX-حr8p 8O~7bʕ"Vʥ;R/?A.UzIgVy) éBD,,/-t ҕ  hZCp@,N-BpA^\+?ÂO\`d ×w9hx-YsIr߇dzmfFAW qoR%R= 7'WrAKFGV#+Q]_@7py7dc?AGƗTsb 9~\7ߓ 8'"T'B)$c(vZ2[O01 gLw?G3Q5R5 #{mG!h8*Y[|m|(0Pcp`Q(\biEKHh_*cCYzn2%SP C};HYj/[/tх<=x7ύKK>Wد5˘-©kh N#s[И#jqbKn`9Seu]/ug9]l8L2jXۉJǦ3Uo'J`ܡծ3Wbn4Md A2ljp%5bB"~؎dW*ҭ-A[__gg}gҔ,/)cpE5J,e18s&M0Z+*t soqG 8|ߍey6y4AjST?d㇃4Eo]OQsݓ }V'])tr]yT@ɳ̠w%YCL^"'I^ \ Os[At$Msۗ߷kiLO fLL`ݞx-_fٜ=InwG`&fx|V{7 (IfGeb7GC_6s N8-2 CSy>ps-жb}󙈷ӠJq'G}܋\ jH cM 0cl̘a銒ux0܂gdOR(hź-3O]v*EE'>^7WD}Ŷ=@SSsٱ*.L tNp phOuI5ctʆbzQĮ>5eJqd3rtoΏ>aievh22Wӡ~<E}a/;V,A&ZE=o$\>x3KRwMNgs0IQ=<1u:)hNWu^.r+?svE\L?.Ue.Q2*խR YyZ<8ZEWa*jkE&֪a֪ZUv'oU-ojkD}6LjumJL0<, cF.3n-ka(㫵ʝ-3R 3BOem(WeOsՓg z<f6)ptRHk+RDì3JR$S|`| wz&u? np35bVڔ#b-lH7F1AK? ;mА! (],Sd^;u"iKMn)? !SU'L9 e#$s uASy!|NROFn@D]*`Y8D3_pG4L-(ABJwd|3T)UhY(v0RI 0= Ӕ$FxjY$37:G*HM]?ߖ$s u-2FNwsd<٢ЁD!OD k62sk $dB%ݙytfHȌ%}9+bjjfik_uG/J$ёnkڝ2+Sb&?"EJ>x0 ǴJ FADsIٖp:l?P(Ǹ|ĤImi j Vn{&hm{3 2׭oET]~kFL19BSRܖvLW`%j_d)9e,wf] p錽:NE qW@}`q}&Ͽ@]N.\Dm`&/g)db>s5Es"5(ΰ{J.VNt8ݟ^/GW,cЀ  /aMߟGZL}'xsG xLt>Jۓ'z9pqA+f?.NN (2FQA^NYzC=Yc{CM[ydcx$3L@WD M-jb;|g#5U8S工~lFahܛUluኚ"59N9mٔ؊GQ) U,Qaۏ'CL/2;ra`/vSg)Э"`J>zS_fRIZ}% Mds?0ruf sbDR2Qt[``Ƙ79HlslS_)N,pqhP $IKG!zfwV¨1;t#"[[ۮ:N7qf wMp;FRHGXxjK=4"VxЎBFݱqj >9ټK yтFӠmA+,R^秖/hAA"}(>Ӌ`=,NF@WZ4n4]fONr@e9Rzn`/M>r s^Fc^p'#Z`Dz }oĞ =+9=^L_R7a̰7L:!whCMLm Vk**|z ;:; 3TwWl@Zg*TAaʬ7YQG ɡZD A­IWPBuVWtRRYA8[;*+~TƽՌUϊTY0a.WWl~b2hjΎ>PVRu-Tkڤ"QVxg}1z)@gEDp S:Mb3K@mTnқOj_bGәu#R>m8 S\XvŠzuZZ뒲<&dg\.\{ N٢BϘgomk,O$WPIc%14 ǘE>/$ۗ๰2&p\M,*@-i2<"sXD9 kTnY_lsư̸w8杩*sޔx^,NČpǧ %] ƄɳtOR+cifeHB{X%.Vda?ar99)aG}'H^Iz ۩GѭR%pdy:`ͣ4b `i% ;0dx駥k/sS6}va4 bـ;ZZq u # ݊'|yݺt$NC A,Z&*БB70ʞ&)}ICMRv +zG`,Gh,c]Qzj`bf(-2,ef8웹FbRWScn7%]SO% -ly~9+^O=Ye^'LϬĀqC,C&&+{)Vƺ+_c3;+e`.v_「w5ws7aA8_/r~17J?CW};~=Nf/oaI[N%y w"j~ϭxsRv)}3)ܜ ԯWcݤyfuγEGy!!8B@w;o LҦrfG_˞'Ui}5D]| '~>\$|\т)R͉"cXS5^̀f1 {қ2=Է* R $b3'>x#SJgh 8vcq.4@~hH(U$pk\sqv뱉>0h`1 PkB]%V &Gk>1É2{#?8>w>ho媮|9i:[o{8e淳 wmQnr & ;lPUV4s?ujaHgb1m$aSޞ*Qx p_=W~h"0#2Y֙270qQc'3\|@>Q`=fyzY¾{.4}pFF^N +ּO7{UpΙ,3z0}Y&`f?s3sl0N5 hxu#\nO;Z 3H UT0T 9.^m@= }pom:£˟M`n]2HcaVPFle 2@ F) R$H  i\qʯFZuJӇB٧|uW0]*TƜB6!KTԦ2c:Z x5sǕ @6Ilv$R/=}_\@R$x2uڲ(YVJ*۰zy=~{ߝx tkG#y@7!Q] :feG*@ d 1GU t/΃v\ZS;|d2ӮQi5ՠf:n4mUR꠾uɪ5I~6@Hҍm֮=ʪV"!iv;<e a+"/f>hU4kd+t4 N]}]fXIK_h|‹4=Hd+ITAf= :]jCjh䜇W7֞MN5iJ9*&;4}d,e V%FOJd6K{2ݷ0Y{&}Qyuft͕jU_R }Fထt<_jΗ5)0FƇ~xyp W듣x8|J,2CylovL;Ij? |{01".{zJN@1YOЯN^Z@<^fQ4: TM6ha#mF6Zc0zb(8FgL\X]%^b;U.XIlqSE1!o ?M¯;70T{k_(p!haIq 6qE=?̘~ +O NJg1@-x1glJF8R܈9M@}B]wyKuO#I@k`q#%d GF"UKߪ#3$,%"˞ 8lᛌl"gZLt;SԶ;Z@uK֔3? \{d_~3BQ|X&pJMU]"zJIm"u#6\cToCb~D|=H_0"a c0dl;㿙؊>>XCaTs%A顱nodQ!62 ƾËܱ>v^[Uf23 &_j<. E2bM"5%<4=p^:ő-\9 MAe,b u{0,3hݷd_,\.fT)N^9ZZ7JRKkӅ~O=f5?+]..U.WR,JyT͟UʣWdzW8sbR?$RT_Gl d{T*"1KEyDC;R񗗉u^J; |uT#iO>v_XeU3Bg@,r/]5^s-w : ?%G*ݾ 1s#%$wGKa&C=`n>ءPKu?SW@',M` kH\++eH"TQ" 1׆/"J` fKh"BB(8}*k./t=GS˳a8~ЭOa[;诩Cgk6Ȍ#v~\1v=6:ݬUjoyeF V;Бo9$@dکs=:֎VxI- #7@-oC0S6ipe*T0Ѐ=Oz YB· !Ѿ>f߂P@ZζjTC4﮷ PƸE`̉Kw >Ύ=䱖 hSի <^;E Q꺽ԬCyz} ѿsǠoY5m6.drf6^ANs;c >Oṣ~gMaEaӠ]vfQ2'J=ã=:I#2jmMn 5hx h9hJ}u3b͓y?uR#+Y6GK'/8a-($º0m8"51tm](ּ$VzE8:v2S\Ա"A7C:+ԎгaqϤ)I⧽33}9OQW.bzɛ.0j!hGq+0iH$j#k3b"sx8l Hl XV&AGxql<}O}tb}Slǖ Z_߼pGYwru=.Sx3_2TvuW o6!olgVu֑e!dH^_H߮9 ie=02/#xȢd[$=5"ǚ?;pX 9NNF. O0,t( ̀-fvKcE#TWSW,/ci4}7nÎAU5(VdBH,j̑.y؂Ј}㞈#[@V!s[i OBLMh:-ˀeP٪HK6eW'Dc֑"t(|az]H0 Bfp|%b+QΒՉdw}H! ߜjG?,~lwzQ2 ;G'䗇/FgMWC?2b yGCE0fN"J#U%nę^澬A 0TlZ=I`|lG@YzL]g5vOQ76C?mml"BjsE F ʽ𡷐+NM\Xr,A~qH kyR!-){I*ܫzjCKWЃ PsW]JAN(cR bJy@[Bf(#E®8a7X' H ƫBy2@.?Q\Vd݃dG㌃\㏠_.̫@x-W#q_{ Avvv l{~f0x?x'}}=;×Dv+ ,0V_ؗ# ⛏#|D4Cum Xg_8B5%,ruFaԷcū SZʣMs_hÅig/4ًlu㰁h*aqqy趢7A qd:Qz]:ˈ}֠izjK(Bljc1wME/@~tFb356s08ؠY`-DGl TBwA«}CwFzX?]yq|wV_{ɞp~}&Toz7Ǔ7Hݜu??S8i?OK$g2SQd878 ݶF꾤R4{{bχ-.i :s[oF;zZӭogdH@mEP>cC?u5{j6B&vRfRVRm\$\*S-UR*G!J{ هrЕR҃"* ?<{y_I>\ ҃ ~+KyH+"^ Ϭ}5) {3OpHv7La>0urk%nl,݈9Iikϱbq [ dď]->Fۛ.Ӯ `)ds矒m˭dŰQK.j6Ibu[0b]ᚨnx3 Tk=Vr}4WS>i9gd"wcUЛ% ;]IQp242tZ3 -zi1f(~38ǣl$('jjGѽ${D_L뫽b|8x1FV. Ӂԁp7M 'Yx7-AŢ #GɞuzH6SL$[ٓܕ,~vǧހv(g~w{r@\ uGED:|2:ߞ&#As:FEd@sC.=\J6 pBRJ] PRƖʀ pI<쥮9_JO=\ЂAa$>,- CK<KPD rه<\̰ AĀ 4H,Q$.PJT,ؠ4H]B|&bN/ 6X~(X0F r(-"˥qL,#0iY@pm`@[ÐzH$[UZi[<<,Vh&A m\"(*13 ĎMOypB F@͡öGAQb*4O 's/kׅJXOSpڵLF扫j]⊲]_PIC#e~299J\VAgGE_a;20zw:ul{zw(맿ih?zuvK8"/"zEW,*0%Yv}Yw̍ƕ/ w@pD5466FBˈݮ{+ziuxIس^gKP" &6}$NBߎ"-o [ @WɏHS|21=۫Н ?yܳھZX*4/>X'K# Jdz0ChTؠT.60](?(T\ y=- cn/nJ),?H=T*>CqYx ({ha4 /*.[?`. a2@ŽćQ.<@|c UJ?@%`7 _E"J % X ) x5ǓdqFX̴{{i{ Ղ#:H!G^zd̮W*_\g#4فȶ$mWDTN,%<Ֆed(R9 8x7%tOwUǂE+7:G&紿1acv&g`<=l3RvՎ' Xp9q:0~;" tw(:*J ]bvʝXzJ:fEL'H&ۻD2-+!8iⴅi pꇪ? 9Ds7%:Jl^kFa9Z쇱vΦl#gF5 48BL GVCA C0C(<,37.zy#/3kY#p'-,W_;VHX 2%ehS :& 4qoz^ܜ.E6niX4F43/v䂘Yiב-{9w=Yz6ׅ)Y f(h29;+j.A"sGQ{2]bhQ]7m]D Ob3_nNWuqQ?.̵>ǫe"M[Yc[v6rkwl ztb GQ;NӻoWu:Htg3:kC}j*f(<&ckĹi61u]bг,k180Bձͩ_pM5?A Tg>,F ywolΠS#e>Lt;; luGV9#aUz`U'j$g(42gO ]ҵXE.XYx$.:1x6 zj1"TPZ(rIؐA BFÒ=йކ[5G5WB# iYɊP94Z)hiӔ5=-<7>n >; ӺBܛX1L`qz|c2rCGo$~d̫ oSS T!եSO< Ŭ {ije)ejtZ"^&o17fȡlj5\uw8~_/ $FRKNa-2:j51Zj%jH sj8DV]Z6x!Z)JZ9p`7R9y6eRrvV#Js+j?aWV=SV&,g?[rSᣧFzR s<Kme/>2gT*\XFr|P jdT'R ̹ `fCZUXvjJ4/4ԐtJ锌ގ B XH$zF;ޢ"Y75U1oRa_ TaݶET)‚.jƘuCHxkz´6I6;.o=i&BҍmDcsEV&N*wf+ d &cC;H)(:$k2i"c ]EFv 4x.K=N*X_PwWLw`O%06]D_؜]f*Tflpt *s粯3R驫D_/^L_ fG ݎlA2bw/:\ =Hܙ|Zb9 Vl-.:)M4o_UVڢM^D *aJhҗ侯Rr[g@7:~nsqfcJ9Z@zaGV Hz=T)#/2:g#jI;!yE<ˈ b,x Мe8,#.<9,ALF5q@H!:J'j_ˇg]yA^: |9NnbOF]=?]b&|M~y8]aSÖ4*bJ*vKL}5\+P[/wPgM 18l@EyPl^ker,}tKn\swX7ɱ5sCc e#ns:Jtr7Nl蓍 |yȖ=~;{Xc!"3&mmlu;ОDI9-@mAT%y &v?{u)ؓd#/C C;ۮai "SY~8fޜM'7*w% {y QQ 5 ^vdI(F-)#(҉ڙ #[Ot09ד@ Vod_o|=^N}ŧ;I+#p*}=&D!Z|һ@PlqOv]7fcc_XV#+$+:sF_Ї LO<:o=4PmPu_puKԗ 72c7$>Xb}l?VVl5$G6عpo(C8j&P0?~<3O's]_3sQ$5h:.bq^ }?lP Yxx2_Z[!vQ h0P%3VbY]zR9j l%ѥu6)d!vfIK[+<PZ;T ~~!ZaKZ0`B'C`Y.iA/ÄVT{3 tR~eT %-<6Xy8(%9GB@ `ZmT`dT /Y%kKOQQxV>f L.:rܾ⪶xh- ˳Іyhk0(k r`[ۺ&pmo$*AwQVN@gi0,~X(bבT6CᧉxO9dQX! k*3Ю?QPp#ZĻSK0CP CǠyhj'b,MЧht3h.A9ӹAs}O':δoSS/6+-m\FFc_!"I}ݾuYp%S\9)=р Fu5JArUaU>JP1yO8xaz$H&z2H/OPgTijh}6->}p<=OC#rF 4<۷4 L '+SMS$lmP%sPT;v=QÎTȾt 2)iJ H%H baJWG}/orܛfQ^JcD>Ūl ~W4d90[VLTڀg @+QhQBZ/L1 [S94O$&_! LM<}Q䆎?NEO19dKvw͢#p  r۱J:b=^؁fq۲-*U tSOǞb3w#_0Icy2BN']'i&zм^}uY ]l{뫞7?ܦNI^8a?spSajoMC^RW%yYwĿZ$^Op@ha|_ $;M%-ۛMPe*R= E8ut'+[|bf;A}rq/2w۩Jeѝ,-_Щ-nts"5CB{[g tv6r9Lu$ c_clOteaaW}_YP~ڲGNFtK7S?f^ݡҖ-eT owDn?3V[ #EbK9Qcun$Hw-\A`. G04=}jP-y&sl{Q׸Z!\>Pfp<>S&G1h ~qu8fO冀WT \D|{z#aM.8wJH2e+fQfi9 ~wU*qP ]rFCIPvOy ]8ih~EfX&f$4>[ꂯ*c=TmQ%J[ˡ/i8JE3x2XtEފwI~{7vɨ;W ta8&EcAÉV&*֦KF-kD|[dAjH{^"WԱPF\i iiSF14C5Άx\s@o7B#"30N/`$Qe_ЋT(HIȌ̄< K /{@`v(x-dnK81G9ڞum)7ly[pz ai05(uuIxԉAIҸB@!f{YQ\q9w3Tpڷ-$K_7{+ w w@۾FQYpRz7Uo:|>y}p׋;d#qldPoC-~} ,^1/se w7ٲujO5 W2{ǃ]^tB\{{Mk 4'_]d!j51:XoWB`kU`+jlBZ%uJu%vjH8xRI\Rf.U>Z5sj >j8T#GJ'*GV*ZFX$Xh0C9+yT)S>ǽt;L̕~B֪Q zLO5(ZujuK*+U*\B=3V2y4@Le +˘LO5r l/47b[͢]f޶g$ 뒺!`pdۼAeK Z }Uv te]Dhā5C#G۸ k'|Ι 8#CĄ$ƀ^o?Û?(&mHe3N!Ix4MA>1P{ܝ{PՔU{(!s/$dl'dgn<1NḚ3݂`}P`Ł@l~Cd}U:Mփn-xChu ͦHAY{,9ܥ $<pIrcdJ+ O0gc__O|K4.G鈴jbEjF 0SI.DۥFB!س[jLr/y8>=~ɼ;ٽ%wv+zj/L=L?{k_#g/?\;x" A ZEb Cmax3a kkrp}$(瑩K=QeG ŵxdTWR2cO$E zsU9KÁ/8r h&YX2S7ɊE*cTwZ L@VF\e2],6hh=רjj=!:NC[JTgۛ|Y}mG9 5Etgvf^RhVpi~w$a!Ub;4ш&W㞛33 7SnȻ}Wף"9oe:R}"5b(,:C}3.Ϩ暦~9 پOP ЋA͸AhYRqfmt sl7tl,:M[ڙb1-Z;\LCEERT3hʷxd[0W%KH'29YLS١h1Q_rOQq rC/KsKGC'RPڏs 45r4T& 8AoS+})#9M"s)qd2(:Hޏ&~ߏAGzgƯ+OUco % 0s(Ā{;dK\ı獵Gn@sW%U]ԊY#twg7efL S,~w7ߜ{Y24fF)Nup6/ǻ>j1cM%OT<hUhVj+D@o@STVRl>^Y0PPE@oJe[s<d f>${$Me虤$vpUaT7?ϋ]nKb]t9dLTVw<$B >?6]0 /!M[Palt^fFH5iqE^$_oza8sw|*ԓ,c ^2ֲ.m%Q|AFQ Tc+ć@"It e};6"U'H 'oo›NZ'ZD7:0zF멷FNp7#2 {_m}tU Lۘ[tw}nH T5iV/P&m5!D(N?jx@Qi/, Rߝ:̽$}=5(s/Gg^oJD=7wΆo֏@m_B9h>9pZQa^G%_cDcuyZ'T{G}(P,N*A͎\##C."m:tz1=f7T=lYe?=v*z?p%9ϣ Ļ-HP(1F  ?t{R9"-zwRz$=tوu3gDC|uܳ4XL-e_3Գ4'w1{L C;nÉ9{XG @05U:'˩͉ j" ev?12a/Ge0Ȼ S'g[X9eq^ʿ&˻8Mn_Va[_YipLNBsPA`x_0y^ N` 6jҏ(ɼ}&@f6No*]g4Y{7D˽OLs_};^Mr /'I 3x^Wɞ>XƱգ?^ʁx&r\<3(څNˁ 'aLOK8,iďȂlj٭<%& Bi˻Z'XUj¦@;* pBX'$.%3|ZK(T ]Y"ߔ  j JGm ,P1]-!VZ(fVժLv/uh=P坃O0g"엖+fRhd0jeŰT3[[Y_p9|x5Ws\Iv矇*̚Xi56lpe{[ $@l7i7TVSz'2X/8wW~cr#q]!ی@Ci#i 6L=hwChVwed8\Wi &$|)4i4 ^Fy1`ќQHBn+ #LA\7H n𜑐i %$sFV,wEnG:6#1atS՚NHM4x^Cޝڜ })RHvf,͘?M]%J[XBy4 }5>/b=~ټ9|YgS=< r;Tm|݀:a#kɋh3#64,^%"扵cE,Pd.W}[88}΢1yQU˻܌GynR$y:vgGrXG,rѝ]uO{.F罟z`GRҖ4mXs6Z6h36zݭT8W:'m)NZ|{-s_c3GTDyl$2I3.{L7v?3]Ih> eh$ɆmY zhA>?٢}>vD#T%>>d%A{tdsؑ\H:9ج6mbGU/܊M ﯾ҂Je ;mN`@dn0)oԎmpN•{OEo;)J,N=]e fB@pwݙhÇk$P]YfFuba7 sf^bѤ3m};Kcl*'LtW|x榎Y47SaJ6}ހݚBH}rz:N3'-_ndBnCgePjg~9TWxS$uW0Dܥ"W6AJQ$~_:?4I Rr33?.B˶/1jMGM_ڠ5E.X^LxrD^6ǰ%yii0 %Ds'JeyQPh@#M4J Ge(UCyiI1 R9ILfL3L ~Ԝ}CPۼ>-),;drd@n5;}s\㴲>'ٿ'?/&sOcuh uWVKE?k ϛd|8sx;KIEn&(o:7N9VIv7ܯk3Z>h2F3!Lɹ&z &pP( A %n~ePjouk]SCaU 1wdDvC^o*)ui\el(P@&dd@ L*,3#YfUa%]+!fVQAM/-Dr6A̴Bdܱ3)N z_i!q PBcuccuټ!l8a (> n'$*=E'w6|g1 |sa6*ش !Sƛ^mʀ#V1yyp0&ټfl,obLpE.lrw+тI Zؼ`TO: 6g)'[6't:^3x=W$uYaaR9眫sO􄞰y]H6%l~0?Ȇ o~9uqԹ=;o ~zXQDD=X&Q؆\Q\)[M#U@ZHLHř byhI1 ""z:\.4aP$IEG\d5I,Ni"<e>6#֗]j6[ԙ1XeqW!qb>MNnIA UGЈ̔ n.ѸX2A Ib 25Z?:E/'Gh tm|a=O>(Cxs[Vؽ.LvE/z*B{ ]uDקTS(ZB=s[6>7iu]H_ W+W2c3KB>hun@wǁEsP%p8$TrɠYlaxqWũRl}Ch1`02-AE ccW0m@g>/Q/H3Ih,>F/PeF3=#hr ;46*=&S,sQ8seY6\=_,KtTՈc"qI<ĜF(Si{qRpi2I Qno»*bqdOSEdxE3}4躲^BcẢU.²ѡ< lI#q%up޶L15,_`<}ٖT3S 9m.@V-iL@'?~s~z d!u1yI*;K?{HǸ u:>,2;0I?!:|4/QoglGѧHڏ}mʮi?X.GG  OWfѧyb$qៜ'^-]I榧AEC|G jSW#G4wKwCɩX'_, N Qfos> {"̴=Uqɖ Gëa`p;ua#+OG&+ST'aa3|Tƒ\tzN͒yVsc@4 /z׾ )xʊm(Ë*5^?Swt#w_d){}d ]]8+QszfHQH0O&hAaXtT_;;n$,"H/\a*1L<4 J-2]kyDJGdеCmlwlr;DB ɶ^F?,3ߙu [d G\z0>y1L̂|vfJ]ٲ7i/N٪5ЏH8C>&Xkorج6*22Jj:F͍J@yxXX9(W66ƩpV96zɀF'ā}|[><['@jmknUkNLhmS&KrRgRZ"e,;rRtZ:hajAWkX(kυRxkT5U4Tz4\q4 Zy?Q#RC :EeY?i\:ˉ]I&q-D9hն8hKVnHK n"»\ gpr=NKtcTV))za[)cT{hОx!a,V8q;!? "x~ s)Uaff[Q`GtG6gPB#vGpY*.4T c&NtL  6#Ј^`ȓt:q&="0Ia v桡mƅUvUz7:}\xؠvBZA"0Q^TDgjߎXj-wI SѦ5Xh~"m8&u&A2q"Rl(x]&(xQ [ T{ԃ85# yt8 /uoL|ц/zlq`ģQ[sѡ߾i۳yоqǫi:=c˥g.qOso5,Lx]`E1Ct]Ma|2KQ?Yy;ݺ?9;(  ۂZdnB<4ľ$d3b^ȼAC7֍.ܘXJ4mO% <=]469^_:$ǀ((ԍM ES<Pe(Qbfz$4:"LO4Y!`1Bz0b ()Zt xdg"+9xiÓ%qhz X+ qƘ;y>pW'W/}?z|ſ|I|zQ""tbĖ]2(B8I{E'ܒzqYl>-ܪ{:9EgXG#|5gqFFZ 2}.7 d=Owjkog6^m^} Z%1 *U@ `@._U 6^BrFmʣ߮3 CՍTޚ:p})c3XʈmV{1&mԺ.z e>m AG$0N愍`j_)59;k(6B#2մ4Uth?۵{{cc676.*_}z;Uf<9taf@@WH F葦;8%8h!D|HTnѭ]E =@1@Mڶ1'Bu:.]b=1].8%B툔qu:[GSN0PYvsXnc]Vh\lNRXHlAl18TFƖFhOx; ³52dszlc)|Ph8dAYDὁ40]UE ˣ߁S.S[]ض) !f'(ؓNKijJ%gA,zg{Kv2Yɉ#SO//+:yq([BO[gR3iQj*JHͧ C0Ы)2ŹFcAQ*J<.@;wZ7+1`Ebh=;z1 j+#BQ<U0< i~-%AZPY0ٵ1]%|j#gn(iUAi yŚdw)s;!汕1OC3N0c7u`I ua"+{2 )a1|h eѥl?U$ٴFܩq;NBnղpr|ߛ#)؇^.:DF'nZڣ|^3C~v\)UeڳRc`sqGc?t"œoDTbq< ǣ#^i?mڀlFF@Rzvg/(q&2#lN A|29$'bGXN yg9q2DcE'Ofҧ/i=ѤUgOPqo:{n<>)pNt?d#r8JKa[PRv~g]2R|ty = E3W@'ߞ{tC'L>ݼޓ~"º!S-]+AY3ь*T8$>`+?A+SPې46'pCc5褫2 3="V}ry{2~X.e";Qx"GyjU|tJ<;Y9uUݛ*8A3_ޏRWѥ~0/^Iyz̳ZWJ|JJ3OI6xxTL_=!vX >"!A,e7,2|> Ntra UJ_fKfsR2y!Q E(%[XE?~m`0(Z-č 92Yz'fTr/Gg%}OSp]wp+Բ֣q:E:JJ·;Q^flZjZ-Z$l&Z٬$V{Z `XZ&a}`[1j%Q[x+wysZ3 kB٠7@ k Hm/ *"j]O^'Dk}~̐Jm kj &aG1쪵ZePH{De5֖}!hWRz\^dS8]߿VYNT_^{ok qFx-Ws$IvLt458ÖU]BZk-3DfDJP{;e:|9q=tˣ=4?`7 DBl8՝yuOt9.XJWGTי[729"e.ꢭqd0A AO„Ȣ|"O/FVE؜<[Kf]#WUDF|b w]ze(0ԇulͨpG*0HI0ۿ⚭>o.kl6i5chbh5Sl5i67ĀfjFb!nl# >1h̥2y&}4n9 HЫ 0fvӘZDg>T) t2hsNfcw 1fc\f΁6BnUvw&lNSLejRi5j5wlqJߑ f1-o%h^f;Z@p)O_UykE] %5Dr,2@*t$NiJQa EN#a\18?4+EZa>  )P2[ړ}M_07m%eGns}ڃS׊x%JATGތ>5_{ǩǫU ȧW Cc@GHvy:]놂Ct{d$ݝ@'B=`VPΊ WɲU 6%/k .EB@ak AѧLoBj|m v fI t]fJS8)(~"(Wl%( 2Y 9yn/@o'"s/~H'r(;iNYY@T/6GvD(A"&rTo!#h `9s''NF$ /df"0nn2*q]]S(>mW@|DcA?8?R'?oWD/ox'*LefނSsor#U=0BziL:ȩSy#&Ǎ(̕Nv?N-)_'ɂ$w+3!O~|z?v%p~F`_wbf 9}Q䗖JbND/@z]L;OWlL-{DG_K 7zd`k [#: W"`Nh-˓`@Μ܊YCMv r ՜V#c3y ZQl VO)Q;A_48îr?<&>W'cEyz$ʞOP6۩E36I*TwT):r`/5P~>38<4%}ibWwkIԳ)e .EI;l痶IF_+MỈ.8z_N*_ϴ~[VE4c?nSP+[t!RJEs槷=Gr@N.?lKB?G.Q>A+|E#2^[3h 4b8! haPtEGBw3i.;rϛ$[3-4Z h0C@ "fU `jT !4'l؀o>т \~a9lMUJhM%vB 0ʁ&gvUkpl;k5&#s٘T5QLGg;;:|g :e'& !T2h,<'P9GB{wK।b{ug$(Ps9|M;.o:I@Ε5TjyK`F2p94\NAnq鋁F|F$:]%!`PS0 2 8y^j̆}7ڿ_e'h]A0SY5O#GP|Fh j^"& 'AXAP)Ll[@gX]a xW[ men2Pڽʀ+&&".(VJPGJU%<['Q 9ɁC7KIz7 _.u'':zț 'Z멫p]蜄#"TDa~;H _l\ՖFX!x4@2cx+4vQ,#ʰY_6`v?+ANఈQ1?=Bi &1 m6`nnO<@|Ȭ]$"q> T摕c[ԤXrf K ^ycQKׅw k @?e: ~-F`, % Gu`"y6p,@=K2#4bճI~<4iKX9Sj2T(+7H ,!"ֆ|C|-wJ7csF^ױjU VqUc빗wI"wnnSMR&iX7C羠23|a$B'f'vHř`38)Ko^ߎfHN3Qף2ˀ/ w\%T޳үT!rڑ06=bw ԏ89j_^Dg-yLU v9 }?Fؑw6ΜPVL͉3-Bk_qWoK z_ w%dwDfY(<39OlPFq=i<O hWgq |Yrk1)FR^Vc.7'CC]6hL4qt8˽r@Yev'Ckј&a;獻~.x-Yo\Izom13)UW4\*Wi%\Ͼ\I2%Tmc`_rd7q"ND~{7Di d [@!(lb7YAR 8^CBde '3q*4U&T"ԕ9JJmc"U 9rTp &=i/Jh0;یuϖ]‘ n ~./WLMU Jhn:)5͉q"c-q$(bWTkwSjC7KvR+YfVna 2%N@|DžBؑ<#ⴸpzSk|Zh7Vu|ѷXЗLx:5C ɿآAZ=,BAx N*SC#XP<;{|uEڛZF*-:-Fv Si"Cx;\*i8uѡ f7&'SS7Pm4%v!pazY^b?,CEtȋAlM7wpYGxv"8/a( 聦77*u4$&ƚA> m*6N3o1'Iqܶ|~RaٶBN=]&5iy"(4Tlێx9˯\w:  "=`ΊЈPv܊e/RE6Xq 3#zuSrrI}y ‰ѫ$nc붌"8<ݡw>qj|d9\뵋?eWCRDIU&LNQ|<,S8.0uea@[ǝ^6Ž۱.G"?.<^C/.mGP~{S}EjAȜ+LV7uڏglEm2ɯ9M~C#])O4ᾌ5M,!n?{=?]TC,GNldn}U vc5Ly>;xy;Kq u30 ^NAm4E]+'NqD 7igGdz7j{qKL4'Wа+`]DZι?n,^O9Ds:"]QRPJˮ6Srj4ܤשFpev_lPEoF&-3MH:bUG7I‡/e$}?C]?-h]ZR_y95^ ݁7}DD:LwI½({2D6^-Z-ˑ rRy'њJ93AH\tʏb<[H)SxLџq;!Ur.ʹ6>X}cr}!YTeԍ2'"JR7R'IJOr ڣLTö\mR ;*ZTtJew gҷv+q-?/ʥ0xR)2bcv}IYd_=)}zw?~|2j"۬Z=C&YlE\tY'6)U_"$SRDQ*A&#55CS6оO(8 k5V"/q[ЕhfsPV_rPܒ ܥ*c"Dk\륮׮G-~ONɠ>Pc1H~9(|g!a'lleUhKf4W ^'3Smz$rwP<d|G ӫfx*Ŋga'm#$;jŖ/& 4q(]N PXk*;)c^*Wb .WvB0lP T*v9(V3-fʓ`K Vm9T\ 0F.xZ@l!b<(1 ڽBRff(=KpBP(L:xvY3CIzf/]e$"p3f4s( =PT#E3BL s\;^=E {!gih9D đ, 2`$;$_ ׾Q0[]x?4,,hMbk3Q4sE) 94~ q,TW}H&1n ےFM^bVAdE 4۬]\E[A!Qb:.\lF56%3Yӄ~sа Q K#j=UKP<٩:XzOT').zE.Md/uo7/IXq-7R>Gm#Vg9fKzM{A*IA+G#Hdh+tmeEKБF)kY ̠Xfꊠ"e'ԓ7""2 3dvHz# a >b20C!+JԷh< rbEZ(iQb^:h4/ CWC=ONN N؇y<=W8~s4 <|З4d0d^BB,(LxN̈z{j\2[uҬW҈yhGV@3`rm$xJ顫(P l$A&Hv  9N2.}G>,ӣqM;fz\dvE,tMS~&75`][sffyHw(6tCEfZ9A 3D}[ 'xI[%xյyq 鐝GH(!zi{]t:]WYz];$x;YqԱLUB[H0dEћ HO?$K}[&9{J|XKM;K>e2}׫*^dZဢox@`%>C_=KYݷiZ&/)C9pm4mx]D:w$+_P/Q^Ц: w;CIj$1CfZ.܎{'ӧ"\p?mB5%n݁7ϱPx򣴋NAڅ=6sO#Srqb1J%v~anlB"kK  8xTfbB9]TR ({)a@Qdlo'Rc IG='qy1|\*|hzn٠uw g>3-tbEwK 2n_ r; zT)-K_zw ʰPDַP(`޶g>y\XzRY/*;QE+}E\~[Ï_Y3Kx&_TͷoF*:x-s\Wv&4kDI@_9΍:@Qc͸\7^e{Ty69u=svSjh"|֕ D1\sLD|pNn,Ն1mxBUXgW!z*_L´q|:zA_}Lړa*])TPк| <xț,3(':cAz28 uԥ-1x{R'naO"Hw!I)td!׬ &09uO$ɣ֘d۪S%dG"Dy vo5HqkpvF/v)ZIy_U /t5eG`ǪlB8 Dʁd8*"lGqmׇ3&F\8Fy\X4x5u9U;{b>mEdY _u%@j5+5c7: md7HǾeGŲK^-N:R[['iil%ΖL@BFڒF͝ΘQeը&E}<ˣHWwLU>1 s+_/b#&?α7@v7!U;2CY9OHn17/'`0ڎC rg`E\vERWB FsͭLwWIJ4vOkGeKI8LzLOxgtxm3qh{vTWIo0Z f(X'ܬ2-L (iO꼍0$p2ZG? #[$TwǷo\uݧ[DK K9)j:v XҞ`7FsR,tܻ>u2wRHEF^r3G4ۙ+yS Ya89y?qx{?wՔz1vgS'ЪY|G4];"g3Hnv㇟Ƕf)f1R#R)f!6bBBҫ6BABb`fbR!6bHX M M@p'1ףW,nLnL槛CUཅF B! R!Qn@9yH7 ,mnt}$xW;hŖJ^*JA. L=L*mͺ],~\vF'Rq~|rxt+ҝ/6 ǽ7O'_뛇n-|x{^*7C#iG!yh"h"+=JA@hZY\e['> $"GJ Ԡ{SfZEzP/?ໟ 2KebPEAG21[4Oc_Idۤ~06-^F_e Y!@ )?vT2]ޮ'Cm4-Ѡ(,5C/`Ip% 6$ٞv#b;KmT( 5XҨͽ8U$Xwe"#.zX1(4NW c[eZ$-gWuoTv|F#*e9PmE՚Y궔t}[Iai]oԙHV dsMj1JgGu Ś#,|`_A N("ԏlLznÅA3e[@ [@7OPU&r% Z4 z*]ۖma]MHV DG*"*"%6Co{j Ck^;W{{1wH QZi4Ne^c.'W:$@(>Wm6Pd2k4 *ri6~3L-{/") #Cv8 I>&N3h9rLN-cU{7Zx ?NNdz0-}xq{/.f_~VX-Yzu=Ϳ 'VGL^k.SHgua ͣ80EЬ}2`|ek& LUC͊Te6Yl[ߡM@$*.!r؉T$ GF]`(P)bjz DOSK-JE˖$Ϝ{o! w2o]Hߨ`OzYSA؉׶k6f@P*nFA.lnn|kN<*@ߪ ޚ(Q(O/'@/N[fx:mV*ڿ1CYR`_Z?x=WGǟ`jE'k{t7Я]\=7w^2*ىLNNSbP }L8E.\`Hq B"Ԭ%Pk 3Q 'h:DLh57Nm<mUՂ:<cf۴BĞm,@HQ:HKQ[!ԚT9DNtmєߎDJ$^醠iG'+b(am {7I9-BG0?I " wǮ ]X#ӡ-fE SoJIۇE(#ɈՃQac|X_Baތ=jC PFq$ n| UGuX '?cRjKSڮ`7_N=CfȾ//,6;´ĹnK{]H.eZc`Ԙ-D#@i5[CFͽdY3\\Y:Gscɖu{*FcW=GԱcW@ܓ\r贤QB\QkN:8ʪ֌6r1Ld3-^,.lD]M}тa/]?%^ڢ45c|8r)q*q;uyyt:s\^&.Ȅ>MA)hq5͖V>XQEoط&&#P27wT kuyF6CYj(6MSsE8 Om=D{8-zȬXsۅ/YՎ+( ^[4—aE&^m̦>8?`Sbf`K:Ze ^쁽GdhBG}O0E*h^ ,z<0) I,u b]ꢧS- d?R#_Nu5\%3%G;S05AܞW}0,ߗzK츢x]/졷HOq>^&Jov]˟wI:z,h:'r{+̾9wdMx94DE^l^`"6߶껝'?dx1mjŋHi50C] Ԗ%yQi(xkͺ3R|0z`ǯ8‡#!#Oh`͉stֳ[q BNXGp9&I3enbQ2ttB}@ۡw岈fHޓo~Z~yJ%j9RD\N T^ ,TYMTf\ &zTJhH8̶QG!Im*b=ľ?L̘녧8SG57IXcYu: g|dA4׸j}3 R8q9n]ԻBᩚ>Xyn -P$6mNn^f5lqՐjmPgH O5,ɐ{_/L΢?LHz*AP=Y:` IxvDl?8 ?JAz_#N'vGRZHaZ,Ƃ4.-^Î@O''<1J$83'aogxDzO(z״(1Q0n$LbXW]p23Z"b5@_ZNCɂޟ$zxn|3z&r5pZrK6r59~YmaKANt?.">3wIq@%rDx(E'945Yڵ,F+aju3MZq[.AQ-+8u}MO}3-]0v,~p Կ6M6vEPu&g.m+a/R_RسˋvXZׅZqD8u9>ͺb*cqp 3I 4t"1fzxl [ikBfOxx]٤nڱb<棰XZ::"C$f"Oa :]~ַ)4h9-F}0ry%hQ?\01zR ]K<Pե[_gW׹xm.qG#7CCOV}ש{C?_Q}t힍CRUf&$g]Ouċ68S#?i.~2b굘ښ$?i+щo,j&FDf?VLY:/? !\m'~ſN -$^5FʫxOk рF m$WvǀR VFZ0ƒ*w.@%9?9@P{˥AJRKO. !$(oxpB57 9P&\NoFfrG@B7 gLi~#a55kBDjlڀn#]3`]ԑ zleZ,8s?6hT" e*(un@2Jl3J8S]\"}ee 7S@_[Pk@8q9dATz?K\~񇙯:=^qy$\m`8 璄bp5ߎXC]q[THd"]Eo.Q6kI]DpH͚@f yţ#CQhSzYz"cFl#Wh|Kނ,'gʹ]u=1c@M:jfڢDj*"#bo z4_P+he( :DQ/GNm)U?2b Nj ׻<%qmq-r m~aPBv]xI'Ija;zp3dBʩ'WS_҂6f5X(u`ĈV*!,cLthBáIW37s7?vZzaTf ?Hv?C-ޝN\|(@Plv%QU0/w>Yat;c+D*DgJMQеIrxo kEwlM?NĢ1K[.g ?W'q8s-ZN tEW:C:ִ. e*4;Sϒԉ7{nfwy8b|=E}XvNQIS< L諮'i6#nstW;CkƉS\4Sʸv(U"=Wߘ SO`zb贃{Ʊ/orz$c5n熯xe72-Frè|:,ToLu  NCCǡ0:!ÇV]N7}Ȗ%7G/$6Qt|7crs@G=H{Y-e`mh}ɯg}w6%vC}I?RƽdY `7PW;:T?)ڦM_2+%p\3BdYi nI&N'i]d!?v>b:ߐgG܇tԞo8[vdiVM@-:%'80P綁+ JXKjRۥ_ˡ@ +w KKfQ*eH q;K;Lr,,P< @C\SDw`\|Tr7(=C @+h) n̮K?[_TJ'_,=\[- 7a}^)M_VJ˧wF= DXb1z/7BsxEחuzv]qÄ΍F972fz'0 Z|k:/S(-T]ﻥl(WI$v,ڢ<XEo^uex$D+VKD|RřYe5q.zݖ EmuMákͳE7JWU :u@t_ηN;Q$$AŮr˱LꞥP2eL%3EYKmdjpx_uMASzc*)W*h=y?H g^,1͛eZȤ=pȼٚ$|7W) 6hΒ85MǞ!0*Dids!ձbx2hҴ^$e,a2^/{^ͺK$a8]2#jTf/I ;lI$rqD^E SnimE>Fyŷa֓򾟑@ئI +ip̗Symҡ\2u*Qj7xd3Z{f+!IGќt{9vqDri]zsOғ6=`_ 5(:>NA/;#9`|korW*=WLV+o ~ޥUzgcx&|Cm=JGxGCrqN? %7xaOd2Wҕ?tPx77 fsC}-8"}J58z)E}th$t38XgvKڂ+qKC,T#0O7ܛSٜ9f!9kUO~bd %. ג6 2`iAнjE([0 v *BՀ֠h?T*0 J(|/TBhhGEF:6AE!C]A^E8X} V/d`O9.^Ā?L" ;J.Z^d2iko |0Ebݘ 7kлo~]<РSW8~Ep9M0kEh>`x4tנ$`Rrϴ`Ji'X~4$qeC0XJ[rRk|c JR@"[xx Ryٴ<ۂ|<3W?h]o+ʎt\3M.-O<JsY&Z$*Դ&b9AmSoTP5Xڲ^L^/+ފ5)87ۊ놲IgFra.DUjLoX4Z SfyaG"tvnK(\Pbm㩁%6Pebi2k ן+We*xe'Hz>)t6TqO?.mIu DU\=Ά\Z8 ksKDd;P Ɋ)7d w<V ©:Fɭ'-$65uXG3>?[ґo-δTX*"3#)ܱ UL?h&P=ĉZZ[F&4μ p:u2A/oE- \ht^O!?j0V֧cͮÊۃDñŋ͋ [7#{G jk젻ǃYk%tkziQd޳ۭ7͢gGlr,u>Uu::gO?Gr:8\k(;t(v}u{rwܰc0_,E݆@$Xz g v?87sp7*J>ӂv?c-^&)j!f'kJ8 CQX'ClQ~D}zsS|;} lY,)Y$?G"~Z9 U?CEhOC MIE'y0|Usz+X7ءOG;y9E =A$;<[+Tq~T*ъ2`E0g>kXGX~>99@SmD|k36ͧ*|b%Ӯݳ~ؖ0$tiG{JPxLm>ˏG=!(S+lQH>6o#q |V1f/t#{mOa@@֙~EZeEan(DSQ7eSToyN/cK>LC#.wBK^GljVqwYʉ!|:x '@CP1u Z ; 2 f֝5Jh i!U"RYu;].&BF 0iXpǡbRP*^7s+  2^,9H-@Ô#L(r'(S!0*bq8ǽ;Z 0~aNV~qu6˵n",|o_«y"<v04ޤy&Y z%WB.om4F'gſw_&DB+f@kBNSP-[}אE2Hj8f*[]RxcvgLm%iZ|*MoJ=R%I4&5UĖnj|/u=TnbS#GTU r4ſbV߁*N^݈yfyYtz'~g/Q34\f++Wd,ⅎ0%"A$L۞(籁U77&bSH)w:@KtyF? %(A<LIԮ"O;b)uT_( Spz90vTM)^kTѺ(?WIH z#D_=oC=׬79"fIןG3+eJcl+5MF'+%{ V^ErUZ+Mi`@8^^c{Xu֦F(՚9.6 F siw ?.Cݧn%y:,Yf"#3@>,}g>.ۜBl;~diʗC??ؼ}6v F8Anܮ'f#s_0自\3gZwNl)`Uxip4Q 虫-y,4XäaQ-`͏mC?$CA3ףl"3D/ƞa8TMtە'q_'0|O7v8f,vEfϫߎj,T~7PltF^- - :cbstd_U?d[gw:!&(;{1%7?Bws NxŔupB Ah)f/Wzg5\'QTz{"njɡfcדdGrw]y?g-{ݿ?^FHtzXD`G#1 nlruSZ*Oϴ`puBk2A%Tl77HH8G!\[ٮ>MqZ7S-Ъ=zS_Q)5Uv(~CVL'dPx@HTQFR'\o3!22<``ySg9<*/- XOryYxԍ6b͢wm1 1MNڙ#zA k!"nB8cEhtwP ?<O!hQIO]QW.@]&0w0ʍ"tEc g{ *,/s˵kNL C`ahvaR t~~BMؑ=j;"Q5CY%Q4TQ0YBR²yÁ+د-l`OS_SU%%U8! f0ë(V:AB'Pˑ+:0jWyonVDY\vV:D )bE/##Ulp|79ۢA\l#Ǔ4h:66MɊ0R SױA$),5'#*u"Vի*C)R@N hK #QjBh)y=}#9Ij?ٜt&(5f-kqnJh$8LwqطSW_I~th㿂֡_t"clO:>xۄ7xaЅޣ5SxQOw,-h,!$sWHNyF Yj_^w gAUj2sltbkJ1D03;hFR\lA%R1f䶷3fs gC:6gb-s1|[F=ϷMwF6Z6 :C=z6qGlUl.kL.ױ@Ll6qL.\. ^@\.L76OnD~LÈ Àe?%B.&"+9S)r>|.3N>: ?\~:0Av}vIWیM\v2=Y?'[Ӟ s+Y/Oܸole JWV*2\bHg4Un@ "운Ń$m }%sYĆ hDX< R-#𓐯CUAuE 󡨕O#T/h#rf51Q/bsOD,`Y#@Pq*P̑)>r,dU LJ cShTvlْTo]zuUcEfhs`j,'2A'Fyqh Oۮ(}pBujk\tyB|PT@/}o"Ĥ*%&aQB)vzpJl`1bG5&%oIctJ/V1WTP7;*BCD`RhZJqu$8|=;T@W}SZ yÁˏ->U}*Rg_-ukJ4YPpYO ǭKS9"9V{q1x9V,h:<'ZZ6u$ :lGv|ER8 cR^$HA)t[OM`Wѳ+hi)zَ,V%ëi~r( Qpr/68Xx|7O,׳Huˁ/ۙ%jۉ[K^&cs  I^!'(U; 6A2YO'&)CG_[^ڬ]& nA͓Ġ(dj9C:a(>s=v%h,':FՏj~ܰ4M4Ɩ_mQwT =$ :ͣ?MvK$oǞlEvqI~}-&Zx ds@QCHm\DZc_L-NA'qT@+A4mC][.[b1õTQ|a [m 81s1hqHēЕtLYtȋZp%8ù=KWзöݧ=X=alKWTǑi\lVMxqЮz[7X!!5a|ANPŵ}wt^'NO>v8Rvޱn2&ljǪRgV+(= ?X c(|'T1=c5.$NX.WQ䷀9p SydIpU%Rk,,]1YV<d@hTڮlk8&FKT=?#O rX̞FA!gD]LpU/bE"9"iqRC?~9#ߴD{4(YzѠo,Ѯ,-).F&ċw,(2Okx6T(PȄ7`fȅ H7BJhr l60C0rmʽLC62d:68mo8-t}T>oh!-d-  f0Cn ~?|O` %2DgA{Nشd= <wU@T{8>gglo NjVf:tE,&'<,*|k{>4Ao<$w{>i|Vn6BԨLlNnVçJˈu*gTUi{N{y~r+Va޶*] NzLRl'b.+v(J̓H$#8y@CQCQB}Wޖ1yK(LmZF$]}FUtR`l d뼅\7p5XVזب?lig(sr%|Q/L#Q> MAav¾"x{3Q ]I CJaҘθmV~ /RWS`k+)Ô+B,(b5<A#Ej6!clX䟫 JN-Ak`^>!O'Bcb3[|S;'T~,5^ӿ,.w|e2ZjT \2'g yfDBNsg_ϝb+[0$vC#kalYhˡ'+d_w?z][Z.ku-#;kEdv=HhqZfm(w%&Ia %x?5 pu9u}aB(^~!l`naKԨC]b'YZ@ulP;5}d&-%ʗ_/Ɉ,ۑާGSYMH ؛idE˕ur%jO]!^zTMb!5L@#2K]9Mdrg֪t"}!~шVB^YF[zA8U/2jo]jt#7]#Y>2"bme" wfgktK_++lߣWbB OFF)$Nps}$2)kp,:A2 ֕f%rsTςrbЩ e'`u2Qg' k'FbF.,w8%.u##ŝ=~K4]['`VX$[+hjxճ;< 4_n|L%[zTh{5(RjbbT|;hTJfq H]V /;n*s m@PxS.Q/S ( ?)^Aʁ7SxF hCÄ--B~G핿 _⠽&T,AM;r }mRi7Pqس5-I* {#q}P*gG08kr?.H}/s5f4bt qT<\<&CXon },ؼn{p^ZgԶIjD4f'֫e4qbݤ]^oZp@EzOVdP6G롌6*a0U v^+`U7RMkR A;Êıܷ(UR#QBehPsLw@\c/IMNjU8<ۥu.jjy}7nz. 4GJߙx|^m|c*#b3)n sU d@N#^Ëq(un{ j!~;<#l:tmO4cr3 a kr /J|J|)t2˰SQ >tY 9* K'2>`2 mF'qߕ4j>q199fE$wPoQד؊oᐧZyyz S%H0c#s'2#('x|i-'/ٔz0p{^[:i$„lWZ]XBT/XzvŨW']$4覘} S>n460t eXuXG&3׉8mfO7;s_/sO֢ޝ hbfyad$<ȗt _s3ُ27bFW{oORn_;·VPY̦ax񠕡Tu۹Fqe?UL|؏K3Ǒp`왮Xq4Nw45)emygGT^oۭ7sӣ:L-@u-nhYz1tIgbخ;[J݌~|si%q(2߂1 W _ Pm4-fKrv, .uh8qjk2EX*=v,mW|u'TwS;:v7n-4\VﵧAc/"SZ}`H#5G W$MbJUuIqK<+@[ "!uFZsY%ylIps|uA>SPIS-E6]oJu@H[M[xN{E)R|\$nrMS]ksO榧(BC%2h Q0ңa;^E)cw$c@У`4}3{ƊLSl`ADžyldA ba_Ƥ~7k_Xxv|Fkժkg<KAfOzwsƉnr|cRoPRN1LkۛR&4iNz^ \7Cڒ- 5 =,'TFqbg('%HYaXubs;/v:AUۺYduߔufuX5S_fDHeYoƴIad$O wfH%rDcWlǫ;]ZFw2'¿>EdcЦN\A/.+g@8[̫=W3PYJ>v38qZ'e iT {y2rLjjCP+IeCyķ #Q8==sm~֟/¬NןgUysR'.1U`sу%^|lo}<5'\|hA㞐[OTCr+\`+BBA 30Ms &aP̀j'`'2̝:z##@A~s8Z26&_BLx%z$4i B&撀VٲY(qH7ö )ɝ6Qߍ׋EoO_fn.~=O4#~q}cgXjLM?a/, |KO-uc:=?}186=8iGՒ89,IZu0NC-"ϢX蓶zix9QZ9$oj7 ߝj@rE^u8w|~}xܵy>Nxqͮ+9 .ByKwL_V >GYcix2bҷwЛPѳNjYq N-CӗƨPTۉ/i6mF>PkTRwn:NnPinyq 5P bױY:LenEKd-Ec^H8^ l2/T(o fzo/RWn2%}&RI6M'cm(o:GI_f__@w1I ]oɑ6}]̍Nu^t?W?IpZwm#-ʹg,ɘY:@nI6J>Rƍd( }&O0ڋL!/g!lғBYऐrB(ZFJ ?uU&ȵb>T" 7@8r+Ewa7sV0f3vv0k]W~6BH=Tٙ.^+\nV7_lA@m(qW7 {* 677dΊr(wju{ } 誯@UA^Hڼ/cx?aR='`A_$/Ňhak(a[ |AIG >/L{MK%hxèg%hOko &+6(N;`ko>Miq=? &SIT{u@ ‰dcwY]$ jg}8*b&F1͙-Mo;r=<X=L}YG/H+(#iܫEsunB2s9y9~ZĒY;=^pUrq*=G q?T#eIuҍ$=脒Zy}vs7^OCŤ3OR:~чB c"vؼ(j@>C3rJǝ}1-:>Ŵ‘O}dcj8UM5#fDXy٬T9YP.obHLZk1tvE&vͦQC z8=_N]0';#_VQ`,Wt;Z$36q }\?o推aշZ _ޖkE@g(8N_>ܣ35Vl,wy2ζP-jsf燲\pfël4gLټ& `j[1);“41rۺ.:nWQRx:\,+]ȳ]reK f߃cBą8{`[ +63S^Bd.;lgI{>: l.Tq(}}aeQXiw6I-Lpbjhl}ͦP<5xԿ~PgH?dM٦}N?ʢD=ZHCB Do%_O8 $nS ^:=bg)xH:PNQ 6xlXs#kCGAj$M|B%Vb i|fy u"f,U<ԏNjt:suC8 JUSJ~&4MGn@Ź^zU ) D9.׏34P h5-o^f*̓"eaRTvlRlcA~r[ ˻PatIVғe'm'~y|/G-3f.Fp.Y/2Z0PlHt)O a?+q(([]W_kBŮ_MݮrazNOI.z.R_o."lj¿OÔf5XJa] E!pXO=f8e|٦O2KPyh@Ep"΅ԋi "06Ca%8 RwYH}Eܻ9U1.T>,=o|v8;C۲z XHn"&w:Nd 45*KytM#ikWhZ9爜;#]7}WQ/6ʦ2sh8l˃d'%yЛy15]QsCFk g Xgrs׌q'HEZyG9pVm gaDž|D`otL+kRkX~΁Aӊ$qq$,A⧶ F2A9WTNY |ћ#P}k Hw8QET88SB/#D~`[C@h\߶H >I k8 tm;VM Y{ E#)#kBtm@6ٚ4|M 懠lt!'BƠE9!bx6S.wXWB Rįy`M66[(Z,R*\|AkrBw0陰XiEf M&_9ްgKZHF^l?|Qڨ6[Fud߿Aio=@{{Qry:p!L I`ۼ<+dS>~J:z^@'mc_k7'@mdA1BuɐZ>)72o3W7VvuV-HJuD. ]&Z<,#hah:qva>H]ީ/k̓&hmNCg{ e0+n,Ux~IBmHKϴ.dC U7vkjT|`B20pv["YϛPq˶o WHAwCz|4@\Ost , ò3?L9*a>SdH؏6?ǪYSHibE>L1ʼ6F,4OU*0 REo3'ٞ+܆E#8N O2PIT:rM UꤣS $M#Iq(+ԞK ~` ֈ_ ig ᇩAsLQȋ xrhq ~59vW1,wDdͣSEhcf [56&ح} SgcŹ$pFRL4ɶIZL\=AB^N^AOanp:K-z22TG`nmqfdԻS_ [?俿imCŨn:zV_M 7n~>(x}Q#Ր7_z{6&^ܖjlX4$j-ԛHը,7]r㎰ =a^2q9n*^.=N/;+…h@v.aOy%^H})lr< 2wCQ&?6-Z:bA6̥I7,~Z.!w%Sf{w|){c5FzbC~_A? _¦Q5 d0/'ljOxW6"牪4B%.Fvsy^:FH,8Tml;U!ftRUfD |WӶ0=Q./ԧ^DGr(8Qq1#C;'ݶPWۡJli'4Fm҆JYuxߎT o9f|OD6d>EGlO1tVNFI;+QV}92O,T륐۪Q.ZRʱKk* (UʅO+kE@VVe\d>V>Zoe;~]Tt:-;JR`^ Z<_^>_1]*鵩rFqٜN@2|]@ql0~:0Vޒ3UtLu9o>0[D^J}jҪfӀL+]#isHVub;| y~?6}lŚNc}ȃǛSY/RZ+;&}X*XAOc\_/eF Zv\J'@7<6 ,| W_xnf^sPY\[n?ʸ?| JΤ 5rlnvmMtK͔of657PO?Go|%ޜ= :ws/(gH1]o!eq>q(/zW{balFY8=jcw7']?Gyaׇ].y2?pmZtvcEd372-ڳGr'`N{(OA^=/G\ŋ)k{9y)L+ 5 IK o~N_E@=""vLSm?z1NAT0<+y|T{8"8Өo?։}׿T[r[g|S bxq"ϔ@='"e.,COXd $NZx@;6dI2mWD$Mh̀kDZܥ&҇E[wG`i T#XϙǞߝ.{vODn>/gæV@Bd1xIW,L:|RxS:M2Rt"0OInkM&Z[xmu(MzKk~)l}a}ERcEZVKkk>Ws/`?d=?fI㐠GT_shR8]{PD"ݎzCz4Vo- [B^*B @ >W/~Ȃw"J>i^L~hV*~ƃQ&2>*~•>a#hS.SG)bgjz `G^4VPtk ;[){y>ﮗC0ڤ*UfCgtg6CNҬTPbm:p+k֊ x-WǕ/"A-Hq83:#:w#62$gIIe jHߜTS6] EH[N;j=[ڂ]-AOSGpWSKRa *ȻybLBCUi3e05Ow,K4nI.ڢǾ;TG}_&#ɈedxgnKUi=fhlZmzb#WȈljo֎xCakdyna+R;4dIo#Ģu`dc*-' ש-jD#f@Sq`(+0>Ij\#jc/ '^ڬX-6:%. #S0RǙ2H]ĦbjEStY9#Y(ۭGC7d5n^^N#ku(kMˍJ#LB>.-w{>',{2BNQҏA5Kc10wMG0.n vi(.uǴZ8V=-LmrUI64|G`0UP aP:]r^Rg9iѾIm#> ;m9?WG_ % xd4,* % ^'cDž/*Q< |I#WA9?KA` 1MjFM ujr 2z^xRp|6H #SG'Zb N}d:M"ILցIQI$5s/ 3>>?`~im#'>gNA$2&T}LWӿ^ZH}8 /{,w࿜C\M YbJ]NoƾJ]305=t3ݣn'ӛWL@n[NVR8O/rv i҇FYaGآ2>Iz¦3iaM'Y̆:=_HgptDeXXQhbdDѫY9I!zWjgb+VLlnDM^]2p/QۛKhBX9^~>c!d-K~M7Z66Ȗh6TP)ڮ~Fk] '&f'Yhtط.Ws#R|Ƿr7 ֐K/q1N4U mR%hbZ}d4+LLq!q9D[{Qξq 89PMfy3[pe·EGPmi~g`_I?pYN+5E/̊iX5v6UFL<.?_? rVFVoAKþF:D~Zydvo\uZdvk]VdnZw,%Y׻m\*#CWAIl 6ez?fjUPNa@nHT+^TuPQU [ˀ S^ 3jfb^qrۯWPXcV+sx(V:h;ZmqsvZޤtԀ:}o^jp~P.P`Mh5t:+Nm>n߯WSEyZm{;ɊE(=Rd2PCUx{@[g7ї uwdPwSO؛qdݲ,PQ[Pn^a]^!_ L<`oWfs]Vk##&?\<9F^gj*9$2 BAÐfk@#QH2Ht U{MVLY,+t EĢ T^F<(tH$"yPI*tI +3GE+& evu/2y {ͻs8݌__,zK4ʚ(걷a!&bJ]dҗ yͯ|59^ '_L 7=EƺH_d3C IfzfwPk/4̈́솊_O'ݨ? s:,,q6 9/|lXsy{]{Fb,9,ڶYL >bᛏb7[-Oٱ(rxO􎟉O{ސ{IMbeԛۣ~*y['ZfL j1SK9v=Mdtn:j "2<#O_=AɉḚr #̋AS #|E03u)8AO=_W]S!̀O,'H]P=M ,%fzsX+d,peȩȔg}*ӧב5xx>j^÷_SꏿFN%TP.k;T+\(lNgn (xa7jiU>jׇJLJAy/@jkmb >V^ []݀oRC?] 3qKP߹7LzR2Ql ?r:0Q/A/۶ * nb2[}ܵU <[@g2bv8ة(9>hU v6rM@je1m?UW4_Nwgo3{`!P-ӑv}Yl=ZcU1nk2:ts6r2ATh,Nyz,[b/h(:P'p bn CQrk%[&V,sttE{:tYn?5 m:,F"H(4{` "칒ҷb ޸UfwA̱Ovt$2@E:jKIƷv= 4D؜F܌p= t=4h@S#4c~,,JV@. U25hglb`|czyr2'Sk:~)mY4dߠMn~C^tMGo&`=O`14t`fbb! Zg[iAއ<0kPȦ񬴁*lsU H]3wV`ͩ*!vQ4 bc$i 9B=̀PU12IL2Uu1K2cپܱasg|v` Bdx6BڼZw!=o5?Y7BKPQ~&g8 A^fst-nX9Pb8:ᰝag PīeM+92N]A3*S2akO(o ^x!dv hpbf2V 83/eQBU\C Jf/):5|Q6S{>|}6I8qPfSWHuiMO'`w/&EJ.=NCN$T3m dOs";&׀9 Yx9mkd5b-&/,Qldn<-۪K^37N+bzt^a\(.5ŜzU?/̌q>/JOGL~.SO( {,tZ.- v 1]`/ 0;,33ˇ2+ y5ddȿ&a|x¤q2Y1qSK#Fs}Wr{[?DӴ4,ď\j(9MwdIYzlѯWex.f)}HLy>I}|K6|> 9 2 f'{3>y{6w9جJ%.VvrGz.ۂ m#&B:E#"aad|v XLYl&M7Q9+IB}KK ~[f7P}g?+_ܢxP/=^ ;zncJg{'pxPxU!kVk JkyBA+z>I*`v /ӭ^# Ijm$%\=(L6:Ơcl !J?[@jA>Y/-A:sdQw m_ӭW]d=UC~:vyy:r@ `<@´tv%vZ/{NYTj,gjR?YӋx5o#yoqER3gLԒ(U,}7Vq.R޻g=[S 0/  \rxUK7ӎV'+GsKmYb[Zbjq&x 6vѷE u~:}/w:z/*r/mR*uJf:ͳ͓D"-0)z|6$] Q.@Tk}ml)/tTd3KDv-zgT]`X00vֱY9T]^FP^"ZslNN=Q_VjOu|k9|u`2"8yqޅ kXCv ;3i1Hno8 }:8ZE&^G۸vZo w#vw\^ -Z.N5'(x7YL-N[8&/<"iP2@G֟ZG< }ٯ]/\I:N6+Wت2d:|.R;eƎ/iIvs NUT RHV<1u&IԱ2% T={2]KP}_eZ5f6ǖMqAd#Q@3+bjnmՇ>M<G$?dQ"Z֨WNz&gBtFZsԊd6c٨\ :cE/&+_v= \A\doJʍŲb*$A 萓{^ꏦKU>~~8X uk,>="Ϻ׳H鳡#ywѶ7=bK6frD1D)m"q<)fe.Q{/_4oFɼW'}}w^aQ]vJ~l!ÖOaf6"<ި=;hi$LBQٝzf<fy>Jr(avxq1l!+?E43a4PW}jwOڗ~, MTr^K)f &HГ⛋Ԏɗ^0+g0gY[O/~yY:`Fx_eTl=L7H9fynZƜ$v8b5deE O:Ǒ$Ptr 8J$%zDjAҶ<G5BDMa h2d3f̻h "ǣ@'ϧޑ&$;iDT.|Q/DJXpßgO"ш?|ōc6wY, DŶ ]- U- JU(lh)vvJjRbjσlQ(/6 y򄃫Ø.6!Q(mPӋbB1H6y,mufm1욥bq7żT2HR4Hy?HR Y—J,堶,fyd0Rqئ9B_* :Z;=9AQ z,e!Eҡ94/'8^~?0ƃv 9īs &SOL~; x*|ԵЩtJyǜ3x0*2Y/ &pwQr Aqz2y|`VHo5^.[_+_ȋ̓I).8őAȓcՑ}AG{ӸS0 41nM͎];7# Ä!`5=&.V"㯳o#houn}tiCI~/bKO HC ;Sgu_|kA!\fa-}{?}ZqN~׆ֿ*dk( YP"g14π(&7t`.cnna,lmln }zR{@° Γֆ0h kOXkc؂/LMUfC,r;/g~jO>`s989;R|`]g؀z`ol 3$[|l۝7ggf,(dG\}E >^ϒ1r'QLF\A,1U (ag o:MLÖZk6RWcנyrr" $MA'N X'Ї=\ceK(u Icդ0ݘvT;}e*Y? @V H;h4`IPz8.CRq^oa\+Oa\y<ݐ{-~8yrY^'4_캤s;(.,A΁܃ux|ImF/֗-4]0)kdi0EڰA-S:k6c+tlb(h "'{cQ(U Fڲѕkn{աNu J4jԞ8Qԙp]7eMRG>6׷-M&G ЗޚGFV@yWXwIM*Z?N/zQ_~26ꚴ8T~貄UMR5]LnXVx Y+%'\^(#ekZ$MtG7IqOE6 }p?nGZL|nGsLC6v1Vm1gԞ8}$QЪBacˤ %"NSh9uFq+uT=c#`},2Ot2"׏쫋~ӯ+' a->iehԪԃ[M]\*` (Pxaп#QXv Գ@1kokBaY &lރE؛Aׂ>kg kgX$xBBk/j6>v`ӆuKI01d( zZP̻ښ ծ)Q\N6 4ӀV* u>6sr2l1A}k}_C x-s֕vıE)X} &R$%lwۉSqyIef*U6+RSs/.;'=z/1ӱ+i8JptZ؝&#.{l6·&=hB=.|QAgr6r31CO1SvCk" h}wDYx5M B(r{)IdPh4܂w:ŊҔT]i uqEU}1iqz g'g&.vj[[>7_-]Ő>}a.6<\kJv,"[G=ioU`]^mRH}U6Bn,1edxthe!vG $4̀(٬x1)a$2yM_/C^C%8dy $(:}02\q>%_bo?y~20p:M#~}7[F #hvRIJn]jtX,}:fX,DUҷ:6QWX.]{i,\m d}%A;^W:>Ǣx| n}7RdY>v85 ^t,ql}Ә.ԌW}#tr6Q#(m^lgb [q,h(."O~5ҿ_XQGaSp Rh߂{vJ{}᧷{ vn*wBQK<&fògGJkq ۲4(b#^crّe2Y_K-T\~7TI\H"P C֗h<.QCbN@ m0=1T=>fũ{ܽ}W7SEev,bs)ڢO}|_/X,NdO4e'M*$~I8DXF/)` X^ކ N_؛' E8/hUaWԨL0gI>[s`:OeQ)^=;1Drzz㊍Qr {Z*(5'T+e]瓊ʔ"Xi~0QwۀpF rkrؘwK{saonT#@2IiJ5{igc1 ~ ݇"0- yZ ju^Wy7+KPPj=TC wG Aac$9l1(y^,vH&v=T9Y EʟƪKۓ,a<-4]˳Ts[YÞk#SmcEu]@N2m=*Ђ܌z/P5 &7oOczUW"uHnkN.,F.@չ}_Q,Y~jpIyO "6|6*]ʤho1v58.Ԏ A&6/o!-FƮ:1Я+瀈ldv0Խaa21kPi`%"eTҢUdͼgɟCu׌G6'#s'q;|,yi 2;-SvR0w~iB β(qF iyAl:!mE6yoŌ^z(=/t-oN^Ƽݗ&5sGL2Qt%7:^dM%%9ȡhSy:} QW9`3% ~8YnU#_Kow z9V$T힨iE F*U-q6 d ;ïpN\J f6'%;Otߞu@zq o_V5LCPmEɶisWiôUw85Z]b"OJy([4qq rdm,ؑDg#IJl8}PSWcGVR)ptPPSc LKD{'rM ĉ/`P13Tbš///J34L4mZd+YXaMos"#)ˢP+w?߂=k=ͽ ;z3by"rxb'JgF˜x};`Y ㎓`ڛȦIzHRjv0[ԴtO)U:X\e㚙QM>(Z.#&W \xO" 8&?c[_e';&g%I[2f#fud7/o\^䱙JGF(s:Yn3,=Q{'$d?gk_/{b2<9 N'8{O cLQfBh y-L@x6hJ!* <()44Vt{yw)|1o#f (.j׹_=~o}<$Fou]՞C@ju@SsPZpQ׆ם{Z[ 6ꃞo*EZb\QPD fSeWZYZ끦kiuV7X{!Tו;~5}ws诫õvW 2YuR w(P cvY0f rccubk[&kN֩>x05 =-¸$g1.:Cssx ㇯~U/Gqu2\wE&ҹ3w9xsx-sƝǟ3$(_N2v<ǣDoIOMIegvnUj/ mc/j~{fp&ㅄM<|52yx:݁AI۹/䝚YMLZ/G#jh3rz4У,}#T\4u)fͩ\#U muE-cF/{hAkf궮ƞho5ŇT,ud丼&šǁňyUq ݦ_ ܔғ-/(5-VǁlO"= f¼9wEa3*|aY墫m|ML#aHhlC}Em>[ϼ֧ މS7q.b_֤}KBȦ`J;4X:Ó.:6+˨PN_f^׫av3jk I#Ʀ0ȷ;do1:^-`$?D# E9gBՑGБC"=gsg]} FCOѻ/*䳹 qX 2RR~ڈuM1-qSXo;qμkZg: ȣX1*VKE/Q!68xeLc\a-?0ۼxz["̯=E܎R:i=dG) Ab]E,3N,iL`2<4#W׾@?h-_}O0>%fgZI-ՠF!VAAj앚:h5N m@V <;4*TRRYV0yAP2TvUUQ{JR-ʚ_ 5Ze J3*ղ\=2ʬ*-נ2T)zhqV"0IjkE_ ]fN8R,ݤ/BŁ gCbe6v2Ԫ][&#s d!Ie:2kdX| UcoZe?^t~]{Ya&COlU,Њ/OO"5sE1s8vϑ]Aj$Hgeŷ. 8y8A\ejej&w`NݩOceD86oe;Z0(1 oNLBh^<AbnfW#n5ת7 [!qjbj!+0{Tvp^m2hl k ߤӑ W?.=٠? \gS+6:-?6Q2n;#Z11İJqX $?-b@кf q$9NQ\ E$j~,ɳe~QN'a9I[ -1$`*2FsGlZ 2K ^(nGwD(4`9%EZl-zǢ t5vX } MѾ- ؇2[e R-0@?c676uhv./s.(hQ|Y"T0+.lN/sj+(?Ͼ~Ɋ%-BfA8f>wp8dR46D\(Kc2yh%fts7U?ldWqط=#B_SФ 5礌7FQS3i|E<^ܦή6jgߝy]W`Dw'}'LsO, ɍ!2rd_Mqڷd'ijЮ/Ϗ\fN"9/o?<7/7̟nQy=;r`k832Gd{Egaݞ"YCs N Gr))$Leݜg*j seP{*Qf֠ڨ(PZ$*TJ/zy+`U}䁁[AYS JG ̷2Aj9 T"heRoEIqB8aA* P4j_Ynk%ɌsV(CA9}c>4˃@. }( 5,ia2*u&ӾMyu]dQ.=@Q@ '%N{:iZm=?й8 玨t.h-ߟG>=Fþˉ-Xa5=OCl- 9> QkBfYr{?*l}?5prs퍑76LE:ag=CG2SU =8[mښ@ 62Ǡ`Śo5Fe_A/Z1XV^jBK6i S2] RVcὐg܂zx y8hu6V? / j~ NNll>T. W{go@8tq4j]c5wq8OeskGj<aK=P6)UMZ&`&ye6By8ofcE "0o."%_J?;8i`N<^/_C+Oc^RlZk>uA_Ȗm(tǺv\]oqN!*D+.0p{yo׳[4688IQ+]07`Ox_mNǣS~7@[$nJryqh9חov;an=\䑢qG]].RH%s!U O/oYChFijpys7w=cAŘw #TrOL : gEFQ:M"'"&9κ^HQ% 3IAOE:&NhpأCoE,߲裉9P BAbwfl(xK hQ8-N3)LӾߝZ܂E@Sgr0folF??>#5l砷: I1Z8dp@:*l(8%ݚG*Si6G)&wI'Њgw]yǘwO۩*fjH=62LhOYZ0gO e e~DGHZlZl7%-A=7XIk(lxbjo gw5%- OI T 罽U@h C*GjdI {fH@Uʛ@,y,Y_C޳ʽx˵bO3 pxZh g{RtT,<0Z ԌAAyRy^ Z$wj=P_M˛h2KBkj_L@ R)yx)֠YZT43AgVFNBIx5sHݽ'ږ"ЈH9S%Jƞw[uj_^u5^?v7yduIwؗ' ~Cf ET)>V u$@|4ḩyԳCT UL(gF$Ur7 wp#{0,Zͩ<4]6+T^Y`52V`Jx)^(dt;#_rwGT]ˁè{DJR CϮsJ=!O{H pǣ`xj;R>i^[IA&U4z> t)fܢV#G7 ҺXF<#Ѯ5q?l?9V^Y92ruW?]tyzBItɗX̅z0RuREVC$bD0Y?hL<&45S6˞'I[hÑ:JrʆΝ=avt)W uH~3v͎~_5 yz~5tCF{ zǰ~Ā01=a Q,rUM ˌBq~fBsAfb;YϿUȿ9s[?m c\ &pQ ¨aW!ĄR(`b;xV"N,v\f@,vn2Fb^ώ!ʳV,{}kЊ7lퟎ^ˤ]iMo@$VϏj-CɒCCl mNp>pvލUꇒZ{ {7Duas$I?H^<ɪu"=~>:(Xg2١ PqӸ1,$q9e:l$HZZy?C,t'x6Pyx0 SY> (J֪Mvtz Kj[U,+iTuerJ:qы $5c76ϣnKo6U߻ЕM3h$1y݋4.X2a@e(@wٯ}Sj4֍6e\a ^W .qcx%f"=MGY MiZ-GxܙXN !},66Ri(rs,{LuIJU)%)!p8|:Px)QrR5mhLflnjH(հe:GS'!{f TenHFixӷ?Ps;Ҵ(P(_"AYB T~erO>تsOPmO[@@Tv@ٱ CrBo{[`|╁R_,|@ a~BbM*_6nn*Xu]lwZp>(;kl;50ac(uv1l>nvjֺ ܂h[{`0 z-3@aX%k0va7 V7p 5@{+?Z&wȻ&iocXaUO={;Z Bng:w/Ow>8Ӿ |L?K@ -R؛5䰇YՋY2fc<˼ZM -[;K]N,+˅*WsϦ>9*j\C e5$0iNk>Aq{.?*|5" 2pE׭!|Cݠ@ ԶЄy栽ߓ@5#`mv QǂmUQV:@ ;G~cdl7?6v( ` *0F-e[1hgyOy?j!`TpK3*C-S'vQ `~3Ù+/Oۛ͝vfO CBn:rooyCUa7?G\~u ظ_4x-זGoG @J$Ezޔ[**6hvd744fFs1{9{2u'OdVdT)7͝P-f?F(ǻgdÎ?Pa'@6W-A.?HreLfz vbs2z>q((8N4'vW1ȷ?ӑ߭ mW=SSow[E^;r;j^[VK[md /´znP\\ӶHˉA 7:.c!7fW)o8 W+mm+o5>yz:u9z8rXSow,JY1TũiWi }S'bvb֯wCɪ^8jjy?uhr>uh)(V|RO%T<3 Qߜ 8(V*7/ BN"k3lZN $ṭclprӖJ Զ"Y.IFXKX1V;^$t7#!- DZP+5*[ݤ|m)m|+uj,] &5|6@9(4hx劜L aȱ{,O__.,N-mWq0q_xfcyjxdJ>'ď'ܦt W [JHX.'#x [:^+|OlkŻ|cSxzSj\śXV&i4f2:C%lhyvC Ps봭hȢrm$DP `KcPg S~2{=h*OIsxB|) ChM -ؤ ʇC-b*To]?yLMDD1UB5e]k_(S9j;#/TҊ؈,]x,wuLǿEZ&+4&G/[9]gLsrc+84F @b8n ,/V M%fbi4Y"QU^א/ ZADjX 쩾4\&1JK8-UZ%kh&uyD6:n۔»m ,:T,uD Ps4b'I.s8P4fc0 椯/#g;g/Ń;7C=͎tr6Mh%3jv3+^uwo^O܀F6:\ng64UfgCPlYa7F ַ: lTm)Z3{AY㽷q6O])l-CSes|77}51)qjS?h$X ,|ܳx o.=)Ž7O ZDhI2þ5gymYyԷp?0Ppi+jMFPsxbJ84RiRXrT` gR]Qf壡Iw{&W/RJG#QA& 㛓EJճFr`b Jy1t;h+Am1qʗ v@MFH1rMru J#MͺK(ژrN&ͳIPjG'iS4.]OU.O^,ınTӠXд a6q_33"8Tt ܸR  ::YE-,XuˇYb`lug\BޑJ]0.<#VLYG&uw QL@T%U Ps)Y|>UU}(wu䢊vu5Z]M(4hMj{O!:mu6ݓ 4[yQ?,O=,I>ǠC+vկ[c&ΕtP3-/̢dz}a7Oy>;6RZm0]#-HH y).{^C>Z^ya뒠s1U{ڒXQ#9R턖:"FJ!"tڷ[5Vxo$Sointt4] MZh@:YSPGjIijʣC^@ds't,helՀu:5O6Xu2ʒll~]dȮf+*,@ x#3%qO"? .9JR@[3㾵_0%3?[yh%Yln9 4m 8!tl&?vof3|v>k D0|f#B&_ǀ^@.8Zq@)x>>e_Ϳ{՝E(gWf^)WfPA#F|>\? Z@b̆F.q67%-,㡚BKjfe[[b+ƺi ՛ R߲7ρVylQ+jȪx8pBծAO EkG*5#@a磵@wp5+uFtt//6WΧh5NAw,ԎzTvۀ"͆M Rƙ?k_jXgKooRL RcS\krjڷ 3h_0Qt_K4iNiU5#ɬ\W[6*ݍv6ut lI^ TiD8Xt"Dl#/|?y[˭IkHNX:ɢ]᳾"˻pllɗOTW0Wy|U?\z7̨iD,< FCM_c7flf@^f}ȖҌC#f*/ [u1:1B+^rk-K{RC⇓?N¾1 nUʰZi{[|5}nUFh gӯMneԺW ~5PdlE:4&3^O޵ 3``:!?^Ɲ?x  =.lOPɹ2E[TnwIQU>ZaTASp?Px‹[xa~,>lmŠ;Luͩݓ>kAC -+jYF*R%UYE 'Q ZX }n0==À+e'zp}>a$\oPn,%~ }?㿇Zر7/4.dAdzL!w5?>&7%y0k<5{GN7"jLIWzM~U^5IRgG(T ຝls3 Ȇ>V`#D0N9#hJK,Ô݈1-D[X)v6 ǗymŠ73fV>rBhNȄ:X4|݃Sj>>yv\&v#F 6eC8! Zz-@A6[斞l fYɀ8vuyWՀjg>Nχj$a:,oX@P x I3dr~2\*E6K~՟Ic$6@>$b_}}+wݺ]D&,?5`87I{Kgȧ%I`vז7 O(;^@~bsv{߄;Lf+C y*.iŇ2ѯ[O?k,ȀW@@[rqf`ex5YoXǟf6'TUl'Ė}!%")Dڼ{l'$J;]ey`>`bsT{B5(jZ-eXu&7\]<|>0ۈt'AUˊsP /gݖ+7;6+Bow%T_%<}GPr2GDRȋj=^OJluz>hjSřҫW;_}- A۞JRo+Z=S.+G3JP.3udc+`lbSiIFFK->6teQKzih We\|ˎJ򧡄 g`*g7N}ʧFhi[QR*:"$"Xgj>˔F/#bˇNov%\w(i,H*N=fJ,[&˗w\  Ig},jԤJ=baqJ} rO22iU -1&Z;p0Vy h7NWRjce;ITY#;S*CKlbGHfy\jS}Q;d@#bNЕS`ѭ4SvlN>\HPߖRٳy6+g=}u_#VOYh_m0|i 8~@*N~߿ݟ++Yi ϴ+ͮOǞ ?{B~ mf22pq54{*D mC)8$eݦ` 5:K>.4JM6b[rPheЪ* t-:@$v,̙3ֆ)h|D ^~{f :qVאʣQAzJȞaC~uMSlt:cbqsտwwY;wL''qFrnN."Z^p]iW锫V9O锯U'RR餯TRqL%~Vk Q qШRUOV-L Zt*9 'SQlV8&TgWbOfR202LS#7ܞwS]oNh[`ȧSTS^ |9CH'Rs'Sɑ҉<('=dr:R:DJ:8 Gf2{oF5=trVNBh<8kLMB?7Db3IpޞJșNb*2{ oqʤ&*F|ܮ5q0i=wa#3>h,Kӎ4 c]Z-^[7 N=u?>^̆73[v{IdCW) 8oK2ɠjߎd}8v_DʫM ˱*7 &A\9h&47`-űpR~8A~ t4qp>eHx܆22j秶A@bLr=o !6>tt¦J!0C6_V[,/h{ l0ix$[> Upj3ru;mrd2l˻ؓ[]+p%A*ʡ!XPog'08TmW7UhNFl_B6XWH9V<<'@s]!ҖԼz(x+5v ŴˮN^Ot} qѪ1i$>;cǃ/CĹoK.|ӡ[#-[? IqiJ>h)R(2$*#\kaQ" 0y`779/)$ +6"ڀ*­jbCNÚpتdPyuu[_<[^]xTPXVܒTbk Cr+el3,"Ƞl5zЂx#삜+.Ȑ_ D᱿6  ;neڝv/t}-hLC{wzj~{^fO EWPK#i#RizPsA߷$k|GW7^O6Qf*_lTjdd:y kcwp *H79?re$p.JU;unk@}Ox>LғȀdU? N +-tQѿbT ddcH%Xӡm`j lL|&L:5 ULldQǜC&WϤ~HcH>`ݑz'1JE F< P-$.#0T&9 b~HN.K1 $30ᮿp'uy4zp7;ĚNRHe: r8㘂PH' ۰řcIMop4>g7=%B[XVbBUtdU[JvbKz b^TF0"[y*o..Q n_kP}s8kN0qtuYْq8C]x;,|hI^= ]8_J*пؓ<]g}M዇#'& COXV\WTC#wҍMGB(P循UT:Xض];:L~4 +6S/ !E6s n^>xV((Zݵ$:U^muh~zNv0mE'AKW**M- B q7ڋݯl 4)LmKoQ̎3B$D1) lF@l~Yae~Qkb=x##ĄQvUZz[B[뉊a H TFJA'^O1cRe1hij=Nl.ʎ zU/#[p_Y[r5Zmwr7X 9\E/!`6m7bl w}рo zaq['v[&:)—2ޮy;t-ށj[ o؛8^zavLq<i-prәN %L喎_Mu~<66vUl䛑+l1%3HlpM mfLkzH.r+XZ6wQ7D: MN!g03 :ZZrfCU-&y9.|8ܥ4kt) +{c? ~zk @5@OU@+=4dź\]]79,YkƒWTH+@* gL]p~(kU荓Cxry;a;~ûlrR[6\NZtm h|2|?lUw߰кI>%]!4d4FfvAg7'n -MIj ?Bc &6z9a?&~U/W=5>LV_ӬoݨQy ΐNIcd)מk8 AOGU_@ ŀ{əHTe`Kyvo>NL_n4k|7D 01Ɠ#k~a{f:17vD"dWߪ h8J% hA+]hN-ĕZ>H`JLZM${V-$ŁG.99a.LKm(fLQppOF}9у[6PFI*0)"9Z< u#@΂!P V ݻ6+ɘ 0$y"O&CWi0X{Fb&wR'ώ[x&~(tdqV471CA*9sNmM:{G1Q1D62 Tqa}[ok/`W&D x5YsIr_=$jfV3uH<Gh/q6@oG4vGnxm~#p{9Ÿ%##PYݨ/K'ȢáEYWC5aĺI*mt' R ַMsOh!kck46lF' &I𫣮n['II C"7%-OI\AMu?+S>S{60T$@w ׷mϷ5JrzϏ&OǑ5>\ Zh.a1rs)aUl4NP1/Ws7OӞOƱaMZm/o/&ozTJp."W|&OLgDogH~80ē{/g/T&~{f&f7TLOtMU"HZs/tI\kR¹ eЃIϋy#gݧndiD3պ_!g2\m,,SӀZVZ+҆[@߮ߓ퇷x|{?&V=ZkoN~ut'||/=׮z q߽YXmw֖2^~`}{c-k7Jz< nvJ+_Z3t<`ݵ["|]u&Ld[ȖХ n&ii8~/T4a>-_/ ?%F>a?ɿ;Þ9>?I󥂓Iȯ|<{Z? ~c۟vq`<3"k$HߝKh3_ӭƗ6Ydu# 9(P *\,gbnHE(?+B b>?h4Nj!34tme "tm:rI(&}rCIsN"T:pAHA8$4P!7 |00s(fi_ՍcDR!Oj6@r7]Z&I| rȥC _Hr)!htfOr,ȶ0>Yi"L2|nEYƈ4ЦTWPzkrMV(Am-#>RN4V禂hM K./;frfZ8~9$q9Y)U:QB^JmuV_yZ}csX#}zxcB ^|t9=KC#MȑNg&g>ILZğ%!2@^h&A@VQtZfBAxE >p>=#ҩ-!n()\ 3ct=5c#/|V 5]A/hg_0#ɂφ`X=]P* uNABC~dblSb*,{aX]ZĪF HQ1k*H.};3ץQڵrk۽4fFp j# &5v{"ƵAQ:-ѩ%'Blf 8I a/! ADnw]}b$䰯\稯$rAw$b냳s+p{Z;N T$O5?xV;%N2"Lk.7N(!?q\N`OB_qrJ]iWa??{3I?h4y_] W_^/^I; NJ\;ػ+Z.q_ṲT9f:E#VY|a4KIG]`hzh]1+,^7ulm *>&j j cӣS.]QF XK7VEܓҏ_Vu֒ԬڼܮYZ? بlm;D_B~-N9oȭG&R=7%`Vx(7/w6k]Xq~x|zS-wJw,$w=w&Y}mᰭ\IWt&j]hbeZ'˫[l"~?!J>\QWATctЋ]k ִMa#XK D9?ޜ MqUp*db>cvz1!Y`/q:.-VAk:v`t}(q̧#9j11{E %<go'a/G]ÓwT DɠZ[EE Hu8l)zov2־O,Ʒ7"硌r<)SD \TW"V VS-(%0Cs.("Gnh 8_wlݱ; LgTԉX] Ls 8'Vę>*\Y˙>(!,$:Q9Il`_FF V$IF݌@O !iإ ¸GCW2Z A " bJ2%ҁ%A@ h62 EPoM3(N'R0[/d(ӡ"/ З YErWkٺ_%KY> Ϥ v[{: קNSO#{=%KihmۘX %'MC"~O@ _xzk\s2,H\Sd*s7=G6a@uӾlG8|S e?Me92HuñJPqtq*ء·}GPթw d7S9]Fǀ6wBAzZ8͊U "&6'UYVŽ].AoUFӠDt[ Tsy:sE>cͭg"ŭˉN0m3Pvؓ}rZ}L}1IIWoOiNPc?n#VZnCo jSMB%, Fma +Zpzo[4U]vi`a:Pvxy>t]ECV'ڄxSm+8G2mw-ZjT'.k3O@:#WkSEh\m]9Ɍ|s?zг(qGtBuh8V(WG& 3fij$j4M> }_Tѳpr>T}>ME 1>K{KL+<ņٙ]8(c{=Xz+i py9SӳIG~~~Vӛ;'Md',~w3O߿[O;-IԦˈ'LLjdGߦ%|`8"PZp'EGT-e[}(aB7ʪJm&YQ[EP_Eҟ츻:oŝ:k}k>y>2Z v+V6eb6C{]}?r"8b|쏙7tۮ5"~9'A 0\,b ױ]v͋j[TT$<'?Lt>ߝZq2W+Pk,|ZUh+_ܼ҃o\v@Pks\hf#_CPR7@Bv Df5_fЬ ĪA\d&N=qk|5B!}A>Ayp "! Hv(?NB>7Nb0LBaiX\nԷ3.cBU P.h<43[ fX ~QbpZz{zpMRjofJ$jĄr-@mՎB:? cD*@) T,iAKD1J50 Ӟ] y &" -|u1WȾ *"</f!еI*CPaؓAX)@KB*NzAӾO* {vwcCcAg1AQRݒ]SQޓCBgNnf4Y2Wf&!Vjڬ\5FbTIO@by(Y$k5iQ&z Akr}Z@y. ho{4]zZ&/$ hh&ՈU%Ug߲jOdW`VL'vbIUt:8 =ɥOw BQq: !n'ۭo@=c nJ }6v_eг C/i> QhVqW+ñQ48=al#ػ' Oޟ|~x{g,1%i(8txyo3*H!8U#Ow:?v0K8y+RZg6nV:<$3E n[ldZ[,<5t>`T]ⰍPilF=I$j {rvl9vq OctϤ)<ji~UM@h^yx=={G/o7(0;?o;< O? ZԽo. P &T,D6 :<8a2AKN؟AK;gW!,LmE6Nߟn;䏧"ù@(=bG+)xG*f3LI/lb4ǜ&0ۉ`GFN åF4{QW}/}/OYY% 3G'ޥ4 Gmbrnc#dyޭk J[x9lJѵ"%HBa{ t 73\I IO聲W&G"YFhҮ!C َrC4lm)ߑ1YJ7`-ߠ[7a+TuE޸!bu+ ⺈`lL`v]n"l[rY)lmO 777+wU0sXO-`;mǓmBa0e׈2zܼk`J+JFUExD.C ac-^3l+ YYbTT -/PC;؛čѱ3$0/CϦo)61uU|oY%n15v[DYxZfSBʓ@Fx@+,=?%V@\VL!X0tS)Nf=kH M?l!y_fdxx0鎈k*V5T&9vwu;<^=*cu8Q|{Ǿ/-r> ;5D|EGZ͘ۼ7Uh^I珺NGf%2lUw|F\, u/ nIaˑ%i_Kp`{AuI޽UM|J>۹-u)i,٣T Q#mܥϤ;B\ U%tI<"]Uqe[#55F㎈Vf )LoŜ\RITu,6Z'@b+=qzSd=Foo'}ypM 0RPQA|m?&_>B~M՞H_?=S4l;@Kūt? 9?()l7Yz;6hZR~Wܱo| -*rOw| mA7r=/*Mzlz>U(V|XbPb{6@|ρB!ƹȆ\4P!v!e6MPLz?rY!rÐq1 2bܗ$n sle&$97Y\~*{w?Ձ"Sx]5w:4 _Ϟ)LSVl?`M&VfM Ӿ}M̎{"v0KefQעY* ӱlR0hAs/j6ܑLPQ6э]ML=HEˁNey؍NM ;'c^D*mmvevےE󵎬dʛ#V %=jCKUbywE~v|w0ZlԤ`fbk9$W:TO.'_]q5槵/o>5^/mVkY-x@-? A'],#]vM#^E#PnWP 9>r=_`Oہl5]@YG|5]r6ː~f9T}AJX,(66=rSiX4U]v\nTOȁёenn:]N֡`p̙ ӈS6]zF+;t$Dj+3shQz_?wU뉧yo'a^Ɠ(%O`EϗbMד{&OThlã/Wò7nhaDq:$bƠH$L9#ۀCO'Yl4[0MuS"t|g:c e,4E\{&3d,"Abu8vO+72)z!RHW7="^p#;UaO7YJd@*2!R@`k=m2y6Hk Z (&|QgiX]]cfWVM8h~@Odue2$C}쾎7~%7wofSUΧX8k@K.<4I2:bĊ$gQϰɉ0FKga*J8˟9d5$lKJkf{Mgՠڷ\!FtwJo߄V!ƻE: b3f0Zy'1 jB %&@Akf.ȍ2g? M.h,12@:nolm˩a6]s4 V!Eq요5eϝe$ƙePpF*\њaUGFQ,5jX"n;t X*PGc%5/k4zT_Ot%8H=L>Aψ|y~sx ^=n]?fގS'.fjb]qNlN(i j˽DY؋˲͉o0rCCӦT haR .6ï[c-62A׉cҬ,̦FVʛLbw$e,&a'1Chĺ?vHO9 (/ E$:,=Yl:}Z>b,I/,,7͏˶6vy= ϫQ|(}/aS~[KI,#E_*,i Aò0zR |^YG7*߲O_8Am;h[Q4f DIű0?utGEbRbtNj^YomAS>,bGGLtOQn| }l܋GM>x| --e7 R$@0I|յVpGyh8? >?_Y?1#cHq.s1d)%r壇΃tMjQ,wyGX^.~;>^fc549W/nM^n$თ7uF[GŎXa#jM` | MOl{]}wg[ooL; 㮾u#h#EM< ؞0\ 摝BAvC{M Q3jY"Գj״B̺ )8pQpMvP>x0TT*ZO{ ()b0N@g ,6=Ii 1f}t@a2?JuLSЧ&gcgP,{ Ч*.w]ʃ~x+[TfG1b(hkFscLN afiG'Rbj;Fk "d&'8գ蕯5)m]ȕۥAH#=9 s3W0t>pt50)|=phqjZŤ;ghW͑ȍ-i}OZ׉eߕl7.ު]3/ŗݞ!o0(ZZ|k'vd!U cwO2VB$*> -WJC˦ZLB5-苃Nwplihk-t[#]ު:!ic$~f[ yqۊRnKR#Ԛ";60Ž+4g}EBA!p^}m}Uш![޴Yri۪޼ Bm݌IGO:$7/0E&1 JPeߓzHV*RAlXF[7kC{3+^w|ѡ._1#yHn oIhPȆ}Q5$sdyz$j$E$2|Bڒ v5U@ D3Y'P6C<4 KD~VkU(Y =ݳf pJH2: t@*!I_EBu$;5xF;v/&^"o"| ,tB,ݮ4_NS5koO4@G}[p"#"}2xu8~ v &r3.\ty9iz穊|Bd8ך#TɻJEtO ]A܉4$vz$)ilm9Ṕ>H67#э-#H\y`NWK(a\%5l@&2b9PSNnApz|*4ρ ,^Ybmaԓ[h}jh$5 Ĩ6ձB|{57x?\INRmu C^"@t} S5ͯB]F=-^"d g$L^{=EE7Ti*6O*v]I)ۢ,.IPVI A{Kyh "&vyyYģ>=rA &*2YkEx=)2W ^I|lQIZ0'VWb 9'N.]!rf* yO Q%@ds <@(_ 9QM aHBPXi{^ \@,@M8~!hh^ZWFwjjNzN=3-@Q<ثh>A+ݳu?k?}x}1|0 _wi郈ͳ;4]? rZ{CN;]4@VjbNs;J y*rZPҶ6UPOTsS '!X9`%(EvmvB+*7cg 9d'lZ(s> :8UHm={fiZh_A)7KS% Fl|=2)zz,qh7 fA_ꇾr̴(MnoGϺ$[=MwA mc] -٤B*R3m4mSeے#*eQB#5B^6/P2ߞes\GyzuY*NOKgEճ`^2 a'YuK@q fz1^m\^Tj\l5Q bfjlJnmeH=y_FsaK$Qpq3tL}aOұuy{bmL =a-(Q' w:vobŬ}to~VźS[!AbWpzˁ'*il,}D}i%# < C/ch7A1B,tdS;6 VDaJDQʧv7L@qÑDGhPkIþYvtzsrqZ ߊxH66AO}Չ5;liTKq*hCeI@_7ݶSFʧ~Iٛ82MF"\fXm34r$GLbtlOw";fNv@5SUjtܷic5Mzf%O[ISޓ$,f}ćRn=)TX5)js',̕զP[2e~k&~Y$/~#}^Mڃ0LH؎kp;ԋHuMjd5/ơh#?f*'4W9)jq<׮ީEJq仲ޤu:G˅PB-dC!Y{1MnoLf{~wo*. zByjEm|ru:$`4 A{Ђ$ T\,ޓ" 8 qtp%u)DOwm$7pDn#IpreZ=ClU'2@Y S<`Y"`NFa%qsNHG1X@OA g@V&zn!g܂\93AIڀY+[C@b xowo>[_~|dl?y @Ճn%%s `Fwl0 . n!A(F "cYA+"ˏ( 3B ЃQPyiP 9'Ǚx9Bn393MrZsoxے0x-Ys$q_tH-ٴA}93=7k%\eQ%^𛿁_l/YUYUUs)NtKIppܚ!-uESJxq&VA4FdkjIQwnC,o#oHaa9CmbPJ5 usj_{݋"Ut¤> ntmV,[P fB3i`iCriqN$3YuqnB~hJj^r;}qzhCzt<X'~У"Yݟ؞^ϵߺ_Z۾=J1X趲9̤ᛍNؑyï/"#&D%s_vLE"L'GS<~d-VD{RŦV?J^ >#>ƞ,0Yio2δLbԯL${W2ď.2_S+3_t_]Me_N:Ty3CJuyy+5bI'K&HXeMcIjba־IHSxt6ewyҺĢў;bt_,]J鼻$ ۸ _# %@ՉI&LZ$΋(}^ԄC8#17EtY:]qo<o`w@voq[ǥ 1h{8$=:cQo]{1_ 4˽1}[&A"; )(cmW0]A&wN sxcUܫj&{cQ>D6[;ɂxI:it!Q LQWxxV)v:raE~)GO(=A~MoΤIj3bg,yY6cXēeИ5 7$iSH}HCMgPs8 :N쐻CEgE(D|LT|׫@TW#uh,Ѷ>P d"Rv6}9S`@RFO<gDr%5F'RJ,tg&9kC:|jiH|Bu%PZ$F3>#4'AXsMbX){5[ 0; ỊFfCdt!@|cڿS=ȶ ! MEfn6ƼС=6V VDѝE6tZ( x:-tmONn4SއD@O' >ٮȋ'!*S`LL A2rZӌUIm"U"VP{R2`Y(S 0K(͝ ' |RW}祂OB}rmnhYzQ:ĬJ vf }џֻԄ=6ܠoYϸi̳:y.9.rָ,DX:fM3:8b~ǒ]E&It.bN{VRGjStkbXZ`1Z2s %=t:D Ե{. ~冂}O qjp&y|1=Y;޳=^ɷKhq.Bk>]=_:| !/ʐn gSIDz"ql ʠEnsKx:.@ Ǯ.3'g_OI^( B1/uDPTRAۦ Ln&Eةj~anOGZбa$4hyػ.۽-Ak[?k6U./P+k &$5CLm@>3:b[fūPOt=jrB45l>;wmح"2Ʊh;' Uͽ,|`<Cq„c\:ZJ ~9\D*:d|4o W)Hs G{?֤I GY(}rȼ!hP P@ S[~`$vk=Dv ̪n7WB<ݚ7&Ay@ XdZ@Mh&:J&Ya* {j*4hW ˩ݬ5zh07_^ȿ>in.8^GO޼:ЯߜrٔR٘ԑҵg@1[sN<2,}`%`o+Hu;\F(3#!,Jj' 94f@&iVUکjyM ;˙k\LdQ{)jBD5' fjz*6h,|`nta؃Po7JL;78YmLc4< D1;Ǚi3{+Zf҂D BQ:4'1N'4N)OyJ&ܞ-YjVĐڈ:PRۛ8ѼO;eSWÉggsOІ]N_|Z^oݬtR;(xp>B8<)vgof}бڐj{۔vOT}>M#'3fE|$;i.-OR` ,-go>wb NaU\̀WEIm`SLo s:Zzo ,3^TòQ}6NeI46}ȭeՕŚoFmpF?m+:a=d)`-!H z]I/mUޣcg'mXqǟf(8c*,ž03'6BjˏjbRX,wp-` NLap84MY sfP&p9ix28[X[rwHu\cIa׮MSx#{sBAz4wQcMQ6Nb\?tX~|>;qmnRO2qۦuz[,CGs?jy/x8<-o xsI: wUw6O2_♛*1 ^: DkO uM?rM f""YQ16}=KLO61iT+P(4viV2y.;yƱl7ɶb#=YN=I,^ryf87[Ba_AM~wWQe[` r;ݖNF| E {{*li6eKㅕ ZlXsbė+G0ߜf.:w3k`1_a%}S2Yju]&#PG+ܙg2wDD,ul r64mQ%µE'U y- ʅd(~~(7uP;}g6GGҲ錜{a`7>U;%q,w][y?~-{y[9̬'t@9Iz˳3_?OG??{?܇{;k4c}C+`PU`Pi _{6Zuvw`]Fx>rOtAkGBVB ~-wqZ6h d ݑ@K#@]$F-ȡ a% +!~Dф;BVbl7ncv.ZmEXPI^w-! -z"- vVsY4&x`کR()l^;r@:Uӽ???~n;k٠($'RnҎyPS* Xiz# QJ.j>X@>GkdMs 'F4]oPL L[ Nbjڎ[>,j m {3dmJ&~Ĥ22A1͇:ں.ÀZ6;LŇ,) ~$){dQp@ix9:*Ne 7a"ƦS[:NnY!qFj ?>? ("#]jʉ?~䰲2Eˌ@?U?Μeᙥa)[}ISdfE2uE35ûm wG}SbfA j{(7i1s촙GIuYO}UcȰL5Z,' KQ *M*ۦFxjeb@&oHA/mRr):dox9V.BF.MCBrWq ԗ .oJ Gpg5BsW~V;\%3'l;W_|<;5ʼnM $v4~$E_E}ƇB [jՓcec3z38ӌy6-Lr]G06Zx~ocIyS?×qfʓy$E {f"2(7t9/s"~fd4Ύ` m0]2E8z'7ui&U]:!Y3/Ne⾽)Rxs^Odj{)TFRk$.(5)|Lȇ(lDY˫]ky"j,Hљ/RU٬"61bih%4P\U'midF VR=~u9~gSj͡gnOUmձj Wg>ܔo7_S%Uu]|^ j>qu NSaO (H쐿bi!1I68$zZE>omK92BM6u+ Hl{!کS/H_B-ZɄy8PA+}mq"jZ~yOSp}hqKw T>¶Lc0 'rrs$`^f= p""7|Czo0]niZ 7'ɃGbl^8niؠN(!:['e4 RT{^ХVE!mBv%]nZh;} oO1i{ݲ]y? oF0}P hrptF}"cDm&:kǝy Ca@Vѐ{ZhUE-hڛmtn쵽L=w>D=^-ctnNwW^zdPy& ~!-Kj>Ϥ6E՞Ԣ[әU"nUvzsX .f]Ew*nJͶG7ZhQ6-Ei{%m% [ҎjZBC@&bwP7KEGƒx5ٓ#qcɐ,%JK`t7=^r]## Ѓ~QamX/FJenjFCb5H|7\fv3-yij$qh0Mea&qA"#v[{ur&nf~+Q8,6iTwnC{25Uh3_4g+S"񎉫> kxPK5c0~{9-f:;8[txbF ;1uB|GD:G9acm(ׅyJ,i 2<؜=S Oєj޳TӺWTT`溜=88G $%0̇z:tw"[CX۹kf C6"Qd"JgSA"z"?XX _b g U,SX̴֓YS ᇮ͉lZ{9=$Φ>Fga m }8ׇ`${Y4h)n()Ҙiv88-N'>>/cBe[gXR\I-o0#I/->YEO+(T݉4U]8.15[pfcҭ̤] b,)e]frCLi#,Lz헮ϬBxy`;Z(>3QIJܹ̗{6[kȝ1s6<}Mt/r_F%~^y4txFcyy6x=f|E21LذxVFΈcmOtev,>Zei0K5dɈb(TjZFA]:Yv'\'w?O)deYlNDx{<}77X9G~1˓H/__.wwc>;.W'''zss[*{oI "ZV[;YFVV`yµڍ2曭VsNf![fc'fQm5 lff ҇qc 3*f6ZO4[*;(Bg' F 6rQ$Lر݆9h_o(NBylͪQDEC*$흭Ux fNhvhY2j6 vZ{VcQ:&Xj5/vkgVV,v|j@=gn6VhUs9ڂp6wn?l^V?hf?l77ƺ}[g\6 Y ,xTRDyLFfjFsf{ ,C39jݟnYg+pyB+ث`QjmhץNW5\Uzv]mYsY֪yk^ y ~w끺A&U)hUl8 ^;hw,EOX6Χ.u +N,!]&'וqҍdS.tƪJց5GrKԤniٔ;M"KmH1 Q` Azk5|ϣ4OC+ĦT*ŢJ|.,،ԋvyfA]NI""i$|.>=:iE/77hn/w--|W/<Eũ͛J%~pp5zʟ'(Ƣ $V6G.SJ`QdߧED^%pWv1*ˠu$XW'> bnؙvqFEpW<+H;Gǻ!|.vֳ`BOCmb+VcEaZO y: \n[*W#f ʜcMgK)$27h>K`$IX`yĊ peGԛeT/A̜4eǘOQXvH։T%zAiA5F|;s* Ab͸2ku6_f?t/O2;)EME~uFk??r,ԣARv+ghw!IC}" 8!Kx6_"Z{6N6ٻ͝e'Apnj(2h:l)BS`D T{o9cY*[QS D9,q;S7(2n(HDk J8aK%Ŗ 2@b0+4nVF3:E^)6" "i5("*ޜ)Ѽ7 pb![Ľrݡ|԰ >tѧ>_]gt?umOGrjTupI&nfFz+_Wgn׵2ݥDY[0g/3M<$$ fu6!qWtCf0m1B%R)5̎D32.HR@ZLJlP /n4Fp]@4=bvoKgn⠀%_0|cՙeq#bC5cpc3i@,&?<NH; JדѰvu7x{/^DI|bRC|<85:D75 N8WK?^5[u&I=7neZ>uR;-W3#,iA#sߢȽ7ڬCEF,+<6)=$5OY,Om1uy&;5})xpsH!,ՈQB@Ht#IdNT~p6G|\I2cUb;O-2lj҇gM,C~Ǻ'_dzm>6j?ߜpgّxsWND" <_ӂ/0]܌}s==ryYY`ijt:^_MVaҁ6"Yۢ:O+ia7?2؁-|($X2%FLwg;'?;ўA!ڜPddM˱_K9KTm_4{yu΋/q~Oݣyvk2H%Cty$ Zr&}"(4Bc[+vjvN@@nְv FL#t:aHO^ܜ6RZELCVپin{7#rX0|vgO~n\o4nNh7N;3^4T㹈-{ uF$ޜ![9RUZo=rPA*{2v IJ.Mhjcg@TFOƇUb " I< W|uNveZ*GuP4ʖvn!EmzxEo#uI{&];k8ޝKIv-j$g4vvmoȉ 6 c^Q W^=9 n qt@ ݷW`N݃1~7="}ReWY)Mj_>/8 4s$0P}^S1~,G|8j.-tI{ bIb6Qfqh*y9,ItD4uY&bLLuDT29ͅXR%30IÔ(C)=Ϸk~m],1hݻwʢn@8@9 U|RԢOvEj,A{s[<ISYsJY( gQt2]fI: 72UR:޻.]湪_/"9/'ID« ՘SiRpvD4B9,N2GdHqaN g/u񄳉axOk-eJ^nSMǓ:'<& u!;"}E&ZHUj.Z8tꨄM̃@⍡dPSb/咧r#$73;$aKdz8Bɔfvb W O@`Mڡvz"ZLMEDk8u2P GcAǔ;؏5G\rG'ʐ*hA_g܄xwVq/s=F<+xˑDzWkc{Kwk{Q](2dvz6ιP)(3Xg MQF)-,VӬ^LJ w+_gHĈs'^rA*Jx.(FN>>Ze,to_ w$ zֲd}xl0rYt2Sle(^T{.:wg-{DTmp(HuwkǢzrz\<鿽8/|G;߼x{~PSjsDl6j5ƹŚj5e$70 +G\ _9 k15UL7qJ!oq@b3!`0JhS fB1I( )RǪi4n 1S jTh1gD` <4j4wiakݨ`nQV=.DSTUpY Bs $!VsD7 -l6 ڃ,JjJٶՆNKaӱ 6Xj+sc5v>j|vOWO66?m>Ŏg.Kae@Wk6ֱ| +6楆֭ʶ?)r msQ֜Mkw^X(a/E)2 Eu̝Z*HGn 2B\)7ugH:&'\LAf]GTʸ~(49UerQj84Rf]u|\V{:ӥ,6=RSrbޫ/RH4x:zYe,gfFjč$?X7u'i CqϽ(Q d;=IRS E 5[OMNWGq#'^ 3+i:}eZ^*?+8 9IܓI_~)9#FDbOIb9kk ;pgZo'EbKInÿr0$I[pYam :~hO?mxxFf=gޮ\ y{xvr6On_{GM2Vc - tYj'2qFn )-4*2eQ.vHsw! [D;0+FZF Lbe(b@G_#"2jbH4!3>wDBL"GҪ888'B0>xHbh[Jg?|*@#(k>ٲFB6@ dx滑X& izc a ځy[ͳvo7_} auqZ&ij]YtvzcPRPXԟn"לlc@:ɰBBsK u |KXi6W6C*"ɡC;qc1+3+BZQZXkQyb,1bQo,Q~T8ik`rg:j ~!ʡ sP:Rَۢ C fQSS:&Jcng2&o[Lzv9x5TKNJr9Y 8]WMԫIn<G0+Xw=ɡpCl:1doqKx㿾y :hB.Ffҿ:%Dy:q0jt=Z'VQ/ g3*:Q8|7m _DݚXlޏ}eu~qC/>2ĕo\\>~'_ش}qk-PTE(Z Q ,>'dBQgHC)uzqL3pO2)#f@Tm@ KnC㠶[E)j=N[Ҡ@ՃV [Ul3T)okZj~R:Fםmlb@kkL2` %\z[vP`ȄFCU ;HƪЛ}21-3qhmZZa僷gGן]`S|ܺEm8,F5+׊o UZ:3*{L{1CMQ T^n0 [H[`)FkBXʷv@5? FdN:4SW'[*X3}^m\ k^$BΡPڍТ7I6G*a"Rp,`n{3vØ܌ETnvN!fщnDwkb|2$ݙ?0y''ՙs-;>udYS&?9||siAJڦgN= 8ocHwzϱ[b]^2Ӝ/vd=_F1/N7MU-CX'ޥ/S{C%J{g{9Uf=̖/um#!]V vy*V={غmPұ6RUcP#6H_ݤf=#23Pm[f(zb2,~ԏY<}ڂJ$-d.vT59:m"h FNIWۅŨԤhFI%iLW PށH2 e4G |OVy:L2܌b~4O}{dbAb`N;__e8TXUn&0ՕkrUOOg21#Y?lxh_{dGNl%~μ^?  , `؜K:Q=g9< {AGϦc7i4%> }UTdZTB'%zF;?oKdU7<SSX~iH,8Jy(Lr <Ӂ]AJ܆[سy|_oA{Ѣ--FEˣDeR.2Z)R #X -O83N#㘅(ˋC&,d(3(<[b\Z22-zKsA6g2 70N1UFW $`,egxJP{6ibضI^zc|9vn0;&3q_v]&Rm@dRŘPфpIAٽL[!j zbND`[\k_wN?]Fr՛ih7A0ե'ETqjJ|`6%O힤tw#=SXO%i+FOcߤ9EŎb` /Zsǁ/JED$ߖZZ jgX$w=ֻLfDsySU]Bq摒F/$E]{nmTqGRecbcoMߙKB_wDT.FCOtg{q7Q"3$~Lh\Mu ,`w2u}w]?VCYŊt8z$Lzb' M9 .2lX4{M!*i x;5:d{세F)2|f4v#N>˼dq gp8 2/gɰ?d>] iqlƅ3n%Tz!u[5yVٱr̈́xRX3'u =Ҏ]fRC:qbؼAƎKͨUFf9,́yd:=ľ9wE|//.r+lCk}^|ΨW\+_#(~|rX|{2t껊CsM3O._ϧ=~EP#&49=4:lCG[tn$viN$sBn, >0BTCg#u]mU$-˩}qzVdVwYfMև[;o-"$(~Q O{G6BgmA֜P.,RFS* -2uI9zFQlBjg>^.G %W#*446(.59=Hdd-N&pfR+&-V ;ZmP?_3LoȽu\g1a4X f _A5i < X'0e`uAʃ|1 j8Nn@eӼ`Э&#>п_*){'|\+7 inq&ÍL2n)phVAsX(T;G ^`!pBiA4%JTF)TJ5 c X)2YǙźEyVw~XbqTz ̝%-t FB)uadikf(,0LA)ilxw=60l3hhxD_tBklcٱ;It7zG'Ը]ʄFSٕ1r"ժM=fc \gfho۹fb3ےF2R1׻Ѷ0O԰c)~(Dwde hQˤ@x>4-jh.=m%zgj(adq TS>+֎ w~ k``~{.)^TM #[SǗur%i}Ťs*ԺtsjDӫHh4K]aè/EЗڋEQ;ǩKѻ9cK]#ՓyhKY7&G6ܮU~]xc+䥍센>5wD3sjH5b ⮥M]߽G{؝!!lja:7}֤uzt!SwI|[4EU}XiƆd5qq; OhqC$fضi՗H' ynO׺e{64$$Vi~ujqǡNw-4>j8QDsLy9?1*i~ /|W`R7/e6l~:fC.`-)]/_//~oo.O#m}v+N|`11}G 9%j-S$#kNBxл !oO' @vIvv[?3{U*twurOۯ/_|Mˍٛ' w߅5|oѨkx' z} @CA#PHZ)'@r+m+w?t=+E/W-eMzB^1?f z/V3 HadыB ).Ƭ#u (*h J  | , nQIcuz߁dnY.EU!*ܑ@A@B^%Y,\pH7cyQ %Ps N{h iVYLLb ,5wpA&P؂Jw0IPѢP)@ w<(P0LD;f@~0 ZE.jaQI& d>hW&3jI[«*(nEEb*Ӣ:qFM2-"|)Cr!E a*= Z@uŬ6 ex-Yuǟ͹ݗ^ؖ%[%ܥ޻o}!9(Hv$'ÆoyCJNptթtjزin@T , jj:o8v?XX9/dWI3 rMʤ`=imHӫ60HNu_ CnU)S(TEJ qPY}ZԺū<%׽羯L.)oŊ픁*v#!TxL]wY VXb`]g8E)3U )ww5_r/1 *,w5!>0ua$JvO 3ϰA eEu8Fud=GTgC6KۢA8MGumEn/p ǠXbb2|GDvjCG:Fڐy_f3"Au+G'UyTuNhsGʮܽ8eƆ&hXf)b7 eA/wR]Ŗcwn[He=CcDվ8}'/_]~=\?i~o~g:J۹+HIh"ںU"ު" E2qn#hymUfCVTAV5 V*"m"Ա*J1-tA?ڑHմDʈU26xd%B>r†6GЕA!ZҴr-" GvP[MmV"fTd E&afݴ4Ҵum mnC{ ުޞF i'PF[h=^PFJKm}kC5-$d}i=9m`ofnc62Fr>6Zxf+ڀ:Fg\k`}癄"&2Mx,Y7I* ~&Bqe)BY6k"sk^j hӚE쇕y.|U3e@Y)!Wf1B̢EJϢ!J\71!ox*WEL%0ܧ %"߿[ٱ([3v Z*DXAw@HҠ@{6Ku<*n*,pvSB6n^dNIJ7Wzz}l>7_wJ<3K] :#Ѽ LrigCez$iز42̅^*ܐc D v0R{xHwIc$Cjp<(Pbsd82ѴN,6]N蔦N0^{j?וtkgdFɾq92 yTYi7ˑ0Gj$IX*ԩ=e=٨cP Bw2{5$Mc PNZpEF\1ge I:ʹmZPHN`=PҋibRUv!A&@6xNn Rߕ -7 rbgqVbgYa=T:OjבyoN&q|v<ɶOR7NG>y[&H(e|7z#,*>q CqlW̎'[I6 GԎɃQ‰:0b҉jf(c.Ɖjcjg짃Ko_, PV tD<h.񠴆:+=Ô|~ cՑI䫖~QN4嗻E'AI,I)6^3dLg@;uP2OwF@Os'Ow$ECܻl϶ANj}5x ˳EJg'fa:Ď G /LG̋|P/+$<" '#ƞ,aF]&S×$(-muu;n~ v rnp7u&Ic_V'^8lTKd."Tӻ;HkZɽ~V SŁ{Ql8Q.>nҭ‘uv[nIծEk#{0yQQVoy p'O\*z'9׬]ֱ/ja쩦QώφGֲ?R>Mڇc 695}0"M9rjO6h {1͜8ث` K]>PU,It RcH3!ogZ[Dt瞌.aиPksOvR˧OfϦRtodfdx)NJn:A/"[.VOa>1>ɐ1ze[:c ~Yx;LkíNtwX}Of7qfyG܎90{󇑫 M;w2X;ώdp Y2=ݗrn }LKoD?n^3;gZ<#$Od~ׇx|rro&46}adG-Oa9c?Hѥ.=>;^&86CG6ğmWΈz 5;`(Ql417!N2dն슧\E//?<*2^Qycu fC#>bKKaςXU)gvuAm;@/E~4z(3&ѝZP՝JutA/O!o>~;_V_?w"u~24o^DP*6 +u>l*knyE&O"ʁ+ϡ%Ԝu67z_́7@~7 7m!_5ye Wk_-k񆠀IHm =$h(jF ꏠXd6aF7vBtq~OEoOGM& 3T\1Nn8JYAÉV{?~ko/= fm FYe=5`MY= Ӽ020[Pߴ<:˛Uf^4ОB5Ci6h^'ϭYƶVV楄Fpj73QE%@;ɠB ,Ry[xZRnȤYY*ڰD5/V <Epo%5Tцh"/K ́ȣn xEɏ\u()#; Q&Ezz<Uj衪M94II$%ǒ B$ A$A >9ZN6:nwO=RT '@#Qb}AӰ&*Gu*U v1kPTwYz74l`fB e\'˲2mypOn5:`trh!bJQI*Vpe ȁS{;52$28{L|)A>vw~ wIуD->I%^N]N$+(آ'j9|s c/iPAlf{$bt r9影S*_DNe3!Tkۛk6Q YQ=^lj} f)z؟MSL^w$> >YwMy"AVi)y3C~S֠lNGyHy$Nԣ*c1oq<3Vk7lS'mZBa܁[ ܀[%Nyul>*|b9>?x,7O/œ3j&3S ˢϋTc3黧iymIYpbG6u8E\nD;1̈1WB&+gGQܭ7'l+pqr͉'GCɅxr8^c,7ODžbP`*ґ=l\Cz҈| e"Ď C{oF6X'c˗їO_n]NR;' '_aW#kb!F/;i]&iqC.!]AWj$SP0"5}pB屧Ii0jqL/L)GӨz[zK51yE?2̋0vr:wJɢJa>8Sʛ?̴*7gjW!^&kᲉzШ>}צ߾9[uyŧ~nOF/[{_c25[6͊e&xb #j+j~}R8>N,^ kY!"}AekL|f5D,k>ZJd2B -MvD>nt'/U;^o]?2Ne1_'OJ?]7 psWM=Ugzlg i$MNCjLsݯHvcߗ~kzUADG咏:t)f9Ãp#IRIFYʫ(UܫHOϟNʽ\&FDWo`@vkS𯱈T5ȳ/'kh]/80dO٘*34,qBITٙi0Yl|0N/WYu}2Yqa(F$(I-6][ wYpW$?w4q|om)2){x w֫gG:?؝ozzw̱ ͷqꂭ&hhha\8]P5ΑThUF|Ǚ=AePbC:n?DlP,"EҭVn(|Z) i.0"aպQ @>PHk4TH;~lӭܨ=  8V\u`]Uh&q%ZlHTT2SM&!ELRtQ5ƈdC"Z0nړvݙߚ 0صO+`|jN*,,:RJq >D*W2ɴ\8uEX8w^dBE^\4qvo350F, m ]ȇG39RyA9]t[Zct_Dd@k4S 0,&/dı>|nɃC=n6n=)zRᮽ7w]IƦx;Gw߹{kZPspz8VyXe{o8J^;pI!v4ô=b\.d{m_z`Ox%+Q*_Z^|J TGLCΝH4:YڝH"h {"~}Mbnhy|Xp_6+yU2xIo䚱[QrQ X8~WM$"yUKZo;tN&b .&Njٜ:lmVH"^,rXZ,78 ,f c9 dE9{| .ijF K? ɦ/kOuE@53 뿧Ϳ?\7eeUy")<>΃L36MZ_Th3'@2AEec7S2 e:09? g|C ȣ60O1O]?|*tB#O%R'I^]^?iL2sI?~Soi6I*Tcw_~ǯ~_w.WqVTjpO΀uaw;7PW Oྉ8t; l xb~FV47ܯ# GiuFMb}s t|M/"F v:~>TBt[;l6݃ށ 7%dꔈ4PfMgNUgeANvxiMS)bvm@Y)3c+'t1z '޷l' xn!n hwhFxͨͭEo `kVN'm)e4YNY 7-ZDCYm .b[F 4)9tz 6k]1]gȡ\-st~%MGb {,*@ NkkV Pk x-ɏ$uteP"%IÙ饺ܷʥr_+Zz_ٳc7Q-B A0`2 KA>@ċ/"3(UXCGË;v;[`Su0H*E:0۹ lkЛZ*<~*-{ w}ž/-F#쬋-fր|On&o "ڙEߡtlgsڦxnk_ېww v$$ޒ:bgP;@#muYag/e ?, )mwZd1BP<ÎS_?2q( A{j},ߙ&#PNW]]uD\Xdo)\qZ3Ẅ́|L90!D7RcE5TbYވH6Rˤ^&)8NFS])vk};w g8',?<((ef<ҩQ(8.KMsݡH5V 9 y<2$O\J4 ?*aD셑kgB*}۞ qN̢^g^ulJ̈3>y?so#~O>/O?:H xdzd ۏB^WώAL^b'{+aZpְw !h 6th4h4rBk#e탌,G!"lH#R4 +ODF9mASH9+zSk@#D72GеzP$sf@n @!=7 yɝk>kk׮&va[GH`!gB c8* 8a!2F462y0Z0V!:(8F!SGy8I@i.*G$&2Md8i!7(X:2TaL~}#Pgi-*e=஡_|*Ӝ/kZd7SUMڕOf/3Sa=9>2N <'%qALWۙz|dwmX d Kgȝ%ePg{IX~0{D1hJ6ö<^Awğzⲯ6/>4C+𽱙 eWm⢌Va97=SW j}ul `.F weF/H8ȯGFQS+rRŤ&ғ% u6dV9x9d/TM8.O74 vf+=ݍtX!Zq,DM*u)P S@YWQ)(2s$P*gQ+}u1?\F#؏4j=/CoLgǞli2[O@ɳp௎G>ţ2.壢 S0)H:gŢ,A}6yE0P5-Boӭ>g"yo-Lvq(ZLZo?0ҺkeӓW˗i/u뭟~7J7*Bh&hbDoPZ*(՚25AFQBn@C6k PPA Fpֈg#_)_lO׳"_i1N@sYtmtQѨnk$(a@ `&>RvP|4rBuF]~M׺cH4Yמ0Ί+zRH:ΦPxc k̼n X&MM UTV zQ}U qXT@ Z͵ AZiaj`RԼ PGM}5]LRPLtR2pBγLBѵi*l-UmNGlORVLXB]ũge|W6^YL'i=W0 g懚VEXgUԙC{!\j7f) l>EYئ8?(e;ZC^lݯ= [S蜎L83x[wr $*L?N`{2#z}>^z~)Wߕw6xKbD"@9 ߿Թl[}Vw& h+5!dE !t#~2:_vYUþNCx^&_>sD;2R)Ii\V+u6uw}Jooa+Ԟ~VxC<^dN_U$լSWvVscr\{j_M7wDsvNfvQmg;g"]~L:F M>@1 $8^KO5{>z_|Ɛ #%^.ŞL2aN+ ` ~<>?{>3 `_ijQϤ/2?^v!]7b4?xXze/Or'?YN#嗟Ek-T:d'Yڎ~:{W>{49j8K~Z)6vFJ_g?=G e^@3`p $M*\,PHJ115evgovoFfʾ-{mhwE|}ߕ{_靭4:͵ZN_^}ëO-dWǗ\?xIS&:Z$O]7Nc mel4oi!OeJЂl pchk@J0ÍbIBF SrM ZSF+FBXu9V11`#M4 +~X+W`>R zu`&m|p& 4{5lQW$rnm4® Hݚ|+jR=ݮ}C `&Ym]U! QX1V*TiYU aH`X+ fEBL֜PQ0D &hL2Nu˫jC]UքhLFf]m k+h̒m>NkZ_ޯkj@IM&k8.);2NW$0ۜbVS_sQמ״ë+k*p lTj 65g>& V94#Ec~W45 sEKx-׏$q_y]{4H̎mWtU޷1;nͭ5G)A/ TdϽ"## "m5v]il(2#s`l7NhJ~edc?䑘a3;ٽ3+~6d+Ǟl+';B_E)ߌL)GE=XYf±:u6aAj\.̰ "?`O&DBD`g}Ot.FGjRoayqe'_'m<+FY1w$yJUnjյYjowߜ%? }Ia ŗxֶ PufQ/L^`39}6?%Y1|w]݉NIʹ ڽ<&~@1.lQ>=#`[h$3,FvYą[:.sQ9 ͬǡht/ډe~(45:U bM՞33ӥ^O2˧_Ԟ KǠ82ӣߝvļf5=>MBY%s%eb9ˆ-VdOd<3#6AE2rnBmpH-te(kܗtpxcX&N̽FN^˧.P+eSǗDYd: [|Vf$eüZ#ZſlBQ" 4:҆xoL|™&,PoRbPp6܄H!6I [el8eUZqn^UfN|FܔkיqUM/b>\V66b"q7NfSi, J+ou>gެ ;n:gU<7>Vx]F 釋?wt)|#,ldLBz9?ME6C&qlMUxadƷrb^GK47yP3/#5v8ҟ- rf"uU8SdWIB[q\Wz$UsLM<vzZu~cM [;X]nי&p44\AD*bx6nb 5cu"bmI*m|U2&kOj[WFVE7 1U@`m iX 9# O[EH`^ myZOY> W>x~ HW$P[X{ rţ +bTƱʅ"q͂u!oO|Ȁ ~V(gg8O~3Lscꇧ,aw1Tz&Ĵ l)݆u<or, "IޠpOTORS]z揾6]n} ~폿rՇY{rfG"diqVOA)r+I%)RSGcr>M=yZcpljj6 :1 ǤyjfXL`o Oz@Xsȉ@@SxE)(Ql2$* vD%@_ >-᪱/̳FY,M2O&GR)A"o  |VU<2"@vO}YNpji;ǓH73Ovz9KU5MhSmUAzq9:,|̨&9)',sWz|NƯV'D= iUtjw@UO(RdY9Z nJ+x|h!tL㩜BU\Z\G#bePg;s8wTzo@,GBHadOt_载O?m_}rO:Ki|x߈~w_">W}o5E)vo Z;@Zk5qgA_'>)4G Z˃jW I,-^ I%j2F:BK'nꐅmOrbDw ZO@ HmT[0H@Śͭ4kKXjuD#f,Q}@(\T,GVTFZ* aKPHpQDAN@,?h]XBUxX=x> 4wL*!;R)`Sŝ6ϴYUa p-nP 4Ams8KdHgwך"Mh/ nk+qKŖ(`GpoBiFqE)@xrQ gYsXYTaԢ^W@@PP{ؠ%8HU{_s]dzdu;i{ _|ݙ =qa?deg tvRI7#}"?C~kk@<)uE{Oـ4hZW[8 'sO1>;DH%(b{G}u >HP?} ɞztG 8zӅn6OwG"zh!`wsMx|eup@FDA/{GA{K'G]腏,^ch*$R)5[MSE!z\F+[AOGG0RX ~6V!=&S="^_jb ;}#F/ikfOaF7*)1(~22D$AaGD̤l@PgIzUe@>wL藹F*0-Z>u\CbxX4G&jns72ښS/`tje oa-2*\8OlEUuXs4*?]nY?nM*.~:z(~1k (zf*&h#V%hň,U{,39[ź?,A`WP|#,<3#d^^J>ǪE]Ew<˝sѳ)5K =aX!_Ձdgrl#+4%V6N<4cJWK_PȵWvG|F_M`^. J'3bPqC?NB^䅝4r ÷U\o)MsrwuߝEޔ1Vћc|5MDGNrWy}v6%r%$Ӥ]d8+8UKMW{6At-+ [YqR.J-SZu}f~4;SwajWf( ݳFD䣫h"|8_Ə$`J쓧C=8$vEp'ŎDAouw?|/ Ǧetfp;xN5dfeRLE>U nu Il FPB6_T<zVK Q'u([X>BSeF}nl7~v1xBkHmDh%N#Z*@ـ$b oV1O!Z8ȡj :xB${YĖŰUJ-9LupD v5MA$tpΓQÝnrC|ymSЉ+M`KY*no&&crK ;Z/KD| JF11ý,|'om 3/8%xm3-+tYLâ ` z[?Ȳ޲xLj3,5xMI$Y/23 {zKUY[^g垵{zy{{f5cx`K6/0 l $8Y7,N7H\>"⋪zkRoAݓFPRhr_M4y[cA; }6388ebO5roh틻wDƕwnMa14J"ؘ%sgDvِw7LƦĝP3$5˓CN It$պ;G(wC5Qc?FԘ;|^XH=KO-&H 01ͯ%>ȧNDLHQ7]ɦsK$wd=X([r_ݞ0&5M6J[&yhZۋGA֎}6XLCk8P2)}%pPKid 3A͜8<̦śTD e.̉`uBrfM/=OٓI 쓩+fGdHwYܐ9-'&PS惓 O箿RWS6wSBa2 /!~Uj*8K[2^? 1]=IB6s41KE刦q ẃ;ɩi #Y+{GZ?;}Zy}eÒ 8 έH315c%驞hpfOxԃ>cQ3'b/zhLdq"YgÉ fIa;TXy{ģqñdh3 sXs'܋ヨ^nF?mQ IdSq3Ó]_&p9ςh4-9J$zR9I{Kϓ;2~9%k/;?Ϗzn\ӈo֮o/:?I'_/B[u]Mtp6֙cT݂K25:"p oTڭzbLdÊ*`XX]%u"bصjµ!f4ZmVސF{6.=]݆6\+<{-8o0'`c8#!~!x\]uwޙ7y̢v*m'.SbVa$֚&(ӉXD v>E?rK$C ]K]6_LMG0K;3}AYk=s'/~X΢ǐ>m^ i a*;22~V:ڐҺ-1kq-(=]ܴ/֍f q71N'/^_~z74N{VA_rV3;XD]&|{ U:6! #(bc5Rԉ  @$u"Ykd0ң6lݺ<޾=&s(~ġJCa.xBx }gAqEsR#EnH 1ƊVs8jC¿Xdh.^WtS8ӧۨM#h1AΞ{t k}bS\Ԇ4au'𠃳 P,b-QDʀ`ogZx%+Ƙ FO Ky¶Hysk^ɃRe@r lv 42f!՞eHg ͑"#۝9ОOИ ^_9L i۞gen( K@;hǗC+bFo,@롷-'h"ceS~K vU2b (e9 Z@DQ#m>#x3EP=[Zo \i@zndD(ԔwUzOvFL׌zRwSV׆{k둅j,mtOyJ0ʇMn ܹ}cw4 zš AKt7w̞y/$yK&G_\7}jݓX)B.}c|*nuh!6G$CV8PnJw/i j򔹨fQ3%RGu{0gRh:EmR%v^q b;&Ot-ʾF-KF^(RtRw4B;&׵]O&ł̢P2ɡ=͎AJ,ۅ qh9$l v!Wb2ݓށI#Zz@Zԃ2݋/YXsOeQ/?`_MFFbS`0dHuؗWq E*#E'޹ uK<}Pƹ _BEñ(G#I#b'de}/}<9$6|=6}L>Z$@f{ȹ+}/̬1uƊ{X8@{G;Cd),>DC_WȰid5J lGʬ9E^v;‚{Iyd}_YWW7~5ch pJ*S@{ǓH ' O{gy281b E<҉z)Ӹ8[D@k2ˍM,.g0U/bRZO4Ǚc>#""w7%Ι{[d>pnI[]_(xWg ڹ~:1~z~No?G?}Wnfh]&[ZByU=hߨcvS t* խ[u"MLSxȶs*G!n'bWv*x{˝CՃ*bW"GUh CCo63kϢ*0pNjԫjC(U` pbTm{G1+AqD5JW+*o 6h.^:|1K`RAj]D;Uͤb6!R&`Ax"6tlVE:x3Ax33K{Uah!.:sqD\qUu3oV{Ʊ3$8|@(H|B$@@ pn?tsϽ{ǜU*m|(Z@Rߋ<^t'Ii*oSGZ-R܆TtʩBqf΋ ٹڬQCj4;lwF!i 3h^^*k+[ W/r^rInZ`Tk1rMetXbZzѠJ5:9]A:z51ҚT6sh:lcvleR-BSOjӯWyy|{MNjmutK24S-r4iLzj9TOPQʓР˴m*zjayIaWeV6sAmح}1rKfYx9*#R_K),nEQJh1uGM>Ҍn>/o}Ǐo~~ɟG{g'ǭG%jv pxIt78f3cbFyr'Wgyibײ2)46r5I|Ej.eJ{U|*WtfsIm8٧ zܨn>$fRexn{qoy_zwjnOaYdO0m$abp"LXq-oʗN|*"@ nwxZ8Fc @+O 1(R mE#rDİ jb!]@:JTS<|R"P:"ZH@CA[ ,EJ u ȃ[Ct9B)8 ̰ㅼC?' 6KFqA!jXĜf, ECgм@2 uɞWG|:)DJ'1 V   6* `-LaF]([vm^pgjzvynKnX]VAٻv7OH7ԏ}LZ}k7vGooe?|~?~<~;u7߸_?}I7xM1.{jSSe|?͍Y'o'$_L^7"Cub*2u|_MUZпqUudz(7cr( sV3OWG`SAgj[J7n|$^|k5:m+pޓON}Qoa0D~XbH,x|{n>A5@+M7aG^pQ/$ |_ܦeqPv 젘K L,X斗: .: 1K.i trm% ?|IS?0▅l bK=Doz(fi8k.D?X(㧝<@}EbGCQoa]UD @,!uI갃%܂ @a: ډt0E ~@E*r[澸㉈'LT0A=|ܓ .-4zas :}; A,Mr͘3 Ƙ.z <0eQN$8qCE A=iC9bbr Y"rX^tKPGQoy >}]P|Aw7ց7CY7x5ٯ$U̬1l=o߭}ʬ\2VLx X/ $@ ,@΋G9Q~9 E8q"2*~_O.5wd{SkڪvoXLOg0s/|:qB4^l=[ň%j SlCv\+8 ijNuYo[:Ib(b'54f6&,M5{+Pͮ[yf N-~0q;FY@wv&]1V;d7ڵPXLuk5#t@V;C2m,k{Iٚ%gq}T6Mn3eT-ͣ,TIjE㥝-[BUw EIӱ ۥt:r&=_عQ;w}5n獀yUعR/t^1ƾiuZr|Idj()@yU~d8sz"pOW닠'[;PĶ] ;s]cLMmM n2mQ,U-3n*~4iu^L)dͬflȲ7zF_Qm\f765<\=JKȷ"+ uru,uQ)-MR8nbC_}y$V(qr~;Qpm[&ǰף_>8w9z88= !B3]=\!=Nij}ii";Txv/^M$RoG=[{0S'=I2z"ߌ%'X<{,{6}ey05x֗*FS<,{ź#|xp 9\Ffn{ApyG_';9~/?'󏿹4 x탫'W@捾#'*w,K'-FqYNEy@Xf7BϺuMxk! >WͫlCɆnMu?l5޸]mxT/{/Z5Xd/hM}UO٣w|_o~kŕ}1[>/8n$*b20*|:Z& N@b @;8 ʈ*ب`8y,69`x9ࡿ([tI A tПy ɽl%^ CCh^ ~M}r3Zz0 ,$Q&!+m0vPn!iÆ!d>GC4Yt?v=BAaGuW_!(QnzW2"D;P80/ `6a[%$|,}sOb`v$<8LR"ceA{pB?ASw3+BY.@h"Y"L2"e Aܚ[WfT4 湄cH&b'>jX |(sVf9@?;J0j: ~e .rbr'Av*4wsh}Ajf2#MJfuevP=$t\֕1uHaCGATMJkK:UnGk*CS[eZWQPcy?J 9I,djN"iH֚5F{Mɞn;}: zQ7 DQP/UusǝRWPǃq,<=G)w[]t7(jI*k:Jr vٕzH3 /3ۍvy@PR;TZ(c\.NW8M;floZHꍵiݏ2FdD}O!=>ӯ)N>WL~'o=>?ɻLغszy1SfSnpQ-='ǡEvIn96Uv:'kO{2wy!5ゥGէ^1jKVc[Q"7t Zߗ,5揣~w_^'_[G:efU@)24bi>3̨cV@%ikR!N i Cs F˻$X굑M3+lgn 44s=B/=lcy|+Yڍ%!c [Pg*ݽ%3襦SL08e+ t#ƨ76xA;KJA*_Bx )'TndG([.2 -n#j'> )pBeel44F,6saetsݨ'(&@T*_9Z/Cy!#ȗZ|u6D<U3Ŧ$3™l 1-V?IpK!b) p3:c ъf $s{@ %?{K6*;doxC\aw![Y!"E!́*Ԅ_؎b0c䉟ie˒|Y}ŻA2HeՔRwjNd^Lkvah>!J)(:= > 6|)ݚڼVGwMfVqva)keҐv2˩,#+3mOM}iՕ-yMrKJ}}g ~_TTS;GЛD {do\pTīd uηQ͘Omjr߷4lZ+!W]Ru]-SUuŘ ҩfQ\8[S&$鮰sG_ɭs 4cVs7T.jwN&%˾zi^ߝIb{|<[Ehl]ʍW,Z'މ?< Dxs'1\>sVH%ͦwtg{}NĊˡ 䢟ag{Z,:A} T6b] pܓ6#S&>ǵN"ɡr Ϝ& J W(Q.GfwUl*wzg 8ܙwmANcѓA8|4-fh:}Ym-D16 $ OЩ'NEpbأ9okTS1G!bv*{4 Rd=T|4wƺy}Qk#Ł(4gܢ5:LaK9iz5--܍:q@sfg8ʄ3}`)z$*s1FiwS<=YW䲜Wޙ dzPWӏOGq<\+}'&wy͇ח"O;w{\=nǶt{-OWY'ڪn5ns[YݮYS3-\ޖNo 0^Bx''wk*VOJߟN]ofuo^_Y Zkc[:]TD}AWޣуO?ޏ߹>K/QY[{^SI 8-1 TUTWa ](2p{> jx`*Rea  w~AyK-zuЬ~@aHQma5nڀrMaiG>6[F26.]f$KHG߼,U0sIPkGbnědS[.'RТy"iZ&0R6ck76ԯ>ERU8v=w(G>/D5;c&xNMfj=jǝȡO4 +ߗw-Y1=iܩEÃe>Q_RH!OUsI44zaZG{Eu(ZxtDw_>y侭m+Iu8:l?0{ro4Խ{ߎ- IXѸ(U/GƞhǑVGjpKcycMejc|+Z SC򇵛β{kp]A,f8unꅼ<> >ˁ oֱ(q2(GyٽGMyPga3pC~dϬʲɋA$9:O\lj,K2rַ=I T{q8 \n8*,\{(CQ.PָIn"7ld䪟.ӄns ~Xi $EQb%*0Ed‹2ϚXȏV3CO_ /̱gSgثrX0Sު>|(6Aʞ%76"8s=D;}QiG3[y '> 4Xx2,L<R"L,Tmi*N:Ъ.Q+/ʦ\?hN?}yf;Λχ2J]b S\Y_x?N_g+3b}j|:78Y?zr>y<-T;~e9^'+ף2iEKP{h[=Ճ+;43g-v4va{ϊm]l [/mYg;Tfg޳Cc݀:~D|6aw(~5Zx?y/?I_w~wnru]g*oX3tqA&CYl\mo*'ZRa&ح:eqEÐ({J)<eØZF1q1x*.F`߃ 2bQ`-PzUK㿷e*V 1!ʰF}F,NuLxB:0%F.1n1lB6Q2'4]n45 )"!#ڐ#vu bq8ר ԥ1OPfeQoac"*&ޤ<92i f}[`x`'@f<-$6>Dxwc_ %ZĬlzj2z>sQ+(PۭPCU`Lˑ1wCfizWnFW!^oc@PDue l^)pcaL楄aآ%tJY,j [<,+ ~urQJ>aˑ-jˡ u`'A૱zCrVXo$f:wУS;M͡G~|vS1cI-v/zCy{2q,͒~<*i⌟C' A NJpj1GF'&ax{=˓;LZ$E}=OyoBʑzaoIKtwkA)=K܋ ܐiLz|T Et"-p5jibmɝ}FnJ@74PObpPڔ>t{ɃȺ'ޅfއMJc;}4~Ldk 9E&'e*0)^%$cw1(t Qq\.jx9xABJ$<#"DxyC qljjVi`d]auu/a=ٺl解i7-wV$JMnt"YFH K7EE d%E\ d[=_F8{~l? RrYLhN^ ~LMu1L琺>hJ\x YIXUǃiӟuj|< bE?s.' a[07rTvD]|s4./R꺉Ź_<|]'_7bޜD^f HU88!w݌%㉗eߴen e}1 5{ZŦ+^"VA;8,X~^{=4yU< (=Mδܕ9squ$NʮIHzFO7y6Z"{~cOgçUDzV}ŠJpǞٜ٥g9x+~h-P`nh!e@V[Jt<)5n,w*]Իr1{ddX*Sun[';o{odžjǯ/~˯/T[װo&-qlZz9…zHqF1ɠwHk2Z8SBx)w5лhLxx0 ^=P~ Z`/.n`[ߪ Ba(D0^t*_'HɆj6\?8\ &FGTkMRrhh <J,8zqNB?mh`nES2D>UiXb}i@kP 1)6lP0>+e'`)nM 1 OgP%pko-7̰@О E#Z- ]Cd ڐY! VRW@H!~hcK6w/Ȟ@"*22*_F&ғQia/@vE(;&ӱv j6\$4PcAHaY.f|bѵe>2LP-r5Ύ %rɡt%3LYEc3$|tTOIC=,u3ضŸ4{pBQbۖjlCf%%[kS{p6F^3[IحÀ9~|wa&yl[nK^ Hu y>nwa]S7={W ]C z瓒-XɘҺE0LFɎDdnTcSCeX\|ei;H<"IX0tU=rM աa_tL ϋw41OGH /A˚0eSY(ݾ$ΆMY'gq$2U}\'ÞWu&X6MƮS9#<.xxZq~Ԯ/*{HKU{Zƪi,ә88.}uU rB ,f, UK8AN#rG\eV~r0d_Ԟ'iIfi(VN&~Qjy H!Xf/fjgM'Kg'PI*\ a4 iDDgu' 9˼gݛFQJr_Ҥ8\I3pC̲Aq9ItإY?=egVfWafĊ7je+klT *2d,932K5Ta Ka!-wtfo__[_g?yG4ypΞ tytŎ.ؾyc=}of_S!髦GQ5ڪwΎ̋x^c/jiܽixScwԽpÛ2{]gsC^F7 ,`W7s/Qsы9_;˿w=oTmlC}' |:q |VA`uRÈ*Vq <-  dTP<8x96͇χ2\T2<] fg%HL`|Dk9al?WXZ6 r3c-C`0W'p,i(s&_{c2* ǡ;։M Uo,Q ĬaZwy2ȅ`3`.<<@+]X;:沆eJPs-ɼFg'Z VÊfi2 'yS8ۤsuׯeOUԜ3iM⌚ı"RzϤwwvo({7o-s9Q9~ШxL^z4Jd6Wa'3͢V]7M"sokc5>O?|vf`ݺJTq߷\|O_G4{^pWߺ_'*mL s Nx Ii<) z F=PHR٠[\Be@ 1( ֪a.-u ;iv[QxVk#~+w;>t18 c',e.~ FBT@RSrDu }^ z|:^BxC [v` ;W&A1b b6G@\(bgxXYI-<t B1B*Գ(} M|}x@HCbJ hE*U:uL2=&{4O4XNB*`\Fq}wyI c't8!{&"MìY<*ĈQ?/vzU>3Y&@,LoߎϽw}P"O-7^,~!| tl}T9HE쬲DInpK6H6&AjGc_'Efh\u xe}؃:1 ߻``Tթe)i^Z7ijTzxꑨʾwVU(F&xBOuF"=BIjX<'66(X*q0D:NgNlQb9b a؍:M;xI 908v >n>JQ{&RLhOOdrǗ(x>EIx<.=3ۣHS{u[1u>X>́Ąp# QMf)|l+]; SVҦ?LR+/TjQ 1QR'jIȔM\MoO4I|Ea&$_!Ʉpy$#2R~Z,ۜAn{ܹ}m"%ݍl;12۴QW%751#M|*8gfU50~5q`+d35vk6{3}w\s];wo(2u 9?9&_ߩ?zp[! Ҏp궚 O~D6D'mI@sᶋac{1ZT@1)t3}#ZXB(6B j vx+sP!wH]h<~j(]PoGPg)~*1u?Tx࣐Y-`3 r`9%@Q- ` MP`] BKijsPm @j!4`.@L?6n4Af9u T[:8υ5!H0T`PBx`Ul_~IPWaG&=bbp!:;9 @1PZsѽ'V(3p'ļDeeB pً@̀z+``:3dcy@= sgƈF? 5@kݣ b1T qeA("uo` 6-x5u@$[r,Es}ldl}JwWZ[e[v8v?$AĿ1`Ay(_zUESٞl])aLG&+Se9m!Ա oVu ۦK"9wa2=fƔ9݁3\de8cp!}tk:􄂏tIkwaew5aL7O]ʿr:l=r򄺗2, bGw^/JCk2UI޿P TWLv 1Q43\R;~qC!ᡮ15~ On ݳ45]јD*hSE^?3Az™Q81]Xu1*xx0*n ȳrlDZp-rOƪMLV4lڦhB_7Qg4L؋hfĉTiX6/zD(er0jlf:lQeVWey3"EF'>qiyxcE&n(E:r2M:"w0W&CSq$r݋t0gi ɝhнX0\wa4l7M'VXyBŤ>ۑ/§%? ǕIfX vCUnP3HT4GLɣ2\~17tE$ka9:2$5|U$4j^Hnf$TO @֐6v叕Y3. rz X'}y#H4:4CBPH3×k_&#+<ƎM5_d؂d<qɏsb~Eg6[ޝ}&//65jq]G:N6.u S#2^: Fc2.@Q/T텲}(K3Ѩi8GUVOR{LxOg1M]8o^j*L9}1X )X4fZ" VZE"4?1 uLFu+¦ݪ#(&Eimͅ‰vS(avhPd|2`'DP>D_9}[ؼW'HxRrW5#qVYZ7 :M8|fT0 %DfZ f\7"D@LZ(u!aA3B|V8;P{Zxuo]kc6xAgbg9X_T2Ʋ֥[]Lx'۰8ʺwE9aZgSNdrw=Y#A2s vc;3!N@Sbٖl0V RX#TsؗKd(}i?AeMSJ\ IvJ?]91jۧcdfJ|Rzp*PctVaL $ 䕷r>Mjfhy=Lj bI4(NGskxusǣaOlof﨣D6} jtGY̩JObp^|杷_S>y#Y)LSU*6x8At۳0.ǕygUi5eI݀g>94e}H;}I7 ۧH0|䲚Od ~C/HVAǦK΃ɂzPӒ.7L3ȇef$GԓuhdzuS.ҡ"=A/%FZ</ǁk`UIIdcyfuK xy̰v ԏ 9V!rhU;f=:au H D>:ds~虄hԎɮh*=-?OI ."VGE䖢hK boV0N,rh رTxpQH*Y聳Hm[HO l[N:7ڎvmPB {K #)6V9h|vc+Sp|48G'v[ىe<kc3AVwD *0ST'UCb5 Q uVc@@42\h v lh_mؓ[m*.01)F,o#M.PԹ78fnLXqWhl)jצ}!=QK6*}{|d$ ? 1s,eh>FT{ 3fxl, kv:7DU_ahgU"kihZwlp(+ҏZ&}<-r y[6MrmnT_M<Ñ( +y⏯~M?ǦC_q0.܀ +.j>={/~ď6糵|qk76} i06?r5&ˇdة~8MOo?_y$$K5ue.<ۄ";'Ϧ@ԕ' .֌B}|Qwb};x=q==ϚGgcQsți2Օ^~uWi_N'{cO6L 5EpZΩ+KV#^*v6Fu%/r_f⌆/t+Q-cýgS'7l؟i*[wɣ O{/s_?7?Pj6eF;Ԛ?ƽYi"B7[3Tg*D t,$DՃk5pO;~`{{9jk@^,6mvtke>Y {-1mo@8;]Q;hUpD #`Zk8刂$X@ l*.vQW*mTaa,фC ":@n+ 5#f`!&B3 4@ 0Q5Ew@La']j \*j,srw^Md89RLmwC#ZnN׈vMϦRR˷_¨6(;{bzY VHy-cH)c0)5NQ.7b(Р3L lUGbcT[  e;5vU ޥ- xMY$q!vU7ʖ-Qwݝkwv%KK 6(% W Ǒ=D"2*22+ &nzqy_VL$$پ(3Sۣ~!K̓tɹ t,=}e`q|U\=KM<=N$QTĤ"L(PeT&0Ljȸޟ1;ہLwypI4cxbg#M9Ex_~xaF>òSYTzm1AXz8y(&y6qxMxmf(/VvÉ[al&<`-Ya0< E%:ߋdmp2>UHυPjw*1=݈e6a4mvIc6!K%|,LWV(#Ր~&ܧѷsS;."E3W(B2QK|~ G>t3KM)\iK&}> ~V{'evl|^=⣑((jN&xLM {u}<f^Bׅayf:P>0i'+ʹYX܉H^dD:wG? |V|Ȫ{Go?'ޯf [ՌzsdM}G\y 'vZh”E;lHF[OK$ХuYJxzX͏yz=Ŧ!vYG>՗Z:.F $˜D[Ek8w<<3Ê} }{Lo rk,]5omhۯ;?ĿGvbOgի}v7{?}dTě*8W{n4tl6fc7HűƬP0x*!B/C+uLcxc'7 j\i#k@LǮLrEM<v%1;XJjb8;XBHm F18 X(Xox b:^hKb-ZO}5u^C(= [M 1x6'1l5,{k2П.2o>j6aBĚr޺=+MOf_{jjOT4ZûQS:h೬`"Cn%]NPoU ;_h^r?"TteU9G.JȰ_g*8EتYIp*+[Mg'đ!rTmB5TֳY&T@VXcbopDE8u+Q>: h5:s:xn[9jh#7a %oe..늚r!$3;u8VN}rI 6MpA 2,ҋDW6AoA$JTnM„?LJfx͗8NMvbY&JŢm0m!6-lp۩+'\ M%>JCUW ?8yѝPv =-} ݥwjK N P] a[n*UIMܨpvMUf}Ӄ\7W[D{WzpSx A'P^M]~,*;P /ltb6^m\A{âAZilSl|1{dx^&E $h.{ǒE9E|izJu7]N #7^n":o{£ERݑo3gȾڼw]{83 >?8 הOR!N'^ڿ_*&2W?z3+QT@V;˓+uE 5.al_2ʤp/+AbP4SEf£-:T (T-"mP(ߟ\Aᗶ6hnG!3;v>IIĝQjܩ="V.^GU6IH', e9 jĽ튝T]#9u~hCNlKӴ4'z?[FƏNG][;^g1*~ϺMZ FCwo|GoFKٸw?ɾ|o7߲Ǔ59"V 4 T1|+MP86/5NW6Y' 2aAǫ?s0 GL:^" >  hY۟ZM&OZ]m4<ňZfX35ڍK`XbtA}R1Cf:F ؕ s[^ Gѐ8a qAa`eDSS@ d탲])! )>Xֳ@dD#v?ECu)fgIF1I>IڜLf9G n) 33{cоƚ@[SkZ݃ܟHk:o1XjxزT:.^D-`ك"#/ia5AO#/%ļzy<$ó `2z Dֲ nCV1,!L@/p\^re} ۿddWS؇jq d9ٰccXp `j}r;-5SFjPQ[QhrCr@[5!؜ǒ=ZjOʀev~(r;&VZ!{My3yt/}pv/8A'JXc'B"nyc;P:Nv5H^m?>qbߥY0ndKmT~t:u{R&A]z\`c_WsنB(̫`ӔNͷmӧkm[.;o³ N(n \&NieDNL+RtLYFMŴwv-Nw7|;J+V'^i:qH* ۭX` $ -YjnaqfwU6B5:qLܰw4.`wlKDaؔY.Sۡ,Q#"zOT^y9عX&{orv2RMٵXޚE( n~rG?&RmjϳFvհzd@ݭ >kSD]'p?w&H $5=,$xy~<-B<*]AqNO cer*<U:K(4}9^$ZQFߏ͒P1_ً* ^툽C`5G}"LI4s]ƁАI@$}qߕBs+?y<6S.O.#?{Lxqkjv|,w}6kΠ|1[|SwaG;pK5omY;{{j̻:d{Yթuw݃" vi2(C6yLW-wTI~l{FXޔIUti_dd3W ~@va8W[J?:tG_zX~QYFl4UtXVyl\ѿqiڷiE[䣋/?㯧g]_~0#gGVEu"!L TfÍʴЛxc 7# B;cAEDDz܅\,3D A±F@p`k\IZQ ;m -D6WBxYS"\Bfu` ,\##r@PbRX*\BeeD]_C2kHK *y>Ah6P|Ts_!2AU0kC9>Mל0YdIeH@o#{tnmjmk -hhM\M,_ Bh(_5cנ"t|Z?4@TR4"(1nc1!4!88!~cM5E*u@B1IsYJ뺇 [MST%C:ʶX)^VHs "-\s8j4XLTX;C0O-xE#q2 +["{db7 CrfgwݕZ,ْm9 F`%1[qz^?҇bɞQ,9X.A%׶Iûphj<,DUq(r{5ݝpcK11m閟؁(Zp,#^G+0K$'ٳy0"Y2;̶غ^%545TbB폎 r<CQ>;avWݺʞۦ6O_{-F{z\MwPxK\*ݞLvq[]aMsU65Q5:BΩvk3ڏ%q4uÙ@$>t',;4m-mfňNxXRkR];s=V-, gڄ&!kK9jXx1oñ:1t*Ck4FmM}klM=43uH xzi q"P6p,P;DZLj[ށqlil0̧ǛM`Vx$qYm飧S! #;]g;S + {$7/>7: L4 X P5 G| S48 r E!M|Ux?(EWL4JF4uCh7]Mv5&T*P+hRp²qG /,KNiQX"˙|jkZhY+[hĪ[ۃ$o*Xغ U%U.lpіun)~qPn3iQU)V&~x^𔸰.7 7gJNf3 6ޘpz0aJ0{h0g2)'7Je#1' T-u1sgWqMdOuLIlv V%jH7}s4p=st}x+t~Nj,Ca:٦aw4z/ҕC%/RϏQ=Y;ۻ BS{C^/ڛY`ϖ\EؾPmUڋ+bo[{W -ex=߱tcMj^ӖW=]w٦w. ׅK͌MkQ `1)HVnשb>蒣w3LJD t&ڎ$sX[!Q&YI>ТWlH#h%$5ƺ7~}>ttttb'[Y Df060>k$3X3WQVggV~S/آGbR_<}7Ow%FKQ.C٤nf˴bnWݯ,<*OeZm7$?2"}'D[rs߫"Ng/nV&}zOO"e/Oef/f 2 ZD}/`2TfwoehބҶSd7$3e\,2mZrޕsŖyϥM6NyW@˕\o0ՙN`\W<][a9r=ɒ&6/kE!Ikʸs 1$Oء>z7Lo5{ ]bX"D0 `"6hFV Vx?lچ~'" 䀥4+ OmPg>BΙ;DwHljA (1 %'hfPhsZ$"sZ*3"-3OT Zr% 0 ShQ($\+A 8h߆ ÙK ,q eAa"@Ag" z ["5'f2R9Ǐf Ո- c9o,% ܮshT |);\oH`.P|o- Ec[KDĪQ>!]5հXyX}n CyB* 5Ih/zI7@S>A᷀mܳr4$7)v:=kݭC`JjvjςWߩbt <-P F+U5fUϝڱ鳺4tCuu[ou`?ԓ L t[Gմ ۾\WC;'xxa<՟P5ڋev#%~*To&E Kc3BZNh`qR{JoV k\)s2}>9яE4Q|ܭH{aH'˅ ىd[*U;/shw#̝U(v<ۉMZ._O}9 _5h]nh|M+?&0!는eR+|{tmKU6BYF1)LɫXuRskLLq"v dBbYue2p.OmsS!\+o@%{&'H%g2PPwpwzl]ClOӼ80?M, hv )Cz["N4NѸʠ ̬6_DJݰT:VVD,REq=X&U8" "o:-1_m7@moȡB4p+qToՈj- uf~@c)Hcc7y8df:bk=;~# tx5ٳu3DKhu21` N^HJ"%R*y\+;Y+IUIk*srzrqptѿm0jKR.:>d/M{wjs-¢~4DI=U[:lw*E^rvOj: *,\Fz$W;"\6p'?nD>fd>S,GӱahIuR]m7.7w'C7s]7K]e.wt uA<:Ͻzlr08,VINʝyդv wWBkO.{{{bP5[NՓ/۲J̸_do@[SWci((52qƍ0Լ&RZղ(^aTMmJ v E*T~ y N=QܳXO`HBٓ$2פAGz] c3S'll/]'c^TjVM$8\1Hw~ïGϸFތ@Ru/p{ 33"wF(9,_K6&/ ;q"q6 z>ㆧ`?c{8Y=jjn7:zU9ZJsgo~>n=M'^ן|ou}kgia1h(\8]Cz@ıRqD} Ǧb8&D(e>aXQXYx CO><䷑\"^.%>O^^R`\O{j].\+c?(czʞ>`!w!)}cOKh2 &+2[e6M16q%.FjwpmbѠ V#z*AV8t1O ~*A(KT"O^fyՒpkwAm9Ɯ2DE2־$% Tz@lfZ.~^'GC"V{MpLSμ}'+g@,ͥdH]:zՌrud5Fxݡavavlh5~s; CezwN$CXY]/WnmGeVZ#k՛K޹_ f(FuH"DX\fTd/m~'8*hhE}M*I3E 1(uT'ir9к4)(Eʷ ŞR\A^86ǒWԘ=f~x8c^~<O' X?~n-^pՀIYDwGS_ؕYfMmFҎ!,@'s?eӁMMeP/8Ptvh(x(vSj<6Z`=K&YgѹFSj̶:r'\ZoLݿ2G5KAoD١MQIӒ?}T$o;/<aBRdLHιe ۗkkfsipY^pfڗ.n2,0:YyXTur=WnXOrN7wU;^kq yQ4uY{~_ߪǿد^Fr46rAˉGٞz,cY'| hNiV$*hhӲ !JNp<f'Q/A#NȀ=ʥHr{t%V8:)_i*͕2upm !u9 _F>X,QO4'0Cr7%Jɠ 2'lulmh1(DMPqB-2"¾c(B Q⌝D= @n >O)@~P b$y­gkXFh"^xk_z.RD-_N! pP|Z_[GpA%׈qEy=˙1S?eG0A %}q>tL  )r|STC,j. Q-hQ`#2%XE@>61AA [D>D5@ۘ(Tr[#Z݋J.N tr5Q׸^Di/Dr}nvzn1 :Z]U)qmoTuoHfW=&eƀ嚑J냞v ;1Eajp$a&\V9–ijL믝Tv)p߬tqJ yw.f3P.Js̫XY';oV1zk;dtl˛vޞg\wdI;?0ʾ`tNu zkY T&(͡ vCgwYzgly;5NhI ^=tz_waoV5h[d;hTmFֶ:fw_?n^jN$;:ubLd凭EZNmjApLFcrt#,nFq2ڽ2U`{rW}æ3ojOg>FV+՞:n2cS޻;7k l$ǹ9MwF Օ՞AҹMt!mW{-N@%Ey8ǁ2H1i /}/)9(V/nGG=,ƺKgL<dP֡:bwǾbRcb#k̭ؕT(\< ዢf[AMb3g}fvG~|B TnqPjk]yp8oG([vέ٪3nZ0䇶X6 ۷)|?w_G~37ip#>7Ͽޫ^8Ŵ.?3ٷϟ5z+Ivg3ꒇLj|>gr=7w{}i_:ꥫ+gN%1 ]~W>Fկ䷿*"OJ>4Qh4D8$& "#"Gݲ}t? N(mm)RŐEo+  -TJ.B u G҂Fכ`C^J(cЂ-`m7+:p̥3tmJʲ̄^v,$\Ϋ Ǜ5&Q=Ób,zRJnQw'^=(]ԨQ3[ }Q(ԍƪ4sm㰵~sJ8)oܼ-fҰYW}ѩ2աZ=ϧﵜP}.w3sp}=PӛN}Iƾ+I0۽Xjf./3{ d,;($nt ZjLUj6K]ZF*&^SjU}mZf{F|R?v%C_7M%d޹ۂ􈹳 JcfW4k'%-3齦+a֬ LO9: eǎ0BZwe]{5h-e9mO;ð+km63~@&fߍHnvA,L%vGڶۛ+vͱaЧJu ss0|çz׿nw}o񣟴޹>޽}8ޭ&A\tICPjs^$Қ]-r/;egOz"wP\yeJ~ɮ[ SՂY-$0=vNYZ?sq%.l|7( )֗揕O>[;~l6OPďcY$y8At"X&^KqR cT 6wb-e!=X5MF!D/0li*8nxM[*>XlVf bF o,ZVu # m,!"Ma@FpÚBŌ`\erx.H% h Xˆg.Û`\ˢp K=X&a%SvPWwI] ,Qx4d8ПȿNx?`P#vs8,:)G ]O22LE FaI[!ب d} ߀}t Mi"㳁g m|&#+cӡ qf#?φv8><1Eo@|&(&6,hyOÉӞF'=w|M.,{2Oʱ1Xن(uf=Q7<1w3qGwdi(Ch3gg*x>7Is 単G=] 尃L2=tb͢AWqH&skhq];'{HʒcK%K@YVP2*=qZ5ݫ>Nȑf?vzը@QB#Zpk`Q> TAx|zKO6־/ՏގP53$g6Rh, $V]E LlBwZVM V=N:^g|Sћ={Z4䬕nv-zk}fEA7z;?zX۳Sj{VRwgӏݟM;o8xƟo}ի?/}ֳ0+hq܊dYV7v _Ȫ]tt) KN6ʅ\|*;wJ-\o/R+/E+v>[Z5J'_8n^?q ol-0/m2mS~mxo|{Q8Q|d:/lpvҲ붐 Z*1C݀~#~H,ed w jY؎8 CG`8E3LQ*,4v ZB@@2Q@UA"4'm.-H`q>Sύ'{(`Zu@+-!4 ږJl&o]OQZ5cϜ=ִe+ūP+MY6J8HeAlIJ-u,Aku/*{uKD'qR|ĞӖ" H}QMWXCL6-\qNZ/_ҥ:0%y SΡIӯ."h/օ^va[rW6(2urRF[j/֩:S|ʇ쵤H5ɡߔv5ey<#%u 1^*L'AʌmMXC%iB-[v.nԲLzh)jv(i4i$ArNŊQ.U-` k Š]6˕ƞNB}4]# RȤ4 L͚B|[LM4>u#㿚vv;&!|il$z/ogfX}0"7\?2ν@4g*m1pEf%̓1߻7Ӄ!g Ogf$ H5Ĉ7w|`'з:iQ{iQ7;鄙#n7v܁moLv h?Q)?vwj5{oZT}njn ٥Ze~Jfw[}?qk>?[??O2í#TYTҫa֖mJnpJl]|Q)\[ݺrDyzis'kgJ\:3kO;5fi Lڼz*QėiB7͗tFlEiD7t=򷭯?kW>h͓'_C:pe:؉8-SK X8c?Nt#먒མ:@  (\4{ j$[jJKmtE(2޲ʠαz,Б7U&BC#E%W 栕rbE4j !YB\hl MԎrB@uEcQ[DdA2- DuK,)‚.P%x-Z TCmh#!r :ΰXX Cf@ v @,ai;Q B3(CQݠ-]#f0xAm3 0Cn>t ZFx q1Ƹ<QUag`>I9d/ȡvo3@sI~BAUotjnĢ"*86C1TmcsyTN@U!`'h!E0DCuLXT 6YGmKx=IVzq%۱ldf 1< 3YUJRlM%=q۝>$$9ɦg?EvwYlsws?Q ؎H=Jo׹k~U/T3,Aըo2y'5zָz9ެ8O 5; =Wg'?}{=͆S13r`'K_ Uڷ_UWUlItiX76Zw{:edǾg xϔ[PxA:F-͞Rbq76I⊌<` *U޳Y̑ oX4_j@n>RMTjJ$.;7k/??>W>&A[%_euN @ ʞT{Ϥtڒ,b4-c4{Z3h)F@H#߯nV$lb+Ս&E]ڔ'@is^$F٦ D]NyhO&&Ő7b9Եlk~ul4(H>pT#ݞ.w8̕6=zвsh];5ͮ9Pv8'% nL%߾X'oƝ>˾<1{{+LҴ'؞pqX?n^?|e=8wDŽm9eE:6j6Upm7sgwqu*m^}on# _4;oͷqL)JnqSmpնvEng+vz%{Oo??/kooB8vy'ҐŋXaO# ' y_ l}@e ʣĂ(6@B,Qˈp"84&ҍa86  / !ay_±7P6o8YU +V6"BV HbD1++kPje;Z}A Xǡ '::m7aP$+ i uh(f iؙQ"+14aD$`ɠYP`i@pi k> 05h?@ 'v.F6|ˉS,K]μb_MHSʋ1jY0σ e8ba8qfc˵"-в8^0ud92ba5B#@!j?dm1D/P_m2Nd(W<a<<$7EI"#]bt>`Z2FudE-fcUi6unh$I^#;6 ES M.<9, ܯ ۹k_ܾL{_>~Ͼ>>/O?{p|vw31>wgd sՖw9Է\tZ gvuCiVz[tI.m^vs%a=o?mͱ|VpɄ2ǧ;ٸ8jH$;@ISueES (^CQLEC(!蒇y(-?uX߯큢*7ҎPVZ ޳=hTv ZjfhE):Cb)jeBJ{W/\9эkrR*ǹrءWr, ڠ%(fS2FӶ^Kߴ8D*if-5QfKZLtI bj w$6c./6TQf@٣|Ng7VhiԓHOn:,WM6GgJjwIۺyL_ON GH= aP*vR-6\IiɱJgԾ~8oZM_{3ǡ=9Sݯ܋Jjsu:Ohd_=|.:Gk ۢ~F)Q-0zF"]f8T2{sFn_>Wk;-ҵ [ϪխKl]$lt=Bn}cnV/-\ݩ\P=tA{V0!qz9G0w.<B8K(?s&퀿oš69NנvYi$ 6@`FY6 N@ #!n>xPDl3`k}B`Q|sJ +k%pj_={=@[_T@|H ̀mt\(@ @V 1VLm1C!6(CQ }Da1q & "<O(z eMN!B0^yeGn5eY`|<"7$fY 3p5$ s ?21ǗEh <ͧ0r>WP[{X&9 q#O_UG:$<._P-\qDÑhQ F*j!&90 *]"H逇s\R3K W `" |?<*EZH)V8rD27n߳VnOK,i_ْRm%fXrE5k.ϲj ^v\&B-m_<|zxGg}tgu[xz7FaKo98B;Xm0h. uYs/O3C(ʣ|Q1x9p4|8)9-:v]L74 2Xgzik W 5$.eޣ yU/|yӑfijdԫ^SUk[ת敫j$kRUZ(zyy5R>;|܅wNW,6((ۉmW$+ -sUΞ(ҥ¶Rj=6#EzM*P e_ȃsٮ"r!8-ϮYho=~|H&qz#n'\(*0FL9/hU v7Ƿny `r%N߷B#;X 6R(q'7YVҬ:>GNwq雹/HvV#5Q^2 <D fOR,m>qvVz|ݗ-vޑ-uժG/:Bϰ ;[<ũ{Lة;R杀 HJՠ(05S>2^cBL{ ܓHf  {m# -$ C 8A^x~w+Hh (auV/iuK kZ(`o PAZPa#D8RUF\EBhZOs= .(P] žSAE]~B&Nke3@_pRXޥp!N@v{"fx@N  ыhN3y088lMlud6lbjL1q'K6233@Bn1~e >8u͍9#G:_i 9`,GkA-p`,B `[|(1R:Rfa!c%ҚfCI|МنE`+IX`u.RBxj1`xz'x=YuObMhZ,QES 93=42 gUi(ѢM+c;vb=ycBN>Dn(~ŭ[B:ŴкYG:{EnQ,3[vcUMaNL Zl=Xd6Ŷ v;O~r"~~Gȸ[86)%0%K-gq׏!;֍Uv<[OCm MݺټV/_}Ϭ_99Ѝ]GqEIXx}0I@NOZٖLi5ܸ{<qG 3N'HjBVZ7/p+F* N#wӤtʫ}Z/Fֵۗ J&\I }x\XN=˭Pb*6pF޽3>΂yTDR4Z}ѠṕE[vΚ y;qntMv\cK7qG9Go,@'*vлT.T K#JV[5gc#NHU:0aa$ÎC- 2%;@m(|YQ"Rֽb]')UXw+j0=\|y\;E g/e=#լ~^&XOO< _{.ϲ|ZUWbO }dhPk/ӥ/kU+ھJ~̝suj:C]Xu>]݈gGj78 d|0u|~}i8f?YO!{׵N͢uJDZ{I/! xg.Ypz,a7b͕_>wgE>O \,_?Y DZ?w/<-^w4_x~/sSrjx4zq>kɬ3ЧQ6uHdi+wʂrsŷ,{&YQnww޴nuKݸ>XrGojde fs"ofs҅R$ q9{*_{= 1aruS!GJ?'~6ӯ^xu_|s룫F0 Cکρ_ƆnDZ,/2QF`q<8V*c@%H2o#p"!V9 ,e!o>cD8#q {M /EflW1 * `QpבP85UZ OcXWQVk% O=>zJxj zAX}FKXqKՀ^} D`Ki #l?6k%l+4k(F}Qdﶠ=p<袙$6F&61bkk:$5p!| i)"2iY*MĜY*e|0P |+8N24S"W-2 kDd.!v( ݡDD1lV OȰU2qܶ9Ճir"IPkK&=Phh:撙g7\2=׻$Jwi}A_TEOcP |{jt;\0vkZmi/Qʝd > T+Cb;.6\NRPEw[w'&lʹ!Tw:g/~-C峏)afTSrit t$\D̀|8-YǍ4U[d S7$j5,#<=iŪf(K5+]È/|}W}"i8~} A GXwZOSwLx4ꏄe O 49-]*4S9p͟u;/||#ǓP헁 :?LzK_ ݕWg!U)y 7_xH7:^> W):,LD/xl`2d,äӠ߈u3=>lOzӖ6I:UL6æIm_쵶{޾`/_v7Uy{k|ts5v/%%zV>i)Y"L5Chƃ)6Ɂ2qGCԱBXFl֫qaO˔C*?K,@K/+>1GPZlڈ O \ZgkކcGs4jƥF܅>*wMp#gEb$h;t1 U&3&#V%K=ufُ[?h=wmܸ7߹`0 9$!3l7 ^.OW'^Өzrrj7vC[Q4Fx|vڽ|'EjY<7Ba[j H8Q]{+oYwu~b/mj]y[U^((5+ QffGNfɸc͎Hsj^ZkX=}ey< ;V[=j$tg|Vsl"Wšѫ[,w-Ǝ]Ө$tgz(5&:8sZp&Whzŕ]kJ,Fgn_V7^wDZqiPa]]Hv}~h'sWF4|[4Ss b5T $^'~`Pw=zar)Þ)8 Lx,tL*;FР+S K ;}'?λF~22)uI nmNp舗*C[HŧEgî"yg1>01$ʩU~(>= lzBgދy[ZSq˹cYo&?̑痃T'7|.?|8k^C_KO/ZyihO? +߾9b(JW 'ii4 E4iVDruGaᇖ豾b͕, ,1IShQR?xۦksѢWׯ^re~a5}#0W޿lF̴?~]v%qwtяqG-oFўH*~섶ܷ=iO'/GwVU>)y,hD @ׁSt`YҲģlLAˠq螋n>tIt#E!J^ݹ"TCT8B7zC8@*΀p/z[?q^gH@HU%BDC~) ?8 z ˈ% @~G#lFC| x>4%8p<1Ȭ}1- T-NH p,=Pi!KE@AQ( Vz2g 1K7 !SD\@)|~ ;$,7Y ՆY!W#P7t|k1-xՆP݀.ዑc6w􂛾EXePC6 4h6D{}`9Bs8#;ߐbnQbfk9 {&!0^^ V0-X 8%Z% y37UW qWaEj[TO Vy|xMQY|KP(JEGe%kwI &A@rȲ,YypI(T\O_C3XW*y<93i_]y(hޤ"xͱm*SޜN*&hId6kXŧLq3VMN:*xڱE SzD>vQc]ۧKW/6f:84XjJk˴L-}zw/o%>̖|Lm([l32L潞vX:9S`_fk|}dx,]~ݳ?dMqx5_Ǝ+hpn"OL?MÉ|:P51Q6t@Wm/BfnBH5E4v{ksMjM?(>[آ3na~dQ &Nlc6ra%x ΍"0hp'f!V`-t71Q]3`mJ%0r[*6Sy.&-{.dP*%vɵ2Mbm"omg]|Zk,]R۬7,Jg^ͣ]"F|n! =BCD! Ez! R! S! ! A4Htv"D$ X C XXj" =BCDYf ERv" S" " ,,F# =BCD\ E'RR# S\# h# "$ =BCD$ E R.$ S8$ x$WsdI3UBk#Z Z'H*KdWOmr(4Od"k}OHӎt_7իv>͢==}N`GtcD g .|V"FU_Kfs11ݒ'zƗT3'ӯnl&N!m`D3GVHqϗð♩8hޜMpbݷ'|77-f⯢idVL:5BV }ly W.,D>^$=[~(t(n9vea }X%{H52X=Sx32h-ZjadFrlFf,FFx%)~īI jI} ]$VM3[ Zݛ0;X=3tFmxL_ OU-?s^ sH{ ?GvH*'Q<^ꞪW-ۓ@Oۙbo'k7ۅ3'ywj.׾HcG0'`vv@ç+ЊwKw|yq0^_.IG"w>^|6R\sb_oQca3{T;?22)r ӹГ{p!&ߟ&?|& mu$US4?xN 2{Eic1vvV;x+Rx+jv~SJ. Gߟ|dG1!PjFēDU¤sjUM4 P*d/$ Psw'*_i,.HqOV|.r/S3"^?^WΖ|͡ ʵ18~wD~ eW+樧Xzfħb<qtaeOfQgZkfU*7"!i_:Oyt&<'<|χj,6_Q ^K*k͌K%VQL0Jx#3St7$|~P]DTQZ2Cˇ"1(i9Φ]W^iS t#7.tCWr_&j|>_Ki}8.|ɥ[,t G?R ~TX~si^O;ę_lVb.0Dp۽O'ⷳc7۩b ~IzZwwH60C:V^i5~qͧ^q.gA5PJ:͉gΰsDU-ɗh|rEip yWHVԠ#1fnCU\5vМ̩TU )k! ,6/v2󈫉+b=m$`(jj6_hGǾXMՂAZ ypYyBP VC^=e!NI7Ǟha.]9d~9z$GDfĽ[4Ønmt:AwSb77QvUsx#e3I(]ɓݼcn1P.WVϰfr!&Qӟ fޡ3X-5cwN~ld% 2xsb%Ȝ3rnL̗߯c,G >XtISB%64]BcooB}}D xm?߄ZD=e`%rb:U}š2XcYnԘEvW/:3Yq8xp?[S?}^xbrƣ?_ٜԽ_4֗#к-ToC۵[tS:: WX0IĢhhpf+o.;8ZVv%d#LuK_!)paajPD▆y d'7SJz [yE DK6cJL' gx=an2x-c#ϱzڣX%'?8]M=+ЯĕcI%Ynl t`r*7|T:/<轹f'#NFXw<|8uE|XZB;0i~t>uX< ~8hFp|R>_z2 vԜu"blܳjDUw,oA@1R>K4 ]P 4݅)Fj-%hu' hw5Lh4/RT&V^tlKbKo?:ŏC_5cK!8t_H=TJ.T KPP1;wuFbfo˱'CWsg}˹ƛ}W2ɧũD1Ot!bOrs&i2Z{Xq@St:8p/B=nf/"pw.#0#+[m4zfT/4-,\Y)pfC5!H+z#=a*Ž{:k p5l.i*X a{e_4HK6.rn")anpҝldr47=ϭcՔ L[KZIX*bPU<9m'> 2ǚs]4BP,׾kwc鿁SEÅ?#2SdsϤ8:2\ڗLӅϷ.`!^lJDh;T BW[s[1C0vl5) MH4Vi} !j i r2j.kɳ6HO$^Is p? l<>B2-׭~[ڪ}I8%#dܿ)/k .O7U-ڑLZ&Hnljv;;\}0PLͩs{,>,"-?#_o'N?9P߯ErݩrG{Qa^ -[1_.NJC/C? Erow)zBtrkUg i F;PG|g^S d0'LqxFT6b4M(lĞF9rs~\R ZIѝn!2wUN2RXieJjU9[XX OdhrZjNww"*<1gudl~S6_ϧRN#o2WJQ•lyC5f6I+觋HJ>qDQ=VL<#WPđ5L^'Oġ24i.+< 2eR.]`4B-c}-왊4IܰJ+e:*?*Vje-0yIʣ= oH3!w$3M RK&aF |Wa9ֲ$]rn sdBofEw8mx=Om|p$Ɗ_jȟEa!$w::-׳IԻ@g?]Ϳ9 |TPf2r)R2AvL$^D͂JOԂy3}B9e&Xs_քB>fǎjU4pf`4 Fx0x~qˡm}32jD^TEWS/.ZN($~T&KR9pd|.ZID\< 3$VWz3H%I>̚&npTZ?D91x'e:6h{}m+#@u3w>TǾDCއ?^蔈ob73w)|0Ez ~ɍ`l 0Z#ѯU7zyU/{~ Wd@Kv\9U.@9j?] d^AkI_vh2O^MK{H+9ىf mD?, `GCh vk :sáG̛ڏCe 9NP쥐" IȤW8N|cΓ-=~d#nW" k)!1 %ȃW f4TUWWv}IukgF $Gg\"Ry:k?]^mΉWG@ʃcOw aU*8yC_E_i9ZMgH,!Clh$*k-K;h"z{0v% z |-jB":KԳ"QtC7L 3nk.ti~3I}{J6xy Z+Gɧ+[4ڡ@xaJ}7yTp\$W+ |b{kK, [T6&>^|cTGYTF}m:"pRj7 +)^gl1 N Q94hylJH5(DZa-!z4X3o(@ NgP(15K]n#}F2о]sX;kYsgt;%Ẃ͂IyO— v"we>mp:EΏt,^4Zc WˑB 5-|2^/5\YК7s&Kj;ܛC[|-dz*_/X32ޅ#Ld15 ۙHHB%Us Ht U_%n5;9VWGpk!erBd3:qe@I($n@w=ѥ~{8o/vM.,F*ꇜYGƲEȘdd:KbECYYUH\ϠդJG$B*!e,ש|#8>a\q6=x/0 eql~#$}8<,lI&K[2"Ԅ_2խ I2DKzA+nj0?j<<&t.\?;\;1,biLt}"YOC}2WZ^4m53w?d.h%rBgaF&Vh| GcTJcuëzhC-Gt][鉘$p#2X C\W#*dnfIhXKxc~/og a;9eK=Nt[ԙց\ 肭wuONNXa4jdNL}"^taT̘lZb?vuepI XN.kZYcҀ`hx D]1x7gʥnnmZRŢu."(}N@+Fu6XŚ9ٌ -+Х<7ĩ7 @w2AAibFR6ÁH}L+)xA҉]4YH>$N0DMnXiZL.c -jAĺrѡO{g@DlT^)0 T33V2h@zt=0EC|eԱo7if+'MHc`9;?ބ?zu O7&J&:f^ 89ͽ ecUB1 Mv Z!bThM ЇƄl$Aճī k,&@9Hl2^Ni;E>$D+a0*;!bpV.7j;K\al3qEmՉpw@ ?^ڄ*4m//&chkmx㕠7-Pjh$[uPV@*{:{}p }JQVn# Y,0xFvU5oݦ: H֐9N;"9`uO`ź+)Ou 5 b2:K[B"1mCrQ&TIL^x;qI~5$,Hdؓ2IW3Eׇ O"q }Ka2GKL?dmKZ!/VeM2oAi!21!?@bи;\RjW4;x% c =:]rD#iH&/d#r,W܍OP|F ǎDEC+QYܰ%]~lY"O.g'spq}ʑ 8@ %){F?U3ӕk8$9ХMBz LȲꌎїJ$Φn%P9l/XeOjw7ՅD ffF&FwCt%~tCx9>,\QlfK&jsj[& O7?]ۼI:)5 V}>DI)i"{Uet(3#=i|<- ʀ388]*d@M0ZML2fDP|lzQgŃh^8%+2BG* *I(kHIzE;6ђZ۬@ndGɷGj/4x_g&/:/W6n{ԥ=6,t 5j!կF**vܤL|J.ͬA'zƥv3x!Awˑ[%G+Bo-> ʰ<H8/4X%)ҩLZ5KO786" Xo!L %GTK/ÊT ']-'Éf{C~#HZ%QLe VҠҦQׄ 8Uj|2 j` J w]Myn\ΌNsl 4E0/}_Lc^-ǚǽc_/B{z[r@r;60?N`tBK)W_TpQzXw`GMwŚYKA5T2d~P$ZR$^c=/'>Od+%ag !j)_ogށ_e>:=΃xLJi~_ix U1X #h =w^l,3g^ :dQ[7ZEsRpwuS:xz}߾DQp<@2ǏZ=n:[ި@2MHH## PB˩Xx31iD́T2^AR (e;D--҉8UŜ t]y`WY?lc*5Mx]uK#00S~\kʝۋD"o:tT+ +4(|ɲHRӽ⹔&eÓl)ZJcM+Ohbex5=sb։NgӠlV|2lJBn8: iTKRH*hP{srk}>@ MeW⥭h_m^NDBAʬ:]Gh@6tr>4P"=~;K7?q%hAiyJQ%2̠/h3\ A-QљVR ގ[j<[KLL8lu:wsbXlip{ad`%v1f x;r0vّrqPi\6\,b=ǬkVtUo4W2F//sP4AstԌvH~' p$U'V[D#oPI[U-oI*espJl! 3yb.R縄'3PM:V H ̏AͰXV|F4eze٣;%ĉԝ- 㿵4'*ZV9_/ N4#]BLfzݑ޳C ^n" CιQ3:ng+J+>%_q`3 "M y_xF/.(|ofl">Ħo].D ߃yL$A^|K1*G")O6 Zg; C}Ř,M UiE`Izr R瓶'y ؞ves>٢Ĭcj^tsefL_-_F25|DDo|=BIv-hr7d9ԭf6N(>YP]Dǂs)!?«ݿBLLs9HN35i@n0ޥ4%ͅwaϼz}{a;y}9SFBꌅ LwJ ꂊ35դfI$!ՒGQ7jgׯj|&u^Dے^S)&ӧEQ+h sB=C _@aS,X-@v IcIj{@07>g ÛY~.O'u_Y?} %sFL9 Tl(ykK9]IUSKȔ #[oş*=(C֠nt.$R{}- E7gˣ Pc^<+riW>7(MJ .Gw Vz%ҭ2!NLJ%|ק^el7eWLևC [)oKRx ;漟v;W?_GG wLZnCԚOw`[qKD1eEH,v+ Lƥx+N{T"%WYQQ4>VIg2qee FJ#Rp]+푍ڮ1܉wh-q@ݚk!edzd<ڡc=àUMc:/"Ǽ\M^LF=l 0m@:bUQL|Hc8a^[dcN][4 #֩osw"|9\Dq|sADb=^ݕ9hַV;IZ#zw)+XPNn@ZEЭ*vjdjW2kˑRgNH@c1{Z <cmfPٔF3>v+AMĒA!i@ adMo %%쇋 pcsL|x1Ml`͢ ;lȕc یTws?iBgƮ(&_h|N(o>'j#?ǧj{Փʖ,ttE$^X9! IY֓$bfg54Ay$rO;H_=$ۭ]ﶁ6?N.V;X?,L iU191e:cz;,$: /&ͰH'ޛCfs5.7yœ"]e' y&V!tb5}=B.]MXUӬ&0H.*g tkWy>Z0So;%N M[Qlk~szT+/wi Q#[Sz~8^SW?/'ߎLYi.+$'J.ן,ڡ$ O?¦M琶U?J,%je[2,;&jpDŰ?LQm5-]W'ԒD nPxٴH6(YN? ǽ/z/ס1??lS&:x?5ll{̰D5~j \im9@s u5vE0D[ ?߉W9ڐp3nBh=#iR^~5*0^S^6s>VO@y5*0ITHDwG%ڵ}u0tiqҖM͊jf큓%c_Γ Ck=S%tԊ U_lf+1M*]j*өja]TgzM65xo|sXgz<(,(hNvˣ6#TQpj1ޗ^ͽ?95zhǹ+Zj;9f]/.Kտ'Yd5RTWzSc_ɡꗫ̐xaBr-B6;,O24]mz!:~4y6eM ~v9xL^Z^V`zDؑx/4j>/# kgւc>djs1YL md~oH_*=47'u36d 'NEn, nGf<{D(y_%a{T*se[`xk*r(= \? 舟*K[ Lo"T b#.ҢVNYaڧSWWR(y!r6r<41W4jM6dI/%=a 2\3L E?-x \`ZT3gW6vP[c`2 I-{HQ)AӜUVVV#0&;7W*̅qG}<oGl8|2xW6wȲK*FV(0`ѼjfzMg3Efp8թZ$o[eP0']NY%U>-N=*ؗBlրzͬW3GӜ+TPr2qWSg_j~=9p_)?{sq& wP>![E_-[nwڭԮ0lUeG3&!ZD:ܒ5)Ġ -a(p݃d"VOBe1]YQ Rh֖Y͍jIڋ4\]jY[e[.aʱZ(cS+keec|k{= ~{|O*q;ÎadZR%wet-yO0/2NpEnzFz< dxd4zI$tQ̎8<^ OtTL9Kʼ͈rkzmSV%h.e@O|) 90tlzp&mixQK0hR=wm ۻHv~9a:;)*jjK8Or0mDuExEay_]*fp@vqCÑћ{)t6i Ӗ96ӯZ5^vd7fn[GΉٮzaI)݉69<]9lQz7Vs10mZ1:X _.ɧ8 /91̿htZv9QtJ%w_m)Ay녎_6Ǡ0Ph_HsX1k=KQ f<* %#{ &EԳams1D* s?#4؀NF|txђ)$:U[\`H=񉣉&0Cf7&c>nsu2P})([+LEjy*s!G+ay['ԦWsWק>eZ%9͊5O Za}7=]`2b5N:#!/#ެ-^ S;/?5Leuf/Y+%Ϣy%Zq'. /vp}{%%թN'!mRBYi">yffzFD;xDP{mm$eLǟf{oh+'ءR"'aڑБyp*O"t&nIWK7TeGZK. f$([E ] TgK^UcO)o83;$X UuK=&%@37c&^a\%X. Exv16"a9uܿ8Z]/Xx8]NgƘz:cUd/\Ig^N~!N_Jד4Q[W,! =u'?Fp=\=cL#_j>na)贬sYj3Dg`6 vLA:NO1#PC|Fz9:vs,lVzyu [#Cv+}2C UD\9Y~XwrЭAkte:޳7 ӪL὿7zo'3JUjyi{КiL.`jv_gd!&3x1sB"k:`;:ďf00J?3;y2q]amڊH0I :6#aZ{z6y,k aCJ5Hc5'j7m1Z 69n^wp k[ ݑ*9lDaSEaEҋ[_q􇧁zpB;ӆ|B>TvW{Q&Zp(Maj FS, ʕuy"soN _dp/1G%0#ӒŞsٻUUn'kΠ'irʓ UbdxhKBx%S ܍㷹kثOjGV.~Xxq|Vzq+t㩁ggqķX'럟_Nk ņkSv:} TvHa(bs"Ut ^`t@<Q#v=:%xJ\[2"*CY0IPЅQ=(P,!/.IYPX$*X[Pי4{n49DI**Aqw je׵)Jm~ؠDΊAFȗr$Vآ¥̍'!ޥTT9I˅9q/k[Zh@C`D/w&c%OvMtlیAmHgumقL< ]Q>]9~[\+X8?Fm6Ǣ~CLHdd x.hNe;"`pš#ew9C9'Dͅ@D#D&"R徂:"|`°OHi;*@!jj;4>ߏ!rHB\;Xvsޞ[GM1#Xy't\AS#gNfH}~of VH]Ldrd/F2DVVeK4&i҃B+ҬêP%J}PI]##a85΂p sN |Dˠwd%]#ꁯqF7i߉${oBM$O[]% e#@~}Bug*5"_& ܠa+e21)FچOX.XE̅S<. ~ӌr,x-:y_ (LhO#]doKNvy5KA؁Wku8%ZzB 6;_3O4\n_ܻ8qQVjzp[?-Íy]ۓ7{3u-mc4K234z[:+lp6x@ D՞gT-fI`nec"ZÉڐ[jzR3]b%z_ ݂O<Iܰ9U}/9?lEh« TTԷ D1Txɓ>6D-7i5imڊݩIdkDU>Q׹VuariQP|<=+'*o&-ӡĥPB~/ۃ;z@J+!7R&U +RMj;x“Mj#3t%UAUXJQ"+bL! /0/1yӳa;MުPpWėEPHB\8_Uj4_RGaܰ5vP454 ډP% 6R"$kXs`i?9Y{UIc3 VQcҏC ?F5OHNR#?X V27DfCfzJjus Ss閉P.| 9H+ʃz"sMb9m{2Y'Kz~=ɏ7an~񉱠QuzXM"-]$qb`<6M׀t$ t R y=Pl505)-n( !lMXz:VBP }ף6!rF28kQDVDZt\ KF:7M"8:^KuyG#*5sH~ڳ6vUfrE|鉶&=#]{L$(sxse6&cDZR%/Hg*9j oP=uXqW~Y= $Z%F;U=eAG*4HiHU4Ӫk[ [%0G!}`f-iq!Æ|a/pm mr 5*VבJn252;Vknu{ٶ[bi.ⴓU"3W!tXu`Ehb4ОWL߾˶t/ٹ":?˼y^mEE@bF6p__?ymON<-^n|ACav";jć@s*k6&<*Ip<UMd9u]*tܠ5[fg3P6l3r.5w`/:{YuwߑQx?G[@. 2fU׌LL5XtPOfvԀ B:NWkֈeO nU4oX"ܙ/ 'O$~| WhlYY&B5G?Nx4 b>?jyN[tx q0)kcyO˳i$ڧH,Cӯ;JYt17je⁗5s|x.ҩQi\G-[ 2w=L vIZ[:GxW  GRcqsT})߆W9R"Kײΐ9%z|jS fCh$rń\݊(h@VV؏s<'ے &~Qqz5$V=Z \ϝ>=>ΜOqNPѵwsoغ#'Jy\'+c aW'6?(MF8debjx:Z+/IGMńMjI 5 . 3 t!}aАx4w=\cW^8|Al4HjES|,)wiN"ANMqS5Ɨ{++kRٱ@h kw33}>e 5bECІީA ǹ%ijUj9WOlޫXҤ:EqF$o9:lJ|Zp_uèuF/c1S4LN%LB6Ⱦp M۠V@o!&!(~ҌH.ЋYkcUYQ_jo7x o@@̙ϢB5aJL F]xZs* ƛЌwnGWjle/@4}O"SuS5%X* +@֔3ߤ#0D=uP9QFiAn2]PaKkKͯ4TOzCPAKp1Æ+U4bIኄ껐YmWxmjsæVBڦgi9eBLLb,A3{Oۛ P,ңը^$MGJ>66J<[?>xD|LmPMijM|ij_jh2>?QE&yfb44au_Q4fj^ ˛q9AQODǨza_ma%BҸ)[ChF@N~ 4qiAmPMl(x76̉c+>)IUțj,l c_[Gp5x.lv;@[9?#%7D!7]"L1]m ^H4!ۭ dz2۲`ߛbH/ !P,X5h Xa$u<&PXy9j:Mkڔ>cl6_li5jZ2h}c,YmSc \´ʺ`oB!G9ΏY1xѨLpxt+ut^Dm%`&vWX'b#Bj٢ZlIb( w>Eł3q}PI*=,VD o~BS֙*`l""hu'/5O) CDJ\P&'IT|)nVdjj+54 x5ĵ5~2tO~njxOs_y̓k{8"dŌ@粝j.^:٧"?wNjxg~./맠J!ͼȲd3 uyG|oy*j.^xU,ܗi {cy{xgnqT|jv8H-ӮJ ^dһa6RsV ۮ:項^H5d Nw^;>D*PA2O2&Gz8>Ӯ嵁lm 5e:rm?OHj+ޭ4i.}b ƶ^C1?jj8L~Y y `-KkN)f{bfS{9/3xɓDj5[ `Ho<8JUd"φ͜Jh6l9SvrK&ԍ "WUG0w?YbHRJ*8&L&'?~-HKP& YN_v6#xzPՂbw+$^!ߥ [#sgsK`u. Wjle puc[4Ovg{)͍h.G3:<\OP7Ϝ0Ǒt}PFRG֯t!h729pָ"U wsa?L% %b@4gST%S;,ÎH 7ܜ QѮ_k>4G̨Ef\3jXI2.*؇[E"FZ3ݒʳba;;M@@"(o g)M9z5ĀU=30-y"mO/<>V KH17nF]ec5k / B°ҕj>#@qlїD}Ϝ?s8F;ȭټstxZd<6A9aȨB8'Psr>GNU+w2 4j?V<@ ']W!Gl$$7nZIWl=kizS@֙yii i6sNgHuګq4kGP?(Qptx'rє쎛2:4S ?@RAM4ZrAC/؎.tT6 rk_*yN߿Yϯ:1m:o[b zOm2eN0P@˗Ooo]ׯWwWNN"L%%aehrⱆ"6Z3Ep?4v6b'L&$Ǽ%κs 72L5 +PXFvT$ A4.njd,.pṇ3mЛÍ]3c#ڝTK.h,iy>v&hJRǴ?1ӯLMOj2QļHF3vv4QS${I6@秊){qIpTҨGY-QW KDgr&r^V`0[W8AW&6R:u2 $T΁W2(V,iP۰y6hM5yȈB!]ޡLS+3 |l9}cӤaa3+ ]w/HBvKVv{C2<8,b[*6҈H< DNyjo_d/V?$ڟ>.nTO?R0b߻xVssW'L`?aJLP:\R]'mEf}dzW65prkkUC*Ϡ{J0AA6(jztզNs%xAU*7EMy`ꁦsֆPX±FnET!ٳA>zbHrK)dBA&'nC4{Awf"%VDx]TU҅lh%m O19ҿ'h?,$o7٥wc/\nwWgԯJXs8b?H⸙*eK s%ɾ#CBt={f^ ^E;n 햾_ӎ:7&V͐ŭjJOHo2%l[o oGAG;ltO+;3 D hoT~NBXM<;%[fhJ+>&.[TãSbqNS0~VM4M>@r3|U.n˖e  bYL'JFt !LEh:ߕ}+ OZVO CO%__9Zh"[@_;BǍ+xw+ <0vǏ~8PZEFDV F? G=&楚[UnЌWI 0-qC 11 <[[m% N,*vڠAK ZAqT۸0򔲮$9.PsiNAC8e?|湒e}dkZ2$?#ן%Ypjop|-տb_[/ߝ^]~x˸0b+pD5@hش_,MMNXGS[]gƑT:,P2gp&UͶʲ|W"1rIq x˵hC.9k⨱!\-Ryua mvBv #8zVC ǣ6+Yh}@af K4!n%q/dZHf+22}~vxTўfg!S7mk 9؛w<[ C !&V9N+*Mk8`=;C4Jorz*aՔ {x&q3{t(0 vSG'Ѥ}enTI"xN],W-t[t}UP5oVBVG}L]#7+l#l/Jdf2m<1vhhmQˠm9`ws6t#~TK xSΌ3&=1*斶A͇t"QA43w'[gn,M5KR[9_&Hmנo7_lk?pd(0=@t`QE/='8Q+XϢcHs-YxLSF͍":݂wE)X>9JN ~Ԉ-"OO,84E3wjpqz]jԗabϳyzfU`/__|geB|jb\߮tY6Nk7Age-HUF'?1Dd]T{l&3r!4nI!؏2A>/.lEvb"(MeS{?0|9ub>/҄tvSSalоHp{⤇w{Gu 4FkJ)ZM%QQ ޖQ5ָjj0T&5 ר:fԘNQ'Q PՙgC7 4u >v.XcPA<#&:X~h9A_T0!HCRԐ6mTA͠9 .}Qu pG:u&Ě5fcl]&]$NGhdT:%zVJ7Q?? 6ph$cx,ccM@ЗHR EgT3[ h3;=~?~[NNO}~mHO^>^{qqpңrVYRhU-J$nߘGHۣ ع#bfẘ^wǚ K@뱴MQ3K`3ɹt0v3t^STC4Y3e[8)X#L`QsM &,ZVoRtIf(m74 ; :w2 $`nŪ[BD| 7/ tI qI_cEL+VAMJH;Xih>0֩F-7Pu}pEr✈ :W}V) u6u3L${F-OHX-D :7Ћ[]xy#j ]!ѹ<HETh͔(D!,ß=y(H%`J ȃh_b֒6wMgH 8AcFi|d5 ~j~\'Sv<9uaܰ_ Ǭ? F*D 4\Gʳ0*e~q/?mSׯw?z|ۤ~v}ӏյ/n9.Tl@을 ƚ9LȢw2D@sp#b})fWWF Ə."jԑ8: xXU:3/JY+Lڎf/m k^p}/o߈W+*F%ֲEZ:CfQH#:j\y{ZuUzSLt0 ,x\txzu p$ [=Y5_@x[THtJrݒ.G z*TS:L)CWLbzdvnXgK3m&zm[B!^+4Pb" YФ.~ȏ'FI/Vma$pZ3"^&-Fa{T@ t:[> ^@-8"kS[GڗjH04y׋DųEѾ\'//_>_jtu6ފɣϮw^n$ Gyԑ&]S.U+B<G[{du|'nɢS4zj968hUf6} hjb S{méNl=%XՖڽ"' >} ?(UvX:Ē5n} Nc¸=D!,cuM4IO,1O-t_fTˠ9UIZ8xm0j>:&CwTɋ΍mFR,kF B+\ )=IR@=hhho(_㹺8jgf}+^W9RX\g}b`n]/!;j*d-ElU6B[JL1?0YVZqhWn#_<PN&c+jV p +@qW( _3f!W)0˓|+&w:kԒ-kEf 6K3ECd9d &x訧U250̈́',lYxfرGl(nyI~n|q]xn_)* =Mo8CNU!P|)sC]Co5CP0-4;NGO[ q*8'^Mq|(b[(:A^Gܻ@O/JER3?W{g"vbhN/\|l=Of۩B bnM37,k' ^g Ď PJbFcԫM7N 鴙H#nR[UQ5d) ~: MelMX5?[ڊxn}G1ݏ3!.xfXY(dƘz@gTY満&Ob,CD{j]| ZA9 @x&`>\>B?:j޺S*#Qa ]YAlUn5&XZױꖤIwBVEkrSKT",(,>iË *Vu.VTPy{Ag;ߠvD̠Eq}`*E8; e(E.kӎ&=+ǚ:D+Xq]Xnd4)/F*y!E!s~q B`=VOt{qt mF5fY x +4TU~ؐ&Z4K^AA]xһYU{fAQ Q B R҅"tCv&ZV16ɱt|de/)B Eٻaׁjhfp_ܸ^JrSO"-r/?o<__ǥgHRߗOC;oөLNf5`}b P")X3./)B#,h)# CfDXoxlֳ7OtD625rzJ4NL!"l)x߲{:kS>-6O5lhZHSYQ캞zoBTN:RR4.gq,knK;Ӥod-f ̧BaF4TA<X r_U3t]t*Q͛ bcmT T4n.O#I(CLk8,k|2CTV6\/x^ZMk1`׮ٲߚL !^ߴڗ[ N$>wNtZ=Zb$_C O't$j *jXAJ8B:hYy[Wt zԓe`o:͖Cg nKKݒ9~"B6eNkA#ΆmE`[7Y,22ˮNdٿLaoaܪpy@7=T.#n: m%7!/<]YX,շ~-Yyn__oٛ s_:zSt4{#poѩNu gNU_WcU *ud4RkgY3@[%C_`ɓVVPu^O.pth@kY7+鮢g81S%'OS19nK<Z pg$J`"r4]Ejȇ4"Hśs1EҹWI9S.Y׻rWf~~?7mWg,|/×+ēbr;R=s$XzrU]#priL#GQcA4)mTkkT*8֩:)7RG{ p7 7.>ݫoö@dy^(؁ү_''9-ce2<6,:#>$(JQPʸ oЌ,9#{"c/b-+BbLBgD@ũDuL''Z>x=KuYB^>|Ҟ(/4Jj! 5wKO򩯪{9m76l5!ʣl@;06R_3*x~zJy < -rN5z >I4j) plᓓk[Pr!<K$ԟN5/C~pjQ<ױbD%>+I_;@>I9=w;VFІnՋN4:8߈nd#xRV]`0;6ۮo6Ӵ(_q}H]?83a*'t઩MC ^f{r_ZcS%i4m)TU,`hе3%rU:t^ eJa$&WW?bA9BzG>o ؁Xm抲>+AƔrUL* -0iX#\Fm~f0xޱN"GTi8CѯB-dJƏ{J$gh lQP.<ʞ/Ɠ !?cYk|f“Z2)JCIX;UٿЀy_a)>9Kͽ@,8ъGo 4!aq^ջS`grVU)2m6ԚN=,@z9bFZm%O#Q"b)NHvl@ta5nt#f1uq6C<>_k ._I:vD%R0[rg?--)|j}3r^Wrg*gܝ#eNܺH%fR}^}ߺ?^A<&e2VK[ҽ%t+~k{@"Ij+c%4?4?|7zu76v]jԥc'̟ sV+KN\OP.~cvGn<|OK yB7u :Ѿl.4 pY4'^XN)s8Vښʠȭ@QŲxw)Ĉ\[=wCݶ=CS%)b4iЍqi0Kӹ5P)ߟ"o` jwXLxSV 9&;>wŇ..W7ӟ?Uw{˽oeƁjZ-l/cPv iXǩo Lxx4,盳?7FC *1T@3<3O_Gf>EtJNIXXF.5/3*nW(sNV-M 5޲}fHkg/ƌ,S[hhh9X,af4#)_ "b0Cŧ.& $/q^SR_BWfLp [30N5jHkk?Ɏo"fA|N=X?uK9-Cwf4 \򸇴}8FҰ:vnS)Y[|.3Xj7Y6M'?Dg);MyKFs\?GH5z!M W80DM|&*91>b AY {{N!!`5CThBrRcs~Eks:@ysuw5mPvlu;SZшuu rX!3ULrѧa|M֬A%'[[(׏py/OoJt5V.y헗E:Ob:10ݡJ$R-4X4*BtiW!Ze5~:xjnB_.eO~Z;#5]@,|tӸpb#aMf7_/{dH~N +Ck %-:9YMo OS>Pxc-K-JJDrr#YHw s]u:~71X(,odkǶ\oT5KJ8ƍvgw<<V3 q=Hb'x'>"b8 b%e鈖~՟)#cRBfQf7!Dأ"jsTdU}+iJ`|SK[GibkLv)t.m y^vM tRY@ﳥŒihKDZ@9%}ֱE6݊fg2thK}ߗ'o<|7v/JtCmC =yIcNHYIȣs:˔ 7 T4DܲZ*ij${4 =zY3,2z|Yf әNt5!Redvq}v~f w*HГ5$KN\w3B83 [S11v:<\2޴afuKaw0<3B@ a9#'yxW+[x)65TJd%֌Px\^"" BG䵵3RdXs+ lYSO6+w^ޙiq:ѭCͲZ.ƨ<(Ԃ1eM Pgs5agI3O!WA:iZ>jGD D4|`G[K [ 29 mt.2ޮ▊¼+ZxlX jlFB=O@ KFtBV,wMl+Dwm!`H׀+\ЈAe=r;FQ?SAtz#bn=IE'M]=n9]VpWQxU rdZLBt&-3K+@ 0Ti;Ħ^K[KԒ2ӊ&|4žFȯE5᫢petIW`IS'`(]!?)l0cU0ݺ`*o/jG?n44ekU>M>$.Jثo~3dR 7%IϦKyfǫ}~-ohޜf_,&c"M-W^8(Eh>1cqKݤ&=NH < sb2a=O RA:UdbEO$_MM_p.g2rΪ+aBB iTt8٫m7/d&#` ﴺt!UT1QS*anO[@֙bC#d8MfEt 6&fK_U)+ӻݟS&c{3Lޏc^\m~D>CNF {9iRBmy8t數Cp;0붬9ۨfȕeE>Eј*C%jqX! nP뤄I2脶v-o*0:=Ⱦ2*d?HmȅkA72#e )@*{b@:ѩޅSN Bic"yb`d'XӓG.WaF fl% =ǖxN~ܽ-l'Uu;$rKv]U*kd{x\8D}N(-u6ʁ2^sdhgws1?jJ p$Sb̓eyRf5J=p٣پ2vT!ۊ8sXΧ=bbpwcǨY`sbDsCMXI)!g(YI(rv@U)Z>M7hj~x]J>60 X-G* t N~&v mqZ/"-1NEclgޅ}"#¥_YOlIO>G> :A>q0X2Te+SSf[S`HssJv ~C%pT-1/ CNwj ?ᩉԿ[ZW!J`\>e%ޙIOu!@8 /,$B/rj4.z]eYWP=82:tgM'!/ Z iLo6NenEƗ[t6fii_^fkn6XEd! ʰ2?UꟖeYM-^F ߮fI>{e~PT841)…J%x`\P'D؛<]pe] AjEq3&q4ZЀk6ifGaIW`PBf':=@QSץ4j;"$ɞE@lNU5a5y_,,#mPBs K٤ySm#\M!:|]â]D˲5#iZ1e.b& 3x-a\?GX"`XkL9ШQ8M\}7CG>[v3F Fwy1$@Tgy:QD3t%1,@ҩ#ނ 5,߿CHtЃi|(<C`W/E'tX1!GSct# kZhD~&sO:s4@{©q#ch? (Æ8nҏWkt)f_ HM`WqҀ o|Zh*VU.Nx, 1>[)ubiN=ߛ^1|U ܳ̕1]`Y,oTFBNzo@*sG__%((1vgΈ= _{6͋V>4c}u8m̐Fg]vfS8wÚNPGjG/eR4#.H6ս+q 3^we%ǎ$JJv'D!8,OQ6K9 :oԁi @1VI7/SypD>TVUvqa#1_g4aescf#_x.MQ0hC,~XBuo&L=uHS5TwqS}5oKe|qD|2i)fJĶ^,MQҏye9I! )KxIؒjW&͙YӁZ=fp`D F 8+#4<̗e[S6u2 6[ʹj߬y=fdv_ĥ)t҉W27M uiC]g,`Mұ$*K:;3 JΘWEbJ&}|XҨKGe'N X Ianc~B~ οрDžSLFќ:WUE[ O/<4dp^EZs6mm EFX+7XRW{Ӵv_vt]261&+StM\PSV{u^] L̠̆ ݝ0&P!e{' \z봃vشS@yԐ~5^G10ylZt wtF4Y]Jĕ/MS wFR@. ѿ L7y[em]e,rb!/)'uZJga>ܖ 뗩suwU6?.7XkWd[ٝx}(\:5 X0&s8# sɰY;ajjO~DKXw6uH}Ɋա2,wJixzHܵkVǶo!Z:y6IHS\7E0gAPVJFtcq)S6A_uH sWL2Lv*vuHЂNc0xIy+x;IUNeZKca1 ԕqSWA زoF" > ="׷0vi&t%z(#2g67uYI:N6д-_idul"uJ j&öw5r"Gšs[s/)HJC)(BVDsȣz*XHyHq"թW7Djv)x:x"/&H$A-4gn =^QS㘭ηzx9D=d{L5CLMI)e]T}S}\CF!ld f80GْH(w#+ܰ,y[:Z)n Uo~KQ] .x }w/+-r|9*ٖOj *U.hP>L΍9a0rϢ+H;Sl; Yp*BsNQUr#m֑OPY_JV~۞{F껐H'6ȅiY ѹ )L:>ɐdփlJ`I[X_$n#405 #"a/cCjOgNdOlTV&C+3IXȸ4{'Mbi'?,K7~8sG;By(s9g4Du1%a% D];&}҈6,? 7čԷE{rC[Q@%͍Nw1M~N/) 5gN)x$*@Fڼ}k a+MIt{V1pŽ^Da~CMi뗱a':9QVwqQ ٹnvWL!͂LyY 锪LeJ͜zUq!b5 sוk_}[mi2r[Ұe8M\O51)"~@,gݘ#>p%-̈}z<+-ALufU˖8)MA'_XA`xt!Q>jqcA&꥜ʕdmppz-tiޯEFw>ps[  S:1}9R-8, x7Rv^1EWf/s_1$UvmnnPQV^ӁhDS>?IxgzɎm!]z瀄5 XvzwWe[QgԀ!%PTm* >&OS3}N:;}S j}bwoT_ܭ?|EV=U{uV~G*)Շ2cLLyWlF(_0z(_7jͼ8,r^iG1AFГ59^+dQ'„Z1ػM19*֔WGVo$yKU]*礸1=U ^e|+)V LtSMUd{,F^}8n vf߬-צ:cxr}SX,#(ƥQJ%so5b,x['e邀 v޻! 9[:=mI%O&QEse3hg _<:Bt*w:k+39+6"Y_Vbc7ry<˃C#0=@D~I τPwollƉsY؄eO6yJtWvvVBl,I !j xLL_Iv*e7tFqe%\g׊fv(B2s6-Knddm Ӊ01|m@#B\|4SyIy- 2k2M캌ҤDtt~x?3v\]^_I:5dhַ T[uU5S)/47E 2nƫ2n򜝲¸>钞k >,:ͽMHިI87r1Xͽ7 wF/2 mTީك7Y_^o"ldyWn 2~xzmk֕툂~gAffa**BJL{XO#W_Wڌ* yc󺄎c^jDK?s͂&w"U*1l6G]R>b Kԝm fKW~~1 ʃwmeR";_W1R)_Iޤמ\}l#͆qTז=iH J0Ҟ|1+)F! 3}@A|*O}VYzH%Kh=UL 23RkQ*/왞1FqA\pW/82dF9'>cbίp/{'6BV7#Au+siΦ_Uy ?la'JHknMĪA3ºu$"K{,X%CtGYO1G)iD+$Puê%Ebr~Y =u \7 SU_o3)̺QWzL~-Oo.o*ޠP,) 7ߟ'x_y7?&]~-Δ,OjmDQ<ԏֲh^ F{S]@ zh4KLNmMH e i( N 9 cl0vbp![Źe0!vOTBv/CBSO /;x|7>/ُ|Nvy N-=R! {ڌRx~f^ƩjVn''Ar"7"=FϜ@5ӹSfhtpb֨6ɔjKV dSm,-lpդPcہ{ij࿏tZ0.!)2QZi ٛfhF]K|$ٕ,@"pXDl$1Bx$;kAeby sEF(B$AUG%44AէW.`Pu+:;"޹@"Q#QL L۞ +KĘ Z1]&YWXqJСH~̧g+\i"HjAacd E THG=36 S'+:?ws|v)m ~!`ot9*+oƳ\M +󳳤t*qh)Dq%6~h9>ޣkN q3=.Qzgq ;-9y|_e3mNSĕ4&m1tfo0cü qS綉Q:&>]}f4mαas>]L!l(h1=A&eĺf_ێ@Hu[l \N? Ye8\bgHBW`$gVO4-b2W5<?X* _^vU7ﰣU;`͢-*{5*3dxӀ{ A'BTOu$UPpLZtWni{܇@}IX):vPv f@d@eT} :It|[W03] p0v>CzDfDffvm][9\QoLe'0ri\iCk&PXduۖ7m.jη9]pTk@,Z2pJ %UNX"Kw;mp`.m9-tXPn&Hv//m?#Cwf'͞t=)?^v!{.|DmYKi؎Y"ݘGCU|j\?ܭdE9lzEgNJ<xUyEkVbt/StjÑCYg&dJep`SV- #FW7D'b Ppxq]JBr):A$%&/ӏ]%uUiA<-Œ>#ӗɏ׶ѿZH,ˆ q_D>/_6ч^1Ӂ_z p +Vϖ_1mC N(Bna̧v1j2I0{Cu5D`JCg)b;2wJa.;逧o}I̷*YOU5i:!09)0_AOp(N.~أ|[yxHyh=o/旅x}?6stO_9 /R_fSclc7T_յǎjxth3&\m>LNU&(Z#ShPW3s"TYx Qiyuo @XLƂ̐cK;2%02nzG\/2})AU2uQ[u.TeO7õ[q&Uj2+‡IOvIl-*F!0}C5zAv DɭiLuGӷYO=r`z;  P|@P ]0L8`X ^vvʶI . $z,#ETCb!o41Ga*KO'b+bގ[ln}9#fn~c&ܷ𯿚W/z)2Y-EX(\0z3ǛgWר%A(Vz9Ou~;:!Y_m6`) &MXCJ«N%,#*8H]px!ImUB)G@3o >my, x(@űDW}w|jxe`F8t@Ė͠@4.$+@#CF@bvQG+zRbs\Fk۹gn؄EC UDjzhäC 3rKh3u(h-/Nh̷Dѽ SVς7{j7ϛ^t윱7Eoj>U_|?:@ivEd4OtW˺DnY]7.y͘wKwWN^tG1eZ {|X⏅ZĻ9`J TV9 N״D~:AGt=GVuP LVk i.<5^2Xs!\oEj$B@NP[J7,Ui5w˶ۥk̹z|h7{i^f zz;눂5U|Uvjydh 0#HKjP, "Z|d$ e>ۆP/sOPwS >9H逫q`ҏ}_ X2h;su|΂]RRUmto:J@D)h[9b:w}E*FU@DF,Pab-z 6kf ޑHH|WyaeٙȢx>B́?:_4LыA2LAIpޖ8g @dj,g/TKWoM[Ss6\DžūCW#Y!\XW:LXv@s2*].o]O sgu%EZ #"a[jfuzk,)))~~v&UM&\ k` P2TrG|mKAIܔ(Tm@my!y?]Iڒ)la&(gԨn^r|- ,,.(duunnV$͢،?>/?^z9L<3R4'~:18ڮ,NKe'Fmx XƃK?~uǻ 4ez <8 Z]&h#V8OzAvg/^iXe0=nKsfC_ʍ&3Xf~T[l&G QlY'yxe}>=fi60|g~Ɩfg^ݴ9{Hz6iyM9vyfs$kI"3\ Dڢ(J,|>"+4uVЯv1s+}OI祧˔c@m% ]i{*`C( U;?tȰ#{Bi}\ ^ ##Pu:4Dg.LOQ)B=7\I d# Cmd,qB8ǬN3SfdKO3TѦhk.">#&՗eRoH@#S E}YzȌ-fw8~5 7=i`CT\aEv^(LHlui5Ф]=0d|\A-?^ys'WGv-JuBCcwLH&7 *v p{R!3N(O$&5.x 8Ө XUcb'<UUHОaJgD}ZvŖ˗TՔ}}l5-7!teEW zќ!ަv!qsU oj/.ǫy6i]o73N"_ &b`2C1$.699-,G371R9CʀӺA!"_D*(:Ly3&?7. s>4C=;ߞ8#T+'b1TR!&aF]PʧW+6]2Ӕqf-k64T]x%JCSPTA$ M wdF 蓶%P4i| d~ۏzuZڌXSǠhz%ƖNxcǡ讓!w(k; 5|Q{ DRٗ[8{ַ~ '=R+8ak[`D,U(Uڮ.0gQJMmHUkTuPڰLZbBw>擭ǚ'Q`=B*xJ\FIGƆ'uƌyڑv7,WB $P}e H{Q)O3_O@bףik!E@eo#ٞ*UF) 1+pX6a3S)yat%S;2|ʷj&vOng"vyG:U/ѷ|I=ɺLw^؍̈MYS09 hRݔP*CsK3m3%ƻ Hʗ,W+Gw-ƐH1DZZUxҷ8Y=,oہ*h \ChюzP@kn/rM}СBE t5|Ū ߶\UGۮවma|fuECyˢVP(BXȝѓ3]iW%EבDї@aN-֡u9kr҂#+>3VdXpJr(`5gHEy>B%8wwoh1WE}:ntN3ZFOX7`:iZ[w׮"k/v2T?QoOws(뜫@V0ow3K}n)bM{Jsj)0E0nSj f wOtFsR_rft}SZ+)= tZD*Q!5Ȧtl=UjBLJczSP[k2s@1,.?~)q? Y."YWFm)/[ %#=u\t0q1t4qώOIsL\'x8dS;ŢsN=Dz6[,C/<"Q:Ӑtz^*?C :'R¹D<kC6ӑq V]zz $hL&xx+1cS+dqcWšklWﱣu~CVc>opLq#lrSTj\P㱲(n'-c_Ő$ 5|p' ASO`TG4tic/9QNb*J_jx%Gz%_],o[O}ađL]m qAO߀B<˰lA_gw}Ş"a;jQ쐷M4 #>P}hQcpezW b\d~$e6g93YaNmOq Wi5y(Lm-<q ֡֌KvȒisĖZ5 h9 k2Q=i'ԘFn\a%@ۓֶfai{ApY%$rmbc_!'f~j&ɀFv:om}6",~]0/!rAc=c^ZC>́GvZe[!rd~ԕ-|_'6f(C\wKvTwы⩣$.xz2 N, `%!l465boE| U3,Dk=Sz4u =vT&[5% ,121O4EGA.xjiZuLX]u,FBNbG19>ܿa) H)19 K|E'/cZ"YKxq5,CqW0:tEn NRԓy "r]%-P ste,ߗB-;]O63d@>dzZ,M3t"Oe}+4\3DQHTlm!x)U `FR^^+Un'ٓz֋A`E^3{a=O}A3mj 5:2`B[U;dN?$]P˶*0_A bϟ;]$f~7o2ܷqҢOa:do&#\yrb%v>#V/c˚z h J{p8M=O&<I"EG]:Ȝ6C|o`G`L[>6õ{C|+7(Y0B  zwI5=m<:E<@O֫ `imA܏<%.C7EI1Cu[gx".sppyn9L@qV`z]`+>=1k t$I؉g>R'#%/ȧ X$ہ#m5Z.|#̹,s*8֠I/+4%O@x]ӖEo&ݍzljΙFOi9c~*F 0Eʪ%vȡo4v)֒\F%s^4F}ȼqcҬ |PޞMշ7fx0igA>u2ͫ4ZJf/϶,(q:R3$7Į:xTR#G܇an[f^>Rs^l%px>%:@S1?X T#9S.)yb=෶20h\ KmD:VCo7[=yS]Yȉz9LN+U]ygڙWᲿl[=jVjw|AӦe-cPgyEjؗ+ƀ|MV< 5Z Wi0]>hڻњOc3W4Mp^7m­>v=l}&luٞ6xDã|K9YOy޴"eHvq|[qf;)˖X"T ]~WǸq#ԨQ G&T 'f5Ur5AjeVfZ,֍w,VB |cBHdjB;W1g@y,m^ǖB\q8|@]]v?C.ϓ7#A;|=ዶ |޿0L0aFTse`hjۦՠ>5";j;=<+g . >nk,}GJWO ֩ҦϮ xmdis60=ES&YvddVl<``J--he)4 H:v8Coj4%I_oE;AXY&nP 2ѱ ZYL%S{*x@$'}÷nLжHDHmF()҉2l8[E* U5pmM^$0TʂF<\c]2$$>}+ZN@6+b3e Lcs(LDS `,{ M,tNݲD h0,B0@Z@޴AF÷-Eg>i,ˎO3fVF]ߒt.Kh=i|m0{Ve`v&vj7AT-eY$(W z ?UO]Wn{OHǜBs4anh.P,p ]jkS)ufX++_I܉h)au7B]ɐMEz.vIay͈ DuTaiǙGƏV44G{VC5ȑx"^q՝S% ;wځIt,k<2&yV2y=N<'G(zE%jk8~$dxs`H{.g}4,S>D'@pWZ9dR\HB\f 9@rkC*ȅ˖0搫q4r AKC/]SyS"j4$]hۼB< NAx+S4ToAJxbl<}*{0N.3q4p%Ba *LnMod"⦃a+[K{GOGTu"9rz>OֳN px.sΧY/Sa9ԁ7wbUHU\62 $< 8uۤQf&~*"\ﶣ4RN8믙!NXK/GTMWT b{KP ptL@q5@tv3٠EiG Es[Q'ؼ޴~L-pBme0  ͨ\GAJ|90(If0T 4^tY5^cY7Q-cM_LDh9 ]8Tuޖ$ : Z$n$T K]eXL@} 5" 0^5x0c+'s/DOi:1v}w'Qplɢa3>sQ$K]-jQеۉi*n8 eӨ%x0-P'G2˫|eylmD!+Hz%I,x?ѲtPZ:#3RgVe鮮$@`Ah{AxG-ϛ7iiYQ}[ HN ԧѷp_W6k(Yt hm ѷ'35mTR@G!OO[d%`6D8K,t/'ٍHe v (JKBWt%o8. msn7"MT7/@,UGNw'A~cy"⴨n׿M8])Uyρ. CǢIhCaK)B6 LU:~dW)x95;|I peCUa,5MbXJj̘G51Uy`^HqMKI'`56[r;ާ|3rj 54F.U 4A3u.c(;MᦢA1u ",įgcع+05 O:8=" E ۬ M =WѭkYelG% p!q>=n$Cj. !6( \*N $tI\>'mUujvG { \_џ _~I,yvi:l_+s3s:b2P&OOA;$hjjI-.3h_&A5O]K܌yK-C,/4HjpSϋ/P,n($f v8?:nB^eԇuoԈadyww%{3"^\$P2/p&~EikCS6кk l;ǁl/{m{^ y=HþhJqm5|[{ѲG*[-4һ9 #zF{"'vWdUVe c;<9s|=`7A+?SF*EK `Jt[r*bavO OLI< >J2f4jD&WA^,a 3oY,=WV[_dfxDw OQGbU& T튉iYXs)x2ʷ*[rK8~R_ͽo<دe-P9/*-ػAXO e6hF&+1TN\1WEhf?\G+= g{z{bXcj{dИLĚ5U +fIOTOR9ҝK=~`Oʾ3O-@yXc[ vZ>9*];d ѵTpH肗(c2zC^;s0B+47t#i ObOE`2<U 3\~: l$6YXXD )H2`.) !K٫L|T3TQ=Lܺzrғ}`W$<өftm5i  $ Yf|+AѪR'YylOá|5ڡL"F#Hā l5DP7]Vض~?Mnܜ '.|kxh<,=:Э?gޟ>k?lM 0}n; n"\fAr75\;0m`ЋЩ\OD%uhR Uܠj>{DG}>\i"Z B5Ԟo  /yz3L|{ bٮ`̘7 WtU4j둫e[JaxroG7fQ38z"~͕ShkhU*\P.ǚ[ k^M!&ž/s*FucQI)hGcBAQ*#4V^&У <(݌%3!TttppapþO2.C\,G? UgINHwPM6[<4 OK穚:ÿ_[Jlx^o?WO=\pbHŏM@E4K%ƺ7˻Pۙ\͈ތb#"ꐠK"M ᗎ-YۡhlqSьȃޑLTp~}:4V~;[]Ev?,:NM (qˋnbWc@M߭Ne's?\nj/xx:l~w0Oox|φcgyyGX`Ȋ7'_Tv69LlU . 9xI3cNjvf 2tDO^bmʾwHKN>? r;Adpښ1^(Y+(_'(HnƾLthrOFfX }myq߳yW2/6q2^D3wi?+̩)JJJ=5%c3~.k߾E(aP*2p!m& >w׎4(6W}+]4" U'Qz5G ?5X .Oa'p#AxX*{,pPCm m$C BX0!+z V?D Njnmo԰N#8v)͠MG PUvc. fchsx<Hy+;v^uB=>\цfb&[nec3a/[ӻf9cK*QxwI1Izielit/i}e㞖VFW~+H 4@"T&ՙ!S)\īNZA#MTvH6j jvle: ]Īн*y ȨIN+ȱrt,ѐ(tj'cPv@\GlOZCrS׫Lv<_%~ O,ec>,;h{iߝD8Ćɟ%!ݖߦ[^/܏\Qoì'] |M G0k׃POnal ΔpDa8OyfȽny/ǎ`sm )vl{K]&.ptw$2T`zL0 &1rasv(1 ÃFnbԼܩM=bT yA5>4 ʧ<,!zL "TXag/{qϋ!E*53)Rl"9> WvSq:{,4܌AV'ȫ!pnO/e$Tafp? OE*Ȳ.iݠ|| CUκG;9lb^)C*@HZ'.dqz [\S8#<'-=oY=M]Dd%wL" 5r%L F܅!=99.XJݦ)pjLJЛ͟wt̞O#憯6ϯ .[lƽD] ^{Iu8`:+s]W3/a_-2۷WU^+6j+s+߬"łvHӔD" S *v' ƞsbB |AC/v ~~::'91af"~ GMb"kwD;.wh vj6̆_?ҁÉHm?Q}ِS2IC֖Udgz4iĸځ66p5I|P8i0HIRsAFlQOQUڠ1/IJ]7(P?EπǎۊCX4abSad܃UX磙n/%R$fg5NRs?n鮈=Ά|}6Hzդ \wS?\F<;AN '#Ίkcp$;n xގl\H-\vƼ̧,)N%Wǖ)3Μx@;mnR_mF~9podtFjZn[߽$3/ӟ|Ѧo:jgͿv ! #jݘds'=P3E(3\&$ 35&4ץ9Cպ>O|ɕfrl.%Fm8,暋(Y"zX{r`UpH:mpfAm.q9x]x֝hZx:#zb+/X,ߪyl*swS?2TtD^oƱ/ y1%]n6 (vYeYeǒrߴmomwI:W)ĵG`mPt s\B*O7*U/2}y14raJgOv͕#h{m/O歰2[M8XfOOyJ04-I?f?Df\u}^ 3-B%Pa,m8X=q4Bh\p͊ .`ҚTDA%mF!q~X|f{eQ(6d8*NA6ξKg@"^\U$$;IW#qzh*#]ĴNTCG/ϰ6/+M_ xd)%rnY<ĕ n|b}и{Z\64hIx3)|i- ]bhl괌[4/Mӱ1EGqhlӶZNf/+HٷPsQlg̛EsĴEIඓo" UG<4mUM#j8w˕HhЪ |nY.б,Q-!V8n9z1|5NFV-'"v;^*vDSamAh> ]k4oL^3PI|H w'&6b݇ޯClv2U7hQ~HF;7d }3mTcnfB>,> IWSuHUy16Qі3ÇY+(68Sm=0mbIKЋ\ux};͉/`#Fxc‘߭]DQ Ԍ$BsFVq`U Z%P!uwu";EO{LOr2My"n 6UdqУTxn-mލxrƭžeA4ogg ѯ+Ȝ s}^׮-D'vr8Iryػmy({ !WvJm_/s#:RW"퉀\}_Aau(M-dh6 E :!T01v:Msˀ|"WjnLtٙ231f02&\˭rbE0el,ko ϮR,iZJDPə27 mQ"c^hQ~ 1⃫ _A? #ũ]m?h6?-V&/s/{"R-Nf9i&ljΜrkM [ЛoNnq7OtF"^ \efh筄5HKPW=O6ϗ%R!6y5fL^v.e5vD1E'ADYRp@CY#~4Fn?⛡ fVH] s7oҩ^lX$[aL!fZ1 b EvwXEP|f\[^LuY_+\Z&bDn|&뿖^K与"^b3($4^`, ʗIL !GT]:%js$9mYzT2(KƱcC`ũ,ոIh -?ݰAT?߂&"m T:1H.8@DK:BBMZF.bV B;@DƔM|n[%Gl2q<0F/<7 G0O7-@( J;=kVFnt$1BI$$u}l׍5}3qjVy }}Ԯi>fxlWjnH(,DL$EZO]-Rmr^.^L/c߁WB^? 3yd hwE^hajDb;6ӋP9Cpr橪N”O g@S&tʽZv|iF]Õm G.WKysx?+'a[,L*mr'[tٝ?vW]ٯfشˬ߶=]5H5)[{./)Q*v'ay; +}j`j/0a0\H2ECq恳¯;療QDP ;͘s| {s8%tdI(}WA/r͖tt[$ /;*]Aq{ yn7b!gN?]{eżrV$EՆ͛~lF+!읥3<(W3b]UvU+X.sIrhLyK ?]8Me'8BvvZd,3=$/-NgNcס~v?,qI7+&6hяT {Jmu[ypt=Л̫0^ô!ShC-D?lNlzYs޿dfH캡h sR;OV[dz%N󖗓7Lw]nJdmlm??,'睧Z̮%> 's_7c2wjH1>.~xDm+)v]*\rrX:s}щDFрW-V)S}I\JÚ/<J3L㩧`j3 | `g ؕL'3ˮcxWvKaW+&Ǹ}<X"r1G` b~\8b*A5{י Tdwzd]v?TpBx/~Wh܍A8xZUa3oO ]{L+O6wK金kej[UP|/ 瑋e02}3,&ofp=]v tm9gIISWJ?Df.̀ nF<.;uo#n$#81[[G\zA pOa׉DVsK_~:WJ~Zyl"_țQL-*.>AN6kk!eimkFG^[͊>rÔR PNd9!Uy,ȔhkC)Ÿ@#M{PTP):\ݓj /B-5l8ޗ>S/_NQT." k b\*6u1呦/sDy>2V 5wC:CK`EbGϟ 7kዂxpQD+{sV-+?LInc+ <35wI* Q~Q}EAr8Oy,64P8{ڬl3d450&E!&ْ^\#8U:/֥V(6lwQM:lb 2&ͽk-1/lV'Nz5IB)'`?Vtc#a6L ð&q^MAV8t D8W}l R1>5H1O :T1N>`Ch8[[ǀ<tTAO5[a=erq85PD뒶;EQ=f]og)pX%tPse&T)3r6;5 ^#8q9 O\Wa C= OЪ,h}1 ne|v]11C}!@4ߒ/_3g m3ޣ8j`rGAܯbOtmN=_qIj8(мlFǮ3,K>2= V\++AHT9kM.} M*D3X$F.SBs731x{XMm /Py {ʍ: xq?́+to/쎛37k&+M˕d(T35*mPVY9'n݁ZPt}26vA4\[պxG_nAt%;mGpv6$9Nvu\>u>2 ZR7<Z  ^ s6@CC"PeQZmnp|6/#A]E:GĻP蛑-ޏVD ϩE&Gc&Nxhw pʿu}۫bC:!B:zUz /oaD<[ S ~T|41UվuLjGzF&8\׉Xmج++m08?KgGSɳ.`d_*6CRj֚isbcz4NLo[\\CV>j)r 4T% mZG^ށ|\Om#eLg۴|.ƮKV!x/'_/@?:Yy_G(cC9x;J,zӁnBB '6uPϡ #G*7n.ɭ"V <+lWTI~M7E£g*~m+m'. j9~i_Gg6za<83cIbb")")ZeKь3䒤CyriǏ5NGqzBs/QJ &I[iH@WF0Vh=QTIPHtX%l`d9UΓfj_`D+:U䪹 UNtP^>xTC g\A)ϓDTDIQi^\ܠIa NePt?+FFsTl^@NKwەpmd*7Kk_%049x7U~*[:d`s_ҪT5?^6+|_c+KxI~S?3׿ѯY&Ic}ՠic,ZMAWqهX:(FeZ}$y@&\0Y`y.o#U$H@w9}|Z8v86x{IȺrH 8w=Bl g'zHڳYH+MO;͔HpȦ݌nE|? _Ek};k4(ƞ/n?FPͅ#hg֨§XAnACN[(9:a+qPU#y4WCd4rqr p8JW ~a >.O/l k\f ^CmRiLEKlf$)p#'VNu73H#'n*rBeW7Rym~7wDٲw܎gmrt@CE;ԛn5J@yӾvŊo4$D\SлIAw3:WMɩEZ.dr -}ySL{ F:lUWErꛬR~jWc+DˢFrہJ.eBM#2qM߁?4AHEjKPĊN,-W!n*yz~>\52ee?xGodٺ%&H֭dDФ7tIo {ޟM{&L+_u_ ^Kh@$H B o4D'Ar NvofyL|Ӯ_j_uJB-pqLɇ3ZbWg1xmVL%L|z@2$gg#H_v~@VH&>"/s#0KgYf~H<<ry{ Z0f1Mz 0F@|XEp|w*Vɯ׭Sd?lA<8(o۩$?D~yV@q? Gt2.LcCID_ t|ЛgxbFTf } -2 '!vafa|Gt-F,=7§zRYvqEÑR,2Tz'(@aD /S*w_exd+Yh԰wFA|:IlY?mޤ/[@̃\8r|3e3@g#Lua6@D:-xvnМ s78 fZzAj7;7 ?#ha_yY0 gEefz^!< XA|czWNLpVg%T*| d.ͽ+^6u2/ݖ aQr iΛaprxC)\IW㷀JgWE~> r]Ӥ΋H2nѓB5.C~SsCDffP [(0'B cT_fvHcnDJvY#h)2 -V'K$ LhXkxf~x-pvnTLZƂO0`F>lJ2G]W`qLej~|i|TXW6yO7]ʞ}YN9t*][ըS*j}=3-S?jsY.g户MtmA`Z_yD,͌P9`>P۳CPOپ8&ƅPɇ,|wXWgT`\%@7j*=P`fU-, R/&;Ǎ: _Rk/B#RʣaT4!c'/%Vo&3ۺD RPH-v;МtSYnw׿p,gI/_2?{=~ KvS:p*Yck`T.9C˔\4 Kk4 y(M>wЛyF2M-WgUnZB';,ua> -N>#@uEozfZzlznX?B6}~H(7u۽&3ڛ!o.ohX Pa&Xfxhp*raLs`W{ZH*kPXbY5 .O)!x}VtȎePc hi:>JO>f$,kYP03RXrAP /E k 73efUfa!'sCpev~BOxM($XK UKgtO$wv}h5X,*©hO7@tTxU9G.2B‡y-`]lQERMUc%lO8 dUp#b=3En,Ͽǰ|eG(9Y >C1#ƳtU u`}AdWT-zM,h$1ca6AGaL$yE_Q7f `#3&bsAk.]ngޔZw\Y4Z3h$"]Dz~o桦6}8K(ᐶǡ iX 7EdSJ0Z tqBjM%gLv5;ƦKa /kD#D_fn]|I+0xgٹ!}y6>gGn],CڬL/ 6/0kl9:7TAl%6]f;SQ*5"=WbuK&{@ [_$FeEyp#2{Pi or tZd)۶yok99@^7y`Ah  m]p!slv4jz)dLnWQdqfn{0ǐ9,虗g$hMnDžxΥC32?V^_,00<z38?G艮gElcgz^[0?[oHz>!0yBn+k[ໝVF?4m«z[?H(tfKQ$IS5Q]G}Hs4MA$eWcbXX&Vקqd 4N?=xbƦI`f9CVg%l85?% 3π`}j'IEgqz ^Sˆ +S8 D60\(5ʬ3`@}ړ) 2Fhy{=~ UKl*%ՒI|<<ÅiԱ^ӻU"[:y!CLgpr(@2"d H“3b-2,>l gƩgٕqr): Hjgi(JˡUמB.u<1 .MHD&3 ,V1hqLG3:: /3˃'2C^c OX 8Y.ytO$<|%X+r}?B@>9}XSq6K)$ ʓsu+Tvq]UĻ@L)G߭zu#Ѻ.vؖ-! NTU+$7I|H3󘐅WV鍱P^?  `aTfu5E$_#S##`qRJn?jmf0?>]&{lot{̩>2\f|.(0d2_ ߞuvEz1?NVx3ۆ/@Y81%:I>\7_?V+O$ \'2#TQzb |cBSٙ!i?=?Lgf+s\3JQ])lqeqxyۜ85(ja1X{ɾ狀/9e5訮R&t1rݬtXHu4>{a}XgL-ٺf >r2Yh \&AK%*)V@Lr16y.Nώ<Wx =3"t`Dک!x_f}HO2*ͩZ|<ڋO}Tby4q$*!0_|Jo{Lzyiׁ$KWv=Vz?5 N@vlSr-gܩ-wŒSy*||{hEnߤgW ÁMYI-X48lj='酧lrcq4gkk1}y2yq}އ-ύ-vQxfMNM\!jm_ ZI^!o5B\o霌].bia`S3>s*Mshn4R?;O-!?Rmp`~2DJُɥmm`lU` 5B2,|eivəJc32€ f2R&@G&dsdjc3 4NlvefF^vѻɹ~=$=XXPp|p@&|{=~ 9&B [tỽJaK~Qm` )XewuWwͦ#UsN%rw[7\A0}S-Mw'd<[2"'.el4 Y!mդn,#tz*9X\wV>2CdAā zf?!VE!BH15(ZS#>'1N>~{=~ p).Ԥuިw77J+v)Wxo[6KP<5>^k]R!ǒ@?XRihC1e;׉Wtş/-B.[ BowTZ"w [.Rsis&!$$ $*GNQb"qTV;z)g*Lƒ{ <;O |22{=~ x-r{K}2a?Z~*%QnwO]`dfCY_3hm5ʂ>xzʩLG 2q۶2ݹkz|W?H sG cБJomц>tD"*c'U*.GəY͒N}sb6ܥ :2i)UI:~괈S]7r#QHJƒc= f-ze6ཪ|.*Eo v(JVuMnͬ)c?E$jϛ-닐J(ݶ ٳUK$Ⱔ:tj$>W C9n"x8(xzNz]-*9+f XQGH'" j$zEķeЃ}(>)M(ӟT$9O~oJqRܯQ]AS\sz;se?]ͩÉqB }<9C|'2tHT|S}mp!w6gAgUґY"w?(9#Ϣ&DwͲUںcDw0JC#": 1ؕH~狀:7e[mzECM[.gkU=#nzNS3|-84dC O ʑBé\nŗ#MUbb7 "z;[] y˜uZM;p8={:ÅyMѷlfkt&XZLD!(H*|:dAP-iE<#<J%R@VToG"W8=^z˧}ȹ懣@q_XaZBTlѤ.rri]9x2w-[ ;,&sJѰ2r*ߛT"lSyAz T8ݾ(q+KH 㔻*In&kw;6ov- \rc9:b[` j-I`mcoj7%aFed9QI僯(\y&^>sl^2Rvksd1}1$KʹkV l@9F^x!6rhjpf >zwXwRpΕ-+E(䙪YLnlɾ(:a'3@qg@Y*)EɪySThtq{Й4` rٴBpi[VJ{ʎ`Wv=o+|->1z{z\ |pӎB̉.fKUzבql1x,t AweKP}Ò]b&y4oKy01uP AۛMV[zY+'[R@Z\?9$to.UOmY䖟URdRrFjIKdiuÜ.CG_JTd=@Dc؋XoKC*/%ұYlY,Syf_VE[rEH*[t[V)YLt#Fl|Z?򉹁HėXհ{󅠔o+7RS^9fۖn NA$.+$9.VxdYMJ~SjevctK){Š|էJSoɜTF%}HnbOETs ^nh/\۵y]E%4HHS*W$)ˤFUp@H^>=N3OGhd˕E}&2ڑ/@+ߝb gURht^.*%oEJ;#9p i9oyt&ٙ?]뼎gLnFyLI:,Gp^7ԎA X"n n(K 6g6宯I`-Oc9ڜ,*.W4|&jfWLTDBA])&_> oao s}Pg|wߓ{(涙J>kJulC@$[)4 h@Jjw=笪R6|(&W)ԗ ⫤͈0'~xd &tQp$;{XcaoR3I\ev e)Z!)U͒e '5NAL Bc9-8[r+d X~h&zE O9=T>ѼKbABVi5%~ pHWxߍ+49 Ȇ|lj+MmSyF#W#EM]T)<ՖTF%+k ]^q-PV)GEUk-U|)*%Vy JԔ*gSJr\fQoT!_J82*Xv X#97g$$ lF8~am3'maJ5㑣p`%AD+pU1EiTL\0*%wcRCTKfq<ںOwF`;FNB=|P/qUv{:ݶFO8 O6>%}I6_vUQg! O?Ddy_āOru~h 7+Eu@˓*3)#8WIjbM*L%@%mRi30ᫎEEvm=,i vxL޶lao9MΦ.WM3adZ iI3* !Ѵj$Ԓn &B9jzg-n9v`l]ϵrnߞ"|:r]vB}t[/e]'TA%mU#ǃ65-QU衧wWèArC>u$Kr;nYyNmɺ4g/P%p ĮwJ267y'Ǟ4HL㸡NϲWǛgc9F U=3-@iXC7VcOoRA3Wv*ɜCz9|k7[FmYQ,웖kZwM5}]$;ndemKn ^}̤K#Į:-rE޶-VDn["oo@7߿eyշEřbtX4:֒ ^0Zt1hoP^> |rG@ 7AaXoo ]""\EԲ,‰yauRNjP^[*#W[y*obtx\YN)P["'?鬑g2\Ji]iԷ<}hS _1]?'b,ow*vTHܴ<C'Nvte}GFHT6|A(EO=Ax5VdʸFb,E2ވOዓO#joX_ަCw/D:)8atV']vڑ 魭4o.<]Ft#.%)l2#Z l[WI|㮌ɷ @DX^q;+MU uA㪬I.d5gzr.t>KS MT6g"Ւw$㉰ 0rVhvmFyۯ 0H+Dj#!b&M'==5i_,pX4X$ߍ{f[XYxuҖЍX6)!7ZOWn5=~ ۵+K ou?W>~`̇}3Йa=S0C4ݦBYf Ԑvp烙=`ma.p[SP<*s0Ew @*EF&,( 4t-ooR7]]edG2GL>ɇ>;> < ,4-$ze@9eJ+`e32USmO0fTMxD5/Jbo*ƭB@1M4Y.[K ިL}1&jϏa6e W8a4t #2mx3ctxǶhA;yϕUQ6+hvӰX-}eZiri(c(\T fݩm/Ee /"؊f /+[ǝWEnB7ÈkBf؄N9`9}nBYDc2}LaýrVniñ'Gzr.]"vX"9{=~ 4k?iǷۂ,Qf?lJzy% 93qяR^T _Io2NǞӽs.Uքޓ(fuս+Qtř^ɖEΉķ Vm y~y})4$'^f_-\%: c%snPkVhᏢ==`'O:Mhb=J.\:X b5[:p9k?nT,ǝ%Foʔ]5Uo}=QPe'/jAuN*Lf"qZbcdp[|9QPO9CLt\ad a-(UxUQ;ZyW%3뢥SHLdt!o+oS5b9zz$ xhzp Pyx'{OJ.=oX_o!=.k_ɵ7Ô:_4d))ʱƒ4i32P4hiz*nrZӑ+dd, M5nv |*c\ZI9, )XY)e٢U{g_jO4ȓx/ ~f x5g<=7T;̿s OuB' "`j:EВHJ)UEGڡ-QQw$kd;)z9j;iMltJH,{KUY|ɩnJ`a Z."8G*M/\|UyɬD"G&^=+Ƅ+JO=AOވ==ѐh7: È,,"ҴJC@[Ϯ;yW +e3yu,G/ayScxV"{S"^i@(»"pŷ1AUObWUm~mg%UG l7ZfH0"e-rGQ ^pPt, ">gcJ3;N9w}V)zKFYش#ۓ߂?hxaf$O39VU`o:Zݽbx/_"Uo6Hok膚2߰΢u9\+#l}4̳]Xg?^.ͽ[H7yna `Z_{< URn @+YI(0)jU,wjy+CN*oۭF~xߨOSyE.53].Mqq)VjvjۂWL!۾U߬@]6B(b4 :GH2T'bq|61WGr*?:*97 b9~5F*hX 3s^&`dOtvu2G! U3ACsj]AIWV=rQ\r./zķ4_7rgVM-QKK[@8aUv :͂/.@uLՆWYo:@mdLhw3mPPԴ$GV&Lj-V|=1rCh'h8ba˅_48ʴCS.>M49nG!^[%r1~y vyzþ_]w=[-o Rb v< ,o*{f^/ wݛKyIhuNdbuӷ9,x".3Z|qiu6SmeC%#eKD|2Pԭ̔ &_΍4 ңȻӉǽ{OաϵHoO*(ڽ')t|{rv/E@Q!YHr.`)A%fLq)i Xzgtv5$䐣ľ8r0}1f+Pjv +LUQ܂O9{j4 ӎ%(g0xT; 'f˦|tI6 zZcn:xdPès < <(|Wh yhCu8] zy ߵhH2"1lhb>O@64'fBF8iFlSxb!L )._BYAK4˹N=ЫC-ը['[W7:kGeTB}w"|*vCǗ]j Y&2)5pf$Wd{E󦗰ɳҷB>}ћӜ9j^҃ y >جb' _¬^СuP ws6]5X$$!,eO.)tcO$A0QP ەV )̺pMGE3;>2HVf%\9Weݵx 5MWMSZBLrks互G6s  ˧9degэY BRToZ.m^!򗗿hy^VᗾY|@_v2?40(h {2@ghS$*U[,84b4Q$g*]%U{zKH8qWБWyIri aWU8฼c9I!{<~htJ {햭ݚꉖܼ^|coVad&S/͠ *2a΢{#_䣾z٣ÍF_||-*tQwu vOw(gE_F@r%4E "bqd*8S#$Jhq |;/:&tRn[`W5Wg%Cf^=rd]"َ&۱4Eli+{Vћ&}nhf4I$BC~gmIL_>bLbw[V(q$fr +^lxQ@*GgMc%<{]GE~ʛG?l:N5'z\~̅ˢw #MKMc>6Fw CBDS_tirk? v;T [xj4J[Ӿ%)&oKb8Zvs8am/T~:4z r$*?ztw8vfK`Ka:9-ă[:k:Apxrxe3ߟ7]FF~!#K@kCAza) -LaZk6d ʝ.]ɐmuYn5I2{ݖ > \I ኺ;L㡕{U+*E2(NJ6w&p=^8g&^Oo^/&o.z*&OBs%$룫ػ'On|8|?6(K;ƂD7)uvkiC\#uo%WH,|v?'~w_wڟqK2L{(~BRbkM#l:skώOr/5 30PFW\VVP`E?'&]5m rOpoYQ*4F^k_'~#}F,~_(oJȓUdiēU}y?9o9RyصBݥN@2ZG{j6/^$@9B *>14דMI^<9'"Ϗ4V Xo?W7?֯_K^ J$T>kjF8a!|j%BgA )yNkAޑ.-Yz:ae}qklԤW7;b|̭>Tf DxA;$t3s#F;֣̖ 0w66Yo;6íp؏Gˣ Ӭ;qO~~:<<>A'`%1WREG۟]6_mϕsbTΓAV,(3?V#ͭ2?sayMjt^dZGWnY7"Ar묤H>sLw͆Ķ|m3[_& fzv|ܱӑ-,sճH:iZS#ۑ;E@eOQί!/u]MúmߺV{u%13vb8wzL7R7mZ]e0ښdf8&}FS؋({ gcÏdvd6$k0,j  +r>BTN#/b]j٪&Jvp1NLYv&Fo_5yv7-caU~rL-}k7TUJq[$0y+1b32БCGv7+uomIѨwnp1z5wg~*|~%H0;pu7oNN_F@tqPBM}j`*<̿U @l5(hAoj4.ωD[RƀI61횊2xiZ ų/9aD+SuĒLn{^?>Ԕ~g0Z$F_tޖς@ ԕΓ~ͩ3rNxc1V&a:M78reaAŒN+ 'P^K0YV~ʭVgsBMU.`5,Gȧ|Fo/·D^cMLKq;1I䫡ā5r]:}2vM~[#H}{C`B?zݳ\=/B-|VCMy=շݏQ0Y+܃ sk>IM`Jy6sC 7o^XpoyonjsUP U9*bvx%;8(^P\ S.;d 3։Xrh&6ͭbqww#h][cͤĮm=j(> VԟZ$t sjĶt/Fr./j/ךxw4_D2`H@7$P ude12ʺP{ ld/0A֋@Rζ0çF½rnSwuNOB˾bPayA¬W&c"ڢX:+ t. ܂>[;FZr@RmEC;Yv8yN^yq^bVD*s(ϽXo~s*6#̏! xe.f>щІuX-P$P\a":Ƕ! i/wvEx(Hrghej,.,G:+2gid$qYܞD%o]OtO7 N_SaǓ; l ]wզGv8.v^ysRjBB%&THE* B>:@*`%P)'|R8| )r#2͟4q])90{ݵbWfZ6G{)E`d﫬d7sao-J}#Vdpp` J/)]ri3ގu<5 ~ۅf;OvOq׮[mYgvֽr=SK~]~ 55ZWK=[,=+ r歃~ ˚'N }>-T@g=?sa)4kiT_( "(rLxgNF>ؼ"n<,5b}n/{G>z:rաrFĮ~k+zYg;*LJQŽ6?G_ | V'~<>J˵j5XBUfV?BD/`ځ/@g8R󪀹Vx9'&4W+4V{QG#`t=矟wSlnziP'Q@2gCV|Bh&WGn:ӑGi:[&Vz"#IhrXy=>elЙBY TŰro?8< 32m U[|υ$ aT~I/`%$k .[}F5Ms ۯGFp=GK?GKMlG+(ElӡB1D$uc#Xk{YFg!fw8թ(Z\ YGFp=_?&OϨ47?Gb)Z f9^9\ڵOs C:e.kĀk.7DSWK:PouK]91K1:}Kud U}H {4(E߷tVO''0EOvM?3ovfV0=lAd&I?kW?,q ԫpj{ЁON*00 >.$b.̅f8b0&bƜ.)*фy2Ո?IǗdvn*t幐A3?%{k=Vt&Blfa}36S7K߀K+0<0c"0,0$q?Jx^s ]v #dߢB;0fr;Px2?:kruω!v^t$a3EرD"&GS_5Ҩ[=9 IN̄{nͦ ?p^ُۖyFi3ǮBkZbC_lqCjUEcȂV}~??R9xu:>Ǡ PTkcդ[ ,&G͠Sq/,J@fOwme#C*g[pǃ[,m*DwFO3]j18;ٴ IĆف:޾W?s]fY7UPnPDw\te}c;;ӫxUt {3= v^ B^fYqLALa*j LXZ;F (-uJg q9.,]uNoogAD&=H22,=_p6[A$} *m 3CAd6@\mC[oOxj h{*kw*>ǫ?i>/bpK=,oC "[x4(Us}Å cV葠w]Gt뮙#"40'-6B^M)̳I$XNsģ! WV")w?$_Vفbh^k@k:S5"nwBa!<,?RoHBs?#<# /AG> A#o7 `A.F̢NɋEBjRkEoI謪Yש Þ^HuՑ,4 dpţqnAԁ,SmM,%gǑq\'ĎKtNum73D߳tW(ƳI<^ VW{oZ$rXP nm>7üPaK2n71-3m-Yd;GMz;4q4論~' c7Y`6P[+8䳑ͻSO#1Z}zNX|-lw{ߎWsSzHjO= yd`A -~H؁ȁQ"kD6Î|5/7bJ /r]saQ-y ybXh?_WH9,IQ,Ws:@v=I!FAK@h4؉kZ Tlr3{&x/>r&Gb\14w(uK|Hqzs y,y跇ةs{rӝb>tVﴈs6 z+T: GA4mD4F<^݈ۚ|{'7W#caV!,VT1GGx:J wVBnoX-mL>c\BἘ ̶-"ml#lq nٽVOÑ[Wβ.p퇺to?__^[;,^'otPz%Y/Q[ZnNZOGz}֧ࡉP\b^}/!,z^B'ɠOVpr$`DȿLS@@| ? B;gQ2N3 gtO &L,-ݣԖlD)3|!۸q_<)-Wp`Ğ6m^k~K6|srD>$|:A͡abn+Y_gۧ)f +PG૾3 )PRǪ/7a#@jA̷@3J CoΦ@?BnS<Vqg4K -\0{=!#\=Ěv2Eeo+l('G܌ȟ D;rWr@VowvC7GIe-;Cl-l[M\ sժ@o(j?2a"ȓ /Ur!.9*>::_0`Ւ@qqυ4lDk 6 #fȃrXy>]Fk4w HQǙ%XP#݁ʨxvvzviyPM<-o}C  * PF ,\gz<ƯOP=~2LE4zbEyao7ujC"nIhEl&%HDgLctt0ֶ?@Ilw{'*ݽ$ݔy ݯ? . ZE ;\&<*!sCU'4Ve+ba[-ol;F(D@MzAH):b7{3QQJ`(7e܈~>jjh1Rމs+#~>vz6pdy)s&N~?xqL4>n=Z ]9&Os=yCN6 ^cjVUO{ɅxQiᚋX݆Zy;屄<)ϕ9=~E?aP -zY"҄1U"Dz(1iҳx9qOg}?oy\jxorF8h0L?FyEVL_E3C=V$bÉT`u虼y2Z?KZ?d b薗w8Ҝp]lS6ۻ{HP,#C~㠎AXĠbN/\Vn QCӞF0̾>zqi/7ÁWpy5 6iE̷}2DSt=H3G\'[Ѹr+6 ՖJk@rxF6dZz|I/cZbˊ ^HbX5[A+ڰ'A 9b2x~jϖ %(caP?"tTy\oa{`qڟO@4YEطDBd=SpyOKfFx%N>?yJ@=c{g:cw^<"MVُ-!0뉄8uko㥑wa=`ZNÂYW_  O]]I*X VA jN`8^@ ?"GϏ'\B F 2P'vQ9=a鵛fFZ=|!w'i/4nC?k8>o 'f;sçv|ָР5r7@;%ēFԎctM?{B:;qW~K{w\g"TS=~̭Uf75 dR| ˜0x /֏@)hBg|seg^abba fWDhޞ15u4JF+j͗IE=LzY(ϯ;k禴6'#3;ľJ6cj×Փa`Ğj7Am!eBm6Yj n#tܷ/ y^vy5>Av:(ϓC9CO^£&P#C毌b"?_S #|_u}v>#WM!ߖ)A; ,rKARj'(5r3mM$OS6Ё'xH;Grh2R}g7d6&p[k$3ҙ~k B>Vs]t®@փ)oU+C]0p^AR)A SH/0 =8) E|Z{ԉ_G7\}En=Up*)0O59$ϭxŽB97x?-+`Q5A*:XEх91ᷢp:0ۊ D9r0%EyoE47@ә8n=ۂm[e8rE?ֹK# 4\1Ql}Y'R j4P>J*- -0?7(R!-LUۢ0a |ė SPETASÀQ6΅ N}K~'S j,xua D{3Rf"͑k.zSbEEr/w_[v4VݫGrċ?>hܵ|mZCmUCus[s 0ܥPz2w8ߟ :0CtTaT%FEf2 縇"hxwsN[W; _B-㨓le]78=J{tKa DR8xHmS6C#4FL+j:{tbz{9LRtHmw^mڝk-A_ȍ݄mGPl+*YfTJbp`zP<ĠO`U3r _ozVQdN~ ޿.? j6R.(֑a G} -ua\r۾OE'u{|Ͷߌm"2e{)qRF"%O7NXwI< 2sn)T%673sZ=UUX5rԫ(W>W U99$@D)tG)ʰPKv,3e\tG>=틝.7]AdVKZkݥG\}_o%9p-hꎚكafI6ˉ&;/wNV' )PCn0f]c]q_+0SմT,l3ZDJ ϥC. `:63>@Hj,h,x)P$8)2UƉADW.·鴪{|hL|u`u$HD˛2ӌv*yYh&?<8Olk17 v6̟ziGdcyFS7w [ ?!B8v{FVsr 2Mgp^9ɮ^χLetz Ӝxl+Dweqh d$(},k:at4Ɲlglfz܉5!O?5lD&W6sZ,#y*LA0zT,]bjom.u- Pᆣj, `Ge%fxʭ.v`jernMpvP|8 Q0l{û<^αv$hxl[.]3yYyk~>p+if0Zt.sn"?$mzMa s%R>;BAZo'E`WjX*3@ðAó BȇG gx"2GQ0RسG԰g[gk_ ?ֺ}-^ o;wg{7{ߒW]{K%a`\yN 1C(ңA0Y;t'm'Q4vSۿfϷkx4X&q nofbzV˭ vg.S?Wʰ}t"`s@9ȕE|Xg᳜Z1a>E _<W/g*Ǒ-zݟCQx urڴ9$Gm[02ǛK'7!CϫkP`at"8/@FpJ"$jZj]˹*va L:\Zy~\$T+ث'[^rkh_6cĈsa7/F7gQZޗ\zDZVߖZH{j) EӛgF1 &i4)@1#X['EuLTc p?T}y ޤEйK^Xo:K-@۰{eOr!"om ΂Q&0?@Ww\lNKQ\Px Ldz3." cWx!FZǭ{'u9xK\uݴHD[$˜ľn[Ҁ~yl3N"ТY{"E_zض "RJjCiU]tϱr|̺د1 ;/I튅?|3S2MYYj{ lBm2~ sBYnyfo]3A1MXd lk^sMX4ӳDI~KF=l%oqu]|' 毢W5 `?+pR@EELWiu~?*2eR+;Pٚ8q|kFz_/DJeg#<υQ wNҍINc/)Pd\oZr^^$sjfF]$?HXM,ƝO 9}M4@1x>iu?"F<bV^B--"7毤0 [?0<|6󭀪 '6ӑ9_#VG#x37׹0veDTV5V'41:vkɬ.؁rCY+6'4 ěH:-6Q>/vvjIp h+P/OZ0nd03nor<`q{Rg΃PA [gWj}Cghhޛju:r櫕1LG\saj 'ʨĒ,ءD,muKJ#{bYX}_0X0u6p%tR9D'1VJ%Px@DeΏ T_-ے{y2t%w[]" l:'[('ڑjFxRuP?td\V61zjcJX8թDW|:-\h7u5Zk‘Bu/Q Q6\.`Ae[MFu-Vʛ_+k;8lœV>@D]P:Ϭ_rD0m d!;#PvԲ/NAZn DT}"‘ksa?raxW\ww&@ilAޤ| ! ؕb5B.B }1oNddey9 B݈W`|/wM@n疨/&/*mAp2qk]ry<~6h_JӀUnDaFbht1[*łM BX9MVs/Sl^dc_A W۱0 ]#R]zbtuۤP9:=źK_w-J`t9y1tYy;%u=UrkNs:æ'Ġ8fNAiFgr+ʞ&JE,o֓BaمDt7$d&E՗CNcnfø$ݠ_- EЬ1[&E` :{h ['"lP1G]2\fN^b܎P+'ߞj+i.pkov o;Ն!b#TCJ0"jy,̑PQ& Vy &U2k\h4*h.lK$!??=C̔E|6d>(d+W˥@u z Iz;ܷYZ群Dž#V!*2KPImQxSM1̌ OW}'"/YE 57j6a͝??wr3 T$IZdSWUT|ʷ"Q")E9`*.cyz5桧c5YM/:ac;Tl(8\M#=PM(1f? u>;p=q.r'$4ЇeY;AXn=H{ˣkYè ]oߚ};}?񙡣M/[Pn2^'k 2+= Հ8Jgݰv<$W2\BD#RtH/T}WСg 䈕Y)|| !bՠMg@(Q,9˹bP̘?H"j%^(Q?j; |~$DYzп$g]׉]ht+fXh(D\%ԆA,k "B0}N s"ITidr,@E e:--N${ 3$?r[,-CGу$ E8JBp<Ƀf:)ĪW1C\OO,%f(jW :463ŲjT> "Yo%72QyixΟd'y;P0U c@<k'FxtQVaį2Ơ:`V&-7OA.G#!}UЋnۈT#Xyk:@8@BWXZC_tg3R6-A:Hɀo4MFlO]ޤ%-:mF_o$`e u=JU@#WP['=gScDg[،T;_t Z_- Bb_X[s_LRB}?1.+ԗv5NBuSG?Nu=j:WUAV-I){}W' -# aR-cЃ߮-JF/RЏDˉaDvM:.2a^}OJ8]zKzrzDSX!P;ggXuen0,/A.Az>v}fd8-ARzY73)p6Yݏ}n:mh3RC7ΠvuD=3;lԏgG%y>'m| (ic7"Sђ8g,P/=E 3Tw7'Kv2Kr_xo%v`A/z3׳~zs+9u{ TlU[*(@Q]h1"ssGt:+ v>ﻒ ɀz{rmy Dd*vCM"^"6 2Izu]N]'n\zjȵ$,J'aZ{r畇/{؜jZ O$upYFJ i#/mFlMJjYv>7P7K`R^jfʦkqs- w7)Wdnavan 3}|S]/E/w TpEDy6vy>h dMWan8d$5blq8Xr\H`2lQ000kγQ;Y:@ZEjHܬ-Vi|AF" O5GqOT.KYm?KflW]pH{(S!}*` ]xefziRϧE8䞏)`ٸ õjic)en[cPˍYt5]t!؋Yΐ;ܺBA]{bx:et6 :aȥQ@:BPj6՟MVD`gc PIA $x05=(cENDƩ"&atmnJLrY x1ǎ`5N.Cߞ`/A3ǃXZ Лw[+jue@h[}0Te5et)7^8Mm`+ Yq䊹;]:*5.`}/iLwv.+lX8cZ'cXzb۶s![r* A2=42i q=Ԣ |x(t$//ڑ7T~\Zr@= 'Ogj3<{'0~Sʧ ޤ'*S&d($ؖM t[2KKv:hOZx77`w\}A٤Qgk_Oʣ{pD! SٵhD^Ni?JhMX4,*Mbv ]v:IӤsscP#ovJ7cK  RЦnY5L$f vܸ:P˜i1jh.UE{Vab5CIof:5N,]߼%!rf"q;mwx P+&52IŸG޿?,Jqr+~ "ۍ›X@Y*"MgÑJydM;4U}} G~xa)LD5a݇GևtwtAe! `r!2[{/߻9ygy:͜H?>P;?=1>V?(9gi3I:Pal<':ͬN1ټ6#F~-D)~"60A$`|gYÚCǡ,`xsBߝfY]Ϣ#cwÁYrf0 u59unM}[?Ϝ/`W@ҐcsZp6ت(v9y[r-BYE׏uVt`3eruiy<ܝ;}~4U5x8QY$gXRT%ib,G2C BC1< E'eEt}]tE&E r3uu4A.B QQs+TT-Ī9rtG7Qo78/Tbg;ùEO'3?Kǡ 1,dJDҷuGA!|J{+dVx!=u3$'+H́0>p"jhC?XǡƷ2OO@gOާJ RGt+wc}>{n?QlPdd\F Mm3j;K<#iX[j]tazx@qS<eۓSŸEO mti -km=.4]gp8IvoAڝ$* o4* dy6l.@bAKv>YjH&j`=5$/4.G)gy:l}OvAP~9˜(`hk}!cu5>w+>ZOsO(~'@{B=ҷ~#b 0)/mG\xw=}cSc`0hrw,ǎr}xk!j+ˢp"qZdkݰfΜќxR߯-@}pRd ,VJΠ9+\`d ^ujǵef;3床IdcunmXk}`|ߑPY4/3O$Ә>o6 ŗehY^tmEOږ2@t1 `pM`v4Wj#72+DPqжS\n$YMdUrz+bF*BրJr yV4 A|Y$erna}m.H:؜5{I0 /C0)5kϤ7WUr1d`GBoi^b:r5 C N>t'߾M$hTsyׂPTeU˕ p-Y D3Nh+5{X=U=n* ғ5xcuTA_|@%ZpGa#m` ]0 *̭bZt\sbko>&0O;e+Φ.,;X«(p (,7uORY6_m7y72Cֺ[,Cc0|GP^«A")^p ^+g# m:Kkݮq4}ᫀpab6O:`4_Yw }iلbo:N}8pRL؏W:#I(Tsֶa?!'K$rCB4YY1Ŏir+,7xXQSӣp[W3 I:tseH iavc/m^7Ey[)nNشe܌鐾_ d?^-OAJ3aXpWԠTnh8&ies-w~HH Zv=v\(Bζ>OAz?]m0ȌdxWl~AZSl*Js;/֮E"_=LG=l=B63VWGLo?Lw@ax\е˓JΨ"LJ-U9Fh4o;__$SP|,B"ٿb!Mk~RJ_|j.jPⱔS0MDehKL{g8WR DdwoqhNrilsj|Vʪ Lu0zg{Q?ڼE:﷝= ye  g}̓2P\r|bx\@f~$9H<B#mQH-bmD )ULYk*N ՟jevcŢ0EkwtID|(KDόT9)Al²RYGnrՄ&if~ҏ X݊p)g 0IɡrMda}47cŬ`f)iPp8) fI2$C/y& nj/iisr ijYep&="Ů/;AD ruZ>z/R_S)7֖UN *#Y(k摦pc%Q b N/]$092m^l`~S"(xVX8SqU]jsÞ%@YӘ#zNDMO1r6m'* ,P [{C BU}Tw߬郝WI o~*GPbkӹZJoBҢP&gRSAAf>t5 ͖Z$[cܻחm gj1/u>fQ;G@[ҤT׏:&)^ Go6#OzjwO0fw[Ι_OC OPWH K`t;3H\jsѳlw]^  ƶ{lsƒQb{C7b\*eG TOCе.r1{5!w1~G觛C!!:vLnˡ+~j0$lZDJ@2`036eae2wX>tLjƌCcT  :+MFO@љMpLO[d269:&QiK K˃2Է ڡGFn7QGߵ8b$U>M^!\MƮ1 'IF5r<" UG|oؤM\Uؔ~2~J8O ,wդ袾xA:p\zm[Qo>~<`ҟ׋˛ wyw?/~W޽w;{~k'X`3\#\IWQ$zljIE8.ۋ P){6,t:t6'ӚI`8Y?y~53h y|6[J@T/5m@EZ>G7Zth` O5Abw7N;&Mb, 'i.ky 0 t4 DN({PR; 03%6`C'U4 9LT%~rzroMQVCK,Y:.ɝO<~w2޽'PkGԽww_8ڷR;,H՛;ֲ4I5Fj<_v m fQ^+r0&~Ǎ= nmF aU>̝Qwod>6 k`7p5DFmZLyt`H0BaT|xTC9"O8<c]Jx,X,GƊifdœJM6E7Q"dF˰!`$$y:Rإ, YJ+@o0V-i!q)}yqz_X5W6lYWG 4u޴SÞOf:>p!y?*EͰr&^"NA{eYڄA vBw[&~0[۟;`fd$ڥ棨}vw.bsUvmUD.4F/SP̱_Jp.R@s= , $vHoG̽nt HmC0P4pYDgP0ʠ[%R&:[ NI5qꐌN@v&LVP  #=|[ܷLLbx8.~a)%uj1lc|\V-{tTHxem >$lijV̽̌I4vJ*uUis[zB 4c?7 HXb,y'fPmfzmjJ&5G]ҭQodoo`"o!_G=f>2sR2Rmj&ϿY əa, K8d%B_TÝt2 QPo)DZtz!˚4yQIbFqV)v98 t::%izyU0Yl>ǰ (G,lTLDJνаgP1ͱEǓ oS$RZYjjr 4z$>^zh۪ݸlAw\kׇzv+Z?;\%_/!dftQΩrr"ǿ߾'>{p@3v;݈i0|{;yx=޳6CB%R]-H,{6 $F&A:A. TS=ĚuUXS{!XGU 9- BS!`$CA%* dN>5eH Ef I& bЖJ\4VW*1pUb֋#jX.6 < *x4KƑoB=ҥ̳H'Xqqau77.#+Q+?5({/F #ֳMPD9-N&<2KMAd` z*pscycsN*d 럾?*s׆6(߯iF;[{A4~{8N:Αor=D^.vA,1Uu1tgiU]$3@ 7ۣİى^Z}1rD]^z>؆!SzNμ:r8: DF[rMg+ C.;|' LgPbJHh rH|^D Bz~f+junh_ owL|7޽s|r,|޽}@Gw2=SMA,g!a !SMkqÒoUQ6]@wPK :gCŠCW 6sLsX6$=Q #̽狴Әv7&j$*6=!ݯ5IjaQ݊x walA#Rps0U^#Mū]@Hcx޷RYԎZ$S~{HxzYX}Ս_Վv? 1:u,qIPRF\'q(Dz:LѢ4mNRZ0bjI|/'!`&vNN t`X(;/gnpXfF-EkOyĆǏk ƺORʼͬ:,\#hbxK605Ue& =`TOX^t|c],3det]NL3\N fx~"hF|Sקz腷O5VUDI'R(h?zoh ~wn>w/_m}~2xel i+$[DHi0%V&ţC%dO~5zwOzM;. 06%l &/mڊ-'vbq i?σzT,g'5Ksh9@Ûe}2o纷`Rȹ6-NrTZeC'DTPIN&C '-Lւ:&;> [D$5kl|NPm/RlrdZqDF.H#}q;#w[P-ƺA"sdQWyk8j3%b褆ͬi9,h9 ۑ w&V[Mƪ zmJ&J j% ~1 X(E0Gw:h7OԋqagOǽu؏.Mj`tw9Dű*ُ5䮇b,4B⬷hȓQkd#/jYXjg!PGK-z4Gm_X>TVGls-U?'#߶>D}v21o__;(B/{A0plFg3HE *eS؞lɃ աt9 fXuf+Dݱ +/ C LhȐ@Z=[(xX uẈؾ_&a׍j0ӬZb*>F^&0 tn-X񑫙0ޛHaeuedVUU]յ뉳GdDgktsf8!93"EH$EShA6 Æ!`.|#B6`3?<@䉬}yNq|f2@oV]&<'@H_ %u#\ڮ߮NUl?R͂Tn[eEDMͬ+M\vYŎGԈ/N E/]gya(g#χ[=-CĉOұd՛Ow$QR8Vc:;٢Ɂj{Q(M'|lw#(R㾛B1p<i`wOL.u2ȜP9DoDHwo-YظVT{=g?}'W `{\Y\ y?/'abooikOW7&jd&if8Q& HsġՖAo$V%hf{djNM-_V 5QLPYiF̜`6}h`~~=x^z숑e$< IG·1Oz];Ǟm~qvOx+:׊cuc%v=Ϗ&N/gl|;3mhTZX7'O Ӵl 9 Vlk_V荭U]?&ū?._;y+}hE:߸ T}n]^4H,D b(۽B/<DDE-(r~Q8b"O+J%5h ܷ! t/9!T `εjl3{V6>*8UptAjk "co5IfPt+TnWrMfmY#|VBBL;ɇGNIРd?qWH,WC,RT(UƪvLaè*!64CBLS_wY.A [][[r%HpM/y'1Y>{[ 9f'T?ΧILbUlb84Lʠ>79J-|0:mnx,͐$Ex8 }Nᛦ\ur}⍃5N;@AV&EV L+??rdzbh?\5cw4}\@®7tqOg?pSش6oN8Ҳ@&1Mi #uĦ5 FՁo;6MĹIr"uƒ%nP&y dܦ5Y)Ȗ]m;,!:6T:^M@ѩIÉ ft02p fnngnl 5'^ -KLt8yr8:Kd] h*i$x"eMp7p 9ˁv3" X!u>X oǽ@L"LA>` 10,L@X**Mrf@)iYXJ~trټvN=oS+7W'h 2;Ç?{NZ0$4I#+*j @p22Uo Bz{٠l:4M Sf' 4o }zj.9OmFrU~īC5؞olGFCh(I:}(FD˃cN2MG(=@C m1df胉J:O 33tlwa?.;B6cWv0G庾?N5t'Tf {qψ۳;|E0fA굕G8K7g?Jm~r.nj@-]qpO};p~x';wsKTsE`O_g5jGAb&WN8 {ԆН[{}fȲkFH>ɩMG鍓>cIJOGXT ? Fut]G5QC:߼-a7Ed3-g%#-R06,|"6RDZCFvPU&h7mg.X'Z@D> *T Z4Cg[C?l?m'i;ez &N>K١Im8EkQh(1]oN-aE^@5iLId 2GEq9hlʕi&6wwsjľ`'ńGah;(4:nɐYݝIՑiKd.$Bdjtvluۿ7'']P)X~1q΍x/K\W867h({&fꆀUCOYs T!c 5+n,ZԔ=jjC!*$>Eh VmC_lMwY0]讂+chv(h:nw[q"f;=ֹbÏ_FWS/ۯ}7{p o=14U1rӦ'dlZiqȴU%z8^f;gm^~{͛ߺցǹd~'΋O;+ Y.-OW-zZ0E߲P; Dk(k>V8\,-x}1ڕISp ,:,M@+5fɄNϻ 5NTi ϣH7VWavݤP8akU 7w<8Ύ]BbلEk|ˤh4"A] x5{3z,WSr/]E[CPeqS & |:~ChCn])|庄*鮰 'crGjt [_?=_sխqW&+__^ Tq\R1x[!_ԂN@<R,\B8u@D,& sX<\Y+Ɂ֠?YBQ(2(@3QB`Bj[@2a٨ Uƛ̺X_QTJP੐Wo,/kNNvhф t}gd,WC[S)Su d% +(υ'FE) `##T\x{y,w%aZ߱ePڕKZ< mw;!Y!f|H~7O1۟}?>oT>Д!45| dCp~շE!n5(QNûQ(hq-~K"Txsr?O_\Wk.ba3M%XRX-ֶ*½^y{Sy$CC+z&1̟R-sBZ.8p1gw-$FBqUh浚A5 ev%okڲAMKAPxbipΉ!PG6V fa iqϗe X*ڂ v+7oݹ: "$]Apy-B:R5VᱛlsGFT}ȭ~f"Ep:l#0m, b;wg2AQf.F/{r rvy͓<#":J*'8 ]`φJ=B ̀?%Oفqۛ+(qF0L|Gq޻AC@.)fo< "1zTر)54aBg'%ش89L=~ ӤM ]?4GI*t͟ޟ [c|;O|]kekUo#8Ø~罷˼`<էX8ty}hµߺ6׿se aяBqu_z~v.Bcѧ+R](؎ng ?w%a@$F<&Mo "/qW.e#,^Y}6vEv0 1 q xOcRP Jid!퍘)9C&cE&|XT{JliSMKS6\^Xuiqbc'n}$5Ʒ?`6U {[{Gb+h*DŰذ C7qTWYGO%nc3T rh =l>IŹ6c[P x/̓b Iia1h_~qHjk[7ɞ{Ma1^*Y\]0Հ ^^sN{ؿf5P5 XQhu`{%U` TP .& @-VB)-8i.* k~ˤ|j+&!Huy :f,mT#2C3fj9" бl,,+P Y`$c5\;:EQ> 8uTgࡑN{qӾδVc#U-|<'ձbXp.R5(j"S췗td!]NF;Y=#QDlTb?Y;̀&'N6P\sa/)vm c'jmt-|!,\A0:uP^l8 U!1*Ǿ'>I W臽@W;=ݥ:!+#!BcW=#:cg,C7-vx? {2u R@2)>CbP2CX/8z&G},E6e5 A̋f$ F9;۟/ =oW?n\ni{бC~ձud-rA6W]?>zy勗w,.TԉI^RH-EW?bz.t=b9pX핅Hk-,\xZ~CC@/%z @B ]v@Ί{Z*MVs뱒pybVPFv5_E@^Wv6w|DC ^"*2Fyw: 8Y}hj 4 4f;Et`V@Vbo))hFvd_bDgc̡XeHe-l*wyj37Rd 5*Ӹa·'ܳa?ȩq,J4{ng%Pްך@z-~$ɹu@W\ҠꍥK}ً?2^^l[/<\*/V! J'(6AT=EW.EFka /rcaP/,. p_J"(ZEڕ]fGuxtGxq.PEO'9d,uU qlڤKhO  mm\RckjL ]W7n-=y3Wn{Tۙ&&Յ5nc4 ܣefSJqF~YcF׌\7AC9uh}"er_I5ibTQ 9"}>loT kbJKL} Pã M*@2` M4jA<h$NuxxEϟb%b&>zǜstLT8Swr஠y9G['X|4LGӮJiIg]틳~g~;EB^Ln#}6;?~?N_|7*y@+7cyii_m]Ul YXm /\*.`穃/\4#{JRe! R pۗ֋+B jGP ԢF{bn})1| 5p6 1gvn ޛ|Sbg@N2ɾe$)ygܪЮB$(u?1m(T7 uUjȻ$7tҀkUm0lRl\~el^M$!nL35h3LXM|^lZT$)D3Hf. c7g@Un1Ri-_yj2lcԂ^zqygvUbB2U-%H|-ꡡ{N1\R@9P'=]uXQe]rf:xjgܡ~9gЕrKZ|;$Gn:Y@}[=/޹;$O*pgâkԗu"6*P|/~HC"- p5*weE*N]5X]źN$A5GMowb}g8l$7v` C==bCy扱7]g=Uzkd: V̄qnc/Y`#m=5HP4DCPtN OH؃!K\q5D"!}hx_eW2ř-Eb} 17O,þyhSU[?qYw?nHлH ;:sȨOOd v5vUl=T\Dxbx1OCdmZwxckd;Fo^\»,tSWbꋒnS7ϼԋ¹c+ ~___.&62,=3E'ثAJ%-z /{$P,!*`Ǔ IOW,\'V/ `B4XΧ޻ M.*wah\lDd49_-DS94WsD#pzFQ  cSuajzנpd+qk]^c*Vw:pāTw|P ٻJ [qFդ yIJii f[T: :J"4_TL:nz8#UUp-oƓNh O6P k8(Pdۧ=[&͒[v 8g)#<ז5Fk2omy"{b}vbK S#ÿzҏz8t2C_RL4dT ;IsQaE/<%~ʕx.u,pt ^ic?ba s PL u0~*p9%ml՛V4J]^1$Vko~YnCkoV^ˏ~?Vߪ$ilֳKńCˤbbocT @/Tr\d^ڕl ]ܸP;V|y0b(qK |^bT҂Zo]];즺B ҉nH$\. KVc;,r~kƺJ)PV yqKt:+.i,%Uq- m`]YqϠ?0[TK!KT]=QP$RC/hCbUF`FZćh|븍3P$sA1k0\{/OvA;2\}4H$6&|WС10mb<6="R\]b?rh~>8}:tXIc'&kjy@`#4s/{Ne(7]9_a9w z6C3ca/7= /f@Rx{,fxtY>MqG8cMke"rYiݐQj'-̖!o<9{(=GJ$aȍ^I H Nok*#wkm $Go}\Mϩ_ZE$|E\ *xy$..\ʼz%\Z],x2B5… RDKX_<~CXWZ{7Q`d%'5 (Xl^;׵:ӊpf.ifL%Z7/W$RޒN[q7 VDĥ z 8VoIhkclffߊEbs.@-̆CNh͉k&a`@(vA!l8 V@$"pgkw߾OQ1*zx"5FfFNv\=KaQ[0lUG>cD[jvbwE==P%c'U 3$ *6NK~76â{jta?8'cFJ Goh8QQqn 1 :h>S"S{V=5%;(ךk]ue.gw~'B7,_FIb~o+K$RE T+V.fCX dp<j??p zqnb_U:Jb񸴘 75Eos jPD KPPAjXjx++EPL$7DwѡSx(ѫWߥ̏WǾG}c] g7=ZjELoډZ̥ۺϑTȜ:cnկ sFBQl|v|;WSeqG!JYktmG.qڝ"^>;tb)Xʶ6xy&ȆƢCY#h4Eo@qL)VM=^ܑ4mm}/6t+ӌ=gW]CM9;F>Z _`|[<"[Unrp_}1F3qgW(`?:0g$2FėzvPya2O~3u{=m6Gad:~G6>xZBkeUr}In\}LBF fxAiG_+@K]r% _u/Stqnw1Y8߬/sKZXrl/3oEXZtZp+*~Z8[.bX/26Cnޖk.ŭK([_eIH%GEc{x` Y[6.F;ME&pBdrzD1q!KV=>䍣PMǓ#p8E7|L͆^JNO'Y[tzu8󑽰9|cEƺ*qy 7Ver3# >:Dz6jYf&E7nOi_M=T8qֈ'>"4Ͽxs2vln%) Fd"1g͓^gԪ7owYZw]ׯH7YEd-ry~$U:<^ZH} d-$s8$JVv-t؟u+*.byb /z>R0ߕ޾/@eΧ+_s ~<莊ŊxGx,Iر+a5:g a@5cX_,(xKo1slM&ǣfח;;d4IcCȍ8\sE^cu^zP ` !%7VދUSj嶎ԑ6RŬd?>Z uSh֭,95IZk T]g$Wmfj:nVehv0T= kp(Gc8;rȰu_`MT ..5U+M{xU}oHu჎ywg;:%3@ٴ ]hO5 7gRz-o9DܶȐZI!ߑss=y̟qȜ̈́ Lю.bhByͿڛ$ z״cpK6C XVu񝷯$|}EYnZ ~+\!!3(4 7;_|lwsX;$v@v1VL<bo#̣+EbUW_ 8ֿY8[,%W-Z\o_)%P/%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J(QD%J !2x}Y$u]-3AaLO{WoUoUճa#$`شhF ֳٖBoz}J`F욞{wfww=0Z녽=mT{O~*>QƋ[Jyh[+QX]Zd~IG]ϕ"Zg*i Tk/{mkĿHV{߼?ccwWvWM^u~mU>0J+{Ku|x߽=:rgA>5xgϒ*nozf 8:;4iϋVyg[[޶/<Ľ/ap iۓmlޑ̎`ÙmWD0!{aKetBk _D.X{>c+2kؤ5IGOv&'HO(a<IG7vgI~Q"z'd͓;5`e_-vUf]|ru`YmxJ_z 5m3oÛΧݳ/[Qrr7ƃV?7~gے}px=JW̟D-eu^<ޅ H' qH6K#^Em\/#[*/_(&र&Q""<.V8A"N^t̘6 'H6qR+2~=AdVe 2ؿ1F2:+䋊ۤP 5`VWM1IŃNiG-&c8_0m CDZ yTjp.4I"k Lo'ߗ$?[sy ^=Y^דǏ7{[?ɦm>|f=+numK/psy/09?fVNvܸMw\Jk/@ڮԼ.<"u̎X@F"n3 @_0tPLg pjvh+U^eW(6÷/eܖl|,{ƪN/dq;VL>s; OY2v0 :x ,؁2B/kZW$lEڕ(8_&MڭRPޫlӨCX)?3rE|!'b۹Vd_ߕQ+=_Mq* /Y̦_GAz4WryV"zy<6AZ8εp<> @!Z2?aLZp"둍$-F`a`A|oy~yLg,lH1?S§|[vWgV;7Egg/]ߑt*k}"&/Jhkr/>软GL29m$3Z!.OO29<:#.<bO]{ VpgLm}tw ,v+uS{"zCԧϮM<^yۣir9^.™Ro -\yzK Ur2v.n5bzѼaY:=|ۉ;^`(ߧ_`m13#l`n˘4KykqJ?~*~dj yß=?|.3^'T99ZΗGS@?|UV/X8uTl-Y&],p]XDV "m895}f;5XjRYEou<ރMo$Ki꺌aóodK .T `b|C#krf{jBjĬ~Rg-Xx'sD _E7EנjZTcw7fJ)1˸m3of>wmZN/KZ؋EI_xѐ?)~~RQKl `&wO8+8ol9٬{ÏZA^[Dg' C5XHϒcp3[M9s~䚕8h,vN Jբb?#+1V~١h Geɜ6VUv%y0 :Y3Oo_Z"{?~aݓW Zjr*XŪu/D_/:il*aLƊn"`SAGM-Bds2qcvGx:}m-#Q 9#p:0۩$;TNQ2d,-"kE@ t]+W#&2sgVfD2S|yxn@ uXzD.-Cs\Fei:fտсZu,9ϐzV #ړ\ITbL:`\T2B>=-#||+wٕv-i$ ʷ8 pJarXr;_F:)"ȎXJFjY}7a4kjߩu73TdR&._rpK0"XGފÿ`M"2׿yC]g*B4U;" Nwtްw.SV%H)x Մ)笨v;B,zӿa&{6{}mzdHۦ3r'Oγ ڤ#hV Ft@.]W`U2>--9|\8 ,TsU jm>?^Ԗ0}(\Ԫ{ײ9[zгg=fC`yFp>:~U!G}"8 PE|"p%sbZޱ9,S.f\Rhl{DYj=D{ T }Drj/P'P_{ONϬf m%QcX/ЩL3nfȦG)s6=ON| ?|WŠt_;eZ50ړդssDS sZ{5^*5#uEMYR/"np!>cOɚSVѹ{t>O`=?,q"(7a uS夈VIMNXU>dD{L u:;R)kƹuYzʍz1?)_S-~yXSk[>!0"DoUp"LÑ;ϓi˦SYr x3pٞ><:'ml 0Uu`C2;pbw4}AA$I-x dTx+3W۔-qKO`)}Dvg F;VbDcx+_z*߬b,oqx$ |yX"۱ts}.rlxC̗e6UI^Ȧ@+m!쓧{':(Me.Y2:)Y8b5k a.2 5,#ΣSvGpW^/oM 0?C_?Kߕ 'B^/P#ZvFT\xY+\iy48v5:߸ɐjwI4qoo;" QUh9_E "&kV#JyvHgHA(e`Qeդ|5Ig-A_s(B_NOH/O*gXG2dh0kĎP7u?Zz{ M'-*LɲFP`{=#.yaAB9A*Οl&DTT R6?,$FM#ܠ+K LwV~jM-cn_bX1e-(|S${e//:d䋤GeW ္`O- ]{p&ہoɌ0TbUgĢZԣ E˷ ڤ9)2#UgJgy՜}>^=,R灧/Ai D85.ĩ?#<8e.%TFYv=V6k^`?gm..' ]m"6uذ+!L(J3bFeFX8d;И+峫ܑۛWYʋ?e9Mƭ ^ vn9:-ߖU.*dє17hA#q,S0S y3i"p% GqQOzYVN s戬b.TݡAm9A`IG`.nTzтYMg%}9~%^^ ]TZXBJE[J^TcV8Lf.Kօ]Z]YUn_]vQ,&Ύ?+_U$v>[vMӏw|u75U=f=,[퟉m̺9^z?kᩞv6n3ۇ~A/5{=y \B=wQ;]|>N7Wgd;% '7qɜC?]ea\gꂛTϧҫ 6̥XɦPO5"c?)` gSK}酘Q/GT*؂ 3W[t?0Sd~$]>èOk_ͻd8dGjޑM$)lr"SmgB #^d+d|oIuxIN{&/W5E`h#d]rR?R^H+TUUr*,',S@yyȈ:v4ؑHWϿF;aojs(Oaq.:BI?Y=:{8 ^D=U 0#D7OH7şx%^j{MgM>S32N >allw r+ b|څh^yaa߂dy>KRb7BRmA]yL/ g)62nLf&`^0fvT:'y^}#׍Z5|?Nzɼz_p6yO1fڌ\3n穲|Tyo.u. +/酋{3#ߗ\%mϮϘrW2fڛ)3nlXqIS[D,%WQCvP3KRm^Ȭ<48xʉؼtSguWՁ*N+q- 7x_@{Zlޛȓ\fmnpzi=mq{ /2zY2<Ȥ|-aoJ'̽TZ]/vs'745̺pF6pd3v%ANܯy.ιT*j3X….>!9vYn{fD7&0n-[>zR)>q~g‘fԼo? uTLJZ] x?cgX9Lz;sF[^^=uђ|5+ne*ۡeJu`T2]@0gRc>/?3Sr^f 7[Q[ϡ+'Oғ0OI1 sfD+EHԘ3 ꯲҂cp?<{Ϫ n\BC9LQm$#MVjUN2n^TEX)_(c>YUIS#}qJjP?sOyOY&yάYq$9)ņ4)1bL:ٛ6 $Bro![rnf~~s*)EvS{s.<8%]@ś~FNeS].dkRV|i1g3 p7D͗7O~x?[vbWۄ*yt ߕ3J,XJDɜKCp~Pfb&|ߓ}bhM{#-&ޔzq0'3(+7rNwǮ$6_H;N~aSBI7.¯VzIm"h⛣܍tpߟ{<5zf^iߣ:%I:Kb,ƵX%)dՄIG+ F+znHy#!դ'jiOҝj!z5 h1X(F߻ZmX5cs ֿZUYнb6 (lb8idj9"zNdH]['HRʕikݡ(띁V6#_fXcYPȣJ Չy̋)8.͜av h#eiQ Yz-mHm{ǰZ"D3j):H0Hw쓍o+@>=?8bHgMJUPLEWo-QŞǖGc' &#&/gv<8[8= #'+硤vONh]Ofb4㕄ZĢH%>~B2{ Pb\D5I>GkɐIT9d54J_0yi^{]Q4-xx0\tfO_~m=)~jSD `#'fA4Ҿ3!Oڎ]Kqۄ դ-v"E{2e32reJŞ;𫣱;gSh6rhcW{&Ï22ԑ#34›YYɡ)&OJ/v]6b&qXoϧӫvٔ-po %h$3E%_/G̻ө$옌: |}*5O~9#%_RB5Î3ޝͿ>0pD |{:]6Ak2Z2p}2Z<4,m<~; CIo5; Mwp;x-waC4F+pGʱ ê |V},btqN= M.,cۂ?s@:ɯ_zP]d8|dvoc{:`އ1pH)&Hqո&JSxz&$ޱTl1\gSWGC{=2hۜD>xz)4rz_x5^)E)6<0dFD3tcAJtS'\|4CMG(rj0[yGVjW$1O:)!e˜Ώ]OcowڏW6f }(ۮzmVJ(OE9-n?9KU*Z֙;?<y3\#EmOޟ|ypE7m=vC$Xv_LcM6 t֑ 1<[Z;n)zK ,n"3Dz_ޫPw'h1OFrOGLe* GEH9`:iFruͣ+S=ou-xAŘ׿R!CquW;fG)CL*rΑ\s!Hy$ӳo-ǿ}`8;ǧcwƀ u'#LGZGAT+/ m ]jhW&r-tʶQ!:e_΃q_ DD+E_;C?z( k0-s8mH2T,YJ& ɮͬ-OE}v5pFNm!m *1@G\- vLAI~{:EmP9õN'>*.D.1)@m/I `xKP5=5 dhnW5 RtH("x0B@Z Ӫ6lR"h7NU`cR6AAҮ&{(0@b$ZF<Iʓg~_ !#gG~h||J?-]guV# Q)ڒe ԕJϰ-[qK@ }nj]m1lCM:8!-G">Psn1COo@^&C+BYG({ %?9JU#j|MD T2xK :̔$x"cHusZ^VMW[y w8L4[ѻyƯ_zCIB,iV:ƴJq}- <ǐBm^ ݂J1VR¦y`_+"g!J|qR:,^^?Y?\moN=!NLQ HBEXYUᕤMlAu ]B K Moۻ4 ҁJāyfQu2 =5aBz}K=cf/^%ffNfegE SŪ)PLkPRdH.޻6-=S$jJh|:qxy /B}=h^d:kZ!`vli3b7" u5 &ff—ʗL7c4NʣƩjMPF\b+h8p~Sdoo/Zy;LVqJ:/6ڸi~BdX) &ٽW 8|ۡzV g{D/y40իrWmh Z|=zR1$IrޭjF# A!Q4TESPԽT2[t$AVSTC%HCX oe}6ΕS]EP4$Mp)k!I"f-&C5n;4WrC!Û9IN&FZĶA85 _F&0,Z=tG{4K'#`{$I`No{ )_mR eP թBnA%3;@Ǥ_0Bg˿"w~m=mha]iBa\$gYڶ..o ]@2D)j)oj==c.zlmpؿOiT@`ϗlCS.+kH|8%Md\xX)C[x5šIIb4 ׃zGRȼlMWRJM(lmFZ?^C4 JGco&_D~<#qKdap2uW&. %.fzJ$EMa72q '㉯MGߜz:wyYX3oD^L֠N4`ͮoͬ/@ƻ ?qKwZR15NI6S ܷPaj|VP{% PZfW|o.<TDeZMNWcoOFn7߮^PX &]en b=9ў:V!2{TfRLoyIL)S4CM@5K_5kh;G5v.$'4 CQ<ڂɼ<0]r|,<'D )G%osm6,vWLnW_5gfYڿRLgg˦ra&^ Bspl/11?94=V|:7y;ï烉pMt<4S槁?<u`qq4rBԾjswֳ;lZO6ˉoo3n$6?]=uUbbDq/ 4\6MUrM[]XB@c&uwR!'Y1nvr$^ D_6OđVa+.bFw(: =k\ؒ-}K$Cx%UPDʅ]AGI?Ħ\9o=*kZV!9|J}񧟀C)/ PVI*B.lwKwR&bkW_̋imB_lhrIMkVP ˫ 8woO*ΊxUw _Qj+})`sbbM'XM(7ĥh6s䧮/D3cdA jYd,H 櫉`ܜg{],@y5wDAkI*iG%A]-h%t$T/ nkN鷹PÓ±PY]x:)hIV赯Ӝe:uDy |^<*2RjWtDUl H oZUR)e#:Kz W9}3ItDUQ3Zja+x7+YH{6؏d/a? @/UAWfc'p)ԟC8Ns]\z0r h1 \-=>8Lw>5[x34ܻ+χW kxhF9?^4';әw=X:ēmd1sWW@  kЗDe.G{ݷKnnlАnTwm=2/~g OIAmi| XBT6 [(q8iIx=y$_ c0)@,Ϧve gxiOW\||4?9.\D/|#J eg|.;3dr:vW/%"_G>O]-U`Ur8-/3ǎrw?1ƍ T=p[~s ,Qk1] 2㼑GYNൌffh/h-{:F暱 i->s0̌Pl=oaѮZƒ@/\(W+<+z发S SV 2 W?\Qݪ-vvKDhtm❒g195X;^ {)+]xu~pjcAlqu0sN쀹\ S]#;>澽h/ӕϗȩgs&ѹ2'(Y* oX4Jߟzƭ/[Re%Y.RxlkLn.=pMRkD=Hl7 ;U+RhhA4R~xF--PWU DJZMn V#1ѮnK`<Ç*|P x+=g8 A b\6NEqTiS o*ONͬ6Yulֿ?eM(H_ !nɔK JQ1;b_?pXp!Ua҃7xwߞ|eߖ]儁Z }v+]x23bD ) 5GS4P&ȹQu埽l{ׁ_8驌%saG7q3bdgS.BY喪 gm}p|$Ǫ p_z09͛oڕ;ߜCr@þi6r#aoZ"l)0N ݲ]`2d # >K'f{|;V hJLPudUornI#3b=<GF'8+)|۷B9h*#Al)W*)DzP0DKԭgLbv&A n F#(ҕIV gѡ/ FbrsF@ی(ęc>VjE9Aըr,t,x> lVެfA)y&8Yᨥe)1:yr??F ~Z+ @'U@X>Ն΂y4Z{6@-̹="B}UBax..{idQp"}U/(DͿ簨$`u^>KX3iR;8țNlCM%ȕ}th"Y൬ƦA͔4U\&QyFմDlӍ ,xD?>ciLE Ŵk^ ZYGIw$ք R&,j| OeEt[ժ@z Ad4vaU g_$[%ǭD4A2؜oj(wNޒロD¿gtTg!96ECMŮ&V%^VqS#&ⰷ@'D !+#bAʊʊb`P(\6>g\ѯN}cޛh|$鹧طO#g&="';k`μ?㜄& E ܛXw{sgd ǫNlR^ݻskI7~sXcˀ^t!#1XAK|.'n fxx ;^Rz=ˀtf "ֳ61rf Ta$rN(U.|EF뱈$QҝJWVd8ЉB6 )p? nSx5a ߖP [ERnp˟x% & w]tjQ,遮<0xY~=%CxP}9[ O~1aoduE2#)ʳs~\h .)!x($NqWCjBUڹ̳WgW#W/M7^m^þ9s }3P7OBc8YwKL=9~q`3pz0"a<;#٢ݡU񔣪O~cp]$~: [=2;E+b$ھG{m`eV p!F7N[D d\zݡ[uƪӝֱfeh)Ecpq2Igb t}\-O^!\@-+[Ϛ| t"5 NU֫h%Auc aj HT)@i9Ւ:yaQDvt*[ ?TGvw{:̿7>_XfH;e x:'QC?]@nYvv(aqxԽ4$ 㜋 X©71帏@|8 4Sx8 3^\&ߞjp\i#HV?te _;UP}$~d3gyeMﱝg]V4HcPR݊&f3hO߆_0X $Y:_\gj=&Pզ%#j*R`vb市VNv4T&V3i5G^!O7ppGcOŷi_: 7%,13)'jlIRQzmA >@htlSG}{]<D?]j{}/T/` j_@0 TA\ >1Xl_:qɓ؝J|Pܸysm=W4c'rj|IB&Sڦy_Lze&^Mt)rA7E] ǸPśIpӛ~TλT^&cմ̓j gkP,(&H%I8$EɡGl~G x&l$!$I(Aq^h5%1k.'\!AӮ0H ` G$N4skO摿ULt6~z/gz X[d3Bi2=o-HEҚO`SJYz'h5 fX. Aȧ,kHR8';eu} $L8 D@wh-EYeV .zZ]..bBx=ˊi9H͜vSJ:e[)!dobRl, G4)!-wԡdmlXKJ4ݭnix$25R4|/s8 ə'hC^^ac.RNڶ4-nR1xFtv$wqޯs< a^O'Ne4{9|1[p:SO Sso=%</vpX-m Ooݝ_٘FƍY&_[TRp{pBKI}dЩ`nW![I q1Ź906N`[㞩J޵eH6%fvg:*;ZovUtH'N~hn(" YP V 5KԋXK1wG "]X@8d+~BQxz{x# Ii;QF^ wY,Ĉ5O5ynvu[PGQhD҇Q0^#st`ÃoNvN+[x5Nи-<%3 8W^#Suw)’`F:.Y4W/@ 2z]8#`8p`A<=^Bcu~,dwBz*S:/7FOމ4R;nܚ95ܺ942E GؙNTBI]?k_< a?jҝ:#V8hEXASq AFgwVMJt)5}>Vg{5U/ i BpPZ0hڔLsUbp>=CJ_J})ܺYҼ6tO[6FJ+_v ˻6lɐ&Rh:86tډ'=8(j}2D7AbICiWI#z1x?Pq?44PvyMޫ nDZ$S})d`vsJ|LJbf9x3EL챮w%:75_ؼ=u\;7 oM}ƭ  Q=CW*=g:8dzx8~9LWvq效VI4c!c0=3_,׫mT2]Gl[bzunM@1ğT^?۩F.b2r҆7^|D_tvTIWJݮG͂ejxhm~|RgMAU2.e} l!?>1p'3FSo,HU!vFfDQF6ˉ_=~q{P6nN'3UjJCGTȓ,`p4G`"LUs]&"=iH,BO(g P$=xٽ{dQݪfПG UVAp16B@)b`zNLōYs`Jre~4֔*k e]Hr m͜L'3kZ\*cDC EڕD)+u^.J( p"hXa5a (.Nȳtup]=ߛgrdcN/p;CLf=BFQ~4d3۶ȩc\L?dw4'.ߟzJ_'OOv}[A,4 +;Vrgߛ?X[[Ooߜ{My_~c] ߜ:T KD+ˋULj!^?u*S͚a H2Wgwύ0_KilIDXcmp&e@'C}1R8V+OбW\&1HN#^?(Łf4n?L>#uwӐ[pg4n9t.}YH| uMM" j @KdWe Tl}) ʖ2H-e i^fb6UAjkVU 1DVP?t,@@{^&jRwE ' aqj5~MrŁ7ԟWgui{p<^꟏,P(IԎ3Qdϟwc04/n'w6' qc7o gwD.lNY *g>VN'.8\-3Ͳ3;R T DTݯ~mdU.ݪa<&mi/bTNdatnkaԅ%wD)]bЛ)FR;ma]9E'fZd #t ROJq &*dV ySLjz5sVe ,h=x9~Z)ݭiam=7_z9^}*< ,XQNHVO S H򠫱/Քǘn]6K, N0@=%\mc qXF%)j["ieW!yYL{J&܉ޟ{2LY-McԐh0z}z@AV2~^ 4;*,A&z-ʀ!HLɾjj =Sb/W^$aw9xŊk* NHFtr8[2c/b.zяd>-~,7ˋ>^dvˊy*,->_!S[\-K{rH9@nO-Z1n@or 8X1dL@g"mr9D<㱶#blj0BV恪MWP`%o ʷ"dk%О6\3g f8d}72fnl߯N2T}VƊ'j };;l[Žfl SD xvGvۊiDtC5V푀t$!Q> uS?봠ij0<7Q&w*X,|݈S+XMmysʲ)b ۃA#hN7?]t w9WvUs#&hãKi?}voZ_[*A_QE>E@..Fn=k&I:NUH|bm)V03TE=>^ o?;-SgYQ<cB%0rn ^!~~Z-yng<-<6Wj誐)D_=!]P/E?PH))i\mb(8bA)@>A>3'w`yѻk8߸Onz0]#KRi5#°=TU4i:#noz t8_dlz"8Ȃ߼%E 62]Ru6pB.e#wW8dk?qL(BkKbEi )k2͹]@Y[H ^ 3jQ ]e; -$UMh}{n> mT{<ʹ4^G#|B֟#:1 ~o?ﰍZR5[(LגI,,ͪoРODiIOv(5 LكnbV'4B|W2Ļ5>60.r}ϓLihU~dq27^=0>xL QO{ԋ@Wg|?-cZv\ba@=<~q?yq|B`eGlw" R](hf1G;GAjF+4ǟ*>TrxF p vl}زAInZ.̗qk\N y Z!ͶvqUV9 [DT{te 6U9mZj4pLkPWX.Wܐ9/k֬lP5_|B#oepBk}.Sg.C^pLAIfTLg pxZC#CQDt]<Vl!:rfzG{G_FaD 'Q><ϼHˁζc{ {5ezwZ]O#t:d n`[ZRUnX^T[,EX/. {2ޖsfNƈ!&glsFTXVHSq/0ȷ =LQc 1$a|@]eAcT=On:w͎qI2KjkͭP Ә.@2I'\SBlmovw}{inаn2Icz!,WSǴs(sAXY>G>=;^X566D6^Kx%a&tZ؛\&'j7sΝt24:FoP?9= I> <5xd'IfW Ƒ6~آ]ᰧ)x1<0ģJ3$N1pr[/u鯿7T&5+Iԥ,}Z *" K^\*|/4wF!&6\Hˠ"6m`5Rvph0ʊܾspt$,OUR0*e:$gJz=G cJduh}#I,e r)-T[k]|H[O<>x߉HNTc5WЍĿ YiK@vn 8zqXΚ snn. mc&$0{0|BZY~ُ}.r>ԧ!>O]Nfm5ߟN~yjj_2\>]-?gy9$,@L̠~ d`ׇ/oIU'OTjF:ǿ--u3{}^@I/V{K}&v'u^loͣ@Ұ 5 %2 obHl|$cD OX d= 虪Ҭt9fȊБTv(E :ȄcGS1}UWLTW[3<5c񪠷 U_1sOClYi-nYdx$vt{d)V&w#cѥdm ٶur牄<B2 i}C_Ņ:whh$Z|ͭxs8?1i{p;5 LT PcUA;rFڼl^hauث,HA 4BT!AD*Od32}ɛ71 VD";m$%A'kn (=ן}Ll?"JY¯Ҁj/ >Z/D\bFA̽3^j.|U4M"> 2SCI'=ΪI{Lg+ |IXu AcTt*[+䩊y ӁBElT/MwpCҐIv6Kc]FIf1u|60~^#Xnx rwMV=XKdcYĵ<&beN]|1 4lu{9"ͤݸ)1U"l<";%v~=IS_ j[n6_! _3%!S-38BbЖq_:R0oO<Ӟ>~iGISDVSHY)tc]eWidbi4EVs_lDN=ɠnFץc8tOZ:9|Bõ8Hvδ7ed@}!;I4CP 47֦(< ?S\OC_Sؙ͑pW)ķC=bސW7G fqھ*te]ZYe;p~:@}YF(\c M\W2#sym$Z(mo6qwXCc'V ǁ)i+03{owY]fe؏ڷ˩Gժ5O =sA_?ϓ^hs_Kf4~*]u$ys#jE]o/-QӦruϷvjzB$.8Ǚ3_% HK~Dm4 ԛTa8E:᯺hxgЈ@ J#Hrٷ,k_#W+uO!,NSeZi8Nm=EGm:4 x`ރT@<(3: aѾ2bseGQ)_woy|Jʫ2P\,}|,KdM:XzHrgnNPuJPuI{}&+;~z1v=%8 4p▊`*Da<~8!~oI6BΪ@q /c' ;Kfb(\ S="r c#KAƘD; N_ e f,$5|fZ Nr'-S=^ O}9hR$:P{T Ug/bt 7~^%◗s~Hl}(M.o{l7#~H5U\ST{ ҈e}ړQq58{Q9RQbsbcO9F0T;9ގLVdQ26%C&ê9Ȗqll8d{5z;px|u7Is4NYW4۞II:eDҭmQx tvxt>̜Hpt_f92ILuC!@t'Y`f_/=]Ro{pZͧ}rF紈ӡ'Q`D\ٖh0~Ib83dqǮÊx_1? "QP?CFafYWqyiuG]2@1'./} Ūgi"%P i0HkOUtoG3! fU縉{ڷR 4a;b{^r8:CYWH,{;)}3S5ȇ7_Ô'O ]ID=Q\l.2C4:/AD25fojW^B$ }@âBC5!߹Y[D QZI(`&.4p`iL$_ͯ'ojj$>tQd=Z$Jl\$Ċ!;T۴+.uQZnfP kPCnk>zsZCA1ka}+H& j-.,$ԯy pbOJ)X7 ["t2 _Hxd͇&u۸g` 5x~_PXg{tgs+P=bKBG,đh6L]#/e)N+W2#~zcP,IMɋJI `eLt1i8%Ɗ3b L Rm}rGu;}wS Tw}'J:-ꙏm= ĺXx؟_JWKȋ1ya|o]xb d49暇=?'NaXO 6g_:')7ej^$I;]EKA0Ku: NL\vC5c? ] REٞe(|)xVKP=<_q6ȘŅa*Uq~}!c<йva1ϱGoFc V8;(;O\Vl'2qd2(lr8?Rn^ mVD.}p?.SOPj/)h_ tQI r>t#Yu6Liz$$]`W}nE)Tz&/)+kڅa CZ SW +Vnt82^uS#7C4VwCK G⋉Rɹ/co3Vps.&#dof11znҶ+͈Z}u/߅W=-xO^;ONU זډ:UOj[-GXia.~ @[κfCMH+x[1l hr߳y *vB@>#wL {U)~Qj$|1'I(w&n6> EMhL^9m!W0E-IpBe~Yv& 5XV.'."BNu~UW/q%˴7\y#O'cz|Jo-KNvӤnh,nFflj|OP0O{AMf<jn.Q_ pٛYfxM&gQ'ׇoP_v.\Zmk-- 2(2RD bPT_Q{?uxȥ\c 5CM `:EK/2ٙ #m< f]SM%q!E-FY3_p#rvξOTwuO3G(`'uywL ^pz+̈tIԟ#[/L@f2 7etbɗ8RcR=Rtf8vVns3]\^]Vu{;ŅI!-/-ۭ0g@t *YSPƥ_tuڷ+WӏFT΋;NuZ׈`X&4i4 #+#⑬ǡF DTpé%0+H5qIP1[ij -8Mts,(ldOG}$UqeGowd:Ϣ9FzH&fsMRˑHͮr 1|fo^PgYqiw?^gNA兌u^f﬍5CirEߍ{ &fj}eˆl/Cf%UdD1Ɔ=,9 zOR]}h}e,@/ ozZnvV ?Z[:q޶EPq98 y0z9jG2wy-ie!-Nm!Lg !PkdF4HE尣 inCG +Zߕ:ɢݫn-mDd/ Jz ZO7C ٹ)n~u,w% ZˢӼ}8?0 C[ 1u<,\_OH1./Q'9Lv儰Uθ20(IU*cc)?\I_bs[ ȳљWa!:cu7M9`pg?] ˥^|wUXg:P+}ҋ*[q~;(+ TťI.o7 vSqp@푕.4vLAgnbαP!@tW9`Σ>끯T.+4.(o}? ~?MqGBE;hLT]t )E:G`*`5jR[-}ҟ;Ȋ>v{:x,QOb20Qs<0NQ13–Gn?tؼM%S,86,zY8$k'ȑe&q7u`Nj@1[<@TFvkq2uܹF=4,] 7UJ#y >-AE^}QErU Kަ|AgFn4l'I1^w2pmq1"`ziv*0*=iW[^\_G\ _]|VY XiH'FѝdM 5Ñ)̌U0J  GE"89~:NM( J{"cQD[ΐH9CH,Y Kǡ1A+33'j~ jzϿG~8fc 멡ꓯR#|]a;HAK훑#ԁKld4;QQ (E:y'VW8$]f2'M?cCoar4=en@ty hYd VL};̈́{3g.K?hd6 DjKK>1@,b@ b/:FY5vܕrî\[<=_\Wq~^h8> UudWX&0a"^+h[*Z#X-#7䢔13 oݍu3\ ~: ]A%o$.OhP;fX͑O7+ Ћ 1P F΋⟎^^s ocS/6|,5x(S FA׳KxAdVQ?-ޏ,ů ۙ钋s( !p͡'- y86L=3yVg{ 2g_-_bi2Կo*4 S=t( w7qǒ^?,,HYlsdi@)0:Eaͪ>S_{_ ,ZBNMm|g y< c%UJ{P=\Os;0nS:=wmFX1"- xd&e OuW/uNGNɿ>@t#/ޝ2Ii:};1 :DraS3%i]З=WrAaEegeϋ@E>OUPQOd<S2cBtvO ɨnp{CknQ&e2{ڐ=FʨEK 1UsVQ5 )~8F>d_ wɻN3Bx~=xM/i* wF X̹t[ :&ԉE5gЩo:> |A٬ }8 $9 a$- pi~(00LdStF@N~N? N9O֘}cxϤˌmo8sÃ~3Yq{'BH,=vl1lclٜfi%d+2H~0GZ7#banTkfnmH Ĺa]WƐPivJԢq!۹$mG [4MMLAۅ :gU3gVnEzܙ g{T8)q7U`֫E#ӤAl*vVff? A I V5nΊu9Uh 23"rDO 4/p˵jRmFW_-/Rma>qnv}͗w PtrKZp6-ՐkJe 4ߺ4O_}9wO\@iAacf{spƶC$Ǿ(=Fjd&~hV6p|PLg2Ԡ LJ59u9ɫS?|;+uaWz3%xSp5$0`_q˱ cb=W#I~n'?<෴/RZU1s&C_]ɡB/M}7lO o:A9f 'N,V |iKaR3_oD7*Rl!מZᲠjnr9wjU?u?*/ϧZgUjwa:0kK \g(f؟^?$bd|Upb#TK7Ǟ\ bH76ZҎ6:*̊OŲپy9`l2{^j>:cIk\TkOܑXlfEY7V]ehJFvx0P\H5/&6}8X~< ePj>UBI+›QY:H"iUq|J̾>Ɔ+0̾iakg/J/,Ĕ5x7 eq6> ,{hfb,eH*~f֐pbvFg\]+xh.b.12=W.Yk?W̃,־jZ?T s@5ŅA/׾ůQu~jK __T+xAW؂6"~pvi+8>N@Gɉ)si!|ڌ{ޚF2OO0Cm(%zoTcB^\_UTˇ쥮 T1s&t3)sY޺;@ƅ#wtHC/u{_#3_JtÙ.Չ/+[yXcwQ&d232c~yxŋsD&sNɹXZ6 ɂB0lam  @kFޠ ^}@ &&3|߹3ELQ%;ad;8eCMsbܓ~m@5kDI)a.aۺ?yDThmEg?7ݏ~h\6X"j?O.gG}E|d}W9.OEt>>rg#/_=^yuVgK)p+ZOz&FI`xΛ)WKi}[<`c#ԩT6^-`m8$ߙG 玄 5_H5~486#v?w~ әi/Vm{ -&-@Ґtx|fټFmnNDՐIp41SY뤆bx@z h=u=H&n]D>=pyXiT.~yoMo.LN g㩫燦3>%Ѷm y!ﺂԞt- m\Տ-#zdMjq~ަwf0^2O[ݫwezMa P?X]ρ碧ܟߜ s`Э_y2taWgjwa?'й`vv|رVYWu@.r]٬L`'V1 ;&sXJX|W k9tcl?;Mm[y*F4' kL oqp?uė>o4=ImEJcOeřj8({cUOe==In%CHA in;H:ky‹Ã@TEֺu5ҵC"wo[o3̀ 64ϳ[oj_qp$c]anJx=?Xhh`LA$h㯭Y_{(|k ޞYr4 blcv/u|~߄*"UtOY ?:֕rjTe`P7ex8Xʈ  7K۾jt%WͩG3s wN/r'}v)x}8 z:,9I` ?NREӹc5*?i~7 +)Xy}lR"}M|o;X&v$^W{ǣhT@$sܻze8k'yr}F TB{yB`]wv@Q >^ԶW& 9ܪYpn<,_Zx=;+GMG_L~<k@FkfVEڜ63ݕ3rݾN 9zLT۬X_66x~2(itF8~-VBI8>v=̗a&M#P/L@DQ'}UdLĹhtr : zl?Y,z8) 1؍`bgDmRP_'N|da[xt}G^,UxcͮOP6:wvxԠdQ$dhݣ);tCNԕg͙+ԣR7l!;?%^.<;~N|0!𯟞yIq"|:OD(|c#z-A'H?]q'#kt7.r& [}s)Y,/^T W+p~es`P;/oCXA` !}n Xoi|k7+ON]ل[MJoL:/0_B1ߩsx;׾0_5ρv;zkV ·S廫eQ}MG]F*A.#KP{GñJR@FHI3 lg,bZjh%vB4U;lw+-qd]jVn ()5D'γŕ6uA|cyGb@{Cmk+Q#0z ̨{2\#^,W31g@ 6Q+j #^fv*ٷ?Q8,Zr'}]# {{/$8Gݹ~Ƈ-?2=rf Vc 'gXPɖڡ,ٝ6 fy2|8`I8?a"6֧]/J<˸7$]pp)G+*+t<^wG"^R;Ƕk\q Rj9P D9 ow9-wuY0Bc=;vo$BXQ7{/uzL A-aBgKWvd~"\ƓhH~sthoNK8,5}rכ)KOC^LꎣԌЯΦH06O/&~觋a0>61b-ĿKO6`E~rlv:N!uo=`"U喀զmY}}lS? ߼R5O8od$Zo[:ÁgX3Bw} ;Fj ~GkɁ׀ autwŇVWRys7%v[[PX8 {!g>*p:f:%:n|%\#w;5ץ]B' Fm8͉uMC1EMRUGfq[J4dd .2iﯦc$XSpMo}==ubEUU_qSGseP%h8 Gb-r92Mn0ZdtVuHLj GFVE$ Ȥ YuOd5bN|AF)E<LE}Wtl& 4eEAD%O0sګ` OER;O#k(|?o?+&u93r: Cc,/3x#: #7UjklH 85<}mˍ;nl>E?|HkoFpcVf 6Y: 94N(>>yR+6ǹ+ˇgq”y 7SHa_ j NT_vjmv|j`XeGA{ds5aB'u޽72 b˧72C>׬2I8[Ashd@#S;jt7鮊b\U볁ru:BQj^LR=@N]7IQO2Yh(vaϼu(:-lV8R\(9P a?3'hOXucpE܍mS$LDM5P_dOڹpa$D<Oy`}$7koon}x$;/YYC d_Ә.Uޘ0-Df?&&7y`iͱjԞNۭ&m?VGɔѐpoۄIh2֖rusx N0Iծ w>z f'-o}I#EE؞>ǢP7@vA[ یJ\N&.Sc2MN@QLcdҨ\WjhQԎI+?ֿy/菿Oo_8gv xD X|;O{s{~M|JfZi2\{RZR9YwL V{ n^OT3B/o6^EIDp**iG&&-@,[,<(teQ:xdׯ1P#VX e C6Pdny@Em#Z|YZ+4"b lcSCGzTi'?S{f8:dEŦ6Tӡjns=Ф'ڧ~#A"+H),dt&so< ~1J@2{yqz<=b>YEMI+&v9 E8G`3cydy#gq"3`rKËGG2/o?ЭڪJ?ެַK ҉nmʪ]XɌ 5zG$\mu΍ y@ֿW&1 nOWJ uo~pu] 5͇p"f2_.G=,SSN5}G0v?{3&[=Ȉ1Ɂbt؝'q h,C+-4O6IR Y}O,™OЏ\wcnd5 ͳښ$ir)[S:;[]_-}vir[ta}ɥz3F,ysc>"_ `` j%q9AK72YJ-y"? #( V_[7{Ӯu&<)? |aBtZݜYr2knosbH*Lsѥ W  kЭ@dklMs;Kx]w(ފD9T]ņԩ>jRlc$%G{Hw 8˃ -vFbc`nّZJaI>0bdPqʽyh*d`Kז"9hu8.â+ h.AH)i)xX;vɽUO2sHvM$EI{<}~&>(Ⱥ777ϿIG{@iX G?$Ąs^0xuFυ7'_+2p~pz-O2rz-B_ +ws,;۵QkF+[xo®#O R /`:/ɉW66vw^-Mqb4tBdbՉtrEO4tܡHt ]q72bIO(ã[LÑGdKDg'6#/f*F`s3hZ3!,]jF6wVA QfxtKɲimrWۏ=[>mC~dHho$$߼14ж͘,?Ov>8!-ҙG7JY$77Wv\J-`tFlIl&4)dJ9[o{&S^H2[OTېm ?lmJ,aEC|~: :mboפϏqELD_Y6oӑ8D:k*E譲Ǣ=}WkwSe;PLu> ǰ[=2 c88/G1~ju&2ʷ5c͡s?gO<~sg#7`FoSsl %GEn1ӑ!_:g/_ dCi*o)4精;CwۛpϾPnd) ]1@\@h*yؿ#`EhRri#]M` nr)ۛѺ{gUA~X^0Wya>Z? v~  /";_!R\MBU cVGy{|!۵]Ҩn'j,+;Z9u07^wT4yUcmnHU;bv}k`P;D 0ɎeG[lxԾ;a7}`uyi/N)d8)N~Ϥgg|L֍U J1M'y~Yx߫C~fiC[{#\Gu__&WjJWoY.yRSUn91"oe;?3UxKb#8tag 9monA_W~V)U#<kh (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@ (P@&dxG$gp]hXYCrӦ6GFd7mWWwc=Mr9 w#au t]$@Cg*rC!Ш*"J)25ΏDU9`I #aة1Cٴ3f\hBO'gE]O,D5j/C43LAƟXQ/!t;{Gi԰6|}lU'["fcLcߓn.5_mu6̦Dn4sjcm+۶N7*rRh88⺅z3x:IS Sק=kP6X8 C:̷JIVzZhxƳݑ-ҭJrDyN붼ޕ6xmy/=_%O?7]x&85!xuƃ+[k;rW=ai F#_9e)${g̷yZ$2P [L}WZž5 UL|BR=Z9ꎡǧχ;3 S#U Q2VZ\1] O`[҂+ƇU @4Aɯis2#e\f ^ђ˶ʩ0jɋaګm~/=ܦOTuy˯{xeM2Ê+:p,O$GRCW_瑼okXa%qp4V!V xqM-v ^V/>~|1|!W%h(-P-v $;1ume)mȐu G& }iUBTwbuUyG 2^p"gBP L3R`d) u@6|jU :5<. ĥWƮkxzXJܶLTΆ-yo_;F)oŝZ,ʶvն=s&6vlbCgdk<^/@T&"4da],]ΧT.W~ZC@ zSCWCw[yy,y:\X% F!)6>4arv̦+0vd s[k ߞP*T]vVU>F$՛Cʮ]Qi9MF:)A_<6̏cEG~l%~4t}}I路mQ%8_ơQqo%f?ppyjuew}mUSk.o*"+ig[нeY&,?jcc]$*[JWzKdm߲Ji>x⥭t mBw뜚ls<yxE˃e~}{eqQш> \ZCze_ EWC!+iݮʹU"^e /Ľ4] Q-g nSݗt5E2 U~l#}j-T}Gw-1OdD!D>V^Oum,lJ% k־uCӶ7IwǑՑ^Lo__6Nv63tt Y;eꆦ@?}> c/nte'Zdy˰@mͪTYevtRХ-(Tm;ԋt}׶vzUr]SDq#<ҝW^h֡y$fAtDul;q GJv|niVA]Wx2Bý<9fYO׃ J~7Hx{k1m)/&};^]zY.~K'wflr ߏT:i:vړc}&,+zj]klu@S)8uŎ޺<ڐsOHDWyEH]Kb=):iy&Yl3dm[V]5?0Xռ0r_ޑ"/֗ȋ7HBԺ`D3D/o~ Eb=!z+;*BVa|nkQj Cٗ [-hN~bpԩm$(iH[Tm2Ǧ!ZHTKyGNլN-tʟ_^OE?>ΉGT\jmx$4UaC&`)lc?u^֦݊)Mh!M ?|\I#7Ӯ岷?)ZD~ogW̃P0t*l9t/ =V٭t/P4sf,oK:VZ64[r"SK\lv = jyTcTOBoO.{W_~梀59=U.@Ѓ2Z?r}+n%45 \*"N #:|u%xITu7qJdcn1͂cwW1%)hh~نQͼE &j3MSnP6[aѪ7j錠n&>cW.g)YZ7y_UhBou$ΐ#:0KE]&f?Gx9 H٨k~#1 ϯh۬P!.` [˻t_@QXMs8yaO+K&ly\/{Tܚcr sP!<`dO\aCqoC.6ף@gA2CJ᠇ gT}Og'\q{OeG:SR\!>QڪQLڲϼ9ka0bߟ6 fRe:<, L69P-UB:r /CY %U d Ό4?zC' j(`UYPD̟Uv-.2͉ KwCkOWf[#9a k:q.H)v\ep͒ E49[23:reNW_q:É׎L#[EAIpj^ BmwSUVX A7ZeI7d bsY0~,^g27]=/CEsmWhUie3,W)û+b!QYkD~\@FT[H(s%*Iu.-*IZn;25(&w«G^ID/}3ݩxih&l&8UM|({xqBd ga!A#̂\_ o{z)M .}y2~2c-R.0lG03xsBLuQ ڂ>J$bԓTK#,3Ngj"N7$.}'xd4,ajyntk*^GUmrmE&dθ>z5!{*AGRF0Rm, x@XA<|pFA;QGKbdziLH4  8nsPY)Q!F2VXsU$Lֿ)ܿb-Aޟ4+=V; FI F4=(qR|ң;u-M^ᚑ4ʀysNf (^`!!+LkӶQO=v"g 'nG7]MF./ij$$QPn+$wj:L<9Ĭ?r.l&LߪT룾O:EH#.4@ !Sߝx6 {yLFIXckE/t^#+{!֩ҵ}E-2nubM7OǧO}tc 7Ggeq(),MOU`<6z5<R3gziόctzdZˁ?y%_xDiDQ*AcThB#Mh$"LH@6DWw:D"N/`+7F+a >݅+>'仳q8si1kmxԾjym9Nꩦ1~jǎFݧ#-ޜ< rӞ\i"u>ZtchY]b]LsBvp@]ԕZU2ق/;&O*=%Hvu/ښ٘͝㏎wi8uA=JA2pԽыoZ-X&/^:A0u!f%U:wenCgy<4y^oOK>ݺu,(rC3'2 G˕n8=Ru$ky7ch*e{28|G6YT$q"h~H,OgAQ,1,0U[|9{p d;5+}_iek]Şr__dq[W!ޝ -*V#%6.(@[.Lzzv}CřMO!VOE}13YBݢ9gJ}hoP|Lgړéc S3]qo~gG#b7=WHw aS54_yuJz}Y,?Ҕ5iuI&|Ոm`j˓ P."1t(eDP]ޑnb..r5_\yΧLWGV #yNz-7}Yk[+);ՑET,-/XXY?rde.img.,ބ>Qjj?S|^MTN3€xL\ăq,[P$2:e:~p:3=ttIk>l66 LׁɷNII;,<X,?)U+ۯGV/GwS*ΞГQ ˃Pɗ_[\pQiaStZm/CCM% <3^8ILoѧm#&^CfΌNseO4ě+j93ـF:^OB:Lna;4"&Dt6<>_c!3OgS'*0е|C*ھN.}fTH}{j㼫"XM6h`˲65".P\lNd#06_ulACGZX38A:'ΐzyw=X7:U0(D̆-#`ˈkT-iS#Yt@8Yl\6[LÙtMBf5siObn\~o??RNBQʧˎɉԱ|Q(rgڌ\9^մE&XW}uxҝon\Al%>gCQo.6;uoUK̈ŞdOhasgחjoo,yswPeKgYZW?rk;2iOiO"fszF:^u~ifLvS@_df=uǪkvlZȁ Z'H=bc{vEyKB_xKܳtZn>;v~ںL w$I{s*d=TC|S}hӭbGZ5)K()ӵm{6y* /ٻ5Y_۾419uD:JW_TF{#eLi ɛcܕ \o|P_=T]3݋oJ?[xZI=WG2q3ү_~ˎ:T.&IZ?o~}=rG@ 6PQ[iF.6"!-+r576Y& m0Ml,t`"E-!%V5a[53уyЛS"CSǵ"dqYWp12_ !>?*d2;O&4G)kÔw bM(ŊU K6zOF!$M ۆJ*CxwcU-Z$W8YRGcMzM\%0S#R4(V^(SooѳfϊuX[^ۿt.IB>FZ&؜矎 utm(66I-fi_̍yjT&DLJlBƎh5[^[iFLeD]Yh1V1柚RjfW: $Eu_n 2z U#Ki?b●$XxnliQQC%a"'_nZ cG/-d?i+i_y;i7cڟyu50:e{a pS'^=@`c;_#0\V.YJw?f8 a\Fh&nZ$ 7}ۣa{ڧ)tI;dPЁOF_ Ie?ޛU*i[\5] Tӎ&JwfaĦ?ҟu ί?%> +CxIsg~\8WFQAb @c(%Jؔ5e3RN*ėTs9U>Kw㿞E[YZdM֦?>;qezaݕԇFĮmߠ=D1clWd,}9ԇg|ug.x!TmŜlmckIg~/VDl6w<>ubRGFwq[[40>N{>ڲ[2mA&i?~Yn!V m̃eSa`FxdɊ*Cx.l;Ht^ %6}Cǁwbyf #p_eU$"owB %tu-]N򎱧5+nP}Ǒ3?'IU֋'` tx[|تwMݤ7Z]ٛҮ%l "B®Jy/#_c;=2כq SJwp,|'?H!uĿ{E2.;|\A}rH.^2[޷]'rH$Wڎ c|{EKT?o*|_}bһq7Ӟc>y) CW"׿\[ Ŗ,qS7MgI-Ė Ynuq󕣶i2ćw=[jTx:PlŰb[Ht//w K岫|ѼSP&-eKT3i P⊻'-k_i֭!'^+mu;Be<'\u6 GMGѬ~S_Il~p ?¼VY 7-j]kѠRwnrI'|yʡF5i40$ͪ izht GM_OfrvM͸ӧqdwl.U4԰eq:E'>i.w]6)Gq_eߕ/.8r b-oTۃflE1o:مig"^1o-^:ЧCd).'c`(ofDvdy1#"7U/;_Md2Y* Ti$ֿR'^4Ϩ@ h։eեfLPQ/pQO|2z\-7l^0Yҿ?y#S\vW[ÞV(},T•9jLeJ0mEE]OMf#Heh3؋tanD-B3yb=^|x$b2$΄424bɟ[,?aeLF,_#ͤ9mc䋑-ʕW3eG's;ôga$ٵ;]Ib^A$_JBہcϗ,{ulW`>qrxձx{lU{4x5MQzۼ^X-_bg%TK'.:ӠK>,\ͩ] 4ys>26I]2Lni"f2Wɗk?2:A#կ6h[Fe=/`|wN7]Y2Q-x{[dfc]W6'=KʲLIOfgc{-VJ5rZ 965]/%2{]}{6yMuߋ姑+╗612}1σ|*v- =?7ڲ;kjo#;c0)*.K"er#I$ځiv z(Yj:}U) eyD&yeF˃ [2_X!WGtrtT:-ĢN[robU-Х"->i9^K}}Tb-mGFCbT5"Wt_\"s3Oeֆue\f ae:Gg &Y~1QiZ;ʗFj'nll-nǡs}$m-+S0l.7K_?y_,?\stars/inst/tif/lc.tif.aux.xml0000644000176200001440000010777013777653456015705 0ustar liggesusers Layer_1 Red 0 6 Green 0 7 Blue 0 8 Opacity 0 9 Histogram 1 1 Land Cover Class 2 0 0 0 0 255 26354184 0 250 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 71 107 161 255 2699704 Open Water 209 222 250 255 0 Perennial Snow/Ice 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 222 202 202 255 276905 Developed, Open Space 217 148 130 255 681953 Developed, Low Intensity 238 0 0 255 423575 Developed, Medium Intensity 171 0 0 255 65682 Developed, High Intensity 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 179 174 163 255 61135 Barren Land 250 250 250 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 104 171 99 255 0 Deciduous Forest 28 99 48 255 4488931 Evergreen Forest 181 202 143 255 0 Mixed Forest 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 166 140 48 255 0 204 186 125 255 268166 Shrub/Scrub 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 227 227 194 255 2800770 Herbaceuous 202 202 120 255 0 153 194 71 255 0 120 174 148 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 220 217 61 255 261221 Hay/Pasture 171 112 40 255 219027 Cultivated Crops 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 186 217 235 255 116186 Woody Wetlands 181 212 230 255 0 181 212 230 255 0 181 212 230 255 0 181 212 230 255 0 112 163 186 255 156312 Emergent Herbaceuous Wetlands 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 stars/inst/tif/na.tif0000644000176200001440000000137613777653456014305 0ustar liggesusersII*   n S    Vf??fV@#  mtr@@TXAWGS 84|}?>k7?b?&>G?ї=+&>:e?l>i>P>v=m?D?p?|>?/<6>sF=AU?>c@=ҹ>N(?;c?>5V>hp?W>A>E=&>İI=m>Bg,?Q?B3?Ca?\:?"$? >c ?< l?T>7?>=F/?7{?2??W>JSD?(w?q?j>~(?-7?>2?ۦ3?Yk?5o>?m*?_? D?>vf?6?9G?C>e?z>)q=>98=:>}>%n?%< >ʓ=!>;0?s?/ ?ī=Ef>5? 9Z?f>>>>stars/inst/zarr/0000755000176200001440000000000014576033423013350 5ustar liggesusersstars/inst/zarr/sic_daily_sample.zarr.zip0000644000176200001440000055777714576033423020406 0ustar liggesusersPK p>Xsic_daily_sample.zarr/UT eBaeux PK6\>XU'~ sic_daily_sample.zarr/.zmetadataUT иeBaeux X]o8}ﯰ<6ѾTR6]VrlN: Iv>4^_PaI$NćSÌQKEkLTJO~i VrL4 E7h'© ذX/.6ae0\]߁giH|T4E\bN+'U#By3Z* &+v! \OSY()R; h0 +M8"dW/I9RA|4U̩/G#" Sۓ7xfD&iNL5h(k.G۸ $f5 h1|%P+Zy"h@r r"4(Ob\M?cFIF8QjK===9% V5D5`5OH+W7wujrK%нL qV=RDcSO\|J^&N]yq:Q0(5]?PFeW [1K5n2h4^^׏ }֭'B0n5K 鏕}AI37وUd3OS=Iߴ,3eoKWu-t?E?6mRrߙd<%hս96k)&3ok޿Ƿfv˖{Cߩ・MJ&6;ՀyidaXCa0'~{zm9!̴u]j =]O5m[n$b½%WS&"VcLD?SqtgsqCF7tCxsHz@L|%$Yn1rA{uhw[OoOmj~ ͷ=!KZvyf6u!MceHS'D~I#.qj9K -LW'\ف 8% -TwuCw%Nfi:XGg\YC{@e Į{{.Tn a)a}4ms8?l:Wwf¾^?t ,|p` XbMNVU!Xwsic_daily_sample.zarr/.zgroupUT иeBaeux { "zarr_format": 2 }PK6\>Xl_sic_daily_sample.zarr/.zattrsUT иeBaeux uSMo Wg\;EiKLi5i'bPa7 5o'Y.XacQ'*LoLDPնX(ZA;3uK4;AŴqN^SIT4%$m|AY1J-g Nu"~vK ($wxy*ͨkD% ?E=-aύUcP^B}b ^PBфK9{Q$]םaPnm2p 6˩0sE/Lo8 8h2)QYd8w@7&Ris>׊]ie[{LS2MuK:*4ew-_֛o(" =3ժK>k {é3D6Xsic_daily_sample.zarr/latitude/UT иeBaeux PK6\>XBsd&{ sic_daily_sample.zarr/latitude/0UT иeBaeux cbTdy", " @VįeX?ߊi9.~&_4~6q N L* WfV@渃ͺ!T d֪PU`CW1 LW`1jêUFdf`P\0Ap9@<gL ӁxO)@<'D @Ľ@@ĝ@@ĭ@@č@rϯښꪪʊ򲲲Ғ⢢‚ܜ쬬̌Ԕ䤤Ąؘ訨Ȉ𰰰Аࠠ???___ooo///OOOwww777WWWggg'''GGG{{{;;;[[[kkk+++KKK sss333SSSccc###CCC}}}===]]]mmm---MMM uuu555UUUeee%%%EEEyyy999YYYiii)))III qqq111QQQaaa!!!AAA~~~>>>^^^nnn...NNNvvv666VVVfff&&&FFF`B?~Ǐ߾}O?|x7o^zŋϞ=}G<;wnߺuƍ׮]rK/\83gN:uĉǎ=rCؿo={vڵsǎ۶mݲeM7lXn5kVZrŊ˖-]dE ,?o9sfϚ5sƌӦM2eI'Lhokkmiinjjlh(+-)*,HKMIJL psuqrt035124PSUQRT`ceabdO޾zуn\tGػkM֮ZtтfL4 +5!*4@KUAJTWOغjԮP-QP>ZpS6Ƌ!PЗ?x02gd&0<APK6\>X↝&sic_daily_sample.zarr/latitude/.zattrsUT иeBaeux eO 0~ ٹBF7BI" 63t}iaXH >&sic_daily_sample.zarr/latitude/.zarrayUT иeBaeux U0 <ٙ4x C02!?m(t K{Y|LVG=J"֛{ Փ8Mv.@,<L9 x]:hH*Yurx>檶jb`|Ac 5-nF Χ LP[>X/PK 7\>Xsic_daily_sample.zarr/siconc/UT иeBaeux PK7\>X%ɺުd@"sic_daily_sample.zarr/siconc/0.0.0UT иeBaeux _6Kwwwwww#*% JI(4J ҂ ! <Ϗp};suS3 =B9C@#>yH ₀V 4aYR@ :0(6Hug u=q|h )9%;s{,ܯy^v u3LUcx)g O+uƇN`'&EW %?S #In=3#JԕE w,?P>.]  5z’BҞjȀ5&F܁|PMq[udej1--xsqJ^~i~PCґg>AҾ>95ъM(0NË"Ni \%ȲWUn=c!I!ϧ\OlfrAJ'u!L !H8R%\& &/Amr rPF,g1! nמ±RqBu٠vQjARG]_&LM"@UK8_,e`l4ʒn>L-62W +r.ڛDnel˺{/tY(e8riͅ*bf*lVGjIG[3T=b}͵$aF!y0(gq?$& t6>4JE=0`i=0-1}{-!K$PZFɧ -&-11ժV0iF:Mbn{cD嵅2D0vorC s:1lC_<纘|WАï!uJg|*]>cj1Mz׊R jiN..N&:FVܵO[]K345|HMCf= +^#G~R^WH{ ͿX3ܝrT~iKV.ӹZC&wK ՅSla#g})Afb ,b^C)cC bBFF<ѓU6Qb}?shxbbr[~"9R&iOS})M{"W8 bd1ܰψ}~nyxAYHV'#j ~qwk"!~: AF AKڇJKoܘ0c0tǭzxGiLl.WBI;ޓa Lb+k;eU=ˇ^O,(eĆxX*c})I}xYAN}#^hfwr%=P9=%6Ys U1ŮOn'R܋GF?1{vV2Ðy1/~.?֚ d D'^P߱m0i,bƿ]~i|rjU$q7ܦ }ё8)لO0BhF~:0~6& t(FBS檢r~d&N8Fy5N`}n!NҜ@;قj}pmUK'ٯ;=Zc6ru[J}OH9lʟGe%=ӸA^q4y4ITM!.ٌ8\Z\yk,M76><t2g ؔ(XVݕc̏Fط3 ^T7uc ZX9xѩR&\`.A9)ZTɩԌ.Pāﵧ,h⬴gA~]m]d53Ȫ(I1Q`+UEk Rb.~B*d`f%y`&F@mt$֌!ߏOwG?Zfy*E@Z[׉ʽ&Bb+K$O.iYdH1'ew0ӳ+I_'H#v=׼1{\p_՟wr RD/{φ9|2sw.Fʢ{Skh^;¤P6601Ր`<~|OK]CMIC>,9%6 3AW~ϟ+\0+={׷8pbuc\6yuM,aYWf>%5 T5*6r氁/q?@L6)X ##8aHt+-Q-@B|WX`LZ*7VIQ¦? *ǰ+f B)ŅeEam5^\ߋu"*_#w_MU%yEy1^vt$8x߫8ČRJv dou)!Ƣ剟۸b<6I7׆޿b?tWg/HGum}m]SGϷx yZޣO݌ɾ͛EMiqFyƿv.ѽPl5pOlSܞڧel^8 p M4M4^L ᣎ$ N=|7f<;X3Wz,:F@-cH$:7GY>P}h;@ g䴪E&&bP[T t:\\CZA@LYAGMQQC-p[maj;]`zL1}heK ?}!:A1yUJM7F^=G:gfA|`kڥJ- ġtsA 9d}܇$9~I{=]$(Fc}-}b#lU%qak#-tT)iiY8%55 98{=t4P'ochnUHRF^^Vϗ8ٚ6&FƦB,,ۏh?o}ۦ@ `BWKIm:%hykiAYcc 3QeYS IV:d+ S#|5Ee4TtMl< }]?|P4}4.. t熺҂{->en!Zz2,G7hǿ>Jv6O80݆WVos& S_p Zn6+d\SKEG]XLvbʽ{o2!5}9# /QIi $9W>9LϾn#}1"}U8wMъN ١U.ֆBԗ^=חae敔'90=]^gȆy0ZVKU_O42I{/E Oji7M13C>g%O3$]h}k(F LTeO|<>:r 8!9#m^ޒQHő~ l]le;0G'8;~3Yw#PT"bJ`y')>h{g~nbhjy}umMޛܘ'.ƆLS3 -~o;=YXd|40ō${rgRYdžꊷYBI1A6F{?o|v2Wybl`aok|3[4\]QPI| U[ YhZ˛4/'NFJFe75!]%InJ"mb3_:Mgܴy~5Z#JO>e'g)y 򥝗 E#>nȠ¨;Ap8`"C96T!"?|aɃ=QQO[i|jFNJ03-6 %|3ݜd66z4ϵaJBtؗ+?߼T`!Ň_]`pppw}uyiqznKZ󴢚_z''>W'Nu'=6o%lXχPg vɏO 9`C|D:ʋ +c7W.Ef"TβfҜG'rT+G#1bGnA0 aom |ڜz5?Ӆ/y^~3ckxc8ϻTt\.L; ŷ]X9s?9vGѱUH*4 5#1YpRg" .y;{/A%ɷgTPEʪȰ[qˆ49~)RmH#HUnNvfz&D[fR,h }O9:8w\[wii~{0Ւjr8PTuT# )0#!≻,'%x_SiZt}S%Vfz r""b"|k s3S+ήoop8pce wcMYazDgKrsޤDž>2<:Xe%Az8$'>Dw-Fd8恕Gz$[EdL$߫2,h`C)Tą V,K{93$bqVAJ :UX9 4 k6*"1t;ʁc;u!?[ \kR6MZR_uG<#+nw kLzIzn&x?9_0K >sZ qGs<_М@~VXޟlbbm Ag8J1j4{0XI1gԽ~둛<bD_}~Ӆ/KAdt˓_s^%> t4Pf$ú9][Y[sdbblMfJ/` }U`]&3dm89PQ#qpcuE)K|@!<0(18uLmHz#E ,(4XWot{&3ioe/;>uv}iiY!x/dðgI9O֣5FqpRtB5`jf: u<$[?cj4?H㙮Pݲ˲固,dpK /&`#$a\Xa’+.Vd\ {8f_DəX=`!ѡ1Pf 7wV'z*⟇? r25U1sxݽ͔xipV0Ӳ *kE>   vc$Eu{kgfdK AUOW UӧZAi5^K`Sm_1=#z?i=~C|ifr7ژg|{wx́?ɓ0S2:TZ.:d"\ɜ}H9uY:Uf|%giEʧ ib0/")=DJJXEIRn </dQU}ޟ8o)FJ*M=}zX-ٙH )V}9gγv`X9t5BWHm(dĠ@pdf$__.Oti.NM wǾܛ~ho`mY ~:W#K\<0zuzDcclLw5f%GYJ p2RQPRQ32PBI~{vgs&/)@GGKYV0 8fEWAJNilbbL=C+mmm܁&)('Xp,]enrI#n",MVQb+Y(F oS_5;ed,o YN~Kcs2.D|)>ʢ`Y[9~t"cI H-΍躍'd7[ 7cmXK6yd3arLHsS*mPo" /|Eq FJ ^7& t/u%o~:R3Xq%߆eFQkFMOlTAS^g'r> ?Ԫ%t*4.^>K;p` Y+ mʪ}7!:h@Q#ǘ  ^qs;+!&:/sJ2~dv9 RM,Tȶd 5۔G!cR`(OGM $ҁW\DTLZ^ZJVLVRCH\L dwSO`q453wOn](yVWIMYN^EUruqk]vb'%>lkcիP?;sM9qnZ2Ob:ǔ[{mM/IS`zhD58@wc~DYihKxM>U6 o^Weleu2>-д7Ami} Tw^.ْ@twm  (:ڼlg `h3)6$ca`ge!ƁCsGHBNEf&ff&&FF&o xyxxD:ҿB-BϨ`kʊK+ihI)kYXآV%c+ sScc#C}}}=]]]?JtDG[KC]MUEEEMMUIAAJyؙY8T544 oU^1e-t'`<:V 8ֿ gptNA;gahd tY98::-'rpG  D8A p FB-=gfbddfict@GYVFOVSWOO0XCMEQ^NVVFZJBLD?Ps bQ/P9ggenlljaieenq걵JcVz`c;m$G([7r #! AeA`8b)[:@ 'uplp+e0+`@,A; gPOtiogmys'(O]̌($2 бpH cf$& ̛:ľ`ؿx !7pO2B:ygF! ޷; 4slpP9 p7Qwl4733g7.jW[g{K# _6!g?n.VF ,4.'ߑANP #PÁcf/k8(;8aNw,x vƲkP'ظxy9(Ipp)hD%ĹHq@<=pp \qvԆNR.@A((n>stvFC0;;{@ @BKBF s 08)"$!#''!&' &%#%#"WPUS$5{QγA/ipZU8fEq`A@YT ! 0>L;9O`A{8*YQl`gejdbbblh -uUe%Eiz\(h1@!iX8899xĤUԀ&BDԎ8Pt VdtV28d"k84cA8D%2P\:>: FKTFD`dž2I|ab x"FF(1j@/!R8NH"$!))!)%+ /+!5Wt;{r8Lע A u<0xo0%*AOPC5Ife3ڝ: q3ZGML'&FxzJ0K kzB4)yemJ HMD_Jh3x8d m' 0 WYopqQgA/xhÄ0( Yp6hG ^AD 0@CTU5P,2p`D^bI$}.`@LZNaq)9%UuMm]=}Tc /IOB%7x#6pChEa x 26#bQ6i Fh EZ@ `ZO35RMA.Njt)O pl<*n!Q )*ih(0yyIj|8`p;,@YhG)O'2YAYCp,`?(=x 49h`87J]\s=MU <DA *G% eZTA!1qIIiYd$Dyؙh(Ɉ p2!(> (c/a(b <@CcCFăBns#<Y !) u_QED7f@/k!e\8l 11DCAxlh'dA1XxF | @7X61]  D%uDa : BC=2 $5B`6ZsmM5%ajcSs ++-Fҁ4Ҟ€`ɯ$ 5fȆF:%L3<Wa`$CA@Dÿǒ(5` ?rFJaCl[ \PCQI o2DGKCMY^Hw"-##- @c  7?///j`aƅ R`0>_Q3#TYZA0LlT w :&&AA, G-|09 hp[868h`XJ/DQ  T"c (p@A TWB@ Plr];.0U(KK @0>tLI(JP?deP ;;;'#5  JsDN@BC aC|MJ}{lLt丰'pCz#0w=>)% =#=%!&!$f`!*H}B[@]!PԔa._s@׃ 1և_rjP tzk]oEXG0u|z N#?;6:486ɋp(UFZZJRBB\\@YHE!,L`o1$=A-$. OR\TX.&,@PfU!0 \RZF&vn^.J Ff⮅;CQ($nEUT@45f(h(,$JGOފ"Ј8Ĥ"oWBaLGAD a8 90t@!((.7/;=($ g wW`[̂G6΀o)4|⮷$&B |G` 㰣HTADΐh\Ld lpA 9KR M,MM(PJ(P,$&**,+n<1#)0(8Ee^AAATK-`eb %fF,Ԁ< nSȆr( $_%!X Pϱ hyyـ߉OsTsj`+1`w8:=5 (Tw&=>  W?T8RhK*"@(ޝ;g'#* L2j|9"GV@OYIYYEUM *xhN'ٻD);3-Hx&cdgc"'%!"$$&!MDBA/")#B[NQ(Hһ NHl,d 1/cxP! (d(1Ts>c0sqs1S`[ˁD6aq vL4]\aan؍Nnᰢ$ϐ:CCXq ?Y Nv quh|bZB@Aۀow BjwC3@jDRAa# aTIG \,0!  EMˠZeW CT"@%9@ 5;# %Pȩ()(H P BЀ*A-J h PgKfZRL7 <];0@ ;@GܥûDLaNE k aݭiق}Hh,Z}4>:>˃M/@$)I֖Uq@d0(*Cn+a"P8^$zMx־/Ow 8VseAzӌmQZ3/NOYk5McJҼS \N`_?c;U.9`êeihT6mCypDڊx,C\K aF??:ǾDo| !F㨭׋`!x}_egG4\<:٦3Gg 6',m$^w;}D(+k L߯xO^O8\zOo7;esPK|@@| zuoH;|2NNQQQŒ\૳s01000 _Wݎ w1:0+ׁFRXhXXĴWd$E=q5Qaƃ]LcsiIq~nV|4RP!c*d'>uu0V&m,Lvt2<1 ~R]6/7]͵.CXl$dTԔEa,J!8/x0S|!Uau =Œ ~|o[i3]|Hx>'0aZ6w o*u_OG8ߔ,= YN3tbAZ{4S0Аք T5Wm=KŲѺIfoX]n"lG` gV!F֏f?gvQc W ֡U9A*^,R/uaK7ɚ!qݘ(J6K}^Q0\Fm0.M"Ntϔ#vXig.P ҂ޘ tȷbVQa<=']_Khv tuHx0^;LQ4gsߺ) `WQ :TO d(uf']DZ pco}S6 ?'PEY_Mԧ{[ij) C&:j_=wsqv0TV`'m}Ks]EaR$.low`wkmya~fU0O{SuV ϯ-jk>|1:=;??=}}sk_TTcc12Spk;>{`8y`sf$1'OG#u!Z?cE9UU&4jGh3VկuorNy|}kăTɵGA{--y' VTPt$C)XC !A Y]?ndԆNmftH(ӠYǔM7~~Pҹ }"4ggfVLV T) }`7 +Ƭ{!܋ħ蜮|`!PW\ut˴J '{ᔕZɑ:㨪)gWPA(/rKm= O\Ԥlụ|-SO^|^5CRA(fZSnc9*C`Jϛ-u"URU08/csVrϒc)ڛ#oX}90g{$==)E\D&ي'DԘ-R/R>c!~aA=](|i@c#1^DZӡ| |x5t*n~`2CCp|ko)>ҕe!C\TMZTHP '=1.z5̸jR|ե_S#C?=48}ht8hH0n5}]-5J _%&.l_8dT6gex;8(瑛GtB$\ b\ld ӅYRD{C2sˋt0)wb Dgmr]dp~eBjh;np?b.9I\{ ^X%2}cO\hT4% w|j-uKKعʏ?^PlnaKf)LhHpj4Q7VrEI«}NpK& ^>PDQ;ĩAYz,3tɇ=8E7= Jp7&-?3OYYh8BkT#X EG i^l[9 ʌ{{G[T,`D~~w‡lX!gXUF~qe3V:yLt?7i ]t\[z0` |?NL04[:jۃEç&bge$vK vs yQ5%bbkQ~>.ݯOI c.M|KceI^fvAS/{Z< T`$t8058<𵥾U,м)H 0]\ Hj+ߕg'FZjH2QW6z>u~[ d 1/⒳KjF4JZf! )i9%E /S3^z921b^lqqO64fpbOgY~>Ac~ ݖ+ޛ&OU#;>,vITd LTFQd0g_)ձ8D%N7ȥ(9ջ,E,}07ϲ(k݉roqh7~E_E$b4YZa]tD;_Wi/cb?Oi(3gaz3Gʈٕ1YFWv|)L0~LdDAk2DZhi/:A4C۳EƂ3 O}4L_ E~MV0^OyyFY/dm!kzh/Y:$)Dl 6.4?>Y%tE\L.|3®ٻ*$Z=v/U^f RRj^ 9DEAULX-TC}U_>7Tm2Z2𾍱(/#% .6zHVWF֕%G=t5Qfg |i(-*,*JhO_]VE^-ΌMί=99[jomns6ׅoKjEH}S\UW"\UTXLSOVHBb(+TtwۇW<:WjL/Bbɿ7վ{[*)Y;% .6xk;g ӓSVwN/Ə ?}koXWE«D?WwgWGz*j*.޾nЍ֬@KC5ap_g#MƭԤ@}W}MXGg1p*m }qVr[b\u$鉰I`aD ?m{m8X ހBDĵHتySq 烩S’`x<v77P oz}#.2SiR6(aXa`-?eor'uޮazyMƮMNXZ%MO^[*94njNSÔgdQU%$dY.}lKGyF]q1\,{ȁ{b7}t^ ;]e~ U?GbMfF)2 e}_ CUKA03]9td%݈:_H<(9?x@J6kއ$촖:l&壹3]O8!qC# (X.pqb8HՆE"鳟&jS5˥ x0>J ^e䳄V`biY?\ݴ31g!NK>SpD֯9h( oqs!Zȓ??(z[YCۼ O' sq^vjR,텙o߾~n)L u216Pf5kۧoQ PL4y8X)7 k;'W`45_ዂ/S˫/N6e?u5Pu~`ael`hgak)LZHf]JWf}ݛh;zR?+-IJ|2weF/*U -쫭ťɭHA ?lho兔bÿDCʖbgOW8 !M}c .( g : A>UߺZ8?]E{hY;\4'*&%@M)j~%j{Vh8hzfNǢ7 __OcssQ1˨*JqS| tP|vtsҕ]3SOJ[%T=,9DžHhiKӁ]4RB2ٟ_'Vn]n_Y s^˂4X_YTPUmNF=S3SEa&ZJ"sB)R~*0RvsROk!"v%,;'$F|]DOd=ާ 2(hIʈ&I&}l]†Q1!̾&e>(3za?h7d7#Gj6".HksuW]翇?+ϥ7J^kM˹y+`|;lBTԱU *hu2%f6ba?܅ޯvGdȈeq>Vdʼn W۾V//HOL+M r4R`!B>\_87'353=Rcܷ5Ґg"#dž^mom,Ύ5֔f$DG> 7+35)>.hw˦hR64GO)jrڦ&*|tTl<t":: s:jHKQ .wFs~l;[pի`-μ'UZtm2sPiV2?뭎jML|cdLvdZfFj&ps;*9hUKӳa,vY,A.mA7ma %Oܞ%Ihh|Hnwy)F>I8nT~ݙKJkdZdu<%]~_9JT96MLٚӖ58PE&zýxlXf>99zMȴבZ~b }ǿnpS)vIph=O޵w-Bq|UyE˗8'#%;vK_)w(L}tOvҙ94n`ۦ15Qx]mZ"LnP~8mXPZ4uXS@A|{lOT( 7-R^|XFکZ`J//Z[_ө|iĵ4؜zAnٺv< ͰN|EtޟP>`3s%+fSKo#KB6g wh()@ۓ 6r -̐ lL@twAxDvy5ΎV+ >-;x@.<++%+=^KI]}:@ |msU^Naa^Z(?-9>xciiy~`{<2EgO}="3Ғ_> sWb#D@.VƆCmyq(>vw4ג`cf"Cܞ/NO,lb2HGdU}h,/+// ok|@A\BQYF\XECKRD^Qgnl$Ыǖ LgSqnj^.{kClv#-481?F(˙ZS( ]|f(-lU7ч/1"V'QЃ+?Eц/՚I=IYv'gp>ز(/α g.E O#-K'Ze[cr,l\|,΢c.\-jR}YJf2c$Bs/7 B&_b% 6ߊv-t˷upR_9*yb.a(h%%wfʜsqU9:[%!{&?{U>:;=Mk/Oq&ypӄP=Ϛg_E.>%UݸL(!'N5ܖκEIEYB#J gƽ$ټ ߈ sh-θ蟞K}%?GuoX/w?z'{G"}mSHYRc&z{St&鍛s큢`OHm,_=U7P&? BC$ޘx+Cy&!Y`jnإF,v ^n+1pJTmB|#ɉTh 6B=*u=>) ·byY;郈HdէR?ghWH2*2=2cBN^1{4dڔHo3qfҫ -JRBޓa"]lmN/v6ܼݭdLptX5)*r,x"D^t)FoC\0,xs?C1JFg\?wd|ʮhFX½7SYL{4ˑQO|{>q33k/|}?_Y˗'-rtm5Uk eZN7N=$[  [f; dz"?>}vn7z[f$&J q!|~!H8^5,;-:垹KPBWi/c¼,͌, ԤE8);+˿W~/LO 9<>9=351ˇʒ؈@w[#uxs/,}Cp$?OJW`bƆt ͌dd81G+3_F=2VyÉ<;tq3ᕏRCn3o'eN߯W6}μ{]SK\U΂iјT>d*>Zk0scq3SRݦ8G ?_S- q{6Oyycp{/v9ỳ?\UvA:Iӿ^&E3!Ty~xtϯu)~ns0I ߑK=#/ &n[?:UmB?ktgZ]#Q|0^n:Rn R 6,xfWN#\u3Ary>2;0|.abZkʼjMniѨAt7k=o\o&X ک4삿[PUEZj42FH WEaF|X[3m:v8*$ c*GSNNoHTe7$6ȑXLM*Q½P2 vs?۵y+a$Ȝ:$@*9޿W]*XI S\-_\5 :b@WI6ZVmqHYTՒf)0QQcaI SXPQK@'nQ,}3frp'Ȝ#_a Oؿ {8{|q6MퟒW^ jSAGJm !կ"}̴$$ĥQWYo ӓb>}6:jrBLD8p`gKuQN^aeCkgg緯jzTS^ r0RS:33MQ|JNr:: ><!Y8$%Eyak] *2SyE,4ę*n@0fcUO3ӔKR\l80Sn /C'?X|) TOsih{G3m^Qn@QZ# NXv.:=}KĨVҾ )j?;A;#6r5WPeS. v)^S gy^_ˬ93YKSX-dmS>jrKK]O=Qt1rS)zڜ͔lB9:%AgXjǝ,=3WG dʏsbݏ|ي WN7D?\j.9섕tu܁S6̵f O=|0o2koNJ=ZScS#!:$gɎ" ?/&͇dH ヵSdf^6Z-d43=ϕmHY*6lx=!<3V-Y gvm9en~Rѯ] |ĥUKSp 8L ))O_.N X`? V])R{}Ω+mOO#7q- 4!D:}ZsC!щ%_F{$B|X|B|<|D@]Rp_wcR||L|F&NvΏsJ K+ K r߷VG=p0Wa&@4mVbT/Sr _%GO7F?ֽ+x2"YsAX?;[SK{G_c_}(((Kxh*&D'żZY_L2'8鯈 p6ccsVOhk)PDOKYϫ_=nT_"ۨQD=P8{ÚG2iI9cy3L'Z-yᢽB[;`2d&hқլv+V#<7"v"1(J-%ᑒ`rRh$J03Lu¯[ZZ w 4'|*mNԞqG؟A=TGz/lޮAdB~ Ppj]#lt>2yt&TLY{aSId쟱ň `;F~8'a2V/{Z"TwJMaf]B9rJ%6_RSHI^fQ)=~! Fc:}B{&לcj"EM\տ[KsS/3pZ`ѲQ.f-yQПZ K- q^D#Vk^%ܷV'`U}ѳC"W]ז~/ΌGZRoüMեJk"KKcs뗏?77}h.xco)Gs{zr>;򳿣fǓР'ltęgԕe%=tsrp'$>ҚƖ?~/L t~hk˻Ҝ4e*T_+#ꋒԙa˟ 4p'oF|\C-`ofz{Q\\jeê pBi(‹ 5%NTߊ<){3g~~3D\wWرGRYF-їy!? 7 | ^j,)vdn'=;DC4>B|1#\7 :?|tH 3y]Dɲc[|HG[Ie9E1{$KQG_M^Ss]hm6:CPQaC| D3ѿ)i0FOt>P iiiIUW-]Ƀ{,٢gt*8S6:glOգsqC=D_:s^4j+3AZPp،Vv&&nˆů#4FK[tw&U`%WȁIgѡ_BfP^ǯGf5k5d (R^ŲeYzWijYGٓ,7f5|©d;>W6=IIنqv(S;|?+FM'ReYϵ=m >,EK1U:#y\hZW0E#xWUWSQJǓj&zj* L$7뿆Z+sGF'%e6􍏏NNNM5cpzym~ꊢԧ>zx)rV[?5W$G5P[CYJODRAEMYQNhaӻ܌@oW[QM]cK BFDFE9;:ETk-\*`UB|1#[p,Fq4f`%?Q-iu:wf3":9q[䗅mXbZ¥+{/of$d)eEaP9l؃y[ Q'3h; m#ZoNHUrg (kAwƬXʑ&BH_iqs2<ձtQ=g'/~;w{6$;F.ԏ6 rR7p\yՄMԊL }sD>8u <%ܶh3 \HaCLDG,- dHDcy3:0J-A9iV;e'k{p6Mb< FMn:x$&> /]]fw#?:v[政ȗy]#d9Ԡwc5Ci=i0P? 뉠Hgæ]R+~ͺ&{p;5duK@eyѱH$/FC'5 y;6;snclrrlϡ֦MU*k[/, }jxWLHInfZJ"|{ӐbW7P.!>oBt$EPUTRRV3v{:473%!6*& '=kl꥟GfZG- 5:&NLW3-/ASGm'ܖu=;]yI:$MY{gp%f2D7J^7P:BSRcFث2]Xq@.Iq&^g9jhxBGMC`ƊC]d:2K YHrSҟY9XdS:dE6)4?~=Ip2X@]5'3Mq~IYyGO?OpXs^pβ;l>?=2MpZ>G}_9#pe*WBs^|7^r伐\qC?=**>?̔mZs"-${nbm&nqY.}\A4;& V=ձefjcPoҮD?᫕ވqURW"6w}wm1 ńȸ=@BXˑǏ_A~lwAg*rXLߒ}M)NP@.&Ϭ,>Rxm6kحdܾe~@^Wpz+'M{ Hǩ- I[~CAy70WHaz&;`k)3A燧`j~s`?{+s3KK#Go';9z=~ags~@ddgH/W{[{k3#}3+KcMq.*Dߗ`{u1^GHHHp᠋߳C?{|lTb"%@EJ  ) >>?spĢԲtx*)ИW3r*޾ Q5D??][";B љÿY/+u~|}Q/#J4ڇh͕Jo/N-rCkdG 3"Óg?X@^*2x>S*Hxy|N*pǒ7kj1;oˬ?,Ű#,Kh~1's!٬?[Hp?RD٧GEKLU6Z/O촣cD'3TH5K:<0&c0)pљV~bfK.N WT#G5}' %RN['G{Cct*ڿ_ )"`>5%Q l rWĬWQ|.,|0VZPf@u!i{ӎdTu Ed;;Կ|\4y{=󤞷kYڸ0n{:PE.x=HYSLu"+'Ofw͖#cK{|`֔j9j8:cb>fZGS{ NW(|bMcU!KF)n(m>A V09J6B|y\G×v)"E䓺G]bßFi}˛Cdo,َ_GxB⢼Dk{V/OhpRAe%i1QE9)1vfvj?['l;:>7;kquk:]h*HoK}{{rxtznvjtp``ptrjgG㻼̤[6?NLNj HKEF:?;;=:krGfOԂn19yoSScƒÂ< y"2)#QPea5Ԍ{F:V2bC 4Ur{|^> LY/94/!؀r { g%PgX{n~D&I$<{6ʸ^ʂ3X^w4;31[z//xO LCٲ~Y}ԯog|MaA/ON9Qz)\ ̍(ޏRj g+<1%l[PI NnLqSŤkٺ!^L| 5l1Yg3pܴt"h: {w?5\ڸڱ5?/;E>yUP"sDIˠyyakX:W9O)Y%A<ƲTQW8i|_USU}e+Md#yf E%QNkͺs*Ѷ/42tKMUrR:_3h w&A0n!WX:U==B\'Wke>pbZ}I  pA\G$C:SnESFoG3\U>x?GuegDP6#O | f5}Sɞ>*Vggm%-{~˕//qX+|UxwXvV%.$ !s7ޖy))/+lo,.+5ᱟʆÓ3%p·% 1O|<= yj\kʷoD%ddddžz:Y+*i虘hH2` lo,M,KKcՕUu߆W.٤ c^y$O76.xx8lܸ Og16ZQB;hWHJ6ME-9^>X[BLŹWN9M" bhmZ]!/9)̓tiT6L%} GBT 52zd:N%LCN07h=(Oypq(v{ 'R:!ߋSy[6j5?.x9l tSʤ?aР_7G ̷S/잕7xC!@mɁgX[Al"*֒+q8Ax/n #@[YB\C>{xzZM[eja:nTo@3/Κ;C@3ﮡ8oK} JMnZh-j3N?c6S?{1ҫ}vX)Mme蕑e3MkD_+n=1_cn]iR_YW#ר)KWe7h+9׆*E/'[IemV-SW>Nٷ*.<9X srr%q o?x0GA"x)I`N!N! yY-=7q~I8MlTl7<;P}kk'gkCMM]=-U%eu2bV&:*b<,,l<\ͩƲ7IC]mեعeU ,?xl LIKHJIMEA 9\񽧷{o׷mk+ޕWT(}[^wrJ+egknif)ǁ1/E[rmZ(lk(5YWCvb54T.%q7J֨}>KjV.`W:HM—Q)'3_oއhҲ1g ,OI<ʲVdLqBv&f7N25s,*Y E^~]ËYByb-Z3M4y?kG(c=F0l0/kb|[To?Ҕ,nŖU݋E yRi ,?gY_ z2%Qr1|Eŋ A<`KTd!ԥ{n%Mv1 7̶B=^W{p):>{Đ9ʈGarYo1d7!яc|ҺSİb$gJ̉@['u|)n̪jL TB (Dn4ڶ{ "035Ғb#w\" =<=<xӒfcA萎rrt2ǚ_7{s=iaNFrl߭嵭K(9-#3+39.{''g~-,-/O8?';+3#=5%91>66.1-uvNAqqQQiUBN q* w7)E}%DGMf2?%dXK 9.f̫پG\ ˹.n2}4DX1T=#޴=Y66)n~el㺄m)[c 牟ÞPŃL1/zS1vZԳ1WlKWGlwwwwwww .%{pwww'B!ߜ9NOw׭=u+ 0S] ِ,?}VV&]'YgQzUʇ$t #bp/4J!Lv1tS_c=EiJj:IBaBB&dgP|au` dECh&F5lg˧A3ךOXCS_ 0puK(W._>\]L1ў0͉CRfZ0;՞ȃC-̀uV3smXpzDƃλ 1Q!^ڳwj۶/9ABpG,ɧo I]CGȪ}A )yM{ȔVѨd`&*M۟UYpBг&M @*wמ`Vؽ oL5U妥ՔT L[4 $_A'x,L˽_ueYQrl4DHNj줨РČo=KvOOOƺ[k[g&Ex{zx{z{EDťT5u>C&akdigki,#&"*""$DMt:\a$͂q2Qd!GGz6߹hJkdU/5^ L_I›_ꍠr -&r_'d?GF FS/ܿ03_ B;f'[!") QJ1da<~ǙW?Ȉn 1$\$, /42C,?N">B``O_q81RTN%B_;zz,[Hq3JԣlrWԻ'pؠq? ПNg(S zjl@G#wTⸯ?l()J5<2@jmA_^xww= 7;_`0)׿%~F?L6-CwƨD& t;筻xlgTC;y}[ 1 TS==m-*F [ysXB)`wt Q>\].=p0.fePshf[LmLQSGxa2qTAi.F5FK2iBum4T3.;M>YFoL 6g%}ѓS1QQ3rH);ciyʯݵc=3 |]L9;ks}yI?ɋӐR1p ɪ۹G Kˋ<\]=|Cݿ89Y꽇%S>j:G$fWTշm߀᱈Y8?RsT}Fx8^ɍeƒ8]J r&Bx:\@ˎ[nDϢ3)+Fl@[N_Ng S庽crGQlG?PI37`$-KZ@rYo$쓊0O^s640=aT_ثkǦ5f)fN-Jz"aqݷR ?m@1jk6nsMD X+zq![@$xd32+%,oIsxPtΪX0\"5P䨭{ԆKϛfJ i01-|DLM3q)ok2FqnGƊ#…n^ﴓfA]p7|RO.!uϙ*ҚU#/E:7Q-ڝطb>RadT/ʬUpYknLU~J!xJ Rғn@p!F3DnszUTa6bzͤn\Q]R$e,C|_sдu4ep6Q|e/*q(ڝ|6@k3_"R\jųwE4*:G~{ooɁ0 `ϸA.f<ńBm2yI{av~6ƅpa]_\.*""ϩܤ0wKy!VJlւho' m>F<呦O4xdxP2oS1kw_)xe'e8I *󲳱'ޝ\C Η{0;.bgS()wr- O54{>71׉׺Qt,p8p՞ ؛``8p4LlcgbHH/.BAD H 70x^j2u3{ݾCc\#\ MvC4=@,De VZJ{X"6_C۸Xŕݖ"'E.al'(K:i=Mŵw07k 1+჋[^ƟQeTz|2g; "6 $Bk}~;)[Y^T|}o57~kZ8 Z|0g ;)MQ1~4Cy Oc`}a$7)BOEhg}v 39:,842!pxxd?WwOo@H8w#D! x?i)ߣXHH((hXxDT,"*&.!icK;'WO،սoog;?gG{7TDz:(0S"rguv\xhki1JZEl$Z]24i̠ ¬blhhgYJ@n+?O$[sZOa0s;dPJ9Wf>3E}l+L/?'å[T͞=C'1W}'B0|.?Ӵn0p9 vT;fC R w 3,ÞjnD)XiYTRJThH  dC^<լ5ͽ  g,"+fox*m0P}\>W.7w~WyDT"jm%̲߅"N' mҊRLкoĦ6~Tl,< oQ(j#TYqH!/d"U%Q'(|h y]MpUZ[{M5zrŒ]X Nnx+4K!scRUH|O+~K߀Oč`Ըhr%,`|˛,9}3oI 3v#p.l @+ R)4TEӨ9jMLVa7 7Ǘg*Q딳䘰_Vͅ!fjJe"+@A|c>$O'>$ xDg>NӼ"r1k@ʟ|OYtg{E43#gͭ_\Ph$T3 ]Mw;Vf"DEJzg}8ƚjZ::Z:zFfvn>!I9w`xlzams+ݠ ^\=<>C' gPP34rpY7>87TN-|T8hȉMvTF8*7g05QA_N&ةRS2[- +~/lp9]۰ c%,>evdPO$װX&,\1NP^ TAeDs=AN9 J!/$[nޕ& .O p4D0=q'a8>N~sHv)R([lU)5I%,*-:g +ݮR/C19bāryh3 1vjl@C#Si.j  //#ii!U鹑Ju'Ւ&,7Ot9\hpP@=;Z[Xl+Nbk$#BILaа H(8ĥU4tM,|â2r K+jںFWV~.-..ml i9$dUԵҳ JJK sB,ب@ϷTGEz$/=dwe( .`o Iv03=>$ \MFR%4~#(~"gPio]}1&xq:Zr{qj=  5$!D?<731PYVQ3:up~OHLJV^AQIYEUS;(")=ڻ&~,=8C#c <چfF BdP;k=ۛkz*s0Pc?0TU@n9Zb{II1QvNn_C+;F-U%wfzh_8|FgRPW@I_? Gؚ:οWL`/HG*M ;m 4W8;'ώ73O}֨GL`Ô_]fB]1 )Rv .i5v"}!¶Kx>bbphqJax9@w" #.z\/R-i $G,^vq<c.0 >栒A(U['` jci؀jC K"m@f0"ߤkec.4'lb+4]M":)+ :c SBBqch877Ux9;򽡡(=9>HUFBxo@KUN\Xp{3ei~> Ofa Y\{dzq}ߋ;ލOBI/08$<":615wdl֟Óӣ?O/o_)iih(HwsuqvJl,{p13R]a !![Hٙk$At>ZW[]^TPh*-- @x=ՙ-BT€r}r Rީ3hQؐ&,)BAAޱ&"% +Bk'VX|VMKQrNQt K22&Z/ QAi>.57%{QFfrm_I30z"| X!NJ~u E:X\0=mXF54w/$@HqEwɈS8au$?1]wewףc/"2W$,R+drLRh0OZz>?£z7Yqx ` :#Qc0Ed%@;WmumaIw"T96h4vI\U?eQM$b>F(:a#:00K35;I+ދǝt"kW@GTNS,}N&0旷NS)t438f`XSRR$>0!W`I KFjs(`:VAYJ?xI|r +_#M|F&J6 LAm fx8rFf Gfʼ;fik_3Z 3w1PH9c!2@x'"5XL+!߯w~kh(N֓$!#DǪbSֽrdQSe"8o/Hp4$'Hfwq*?L]F\ ՙg/D4,BrNWc7H+i|644222urJH+mliP[}`lf x{~|:Z_l b0G#MA.ƪbd(࿿gk++*KK2CTPNZ;g&:jc n6U%z+0` BJ4bʰ|yy>Z[o `[tN%Fm}eH'Uc.Xٴ--=hs Cs@<Ƿ |T\Fx1֛G/ˮ4Ń7I;!}nvFVK۠q˲{eRkEODdԵhK\%x_*ԸЬ>^ GF:r4um[BfT1y0ޠaF: ZhtBErLTtB&=i[kw_i' =[@US7e8Ꞅ? @;@i;KG2FZ35@md]#i9o```OdB5C~܊x'LI@ <Ndlk70]Y 0M'+nb4N*ϡ3FwBl>qխaEX_LwoD/ֿ V?y3坞.eXNKbͮgs1pg7Tј8;+~na8ݞ`J+ 8Gn|jP+}ZWɆF |!UqR/SaFv{14SXP_Q/u?> zDo9$隤5q^prQgvYÍJ`zF s*j\7)~k.p@hUGa YFR^>Ygm I B5 Mf$ >(2&ˠt` i"ld?jf+z߫b7^ 45dYHa7ۋB)aGSi:EX4%h_ѭ8L F 1PW֡RJțlvJ:&C=s$ߺewn|bOK!Y wgą]19Vl(),e`jniQ(]Z fc_=UltmLE??yC N Zė;8^cAI8 SBY:#ùVMn; 2ΝٻBc?d44 ?|Y56aG e6d VFlLjf{)!8ٓ84Q2ޯRޱ`Na`<(Yo=?`«EGUTerH\oӻVOvr/a#k*s0Q@^nו%:k2柳g(lZ^11~::V> yeU-wZѻSV=(s KKs2S㢣b2 *ں'܁08E m<]]\\ݽ=\lTXIBOmv(5T{ir6207[+k;G'w_o1zJ2 *J*zvAIYYiq~vz"ǝP?MaZt_yޟqJ#{kÕ`{%yZYjpeL?rov~ -Rw~1$zX@w@% M;_nZ߁+ͲgQl|ûݙ5 -ƭ^0:Cc`!AUkTZX',ӸaȔgg>F2dT:S3V(0@`0A1Lm ӕ\zd$h]e$IIJox"bD1Jstiюz8 `+RjV:Coc +Ȩ:o`;IHR'zĻӆ*̏sUb@O`[6~{ƩX~a I`nA!5K_Kj}#u!4Wn)S[G|Hgހ,M:J Yo+m'gn&XvU*}*_iUS}tsO(UW9$###"#,T8/>T:: /\Mkfג̜Rf)K`Nz=w-*wSMR_^ X%AVjb"&_nq$$E8pa0yExqq񰐠'9)1ގ&j҂$X/W{sc ɱ>^I9}skۇWoPHdt"F!)퓿.h$4LL L,\\,lܼ’6,6ipK@HBNAECKLC =јgI$}oa#?mBǂzU4n &aU$k nY+~~-  Q"rT(+&5o}~: I!݅hT)m!1tEr,E+?K$tyglT<"*y֘*i`~J :N2kWĉsZFHaCt+hsEZ>=V2t,9K'48?K!6YG9,GLIg#`B65ZcUcAh]\hwdHkrV[!fLf7ɗ WDx¾K[0\9Q턠^ߟ_Y_X=`J89 lB𺜻20 HDžOߪU]!dmƭ,r/c~WB΀-Y/K|!h07˜G2, җŜ TE>"}l왾dtk C$}V(=i:;,)6$ɑfŷA=B2\}0Z3}ZO3vBkpbC)Vˋ_B) KC6$C>9{ m_[t!Tk0<~2*{}k"2 f|(zBFj`p,ERʰh #9ݡ!D8mGEi1F@~쏱Ʋ0/g;K3s){Gk}uMmݷڢg+5Ya624ݍ⼌دVFڟd%DDdTB2_eGNS\Y+<9c{o{(L2.Imy=c3 Ks3ӓc#CCﯖf';j㼌Fj= iWgD9(}a'Zlol{@O`cn,!Tm8~C)?B)ew,%x=Q{ޑy5ݐv022 Jd5[}9ܟq.=bz ÿ&vGZAfg}cF;{`Ӯr-Z_:r̰녘*zf[Y @wS[; ](/V$ 7X!UEYv==GgYE"}q&uPǽ˲d` 3?66!D8Wi$/$&o_Z*\OxŹ(̗'+Fcy4e{Gz FMf)#E{N~hl&1&Kh50Yv KCEOx*yCQL#(q,6:M Kya CH]`E`{&"6Lq`Δnv)H?K1BgO.1w@Dt,b6!C3/o`E#$&%%&&&!!cSTV10q I)h}AQljaafYKUIANNAEMMEABxОb)Ƅ >>:Yh+qu\X%Y)a^2(w#f˜}IzG"{pۢ?s nU;rsl9c>wcy @bz&rp^Y#8v [ak0:%]!A`w~S Վ[;1mNʯyLߨ7 K\%Y{[@^a_:뺾&=,sge 0^ d%zu"9y*$Bztd4O 8*=ѿ\DCMb愾/e< NU (L=0 7}bY1)zɓXM[D Z`D,h];ǝycIPJ﯈R1vYz>B 5 CH} J: D)Pɲ=H3Z. vZb:5B,IGd6#Hlk7vH٢aq@B~CT֜Vvm]0^B ~`& )WNNK[NH4D`Uj~UODL6Wd@KpwcOtU 0Ӫ;5 KNIނD-P-Auݠ =>.G$NǢ@)1Yt@PO8D񔞁bHW4Eϻ"'h,ňG.} 9ۗ U r@OKSZ4t7 vtݍ+E?'˕Zˌ3,Q}_O=61 v1 2f6|6 's.ۿ4AKA`4Sn"tSo'*K H9ݒ8o41n| =7- RS2?%%%9gv- :66& <ԿIYխS}]m q6U$x)Qa];^j-OKͯlh|?&7H,Rv Uř_ãccccbbӲ J'gLJǦ7.Ĝ&1z'ffLMvuu4WF9kN]u_F\l,-,,-L EȱQI8d]’s+j= EبkMD'݄N*2%XN+?:{a8|4)k,d3R X9e'1xm@˭zB 3yLS a]`eTS|kOUTRabH<s)_aZ~TFbozX@Y fv&p òJܐ3BW0"ʇMރ`)=zj3RJ@znb&;`ZbTij6Ms82BLYw;[fDqM$Tp)a>-'GGyK`:Y2tQjB+ <$$pk>]djt?~Xs<"ms&Sx0m7*69ާoT}S' ׯjԶd&^W[<0yo{uU]=^Kz/B-\L 0R;Mȉx|E&(dnfrɗ~a!Cpm9տUo!h lMabDw`OY:|&g Ox*k;=<=WD㳳>GcRelojƌ"#$K>5l}vs&%G|`d"ș--E)i;~Oz_3JӢ< U9)qqqpH8E$dE1.֦z[j2c?).>>1)1.&*<8㋽[dvMԯKH!y5 5%ianf\tTtlBJ&1Em# kk *z&6! ëGOH8xX((hhXX8( /=aJDw.*LܔĬcXj)3ܬe_u>Ҍ(gù.JDiv$o[CnXAa, - 9DŽ6F2;eZM#:(Y4CZf{lՓ`ƴ);xbuW8Mh@F_B=D5R>KgJ\-˵r .:t QNlKYesK.2o/>aƲIh wƼX hxm ե c֣jI[=Fj Tp'Ml4_) C]:5ϻ)M3N]L6[$OT}Uno}edzJ? Ò%[_<193mMFϳ4}!;ȍϵGT*:r2n$zr/w6نX]=v-"KdJkTjJK#8Dn?ɩS"ϐ?jQjaU]~. ?;ޱr`+ހpcS(/ųq1$U:0]O]#$ Tuw=VsNE^_ܙ80+^"%GSY4#.k̫ƃ_|Aq1Exm$'#-#3#-bbR2r +ۻǧƇ:Jܬ 4)HH)(ӑ&AG|<;:8!ɟ?'WhD \L$Xꏑޞ(lLϛz4/7Vǚ Hj[1tghŵ-myn7Z+2,5D1ަSiGL+E_H#eܣ5/iƪVIg8<\Kւ0PhܖQ%+dr%,vWfx~?=dݽA`[8.~w@WG_?/ڈ]کOTr0GC /o!o%$XғIx$3 "[M m_`,+TM=\;$N +Gݩ!@G$ʇMI <,(M/]WIFTsj?au*'j[Ug/F&<!d}"&:-=o ̇Enh=OڵݹU)@F=["*=~)X>on7[Y Ʋ.=o6mndᦤ5նg' HVmEn7i5aڻ.z.R;0Z_bZ |XץM-Ș%9J`gvV8)1b) (@ +8gRҍK|Jbx%?KH6Y7ϊBpsB1R""*ދa'HCt&&W-0DGb^e:χ*o/9xBS̬wAYUmM*w/٣@ne0JmIӦ_9M@_v~ۙ}PTзr JɫhZX^^^k/J  qwv}'yF554Tյttuuu4U5u =BSۧv_p?9ŕ5{Hҡ9e$_Y6ZޘzЀZ2ŰDsBi$8\}fC^5abČ[7Y[x?].{"HK__Q1q_C>Z[X~ɋrb<.ׅhѿLe7Wm<$Ԏ9ܚ/+ҐJtҙ`Kxw|eU 8{_# II&䛙cܗ%s9֜/,ka|o]ߚj|R/O ULETvN.jlTp]3&2/y <NO^_t Dyx' C;Xxmj M{ %d%Ez'#)m)Z h5am<V5 Br v2Q&Ol`eevf4IG98l B܀gY M(pnbp~d2pb!$䀖~ZxD%['C.ec?U_u\_D``0ͽ@pǒ Nj!RfJlr4[7w>)q<yEJu:zBxo&pGQ0e&6 OHL*cl]>(ͺ&g~Ҳr7?%oл&"F8UH Y]`L D)+5:R&g)Lhp:#LYr#t) 9Ͳ|v?mBI Ty'&0icv' .6z"~}M'ƴ`3n +6벦''Y'{81vM$UZUm Gz RYP-= +9ǎ`ȕ'5`1##QSTb "`|ujbbC2^RZc}GW[U(HQQbGd= -Ǵ@CB#e 08X1370;9?0<}h!Oz>IPJZi-+TK^  ~yxxzy@@>Ymiliʎt7ӐdDϰAZHӥ[Z:Ŗ^-v6PUVF,4g*/5..a8gUNKSEQFCZS q^7YL+*)AcYr ,y3gzcȤ:SK+?i"o^/[}g}񸶯moz7)nrZmY?TN[O9Qdtfy=fS[aWn1`9*) S g9k9.dC*w(cH[ `HQܳ\,? OE3`fQl4sx&SOhVUHĢ$lK͟ϝH e6GOgFղ5qiA f l/\ x%S{]VV( ZZW{ _%{"YV§Y?_*|iڙe$zKV>}V{K/S"G Πvw˙em?!l2g͂&%2X3>b|0ZM{ k:EM[ƺ5K&e[B-E''[”Y:1JOkmN vYeZꜩ;Sz{,?.Uz)G0~"j # ʑDgV93Yþh`tǧRAGGmn1re/Lޕ3\Q}Sn(5tlU)as1cIe'RL{_UA?uZKaܼUo 6̠G~1Z"ܼC{9S dX0wgk?K3!|e(lj59{U6$qxz}17V[V_PFŧfִ LL v774N eU>GEQl$o&/9:㋋_XlRWSyfձh_?rs!;CL̽ƷP(="R8qA'[SOqm.zd0I5 u1QWᣁ/D[( +[Nws_} ݸ 8GcCސe?̷{}'z2A1nWO\B ʇک|*St8S9"&L q Mz":^~]lgA"*3G:,3TZ*4ޱv}O\LMZX<չlIaU=%[D6qo j0 z͟4#_F#~l"8w NtNmZ"66QNl &bûG'sZSؗ{%d8qd[nQ׋ U tOB<.) yd#zC2of SopƦD~ Bh1TӜmMU-/Qh36](+ٜnM v]ujmG3x| }k?v^]&>)hfzW*%I|X% 'ޗZ~RWDA%nPLGL2>Q0~4a ._@qep d'Bp!ʧsH\Fq~vY ԫ!ix%crj}BO* D\.O ~ C8bHdܽ{a<ʕLI~Ԕk-Kޑj+}9۔h!Ζv{{Ʀ~V̿Pxf8Xm̉us13PWlZXX_W_]VU<\<=77Jm36j{f2֜jkm}txG{[U-S-Q.@2#eb,95wY*h4X*Kix\ȇsuy6b(1?L_3*p]=X)ҭPgs3;% ULFUhLqw%0Ϊ]g @(׸?CКdĈD+oVguBֿ~ L,X;K5?Ucڷ< 4= QV]Rv_W*Mq2UqWa܊Y'C$f֮8< –w5-zW|/73+ rmԹr_"«y[{EG">&Շ'U3@_qxoǖ i\8Iab-OM={#Biʱʝoj>"os"H&kw|ؿڈ)%U~>\h?jP.@Lw2,Xp-L7ӑP~YCkտ1G 'p+oQ_gs/t/֎kIvj#hxH ^|+N݂as0K#m .mHϯ\'#-iXG7]K_C9O0>};c #:[럻VAZ5[ ,zTlt2U؟!V+15h͟('#/rL;n||Wuc.TN=$mxd (>y=rqxD4W(ͮ|ZC[mQe`WWޔ{t, w( G+Εo'@++A5UH8l+ٵyd V\.y4'+]| Ax!F|Ol-06}Omبq`QPQaϏ/`(4l"FOfa Y%%9i}3۷"^WȴR"$*b'uS<‹Y*KKJ0BVyG+"Or*zxE㊛.q#yX 2 _=q6ף#xw J: H<ʾwLOd"ۥy:jNwsچA T MnFE@c$\VY ]{>$E+!f0)s޻ݬU6 ,c ]!}@blL *?A0L8$[{ ~m =:dݢꧠXܩg ĮӉy14~H'Ċk'3NzB3"}e%6_T;#SrՔr\aX☡H"5Hy @)?G~>>Ї$%b^p?0/{l(:"vϨzn.y5½)Q+JP{[8(l܋{9ŷ, j5.^ȫD\A{M)aT-,7,K2٪R~6;+hOS׌{t18p ag\0ecI㣭e"ePOAKRB޵;"9-;3\!g.Ɩ [{ u"&򼌴,B#&i3pMh )BH#sK?vB%cV6_\Q3}L/rtB@Tnޓ1XGHNYF4.D2B49*# PWc&ɯpRWE.QEMc/FJv7f?913>\0g'G' qkny Mt:=xCjEi "F_81<5'lgjRP)Ļw9A J $ dqkfB ]5ZE;Dp:%` IZ ڤ%(i#tE]g/?4Q(]J gSU8 zVOmiNЂoez[H(7voX*M!(",ml=A\+wI\/*E_ӫӶ r3 \owQ `U5Q>ZfjXqi!I'̔?@A0~}mT~eadQ0)(3{aGX[D_} ?}g0'!\W F5bA$\|2xY%6e8"`3QєE:XEJLO;ci!^u DB%S ?,cj&)rS;Ɨ>z"`;~M.(**kZ9 0i&ܼš:e?i+ 7%z9A&\Fݧ oݘ1pb[@b'^Tb)~30i W|U&B'uC=Nq-q3syțY/,ՠ:u9YZ:(:z8]EA׵Vwq&BJ?*gAd^7UKKFJ>ί~֡(h<)YرEBN?z* hh(,`:~-{L(YC i( mNBpe5 #75&@76 _qhl CѯSX>rԜ FJ|KW1K܏4nzY 1}M5:`iG0*mOviYXgM¾k a,BqU *)60I,]2'OΧsp(׾OWk!@('qwK.)Åy6 MxCf)0y,LtMܼ[DZS銫 Pu#FM7frAs.kE0rz{ykָgX0yEcpxMPUy^rhSBOE58djQoxҀF9ldA"D%<)Y. L@qX9$_,_ֱ=u) %Z'ކowa+Y#ci/I(_<"MDi1;;\z!+/$.? jG^_-w} /j^:zF eR1s N-m^<~ ʩ~6.1453Vf&J8[Aw0\cΏP!rvd2%qum :R 0SQXXOp?+F4HQi=[aćj>L iR{@^x $oD'齹 JYBQXe?'uKy3E]t~[F xU$foh`˃R8ٵlگ.N3}^3Â&}"#Il'nUI{1njMkR95-5 h@ o# Iήy&9QJy^^oiȅh.殂3Qgݞ-0E J>kQv;~QQ[\^FS0Iжz-@}CjJy\Co~f ' -5QfCKÖ%Iw'Q_m$ UL]nrg & @}?{s(_ڣHL E!غvY]/wVU/t+gQ9$W!+Y=22B|VLcZoܦw2^IK8:ފJWEB|eqOmG!Ӓ?ig`ظ8z(nOFhlN^J V7 n{%* 37ٵ)hIh)b;7 M6( H"ν_X•cLL:;{߈`9u yQa¦0 mϙ'mf`Aâ+%%V*|O"8jWWe%FE%fW~X޽"Rҳq JȩٹgGٽS'0X "-, ?)*kY;Xjlև[)0PAVRdk<ٜmr4Rw鷅ZL=kK:j x>mK͇q5_H87XQZL\2KfanN7Jp2z})"v%R-2e f'5D#3k ge:@]"%H?[6:\-s;XN$|QDV$p$4'.I ˂۳Q=YC3|V'AV[hݕ(!@0ex56d1ou~f_ZI$6%%%YC?u +K$~Ҹ6 nk/B&Ca"hGk;HF j,Ƿ:tP1}\d>E[p^ǒQG}cЦ}AmkrpACZ2nWHd`~O$R%~WxZތ% G{ޟP-ǩ"Oi<76}798-MoH2:,3Pfۘ~e'|^vO%0x<{oֹ7ۿXf!+W9abvF{" YONx ?)6M  Lʼn #ZHc^J=NDIy3 "@Rw`}z؟Ts@QyHDT>[ oh N."HN%A+,փz~5Kb+PDN ^ѽi C% aluxk\}ߜMsR4-sXN-:9w`xlj~Us {@HhG/A&20W?C b5M+;0"YU=h=Z.PJ @vf;],RHX%sB;)݇b6MpX4mq+wz8 1^VzK -R})g4 Q\k߽Bb浙B=\=VE9#?>$Nc:6LhA: UJt'SIXP;=mwAq e &IaeT?2`R1).Bh z}!'˰ChUw~HCGJXRTΎ.[su^,\I4=nݼ.A( Ѝķh?:{ޙIfݍml-Yͺ[BP -]8 CBq-\Sܽm{n|c%2=9Z]}`ly͑\0oy=mC}ŎQk$$ʭ -nj愙 ſOp{}{7t[Z|җ4tm=\湗Y3I|#<ڏ+yY~`#Zzf4S=[9OYw?Kv>q%ݟ']?|ѕ]{m7|=/%GԿrTw'/ -IoPvc~ y !Uxaҳ>`땹7YGvc6뾺o_t ;.ip/ K޺7իL;>M>K˹xōlMwVhWE[ש8~ݒγJ_oP-o{R{Rc{AZxKWŧ.:ܔ-Glޙ[x%R/i ;E/xl"B#?xUKBo?x곯M/27/̋_arӗ }9疗~3F.yKn|=qw;kBu9^sϾ'?N"} wd## OY|.ju^y*\PL.-I8u{{Vǃn9=ǬQG>ଌ#|uҾ>tuhh{WUHpM/,a}7kӷ W%o/+}{\3-yQFou'eVVV#T!+yg:+hnE9#3pA":y?P8XFN6L\嬑+ſkE)nUPV~-#}k%#g~UXadp3yVDnի TM=vQS?v߱[,}zKÁm{GIhOk9%ҢLNOgRJ_w^zy7__W^득7d_t}[=wo?wz'L?i~]p$;AE?ֲ?z><η7ԩr4YWyߦ *:#qh.y鍻^+JŬ=K3ԇ?D҃q2wk-ڸ=oO}G:cfg1]O+(6<9pVߡ- >2/v߳;b{#c)+jL0mF Fco|_سャ=tΩ7Wh֯ǛTܥw;ٖf:ycpԕkMv͚] [>kO|+W:'V-ǒu>N;n׼_7|;6z7 K?|g7o^?uuŃ]C< ̿^;V#GfrugYyg(@}ն6~w4svo#v*1n]U^#r7IOvԾң_ԧ}k}́?|ɢ4Wl8;^ٟ?|Hxl+ϾO~TqˠϏ\y^{$+⏛}ß}v/wIҁp}'<>pk4>9~W_4mzT}&L*g']wozJ8P,YgHR޽fm /=YKtv|?L~*VqǟO] Ϳ»ϝz`ܵuzŗ]C ݠ'S?\k۱$vMۊ9x icWqȮNi17δG7NzK/в>YC+}%WmoX%1\ԼM[w7R"};{l˃{ܷyӕ+Viuөy{6-{!;Yf|C-T0FG+TVq+V~=7]}vWs<_u#Mtǟ8tP>7駟D}gz}Trh[ua:ע N>Έx7inZ>wOشqf\/G2N7er̯wԾM6ڍ/}懙~ܭg$n5 7eH|n`⚱ϏW`+K翞s`8^M[-+T\^(KGxhGj7<ü[bvv(-o_OS\JM~mm}WKpvFEd>b`P4'5%Y~2|ʦY\f(CՅrRd~-t@fNԓ(/xQ\wꂅ .ZMtGOɸյ;*nTzV@WO߬=}ӥ5_O=th{/]C_ _\/,}{펿u.o]e5{tOOwaU {^Yp{ͽ![[{?|e ;[*J sb8"l~pr?xӪ7uMo\vG7kwq_=l_ _cqn T+?Mg_[I ?<}w/{嗴~w5H6 ؔKkkԉ3> ūn7}ucGywGWY&_T[BF5;S`5Ug?mbƋUy{U˧yۆVwQ{]sƍL徼]U.!*Nش4 0!gʞ|O}[% o۾d >~}m* ]߳}lU]me=tlŷ ;۾_eS_@7a+m }'m;w*r-!aW^~ƻhw /|]UaoN_~Wxyvue'~WO9NΕm_ e_f߾/x7?em'ݑB69g͒V_ygkڙCW {zL5??V/j|ΰ{5QoΫhe5k~կ-~{CYϤ-^8*N s_ %;.w|4`ދR%1+NןD_?m8.{qF[GKuV,\w/g~2kP+{O-qp*x,W/O P|iZ8^FFt}<}7\~io73e]Ҟu~m_p9ˮ{w|зY^|Þ&M'Sn{C6oWGg&/X7ÌܪV=vf7k_r5-7bdxi}gTyܯ'ןy`}+>?ٙWW%_B+qN}WdNt<ȻKO=3سC"r7_~ F|U/q5Ko&\D[(ڡ5={ZAf遼ǿƃc%ۣv F0t/oߕӳ½Sٷ^|Fq^lsNwyG\Y8.}+疇~.8IUݪv|$\uJcӻm1r*1r"b@K}rlϻ !FY:Ѥ5EJ+k*+ɯںz8bGEe%pWTTVVcŅ!È'nFI"'2J+*A_;wP#CFGRIzQL*,,(ˍdgehO͠1|1!#FPviVI8RV C^hзHfд80D*SRSSRx<ÉĄ;',4&atF Yn!F1bc)|9cF(&P7 IHҁ#ن1 A-zУΎ֖Ɔ:X,3b6Lfk;`VM!EUV!W5qHAqi9YJUsKH&8tE2 /#ȊHfSv. nM'vծZ&9 Qg|n5lP|P(m$1#8ɰ K̫❼16ۉtd =@~ɣ# ;cyZ[ Q$?+Lt'>E%AJ9:nDl\F~Q1Ƣt2v!Wf٤(=4c$6&5pZ*C(A!;'V uA bp+4]Xz0l\)KzY0w1t@ADF(1#6dNƭC2 IA_"t},r1̗ChacLW 1!#UrH%RB&X Zc/i,G@HNUJ\RrFd-sVP'x"!^CC<3Vng(?1DC:i-bV p ;0b5D53h\T%KfE3J L(#$);Hrm*GG?7m ؐ *Ly@[#s`5[-V,Yaư bKvP~]U<DkEHɗXD ~6_ylWCj8!Vd /Zf53Z?;//t"\x[fn)~n$YAN-!f)!|NK@-}̤ ap2,q_/J/X%cc~1Q]/dX Taon3vd {mjfN c$bwK :^\usWd؉b'6'xI)inQOM:aSP*II\XJ~?kj5 mfNt]E~̐;$PId?ty_*OY>(>* $չڊ{D[ pZurnA T B! RIQ_Nf8o+ΨQmU;xўFV=/HJL&tTLOOO: qvɨWp/Y6M Ef?Mu3 X:?Z$NĂ 5t Z~DES33?q-As顔$;ޢSJY@c ݙ$ &+ۍDvTK+*}M+Hsd$Bc&$gΊ;:Q; $OBXbu*Jk{R $xH1%v5QxVF\Nyc,pQOZ-j&; 7!J@&4,T/? '?x'C`;GEsN!H0Caa"L~ ,*A"8T^GWϓ&"> 'DJ!r.PIHƠ 1VV$/Uv QFbhdtt@_W[30ts xTq@Rlä̉*riM*Q p|Ś917^sW<ϳeRIQfFЖ>$މ r;d Aү^ 4c3 !Xa{ FJfAȤKpy%#ד ,rdRSYyR`PNI)GqANgQ'&ꈳ NNJm&al Sw%D0<:o'~ϳy̮@MxgxWdɈ9 #),#`ĔX_`iX0wvtIiinj΁v@&]szrϒb-6b42 I\8++>%_ί`%rbm*&R;53  Yf`{ m-YfWU av&iH ) On}r* H 9KşsQ1?j ~e%0umVrQZ-v`EKYPGaDhB% 8سlŐ !4I>?5lX.yiۢQ%jS犣 ~:NţېrVyԉILxI.3@*Q8XD|ܮY1ʚzů)LƺEuXc,c #->ƫE^kԱA4)$MYqJ^Ra12 |.8qn Gi)PrqT"HË}-͓8HKkkk:'$cIemUiA@6Y#-8;ʔd'g,dGْCپ`>׭R(L .0d0s*x Ob}Rm?I`ZJMxY!B')s$ )+h}՜`Q N\J ;u򥧇Ci4 ΞN?!&?BiMfd4|i>"=p ubZM&K'¹M"cDr[ RcىM_pSEIK'啔)).! E59iD&ڵ*Iˠp{@Vl\z weffԁ h NTRTHx_ fIFNX(/!Fɍ2XlHp]kHJ?$xNuTg:70KE2Rke1^Z,QȮR@=g\H р3p `J8;aX,D~e6u0K餂<0 ɀ d/ D  r-G')%! 8OÉxΗ alp~pX61|"tnd} ബ9NM"7V'S{BYTJ-$ټ"¡bQdxVǂEE.vYαD&vLP*Q%R:(ʀ@n!u@; y'D2Hgq^W٘NlNV_(&AҒvXd{tw̅cH ~uwXWL毸xA^OA]D+ې^Ag"H]Y x \jDŽ(޵ ^9|' ?%dL/,qm}c )|eJd˖HR yIP;h  V8sUMs{!F.$k&'m\IIcj{t]"zR SOzJ=qbҪy BJr `:`MDTm3j֜?1{S"ב$Bq:Q-*)lxn";g ;RΒϢ<4xa6@9!FbUX 8#B% 0gI5xÎ[LFTmTXTP3lҥ捎N brR#1{b2ҁD$hǒ΂}yf Ek 6Nfq q N;Y Av,Vi0Evݶ &?0C{{:;ښ*4,V+1BixG/˴ӥZpn%7)J{K+*o ?|Sv6i.y=.3ˎ tuI+'72ď9A"] qB))bňciNmJ90"0sh?H3=-FW}Mya76E?4UOwgemdA؍yyKtU[+l K+ G?e<7{VE'xYPⅸiT;T_[]YYbSI|"߆ 5H~y<Ĭ-<6Ji5j3^r)XFy1- PctH3u|ȈF+IX"ױ\{suH>Oچǫ ǤԒ)k7s`ȑ>hK*$:THj[רi8y&MQS!Qg.˟ I?s,2SY[Ħ&8.K$MquSGD4`;z8Uh;:Z9̗&*1{2"M~wj1(f0Y n/uޕ!ͤHȖ3f6B 2,&b˟Lք\bkYޤ6l#ICz]2"hѦ/'RfXJm/KRknIB!EExoєpx[06GocFc'[#zP,EQK wBptvvp$O؍&a<~7nnn(Ot"74^麉@A^B XNGkAVkTjG= ǿ/xV)pXXQa"֍4a5',3y8S8@Kʋ35WД #)N2Jorψ鵓wͤ׊jJT*3TL"|_yeGamCS3Cssi Dk ٩`(8W\Wf"*0F>#eLRO n9A2 FZr1Pr@0u'MS§R@: .4T쎵NRiets9J+sQҤRH ]xMʼnX'p*MH.2A4;-IL/-baifz g !F]SID u44W6wC!(;j;;Yu (ish!ڣ(7 CXGL$ 7-\c$>/^z0ry?A Gqˀ_YK,ޥːO4 : u&X a%Ҭvjku:2C )zp>0KE(K"Uu"< [ ʼnKӒ&0#5Օ%)~)ѢPy8_ 2,Z 1͟Bm.4)V@~P{V*[j`wzh8 0DGY1~݌ae @.Eb BRĚιJB4fKPǭۨI0pC @F%Mg9A.%g>YKcTr/tp G KJK -#艷T|$ @VaY­j PA\cqehuB1)\ ghqyDϑg)iڹ"͞<?2d/t0bTSxld \DdOM . `qOKe$P{bU9!G֔)@H>HPq 6 A%2@(yЍm@um/9ix-Gꦶ'l:S U[}ILWedRȆRܐǢf1%¬ #)BCfQ^?N%#(/2XQf\l?]L"?nyht^*b%idOOhᡡ^0v ؼ5f?\ޙn=bh{\Pd۞ =uQ#1uu - 7-on(rp*7xy-aӼǒ0!vbNP`N~n&S#eIJFS.Ve>h$'+05}T)g'&҂1H\P"EMgko Ej2/Ҡ$.ۈ%ąf# Ð;6:DtPl*-H .ZVY vy5`w~ϛ`8ֆvYĸuDwN\ŋRbI,I@S?1Ù_re #$h"9{n,=EN^߼? 2>R zmBne͗L[lHI}c}MEq@([Q1Z (+S7 $M{AtwSYvvFZʄ˝Cu-s b 4M 2 ?@w64vtIn?c <4;Kc{(ߢb6ަ'YL8M!Kr ,ZJ'nش40Q䪭03Ʀ nԕ7yK b7@"1aI§&W oeJQq8B8צ^z0S%Hie5h-1$oLhRCyNJ:j-RFm JD)$(K%l}̕Df QE@>)!M4-rғ  P2GeF"Co`iTJļZJkKxY5#mK/㟕hV޳ oEL\zvf(CgԴ0RMKuD+O2朜R\xiB;Di<q"ʕ!yP< NL]- uuR<6%La)R KhDEc? x}]Fh;bwdZwWWA<鎕/эipl ڈݓZu"pe UogS+("orX5P1ג/i' U!`Xf7"ȐGbn~1\ }k&iYkA4qu{~L^ʰ0 d6Օ)D4{zq-:444VfDsU`̵|=j_=`F` !D[+^Q(39ӋsZ'6;ܒY"֋(˔jQTl Q B3>q]Ȇ& USm؎4SOiP:s@S€JdjU(KXq)V4&IĨ%J5!E%WVWԄ*yr-]8q7q$pIR #)?姘ё> ޾A;H2bja\]Kpy*^kI ̃`^:\0ghw;|OoS*J5`Z R*H[`+[ ND&MXB 4]HKԸ2B ٻ$C8ܐu\׽Qn,lڗ9eœ&pB?PX+Xږu \K\K1@h*9 /JC!puJo " _X(mCp6 xE+  lO@\| $% 22*=RHT\`In=)&P*>5#͈r[R(+k +)ʲ"d3JJ-v+V<TfB')`Fa Uxc)J@PRNPJYΰIpWEVAmЂ8𾹢MTPFG'L%af0ҎS<RAke78 "? 7(¼vBWJ&q@QGtut>(3#32.,1<Ei]Ld>^hԂFG̽d2_4*âT+f2h(r|(Rh&Z pVd!2V^7'HƞH.NYiE9'Q]əssoP@y>AC9i],jY*l`'`Ȧ)kL'% bMյBPܣ?rYrHdoJʪ\HWmemk؂ӴhE׼yžmC1]#2BL% cR J~db"8#ǯ K8 4hwLQg&y-F@{iLU52ں\ YH l|IˎĪBiPMHSy_ $H~Tm%@P̐#'JNFh xΟj$ޫQAE^\u&a|U 4у@.6㽦I;A}-uI )tMҘ잤Ԡ/ō);:›Kdf96 $ t0KMx\ԋLeCԎͺ5E: à!:p(꫚Q70z3ァ);Q3%SHQYyyYqzzkwOW[(\4TF.[6HRGK}n0,e8⏥T}3e(l?OmdB<#"āGÈ9f QمrhSrP WNO0' ootc]tI:&Otj&r_=3Era_zERXH x%(&%TNo3L48ڒDڞIiJI&:j ̹~mv|)J/]);$P!BlAqhГ)Qe)ȘʄcKc>Ql`07"~4/ FӓKnhp<;@m /tOfA 8Pmvia=mͰʞQrI׸3y4~"h'ʈ(*ce vЄ[y&|w33UϚ!W(3 ƪA#iV9!cM`zq:'%?5> ^?A*iߦaR,lVm޼1be#ocsh s^eJ;9[Q(@6qubICaȦv/Y#xs 1\̄pamg.@h$j~D‘$]+=3GD唙ڙ|,#KTb.I%M 59q{ 5j?okiDA,--qeu.|N4L>; ~ q4Z]I?qH qJ!B%Y^E[#bf2rK gr7( Gs|+uN`yiFoc}uiA~xf=}69=ȫJHpzAd+s`1#98:"T2;=ԧpA\@&8ҁJǜB4^Tr0NvN24:Ulx ?얛Wj.#F{ .V#Z[SQ u fpZOFAxEn~Vs6:EaZ88;7 02 J8fQJfW TДhn/:ȳɐ0儴3}%u{|@gݠ5%fV5S|-Ƣ=Zq_&vܪ; #D^*!zϐ(`/mv+73D?&2K>HPROa5؅؟3<(F7F^| ͢_MeA9ʁ~awmkG'xt;X!w[#lʋ `_Ҽ 1k;yЯQ+MbU&,?Gr=+EŸ!|'Ɉ=GE\2A1'DWk-D V9'zCJUYtƈ+=V}-n*Nx~I>嬭j]Bߓ| vTp$!A/n֘ :ĂpjNK r?&H!"p/ܰ:|z P vŅ9 8FBch /=}<ȏ)-- ,'Pj/ifB L8c)d>t<„kWafUSȅ,ZNvؔV*uHqa8|b2e8.ӳc\S 4˅आֶ qy z1N""Av0$ʼnH;C!'"&5/J8SC42*JV/=naWb]=\ز v}4mȈ\uER4q prPP-jj3:[j &Y]O@U ]y61kiX8. 2:a%Xg0Uj 8f"Jab jGLKJ_"\[-(!jpkJZ77d~ڬnb@8xq^V GqX LjJ ;U!oy+RZC9s s` .ۗ~͂Խ3S!C%n&4C!ԅ&suOJJ t`|Bԫ~vX㦍 -86cD퐊 )9Ee]5 Z`m?\\u4`u,JTKtun!6TiyJ sJ+,2.%;  R &G; SE333ś˦o C/qVM0t|`fCϩ,GU-Jwgr!(E)s{X ;y}Y۷* fxP-)G! ׃{)LqR25w?/!?b 1c<;58 Ev [ zٵ,4@(on'G"^g |,&+m܂<q$`B$6(|iB!MBa^׾jӘڲfKLɈ%SdAwvlT͠ Uqnw HA0=T@͍$I& ]!s°?Wʨ**ejtuЦrF4E.GMg3cVmJ",vEh^e~B&Bo!ͤ3XW.f\~̨!$7=[,v?&ŚW]=FݤmF)mxZ"dΤQJܨmId c*r&EM1':0 BhclEH|i Gc +Nz*P* ಑Z4Jj ?cc.vEN̊unp&.KLFNOb?`h䴴.^c$2Zvܑ@DeKI/4"7TIvK0Q (m}0 ?3 54* Iq95s92mq-;t/堧g_,)a֋0.ѡ!#_ B45yg~hjO&ddI8ܤf.APG|)Ni~NM*` m*20Q-3;ihH7NCn|3x8@> k _boМ܌ͥ3ǂ3ԩ`am=VrWU=l$CTOЛq:\ҳxsM&}z]YIanة*Ӡt?Ԅ̞ t*akPPJ pz:ɱ^|y j 咓ē Cviia L`f2q_(~9WmRrl8 MaPRTPpݛy΢'[6%%B_A)Ǒ=CiHd(#rQ f"x`ް)_+ga[R"E6:<61HFB\gϢDZԀLinlJAaNQDdG+enx( m|́7qPஈ=h?_ʴhCHݦKwZ0ttwt)y:A{b‚ڻ׵45Tyt9.ʢ6:[iӇ*ZuI [UCS[GׅX}}J!ص#SeAl 2u=abIc3;I {YHjEI7 ~~PreziSR$" @u}#Pb",_VŢThjWDx ,Ny)pBd1PAri|9Ôx({E= IR'\b -rkG}&~b:3C*6/8###LÖsi/dm s3p ~w/8ubgijOr`J손{zV<6!0v|l\Mcv[J"4UH%C[d& SFuAZ?(uLy ]qDx8AT$6&)ڑSH(h5oƄzmIfh >ظ/aˌ:VJoAǛ8A FLkMH0.EKHuỶp@s>EW󸉗, նWJ֘TH%J in}׈2A L=UqWgL9l =U ?4XuP`cooպ5t AOw3 (KkO"]:ʳۛk۫;Koe!)<; ՑC5v`nv9vUX`9B`]M!jh zCjLAZR&yι zZęsU$j/HH%$aHf[|.+G9-HmwyKLY6i %9a 26U( A7OIiNIa2"d$$)ZP` gc,?L+0oeў638YUюeQ0U^fZ<6.4z#l)O)uHC;fT #-t8 $4F̺斶6iF(ϲn695"ԟ'gEG+~2ȤI*qQ$>'.s d BʕDņY΢$=脦n_rzMP*4QN-s7-`'H A|:] X#GT !HG47jeτrrgtLD7=T'6WW_m/*coCup:t35$SyLeNGY(7|.8v]b]5PUZS<:j(k/Hb،*bO\-gN5㥘ImI;2ПVE֌ҩL6dq n7~2nʁՕxN1 mb)d<%PAKL%tn& 9t@Vz9?4uIlQK(#3#h/mu2Ubf~A1X#JiFl1jTF bfO hiV[ a9 `S(+% VAGfFB%Y!|^܌qn`s%eTSJel%""UbCc{FVɿdK`͂jna+Ѥjki2lI8]H%^_Wڂ5ڛ?kFΦ`Z^B{V*?&Kq6$T6Y]Q5IJГ%a܍tVO ڕދ;zn &u$DAJУ]t:$!$D0"|Fr08[r9[Xތ/-=s 85N[IxQ38!RP ]W`dHQ0gѿXI;J6MV A's! rr2R8A8e䬦.0 NKK4r&eR/3bϰ;&djItiZHQԁ m yYx {FNh4IY%*S75+"ںV =G1&]WA~ae=h8W8T8 ,%?%ǥΨ94ja<9}w>*b`0AbTR{iff՜`OӴ7NpdCMn,ߊ< ^'0}ݱݝ5pwh#e%9>t-tvȦ 3iGב1Jksn!Y]7t1Q~god.NbN'`*ҭ䠳T9<$0&n"poQ߶ջMܢ8uh +Ѫڙ(ViKNEKѕ),ȕJ%ŽHBP ~"szܧm;6b{ Miȁ5*+q:KkVpȋBbBGRhrd4!Fi*c"talzB!*9~b[@}~laŘ4R؈CEUP`DЄۜ\˙Z 4XUl:K-%uZU,d9/E"7h]F2zM䖤ݠ53!:a0I@J8+N#%NF#~TJ @E=I[FZ*@vI[U,RJj9/<:2%Ե6Wx5LڴRq::13J6V2a:"/y I JK6Ri3#"IG!t*O1--)K+axkN!3?1H72F%-f5o<4Bk톙: qfR`_FJ֕N?'d7,IF`l26`leAUAK4_o'!1(&UՀx}q#^Bs!(E1>19SP?w\8B2HzNdS|:FNQN*}5-]==½0#VB pyky֜``*B.G Yi\,}ۙwT{m<ʧ`Ғ\&K7QZ/"0@4h"MQRt+ Zf%ňJ\]thvUn- 5GzduVx 8m3M.7muqj_GV^*!6 Ӈ-gYrT/{<0yӇ8$HX ~U<ʻyFbo0R4S[dbry0p[pm"d=hDiR}Kz R Ur*V3)`'gL(h8Nv " T.bʢ٧#vjPRN8J 8JT5{I~B6IDP_]EpAZ)XHLa _BaY!Is.O6oظ1rgY% MǠDy(Xu\SCXy!(CRP!BFhjG>.|o‡=T>v0t2 K 4/i%2<5.?HI UMC%άSSPpCړcSL!$'iD*8:I ,]V0ʞk5 os#ۤPFw00CS f>T`j6݋YbpM8ʫYMN%1O؄{y*%h&^k?n$Lk"9l)"0RwRRyS D]S`m&:ro+$3(,~ u.BJW$7m)6Lb -r)ZT_(~FC?rS{z"gQ mQKs8 ge߽~֘yW0G1 zg"| 0lDKr̒ u;{eRCXҲ d {;)hi;hs&W/$ 6nӛ4ٱ2FXʹf9ܹeLfi3VGU59-Hր44\&a,:(*NM*$ VFtw Ej DK&m5B87X0Fi q-О0,|9Ƒ)!Ty-v56N.5H k$FAb+?j܈1`uj2efWk[(VZa)y } ZXx4a3 B2S-iD* t^3e.ZQ>X3N.Ҍ"I0uny"mYCf]AE[l: ѐH CVYiQnC/uKo!HP!![1@E@?#'Ruģ4nb.\Hݢ{CCaBZD]/Ćd a4Iu/HИ_3WU^E$B 2wDw%9Y(YF`3NvX :o#n7 ӮfWϜUէOua M{KOFr8-dO6jyStgt>~ޞF(n<][KxwY+~͵a֍ڙBZ)_Sw]{M/Vdw.z_ںV,ImE|Uxp^ۋOo?|?~o>ܱ具?͗|d˖M7|5 _{0K]%.9%s*HQ1#P*bBE0JPPŌ5Ka,;Ox>z;LWWWW|?__6]<=Dǣw$׃/P{l]~{r;n͛,旒_ J_U 7:Wj/u˃]\'f EP G-_uɶ+V>qqt_|3+z W܂/wQ塹+^sF?| JBBQQsHȻvth IB%6(*|jL`0E[Kr߂ȩGλH[_%%E)GhxOpB?K46qFaybn\̆.xlP!^`bu{%`s7mX};ғ$TW,γ2EQۘh#Swx]8yoY.>V5=S_lYe"/]ć<.Lp2Jb#tmL/U9A#_nIi$=G[iwFO^}pTc3ـuod2o[cGl-PK_B3\L$y8:By[/u 3xu9XU]RpLj\ٹso0yu§IvEdvRi>AW_1_χXXչ#q% gK3?jeG=+#HƋn;TԒ+6FE6 xoj:lC'dM;>m*7<*(jUnNei?Mo5\~YFPP & &\q馤tH-gR0s堤]ZPىIgLH|C|=eF[%E$8~ŦIydžb5[0)rSWTcsEq’5w=}|zs%q!%z3Ohv5߹(PS:ZArgqϾ ʼnW5^O> :=ݲ;X%2h0̣sPχ?R);xz֒5KQZ ꗫ6^M1nL],=YX_H!7I 1O)hY9JHCBe /$dwʈu1դðRgqB=,yȔJʼnNPNFDsZh䆝U_OzHWuI^/ݔpvMB2~H,iz m60)$ymUՎ6"•y-+:x5_yvzw/x TqhTKY^S'p#/גӑuRnKǕ>~}k{Lܖcd'رV-f7'wy ZSϛ~PvISvVI+}yfMnB\hu8kMj©dDN5,1Ƹ?*_@E]+ٷQmaf (e5Ӕc6doyvI+~2 O2X?Ӳ7[TnUկVJU;Av>AlSU #;.%ޭ`Z  ҧ?5dc_Y%Q>鴥亱EvAN16?_-!BWRVyPUr6s},(O 5/Z`|q$O]jEs|]D04(L 3b{S#mUݏW'd4eD?WHMe /I8.--Rqs<,鸲qFu֙]eO3 ^|ԉWۧ?(vcyțꇨIgW/\*tQ7O'ZK :\Ԋ?5J-ҰE}[ 1Tuܼ]{oZ>H qx6z3_7@ok'Y>J/ݙdpe<;ȼ9H뾞#KAߒ]3sNjbvjqz0hqEbN;x'(Z˦ٻrӓ~.()5pفnRqnvlsB7Ld[Ғ("UnV(hS0X6܆y3ޠfuB7rLb `S-kGw(T%kZXX~Z"]Vϋ9n&pz߀+PvC8>7r۪~֤4R ~JɅwVHώ%*>ζV6\Vak?PL Î}]RْOM珗?zǗ׷˶,;P͟7\6BVQmɁz3;0U&}Ճ|u)HrufIyGܲȧO<[UܢnOAK.o4]2/: Cۣϊ4C2lP5 nnysGX K4n1*d`y֓Pޝb?-=0p6\Qǹt6 c`*} Gx`'a`vGb5n\}a 3q;6~x,!ꍚs 9Q~e"++D6 ^|iK B4ܻZ[z|^o0:8TiPGuyy%t-xƽ/#~okQ]lǥ)D+8~$g TԻC% EJ?!V\sw-wq=|lӏi&ZӾS˃]"*:>E?)uY!*sՎM1Cj&ZHַJe]% >LɅl-w{r2ϧ ^P/n0m1%nھ&&DjrSoqW[8T{Y}:l]"St;?^wKRA0LSEJ}ˆWҩѧ~p>ۮt*G-9Xp6-zwAڹR'ER6Lwu0;S*p UŽfm]'Ӱ6_)ddݩӏT=dxU[o״zz"QD@ @ޯ3[_l2Vsp\75>Ujww:J=q==y]{M=MuZ=_[7r~%dyb[kej+.L9} }ѣ#ߺeRFI-w'0 & aX>*?׺Q11lvd`@ʠC7UbEo?(:]S_,{u~=fÞ+^cQA@O;*?<:7ĵ]gVE]jn6gWIo\-c'V`5 L14&Q/E9)o!ǝkn hJofz.Vqm{V&}5t̾Q"l{.–5 ɻLSdAcͫk{4D`Ͽ{Oe~;aʼek~~ ι4wWW4bO?, *c:WOUR|40Vu8U 7;r,rO[#Zת&MnZhC412)eKj7i`&95# ܔw$~bu;/WMoC}_\,VͽkEUֶ{>4L0Oo~!M{ yړ'\W׷y)k0?f}ZW,Pz8JcIW\9su<q+C9^ׯCnj<^)+Z\KwWX!9soLc'-xSuЖ^E7S׏,_C3aRd뻅6ymcN#3X6OB?(tgV;87aJG Yp@?RTו}|. J0̭ڔ,|Z0~qY;Ȁk2:n0r˒ZcΜkc<]޼eplz~CLUEZ\l?yo!㸝m/i3s#n Yj,|Lg˱uV2 zv;ѽO{|j,U`[Vr0uښ*|!#Ioy#J-.CX2OG]kDXZ_zfRӦnz>}Qߝoݧla t%ۙrtx -y3sN@gkjd*}bž4{.Mͣ&:?/gX}McĦ;Oj-}WNvSx~i{56UCY_}>8yN]^"+CzN/>N.Sak"UKfs~Sxݛ w݂yg/ n8l{{k].[o}KΗY{cnFI[%w?dNz5L  Y/p5/ty /0#KE7#IU$GBj-WwWsA[ Ցc[(Ύ_6Һ3=+q`َ7UkUmwۊ֤8j⳱E&1,^m"4ph jt뗆[>̳~P|;L͹z/r78咚h|%=/$ l1f7}jx=iȔR~vd:۶Ky!ʻT)}4 ]KkK6K7qy;0'tbTG mԗxS (I} I"t,kRiz~baqǩ>L?^ʫެ)J QW$c w-Ͷ}&X3}eȜ+P⥜y/4ᢥIA6χgV?UwywGO9]ztw?i>ZH>:Zr6˕xЁ]:jş~ihǛc^Zs\:HH'7[S}s[}WTvO7 gLn5SS`x5 =é:TM<μۖ`<b,MS>u|꟥ aw-u1ʷH͏b}QkÚ =p:]@`ռyw~*^sA]ky?k'oȹ6j|WɉX##E'O!so* lPT: *&ZzżOex*?v54L:jtNaf35qɤaKR 'csj׼%-* ~㧸Ѧt{vϛg崀AW*vpz~ <*-^}o}h髇#RI1@@ԮAa-n19ݔk%GMz^vyay e wWL ݼ9cb;3졁ּg99}(ZII;)z=P]qҷaIOo9~^=:V.0Aq}˴(ehU^rNoަcV-aۘDND*_'qk1o DtR<\׽ĭJm$~}:5oAΙ=k"/JˮXE/Yɍ}I`ձ{X5z]?ȅؚނug5"k͉vݠ؂M %+pS\ k/))5U 8w޽K\5xM'~Q>gU?zcRkgD*6Mx,cbXB- E_[{AG}N޹n3@m/4u@a,8[òx~',#V޼̌~ʚ-ɎIOO]#~w<=6\w^?HÕÛ{/ut֕( xv\JYi4Kw^(>^)]-*xŽY5HFyc썟\35<ϸcǹsE[*˭woV@J>n~ɢOK= OZ5vaǜ}ƮW[a+7Lʘ:eQEjdd'}C-:ᶙvŦB|cB$195 W(pS{- 4⠈ n͗MdT8 /9<[>PVNw}Q+j1?_#hn]@"3Hs/G٭<"sm H^J 0Qs˵/iaE֎m߶7{K< S~ҺfK)V˲*mU-P:5$/Ctt[//vߛ}7 <_>x.ն@Cnݙӫ?LX6gFջB^,e4=3!=*7# 4 -(|Ⱦ9%{S*R "(C^'ySqZY;540n;ۘsG&F KyU|&3_ ȻE/z$wM59瘻$^~X'Xdl[FbNkXxTiv6iM]HoR/g``y:%+>cvW{;]seN݁Aah5Ҩإ(29HV0q\8#ٷiR y/1~.Y(vKw[H'77̴ZNmY!9C)3cA1ʾ9e=sYlyiL`+V)-fDDSvvxeĒ#)F/? ,IptO3WSv,5_ Xvrhe:|㧝d(ݷA&X 1kWS|OcwWP+؅o#_޽OuuRc^lY~H*@Ɠr#2%)$T42 59~e[YNljX/`|=h+Cl{!e5/N9|~+{` )Es>*[( gkϨtW)+&^aR¿NjOUH &Du^VNJ#[EG|nc r$Zx/ăcKIT+L ӭΫl](Od#oLI91Iy`0C#iO]qf9]c ѳS:X n" APԵ^wVn"ֻ޲*8%woxlS&S e+ts.޾9}$WcTXzyդ~*fNDٌvҐTrћUW)UFj|+`7/D20 = vhY]meqNnlB/5_歾5PN$-@cˎ}~iB;/86Ʀ>< uty=s(E&ePP}AK}3جo[KkVϡJr~v-K85I+QһLƋe3.&/7˿29#R}^?Rșw<_XhY9zǸhV9hpoǾ?ݵ%'s[{Z6[z;ҠjU]YV<זv2xͦ5;l@#{`7ůwiOЗ/=+[&{g&Ύwq I>^Dl/~G2 Ytfr|yUHs.SX˙3}#Ƭ^)}^ˮwtz w96X k3 [@rɴ7C )nn1_S֨yQ5[\5Q^ q#иblԭr.BkE$,W8CFGZMwd-9"tfc{_Rwu= ;UZE^Hz.nWy_;jT'\.SSe%O2ely3/}N 6S&6W86KI_ڴٵMX\`hLP"d nP~rTk;f KdR%d}ʼtiN/e.`R>匘 um3gao'-La=6;j.eem{-Ƌ}^z' K sdE֜2{K^d*9%j^ɐ+_#o 1\!; ]v`]}Xazұu2ᑂ}BAv]2l-+c dvۣt4)\GHfy^>˛W55w+p\ C Yj{osZo _ݫ95a~OLM>ߎ)K~\ksjza坏Dn'v^9\Id9-hvf-Ӧƌz/ %&fY+ҿ^,uBa@ȢJ&a|^9)+T^8·ս Itg6eC<\ۙw1+6]ʗxk>d8I \}QTߢ?m>rOF^w]ݰb27ƠʽM:\meS+N)RU&KӦ}0-5hHxaŘc]>uV^ŏi2D],c˅۷T8C6iEO}u_\4^)~1[. ɼzNpM:s%+ߞ^ٞ7ZeWf`?} ?𒇑uwidŹՉ4S%yi A8bx+OU+?i;iTR{5ypr^AEe-2b !nwx{p}ҜDtʓ[rضU7T7t)L[\ kY1e* |^Ldшs%au*{j: I0,.|ԃ4kKB ~Rήquc7ڼ7nbS!|dhbgöϖT4Ytk4-_aecSmktぃ\Ѕ)q>0$*Y9%m cGMwSn[oqIu>9e(9!B&7̳b~Sנ߉vr;u.!Zrڨ a 3p-<:N1cNLpV2R&p^/Z`t ZzܙA[+7 -0\B`.E3?;;Td8آ'[QO}jWڔN/Q]YHF݂-QFkZx`]?iVo4̀R^" l|MVOIp#mz8h㦯%~cż/$ڒklLjj+=Fh1 'MW>p9)s,h'*[aWʇm_6XG]ue ]QI90Jyk~ }ԸH"z?զ'kLg'PaLFҁa梪֔revt|d4:V U@[BHbߢ+s@7Q3H,qVTSe){.ͥzސhMn_+H8isxki9WZt`PothP qQqE|| G8xLyXv5_ZMB^z!XG@.0DcjpKI*I5Ky̽ך]EyǿfP@}%MϷ|aҲ&q]Z%زs񩒜M/ o#W(dH Zzƶ.VR0, Ymw]x\yȒW)C)[m..n3765(i3퇭H7&Yoy0&* *"((VP]Mሤ]G-Z\(x1@Kù؛R-$y72d5-bMyd""__`2b CQ+i0OV΁W1vpʳZ1 QY%=KO{^ő_b+jZ;88Z: U 㳶4U VI*WL).ǕE|$^0’ vIHHIpGA=!>_O\GJij`h8"IhA1> PM%^>mY\hG9b|RW "$2v F 2?qB ()Lw`7jL[Va|<_T62OO?>M  j0$C@?]/3CL>,oKUru]JC Ykcf,3oW)@oX NR34q"BXeGe[W f@W%AYYo`Aȡ᫢8|eBS" (xoDt r1#C}]4EU-aeyBqptkW?^Hp>M牡d^ѥ#05L#('J:QRgP! h )BAp+QΙWqVqxaocaeĉ " :ˆ$4 qY%um_x}J&, _B%@U+/''$d9 b5U% <U90T"8 uf+nboh E>7hJqxh0\!&A^m1yg`0`ЇCD# ޳.O ig‡ B)#(eMO 4g-xW`?ݾґt7V:€z jLU9"HVVE@$4WUPCRU`*ny1)yEe5m)*Ώ!*DKIH\ E88F!ࡳ 8,MPJJUX!0 J|"B( D):" O-{ vy6):D# Ә@UNN3"B|"x#%,Gܤ0GГ&ʒVT'D@(s7h9BRQ`Aq ޤe%d5*Bq 77Y)D*t!iq11x[6 4ht܀RqBHpps{B y %3`WӀI ܲzL ;seRhx6&9 T`-oh&#KXFMТÃ35! PU11PC_]]cfooVϏ!&D .Hy{$>KxgXb+:Ed { ?JAIPd7LAi$(q'$}D*dtEpJ`0=a0B4 cz s+jLkS}5&2fM.&D`$4eT00%Xl|6+wk CY 7R! 엄EuMlC#̝;/6fޜ`Y 5wgg'[>G`/,`.!8KΆata:;3[1FE@dp/pc#(D@1bթAt sdA Av+jcgI by*~@H[7%l ~AM\UG[CIJQ֛MglgŚugx e-LS2KAJQm|W] Gӝ1-qaiB“31|JGsìp?:QR9/:P# } EamQ>r(e^!M&Cr:,BraI(|%Cs n@Ҕ&1&.Lpz:*JJʚzs(K) O4%OPzUFPa1i% ea:&bIhwŶl,tɁ/)f BrAsb.PBd' DQ 3Ї@Dh T IEii#lx7J.}X$0*|!5Bc9FcQvcgma#F￟Ŵ ,$.48pMq'zKEl&ܣH=IYMsr0` M܆Ydi5#YI?BUa7QjLⰃ1@^ǀ1~ n̠8a DOTxbvιF.?ICLSv'toef{a7~={C3@1TZ-4!$jd dVb۬pw'}&aM,&!ytRTdDvC 1r9B/i EI ! 2P!2EiTwMc3\ֳBёuҨH٠dY.Hc9YV=,_cYM^QUgbn5@wKYDq5zqELI]^Ѵt)B㉅G(&z6a '߸Iʐ&q:<†`_GI(, E-v*vdFտ K~%4+5(xfc"A*]PuȘۨ0j[ہz0j]̴з9JlH[HD S*PT]f <_ b 0+霬 >U`2SFpK#v)|RiN{?[@)K`XW |p̻8aKݰu}D؛0 >("&ĽmP"Ju'̐"x|ܜJᑚA H)Q]/ɗW@kA?Jn#6a!B,BiqpĭmAV:Ͽ!0H(a|SK[GW~)h Yt2jVl mHD؉g2u2<iBJ}I X, ÿt|ʗD#U]wE;[1(L`Jx@Иa#2 inj%Nj"\Xa&2r[ VN9+hAA dhZD-O/\BBZ1 H`MGCt% 6R@KALa#VI3t\Vpʗ8sB07s*g)C$] `kpOS-J ob,s@ܨhE+|V!Ϛ'"IMNM &@XFxG#MY3(yMzGz繤V.L%2 8 Ml;*H+Ŭ$Ja X.[S~)Sii)dd x`GU@SQFR.̗ӄ&Ąä$`BWб KޜHeI\%_(^SHxX͖tóq*m@!*41 naI>o t15!V 1IiI~f!xFTVK2!Z #J]LHfhT2  |uPR302AzԜð\s P!DL?(,&Om~ l|'E3(RPd I3(ňDh C"@Hg4yN~"̐{M 2"I1 9&V]1 e>HTu-H`]Ęmh^(L cb _9l QtV )R_XH'hTS8P <e$Eܗpy@u՘AJ8!ė#Б"uEz*YYN W0|XYZ 9r PF)#+*Q,J#nSaGK" (bxͱy9H `YY_H37w֍ͤ\6Jƣg|_{H+񩋘Hs-9Nd\6>M~z]POC+'UoTƗ^>戏 Jx y{֏|!qt9<{Y (qŅHx:V.~Aav> Sӑ߄kq+%eeY&!ODBQdLBTȜR%Ѫ\Fڪ\)0@|(LL|"wƧ^PcqLcShͦ@B]OSA\B",Ц [Q =r"#S>֓mb8&L4DA,*_þQ*{dI$atĮSђſ@(+(!bϧ Tc4OYrD},NCX`=@L'v2EKEI"<45KZ iiìOOKA! {* %1gq 'ӝb8B,Ap"3d5t٢( RB,}|}B*)Dj|˗$ <%c9;(+mlT: Ƞ(,< THG> DCTeF]9A`JJ*ol |1,FGSELsFFVq/ա04Ņ2 _Ѕ/Q# bedg돧R~X3Ci$î &خ3x(Vh0TC/π.~L4b|$4`C=1<u. i{Lj;7+4-'%@*hgP3x#vowG)$===`0QX1kE>餀! R`2Lcsu G0$pX]u 2:f~xP0rR?F5~>ʊ*x i`۔''0\ 0i?Q!6k;!{9<3ӺA&`|ľnx٭Z@06f=Ny(#4%n̈́ÂXݏf?˲˪h8REL XM9`q#] „E$6Gj ٟUo7=}yj\Q>i⃯s `. .<9R2lqqY-+g09#|Q&8ٺzG+K^ZRdᷬówRy5XD\ZQCߘ^k'<n' = liR!i*B!ҿݶ`{,}Zw~,k3<^prƧ'9_Fte9tA* [KZ(Kən }5z=D5/!0OZHbR jz|{9 UG%?i>9t %#1l~Qe9˚hЀ A)W1s  pqq0 |zwocHE$atZ58v҆L:[VZ,p܃Uap5`3}<0sDU I@.$X0ř"Th_'f&% )mhGW`?>8e_tܹdT4tM鏛fH{⯮dvE.\f~k΀@MS98D2sprqtE';+sc*`TY 3ŧRe8_=_4Ҡ.xwPxJRdY,D a,$w~V tOtդeܬTQest@3stqdc;;0MОxi[ӱmSw/ uLra!D(N`"0&!,%;z> W$ K5pppyy Qxa\MAJS z_ B#,S S]is~ MY&^U>+hI AB 8BقxH(R΅b"F//M[+ȉ__ bP"rJjZ:FxkijD!*D}ILKXk"ya1[d't!ͤBN&hH,M tH)* |QD <?y#qtJx3(s]2VDM %vlJ,y sǾ|ݛ.[ޓ,FK$VVUE3Q<]s5̉C1%t/LkI"%LD3lYBWc hBLiU]}=m|V lҋ?N/$MOS u!W;w/Iyu]]p(%Bc S8S%VLUxj(2LwS$b L->"5a*we-^[Lhsdd%D?wP](Cuy[5e)pn;u2{:39x؁n rl8BIpMY 6A*~f!'jg<0_}&!}W_|_/>nkŇ6PK7\>X!0!"sic_daily_sample.zarr/siconc/0.1.2UT иeBaeux ԱP t@)KK /Mx-vxuag}/mewavygtJA>(%d샒}PJA>(%PK7\>XQ$wB"sic_daily_sample.zarr/siconc/0.0.1UT иeBaeux 콇[S6wzBBJB $B -@{AT:( ,XQw({;{)j;zo=(&!{Y3k @ Af@Ўs^ށ L> * C;=އ@*dx(_|䨯``=3 GS5sIte߷N.1ۿW%8ItTcI ?uE__Wb{Ob'kS>0ZbiifUUFAiэ\VVdhCt d YV,xI"p2(WDޖ_U-((Ǻ C#ƨ>+K69/€Àa!4}Jx7ʁ5kYT6iq@3;V'TvN_)Y7p$& -HxF?p%oz_P3]UL/3e|O|BJl̄AB==Pm9[GH$Y,|eŁõ֩0wկ\U7Qkh3rhkɂN4'\aZ`Zq>́p`^se0ѽ;mdީ)3Nfa+؁{I5r j6,P:O);;h;;$#$Ug)pgEp4,t0_׸[&:MeO]}mO)&/>~2JpЇpe@<_??_Qݥ~ZW- GCMvi :R~ Hpڻ o/7,s|Z曟7Ns9Zݼ[+os찤g%k*X>^mOS59"JLb5Wۼ?I6Yqm(vWMߏ7o?=| zMyUd5{ỽG8 Y^VaV?,Fo݃Y5Gx_?y\dsQۂ*j-n_о vڗ N[QWFMymwRxnAHYԓ>o^Ro9r&#8ѭ;tR;ѭ|!5,xy Lknx|=3Bײ9![9Zq<}}WU?ӹIm`csl [ZUyK 7Ԍ5_PY7 Ӑ'tBIl9f=[hk՘,2U44`G︺g-g)b?5"aiʝbkLp]O}0br f5mZ|П^ 劂&[2m/4SAwSƫS/^}UQEmFɏ#:xvco笊!_Y;kxp:T-ҧEFfTV|:fO[WisC=x;",}4eu/6uFM=ޓBN?b1S3<{thƝm_K<,+:p㓂_ԳgZY9wčj1}קL{kKyC*Khm3_[/bι/ 4{I J,Űr :6\| H.}zf;|'vY8EtV//fn_^H"͜sCEq9Fpͷih;`Z뒲Vu{&'h§*ϼ?oaDh@yo@g9Xg{Fi#}uSǴ+;N׭ ޕaZmO<6=(Vx_CzmԣFmWwG\\+&uZ-o<^^\29஺41oVkws\}IJϺQUyq~kn hL>E% >Neo'Zm?Vq(qhiޢ k D=xO+|,Y٤jGހfg}]UdSZTf`\03;M<:ߧ2'T[d2>KK7z*N/\SUߟ7x%t.H:0 eV5}ղt j{oLtfnuiQSr8o=4sԢbi;7O!xZm4}hOE -Z!ŵ^nS)*ǢO3n`A9H_JBOg*P?;7TOYS2F9?;tV}7>A|hfW TlnW e66jfgٮqڍ0_YYlRaje2៞Kz3_t*ӍĀBf-F?ߝspgf2ŭGz}&w~H U 8'.ShO27/cRo^8Eԓt*?]9Æ=3MX/׃ռxmdfƞyɠ=;uO)>#M@aO[7MN_Sfdz>K-.:Ͼ#Xk.oQ kN'c/`DoĆ:)ͻd.T_5k͈LXWͺqcӉyQavώM)`ZXmĶ9EAjIXy+'HXr{tb]U16Mx<}zX[u.tmEYo?{&8M]/J$- #nѓ~.d>f=yWD'25ӋŎ#|Nfqt[؊" Ғ?FW7n$ \Wbę$ e]_ނ^'nL۩ԇuV&cP"_۩;z~XTr_C芰(gN{3i=ӈ'=Yu)*=|绠ǬN_Pj]^Z~=7զ T%D<={SOKoM|r2c&lp3Ƙ.oݔ%A1ooۯKܬ{>}nvNG,tc_;kZ6 `o-=q5s0rYsfkaYj 2 qnfWdvnD~;/Jk&b>=;|ȈEcyӎWem6O\4V4\܁B.ANZFڏỷ/\=;Ұ;!vJ047; v=`Z6Oj=]<}mTKO^\}ԇXߕ~]tZ[c*-iW Ti⮉ IO/1iZ.B{5/ܴ]e]kWz ˬ>έy>.ɓ}Iw*4W~K\9V-!i7G{KD~lˠ,Z0cs3}ޗMlŜ jy,x}q!Wz%ҫ5wW876~ho¢Cq7W48u_1pҺӌ/s&(aګ YG4B}t)2RN碆QҲuRҡ&XVFwZYRGy9Ecw%εAg?9@`2IZ )O*I4Ć!"" ɗ6B#]-e 'DH AdmSg;cـwzxy:*@{ 6R30[Zӱy"i1%(ICZF>c`7~UP:Cϊaaѡ~&Tp{ OFbm#5SjCB/t 0tHO"t&5T,SSh&q6dSj\Djc@PU2o7{Sm*q|LDh@@!GUB­)__X•D*?/w/o0<=<-xC܁8,(:&RWA m=UjnlF:8`Q 3Y#SOCK$utpr`a >a,!>..666&:`OD 8zDx8x#((Nbne` cq"JWbi ...~|m50*!6̽\pCR#BPT!An&B DFF"/0z@L@Zz| 00||*^NUU9s!gGwW+L99* **#KSVeX\VD J*J @3c`nɨL8@1cbb ~B -,N3XxKMhXjla hA / 0`?pdy8ؘtԔ-A""̠!+0d*X!BCCC#"5G/x[:ZZ.Tjgg'X5#ruuusEUQ}2%"= IɨQA>R<G +iT ^d2@jleE2 xjԘb(q]V'RVf&RG7/? CT  ; *\b DYEC[98{+*;y1 tAg'4337VSS8 E ) !O20UNS23&rY@!-%,@_7;K`I o 2615 hirbs K+L_E(]}# [p;n` @HHh(a@U)Y̌3 /mP~0,יZ_h(226X$TtUMWCN!p\PWK]]+4:Jl%H KbjI"t4PWȊlWFmAD&D|`Dٹ"zv3XaiطCX=]=X޾F~PCSKMU4bc3+;{GG'g8=<%|(xlmeVfJbJrRR(āy{@#Ȩ؄ԬShU,c!׹109++#-*9%9!`||>!-%=5999%7*<<2 QQ"!V" &`gc%FC44sNM悥EֶvRs.BҙJVR;/-M Q%vKyz>!("@ DddDTqBMB pFӉJETZ蛋nlR<,sGmc HoP(BP|mPVGPU5{ &P 0*=HGJaq`1:֗9H-Hl!uH[EG@" `C7Vb3C}gs<= "dK BP*UTbk"+Gv-G L MVLA?@ - v"))9jrR"`p,UB҈@HJd p[@kH tqrZYCPP-mV!A؟{*"bGb bᡑ'0ٖk)_ "1._&35UOH !6,?O8  ܃9"70.N|6r| p , @o_n)qƾr0 D}`LU UU: 7 5Դ`q4ՐƧ fx-SڊuU$<;pD5=;\=]j$ G&wBDVRhkmeaap L(p_~PH$*#ff2Lf 䏔DVtQ"q Xee}%ƃp\( !! 2AtktzPksh2Vs!qI37[K4ei9ҚR>3˵saY[6 nZU19SXt-6zΚOl^ k??bONQɽq+z}^Ga YU')k}vtl\~"h,9-]}5=꞊m9z=T#^Z-g}s]}/m_3jLgXo-79|f˒OK/Lqzy16㫔fw iF^ƺ6}r'αBޭ6/o0wɀK 4/yĕ)lv԰ԈCxbgu؍ }2qWct\ ( {"rRЮ&1]₏7ʃޯ2~Q2"кBC!F/2 9|d JW.︑ rgZɲN=x{Đ|g~]䨝v9_f]ew瓋O)N7T-;J=fբYJy5½Oy@wօaVI,yoɣ_\;Ql`fi ^ޫCHcklϖ^W w\- U 9(t0~R{ڥ[8v_yrvkzτ)I6f5Rxg0\Ԅ)g\!v[9rMsF=WȻeC~[} ŷ~|^|xaNSa Jg6\xa')J5$[uE1L^aO0hvww+ƴZ֯}Q|~AIuq¬Z3.4E̩w!d,oMxNi;_=鿿uY\\}.Kp/;_XT:- <( QaU~ꍶwP~#=<{pl'\։YS<^e [\y@ncG:z5syF_w%ZΪ}Ӳ{Aj/ zxF]]􂝷>C;T wׯ %3˙凶pxgPн6˳'3 y_FlsyҨ~;kXmnͷ-oF4VJXyczd>;]lq+0Dab~5@O" |qmsݔ:D7qOMLG7j͖ޫߓ2zJӱ_a4ºp5ɲ ޏ T)5eXkxA3ܛw:gx0\ #ݾoi1-oɷėsߥc mu´i,jʀÙ] 5OI5^v{jpAg4ݟPFteE˞5Ѵy,Mvϙ5X1fwKޚgR>r%r)s*Ԛ]p϶Ӣ}̬\ts1J]\}}Nz%8Mг\TMBXnXCsukݚ=.#]㻿*>!+]2[ϓF7dsVN\j- &QK]ߓuu*ӣ 6Wz5xRf{ [}׎o{K11S"2AyIŇ۷Zen N} asܗ+03̣Vskirf?-s0(K5ɨ_sa2xSdz /H?u׌Y׍ ު0|`Ȉi˟=A**p߄β}ȃ$9Xk=8:0 )11z8DE,)2ţCQͱ'sb\bk*:mg8)cIdg/ kEWFR4΀~n=ߔP}`çwv$nԹ5߬4M73_l~w|n̫:C!rPcl ٨|\̲~ꙧ`8#J Fᳶ<_L4JOh#1|%~vs;w-q05މW/THR_.^dʧݑ]^[[ˌÖW\PlbԶҽg7f?/}m6@Í^0Q`py7CvKyfWmzѸvkH}[O >?ͼh9q؉qQWRuڔ:.G&_)z1x65e\W-cc۬4N-\)"賭  N=&Gk4E]ED dŸtʹKTN{~}nmřU]ML]~a7+s.v[UlC^φeY%˰7AS{qCаgY#5ϸ$`ͻ ?;^aw{g>&eRzjCおBe{#k*m~J/fSm5k٣ܑ4#ymcWkxO4n?ԩ+H972]l3#E$;JL|(C<1 +vXesxVvq׻(U?|YyjJveةM\^dg*%#nۅwdOil|Y^~i0zI|vg49Ca$%m(Cd]gUln aiX˵ѥv3٢QiLu kNnhzRKۭОA)Ǫdš _>VX~v@I0׆{3+1#{ǝIo WvDUkά2i21K~y7VquѬ3g݇SDOA:5"GBP=C4,"5ƜXˢQSI)((h8%ߞEWwEŕ;-M11.UV=VzQjy۪Bk׻͓|]I4OwڽK V>+H'd渭6NůMŊWcgZҘp9B>۪}|[emrWD}+Ԗ;¬X{>܆b룳gnUFd6S?q$叭t8+˧M\ MJchL9o>4=Ê7:8U$GG5;`mǪ7g9&>?:95#4sW/tPEz&pǛ50Ffuɬ/S9<-Ntܱ[儮<ݱ] SquRZgM|7M4JҟQƛՑǠƲ+^U\[v2չ6B=cƭY9*Ǯ.ȐΝS^7]1avugܬOSv}x6gnKlk!oo6YgF@dbbbOؐueɍԹSf;t ҪE0J0q߻qpM)S^q.3tL+4إ;"ҝa"2u;=K]diev~7ekf˳n}]E 18>l٠{F;^pi~ʏf0n'oͿY٢s r\ަ[E}>XwVGO[Β 4͟37/7-D"7([^O]:'i"@4M-AG_oٸw3b.X:sVQFHԬujTܜ8kFOxZ -?D t ~OzR@čO^*5x9`h{b.o7(?qյ d_=^f6ת=Z a{7/tbY~ck^tvA>}b/]!Hm.rdirz?FہaF>]JCXMi _|BiZfiSlNrc;^J ,"r4^g *XKLIqNi3]v KȩS{ ůƼ\܁7`p.i9T-J4ӥ*xGlӡ&iٽUא1jEX=/{ቺAMW{xbÍRrElc9y]1PrV;%_fZsCifQZج9gM'bNyNz;+[6e \?49uŜJm5@C5IbyC>:VO|ѩz|s}P!vgg*zGۓr-O)s wxڊrؾ|nIM?> /rS$ \5|8?xD yD#ݲ a=9#ah0D <poUNojWՈaK۩&M2%Ͻ4xQG1Bp`ؤ!XWU `Cn_gU⁕Y*J*f1 -xp /1$`ɡNYŦގO) ?}y] 惖織mkWn67f,2b7i^wnnǻXnxLY/MP"u~Ɖ27 vJ7vtyzeY#_Rbx5+%-p~hc_{?jO[yވҶC0bbk-[`֙%;~ 'Ub3]n~oͨ`a-:p m?4P)ѤNsGo,T.<2 ([z:iWcv2.^dFE]y%ͺueS+J(ܘ0XO6 l˃)[&fOKr!4A)3MVm΅# ҽ-βWx3|߬qwySM)WIwqE ]թ;'OժYVd ,Qפ;oRѹv?hśo^eh΅ Xî Fv;%ٜ9jlM(#13*,߰EҿGӤ@91o#4N{Wb0%Wc&u'P3\aWBt~ᛰz=OҟMlHr}'X`:?jM8PkSY1V Úuϰa*\PS⬚g ,V*#߸κSc[~6I}3wVx{5Z:d޸p)yjB[D&=H5q ~b$GߞǼ~Jg[5zܢ‹< UWn'ֶ4}6+@ F\]EXm8d sa?Q+,g{OblƃZ7B-gK Jp=j1zy~igcaGegTz)*qA,3D5$H Ƽ{pkNܡӏꪃw'\ ѩy"u_5&~b6N!]#kKs_3{dwޞ8-r 7$•/ǼG/y*&CF[ʣg ,ީ}ʠw^TwjTTz̬۳{/{כ w>u6cn m3LE!bvEygh4eǦj+ujImm/N~%_=&V[%ZrbXkD9T_a1lfn}cѧ Ȓ֝,=1zP2w-ڥUӱp:ʟw'2 Ix8"Ytis};Z$VCp$sor?YEWVߺ6^ԌKV_6AjWmhsPPjӧE?36qp2}gܐҚrҖ`y#RōvW:ܹåjI`;2?+qt}s_jJGw\蕄s__ء#+Q8& ^Rdspt%; z0􈕂|'i?,&M'n|zq=_ݻU3&2\ >s b*­\;azd$ad;h$"陭?*qs,U9@Z0d{qɘ!kgo5X_gs5Fs\'3(ksKNKps≕^O}tˬar_o" PqG/Y Yo;T0{݃SE$`((L܂elTߎaZƓI: S_R[הR wᾤWp53m>I60ΡW}˪959pȖ'~S'dxѶ=&]'KlEGz>G n~%pl4lmƚ kf=iMyi7<δ'.Q7Cjɸ5#borGV4';[ ty9.zs {h㼙m¥o~L[YPq1]_U,bCL'~-nCg7Œʖ3j'$]yjZ۲ĆbS" T6u 8Bu*^ N]k缂@-f/21ܾxocKTSJU,V;V~YeOy!jXlMѰ!|K7Cm™N+ӵ` 婭9}E|Ѿu{ֆfLQRxYSOΣ5_ޚRj~^-ؐpZ?a.LHrp5ÜbnlX-Ӗ쮈9ͦEz6DN`F ݆͡z#zv\:0X>i v9r᫃8%X}-E.؛? jf\YiIr#y-a r)`"N;0'ʖ9iWva0iLAmG]Ej ]Oj4FW QYtr{^̸]ϋu>|5m'+'G&^#(㟵ۿQ3;}‚9 >#NG {`є'֝PZ깠q2,&8d݁A@0sOk޺&/$8@tmUG.8M&1GmNʘ5{^NrIT޹2_j-79;irMLC^;7\{Wuy#[6?, cvoot1'0PI^&)Sa?6tQkbť_$H)!Yjhv0ţ1~z?s{v ѽ2ۀ_[?3zp,D+pEOkn3zNXrcޗ*G]ug>6ow҅ҁmDڵGjC`>?ymtw>8ljdžސ1!)~]dc̟ (2%]r9&O'uhmXWseӔ[ *WzسɇSr#V{I7fFYI,F giKDI]G1N_!d ,äd~"_){=q\4S&Z1\}ϗҨ_-(v-3aaz+r}X_pKo0S0x|C).g9vdCssmxG> fRCWz4g7*G7~VO~sO>Xbti{ <B԰5SK625{x]#q3nAag*jx60a6gK 5GS Ֆ5`S$z̯ֆaR[:Bj%k!\E!oh2~`POvmWVLwB17|KycbMճ [ x 5#SL~t}fchA4_i,BWT p6ĸs_OzF-~>鵭휦vXvչsu8cnd@Gd8n5J&w1&&*iחYѵ)&2*>lǑgGT揮Ծ@Ty"Xыʳo^|o24M,zM򗒃OBoR{.Ślܧ'Uv{Z ؑ7fv-Ɏ ?<#}7<;[Lf\\, l6ם)a0Nڮgړu |59Jis]uk.]? Ec1FƑ8"E I=aH%ҍW:X^1ize]RD%7gpH洽Smuf|/FሕN5h}z7xΎт+<-ie 2{j@a?WY,!eLrv !믻7n۵=}p:ɲ+pFiZ) l."̌ck7o\|,P ^:.KO0q,L((k|dYB㙈UgCW1Y{?|a 2>\׮p-ESp4#EBw,(|3 ~G{Wh 7j6T.ҵo&Ū"YX*e&޹C5u'5z'J(0QM X#Lk\w6\}iFDSp,C4Lm\'#5&58w^se9uI]O0-` Yk/'y?8U0oOX2w7қ)]}qڏ5:+{w {m,Zλna-LѷMAyQy2trsg8Ƌ*z/=s0xUV95V&# qFW̠^t}+ mKVzvo_yapfH䮑gwVKNsCqk- S؄?!+K:,?O{bVkSQd^D% Nnumu~Dml۹ xu8m>z*NO-'_a+vDenԞkiKzOwwfɯKoj뷄׬8ľ&H;S6V[-;ofYZecEX<8Ů4P$#OJ8ϳ~{SߴxQL⏼ ~bIT"a%<Σ:#%S^/ ^*)T,9Rw[;*N,>l͙^IZ8۬۔ai4\"̬o AL>^6ד/)}ҢQ2s a{~~]nt{cʥ]k{4.f} >aZo寗ZR~ŔcK<0vz0W}\=v^s2+(LG 鬩k04N?]6025 ˫mn[ywfi _}2 ε֑?qXNe*И i`yYpZ_MHJeaXJEWStFT '/0?W\5mC:0hw z{0cv o 0ݦ @\G=eB3[,M*"C1Fdto2q2̭ڰW+}Z_Zq;<"J IJg +t8C){^.T*+8=M܃:b¨&ozϾ }t[*Y߯[;N,*{&ťS2}ogOdB[ۼ~.?!O.Gcb5WqEmH0~yh= 6x\#um+u.o O,pPw}px:J(+nhzPѾe@i7Cs#WH#L1 >: +Rn6*x?HV!d׈!D<@ \ :3` _+.qod{QOd}~}6fN)_ܐdVsA<̇eь{)U5~^ud~ J.Lf adv򰺄 >0#EFs9L߷Z(OhேlKAȎ߾(Uޕ19,giBE+ OY`kd5$ ^r(r%QV6r{ΘN,}y{HMGLڭWLn:}ޙWMF+m[:0q2PgHR1E}R훈C:N~m V*p~pԵTgg\U,il6aI!o "y-ǎrKf-abۃNGn>8T|{']gC*_)Zs>^˟>FUטN#v '#; rX-HQA۶6ĬɞW{;H 9If?(Ÿqzsɑ^vZoN2v"Nwr6 ݾn\SAb aa"Nm,2Dos5 p6J%3;Nu 464kNzVtGu>GtV'^?zQeɞKiEsO谍6K;an\s2#ԢZM+?Z>}9prw0 uFJ&ש>֗̐a)&g,vlj|{n$M7qZxDו kۅ%A,($2i: ޒ[hc)w^%~{b z1[˴ #ˮk^3hڹˇwH?/@JZSΗSQk>O9b GBliXWHhjmd+~XUlUaBܾ(X}EI‡{GDsue4Z))'qBȩ;ܯv^ԳmsJ1miz[*Ћ1ez}'C^I?vlyU6Z0tr~Ƈ{=9_!^%.LħT ٞio9sP *AʨT'pje/Z@!/sC(KD(!EB6ut4]j%hwt 4&]OtÕhv i_駞n-j 6bcHqU 3Uv)oӰRo'SV+{[|oRJB wf/RW ;Hq1%NIj(G||Hоu9}뎔 )ʣ}1^̙#cװ.l\XqMUnJ ڒ|Χ KMEA &rMϏL{r53tnN#lۡkGe*y(lױ=%u5<]uZR"B*^T< ]t~ƫFu/Gfkas'b@K?HQu0aR];fniUz=]G?TC@2?ߒ9OM_w߉^tɊy:?WB5\~!v{vԛSڭ_]*6TZ׉%W dy US{ěnk9`ۢ+Ipٹ1sex}Rzs|yS`>xϚi:TQ!t뭝|zC͕O 35xoJ>y]P7;J>;^d/>旜{{7 jD3ʺٹc sL07J(>ڏONdq7@P/ػH+Z~TF͎5ٿSfuݒz¶[FZrqPs.Ƈ)xbfۈ[_6o{qgJ)6x,#' ϫ o/wz3}NP%ۈe{S \}ZyVяiwܦYeJҮWy=7wZ>)bX07ڪ(DwƪƤmVI0c^w1 (g:!ήծobaW̹V} 4NnO+\.-oI-&dtU"jaį߄Զh̛++viiq}vb1FyY) kb]=o6;+V5"Uq-Ƽu,cwə2?j;.̹OrJ xE)P~6#i̲}Kzwxa9(ŹjϹ0JBƧo/( >!ȯ1 \MʏS0w2_/ɷMjyB.n(髃,^96+&߬d?ic_NE%_ձpnu F^kGdxӿ;P>Qf n 0T%Yk?69Rg^t)_٤t̻~׮h㍏*fZ5J m:ʻ~ao,vN9ڗL ! M[zCgJld/qޑ0;fAJ϶ 7-dhOpŵڕ%jv֊>m,}U7v;|/mZ=Zg졫nX*ZyB{꬙P.cբ𰫣oQ2{.ηIRy"tQQ7l$#bCVC^[5/2EU2asWзO&h) '-97D𔀜=UVb-|Q(~Nj~|ʜqF-lƹ Z>td{3Wz.{D˷51PcwoN6#+#)o-YPGj RJ%Y B۱ޣ_⤏)!ҹ*=U!O$N+[[똿bwss/zB<׎.*5vM'kEGȚīoOSG6gbc{ʩ]#/Ga^zʕ*Mf᾿|YdTxKÆ7b+F{?~i%DU}NE%QP4qP$2Kx7^1lDwe.cRUeT]f ɢ3?'?[uwWޝF~}Z. 2E H7DGYv]#^0i݆3 +{rl w $ 0e-6fW/aap CBW{Y uW~\ܲ囗 O6.dfž?NO5s|Y~{飏5TzP]aL觚_ ,LL7rй0v腢Dr ~]a)j{ȚݾKP3/ ?3WdD ݖyHc"kzpp37ܚŹ7k*x xxgmҾ4p5j[VYOuC81dގo팺= 4^=.x5`zꥍ73Q;Ǎ]{]jx`E]-57K?'S6{g66Fjq?\§\{?fH|UՙJ8_h}Ų-ӣhN`ՍOc3mXN`=Ҁ"Go56'>3qv*#Y1Dn;S[e{=>c޿a1у.ybFy6 [};PHwHDNL Ӆh;UA546g?sVٻMʾ$|z#}U6?γ^=K _7eR䠉goݽY֎}IuG)jyx=廂AeL\}1Qlxp9(lu?)û/+^l4uXOU4ƥ:W :n^AwB LUfRVFK "F|M: -;N73 &HZOOO7W'{[ R -VRTP*jZYO)phjbr"\btxz!UWVH=slokm!@j!Ջ T6RW)CQMHHL[O>RÓyQUg ev=$ņOux*%QA~~AH=`0A7KQ)C| ~dT`'ZR@^|-8imiG0Uշq5hs $hqX0;436s5X**lu bW^L/ BX$0}CC!y[@dXPGZ[X45t L[>H W !@5>ILKOOKNFKg@pḦoOjVfV;4#%%) W,91jnAQQQaQ)idgdd&+`րRG#.eyty)'=ܝ> *H>$Z! 5ːںhK5-[Hipqihj...M HE|.Wn"CC}.E+n"e"D#WZ,%:MB&Їl!0T%O_djaeenol)urBKIIYMKW(B1[[aWXqpHJJZ7qTƃX!0 惘  JKfuW,\>\ЮqIi`'TL\\LT hVOB炼V>MpU4!`YRdjƁ!HpB Of˩J&" 2MEM'MՀz(pAHMjQPj1D,]EGQ76#+1166516 )dkSA*uB|R8oeafb$/h@1F**3JH i 9<b5l D ,%E C; CRzD%-˦b0455& 9uYXPGU b$2$b&NuЇh/|r O"3t}xZ_A$&!)!!r_P 9 F (/$!E~lMV4#CE|ubS cU X'#PJ rQ1W= x!#CE'zĔ o.MfWBU0QȆ`Y6j-GHL!8V11#a#{{pOz.(8%#%H1o d+b! A Q$ГTWc EƑ2mյtx#jgMD<-6E@ tDrx4aWR JV.`rVeU Tx AD@ʑD^x$ARF2MLIMIA *#.Ud(g@yAjvRTDjhłKo XI)鈪23R"BCCʫ''DW0 C؈TH 02BRBq ffò\x$)/8XA sH K$:Ύ-k/E,CV-(ʽ g=KPr.ԼfiT"ԌF"S_d>]G$_ a ^Gd [:yz sw#w 4MLEgƎ1DH[/ UEUm@8jShXQ}P@6Ц MGK]U2@RҷwC|W0I&v+ [//$B8&EN(3NDG"fT!OK cJLC+ffs-JBh2Fa $@"[^]I5Xyk!RRRX,Y rwvqByhr:\|n:<;(?Uлcf f<C05~B-_(sH@#(x$x*|k5 Bt.NpU" eA*`Aё!NE`/ V.~ZKS @ZL=+;#6E!O$% I( T` J@cN S!:һ` :Z42R9GԊqT`͋wID" OxȚ *@Lw"*5AR+fB@,&ı6(1#HyGh4|^6<?g+G21a\UʬSӑ6 ( pqGz -[0`țXKI'!o`C^nN6<xB <@yWj?`k_ cF#d!\B XM |-==%1&@#"|EMθ3XFk9iа*XcT ye 3Q D%:\5% }e qCJ!`FhCX"8@z(E VG76"ľʼP7dA+@.qrM%]j~GhTB$! TYl6@ҊHMCR@J㰋?`!~^֚$RtripXX#OwD:N:xp 2wvqqvCZt"q"h"Hf=*t\}W w+C렄DhቊKtA&=H a"]UG_OCUE[b+ԤaTn#GCC4bxy# S1L!!96X@i:TFVRQQf}S/z00_Eu>ݦ`e ;pSFˑIM 2R!WH>Wi߃)' h' D(vD}"uGD<*&z@#Ɍ!q 0,MO@2uQ "E9 CƎёaA>\*lA=AM#2$S`8Ĕi|cK@t_ xP's/ M2G}BcZtOO@p4LjHOIc10 ˈ2XA]dm󔀿e*T`3RQu ?y/#]%ЎRir#y7]rP#Z$C2&J:vԵyzt4U,v8*[M]]]PDY4tYdl!Q V(A1Dؐ s8p(YFEٲ0Bf'hf$""'q yT \]"m4۠Du  E]m  FB!+ o聴gQ L= 9zX 5  L7r houDvh\fmuL***perB5At׋^;DqkS * ؄$G(a"6*n.vbߕHdje"5 oUߍBM>[sD52Bzcl5e,"[Z~#Z$`qCS5 hp=ih*~A|+O1iA0'4e5o0HE.aů3K4Hi&By^iѓ ;c&x]DE*BD"T+ o Ow+<#QIol3-pG"[pqmpt|6KM GRt>w gOu䒷B;r4psqG|XEX:LB$8* kqiL:.D``z,KG8>g"3A=D'{|g1awi+EW5NyJC<SN#40a ;;[+cM'c ~T $-tb I"iQeH8oL76)I9$F!P,6ҏ,i{=2(@wM|{"̀{Z%S2CYIcd)uxg76sO+J|OL(%Om b"?@},cHh'&z,,O-!*] ~O`Uf7DRfwBN0M~* p P2[Ӱ DD]{w-.MFvҽ}"A 5\X4]@x8Jm||, lr,L +60 p% 8$Fd $TƲb+O MwneKW&#O}`*/x4(#Ai'644sBҹ998?l\@ ^uvsVBAUXIWC:0L @@!TF~hX4 EBDUrVJVPN'hW>,!(j&v|lthd  + 1 dj&<0d_]Ni0=ϔe#Ā7`HmqۄngNH#DS}E:O(kg)µzk1!***!u]E][[SC  i0[.A;b>>:7"!/D[h:.6p "z4xDIdӘ\26Ttn`:X8zGmcSSC-YQ0pI[ن'dcGw_4pvt1 Cb?Y* ̀%OH7u)a{:Ѿ͈Aos]3}M&Tbkq\hRdbfim'^o[rN% (!|Ǚo%ij{F#miq! ʷ5ccb,:EBp/]KOo7GtS `E c(+'m a~NFl*`"m H9Jm,Bmu3OCNZJT" ; bRd:8HZ 0%͵I23@RXEe`^ohbfjEFHe /OSҁ{twA"Si w&D,~VVW`(5KSWCc@I#Ʉ <$H${5#ͻ=<  b. &TqX ",d`UHAM;C@N...E!ɐY77 W)\؊dA6w5nU0,_(iTPlmcilhlHζ2φؑ$c`0fy%^"O S`%p M+19n+AUA_D'd!* 7Q,s qGn8Yb#48z{bGE!yĄ1:31jhcl"ۑ-zNT9'x:H%zx8\ȑ1<-4#((އP!>XH]`rN.WWgs#}"[%#!0UT2Ѐ)$2B=8T!= #`zC,,A+r#p9jTZI`L?L@:ik ̌ /dBL@ /Q !-Եm]CZzej¾qG)?Xn.V!QA^T LF ( ~վG!I}W{k VxNNhg/4E6#M]әs0(MqEm#J "Tu l2|0'(:z Z0$PFTQkQ"@X'g;8P_hX3!f4, C/MRei YCdӇ/HbPe:r䗫7u_!"A`dWRR<=C‚bPӿΓx"XmP@%e14%L| jb6`pV$^|gtVV ζHEq ZcLw3Tt]pc!7sFJf` cy.#YrDDrr?xp$^Vb|ZA,3d3ݙEM; U6^X.'AxE`n/hN/:rQ~ep^Ε5!e9;ST Sc}UiN` 7KLe)=-RVFû ff#!sβM:)O*kKbkViOW;H&B2J`@ ͋sn .@C =(?TEƔ)wb.7ffgb4 ,^'ҥf\}Ot2>3LT罤?M8{ /?a㥉,x*jKs\&\Rk YյLAT ^00mjD=u%v;D1U2K R<(޴t^)9-P 52/dxi^~ F "^ZYU JJ>ZfCFySRT 8`oW'{N* Mxs -nsT-z{QdiyrTRTeˋE UՕQr"?' `,fMoojDSo?}0ؔp6䆝t!=uf LT҈,峙4YE9 /caUXCeKXQHu<hAɧAIy{g&Kخ_UDnMhf5EzUqX4}pI-U5&3H21E]fqu؜swˉDK^9I~xؘȆ"*&)S]mu")$g&+im+v &&;Xk,-CWbd"^E)erzRnZ r1ԧdK&T9{qK7x֓\ 6'(gGS+!Kel(" ƣ 塖9Rrc3D}r Ln*osR8%x/Hl㟠?FsZZ̉tΎb7b=$]ݪcgn9Rf@yKbElV<1J'" [Εs}V`w6ìfgDH&9b2|ufݬUbH)7xKݨIk9 /J;U,D? XX?K~ r S[\gJ0dO侲rlQV rbH 9 pJN%*&ZPcK7L&VSՎf0FmQWA$29hu^-G)};@nR#Z^sY0aS;p?[k]gtf7O|+8] `CⲞeA8x~.wá홒_n辦3_֖+W&ߦY؜vd ׮!lܞ.}ju#|cpw ;қ7zo$g=oV޽C{k l+iǟmZvԻ%|iz*o,.,kT9>n¶7#ՃQY3 +?1obwK=ꕧ;w/sm1DVoxt&}K_UYM6?3K8d v(=qE^J'{4r*"yy{Znd5[*h8>gWYǏwߙ>Vx/zE u}.Ri$_'lbG=ŮO=d/׾;r~Ǯ=%l)_~'Vno:mY,:Rx/?־5/?%J/9wv >/nagփ6_JB͡ޏ66>e- v}ݟqE?Bοku+o7_Xf8ϝq%ۇ18J>z}W/٧s}eUt#t#s$~Uӿᅏc :;K{NNjYs ?t%zڪKW~=}rS=.7 y;]h?^jQMϟ'7ϑ+^6.LV⒧^~tۅx;'7?lh{Գ_}w_vo|振<,k[{ק6JN::80t YTٿNi=k7pG}/_;`<eW߹wsvܼ v*UeIu >v p_'\'j>m;_\v5-Kemxjxׯɿlp~ŭymRuFfHWH3W.%%moz)lj2\I7E7o18j u ؘ5\6pu.?rُ+,.\n^|Ki 7m("ijk]o~|S<|^D,D,L6kw(%>:̦uof}ٽō5Ym]Y-OPςҶI;|M莓ËYY;e7d=Y_>xၨZz_:+D?ݣϽ Jm7_\XP5\xr×oa/;}ys}Ir_㤝=[,mXezߥ_}>}x#[vϩOe*iqkƮg7:B{i!^гx~]\y^-[Os'uO|+7,4\GGy, "#='扗8Wv(u_qɜSK3\~cxl}QʞsOIuO[oyc%?cI%g|gsb9'[/_Yu{QQ[ٝKu%Y|zo.ɚ13H1L'>sϟ1Sm,r(b rBX |ÿiEaKWk fkg kW*ӛ  xq'[* aˎ9z: rJ1Lݠr@cE a}=DF֠/RM<3O컜 SѪ:Jν'Cp%*+O`{X$NDUĒQ,]_q}̧Lj\"^e^/#Xa!D9~Q-$+{S6 !g(!)Svb^\Puvd 1RɆJ<2DCl&C^(1,=*ү;˙.? ?@Wg#c\cәxAMp/|n&ɉ YLd\6*/v|ɓ=i2^!:ޡĚtq2nՎܓg Jo~x.' =]xx_g7rS!䆝 a<c8Ώ~8?&X$sic_daily_sample.zarr/siconc/.zattrsUT иeBaeux }AK1!g+]{+ОDdY&*HiW-{|? nzo{Yr2ɛdQ_3^0$Qkm)q丼.y=tATd-t^GJ K:~@"QCi.͍"SRq lo@L4z)~ 3~Io蝛?|D17FCL*q̋ PK7\>X!0!"sic_daily_sample.zarr/siconc/0.1.1UT иeBaeux ԱP t@)KK /Mx-vxuag}/mewavygtJA>(%d샒}PJA>(%PK6\>X؅Hp$sic_daily_sample.zarr/siconc/.zarrayUT иeBaeux mM 0B-HHb*޽IH5*y̬ :h]Q?وg`9q_9Vv]G%Й AKV(QX4A"7jz&b; H883Q$WTo6Iß,f' PK7\>X  ,5"sic_daily_sample.zarr/siconc/0.0.2UT иeBaeux ZwXSg~8H G#$f AjU~Xu[g]h'hk]ZDYgVkmݫV=A ~ 1>z"(blD{0~qTAc۸eCp8qqֈ֏Fn L[ͼ8"Z.C25^mIF +hg6c\82*"( ;/W~?lOkJ@><\T9AlfSA,+b}PfZM$Ƃ.hZݞ;G#W$Pʑ;>T@0Lïnۘ\CQGx] ɤ8!~hzӍ yߟ~f7f FƒeCˁ߿OC** GEJ@Gj~:{OjUGn| xCv'Of&"PlcSvUG,:Vt%sͧE7gOHM5k++_.MPȫeo9wY`NKt{3-!T%An"fF$AZ+0KmTvR̻Ǵ%O3fu|_s-H|W~ ~K1"b<2V=/j_=tavި_?_:EQy׵W*CD*zA$sxnͅ] $V~vm w. ]6>/aKꉬ1֎h/9x,O}4m8QױGnΑݮ|Žmܛy{_,yQ~]-c-'%<:|9š^~[uukQ΃ J=Qlq k Şhrls {:y-߫:>@YǕѓ^5O[Ʌ"Z32%ﴇT3CuimG3WڙK{1efę##eMėJi(␣|Cgxam6{>Ix]s/w}2:Jpszڡ B/yе1#Vcf|f$BQlyՊ&uƩ4y[-⥛]dM̅{i2ꈉhp31vy󊬻޿x#ױV:5?B(5O w?<^rcɗ$)@ߙVEч - xpgA>W4 L/_hҮ"nUEԽ—Qؚaݓ\dW,|*!9ըSs^]j^?1~ö%-YqLBD.>\>Yg~Z5ݔ6jl_Vi)IR:` HE&ʔx!55ŐAvq CrXE!eEy96IOMK0gBR,؃IUDl!5]3T<2¢'R'{e=jL5fZm6[Nn~~~^n_Ph/,, Mn8]F@U! /Q`cC$UF&<6VARmr+/}WYn JJqB{Q1]XPXT\Rg "1H#bb"#r?r^aih9#+14@pqu:?ui76G QtSf%;*)++B!JJqYBbL u+",:>1)YO "O K2c fn%A.`8c:Csl/ȇ~j MYYyy9.^_RCdI+$C%nD+K*&Zt2 x dQ|XO1<ð0, 4\v]ڬYYVFIC&DT} D\L1:.!Z! aaYRJK s7906/̌$n1 <}^ A4,*NskLOMIINLc, )]bੌM:=l`zCc,Q/!$SۅSIju:]p{v2G{\dr =2k||XJ=ulr+rȌ9^sWM l+2WJ[xiIx;W˅F4wYxGP4ƞP'nT(uéey6[ʕD[{G~>&cluxP%t/[$|ڎIZ, $pΩ TDzh$ 9,/7OeӼ&Ducyz |خl2Ez#(|x RW7?d_*YW +t7K_)85mluYfFc(d"@ %! ڸc/tN=T@s!;⼨ u\])mmfvRiy9ez¥-_?lZOΰE59oɏ>OU0ng#sSS-W\ι#{cC;> ďY]xq#\w'`ז6?E }Nw.塧،Ct7{>ܻOX~4+'ggdq'[TFrtI}ϵ ￿dϺ/_@˗F0f5+Ư;9|OƉKK=nQl~m'ǎUvzx򭑹miƈA~}\MR7xy/0Od%_wl1m[9 C;:Xjvԋ.QO.vhP_>,ziJ|.PdlԩnS M.ŵޤ?{- WzOFHJpH/n;RZ!Bg_>ӠâyE u'o~e5SƊ)f^?q.]7WJuzsڛ=9) nmߛpgywhQi ׌v. x0߶= LtPJ/Q?SV$4{kǗ=`I񖸺DfcgI1t5قyO^;^@€=:56A\U}HzڼgA=t> Asd Jfa-?dE |l3${ A=$Io3p-O紃}d|oׄ<:!nCQQ?p P(p:Ev` ru8MAƇ1"L& ?G=?H{q_ۋA%㈌p5)0p0  ۛf)d'_$ds Ac(8BtO׋A!"bEc(L;|Ѹ xhhDy^,w: D"|,@L_?|}|FunM3 *~H!%M:+F@;9!ze`kA >eRX$<B4 nk(ϹYtxHL_\kC. ;*U!juPԠP/O$}l;Mc }M#((H UGJ% VȤ~`L#dvinnTLKT\2CH $ SCCat`p;!&R̛r (:sB?ipx>r(A|iIכ766`+r`#en >?eQ߹oGv:kˍ{Anêw 4(Iadm@"6p)i  >1@뮰!,O6O 0p#'28E\e9g?#6= m ۂA`  \10W Ab? apPK7\>X!0!"sic_daily_sample.zarr/siconc/0.1.0UT иeBaeux ԱP t@)KK /Mx-vxuag}/mewavygtJA>(%d샒}PJA>(%PK 6\>Xsic_daily_sample.zarr/time/UT иeBaeux PK6\>Xܱ6sic_daily_sample.zarr/time/0UT иeBaeux cbTd93000 7002'000'SR>zRՃPK6\>Xƪ"sic_daily_sample.zarr/time/.zattrsUT иeBaeux RxǠ xO_W`O`%+hX$37U ̍ՁhHNIKI,SJ/JM/LSJed2K3S -M t ,1'3%>7,mb``Fz0#3ZPK6\>X-9h="sic_daily_sample.zarr/time/.zarrayUT иeBaeux U 0 >Aec0vCڢ0w_[tr˗?I$uc>BgKjHhȉW*nُs@1E]1֭"mߥ1)Cg6 *VE#ȟ7Z*j?[2?aDT402>PK 6\>X sic_daily_sample.zarr/longitude/UT иeBaeux PK6\>X9P !sic_daily_sample.zarr/longitude/0UT иeBaeux {XLssf}SMQIb-ml(K+6I"$SV6I&66ieR?y4=3SgC$2R EQR!JcxW {W(<73CaK[)(h*ScM1R1%g *XJ%E5k̙3>S3fL>O>6mԩS?)SN>>'N0aǍ7v1cxyy=zԨQ}ȑ#G2>,2,#en!*dL)2B&QD p!$dO!c'dBG FS)` ,,xً:۷vwWx׋럵铖ߛ75~mlpnM͝۷nݼqzUյ_^RQsy岲KKJ./*ܹ³g,(8ԩ'N:y4##GJK;z`}&'IJڝ+!qq;o5&fVictԆk#׬^bK/Z`~ؼsBfkg 1o)}&z7k#<=;;:VLMR.J"V(@buwuv?׷>inzPWS}Jy‚<]̌i)Ih"#h|Fl-L!թo*+eĿ?( j$^`S[+,kwRBA>/@(<"2J-.~WRrJjٺ¢eW*nV54>lj~Ҫ%R\IMLXXZYv΃.n<#hf汬'NA;ut~Ϟ-l0Ç{zz⃏?" D t b , " 8!D4!Pbd!\"!h!t! b$"#"T"&≄")",b"/"#2D#5-`Vɒ-,qfVOzdtlbɎ,`hǡ@cIBKv$%+XT͒=XʒX~Zʑ9`ϑTwˑ9ȑ0^GphѱHtdfsYdq h!HN$"9&"k+"y."rj,""rf/JZ)LpY"R/"KD|1eVėD|)mZ &eJ1l)qӞbR-&W8bR!&ע|u/&72f*1j1@LjZ] :~|~QqBI>:I?n0j0n2 CHHk?h#fk?a4a<Fˎ 񝆱e]_t0 n2"ڌHOyI:.\$Ҥ%Ó\T%jR' f!>22"^RfTX2e8I ''W/Dɝ,0L9\eY.WY5ʝ1\9BekP^ B*!MU)T asjGr Q:a:sJj4kxgG2`jSna+d¿ ]Ea6|'LR6xfb|I PK6\>Xs$'sic_daily_sample.zarr/longitude/.zattrsUT иeBaeux eO 0} ٹd\7AB襈  !D߽1zy}o{Ey]YHYmD#T};UW1k9%ikQitay8{ gieP u,FIxkJ_dr_Rռ"ԥ(">_GiPh?|PK6\>Xh?'sic_daily_sample.zarr/longitude/.zarrayUT иeBaeux }10 EwN<3PJ[w.PU( @ $6SΚv #s&-v-PK p>XAsic_daily_sample.zarr/UTeux PK6\>XU'~ Psic_daily_sample.zarr/.zmetadataUTиeux PK 6\>Xw(sic_daily_sample.zarr/.zgroupUTиeux PK6\>Xl_sic_daily_sample.zarr/.zattrsUTиeux PK 6\>XAsic_daily_sample.zarr/latitude/UTиeux PK6\>XBsd&{ 2sic_daily_sample.zarr/latitude/0UTиeux PK6\>X↝& sic_daily_sample.zarr/latitude/.zattrsUTиeux PK6\>XH >& sic_daily_sample.zarr/latitude/.zarrayUTиeux PK 7\>XAsic_daily_sample.zarr/siconc/UTиeux PK7\>X%ɺުd@"sic_daily_sample.zarr/siconc/0.0.0UTиeux PK7\>X!0!""sic_daily_sample.zarr/siconc/0.1.2UTиeux PK7\>XQ$wB"sic_daily_sample.zarr/siconc/0.0.1UTиeux PK6\>X$csic_daily_sample.zarr/siconc/.zattrsUTиeux PK7\>X!0!"sic_daily_sample.zarr/siconc/0.1.1UTиeux PK6\>X؅Hp$sic_daily_sample.zarr/siconc/.zarrayUTиeux PK7\>X  ,5"sic_daily_sample.zarr/siconc/0.0.2UTиeux PK7\>X!0!"sic_daily_sample.zarr/siconc/0.1.0UTиeux PK 6\>XAsic_daily_sample.zarr/time/UTиeux PK6\>Xܱ6Ksic_daily_sample.zarr/time/0UTиeux PK6\>Xƪ"sic_daily_sample.zarr/time/.zattrsUTиeux PK6\>X-9h="sic_daily_sample.zarr/time/.zarrayUTиeux PK 6\>X Asic_daily_sample.zarr/longitude/UTиeux PK6\>X9P !sic_daily_sample.zarr/longitude/0UTиeux PK6\>Xs$'sic_daily_sample.zarr/longitude/.zattrsUTиeux PK6\>Xh?'sic_daily_sample.zarr/longitude/.zarrayUTиeux PK stars/inst/docker/0000755000176200001440000000000013777653456013661 5ustar liggesusersstars/inst/docker/rdevel/0000755000176200001440000000000014576033423015122 5ustar liggesusersstars/inst/docker/rdevel/Dockerfile0000644000176200001440000000601514576033423017116 0ustar liggesusersFROM ubuntu:16.04 # minimal docker file to get sp and sf running on ubunty 16.04 image, # using gdal/geos/proj from ppa:ubuntugis/ubuntugis-unstable MAINTAINER "edzerpebesma" edzer.pebesma@uni-muenster.de RUN apt-get update && apt-get install -y software-properties-common RUN add-apt-repository ppa:ubuntugis/ubuntugis-unstable RUN echo "deb https://cran.rstudio.com/bin/linux/ubuntu xenial/ " >> /etc/apt/sources.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 RUN apt-get update RUN apt-get upgrade -y RUN export DEBIAN_FRONTEND=noninteractive; apt-get -y update \ && apt-get install -y \ libcurl4-openssl-dev \ qpdf \ pandoc \ make \ wget \ git \ libudunits2-dev \ libgdal-dev \ libgeos-dev \ libproj-dev \ r-base-dev \ gdb \ valgrind \ vim RUN apt-get install -y texinfo \ texlive-base \ texlive-extra-utils \ texlive-fonts-extra \ texlive-fonts-recommended \ texlive-generic-recommended \ texlive-latex-base \ texlive-latex-extra \ texlive-latex-recommended # stuff for the tmaptools/rmapshaper/geojsonio etc stack: RUN apt-get install -y libv8-3.14-dev libprotobuf-dev protobuf-compiler libcairo2-dev pandoc pandoc-citeproc RUN add-apt-repository -y ppa:opencpu/jq RUN apt-get update RUN apt-get install -y libjq-dev ## Check out & build R-devel: RUN apt-get install -y subversion RUN cd /tmp && svn co https://svn.r-project.org/R/trunk R-devel RUN /tmp/R-devel/tools/rsync-recommended ## Build and install according the standard 'recipe' I emailed/posted years ago RUN apt-get install -y libreadline-dev libbz2-dev RUN cd /tmp/R-devel \ && R_PAPERSIZE=letter \ R_BATCHSAVE="--no-save --no-restore" \ R_BROWSER=xdg-open \ PAGER=/usr/bin/pager \ PERL=/usr/bin/perl \ R_UNZIPCMD=/usr/bin/unzip \ R_ZIPCMD=/usr/bin/zip \ R_PRINTCMD=/usr/bin/lpr \ LIBnn=lib \ AWK=/usr/bin/awk \ CFLAGS=$(R CMD config CFLAGS) \ CXXFLAGS=$(R CMD config CXXFLAGS) \ ./configure --enable-R-shlib \ --without-blas \ --without-lapack \ --with-readline \ --with-recommended-packages \ --program-suffix=dev \ --with-x=no \ && make \ && make install \ && rm -rf /tmp/R-devel ## Set default CRAN repo RUN echo 'options(repos = c(CRAN = "https://cran.rstudio.com/"), download.file.method = "libcurl")' >> /usr/local/lib/R/etc/Rprofile.site RUN Rscript -e 'install.packages(c("sf", "lwgeom", "covr", "raster", "rgdal", "Rcpp", "magrittr", "abind", "units", "ggplot2", "ggthemes", "viridis", "testthat", "knitr", "covr", "rmarkdown", "PCICt", "ggforce", "gstat", "pbapply", "plm", "spacetime", "xts"), dependencies = TRUE, repos = "https://cloud.r-project.org")' RUN Rscript -e 'install.packages("starsdata", repos = "http://pebesma.staff.ifgi.de/")' RUN git clone https://github.com/r-spatial/stars.git RUN R CMD build --no-manual stars #RUN R CMD check --no-build-vignettes --no-manual --as-cran --run-dontrun sf_*tar.gz RUN R CMD check --no-manual stars_*tar.gz CMD ["/bin/bash"] stars/inst/docker/ubuntu/0000755000176200001440000000000014576033423015163 5ustar liggesusersstars/inst/docker/ubuntu/Dockerfile0000644000176200001440000000231314576033423017154 0ustar liggesusersFROM ubuntu:16.04 # minimal docker file to get sp and sf running on ubunty 16.04 image, # using gdal/geos/proj from ppa:ubuntugis/ubuntugis-unstable MAINTAINER "edzerpebesma" edzer.pebesma@uni-muenster.de RUN apt-get update && apt-get install -y software-properties-common RUN add-apt-repository ppa:ubuntugis/ubuntugis-unstable RUN echo "deb https://cran.rstudio.com/bin/linux/ubuntu xenial/ " >> /etc/apt/sources.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 RUN apt-get update RUN apt-get upgrade -y RUN export DEBIAN_FRONTEND=noninteractive; apt-get -y update \ && apt-get install -y \ libcurl4-openssl-dev \ qpdf \ pandoc \ make \ wget \ git \ libudunits2-dev \ libgdal-dev \ libgeos-dev \ libproj-dev \ r-base-dev \ gdb \ valgrind \ vim RUN Rscript -e 'install.packages(c("Rcpp", "magrittr", "abind", "units", "sf", "ggplot2", "ggthemes", "viridis", "testthat", "knitr", "covr", "rmarkdown"), repos = "https://cloud.r-project.org")' RUN git clone https://github.com/r-spatial/stars.git RUN R CMD build --no-manual stars #RUN R CMD check --no-build-vignettes --no-manual --as-cran --run-dontrun sf_*tar.gz RUN R CMD check --no-manual stars_*tar.gz CMD ["/bin/bash"] stars/inst/docker/fedora/0000755000176200001440000000000013777653456015121 5ustar liggesusersstars/inst/docker/fedora/Dockerfile0000644000176200001440000000464413777653456017123 0ustar liggesusersFROM fedora:latest # minimal docker file to get sp and sf running on ubunty 16.04 image, # using gdal/geos/proj from ppa:ubuntugis/ubuntugis-unstable MAINTAINER "edzerpebesma" edzer.pebesma@uni-muenster.de RUN yum install -y gdal-devel geos-devel udunits2-devel RUN yum install -y proj-devel proj-epsg proj-nad RUN yum install -y netcdf-devel RUN yum install -y pandoc pandoc-citeproc RUN yum install -y readline-devel curl-devel wget clang RUN yum install -y R-devel # needed by R packages: RUN yum install -y libxml2-devel openssl-devel cairo-devel postgresql-devel unixODBC-devel # install R-devel from source, with clang: RUN wget https://stat.ethz.ch/R/daily/R-devel.tar.gz RUN tar zxvf R-devel.tar.gz # Get https://www.stats.ox.ac.uk/pub/bdr/Rconfig/r-devel-linux-x86_64-fedora-clang into ./config.site: RUN echo $'CC=clang \n\ OBJC=clang \n\ CXX=clang++ \n\ FC=gfortran \n\ F77=gfortran \n\ CFLAGS="-g -O3 -Wall -pedantic -mtune=native" \n\ FFLAGS="-g -O2 -mtune=native -Wall -pedantic" \n\ FCFLAGS="-g -O2 -mtune=native -Wall -pedantic" \n\ CXXFLAGS="-g -O3 -Wall -pedantic -mtune=native -frtti" \n\ CPPFLAGS="-I/usr/local/clang/include -I/usr/local/include" \n\ JAVA_HOME=/usr/lib/jvm/jre-11 \n\ LDFLAGS="-L/usr/local/clang/lib64 -L/usr/local/lib64"' > R-devel/config.site RUN (cd R-devel; ./configure --with-x=no; make; make install) RUN /usr/local/bin/Rscript -e 'install.packages(c("XML", "Rcpp", "units", "DBI", "classInt", "magrittr", "lwgeom", "tibble", "knitr", "sp", "maps", "markdown", "testthat", "maptools", "dplyr", "rgeos", "rgdal", "tidyr", "stars", "rmarkdown", "covr", "ggplot2", "mapview", "microbenchmark", "odbc", "pool", "raster", "rmarkdown", "RPostgres", "RPostgreSQL", "RSQLite", "spatstat", "tmap", "ncdf4", "ncmeta"), repos = "https://cloud.r-project.org")' RUN /usr/local/bin/Rscript -e 'install.packages(c("ggthemes", "gstat", "pbapply", "plm", "spacetime", "zoo", "xts"), repos = "https://cloud.r-project.org")' # get & check CRAN version of stars: RUN cd .. RUN wget https://cran.r-project.org/src/contrib/stars_0.2-0.tar.gz #RUN _R_CHECK_FORCE_SUGGESTS_=false /usr/local/bin/R CMD check --as-cran stars*gz RUN yum install -y git RUN git clone https://github.com/r-spatial/stars.git RUN /usr/local/bin/Rscript -e 'install.packages(c("PCICt"), repos = "https://cloud.r-project.org")' RUN /usr/local/bin/R CMD build stars #RUN _R_CHECK_FORCE_SUGGESTS_=false /usr/local/bin/R CMD check --as-cran stars*gz CMD ["/bin/bash"] stars/inst/docker/trusty/0000755000176200001440000000000014576033423015213 5ustar liggesusersstars/inst/docker/trusty/Dockerfile0000644000176200001440000000314014576033423017203 0ustar liggesusersFROM ubuntu:14.04 # minimal docker file to get sp and sf running on trusty images # using gdal/geos/proj from ppa:ubuntugis/ubuntugis-unstable MAINTAINER "edzerpebesma" edzer.pebesma@uni-muenster.de RUN apt-get update && apt-get install -y software-properties-common RUN add-apt-repository ppa:ubuntugis/ubuntugis-unstable RUN echo "deb https://cran.rstudio.com/bin/linux/ubuntu trusty/ " >> /etc/apt/sources.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 RUN apt-get update RUN apt-get upgrade -y RUN export DEBIAN_FRONTEND=noninteractive; apt-get -y update \ && apt-get install -y \ libcurl4-openssl-dev \ qpdf \ pandoc \ make \ wget \ git \ libudunits2-dev \ libgdal-dev \ libgeos-dev \ libproj-dev \ r-base-dev \ gdb \ valgrind \ vim RUN Rscript -e 'install.packages(c("Rcpp", "magrittr", "abind", "units", "sf", "ggplot2", "ggthemes", "viridis", "testthat", "knitr", "covr", "rmarkdown"), repos = "https://cloud.r-project.org")' RUN git clone https://github.com/r-spatial/stars.git RUN export DEBIAN_FRONTEND=noninteractive; apt-get install -y pandoc-citeproc RUN Rscript -e 'install.packages(c("dplyr"), repos = "https://cloud.r-project.org")' RUN R CMD build --no-build-vignettes --no-manual stars RUN Rscript -e 'install.packages(c("PCICt","RNetCDF","ggforce","gstat","lwgeom","maps","ncmeta","pbapply","plm","raster","sp","spacetime","zoo","xts"), repos = "https://cloud.r-project.org")' #RUN R CMD check --no-build-vignettes --no-manual --as-cran --run-dontrun sf_*tar.gz RUN _R_CHECK_FORCE_SUGGESTS_=false R CMD check --no-manual stars_*tar.gz CMD ["/bin/bash"] stars/inst/gpkg/0000755000176200001440000000000013777653456013342 5ustar liggesusersstars/inst/gpkg/s2.gpkg0000644000176200001440000030000013777653456014531 0ustar liggesusersSQLite format 3@ 'GPKG .?   h\=mUndefined geographic SRSNONEundefinedundefined geographic coordinate reference system[;kUndefined cartesian SRSNONEundefinedundefined cartesian coordinate reference systemf +iWGS 84 geodeticEPSGGEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid Q  =clfeaturescl2021-01-01T21:03:53.542Z@@J|R@o6W5@JM  cl  cl cl  cl clgeomPOLYGON   clgeom  cl      |  h k~ w8MJQ-!triggergpkg_tile_matrix_zoom_level_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_zoom_level_update' BEFORE UPDATE of zoom_level ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') WHERE (NEW.zoom_level < 0); END<Q-triggergpkg_tile_matrix_zoom_level_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_zoom_level_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: zoom_level cannot be less than 0') WHERE (NEW.zoom_level < 0); END? S-indexsqlite_autoindex_gpkg_tile_matrix_1gpkg_tile_matrixC --9tablegpkg_tile_matrixgpkg_tile_matrix CREATE TABLE gpkg_tile_matrix (table_name TEXT NOT NULL,zoom_level INTEGER NOT NULL,matrix_width INTEGER NOT NULL,matrix_height INTEGER NOT NULL,tile_width INTEGER NOT NULL,tile_height INTEGER NOT NULL,pixel_x_size DOUBLE NOT NULL,pixel_y_size DOUBLE NOT NULL,CONSTRAINT pk_ttm PRIMARY KEY (table_name, zoom_level),CONSTRAINT fk_tmm_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name)) 55_tablegpkg_tile_matrix_setgpkg_tile_matrix_set CREATE TABLE gpkg_tile_matrix_set (table_name TEXT NOT NULL PRIMARY KEY,srs_id INTEGER NOT NULL,min_x DOUBLE NOT NULL,min_y DOUBLE NOT NULL,max_x DOUBLE NOT NULL,max_y DOUBLE NOT NULL,CONSTRAINT fk_gtms_table_name FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gtms_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id))G [5indexsqlite_autoindex_gpkg_tile_matrix_set_1gpkg_tile_matrix_set 77tablegpkg_geometry_columnsgpkg_geometry_columnsCREATE TABLE gpkg_geometry_columns (table_name TEXT NOT NULL,column_name TEXT NOT NULL,geometry_type_name TEXT NOT NULL,srs_id INTEGER NOT NULL,z TINYINT NOT NULL,m TINYINT NOT NULL,CONSTRAINT pk_geom_cols PRIMARY KEY (table_name, column_name),CONSTRAINT uk_gc_table_name UNIQUE (table_name),CONSTRAINT fk_gc_tn FOREIGN KEY (table_name) REFERENCES gpkg_contents(table_name),CONSTRAINT fk_gc_srs FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys (srs_id))I ]7indexsqlite_autoindex_gpkg_geometry_columns_2gpkg_geometry_columns I]7indexsqlite_autoindex_gpkg_geometry_columns_1gpkg_geometry_columns //[tablegpkg_ogr_contentsgpkg_ogr_contentsCREATE TABLE gpkg_ogr_contents(table_name TEXT NOT NULL PRIMARY KEY,feature_count INTEGER DEFAULT NULL)AU/indexsqlite_autoindex_gpkg_ogr_contents_1gpkg_ogr_contents''wtablegpkg_contentsgpkg_contentsCREATE TABLE gpkg_contents (table_name TEXT NOT NULL PRIMARY KEY,data_type TEXT NOT NULL,identifier TEXT UNIQUE,description TEXT DEFAULT '',last_change DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),min_x DOUBLE, min_y DOUBLE,max_x DOUBLE, max_y DOUBLE,srs_id INTEGER,CONSTRAINT fk_gc_r_srs_id FOREIGN KEY (srs_id) REFERENCES gpkg_spatial_ref_sys(srs_id))9M'indexsqlite_autoindex_gpkg_contents_2gpkg_contents9M'indexsqlite_autoindex_gpkg_contents_1gpkg_contents55)tablegpkg_spatial_ref_sysgpkg_spatial_ref_sysCREATE TABLE gpkg_spatial_ref_sys (srs_name TEXT NOT NULL,srs_id INTEGER NOT NULL PRIMARY KEY,organization TEXT NOT NULL,organization_coordsys_id INTEGER NOT NULL,definition TEXT NOT NULL,description TEXT)   bu)% 3 < 9 4 urOtableclclCREATE TABLE "cl" ( "fid" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "geom" POLYGON, "use" TEXT)YU-;triggergpkg_tile_matrix_pixel_y_size_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_update' BEFORE UPDATE OF pixel_y_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') WHERE NOT (NEW.pixel_y_size > 0); ENDIU-triggergpkg_tile_matrix_pixel_y_size_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_y_size_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: pixel_y_size must be greater than 0') WHERE NOT (NEW.pixel_y_size > 0); ENDYU-;triggergpkg_tile_matrix_pixel_x_size_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_update' BEFORE UPDATE OF pixel_x_size ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') WHERE NOT (NEW.pixel_x_size > 0); ENDIU-triggergpkg_tile_matrix_pixel_x_size_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_pixel_x_size_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: pixel_x_size must be greater than 0') WHERE NOT (NEW.pixel_x_size > 0); ENDYW-9triggergpkg_tile_matrix_matrix_height_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_height_update' BEFORE UPDATE OF matrix_height ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') WHERE (NEW.matrix_height < 1); ENDHW-triggergpkg_tile_matrix_matrix_height_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_height_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: matrix_height cannot be less than 1') WHERE (NEW.matrix_height < 1); ENDFTU-1triggergpkg_tile_matrix_matrix_width_updategpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_width_update' BEFORE UPDATE OF matrix_width ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'update on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') WHERE (NEW.matrix_width < 1); ENDDU-triggergpkg_tile_matrix_matrix_width_insertgpkg_tile_matrixCREATE TRIGGER 'gpkg_tile_matrix_matrix_width_insert' BEFORE INSERT ON 'gpkg_tile_matrix' FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'insert on table ''gpkg_tile_matrix'' violates constraint: matrix_width cannot be less than 1') WHERE (NEW.matrix_width < 1); END  ? %6#GP6u^+e@Kᾣ@RƵ|J@@"JJ@ o@NWNJ@6u^+e@RƵ|J@H@ϰ>J@Kᾣ@HNݤJ@8L^H @@"JJ@ o@NWNJ@clouds_land4V!GPѧ@kϭ}=@\.J@XP0J@ wo@J@ѧ@=J@m#5@ G}J@ L@\.J@kϭ}=@+#J@ʂ@XP0J@ wo@J@clouds_sea=vGPKrߝ@6W6o@Xo/J@MJ@g@@J@b}D@T%5J@Krߝ@yP#J@S@Xo/J@?L$5:@J@6W6o@iZJ@x4@MJ@g@@J@sea>vGPS@/q@]XJ@OԞJ@ @lhG@0m8rJ@S@kJ@6N\"@+ J@D3{@]XJ@(!@ƄwJ@/q@ʱJ@yy}st@OԞJ@ @lhG@0m8rJ@land cl X-q!clgeomgpkg_rtree_indexhttp://www.geopackage.org/spec120/#extension_rtreewrite-only - clgeomgpkg_rtree_index      - -P$@/@TBUBVt@@yBW{BW@̨@BVBW @)Y@uBU;BUW   3 E ;E3'5+triggerrtree_cl_geom_deleteclCREATE TRIGGER "rtree_cl_geom_delete" AFTER DELETE ON "cl" WHEN old."geom" NOT NULL BEGIN DELETE FROM "rtree_cl_geom" WHERE id = OLD."fid"; ENDx&73triggerrtree_cl_geom_update4clCREATE TRIGGER "rtree_cl_geom_update4" AFTER UPDATE ON "cl" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_cl_geom" WHERE id IN (OLD."fid", NEW."fid"); END}%7=triggerrtree_cl_geom_update3clCREATE TRIGGER "rtree_cl_geom_update3" AFTER UPDATE ON "cl" WHEN OLD."fid" != NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_cl_geom" WHERE id = OLD."fid"; INSERT OR REPLACE INTO "rtree_cl_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); ENDs$7)triggerrtree_cl_geom_update2clCREATE TRIGGER "rtree_cl_geom_update2" AFTER UPDATE OF "geom" ON "cl" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" ISNULL OR ST_IsEmpty(NEW."geom")) BEGIN DELETE FROM "rtree_cl_geom" WHERE id = OLD."fid"; ENDT#7ktriggerrtree_cl_geom_update1clCREATE TRIGGER "rtree_cl_geom_update1" AFTER UPDATE OF "geom" ON "cl" WHEN OLD."fid" = NEW."fid" AND (NEW."geom" NOTNULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_cl_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END/"5#triggerrtree_cl_geom_insertclCREATE TRIGGER "rtree_cl_geom_insert" AFTER INSERT ON "cl" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_cl_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END!55!tablertree_cl_geom_parentrtree_cl_geom_parentCREATE TABLE "rtree_cl_geom_parent"(nodeno INTEGER PRIMARY KEY,parentnode)s 11tablertree_cl_geom_nodertree_cl_geom_nodeCREATE TABLE "rtree_cl_geom_node"(nodeno INTEGER PRIMARY KEY,data)w33tablertree_cl_geom_rowidrtree_cl_geom_rowidCREATE TABLE "rtree_cl_geom_rowid"(rowid INTEGER PRIMARY KEY,nodeno)r''%tablertree_cl_geomrtree_cl_geomCREATE VIRTUAL TABLE "rtree_cl_geom" USING rtree(id, minx, maxx, miny, maxy)=Q+indexsqlite_autoindex_gpkg_extensions_1gpkg_extensionsw++%tablegpkg_extensionsgpkg_extensionsCREATE TABLE gpkg_extensions (table_name TEXT,column_name TEXT,extension_name TEXT NOT NULL,definition TEXT NOT NULL,scope TEXT NOT NULL,CONSTRAINT ge_tce UNIQUE (table_name, column_name, extension_name))dKwtriggertrigger_delete_feature_count_clclCREATE TRIGGER "trigger_delete_feature_count_cl" AFTER DELETE ON "cl" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count - 1 WHERE lower(table_name) = lower('cl'); ENDdKwtriggertrigger_insert_feature_count_clclCREATE TRIGGER "trigger_insert_feature_count_cl" AFTER INSERT ON "cl" BEGIN UPDATE gpkg_ogr_contents SET feature_count = feature_count + 1 WHERE lower(table_name) = lower('cl'); ENDP++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)stars/build/0000755000176200001440000000000014644756275012531 5ustar liggesusersstars/build/vignette.rds0000644000176200001440000000064214644756275015072 0ustar liggesusersO0LфDO.6.!&&^V-LnٞhI~?}v/MBs GMTDuHC8dQN}vTK-CEjy@ )> ^Yٽ zŤb0=hGD5DD,6[A y-LB(m VCنOL(2$tZ{l5\ixLY!zngftPҽ`?h*σ&^⡁:\% st_set_crs('OGC:CRS84') \%>\% st_warp(st_as_stars(st_bbox(), dx = 2)) -> s plot(r, axes = TRUE) # no CRS set, so no degree symbols in labels plot(s, axes = TRUE) # downsample raster (90 to 270 m) r = read_stars(system.file("tif/olinda_dem_utm25s.tif", package = "stars")) r270 = st_as_stars(st_bbox(r), dx = 270) r270 = st_warp(r, r270) } stars/man/st_contour.Rd0000644000176200001440000000171313777653456014700 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sf.R \name{st_contour} \alias{st_contour} \title{Compute or plot contour lines or sets} \usage{ st_contour( x, na.rm = TRUE, contour_lines = FALSE, breaks = classInt::classIntervals(na.omit(as.vector(x[[1]])))$brks ) } \arguments{ \item{x}{object of class \code{stars}} \item{na.rm}{logical; should missing valued cells be removed, or also be converted to features?} \item{contour_lines}{logical; if \code{FALSE}, polygons are returned (contour sets), otherwise contour lines} \item{breaks}{numerical; values at which to "draw" contour levels} } \description{ Compute contour lines or sets } \details{ this function requires GDAL >= 2.4.0 } \seealso{ for polygonizing rasters following grid boundaries, see \link{st_as_sf} with arguments \code{as_points=FALSE} and \code{merge=TRUE}; \link{contour} plots contour lines using R's native algorithm (which also plots contour levels) } stars/man/stars_subset.Rd0000644000176200001440000001046314451263410015175 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/proxy.R, R/subset.R \name{stars_subset} \alias{stars_subset} \alias{[<-.stars_proxy} \alias{[.stars} \alias{[<-.stars} \alias{st_flip} \title{subset stars objects} \usage{ \method{[}{stars_proxy}(x, i, downsample = 0) <- value \method{[}{stars}(x, i = TRUE, ..., drop = FALSE, crop = !is_curvilinear(x)) \method{[}{stars}(x, i) <- value st_flip(x, which = 1) } \arguments{ \item{x}{object of class \code{stars}} \item{i}{first selector: integer, logical or character vector indicating attributes to select, or object of class \code{sf}, \code{sfc}, \code{bbox}, or \code{stars} used as spatial selector; see details} \item{downsample}{downsampling rate used in case \code{i} is a \code{stars_proxy} object} \item{value}{array of dimensions equal to those in \code{x}, or a vector or value that will be recycled to such an array} \item{...}{further (logical or integer vector) selectors, matched by order, to select on individual dimensions} \item{drop}{logical; if \code{TRUE}, degenerate dimensions (with only one value) are dropped} \item{crop}{logical; if \code{TRUE} and parameter \code{i} is a spatial geometry (\code{sf} or \code{sfc}) object, the extent (bounding box) of the result is cropped to match the extent of \code{i} using \link{st_crop}. Cropping curvilinear grids is not supported.} \item{which}{character or integer; dimension(s) to be flipped} } \value{ \code{st_flip} flips (reverts) the array values along the chosen dimension without(s) changing the dimension properties } \description{ subset stars objects } \details{ If \code{i} is an object of class \code{sf}, \code{sfc} or \code{bbox}, the spatial subset covering this geometry is selected, possibly followed by cropping the extent. Array values for which the cell centre is not inside the geometry are assigned \code{NA}. If \code{i} is of class \code{stars}, and attributes of \code{i} are \code{logical}, cells in \code{x} corresponding to \code{NA} or \code{FALSE} cells in \code{i} are assigned an \code{NA}. Dimension ranges containing negative values or \code{NA} may be partially supported. in an assignment (or replacement form, \code{[<-}), argument \code{i} needs to be either (i) a \code{stars} object with logical attribute(s) that has dimensions matching (possibly after recycling) those of \code{x}, in which case the \code{TRUE} cells will be replaced and \code{i} and/or \code{value} will be recycled to the dimensions of the arrays in \code{x}, or (ii) a length-one integer or character vector indicating which array to replace, in which case \code{value} may be stars object or a vector or array (that will be recycled). } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) x[,,,1:3] # select bands x[,1:100,100:200,] # select x and y by range x["L7_ETMs.tif"] # select attribute xy = structure(list(x = c(293253.999046018, 296400.196497684), y = c(9113801.64775462, 9111328.49619133)), .Names = c("x", "y")) pts = st_as_sf(data.frame(do.call(cbind, xy)), coords = c("x", "y"), crs = st_crs(x)) image(x, axes = TRUE) plot(st_as_sfc(st_bbox(pts)), col = NA, add = TRUE) bb = st_bbox(pts) (xx = x[bb]) image(xx) plot(st_as_sfc(bb), add = TRUE, col = NA) image(x) pt = st_point(c(x = 290462.103109179, y = 9114202.32594085)) buf = st_buffer(st_sfc(pt, crs = st_crs(x)), 1500) plot(buf, add = TRUE) buf = st_sfc(st_polygon(list(st_buffer(pt, 1500)[[1]], st_buffer(pt, 1000)[[1]])), crs = st_crs(x)) image(x[buf]) plot(buf, add = TRUE, col = NA) image(x[buf, crop=FALSE]) plot(buf, add = TRUE, col = NA) # with i of class stars: x[x > 75] # generates lots of NA's; pattern for each band x[x[,,,1] > 75] # recycles a single band template for all bands x = read_stars(tif) # replace, using a logical stars selector: cuts all values above 90 to 90 x[x > 90] = 90 # replace a single attribute when there are more than one: s = split(x) names(s) = paste0("band", 1:6) # rescale only band 1: s[1] = s[1] * 0.75 # rescale only attribute named "band2": s["band2"] = s["band2"] * 0.85 # create a new attribute from a numeric vector: s["rnorm"] = rnorm(prod(dim(s))) s lc = read_stars(system.file("tif/lc.tif", package = "stars")) x = c(orig = lc, flip_x = st_flip(lc, "x"), flip_y = st_flip(lc, "y"), flip_xy = st_flip(lc, c("x", "y")), along = 3) plot(x) } stars/man/st_as_stars.Rd0000644000176200001440000002030714576035610015006 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cubble.R, R/ncdf.R, R/OpenStreetMap.R, % R/proxy.R, R/rasterize.R, R/raster.R, R/sf.R, R/stars.R, R/xts.R \name{st_as_stars} \alias{st_as_stars} \alias{st_as_stars.cubble_df} \alias{st_as_stars.ncdfgeom} \alias{st_as_stars.OpenStreetMap} \alias{st_as_stars.stars_proxy} \alias{st_as_stars.data.frame} \alias{st_as_stars.Raster} \alias{st_as_stars.SpatRaster} \alias{st_as_stars.sf} \alias{st_as_stars.list} \alias{st_as_stars.default} \alias{st_as_stars.stars} \alias{st_as_stars.bbox} \alias{st_as_stars.xts} \title{convert objects into a stars object} \usage{ \method{st_as_stars}{cubble_df}(.x, ..., check_times = FALSE) \method{st_as_stars}{ncdfgeom}(.x, ..., sf_geometry = NA) \method{st_as_stars}{OpenStreetMap}(.x, ..., as_col = FALSE) \method{st_as_stars}{stars_proxy}( .x, ..., downsample = 0, url = attr(.x, "url"), envir = parent.frame() ) \method{st_as_stars}{data.frame}(.x, ..., dims = coords, xy, y_decreasing = TRUE, coords = 1:2) \method{st_as_stars}{Raster}(.x, ..., att = 1, ignore_file = FALSE) \method{st_as_stars}{SpatRaster}( .x, ..., ignore_file = FALSE, as_attributes = all(terra::is.factor(.x)) ) \method{st_as_stars}{sf}(.x, ..., dims = attr(.x, "sf_column")) st_as_stars(.x, ...) \method{st_as_stars}{list}(.x, ..., dimensions = NULL) \method{st_as_stars}{default}(.x = NULL, ..., raster = NULL) \method{st_as_stars}{stars}(.x, ..., curvilinear = NULL, crs = st_crs("OGC:CRS84")) \method{st_as_stars}{bbox}( .x, ..., nx, ny, dx = dy, dy = dx, xlim = .x[c("xmin", "xmax")], ylim = .x[c("ymin", "ymax")], values = 0, n = 64800, pretty = FALSE, inside = FALSE, nz, proxy = FALSE ) \method{st_as_stars}{xts}(.x, ..., dimensions, name = "attr") } \arguments{ \item{.x}{object to convert} \item{...}{in case \code{.x} is of class \code{bbox}, arguments passed on to \link{pretty}. In case \code{.x} is of class \code{nc_proxy}, arguments passed on to \code{\link{read_ncdf}}.} \item{check_times}{logical; should we check that the time stamps of all time series are identical?} \item{sf_geometry}{sf data.frame with geometry and attributes to be added to stars object. Must have same number of rows as timeseries instances.} \item{as_col}{logical; return rgb numbers (FALSE) or (character) color values (TRUE)?} \item{downsample}{integer: if larger than 0, downsample with this rate (number of pixels to skip in every row/column); if length 2, specifies downsampling rate in x and y.} \item{url}{character; URL of the stars endpoint where the data reside} \item{envir}{environment to resolve objects in} \item{dims}{the column names or indices that form the cube dimensions} \item{xy}{the x and y raster dimension names or indices; only takes effect after \code{dims} has been specified, see details} \item{y_decreasing}{logical; if TRUE, (numeric) y values get a negative delta (decrease with increasing index)} \item{coords}{same as dims, for symmetry with \link[sf]{st_as_sf}} \item{att}{see \link[raster:factor]{factorValues}; column in the RasterLayer's attribute table} \item{ignore_file}{logical; if \code{TRUE}, ignore the SpatRaster object file name} \item{as_attributes}{logical; if \code{TRUE} and \code{.x} has more than one layer, load these as separate attributes rather than as a band or time dimension (only implemented for the case where \code{ignore_file} is \code{TRUE})} \item{dimensions}{object of class dimensions} \item{raster}{character; the names of the dimensions that denote raster dimensions} \item{curvilinear}{only for creating curvilinear grids: named length 2 list holding longitude and latitude matrices or stars arrays, or the names of the corresponding attributes in \code{.x}; the names of this vector should correspond to raster dimensions the matrices are associated with; see Details.} \item{crs}{object of class \code{crs} with the coordinate reference system of the values in \code{curvilinear}; see details} \item{nx}{integer; number of cells in x direction; see details} \item{ny}{integer; number of cells in y direction; see details} \item{dx}{numeric or object of class units; cell size in x direction; see details} \item{dy}{numeric or object of class units; cell size in y direction; see details} \item{xlim}{length 2 numeric vector with extent (min, max) in x direction} \item{ylim}{length 2 numeric vector with extent (min, max) in y direction} \item{values}{value(s) to populate the raster values with} \item{n}{the (approximate) target number of grid cells} \item{pretty}{logical; should cell coordinates have \link{pretty} values?} \item{inside}{logical; should all cells entirely fall inside the bbox, potentially not covering it completely (\code{TRUE}), or always cover the bbox (\code{FALSE}), or find a good approximation (\code{NA}, default)?} \item{nz}{integer; number of cells in z direction; if missing no z-dimension is created.} \item{proxy}{logical; should a \code{stars_proxy} object be created? (requires gdal_create binary when sf < 1.0-6)} \item{name}{character; attribute name for array from an \code{xts} object} } \description{ convert objects into a stars object } \details{ For the \code{ncdfgeom} method: objects are point-timeseries with optional line or polygon geometry for each timeseries specified with the \code{sf_geometry} parameter. See \pkg{ncdfgeom} for more about this NetCDF-based format for geometry and timeseries. If \code{xy} is not specified and the first two dimensions in \code{dims} are both numeric, then it is set to these two dimensions. The \code{st_as_stars} method for \code{sf} objects without any additional arguments returns a one-dimensional data cube with a dimension for the simple features geometries, and all remaining attributes as data cube attributes. When used with further arguments, the method for \code{data.frame}s is called. if \code{curvilinear} is a list with \code{stars} objects with longitude and latitude values, its coordinate reference system is typically not that of the latitude and longitude values. If \code{curvilinear} contains the names of two arrays in \code{.x}, then these are removed from the returned object. For the \code{bbox} method: if \code{pretty} is \code{TRUE}, raster cells may extend the coordinate range of \code{.x} on all sides. If in addition to \code{nx} and \code{ny}, \code{dx} and \code{dy} are also missing, these are set to a single value computed as \code{sqrt(diff(xlim)*diff(ylim)/n)}. If \code{nx} and \code{ny} are missing and \code{values} is a matrix, the number of columns and rows of the matrix are taken. Otherwise, if \code{nx} and \code{ny} are missing, they are computed as the (ceiling, floor, or rounded to integer value) of the ratio of the (x or y) range divided by (dx or dy), depending on the value of \code{inside}. Positive \code{dy} will be made negative. Further named arguments (\code{...}) are passed on to \code{pretty}. If \code{dx} or \code{dy} are \code{units} objects, their value is converted to the units of \code{st_crs(.x)} (only when sf >= 1.0-7). for the \code{xts} methods, if \code{dimensions} are provided, time has to be the first dimension. } \examples{ if (require(plm, quietly = TRUE)) { data(Produc, package = "plm") st_as_stars(Produc) } if (require(dplyr, quietly = TRUE)) { # https://stackoverflow.com/questions/77368957/ spatial_dim <- st_sf( ID = 1:3, geometry = list( st_polygon(list( cbind(c(0, 1, 1, 0, 0), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(1, 2, 2, 1, 1), c(0, 0, 1, 1, 0)) )), st_polygon(list( cbind(c(2, 3, 3, 2, 2), c(0, 0, 1, 1, 0)) )) ) ) weekdays_dim <- data.frame(weekdays = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")) hours_dim <- data.frame(hours = c("8am", "11am", "4pm", "11pm")) sf_dta <- spatial_dim |> cross_join(weekdays_dim)|> cross_join(hours_dim) |> mutate(population = rnorm(n(), mean = 1000, sd = 200)) |> select(everything(), geometry) st_as_stars(sf_dta, dims = c("weekdays", "hours", "geometry")) } demo(nc, echo=FALSE,ask=FALSE) st_as_stars(nc) st_as_stars(st_drop_geometry(nc), dims = "NAME") data.frame(expand.grid(x=1:5, y = 1:5), z = rnorm(25)) |> st_as_stars() nc = st_read(system.file("gpkg/nc.gpkg", package="sf")) st_as_stars(nc) } stars/man/prcomp.Rd0000644000176200001440000000205314600276522013754 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/prcomp.R \name{prcomp} \alias{prcomp} \alias{prcomp.stars_proxy} \alias{prcomp.stars} \title{Principle components of stars object} \usage{ \method{prcomp}{stars_proxy}(x, ..., downsample = 0) \method{prcomp}{stars}(x, ..., quiet = FALSE) } \arguments{ \item{x}{object of class `stars` or `stars_proxy`} \item{...}{see \link[stats]{prcomp}} \item{downsample}{see \link{st_as_stars}} \item{quiet}{logical; if `TRUE`, suppress message that PCs will be computed on last dimension; see details} } \value{ object of class `prcomp`, see \link[stats]{prcomp} } \description{ Compute principle components of stars object } \details{ if `x` has only one attribute, principle components will be computed in the space of the last dimension of `x` to predict PC scores into a `stars` object, use \link{predict.stars}; see example below } \examples{ l7 = split(st_as_stars(L7_ETMs), 3) # use bands as features l7 |> prcomp() |> plot() l7 |> prcomp() |> predict(l7, model = _) |> merge() |> plot() } stars/man/st_extract.Rd0000644000176200001440000000456714603253272014650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/extract.R \name{st_extract} \alias{st_extract} \alias{st_extract.stars} \title{Extract cell values at point locations} \usage{ st_extract(x, ...) \method{st_extract}{stars}( x, at, ..., bilinear = FALSE, time_column = attr(at, "time_column") \%||\% attr(at, "time_col"), interpolate_time = bilinear, FUN = mean ) } \arguments{ \item{x}{object of class \code{stars} or \code{stars_proxy}} \item{...}{passed on to \link{aggregate.stars} when geometries are not exclusively POINT geometries} \item{at}{object of class \code{sf} or \code{sfc} with geometries, or two-column matrix with coordinate points in rows, indicating where to extract values of \code{x}} \item{bilinear}{logical; use bilinear interpolation rather than nearest neighbour?} \item{time_column}{character or integer; name or index of a column with time or date values that will be matched to values of the first temporal dimension (matching classes \code{POSIXct}, \code{POSIXt}, \code{Date}, or \code{PCICt}), in \code{x}, after which this dimension is reduced. This is useful to extract data cube values along a trajectory; see https://github.com/r-spatial/stars/issues/352 .} \item{interpolate_time}{logical; should time be interpolated? if FALSE, time instances are matched using the coinciding or the last preceding time in the data cube.} \item{FUN}{function used to aggregate pixel values when geometries of \code{at} intersect with more than one pixel} } \value{ if \code{at} is of class \code{matrix}, a matrix with extracted values is returned; otherwise: if \code{x} has more dimensions than only x and y (raster), an object of class \code{stars} with POINT geometries replacing x and y raster dimensions, if this is not the case, an object of \code{sf} with extracted values. } \description{ Extract cell values at point locations } \details{ points outside the raster are returned as \code{NA} values. For large sets of points for which extraction is needed, passing a matrix as to \code{at} may be much faster than passing an \code{sf} or \code{sfc} object. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") r = read_stars(tif) pnt = st_sample(st_as_sfc(st_bbox(r)), 10) st_extract(r, pnt) st_extract(r, pnt) \%>\% st_as_sf() st_extract(r[,,,1], pnt) st_extract(r, st_coordinates(pnt)) # "at" is a matrix: return a matrix } stars/man/in-methods.Rd0000644000176200001440000000061314050270337014520 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ops.R \docType{methods} \name{\%in\%,stars-method} \alias{\%in\%,stars-method} \title{evaluate whether cube values are in a given set} \usage{ \S4method{\%in\%}{stars}(x, table) } \arguments{ \item{x}{data cube value} \item{table}{values of the set} } \description{ evaluate whether cube values are in a given set } stars/man/make_intervals.Rd0000644000176200001440000000072014414346723015463 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/intervals.R \name{make_intervals} \alias{make_intervals} \title{create an intervals object} \usage{ make_intervals(start, end) } \arguments{ \item{start}{vector with start values, or 2-column matrix with start and end values in column 1 and 2, respectively} \item{end}{vector with end values} } \description{ create an intervals object, assuming left-closed and right-open intervals } stars/man/st_cells.Rd0000644000176200001440000000152514621476642014277 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R \name{st_cells} \alias{st_cells} \title{return the cell index corresponding to the location of a set of points} \usage{ st_cells(x, sf) } \arguments{ \item{x}{object of class \code{stars}} \item{sf}{object of class \code{sf} or \code{sfc}} } \description{ If the object has been cropped without normalization, then the indices return are relative to the original uncropped extent. See \code{\link{st_crop}} } \examples{ set.seed(1345) st_bbox(L7_ETMs) |> st_as_sfc() |> st_sample(10) -> pts (x <- st_cells(L7_ETMs, pts)) # get the pixel values (first band only): st_as_stars(L7_ETMs)[[1]][x] # get pixel values for all bands: st_as_stars(L7_ETMs) |> split() |> sapply(`[`, x) # compare with st_extract(): st_as_stars(L7_ETMs) |> split() |> st_extract(pts) } stars/man/print_stars.Rd0000644000176200001440000000221514576035610015027 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dimensions.R, R/stars.R \name{print_stars} \alias{print_stars} \alias{as.data.frame.dimensions} \alias{print.dimensions} \alias{print.stars} \title{print stars or dimensions object} \usage{ \method{as.data.frame}{dimensions}( x, ..., digits = max(3, getOption("digits") - 3), usetz = TRUE, stars_crs = getOption("stars.crs") \%||\% 28, all = FALSE ) \method{print}{dimensions}(x, ...) \method{print}{stars}(x, ..., n = 1e+05, abbrev = 30) } \arguments{ \item{x}{object of class stars or of class dimensions} \item{...}{passed on to \code{as.data.frame.dimensions}} \item{digits}{number of digits to print numbers} \item{usetz}{logical; used to format \code{PCICt} or \code{POSIXct} values} \item{stars_crs}{maximum width of string for CRS objects} \item{all}{logical; if \code{TRUE} print also fields entirely filled with \code{NA} or \code{NULL}} \item{n}{when prod(dim(x)) > 10 * n, the first n cells are used for attribute summary statistics} \item{abbrev}{number of characters to abbreviate attribute names to} } \description{ print stars or dimensions object } stars/man/st_downsample.Rd0000644000176200001440000000423114464700544015337 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sample.R \name{st_downsample} \alias{st_downsample} \alias{st_downsample.stars} \alias{st_downsample.stars_proxy} \title{downsample stars or stars_proxy objects} \usage{ st_downsample(x, n, ...) \method{st_downsample}{stars}(x, n, ..., offset = 0, FUN) \method{st_downsample}{stars_proxy}(x, n, ...) } \arguments{ \item{x}{object of class stars or stars_proxy} \item{n}{integer; for each dimension the number of pixels/lines/bands etc that will be skipped; see Details.} \item{...}{arguments passed on to \code{FUN} (e.g., \code{na.rm = TRUE} to ignore missing values if FUN is \code{mean})} \item{offset}{integer; offset(s) for downsampling, in pixels, starting at the offset of each dimension; should be smaller or equal to \code{n}} \item{FUN}{function; if given, downsampling will apply FUN to each of the the subtiles} } \description{ downsample a stars or stars_proxy object either by skipping rows, columns and bands, or by computing a single value (e.g. the mean) from the sub-tiles involved } \details{ If all n == 0, no downsampling takes place; if it is 1, every second row/column/band is skipped, if it is 2, every second+third row/column/band are skipped, etc. Downsampling a \code{stars_proxy} object returns a \code{stars} object, is equivalent to calling \code{st_as_stars(x, downsample = 2)}, and only downsamples the first two (x and y) dimensions. Downsampled regular rasters keep their dimension offsets, have a cell size (delta) that is n[i]+1 times larger, and may result in a (slightly) different extent. Note that terra's \link[terra]{aggregate} with \code{fact=2} corresponds to \code{st_downsample(x, n = 1, FUN = mean)}: \code{fact} is one larger than \code{n}. } \examples{ (m = matrix(1:121, 11, 11)) (s = st_as_stars(m)) st_downsample(s, 1) st_downsample(s, 1)[[1]] st_downsample(s, 1, offset = 1) st_downsample(s, 1, offset = 1)[[1]] st_downsample(s, 1, offset = c(0,1)) st_downsample(s, 1, offset = c(0,1))[[1]] st_downsample(s, 1, FUN = mean) st_downsample(s, 1, FUN = mean)[[1]] st_downsample(s, 1, offset = 1, FUN = mean) st_downsample(s, 1, offset = c(0,1), FUN = mean)[[1]] } stars/man/coerce-methods.Rd0000644000176200001440000000201714144045432015352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/raster.R \name{as} \alias{as} \alias{coerce,stars,Raster-method} \alias{coerce,stars_proxy,Raster-method} \alias{coerce,stars,Terra-method} \alias{coerce,stars_proxy,Terra-method} \title{Coerce stars object into a Raster raster or brick} \arguments{ \item{from}{object to coerce} } \value{ RasterLayer or RasterBrick SpatRaster } \description{ Coerce stars object into a Raster raster or brick Coerce stars object into a terra SpatRaster } \details{ If the stars object has more than three dimensions, all dimensions higher than the third will be collapsed into the third dimensions. If the stars object has only an x/y raster but multiple attributes, these are merged first, then put in a raster brick. If the stars object has more than three dimensions, all dimensions higher than the third will be collapsed into the third dimensions. If the stars object has only an x/y raster but multiple attributes, these are merged first, then put in a SpatRaster. } stars/man/ops_stars.Rd0000644000176200001440000000243414046025022014463 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ops.R \name{ops_stars} \alias{ops_stars} \alias{Ops.stars} \alias{Math.stars} \alias{Ops.stars_proxy} \alias{Math.stars_proxy} \title{S3 Ops Group Generic Functions for stars objects} \usage{ \method{Ops}{stars}(e1, e2) \method{Math}{stars}(x, ...) \method{Ops}{stars_proxy}(e1, e2) \method{Math}{stars_proxy}(x, ...) } \arguments{ \item{e1}{object of class \code{stars}} \item{e2}{object of class \code{stars}} \item{x}{object of class stars} \item{...}{parameters passed on to the Math functions} } \value{ object of class \code{stars} } \description{ Ops functions for stars objects, including comparison, product and divide, add, subtract } \details{ if \code{e1} or \code{e2} is is a numeric vector, or \code{e2} has less or smaller dimensions than \code{e1}, then \code{e2} is recycled such that it fits \code{e1}, using usual R array recycling rules. The user needs to make sure this is sensible; it may be needed to use \code{aperm} to permutate dimensions first. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) x * x x / x x + x x + 10 all.equal(x * 10, 10 * x) tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) a = sqrt(x) b = log(x, base = 10) } stars/man/mdim.Rd0000644000176200001440000000611714576033423013412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mdim.R \name{mdim} \alias{mdim} \alias{read_mdim} \alias{write_mdim} \title{Read or write data using GDAL's multidimensional array API} \usage{ read_mdim( filename, variable = character(0), ..., options = character(0), raster = NULL, offset = integer(0), count = integer(0), step = integer(0), proxy = FALSE, debug = FALSE, bounds = TRUE, curvilinear = NA ) write_mdim( x, filename, driver = detect.driver(filename), ..., root_group_options = character(0), options = character(0), as_float = TRUE ) } \arguments{ \item{filename}{name of the source or destination file or data source} \item{variable}{name of the array to be read; if `"?"`, a list of array names is returned, with group name as list element names.} \item{...}{ignored} \item{options}{character; driver specific options regarding the opening (read_mdim) or creation (write_mdim) of the dataset} \item{raster}{names of the raster variables (default: first two dimensions)} \item{offset}{integer; offset for each dimension (pixels) of sub-array to read, defaults to 0 for each dimension(requires sf >= 1.0-9)} \item{count}{integer; size for each dimension (pixels) of sub-array to read (default: read all); a value of NA will read the corresponding dimension entirely; counts are relative to the step size (requires sf >= 1.0-9)} \item{step}{integer; step size for each dimension (pixels) of sub-array to read; defaults to 1 for each dimension (requires sf >= 1.0-9)} \item{proxy}{logical; return proxy object? (not functional yet)} \item{debug}{logical; print debug info?} \item{bounds}{logical or character: if \code{TRUE} tries to infer from "bounds" attribute; if character, named vector of the form \code{c(longitude="lon_bnds", latitude="lat_bnds")} with names dimension names} \item{curvilinear}{control reading curvilinear (geolocation) coordinate arrays; if \code{NA} try reading the x/y dimension names; if character, defines the arrays to read; if \code{FALSE} do not try; see also \link{read_stars}} \item{x}{stars object} \item{driver}{character; driver name} \item{root_group_options}{character; driver specific options regarding the creation of the root group} \item{as_float}{logical; if \code{TRUE} write 4-byte floating point numbers, if \code{FALSE} write 8-byte doubles} } \description{ Read or write data using GDAL's multidimensional array API } \details{ it is assumed that the first two dimensions are easting and northing } \examples{ set.seed(135) m = matrix(runif(10), 2, 5) names(dim(m)) = c("stations", "time") times = as.Date("2022-05-01") + 1:5 pts = st_as_sfc(c("POINT(0 1)", "POINT(3 5)")) s = st_as_stars(list(Precipitation = m)) |> st_set_dimensions(1, values = pts) |> st_set_dimensions(2, values = times) nc = tempfile(fileext=".nc") if (compareVersion(sf_extSoftVersion()["GDAL"], "3.4.0") > -1) { write_mdim(s, nc) # try ncdump on the generated file print(read_mdim(nc)) } } \seealso{ \link[sf]{gdal_utils}, in particular util \code{mdiminfo} to query properties of a file or data source containing arrays } stars/man/st_set_bbox.Rd0000644000176200001440000000062413777653456015014 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R \name{st_set_bbox} \alias{st_set_bbox} \title{set bounding box parameters of regular grid} \usage{ st_set_bbox(x, value, ...) } \arguments{ \item{x}{object of class dimensions, stars or stars_proxy} \item{value}{object of class bbox} \item{...}{ignored} } \description{ set bounding box parameters of regular grid } stars/man/st_geotransform.Rd0000644000176200001440000000317314576033423015677 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gt.R \name{st_geotransform} \alias{st_geotransform} \alias{st_geotransform<-} \alias{st_geotransform<-.stars} \title{get or set the geotransform, or rotation matrix} \usage{ st_geotransform(x, ...) st_geotransform(x) <- value \method{st_geotransform}{stars}(x) <- value } \arguments{ \item{x}{object of class stars or dimensions} \item{...}{ignored} \item{value}{length 6 numeric vector, or 2 x 2 (scaled) rotation matrix} } \description{ get or set the geotransform, or rotation matrix } \examples{ # using the "classical" rotation matrix, see https://en.wikipedia.org/wiki/Rotation_matrix : rot = function(theta, dxdy = c(1., -1.)) { th = theta / 180 * pi matrix(c(cos(th), sin(th), -sin(th), cos(th)), 2, 2) \%*\% matrix(c(dxdy[2], 0, 0, dxdy[1]), 2, 2) } l = st_downsample(st_as_stars(L7_ETMs), 9) # save time in plotting st_geotransform(l) = rot(20, c(28.5, 28.5)) # clockwise, 20 degrees, scale by cell size plot(l[,,,1]) m = rot(20, c(1, 2)) g = expand.grid(x = 0:4, y = 0:4) plot(g[1:2], asp = 1) text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4) g = t(m \%*\% t(as.matrix(g))) points(g, col = 'red') text(g[,1], g[,2], labels = seq_along(g[,1]), pos = 4, col = 'red') m = matrix(1:20, 4) s0 = st_as_stars(m) s = s0 # dy > 0, clockwise rotation: st_geotransform(s) = rot(10, c(1,1)) plot(s0, reset = FALSE) plot(s, add = TRUE) # dy < 0, counter clockwise rotation, + expansion in x-direction: layout(1) s0 = st_as_stars(st_bbox(s0), dx = 1) s0$values = 1:20 s0 plot(s0, reset = FALSE) s = s0 st_geotransform(s) = rot(10, c(2,1)) plot(s, add = TRUE) } stars/man/st_raster_type.Rd0000644000176200001440000000211214146737530015525 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R \name{st_raster_type} \alias{st_raster_type} \title{get the raster type (if any) of a stars object} \usage{ st_raster_type(x, dimension = character(0)) } \arguments{ \item{x}{object of class \code{stars}} \item{dimension}{optional: numbers or names of dimension(s) to get per-dimension type} } \value{ if \code{dimension} is not specified, return the spatial raster type: one of \code{NA} (if the object does not have raster dimensions), \code{"curvilinear"}, \code{"rectilinear"}, \code{"affine"}, or \code{"regular"}. In case dimension(s) are specified, return one of \code{"regular"}, \code{"rectilinear"} (irregular but numeric), or \code{"discrete"} (anything else). } \description{ get the raster type (if any) of a stars object } \details{ categories \code{"curvilinear"} and \code{"affine"} only refer to the relationship between a pair of spatial (raster) dimensions. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) st_raster_type(x) st_raster_type(x, 1:3) } stars/man/cut_stars.Rd0000644000176200001440000000220413777653456014504 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/factors.R \name{cut_stars} \alias{cut_stars} \alias{cut.array} \alias{cut.matrix} \alias{cut.stars} \title{cut methods for stars objects} \usage{ \method{cut}{array}(x, breaks, ...) \method{cut}{matrix}(x, breaks, ...) \method{cut}{stars}(x, breaks, ...) } \arguments{ \item{x}{see \link[base]{cut}} \item{breaks}{see \link[base]{cut}} \item{...}{see \link[base]{cut}} } \value{ an array or matrix with a \code{levels} attribute; see details } \description{ cut methods for stars objects } \details{ R's \code{factor} only works for vectors, not for arrays or matrices. This is a work-around (or hack?) to keep the factor levels generated by \code{cut} and use them in plots. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) cut(x, c(0, 50, 100, 255)) cut(x[,,,1], c(0, 50, 100, 255)) plot(cut(x[,,,1], c(0, 50, 100, 255))) tif = system.file("tif/L7_ETMs.tif", package = "stars") x1 = read_stars(tif) (x1_cut = cut(x1, breaks = c(0, 50, 100, Inf))) # shows factor in summary plot(x1_cut[,,,c(3,6)]) # propagates through [ and plot } stars/man/c.stars.Rd0000644000176200001440000000364114576035610014040 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/proxy.R, R/stars.R \name{c.stars} \alias{c.stars} \alias{c.stars_proxy} \title{combine multiple stars objects, or combine multiple attributes in a single stars object into a single array} \usage{ \method{c}{stars_proxy}( ..., along = NA_integer_, along_crs = FALSE, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps) ) \method{c}{stars}( ..., along = NA_integer_, try_hard = FALSE, nms = names(list(...)), tolerance = sqrt(.Machine$double.eps) ) } \arguments{ \item{...}{object(s) of class \code{star}: in case of multiple arguments, these are combined into a single stars object, in case of a single argument, its attributes are combined into a single attribute. In case of multiple objects, all objects should have the same dimensionality.} \item{along}{integer; see \link{read_stars}} \item{along_crs}{logical; if \code{TRUE}, combine arrays along a CRS dimension} \item{try_hard}{logical; if \code{TRUE} and some arrays have different dimensions, combine those that dimensions matching to the first array} \item{nms}{character; vector with array names} \item{tolerance}{numeric; values used in \link{all.equal} to compare dimension values combine those that dimensions matching to the first array} } \value{ a single \code{stars} object with merged (binded) arrays. } \description{ combine multiple stars objects, or combine multiple attributes in a single stars object into a single array } \details{ An error is raised when attempting to combine arrays with different measurement units into a single array. If this was intentded, \code{drop_units} can be used to remove units of a \code{stars} object before merging. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) (new = c(x, x)) c(new) # collapses two arrays into one with an additional dimension c(x, x, along = 3) } stars/man/dplyr.Rd0000644000176200001440000000371214263276064013617 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidyverse.R \name{dplyr} \alias{dplyr} \alias{filter.stars} \alias{filter.stars_proxy} \alias{mutate.stars} \alias{mutate.stars_proxy} \alias{transmute.stars} \alias{transmute.stars_proxy} \alias{select.stars} \alias{select.stars_proxy} \alias{rename.stars} \alias{rename.stars_proxy} \alias{pull.stars} \alias{pull.stars_proxy} \alias{as.tbl_cube.stars} \alias{slice.stars} \alias{slice.stars_proxy} \alias{replace_na.stars} \alias{replace_na.stars_proxy} \title{dplyr verbs for stars objects} \usage{ filter.stars(.data, ...) filter.stars_proxy(.data, ...) mutate.stars(.data, ...) mutate.stars_proxy(.data, ...) transmute.stars(.data, ...) transmute.stars_proxy(.data, ...) select.stars(.data, ...) select.stars_proxy(.data, ...) rename.stars(.data, ...) rename.stars_proxy(.data, ...) pull.stars(.data, var = -1) pull.stars_proxy(.data, ...) as.tbl_cube.stars(x, ...) slice.stars(.data, along, index, ..., drop = length(index) == 1) slice.stars_proxy(.data, along, index, ...) replace_na.stars(data, replace, ...) replace_na.stars_proxy(data, ...) } \arguments{ \item{.data}{object of class \code{stars}} \item{...}{see \link[dplyr]{filter}} \item{var}{see \link[dplyr]{pull}} \item{x}{object of class \code{stars}} \item{along}{name or index of dimension to which the slice should be applied} \item{index}{integer value(s) for this index} \item{drop}{logical; drop dimensions that only have a single index?} \item{data}{data set to work on} \item{replace}{see \link[tidyr]{replace_na}: list with variable=value pairs, where value is the replacement value for NA's} } \description{ dplyr verbs for stars objects; package dplyr needs to be loaded before these methods can be used for stars objects. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x1 = read_stars(tif) if (require(dplyr, quietly = TRUE)) { x1 \%>\% slice("band", 2:3) x1 \%>\% slice("x", 50:100) } } stars/man/st_dim_to_attr.Rd0000644000176200001440000000124513777653456015514 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R \name{st_dim_to_attr} \alias{st_dim_to_attr} \title{create an array with dimension values} \usage{ st_dim_to_attr(x, which = seq_along(dim(x))) } \arguments{ \item{x}{object of class \code{stars}} \item{which}{integer; indices of the dimensions to address (default: all)} } \value{ \code{stars} object with dimension values as attributes } \description{ create an array with dimension values } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x1 = read_stars(tif) (x = st_dim_to_attr(x1)) plot(x) (x = st_dim_to_attr(x1, 2:3)) plot(x) (x= st_dim_to_attr(x1, 3)) plot(x) } stars/man/st_res.Rd0000644000176200001440000000221314353574021013751 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stars.R \name{st_res} \alias{st_res} \title{obtain (spatial) resolution of a stars object} \usage{ st_res(x, all = FALSE, absolute = !all) } \arguments{ \item{x}{an object of class \code{stars}} \item{all}{logical; if FALSE return a vector with the x/y raster resolution} \item{absolute}{logical; only works when \code{all = FALSE}; if TRUE return absolute resolution values, if FALSE return \code{delta} values} } \value{ if \code{all = FALSE} a vector with x/y raster resolutions, otherwise a list with delta values } \description{ obtain resolution(s) of a stars object: by default only the (absolute) x/y raster dimensions, optionally all \code{delta} dimension parameters } \examples{ st_res(L7_ETMs) st_res(L7_ETMs, absolute = FALSE) st_res(L7_ETMs, all = TRUE) if (require(starsdata)) { paste0("netcdf/", c("avhrr-only-v2.19810901.nc", "avhrr-only-v2.19810902.nc", "avhrr-only-v2.19810903.nc", "avhrr-only-v2.19810904.nc")) |> system.file(package = "starsdata") |> read_stars(quiet = TRUE) -> x st_res(x) |> print() st_res(x, all = TRUE) |> print() } } stars/man/write_stars.Rd0000644000176200001440000000541114353574021015023 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/write.R \name{write_stars} \alias{write_stars} \alias{write_stars.stars} \alias{write_stars.stars_proxy} \alias{detect.driver} \title{write stars object to gdal dataset (typically: to file)} \usage{ write_stars(obj, dsn, layer, ...) \method{write_stars}{stars}( obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), type = if (is.factor(obj[[1]]) && length(levels(obj[[1]])) < 256) "Byte" else "Float32", NA_value = NA_real_, update = FALSE, normalize_path = TRUE, scale_offset = c(1, 0) ) \method{write_stars}{stars_proxy}( obj, dsn, layer = 1, ..., driver = detect.driver(dsn), options = character(0), scale_offset = c(1, 0), type = "Float32", NA_value = NA_real_, chunk_size = c(dim(obj)[1], floor(2.5e+07/dim(obj)[1])), progress = TRUE ) detect.driver(filename) } \arguments{ \item{obj}{object of class \code{stars}} \item{dsn}{gdal dataset (file) name} \item{layer}{attribute name; if missing, the first attribute is written} \item{...}{passed on to \link[sf:gdal]{gdal_write}} \item{driver}{driver driver name; see \link[sf]{st_drivers}} \item{options}{character vector with dataset creation options, passed on to GDAL} \item{type}{character; output binary type, one of: \code{Byte} for eight bit unsigned integer, \code{UInt16} for sixteen bit unsigned integer, \code{Int16} for sixteen bit signed integer, \code{UInt32} for thirty two bit unsigned integer, \code{Int32} for thirty two bit signed integer, \code{Float32} for thirty two bit floating point, \code{Float64} for sixty four bit floating point.} \item{NA_value}{non-NA value that should represent R's \code{NA} value in the target raster file; if set to \code{NA}, it will be ignored.} \item{update}{logical; if \code{TRUE}, an existing file is being updated} \item{normalize_path}{logical; see \link{read_stars}} \item{scale_offset}{length 2 numeric vector with scale, offset values: raw values computed by raw = (value - offset) / scale are written to dsn; scale and offset values are written to dsn or else a warning is raised} \item{chunk_size}{length two integer vector with the number of pixels (x, y) used in the read/write loop; see details.} \item{progress}{logical; if \code{TRUE}, a progress bar is shown} \item{filename}{character; used for guessing driver short name based on file extension; see examples} } \description{ write stars object to gdal dataset (typically: to file) } \details{ \code{write_stars} first creates the target file, then updates it sequentially by writing blocks of \code{chunk_size}. in case \code{obj} is a multi-file \code{stars_proxy} object, all files are written as layers into the output file \code{dsn} } \examples{ detect.driver("L7_ETMs.tif") } stars/man/st_as_sf.Rd0000644000176200001440000000504514011050736014252 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sf.R \name{st_as_sf} \alias{st_as_sf} \alias{st_as_sfc.stars} \alias{st_as_sf.stars} \alias{st_as_sf.stars_proxy} \title{Convert stars object into an sf object} \usage{ \method{st_as_sfc}{stars}(x, ..., as_points, which = seq_len(prod(dim(x)[1:2]))) \method{st_as_sf}{stars}( x, ..., as_points = FALSE, merge = FALSE, na.rm = TRUE, use_integer = is.logical(x[[1]]) || is.integer(x[[1]]), long = FALSE, connect8 = FALSE ) \method{st_as_sf}{stars_proxy}(x, ..., downsample = 0) } \arguments{ \item{x}{object of class \code{stars}} \item{...}{ignored} \item{as_points}{logical; should cells be converted to points or to polygons? See details.} \item{which}{linear index of cells to keep (this argument is not recommended to be used)} \item{merge}{logical; if \code{TRUE}, cells with identical values are merged (using \code{GDAL_Polygonize} or \code{GDAL_FPolygonize}); if \code{FALSE}, a polygon for each raster cell is returned; see details} \item{na.rm}{logical; should missing valued cells be removed, or also be converted to features?} \item{use_integer}{(relevant only if \code{merge} is \code{TRUE}): if \code{TRUE}, before polygonizing values are rounded to 32-bits signed integer values (GDALPolygonize), otherwise they are converted to 32-bit floating point values (GDALFPolygonize).} \item{long}{logical; if \code{TRUE}, return a long table form \code{sf}, with geometries and other dimensions recycled} \item{connect8}{logical; if \code{TRUE}, use 8 connectedness. Otherwise the 4 connectedness algorithm will be applied.} \item{downsample}{see \link{st_as_stars}} } \description{ Convert stars object into an sf object } \details{ If \code{merge} is \code{TRUE}, only the first attribute is converted into an \code{sf} object. If \code{na.rm} is \code{FALSE}, areas with \code{NA} values are also written out as polygons. Note that the resulting polygons are typically invalid, and use \link[sf:valid]{st_make_valid} to create valid polygons out of them. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) x = x[,1:100,1:100,6] # subset of a band with lower values in it x[[1]][x[[1]] < 30] = NA # set lower values to NA x[[1]] = x[[1]] < 100 # make the rest binary x (p = st_as_sf(x)) # removes NA areas (p = st_as_sf(x[,,,1], merge = TRUE)) # glues polygons together all(st_is_valid(p)) # not all valid, see details plot(p, axes = TRUE) (p = st_as_sf(x, na.rm = FALSE, merge = TRUE)) # includes polygons with NA values plot(p, axes = TRUE) } stars/man/read_stars.Rd0000644000176200001440000001316514376173527014624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read.R \name{read_stars} \alias{read_stars} \title{read raster/array dataset from file or connection} \usage{ read_stars( .x, sub = TRUE, ..., options = character(0), driver = character(0), quiet = FALSE, NA_value = NA_real_, along = NA_integer_, RasterIO = list(), proxy = getOption("stars.n_proxy") \%||\% 1e+08, curvilinear = character(0), normalize_path = TRUE, RAT = character(0), tolerance = 1e-10, exclude = "", shorten = TRUE ) } \arguments{ \item{.x}{character vector with name(s) of file(s) or data source(s) to be read, or a function that returns such a vector} \item{sub}{character, integer or logical; name, index or indicator of sub-dataset(s) to be read} \item{...}{passed on to \link{st_as_stars} if \code{curvilinear} was set} \item{options}{character; opening options} \item{driver}{character; driver to use for opening file. To override fixing for subdatasets and autodetect them as well, use \code{NULL}.} \item{quiet}{logical; print progress output?} \item{NA_value}{numeric value to be used for conversion into NA values; by default this is read from the input file} \item{along}{length-one character or integer, or list; determines how several arrays are combined, see Details.} \item{RasterIO}{list with named parameters for GDAL's RasterIO, to further control the extent, resolution and bands to be read from the data source; see details.} \item{proxy}{logical; if \code{TRUE}, an object of class \code{stars_proxy} is read which contains array metadata only; if \code{FALSE} the full array data is read in memory. Always \code{FALSE} for curvilinear girds. If set to a number, defaults to \code{TRUE} when the number of cells to be read is larger than that number.} \item{curvilinear}{length two character vector with names of subdatasets holding longitude and latitude values for all raster cells, or named length 2 list holding longitude and latitude matrices; the names of this list should correspond to raster dimensions referred to} \item{normalize_path}{logical; if \code{FALSE}, suppress a call to \link{normalizePath} on \code{.x}} \item{RAT}{character; raster attribute table column name to use as factor levels} \item{tolerance}{numeric; passed on to \link{all.equal} for comparing dimension parameters.} \item{exclude}{character; vector with category value(s) to exclude} \item{shorten}{logical or character; if \code{TRUE} and \code{length(.x) > 1}, remove common start and end parts of array names; if character a new prefix} } \value{ object of class \code{stars} } \description{ read raster/array dataset from file or connection } \details{ In case \code{.x} contains multiple files, they will all be read and combined with \link{c.stars}. Along which dimension, or how should objects be merged? If \code{along} is set to \code{NA} it will merge arrays as new attributes if all objects have identical dimensions, or else try to merge along time if a dimension called \code{time} indicates different time stamps. A single name (or positive value) for \code{along} will merge along that dimension, or create a new one if it does not already exist. If the arrays should be arranged along one of more dimensions with values (e.g. time stamps), a named list can passed to \code{along} to specify them; see example. \code{RasterIO} is a list with zero or more of the following named arguments: \code{nXOff}, \code{nYOff} (both 1-based: the first row/col has offset value 1), \code{nXSize}, \code{nYSize}, \code{nBufXSize}, \code{nBufYSize}, \code{bands}, \code{resample}. See \url{https://gdal.org/doxygen/classGDALDataset.html} for their meaning; \code{bands} is an integer vector containing the band numbers to be read (1-based: first band is 1). Note that if \code{nBufXSize} or \code{nBufYSize} are specified for downsampling an image, resulting in an adjusted geotransform. \code{resample} reflects the resampling method and has to be one of: "nearest_neighbour" (the default), "bilinear", "cubic", "cubic_spline", "lanczos", "average", "mode", or "Gauss". Data that are read into memory (\code{proxy=FALSE}) are read into a numeric (double) array, except for categorical variables which are read into an numeric (integer) array of class \code{factor}. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") (x1 = read_stars(tif)) (x2 = read_stars(c(tif, tif))) (x3 = read_stars(c(tif, tif), along = "band")) (x4 = read_stars(c(tif, tif), along = "new_dimensions")) # create 4-dimensional array x1o = read_stars(tif, options = "OVERVIEW_LEVEL=1") t1 = as.Date("2018-07-31") # along is a named list indicating two dimensions: read_stars(c(tif, tif, tif, tif), along = list(foo = c("bar1", "bar2"), time = c(t1, t1+2))) m = matrix(1:120, nrow = 12, ncol = 10) dim(m) = c(x = 10, y = 12) # named dim st = st_as_stars(m) attr(st, "dimensions")$y$delta = -1 attr(st, "dimensions")$y$offset = 12 st tmp = tempfile(fileext = ".tif") write_stars(st, tmp) (red <- read_stars(tmp)) read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2))[[1]] (red <- read_stars(tmp, RasterIO = list(nXOff = 1, nYOff = 1, nXSize = 10, nYSize = 12, nBufXSize = 2, nBufYSize = 2))) red[[1]] # cell values of subsample grid: \dontrun{ plot(st, reset = FALSE, axes = TRUE, ylim = c(-.1,12.1), xlim = c(-.1,10.1), main = "nBufXSize & nBufYSize demo", text_values = TRUE) plot(st_as_sfc(red, as_points = TRUE), add = TRUE, col = 'red', pch = 16) plot(st_as_sfc(st_as_stars(st), as_points = FALSE), add = TRUE, border = 'grey') plot(st_as_sfc(red, as_points = FALSE), add = TRUE, border = 'green', lwd = 2) } file.remove(tmp) } stars/man/geom_stars.Rd0000644000176200001440000000432614353574021014624 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tidyverse.R \name{geom_stars} \alias{geom_stars} \alias{theme_stars} \title{ggplot geom for stars objects} \usage{ geom_stars( mapping = NULL, data = NULL, ..., downsample = 0, sf = FALSE, na.action = na.pass ) theme_stars(...) } \arguments{ \item{mapping}{see \link[ggplot2:geom_tile]{geom_raster}} \item{data}{see \link[ggplot2:geom_tile]{geom_raster}} \item{...}{see \link[ggplot2:geom_tile]{geom_raster}} \item{downsample}{downsampling rate: e.g. 3 keeps rows and cols 1, 4, 7, 10 etc.; a value of 0 does not downsample; can be specified for each dimension, e.g. \code{c(5,5,0)} to downsample the first two dimensions but not the third.} \item{sf}{logical; if \code{TRUE} rasters will be converted to polygons and plotted using \link[ggplot2:ggsf]{geom_sf}.} \item{na.action}{function; if \code{NA} values need to be removed before plotting use the value \code{na.omit} here (only applies to objects with raster dimensions)} } \description{ ggplot geom for stars objects } \details{ \code{geom_stars} returns (a call to) either \link[ggplot2:geom_tile]{geom_raster}, \link[ggplot2]{geom_tile}, or \link[ggplot2:ggsf]{geom_sf}, depending on the raster or vector geometry; for the first to, an \link[ggplot2]{aes} call is constructed with the raster dimension names and the first array as fill variable. Further calls to \link[ggplot2:coord_fixed]{coord_equal} and \link[ggplot2]{facet_wrap} are needed to control aspect ratio and the layers to be plotted; see examples. If a \code{stars} array contains hex color values, and no \code{fill} parameter is given, the color values are used as fill color; see the example below. If visual artefacts occur (Moiré-Effekt), then see the details section of \link{plot.stars} } \examples{ system.file("tif/L7_ETMs.tif", package = "stars") \%>\% read_stars() -> x if (require(ggplot2, quietly = TRUE)) { ggplot() + geom_stars(data = x) + coord_equal() + facet_wrap(~band) + theme_void() + scale_x_discrete(expand=c(0,0))+ scale_y_discrete(expand=c(0,0)) # plot rgb composite: st_as_stars(L7_ETMs)[,,,1:3] |> st_rgb() -> x # x contains colors as pixel values ggplot() + geom_stars(data = x) } } stars/man/st_rasterize.Rd0000644000176200001440000000437614576033423015207 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rasterize.R \name{st_rasterize} \alias{st_rasterize} \title{rasterize simple feature geometries} \usage{ st_rasterize( sf, template = guess_raster(sf, ...) \%||\% st_as_stars(st_bbox(sf), values = NA_real_, ...), file = tempfile(), driver = "GTiff", options = character(0), align = FALSE, proxy = FALSE, ... ) } \arguments{ \item{sf}{object of class \code{sf}} \item{template}{optional; stars object with desired target geometry, or target geometry alignment if \code{align=TRUE}; see details} \item{file}{temporary file name} \item{driver}{driver for temporary file} \item{options}{character; options vector for \code{GDALRasterize}} \item{align}{logical; if \code{TRUE}, \code{template} is only used for the geometry _alignment_, informing target resolution and offset} \item{proxy}{logical; should a proxy object be returned?} \item{...}{arguments passed on to \link{st_as_stars}} } \description{ rasterize simple feature geometries } \details{ if `template` is a `stars` object, non-NA cells that are not covered by `sf` receive the value in `template`; see also argument `align`. } \examples{ demo(nc, echo = FALSE, ask = FALSE) (x = st_rasterize(nc)) # default grid: plot(x, axes = TRUE) # a bit more customized grid: (x = st_rasterize(nc, st_as_stars(st_bbox(nc), nx = 100, ny = 50, values = NA_real_))) plot(x, axes = TRUE) (ls = st_sf(a = 1:2, st_sfc(st_linestring(rbind(c(0.1, 0), c(1.1, 1))), st_linestring(rbind(c(0, 0.05), c(1, 0.05)))))) (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = NA_real_)) # Only the left-top corner is part of the grid cell: sf_extSoftVersion()["GDAL"] plot(st_rasterize(ls, grd), axes = TRUE, reset = FALSE) # ALL_TOUCHED=FALSE; plot(ls, add = TRUE, col = "red") plot(st_rasterize(ls, grd, options = "ALL_TOUCHED=TRUE"), axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = "red") # add lines to existing 0 values, summing values in case of multiple lines: (grd = st_as_stars(st_bbox(ls), nx = 10, ny = 10, xlim = c(0, 1.0), ylim = c(0, 1), values = 0)) r = st_rasterize(ls, grd, options = c("MERGE_ALG=ADD", "ALL_TOUCHED=TRUE")) plot(r, axes = TRUE, reset = FALSE) plot(ls, add = TRUE, col = "red") } stars/man/redimension.Rd0000644000176200001440000000172414576035610014777 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/proxy.R, R/stars.R \name{redimension} \alias{redimension} \alias{st_redimension.stars_proxy} \alias{st_redimension} \alias{st_redimension.stars} \title{redimension array, or collapse attributes into a new dimension} \usage{ \method{st_redimension}{stars_proxy}( x, new_dims = st_dimensions(x), along = list(new_dim = names(x)), ... ) st_redimension(x, new_dims, along, ...) \method{st_redimension}{stars}( x, new_dims = st_dimensions(x), along = setNames(list(names(x)), name), ..., name = "new_dim" ) } \arguments{ \item{x}{object of class \code{stars}} \item{new_dims}{target dimensions: either a `dimensions` object or an integer vector with the dimensions' sizes} \item{along}{named list with new dimension name and values} \item{...}{ignored} \item{name}{character name of the new dimension} } \description{ redimension array, or collapse attributes into a new dimension } stars/man/stars_sentinel2.Rd0000644000176200001440000000077214576033423015604 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/datasets.R \docType{data} \name{stars_sentinel2} \alias{stars_sentinel2} \title{Sentinel-2 sample tile} \format{ An object of class \code{stars_proxy} (inherits from \code{stars}) of dimension 10980 x 10980 x 4. } \usage{ stars_sentinel2 } \description{ Sentinel-2 sample tile, downloaded from reads the four 10-m bands: B2 (490 nm), B3 (560 nm), B4 (665 nm) and B8 (842 nm) } \keyword{datasets} stars/man/st_sfc2xy.Rd0000644000176200001440000000114213777653456014421 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rasterize.R \name{st_sfc2xy} \alias{st_sfc2xy} \title{replace POINT simple feature geometry list with an x y raster} \usage{ st_sfc2xy(x, ...) } \arguments{ \item{x}{object of class \code{stars}, or of class \code{sf}} \item{...}{passed on to \link{as.data.frame.stars}} } \value{ object of class \code{stars} with a POINT list replaced by x and y raster dimensions. This only works when the points are distributed over a regular or rectilinear grid. } \description{ replace POINT simple feature geometry list with an x y raster } stars/man/aggregate.stars.Rd0000644000176200001440000001016514644747141015550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aggregate.R \name{aggregate.stars} \alias{aggregate.stars} \alias{aggregate} \title{spatially or temporally aggregate stars object} \usage{ \method{aggregate}{stars}( x, by, FUN, ..., drop = FALSE, join = st_intersects, as_points = any(st_dimension(by) == 2, na.rm = TRUE), rightmost.closed = FALSE, left.open = FALSE, exact = FALSE ) } \arguments{ \item{x}{object of class \code{stars} with information to be aggregated} \item{by}{object of class \code{sf} or \code{sfc} for spatial aggregation, for temporal aggregation a vector with time values (\code{Date}, \code{POSIXct}, or \code{PCICt}) that is interpreted as a sequence of left-closed, right-open time intervals or a string like "months", "5 days" or the like (see \link{cut.POSIXt}), or a function that cuts time into intervals; if by is an object of class \code{stars}, it is converted to sfc by \code{st_as_sfc(by, as_points = FALSE)} thus ignoring its time component. Note: each pixel is assigned to only a single group (in the order the groups occur) so non-overlapping spatial features and temporal windows are recommended.} \item{FUN}{aggregation function, such as \code{mean}} \item{...}{arguments passed on to \code{FUN}, such as \code{na.rm=TRUE}} \item{drop}{logical; ignored} \item{join}{function; function used to find matches of \code{x} to \code{by}} \item{as_points}{see \link[stars]{st_as_sf}: shall raster pixels be taken as points, or small square polygons?} \item{rightmost.closed}{see \link{findInterval}} \item{left.open}{logical; used for time intervals, see \link{findInterval} and \link{cut.POSIXt}} \item{exact}{logical; if \code{TRUE}, use \link[exactextractr]{coverage_fraction} to compute exact overlap fractions of polygons with raster cells} } \description{ spatially or temporally aggregate stars object, returning a data cube with lower spatial or temporal resolution } \examples{ # aggregate time dimension in format Date tif = system.file("tif/L7_ETMs.tif", package = "stars") t1 = as.Date("2018-07-31") x = read_stars(c(tif, tif, tif, tif), along = list(time = c(t1, t1+1, t1+2, t1+3)))[,1:30,1:30] st_get_dimension_values(x, "time") x_agg_time = aggregate(x, by = t1 + c(0, 2, 4), FUN = max) # aggregate time dimension in format Date - interval by_t = "2 days" x_agg_time2 = aggregate(x, by = by_t, FUN = max) st_get_dimension_values(x_agg_time2, "time") #TBD: #x_agg_time - x_agg_time2 # aggregate time dimension in format POSIXct x = st_set_dimensions(x, 4, values = as.POSIXct(c("2018-07-31", "2018-08-01", "2018-08-02", "2018-08-03")), names = "time") by_t = as.POSIXct(c("2018-07-31", "2018-08-02")) x_agg_posix = aggregate(x, by = by_t, FUN = max) st_get_dimension_values(x_agg_posix, "time") #TBD: # x_agg_time - x_agg_posix aggregate(x, "2 days", mean) if (require(ncmeta, quietly = TRUE)) { # Spatial aggregation, see https://github.com/r-spatial/stars/issues/299 prec_file = system.file("nc/test_stageiv_xyt.nc", package = "stars") prec = read_ncdf(prec_file, curvilinear = c("lon", "lat")) prec_slice = dplyr::slice(prec, index = 17, along = "time") nc = sf::read_sf(system.file("gpkg/nc.gpkg", package = "sf"), "nc.gpkg") nc = st_transform(nc, st_crs(prec_slice)) agg = aggregate(prec_slice, st_geometry(nc), mean) plot(agg) } # example of using a function for "by": aggregate by month-of-year d = c(10, 10, 150) a = array(rnorm(prod(d)), d) # pure noise times = Sys.Date() + seq(1, 2000, length.out = d[3]) m = as.numeric(format(times, "\%m")) signal = rep(sin(m / 12 * pi), each = prod(d[1:2])) # yearly period s = (st_as_stars(a) + signal) \%>\% st_set_dimensions(3, values = times) f = function(x, format = "\%B") { months = format(as.Date(paste0("01-", 1:12, "-1970")), format) factor(format(x, format), levels = months) } agg = aggregate(s, f, mean) plot(agg) } \seealso{ \link[sf]{aggregate}, \link[sf]{st_interpolate_aw}, \link{st_extract}, https://github.com/r-spatial/stars/issues/317 } stars/man/st_crop.Rd0000644000176200001440000000710214644747141014135 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/proxy.R, R/subset.R \name{st_crop} \alias{st_crop} \alias{st_crop.stars_proxy} \alias{st_crop.stars} \title{crop a stars object} \usage{ \method{st_crop}{stars_proxy}( x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), collect = TRUE ) \method{st_crop}{stars}( x, y, ..., crop = TRUE, epsilon = sqrt(.Machine$double.eps), as_points = all(st_dimension(y) == 2, na.rm = TRUE), normalize = FALSE ) } \arguments{ \item{x}{object of class \code{stars}} \item{y}{object of class \code{sf}, \code{sfc} or \code{bbox}; see Details below.} \item{...}{ignored} \item{crop}{logical; if \code{TRUE}, the spatial extent of the returned object is cropped to still cover \code{obj}, if \code{FALSE}, the extent remains the same but cells outside \code{y} are given \code{NA} values.} \item{epsilon}{numeric; factor to shrink the bounding box of \code{y} towards its center before cropping.} \item{collect}{logical; if \code{TRUE}, repeat cropping on \code{stars} object, i.e. after data has been read} \item{as_points}{logical; only relevant if \code{y} is of class \code{sf} or \code{sfc}: if \code{FALSE}, treat \code{x} as a set of points, else as a set of small polygons. Default: \code{TRUE} if \code{y} is two-dimensional, else \code{FALSE}; see Details} \item{normalize}{logical; if \code{TRUE} then pass the cropped object to \code{\link[sf]{st_normalize}} before returning.} } \description{ crop a stars object } \details{ for raster \code{x}, \code{st_crop} selects cells that intersect with \code{y}. For intersection, are raster cells interpreted as points or as small polygons? If \code{y} is of class \code{stars}, \code{x} raster cells are interpreted as points; if \code{y} is of class \code{bbox}, \code{x} cells are interpreted as cells (small polygons). Otherwise, if \code{as_points} is not given, cells are interpreted as points if \code{y} has a two-dimensional geometry. } \examples{ l7 = read_stars(system.file("tif/L7_ETMs.tif", package = "stars")) d = st_dimensions(l7) # area around cells 3:10 (x) and 4:11 (y): offset = c(d[["x"]]$offset, d[["y"]]$offset) res = c(d[["x"]]$delta, d[["y"]]$delta) bb = st_bbox(c(xmin = offset[1] + 2 * res[1], ymin = offset[2] + 11 * res[2], xmax = offset[1] + 10 * res[1], ymax = offset[2] + 3 * res[2]), crs = st_crs(l7)) l7[bb] # equivalent: st_crop(l7, bb) plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # slightly smaller bbox: bb = st_bbox(c(xmin = offset[1] + 2.1 * res[1], ymin = offset[2] + 10.9 * res[2], xmax = offset[1] + 9.9 * res[1], ymax = offset[2] + 3.1 * res[2]), crs = st_crs(l7)) l7[bb] plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # slightly larger bbox: bb = st_bbox(c(xmin = offset[1] + 1.9 * res[1], ymin = offset[2] + 11.1 * res[2], xmax = offset[1] + 10.1 * res[1], ymax = offset[2] + 2.9 * res[2]), crs = st_crs(l7)) l7[bb] plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) # half a cell size larger bbox: bb = st_bbox(c(xmin = offset[1] + 1.49 * res[1], ymin = offset[2] + 11.51 * res[2], xmax = offset[1] + 10.51 * res[1], ymax = offset[2] + 2.49 * res[2]), crs = st_crs(l7)) l7[bb] plot(l7[,1:13,1:13,1], reset = FALSE) image(l7[bb,,,1], add = TRUE, col = sf.colors()) plot(st_as_sfc(bb), add = TRUE, border = 'green', lwd = 2) } stars/man/st_rgb.Rd0000644000176200001440000000351614467372755013761 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot.R \name{st_rgb} \alias{st_rgb} \title{reduce dimension to rgb (alpha) hex values} \usage{ st_rgb( x, dimension = 3, use_alpha = dim(x)[dimension] == 4, maxColorValue = 255L, probs = c(0, 1), stretch = NULL ) } \arguments{ \item{x}{object of class \code{stars}} \item{dimension}{dimension name or number to reduce} \item{use_alpha}{logical; if TRUE, the fourth band will be used as alpha values} \item{maxColorValue}{integer; maximum value for colors} \item{probs}{probability values for quantiles used for stretching by "percent".} \item{stretch}{logical or character; if \code{TRUE} or \code{"percent"}, each band is stretched to 0 ... maxColorValue by "percent clip" method using probs values. If \code{"histogram"}, a "histogram equalization" is performed (\code{probs} values are ignored). If stretch is \code{NULL} or \code{FALSE}, no stretching is performed. Other character values are interpreted as "percent" and a message will be printed.} } \description{ reduce dimension to rgb (alpha) hex values } \details{ the dimension's bands are mapped to red, green, blue, alpha; if a different ordering is wanted, use \link{[.stars} to reorder a dimension, see examples. Alternatively, you can use \link{plot.stars} with the \code{rgb} argument to create a three-band composition. } \examples{ tif = system.file("tif/L7_ETMs.tif", package = "stars") x = read_stars(tif) st_rgb(x[,,,3:1]) r = st_rgb(x[,,,c(6,5,4,3)], 3, use_alpha=TRUE) # now R=6,G=5,B=4,alpha=3 if (require(ggplot2)) { ggplot() + geom_stars(data = r) + scale_fill_identity() } r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = "percent") plot(r) r = st_rgb(x[,,,3:1], probs = c(0.01, 0.99), stretch = "histogram") plot(r) } \seealso{ \link{st_apply}, \link[grDevices]{rgb} } stars/man/figures/0000755000176200001440000000000014576033423013634 5ustar liggesusersstars/man/figures/README-plot2-1.png0000644000176200001440000001265114576033423016500 0ustar liggesusersPNG  IHDRMR/PLTE:f:::f:f:::::::::ff:f:f:ff:fff:::f:ffff:ې۶۶ې:ېf۶f۶۶۶fې۶/N pHYsodIDATx흋z۸Fa$N4ΜiΜi;8|DJ/_Zߌ% .@s @PAAiAPAAiAPAAiAPAAiAPAAi׮Zl7֧_X9DϿ?+/Ϗl7} ˫?fdzf1c4}DWSMN}0ϟ~7|ۋ!C|kus43.ĵ;ӏG1O/X9( ż;w q8ChFgak z7h>)G=h:IJrcևxq_|1|LXW9:.}z{Ys<]T|LXA.v4lVqz.q_]MXW8Q9/3,豧vzfg%skW6Ys430~NJO߳Swz~?l0LWQ]NY|w)9 g񯿞}>3.+nsa҃a(p 4 (H 4 (H 4 (H 4 (H 4 (H R OJ6 O:ڜ: Ai_#BEcsOM+U"AV"h,'im֞4u_[çԭ;FCZʜjVA#q4z3A=l37VuW {|qkOdrϳLӞcaT(amtq>Ծ5Gt4M8q JAS{ĶZ{lߠEW#A٩ub[^=E )؈QmRs'iY:nꂉi"Z4ΝaINj)"I=c#C+4)."}hJ9AKS{[A;eK%bEN S4Ae?IJTnԄ &"hz ڗʝR!%aQT9wfF*=ŃɛQOӓ h oF4yS& -s] h"ӧM(=U A#=/˓9݋C~2"zc.j9~Yh4@rpg%ܩ EīJJF5m{m3wת2~|Yh0᪒z%!b:=hZMX,t7[lj)/}=+ 6eA+c]UCue}6b{lsxi+| ۴)Rץ!ڧi+SdS%ŮoZnC0Q_6gu2a ʝ-MԿi%N4!GP:d[.7"Y!;8goeFӃ7UT@Sk h:=ߺ/GP*Mg]ߞ =7UrbcvֿMU4wpH|g<r:*NkisRAк4/t./hHOA4ԙ:]Gnhx֥EWz-A6AЦ @G/"rVĕ_eMAo k=J*2R*# #N^)NMW[ژfҪVȦ L895ShϺ0ZU%U+SdS9iR뎵򮫳e!qOw;&"hM<%oRЄ0w܏A} ^_߇}auuZ"s4ʮCКD|NH,j@Цbj;5#ԾhHCFϗ݁F6U!{hFz64¡~3 +z24W,'l< hGgNMc߿ŷ̝f n+T-_VFP/PN: *JNC|57VCQx|Ж"hxS)"ӓ+ _&m*ܩ$wEz4^ϞУS҃COn45;(S"sZSS% 6S.DJ=@=6=|{lC=`d;;y=E6U$}}~ ڒyzq?{D)sp*$p̄iWv6GSTDh;yd9J :<;=S窒SdJxs ]EPqA8s uoCКخMڷGR~3TK6#-)a$黄tEB&=HsjSdIj^9 nCԸ"j;TeA!vUyթuթt; Չx?dp]j0Q+(T`^O}Vr8kfӕHyAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAiAPAAkW8 ?X]voڂ~x??Uh)/?1|k_7]׍Ӿ +W>CM_|"ݱIx^|q8O/˼9w|y6.jͼ}I ){u?=}=Wf(oX"z;P~1==o[z(ӡI 48:o]۾i)c?k|;Pv?ISrÐV4ZN}{0> 6A| (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4ZZ:4iE YZ=CVÌ~B-hZ#T欄FP P  hAcu<lm4P^% h$㥱 tA1uO9 η!c/zSA(`|Äa4zTKc8)r3bl˘*߉a4s2aA)PlW@Pn`Czq9~̋I킠a^L.'4U@wo-6IBҁ%' q hc^"h @狌>eko [#Z sHss:B/] h)`>KC 0tA!<9-A If} Am 3{ C3!h3,h3gFAvc=1c"h2cuK](>P‚/CA*04 P_BA*2R9uķbA{4"YM} hB=.uA1^t1ZMtPPx P1f OAЃW8Gt4I=ѵh#uW#~iO AAP_E3I=Z@P/[r!1AC8's5=怠A; .& A#@>IP勮$A~M bcÝ,a-W3#|; 4A4?1\ZNFG4A='(@HRjA $0ZZ 9!hZ 6%$TǛ??7E4oRZ:>@?#hn** >s PZo\$ʀȒz-$E*zv.Tz_}(YZlihU``/'sVm (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 y| w!IENDB`stars/man/figures/README-plot4-1.png0000644000176200001440000003724314576033423016506 0ustar liggesusersPNG  IHDRMR/PLTE:f:::f:f::::f:::::f:f:ff:fff:f:fff:ffffi::::ff:ېff::۶"ݾې:ېf۶fVtf?ې۶ = pHYsod IDATx c۶$f:Lr;cQ+  _2 VؒlQ٢"Ū(*:b"*-R~U}zOnϼ,eFkk2lДN 4C;gyԠO~?*2s]>iƪ^mcJ [=8rplC;'Pɸ8O6evc_ofh5XAQSh9ҔhZ^O鮾m 3tsF/' P;B _BqFSh- 6U*Umt\k&)6sU/'<*iHUyV*n݋gǸ㢴UXyJ7݆rG>G v}g7 T_f.y ZfzewJlnC=gMF^9Tvg5~S35s'˽.q& IN55|ϘT ijɉ!IxNq<[s4( 1BDM]:A[pzC"!dROy&x ˠ- j#LmR+ΦA}B:4Aw8٠=q.:ųAV xc]EYsvh|q5a{K`rFHCV- G̈S, 5T+SȜ|f'Y)~ib8!:8'ܫ7`unKvE(~;+Hfkb,r+*4O91(I*Ω.qOM<Ԡ GB-0lPlsԠ^TB!_1r6 E2ΦAg 4iP/@?3*<_'Ȕ'){kka3W2'rr?(uN3aIU,jO2N:h{"'86(cFRK"V,y\!jCpΛK.)wp!;Z, Bv']ꐋPs't5a\Šhj{A% Q<ҠV7lQ oB*B`|G`fÉ-'xB !8r+*8lgF99&AtƗ?z6ݯ5k`PVywgR( (%oi]H M)jR}<ɴ]9ZۥKHTr<s#gJ<3It?elPVR{ N6(rj _4sG |1i£?N MWI.|z<6֞Bϩr!ȹrppݹ38T7gAd)=DB$N&ܫܛsrL 5cSI/|.HO΁lbg8`K^3gl^C?0oݤZAsܠn93MjzWd"93 ?)9^\~N2qa:΋g.s4pU2NRjV1hjV1hjV1hjV1hjV1hjV1hjV1hjV1hj5Ӭzo/w}UWwpS~~`/3ZCZCSr)#X4WgFNT/Σ}~Wۏ_?~xQ9 I3Ve^oq m#BkVNɦg6hєIy_Uw/xuz{5s>VPh_ZvMJ*As4Wdg&NT?Γ}y:su3| !Zx4e ֢))< \yxfMh`SK'_x"'sgNAџh6 U< CA _B3lĠ9ć\N;'EO܁Cs$J00 PL餗~!(Ƙwi/ɹc0A\#S:㩏{{됈g[R}.xDwf/kaÍLJ|/M\9{T9%3ACxep@X(>dtn6ޠ3(s|W'⪃s7!8SNp3(ÿmPA99!7 ʩǽO< ɹgΖ%9!xm< lPD;Ё84jpWSF<٠ dlaНY>q@(|&TC&qb$'֢w蜍xI<zTt/96 Tׇi uEi+Qgt S$c0AV)N&FI/'tgFNh')3&PqtFۊ9F <yɒG0$-Us+{ijA9jg!o0k0ؼW#ldNLJ(sJt)ܼ}8[tG> 5A E.R`✲C NiA/32h:g^*4M}71yl;)I|mF~\ '9A _Q۪"f8-ZM]θbRI5sf4hS}נ\gy/N$4 w[5 3M7f:H]ЁvIf:q:6KtFq46tV}9{6-j%5 *jMutX TjйMt;NzLH9B-<84 N M|]P J%Y&9ta&rt;sJyCAUr0JMؠx]%tUɟc3Ɠ?76AMxFVe[5Ź(C2dO${~Ϩo-T886IɷsI_Wa~rOv^P<0/T ~֎.&^:A/ ^3pqTHATHATHATHATHATHATHATHATAf{k_~'GN9{ u`[ជɣMN$4.fdZg# NS#' OFAyEiPGyF+00ps?lKXg qilN2BQ@OϠH?A' +\mRNҙ$&O7G8:9e<я@n^EBb<j a@<ϳnʼn S!8޵pȈ9q`)HI(8\G,9K)(O(>0M䔬~STOr̙bP+P _GJ ^a"Ikk܏9t'N e\* KN9 11; 1'NA\77N>pxR5K/.cۚA:\k8Y#@YWE5U54頖xƹFbPoBGWÆ9\8fF6t/Hl`AwhPAy}*'ЋƬcεNw7J7fs84$A2&4SiMFpY$TIɜP؟P5xɟkO>!r+ζ!/.e<@^lր\J.7,OsMSkF'u0pRmArl#{r('x0mzrbS:sRV ڙAd ,20xe4Oi9 9jyzܚoaSƹӎd;g48uѯ@ډ,\kTKidO NIjPB.oNn2g\jkP&vkkP'vw*G ߚZńP/530';Z4bɗdrJZbI; ]0xxvur*8aټg@-glеu;C=YK#sG>~ ˻i撮i!i*H%u>Aճ=5(M!Wɹ9lɠt{}JI3g-9÷bUԆo>𖿵ܠ88ߵ5d]ZO3sggAF|3Qn] .&Y8aPEWNpU2 MjV1hjV1hjV1hjV1hjV1hjV1hjV1hjV1hjQn?ͪ־ROxxڧYuu 7g^ vU]IDAT: 4eVޟM9A1'-S z-QRn6sEX+䕱߆^yٝ=9i-^Nr Q>@T T=PZ&=?rrZ9qŜ4UrHATA/Q3۠cz((+g  3&9ICtp~G\ iֈ *8'2.7q18vgO"3(8Tt<ٙJ| NLE*dr.8 <5(Ҡ~1,LfqZq6 9j71̵pיIiPCТ9&3ڂE»@ '4lPoB4W M!nL7C\r4锁Nr:!#<܉9QorC攤i\s nL5(Ty9?Ѣ8lDrqS jOʓ8>$rhgݮP4 '%0d҃^'㭋3:lP*?wnPÅ(!Ţ gF?Y8T|S't H V)s'l⮆֜)eL ٘.l)GQ 1gQ^;ebZj'@T8C #_CzbxtνxBY3P, qn%9=L j 5P1wLb\B}o.Nlr. ',#5Q6K^ U)ihalF gP[иܪ8c8;ƹO)qlmАƠ!ӕ6 pk)yTا@[ˢQ)5& r]3's9- z0O ´pc (]V6Aɜ#+pUr:rNKǽAʆJO=&2/KC5,JȠprBT+'r6hqoiP+'T17WDbzQABr6 Q4^ΦAV 7f ٧Ϟ^;IgdNL2HD`-9鸯 /96dVRK_]Ϩ -M:DmN}8eMs:4rq_b - o,jw2X2vl^P3utQzpqҥ# FS }7ΖZ= IQ*ĭ i%j%+%pƍLH=8}>NV(p; u{+n<r ' x՜knRz9%cS?ad|Ѱ#N99liG_tcFA-PQnPZA-6jO\o?^Gv2s]1f{2~c!kVN馌)ncT8)'Uu2WW3Ke+(J4/~ -W#,"3d-z9<2qҦ.s_sʔtΓ}s?Ε75TZ_3e ֢)iIn/ 8)*WR`7\fW.A _?^՟3Eo٠OIg>Np޺M?'Ny /3W?7A].g|]}y9hh@3r¦.r3yܠaB^5wtb$eMensFS9w3}Jc&uJ[<2n=F@qe)ݔ6qsS9Jo@6;b\F[נЫ /S4#lJ9sҔ~G T巟v?Um6gtWFNڔzgq`trHATHԜŁZfx mPˣ72*d >gdzsʜ9)2'>.IxxjP+aqhkQ$"ړ ?9WcˁFpbdNph3(qCg"m[lI^|'5T-'tˠf ^xm`q7y 7N}rAa^ő7GRbl⁌3QUQ5'q¤x$C;,JCr&` OǬP !''ftLx* <*w*g+xnj$B m!S+PAi#ځsb8GFxuqNbȠ8!ޕ gA osx:gJ`US&N4(s.١]8DHvcf*P>O_LěY8}@| _'t49kZ'U tL0(}0(~!eIz@]}9ػ Y5pR#T{ fQQ9hGA {,2M\RY` ΑA ڝj"?krdK:)dPLok]0Z< o,wi/齉;wN'Bpsj8Nz3>kJųA>39ؠ|;A91:d*,Í -3#e@\C JruqP[SI{.n@(T䙮6v2G`y:zpRYP '8)"N\ }'ݏ50ZPBjp&>$LLUs5r/̨,o<4ژtFCSf;j1=.`g ιr;Вzq]Κ9嬣5g;rQ,$%j}% mB8)ܘ?:'u49~P-RNA[b0莎}*j_zn6qr-9Clkesvh)72)lR.&r^988'ᾆZ33(w)fנ C=0믜5rЁvIf=kp6r pEG^-oi9سˑFDU#r.N=C Si9BOm;u'&>⌮x*"y}8|$k8JyCt)Q/VQcS i9A ݴ(瀻Ko.s-]8C}l&AjUro2rx=Zn79/%1Q~2{  9/%g/̗Xr[vKg.QoXu@^Z휗L`f]R̫Lg~OT8*9 z*yTZŠEU ZZŠEU ZZŠEU ZZŠEU ZZŠEU ZZŠEU ZZŠEU ZZŠEU ZZG 4[Ko?gkf.@3ܔy%XUuݘ>^KzhJ'Q]~Jcu7 65S}~óʅeBьUup?JSɝonxx&knNm:įٍ̅ąϕ_(4{G@)Ͱ]8 tҠ՝y޺rpue5ZOh-zٟ!2q|ީrSNtG7ܨfL $=TT2W8g)/B֢)I!o>#Tiy q \ ˙3az{P_f|}ARi7CpqxRMBi8Vͷ \oz7I8OR)ĩLǻ>Bie*݋ ˸y+e)ݔefŜ66?65 {ڤno3֗{5ӍoȶC^vt9ϔ+> 65| zhƧ*t, 裆F7 $ ϩMRgjV1hj5,plmP1ׁi\Ycp=ہ7/ӽSgO '(m_6 )FGA6`PpT#g0x8@?ϠI9nP|D><|ϐA.NlzРyF2(FbyXlPtiY%8Ѡ 87 *DD#cP(_V8TC1@P"ږ6(VHkpb<٠. cA(ߑ݀b4̞ư\EV)7OCpzep蠜#)ŠV'`J.jfvD.8Q$YsR Y(4\ߕC G'`镧Is$E?gĉG9=N6%uB}uv4:锰ZI?xjM>  tPo"T|1ѧX'd fFQ7ЁOEg4eS97JП 't$c@irʴ\C vf|PUL9ʁCw8r;qx0(8fbe y5Lk}=ƹVmpcxs\j&pn7Srw'FU9Jk187J8O.A:73$ܙ#:3ιCm3_]'TgNϹFŒ~957%O]5h!I>_0rEnM :u@$YprIltpҭN N9Aw[coq|ѡoR8h59N*k4AJ{!\Bz 1"sµCh*w80iᄛ}/4D<+Ap|{z0zp&A;p^pʽj8^@x9b,"q׵7>qߑoqw8Cq;]4*Nߩ?4(7Rq#%P#\GW=~@5سKnT!) (&gT! \+̭xvlO+ ]k̫!n9}\5 d9zS3gV Ef|W}w;ts.՜95AZw/w+o 2 [2(ɦ=72 " erZC)4#|Bw W7!QT)d6'ǀNe j>fd(*5xxwGf0n{MC|r]?~4%?!z_\~女87o2MUj4SZо̿cO 猙 }75D#4ht3.L%G2!@ 7~R/+Qv-4蹅fhx]'ssc{s0r*axWT2;84UU6뻻dsGK̤,vP|WT>[T<}*y+”pZ j==agYWQeR 'eM&G4.ʟ| (w%3sP\&v c(KoU|bAl{ǘې8(Zś}?iDV5LS)t8C>qr ^.H/=pNPpQwW\[t3V/*5R@iؒyO=>y3]~;|*dC>ξC?WlI-&`ᛩLDPUΏ^ЙR@ב:S :R@gJU-T%Z JPhPwmr :jzCM˥tHfYTu5q% *h1Cb5(!1YWurӔDIP̠p&BjS |!#J]@j,'JCJ9V֎@ 4g/IhQ:f%`iƂ8Ч(?n{7@ZEIjꡀn5ʤ}yREbE,:ţ$Ob{sL2YriW@7VPd<.js|^PzGsPZBT;_WB8?4La )w}u`7O>VhLm!(J(Vr7@;&紐W@S:%Me>-O4O6t`ԭ-g^p^`'so>Lq̥]t̲^O{ TD!VRӞ*_ Lg0yyGzUC|A"4+5&T]Y@U֖kyAgTgVfDfNPt#|(:JKS P=Zq!BAʰ8-0~TCs|zj΁J G 9)*z^+Ҁa#e@tOQ-ϱPtMv"&{|@M$ P@2r_7;h, @,4KBBG4?I1\=6P-廟F @#BG#7} Դ%O#GhkҀpetQ!: hikV1z :иRK&od<z,ɌnE>@4yPߜ$/hjDcgJۛЭ!!{Fb2QVm:@<4T+mj[hQm}6[(yA%. (m8"j\uӖ~kz/sY{pe~JP {{Ɖt,y|64CCi05bg\@߿D)wg04romBw(BRENH "f@ DkH n#_~,2s@ L:ɯQDI*>1@iǏPx5;;=݄K[{V YX_tA$Bx)P<BHyBx !4NAU@%z}dzEn^ۜR<14t&~Z@F5J;P4 6QV? 0*~PgwO(4d#)2 csf`Ųe3O";LEgtM]4Jz~ @-ᨎ: |&*gBgM (*6rKg QiJ@nD<# IAt=gjAi@Ʃ̛ȩ4$7bx@#Ńx P'?0Uν4^@Y vPU> #*(y[<%@o 3breB  wXP`O#q݌8?pnBP$\@|דxF7q|;7@4n%!V&`i. <@ c բ+k_f9,\)=^|'ĀF'Kȩ,@= cF%f/C!0Ora>q\@"e?fD3E )%u e3Fɤ#"fnxQw)>Sp|4ʎ[$û43vJ4J8Dcd}h1iE^'y.ca: t#T(!ϖl@ (#| ( 2tvD=/MXWDr|ڕF|2x?ÐqV@kIDR(I ʊ^'%%⨼?s',4saehMR4NQt6>}BSa(5?NzWM/I 1Tp6!ـWEվw00}9Y2#G~MzEhh'7Q@f͆<<PU (sv9|oh(hU/.iN7)c<=E?$ɉ̳M+X+J;'!mAy^c|7Nq=f% ?%68iì1 eZh;\젛<=GXSr-ZOzWF$g4\@ZBBhiJRfkJ:qMfL<1xuե:fnTf+JM r X֬ , u|&1VH]L"N{d|+$-Q ٟ|k,eظؼr[k5 4rjX>L`ք;Gki;4HU"#6 zӟg|t!iʆ%&46OoR$ֈyW@́^Pfuw̳)4s мK ЁKD(Eb* 7h A/r&|Z('>/1FgZQMD'rfiefS-B)g(=6PnOВz}D@E Ty?p6,S!xOP] (#4=g)9Ǥ Rtץ6 ;h sP)HhbD:^F%x;k- |TÉ&z ]e߻8Z>3FKD0 ??6nwYF3\zRKH\`BG{adI gK,#+Jy;mJ&h":DɘL1c!@@l#4zyy^=dFq{jٍ{gA!0MsxYChU\4HAӏPiBOQp߳?d9(3K\ ǕM[yw"w8JKH vN{P}L ?ȁrwRF4i^*S.*yaA[۔Yq0ԒGi(6<1Fڦij˥I)R EfrP֕y/^0q9|RRˮV@c^Bm&& ףL\i6(C{UnT- :&sq hV:N<ւu%5J*(q2R|@=ܶud>;AХF#]d_vF߾JZPB^/ )V ! N մͯ.<<1d^*MSg@ɘsDZ( B9@Sh`FW8*˒vybRV&AnUYgAR ]soxHΟBO'4;zV.l&fXl3t{tB^,h (Xl3 6|=fn+6_=^>PF6Z91kR2c9^> ڨ гj)4Z2OXM(AܽmO}-5АӨ /5A-(uҀ'Dn 4<PK( (a@e# t"ڞ B>ҋ'AM}fG*d^ifI/=Irb^9Hp)X&g n9@.!nDe8YS]R<SGqNT@UՓreB) ;S]Vz}M@s+RvQ%Ԯ[MvC<PըQ-G։&~c->~ܳrҿK ʵ~SNg$UN;왙JI1w-(Y\߳Z^ʹkqgK|w{)5Ӏ1>ӳ}7ݷβV"0IvSНk"ǴZӣS]KnP_k6ci崟]3Gz}y}5ƽx3 { $VmĄhfYkX5m::k%UMc$|v ʪ| >^m?^mńxw<~E|v ڊS\m#z^;PUE*IT@VqyOT@C" ju%KӸiGPrm]5u U tJT󩀪^B\A[u]bu|~<\R_:\ *N:\<0 $& j[Mt*Kcʢbb~u:HLW]d(mh)*R@UDKU-T%Z JPh)*R@UDKU-T%Z JPh)*R@UDKU-T%Z JPh)*R@UDKU-QJKVan6 E=sUObb`) h,YQ@H *dFU@#*FUT$0 IVaP4( h$YQ@H *dFU@#*FUT$0 IVaP4( h$YQ@H *dFU@#*JKTaz\=G n띴H n띴H n띴H n띴H nuZv+T%Z JPh)*R@UDKU-T%Z JPh)* |tgWoN}+ǟ8uw8qKJ)5+$uz'x7d4ח~8 !3}mgSCp}\BVʅNٯY%P)oL߼'./'l+m_~}'F ٯZ%PO|j;x~7`26m_'աB+CM *z۷?]dZ. }K<3)t'rm X)jߠRH~25I=T7ed:蹱A9|?} ખP>+D]?KNViJMxnecG/Ť}~JuJ%ef[㿾6慨rT\UC+W@UP>rT\UC+W@UPw2^zbRn2^˟~h@#*O+4.9Ȝ(b+/ǧ4;|}.Wy?~@a @)v)X^mO&YCR^2s.ω[Љ?\.?\|t"% P9 <(gzZBِ~~x~x@֢s@  = EbyׄB^-뻿**՞Z@ߵWԐocϤ>Ri!fIYE@_96_MUO&+jiokA{1s3y湎25WڢY4yǻvm@B ml,f]-(>'@)#::7@P")ѣ<`}_@{-}?9Ku呂†PadQHk˄V;uuݣhx‘UPaK ƴ #;Jfx PȹPRڦƤEd\irx~@~*hEhW7?LꀢΩp\O4>Jդ6et@ i"O)pMoUԗ+nA1̬" (M'U9ُ!Iq ybŇMA/ULy5O?k Û4yr$x@"EQ4/' fLvǍ4~ @M(2H/<:%@46 Lh.% P|ݷrI$q%6'4v}?Ps5V T95npx˒{e$RFн"1p( u:̜h3D>ʒՑȦ{yPX= QKs@hk=DVJIpn C宀@eva'ġs\a ->B%WhJq̠{5xƓP뜹iP?}\_E@KDONR ܅ײ"j)]b:qJv\ hĤM@Ca^r&冲d]~a./V{/\Ҽbd k@tGwb*ٮ뻶FRPۿj"吶"9$2>θC ʤɪS@k)F9x_J跐OM_cg[<ɦZR"-&x^5LX;') 7>UJ#ذ дjJ]#!f)_P6$4(\x]wERQm'G$(UF}HFF8,-A=8qzUIoO<~w(CwnhsvJX,­З|:J6 [rB>P 4&vM@Pz -~)xˇq An-c/Z8åzNNk{" Vwnxards\LCu^>%aIIx>y~+4|\ŀsF)Y xrPic0-I!4"Fle)e,l4 109Mg]RPwZx|$=Q{figm;vQH#}hBN*b|3ǻ#P,@\YIi@MFgnWC;i}%0R▏n0enUǤ(!RGP)\<@o[4v_tew{npm(|"Ͷ&7zw8@A64 Ɇ¥.%[-*j7U|eQق"J\a :Oqn0DR&:En@g70NU@՘AK]Hhh4õg#429-3DXuxoCPHkh<e%b*px@(Bp&+"f (W| :%TdBдXsi1Dl8{9Po1@gB* `7jojj &MU@J4{_dU%RnHam3W-ƃ]bE.En71&z,@,,P9uK+hCdIWp,p@B˖ HCS҂+ڰ})nQ΀V5`v*_Ǯ?6{b9v )f%y 2-0k~127m''vesX}ͮ`Yf(* Jb‡)SqThjY[$ǭ7P ɾl9fpL#2!?~C"u}^_GLS;Fx{@E{4Mpp 8=$xoԮ2rr74\ۘ@{LЖŀ% yog8c8< (gBGfc SЎ A,>4Usekv02 t[@;;V :漐ON PԚ%t7{qWeBm#z r/r':f@6H=O5xcT%CucAP.6?S-s݀i/$6nM}^Rm?HZS-x})4V7Gľ@5ҡV@J Zj\1 Bf LҗG_{35,h DŽ6kB0M#I}Ex;%z P~͙OR^|u{k4s'h'sOs="ž ؂} xuQRyӿּFԾKHd-QO1r(*H_+k&k%u!z&8{ es;L5EYd.|B,ZGtʄރAbQX4WW~~ּF'&l4l$pi L xM}.i/?Q/f@׊}6iܻp$M^bfP'IRz'7̀ʱex]IN׊HgUH^j1:C >2T#;W+b?|@ @3:m;y,ulr ~Kw' P@Z1|.g離#8X,x]v hqя%"$ {=t }d;dH-t):9.O`%| )uLsp MwDEX3yEtN> /$IG6MDM3[84a2,&MJ?Gh?d7\v4jiWYl1A1*:Oiɰg1N v~^fHS18#*nAEDܰ7t{8_/fv>gV>?s^H/鈦 o21-J?R>CflP|[2RZ.P!}<5l@MY+f:b_H▀&7/#/E*g@[veZIdkAA]=%RdfJ>9gmTȘPZ!@Ԡ|=VC] 5,b7+AԣyQޔXMz_bxRӥ(k}8 hE뫀$Q[J$|z qEj(Ʉv+C튯F(UAt6?ۛe}t*`_PwLn+@g30Pprªg[ܧZME0fu{C^ww"Y\ɢYT7b5G. -9F=CorM@(D. !͂2yu3YTs՘ȨP&OoQѸ?n(D,kM@ bʾf$o ΎvԼp4`<o+{$}z+@Bn(TnAEɐ1s3p1Fg#1ƾ,/6'eT?}#@:ؒzePut|WyfW7 O ӳ8{vMV<- _YHFҙ;tj@=1,_=Z=} @Cr{/yr^yO? jV(s PUPo]Ed8ц~w)PLRP؀S"oz)Piom:6PuR8<[2(G33'6(\(zʉ˂rŨ$"z'4P@..QLOO@=t|\Pw % 3 iCs<0Kܶzde ꮡuwkhv^"*u&۵(޷S= Zz=M!E݃OʻL}}4=8bpax>1z6eMjv7DE=^ FԲQf& wko0<}&kYW};R(n* P(Ɖz WSvuM.⛱@%p'Ot.ZZܭzR@JB9.@]I't.,[D=aNPhwYRʡ-s["@ I](8X \h_~JRQ@|] {o&@ڗInԅrx@[gT@hGDH@o§z+i7ȁ3ЭPP@ATvBt]]z }R]J9Ŕ+;$uԑ#5q cWԎ9*#hA)ɝpۈzjÔK@o&+Z?f1]~9]ꖏӫ1(TIDAT/DRU7U|v_LzPEYC`]->-#ȑoÝ | ]rJZgA-z8ڛŹ![ 3|6hToE9+Z-iy,huG:| ]|́3ⅲsR*$9Ck;9t+nj#kzixOD(d ?vYz召]=G֮@#kW@+P(d ?,7t-T} jZڇV ** - Т - в?9^>x6*+W'wnO^G} :u.0|?sMTVʧ^r==rG|>%b W*|@烝~9?}De|f?Yמ^B|}R>eRւN %p~~ʽ_!.kTů|6kgc^|hm-7/r==rO-}R>?YuoTt~%x^[BNTJAnʓWW6c*_շُx??s?^r==rGVKzVgM-%f|wSO KOמ^dt?+yWRQszH܏ܿz2vgB)8+י$EUZPEUZPEUZPEUZPEUZPEUZPEUZPEUZPEUZPEUZPEUZt&NIENDB`stars/man/figures/README-plot3-1.png0000644000176200001440000004515514576033423016506 0ustar liggesusersPNG  IHDRMR/PLTE:f:::f:f$$$::::f::::f:::ff:f:f:IIIff:fff:f::f:ff:ff:ffffffffmmm::::ff:fffې۶ېff::۶ې:ېf۶f۶ېfې۶c$ pHYsod IDATx ܸqf-D١[L2lڃkYP ׬8f7N“: pi1;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=k;=kK>察~ˁOxY? 8gGX !; D9JIΩӺӺӺӺӺӺ^.{1JXH@h/Jȣ*aJZ1v zݻ) k CzD) ų?B>C  (升6#! (r6!rCRЈ3"|>Ɏ>?|>G IM@לb%;ڻ;!/@ހvRT+n/ "MF%h9 $_2 ݇0@DZ/W?v)|TP=~t=; qt ZgJjV h+鼞OޔT47#XԲ>F4Oǎ.;؎u}h_ZZI>BRP"ɧkK/6g?9P'B?"RR>W5 rUbbuW! Phl&#\ >@4.;שi!kNF\@[΋.BR61N`;GJC|hQ=Va^Ӈ;}i|/C`H%5]2g}LE+$PnSi!:q!!D#(! ]+o>ѵ;gSb1w؛Quev@# a4t(K>cSy^$ ԍw ! ]843 Dotr>ޙQzP߅lw!m4%F6>`Zt5UW"CT* ߝЄ{|&'[M (tlR.jU\S4i>W=*Pzk]_˝kK?o*)ҵXkv ~)hm?:l4!h.]#\x1BLqmb~veʒ0,m7|KB.l!!V!<${7 YoTtiq(M(.;6髨I_q a>!in$"ZB}Bۜ T2!ўzS1WB* DȄ>B>~ɿϷϯ?_~mʗ<#+-@Se"G t:PC"]8&ZyRI|h ].݄DS_ů@?'B*;AwI@a $.NCv|!TDsqBBz @Q h[!ڶP֐ncw~\#32dƼN ǚP ~țXW|M᳞F5TU?@)[w@,FKvhBD_O(Y޶ڭc)6 (^ϫFTUdsnET*ո"C?r!x'$w; :n,>_h}r@tY;jB0@ yz^N%m/$(Gx OBњ+`e%KЁY^c] 5*3,2gmxeש*N4%UY S)DEKU5_J0U&J>g6am:BsD4a&r*R4#(0,t9T5.rMm{OG`PMfN(OGv46-.9OP ozUMN4$#RaL͚QS! Zr$tbӝO3Q K ^3 NPZB8: 8]4@~YA!WnEQrOwD4-x(f}VP^vP45$!:utUڠ7fwtB .x#j$"N%oC,4Rs؟g8y]`&WFV&7bOaWB*MI:隲!p\CX_ zSA-KAV0$Ķڎ@"}BGycdy%Y QEa/ I4;2i=d:).=>#&DKOfPQIDJUk@ky#t Ba$$ =UX0!-@}Ub-!UΚ˯}@t&-LXҎ稪q@'V2B*zQ>kJmFhO(t6mܙO+k|:+9+fB|Bn\/Eۅ2ϠFu|^(3_5%&}꠫ϻ h'A (Qk Dطo #yb]j~ ~v5{obPbD >~ۭOmk a@ZKOۗZ3 w~&oT ^ѓ@!Œ]Pk !~YU!m>《UBZ=@N" 0=>%(j z |%")Y |V_),:!$n_Oi" (W0Ir)9 Pvkו^MmQU^?wuъu(}!1ڡzN~y- ׎3x(${ 1H(DZ;$ʾw(M bvtpKPk9!TLQ#@|:jBTHR;OVGJ/1u; tY]TMB4O@U? q ym]WpFGxDytvk+Ife@CV'Ls9Ev0H(Bz%2+tu-yPR]9xR!6>]ZhX3|NYDhPZYNO(*x>BLϼ-$PLeёo03z(T&q$ #:"`D<@?:6rŌvQcc C`rv4Řo&ӑQOY K&i #l~Z,ty &0mS=q >@a|UaM0J~io؁:}rs!k~s8UTUOPJ3{m\,Du(>F}T,JftnF}@J0Kx .c2!|P寙Ɗ1 n1o_4<`Ac>=*z9x^MBȦӣK)]*m.C5@%:HU~@z#H^`!Ζd ܮ3ͣUo4\K}OWb ФB 5#Ne=@>}hn3)oLUvfvutM IwBpXF׈>bT 3ȀPh};; D _R|4Y@4:zIa6N'zr!>h *;MҰH%SiPj=iC%/ei*m( ӋԩZ5fE|ڀ.Rh@ b2TKKY.z{& NSs +K7"!@ '$в(#~`BXSWHF ЅKl4PPXXjJװ^ zWߪ2#\B -yB:;wð~Qx^u^MvG {x_ŧ0̌4{HFyW\אTrTJF <,A@O|VT9{<+M6 l),<@g3F )d6͠QHuF }#r+ aջO7JZ؀JġB<ř4(OG"U7Er]zXw(. 7='Uud%P :+xQR.J ThM.I{IA_ }d@7~shr%v"4$FqWf&'(>Ar&jOVSg =I$Ӂ$:rX`쐩]kL@7$ ]Vu(մ n xֶNo Fom4*?>6 Y3քd)[ PI'd+!]nXViuՐ#tvsx9Q sV] M3u7Buup ħ1J,B$ao!P4%w Ь*&^Hm(@gq4uK@PHe->[ > P`Љ=̳|>O}O?#6h @c TMPl幣^9(Ŷ5FSk @mHHx7J@A1vy#* \ѣܪXD$g_([,LNyި'$OTbzb(/_*Y+kF2A6轇Ibkdmofz#]ȚcA4R>MXMB! +Cf%Ovo>)S\7OQPPX岙%3ERt4|e7m5g>|S &b>4 $ԛ8:|B&|!*^[EMH6IjqgZ^.k.,@ ^?JMi.LAf uN"M0Q:B|6u+ZB2C |Գ mKZ:B t"'U zHwQm`-TiE7=;y~7rM*Lwj@c4|bc4 hM!J rh>G]5,[t8%إ ˆ|ǒoŘ[[Jlo%Пh@ͣrU~6?;NM&33SH u9+Pݟ[fRx=ڽ}SB%/R>& q+ zkh%:i ԙRoj ;IQ!iNDX.@ͭycc-K Cp:{&ЈOZbS':Bן6,z-,sЬ◗CUc-*$@-@ (3b&!fvJa>'k >UH h {I h@Hl\7|l@6 iM;RM*|}7j 5@l$GZ[\ It7RNHs܃/Bj dJ~'^LHeyK]Ot* >B@ tE=_R [oOyb>UX#T<Pj͚@=>Af|f i@34V^6JBG1b!Bʅ(3U= nՋpGP|2:HOÅDd/s@s#T#h? R3p!@\<7jK=#AB_0PNw'8 tT/ z "Cr)OF$2bJ(}4 ÅSaYd"2{02Ullw e^:W_%Mf@\t^G|j%PܧV&OFP'`|$RH] #8y!dV$ |^?s֤ ZLn*!N3tA_]"CG~rս$TҢ ZVrp90ۑB%j [dO-h!2WZ "0;=h,d6$^BT{"Μ(gQϯ +nO@h &1 o9Y=$3lzv&!Q|jQGܮ8޼r@@aJW|@|! 7H 1]v@Lyg0,> 'xO<,Dw(Bfꢛw}ʇsvoip3".0qV > fI!n'Dn/{S>VmQ:N oWΧeK@ aЪvP=Sh—>#~sX(>푙Wk}% tR$ЋiRgo-nQҧ|V׈*tvlh%  #Q|f (Ts5Jm"{i[ZI 2xBlg&*1t\ ~ϩAkJd` J o42A"*ODG'֘lЋ/GGeO!}oWBg{YkhF|:ɥ{?>?n/h>aZg4Pl؀>}&8)tS>^?>B,} IDATw˱@G[E > )!;%~`4 dw4W;4M 40>?c9qcmGhgc4%о<ς|8Pz\uܣ=2Sބ@(z,{G0c|^":d%0Hn ʹ7Ofr-PQmS'd!40B~BKS@fr-B@ӄ4a毆 :4wɵ !&)zΑ (y Q!I=gɱ8]n0*Nw /@Gs ߯g+#M6t >=/>l1>qj N @%} qt',b@7z3Ni(TGFP> ]fԾP!A:P7|=)gTy:Iв;ZG{n$[88Eϛ$sBId h-@oC 40+ZQ8PhWy @ ^VWFBGKɲ,FgM{jUzt]C7%)?W[FgOgԦʏ4O;?@F$@H8藷A])ew~ztI+_ 3IK#Tc@CmJrTU,l@ȫ>oPySBIy( ؀r!4"O,A^-eyS>:7ƃ*)~ڿv?@~@EDZAere>ȫ>B҃^z{)|KH͠fۇ7-nb/Ph˯OI۠vX>,+< zڟi%[߫NӺsv[tڟAតӚ i] i] i] i]ً?k;AOںܛӔֵֵֵֵֵֵ㠧umwo~vOe2꧷O̩|~/=Ą3 }DAk5mحTUlGd?@zۧW}x韖/o ]w>;g]Pon> TBg}}*vs!UCYUWɾsO?|ynywb'"TW|F# < !(ՕdgOo~w,NH~Q:q˻cފ_OƯn~D*B͑B䞹^JJoUE'g^O E<"!_[e ۿ[ ً^-޸7xVzo_won]1|;ĵe,vec >'kLo߉ݟ1}sy'3CH7Һ[~J[))}-O{Gk?*{2®75i`|twR5$c>vş>vzm' )9z<}xzIzzZSK+ϟ-O֫}'xC.K/=^Ô* ^C dvQprpQVwSH  XN!Uk@:*V?.sqg*Ver0RmN`!UI="Y^xy{sM@c}(B|#$J%x R}Fr.fVH@>|ٴ>t%P6T'vt@O!⯜;㍮'c%]ft_@~t!$a)pZ~ it>VAR?ĠSAX_Jz4ZpIu+|E+RYIj&qX- RUILR6h\FFE;v NDrg֮lTR}gGSg}TQ nk/Bj(R zJUL㳋VRR V],K!@Ei#$^)bYdt >S!-XWBjYAIchdb YOqe%-$d14M-h\* ߋ eqߖ \,7T#$fe)x ͽYWM\KWKE{1BV\܉͉YY4p|VwHu!q[C{!VV,[W惡xf JL+ )z!VRaez=D!e=G}%QXB"_N{kmwzq#T;twG%i&JH̲K}geP_7 v%t&PBde|[g8D [ʰ%; Y$A}CO>dۗ-v%$?$փVx,^W[Ƹ+t\w7x3PҐtNv 솢4gKh/;AI8!9P'N E@vCAl!ZKHHJzƸFC I7L+ʠ/hvXJZ'e5!dLG%.m="y4FA徸Υ',o1Z }tQJmtJD՛sN?B\# G[HnH7zWB $--*5)bvM l6 ! Uq!T٨5&߁uL`!Ŗ&(Zle:9$|@DXB.`T^iG@G#d:)om<+pr"#Wy,+-tDISK EDqtA9Nl=JBX u r@a3iR%6xbHYG Ӵy&:3ꓰ}rX/RW!.rRYG*fA P%~0E;NpLYɖ耭#zH.l9 Pq.Pzd8A\KbDλ{ZJ \Ri>Ɩ?};)to!nM (d ޖa@sm@7fz#ABg@e~@ʇ;y~+ojǨ\{Ũ0.U >-3Z6:´WvJ0W(ğafz#S>_o  jM,%g3 ^TVzRI4BbT%DsV4fL*wj@~,4M]^]_TT fB6XbOY廀P< [n UΟPǯ/)/K˪:xF;жS#rPÍ(1֧S2գsYO2N3.o_h@'DNl)+Opo6dlf@&ήۙa]VQ*@Y|*߬ךt|IM':âZBK}%fY"+1^lv$*T"wW"p$w*@ʡX #I.*1XV6w?Z[Tg.mz^$MiwZEŧ6o񩯺D!?1u(϶Yj^5{M~e$i\6h7$>P ΂98P@ Ϻ&PAFa2WP`+i (/:7V I]vߑao ۫+Sg-|.)*/t Z)!ФB,F_`x9^ @8sͰnkJlDMd֯RϫR ih@}V@1h8;|B V Bo5'%1!!)<;fTyC9"jsYv J-fe!:2'I=#D߈4T3ɑ&H@i@vMbqNAAʍ7ʕ٫PAx@ͧX g䳲{%ڛ`mhN5;66䵚8lYBp8{^B %Pkg(}LR68 Upu,hK*vK_zJ!2W 1; |jGivm/}VS2ÉYtoU+* BFktɮ୭zL ^|@ms,gi,@y *-SZ%L|4>Y|:Bp0$AL Q'i7*IKQ!G%q| C QNH>.I$)|0Mq@|Cf8cMH+@m!WOq TPS@OZ&5>*1\_Ьgy6P")w%lr"erNDIҐ pw:c Ь>W]+ķY2 qm>0wI-!џ+YI3QޠgJ_y#*Phb1³d_!.Q@;U 3{~3=̔ h D@NR79:鯛ԫ+ Jy|݂LELw@a&f{( z=!!+!.T91 !؛ ^Ly oLg x\Kˠ7"BOvE@5y o6Mi" ߅w5,4an\IνoFBEm^aSRBFP!HI9mZ!)>?:nQ.] r#$Nh.ƈo'%Ҁ!gy{3q]m%^C)29Bb^P Wc!ZSFioLIFVA?g:#Xt^c|o2fkG $5PJ[vվ 4x\ڊz2x K'(Gs4v1qPR^AquvE?K%յcSR"!Q q@I!!FW#na.LP3h9ֈxHH >1 j YU'irQP>į^|I߼JD %Bb|Fu6Cp| J ː E@}[9#co7.,(''ts 'DվJŐC6Y`+#Ǎӏ4gs7@Bh>!G <gP ~^g7SzH!bRe%~5]݃%2Yh!BӺw<`*Ԟwܲ{3E\g+|N+iAz ObT !L>qkVvE{ ZQ|' Gz5(apĪB-h k>jMXvGH>sPS˧(e_UHi(MOGJfy9P7"ܧE|.^;4Α*1(H>j+@,P>,B.v;OarPK(O,PtLOmVx]XO6͞FW3 ҈$`>x8O?zz]#Ϋ$սmjFv//+G@uel47 v |:ʎf &IDATsG<̧0?i g,b=7׽3>?WhP]%'՚V[E@q & %QK}hUj_,NU3HjkO~Z]q!{:;'бl&!΃g5_WȺ-JSPPW`j 0G՚VbK&k\d9 q e Io~ۏ0S`sM>蜺ZK⪄ Ռ#^q"@ty Sh-KFCBAUZVX2h7|¥@ C3GihLrOrk8fM?¸º_/Bqڢ8S.j衸B++6И`52?? erEй?>ةTP|*B{o * VQa~p@e%)vWgL*++-bjW$Ѿ5J4#a~y+:F0D3Zq7ֺ%T'4Ud%B"ڤݶM\ +J D wr5;V1z j|[6' 7oe!%&4as۞𲶴qTBzq>uPG';ډJS [U=9_R]|Y *F3# QʽQTK\ðR'8c\_iZi׍*'>aK؛9{G,X C%*muc` *:[Z5J.5?|d ͠Q2sg.X3>Vr7E6| M@OLE#!OBQ>>C]O@Y)$;pmASzv1J6PڨJ˷4ЕPȵpT ͶadFvF!Ol\:VqAD!": f2!2jʠ90 ǘLi(iL->Յ֫إFtr2u/4*ӋBU6L* ./@͘@W!$Q 6FI>QY.*z4|۱mA u"TsPHrpgbd hEPĶ -ΧFzLcQD M[>s(ŀ" +h@GkŎsmJ*zLD~Z}Q68p '1k>= 0QZN,twPQHMU'qr#V 4lD,!>/֪;9q%Ky,! >8^=oG(ɵ&r l?|f !;#\@!6weI0>-%:W6 !^aBTá.f+S§E(z!D7zvzf!Ѯ*V'hM1E'~Dֱ(]y|@9 {PzJmOk=HѣU,OfKGmh!R-,ΧmB =ZmF'~duPz Ul\hAA UPiT;jg(9(U1>_TBhi.y+%DA 7/JD PrCC jvtY) ( [x$E蒮 mi KoSGb&X]Qs(JD.#iMٶP m-q"J 5$6o eyD&h(ζ=6AB;+mGoj 95BtMYIK@#62]lL'ttJM]P?@#j-=QM){X@h|.s00-Dw&fzta;s7@н~=v_1"~@o&$G#b;/6MBlW@?fB>$;ziyvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZvzZ )ԊlIENDB`stars/man/figures/README-plot1-1.png0000644000176200001440000016044314576033423016502 0ustar liggesusersPNG  IHDRMR/PLTE :f:::f:f'..!...::::::::f:ff:f:f::FFF]]]ff:ffffttt:f:fff:f:۶۶ې:ېf۶ffې۶#0 pHYsod IDATxȑ6Y$l˾*UlVdh{*{3˹È7~h "#?^o^ۗ@_So/^}mOڞzOI[߸?r> ~mC'@_&GgQvvDGbG#=%3wZVx|;*ev(g6DSxѬ,j6 -?U#_ovr5St)#pzϳJ( s[Нx@9}vΓxyM^qSW I}(8߉l7/5xm^4wyQscހ_+>2?pkʾC,un@#3*0+;Ax.v<W8{ϥlҷ歗y:ow8ZaX˥^EctZ$؜^\׀LC:gPSe>ݘR'J̘=Az8Okp :bY\ 7mDr ^dˋ UZsɲ+냨vLIό`&@#@KW4ݰeQxaȳ1Hl82D崽 ﹚@*H ~ˮV=ᴘ_Q:h{N*8:>[rXF\dEp @u<be\R̋cy%p܇kUo.[o+@)v8|׵SHS^\A iu;Y90@eBU?s@8?8̓*߱(n5ʠGQsijd`/cj7℟*-LJ,&`q\E6V$H{6+[-,;w \tA5aq9uMSFf=µ}tH+ly-kcGfk,E6Y.Nw724E8۴Pdq~ʴ &%Rm)G0݅3vt/,B>|BɔJ'g7a@'P\ ?7xKq" [m;*ȐʗclO,IJți"r*a(_Bf֯3f0_,YpuG’8'}Z\mA,'e$n­۝d6^y'Q:bZ`*oWXpͽSEB>6 +cmAb{!v5,:#[#!≮{N^p;'R8QM@~P*ckqG z]s`VEhj5/pvݮlgb&*bXSag^$&,36@䥩u FA`Y4{$pAwP:^$rZbW40'FFg2'j$0gkHb 0/]%6Z2(@k,UɀD'kKV8 >K%%[[SQKFMϱc@/\~jT9=4XәQqQmGDmZ9}vGqIS3bqfXrV+ XVN|g<˜Ū W;0f(VB;-{Hf̤SŃ ՃϏmA_}lˎZ0wX +sy7-+ȋ1l:ﱑ?PA79r.4! ?0,T1Qt XT(mke~vQ[A=R6KsgOMnw\j?!nk-7aD,h˿R;xБP -AxtB<1 qȲ^HJ-%4w\B<èWl#Wz#թ1QSGig =,>A ZQo_[vEׅHXw)ȳ$|ltsuքGyB^Ff+dH%)>ÑE6ODXWqPCbVAқS%&t7Fnʹ`iMa:cttVS6.*eJS3>9N?;&,ܺ Е0L LQz8#,+Ep3%1gݺȭ j| 'IVwD! 6 6֮f7 S@vx }ZjԿ*ME@؇C\2WrZ+h}>m(]])~;&xY_.'8EVُإ.ܹ{X:"h QCbWMx+/<̇8@wxs!WqXͼAD[!YPO,ܭHEZF|BMXuтe9i?ѹ| `&rjq\"sm>*{,AOe~~^#Vk~?]M#%< 5x!ְ\׉$I1mq$?|7,dr)5R>( A}{TfpQ/: af WEUcE0[FK;cr6O eHrgR-B;ɀQ:Ј;e"'Tb`U'~-kW㭱W~< U /~v@Y߮L_2@mA t8璗K{h-DPevB(Vs;0' pXaiFy 2iKT@ k .v[v S `踴 *R7I/I1jypqt|f!݂(a穾 n7:t!uz~'2*vK$H-C]l#V[B AîXƱ?-t$l[PŇ<(#1C7ggG`ka3$.:̓U'WZkq\h6[Sm^!E&Sb|O[$(c޻(OOMH3nO X|_'@vbw4[ipKvu固s("FAH8wk \FdkfyjCxz6>l.#JMYK' AP!c<.5?y*.)Ra+H M殢P?MXuۂbcӤU,eK,.KWjQhYAk 2X\Q\)f(GqVКE'kʡ0 B* ЅƬH YݒB{@v2D2>I,?͒]tkBM#ʹ7'L5fnށLJy;$%+Ry|-ʡ a RL&Q#oU!.i󦙉cr}4X 2FߐKMɂ 尢g2E4ٛpv?@1E\r _r4HiC$2Iv"(ٚ=?XIT~SIN· ua(֒ ۋXEe#j;_b>գ'Khj}C$ߨQwv,I~u== E*״;‚W7ͯTʆ,kwL< 0ڏ+RVgvۀXP.F!@!OV)ݬ2盙* Ĕ'RIf zE\u b`n]a90/kcAo7,SִLfO! fufv;IzЛ%}#@+GOk[$#ߛ1âPd"Oygմ1 *NHD眐XԽRp# t[1ث$ʈ`Wu˴$0YGnfLA~)Nj m7R akRwSC@Jb'hf>IOpU~] bmAyJϳ?{ k{Rc&ѓ5'&'"8q_xYȲk1gf>.݀'ɞ d=]e&чyl([/.T~((ε^^2Qx#@_}胞!n Qm[J]KÆi&D8{_@rexSX9$fJ.񶤡$n ubnMMz%\DŽ HdQ&qTDm #t< rGsqw򫑎Kn =eՆ$jg#"ݨY+r IDAT݄[>6  H1}GZ.Σs:5y)s}?Ƀ*nXAbJpJ7^J>l%#-|}E)(% \l,! ~SGMT@m?hsToc5O݂dɁZ~WnK"I řp|g}4-͹nJьX~hl>f,t=AYJ U;%I%)`Γ4t HIC]SyG. 9,mkjB47a.vD=ky4s.$Bh>Qd,vg# GM}p%DjҺGwϫʥ2XYgS Hf.$T ii2c)kvoBzTPZa%@f_&,ܺwPTY~k|(%{|k-j*d$5yJZ Q*R"CQj[JP(fb97b%&P{n ~/^J&QViv4%cTBMbjK!f%f]$=Ώ`SHD]Mj [^I O$sûԗDivYdbB<)|f)UÃ}o%!OiP=TK/owt`ԛ8N~(Ue;9!w5)&@^nI]SJiIR{ʎJwyf(ULk"t 5i7ͫvͤAepٟ0rEO(9W@oR] >x"ѝdҋn@vk+oE=OZC:E<'RqAqrhC-FBIz˄V'w uO$Cn,;+%@pv@;"x˚<8) cdK+hk͓ |rc[!j!1cL$lJ+_a p,ϩ.y zXC ]0YDRp RRy+?_݂7KԛD1z]Œ"~/#@WѠA/,So[>DEօ\i-ѭIs˻98q,HyVy'i|=J Y%gnm#Q\ IhtUɃfőMU&,ܺ'nݭ>}Ɠ_@7[w6/RbH;ͭ- Ky~W]Fo+9sHOYGBIztgp0bG7JbvsR+ޣD~AhJ|Nqv{hA-JvMXu_̠/ap&~nK2wsfC*ͤ 31l "P2/ ԇiD;,a{*51B^Mgv P6F3C6Z+F _ިt4';xMb]'J{J@qؖ aI&,ܺPk~Oq*mf_.eLh][B/IBZf_Wyg&?]MTpţcnFЫ񈑯iKIU$|_L"yJb$˖ar}e0ZAF჊-;O:ly?ZAp&/v7a_'l />@'=o%}IR,K!^Һť眊b >|~UN8$L /%0Mđ A"I{D P94fjV&AGg&>+Lq(7)X$IvxNmC%.άsBCZC`n0`:-.sO(e'FXȝ5EprLdn~klOGs94K/P)t!:=CևcL+i3$sI}wiQ;L?}$^WSH*=`ESܞE>>gH4/a+)GK+@)Y:@SnI%w'3^\ginN|Bp|/m9uD,!hH C3|ǭ=suܜԙH@JiMXl΂ۧϼOdBAձFtd0qfS(9J.I"cb/".МG rhi l*1 TDM+|l4^>~8n*!F//{^$`!q5|Rb :KVՙ[ۃ>`[+I&^)H4̞r%8=J~^(O/'R]J=Wa=mBF`-)x߂5fwaGdQ/mh#ոe/JG(2YD!ʀ yԝl!oVɭ辻%坠>9U9E7o0΋jpPr!\CN$V*$/6kʳ0 k spF'nL֥D3L '=˂mioiA_}+j6wxtIwO]_Ҕ BHU3I)ʗe;j[9=/Cv(-E"Sc9^é^8pʘ [9tK8i# 8$J3ќG|ݰ,Nca}(د,%ʇL)E/hWcG4A;o0J6%}-*l]Oa,$M,IHFlQ@ dg4()W̃yl4i#YLyi\Z`d^O2-YY Bol/) tCw1|-WN6h3? 2VU{(@_}NAҽQͰrO 'e.eoª^K`7-H鋛Z"P'ӔXYz0! :#~, jM 4?PUݱh\saܹw5덦 5T#q g2'G<\]u,Jz.^] R//M^@RĀJNZ`B[49بKXKr Tb=VjDuJior*B($tv1Ra{X5wD5*(]M*>HVPlTw507?DwB7ȃbA<[=no$>DaE b s,,b։ԼIQV 2 fxImƹJ .=Ƒt!!!)7AewKbh 0Z9/Ϗ<#= My<{d,S0ţT珿J_}/@RQ pG Foi=yw嬫 Oۣ> puH>}tm@5TCuw{'=V(좋rn;>aAEŚԨ*@[1~oSmz+* %>@Q^} eC.uJpM{#gTh ݅o 尰%Er?/NAϐg'$%WԽ0ؾ0:+rn߭A3!&j^_Lkm>o2F>`I#h@c[ڡ{U-›;џ 4EJG!\Q ǯ&7p()F%5mr.N^bN<krf= Xǣ6CWƓ\#e8_, ,i9sxlkP~Hy<%Ĉ{cpAZ +V38Qyi7 E)y 8m ŦKH;ޱ$@ Rv!C6'>isRD&w 2ŮC@a7C+*W%ʦh άsAԦKʖ8U4%h~Yd0San2',qΏ_}'(+֮ynlv^oY~Sp ]Ge=U|袚ԤQUVG 99Y^q)"tk["w=9 Dvp֏آ1V1O kfeMbRE"s53tMxaGwv7sH̊7@/B›KPM)xIeia8&<Qt D~a%$Ό'+2Go&/־dh!wi->B#xx4tgR"`=˘a& !B+nv`/'u*ee[P7)zy )gf%VXPYҤWlyf ~{0Q(V. KW-Sə_ҜWX D -ZY fdqpެpX(T^}Ч_b$^7sq;\4Cfv=)'m]e?dINt3N:Z6K]^N84|S( d2%ćÏ@b GR8 O}=tGJ@I[D tQ'Or)0RA\S̎C xoO78Iќ7(oEMك[l*AT pY@O B(G5G!!di-ZDf]chtrH"F{IJI<>4@Ccד'|PsھY{!X5]qGr[XmE&.'dZ\$)Ha^;; 6Ҙ K5ӊV$S{H0|88:XPS0sApNپ1[Fv3n @.*Set՚czb@r^,3RF6Șr@xs /*K0.Y 1Vӿ13bȨAITmSOGF$itbA@_t+չ6IJK4+9+h@.疮z)u֬%7̮UA[(Nr>$oԝ"bv͆&DGq'[+˫z[ap$XS]cw0VxgmNkYfrf{X@S}tz"!'qGhje&cH#z>z8i&/ꋃǻx┠r]v#oA_}II7S҃hsf):{}FXMէ Hy4㹃yCE⪻Oɞt>ye5p 1('l&dG:5HhH ׬mg/i<5hiG aR,tA͜'cʼnrzsa%n(6&-) :Lzz1̏Ϟx /r%U> x̩^VVg1'OQTH'LF9`+e!/M;&|apm{Ov74[؃X^g|5*a4! &P齸$7M(*>?wć'&yL9Z:7Zң9kjܽ4|Le820Pux# d(C<B9/n6}:D999+Bo5'@_mŃZ/4'^Fō*o!2ƨ5 codR>b:29p.k搬 I}Mi3%vI6H_Qtl'{7zMFMHHPK0iɁZ.&,\'蚓+l S^bC(lBTZaGX.7Zá0ЏՂa/&Q DJU >Vae!o[s^R_Dǣl%;5B$XQݮbљ`c-<(L"QXBӀ2:K5&,\d heXzj$d1 S) u~-l5f.`My9#BKךO}#4j%+WWg$ڲt΄ѩ*>a \C48֌-E |;QIrXQO^DaI)Sd`fÃ5^漘m։:~v(?* ]a7it,KV$ǢƍWf:}p7ȜR.X.ktBnFAzϘy3&k@(h+M" BRqUH¢ų>1f1]{Q}ܒ5<1ʢS@ XQᚵ< IDAT53yzؘTyQ˷ ezUl{h4D1uw*@JRQBznu{.u+4" ~l=-#ZM*r kZ$t%OKVf3&ύ/\P$qsz@Z:&^aUXз=B05@eRA%?Ą( T/ ^&kӶHpFj|#HL-Gfz"}1wM [*^JTbʦ•,AvسL)l}!㊖cQFh; OB37(@p[5 aGކ)0.1C;8= b-lR4 ^cW:@5rZ]v/<$}=ߤF5#s39M6yH\qs52Ki ٹ%E;rJ`d!?5,Y҂IUAR|tMyȳz&H$Gj>Fn北1M$w|jSSzH|ORBZ9M ^KrK }lnna|-QZModulraG$MKi:tkBe}X60|g 2 8̘L?5Swpo =:o9z\MXnOЄrW^8}樗n jOXHT7bʼn ' *h,i>bG%.ud7Ye%q~G"@՚Уa*ptf?tmHKr *wîJ gD6BJ3PiЛpݞvArO,n]-ϵM<y#66$csB_Xm)'א@OP ;-Х]Kjwetb.ˤ60L<ƠZ;!ROWJ f\N3k] kO 2ģ8 [&TThNQyqY:ߙh)E~`A3̈́)gq{IDr~(7mmE**=XC(9zYṀd=)Q#jrw;RFGiB$RuPHYe}DB+h@LJ/P5"ì9W<#w!:{ʜkv?'G2G܋v{JUOjHB%% !Yb q4V9P7wYsjՕp"}`V!g$L>ySZ5䆱d̕GI~?Jw)M0{/B[pE.yAK擻klwpnQܕ\[zhu(nI\.BG%`㹪_"$(F%]rZzÖs.J,Y":>G/`OykW'wv0jauX DA@76tz>_~*OjYqJI&(ʏde޻L\fl;A/T<^*QnE{l=(qdk9NXkH]fl :BE" 魚' ;@)s'_W&s} yMA{415櫮3M%)KKcnc%:yh Z/ӡ ٳyHA( B %U(]uPe[d}t3+YUڳ5b!4f}?"EKV:Sd?j,ɼI/| 靷t~QrDJ'I$^U(ٟ ^iD*{WfN2 6F:zݜxܼ0 ݜc-SK첦Z$z҄/.7{ ~o #&os/vsBf#4w 7P)ȍGtR>FJԿۓ$ d]j?v*4DЗK7Hd  5y(SK9^2ـh&/ O\p5y4s i΢HΦHcL%OLG¨F{R0dt*B!Fv@AZ~%ۥx ;D>S8Ъbx՘)L (m_E_6ڄtI;@#w0v]aMJ*EbRzU@@_JN`Gg5(bItT2vY_zk|o(v`yѳT6r0MaȎhv O7Ro9Bep: (ȲtO fqplEAQ|JC%B5t/lf}TeP}DEZ h0j>X̝)Pɧ&8j] ,)w[ DjLv38+K=V)L҂{ۓ$€aJJe՝<{ZV;{'\Ū 3]R-4ώ $a8?$+fyR[/wwG#4īJ>'Oo&*b,LOi"k0` GZ ΃aP /oFRt],QF/DzWٕc|9E椤Np6,U M3I}8e21~x~iIfA Ρc4H>܀AkiZ?БW颛r#E$H'B:CK "y? w~a(sTy 9R !qZQAq&EaQ?^^ pY)R oii@, ܷ墰n&bg*% uho".# jmE`JX S'0 ڽkMXn_ ?;?ſ;WIjמAZ,qAC ̘[3r7nGT5o/AqrɅ82<ؿ?ls2Zp.l|(}laxԑtwo~U#ע덊(h#Q<{<+#4 i8C-~a8 @>+'E(~:xa.i!ZWZXHi7==eOF"<.E[Tow~k4;ngOm>ڌNDc4%07]?j" '>@bDOPO? PQ"רzmy'X2(1ALãTڭP+e L]ЧnP3tK2 & 2\a,5yXJcE'HƤb`4^\JfTjkaSXԥs< @#Q^} Co_3$#_|tTIa~$8*ͤ\(ݕǎˉTX ns67Ķ)#D]T]Bh7GP)ygzu\a hxk`]f*Pm!?x$/NQja5! Ti&/%Q|)U G&:{&9TdOϥD߱^D̹ KD +:@7I9nHt&#l|J_ޞ\ BNA ܮSqY h9x)P;z7H>$EV^ST޼|vNzOY D,Ͱ PKm eɎhȻ1VFNB &o[*{kwm^.6x-.$4!]m1ƸS1>NzMRjS$?Oݾ_lhYo0^}63fU(|+a2Ꜵ-y&8LRy.cŵ<FѱtEZ(a}ãd&pI 7]j$~XՋyտ6~-p %J Ir1wμsEf&,\暁y@@^:W }wr|@EoaD̆*NFf49 9Xk ]w:{kF 2*?5GjK.\ :yJo0BuDz[d!vRxq>b΁VqS+KDy 0˨c@SZH@ (D,VJwJYd4Z=_c'#h2CLĴZi^e2[r_E0p[\EpؑIA[M7-p\L#;msnf°F'd6,?kC БrP"pPMl~ߔs^rhCRij/B;iӹ4]i1jsTOoeC5ţ6E*IhsI^Hpݞ›[7?,Ňn﹅-(%*.J '3ycRO+ϗGc^ L1vr'z&xa iTgw@3_)a{ߑ3CU97(M1K}Zkf< p;wHl&=Y.#}PJۊiy.m$*@JeqrJj7u.z QH| iL 7IxNArqzHL0!) \m:YK /= @s'%U!FAP)/RJ 0}@Eڛ]Wcz]|bm6_|#ɗT3_yz[䭦xajFAF]I ١S$qP*7KMq>+jIEmEyqF>!@āK)@ͲfJ=$&`6\^XYs Ė C+ +r_k$-F)P OiAphZOf!tva;xC]8O.:7C&):IP+'ӏWV)jFԮ VJ2]|ŸRDS'LnSB̪J1Imsc3Ktgܳ?kvʢkEOK*Q˳1N |V ~_ 770A9 T܋V0hݬ 1u@fSFZd}QD[nݖj/cnjqw6K=ưI9:-:B\.IPÛQZ8F\ڒ QهǠ`sY3?]L@${n-v Ҡci #%i@'>.@{Lx#¦u86Ǹ0aC 視# #E,8*ciGłɞƽ=(xU[  m3,SaAEwCYQ9gwlS-*1.Mqȭxctyt#ٹTyu_`t9wWDzdl wR IDATR6sڼh{0kA"fP}ºqcT=n  m-@_}п9@]NIulzUۉ%DzXv5..yԂ JhOF*6%R#{/eiIh3<]%R׆òea hbkh^oRr ò+uM93"'#$GSLq[7MXnOiHkP&"F Z&Ek HN?,\MΩEDo(!miqe=d(sRЭjw;p@`{gw6*LNVn3Z(ΰ{إ{0}PQza)/4pݞ1†%,̲ m (/C!`EgaMc^&Zl 'G6 ZkVE8iGRWd3eV5SF ނcT3XjTӂ}4j(AQg1 e[:W~M|QU>4@Vmͳ,)IAx,T느dc*2hcv`Wldۃ`yvL)*l#9X,+7 ?_`xSrgNրr:w3'Hz^inB&GgA>rX6NOXctN-5wϏ>z/r._ 5︠" 2 $=.v=z˪^bX"yE{G:_n<%J+V4ɊKF$OnQ_|vJ GM;2~z7;Qu8S<Sh`SJݝ] % o@IozuMou{2<<0)Ulge. .)28&0Y)hfJ+f9JVMMT7ՇTʂ;/Ѻᓘ|-I+A'_ };ꔖ-oٙA&J:4Rcn~tx- PVc^,]ץ~_B1&ͭU;DK $Ǣ&{C#t&4W7w#j\(}YΕH!6^ .юꏌAQ?pR:g~c=PA`R;(Nfc4`A?v oЁث\()XT(Z(窶%(v{$F92%IDDBA Јf< wQh8?|T )@ÄOvsF𢡄AdUq##*wd Iel@[`h%Wmu|7Exv/lt0W,T߄FIs⯺3ٻ,Vޅ4I>O[)5e<gc2DnE9^I`8'![FPt't"avN}>[8*Upd/2ۛ-NeQɼ87|[cژ"ǽˌ![ӺX;퀗=ߗI1!Nua$\6\/!h+ &0·#_UN^/19!72R + ;Sx d4;sS)Ev ;Vp{ ݞ1LotL5Ó>[haa69σXwb6Kh$ m{k&BKEx^E.\*j["q8I&WJƺdҴU 9ht8oL=1ެE ihRfRCh4&,\8s[̋ոf8J# e!Lx7瓽KD%GW#Y(]+F+:ZD 9xy`f($j8^⨂' he"^Zۅ3ay t62,=U+ҁ1>''tJ+%꿝mTc3$!aiqd6)SѸY tSn(S~3 JN3'] LdwX 9{_%0m&>Ъ=)=,45@6%NsC{7ngMvT%Kb҃Pl{fa`># ٶ ÎoA_}+Q ͶRzy"~s݉M ,:RG|,J}I!|f #7_akt5 "5lZh} $٥2\~{3I^lZXWR̋C*ul6\02m?#xHc0 UGU}),49dQ!(2ZKg\Xx)Zi4qbUBޝ @gC~Pʆ;TpX(~Zw!ڵъ H&,\'("(G6P0z-gHv|{ZgR}):% [<"r *unPn[h"Iӎ/2}KFkpe,)kL[һǓHs($DPG,]/y]AEK%?7HԿ'nh%A MÙ=1B\N5[f+2=CD a&~ hJr¥0QY9@C!e)KWʨ)NƦA&D%8ZsPG 1uMa$ʀIƟ < OPh fb?%D$4oOԓ9mp1BR}VPTum+sW141 oKMvIg~dG+, )973#틌'ɰmHh48G#;:SBU.g u;rnw-]_{R|u<7a}mo\1UP|aN% (N@rFفF]lzk(. 724`Z'qfFȎIu4[Mqb3fu`Q[ M `iGYvvnYH՚(ÐLgVkČk$΢(V zKFQul5FN7w_@G^*Ru\V|f$|M^) %4=o-Q`z>!(MaABgg\iA, Pd偍׃-G`dawAvR1?;ZsP+ތv*!7t\Ч/?ExM[$Ͷl8'OD[\WBj.[I&W-0Jb(%UV]7[\<Зlk`YZ>Y:WhZR 0iuD+˽H1VDxM Ɔa#bʠitAa]qnu]~a?}:nZ#K.c(#9H*a /Rr~`p/dۇ)JL a!+=z s^avso4LPh$[cZg79̓;G:yԓ=L*U1ta͖<"ad3߂oqT!CWOڶrNm%nc5l)'ϰPoʎ g܄@;\l ޏ橫}D6$@Up:^}п@z~D$L%c֊-{Zq3xEB_Tcdur|jp&әWH*9QШZV%Ի򐜸u$ ћ蚔BiyZ.Nq,P![֔憎cѷvX}gj/ͷ!RݕYH$Banj,UWTqo$_$}(Я-H?ثaêKiQ' 1ee_XC,i[ڤ|9f-ɠE>wơiV6U\{$Dwm?`˨mfMlz -#vsCƾLcc??9EZO#??Y4 U!V|J-Mb')۪(b'xzt8uN<>)00E/`E3ӂN؈~J"O qp:SՃ5 @90=Ґ)U?g}4žGæGDCS-@d=c +feɤh Bh$u/Z%2&>%Y.[*U?}˺YU2gY|~@3% Pvr Ji;mVxvFN}y`{.V9.i @?˵̟/.2%wDoOC{D}ڤt_g[Ez>ǝ@"BLF9iO.EFXWhg&ۡ~56!4ʥI:]X WssѶ.4e -UÒ=pC+HO ~p~&3pxyP[8Td n%wЌߠp2Z\݈WM]J%fB07NT_PKI8266ĨzI.pwqzU['_#EE"^8*sN|IDIAJt(m748ɢ $cSzUƈ&)yM=>#mCÁ?M1ZP8~O]cgp9_9L&!]?z/3XгUSx9#/ **8KL4 M)xDS}"!4t:]4feڃ@'rԮ_PħlGt p!ḇsIPgnMؙWBR!.]F(uobNi+q3i˂fe;A5N〷m΋}%PzK~4[4AhlQmțiؾ_+>GKӹQNqTS[Klc bNHţn|%]g|yܻTEm [͏h @N)63_tUZM&Cs3u?j}k9q ֙ jU'Ex g1;̴mmKv}%J(&`;}KACS_Hg%H[[[ r1dE3 Ր>@-Bjat=tPr'IQ@0Xzi->jxtY9&TA$[FtZ[K)4 2 7JO7niЃxO_Q]@1")N 4IH5t BbPy ^?KJ)> ˼t2i/XN^x#I~ LzqQ]gK7>:TK'nIVCso/gP`$N5o!zeJֺsZL/(͉GoHa{2-MJ^_ڛ?>kќӻs-\JT773$sNA-; xnJ[ړni/Z0*x$xN7c4DY~k #b}|q4؂ЛWzT{'N?ނU>tO%Qt9GЅϳ>YV-P&E@WWwA%cQ.bR儯8ŪAGMW$J@Ɏ+IhuK}xOHFRٌtQm0=և7cKZm_1>ucS1w]ReG~K)o[8oGrH&wHb;ƐS`w9uHw§V yᠺ_kphi%L׼>A*CB IDAT-@ӵ-E(#%N:TB@+ {Nޘ$#\tb??Ռz葉.&,\_)c+znPL5[>"7M#.!AsG/񥥁oi],.TѻeC