gstat/0000755000176200001440000000000014413517710011377 5ustar liggesusersgstat/NAMESPACE0000644000176200001440000000362413777370515012637 0ustar liggesusersuseDynLib(gstat, gstat_debug_level, gstat_exit, gstat_fit_variogram, gstat_get_variogram_models, gstat_init, gstat_load_ev, gstat_load_variogram, gstat_new_data, gstat_new_dummy_data, gstat_predict, gstat_set_merge, gstat_set_method, gstat_set_set, gstat_variogram, gstat_variogram_values ) importFrom(utils, setTxtProgressBar, stack, txtProgressBar, head, tail) importFrom(stats, as.formula, cor, cov2cor, delete.response, .getXlevels, lm, median, model.extract, model.frame, model.matrix, na.exclude, na.fail, na.omit, na.pass, optim, optimise, optimize, predict, residuals, terms, rnorm, fft, numericDeriv, runif, setNames) importFrom(graphics, image.default, lines, locator, text) importFrom(zoo, is.regular) import(methods) import(lattice) importFrom(zoo, zoo, is.regular) import(sp) import(spacetime) import(FNN) export(as.vgm.variomodel, cross.name, fit.lmc, fit.variogram, fit.variogram.reml, fit.variogram.gls, fit.StVariogram, estiStAni, get.contr, get_gstat_progress, gstat, gstat.cv, "[.gstat", hscat, idw0, krigeTg, krige0, krigeST, krigeSTTg, krigeSimCE, krigeSTSimTB, vgmAreaST, map.to.lev, ossfim, show.vgms, spplot.vcov, variogram, variogramST, extractPar, extractParNames, variogramLine, variogramSurface, vgm, vgmArea, vgmST, vgm.panel.xyplot, panel.pointPairs, set_gstat_progress, xyz2img) exportMethods(krige, idw, krige.cv) S3method("[", gstat) S3method(as.data.frame, variogramCloud) S3method(image, data.frame) S3method(plot, pointPairs) S3method(plot, gstatVariogram) S3method(plot, variogramMap) S3method(plot, variogramCloud) S3method(plot, variogramModel) S3method(plot, StVariogram) S3method(predict, gstat) S3method(print, gstat) S3method(print, gstatVariogram) S3method(print, variogramCloud) S3method(print, variogramModel) S3method(print, StVariogramModel) S3method(variogram, default) S3method(variogram, formula) S3method(variogram, gstat) gstat/demo/0000755000176200001440000000000014336470255012331 5ustar liggesusersgstat/demo/gstat3D.R0000644000176200001440000000116413777370515013775 0ustar liggesusers# $Id: gstat3D.R,v 1.5 2007-02-23 13:34:07 edzer Exp $ # simple demo of 3D interpolation of 50 points with random normal values, # randomly located in the unit cube library(sp) library(gstat) n <- 50 data3D <- data.frame(x = runif(n), y = runif(n), z = runif(n), v = rnorm(n)) coordinates(data3D) = ~x+y+z range1D <- seq(from = 0, to = 1, length = 20) grid3D <- expand.grid(x = range1D, y = range1D, z = range1D) gridded(grid3D) = ~x+y+z res3D <- krige(formula = v ~ 1, data3D, grid3D, model = vgm(1, "Exp", .2)) library(lattice) levelplot(var1.pred ~ x + y | z, as.data.frame(res3D)) rm(n, data3D, range1D, grid3D, res3D) gstat/demo/cosimulation.R0000644000176200001440000000427413777370515015177 0ustar liggesusers# $Id: cosimulation.R,v 1.5 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # cosimulation the four heavy metal variables meuse.g <- gstat(id="zn", formula=zinc~1, data=meuse, nmax = 10, set = list(zero = 1e-10)) meuse.g <- gstat(meuse.g, "cu", copper~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "cd", cadmium~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, "pb", lead~1, meuse, nmax = 10) meuse.g <- gstat(meuse.g, model=vgm(1, "Sph", 900, 1), fill.all=T) x <- variogram(meuse.g, cutoff=1000) meuse.fit = fit.lmc(x, meuse.g) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid, nsim = 2) library(lattice) pl1 <- spplot(z, c(1,2), main = "zinc simulations") pl2 <- spplot(z, c(3,4), main = "copper simulations") pl3 <- spplot(z, c(5,6), main = "cadmium simulations") pl4 <- spplot(z, c(7,8), main = "lead simulations") print(pl1, split = c(1,1,2,2), more=TRUE) print(pl2, split = c(1,2,2,2), more=TRUE) print(pl3, split = c(2,1,2,2), more=TRUE) print(pl4, split = c(2,2,2,2)) # indicator cosimulation for the 9 deciles of zinc: q <- quantile(meuse$zinc, seq(.1,.9,.1)) meuse.i <- gstat(id = "zn1", formula = I(zinc < q[1])~1, data = meuse, nmax = 7, beta = .1, set = list(order = 4, zero = 1e-5)) meuse.i <- gstat(meuse.i, "zn2", I(zinc < q[2])~1, meuse, nmax = 7, beta=.2) meuse.i <- gstat(meuse.i, "zn3", I(zinc < q[3])~1, meuse, nmax = 7, beta=.3) meuse.i <- gstat(meuse.i, "zn4", I(zinc < q[4])~1, meuse, nmax = 7, beta=.4) meuse.i <- gstat(meuse.i, "zn5", I(zinc < q[5])~1, meuse, nmax = 7, beta=.5) meuse.i <- gstat(meuse.i, "zn6", I(zinc < q[6])~1, meuse, nmax = 7, beta=.6) meuse.i <- gstat(meuse.i, "zn7", I(zinc < q[7])~1, meuse, nmax = 7, beta=.7) meuse.i <- gstat(meuse.i, "zn8", I(zinc < q[8])~1, meuse, nmax = 7, beta=.8) meuse.i <- gstat(meuse.i, "zn9", I(zinc < q[9])~1, meuse, nmax = 7, beta=.9) meuse.i <- gstat(meuse.i, model=vgm(1, "Sph", 900, 1), fill.all=T) x <- variogram(meuse.i, cutoff=1000) meuse.fit = fit.lmc(x, meuse.i) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid, nsim = 2, indicators = TRUE) spplot(z, main = "indicator simulations for 9 deciles") gstat/demo/circEmbeddingMeuse.R0000644000176200001440000000625313777370515016206 0ustar liggesusers############################# ## Example: Meuse data set ## ############################# library(sp) library(gstat) data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE # variography empVgm <- variogram(zinc~1, meuse) modVgm <- fit.variogram(empVgm, vgm(150000, "Sph", 1000, 25000)) # unconditional simulation unconSim <- krigeSimCE(zinc~1, newdata = meuse.grid, model = modVgm, n=100) unconSim@data$zinc.simMean <- apply(unconSim@data[,-c(1:5)], 1, mean) spplot(unconSim[,6:20], main="15 out of 100 unconditional simulations") spplot(unconSim, "zinc.simMean", main="mean of 100 unconditional simulations") # conditional simulation conSim <- krigeSimCE(zinc~1, meuse, meuse.grid, modVgm, n=100) conSim@data$zinc.simMean <- apply(conSim@data[,-c(1:5)], 1, mean) spplot(conSim[,6:20], main="15 out of 100 conditional simulations") # compare with kriging predictor simKrige <- krige(zinc~1, meuse, meuse.grid, modVgm) spplot(simKrige, "var1.pred", main="interpolated zinc concentrations") spplot(conSim, "zinc.simMean", main="mean of 100 conditional simulations") ################################################ ## turning bands simulation in space and time ## ################################################ separableModel <- vgmST("separable", space=vgm(0.85,"Exp", 831, 0.15), time =vgm(0.9,"Exp", 3.25, 0.1), sill=135000) attr(separableModel,"temporal unit") <- "days" library(spacetime) stf <- STF(meuse, Sys.time()-20:0*24*3600) stf_grid <- STF(geometry(meuse.grid), stf@time) ################### ## unconditional ## ################### sTime <- Sys.time() krigedSim <- krigeSTSimTB(newdata = stf_grid, modelList = separableModel, nsim = 100, nLyrs = 100) Sys.time() - sTime # plot one simulation along time stplot(krigedSim[,,"sim1"], main="unconditional siumulation") # plot one simulation along time as time series stplot(krigedSim[1:21,,"sim1"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim2"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim3"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim4"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim5"], mode="ts", main="unconditional siumulation") stplot(krigedSim[1:21,,"sim6"], mode="ts", main="unconditional siumulation") # plot the ten simulations of the first day spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE, main="unconditional siumulation") ################# ## conditional ## ################# sTime <- Sys.time() krigedSim <- krigeSTSimTB(formula= zinc ~ 1, data = STFDF(geometry(meuse), stf@time, data.frame(zinc=rep(meuse$zinc, 21))), newdata = stf_grid[1:500,], modelList = separableModel, nsim = 10, nLyrs = 500) Sys.time() - sTime # plot one simulation along time stplot(krigedSim[,1:12], main="conditinal simulation") # plot one simulation along time as time series stplot(krigedSim[1:12,,"sim1"], mode="ts", main="conditinal simulation") # plot the ten simulations of the first day spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE, main="conditinal simulation")gstat/demo/blue.R0000644000176200001440000000154013777370515013411 0ustar liggesusers# how to get the BLUE trend coefficients out of a predict.gstat call? # prepare data library(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # create a manual, non-automatic intercept meuse$Int = rep(1, length(meuse$zinc)) meuse.grid$Int = rep(1, length(meuse.grid$dist)) # create a gstat object without an automatic intercept: g = gstat(formula = log(zinc)~-1+Int+sqrt(dist), data=meuse, model = vgm(1, "Exp", 300)) newdat = meuse.grid[1:2,c("Int", "dist")] gridded(newdat) = FALSE newdat$dist = c(0,1) newdat$Int = c(1,0) # (in the more general case of n predictors, make sure that the matrix with # predictors, or design matrix, equals the identity matrix.) newdat out = as.data.frame(predict(g, newdat, BLUE = TRUE))[,3:4] rownames(out) = c("Intercept", "slope") colnames(out) = c("BLUE", "Variance") out gstat/demo/depend.R0000644000176200001440000000252713777370515013727 0ustar liggesusersrequire(tools) packages_to_check <- function(dep, which = c("Depends", "Imports", "LinkingTo", "Suggests"), recursive = FALSE){ download.file("https://cran.R-project.org/web/packages/packages.rds", "packages.rds", mode="wb") x <- readRDS("packages.rds") x <- x[!duplicated(x[,1]),] packages <- x[,1] rdeps <- package_dependencies(packages = dep, x, which = which, recursive = recursive, reverse = TRUE) paste(apply(x[x[,1] %in% rdeps[[1]], 1:2], 1, paste, collapse="_"), ".tar.gz", sep="") } #RCheck = function(x, URL = "http://ftp5.gwdg.de/pub/misc/cran/src/contrib/") { RCheck = function(x, URL = "https://cran.r-project.org/src/contrib/") { if (!file.exists(x)) download.file(paste(URL, x, sep=""), x) cmd = paste("R CMD check --as-cran ", x, " > ", x, ".log", sep = "") print(cmd) ret = system(cmd) print(ret) ret } result <- packages_to_check("gstat") result sel = TRUE library(parallel) ncores_to_use = 2 cl <- makeCluster(getOption("cl.cores", ncores_to_use)) clusterExport(cl, c("RCheck", "sel", "result")) out = parLapply(cl, result[sel], function(x) RCheck(x)) succ = unlist(out) x = which(succ != 0) result[x] bla = lapply(result[x], function(y) { cat(paste(y, ":\n")) system(paste("tail -20 ",y,".log", sep="")) } ) #result <- packages_to_check("sp", recursive=TRUE) gstat/demo/lnsim.R0000644000176200001440000000332113777370515013603 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # NLKrige: non-linear kriging (e.g. log-normal kriging), simulation based. # arguments: # formula, data, newdata, vgm: see ?krige # trans: transformation and back-transformation function; # summarize: optional, summarize the simulations, see example below; # nmax, nsim: see ?krige # density: number of points to discretize each block PROVIDED BLOCK SIZES # ARE CONSTANT (note that newdata can also be SpatialPolygons -- if newdata is # a grid, cell size is used as block size) NLKrige = function(formula, data, newdata, vgm, trans = c(log,exp), summarize, nmax = 50, nsim = 100, density = 16, ...) { # transform target: target = as.character(as.list(formula)[[2]]) data[[target]] = trans[[1]](data[[target]]) # conditional simulation sample at finer grid: finegrid = spsample(newdata, n = density * length(newdata), type = "regular", offset = c(.5,.5)) sim = krige(formula, data, finegrid, vgm, nmax = nmax, nsim = nsim) # back transform ALL simulations: sim@data = trans[[2]](sim@data) # spatial aggregation of each simulation, taking block MEAN: aggr = aggregate(sim, newdata, mean) # aggregation to summary: if (!missing(summarize)) { ret = apply(aggr@data, 1, summarize, ...) if (is.matrix(ret)) aggr@data = data.frame(t(ret)) else aggr@data = data.frame(ret) } aggr } aggr = NLKrige(zinc~1, meuse, meuse.grid, vgm(.5, "Sph", 900, .1), nmax = 10, summarize = mean) spplot(aggr, main = "expected value of block means") aggr = NLKrige(zinc~1, meuse, meuse.grid, vgm(.5, "Sph", 900, .1), nmax = 10, summarize = quantile, probs = c(0.025, 0.975)) spplot(aggr, main = "95% CI for block means") gstat/demo/uisim.R0000644000176200001440000000226113777370515013611 0ustar liggesusers# $Id: uisim.R,v 1.5 2008-09-25 10:26:00 edzer Exp $ library(sp) library(gstat) # prediction grid: data(meuse.grid) gridded(meuse.grid) = ~x+y # define variable as dummy data v = vgm(.25, "Sph", 900) g = gstat(NULL, "var1", x~1, beta = .5, nmax = 20, model = v, dummy = TRUE) # simulation of a single variable out = predict(g, meuse.grid, nsim = 20, indicators = TRUE) spplot(out) # simulation of two correlated variables: v = vgm(.1, "Sph", 900) g = gstat(g, "var2", x~1, beta = .25, nmax = 20, model = v, dummy = TRUE) v = vgm(-.1, "Sph", 900) g = gstat(g, c("var1", "var2"), model = v) out = predict(g, meuse.grid, nsim = 10, indicators = TRUE, set = list(order = 2)) spplot(out) # merge all 10 individual simulations into three-group factors: for (i in 1:10) { v1 = paste("var1.sim", i, sep = "") v2 = paste("var2.sim", i, sep = "") m = cbind(out[[v1]], out[[v2]], 1 - (out[[v1]]+out[[v2]])) mout = factor(apply(m, 1, function(x) which(x == 1))) if (i == 1) out2 = SpatialPixelsDataFrame(as(out, "SpatialPixels"), data.frame(mout)) else out2[[i]] = mout } names(out2) = paste("sim", 1:10, sep="") spplot(out2) require(RColorBrewer) spplot(out2, col.regions=brewer.pal(3, "Set2")) gstat/demo/stkrige-crossvalidation.R0000644000176200001440000002456513777370515017350 0ustar liggesusers######################################################## # note that demo(stkrige) and demo(stkrige-prediction) # # need to be run before this one # ######################################################## ## cross-validation crossStat <- function(var1, var2="PM10", STxDF=DE_RB_2005, digits=NA) { diff <- STxDF[,,var1,drop=F]@data[[1]] - STxDF[,,var2,drop=F]@data[[1]] RMSE <- sqrt(mean(diff^2)) MAE <- mean(abs(diff)) ME <- mean(diff) COR <- cor(STxDF[,,var1,drop=F]@data[[1]], STxDF[,,var2,drop=F]@data[[1]]) res <- c(RMSE, MAE, ME, COR) names(res) <- c("RMSE", "MAE", "ME", "COR") if(is.na(digits)) return(res) else return(round(res, digits)) } # purely spatial: DE_RB_2005 <- as(DE_RB_2005, "STSDF") pureSp <- NULL for(i in 1:365) { # i <- 1 pureSp <- c(pureSp, krige.cv(PM10~1,DE_RB_2005[,i,"PM10"], model=spVgmMod, nmax=10)$var1.pred) } DE_RB_2005@data$pureSp10Nghbr <- pureSp pureSp <- NULL for(i in 1:365) { # i <- 1 pureSp <- c(pureSp, krige.cv(PM10~1,DE_RB_2005[,i,"PM10"],model=spVgmMod,nmax=50)$var1.pred) } DE_RB_2005@data$pureSp50Nghbr <- pureSp ## spatio-temporal LOOCV target <- as(DE_RB_2005[,,"PM10"],"STFDF") ## seprable model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSepModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sepModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSepModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sepModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## product-sum model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitProdSumModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$psModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitProdSumModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$psModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$metricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$metricModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ## sum-metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSumMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$sumMetricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- array(NA, c(length(DE_RB_2005@sp), 365,2)) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 38 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"],] <- as.matrix(krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSumMetricModel, nmax=50, computeVar=T, stAni=linStAni*1000/24/3600)@data[,c("var1.pred","var1.var")]) } DE_RB_2005@data$sumMetricModel50Nghbr <- as.vector(res[,,1])[!is.na(target@data)] DE_RB_2005@data$sumMetricModel50NghbrVar <- as.vector(res[,,2])[!is.na(target@data)] DE_RB_2005@data$sumMetricModel50Nghbr95u <- apply(DE_RB_2005@data, 1, function(x) { qnorm(0.975, x["sumMetricModel50Nghbr"], sqrt(x["sumMetricModel50NghbrVar"])) }) DE_RB_2005@data$sumMetricModel50Nghbr95l <- apply(DE_RB_2005@data, 1, function(x) { qnorm(0.025, x["sumMetricModel50Nghbr"], sqrt(x["sumMetricModel50NghbrVar"])) }) ## simple sum-metric model # 10 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSimpleSumMetricModel, nmax=10, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$simpleSumMetricModel10Nghbr <- as.vector(res)[!is.na(as.vector(res))] # 50 neighbours res <- matrix(NA, length(DE_RB_2005@sp), 365) for(loc in 1:length(DE_RB_2005@sp)) { # loc <- 1 cat("Location", loc, "\n") res[loc,!is.na(target[loc,])[,"PM10"]] <- krigeST(PM10~1, data=DE_RB_2005[(1:length(DE_RB_2005@sp))[-loc],], newdata=DE_RB_2005[loc,,drop=F], fitSimpleSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600)$var1.pred } DE_RB_2005@data$simpleSumMetricModel50Nghbr <- as.vector(res)[!is.na(as.vector(res))] ### # cross-stats rbind( crossStat("pureSp10Nghbr", digits=2), crossStat("pureSp50Nghbr", digits=2), crossStat("sepModel10Nghbr", digits=2), crossStat("sepModel50Nghbr", digits=2), crossStat("psModel10Nghbr", digits=2), crossStat("psModel50Nghbr", digits=2), crossStat("metricModel10Nghbr", digits=2), crossStat("metricModel50Nghbr", digits=2), crossStat("sumMetricModel10Nghbr", digits=2), crossStat("sumMetricModel50Nghbr", digits=2)) if(paper) { texRow <- function(x) { paste(paste(x,collapse=" & ")," \\\\ \n") } cat(apply(round(rbind(crossStat("pureSp10Nghbr"), crossStat("sepModel10Nghbr"), crossStat("psModel10Nghbr"), crossStat("metricModel10Nghbr"), crossStat("sumMetricModel10Nghbr"), crossStat("simpleSumMetricModel50Nghbr"), crossStat("pureSp50Nghbr"), crossStat("sepModel50Nghbr"), crossStat("psModel50Nghbr"), crossStat("metricModel50Nghbr"), crossStat("sumMetricModel50Nghbr"), crossStat("simpleSumMetricModel50Nghbr") ), 2),1,texRow)) loc <- 38 # sample(68,1) # 15 tw <- "2005-01-15/2005-04-15" png("vignettes/figures/singleStationTimeSeries.png", 9, 4, "in", bg="white", res = 149) plot(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr"], main=paste("Location", DE_RB_2005@sp@data$station_european_code[loc]), ylim=c(0,70)) points(DE_RB_2005[loc,tw][,"PM10"], type="l", col="darkgreen", lty=1) points(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr95u"], type="l", col="darkgrey", lty=2) points(DE_RB_2005[loc,tw][,"sumMetricModel50Nghbr95l"], type="l", col="darkgrey", lty=2) legend("topright",legend = c("observed","sum-metric","95 % prediction band"), lty=c(1,1,2), col=c("darkgreen", "black", "darkgrey") ) dev.off() DE_RB_2005@data$diffPM10 <- DE_RB_2005@data$sumMetricModel50Nghbr - DE_RB_2005@data$PM10 stpl <- stplot(as(DE_RB_2005[,smplDays, "diffPM10"],"STFDF"), col.regions=bpy.colors(5), sp.layout = list("sp.polygons", DE_NUTS1), scales=list(draw=F), key.space="right", colorkey=T, cuts=c(-25,-15,-5,5,15,25), main=NULL) #expression(paste("daily mean ","PM"[10]," concentration"))) png("vignettes/figures/diffs_daily_means_PM10.png", width=9, height=6, "in", res=150) print(stpl) dev.off() }gstat/demo/fulmar.R0000644000176200001440000000517713777370515013762 0ustar liggesusers# $Id: fulmar.R,v 1.3 2006-02-10 19:05:02 edzer Exp $ library(sp) library(gstat) data(fulmar) data(ncp.grid) glm98 <- glm(formula = fulmar ~ depth + coast, family = quasipoisson, data = fulmar[fulmar$year == 1998, ]) glm99 <- glm(formula = fulmar ~ depth + coast, family = quasipoisson, data = fulmar[fulmar$year == 1999, ]) fulmar98 = data.frame(fulmar[fulmar$year == 1998,], pr98 = predict(glm98, type = "response")) fulmar99 <- data.frame(fulmar[fulmar$year == 1999,], pr99 = predict(glm99, type = "response")) pr98.grd <- predict(glm98, newdata = ncp.grid, type = "response", se.fit=TRUE) pr99.grd <- predict(glm99, newdata = ncp.grid, type = "response", se.fit=TRUE) pr <- data.frame(ncp.grid, pr98=pr98.grd$fit, pr99=pr99.grd$fit, se98 = pr98.grd$se.fit, se99 = pr99.grd$se.fit) # B.3 create gstat object g <- gstat(id = "fulmar98", formula = fulmar~pr98, locations = ~x+y, data = fulmar98, model = vgm(1.89629, "Exp", 50000, 0.852478), beta = c(0,1), variance = "mu") g <- gstat(g, id = "fulmar99", formula = fulmar~pr99, locations = ~x+y, data = fulmar99, model = vgm(2.52259, "Exp", 50000, 1.76474), beta = c(0,1), variance = "mu") h <- g h <- gstat(h, id = c("fulmar98","fulmar99"), model = vgm(2.18, "Exp", 50000, 1.22)) # predict block means for blocks in ncp.grid$area (table 2; cokriging) library(maptools) areas.r = readShapePoly(system.file("external/ncp.shp", package="gstat")) #areas.r <- as.SpatialRings.Shapes(areas.shp$Shapes, areas.shp$att.data$WSVGEB_) coordinates(pr) = ~x+y #pr.df = overlay(pr, areas.r, fn = mean) pr.df = na.omit(as(aggregate(pr, areas.r, FUN = mean), "data.frame")) # match non-empty (and relevant) areas: #areas = SpatialPolygonsDataFrame(areas.r[c(2,3,4,16),"WSVGEB_"], pr.df[c(1,2,3,5),])#,match.ID=F) areas = SpatialPolygonsDataFrame(areas.r[c(1,2,12,7),"WSVGEB_"], pr.df[c(1,2,3,5),], match.ID=F) # areas ID's 0 1 2 14 sk = predict(g, areas) cok = predict(h, areas) spplot(cok, c(3,5), names.attr = c("1998", "1999"), main = "Fulmaris glacialis, density estimates\n(by irregular block cokriging)") sk = as.data.frame(sk) cok = as.data.frame(cok) print(data.frame(area = c(1,2,3,16), SK98 = sk$fulmar98.pred, SE98 = sqrt(sk$fulmar98.var), SK99 = sk$fulmar99.pred, SE99 = sqrt(sk$fulmar99.var), CK98 = cok$fulmar98.pred, SE98 = sqrt(cok$fulmar98.var), CK99 = cok$fulmar99.pred, SE99 = sqrt(cok$fulmar99.var)), digits=3) print(data.frame(area = c(1,2,3,16), dSK = sk$fulmar99.pred - sk$fulmar98.pred, SEdSK = sqrt(sk$fulmar98.var+sk$fulmar99.var), dCOK = cok$fulmar99.pred - cok$fulmar98.pred, SEdCOK = sqrt(cok$fulmar98.var+cok$fulmar99.var - 2*cok$cov.fulmar98.fulmar99)), digits=3) gstat/demo/grass.R0000644000176200001440000000325113777370515013602 0ustar liggesusers# $Id: grass.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ # this demo assumes quite a lot: # a. it assumes GRASS gis is running # b. it assumes that the meuse data zinc variable is available as a site list # c. it assumes that mask_map is present, and contains the mask map values # (i.e., the study area) library(sp) library(GRASS) # load R GRASS interface G = gmeta() # retrieves active data base locations and topology d = sites.get(G, "zinc") # retrieve zinc observations plot(d$east, d$north, asp=1) names(d)[4] = "zinc" # rename attribute mask = rast.get hist(d$zinc) hist(log(d$zinc)) mask = rast.get(G, "mask_map") plot(G, mask$mask.map) points(d$east,d$north, pch="+") library(gstat) # load gstat library bubble(d, zcol = "zinc", col=c(4,5), maxsize=2) # explain S formulae: ~ v = variogram(log(zinc)~1, ~east+north, d) plot(v) v.mod = vgm(.6, "Sph", 900, .1) plot(v, model = v.mod) v.fit = fit.variogram(v, v.mod) plot(v, model = v.fit) zinc.g = gstat(NULL, "lzinc", log(zinc)~1, ~east+north, d, model = v.fit) new.data = data.frame(east = east(G), north = north(G)) new.data[is.na(mask$mask.map), ] = c(NA,NA) zinc.kr = predict(zinc.g, new.data) image(zinc.kr) library(lattice) levelplot(lzinc.pred~east+north, zinc.kr, asp=1.34, col.regions=bpy.colors(100)) # push prediction and variances grids back into GRASS data base: rast.put(G, "lzinc.pred", zinc.kr$lzinc.pred) rast.put(G, "lzinc.var", zinc.kr$lzinc.var) # push cross validation residuals back to GRASS data base: xv = krige.cv(log(zinc)~1, ~east+north, d, v.fit, nmax = 40, verb=F) sites.put2(G, data = xv, dims = c("east", "north", "residual", "zscore"), lname = "lzinc.xv") gstat/demo/a2p.R0000644000176200001440000000167713777370515013157 0ustar liggesusersRprof() # import NC SIDS data: library(sp) library(maptools) fname = system.file("shapes/sids.shp", package="maptools")[1] nc = readShapePoly(fname, proj4string = CRS("+proj=longlat +datum=NAD27 +ellps=clrk66")) # reproject to UTM17, so we can use Euclidian distances: library(rgdal) nc = spTransform(nc, CRS("+proj=utm +zone=17 +datum=WGS84 +ellps=WGS84")) # create a target (newdata) grid, and plot: grd = spsample(nc, "regular", n = 1000) class(grd) plot(nc, axes = TRUE) points(grd, pch = 3) library(gstat) # area-to-point kriging: kr = krige0(SID74 ~ 1, nc, grd, vgmArea, ndiscr = 9, vgm = vgm(1, "Exp", 1e5, 0), # point variogram, verbose = TRUE) out = SpatialPixelsDataFrame(grd, data.frame(pred = kr)) pl0 = spplot(nc["SID74"], main = "areas") pl1 = spplot(out, sp.layout = list("sp.polygons", nc, first=F,col='grey'), main = "points on a grid") print(pl0, split = c(1,1,1,2), more = TRUE) print(pl1, split = c(1,2,1,2), more = FALSE) gstat/demo/stkrige-prediction.R0000644000176200001440000001172613777370515016277 0ustar liggesusers########################################################### # note that demo(stkrige) needs to be run before this one # ########################################################### # libraries library(sp) library(spacetime) library(gstat) library(rgdal) animate <- FALSE # interpolation # build a grid over Germany gridDE <- SpatialGrid(GridTopology(DE_RB_2005@sp@bbox[,1]%/%10000*10000, c(10000,10000), cells.dim=ceiling(apply(DE_RB_2005@sp@bbox,1,diff)/10000))) proj4string(gridDE) <- CRS("+init=epsg:32632") fullgrid(gridDE) <- F ind <- over(gridDE, as(DE_NUTS1,"SpatialPolygons")) gridDE <- gridDE[!is.na(ind)] # back scale vgms: fitSepModel$space$range <- fitSepModel$space$range*1000 fitProdSumModel$space$range <- fitProdSumModel$space$range*1000 fitMetricModel$joint$range <- fitMetricModel$joint$range*1000 fitMetricModel$stAni <- fitMetricModel$stAni*1000 fitSimpleSumMetricModel$space$range <- fitSimpleSumMetricModel$space$range*1000 fitSimpleSumMetricModel$joint$range <- fitSimpleSumMetricModel$joint$range*1000 fitSimpleSumMetricModel$stAni <- fitSimpleSumMetricModel$stAni*1000 fitSumMetricModel$space$range <- fitSumMetricModel$space$range*1000 fitSumMetricModel$joint$range <- fitSumMetricModel$joint$range*1000 fitSumMetricModel$stAni <- fitSumMetricModel$stAni*1000 if(animate) { DE_pred <- STF(gridDE, DE_RB_2005@time) predMat <- matrix(NA,0,2) for (rd in 15:180) { # rd <- 15 predMat <- rbind(predMat, krigeST(PM10~1, data=DE_RB_2005[,rd+(-5:5)], # start: 12:24 newdata=DE_pred[,rd,drop=F], computeVar=T, fitSumMetricModel, # nmax=50, stAni=linStAni*1000/24/3600)@data) } DE_pred_winter <- DE_pred[,15:180] DE_pred_winter <- addAttrToGeom(DE_pred_winter, predMat) for(i in 1:length(DE_pred_winter@time)) { # i <- 1 pnt <- spplot(DE_pred_winter[,i], "var1.pred", col.regions=bpy.colors(160)[-(1:9)], scales=list(draw=F), at=c(-5,0:150), sp.layout = list(list("sp.polygons", DE_NUTS1, first=FALSE, col=gray(0.5)), list("sp.points", DE_RB_2005[,i+14], col=gray(0.25), pch=3, cex=.5)), main=as.character(index(DE_pred_winter[,i,drop=F]@time))) png(file=paste("vignettes/figures/animate/pred",i,".png", sep=""), width=6, height=6, "in", res=150) print(pnt) dev.off() } } DE_pred <- STF(gridDE, DE_RB_2005@time[smplDays]) tIDS <- unique(pmax(1,pmin(as.numeric(outer(-5:5, smplDays, "+")), 365))) sepPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitSepModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) psPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitProdSumModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) metPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) sumPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], newdata=DE_pred, fitSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) smplSumPred <- krigeST(PM10~1, data=DE_RB_2005[,tIDS], # start: 12:24 newdata=DE_pred, fitSimpleSumMetricModel, nmax=50, stAni=fitMetricModel$stAni/24/3600) # pure spatial prediction pureSpPred <- matrix(NA, nrow=length(gridDE), length(smplDays)) col <- 1 for(i in smplDays) { # i <- 1 pureSpPred[,col] <- krige(PM10~1, as(DE_RB_2005, "STSDF")[,i], gridDE, model=spVgmMod, nmax=50)$var1.pred col <- col+1 } pureSpPred <- STFDF(gridDE, DE_RB_2005@time[smplDays], data.frame(var1.pred = as.numeric(pureSpPred))) DE_RB_2005 <- as(DE_RB_2005, "STFDF") if(paper) { stpl <- stplot(smplSumPred, col.regions=bpy.colors(120)[-(1:20)], scales=list(draw=F), main=NULL, at=0:70, # "spatio-temporal sum-metric model" sp.layout = list(list("sp.polygons", DE_NUTS1, first=FALSE, col=gray(0.5)), list("sp.points", DE_RB_2005@sp, col=gray(0.25), pch=3, cex=.5))) png(file="vignettes/figures/pred_daily_means_PM10.png", width=9, height=6, "in", res=150) print(stpl) dev.off() } else { stplot(pureSpPred, col.regions=bpy.colors, scales=list(draw=F), main="pure spatial daily prediction") stplot(sepPred, col.regions=bpy.colors(), scales=list(draw=F), main="spatio-temporal separable model") stplot(psPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal product-sum model") stplot(metPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal metric model") stplot(sumPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal sum-metric model") stplot(smplSumPred, col.regions=bpy.colors, scales=list(draw=F), main="spatio-temporal simple sum-metric model") }gstat/demo/a2pinST.R0000644000176200001440000000210313777370515013736 0ustar liggesusers## area2point in space and time library(sp) library(gstat) data("meuse") coordinates(meuse) <- ~x+y data("meuse.grid") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE meuse.coarse.grid <- SpatialGrid(GridTopology(meuse.grid@grid@cellcentre.offset, c(600,600), c(5, 7))) separableModel <- vgmST("separable", space=vgm(0.85,"Exp", 831, 0.15), time =vgm(0.9,"Exp", 3.25, 0.1), sill=135000) attr(separableModel,"temporal unit") <- "days" library(spacetime) stf <- STF(meuse[sample(155, 25),], Sys.time()-2:0*24*3600) stf_grid <- STF(geometry(meuse.coarse.grid), stf@time) krigedSim <- krigeSTSimTB(newdata = stf_grid, modelList = separableModel, nsim = 1, nLyrs = 100) # area-to-point kriging: a2pST = krigeST(sim1 ~ 1, krigedSim, stf, modelList = vgmAreaST, ndiscr = 9, model = separableModel, # point variogram, verbose = TRUE) p1 <- stplot(krigedSim, color.key=F) p2 <- stplot(a2pST, color.key=F) print(p1, position=c(0,0.5,1,1), more=TRUE) print(p2, position=c(0,0,1,0.5)) gstat/demo/zonal.R0000644000176200001440000000063513777370515013611 0ustar liggesusers library(sp) demo(meuse,ask=FALSE,echo=FALSE) library(gstat) v = variogram(log(zinc)~1, meuse, alpha = c(0,45,90,135)) vm = vgm(.25, "Sph", 1000, anis = c(45, 0.5)) plot(v, vm, main = "geometric") zonal = vgm(.5, "Sph", 1e9, anis = c(45, 1/1e6)) # range is 1e9, effectively infinity, in 45 direction; # it is 1e9/1e6 = 1000 in 135 direction. vm = vgm(.25, "Sph", 1000, add.to = zonal) plot(v, vm, main = "zonal") gstat/demo/wind.R0000644000176200001440000000340013777370515013420 0ustar liggesusers#pdf("wind.pdf") # PLEASE read the vignette of package spacetime for a more # clever way to do all this! library(sp) library(gstat) library(rgdal) library(maptools) # load wind data, run test: example(wind) m = map2SpatialLines( map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=F)) proj4string(m) = "+proj=longlat +datum=WGS84 +ellps=WGS84" m = spTransform(m, CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84")) # model temporal autocorrelation acf(wind[7]) tdiscr = 0:40 lines(tdiscr, exp(- tdiscr/1.5)) # set up data, last year years = 61 months = 1 jday = c(1,6,11,16,21,26) sel = wind[wind$year %in% years & wind$month %in% months & wind$jday %in% jday,] #stations = 4:15 stations = 4:15 sels = stack(sel[stations]) sels$t = rep(sel$jday, length(stations)) sels$x = coordinates(wind.loc)[match(sels$ind, wind.loc$Code),1] sels$y = coordinates(wind.loc)[match(sels$ind, wind.loc$Code),2] summary(sels) coordinates(sels) = ~x+y proj4string(sels) = "+proj=longlat +datum=WGS84 +ellps=WGS84" sels = spTransform(sels, CRS("+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84")) grd = makegrid(m, n = 1000) grd$t = rep(1, nrow(grd)) coordinates(grd) = ~x1+x2 gridded(grd)=TRUE proj4string(grd) = proj4string(sels) #sels = as(sels, "data.frame") # setup grid covfn = function(x, y = x) { u = spDists(coordinates(x), coordinates(y)) t = abs(outer(x$t,y$t,"-")) 0.6 * exp(-u/750000) * exp(-t/1.5) } for (i in 1:120) { grd$t = rep(i/4, nrow(grd)) n = paste("t", i/4, sep="") grd[[n]] = krige0(sqrt(values)~1, sels, grd, covfn) } grd$t = NULL #grd$pr = out$pred #library(lattice) #levelplot(pr~x1+x2|t,grd,col.regions=bpy.colors()) spl = list(list("sp.points", sels,first=F, cex=.5), list("sp.lines", m, col='grey')) spplot(grd, sp.layout = spl, col.regions=bpy.colors()) gstat/demo/rep.R0000644000176200001440000000131113777370515013244 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x + y data(meuse.grid) coordinates(meuse.grid) = ~x + y # Variogram log Zn lzn.vgm = variogram(log(zinc) ~ 1, meuse) lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) #Conditional simulation nsim = 100 lzn.sim = krige(log(zinc) ~ 1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = nsim) # Variogram of all relizations m = out = list() for (i in 1:nsim) { s = paste("sim", i, sep="") f = as.formula(paste(s, "~1")) v = variogram(f, lzn.sim) v$id = rep(s, nrow(v)) out[[s]] = v m[[s]] = fit.variogram(v, lzn.fit) } plot(do.call(rbind, out), m, layout=c(10,10), skip = FALSE, scales = list(y = list(relation = "same"))) gstat/demo/sftime.R0000644000176200001440000000415114314525261013736 0ustar liggesusers## FNN local prediction ######################## library(sp) library(spacetime) library(gstat) library(lattice) # create n space-time points over [0,1] x [0,1] x [Now, Now+some days] t0 = Sys.time() # now n = 1000 set.seed(13131) # fix outcomes x = runif(n) y = runif(n) t = t0 + 1e6 * runif(n) z = rnorm(n) stidf = STIDF(SpatialPoints(cbind(x,y)), sort(t), data.frame(z=z)) stplot(stidf, number=21, main="random spatio-temporal noise") library(sftime) sft = st_as_sftime(stidf) # create a regular 20 x 20 x 10 grid of prediction locations: grd = as(SpatialGrid(GridTopology(c(0.025,0.025), c(.05, .05), c(20,20))), "SpatialPixels") tgrd = seq(min(t)+10000, max(t)-10000, length.out = 10) stf = STF(grd, tgrd) #stf = STFDF(grd, tgrd, data.frame(x=rep(0,400*10))) library(stars) st = st_as_stars(stf) # define a variogram model sumMetricModel <- vgmST("sumMetric", space=vgm(1/6, "Sph", 0.25, 1/60), time =vgm(2/6, "Exp", 1e5, 1/60), joint=vgm(0.4, "Exp", 0.3, 0.1), stAni=1/1e6) attr(sumMetricModel, "temporal unit") <- "secs" dg <- data.frame(spacelag=rep(c(0.001,1:10)/10,6), timelag=rep(0:5*50e3, each=11)) #wireframe(model~spacelag+timelag, # variogramSurface(sumMetricModel, dist_grid = dg), # scales=list(arrows=F), # drape=T, col.regions=bpy.colors(), # zlim=c(0,1.2), # main="imposed sum-metric model") locKrig_sft <- krigeST(z~1, sft, st, sumMetricModel, nmax=20, computeVar = T) locKrig <- krigeST(z~1, stidf, stf, sumMetricModel, nmax=20, computeVar = T) stplot(locKrig[,,"var1.pred"], col.regions=bpy.colors(), scales=list(draw=T)) plot(locKrig_sft[1], col = sf.colors(), breaks = "equal") stplot(locKrig[,,"var1.var"], col.regions=bpy.colors(), scales=list(draw=T)) plot(locKrig_sft[2], col = sf.colors(), breaks = "equal") st$foo = 0 st_as_sf(st, long = TRUE) |> st_as_sftime() -> st.sftime locKrig_sft <- krigeST(z~1, sft, st.sftime, sumMetricModel, nmax=20, computeVar = T) plot(locKrig_sft["var1.pred"]) gstat/demo/stkrige.R0000644000176200001440000002317013777370515014135 0ustar liggesusers# Ben Graeler, 25 th March, 2016 # # Script reproducing the fit of the vignette "spatio-temporal-kriging # libraries library(sp) library(spacetime) library(gstat) library(rgdal) # load data from package gstat data(DE_RB_2005, package = "gstat") paper <- FALSE set.seed(123) smplDays <- sort(sample(365,8)) # load German boundaries data(air) DE_NUTS1 <- spTransform(DE_NUTS1, CRS("+init=epsg:32632")) if(!paper) plot(DE_NUTS1) # station wise coverage if(!paper) barplot(sort(table(DE_RB_2005@index[,1])), main="reported days per station", ylab="number of days", xaxt="n") # acf if(!paper) { acf(DE_RB_2005[sample(68,1),,drop=F]@data) var(DE_RB_2005@data$PM10) } # a few daily snapshots if(paper) png("vignettes/figures/daily_means_PM10.png", width=9, height=6, "in", res=150) stplot(as(DE_RB_2005[,smplDays],"STFDF"), col.regions=bpy.colors(120)[-(1:20)], sp.layout = list("sp.polygons", DE_NUTS1), scales=list(draw=F), key.space="right", colorkey=T, cuts=0:70, main=NULL) if(paper) dev.off() # number of stations length(DE_RB_2005@sp) # calculate the empirical variogram empVgm <- variogramST(PM10~1, DE_RB_2005, tlags=0:6) if(!paper) { plot(empVgm, wireframe=T, scales=list(arrows=F)) plot(empVgm) } # fit of theoretical purely spatial models # ############################################ spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram", "data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spVgmMod <- fit.variogram(spEmpVgm, vgm(80,"Exp",300000,20)) if(!paper) plot(spEmpVgm, spVgmMod) # fit of theoretical spatio-temporal models # ############################################# linStAni <- estiStAni(empVgm, c(50000,200000)) if(!paper) { plot(gamma~dist, empVgm[empVgm$timelag == 0,], ylim=c(0,100), xlim=c(0,800000)) points(empVgm[empVgm$spacelag == 0,]$timelag*linStAni, empVgm[empVgm$spacelag == 0,]$gamma, col="red") } ## # rescale empVgm and linStAni to km for estimation empVgm$dist <- empVgm$dist/1000 empVgm$avgDist <- empVgm$avgDist/1000 empVgm$spacelag <- empVgm$spacelag/1000 linStAni <- linStAni/1000 # separable separableModel <- vgmST("separable", space=vgm(0.9,"Exp", 200, 0.1), time =vgm(0.9,"Sph", 3.5, 0.1), sill=120) fitSepModel <- fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale=c(100,1,10,1,100)), lower = c(10,0,.1,0,0.1), upper = c(2000,1,12,1,200)) attr(fitSepModel, "optim.output")$value # Exp+Exp: 9.87, Exp+Sph: 6.82, Sph+Exp: 10.42, Sph+Sph: 7.50 if(!paper) plot(empVgm, fitSepModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # product-sum prodSumModel <- vgmST("productSum", space=vgm(10, "Exp", 200, 1), time= vgm(10, "Sph", 2, 1), k=2) fitProdSumModel <- fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale = c(1,10,1,1,0.1,1,10)), lower = rep(0.0001,7)) attr(fitProdSumModel, "optim.output")$value # Exp+Exp: 10.09, Exp+Sph: 6.91, Sph+Exp: 10.64, Sph+Sph: 7.59 plot(empVgm, fitProdSumModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # metric metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa=0.6), stAni = 60) fitMetricModel <- fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = linStAni, method = "L-BFGS-B", control = list(parscale = c(10,20,5,10)), lower = c(80,50,5,50), upper = c(200,1500,60,300)) attr(fitMetricModel, "optim.output")$value # Exp: 10.25, Sph: 10.59, # Gau: 21.32, Mat 5: 18.20, Mat 2: 14.43, Mat 1.25: 12.04, # Mat 1: 11.07, Mat 0.75: 10.23, Mat 0.6: 10.05 if(!paper) plot(empVgm, fitMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,135)) # simplified sumMetric model? sumMetricFromsimpleSumMetric <- function(vgm) { vgmST("sumMetric", space=vgm(vgm$space$psill, vgm$space$model, vgm$space$range, vgm$nugget/3), time =vgm(vgm$time$psill, vgm$time$model, vgm$time$range, vgm$nugget/3), joint=vgm(vgm$joint$psill, vgm$joint$model, vgm$joint$range, vgm$nugget/3), stAni=vgm$stAni) } simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120,"Sph", 150), time =vgm(120,"Exp", 10), joint=vgm(120,"Sph", 150), nugget=10, stAni=150) fitSimpleSumMetricModel <- fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni=linStAni, method = "L-BFGS-B", lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget=0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000, nugget = 100, anis = 1000), control = list(parscale = c(1,10,1,1,1,100,1,10))) attr(fitSimpleSumMetricModel, "optim.output")$value # Exp+Exp+Exp: 4.10 Exp+Sph+Exp: 3.60 Sph+Exp+Exp: 3.94 Sph+Sph+Exp: 3.32 # Exp+Exp+Sph: 3.74 Exp+Sph+Sph: 3.98 Sph+Exp+Sph: 3.31 Sph+Sph+Sph: 3.56 if(!paper) plot(empVgm,fitSimpleSumMetricModel, wireframe = T, scales = list(arrows = F), all = T , zlim=c(0,130)) # sum-metric # sumMetricModel <- sumMetricFromsimpleSumMetric(fitSimpleSumMetricModel) sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fitSumMetricModel <- fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni=linStAni, method = "L-BFGS-B", lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st= 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1E3, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5E3, nugget.st = 20, anis = 500), control = list(parscale = c(1,100,1,1,0.5,1,1,100,1,100), maxit=1e4)) attr(fitSumMetricModel, "optim.output")$value # Exp+Exp+Exp: 4.10 Exp+Sph+Exp: 3.60 Sph+Exp+Exp: 3.89 Sph+Sph+Exp: 3.32 # Exp+Exp+Sph: 3.74 Exp+Sph+Sph: 3.73 Sph+Exp+Sph: 3.31 Sph+Sph+Sph: 3.36 if(!paper) plot(empVgm, fitSumMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,130)) if(!paper) plot(empVgm,fitSumMetricModel, wireframe=T, all=T, scales=list(arrows=F), zlim=c(0,130)) if(paper) png("vignettes/figures/allVgmsWireframe.png", 9, 6, "in", bg="white", res = 150) plot(empVgm, list(fitSepModel, fitProdSumModel, fitMetricModel, fitSumMetricModel, fitSimpleSumMetricModel), wireframe=T, all=T, zlim=c(0,140), ylim=c(0,6.1), xlim=c(0,300), scales=list(arrows = F, cex=.8, x=list(at=0:3*100), y=list(at=0:6, labels=c("0 ","","2 ","","4 ","","6 ")), z=list(at=0:5*25, labels=c("0 ","","50 ","","100 ",""))), at=0:100*1.4, xlab=list("space [km]", rot=27, cex=0.8), ylab=list("time [days]", rot=-40, cex=0.8), zlab=list(NULL, rot=94, cex=0.8)) if(paper) dev.off() if(paper) png("vignettes/figures/allVgmsDiffWireframe.png", 9, 6, "in", bg="white", res = 150) plot(empVgm, list(fitSepModel, fitProdSumModel, fitMetricModel, fitSumMetricModel, fitSimpleSumMetricModel), wireframe=T, all=T, zlim=c(-10,25), ylim=c(0,6.1), xlim=c(0,300), diff=TRUE, scales=list(arrows = F, cex=.8, x=list(at=0:3*100), y=list(at=0:6, labels=c("0 ","","2 ","","4 ","","6 ")), z=list(at=-2:5*5, labels=c("-10 ","","0 ","","10 ","","20 ",""))), xlab=list("space [km]", rot=27, cex=0.8), ylab=list("time [days]", rot=-40, cex=0.8), zlab=list(NULL, rot=94, cex=0.8)) if(paper) dev.off() if(paper) { library(lattice) spacelag <- rep(0:300, 13) timelag <- rep(0:12/2,each=301) cplot <- contourplot(model~spacelag+timelag|type, rbind(cbind(variogramSurface(fitSumMetricModel, data.frame(spacelag=spacelag, timelag=timelag)), data.frame(type = rep("variogram of the sum-metric model", length(spacelag)))), data.frame(spacelag=spacelag, timelag=timelag, gamma=sqrt(spacelag^2+116^2*timelag^2)/10, type="metric distance [10 km]")), at=0:15*10, xlab="space [km]", ylab="timelag [days]") png("vignettes/figures/vgmVsMetricDist.png", 9, 4, "in", bg="white", res = 150) print(cplot) dev.off() }gstat/demo/line.R0000644000176200001440000000302713777370515013413 0ustar liggesuserslibrary(sp) library(gstat) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y # choose arbitrary line over the grid: image(meuse.grid["dist"],axes=T) pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) plot(Sl,add=T,col='green') # use the default spsample arguments of predict.gstat: pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) plot(pts, pch=3, cex=.2, add=T) v = vgm(.6, "Sph", 900, .06) out1 = krige(log(zinc)~1, meuse, Sl, v) out1 points(180333,332167,pch=3,cex=2) # use the same line as block discretization, and predict for (0,0) # (because the block discretizing points are not centered) out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) out2 compare.krigingLines = function(formula, data, newdata, model) { out1 = krige(formula, data, newdata, model) pts = spsample(newdata, n=500, 'regular', offset=.5) out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) print("difference:") as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] } compare.krigingLines(log(zinc)~1, meuse, Sl, v) # one line, consisting of two line segments: pp2 = rbind(c(181000,333500),c(181000,332500)) Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) krige(log(zinc)~1, meuse, Sl2, v) compare.krigingLines(log(zinc)~1, meuse, Sl2, v) # two seperate line segments: Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) krige(log(zinc)~1, meuse, Sl3, v) gstat/demo/lhs.R0000644000176200001440000000217213777370515013252 0ustar liggesuserslibrary(sp) library(gstat) # roughly follows the case presented in: # E.J. Pebesma and G.B.M. Heuvelink, 1999. Latin hypercube sampling # of Gaussian random fields. Technometrics 41 (4), pp. 303-312. data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y gridded(meuse.grid) = ~x+y x <- variogram(log(zinc) ~ 1, meuse) v <- vgm(.5, "Sph", 800, nug = .1) v.fit = fit.variogram(x, model = v) plot(x, model = v.fit) n = 100 ok = krige(log(zinc)~1, meuse, meuse.grid, v.fit, nmax=40) sim = krige(log(zinc)~1, meuse, meuse.grid, v.fit, nsim = n, nmax=40) simo = t(apply(as.data.frame(sim)[1:n], 1, order)) # rank order nr = nrow(simo) # number of prediction locations simo = (simo - 1.0 + matrix(runif(n * nr), nr, n))/n summary(simo) # LHS on uniform [0,1] distribution; back to Gaussian: lhs = t(apply(cbind(ok$var1.pred, sqrt(ok$var1.var), simo), 1, function(x) qnorm(x[-(1:2)], x[1], x[2]))) sim2 = sim sim2@data = data.frame(lhs) spplot(sim2[1:10], main = 'lhs', col.regions=bpy.colors()) # verify that simulated and true mean/var are close: m = apply(lhs, 1, mean) v = apply(lhs, 1, var) summary(m - ok$var1.pred) summary(v - ok$var1.var) gstat/demo/cc.R0000644000176200001440000000100213777370515013040 0ustar liggesuserslibrary(sp) demo(meuse, ask = FALSE, echo = FALSE) library(gstat) # use collocated data: g = gstat(NULL, "lzinc", log(zinc)~1, meuse) g.coll = gstat(g, "dist", dist~1, meuse, nmax = 1, merge = c("lzinc", "dist")) g.fit = fit.lmc(variogram(g.coll), g.coll, vgm(1, "Sph", 900, 1), correct.diagonal = 1.01) g.non_coll = gstat(g, "dist", dist~1, meuse.grid, nmax = 1, merge = c("lzinc", "dist")) g.non_coll$model = g.fit$model # collocated cokriging: pr = predict(g.non_coll, meuse.grid) spplot(pr[c(1,3)]) gstat/demo/block.R0000644000176200001440000000254013777370515013555 0ustar liggesusers# $Id: block.R,v 1.5 2006-02-10 19:05:02 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y vgm.fit = fit.variogram(variogram(zinc~1, meuse), vgm(1, "Sph", 800, 1)) bl0 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit, block = c(0,0)) bl1 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit, block = c(40,40)) bl2 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit,block = c(100,100)) bl3 = krige(zinc~1, meuse, meuse.grid, model = vgm.fit,block = c(400,400)) bl0$"block=0x0" = bl0$var1.pred bl0$"block=40x40" = bl1$var1.pred bl0$"block=100x100" = bl2$var1.pred bl0$"block=400x400" = bl3$var1.pred plt1 = spplot(bl0, 3:6, layout=c(4,1), col.regions=bpy.colors(), main = "kriging predictions") bl0$"block=0x0" = bl0$var1.var bl0$"block=40x40" = bl1$var1.var bl0$"block=100x100" = bl2$var1.var bl0$"block=400x400" = bl3$var1.var plt2 = spplot(bl0, 3:6, layout=c(4,1), col.regions=bpy.colors(), main = "kriging standard errors") print(plt1, split = c(1, 1, 1, 2), more = T) print(plt2, split = c(1, 2, 1, 2), more = F) # block krige the full area: bl = krige(zinc~1, meuse, newdata = SpatialPoints(data.frame(x=0,y=0)), model = vgm.fit, block = coordinates(meuse.grid)) bl # block kriging standard error: sqrt(bl$var1.var) # classical statistical standard error of mean: sqrt(var(meuse$zinc)/155) gstat/demo/ugsim.R0000644000176200001440000000126713777370515013614 0ustar liggesusers# $Id: ugsim.R,v 1.2 2006-02-10 19:05:02 edzer Exp $ library(sp) library(gstat) # prediction grid: data(meuse.grid) gridded(meuse.grid) = ~x+y # define variable as dummy data (parameters from log-zinc, meuse) v = vgm(.55, "Sph", 900, .05) g = gstat(NULL, "var1", lzn~1, beta = 5.9, nmax = 20, model = v, dummy = TRUE) # simulation of a single variable out = predict(g, meuse.grid, nsim = 20) spplot(out) # simulation of two negatively correlated variables: v = vgm(.55, "Sph", 900, .05) g = gstat(g, "var2", x~1, beta = 5.9, nmax = 20, model = v, dummy = TRUE) v = vgm(-.3, "Sph", 900, 0.00001) g = gstat(g, c("var1", "var2"), model = v) out = predict(g, meuse.grid, nsim = 10) spplot(out) gstat/demo/localKrigeST.R0000644000176200001440000000311513777370515015005 0ustar liggesusers## FNN local prediction ######################## library(sp) library(spacetime) library(gstat) library(lattice) # create n space-time points over [0,1] x [0,1] x [Now, Now+some days] t0 = Sys.time() # now n = 1000 set.seed(13131) # fix outcomes x = runif(n) y = runif(n) t = t0 + 1e6 * runif(n) z = rnorm(n) stidf = STIDF(SpatialPoints(cbind(x,y)), sort(t), data.frame(z=z)) stplot(stidf, number=21, main="random spatio-temporal noise") # create a regular 20 x 20 x 10 grid of prediction locations: grd = as(SpatialGrid(GridTopology(c(0.025,0.025), c(.05, .05), c(20,20))), "SpatialPixels") tgrd = seq(min(t)+10000, max(t)-10000, length.out = 10) stf = STF(grd, tgrd) # define a variogram model sumMetricModel <- vgmST("sumMetric", space=vgm(1/6, "Sph", 0.25, 1/60), time =vgm(2/6, "Exp", 1e5, 1/60), joint=vgm(0.4, "Exp", 0.3, 0.1), stAni=1/1e6) attr(sumMetricModel, "temporal unit") <- "secs" dg <- data.frame(spacelag=rep(c(0.001,1:10)/10,6), timelag=rep(0:5*50e3, each=11)) wireframe(model~spacelag+timelag, variogramSurface(sumMetricModel, dist_grid = dg), scales=list(arrows=F), drape=T, col.regions=bpy.colors(), zlim=c(0,1.2), main="imposed sum-metric model") locKrig <- krigeST(z~1, stidf, stf, sumMetricModel, nmax=50, computeVar = T) stplot(locKrig[,,"var1.pred"], col.regions=bpy.colors(), scales=list(draw=T)) stplot(locKrig[,,"var1.var"], col.regions=bpy.colors(), scales=list(draw=T))gstat/demo/pcb.R0000644000176200001440000001123413777370515013227 0ustar liggesusers# $Id: pcb.R,v 1.9 2008-02-01 22:39:44 edzer Exp $ # FIGURE 1: library(sp) library(gstat) library(maptools) library(lattice) data(pcb) coordinates(pcb) = ~x+y data(ncp.grid) gridded(ncp.grid) = ~x+y wsv = readShapePoly(system.file("external/ncp.shp", package="gstat")) classes = c(.2,1,2,5,10,20) print(xyplot(y ~ x | as.factor(year), groups = sqrt(PCB138)/3, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { sp.polygons(wsv, col = grey(.5)) panel.xyplot(x, y, cex = groups[subscripts], ...) }, xlab = "x-coordinate", ylab = "y-coordinate", key = list(corner = c(0,0), x=0.8, y=0.25, points = list(pch = 1, col = 1, cex = sqrt(classes)/3), text = list(as.character(classes))), aspect = "iso", as.table = T, xlim = c(464000, 739000), ylim = c(5696500, 6131500), scales = list(draw = F))) # FIGURE 2: pcb$yf = as.factor(pcb$year) pcb$int = rep(NA, dim(pcb)[1]) c = lm(log(PCB138)~-1+depth+yf,pcb)$coefficients i = 2 for (f in levels(pcb$yf)) { pcb$int[pcb$yf == f] = c[i] i = i+1 } print(xyplot(log(PCB138)~depth | as.factor(year), groups = int, data = as.data.frame(pcb), panel = function(x, y, groups, subscripts, ...) { # panel.grid(h=-1, v= 2) panel.xyplot(x, y) y = c(groups[subscripts][1], groups[subscripts][1] + -0.0641*45) llines(c(0, 45), y, lty = 2) }, scales = list( y = list(at=log(c(.2, .5, 1, 2, 5, 10, 20)), labels=c(".2",".5","1","2","5","10","20"), alternating = F) ), xlab = "water depth", ylab = "PCB138", as.table = T) ) # FIGURE 3: # ps.options(width=2, height=2) pcb$res=residuals(lm(log(PCB138)~year+depth, pcb)) v3 = variogram(res ~ year, pcb, dX=.1, bound=c(0,1000,3000,5000,(1:16)*10000)) print(plot(v3, model = vgm(.224,"Exp",17247,.08), plot.numbers = TRUE)) # FIGURE 4: # next g.pcb = NULL merge = list(c("P1986", 2, "P1991", 2), c("P1986", 2, "P1996", 2), c("P1986", 2, "P2000", 2)) for (f in levels(pcb$yf)[c(1,4,6,7)]) g.pcb= gstat(g.pcb, paste("P", as.character(f), sep = ""), log(PCB138)~depth, pcb[pcb$yf == f,], merge = merge) g.pcb = gstat(g.pcb, model = vgm(.224,"Exp",17247,.08), fill.all=T) v = variogram(g.pcb, cutoff=1e5) #plot(v, model = fit.lmc(v, g)) #plot(v, model = g,plot.numbers = TRUE) PCB.cor = matrix(NA, 4,4) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { A = log(pcb[pcb$yf == x,]$PCB138) B.tmp = krige(PCB138~1, pcb[pcb$yf == y,], pcb[pcb$yf == x,], nmax = 1, set=list(debug=0)) B = log(B.tmp$var1.pred) # print(paste(x, y, cor(A,B))) PCB.cor[i,j] = cor(A,B) j = j + 1 } i = i + 1 } years=c(1986,1991,1996,2000) dimnames(PCB.cor)=list(years,years) PCB.cor.ns = PCB.cor PCB.cor = 0.5 * (PCB.cor + t(PCB.cor)) i = 1 for (x in levels(pcb$yf)[c(1,4,6,7)]) { j = 1 for (y in levels(pcb$yf)[c(1,4,6,7)]) { if (j > i) { name = paste(paste("P", x, sep=""), paste("P", y, sep=""),sep = ".") print(name) g.pcb$model[[name]]["psill"] = g.pcb$model[[name]]["psill"] * PCB.cor[i,j] } j = j + 1 } i = i + 1 } print(plot(v, model = g.pcb, plot.numbers = FALSE)) print(PCB.cor.ns, digits=3) print(PCB.cor, digits=3) # FIGURE 5: pcb.cok = predict(g.pcb, newdata = ncp.grid, debug.level = 0) levs = c(.1,.2,.5,1,2,5,10,20) spplot(pcb.cok[c(1,3,5,7)], as.table=T, col.regions = bpy.colors(7), at = log(levs), colorkey = list(at = log(levs), labels = as.character(levs), col = bpy.colors(7)), layout = c(4,1) ) spplot(pcb.cok[c(4,11,6,12,13,8,14,15,16,10)-2], skip=c(F,T,T,T,F,F,T,T,F,F,F,T,F,F,F,F), as.table=T, layout=c(4,4), asp="iso", col.regions = bpy.colors()) X = cbind(rep(1,7), c(1986, 1987, 1989, 1991, 1993, 1996, 2000)) X2=X[c(1,4,6,7),] lambda = solve(t(X2) %*% X2) %*% t(X2) dimnames(lambda) = list(NULL, c(1986, 1991, 1996, 2000)) print(lambda[2, ], digits=3) # FIGURE 7: pcb.contr = get.contr(pcb.cok, g.pcb, X=lambda[2, ]) # copy coordinates #pcb.contr$x = pcb.cok$x #pcb.contr$y = pcb.cok$y pl1 = spplot(pcb.contr["beta.1"], main = "log-PCB138: change estimate", col.regions = bpy.colors(100)) pcb.contr$sig = pcb.contr$beta.1 / sqrt(pcb.contr$var.beta.1) pl2 = spplot(pcb.contr["sig"], main = "log-PCB138 change/SE", col.regions = bpy.colors(100)) print(pl1, position=c(0,0,0.5,1), more = TRUE) print(pl2, position=c(0.5,0,1,1), more = FALSE) cat("source:\n\nEdzer J. Pebesma, Richard N.M. Duin (2005) Spatio-temporal mapping of\nsea floor sediment pollution in the North Sea. In: Ph. Renard, and\nR. Froidevaux, eds. Proceedings GeoENV 2004 -- Fifth European Conference\non Geostatistics for Environmental Applications; Springer.\n") gstat/demo/krige.R0000644000176200001440000000203413777370515013562 0ustar liggesusers# $Id: krige.R,v 1.5 2007-02-27 22:09:31 edzer Exp $ library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y # ordinary kriging v <- variogram(log(zinc)~1, meuse) m <- fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v, model = m) lzn.kr <- krige(formula = log(zinc)~1, meuse, meuse.grid, model = m) pl1 <- spplot(lzn.kr[1], main = "ordinary kriging prediction of log-zinc") lzn.kr$se = sqrt(lzn.kr$var1.var) pl2 <- spplot(lzn.kr["se"], main = "ordinary kriging prediction error") # universal kriging v <- variogram(log(zinc)~sqrt(dist), meuse) m <- fit.variogram(v, vgm(1, "Exp", 300, 1)) plot(v, model = m) lzn.kr <- krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = m) pl3 <- spplot(lzn.kr[1], main = "universal kriging prediction of log-zinc") lzn.kr$se = sqrt(lzn.kr$var1.var) pl4 <- spplot(lzn.kr["se"], main = "universal kriging prediction error") print(pl1, split = c(1,1,2,2), more = T) print(pl2, split = c(1,2,2,2), more = T) print(pl3, split = c(2,1,2,2), more = T) print(pl4, split = c(2,2,2,2)) gstat/demo/weight.R0000644000176200001440000000122313777370515013747 0ustar liggesuserskriging.weights = function(x, formula, newdata, model) { weighti = function(x, i, formula,...) { ret =rep(0,nrow(x)) ret[i]=1 x[[1]]=ret krige(formula = formula,locations = x,...) } ret = sapply(1:nrow(x), weighti, x=x, newdata=newdata[1,], model=model,formula=formula) ret = t(sapply(ret, as.data.frame)) unlist(ret[,3]) } # example, at first cell of meuse.grid: require(sp) require(gstat) data(meuse) data(meuse.grid) coordinates(meuse) = ~x+y coordinates(meuse.grid) = ~x+y meuse$wts = kriging.weights(meuse["zinc"], zinc~1, meuse.grid[1,], vgm(1, "Exp", 300)) summary(meuse$wts) spplot(meuse["wts"], col.regions=bpy.colors(), cuts=(0:10)/20) gstat/demo/sic2004.R0000644000176200001440000000776013777370515013560 0ustar liggesusers# $Id: sic2004.R,v 1.4 2006-11-22 12:54:16 edzer Exp $ # compared to the original submission, two errors # were found; one was corrected (dayx~x -> dayx~1), the other not. # read csv files: #sic.pred = read.csv("SIC2004_out.csv", header=F) #names(sic.pred) = c("record", "x", "y") #input = read.csv("SIC2004_input.csv", header=F) #names(input) = c("record", "x", "y", "dayx") #joker = read.csv("SIC2004_joker.csv", header=F) #names(joker) = c("record", "x", "y", "dayx") library(sp) library(gstat) library(lattice) data(sic2004) # load directly from R data base input = sic.test[,1:4] names(input) = c("record", "x", "y", "dayx") joker = sic.test[,c(1,2,3,5)] names(joker) = c("record", "x", "y", "dayx") do.sic = function(sic.input, sic.output) { require(gstat) # calculate omnidirectional sample variogram, cutoff 500000, intervals 20000 sic.input = sic.input[sic.input$record != 838, ] v.sample = variogram(dayx~1, ~x+y, input, width=2e4, cutoff=5e5) # ^^^^^ the error: this should be sic.input # ^ this error has been corrected # initial spherical model for fit: nug=100, p.sill=400,range=4.5e5 initial.model = vgm(400, "Sph", 450000, 100) # fit the nugget, sill and range to the sample variogram: v.fitted = fit.variogram(v.sample, initial.model, fit.method = 2) # function returns the output from the call to krige(): krige(dayx~1, ~x+y, sic.input, sic.output, model = v.fitted, nmax = 125) } # do the spatial interpolations: output = do.sic(input, sic.pred) joker.output = do.sic(joker, sic.pred) # write csv files: #write.table(output, "sic2004_output.csv", # sep=",", col.names=FALSE, row.names=FALSE) #write.table(joker.output, "sic2004_joker_output.csv", # sep=",", col.names=FALSE, row.names=FALSE) # calculate output: # read csv files: sic.stats = function(obs, pred) { print("observed:") x = obs print(c(min=min(x), max=max(x), mean=mean(x), median=median(x), stddev=sqrt(var(x)))) print("predicted:") x = pred print(c(min=min(x), max=max(x), mean=mean(x), median=median(x), stddev=sqrt(var(x)))) print("error:") x = pred - obs print(c(mae=mean(abs(x)), me=mean(x), corr=cor(pred,obs), rmse=sqrt(mean(x^2)))) } options(digits=4) print("input data first") sic.stats(sic.test[,4], output$var1.pred) print("joker with error variogram") sic.stats(sic.test[,4], joker.output$var1.pred) ################## do.sic = function(sic.input, sic.output) { require(gstat) v.sample = variogram(dayx~1, ~x+y, input, width=2e4, cutoff=5e5) initial.model = vgm(400, "Sph", 450000, 100) v.fitted = fit.variogram(v.sample, initial.model, fit.method = 2) krige(dayx~1, ~x+y, sic.input, sic.output, model = v.fitted, nmax = 125) } # do the spatial interpolations on a grid: grid1 = do.sic(input, sic.grid) grid2 = do.sic(joker, sic.grid) grid1$v2 = grid2$var1.pred grid1$v2.var = grid2$var1.var grid1$var1.pred[grid1$var1.pred>200] = 205 # mask larger values! grid1$v2[grid1$v2>200] = 205 # mask larger values! greys = c(255, 247, 240, 228, 217, 203, 189, 169, 150, 132, 115, 99, 82, 60, 37, 0) panel.sic = function(...){ panel.levelplot(...) lpoints(sic.train$x, sic.train$y, pch=22, cex=.5, col=1) lpoints(sic.pred$x, sic.pred$y, pch="+", cex=1, col=1) } cp1 = contourplot(z~x+y|name, map.to.lev(grid1,z=c(3,5), ns=c("data set 1","data set 2")), asp="iso", col.regions=rgb(greys/255,greys/255,greys/255), at=50+(0:16)*10,region=TRUE,labels=FALSE, xlab = "", ylab = "",scales=list(draw=F),panel=panel.sic) cp2 = contourplot(sqrt(z)~x+y|name, map.to.lev(grid1,z=4, ns="standard error"), asp="iso",scales=list(draw=F), col.regions=rgb(greys/255,greys/255,greys/255), region=TRUE,labels=FALSE, xlab = "", ylab = "", panel=panel.sic) print(cp1, c(0,0,0.625,1), more=T) print(cp2, c(0.625,0,1,1), more=F) wireframe(var1.pred~x+y,grid2,asp=c(diff(range(grid2$y))/diff(range(grid2$x)),0.5), xlab="x",ylab="y",zlab="z",drape=T, col.regions=gray(sqrt(seq(from=1.0, to=0.0, length=100)))) gstat/demo/examples.R0000644000176200001440000001616013777370515014304 0ustar liggesusers# $Id: examples.R,v 1.6 2006-02-10 19:05:02 edzer Exp $ ## ex01.cmd, ex02.cmd: ## ## Two variables with (initial estimates of) variograms, ## calcute sample variogram and plot fitted model ## library(sp) par(ask = TRUE) data(meuse) coordinates(meuse)=~x+y x <- variogram(zinc ~ 1, meuse) v <- vgm(140000, "Sph", 800, nug = 10000) plot(x, model = v) plot(x, model = fit.variogram(x, model = v)) x <- variogram(log(zinc) ~ 1, meuse) v <- vgm(.5, "Sph", 800, nug = .1) plot(x, model = v) plot(x, model = fit.variogram(x, model = v)) ## ## ex03.cmd: ## Inverse distance interpolation on a mask map ## data(meuse.grid) gridded(meuse.grid) = ~x+y x <- krige(zinc ~ 1, meuse, meuse.grid, model = NULL) library(lattice) spplot(x[1]) ## ## ex04.cmd ## Local ordinary block kriging at non-gridded locations ## ## the gstat "classic" radius maps into the gstat "S" maxdist argument ## new.locs <- SpatialPoints(cbind(x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075))) krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, nmin = 20, maxdist = 1000) ## ## ex05.cmd ## ## Local simple point kriging on a mask map ## v <- vgm(0.581, "Sph", 900, nug = 0.0554) x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 40, nmin = 20, maxdist = 1000, beta = 5.9) spplot(x[1], main = "log(zinc) simple kriging prediction") x$se = sqrt(x$var1.var) spplot(x["se"], main = "log(zinc) simple kriging standard errors") ## ## ex06.cmd ## ## Unconditional Gaussian simulation on a mask ## (local neigbourhoods, simple kriging) ## x <- krige(log(zinc) ~ 1, locations = NULL, newdata = meuse.grid, model = v, nmax = 20, beta = c(5.9), nsim = 5, dummy = TRUE) spplot(x, main = "five unconditional realisations of a correlated Gaussian field") ## ## ex07.cmd ## ## Gaussian simulation, conditional upon data ## (local neighbourhoods, simple and ordinary kriging) ## x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 20, beta = c(5.9), nsim = 5) spplot(x, main = "five conditional realisations of a correlated Gaussian field") ## ## ex08.cmd ## ## Change of support: local ordinary block kriging on a mask ## x <- krige(log(zinc) ~ 1, meuse, meuse.grid, model = v, nmax = 40, nmin = 20, maxdist = 1000, block = c(40,40)) spplot(x[1], main = "ordinary block kriging predictions") x$se = sqrt(x$var1.var) spplot(x["se"], main = "ordinary block kriging prediction standard errors") ## ## ex09.cmd ## ## Obtain map values at data() locations ## (Point-map overlay) ## # we trick here by using inv.weighted distance interpolation, using the # single nearest observation. It will not fail on points outside the grid. # Note that we reversed meuse.grid and meuse to get these results. x <- krige(part.a ~ 1, meuse.grid, meuse, model = NULL, nmax = 1) meuse$part.a = x$var1.pred x <- krige(part.b ~ 1, meuse.grid, meuse, model = NULL, nmax = 1) meuse$part.b = x$var1.pred ## ## ex10.cmd ## ## Multiple kriging: prediction on more than one variable ## (ordinary kriging of two variables) ## (note that zinc_map.eas wass obtained through ex09.gst) ## x <- variogram(dist~1,meuse) v.dist <- fit.variogram(x, model = vgm(1,"Gau",100)) plot(x, model = v.dist) g <- gstat(id = "ln.zinc", form = log(zinc) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = v) g <- gstat(g, id = "dist", form = dist ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(.01, "Nug", 0, add.to = v.dist)) # the added nugget variance is necessary to avoid near-singular covariances x <- predict(g, meuse.grid) spplot(x["ln.zinc.pred"], main = "log(zinc) ordinary kriging predictions") x$ln.zinc.se = sqrt(x$ln.zinc.var) spplot(x["ln.zinc.se"], main = "log(zinc) ordinary kriging prediction standard errors") spplot(x["dist.pred"], main = "dist ordinary kriging predictions") x$dist.se = sqrt(x$dist.var) spplot(x["dist.se"], main = "dist ordinary kriging prediction standard errors") ## ## ex11.cmd ## ## Multivariable kriging: ordinary local cokriging of two variables ## For examples of fitting an LMC: see demo(cokriging) ## g <- gstat(id = "ln.zinc", form = log(zinc) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(0.581, "Sph", 900, 0.0554)) g <- gstat(g, id = "sq.dist", form = sqrt(dist) ~ 1, data = meuse, nmax = 40, nmin = 20, maxdist = 1000, model = vgm(0.0631, "Sph", 900, 0.0001)) g <- gstat(g, id = c("ln.zinc", "sq.dist"), model = vgm(-0.156, "Sph", 900, 1e-5)) # small nugget necessary to let gstat recognize LMC x <- predict(g, meuse.grid) spplot(x["ln.zinc.pred"], main = "log(zinc) ordinary cokriging predictions") x$ln.zinc.se = sqrt(x$ln.zinc.var) spplot(x["ln.zinc.se"], main = "log(zinc) ordinary cokriging prediction standard errors") spplot(x["sq.dist.pred"], main = "dist ordinary cokriging predictions") x$sq.dist.se = sqrt(x$sq.dist.var) spplot(x["sq.dist.se"], main = "dist ordinary cokriging prediction standard errors") ## ## ex12.cmd ## ## Stratified ordinary kriging (within-category ordinary kriging) ## # find out in which part the data are: meuse$part.a = krige(part.a~1, meuse.grid, meuse, nmax=1)$var1.pred x1 = krige(log(zinc)~1, meuse[meuse$part.a == 0,], meuse.grid[meuse.grid$part.a == 0,], model = vgm(.548, "Sph", 900, .0654), nmin = 20, nmax = 40, maxdist = 1000) x2 = krige(log(zinc)~1, meuse[meuse$part.a == 1,], meuse.grid[meuse.grid$part.a == 1,], model = vgm(.716, "Sph", 900), nmin = 20, nmax = 40, maxdist = 1000) x = rbind(as.data.frame(x1), as.data.frame(x2)) gridded(x) = ~x+y spplot(x["var1.pred"], main = "stratified kriging predictions") ## ## ex13.cmd ## ## Local universal kriging, using one continuous variable ### ## the variogram should be that of the residual: x <- krige(log(zinc) ~ sqrt(dist), meuse, meuse.grid, model = vgm(.149, "Sph", 700, .0674), nmax = 40, nmin = 20, maxdist = 1000) spplot(x["var1.pred"], main = "universal kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "universal kriging prediction standard errors") ## ## ex14.cmd ## ## Universal kriging, using one continuous and ## two binary variables. ## x <- krige(log(zinc) ~ -1 + sqrt(dist)+ part.a + part.b, meuse, meuse.grid, model = vgm(.149, "Sph", 700, .0674)) spplot(meuse.grid["part.a"], main = "the areas defining part.a (1) and part.b (0)") spplot(x["var1.pred"], main = "universal kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "universal kriging prediction standard errors") ## ## ex14a.cmd ## ## stratified universal kriging: ## (again: not implemented) ## ## ex15.cmd ## ## Local linear model, using one continuous variable ## x <- krige(log(zinc) ~ sqrt(dist), meuse, meuse.grid, model = NULL, nmax = 40, nmin = 20, maxdist = 1000) spplot(x["var1.pred"], main = "IID local linear model kriging predictions") x$var1.se = sqrt(x$var1.var) spplot(x["var1.se"], main = "IID local linear model prediction standard errors") ## ## ex16.cmd ## ## Multivariable indicator cosimulation ## ==>> see demo(cosimulation) for an extended example how to do this ## ## ## ex17.cmd ## ## global coordinate polynomial trend surfaces ## trend orders 0-3 ==>> better use lm() for this ## gstat/demo/ikr.R0000644000176200001440000000077713777370515013262 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) data(meuse.grid) coordinates(meuse)=~x+y gridded(meuse.grid)=~x+y v = variogram(I(zinc < 500)~1,meuse) plot(v) vm = fit.variogram(v, vgm(1, "Sph", 300, 1)) plot(v,vm) vm # possibly adjust sum of sill to be max. 0.25? ik = krige(I(zinc>500)~1, meuse, meuse.grid, vm) spplot(ik[1],col.regions=bpy.colors()) summary(ik[[1]]) # adjust values outside [0,1] to nearest limit: ik[[1]][ik[[1]]<0] = 0 ik[[1]][ik[[1]]>1] = 1 summary(ik[[1]]) spplot(ik[1],col.regions=bpy.colors()) gstat/demo/snow.R0000644000176200001440000000206513777370515013453 0ustar liggesuserslibrary(sp) library(gstat) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y ncell = 1000000 # sample 1000000 points over meuse.grid: newd = spsample(meuse.grid, ncell, type="regular") ncell = dim(coordinates(newd))[1] v = vgm(0.6, "Sph", 900, 0.05) library(parallel) nclus = detectCores() clus <- c(rep("localhost", nclus)) # set up cluster and data cl <- makeCluster(clus, type = "SOCK") clusterEvalQ(cl, library(gstat)) clusterExport(cl, list("meuse", "meuse.grid", "v")) # split prediction locations: # either at random: splt = sample(1:nclus, nrow(coordinates(newd)), replace = TRUE) # or regular: splt = rep(1:nclus, each = ceiling(ncell/nclus), length.out = ncell) newdlst = lapply(as.list(1:nclus), function(w) newd[splt == w,]) # no cluster: system.time(out.noclus <- krige(log(zinc)~1, meuse, newd, v)) # with cluster: system.time(out.clus <- do.call("rbind", parLapply(cl, newdlst, function(lst) krige(log(zinc)~1, meuse, lst, v) ))) stopCluster(cl) all.equal(out.clus, out.noclus) gridded(out.clus) = TRUE image(out.clus) gstat/demo/00Index0000644000176200001440000000423614322067013013455 0ustar liggesusersa2p area-to-point kriging with krige0 a2pinST area-to-point kriging in space-time with krigeST block block kriging -- effect of block size and irregular blocks blue how to get BLUE coefficients out of a predict.gstat call cc collocated cokriging example circEmbeddingMeuse simulation based in circular embedding allowing fft cokriging fitting a linear model of coregionalization and cokriging comp_geoR compare gstat kriging output with that obtained from geoR cosimulation fitting a linear model of coregionalization and cosimulation depend check gstat package dependencies examples how to do the original gstat example files in S grass example grass/R/gstat run; requires grass meuse data set installed gstat3D example of 3D interpolation of random points ikr example indicator kriging on zinc w. threshold 500 ppm krige sample run of ordinary and universal kriging lhs create latin hypercube sample of Gaussian random field lnsim carry out log-normal kriging, based on conditional simulation sic2004 part of sic2004 excercise; see ?sic2004 sftime demo using package sftime, derived from demo(stkrige) pcb pcb North Sea data analysis as used for geoENV2004 paper; see ?pcb fulmar analysis of Fulmaris glacialis data on Dutch part of the North Sea uisim unconditional indicator simulation, 2 and 3 category examples ugsim unconditional Gaussian simulation snow parallel kriging using package snow (not on Windows) line examples for lines support prediction weight compute (the expensive way) kriging weights for a single prediction location wind space-time kriging with the Irish wind data sets rep 10 x 10 matrix of fitted variograms from 100 simulated fields sftime demonstration for using the classes of sftime, local spatio-temporal kriging stkrige model estimation for Vignette spatio-temporal kriging stkrige-prediction prediction as in Vignette spatio-temporal kriging [!time consuming!] stkrige-crossvalidation crossvalidation as in Vignette spatio-temporal kriging [!very time consuming!] localKrigeST locally krige an irregular spatio-temporal data set to a regular spatio-temporal grid zonal approximate zonal anisotropy with geometrically anistropic model gstat/demo/comp_geoR.R0000644000176200001440000000062413777370515014376 0ustar liggesuserslibrary(sp) library(gstat) library(geoR) xyz = data.frame(x = c(0,0,1), y = c(0, 1, 1), z = c(1,2,3)) coordinates(xyz)=~x+y x0 = SpatialPoints(data.frame(x=0,y=.5)) kr1 = krige(z~1,xyz,x0,vgm(1, "Exp", 1)) kr2 = krige.conv(as.geodata(xyz), locations=coordinates(x0), krige=list(cov.model="exponential", cov.par=c(1,1))) kr1 c(kr2$predict, kr2$krige.var) kr1[[1]] - kr2$predict kr1[[2]] - kr2$krige.var gstat/demo/cokriging.R0000644000176200001440000000367114336470233014433 0ustar liggesusers# $Id: cokriging.R,v 1.4 2006-02-10 19:05:02 edzer Exp $ library(stars) library(gstat) data(meuse, package = "sp") meuse = st_as_sf(meuse, coords = c("x", "y")) data(meuse.grid, package = "sp") meuse.grid = st_as_stars(meuse.grid) # cokriging of the four heavy metal variables # create gstat object, stepwise: gstat(id="zn", formula=log(zinc)~1, data=meuse, nmax = 10) |> gstat("cu", log(copper)~1, meuse, nmax = 10) |> gstat("cd", log(cadmium)~1, meuse, nmax = 10) |> gstat("pb", log(lead)~1, meuse, nmax = 10) |> gstat(model=vgm(1, "Sph", 900, 1), fill.all=T) -> meuse.g x <- variogram(meuse.g, cutoff=1000) meuse.fit = fit.lmc(x, meuse.g) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid) z[c(1,3,5,7)] |> merge() |> plot() # compute & plot standard errors: z[c(2,4,6,9)] |> setNames(paste0(c("zn", "cu", "pb", "cd"), ": se")) |> merge() |> sqrt() |> plot() # old-style, with sp: # indicator cokriging for the 9 percentiles of zinc: q <- quantile(meuse$zinc, seq(.1,.9,.1)) gstat(id = "zn1", formula = I(zinc < q[1])~1, data = meuse, nmax = 7, beta = .1, set = list(order = 4, zero = 1e-5)) |> gstat("zn2", I(zinc < q[2])~1, meuse, nmax = 7, beta=.2) |> gstat("zn3", I(zinc < q[3])~1, meuse, nmax = 7, beta=.3) |> gstat("zn4", I(zinc < q[4])~1, meuse, nmax = 7, beta=.4) |> gstat("zn5", I(zinc < q[5])~1, meuse, nmax = 7, beta=.5) |> gstat("zn6", I(zinc < q[6])~1, meuse, nmax = 7, beta=.6) |> gstat("zn7", I(zinc < q[7])~1, meuse, nmax = 7, beta=.7) |> gstat("zn8", I(zinc < q[8])~1, meuse, nmax = 7, beta=.8) |> gstat("zn9", I(zinc < q[9])~1, meuse, nmax = 7, beta=.9) |> gstat(model=vgm(1, "Sph", 900, 1), fill.all=T) -> meuse.i x <- variogram(meuse.i, cutoff=1000) meuse.fit = fit.lmc(x, meuse.i, correct.diagonal = 1.01) plot(x, model = meuse.fit) z <- predict(meuse.fit, newdata = meuse.grid) z[c(1,3,5,7,9,11,13,15,17)] |> setNames(paste("est.Pr(Zn < ", signif(q,4), ")", sep = "")) |> merge() |> plot() gstat/data/0000755000176200001440000000000013777370515012324 5ustar liggesusersgstat/data/sic2004.rda0000644000176200001440000003636414413507477014111 0ustar liggesusers7zXZi"6!XW<])TW"nRʟ$85EҤ fC%#dcj~[AǸY7)]grmŢ{#v!@w7Aal[) HGN~R> >Q <~fHCz8NvYl6ir(|ZڣL \7m,Yߙ Rsu"~4;ˠ^uRta{<dždˉiƤxY]j1y{qOEG&'ߚK/S" NOh<.eKT#q=up{Rfbz%=>HNX{: ,! s0*/Z/Ou+x.ua-* Caok/;)^Q!S!b:+iQJ21ņp eNȡ,KFu65@<0[,zK!=jcNu ~ܴ]7ƧZ>Ǡ&=et56:_ #{ 0=A#ɭvS*Svl58?IZ0b[ܖxvfS ^+/uvYdyS “Kl, K ڃEiN0wyBy#'KS02(7V}8(~ކniJ2D[yJm\!J$Zl/ZS%F:ʵ[A|yIgS>R MhY}Ѝ&֑Ws\gLpǬ=!D`R-7G+OkQz£QTE:9XӒJ+6˃P0(qj%CQ ]t~87I_}w">>fTjoyKzn}3El$IʬA. kW'w)lF*Dӯ j"Ʋ= CY%Y TÓȏͨSNZ(Bz}=n2w[ fCK/ƾ|5QEN^.n0>!V>xQ@Dz@5S$9k;op+Y&UP9kφ ]2ToNv$?>Y="p^_ *pZzI]@Ґb*9~gF*92eՈzHL:%ԚKnA&_,o2:o_˸+ק$F\N8d#f lV _PHZu]E"[0)hq%g{lL*}q)*~5auTXߥ<%Qa@:7 _!|4+aTC/VF3m ~G)* uH]T\^X.jmM|&A^kUŮQnL՗AΫVfJ1wu;*šI'T $A%1wRSu"-͞  Sv ?}7ψ={avv,(uꈰT|8q&_KwY9n˂dnV&5L4Ai婻;6nw`UIm QZ[8^렆56ӂ^" ԵaVgF^uw5Z,*cs3AݶA Qx/\CS4)B-eYM4~9Sͤ> r)I$2*r79 (߶Lp E*N}G( [1=݀O/B =gY 6&49 v^)dLAg{{jnCF؜QgkNwR1胞s:nNz< !CFl.|r(@bMJ$ N<.laҊ.NdhrrB `|xċeDM3V19*M'ۼyݏ;6HaP b jLNsnY$heVt̸8)TN&<4Tz^,OnY2{/oK6rsm }#iק̩ny ؙ`0Փ0?wz͐|G'b噕8f?LR KF,y7Cⴾ#H/e}k=HƨN3g#Dy~\B7}_>[-/O7PNE[P ധŃмW.aA'a^- `n"A:rcīqݢA䠄Ar 8l.sw w,v+VX;|unsr),10Ea8pr/p=Eڣz  }Eg2絎@u1ձO )@,?Sl{]!YfHk&gH` nNf[im֐hf3j"&^\MBJ> @$0H+FëݵYif9g9l'KmQSeN+DU 413hnJ\j" jI'WW嬊%qԜcͽo|ݥq|?hUx΃LP*VfƖPDXI5+rx}P [QJ_߫ 5zr(FaL+Nh'yFO * Nլ _Lrß7H&/H`Zv3gqȴ7c%aiT퓙{n&o"֊*<|I~SlY}mwHh^xv1'B"RD(>FQW+,&ǃ[5߻{q?W$ϨP9\T7If2bf0D ,ݫ\K<]7Lӗ\ya+k l(U0ݜxV_>:(bcc'2am\3?ZEUi! \pʞoG\C6)F[{(ɺm$J/#V }Ib+`?p+GQx Zԣ䰡vqⶫ) <*dà *g˗#$]=W=UZH*9dC 6j̭44Y ?lh1N=?w' ?b$gy$҄P؊% #'wgLm1 :/dM=/ 0ȱN0d24]WwG\yown_HNlkubh4|A#%]_%j@% @!l.D23ca ZYm5Pt Ҷb斱N@x"v:dMExf"obk"C N@dt*!PwHaQdpF=8 Uskxh+%lq.PvM:4ݸoh':P<cUW12%~!YТ jͭ fڑɚ˟/+6`(}a_3`ޝu2^<rq"V o45R7ᄓy9h8NYu}$IN+Cw o;mNbWWN}Ƒv}ͲګDVdHnLqJْms?:!*@~/r'ܒߋ-}`UyxI- Taˇ(eHԸ4Pf|gꌰQ;( k/[-N9W(|N|n7vhIp*0d;Ț͇J5у&OT vT"P~K0N+߼ }+KGLkz]Z# .|-Mg$÷baB.R܊OHy9Dpǯ)ثp9u.+X褔`tVE}NqvuRnۻV۽`V;vYFe3C?WqkżfkzS ݵzγ_t3noܢ p_ #ıe1wfZ1yQAbWPXO{VdRpQ_YH3=J VhG_=u,}1@h>W EdN=G̼`I\Bs'G5vN.E%my =55%-ÔVy#`ܰfoPiVՈGuV 9x:7T~MV˘ $YV} ! K".+,0T _.GT';GpXtIM"MnJ0 LHj H4zC|Ѭ ˾ rc/Ycz\^ /\$e3X R]6>z=+'|KZ>lGLEy 5´ pgS O}#?R9,6R*ctp= P'͢3Di'ʥݰ~!=YeY6z豠<1љt0@7ȗqWN>Mdg7<ߞKu$&Ļ|?2y>`ç+B_7ߕЀ_ɋ3\,+hD/b“4ɄL`U8GٔoNNͺY!#aҶJF獀u8g#0^UMbyd :ǩj<,gLYZ ~ kX)6Q1rmh"f$;N%G9PpM4}{ߙLK9 e[7AH=&YH?l֎gљyWѳ,%v 3XkbD"?%w^=vrj;bB&Q /|hT!ͺ+_Eqڔ;4=#y_r_;; V}Qf27pɷJWhm)YHwpu+oDhz–c~EZ R0O8]+T<}/d:vI&PhܥY5A0/o:^ ]$njTClL.g R9!==8~u(dᦹ8ķeapC"GYe=8RXar"&LanX[rxy=*J9UX{@ '}'PQ-Օ_qK"i{{A?)gӢAH*ȭ}`&X*p%mmЫbADA?NwH}oaw #TN#!¶v-6 gi]%^=UDO!O.ZJ[% lXEpMMޚD[r!54N; bb R>q*JPKa:Tl֟ގCF+[rU`Y"fA||/4 dr"D2J(MhXӇ54C?RYZq薗2*6hr̔$ ̻%c,7cGs=Oᵑѿ`f ɷ(^d}ӣ&R UNܝF#FJ/L+OQ>ބn 0Yh;2|ˇ;9K2Ki$C͓BC]ȴZ8H(^?+Ϊ0>C>wV}5l!Udoۋ1(*:(REQ5~@o :YAy\'Y"0 ZaC*ez$} "d˥(Z4 +V+ !6p1^ ~ X.=2O` dc$G. eumS䮑Cdʡ} 7J`1p >wt5r8X>[y JfR3]זt̛ґP(iC$1h^Ԉ$"&ܨ߉Smi%l?11V>(`yK-(5_Ch>6MlB;@9ᰶnH< GthYcFmm@:aO(Te FZ6,O&7 p>Ef6jMxѶ5˅'.FSh[9 .ۖ`V9O$7CB.Flqz·O].LSW n"?b=TM:v[F"[vvʯLfUTjׁKgs(`2!8˃(Ԗd >Ɨ֜lZD66bpt:9 C9WlΔ2)i5_T{> N^q[4[вS采It8$MS-zѕEl;S^4M }%KpXM6׷L Q|kgvK5 mlќ!Fm$(MpPS1RU>sNBy%3̧>QyV;Pk,މPV>ٷ}<J"=wBXFoɃ_2ib#1{Px4%]k9gZ g+YpR|J$^cbm_ |t-duj9)x@`L)yYOq{1I$  ;i^^ @u`xf8Hxg`LjLGuM9t`ۙUJi㮳׶IK%எ40 8#)xIbF#.(W9ƞ\.*A'X5J,Ds]eE !7)/ +cc.Qerx ڎNOz#9%/% 2O3䉕=%8Bݛ'MڊP*|b]B@ Z,<>S ((ߋLA>f mrQX<1SjmO_ Q(LAq:Ãx.LWO SQ7ں~,+[A7ߑ5?݃Wh9$]nƾ?ƏK_jSXrlTBY"?OnzlGPkAl1juX$H0P&ArL`DlUf0lqzX|FPi\1Oc5z>{)y N<<Uu7QjA\rvXEϯ. i 1~Gc﷮εfh̥M0@_+Q>q*i@qoO`%BlQ7Gk‡@vE2] BHHQ.Iٌ gm mqކ n!ه S)lqN%M.Knm?kށVK+=mŜ1s93%%$>.,CzzWҭ%6c2La=9cV`jHh4C'4~6Px"ǜeժR$p1*tzn$܉GRQ6"h?`oy?^<>G*n3gC!t:T >i7@; X$sY%">2X.Š_0@:/;;(x 6tS8:O|6@ cWW6fj@$ϼ=Z| KAHE9`pUvL*c--g-!&Yn a2v=Մ=ݦtLyzB}M!ӳxmk}oP{Wk[%i0,B25fOXaȽuzOzƄznP?\)WpF|WG\-9}?1WaCxZPր":t-b=}7ςFdozLTA{` Sj2ֳ2=hNW=Q:,GtCk$IPV#`O;]tTs?kEpd![^\ccD Qb5=E.A+cbx/-W'쑴e< >*QM\X(H_+nyv`/r^>K@MH{Nt,dDC$b mڗ ~b }%oL-EmPsGkwO`.)iFf#xe{9VVu9ڙhqutDе{?l2qGdZ?q퓙T`_PR*(N>ޤ"IBKd7$2qQә/8?tG9oKo3{DӾ^V7S'TuY~HȽWhE8f{ s^7#' tI*pOb JhPa̮U Itxr>RFˣqxqb(y-GCHd̗<,)o䬀 !Ȫ郘!0 YZgstat/data/fulmar.rda0000644000176200001440000004107414413507477014305 0ustar liggesusers7zXZi"6!X3'A])TW"nRʟ$85EҤ 5.`jS\)L!LGWYYyaz(lѲC3{5v-*h7x.-DU=]f~T421(zI4 )qLIjt?Wd`Au'#P9|?=/BTaD/nH'&Լ 640$d$A/\Lrciƀ&2:3!ASJ0}VҞZrgj.ϩ9/[ xذmwҮ8Q<2MA]D7TS_);Ev[HF axZuRI~ѷyX P;-ZˮlT`fN+L:erMO"^ffU)\̰uPa].E T͗_}sAz&Y$2,B-ŭ ) A5K3C,_SPRmfZj2kO/H8V430h{Gg & É-8 YkPyΩęë51anZ?6~`H39,W 3Z`qf9v7P'K ZI^rPAF%Scʫd:e87,+-tWf]);v^CVCfhcX`AW"1" JoB4VoжͶ,PlP:n!? cqC_%VOKM.-?Ca)[A\wʬ)!rZ.[yQ|yTmLnFxx/NOFXȵ`:"a9^@ &kM&rv6 %b *mMq*E؁fX \mwyFI^K(2Tؠ >+pD,CH"񩨁Yv[;?d7e -] B\jOfos %tkph[C;eB_ "!BRXv ԜScCf[MUXȌ]o{~3 9F o]+ ZLK*b`Pòy3W*6fp02`fTx4HH乞/sTE2E_y8tfc08RT543*3sb<97;=xԲ1.0o>83IVzdSL@vL@p رhQ-"rqP}tFiąϷ< 7sX{qL~}?%x#w =q_?|HJ7["6 w)3`I=8sX啶"Vxl-i&erVUjߓ!ʳuQlُ}  Uꪜšp|&Y2i4aeT8Hߐ8 -Q5K7W L"ktQD%:Oʹ ]ct&0RSۘ}X"V9[Yzw= px|4r+QTCDJijah0 }p{<0ʖ"f젆YvX<_s8JTye&"٬/)ewU/F5^6MuumtRi f[zcK %LS 5Hin vkE@T#KX9_ޟ%U FmeA"6-B\ƒ™v2 KC,9F#TZ׻?0IN?kɶ}ߨHnTF MGsXCcOSbcp߱ϛ*g95[ϣ`ˤD0Q Q'ٸK`&hp'P JodnD%LxS.b3h=.@-~|OP? G])49Ҥ$OWTa\cpb+-n'=fBGi 4n7H f Zl` 힡cr'HF1* GFLa6E>p,T0q&MyjWM!a~,As0[-Al' [`ǢrEґn:J S՝=Xc;"[o$dMK(5ɵ?ܷr~$c$ _6TϸԘ18;`0@U 0EbX_u~B Pl75'h$2ܺ &tQE*h:,8,ѼըQqD Ae^I~ܙ8 AZs|] ѯ&/@,lBA/XFFH@Ԣ[wMz}qs;_CkenSX+ Rd=?>[&g4;OЭ|ˠӅ*te4 'eAvC\dIO7 tjKgǎd݁ZUB \ mqc㩛i(z2ic vuu9 k nӿ{] +HA0rg͡e"lԩ=NU᜴aȑ|!4Vh`T;-ͬ|;>h%;SY{c_INa-|sx<cXe4xr@c|iC [OK-72m?q>1iGy>oɳ {* |ZƔE{H)=&`wYILZ3`;ͯh:L7o_OL8m;GL:ad挻)f?K.ޑ:Y[^}UTSyFoMt~tIL-.i<F<7BvJS %Utdz;x׊T9ͩ(`䀗"ͅP ؆t6? vDv$dԨe mžҙړK4 c:/f,3!pKd1=FXǏlqT9Cv|T7[љ@Nѩ [Q̷{ac.sZ!`ר]IRE ;7] b:+Jl8(qfP!Ry|"a&kEɋ |3".Vlҟh!u`X ǯL6LHm>9* A=$ihYQV˵\0b8[znn4)t5` DjAɩR8K;>ʓg&# ?G1+CvhY~S.;$:`&>B:旖+!wknPH=JԷ_ʔSe0e8rj#zVbG7hJ-J\p=u!WvxS"F)3$u>}yZ3$'3ʺP;< ;c>SRWNlMоqAtVw%ƬbxXhEBM0/6iBpnOh#&:1T̕jm0eq6ѿN(*|a?Ns.8ob,vkbg@Nλ4%kz%u4NA:LM v0~!آYܲ/i]bIFwrX٪-_}qE=K+Zޱx% kF[9A/?݀ aS'yZ2ȩTW5-(H<|Afd wv#}Hy={FREYB}ڱEAMb /Zt %/+ϮVQFPp Pu z蜪9h\`l٠ iV@sƒ]mӂFmF}}G/QlzJKm1eFea63GȋmQ#R^ )3W)YS՝QM> k9U&ҼAR>B_; 5ҖOۊ 0 pA`xDԩ43:crՄPZ 5_ܧCR p"(1eU뽭y(A7R倬),q8Zzw εSpk![=8 d¢ #w).u(pGc q L}pX,/қ8[; kMarV&Cb)ښG4q}֨+ne* E>1lr2"-:V.Go%[(H `'SBd<$|˴ʁb_jעiJY!I]HZEAD!?'sA'Ic|cߕ#_ 3b9I2'_,M H(%BiJ!Ξ޵AU#{ =zhМ ^9Mޅ`BOJ &s-(I"c( "NO1oH4h?t@n(3ǫ,^&{U #e%7W'1.2" -b&[L| w<IBIaї+7% {ܒI4&s>] V:\T4YOy*Shd;br&Qp@8)ʷM:910G5O Jou(bZ,㝵W&i|y#,3x67 ?Px^g1>tU6'cj.tz+/{RݞM}@Ȩ.q{OuMVV^{,8Q.,1 (C@"\D׫D/3qTщO&H:0 [r·K5<]-}" i`@ V忁̀' :6/E1nc$?P`Yp0Rm;~srot`wgՁkNNx/5G9_i>a@ )*D ;&:]3䝔VY jiC.Tz (6Xꬆi޴u/?oȭevnBs60 P:Rɭ(:Т<]bnLGďHһJdrtK}N۸lvc sT\s)a AQ,n'ElG{7bd826H3Dwxш$Vv$Bw++^cQ>t6\Q#@қ 4YkVo%O'ƪm(Ku2Meۑ9 ĭ?"ma,D&sB( 4khF?yz06u2:OvCs Э H\"*C!1J^g,1Gp{2<Nqh3 H 6 >'C %W'mBM>?:{̗?D.UtemG⳷@s4 =ߋHB$tu_~|ׂ lP7PV"~~/ Vxy?:W*|-B|A%|t/+:&*js٧ U1 Dq*ֳ7 ׹eĞ|ϋX pח3 2~]y5X(9'M:`҃B"[lBW,vn9B`Dh}!q8/0>ઽvnIv.SrS@1nS'SCOqʎ [E½[!<C?f|Rb<|B9ϷB$?$GS ) `i Q5h){}|&r[\8LeJfD+(. *\֧B-u+4I0-8s |Yl1 p]|R35S.}7vF/~HnpaX-qy `MIy=Ś]z]%|` ok˿T&^jД qӒQ=~*^ O9:]m:Fى<N<]f1teVpl5/;%Vy"_~plobv,r%%N{uŰp ڞnYuϮrjJv{%'Jŷa9ѹD4BpNXg{(F|_$?׫).$SX ꝡu)J,֠ kS*7A 28,2vU\0\pO{M)靑n)h~q21$<Ԉ?-VvEѝ%^ƼpZL#;5ٱtN?y-$RPӿFŞ99 A-QE(66토*7EY#G oin/!1{mvpX/+~F#QUΕ,9L br2=60z? oiVqZM&(~S7WW ]X`حHD.#Je=AN| _A*(.G(:Hor|hfk34w@1sBnK[0P^g2lJnRVQS.?Guq"8|g'wűLl3G { CT٬^es^)u:o{LԱ˝7j͓kKؾcZ؟#?arf0$֮xP{fj+C$%^ϴ':W!׬ܦ,L%DG ȇw&`yL$p W"]G7U^ hҴHwc_/i^4>{iF $nt'rMѺM\XB2[H$Me|PPv *0xr<'@̋Ssś8xyS`@.9.H KܱQ妐|Ģ2XӏY a'! P'1rl8N P_ e\ oœ76yJ9&^U睔;x䝖} ]-ON_x>B)B&*jՐ*Yba)6^az7mԵ]b,vզ ʚp4C!`_$Z݋hS A7ݞ/g9cilQW7-Xa>3qAF"YV 8m gQ_Rm vG!!ȳlќ]ٷRo }B>OD:bQ!N_ )'Ja+XW0Y4c)ʓVs}tڧܙHwĤeMڮ ^ѱe F0;؞*c46O/ƮRPk)2Zziujx7//17Y݂uS8LIY"|kTf|D/HB;]Yb|1ds]pK,#3BϞN#`($+ T8|+];.mpBw#>wMa ^|j=$B7 j48‘ǭ՝r=U&\r xcRP?e+ W!Xęv^PM>rAe6|T0!b k^èSU|i_G;bD6ˁoIcV,iДt5F5 4T osJ;kUQTIV 3N\hU`%c(Yr1Dm5')ُG0ŷ)6{Q"3d\j=Cp~/b)Ud5ʆ%%j)V?tZ/}YDh5vXVoGi>Ui&TR]q] R]8>A絠l09]:CHAi-EK%In.M7s͕ʄXyUJ oy H΂[y.r~u]dp_Xz_9_{}q;.z˨Z{'olbOGbHbхD,^غfh*mGFt[wes~@YP6'0qUΉ*?5O·#ǥViz O%}6=>ݡܲf/wBJ+,93"N_dΟ2ׯbLoT+ǘD(Nē*JF- =1dhIaH(^qlc*/(+LXY%E\IBeY|2,7b'QcWP[g# ȝyv4|6 5 *L9J-˻_^d/gZpI5¯ "Lz.G&GoN-̦Z [ <ЙHi}N uN"B k5ٷA+'kpVHPwӃI3Z2w#B#]wC(RfTdu<6wU,7R(P9BwxEg_ _~ؤqWVyc>MYdye6]u˅Gyܨ>DV}غ-ɖbnq2i#ʸ0u ʲiS$BE+YSEaS{!F5 :Ԥ&tek̃9<LVцVH'cn}"]j L}tˈ {Hά%Ȑk ^jT{?g ;:Vl|5bԲ|2arDދ3yv-F^YKΪBJzJY:\rs~KL(̙/q7r;eVKs938P6;Esh񅛵MMrT)OP5HŹ!UD 9L,$)Q (آ?NAfL`v*H@Z C*PE W`tfe~1f>8_V!jH 4u[ug~< H硔0̀lt KS,g63 },*)8 σc×vE/53} s"߇qiGZ6!А5D3 )+wν @s9\/\O.!U?oU7> Lㅻ23iX=a|YVAF?ApU50S7mٷu mO&vZO%+,PE.Sw-4VpjXg)6ΊtSp9[UzʘKZt#Gb/Z* ޯ9yl̂j6OLEc0ra]7Snl{i f ,ͧbYYa]pV*wMQs(j&8hxD nz+7QŒ$9a^u.WD8w JQ0-r`Qk]ѷ_Bn!n1J>Gf~RMo,߇&W#siʒ$|T>:w2eG`5;" X7lllh):a)/@w)E"V@USGz5XW&=vEs-fE$dyTb!#Z(w 9ANc H>lG\b` {Q/aEYI0G1盐eUQ`i>Gl B*:k&6*C+E\#Frl_qZpo:[~Nfn%?r]IL79:fNPmOgKZM (R%+7_x(6XЛ%b:LYn"”gpG5us֗SN^7gW߻"]UsIvgJ$Prl-;8; A! " ~~Ց2X= KQlRQDryi|0ƈٕJ0K3SrHrN ᅸrLw*Fu0H)0ܹ"FdA=R`H"Ʃ]76Z(Ba>%$wǴ}돲 $oH1 R+5nY" FOS1mQP{uKQ@ J)!9gK:R!B/I\Ҏ&[ŨF _S. `XSаA#-<dn=ς?Fhb*0y !%Hv ]z "ummǘLHyhHqZ\ERg[©p}ry9x~*@vRRuq(͌Q }ws@sx  e=mFO.?.A4Em|U`);)Ǫy Y lc4MF~e~s੊p#D d,Kix kd9?lV~O}ז֡`kszk2`>ɣYFJ+j&u>;@ į-%TzhD Od_TފրQ3Cs8i(j; & ~m? uT7%&ˡLZG',jq@HSGQff&ve+Af|"io`d54evBΤWrTp<{JiwO>P796].^ApI! v]5"XrF}4 _ e)_Vv/GϢ,1.xҷf;V%4+[r9[+%]]؈Ypi ޜ kwĦTZ.`h7ٖLdw%pUж$A)[,~VN' Rvr1ljQW0K .w{zƒlS5<\]F*Z^1"BMp '+Z e 'I (GA eFI[/<SEJfܟ;wv33d e 1czwa_RǔWuY*u)aaUe@-)@>0 YZgstat/data/jura.rda0000644000176200001440000021760014413507477013760 0ustar liggesusers7zXZi"6!X㭿])TW"nRʟ$85EҤ>HFXZaqӀYSq)c?2] V%]CK&9ńV|4{:l,( N{?.Q@+Qz6>[wPq:5l /q-֠pVmq*\ pP1] Y,`GXP'Ns;Ȓzd#]?d=km|ADrňPE*\U♭ʦpմ}\4zFN=ČQ)D#g7QY6O[4< X A~Y Ldg G\F.qw?mg`~xaЯ'S\<0˦wOnzH FfW^5ni%2NؔB(ٓio $.gץ!kӕ5F˼ĩc]4M:UoC{m+U3s2SB g%>NgJF73+W.GIޟ{77ш`0I48}PgO!^HVwb,A&~ĜNF{o-爿eۙLquE}H.7qSjU]pn}8~%ah'fGmqIu-$0{¢޾y*/7 iw6Vc*7y_ Şq YilwAo?Ub`P'=~1ock )xHFo@H|XGR_Qj錯] V욷+cb0ٔ>}+k ;v$ּCHRNvh>*Ah.Eޘ8T }x`Z[+V`LItdR|:ν*ÅC\5?x uN1ЙOA~X{m_ᄳOU/pG cL:{[sjh'*JVN^BcZ-*}'KE3+gVK\2s#X0yt򮦸>Q}1Thu)uHT udS*]Cߔjx#hn) ENLuU*̓>]&\$ /;'}V:-5^9oH^'+Lein]`u;GXf c'Sb%a^%bp@l1o#ր h̞&i s]2 YfS)+F٩C%bQ/P꿵bk# E(<ޏbstՋ0&6BEJBb:X4$!RJ;Lb6xǢ.y >:H 'D[-<,5B{N1r*0 s@r^֟~,L-ѤD!,4we-=$7SBљľrmR+<apӲWg4`q"S'}4T&ff[հ$[ؑ?Ɠ1ؗ6è2bs`_/L:>6uAЛ&jr(%)Oi"g>FKQ 9*?5>akjчdSN qGwٷЋ|!ϕ)ǽVu|;.w zԢtlq֔/]SigTmAѷ-ƌ?5ʫ@lyZ/ tIaTݓߪ(S!P ;F,f)AT8an~]0[>|:fZ>8SKb"dfwjL3 "S<-tW4;m3 %20V69%kX6.*ۀ°C #$m|Gv7E=+U\ݪTݱEU|7~1u?@i HxĹ67w+д?Y}a(\%fSͩXG8C`)˧=7;!dϵh4g͸)#WVզzޝOL e(nL}%9a5aD tdb3s;<-(*> ep۶&4nZ$ -JR7 UoģPj0j8ǫ6,Tc]pU@WUjדYt] u°+/hJ])P`q{sJXKDP]M)lP[m5;"-Lay͈Ev1M ht!8Bl Ʀq/g~4έe aX].kZrݎg_CZ-G΅$^4]o#61+a͕ycԤ}6E !JrJb/u;ba2l enJ &. [` ae!pDS1CgǴMۭ˟6lxGqK0QIv?E+h|lpR#?dXP{|  ̔D0ӑnFw*w SjTԧ)=)."xEF1;f8RWv:U-J5ĹN%TᒴaEsciJE$0A10B3{/fLG\ṫ1Ϯ01e !q &j ePZ֪~C>| e@UJ+YZL/PLt*sW!˰(LR:UݳaPկlw;|by^ ²B{=:2ߏYR*c?m(Š@]pc}Rp/1]G#ݖCj#P<L= Ѐ,kD9|~`T"I{I*^.$n> OB9ᝫjO(OQH|,ynbOɦD2bduVޢ-{!U譽\Jk\jMsb[ kp͖;2ygEN dZժgw]w"@O$6 UNƇ y^ܚYM ;WzPp/n-nK)\BW Wł <"w4NqiB`"tg@|D5넓h6/IN1=]o'<܏r nE>=Fz|=#p"2a|Q祵jzn #eSDP @Wt&p#%Y&ĕƥ#_R0)[P(H-\i1*PCSޢ1jo"KtrʅSUB@Y!p "9>d8FZHCe zޏ<M';~LSjZ^|4JW,+韂+NפAIzeP]FLt?`l#(FbsK?1)r {qxnxs}2F'<^;"&ZmjҪmwWN1c^ڙizϛf  M+D)kSR-ézZ&pÂc|]Oy9=Vo%Gg V@ ombٗ<9LsԚHԭIEfP|P^[\qExeXj+nqpäGT (@;x!Hpm魝S^&3[C+Ӓd8y0hj&,JfKҎ(]0Ufj=ng ،]Ľ[ @) Ծ r.k,^si^V}M8gY:;b^ JsV!ۄf19?SGaԼÊa ? 0|xJUMk)@0Pz! "jѧTKm8p%3=G[!j t7;`49Y;2CJ4ad7SM挢mPt :.BY 1X]}5 ^\t>lQ ~=P 7ް[umb{欳&# 5><?+g/f]y&ZVl&l*?xcW.A;ϸv^e3hV ga mia(QdPmo.e.Ԭsh uJV8Hcp49TUJ&5=GB3ty&s!']!=ܟ8v!y A̓d|N<Ʌ.A:=;T~SCۙ4]~fGȏnD iiܦ}ew"Psut7fdpNoQk8{Yʒ׊"BMWjk'>ޑ3ux%BhYc?yd͢+}.|L-ӄMWfj1YKIZCQU)j䯙gX\?_-MQSl$*1׫ѰbQDk)BxD.]x{wϮp#/ngsVC(4lWL\ئ"~K.ZДDA-Db篟Q{2Qc]Y3O:<%7m *A&l9*t 7aY;'ģy8IG ;fNFN׋fQ A:>Pi~J2GLqk~H0oG8YrdTK"lW& #xQP(W&nFǴ5WuO!˜*/(ӛ˼@F'{0j>'0DX[wׂnlMR&VP5OI ۫#po3(qP:e֛2tM0 M%]A@N ;]mrd\-k!FAg9b;2LREPlK OE~2 L.\1̘#67K}/beGpM Bd=~mЏzr7(VߡVhADKdEVIֽb)~ ޻!݁6vUd:oZ0Qk`kqfN5^g#r~e\E]|>i#u~B WdI% Rllw4_ϯ+<]}YNKcp"{q'90 ș { խ'nѧxtU6w\`A T\NPM'cWLnVFY3 Q_8g9tK&Apf(_ȁY!qr kt #=ި2gK `k[1{)S+Nfg:C+slF1WW Yؕ?M >caW &˃͉"/_[^GUxzÖp6Ōej,kp3 mˋA1 b9ה;D1To$ g/-xm Й*|sLdϒPYKb;w7'Ͳ;7:KLT|`ߙjx˻@Tgzi]&<fߠ~yh̴i'ْ} cٍGet,#m;UfބY$CMv2ju5ww:xoPϦ6@2[܏ yWB#76ױP .-L@ۖS-ec3 MKK2LWW8{ٞxҽ:HEԭQyx;ݬG]=cԎӡ% uklU8[p9"ՍbI~֞#bO9LoPReǾYl) CB Z,hw6d ,8JT_6źsg(^WJrDbSrP<ʢx2/d!jxĂ ׁYVujd jGҙmb=WF1klARͽ5_~S!pU*)U+:ܩneAvF5M|R#Qgcu!bܩԾ!!V/wȦSM [OEv*p叆b:L74A?Ҋ/T4pDB Dj;T^-ؤD:"ďw~=e}`h^aqpuR|̙n2e3ڜ9+ >Rvz͌ wd,~3طvEadwD]-D6=* q%n6_P5 }l(\XUȧ|3Smw;cxE4{4eQ+8)SՑt<3]r^O~= +2\\|=}L8KY!+Jҏޯ,8_36AhƾkT|FZ~^< 4_a4RQ&*0)P_wt{sDYfؔ2?96>)HR"mf2͎5wiڴ#M8 Ö UM3*-w\ڊ6hrۯQ, U`-T ,ef .?7ruU|-P=*08Uv?&ZK'7^EH%'ݞAs>pڵ:gMz7Zw%JE NUVGJ>*ph!? 좏3BdQ/N_6>L)7)s}{w-vlX\: YFP~[9wFZc:Q9܈G7nUxn r6AV˃z |$+jxKv8eұų4ɒ4i붤,:LDN^]&pf{v77UtORp(_}yί`Aiխ\:d~7s{h~mAE^GOgEzEE[o2R ݛB%A5ilgZ+v:VM } ~K,zAEQ,1f'9f86-åV<'af_-fNQ?0:WC/|)WӗfgP1~J-ƽj>4wEczЉi6rnRF<m#D]C͵|ו=5]=*%&R&qݐe'WϽeYl.֐LjȗVisĪZNW*,j!;`f zV<J䕾/ =kU, X IVKCjI0e`{yNJji¶gً꣤RapmU447N YSD8=?<'I@sHL0@q\$)qҘ޻ jS\Ttm^FE0 #͸?dO] mZ6@ @Nb7ʚ꒚{vAy( /%i H !MT3!I)dz0 ro0=~ 2qkWܾ8gfV;ZЋ\T -lݮjX_G Uor)bw]HgsrX]^q*\WOXd 5qs}")YBq)cBލ^7v!)L},V3`ʦuʏAתUxLșVerw1U88zR\h{|TUCn|Nl Ma6-QsHz".؉zf`>t)p@aB% `K}8Twso>sp9L/1"\?Ʈ}x 00{<S6#u7wɓ>xaLF8]Zz=w:ֳ1>t~%>ՇD !qZ )AF D3ptM) zM~vjZ 0mVmzZ08vΘgʨ$C= m| w_4oHܹ=^2o4hw iQ"FJ$]qﴽJִmD>jfmV PJ4.ϝ+!$la`!COxM7<詝 X.oEO 4BrdOc. o4b4{ @+i=;ay5H\mzkGڊ/2k}(.oK@G6׿qX*"RǗ'%Ʀ#_b%^΂` \*>ɲ/{"u n$;#uiOe1/j"Iي9V*lRv ǡ<~Ql@ˑC+Ȣv-Ӆ{&Q)SD;w\`q_hHAEˆ \4\sꣁoD(&c ߩqDDq#7e]xE&JZX;do/!WO/>7["au_8^4yh·4/Y w-wikr`ϓfma& SMGj5|:=N"xp-78"P8U$s*dR1<0I2h%*^UB%4I" #?UN\^6Xƈ ($|ˬfWY=ΞD-DӁ⓹M>} o)O IՙQJߪ0|8OZMcya_fф{}*)jjF>y،D l free|T$~l}lyC2sZ?,}9:e;_ǁʲgfZf.nx2KʗL49QKD<;ɂb~9R}M-ӖP o,,zW b^?a9#M-kM<7dŔ))*+TCTAC՞8(C_KFn8#N#!ߟw3zȖXVQu\O%a=^e 5AGypF_÷ sMWM\8\Y ; 'gx"\YYF<(B\n'FN2^OD.F7KQle SA&WAeƕ3vEU΃8ͭ6I*| %#;ef/! YjhTޜ՟2+8QB[K&e.lg]&U>in9_@ؽI&v .I`UsJ‡_^"YLޖݟyĔI+약Y2P[2`v'<0G"FD-ʋh22UNx͐KNt۾5V8i r}pS~lؕ (3_ X{ =0;j$T$nbP8tywYQ$#^?o%HVrl7)飑PZP}m OnLI PKږJĘ:/إzȕJ%wn~لQ%}8tlT)**D{a#nU0CVay~aTTi}x1y ]H0m ڻSWs XPiG F_u![6}s04e6řh \,˹%S//PXyG4߄uz~Ic0dsZ\ ?]?$lY.A9,U#eMPH#$xK¯ĺ6o]@&$4!O$9!Imp5]ړ⮕@Ws߸s JKw$zރǛẐ)9178d`IӧSߢyJk[T}`s\L6pasƒ؃ۼRIkM_lA.f..9evkĄ Sm/2ܨz q\Ox>,&JA H2 -GN\"m4R3q #Qz_֋:VQXxx#Gc8& T.0SW1x񔥦řKS ٖUȧh})H MNŹ`)9MzClԢ]ʏkogv}l[hӠљF#5(kw0 z}\-4̊ȉdpy6C d%!:h@@K.*fU_WoD/ESէɚtlQbm^`ZEo ;M(pF$.-(f :g@c8c\<c&Rjhk;cXR+!esx7˵@s'&a77XwGsbשּׂmmФ \[T&I&X93.{+7[7ώv) 744s8>xLf؋M^L4л-GLp-V5.,ۆS V%8,;ͮVݻ1TH3ɋdWca_y׾/=p֌AɥME])Ї&(C_&j:ĺt.[#F\picٸnN}ɝ=N~-F 8=<ŻXEI%Wk[˞A)PO ~/zeEe=w3G[0n;J)Bca/C%9K~TuˬFUrΠ׉M+aEhWZRn"X;7>%]{_ۍzdYFo}۸1XP@C.wUmedshuݡmP>Yf X3qUcUb% w ъc5,w1B-ZmJhC̬_d?4ĩ=6&>0q={5A-c*rZyf8uk8JI˙oiEsj,jf:wpH"KlTڍ( .R :֟e]y#^$K@6q OPu+xzpa]L(O[aoAYj^y_+; `KnlfTQ/#;ʃ6X 8%90%pYҽ/$GxbʭO. q i鹈!TwU֣y*{b4#9}$|Y:N=`/p, i!D%(]+\YZC0Eb&TV2^?_*jݑ'K f@nWxR!bB C~Hh1V E"G익?Iq#>-| O]oQXD.ڶIe'SAhigmA-Ōq/bʾ,!m9Zf4Q (YR9e6 '4ZBOy^'/vv110ٜk#[Cm.%Tx}  kV R0. sm#xDZYx$[x&oV?G3[強ʜe!V~]GsS[)~r-\zE_Y}Y,'D2]lMs;o$ t288՝Y/V:{>sSn33mȐo}G9AUŇ0e Z|=kg;u<-Ltisaovט4Fg5I欢| :[y< =^+@AEf9Կߧ0pg,FykRDs .x" ?"{0 79p;z=5n!"U?U2}mHDn1Jvj +'w=v%V1.)E-}_(_W"]1Qqk3Ct|% 0|~rkF7l),ykU{FҶ! 2N]k /xT+(S-B%DYK&.55q#ѾFW̉)%?:Gc3Ղ!rsK3+֤}Q 7>/TmDj JfRեb}@#/FiE]`qVg7+@ߦ.iXna 6U5 kˍ"-XB!uXB 4 UѠ'9%)KdHW%RI yHSR ^aO:9ݭ}o dpmˣA >^;PcwGU~=_ K0TB.mvA^]RJ?]D8B''{r`'>|f*T|<}ix])Uz|0ChEpr+Ŕ0tUԻW&3Iř[4J]A~r.K e;}Y?)uWNq29^L#20'H7/?UŴ;r?g/*Ҽ2KjJXő0Hb+ON^ f;0;PJC&WWǜv/x (P08!-lnWHe6yƮ**R `fk-y5VG'- 5wMwSP4[>fx/Xp?ab(h\GR8>zNH}x3Vu#R@ڵauut։ݝ 6 3q|SE)T{^-^8#&-`Xsmݲ9j)keBuƌ(Z ;!{.HߨmeK7,1f`xq т l5SJmqpk+;[i\r`%S !]ÅP.wC eѭ'IcIJU\Ff {U dit%cg}S3ݥn'zQg]}pfbnq^W/kM@Y>Ot!4P=!&_v3U-ƙ'?n"i}ky'/a %+ ֩*GJx+5qˊ䝘Xۚu)FCl!Vh`]!zU /)wr~M~z b{팉[)4>}[0å>C '3]21c/ e;}iVZ+ۯr}[LS<T277y1֤t8#'.M; `RlsN YA"u[y?uX1XU4!jZt۬1 )޼*h(w>et=.o,Q5-|/-djvn}8Py!ĦV oeKw&Iװ9x䜄{brϮ\Jߟ9j6x=wY cG>P-Iő콒vbl3 9Ȋê>J@(KhE ym{{|.#vv}&ןV&f+/fSd[7:nxs@YheTZI_B k  =F\3L qh_%%[E1ikwm#1@ZޫN3y~eM?pY=[Nd(q|73}̒VS*^JP֙Dkt: @很8N`j=9zC.wL~:ZiyO%L#TfE(,Dx?1 Joϰ&IW>?@F;8(3P! \;H$=j,),;cN abg^i8FLIpgWڪ0f?"BGqVDbQTťVoφa,dH߸ 3}|ida%i&իVz$ikPPGz_#M(e94m,lp̩̽_wqv$h^,6$m}==Me`&a(r9NkC N@q(1B(`AyI=ە c8b-7>mS$x˓oL7NBR@4 {JH.LRI01̏*ǴՠtҐ>WԱlKM+t/-;jIV< ) 4vN͗.kut,Тo9jP+9|qxq57|'çſ?pIos7OBl*s aFOg Q{蓠^W~=J / lPOns=(NAYKǭwt d8P+-;B 7w 1jhZc{h$U*2hEd׾)#D&kݡ@]fInw a< !"1IEu "̨a/S85pv1&?yJfٻv5or6 ëX3A1_9C-rCJ%Qs(NX𒥦z]l/4$9kY݉llznD:1@R,kJ^g1wPly<+) Rh0؀2Dzh7CX ɎLD_ldmx*DD"{@d.MI,o~ fM1>;VltyciȋE<47 l^^'L =H@Ϟ1ALk8]q=ɶ\/T}uͷ .<''_5>3 hCȲaX[pqZD+?8wؒ)pVdjO]V2LƘi%JCvbeɜ/(qM&/ջьZIk2 =b'Jurr8 D3-m<2 W!X m$ee? M"￸ }=`I/LѱƀP,ٹm p=iѼ]g, £Wa#p;/7b'c3<ʎ6AA$~A<0$lqpZR2$ŏx?S*Yǔ+Ҥ",W܏awAE@xSf{)ir˽;ԟ,1;Zin 9F$WqSA\, ivW.IG']#'yҚ*?":ë7)iI&Y4|]Y[N(_4}*|ofm΢L5,PvJ 4_L"y˸WzѸgc !=WJJ.yQ7<]¼!al\ΫwAIfR?`\q'Zvbʽz=ұ= E#܆ߟ٢l>% A4@p-i\Yz8UJ% JH)b jPEasu';Z曖Q\U\x\" #9C= DF3;:4DrQ peWcvnim@'kZMzԴVSs tTsЪ XIjXYk=Z"hؾB" -^ǗI_ xAX:>^Xt9tB`(yԅgD',IO1nb?>wZqEFRoM;njdH,>am;ڋk}g kT,Pp3B)sTK?ZWsĸ`4d۝b1H+>X{A w4Y[]{ #.܇" Cɭ= 38R²M+=у\wQab)-$n"TT,|Tf8ٍO$ElPKک5;]QW_QF <9YKk R-gK.iBWG+2MՓt8 XFs ']\%MYеkcF_{mFHp'W7]6c`'@-HRcI;o[urzO{Y‘e%x>zq*u2۴*Y6`캼ͫ+#)w">m &ތo1=w&,u@C?'G8ȓC?4RbBd w=qCgj1gt1jF X Ep0e%Ea2sA"@J޴W}be6G >V=qp=_.{7(L:c\A|I]$6MfvIt5V]IrRc!\Qd>#d\:¡=1UE=CLCc늇8yo VIrY@\ސ_&"ts֗DUTLB,z|zL7CLoN(wܵ=f pȕL=rDMʢ(2R$FVuG ;N{OJJóQ1Dv]y/@ .hWѶrf[J(G۷}ݹ#s0}hcy!*qf`=UCvKl3)Ɍ^M` } |az0f3#0^8Op!1h wr)=j˲i3g,|ۡ_[YoAS4yEs !SA`Œ8wx?6tⅽoe%?YpTEw!{iR@s9,"8~!3căr9S6nCVtyAsdR,$3Ntq-)$9)U+gĤisoP Fٝ)"Ibh4 @kk+|Xls|"ޅGPpy=uqBbɍ*#SfPpD 0&m~z(xEcc PקO#A/iMǪ#|Ĭ<!ylYx "iB~F~w[-ю*(h*E]ǜֺyhL'G=M\ҙ ,\'Ay/e/"fr]bO ƒݶfLHФeP{Au.^䖏LV:8BuCYzφ5N[!7! Uɵ ~ f;2AEœJ5hޗX&9?KL(Z}[кOF-F}3B{Uu[RqOlC(8P wU3X,S/l@koԧHQl5v°yd2*=y=VJMz;/%ȴ mF:L:w 2b[g@s\gK 3?9~m^bV4T ^>L?H4^4\q?22@H56LQb4Xݐ#ŽwM!u6M `E*^ᅢ&oVl1T%L5W^f[8 R/D`,â2;FY\v\8-nbu+o>XGQ45s.5}wK-Ć_\fjzlEks!Ϳ@ȃ{u%a j@ݳkdVSMφ ^S֠0@qO1q$$k- c[AWqt}:ܱJHS8p~޴IUOj.jc^ܑs?%!UbxƑM6g wބ&p:DIlmְ(yIZ) oQ2%q4 wJOܧ-ttJ-l myr=YO&DMI}pډ* .Fe-z<WdR'8]AQ֒6~y o 2 6 *#E k]ۼ%Fk%|%P(GAPzyE }ڃTUd}ǘwL՜eR>ČC`}(-J gU[gz!HؗS1Ŷw[v'Q=o4^,%SJ¡ IUayw8P&1m䥤E[)S潗۷7n=kjۨ`TNw 71MOt抢c]iw`M=HOx81rQ}0z(}Ere, _l"?c(w~b55&=[`]PH4 錪T/4Y6SUJ{C} [<;|h4o֙o}j?Y0)kԻCb٧T{o_xLd`&)A(z<wq{W5-mz2#"jFGƪk]ձĪQ` Tf'CD u0Pd\ωp~D8HqnO2'N^^".q Jk5~N>@)oOFI'/@o 1% yt,cOpVaYUӝVLm0*%W$l׀9l&['cԸlh ;$ٞP]-P\ܷPn9cp𩫉g<ݴ?]'F&crjWG{j!u6 g h9\0ըh< 纃s.%7x!kA% qs׶4 -)mT3&d& E8)I 1Y'=1uH,ncUg{UTOfcZ@Mrl(KWKdIuQ2hw7!EQKKRUޔK\ zRLb`vge9W,,Ie8Pa ˎoge}9+/"R:';9:DfwpcNo> f\b hƨu7饥6ğ;]d` vك!q'œ;ىMRBVzJ4,C!|9q ͩ hU6Ȱ ׳ON[Fo0MdkM젡+8+mWM[Q'S CH^"l2+M=Qq\窓y C8c.Ǝ.~X}eӬrUW[u/)ʑa3 l:ow~ojXLF29TB꽡.}q3ѝ\4 4K@q`T^IµÄ; /(\f({MMd|>!u>"s_"+s]ІA 3,j͂ v&l?oSpd%DP,/)-̳+.{IVY-nB $R!2ѾtXQ8S1rb"ƝTE"앺eD? ne^ ;fڔS69B4Gkp;zZ0HõSSB:KrJ\:1_HWdpE:ґ 93}m"1IXoTp:bγ0:ǾD, CJ ڝ1oy}OY~"unfx+Xn^uJ[6Tj6]P /.hJ6yIB_ G tΙ!H1á11(z,Id76e)-c~<{Lua$h+6=k_GU쌉hOBP%.EdkXh/qm 6RV<iIB t˲\S ?$}3,uΓHW}RL؎p){M0cF\uy>jZ \ZA/ĮױEݘTKkM춪AO{vGlt:W]VWrЎ䚇hIT@\DyOM8wb! d_B6BZG*rPA3rMT2 !{kygqfdxJgP'4x=N/;Ќe%aWM tN:MjJYĠ'^INǭ$3C EمPn0A9)<àu oJ<6qrՒF6Љ}-Alo4)cIB2tUѹQ Ĭa]0RڤsJ1eLBR4F==Q";YԱF 196XO3I6OT /_, e6WFCS>Hm셯׸b`[j&.pTIl1c%}^$@ߑulFde_u;N֞fңaܴ(2]L=v8+[pNmjB->!N( {Ad_hu`@GoP7,`bc3V^;j2{+{,\Tn ÖN|^C9q ZR$q?XRJK0z6V@V {¬Vizx'l֗P @yI`j vEwW&Qa 0ehuI=۴2ԑ6˧!ۆ䝮˚ZyŨJ dXwԛncVp 1ffdIq+Os^|]|{ ç,XMUr@׉a7P4+R C/_u/7)K{^NԼ ճ}6 ٽ |kM ̱jH5VQTn`/UlxZYnѱ4VUy)A f+5?cXqtm"'=U%!Jt>(6`e9 Lc84DM2h*|] ]8lch{'UM&jk]iuNJ5/ :TMJ`}0`Upn)R`ql ?\<~!Fpic2 rr1@i 02~jN.X}"V3dRjÄZ/[{<$s;:cV@TE1-Yo&!-,#W^b~ ]&%Bq|됙l-ii{܉# ş="١t%GɲC:a)1o?j<pFӺo#UJcP \ 8Lai5Xjw]NA"ob_Dy=O& uvj@ X15]ՠT? LҘ&=Ȯ@=5g܆J\TՒ!q/' ~m@7/M7?L׹N'L@}hkIxvT?YMu3etq@ۢ,-]])n̩EjԂlnQeoPN?Xų-/GWQVGKly&ޘQ(x=l`b{% (sgE|3QV szDz <Cz;rY!j@ʁPvAYB>a`fz0=їm4Tf;P~=BA:ݡ9ifI#<nO}nh\Cΰj an}lAQ[zpKIEˁoy*rDf"c9.C9Œ)il q#$HnG͊:s\],S7&5 ~m>P8:NpzLÏ*zes얩ȧ0P_J6?<&q~Ĵ6CNw%)5gR5\3,0G(!$w!*Hg.UB$"ش)#0tǤ%$X@`XzaXf!fHjvnt$_Y@j|jP3_dHng6i̷C{ cb,5LU)#(^gz%&qV]ݶeVsaL.e>QkAPtbBL"g$e yͼI? %|)db;>G[o{z&.Sxnd5W߹aH1.W'TkF0 FIY~d^#fȾgLH1OK0D R);^T8 xp-`+F̡ 5Cl $S;G[y hE]}(0WQx*73T{/ >}ҜV*H/q (WfB,Qm C/;n-Xl"y஝߀{u 2eHcS=Uw.(+f4h&?66&:進e< P2[~ YtA`z?AFXϲOD06`[3o7p^w` 0g-1}xCihfMXá# F0چdPUEW35@e)y -CY|F)ɚń klKl9b-߆-C\K\ $ ]&x pnP ΌFQed ɫK@TmdF*3)g7bIg#j8tU^9wR8dA#c0'F5">[< :d~$ֶty՗əZ;oAVM9=|]L?CII|Iy#YZAY{:燩4btj=#ΛFW6aLg_@Ӹ?~c訙0}?pVb kSkR$eKapդ0'x-ؐBOCay? *kcM}`MJ+y!ͭNڅ)G-4uDː(;b0֥mIr"Θ#  U, rU2ܭ ~XY\OOY++8Oܱ#5'_&[ mm$)rq)+9=OGY'O=jݿOzpM_ǯ:}̄_F#4  'X% n|3p?Sf3fgi$pr{qAM{2Lya0/sL<Ҩ S;n_jȠT 7 E(xG jiԞBpŻI4} :v]}4n*M43X:楔2 bGpGR&brΦȦHfO[Bݚ,_k|^w5OҪYƴCTt j*:ƿk@5ݕ6*%|#*lyi/g>@ݕicX6oe{-,H͎_8;Č\,c& ^S܏iR;CQB0&"}~NUdQu2gwF!Jށ7(pܯijԐ@ۑSid\'qH{92>]EH:hsZWlT{kD CCońR}_(_C?{<ؕsp(NKR5jQ оVC>*or"͓J DJN5!JjMCDhg(I)'`#nsV/uԹs~ɖY%?J3hTՍ8cKLt]w7<6vRCS )E)=|NDsV;0{쀗AMM'*U0[wi9gdX̱Ks) D;p0LKqRr:/KM-|˥`YqSGYwzj3h4g<_mK&adx9?@FRw* 7wy]pHͽ㢰{<ưZ&RSukFmK)BuLN5Y ek$D*N8"їRSVCQZA38_&DP=@r7(3}CL>eKݻZ  -Df)CQaT(#D!Tx (yS1Q8Jd  %'Lt#؄iZƒ{YJfX饀wbDEHz5LڊdnaH,'Z(E0YJU(츋TcNXS^evFǕ #WmZ Dxr'Ȕx_ZAkP6Az$m*?y@'BwV[ϋ^b|aYônn8tov3-2[5\5Y[w ^pv6\`5Ink{gU6jx(C{/vN :Ⱦ\L:b4qTOI=*jgàӬC3.X\VN֛D}1${_xr'_Lo [0ۙ]`&+L Uu4B~7>GsחP" 9h??Z.·4ɐ8? 3*h#nroS5\fDo >Vzw\Hk3e6IFlvAzN!5ү >'\8Tij o}OYA?q‡j.zR~"ei>ԹYOpw!vL)yd\WZ#21TDG;j0~'*S:U_ySL ;k^&3<z j $=BaVͪ3 (4SM Į\p=v5]=xeL-Rx_&S-ӊmf2Ved3hiwPEj2JF,#Tto6 ^; &Lܺ)LgՆVyffR_);iΩK^P̠(y`nw(hGG"LGKŎL^TS f#@Jf"87ۧ'?{Jkb38$|KaCuAYV- w_!/8>ò.|qxG$@>ʼnPk}K9sbE,Ul\:]ه9qU& (-p.5/'EdDu֫--v&3-^3xGJl'~%gekA O=RȀ)U./% qO6.@+L|d/L2͎]kFh' _H ֣ng' IKdmyx^jFY%>N.g弦<# t2^i 1z4j%hT k`\DsaP/]lJួ&-Sԫb\ 6Neտ~#]k7; Q"f"s 𣠇l ,懂9 \r@B j} P9:tkqgy^ڢ$H"cb)F=IDh\s&sJ _eYF)֔:_ts2"٪pqû#\vW,E`g!.י8OifWazqA&h0Y0ͫ C˜d%I*AU}a'MlPH_I$! PicF1M>Ծew8 lI6a؃Վ{AnH\:7['8hnxpQ-XP *vy*#yb =A찜ʱY+J}e'e{ z`dUH ˋ/⃁432$ 8,HA¸"-r˘ 7}qTH26 e5Ld)"sOM#XYFN>5# WMc"}\UyҠq;~݁ b&1YU}y0͏#X8$؃!2DD 7AU=X+`Kxڱ3H:8vK%#;z9/<%{lm] z*-̐S5i炢[ՂyWGv$\b&*]n&TqѾ; cnuʏ< 5zC (YGܬ4Ac- 4Y7=nu&X7L#p7yKAY{E֓F+xâ9ʍƂw"X,V[-矹dnl@G2'F3ҞpZtO\+0dkΓ{ʥjjOZ}J yP#NJ||$o-GR"RW52T7|Lu2Mj_*r b8@d;4Q~Aʿ'!%5f*wmyA^ ,UJJ1kyDLTCjU:R M|W.*EP^2a\G Gj0KRajN7 zؘ&e0隷gD^ C]2sҠ>3ڛgg}_(a(} $M2wڗsʔl{-?*_`/ m%$qԈ8}5!trpiJ &F6xj3nEEɈV $@mJ Z%F=:D8q?yTXl{R~2Ѹf;sP|)oU+V[{ѐ:Wn#{xJ.N:גˈ+ØL|vL0ɟZ+ t"*J@,WrWVr`m+8ʙ9JnP I!2aYFHź۴LwyZ1@h/P3hxҊOeQ=;hT.oB;ƈ?G8t y?e2d="A4;$ ;}ܞ k>eg{Oh{kxYD|WnvAD=025o$%OFaG$aAioL?s84֫ݚ^s)>̼N>!{EeP4j֚f P*;`j60yZ@R-Nt*w\\?;3 m5 BLV.h= 3ߗ;/ݡt4̴l|u7vrg/o%& KjS 7E=dIy(8}$cwV0*Ss`7ՃG%PD':YrPn#ػlߨOW'. <J4QҊ)kIJ4]OjP4T-/~R+Y,{CӾF5 V7),hB>gh,/Kvz\rm]vBS4ɴ/8. 6 RlѲ}/I`1CؘFnO3l[ F{0ѧA?%w\9cy;=]>~b <=B(1`-X-6wgxTH|s5.WI! 9%Ydv{ Sk^vݻsi䊝7'Tx,w.|z}~Pq)g@+uL(%Brp2.>tʊ <-8DO ݨ&[D`BȪ[ZBUIXrp(r2e xok#űب^1o(N:T]p[ls@p`IW&&3J{,iUne6NtؿHe W͌N'ǫVRO?bWrנ8͌W[N~̅ɒTG] }P^Lv/0Ʒ_ 2!'*W>M*S9d H ˷"_Og;u6UAֿwNUΉ"y3[c5\T 1p[I86% ]4h:t \s%Lű))m&X(j",Qdx2ug׷qp:_9}J]zA{& +y{5|MΨd4J.jpb4gnnpm(˴/UWpⲥHhd* vuFŜ3{=gu vf^rwTu&1e #=D~mݞ#U~y)KV ܶ>=dp"Hoއ>HSج`$BynӖ>٤O zzS'&qH<-e\]ٳ F6AK5p\)5p-btt[\Ƌ;e,&(PEK<$j+TL.)m=OG%ԿX) ΑW ݛq ݯ>a4( Yn)}%yjɜ\>πqQTC}T/ ̓8?lsMPh*ĺ~<ܤlۊ?/Cv)HWV3Eoꁵ.pjĖX)A =È1e@PEyfn!ʑLP%0TZi[|\8 9՛Tt"A0Ofs?S*Bo`!FPÀdi^AVX.3e`d;{-W6)(2<=udEUX#Pܤ… I4XBy n6,zlllMNNL61ˋZKͮJrX{?y<!!ՠFi>؄Q,̬_ V,gdrލmGAUH4XhN0JgoIE@_O3AQA0j!pU`LK._0`7L}8ݤ{52󕇑/)Wnc>xuI]n;{NΩM,c0iz /UdTD-oGg0~ f_Ӓ8MoiPPH CW3 ?WfSQq~kA@4 2u-jwdo16oǀNBGz;o?K8U ˎA[0<&AL›8)^{W,rKfQ_ , U.A3ҸgPu3DĮ~6Ehx䍵Ŋį-G/9Dٮ8ixAƹWF vp5j%r0ui ذ{På) c2T V-0T 0NGN,\c9s(ی2^L ,5)ዝz@ap rѕ%{\|P[fbz;Y\ I %4Q6j>ޑerk&nOlM"ukUN!V#0!~rRNݱV]t&qhG`_Lrֆ#FvYj9Gq!O005/&DX^hZi7;T[bMb+5Dؠly -&oX@*+Aw~ɯ6lTcY^9ͭH1,.e^DmJj 6{087$?C-\lV\v8$V=!aDvƥdmەs_̼m=~eJހlrHK3 F_4ҪxoFSpI{i bp?2b2Ӂ5^בH5P,D@ t7QyI^;D[0˜Y݊1@:1-#@`CVc%Ȉ4Yɰȕ>i}P 'T-v&HglJ֣Ժ;,))2gKLShocqTEv_GZm8@+JMTxgjYsH,t8OAӟ;B0Գ]-z', 7_=MNpafv.a1kM)֧<4{|t>46ĕ[[ݕ#"3`x< 壎YǗM8L&3Sf&to= ^{+y;tBN&3\bKW:b$12&wz᫵K}47SZaG}K3 ^c]~7e-J%3B9YDə50ۿ"^K^i=0.E4*p`bL_bpW<' |PRk^ك8c4\ ¥bK/b;-&lـ Yw\Rdp- `0I;>&(<5" תi?$DUS;Vi dOyX93HYJ!ȄOhg!0OBniN2ruK`UWA2igAdUEcNOy3| E[@t*V ?=omFR̓@mb`gnC*~IV}#{Ly!wˤN=_I]5X@c ]JGz00NR-.ӑS9HoDI$MlB)+t_!3"K T6/Px}s -F#/}Q?qeX/-⚢϶>*dzx1P$iij|Jt,2dڑ jc|9T+GH<ĩvߎ~fZ4% [ )kizdNe\mpz9hE:ٿ,d$)10 }sN0/ҞZK}.4o )<92Ͼ,J0oϹ战/mTʣ+X<^oH(5Qyt o"Wi8&99<)!{msPxQZKoi1?m-cK>麕{GK̂Da©xՓAo,t6E8Rtq[^fYoB u&f $ؿ(BNI.o]oP%|780µtƈ`8C]@ʞ߄:d0 @H"<'QֲN|F1VH["W#tX#'L$@֌rC& P} Yq D*_}xWP6gftR2YD֮biFU0/e'ޢ ߾1>fx̰IɩB3W,0:NXdܺZRJ,z|1 Ht!OAI-,!^)镏5ڣDH(U"7y5e1@4;PֵRma;0n5:4( a] ;p~B"1KvfIb8".(6,^|$5Q{bwV~r%#WU:$/F~`~$ Dψgֈ^66 -a26HzlB{(B(GKKPBM 0Jb>x0IB~[nJ=, 2 H^Y1  &ljTep y1nH)ylQj,eFV]c1l>y>oLEcr|7Cw֙t>8s rkJ}(ƩڝLRIvZ*/8xoKu"9d^q/ !1t$Ւ^N!=./+4(󯺖*x7ϙ8 <Cn-s pN>=B2 c,l㝈.%xw@$hq.} s}7:4T+(a}7Š=k.tuM M׌CȪ4+VT騛Qεn+;;۸2@أ@f2q\·v`/3KJO0(S)+ Go/}?肹{G(kjh)L=I^ܪV( m*>$o;h n^w)~L7.|ڇkĹq{ĥO"W 7 J7P0+llmoY;8&mc'ʠ!{0zʼWJwcՔ^o{!ڮ) w hu(YM*m{ 6yw1O.1ũd<#fQrqגI8/o)e6ukbx%'dz(Pz sA╁HJ;Fh-FOhX ǝ^Òv/ypuiM#B/3 Xץf{3b;7#jv]yk4>Д&lD|s]~eɔ"D1Z8)Tdqc,1Mcf~DYR+0O,bY6"U^ABHy"xRKOHֳb3$_h) s3NM lt#,HQpiQ'F "0V S :rW{H,ͭU#_A aW߀f0Kx3 FO:SX|__poKu4|=Eq%G7:ك2׿f+elc06 %;zwnsW Wbb(Ԏ_-UauRT,$ -r1XqZH6`X"z> kj+."݉@$FK#Q!D㕽å6ґ? Y`P܅ʹ@eCG3P9!H}/Ѧz}>vA. '{ `w@T 4j捨" q=q=:9Vv> k9PxUǛzYU{,G+K|m |KZY?NMFϼv^;T Y@2[m^ܠDL ƩuTMDGÒiO&$v1Tû9 ER#]}Za".9O 'E")MVrwZXUd2`7fsRdt_B3WS ǷZ](0 'U˛)%~gGP{%h7078-{:@+?頤}Afx+3rʗ>)<޽?.ǓG P"i P̥&qnZV.@AhJ걼L;L%׬=g`,gcs2<֢I؀YjR{`WW_o5^3M1Cg˼@eeLqDX . bS-F&3}TOnWs{EV H#_{?U,"%q loqTuùWԷ9]h,f;*St/ޞܤnHF50p&:}W^6&F+R_ 54Lu@#%aR؉NߨP2^Q12ރ~\kHo{Hp*KN8p-۶&TKuYI}!o懳Wf?:t#%?'dt o]oqRwe^O-jkSpbS7E_W#-r/),w2C"%ފӈQ@\zRk%D 9'Ui p*L j5-] }\OP ] ]Yf$D/7&QZC;S|ɩ^D! ;>;WQ`E29R=.98S َܐY;#+(i;% !(f~L%pX!@џ%9//gI =\3@_A#]Il[;G_#Rs҆jdbӌ!uV򸑄=΁ #֕_E&Do_G> _IaZ+L N1JmlVV}p.JZAo-Ԩs=ФOB76@.-e:9Ӿ ̟Nb7ѭJ/;ehoj3Z,pҚ#wdrGV6)ZR{WlsM)d$}/ழǤ҉yWgH):S@vn_Jv;چvEiƗEEk=0C˵n_l+ c| U; Nt]Gғ&uĮnϿDjr*\5"vZMMow#N&2%Fgop7g t M}QR;K>j0chWDG96yϣXj+/6cg 6mv{GfjT㱒d8O).#V' Fҗr]cHVsH" āg(=([Bȃ$x .'Xrvg0qKܧWV\Sqfc}sX.H{3$0ٽWA UA:wR7]a0DVNJe\ [HLft׫Y"uw>X$˜KK\fk|]L6;B"8,ǟ-0 mň>Д9.q.T}J-9H ZN<`.:ȗU6Ec"7Nf.a!`?_)(JPdcs"G 0҆QYIE-L3[}wqY?.$0&[ȝ׍[!C!e9}!OS% =RhJ"mM=90=TR90HNs}qn {w\oKbf4-T\CV B~+gv.bhZDO20 r҂.E7hGv{3LD*e&鱴:2 ҍyS1sgyŦՄcdV((ӥOM5뵐"oOw5lɞYW5iZ+%%eޮQӽMըRǁwna }19nƋ:m#(Gc*#ŰF2 dф<-/jpo!F`E1MϻTR-bL}.fOӿw^l "E/dNH$H3exdwO0̫MY&]g4ю)m3Vy\pHʿt!:V DvT)]D.G;]vRL\Z5)lO<`>N/[)_kc(dX (fg5a UȌky~}(g9"$-m>Rʱy Ŵ!bSO%oh7(ܰvIG0\G#56gաZ bYE2!uT,>)⿢cp𮀞4 hZ`Gkw^ V|T Ʌ;)Qp=#V)ʶ<|崔Q8vaQ z\aZHobBA^-T-Ek<;y0f_Y˻^ uDQ3A"te>P T.:c,WvM;'\q(&%-ߘU6wYfMӳ{Q Vd1j-fot{IV8<+_ NUTcݑ=^l. A \ag~>ߊ|rsW@p| Y6 ^e#ďp`CHh8 <10΄I/w})fzxeA8RNߣe<Λ0BF2bgd1,bae:+u@ oOqZ.?bˆ')Uժ1NE`\K%_pX~j{bVH)s|bp&A=LpRyN =cՌ8&d&FꬦT[C=R'GwH3-k<|5dRQH)bB6N,ɬVvݵ+.aQd6@n_ VG>k;DcJC8A6eUn@Px߉Ӝ*!m@X%$RR{j(7}GB{ei[,\ظR+G U8#;  v `+jj_jrH}{=gYGI\zobNp Bsۉ0.xJˏsQ|a6ZOFawPEEϗTOX EZڠcۿ>%Ngm \ x/yb.2-m5d'7>b\N. ='!c8~!gzyF8'X ˀCu%ؐ+WWU=$J?2;_ Bb%Ab2u\3LI a,S7qu;f0 ds[E`av#U;^"8y) (lnzϺggt#z5ڰg)'3[n1GJ 4&gjښ/8_*tcD:ǩ)c͞[s-BE$i@,-BAm!gPQ6WRpl!5&J?㊺B{4c[i/eR{ăpoR_(vkB\釔d[!D1,O^D# k Z6ĬD s*+9;o/W\@co5UZa~+].뇰uW6j큀2}ȑ䑟-M;}kp6~B x_LF _ KtP@ul&6ʕerBJǻr hfL1eGxWo֖f8Cg=٢}HĒ͵SCm7)$."H۔;=FZąR*w )Ɓ"].O0:gإnRĪ:iF}g9G<^35 `Zy3 lg(Ztnek󼴼?۠(PEy;Mx :L$0ݎ)kuIv7Q:_PX~nbe%=AYc:Lk8rUbau [)wXhy|2 xA; +ۏ qǮ4и9`3hFry6UjY"Nދi( 6L" Q|!uQɅb\-xj\T&\fm /hASBYݾ%N`KXi7;Ƴi u|+ nKbk1= C%C@faqANaظWtJkT2s6[wΓWgF>(r/Ŋ_AyEcO+֪e#O2> 6X篡$ y*p) .<1T&M$۲mk~8wdH?A2k z0iR&XJEueD!L>ēM.`Gu%qH`=Ovvp8uoT.8ׁ1o9-]x6Sڷfc#V@dⵑP0bgH6`S~ SJMENc9AhmGhrbzy~ ye4}$4Wsb=+ U_iӧeAxZ^5Nle%i q%Lϋav^HM2q߼yu2(p[4&+dItc"ݔ*LB^AȴڅE%n7w91'6XAfXo\8@Sv: YqyEDMk 2X$zO0^nDKQ>ҍc]CB͜*C<)bB)K{lͣf}G@*(IkX2o˺?I2&at1[#KJ +WVxo 3Xj$`>Ő`HpoU@%$ ^4mZ9}:[sƲaV<`z=x}jƈ$V8OSj&u'@ùJ). FZF{h8@p*ELMW!r>}NznbJܶթ$s%SkZ%̶)naG,ԊzA%dt 뷎ã+,}މ_n1Rܳr֚Yn>ʾُdNR߫@0pŠkY4DAЕph{k/ @d PQ&睡^ZG TTUIџcHz:|4Eo5Fvw&tr 82l&ޑGwYv> ΅Ӡ;bZ Iy~rlw?5&n(HRHr!iAC+{@j!6B袐Fs qJC({9Jf:+?Z_IXM+`4jgpך2 YAkzGͶeA{T*XYj:@6Z&7 ۙu TSTt/,Y`6ψLƠQ{I\Řk^s%2kO#<<\i,_Uk׶`mZnhXf,V^{"@p_lFcMT#8dg b@| Q;+Kp hWgZ'ҼRJL:{/e2 SBEh*d&ץ1m`t;9GM/W̾,g#Z_N5 a\ywn=I4ӈ6NwygrwOOv TZ?[.~WpU{0J(~}Eݒ]*~6џ 6`iW丄LY$O7}۹Lc]1z}!&ЊӾ@5B > eZ'*cD= P't$x[]-M6F*+UMb+T= 9@tX1-$|0̖`Zd:"y3ѾEnS-vŌѨ`1Z}1"٩U`'tw 67Kt5tR)UKcR,zQe's&nwl*ezץ!(h=ST.w}A*+aw9`Fm Wwٻlr8D% =4F8W9s ٖ:bpdk6>+-_EYL~F IO+ D'o!ս&`b2}F04hhD?TɰK{} %)"2.`b`#3}cݛiJkNg%7zQ:=q$#%}iJT2F롳B4k1ogg _,+EKd`cQ@FĄWP-ɷl2.>O*R]ƅ)޳9' 7(S[ uNܠBd4||DZg<5,oMi/z.2C$SZpI^F_cڝ*?TV7{]/S$AnV4H1n8(8k%-@j6)tآuYf|$2YlkQX/?RpM f i9 "yގ+<j?!ǰW'tsE 9wY-ߙk˹@d t?nT) [ٱ+ͯ LE *i{#_G,cY]>Ӊ2v.Ȧ1/ܐl8ϡo#(n{r9fcBJM|/B`v+~F;f{^oVG#9>VY U&p)T`tCx[:wj 8eǦxVք5y)laGƽuRIcXGWzvz3NbCi:EE'gko2`@Z!fCU)[E / @[K[:Gm m%ΪIF=cΩ|HtVhڝL#k wKJ\cCН{%8A+pØ q1A4Nǩ$N܈v!͌b+֟cr+!.!>WIF~OQ#k}@׺ !ι]6~U$B-s: ftCPnOt!@ Gn ;(+~ʙ%{ i9 z➗L |IDl;19%ϛ׷uuY2Z<`+=Əf^7#H6oA gY5TݛwrwJP^VD?wŌ&GR^(qQ yo# U"xA8>JB\?6LvNh-$0 Odx?6̬|Ugu6U*9^?٪M65095O.~0ܳN^c(X͎+Vk#eh;Ӷ~ѼLh1ZwE *AF ȏcqd6lZ_r}}4wPTnNz`TvzXX ]xyةMI_>lj CJ#>"qǙXuYz1/ZNJ ?.7MVT5h|x: {R| Tv*ω̽T./.ZBr6Kw]=q*'ܢw& D&~ Ưqz\RT;}cR2E$0'ƼWA0+Lup{#y'%pXyyN]9Ƞf6DqK3l)&D>YlJ RŌ'@B,Y"erǵK3/2-jZf-n$G@֥"W3~w}:GS8ZIɡt=\jTx GA"ɓP-쐕uU0H7^p:ucU͌s Af`aZ YjBeS=vR7]( P}#E'm^? ,IX7W(S묠m!/{s.ffU,;SN-3ً%ߓC 6l(r| BTI\i CfyĿ)٤mU²HÎƥGlB"SB-5gM0+7z'xSGUIoS׫aCqo2`{y6OT-7ވz~YU<EHC=8 z3_Ob hCL j.._} *v<2$oӃ VKWR"? E'Nm]2I~6@gVME  tZT9WYzt`U9(>x3dZB;nN8V+?L1 A2~\WCHIAEw;nk$form_fχKfԒQOM4yk51ࠨXmH;*Vb!1BWUV?)m ~;ЍиA%YV^Gxzs) n&!7fjʲ ˡH Ѫ>枲e #&tHQM}n$F?p5V}2ze UƠLO0DF?`Iïjf̩oچcXiu=r9(GvoډXs%N$INƬG6O`:.58l9Y2nt0gBgjTEcť+;Qv鈆x&J[qex7^bu\r3H#. Y+YZ>ٝyBchՙ3w7`[s@@e};O&'j Ɓ mA.+]Ȝ# ԣ6j=gNb t#5@-~*־Œ^C/v8ZW3byn9hr9Zgl0Z!ޙMKa P-V&oHcdJQ{Ĵ"\Q#Ӆ~t`3@Rqldc|^#gdWE^R(1 q\3[&엶z%16Z6')- Oԟ\]Ygpªmg CNfz m櫶kX~9HU5` Ïm1 E_ ?bB`s[EC=r=59[&Iv*bRenAyļ$ѩ?U.=^$t_v{̟ey:%8m|G{4ǖK-Hp6 QbC dvdjJWn cC(yB2{߅>l 2o-HX[ twx ]$V`AlWz)Sȯ_sbQGrVL:M%NoHEH,}$Y#ń/ ~z,%n"p/- I&H3]4_TcF茈$?"szP~#Mq%$ ~?r\D,XJS*HER Z Q) Yk!PwԈ+,W^jtܴ+ pF>~"_Qeh'nCaHV4w\8[U6 v>P 35fCSv*gj+ ԭsQ+h(O<)-< C/ W /ף$[Ԛa" ".F:"Q/ ,jN?L ԉ+#O2S]Uv|Z RajVrf&uCf2Z9Q1B.01P jcYVGcʤbNģ`ٯi khSB~8+ɘUiQ%UzO *ssSxu=0U 7dG`.*yն4Ic tX{ ;:iyw^["K#N"Ìؘ E]j B(]UC)7?kqkf }Pl St&ݟ Gs d)0jt~%D5$$N&װMKx]`XQS-M|ӓ~^|mZ"QP Lz5oq A!@5s`m13s; i¯g-`h%\IyW4SHWZg+n%NHΝN~IÎ@|͑J=306H0C( 2KC\aӝgT[E C{$:'<2.u%< PWROdVIq¥l` ,$.P&p.fS32id85JmfOhyiV}|SV~ˈ-]h  pa(!i: UBs7پ_U0qnp DG}[y-|hIPG_+kɹMeh8!n38f6"@>N+; iLG=U{vP>B_*8Ŭk^l&j\hN\󥄎"O,1FA8@:I|QcY.q/{j> nA.872댝gʻ<]2zkC0; |!4 =,rR:l$X/=-#T҈0A[eV1B|~lPo'kj l_K /_!ߕeZ;/V5ƷױfwCt7T*Y?Y}KPG+q,ۀ͚}֍&٭Ok3Q{ x~% EspgʺdEG 43ڙAY2ZtS4&gxԹ-ût ɖ6 ~3Ar؜OSƽ\ a20)jN6'ҀP-粰x8OT9̲pY(U7~e @tf?nfX N XeLQkF@[ 0-g_ּtw\9 U, x%XVhY:7`mW`: xU2oVW'$~[ڍpNZt]Ց,zZh% Bi|EAMF7H0\N}T O:5K%:klpO4qmpoɫ÷賄>(WD#(K'H\|^4l $?2 ?r}Ӷ3c1x=A[[ {jV϶@kcMvxm4 O %gMqܫxuyQ͇)K0j^k9~49hܨfOKЕ*Z5? @ 1}!ZRP4jgȈyf<q/E,0!@0qyj?_ o7N\ff5m h6 t5EXu7nE}ˇ%IXEq1hK])mOfG)QI&qvqzN x} ! A;އDRSgZ;c}K-/y'$[kSy`"(3&i@A2zĎqJU29v `MSzIx*c$%'aĹR /\tmuYɲ}_aϮ2 #v_6-Q7.c=n5g:-{EtYm`=Lҙ} KX*9>ٔ[q̣+}o5#شnMCe\|OC.ObwAER I9ʹu[AFL)0/'0h˂;n-}^b،b*)U! / H;\2q6m x zLB嘼 BFi1֔4Q$=c99_r|*>׉޹[ 8Bz0^3eaCݬT;"q}b d)w4&X>.@} mrQ}o;&k >gy95V~@!RK*,f60I/ D2q ,?橒ɱR4)/R9s55 aE0!^Fgp4ҿimǵuYE=蜓᷀&/5?1Ww)ZzZj^)k-~onLbځ͡d2Tɯ2`V[$"5Q)~xKS=f؄tb^{?hpj\ډ xlE PO8Sĺ^+LҚF?s߽>*,L J=O8Tp׌)WcՍp'3j͕yj*b'5ԯžKCGwDdCUUdlb=ҭ@u ޲SC1\H[O"iHu"mѬJ*6EՐ4e{S\y|hj+ 4Vv(g Y0WeOʹ~^JEX>wktc%?O`2HDUrp^15Qj\wHT̰yp z[71vf,QMףt78.[Mc {]۶ h4qar熕<I'"MfأHŹhl|Db;P)<kmH; EqR^^F^gg-) p"~q[_JsثNpC510;Y`X.UXb_^/ghU¼ϒ;{ =4]zBiں-K6( `q UMGBw 揘 0Y|؁W#~jPV0Oq=?D(dH~ml,,Ȝ*lAi.CHwZSl85mm8+Ng*ϴi#sޖ<9?A]ѿL͔D+ζ)[8[llQ ]HmU2?F^BU'Ʌo72!(Ѿ: tT{, #QHRҎ9M74_x==IW?{(#PNNp)dqׄDJG;o}ru-ҷ{.gAJx||oH_* Ke-PԷWƍ7C2H,e4Τz0 Қ>2%6r9;]fu>=teA8k>黑'8x_7,XWW?& DN:Q7]łweO^kAhy>\<*sG|؈D_=y-Hc"yK]:eNmw4iMZ5O~0:Nąԥ噫­)EjGT2DxLH `rqwz9"7R_tl@W 3+Id!S9#֫@$@'p:Vv.T\wTalR`>g)?` {sY̷X6S*:|Q+^'KB Aʓ17d3ղ˭0;3ؒ=Wΐt+&B]&G,h'';to&sMPnx@G"%4CiSpUl~A tIȉ5YOr3wnZ~M?0ƩĴ)yKfd+5AMGJQ wf%y9>9N((O 8\CJi/~ԢZ:hշ#c9 YdP%/6ob4Fb7VT`䨜zcK=)y{kq ڰ0&_ҿĮQ6M['{ibv(/VL1jKWp!ڗVuϖL$L_uمZ|tPH-b_Xz v} rwңP^,j$ ϤQz_s!%|,E%I)5N ݉-'5C]uǢKEؙI:Hâ&o/vBI\4!zԗ=@~[:U.o0 YZgstat/data/meuse.all.rda0000644000176200001440000001114214413507477014675 0ustar liggesusersBZh91AY&SY]]]H϶yxqy!V !h@OD"iLz3h m4hHƚ OIi&&AdmHmёF= 2 1OHPhI'MO#I GC4iz5M=  zhh T~i =@4hhh4JEMzzfG)6Pzhd44dhF@ih )#h`0@ =0 d0dhL`$H@މmDGFji=4{TOHOScSL'OРSzBciLL4CQ#FmFFF554`=CFF2NЯi-V|WwpMp m,-Eŝ bPH=mR\guD@O!PMcA; RMǚԪ"'Muң`+?XBDδTFݨi_ OB]AwQN=}-MIv23_#l[}l:DUO֣V6YZvUjmKѺRx{hy62 n[bQ!e5ُuødQ<":Hkl2#42eAUj KR^Ɋ,c$Fشo 7-a-JQ RT3Q)T qBD22F%]duYP%82ɂ E*^(kbdM H)2U=Yw3UE)KNtn`kY}, 4Q8I]IU{USc}9| dPv TdN%:§=+[HrLbxS:vWfȒKR!lӽW| k@mI6ʘocn4c_ET2O. n+fyӇ+Wkk(dG,dܤ}!0H!ɇp=ֲz Uj."Ey 8-a.LI>e4~Hi%-%;⤈rT̻?+V's9=Miь]ez+7u =r8-I%j ]N&ߞIos/ϓs ְm}T]c Lj.ܢ"7BJ plɄɐX@ݰ3L2UAHCT[ A.!&W" 妢B(lhEd[Z#kR*-[)ZlV*Umsk"2K8Pڌ%ŨlQ- hnvj|pI0$69~WJe$$4 L')m)Hm$/$B4[Xv@EZ!I 2R4zv4\נbPҰ9@ @nUϿ+!a)Tb,_p;f%-RW XE$\Z6K-d[w:L1wK[sN&zGՍUQ: itw*Q F'DBfʑ*QqpK7[ t/>+ub8\:5EE$w%;7},MVG_C^m樻ڣ=%QYi|-z'rҭ(}ҍRh;~ضevűυ?d䮏䃠 shLdg`!b0d0ʐQ`aD b(T.VT`AUX1H`#AH1DU[JTbŋH"QdR*( UHDVE",DY 1AE"[`#X ,QB)AH S 0 @!+I Q*RCiaEz1 RbUQ8PM&D&7Y}I܁hL$BL6ւ1gq ztRdKΤi+9%7 ^ ͍Ar(s;v&!FD | suI%1ɸjsyo ?l2VkIᕉJE+5q`\Etc-}akqqh4D, (4vP5,K!AP.^&31_rhZc,7E\.E\ip6?;XZMK AT$)i6JV| F -KٔWrg%_"2  s%e}ZL(%b13  GB71-CEE,츳Go*C^"I ~RL=KwM-ס]7sPb|.#Fk4Ο)T$k I 2+@?@eJhL7D)qCDX5a͂cX1!6Vssg Hn7Y`oD&•oi' <#ޟ v#F7ء;K1$@fvyKFsOTF̣ 0 pFfO` lX">h>ַK߸?U,^~4A=j=.W m"KV r02GYcgrzOq$R7KB#sA{噦_蘓^[J߉MYa ^] 5RDFs_A`'ɧ/g^$k0;6TlaaqDӂ3mʕStݻf M5Ʒ) 8[WNRbq*`=P:ri[ UA@ QTno/TWى 'ܩ[3rBWm\\)6lZio#'E2bx0[v<-k}FM"FӼsdhcH[9/ys5i CنJɖub\Ȁ/m F+bO8aڑ@w^#g7X꠱5q8Τ(M@]oIaݐVO=Y&0a]ˋMX?u/?:߽@ò ZR0Ay ĕV0IC?yIIuzfk?q[Z/nqG-؈fëqoC\m:Aw%`@#"oWzE'^D!}w^Ɓݸ X ۏ%!!C(MF\1'+q=6&"d5ϖN@\Ԩ?qܦF\k&MyW!OcGbSU^tqe$"cL LnujFUpAS"n6q7nZcFYUEqʑ[31}*aq͈!G3UcޖjJ 3W2\}%Gwj΍0n{6l-(Fo7n{8c8͐ LLټ\ݡN'M\FNHߒpe_g#ilU684;] >rAs6pY;w𕤺t8݊1ab},b'1mx#bܷ;?+>z :JApe?L8k .uѮWΙv鬕\ :*gNa_N+Hz< Ƴ (J'݃4E:.1W9Y3tNX9[A;2m, zkdܺ X[O˗19q~Q:xl)tpNPcuN)xguóu+ 0D=Y>"z)K^ LsU Xʨ5XOlF=[{r{j{fS}}X+zG%%%53׈ "(":u}ZD0QXBD1@2Sݏ/ύogݰj>g_*No F-=PK-v\0j 9{QK`MN%C]aZͶeVN/ϕs *$B R) őIeGat@1HyC,Tsd虂"%H\iD:u%ItQ;B ߏpQƚ2QG0yl':Qb 4!mo-ZkgK/VmVmz5M.ʦ>婡o֬WV_Z_ܹlW?qתOC{_sQw=_ #%߇~KA|lqmMyxlS3S~ͨウ_wg K)o8\z5+/NF_ ?⡟@^a-Pైd>ԓJ!Oyukh@] gY7=~OlBW iu4Qzq=Cĕ%(~z u>_}<䗰x\3 ^E)0xԸЛn )KЯuD])cG b~Y{;g+(z=3@_|+NI1O3z'oyMɸS`๬#U% ":%b$G?9 tGyQ9Y@W_C?#WUEϨߠMwJ/%dC~yۯ_wOIdZ^idfr>mjR򇷟/eb gstat/data/ncp.grid.rda0000644000176200001440000001120414413507477014513 0ustar liggesusers7zXZi"6!XHE])TW"nRʟ$85EҤ IKˠҼ80|Gȿuv%asu^RzA1 I-nMl!+ b"!RiVW 3ȤI!m:vW4o/T*7|4;eLetriдcriGc'315r."]}cptD=$Y#@SүISܒm=>z`j4^gMךB8}tze2`s^|W4WfWFEUH8j'jPJSЂԇU0txnm%%rl3_3 XWYn!ʷ~.W<V?z`QD!Gp@P-st);nj*?dgwyG^w[ V.M 1B%RG>(MD0*Mf+ lXi@AQQHlD}ϰ*^:kvVe.<&ni|T~ui&rsCF3]PqneUZ½o/K>.d%Zrxtv%쥫X+yoѦu“yjQ>1pwy^U$|YE6CqN |.B8D4염 I)C haBPtA[)V 읝 '^U$.w"&Ҳ47]l$[HB>mh)3 lQ'C5hWʡ)Ȋ.a=6bl߃$|:1ŋm & Iw(幻z*I+:E 2։xBU&>iHȪH;9.`ftI5)c)哐^ QgbyL68 "oS-NT "@xV$_GBm6<&qevW ]Ag9pg KZnz4@$^ũ$$IgBLt&\ .\Qipz\}MJ!>DM@f1'mjmw|'~dJFO"0aJRCya~HCUw\ }Z=\~pqg_;bZ,۱8[v`szjLxX*-tW E6[<EԂ_kmD[c l)~}3CSqSu׏4Շ{ ;fhۗj-0ZU̧̨5&u#kޙ 7[K"\Ӈ,m|.(DQS+}Eu*M.YEoxfͥcj0Z0g q!ގ}ْ;QFEE闵F& )* L/Pw9bHs ΚvFхT"ԾEGߗ(J[@ZJ$TAjû0 gIS-8I# vn^`_9&1-fF-w11s~'&&^+jBwOKj1 )I{*rwч} Q;0&`\O kF:Ax[ka6(G.3Nv6f Ҳ?jd^Hvr&^nkŭ"w?J/RvoIZ+*0 >5y}~Q'ǣe?FXЊG! 1 DR"NCw^uU픘'$E7 5YIq= ef]:T96oD]R:9iIsnDCG.(}oyy ųݦm^^<0Y8GsTT+)"r?lYh(v!\K]om-";,(vgq QX݇^0 3RZLJZ e(/rXO/r嚪؄5DM8Dڊk)d:N~rw-+q}\mz2]ZtQ)Ń˾"B7#C܁ 2 /P9΅ B Y+ 1!Pг,[Xa䄇 n2=8Gtemd]Xcq\{iI6Șmv*S*jZ7.uv s::򘤶NhU?lK0"Uψf4gfL^moˆ e![L'%Pֈś4;-jB'$NW$kY1Ɲzpr+KobÁdTH߸9Ǟhk]惧䥴󶮪ƧILݾHiU;Sܗ] J 1([_6Q yy9#ժA5 8iy-g.JxfZF,0ULQD5brvMqa8.ڱ|nPdr' |q1e)B˞]'U,,3B,{^m2noFe7Xk> ꩖Q4r )վ_.Pߊ]a;eo/$dS *Տ(1L=rX-,vo٭ +`? `!96֌,ÐOUTA؞͍d'BdUrmhCDk<t9C2hѨ s/=@hm /SBT*`FV >ʖ5bZ#'S@iߠAcWaHC枏U+Mz(#H cFѣ\tfQ62$Z0)M[DɏICy dcixA"/ۡV^9(r% <2~]\ n߸-4!?r ʗgn4S~?ߦ83 FqSwbvB'̩#'d#A N6ޛ|\$Yg{َ*t/G2ŌB :`ϒU$ _r n5bkPw s: K&I6R[$70b\ DCtE۵$f _&ʲ"(k_ \mq0Rۛ|ٱ(I*#u9],tر㛆v`GJxƲ`;<ɡfPzTQ:޸gׂs=gjS ַԝ#[Z*aZ)d٢gęGu-w㰡7'mAPt &PlF "e6D+v 1=vOd/tF֒ 11)=zǓu{7TvEC PlËur{!v $,S2L#B=S'-zhOh4ʒP%W7~9^_Q+Iʕ6k("i 񥺈U],i.u糝Z6:Awv {D6-t+Q_S"(E#!nЦ VDs:AB-Ւ7saӄQ +ҋM`UȊ;H=E20h W/pzfZz}|Le8}V'ւh'sv>+L^Pb_膔9,fGO9vvr'- 2|b,)E*SbpL%E%/>zܺ|ݲvJ3|O _lhYNz} va^\޷فyy-Ԑ/;sQ?S=^p<;$جz{g vkⰳ,B5R"cWUb\D?KWs2[o43J"E" D@ *O6O- Sކ8 Tl6&p5~ #*oItд]suB=gm#QVC&̴r@=0}|=7a&sm?DIj*i^}#E`^#‘Sl:M5(Jaa@NJd\?Eov̬Y¹}ˈK1YLynw cjC2:`**O ^h1Io^KtvpNힲwicH|\;Ѹ"חu dXrUhJE~J[I[f. "1aϛ8[ZHK(r'֌ ӈ7u=g}tddI1e.~^tts\DanᴅT2lg" t* .ZFRYŎ[Gπ!~!O2#Dv֝q{Cs~-ܾH\il;O9ƽdwik[#n׃Yy"#:$4Qv,o7΅\ӥL&5Yܛ wK`7|UKW-ٹ F'IV'!Њ$l ?ߎjX:ָ++P}\5ɟ=dWi+m uς{,N.;#ق8]c"V_+aNx}Xnb%;D؎ [!O%<]"Ri !^KTN:Jw5"g6n^׀$מO0 0Y/<4=–]7Ne_mni3ۭe*jo)Ojd.,bLYz*Λ^MsaH,|3 HO$܇͙A=O=t`ְ](k͕&U,\"%ܣ?;1-+ddWr \ 3Sϩi tdOk_w>A)$J <2.fY(a [wGuL> 9Msm=ؘ^l(y7WY*bH1T=Jn=W&65F $ M s7}{*],Qk0)v8q΂ğIfMՀtyشAqFZQtv:a<]c[wY<i eח!RT!3t%Q'8,ܴxe.>[|,ʑ׋ǯ'u>sZ{pe/Sz7ƭ"V qЩ+.#p 7D^)ޓ`WŠeBI[w]0/?Lsno4jy HԋoAOD- *0ܘFyM2ܣ<ـ3L6Oݡ\N 49LdͿE1Dяl/0eԻBW-I6l攪0(2DdeܬӰ<;2!/Qwv!N8ǃ@L?4 &0-m=mHĄh'it?ufO^(^>e!%&0f}άCܝȹN~p]F?)R]lIa##cS˔3X.Z-=n[MR:C!"?6TE*[m6eفWxf|Ē/vd= mI5El s$a?ZQ%&Kk4>v;K3$pR^!7ptRMqk3/z"n6t. ]C:- @-6I5_J!}xwh0rG5BàĪ&MBoڥ«T A;F"diJ 7a &T;,/--RBBoϋKDòȨ]ncV?M!X8 $Q^ [SK~IK/6=ƣ)WMY^̦;wgp2?TTl|I>&fVu!tNJPc"dAd~굡d67YR?kTb2sVS}͐e?Y*'q8w6]Wkox]-%ˇ&)x U r *0=`.=RHqzTzOZ։ڶ!cnwk“:*s 4]i v&XA=&PžYgq6(ㆳcK6ߘ$ H185sv5q~ a!aeZBULgA,}%>aî1G KJv h)ۂJX*Ć$*XJNf/À:TW9XYMFЁAҠKfc͖/4„s!ɛ4^3p?P`p$0m`?ё JbB %FWj &bBuB²GlpGH)\ R4!QQwU []ħB` SnqiU;~713t.=K`?tc(MYh/NGl>*-ts^,{\2ϮM }&^f5ՒL]%>J&(s ¤;zb_ &41$*ʴ"qiJ.gʹoO|  t+ܽ {em H,'29L T7_M;˙Bʫ^|vLa拼hH-W ˂| 6.d+Ԙ#oYpɕbUXV7>d1.i"b/!A4c.:)vPXlV)[DCHpZDɝRiN?GB_x/WZ!&w lʉ-|ȒM͐㔱Qb۪'5HO AOc ]=>' 94K(~𵒁<֮3jge54He7_CIB2bS+Eml*|;IPp4h #ήPU!RQ\uWcuq}GTtz?OxxWAv-NRФxe1׌9\a+irpzM,i~nDyMG?!W+M8KcGolU{0t,il"U.yX:#\Gljyݲ1 {c8yFC [&+e*99W33ŭ鍜v͵k@d9si3 .GM%z{%$T6Hx_1bW%$u4 _ﲅi_[U}i3 Xn ;te̥ឯjK qq)@(U33'LJ-|[խ`YH er\=i"tl2bH_VO9؎ه5jK@9/E,I0 ܳP8!E'M?Q+3ɪ1\YAd@6 /Ɨ.oKXS_C+3yxiqδ',9F,> GG.xm4gYTS  { ɩf;'25ƸA<0تzbb7}MEu2VΰrYPy^:sG\0gU_?{kQɵem mTwG O!XD 0=˜4a3xM~i;Ro@^C(?a8fNӼϱi^MRtpV)*(izٸ!%!M>1؎vlUy~MJ~a ^9yO-L_=hqK.@T\ZVּVxfu*j&RYoPp/N¿9/3d>iEW1jjh% u`Ŭ6o,OPtrWĭƵ('-R/YX.; *l+ Wߒ`SXELj2i912@>!5xCR)2ܗ%(y;PgM2CC P~s f⊩h"L˺q?5UVUkIOC_mrOOW/l`pj)F-Ș ?eNxW2:p*l78JW $_1]-um2lpc^{\/Mt{.I?UOBy݈nf?q1܃ٸZmb\~m"s|ϢuPiÓLe!Q0/UDs*$TۿؕQhC.K.>ĕˏ ۃ$'AJhc*ch2;$d^L>zEӺeA'q, qM QvD*M0yKbO|2qT1_K3&Ҍ%&b ¹ E(wx+cpi`^e+}IIV8Q@'_ȏ/BXgt4x;ͼkD@-%{5VF&uqk6ZJ*P@擪uXPRu >wҕFBf} Cw2{, V"#z¼zU{@ۺ\Ќ2 uj^5)P~4B%UN9p9u#I~}Y[!yC>JZE{"e/W}LEΪ#8\g$:P1"]>"Z&8S0-⡕)QP.gEg:V'kǫ6YW(9GIA mB}OG<}{o[YI_]j/-1 O+6{( jN.[A-} OW]d ݣ,6N ~NۄKZg-V8ٖ5wnI F5鏜pvX},GHy3o륯R#ۤL/=+O0ƍ>vZTY™t<ƈr&HF,+8*\ uPzјKp@X@pG k,1lY;\04UvAI]nJ07ؤqQo.F6>GVobE_M w0%iT F5 9m )l|C&l*;x ;Ra wkZjq~l0퇂XZ#F;_y_2tA)(/JUhN -)2FOfO|!4,s4n3`OI@D~FoFP2e0^,҃_{n>%"KSDwOס 'R1¨!ب}cr !6HO@h>)}RoBޏԬ%c` PCL~ (F w,*%B ne,5tt"ʪ&:! r*Aх-V(Ȱ_^/-ʉSތ >.C8rDʔfuQ# 1(gO2Hw 2Z9`3d&ذ`kuyvqbrRټyĀږ8ЂJXWR!75mԦ.v1< ~\TG˪F@34͹;)?oѸLRGIOu\Snt> f,~CdW:I9d160q*nX(g'{HpW3T;@ˬT]uO9N Z~NFHʀ烢a[YtL.hHFG`2] ,G 0j2ʱ@e u>>FGaof>'6p-M5cTq3/]u B躽W|m1#?8ꣳtB#,"?(#V Ǎ:+f`<yVs&PSە8J48ATE@ b`B}$XنjSwh"yOAU MGuo_^(.6{̽əh.鴳rcSࡶ`sC7ҹ PeUg[JDJ9-{Kۗ `0rm É-xmw* 0}* q}05/5Ƃ Iccj[6f,nE=߳&EiۇP\l]V|YW\3\>e {# *mcJ jobOűr U;r|CT&qd ׬Ɗgșg6o[:{]sqΎ¢yD:O[Ázf9#:˭[y9'$[GQ^ 08H&("`k#4'ݗ!lSy86Ð<ǫ>J6*K>,ze>Ȕs7sLYDmzX9/ik|u1kEjyAV?u#B? jE/]7!qgK:c}ؓ~'RYcfwZTR-і*K }DD$t(rH?"20{HYc~&,i48񁮻d -cnTM(U{ҫ׀RowDC({T(JiAqe8_Ɗc6wҋd?3bQQ.s>J @^Li{%p6;0H5vV} n,z4/sɑNfn}2rq]*}/lϒS\dkXTnߝe‰Hb '!L)="plmiwZx \%Eޣji"Ik,3NqFg @ {fydV߄Bs2өܮB~E0NbFc Pտ\lG.dvcƒ4رe޳t3ίtǣlAC-kP6.c.̸퐰t?85vY(LZ.N{,btd|na_t}xq#VB\U@}}NLIu-X:g ْڹ:{0W,R [ 5trZ=9T`';#c}xuU~=QSOp_ |D)~LNնGJ[ڰ+ h4%f } n~b?6g=Yi\[Z:&kT]_9[DX7f)[DMu C)5MBAe(BDAV?ᢧYKoWtӢ9%aì %p>E#{Z@Q"mKU)^Hę(*ZpPCA=ЏI;;@o̐i  BOt]7-|)@b*<(Y*r Uwee >46Y:3 6^Vq/&[f:9=#È@岵D,3{έ)ͶE{#/d,U=,yxd).F cl*YId{VwuX&I1;%NyנVd]*֘8WӮ52R车W]!I K8]ZˬX]7pޚPgd!GI->&:*J@1i,]q|x j"$>q1ϑb#m`>,_?!^~>]N]R)N\aٻ9s"Fߤck/By:a( /orb{,({5x.hf&w^`Upj˲'UWWfh * 9QJ OFLhy!ó5252q #r2#-k^2Qmy*ڄ T}<ijky.?sKƧzhbI6+iw ()ל>0SiU4R1PG8QMrٸ zmP⚅(Gib@Q6?HFA6MD.yi3Nʱí\40LS!?!'xCF=(6v*8ڎ[!9c),o@kۚ5wLqCZ3 `1ϫJXzX*tdbitu>53HqţbYPl}+ M!]#J"hPG$\S8p^} L1F \z4:R2y@vۡ/1+zӀh O"~EJ~4; L0с0bSWj=Å:e@̵$.3d _W}Sp yJk(<҄KX||}4͞.=~|6I߬?s^@c;zNꌝۭ H9-8ZzyKңzn]oh/Dw%G5<;v@D&oFA97 fdHpSi$i8*~4aN;a5ƞԧ6*m|y6,u*˃ e`)4=Y㉓ QR^Z|M$_j{c:L>Ϩc\WPRF2<;_NdތA^%=ۍ *}.qO/i0[(pd- Ⱦ`y/Cw쌦>Y3,O 3e']/I[Vx]Pt K.eiGޙTm:zɫ&Ðو'E8.9HK<mžXKWeD{fT;mS׭;Wczx ĥk39L)sݖqgWvA*Hq8/Fj$ ~.-m} 2Qq" `O^Aj ?_9e_hԾa'T9V `aj@c.@s~{Ly0fgEP*OS ,!";6PY󭍪- 5,XKԎ:f79چ] g!ME1l[Yp =Õ}NX'ݳ%<9KZ`dD34n p*l^fk"ԏEg4HedLK}&Lm.0ܥw2.w?b]1Pw7rϺek  NG>یpKJɇԈc6)ÖltK6u 4O-WO2剩,?0X[ DYGV&hQ?l6դhPO'bԼU\I'1jN'Po1ѿmD !3JU~9ND[hRuЩ7c ×a }cB$nwPK7!oG8a֍}ٟ(f "|hiN uY-#v g:V\gFwxqZ-}e_kWZC ?!h&9vo1Ļ7z==X ,3ksJI>h[]8J!xqJ)!Lhː.hDԀQa 0xqȧXq)Gl" N~T(ߖъ'v#yS&bFgube؃,K8,C -c3+i-d Y?q)kE9>(a8NZs{iՊHݤgtE%hMVj~x_@6MK]aпb;,J0@a J2 k>X"xe]:L n47-K ӯD7)48Q!cq& _F[[w>Yw)NRlqwHT׽>=AݧԇDb!Y)E46!EGwh)/oUѮߍan(=q=!#RA)7z;$-;:5΀ Ay6nć0V7 PB+rse`ZEؗ"A` $ WLQssKd׍9-_EF],9g_.%6duJThw|E>zKŮoZH%ge'CBw=c^|$!Z,oFO}zt/Vsb` 6Je(3gBI<=~ MRD`U`ZZZ PG#JnY.VD ZAW*nTERxq,wpL!R}CGuqC{%xv_w^tOU{JVO̔9 ]26ʯΓCe⿂WGڿ/٘MEUoŊa}BRn][zJVw'FJף {9`g/zH|TEd,";(4*NֵD, 7W(v8򋥟;u֌(MݹL?[7+CfȺi6p[}O(A& > ,M~NVĮ1MJpvPA4ϙ"IS|j\Va9_CBk~KƵn.F@(I!)y]^S]5s]Cf OX@XS+<[ ﮽ld5?{`MƱQ/<Zp9.n3hU[G= rs2yOS=߃p@iYmh!`EAtTyס`s6][xD9P RHI>s}RsBK͗,# ꉊXעiV|V#L7픘=Op_Z8Zg4T;hF>#:7\yzȉ~>|OS'hx]V_FSy|ňlo$F,֋&'v=\u@ViF TtmʯCH ZԚYp;at3hE r q.gİ8PN%_[%W;\_6~%3aKqKwT/p2$gJYz mc9B幨<\yabڮ.$xؾP8HͅNib20+%Hb$L<ΔIwKJRΒfR<Y\ZcuϒR?Aꪅ5BgHb]6_ ] /=Q{,5J:m2 64<}j0L:L~7NVtLMEk˪\PS8sE~ox ; L~j%As͊Lo٬Qc@oJn3VaH/,ޥpzLLTƫ [w;݇ 9P>?@a&Zߐ s&2jMFnԕ{k4f-ghϳXSGNz 8d4h>[ XQP+@>~,;6ʠjC+.z3N%.*Ɗ@J L\YT^UeG>2F]KC賱YGL=NYMWC \A{ ;=6?G1k6 AM)k_GQ?"nZaHfeђ}55QE9rtn3tI 73Rn*< W22!8xew^ 3<`dH}o >:g|˹gfaDJT30}$}[Cf=sO1I uW`_2.sjATpvI<,Fr^I>7vpwюN>JBk0E H' Qg@o|_ӔŃs zJtTﳩW7 861r[b~lj7 '`!lR=ZEL.Pk]mviɁ!xj#deTA]X'M@~@ĘbCS%CB;z>֓c~|]IRM w~yb&>r{b+nNxk&tX֬@$Ć󵌍곐dPj 9MC f9.e2wCfԏC3x`bq6$)8tvВeud+7D\gRUݛN{ 6l)T%*&v"z\[b*&"p|L`n73w%,R&;* +JGZ_N(CV옦+ɭz)}R؝"בw)(ːiaȾҸaOf-7Z(OP{=*d(caf[Э MRr_FwMޖѬo*xJ]$U-Yy gI$YM8N&J_m3M0G @eC,%?&o\kt l;PEHQIv5cJF1>;4٭]Rba[̫3O3q6|'|1t̟yQG SƮ cs/U.葬P?J+:[sBʭS@ΧEUxv=/y{XMtcAJ] >-U.%iMW#;^?`wIʱW~k_f0i*GMm}s.d^ؕg.g:VR: c^ zbk^=J38byŨ|fN)J uT"\ƴ1lLɏjD1y"cgqܯ ݼ5H Bm3MJ)M1="~v0krޜ+H&8 dESllX;lRZyUR⮧%o@`L4MNTxsMmg8~V8΍ЍꥴbF06i ~5]KۋX^6$ʖ̢ 4j70\ md D2W\g<0N]+sI娪% UƼm]AmB)'58X/Pr Μ|/ /D4d:Ó+M08>G!(A`sنXw>'e!ƦEh18ڶ0xn;2t&Գ!q kTnQ}T̡EJ^!yD7q 9^=%O@c/Z{\!. /`T<ٰTbu'7-``șܑw3FoʿGg0L~!zo\&Zb[X):BG|%JR7xo@0i>!LFEњ5Hk1U7I 7e UR=r@F%u8BQyG<Z3CߨyUtu%/wSMsh5 ]"cZ~k]R;cN `. wbU!-Ce1jzqꉗ;?ggRfBS ;_t8=a^!cq[yjEtomvH|i9Rod̄́6J#ѯ_c%h՜p&nʂG 3(feo(33'651'!8n`GɁ@\c);v2DlsU\JU1Z3lUcEsAɫ;O㕐.|VآF &(A4/|Q2GF /[beBtCӚuV v/\Ul2L۲, 5o]^O|,td/lv2CH v2 С[!3iVZӍj&&nhsA%be"'<8(MMt]n"enÓ,qljdD쭬EZj߿3Hߑ6+[z+qt4'n9t b}ґ*%hmL9SƎhŎUVwqM*:D˄I[!ДOD]*vU]la.b#%~W\J{ TVhRRو䚧̺PXi 09D0i_(/4&Z_D;v 2wkEG0WD:R\GJ[#P5@3nUϽBC c !R<rBh`؇cW&&J(`N;qœ%,>8h ߧI ; Ujj|XTYkKG)cB7"<4"TcW]:RH4+gP}tkHsy$\f3"-Hɦ_qӍ&FXup {؏zڷ+GxudߙT憙M*,'ߎ6Sp+\%<%ZfFĞ*hs,H\ɚ ع2Lyc-„fn"f{jl&vq_MGȋ^VQ f{k2W_*1 8q]~D( X9217;tҠB:_O{7/vB =P Dx:Kwq{%sU*%J%{dV7F49TMQD׹ÊcūZ3B3lI j;(*E1i9yOaE#^U?dx5Djc?4HSGEBNv@߄ :M &u* 5H^d֓3jj4*D^ىUt*)-w+Md4 (iDKڳZh ㌭:|10v](qDYqa[FbWyzcHuTQIgfN9oG{J}K.i:~ɧV8{mhvdf-(PeQ@0;d6/r)su{uGZ)?%|SB8EPlo1=Qdi/i&2v"WcNc{˟DtS{ }[;N OKb I5&)!נɋC(BbdFÖ;Qjn`pʿ дg;1@/rNf)]?[SW4D6ZgF U焽 :zHMix&oj5霉nL7b mɇТ1Y:a|t>M驹? ԸR 8_HB~l<&s.ET /|!y8}?3@X>TWQ`{,WGGE\}b ~]!! V7E0HB̾V` @CEG176.!=2˧*9KRYEeW!QI@k%Xqhr <,F^Z%j&gCVNI+f)HL7?5)H#D| C\5W-UEBM!)ν6-"-ߐZ+|b\ ~v_iZlIy7 ~6xl6ʚ0>{+I~-mp_jqܪ]2^Iv]@s9?%jHp, @nBЏro/'jwX684 Q]59S|E|j?O;ݒ>$Zw_R$^կx,ǬpU T,pԃZ]ttAeq1~3w^sB_p@[ڧxZ]E2d] #*#L FAvL1傐{oC>*Ԃ|0e,/WMVB_} `W 7柀>uĖ'ȀO1ݧ(Sj1.YW맅 |]%_Μ6$zޮ?AJm}L:I$9Rmwuy. m=TVKLX5zT'DOz!UQB>t|`1Z ӎ7~ nwɬъ^ rtQ-Ra Qc帟 d@ [I"V=.>@2D{6# .}Qntu*[Lj-ipo{tUJY9!(AU`ȟw; Qcc>F78)hFA3ƨ]_w_x`*XZKSɗWO~b猇&T2.J=1&i& >[#$ړK7M˜"Hԏ8/%_nB+yJ=))&h\B^^ՀҎzŕA9\LowvU^!`ڏ!bUYmNT9:$vsZPYՔޙVI$teI_q踓%3sϺx0@/#z_LĽ B)Y635X <3,-aYF7f|CbQd Jvd$rdɠ"Po6 E>(3@48Ҷ2v6>,ꪢ-kyES n98SHQ_ B|dM@ED::!#+{cI5#2vTL϶mPsa::7Tjw~t7좋߇PACïQьd}#ݜ ɦȁM`W;-=QWC5@y <8d/uh-\wyv *E|*qi|3$a{F+[m  @1-S*4U7jI6`ww(!RSzN%#t^Z۸x5°ɔ Qk[ڧ/ oK+̇h< ! g nB9&Fa{~&D28OStOPfT.(m',!vkcVIdn̒͂i79ںkߋu-7VƕB {isk1;wu+gro(U%i$R("gc?&-fZbH  PxvK)8G*e ~ݢZWdt*9 vdw/J'&\q 'ESKTrc.pi4/ <4?5mO>ÃB:\#P2ڿ} xb#Mn; ű$9R9bulzsP6ocdv־1|iLtRn7e HvТO f ϴl|*u 23g-+[ O:=nV3X ޢ'gu>9ݹwkPs΄fHX>0%sIv+!I ?>OF)cGt10Փ)wMG<6MoQeη!@FP |IignT:<>S4ʒuV*T\.34쿮 rzɛDTYbh`KsAn=4ʉw6^XWEzMm0aH9QP̖qq4 #W*j|S/ύ&xx 6G;;9p>>'Ю^HF"4=I:fSc-D[duIF `q',Ab@f hTU;1dc@U N>=DcֶdX:Iـ+ŕecnTh_tR&/%Þ#x: #ډUC(8B-+M~l8`ڬT_\xE0@#г 7*aJΌ$ցULz7Qu+zMA5EޣXh4P򚀜8% Q3`W S=x"VC5bzVZ26s&:RcHO_ֈ|q n+`Qgk5L`M_:C"Y\5U.|/V]5м8/WoFВW΀G$ ?"1^cc mP6 oW\Cľ!hx'+i߫SLb077QhHGߝlX8܎p4()Wo-ge\0J؄=d;!5Q6%F=uଋ0\J 0DNQChHabIXyA/&QU2F5U3~O+s0'bmɍyYc&g*j:.ڊ{ cYT]v=%W+diɃ0&uASȂphae%M~k>(.U*^Į񋈨0j4k4Zwml*eaF$lVl/4A{"Z|@Fc+-ٛB XI=5]/ f/5-8)QB=M\=z1 p }.nDׂ)e,dY~u;xrRM0Lr)zLZpi7{+c[;Vlu#|An=[",:뗼HGXm}üʆ󡭤6@}7%ҚqX_U~NV6)0'608?mS_YũxCFD5%*LU%o=gGũpNkEӥ*[@fn`ӐÊ8hjXbP_9?@9Gqfs8̷D^1N3@I ck>,Vڐ&u[#j,Nrq8>X\\+YVRL?"ͷOI80nldhT ]t@'W Enyܽ>)lyPKT#W5 83,` ^M{%9 BiC.9;߈mVwJNõSYU`휞\7p EaP'KY:eXfdcwfC}'FZT}ATyJlmJ¹H)VbW&K̓"G؎7HL:l d05\ nG?Jg++c&Pi=)Ald۠1I-r0{%aTvYl}\)zm~2g]'9_d]01Wv&v@] !VaME:~qw83} ߆i{W(4a`3u ( 247CF LoN k2D <xtv|G(ڨ )ah"wfg֕ե@y8li:6Eg݇r|sDwk+gΑ*9ȟ up1fUH)7dcfÅY)71N1~ቁ3qe) q>]qnI\fxPi,Z.] ?5@ٛjt0ϳ9@[8Uvgcx}M7κ#=Ks/MNCޏ;0)C4-?ЯPs18_* QSUv*L +7Ul^YFPdԊ *A3yf|*;ƥϝ<]iV̞~sFQ AGBm,qmoyq .am1ȭy?kBwCM2e堐l?+ubau#}yQ_!Yll ZmwU'i-4٠ЗH0"Ƭc_!g`a3K!zϡzilV'폼)j RꓼuјLky |Y#ԮDF{5X>O@8?Q߾a|4I .Axh|F6~?YD  /m2 @*IΚ\s=ԲxUMp'g,[L7o8,?M(Jf&2 ؄;pr۵ý~w$uǻQ {@+mgӺl# *c&JOZ"|aPv7i }P{7pbڛꏖ .ԁ IK&{c-ŝsʶ)>'iΧ)XYԵh+՝I>5h:H,ׁ+`א5I, |m]Qk9382Q[s&pmgvgu]D ҅"ML5ϼI:![Ptz]^{G|&诐{JU8[]dQ%XB\/9MLyDE3RtMF IRY0Y3]vs~e6)~H(kd/u?i(ѳ q}\YVwτZK(ix~sl)~}7rpS:|Mϵ6s?@p׳Wo!GA|Ťhou*L28kWۊa 1DycO1i)]i:M`|a ܘt?VP$P+/ uXDR8gHnŋ@aenhWyQv2CXk|p!0RnN^ qţu~&╣̽5кUH~^t H'MEU3ҩ(򐩎2~`;KM4\ptIP`ِbdJWt\XHm( .f_G/|mOAEw&O ǝj2YXϗKr߀2I{MՐ4G TX2$ґ5zdqqOygӠ\#.JC%W=@:LzJ^1?7>;d2B I IOdFrPx@УI2l6Ct@JWhD+WZ;tnhREY> Q/y/bЗǙ[MD ":E .Sg  4:^@[DW⌢kutj eɦ?P*Q /ћ8{`8xM§U>܌VSUEE|抢~b2^Ė.J9O @Y,u%t)d$k^GLkOLX0Eُ2<@bLtHιj%;rMA1Ɂp<8|; gɞs$8y=  D/7Ƕy fj="z%crRK2o{ HB*D ~ut-̩⃷+=Ը0:UZQ,9fڤW/~O\S+FS)[:78.qO n%nt'*#d N"gڔrq2OڋNYv%M +b{MH~ @ug~Ldy3}35wXO +B/R-?OUغ7csLr.̓UܲڨqfԂ:6Kxm}dY&lC0r#X[Q0FP%oA?=TRIv^ú6Z/f6|=hڎ.tza?zVؾRqsG`g9~/&.BUQ枸)]SW)2cN]&x N?ۣ.ѻtP<'3 !TG?XtfkkBދ`÷п.1 .5+/.b;ΧŅTr㿳LpXY..GR-jgsLYPYX"x*#k!Z6gzgNMpZN^n8; Q/s}ZIrawmp$dYDw=?X@}.?K--VMFB5ѱQ7+D2]GG!yug]:E1%E'~oXK|S8jP5x"ṿ~<ڪkp ك7܇\h?RpMSe8K-{HzEj1T\럨Bx6h&iǭ_Bs z3Y>r݀&>پ:JO՘sطR麪jE,Vi8u^\a\o]KgO|^bEau?TA&{bPlÊzO#+\jI}e$.U'3/K~=#/. [aP^an7Ъ&~V,9HJކb+Z (;Pv 3%X)K^>!,. &AaĬRoUҤ+7 nZӴ۹]G֫EjrD4$=ȵ^˾BEMbJYYvG)Y(>8n cvcޒ"pP R*`Ax^]%f<*O*@L ǫr;H #.8ܛ#HM?foṼ!Eat[(č, rI:!O3qr+#8Kb(#o4: d\#r~guYmΤjJQg;3 ~LwٌtIO0q.B4| [!\]l~\.RF5|S3zwPces3|2ۜ< SDgDϽӉP1  K01,vϱ_V.:Arlk˄)ݢztR?c$i'lIJCi"c5; V筆]^Ӎ)@<פe3lMت  !Y .AZV`CT -|@[+ p:ۭjm>04 {\K<- }C2yWTM+IlҤϢ[:8|=Z@G<#TԂr`ndI'SHزhnکDIm,g!m(_HСy/ݿzk:\Zל EM6g~ G# Z;S'!N:Ba+]u,(ocTQ00PG`UxjYy֋\zeL 3:!Pc)iB$BJ\fHxe-"@cmЅ] +qHYFיRfDx]k@7e=]f(0`Bh=#7&z ސkL\~Cɜ>BZfaj?_2h+nSrdrpJ_"lb kX,B :';P,Z*dzČŖQNHc2ƵsI﫼/l&Br Q'#ą.m݌?r}{(1lh2>Zcm0yMt*lj-N(aT&b̵qb#.ji|L]1kuA [)H>BV=36#H}OMhG$=g{pQ~$dol+eblqPD;Ftu9eɳ'!aU+7I 8ſ_ㄮ/n)ӕq>hYҡD0J*XҊ/!_ (]ymH&LKͦSۗA,]Eib5?9eU'B&qi#?.!jcokںTL'nR_+ec&.<9{bFz$N.K._= ڬd\2gSLjY =!`O&?O:;ʢ9t&z%Eu]C^Hp:T|f;yB9E9"·%v Zf(IRPhsx+Nû4!ro1Z&ȚeO*fMr 5Gao†IlZ_rY#QB=1)^jKP:*~K0VH dK^1FS>ʭ3yYo9deJyjcg/0Ӕȸ *y)C\)8S[eSUks#˽t &|6A:"2uqf6I6/o?n{@ )T$~Kz-X%8Paa@6YFLՄ37@*]6‰GJhnlQAmZY&sԇX Q-,T).f)؎I-ĉ!A;7#VAY*tTd!F@Qpö[7jn^7}vtȺOF jwQY, #Pq2R@)-:kzy8<,ɪx'[;H˚$)1R|\YT%%NTV?zcz-a57hPcyIDZTu$GskU E:&7HvRe. VJ"I|fn/#n~j`mXt̐ !D' .T_8o^"7A;Ig?=q.l/2 6 7ZǛ.h ۃ_)>Ȋ-Jzvo3\x~S̤' D[Ք,! i :R.).7nocF)fvz%j^N7h_sVfpm+ 8CV7X|ߵ9* !s= Qd_1 u540Jloud$w{ :STr @P,E:_BIC"ny- Q5-Gk0DFT.DppRXc|h􈞨KL/tmoQR@ϗ 끀' qԟcͱLE5ϔ8#=sTЄ ZFPsbR25ݨ*DIqbDj|?eRI7|%b^Z?+ȧgMjJVcـ?f]:Y)9F F BJ^!d/7ug ߚ hCU'8יO ꯁf̒~V.lXd nJv8YY0..rie/t76@xWC58!yMR$9 ]heS ʨcNkO3W;˟d#:]u-%0go&<r*J%V8&PQ28?@7J)鰧n:G) stG$<zO(nUj@onʺ #ZYK套_]) i=j\!hPۙ㏻R%* r54!۔z߰+]5hb0p3˳GuuUj7%a8ْ+gLăxXmK,\.$IfKgp***k44jQk]`Xm-6K{0Ą@I4`hoY κj÷ )v;iQJx{-@I\Թym|̦&I.6tKuF4e0xk=@ӿ,`QU]ba]N%4$_8e"m?fp~j2r:OF )m2ٚG['O mKX4Ga+_9MX|p30|fJ@q U,8s8ly[N AZ{ uHG tE ؼ^+yC؟9X$qc+b4@oEɸKOBӯ>ƸXekxW8# w'm3Sb, gjFٜNL=VnD^Oէ!8X#А_"-ZA[HTK qP--C(RKʲ8³&NMhT9(Sf0WSݍ˺¾n-vk^u2z98 y%˺ PNufCOmxz:kW]) W$^z2u`elYNp[-,*]I߯1ldu1D5&I'/&G?t{-V!ߛB3UY-؋7†> r 5}[<M [Y{Ѫz+[U(+|0Jڑ18j0pj\-wN9ko} XqnMk^{'oލ[=&I3-& ] 4qp{@ `"N8C;9Z-+;^셒gy46I!=Q7JP4qUS;?p7<-wKij:YȳM>VOWwԂȉqd9}X+)'ظ2_,rrxyVHaΘ&Ȥ>SM-N7' > NpH///Q~>.vgVmXeUQ6UKU?k0WQ*cCVw>?EqpH5wEAn1BPtF<[>jb8+؝my8t56!Qmr+BM~]?b;<ت~_q&dvڋ`Lxc3k\P7LHd% bMA2i78OTfj<Q=+_!?{lϣAA5<网G?zR45݅գkO'hd\:I2)v)#O78: eiYb㯾~dmj{0HkY$otfao,l8N`E-v bK?4D=4n 2&NYg`hҹ??tl﹗Eeb: C'c.#Hϋ|ڞ<x蔴–\cͤhˣ^i|ⳓᎀkqi>h7Ö2F'k1WN.RWƾwtFeL8c4ll;dx)sznC61=r{gqs)aǭe1]g3YD;`ҭ<Ȝ&M^wǓ;XfRֶ脥u"}iG<4.\ ~oV(E_!zᝑ'oȋ-IEL-"0^gYHqm.e5+ _8,3 s'2AJs9h=V)GGEt`Hj|#X\DŽiPB1-.>w1#*" l9O會T生U,.Kk%Dvc<+y"mG*ҏӫE]= [$#c2%ϗd,*m"]5{'|N;FPdZ[a8/;bG< "^ f_|Șy Zb_cH7ޞfԮopŽ xnHMvQaw&sĥJ&d[9CX<پ[Zo?sZ Qا yF|}8)}*U%Q1WbxQB Oɩ'8TN))HmHێ.L(0 zv㡁 :S%ϺEOٹǥ=g *iRWl QK_8GК͛S' oXׯ+5ƙvpQE}%@Ev@Y%T~u+w2Ba抰_7ETKMOyKO[zJ $,)<<3O5Mtנ&PQ ]*IFZ͆s{7h]z"^näEiՃ.LyPk{EBm $M%-b # OpQO rzTKpWx2Tf;. ٬đ@*z< Cn\HQR]{2ѽopX}n@4ҧFk:TQ{SMuyG =v4CWmL/ k!I>5HDz_LaL*QB6U7aX+:$126+R$cVi+c۪ee5]bk+)$ŶM/MQ6߂<価mqs.ᙩcx[;qEqy$ SY:VWV`dF4AܠC"7tܦJPP:k:#y$ivDcCBA$oڥv0P>)jʙ$)9,KI0i4{21^-b$0yMW0پy 6!TߏlIic[2R8>[l]]`sy̙qIWf`z7ĩ`.b2Nvnǟk:"hefsJ"œJONrҠDRZm$?f~Lg,ZfZ cڲkx1Sun[O8nXTAznB,ǹve ^˸y * - M̓L{+#*ZW1*'>;0Xj1Z׫޵".OKn%'?-ul+BT9L:^d@ F:B:|lpN#ޘ<,Qq43e- ![ڧQΧc3QXF.n'vvVa+>bB6eĂ}*}J=uySrӍ&FT'/ss4d14&&S@ iY,Ucz0R)REr_\tN9 )2DM[mh޴pTF`?L-2*3J2 [,݁aXr*XjIv2a2JWyK+4>FIwc^eG-ekYM ,XX|q|L u^tB<7kDkioټbJb⛳6ύL?dGNE{Nʠ[+_:5m)A̦%z.sPY܁L7$|sl|ѓ<48 ŗt*!c\,yJ,è#J0-Oh!ِY Fw5F(VCba<jcC`nیG+LUt.CEиf}ب ~UQ؛w-_3!4/~d 6*#i,8Zec& :\0󌮖l0i..wÛheks/sYp@oyua˚O#v_n}(A)\/G&;om{! ?p#1^MBW}vݓ#<)J%EAp]3|L' E%nDm泒ݬz…ү]$ 7l+%a' 1#'u ꨣá5lF$yeM7!Bgf,~a zG{]1({0gȾF4[7S~N)2}=c |@{W6)2+Ͷ?|JR(S}- Q"B8f&thJ݅㕩'_.}0gH 1>+kHa{ pEo*^07xU6jm4\`~ G8s(ryͣE̢UEЩWSa;Ǭ ,ao>ƱHcLuHُ):T-y^ t£F /H~ tF9\Wʢ: A^al~*{Jf" T}]>OM*k]Ӡ SuwծT}ަqh٭hf}Nk)HW뷴6qQ,!l҇os'r+ټe[6(֡0|1 $ftIF$~:v #"=NY}^P@2pu9x%0@g[c W{6*UP(پC70,^8Y YD'HS8=r/Qz&!>h $  lv"$f;e ~OxDkiXT>N1QۿI 4`9r $mRsM\|vU/n) G6W@7#7w|kGx:( /pt:]\/T$p)2t(Z4erBama:Ib+5dc)61RP8aCzQa^6\&Jƭm$' #S^׳dw>Qp|mbu|$b6ݜ\R4d=,@!&gǀ2Wfj`Qq0CcT'r@_u(+GDzNC9QXQJ~:A Wڽ#Hԋ0uԞOK3 S9">,=T^$  y= Rqu:dHhQ w^k]2FƯC[s)t\-yXپn;nfa#0gmf]G>O}(Θ]2E(FuK6+6vgV%*54BޘOu@%p.K )[&uwxf7,H0"=g3n2.ȍP ӌw` Mε,4^yenKH' rJbBk!zl,Dc/d>Pj,]4DkHP 7{pmai#[L6kvg}8'geN ɻ0j\R\Qg|7klF@RUK mk xP|~2Τ;dpñ3f5=O> (<2萃+QF*@SP_>!nk/35Znku$x4j-T6ˉ1`@X3EvgNפ(1vyqڐٲXg:NQg\YŚi?"GGI!s‘J[PWOyUyž]:e{yBu96'T|71jXN{Ú,P9˦@'fB/< Z⌡[6o\i~;zRv˨ oWN!-~8G,P}'qɹ `ħJKYo<~;!AZBKQZ aJrdv+T`ݥT0"#ע)K4řSƗcF '-_kL$ſ,p P6R J0]܆Fƕ亙o8椌,Sg ZWiU%I8b7~(ƒb*N큊8F1'qS- tUd^}lD2ZKX '^Le_ yMAmLe/6 7<ɕ_ިϋc3!l{,H<&mk]" ?cd9R`O|xKvJ ]Q&K0Uq4(sc2U;@~zUw_ C2aP~ (JSA~1:j_pS2kᏥXOn|Er[baiJTu0Uc>᢭!IGZ@}{ 1Hǖ k|#VPP]됪) loP02KVɄgS0g掺Yqt(,{`{{ iclx >h M- Se25d냘A[ڡ T:l2yl`qYu+Ͻ͖HG!71li {NYDr7t>9IL- H=\݈cNqoe`FLhzcCF15)SUra iߖ$Qi+z}X03Sr_lB{^,dt(*8>{m?jJFn0A . @r0`Nf]E5Df8#f!Zq3=V#DmD"Wȭt& ؞L7Or}2{$_j;V Y7h_ 3P%]wʙ?1QR '^, ~?όyIpҒcH>ͬOa&Hf!dۿrƶUpb[8J#~2KXq蓕{(F@3!tBb 5{}G߷Xr:&:uqt)qv%!h>{.k! 'pm |LAliuYSt%eli)1fx<❁ZNLy8 " tt_i1ι:v/93D%Up]B[hɹED$Xb"Sǃq,m7 X |VȲǣp l v4 &E^Q"-Z~8Z"C* Jt%sy{ѝyB)q =2v[bWǧA ~6,]eaDC2ݻgȟy@AlC%wvzi&ӗI࿦Ƙ2ק4̪Noɦڋ8$A6LM|cqyD"+$ox@ T!wBMI.ȑ韢/Jg=Q'LN$B T LVˈ3+lgי [@OƮ*}ȮtۦA[x|$ehk¼X-C$Ժ0,6#wfl(6g\Zذɴ }*/BG6M&8CEkG(-j[DaƘ$!LQZPr:?C Z_@~ə; n|$Y7H8VL& O^oҺ~]rogYݑݓ%5g|6Y1IőtjOzQUbDMԂ:ƚ^~H\l>.ˡ ͥ8)()B;4D]Q[' 7QT$=Dr^mѠDE2zFjPSpj0[q*)AU"#7vrZ0/3 YɔQ|yrtY a Pr"hvI^fwSnA}3޸ &XW1Mv\Z-|5]i&܍0ik*/LCi6Eo!QydeѸul_OΟU@CpgYO / gǔ.k&&}Pqo/QQ1K@&X2 mahu9X(;q }2m:.*8é}_tI:)NA߹ Wl!ʑD&:L''RM&d[sqS.?զxHݚw#(R~5u> a條Ͳ|Yp{?i/f[ :n438=~;x4\Bɮ |rjL렮Q_8zd$#ymyB!TT )*ȝ? +A-Ǹ[b~ F <ެy<7fog(@HECZmnx9XE먝1͚;2{Ǜzc<@6DJdʟ5̿a$X-8KXw}t1lJ?!sU9H/ Rd!͙;ힰ"WRl.$m5 wdP&.ggB`g6g"1},vGUw^ v~߽ f!>'tqFx]OVD|Aaq`ch%' X|y Q!i)kq~R'or+TοH|}j] qxoDSH/v#]K%;7s9u^sDrT76ʂՀ8gqK?󌜆`Td͢o?ר7 .5ľK6֠Rô/7/=a*,cҸ3ݺ_D/0c"e5e,dЃj.rNJij;؊IR/`uZ-"7K925M6mg@~,Z|U^gQn'`.Hx nNA*6njҕSFa!I"lt^ RWClBtӸGp􉏆t`y"̛ ҷuB&cdM}0M|y'R5~gTb(I4"SH^9qЬK=(Xl!}p>aqc>QD!)W(>w{t,oK1;wj(^#kVm%Y\#XLi[#ry Lp58{(Vbs'DtO{>Kz@ h` N σ3]/`o_Yssrv6 .=wm]P\[(Vkv|I]f0whpC=CF"$1*aܘZX⥭ f˵iRP42t$rBPߵlBrϽI  QYi'5Mu1)|"nz.]/yj{IJ5 _0Hjl + 5S{ï Zt y$χGɼ{YD6 9ȉ#(ZDgqy@LeVawxRa)M8O3xrM(6Ӹ B"{堇kLpSggg) 2hIy M⡪Wg>2#AqBLT,,=3 םSb姼 %ٲ{dGA&nB,Rg'nI;PX0`cG?w Re,-"QDBvY9Qg Mt;TdZp4>dgQGb=sx'X%G\h\7s4ax<@/bΩ^=2xDzk6%֍,OSyk-IR'Kp=*?ae~Wm`?-򐧜VvЫps:8* &Dϫ&oZ5 ;dඓ`axb0Ull M@@,K>[Wv1 oqt,= Kl;$c{X(, UoE@[eD"ŮTHV6k/)/pm ACD\n#E?7`dRX(vJ=" SYPZ+:ϘyvS@'^P: gV+m3PAyz47H~_#'!N` >p;A\$E?.Ofy:ˑWi+f0$6{{BXl/na2-)nͽ]J9՞*ӣ,??r:zˊ6= g-py{km( T|tO,vj)Ɋo>_ֿʄ<&Z D8O 7w Z_uLLi; wQ&9&ܿ%SLWٙ[6|>(`'0 __|t2cb)h(Y:(ܒ= Q.Ǯ#!*4Ϗ@g^`ƪhEfne+ IS폏~Oj9Mӹ=nr ߵ +}~X}329֠2ۑGycjcx1$z-m9*e[h-Zhe:<(-6bazcV#& ?D񷁡JpR-S|92a~BHh^f?\UaW u$`܂x>w*tHurȓcRl "م)*X=,UuHH(E(9zLv49zyqep' Ip=Ѩߨ~VF/f@tlCm6 Kc?ɅTgG..b}KXUѫwUi 87a!&{x(Z *@h4ܼϣ!EijâW}M $0O¸WdM4RPm EE[PT F\cPiQnC>-v/7SbeQ^}{>-FD&L9i3 VrUumH=0זB.Kxd}*⃜OfD*Q~&dn8! B[T/ eeHgk(tߢT #4P%M$E.l^eWqIDԛO1wj/ <+fTؽmbT#'\ z  6$12UeR? y$,TR-B ,z`o0*IUL8"Dx-$PSV?[ ,v E^ XחB7 h+Q&Z(NPwV"PCj*C@YE2o4,sbk%!sҀy|FǤdibѫ'),y.ȓ rAW/W0s>\'鈴$סf#gI 2 兞[!/%TeM4!ԧKE`2n`6&[4;vE$t2LF (R(*Ooi>^ DfQo-+Y[YMܕn3o:ɭI$UK_hY؄x1teD5xL9j^[$kIrxM: ct mWlovf:'-#)*h*  uӦ2`=4Vl2V~H6i>ܖp_^VQ0 ˷]HOR?Y +-*Q#v2Kh|F=!&Vض#tYpmw.rkL!zagZc9.;qsg6tX7^#3ğ5ǃ`BѴuRErʞGYT5ultxM](pEբ雽o|L|y9i]VGGgLɯӯڔ8Z;QTx{7 TVЭg6f&P/lȗ?+ǹ2f|b겵8b0 #J^vq)YD %vȯ{AF7{\.; i~C46 wJv/rv(u2)@%@_tO|\#!`N;k@&oEHP n!$$nL=gL*&.GY P^ȁ4*:\IBG0Co|H![u$Gj6$8j@cgLHg~O`}vQE/:HLy7K KE!M n0C'LE-8$$3=9cp~ ]o!V|!!6k>O[KjQTMkp!b&Ha? ͔xHRAƵgm!j1_7qFVY7F֓3>sJWbQfJ\li7$?a -l}S.@-XTx*'jmwy^WS ̒1>ӟ bl}Lԫ_D%$j[k:_xj oG P !#T),E253̽Ma$SLEUTg9a f}Atak,эԮ$NDN@ uG"Dl~xȶ%V[ڗa m9p`,V8.[Q51=>؂`@% [(pŮZ#*#RM;"^BkP }UxM%&CFk;(g{=g .VI!irf 7gF3dx]LD\lFZ]˒B ` ĝ&B>іH'7f0Mn;*/2t/Mq5v.%^RX4<+^BQƻ#KOUE_Ydɹt % n<.5ݡ׭aϏq&M|"wvLq2X\~ 8Fa3 D\$ W3mF0q\G x)*q ^`jE$QPG+yԟ#Q){,lֳ .xuqLl:>0Y>1Y:2s nňHg0zm# *6SBX X zom^ J^p,&GJPnp4TLK; i;rAFRe+͑rRSֿ7vZT9ES4lT>#X{VOVk/|w!k"#YƆyސ<}2,{kDo{hP#L<':t9 &0y. 9(=> ]`2sV!X[1kPc5Ugf!i ͹Q sBX\N"c2ڶ.h&#A9~$!韀jw=ک_K(x[U%\֨o5m3Lk4~ZįOJDZx\RLiWMY(}J9NR>-8RkQH.y/D_`j%N!5["l#0 !3C7?PȤ$}(}jOE]8htGHP/}L W%|řl܈imi`5@DYq`(#/L>zb8q]L%R_x=YkOcط}.qD3ٱ~9Vn.VQ35 l8_|'+%HEgvug;-*A'K?k-rSbBh`P)5[PS_XyV؀Z\P~ uѺs޽r<ҹd~&*Fkc\9Th<-_RF&J˥|Cj3іᔁ@-9BK؄zunട/9F,`M/Jr;0h1bٚ g좺9Ȉ^ L ![FۜpohsFR1Qf7ZM!jY@CMMw5ff<}e6Qr- _jE# ̔JAbh$WE}&,~v~)~VJoO %Gt?|VJX* 8L7\ZI4z܁\AZ囍%juSp2B_wSbF,wBoBvs:.Ql/iOp`/0-TjfP$+V9lǼs/kT'"hv`tQ*6_2~u`s6-s2X-b809OG@ןVDg\Z{Z 2ޤʙQ0MH_t1>`J>8%ld-_PzW1` ?gο\I:No׻VeԄ݃G!_CJR}[܊sD ц+VɥHंTMdn?A5fۤ8-B}|XEt`L4ܑSs&&GYJF3*t]jo,H]CNZT/%CgR2YȂڝ~݌jjrwF:j^+EBٔ7 KϷ!k;wǮ$Nf!/+?n_M׭]4 }Bkk c+Ұig2dǎw!w=^nR9}G"OdYӒ\=[YkY)EfvS<3JˆZEP ɺ3y{Uc4TuQE3|+.$=I b_g%Gߘˬ*@ >"n2OoKkS [LYf>bKqYgm#۵M"N N&/`D"'s$Qa7jaC7 kIOWBpǕ%gF:+`=-X!Y̎돬-gL/nxF>tWQv-0Iqż/`v :]:G^ dJ' q- T:X̮D&EZ}M_Ŧ9\KO3 Y(2a+iޙZe答>)Ͼ=*LcWa7 \׆^-2<ڦݫF %\T>_F_.0{ߔ$;/b- +F3þʵ"ukB?Vyϕ.JBpnN8 K.5m;N;-Gg B?"UÈS-N^) R_T[(~TׄBRcֽib׌*dO5S2<إe; a{vhnjqbE֊@b{AcR7pg".*:GOOqBY ڦ=\?KF&0Klw=C8gsۊ׍u?;3\RM{&{PK|'=W4+4.Z87l9*l F?럙B7`t44QyD`",9ʰ@*m"X՜Ma6Lqava+òbO[E'Ṽ'EvP>>/Qwzle O8Ġ@Xz|jCKUb*sE,{۹oT]8Y^L6w^k =Jl\$ݸ#ҔZðREVVzvJ~:N7@lJ~8X> f-ƈ)-ɲ'RtdJQV@ٗ_xYvgeWY P>S(DIuӏ"bГԡ;zOtK=4[7N՗bqS ZxE|4 IrQ7A,OI=5+ ݬdžx י$ƶ [~0qg.3R e+M ޥݳTg }2Df$Go# t&%rqMx5(Ԛ!BJvB#VBL^ xh$&TW:3Qbm%H-s0sy GnG6i]CR ;C`r-._w~kAbʡLp /jkKoF0>Uc_3c>n;wNˬ͎(ʎ=|4lZ(meΎ2Z5%\';q| k0} WgD"ۅ*bV֟dz4Kfs  ÖA:\i>0=2s-J2MNkwoG'i],$AoENB3 =PUۡj%1תD ˨`7$4˸x4ɧODKA9s$61,iFm2Ӑ0.-6ݞ') Y u8Uei_;N4R+H%eea 4\C"okǾP6突2û{t1g!"jZ *9lU;v (0z)xFy5wd u.ԓ^XG~p)};{Q+q(#^,B"(AE/*JX/iæ=jO*)l^ hLy ź2m8P[=u8q#eSMA)8d+E >xl2C_i*4N2REvҸ 4K9094>دg5.-_C/ è!⒢5e)N8ELB%8S\ULa^QaL7>"D!PtYyUS٤&QqP(RB{ ,`Ok6`8A+HmN|0*Ġ+\F\Nt-Ѳ``iBnz_:#7Zt{2@?gI;sw6)˞K8OyU4RLƒgm{/|bkbB?bZ9M"\eoG!+3f>ѹ)I2lbV??dv}ΠTAι{C$}c`sFI-=,ݮVRh=;)^&`&괱tޓV[.i` 1*8cfD9oS h}檾*QySw$ g/]$7k|;v櫺q҈uB(|%2Pe>>.,Fϔ[aK'G\XHF3=i+Vg!X[+̬6S{b)-oQr@RVW{w &,"lc ;9D5 \j_6ƅmit s19{엛ܮ^@)MxAKAxh) +@0ss)q∏xL 0/ =$󟿩fw%ڷN E$K+;F1_, s>)]d5dTbRHy;o cۨ`!#RΤ:pm{dtK=ǟA'b HُKWlcڤ6e< <;og:QQ)樍zldVh^MQUfɾ@CG!-g߭փA\En9J[P❳;>az*kRN҇K0y `R&jsxM!+‰%Lc?o)(dOW_ɴ̙]ۭ!t#= f_"o_ى)@f)JzTAf׆a6Yy 8;5"FRB?;UձoO]#8c@OIA>U (eðB.3a)ci J.mQ<6$p;yvטz߹?1tHx+_Lq=6-ͮL7 |&p|VSv@ۊޤ<6Wv{ ܿdԟ-^_>=%}a(/$C4R{"O}Sd _,x@ @ m*$#hmd 1P9;2🂥.]ocOVH[ȧh._˪6Ϩʞȱ&.F9Dg,:xy j- iA Awn[.-5̭ĉlv=f6zWj4DɣCOB}޽M/fQXK)ź[p=v4[hyVf&u3[bkqཾg*,=GWeKHIRcvڤ@jZ@B9CHY3ұ[9v˸SIU|y7QXpL"bȼ!Md|x}O@f~110tb/>_Ilܥ\C?jHRS60./sv_&|Ig2 0vQ\Al1Z{`̢(*v>0 YZgstat/data/wind.rda0000644000176200001440000030020714413507501013740 0ustar liggesusersBZh91AY&SYhAT@QPtR#)@}PDTTτx4ZUJDH'pA$E/́pHY$Ul\fҬMa. HWg@}!%>>|@(U? QQИCb4`AFL!M1 4&T IELyOOH&i2 bb#LzMd` FTAI$&F3Pe6FM4iѠhd44 OH*zS?RzID A=@  M4h cFO&*~"F)L4O!ȢCL':^:{pvPoU.\'[~A?wAhcӭki(k4vH.YxL۶3j;RR^+tB\ iam^@Nj73[%׆{_reXq{Q8cĺv7s XsNKJ .jXV6 :9QQ9L[#ilCa= goEmGO5Dƾ\Gdz}G?I{1|:FUs}b*|NO^#z 3 gDv ^bcmwa6p!3b{geB XFg3cѐ~(xte&UP~.º.+b0er 1i %7^)׳+n5%qpa >Nqű蠍*, UȞ}YjK* A$ݢzcl}F6 &"d䇜A$#$^!p_lnޝ7)?TC<*؉jC͡:w:}Fv-߹ZHU^CvY/!5&?uTŽ<|9iТ7odNM3MJoפO>D$;cIiM<}ŇJ_m?C:ggmP~{^nolf꿵aīOzkM'Fxm\vusgGwx1gQ"+ϚL˴\#\X7'w;]c"KZM{@ çև.hy C_ywo6ͻjpxd޾+.:_n}:R߄v]K8vvHw*3>-;vrg#)kقy.@-D/?VāuDSnKh=6wXsk̩RCLyw}LmTLC):IR/cɳtPG#˽BI)!]"qC:]Ma%^럐n7&=;6Crp?Lh؟Btv[hBQ49X~Fwt וM_g ¬wU{lLc%uJXrhwΘ^x=e&#`y6=3>wq#KO0%܃T`c= }K4y~vm#?uߨq0(ȉnmuKc+MOg\ԌꞄyCމQ{GmE[ǧ߲=x'M*\|Uq} #߻7̠ȥѹ,7iM?.#9Ӣ5t>˜PSPբ×ca_昫SwɱbOV?;#o?=~6>qZxߌ|F{fJx[s/JS|+있I#_oN7'3.x <-7oT3]٦!d4{W履tyqĽ: x ~0tr|ȥ[`gc1QTZawT~p02  M;瞞v-s;FN ^@'Zx6r[)0##5c_oTTY$[RǤ>t)NOx\Fl 3/^ty_γNl '/τKjW]{+,@f`xt?qzOىy& ``saXwz7> v}[t:$~a?d=^B|5~3tu!nX(t<2A#m|:u}i۷C6ā=K xzn_)p~A~1^:Nߏ*:yPn- P=Ҟ?(G`pG^@Ot@$=šۤX#F~c -ߒ:@ݵY" ~ʵrz"_ U>V18Z7i \}#S`C8~LۖzO㫳U ۑȋ Ϣo_67 ڿce~ս96.b1$P82AܽJz^gxvg}DR\2XIJaD .-:[B8 .&ʓp҉V` Ąmw쮁׬4ǗI4OQug~~K^.'uM"-'G^^dom W{ mļFќy0ȍ~6Ȑ3W~e.ןye4+?cA`rNy0_SgV Lo.+uR$<^HkڟX;G}{5_/E<ӈWns^cRG9`ksP;J3(9/0$n|M;#/y(b;vd]4F>^Zݝ :)U zEV#X[~;E˚TٚGB<Io{c^CjR+j3VxM0wNF_[]W X&S `! ys0,Bl߳gAI;SKڜ3l !UFG_ۯoŷOÉnN*& JN,܈2QjuWEBT ӯC>#;bc6aKJJ` vʚB7i(r CwO_=eyc kG BEb^ 6"v |zH $ be@3A B۰Z ځh D zB1I1 ڲ B v8jȃ@I08 HQ4Ȃ@!l!c~.&Q`$,ԃnT$4$HO7oB/=;.q‐P43@H^ !jB!y $/<瀐pBH] b!섀]K!!#BBGI ?!#ĐD$$zHHHHHHHH(HH!#ޫ^'x.@ ?K $,I$o}n{x#I4%߂ X`Hy^3T"8Dlu۠o۞RKąjcj-jKZٲ   B$Q"[mֶ-mbڨֵFkXV-Z[6*khFj5klU`ETZPX֊Qj6rʱjŪ-bkQXb-bcjE[Qآ5[樬QQ-*mnmUQjU[m͋EVƋE,h`5hk(ѪŶlh;sZ[N[rQwU\ʹr굷¥jZZFֵ+Vm[mEmcVmFVZ*ڨ6khZ6V5VXmZ-Zƫ655bmkmrEFmڍXܶ*hڷ*m0Fj-Z4Z-nVۖEbcV5Q5mjkZV*jmrUرkQEZ֍kEZ5c[m6ZZ6%cVkkhlj1nX4Z1\V_jV+[uZ٥UKmZvRm[fK]Sjj>jͭfZmJk+jmZ6W{ʵR uѝ) I;vOJQn8q"z-IpPqw l-⧂ 3  1E'!ɑ10tȑ8C%#lFiӃ3?1Z%6#"M4J!2djjelK0 Ųi@h !'nZU#-h[L0̘HX!]ظ 8Ab.dbE϶"K̈́6*n1mOPoO#lT8S>lDfOvk^Ρ[/HDA@Q;[QRӣ.\V| /Io`ftcXPo" ~q\Aӈ{eDڍuгvEr^UzuMJ XMb}?R ȺvMf,*h~6W1 MըlKcpnM͋ u/ʋP; p5bx4 k@LdzB,zPjtTby9T+{7 5klcF"ŃF,QkThŋdѢԉV6 *Ŋ1QEDQ)lZDQc"(ڍh"*,7rFDFѢ,Jb(ԘIsRV4lTHb4NtE1H(ّJ5! lIA(h! Qh1 EJa2*#hh()4؄؍Z+ѓXTwtb&QQ`AhPZ@h2IsWMZ%66H "@сHbZCbmP(6"EѤ5@lFEY#IF4FHi4H4&IAb4d2hFl!, J4CKH6J@(&#cj1i)(DLY)5 1d0rE$IQb*X I6JMLCHZeFLEfX`LQJFRe,ibH1DQ 4i64dL j6 1RX,Y,F*3J !F4I0hK%L'u`,M&DM+P4ED(0DQEDL"-%&LQb$I%DR1)LQdؤĆ1I$RX4d b@)I dh6Pccd"@bdHQ! i4Qi %ADɐH)6L4bLX3l2)1HP M6J0&i`&DICI a4BU !3DM SRTLBC,X#$%"&eH!(M& 2ED(dcbdu`KrhcQFBI̒!ytјd́,IMY4DF#E%6 A!$CE&4je4L f5)##ƈDL\FF *d. 1EH`(PhK"Y!5# 2ɑI0\4<&(HƈhHE ĽlA$)ȆhQcK,cfBr$ɆWDd%Q^둙 $1ΤAf.tb&#!Qcn(I0FJes!F3JEMݹ4^tAzC4!11O:&6f@@=ݦ $Pđ3P$I $FWf!2]$d+C#1"204PY{ЃJb)3(]"&12ADL$14fDe&D(HB4@&E%&$)1!=y=ƌK@H&ILY31 d5a2"#E.ib\f F"K $^lD3DLXf 2Ț^u3]=֙13 H% Wu{oty;y^CA s^^׻:H $HT ABB-յZfZU}KWV%mm[[vZHHLBHP@А@@0Ih@B @@b@?7/^~K:b<^cLQtR?8~myP_d- NoX$"8m=hV\Ne;nJz:ǁ[4 ΎG\pK{N^\1<"ҟR_:0d* ǟSv`(BZ,qv\{Ȫ-`:%ck$W}.HP#GT)(-;h=2lp ㊆ZB²J#EL]BasBڐdAKa@噎ZP\̋ڈ\2䷆؀M wsPCk&So!{Jh|]L98Iqf?gv:ę?G9ên~"-Bq`3y ^kx?Gz./qdI P]S޶1]"9JQME &J ,5sIb= A ,ao~Mj7f O_uyQ9c ڱX= )rHqiVaXq8zDDJIt&p@`\ J`t)1+GRrS{>T#+A&(b4!'aA5곹!Yr4XDmJ%dLcbhJ*%kI*a:'W(!R3[ CV i<젩dUpĽā EUȵ.:g BИ0j V+ƻ@ޏއ~ŗƝ_~OՌ캄ǐ=9 bR99rK)CJ&ڴE$( cFvU߃(F3*쭎:s^3TT־hm,M Cҋ? UkqyΥ%'VGlZZB(&%SC -TTnLArě)*ĸ6Ё^T%ɐ^ө0yf!e# D;CGUruMqt,N\HOZp1F,CҊ`r4Ha:>OkkQmb6j mmkXƬcmMIƴmTlki6+AQFmmAcj6j-Fت+dTVؠ-bQbkh5@ZDQj-Fر6mFh#kIXFFb20Bkb1Xa(4dQhZTlmQME&$1ѡ6(6*6j mJ,DUhTX6DlPFAbƣccED֊5MIQXFAj#`ђm%hBjE5T1ɬj "664Q1[mIM1iɌbQE!dѩ4QbYElQ$ьlb2hRQJ66`ȕLh4ѣi $fhb$16 TX`e$f&Mɢ"""d6 $H1bcbQ%#20TFEcDfYS3!D*0%ɐI $@PL,BDDL24'joUVmfmiV-GN"LUUk-jmfݺVZVZkJmmm*[kikVkUem!%paպ~4%lu\7%@uBFSa `+FT [Y3HdQ0` ѡ_H6Ҧ7(C"+ g` rqL i$9쌧&nb5sbMs2\lsdi793r%,G=~Ho˙*$qK$h $~$H-־q;k_:'ux4q H#+nJe!SX$m k$ !#`[@`۶r98t]u^$0! Bjuη~Ag~ǯ?3:nxy'ڶw Xed]33eϻ"߾+C~ ;w+)$XU#סB^a2Nmx3! jW I$X1R1Q0Xm_]@XaLMj/7%ZAM^uR*5 yg1RZ1Lţ拺 МfգR`JYXtlI=yÚjo,D>1vQ8ԹtƤtk2-[rk2[s{A>&D0qKe&|v/\ WZTőE[CFlܓ X=)l fMC_HLx^c`dC19!9cl)AlmQ tIe2J/k38Ԁ,vgU7k6 (7y}.WI "bcBXgZ=կ*z!IĜ[)0dԞ!R,RHݘU(i4)a\hHuA%ܽvvVȷ*UZY-kxkBf#hH"e: rƦhut H-aqyLQZPQ hz ]qD&ߺ}ee#y&@m({bT 0 q3Jt ϴ ;xs5qD:wg@9My, e1FEm3 pn/f$EfZ ܤ"^$4=p 5e yhNW%bhtiĚ*#a-m`%vopY%8g<2xLhyHj@൥>!͓. NQ!!L] d"ž 7C䇈25YN1 RMc82ЎdC<e3 #G.2d7S)B^h\gHmK4j R]!BpTҽZ4 қ Ia_4&v[l!K=2rjeNՐh$RG؈ڔxEj\5JB幕,7acę6:*Pu&2X`J4`6(XٯŌVnaӂQ/('@S%&295-0"н5ؑlsK/ SKfAvΊUh`)`E0J#Pq @o mrjgT{AI`X آis!V,%F *}aRjt*U ՝c7=`FFrRVQPo5%CZ`P\{2syxt-Y!l,elSN䴹g*kk-u Tbzb 8dOc z1 SEe-㘑4%q/ eL- "eklit0'G%-5p$û们Xn-Ʈ2F5B^T6F54\wqOEM%L*uPE jm%"eN8b{,,%l)b1Ae"6rAi59Ud[[(ڃNo*+A7A\Rc&GDx)j |di0JYx5 PRps2L _Ä&a)ZY˥\jpҤX܂X M l% 5dXRw-R= E#%pŢxAЦsVLlY6iaֵ# T&V `0D y-b&4x H"צ,D }+hY,v㉇^*FMzJ$%/JօT` tWuЎqw\w]5;\cbr XG& hBHmH@#Đu0qO͌M!kx]$6lk_o2UOVbEdˢhd9VqfKMZ-~3ǁԃ[t@ۍ;7N CiJh+57Ny1Eso+2ľjc.!ݮmr!aΰPEa y6m^bE7=>NVa̋odVh}QJo.! dd5DQqŮ\[[aۮAT%I :!F LIe6*Mjmm6&mBi!]E UrWKr)}..;C9GS1VpDľÅ8Ko Yd6 hq#""rtc2 Ch& Ze"1.,K88J2#b7ѻ\,yV\Z%rHe\si,LU |9d;HlITO\H"qx`7P"!{ȣCs3TrIcUbHk7YȊr%ԼgF"1J1o[ԋ1 [yL^ zͮIdNsP_*K% {Tn0ȉo"\fdpճv"W M`!=i" M4w1*$j0QJnUdݶ;\3 V{&[^,nr!.e|lQ 5'2( p?9lPjLw?Swn@*$?ORzEDHOGn lA8!̓Ͱ"jC{k_3D}l`6@vC`\F\074}]AK3 وTwDG8޼/A߭efzVGTMژSA?& ;D :1Bq'Fk߲ZhZ \OpVB'TAzGWd~}$TTx%Hg +fLu#;E3M&O˓U$+A "CPM%&lP`@yB_tg h]Lׁ?写^qN?,ѝy- /ll pL'-`߾yª TF9+v{ϫ_XuS:DJv2fTU"L 4a)Hҟ_ES^|U45ӉS aQSyhE8;u4{"u1.Cd1$ =3~e^A.aBsq ^g9oA,;0O͐{aC͊(lٚx'}5@HzZc?|q`oD2SvXG ^@d"ihp ??(tt? j,"=|/~UH*uDFcAIa+0[eCwg4Alp6ۘ䳞:8Kp K 5r, '皻 g_3X;8N=оy_F EQ#)?&)P^4 1vt6##$TzPҰ<G&:d+Z4^v@qiN g6^o5w]vƘKL&~Vb\-R?zZan@h>M>9{n:7-=M2_?d=pa5=vui>NaYɃlz4ZO/LF:{*)@jַ- aFݷ}˳8|{Oq+Z %C LAۢ?TapSw v$ z@-(zrgf`KWpT4g)`a^>uE``IG~/4ZpUJ)juU w0gǪ۽AH {L3zL¬.A*=-ipdJZ4! A'`ZtRi}JT…>/lr4@>iYj}* ضS4rLOUIeh;v ~}J hR~rs89FF-Pz=!M-{zhqrD4"[75ܐZh֛S|@4B8Kafٱ`|{ϪF6!_3S{"C޷}o7՝*7Q)n>k6JG:VB_6w/e`02 <5Y1ysk:ӂ|!̅E"#/~0O5X9ZS姗b`k;3Z?۬㻼{hRh,DCk?5s+. TAyWm,B~~.Q3dn _)SjsJM r4tJC@Q v3 ;MU3A :=D4gTƨȄ ,(\84)h;z9aaJQ? 'ZG`UhLifS`+RKGt ~bpđȉL#aU %KGza<29G '(!Z .V*&ʼ}^j*|uukvd2H*-+y$4%50 sΟkNR wV_82|50P8 薑쏔[B}CU" ܉By-z,29?y:^w>jeŲ='axr/}1F y.cDy7cPXЏRԍmcՌ9=-j{=hK7|wC;fkzϽ+yYցp뮉kbfV3}Dlֹy&[˰k19S_@ ).$l]WoPOټ2VpS/6SG75d1 QRc .);-d Vp}Q01ϴ U"mg k~ ruQ'ߥ"b (R N*#%_7?"dMyt "NUA Q%B=y@{!q!uN\;mtɴtPȡM9%hW R˹¡( `{Yt; Б d^h;8PK#8\ F—|sEB,C6*Bf;/51E̼Rg\B}G梄InXyz%jU*4O)؈qgq\36K<҅  ϝxZh9laR]OEf&f)PvcMFrW|#W$$ZTКr Nz&dMlHG ^)چDb<QbyLc&5q޽-BP,9%fjq(t N ?u^]lNVSI5Q!ArC"(tL+q}F0-6eS3ihA ~1ADkh*ޞ 1(ȲДOYύz{ &wōJ KPj 6V?-Hk!ܐl5 pj׳񉀮vxPs C6| A+#ryȉ)𼠐z. 5G3ڟf:.FYmU.,[ @C(p"){ 2xIb oR, e(&?5rҠ}mp뚭Ȩ j~H#b|:sSDO.q¬LVSyx`?!H~GIɄ-Òf:](\R- `ŀ+XCfԪI6?Ç釬9\?>iY~ƏNʛJv*ErЉ񀔀nSG`\ VG-F!LP-'($p ݴDORsы uē5,4&uG(W9avb;3 /w0_C*}ha\{G}(%?T87 L }צ2!Έ˺44U4+K8GjG`lNmȚDpqFa*LJJ߉#<S.oJ`} J-azmdrx0AmE}tt-.P/NJ8W(C!{a XYC!xGI 0Q4kHQZu0/YE˧ct*΀?ssHP-OQ6?C"5ۄQ.R9,)'њP3V`~u@kǪ64Y @.g9{)1);/_e;TK"k9ñ<&ƻd翟 w'6 d{i4è.{ ^j`m7 Ro4D)T8XEXqS.؉1&>L-r IrF/έ#.?QDxMFBY0Ԍ8w0xr86"6[yZR.\eY:dL@-[Rx(7"&z,ґKPRN3rj?n ^{ i0ҚS, ,Rۻ:2UC 6vŮ\96) ;޿Us)', $^ ) 2}CZ? ' _Sj7׺[ x0HvsY0@'>Ԩn81f^E\%@-C`l%yGO`6]^L$|Jf~zg̝z.,2ͣ/?#1%~e_l%b (͞IDGLDF$d2Dʿ`%A?~^R`%:JfD')6L̠kqOAY |y pj %Y@x5ҍw;0U ԫZHkTB&M23">EFq˧-=3 ZB?.O|P4mܜ1]~`E4ȃWɈnQb!@![\ {Ɓ7OIvzYY>#0AmöC~mKP'CtMV׵ġq@T)bFmI:skh9kfa[i38`kr/2zujVE Y}2_"u}&ɖTuFmjoX~ě(,wrP2DfRyFu0r҉2A~s(T{/8?O_%A(ٳ!/"G!>% !k rFTuGnN`vAݝOo8DVnSIPQ^$|"I>"MEשFǚ&ᘡ+I^4boG4^IhV%<(XᄆẢ,%;7sY'Z+U2E˿|X=ׄZko8|6ЮQ K1VR 2RSh w:IgʙR>(0%M cS$Cf\,IwO?v}W9bvMĀܖZ׏8,j˗W՘c;,ls(b PL:cȌI dZ 5bチB^w6pƃɱfbx>FK 샆Fũ:6]dH ~{-i,bf l?T`Hi0:1>U#4ޒ& @Jp%mo<X蚛w3ZѢx˹/wT;h6;B((TrRw[ntYPdit*kZ_f , ~1Q >ۢFc{@&{raKAA (B.$ ѿj92:u[7xIlE,t+iQU Ā;(>D"B ^ VF e(s'h[!o!SqgNST6 "ZzN8)WLb-biǠ-7$KC"J^㩓&5o:Gh|ź"@ۦn P ~ @ٹ!^7 嬠%0;ο Ѓ09,9=ؔM^|w&&E>'nCQThj@akRpG USwtד<8E~$j!ȌT47L Bݒw2XJ2ťB/A*d!EXDӑ&u cY T&X]L)Q SDɑSD);A?%fay~BpfD([JPE0jMcQɆD :cʏ sQL9@Bg߯7s-t!Dy8zoh|ęK87嚜ILEŠ:! iӈI"AkptdꡖNW?@6Ձ hIԍddv?\3.WQ$QXR$sETOiSzY{^aW}SwNliŝt^tl4,Ww40}|l4T-ʙVqtv$ďٖrVuځ-$c#{!]8_p |1_RBJ r`eꊰ"ǐc#A(fL7mV$ #}f%Y4^ >,GGtU":]OjPYdan 0buY(P'$PwU=@ uiX6C~ZxEJu&Yb0|/ (U2B3qO1p'@2[oPcp꩹K=Oπ͑ uY?/%Jg)ymW* @k-  "'ٞJIE!"Z~qR9Bn0= v9#.l^XBL\ym}Ǿy9"]#ݪ8)Iz& ybU@V.FA`D u&j6W9\ S&B+\e9Z҉QI(p,0LH)Th\;F u FT9L] V5jJOPK6͒MT*VP\"ZWnW@;@I1z͠EVSN IC!w Ęl_B1_kx'SD+Eya| V8\>];*,ۃ/ Ooj b0Uhi r4zlT\ҒR\̙,[z~ixh@,זUT~U!R[؋1׆K;=RSR+{I`8:$={x l@Î߳VVk 5cb"oxs}\rDzf6Y- ͵xgeT26l}̀I)eKpDQ{X'@ZUT.^Nm7BNb$ 6IoLJQm-0A| 5c+tfՓAd_i bV=PJbI@4ecM;4LB$ #jJ8{?Bܱvs &ps%P X )&1zQ2cZǪ@Q.`-+3+f܇V8EvZ^H*mw[#Ӷ{c0E'K"kGQ Xȷ ٠m&9%7f.[fFc"Uv/g!nP$_`#+9È)?m֚Q3N o˪5Nh&vit$g84y9Nr6&~ضy1vatEp ɂn/JeB  1ラ6͎ 7`WuKB'D `p((aLis Tx69'jꁒY2 ߞ  ;#zv%I2iAb{ HtFa&"fbNsgTd(p{+0ITQ:*Gq"G Udd̜x.P41pT5# d$"׸aPѶ[O #AN(Z|ӡ09CF!Wy)Caap<J5%ݚⓡ&wyDBaKg.գxsc2J{+T֌ ГMѝǃCvZs99 a\ܿ@B¡j=C_CR&r{XBjL wYL9Oug+G7[cEFs&drry`g83A6"# )8&RW|dEzb`'3 -2g'ˍg^Ok밯݆td%s쥱L5 ̌SK=Gwµ.Rmy ^*. ~kˡ0͟ޒT@dFR]f ~+TCd7,lr6HM.,4k{w rk!:愴IAwD"y#;I9g*X)uCv#R n|*і\p^&H4>=2u"K å0Y,S T Q(fAGV>XISa 1T8IE]ϕj`}%uGLV1dوHu[dm T~eLa&2 8Wzt \Yeze}5A_:b`bF\X,dbȇ mZ؝C .¸"E:0`Rlٓb2H75ź$eѭ@uiX׬CXc:(hǮpɜځPKQ st-6l#cE)vAJ^1!R{et?;9)*nb-NdoVNAl@#~"xm3l= ZF{l|[0&z-"f,#A' kg5.Zc媁u7;m+ $iWXTDv:-m WaZhr&ZrIeRPhDћfgV%<a"q ' 3CCͭ5)M+A@6%e >ǭ<ÕAN 8edQ8imDr2n"ll_T@YDs!`xroh`{=msf|-QOaD\ FB BU<قSNhMcDNhO;a.Z#7o3sW`72߅S{_e 6J Y2jGd8eZNhKmx$ 64=ʮ[lSU-a92^`1O.:k'KSP]e+țk܍$90Bx^i],) gO5C4,' AIG4tXd=|ԋ^~KbTt#=-=pם]!@awa@pϪJ,Ŭ%O@*/S)m%+ժE3Sj?Q\Zg0*: =n{ab-{wG4@C-$~Oάr)PEbU5B(^ al(}x.)<͈.YyWXrz*fGӚaU(?{0$mْQ\\U<O|(%o-ismp_m ~nFBBlFĨ[Um ) DM!TzN3*sʲd uGZ!K,J)_ 0b].z(~^;+9[L]dw־AQFgλ&x4>$ޝyhmXB$RّMQe5dyz i~MS}D'}OC[m!4oճC}97ŀXt0Ȼ?Qrdqu)dEJR\"+^{><$o2}2O' fl"5GJP\\㐈%w(פ-G׺77-8k]p=_@K4au#5X2vu4x'U.O]/^џrg^)Qd0*V\cJ"p :,YP(Xv/+4H,kgEK.U+5x3O$d̂QP{FFbZ]ˢlW;VO:"2ՅN/#q[*;:"<&S(qL;{}E=K5 DmA1ixP ]aTtYÜĝ[ns'sۗv-!慳 % :9pdD߸J  :THOck'(5S0RL)Yu1L|?zz0/b㢧M4x(xD#؈Ȓ[RW/JUNY*Ε}{ 0fqc܎g*zm0ϗMiD`Lvl ܞoU U !CC@%\@X.FjcEfUkQj vf/nZ%e kd?*J"fݘj B'lj.aHYeCFx9, si$|.8<ѿNʼi{s23Oo,^o+1Y6KyQok`R7c(^* (_.Ivk(䈅- z 8uYVI%ΞSý3V&ʬӊb9 4@f+8]C6Fͳ8iCdE%;B!Y_ %X!2C ^23e{c{񉈁s/<]"=~Ӑ]\8?te]!rx^ m\@tKa *4ub=(̈́|P !YOíkwH]<  TI^cĶZӕ>܋bWhCITG|@bzUgriukC;˹Y OFh(%0U~p~6IO}-3mxJV~~4TXHh@<|yg$(QJ%$-m/ ze&;i&GxBF}Rp_ YR`QiO _7]JoOXHT  4`*{V뇘Tʈ{R<+ xtv'~h6`iu<,xZp2Nѫ8IA*w-@&GbYh]ev3LMJ4q KjЀ&T[26B=ep!jo-?B [="y.656Rtt7lj)R54- KMaX1̱*c 6xkc`Z9isRJߊe[ Mǒm5[+9RIcl܄to PuY,:7m\7C3-=mU0 G!Ѹ^ssZxgkAV>gŚt 1˵zjV3Ż2lP@"@j<TUo&MC`OQB5qpG{F2ʵ+1@ޙbziҕ,|G%{Xt)KpW{Gc?h,w!' @"$;M[gצJ쥥2}D?BmS [)Kw:p(1 hqQ9Rl)0e"(A'%亩aPS"NJ<5N/JjcM([RC8GC0Q;F%XbQdn)j0Vz䯟u6JA~ؗ>wϷjMbdJz$sCfS~ǓqR Q}j *z/+ })Mzڷ> ^jn!?=P+"ti+=֍| ƂOoVT(NLs}Hlר9j[^m ŊpH3>Z<(?#΍[UsoÄP8`B3gRSWs6n]pr&<۠`ժ;A 2D 5\ÓE*O_x\;GPeN&_T8zF2d2 fS݊av˔O {q$2јJU+_Nǭ1z~aHCheSr ?~h Ժ *0RFݓ)!y:QZ+)t OVvGaP@ze{;㱛wv1J:xƓMǖ,k߰DŽݻ>(cx=辰m&K`;HUbf`o@h +l[`c,yU8pLIi$g۳oe :(kz3KZg }ۥ4z*DWHC7v;KU 2 B,nȊh (2ӥCCvQ^+ef ÇhC3bws#$LF!B@t63.n@kJy ,JS>rRQ<۽".+J](YF E]8(Z(a.$aCr憡G|+͗JYD;V:kGG.VD4ǻs$o1Pbw|l3c۾F=re>|׾{/lP~h'2dj0fBubY($%XC!H\6Q1FaHӯZAS 82tYѧv]iN_j{3rƬ~׊rJ\X/;A,Zgr`& ypn-jiD-s>SOSX=a!KݸMp\mUNEK$Pu j ܁tN(_p @ rf..4N h,"G!4݇. dV(TOh^vc]Ve d=US"HP` H&G3hd&i,~ahwC%c=OWSaUX"`FMrJvaa-j?J 4^]|{WQd6EYMj7P&ff5eej2G*v.U hﶌ8}[jS[>GU.':v}07DFkIoňhV'>tB0 ^$KbupzGp%vΨ;fZv󌬵)gg(95HCj/`q˳Q&2?S'IMuB_ kw4# Z/c6PfFFm8Aو0}k`,}_Vr)lV̚9"DK5#n''*8:#GPOZ[?0H^/߅rC H!n+%ɖRSڠt$p4D7PbԖBPVY2hN!/jĒΠߕ#WSaPU+C[`Mmd?pKp!1x$avvZ5H+Lܟ [s-o;τCҪj{栫@B0;dήpEz(DkvbcqYPȪ%g X 8FFG){F?%i`;+~hUI(˕~c4*)!Iňޔ)Mb!}%"PpsZ t&\>Ho*X bv`IQ9W}E'&luhcLF g=Jjt0l("4ŁX dΥ3ECjF%% y]A&ieߛ'e*`A ,)́YNbitzչKug6@Qw\v@#Bq%O,OD-rXڧr>4 ]W"VIJml<(sГ42>LU *XWѝX F&6(*2Ht\ rS꯫Aˇl17"3aӥћc JEhWbxMꟺ.3dm9V1+"VDhچ)cwe9Uc`wRd`:cy2t 6=W"l6'WZf6yvbNU)r'ȼt*'U@k@.:gHRs9!k7m_<Α1h)*#|,޵# $QMKOnɖ1! w_V_si-R<`w{L{!~d Zr:']&]љ]X}# |d٠y#j-Pc8F$,"m15]Ġŝ7K)urmʈZS҆xFS;+v*EI09+܈uE5H&[Sv9zH&L Dhy0.,G"0s@E|Q坿N#2ԘH!8ۈF&r _oUО5TJNBq =n5u*jUUMg.5 +!O_h:&@3Z"z^6]pU #}+f"hJK/2`Hhze5.Y?cr M9W=MXZNM˞nurJ?JG˪~;G4&!%р͉2O@Eh7znC)B4EdL2Ů&Xj0Mx5 @`$2?0DQlk$OZBlgAzAe~\Lngb{`O\MI˼5CeQzW C. ٞ]J61I̊(F_sR|UʺـQ.솄OfPlɇ.U8-")Nz].Fna ڐ G\05rLP2e!* tGcTҝTQ1#o@d6x6+٦)+eE=(wzlC3^~()7ky5' v4'l.[CqM^v60@Okޜ@~&`Nyb`MArTTBQwγqLRC)\ S s6*1%X 4T(uh($w+#NFl9?J!vvpI0lm&Ћp0kᛢ1@홂ë'P1T~Y_@3(th z:&#qizHo, E(}ZG+ (ᦼq1'" Ǻ'Jp_)T()p&18 +á pnLȤv͈fz@uщ>^cc R@$aC DΏr׃mbb J)EQ,g NT4B v]xV5qG 9'8}t#W?{ 雸 e=@ qfʨ>w_ZGj&}CћVD1K4V@A`\tjw^]er=yx7l_k|KBp' Q:li(m]R#n d\r&01!~k2tH Wz %t]b Tky'1VM֠~Lj@hjeQ0ĵP$\F*}J vɸiK h$? .'SL*FV8 )ЪuNx[q'Vgd/VQvb llWȽq/GP!%7/fPJwXb/#KS+ۭM-[reLcֈ/hNjikB4 !%7uŘ)PA R lhc6h?ǠTa<EAb|x\tL[, %5XU(qdb?E:c絽N + -SS&d' ǷjFQTi 'WM[i_ρPfͪaLrv`E "~վ_Fx;&֮2F(ބު{/qHզSsM彠[#RzC#7{b0yxF(zw&AM )8 m1t<+$=jC!%Yrg8vMT@T(:&<%0b%Cn@ܥ|2}seŴcچ,Lj谜uJ}I ۢ-CE .hԊE4gC:2㺋1e$V4.NF  (Cϡk Ȣz̴F# vqL*S)W=WO")k)oJD S VI"$P)Jb.S,@Zu`{I`u'xY+Yp` } *:^K*76Q8EOA &SsF*s#AkGV dxl(nw ˿.Z $k0)H.LfPT0ək\bAN%> -Ń<@s>jgfy*GMergr<9Bl(ӇOMF;5bb଄$EH4%N7TFˁVOq~n^f']'F4j1.XbH Hk$y d${T5'ZSF1-L,?t#DA@pL k*FeIaDuJ2#4*5-2QRmAwȉӭ^yX`GFϾߪ\xC;'Kgq8*5N1eOGP;ݽaLuH&S"a'B Qh O4{[㌽+Gu;%1doMZKw"IΥP,o1qĩ6~` 5dq:.w8Qn7CǼ;4c Xdkp@#-AsfV?fWPA<KVҍE~(R8aEu(X-NcS㖦T1VD$ K IQ%Ō, ic)T>X #lfv r \|ؖ MLe>f '3TsFJ:vF%=Ceϫ'Lo {JoUv<vyaC[ I/9'Yna(Eǃ`b66^ÁA8dBNg) VpSJŐ E QL$FD̙$S"GW}V&0 -V1pZ ƬGz#qG=T)Td$U1ժs[[{g$r׭:v݇1T(Q!>dn{ѕ}*d|}R뛧kg0_Sc7>w!KϢP\4=urjx~z;# o)ٴ7إKķ1ij+ !Fg8Wj]e#&idC[BI'\;SՉF"`h-<9]K8OzʏJJ%g01BϗtKG kHT% MX1Z"k f88n*Qtm\L"/HEfEг5P%m N?=񀜼4($B6")0&0&U9sT|Tܟ;UZ(?C \_0xcH}J 䤘Ayo<3Y4'BZ4j|A'<6A,˖UB8Ua%hq٘m pi\?y+ e$Fut>ˣ{zEo_ h)u@Z3UPvҩ4J\zv`GQI]{tqb}eKԮ^P dp`33'UZ"Gp7fBU-#Hyj^o$>.>uY&0<3%E/ һ0@XO'A v{^5:@LZZM"D1"$Q3<] T8+, MWק}zOb^\UPՔ|#*f , +!],YmO;AكZz:3LdRA;L]9h&ƤƾB/FW#=) oɩR C#z> {8Än$KgjuKN%i"AKW8ƥ+zR31oMKtulҐn!H#=ԇ=;;tT8p;LhTUdiq4*y+3)e=gwlJ`WraӁ&_xLPmE0KUES\Xpg˦CGDF󚉥6&a"dFGHlM+bN`0d5-cK lL0i3dm@=Fd_c ]@0!5>>R{ j< %ގiVʠ-Md|37Z Rd^nͨZZTl7LfpgU`bz^ l%Q2?06ex\vI"P UpQF/k!{ 6i|g7w ;իGʅ Sx$ n^E*G `vt#ZO+Z;եW²rf`3V H +цB%eC$dCjmʼnVY!bY1au9qܭ=v4*k?B8|0y[4mf[-LC0f&&ҥ=eq8$_Qh+XjG {F*q5ZBLƓ#\rXid#Dh]MgL<}Mt݋]1|ún_ki?\D[dѡ:v#&(& P.oU cb 2fvꖿ*wWsnU@78Rzc!6ښ!ʜlp.:: oź2-\0\8=^n:ot|Um6ߣ$:J]3%ݲ#+O]0 H WsNI%?a{ iB=|56w`MT QcC6 qePDUpZukpjCO|5lEOZj1yC4_dðw %b5**15U *OJ za4؊WYUJ>Di,iGBN(v6>cCqOMoiySVLd6T*<}|X6$5\iZ~c]2LejsL%`fh)TtamQKKaQQxk+@oJ:\[)E3Ŝ4|6{Yc/Ӑ/)dK9x8{E ٽ#ؘoI(-cm P{3.sjzA@T("gۗs&q^/A5xat6$5Ez^3RTw)[$PD L'xcU;(2hY LHAU:uT /DA9!owuECUj ʚ [X̐ Rw* ׵zVw"|Ԁ/n%Abaj8֔͋0f F$R44@>;U Wd:ѥ43t vjUbn7&u',pa๛A1O/ԫ`h}{ X .ofʾ^o_b0tF@GfHnG%i d:T$V2F!촼+֫W[`˲%禬>1P 3R->j+"5[Mȼv6-Ei2|NSwg7, ObĆM5旅B@3Jk!pMqA90^hb&78`RcS baƉ@bl,^etce 4Vc Ó+5H$֢/$S _R pdozq6[vSON6CB2;E6*aTko6]rGqG7/.3rt'p'D`J[8#!09C̒ >ӳ0 v|e6KwMg1i.v|vꯛdt1EQPy8c?DX#kV-`s$uN3?Kv0aޭt?vOU6i1&ְ 5_ Y{Q٨:zF폼Cmiu?+ѳ8?EnUɫ56ay ]iC"՜jXU<<7fnCg a0/i,G@N%C/EޟINNF+t 0>I H v-ƒg@W3w=;*5 PVAl+ m7ygᰈP0C5#hJ *utV&j>d;, 6jZ Q^=W|̝C䩜Nk[٪Y "$2̷/z#1T)&0|U-$Th~Sκ #⢐Q>*w` ̰Y0{ɝZd g5ތrx׫_>Ri10-2ېé%!'wMo ZoZw 0%SF_ Za3>k t,mR1yԺoTXnGϴJ`k[U=\$cd|0<3/,'1Sjv-᪨v>:Gnˊэ\'(A T7j͌s]N6EȊ)FEݛ'o(}9%`|W ;me1غ0(J]Ir06D+Cb K.88 Ӛ2=T׆Xu2ջDR3Æq6i̧7;,̴`\Dlk;02<_ <\ة QEVE~x#P}LRF蓨Rŭ,ӛhEaP(`TiQ|&9DnIA:]$;qߚ~H3BvZQHNhlW NN\8#.iۉ-Sz,ϠԷO՟rmrdJu xNS;ZDQ 7p0b1JZRy{U/@8ߢɣ4siERM ds bB:8*]l^ly=,{ܞ4OP؞a/R:mz[2_u.7 *YbUdONHz{xțQkɪ3 Ŋz&`ReRju<צjn}Q,-1KSoܻRy~hKgT$߬ЀCd0QH\քqaBS5۝gjlqwS/'AWd74"ZEא/WqH#6a҄xCHmW6i'B-RJ}U{>m+\IW=2+sb ;TpUZ5/?bak-@ku L4AHLTdHM₦żm,Y`RȆB˹ZK&X&@QLiN.A {Κb.AX љ >Ee&A/MF ܴann^;_+NB !@}SWh^xLqGף~XP2!%֚eBsgfB];DTm&ۣPGhA9@V;~CZzL`S@DAIH9g@}PTGHJ4j Ɂ)\2D0owq e j1BmkD,`ZM BA"q Kԗ O"K<Fŏǖ/$3mɱO_, 43S:r^3a;4vW|B"CD#TZfɘ-ʤUza 2>*T#{FG}KbIK%5b_c˓\ q>vp,_L]G⯏bbfhc8W%_H7`|W&<]B"x4.d2"tB#_RQՉ +p ׬Y(ہ}husdj~ɂrp].F|1.`5PD YL1N0^ʦw's^y)QѸ`SP@śM!s|F$-} v {.~;vcL`8apnk`PoK-ˆٖK?^B9"v%\-p~'f>]Hocq pUDz*hjPl(LÃԒ}s߇cڵdP&!' q97b  j( D 45!>,BBan6p"n/5,;/:xRU0pȍHΫ;45T-X tM^C]P3-i9aQbҖDK1Tp۔+Cv a< i`u@UT>iHjԶXα[Zb Ey#+.c"ݲ*q$جC vbtLflV5\G0;Չ 52 p}WoF뭟d39 D4$@t#ڧ)_2cy,mgg@ꨉ QX`.n9gElS&1{V V CzjV~)0'6<7%=ɐ:$[Wm !hkGRQ%S:DqM1lIŸGiv!-CFg_?U-zSyS=O.9)xwKϢ&=CJ KD&ɗS ~F{ŝ4>(_wuA|`q$v $u%i59Ni+Tyh6xMB)Ǚ!DbBytv {OjoE+˘["Ny 0 >rA VγFN{FlX0]p#YJ^BP塸Rb!} Y0 9sT`LEy3,M TՈN6ͭ8imun6ih3aHRpݔTDN#S3 աSH 7R:"&tPnY&WHv37R=i9s=RQGjK p=@ڱșdHXtWTKFr@==@l&RHd$`@QB,0iX78k%`߻J ]TF(e@f=LѴ|?aIӕƭLǼ^>&bΧW( Km& fX`bN0A[c260 Kz) $ $GEuTh^M;Pձ],dW>ܔQ|߂ lg!C6 #XNP"5<'be"㛠pzNʬbTrWQ9Z*2W6ӚQب*Ƭ]ArSUclC5E>vIS/qcT3|=M/7QLCSnyu{񥻱,:f4aD-HhƘ196X U$ fũĸ @Hv?" t1RKEcyfU;4Z|R$~#-YSY{52^Tx(x;ht;=I(lTTɢrMܦ( ]ma{*8e/ZԼd_Cv~_Xɔ/gmgMUZXLpA|.%JxG8@"b 6 ZxP3|2+gfKIROC&34R$[o Rz_$%ùF*6.Z'BjJOXo8}ld (T b68Ȋ2JXka!Z=#R[ B)鐎I Beb>NSj0T "DTS-t2ĦFdP=8PtGM6Klȵ> mӭp#ڂP99TPh˩qPh -a<W 3q!h} \)H8ù5X$RA^l̉ 5!eajءȉ,R<,?ƱkDa_҃_2L=x'~y1lBA0=q"S CS>ꌒ7~9m OvuNZ '=X3%@/Kr:2l]y؁+23={yd0))lU&ܸ}hdSBI9hQvr0]@셽D鈡 (+!%QFB6|&FxH }~lxr cW0Np4G $׭{cWH9C/#G7I1ݣZreIm6 JO+:)WZzt;Nr"+.RwYV5R$];L.H]a iL)sUY塳dV]|8?W dY)煚(rXyƝ,fy;oNד'!Q%TPpp ]RE-wG0K2nYqfV`VfM_"vj6d#jDcSޢN7dPgXIT=Lb-2%S]i0WG>LcȆ'Ǭ8!PdKft j,&V=jcz<ؖeBH>-B'5}p #P^^-i&ŤXJ\4R.FlaKP$@:aH% ۸zc T/fn }yj%pFDABx3uzV3B!U8x?kok'9kϪ#]zAwQʧ($ަ (Lħ  m!+ DLծ@fML=e~jƝ ;sVYNLSf&qS$5j &uږ ,؆Fd- NԈ~=c1]/Le?%OUhɌ,ZbnsB$ JVv1oju[-cCDOFgl 7l䊫&iCڦ"MR`A8i6 %/MOsit+[T/_+6aډz`-'PZq4%'FYMe|ͩ&Rmꢘs);^W?KנJ9]€.ԊP|y 0EDX0jFзZ%D R oF, tdW:Ҏ]M_CͥG_6ؤ8x܆nH kF0椞(ͅC LIdw1[ NCM/7Z A *"Otқ}3I(S4q58e~`5Ot\DxvfCJBIBt*Ix'ǡn 10<-p>)(%FPXL5oFᔊN*˺csbZ%u![E%lb;ss/eCꎨTTd ]ތ wiD:c# 6NA.ꣾc>ߏX;ƒ)6'0o0Cb1P=Ȩ^iFD0JNA8l z&vGkXbyA;MHThMhfF#Lߺlޘ.aP2i]udFc[6:lԾG`{%*2܀K$8ĶDΊbũ)_䄑Pblΐ.'#Ij奿 \a~v@rSZH@A!#2]䈳X2"\HY"4GSaAueB{Q '{!2PaO}ILއ@m[(4cEg̘](G)CR nUyrtYa `wBzJ{}U (偗3mx[?mpɃViTp`BՅ!M 7C܇ídd;E)"dZWPVn`ӸwI{u_xu"rG{e+-hb;ث||XɘV1Jq( I#,vCn((..KQ &"@bÑpl> ub6* c,;:ЁZM,NSJSEonYAlsMKMC_mUU5팇VZ8"6AIgP&g[9vvqSS#u\iSLbMYխ *gģ&3R v`i!#s 8*56. Rh]W{<(}Y%;p+LpOa F+ q $a/uBzwV~Fc@!;7PVzz)ƪ굮c'K/ 3u*tk347nx~vU*1^{LJ{ޜ7Gˮ}~#8}p>;x EQhC8HJC~`cfvS1E"dmjzNs)@S ܎ЊԤJʣt%({DyHsBcZQ9d,$N!M9'FU >0iLR^FOSm6˵E`)r "JY,mtVtD `NQPm(0֑Pgt|w wM{SCFH#gMktZA[EN.)z.Ŵ7j1{3Pv44KLCLORrȜtX!>VV Ӟ᡺ R<:Y0CDDbhW(4M5È;|zFte= Ult E%l7Fى>*[M i LAG>(CA9bH"?kc~kZdSv|zAW^r[͕MVP3D茬gd"qfbd>-oe0b e3-I6W:u{pkuLS  IQa FѤ K6{̄cQ7D:kXBvшfLNq]$1 PM@< ꮢ'V/۷ ~0fwxYdd+XtMF&Y`|-|^qx$k^0`W:mBz.UC; =ҏlܙyIֲQRk tߣUSyDdg !u1y[=|עh̶C^8#.o-:U7}(6|_%yV0Qڸ\ +U 4CY~.Ev/y"31\ DfqΆV$+]IujNO 4/i|tae!腤T$gJѢoD,+V&QHR~>YL8hES'>W#zNǽU[wӅZ::%A?l QhhJ5Ն GjֿgbJ;u V6 4hdt$4L&FZLR?7]w=o/'jw+XG^13 N/Uz~5M\W^ o!_gy( ??^e_ɤ#z*\W}x:Łl?{v]uA2:/ si8 Of9Q1d:17%)l* ӂ) {_ gcv`}en;pE)zsNG~]K>>_v6z\1v+:VMԢ"eJhE I#?3)F4OϽ7GE^ϡҰڗ !v߱sM h y[tU0t3*W*UCvp:Hnw?[s??kŸ~~KgM{╧5w$ĿPW/d7矚cq4.xTMurE_X{F1 ?yKϿK ,fh#sg8OkE 'dd ICP#Zsv$B L=ޗyM)|FMiS.E*#MdYCXPڗsK8-NpZ60fm&$leTQ1=bB\`-~5: P걏*mb&5œ#9P3T~u7Uܑ4sh{WS)}G_)^g|o5?g[ 玾fe&0Y$n{/o{״ѫyM-syv~!AZņoN~sڧm/?#u7Gg֧i>?'߲Z_SBom: su _=ךd6<ϰ {Cc,yzu@}Uie~h}TBHU+GCZ@PiD%҄)@WsԒWmrׁBq=fxy‰1`^OP6QhʊՔa<$'E J8 34" H*ojDFbڎoVW0 Q`rL4YR- T҄yPrSch!*z O&9|V];k?wVp>J`zvz[29O#ӟgν<*yj''r/J_qWUs2 #:HO D4GmTT;7iMW'4v7'gTd:L5ƞ_ _LEa'fHGr^~CV#~yODtP*= 0(dGkT9F$rB.4-A'  ?߰^5[Avy*ojU1&sAӭ1"wW vsozd?{e:#}kO?3&gj=1?,L=v9^ߧ$T/<0u9;:WN`s"DEύ.ݠy+Pi{jcf\=ߨ[5Qi_w8y$p&QDr3jB>zT"egu䷽+qOAkJ~.8~*/FC~G9քn<&o;x)4K4⋽<m{e@>?е !'@?z[:/{Fz9ۃz?=2t/rt\OC3,h>؛)3"== U!4ԋ f$?鞱\NPiil\uǃ!h3ZIAd П[xsK?FD?[_L8Lv<+о3CʲDzZ(hG{XI#vd@c~H~y:2w͸1'Ft}wCHi x&D7ׂ<5[dё708[ڴB8eI=hB+VU:تWQ4A4䡤,8 6ichٮG6َO(f '%*bPK%sPyx#%)YreEXt}Nv/<7$ټouZ O jHאKTn_(cvN\`zv!S"r]Y!s`2kRC ?"\@M.PRC vW牆r t1+Yjm+F9c$X0A3Y#5QБ ) EZ]mȁN\ *gin%96ӨW.{/'C!ς/z CmŤLδRmզu6k9]Vj0={Hd 7yN!3I6ժc&\U3߾#D@.8KC] 7vwzfZ-/A5L.qj;,<&#=y5Z_"{]12oy({R;d7ߍ]!\nm˞u>NNoX&|mBH`<\ 7*ELuJC+2f͟}3B/]z|~5*)4UrDwYofH;t:GzTiCɉZuglwHQxoeb}jw\_7;6š V>]Iir]u]̅!~kjC,[<ó>,. C(\Lyn:ۇ!Ki 2-񂏁eM^'k S0#51dT]S[Tb7^9xMr`2]*tm^Fk.΄qq]OY]tֵӷGO`o_18E+ 0¬=< D&-՛xDwz7~Qk0Zְڭdf9e3 "%Z90]R J5MeTU;'Y8+-b T S-V## A%9T9eMcpa:, VkbB:0%,: (B!P)ZaRiQtT~"H@zHSC 0,˺a>}oܘ?}Sӟ#poY:٩Nσ}ө.:o[uPzJzI 7.caK_( l$Hr%A I`":L,k4q)%1VC1])A2iTF [qDTf%1\v̗g?g\3{v^=9GH?nb3==1f9.^ws8W=6=;O^79[^ӻy Xky=-Esk'\@8m5e5Q:Ƨc.RL6eht!Ơ8zXygXM4p衑̣k7"ʑ2kBT 4T5ީ,"pPSL'-5 JgSETДVV8O 5o7Sۅnm냥 ވôJrL$dT^ESC@GA~ܾȯG 6#M_\LDXTF@ӔL6BUP7iRC%FHSZf:glZCkT##\k3!uuUw]-ߛ Px m`'dDpWhQ8hOvHQ6ܙ}b/8p8h{ 1  5S((JGyw?+FKERJ?r¬g~bMaZnA 2t#Zp*Z M &AՆT'wd6[2$louQ)E8%ݧ.M-VttY2HlI[6t.CSՊ0/MG/ld@i؈hd":Lh[E.3Nl4٦8m X!CR͵Q`eߺn9XeqDhg3kk,2Q^`)?7?wm!l?+pun^DI?~ӏ%@hܙlvם?#odYȯbMrk/ûuIUPFF0UHOP-JZ w9<~'ou[4.ko:VƝ1nO*|}YQCLc0HH$bE(Cd4I@&4c%1fHQJ$e$I%4!c " E ɑ$BRQfF@DIHIIK,  a )$i0, bH Ɣ&%RA12Pf4l4J2R 5#&I&I 1$$f@%B I$B1l&2%&iPF$ FaBIdh"ifh&b L($$̒J04 HbfK) &aAdbE4la!&1$fJA3&&fb$1)IaIf&@ɡP2$1 "ș@%,)DdH%E$$2DAbĐ2)i" & 2Dĉ Y"M)MLQB aP2 $ 6DC!I"h3 JhD I(I $dHdKI4D $2D!0sa߫a_n:˺w9 nbwwGQC$$K9;2|^g&axqˇu⯏9XC)Dv!Q! hp1 8%iIRXfRغF[a" X|Iį;"8FL1aʽVIKu+ȝg6yOn.hnj1Hc+ov =ydv 6 vg{ ޓFK tlC:WPQ٦]ٮ! mƛ۞1k>G7Ua械llc 6)"1"$̡(Dؒ͸aH&h (CL%sJ&^6Dș(D)n`f1&TLD$$3tnn$ssD&3 rCvG$hvE  Q0f6I 뤐 @)H !1$hsbyYFJ(Q\& &<2QQ"2SDc# &ɏ961d1!7bHaE `.$tЉE=;.J 5qI2!pȔ'D4D7TcC&$"4)Wuqq\S0B={`,3uBC= `J CJH&BL1L]S e,2Qv⅌‡uӻc$$YH2eM#],cs뫆W. 4owa)\r906!'uѤS A&D .tMFrO{1yۗ'wEa$ #J!$a]{כ woz܌s79FBF\I#3!b"Ksp;r$yx3$WJI /9 L=ۄ]+4{vXB;˃yF\M(nQguЉow& Ǻ+d"o.%w;q㮢`ƌ&d&Lyn@{($ur\vucWQ˲BBH: EIfw]sם E9$;y)"h!7v$I,2\̉yQ+uЅ{Pznf&ysRyNo+ݓrK {7ٻrݱH\$F"Eso.t仔Q2wWwqC )@I)!g'w  %crvsu4KѤu監ΐst+2d;]u\zs.9ˠpE.qsnu\.^vR'\yЁ׮ݦ($ E3r9ёwvw^n{KPN똡Hi!"~Y+"~~\5aB%4>,xæ/xe60oK;#TC'B+b*-;EhIqɇXu6 Ѳu$~j!A'ժ [O4YYa[@6j.P y +gH{~w|.~&h?= `C12qׅ1OsS2UlnC~xsAcq`Zf s8_=nlt]e׿ԠZ>[?qm2 SL{~C*=aֶmƱo5) +uW~޾03W 22x=O3dbD='-Lt}-kS"tiZ/<nNSj+R4g>٭{z˼ p 5Mos 'vZ`gE7$}@ԐosԜWE{Ǿ7g|w&QbV'-Oƀ^%&49 94+lo2%Yx$y.EE V(T\rn.2}yy6A<(wiTtSw<ܬw?7H:Ρ[!+lqtɼcNƧk~rHi˚q#t;|/jΔU|~:kΧr>#. X@(=VFHc4*D$Te6h?6Hc0 cRM5q`IdQyb:pR;.^ԅH8Wh!FbJ<ǃI76 lÓaHD [ `RB-]O-HI&eAD怒tnԐEd,₊N.YrѬU2zi쥫\qřuQ%b\(JåiV emmжdR6*ǁV*`ej:<iWƷ(n S!MS'mۗ-RUT Ӱӕ*f;Lev`i;$%baŇPj,x_Hqd9wݦ%szi^!so=M)-;75\C 妡yyǙG7f2VJą)Q#220uMY^SY)!u`OPaSFX6|壔YF.E$wc8q2weE]qwrEV`O0a>uHq>#6^ɻhP[v B񡌷؟-XS{osN';ܙf1ܦ9bS8syqm+ JjTM6PRS'l!)jV+1MA˻BV-٨SJTY[uw2=Ւb9cv\UXчR qpT%,h8TWk 9)9:D/K7wSy/c"oT|܏[oNoOUW{khpa[x{gtqR"ths],8T 8Q}vtBXpc\puL˜X"Eѥ)cy"J|HJg8"97h-c!ؠEX31UC#bhiN(H{2$d'*NKckVq8C-"k$nSZ 7 f3\مvn\Fۙ0( eFl!XQ)J%͚vjD4hɳfeV)O{!+tPxnw&a.F<3YL\(̅ibB]&&?K5wlۮ&st坘?/osu:wjvw;w&#\:o@@SM)J!"H0"c#I34")1dFPF#d@(2fh 2HL 1d0LB"@hI,M!0IMK DHD%1a ,) $) 1 B1&1$0L$LF%("0"A(b  I@DHQ" "H F̈$LBbYA%#&A0BX! R!$H YDcCL"2$ɌRh! D$,AdS$ ec,A 2 THR(̐ &RAB R14@Y") @HR3 0 Df $ BF Ѥ%!(%"ib$)&" JP!1L2E bD0RdRh b1 ٖR JEFC刑#$h&LAվoO;Y޳&uyod餻n7jުm?2%*?4ۤذG xjMx:RZg $l%Y7j,g7 6cI87Zi'tC"LLg%Dpk !`IEr)-:z S1[W@k)*h}TT; ~ 嚏#s³VG{n`]9][ַªT76}D0/z4&b@N? -!wyn0("`3qՏ?wMC/r hFfnJt 宾TS]X*ꛑoJo\9i'GBYAX mt9G_әX;ǖdƙI xqRln*酨}1?QƧ9"xIC~Oj{Eh2J1[\ 9y !ּ!t{hu⛱2'U}2=RvdUww&-.8IO8#ҷ a8i L3i!ҕiR墿9; x~YR6ѧ|Fs"Hu}S}XD)$ѣxR+=]a|h|*zAّn~Gǃ_zϞ ow>ޡ Y$Ғ f%qk^PW\ ZۆO`g2 vHW1)JXPyǴJԙ)En'$ih&LqʯE{dG .=4R@flFEm4ooyQJ>tn-BV-ivdG\Xk *fQC@P\-ajZ19(R‹AɈISU+T-؜i\FTs3)HZGMˆ(Gcj9ǰ{#.gl7M^P߸C.2&\e,N֊UӨ%VH%3 ۸6mޛhb$ԍ 'ҩlR\JiX12\e1F9d(Da,lpˈ4zˮta\ܑcj3g-13L&M,jU&WM HJN&\, 7w\GgBHGwka.?U'Sia:ꧾny^И\kqd%\dHY3G2[# 3p՚x3=IZ 17ݿtlRUM3CևNC6 xB |})\=ı2֡C,w]XP, 'h 7jnЁAӧ}vIkNEC^AFFqTIZ T aUM 6s =k eFWfrWkpLFP&mAJK|Hأnօk햫}'rJUrHp·L2It.úxdWe-`yZbH% >7 ,5vN;= S5U m LIA N..OZp A h31 `,FeqԵ)A i sWPT,z8̴ۨ,]kVGNo AZ5cTUzR 1:4Zt!a\X\l/:i )JC:򍈬@F Ńb 7;"$Td投 ͑T, bUi|݊LacC}K yaѲet$x=M5ٱy3(4x1IA+TAj@H\(ٟ8AưCh'-؍n%;"}<%' ()Krbr)#v{Vǥp4H gwhIڅoPs >цW)A:"" j48+G|E!z?wE|gx]]3kRXhĸuCLJ3nD* >r,Ujvx>dtʖ[)g r p.\6SDdd]Khac,>ʲCxdr*0Y-mݢɖ>Ο߯L]h/4]8O3[ΕK+cGEwֻ̌xέ6 fiN9s}sr3o<׆|pYWeuck=@" E{Xt.# 9MyyUTMWm|3:nRהwܩE;1M32Z2ahW t[rmۊՈ0 ,pSO``XFD5Q <혘m*= cS%&RyinPKm,ho7{ k06!~v]?G;o|];ݜcLn鍪C_#gqTYGJxGc"u|k;si  = E3}uӺ#5(Wh+/lAn7F ?aӲϤ;[@E8J -Zߟ:K<7Z hL[Έ9<-q}ozeBZ^%:b_͖~{uI=ݳ?uo 9Z«@s~W˾hϚcyME5a`C aʤ-Jmkهӳ"@⨪럽~\? ݫx¼T^vPVZ4 hlcxEG&S$hTDځW% Vu*g} 5b5~t_>H~}EK7+}yoϼzZ'à4ރR3.Dcu@(BhXö́(!:>Yh10UQ]*Px@XYO(ʉm#U_Vq~PNvГֿmY~UP8J/g.؏cmu S Or'Ӕ_R& 6]DҾFe_k*s1F|BT?AMu*<-/"^~:WUoCtV铗nd= Y/(A sm@ K쨔S1_L _m^r|m{$P ~=OߎHW~R5"ғ@;_Jf_.dO9fVL"*#`ΚCaN0[TGe ǩ~~`*@_o?<>FyD (_rHw`^̿v?5]Ih=SΕ7z޶T5g|'#~{r<'B5ې a~L۲ ZltD?W!qqqv asfyQ%j?h",oJC9N$WE_Cp< !Mw _QaIEX:6/ٙ炧{vkU/I=GSuӶ{&NpkA M}\]擮KAoW9㻀mq Jͯ9MKH.3F7o?CN6`)ohUIk]tl53!<^R@'t~g Vdܶw htY_IO\H Z/T@o._Us;̶Cą$#şƫ ztV`?ɏI+#ZdlR^&mi3 'tEB~+H [Τl*@#KY !B"7A@/9ӫ!NL( d fu2 $߆kFЭ ICz H6&ѭmbcjjZJm}|ĆM=F1;ig$$27е~/܌ֆD+gR9Ef82 Ǖl: ןyEz{*]0K@-7C'xU"HLMgm@Q0WvO)"^.K?cb͒eV6;v$[cv]'1dJ3|?#Xٌ333d&s $#JaZ2dё1S1$ -M NAr7 2 0HБj'CDt(Zf6P H$bҐH-tЅ))fUYnA2$t vx 6{߈BKyy;{axu]ˉB.\HnwxsI޻y3!ww7;wcw){GQK\dKmL"Q$qHB7e܄D˺wBwWק{^\.{N;{wȗowyeI3RחwTT#E5UlH|9%)pܫh̆ykܷpsguƓŘ"7Q`i`q*gimnΦv#2rwu;:Dcۻú듷swu:CtwD;9gwɫzkFգTX>cj |T%"`51lE50ĆBA$ ƒADZU\WȸpڼL8ĵAB[LE& A9 Iҏ@ܬâ/m\!ژI1bj7%cd6Ksiea /ٯU0Scwt94aj=yx݋mKs3Man@"HIg??7i?oUI_jG? 4{_zߵwZCJx;P-PndW#%śAJdq:+ڜ3{: ;H&g@@y$9`;Pq0tp6yv[T"EBF3[(EVʨ{)Kx+o14[U4Q\/FN;}vB%7 @R-ɫ7Fѵ1fai*lZ@ D>z$ 1n֖#@i(T7ޏ( p<7ki'k,kX3u|GRFp>p3 0K* Aq +L |ҰнxlkY܋ vMn9tơޢ f)hS eV,N(nXae,g[ KJ G$W("z<E2aTf.gq'7hqDy@oՒx+ClED{l 0lPm(fXl1Z,!وqB(rOcZ.$xF'D+sD1ɺ^E %]‡2` [BB]$RdlIeĭ'@f  i,.@PĄW+f:QFpɳ",5m' ˒VikƂ9 k+NH8`8S\DY}W}*q#E#Af-άN'8!Ň ă b\!٘&Dݺg"n){Wn£Q!\D2cL'5HNRގ\|=s 1ֳeHѹwUV@:jC[1DV4()êG!3sbqp~l b$,tZN"`ơw+F[FnxY'7iTAYપTц~.FpxAkDjzQ'N S ( AJ!DmR؉%d VI WJ6>EԢZm}޺BZG "Y)U A )N6 P{-XB4*b؉ڢ6oIKڑrS?VٺScUh.iifFO|S g= d /ÿK֎2Bkk=Nn"sTu,bvqb)NG(A-j"'rW1`HeIz#: gL(m7܃*QfԜ s~1$7M-n&7<ﶔ2QB=XyUhBb9N>+ĔT\pDhɾW}Е8#XƤe(#Cqf$P9_mZyL#ul$cwдCp"t2Bq9'=7U+gG)Fy%E q !|GxE{|,p8le_FqFVq7E6aâXSoF[BQm rs$9XJ cU}dt` yIx\-f< Ys%` WcB\:^4T""^yc&m'Sg)I'hbv^Jo4aiYQP@Lhn ܤXvB $HmX[c:C{ތ-3}->2F6|n@؍ic =LQoAK fG%H#`*]Fv'7z 5RTj҂Hw gWbϸ\ϖ`8Lov@ Cxlbh(5H28e)66ѼJ]ŷ1fLlE&ذ䖍;PELiJbQK 'rA-E'f[6y. w|o}, ۻllKh ~vLTzf(YLw-]Kg3ja 4-8O\BN+lxT[E{LL9.)Y.kjWmcձ 7W+4Ú,!7ESSJILQ@ksPGK{]`lD K E;B|?VŔ{UT@#5'Ӈse#.xF_B1[V+an6W{VTͅz_H\OH59NSs:ÁM;uI1sd^ǔ umjZ`Q"ケRc9θct4j|O{sErr={|M0$CaPQh_ X,[$ai`މ-keLqVJ{-b9g(mNCt>x8w]A3. !mm#e䢛v=XUq'eQsVi;W S2a+#&DP53.;bxb?ffk2AkR'z DN:7&b6 @}}ꧡ57y?*O?|* 'Vw TRŨyMt_ik=rƓ "l93E]#M|k^ʎs;ak j~hUO^{J -I(Si FA>tcs,=!/5rooVФQY~i&Զ]q,!eo$p#@A.lޑ}䜼4J^ 8=hʽ\/}L{I]÷vnjZʇV5~t%BG{,#}voXjz`V3_;kη|ڵ?5!>yϿ 䓶Aohc3hCq(Ri쭱2cEV*D!n.Vh Ք˾{:v?=MȽz{̩Ӛ~=mI <9e%{UCC}օ @z7Q} 8`Gւ|? ?fܻDu4CF([gHV zB]](vlߩQrTh9lmlpI"ߙ&eZ Y{;fw}tl| :^7{LyVaC1;^ld˛BBIwݾ>׺ѽ2uՍv:4zcnZ[㹑} CT}vuVi N}dmMe2Q.k*U~y"]!Z7UA_|V?۝Ii/^O>h%R#;\KYί4{Ώ,lE)5@vr_G!?;sI^ A7ЫqSQ1Nhl_0*1j< , *#Uo'. 6R'NT1%ͲI62nbEkR:R!PV$HeSXM9@IB%%%C\ (s:  ,Ir@ĭk^%ZK  < aCI*2@sm(xFa(k;S]- YJ9-gSy1 V~;T9rf R*D22;,-+ZK&\q9X.Pj@ l~!3~#MZ۷ !#F1lA nх> E_>oZFZ-jVmQFkZ6mh-hګ-UQl[%mmVl5lFkbkDjEhjj+EUA4TV-TZѬm5kbQXX5QmZQf[5E%DQb5DQX6hQV,Z(ڍlb+b5hbjj,XRX4mUEFcY*(2hX lmQF54mb-EBd1bĕ6*1PV6 TTTRd1IDlQQe-PMTkER2!!\HL@-I$KW̹a$\[[|ZߤM~hv˧;wuc]˻"'uttuˣ;{ˣt뻻]389$ҵcdm9\E^ xA25#'i&cRHA[*Q<ʼni90̖$?5j1VU~ټ>b&Τ 2XDodqsUzz~\x}YkD}aE()w%ėBDL ZY[lg$f)3/^ @B/UEiOO{::67[ρ:6[=Ӣ=H*{:$^5C:{ק<^ib4B9{E<@!^Ԅ"A EzB0Ӏ0ԓ"#DŖj ! j%fddZĢ&$DPL (I/0"@E%2\2hKDȀÇs:8 +|$y3 h|m:rC/!j&mƑA95^lVpѭ`oLz տEuP]b@]٣"N{M? m恬BVM$7&W ubz‹'q^PnBF=C{@0KX2KBeOa;DhZq' ZKn 'a*kCŵxaH'NyNyw-eIgq^Aw\8Rb۔mansw~Cppo<> 5y^gu4B^ŀz>a{oW="_b3^%=VWO3Q٢˛& H4Zh\ܔv«kɘaS*]Z?>?9Ku_Q]P~3/f*3C]q8`+6%pAXKү-%uov#ȌŮ2oPc(۷i ?gY 80CKԪ.aE;@g›RԈ k9G5ڨOjDIԮA) >xa2g}pE3֮yƧ6w'';ޘ7%1Ӄ>,bڊsDzO Ŧ1sd _C8lL#&aY`LJLa<$-'sx1gUe0)pfq;5vz'>\UwY75rtd[#̱|OE) >RX((q?yoYE޿ѣ \A_ܱV$IWC+bw;i|Nw}\sc"q~D˸LgRUf>0UǙJ$bJc0၈:ه/ |_gUw`3nBP5;og[uoe VeL )KP5c۬T޿6i+ l@4pH5o{UVϸ'EP~nV^'p"x6P9+LzcF"ֲ߰O~ v=.|M΅ LC/`b):tuY!5AX,שbcLܶ1lԈ.-WeyܿnK_C ×I%ݷ"ؼԶ A^KUr{m6s ޴N ӌlޔ 2GZ)ghB0Ll> Kc ԁFy{W&, t2XrZ5p95b#-o=5lDGx8pq;S*<2Y~pF ˓bSYi#*4܅~]= "ckVh`͹A&D"x$GJ9=~69\. =p000FL!)gc2X%si_$eW%)c8g;T]2=|l6ˋնF-O,L* v/8]Ђ0a&+͊=ԫ>@Tńx_ zRM%綘hHYszjV #=2L35I!u`;}C 1;k4r)OVu8LMè^4ฅ&\k)H8NR|_*e1T֖Q.+sW(5H˘t֟ߜ%`$}ɫ(x#FkJiPmrn~f!}3B3* |,4_#*A(IhHn@J, 0P&v{BD9ђg%%^ݶı5UW4lZ0ZDw {Zg ֻ7c꺅ah&8$Q%BÇz@yA[f'=dίQt*9[ݾiruFUD A $ʄ.) eFm2 Je ]ƒ5[Vdh)bRr!E7 +ΠE}%t:s TesF\4r+_BLkD{k\rU)5ԚΛG?sP!cg8Hf۪3,HBIH맵bXFp`׆?cyJ %peSPGGF(0@zsiՌwS&b[4Kq_M;+x=ϖʾ, Q&jd]H8%17Bh.t}_Af`/؏5+d*}?FR C !%t|*(bVr{ju=1xRD^}dljS`4h,XVELHRa<ݓEgI=NIZ=eY+iEP".˗;ҢvQ}JWP'ű%y3Fw6Rc(5W_ l")AZj6[#jz嘋w UC f7`J>,m<^):Rx 2<)mMOƩxq1rQX֓fJ`m!H!Wɿj),vYLBvB HE,eƔAtZE{Nswv}$ABVVk5d):+a}eTx!PFآfЖ* 'a,\oȶ__s0аZ۠_VessTugaQN ݢ:P Lc. %Ħp~;2M``u(`H>kJ-eLHMU91J-kq ~OfYqdklpQ2\tAKIq%zRvF gSĻ^01g*m­i9A}Pz$t}Qq@Ľ|>eI PLatXGwtm9>ޗ|RsWՊC>)6ZdjGב%ZWit[̓EemU<$;_7[ˣ!gL3@=\le}$3Yyuhl[=Qʜ9J [CU."#,t⩏!D3FP _142|ZIymPȭov]7}Nsj)a:/[<1lHRJz@HYqN3Oɴ51y[Pf^f }sϴ?b4M@>Ɲ{T+cRݗb/ޕ6U{G-0*Q)_Rɂ[[tuk^j}!8* "E76#:^+Wgpc>6妴Pɾ`"LVvLk5n ӲL]?.; ԬIpd/s.P.ǠqU\$10CQa|;[:f%>Pf) 7#ةLh[|\c>O_%m$O" ՝åR8IXu0{9l$;ZNk2ħf\كK*yͬ+X5'g\$h갦fj4~2,PtK<ȔZj[xJRKZ ͋5۟(ah(B@te..QE;mK2|iNZ7Id $lK_Og¯87;?ȀL\uiZp߳^a_=P'uuŦt+Y`u9i8@@>3]ZM _Nw qfLYu0oѻNeljSlQѝ2_WΖ:Ĝ!o,GdkjH4vF~]zڀXբ0_Q^v9YwȳsK11|^ЛK_%KCVkg~#W.=f" 9˷ag /jdǡqf*>ׁ̼Ŗ鈈Gz Vt7޺ѲV)"4>@DXRXRP.Zs.Sc.`ZjbҘ9ɶ;N~5s{I:WJnZmyc"hFK:qpiCVCWQlܙi-͔L,12^̼f|~6;/Q)b.@ =?s?24@Jr k=zx!W-jMc$&>J듟.}XGU2b/T[,HВ=V+Jd*`UϚ+K gvky^IY9 4o86p`W#nk&L{W-v8p% 7 .4.!EqHOF|aCW%%L;-!Աeq|7(xwdMvΠlj-:Ս=Cጛc1Of_z ~w+SǵI6ZKO5(0緇*:{Rq]ĉ4-`2W}ZH֫UZVÇ'DyUzn6/ "=`n9E1#bkN/x!"p`$B 9^Ib .3jWoȒ- nŻ0hB XB8}j0Cp^kd ݮ㖜D ?TDMzJ0T/O7|}sڄb-waH&?@a&t6{_-[$i`Uao%v՞{f̩su>w滉H@Q_el]2+GK l^)dNT3oEj{ yU }LGiN(:LX'slĺOZA.9n߮CtNN'UryrG?B1HLjew0l .̢Y6a| {1ucB餚~* QFO7ZƄZD@x]\8ZʠĠ!Us񄍬̦Ԍ|m*8vTF`aǙ"Th1F?KlbЛiJYM?|^[b Qrtzv21nJ=2o. Q{: H[uRqe" )wxP^QtDOUEc8^GWiGntc-tY8pf")󨴺ОXkԗxI>eW^]5ݼ((/ˆ$H636QښbzŮ>ҩ &T86_Q0%ZE# UEoc'HE.r3xzbA[8Uc6ǵvjB yR5Syl4p 4 x^-bnL~F3ceky>EYObvr>h4`ėĊ"K4<)h4ъ~߬jװȗz$ȶ8i+W+qGo8ߟb'PFӠy @z3Egm nY^%j{ӳk}ۍ/̎#MD0QAg7/5(5qIŖ~B0p*ג,2rAg: }UϐMO4#~h>f'oo¥ eTPE hA:E|R%OP71?9KoٺyplhaUFmVat1rG$#JSsr.RA!{*"*4ZqX [(d} ݻh@p{'b JH~ ^y?cӥnu͜0xe|j nl!L1ƏÝM`JTVlT9:w_nBN6 'd20ҕҌ>p9zG.ec*QD\Kxw-_CIuUIiD " .cL ퟶQBݛi(xEOJ zmKd.$2g]b{pcHg+YGkJ맷\P+*0bKv@phn ߧczɇF="WQ%3b$^cu2UԸ!#,_㶍%ֶӄjd)wX"ZQ}⦡ؼS Auajoz2r.L-eX4]a kFSK}Cf߉l{rucNid龏yX0ʝ2tMӒh8 .goZ5jDGLAOWjlG=zC|KDLpH80$. l 5vnM_i8K}8Jxd8-G$!x%—+Y )v@%[q1ƞي46R^EEAb 3tI|uCvBjj ԏMWԊ]n| 4;2^1 rؑzH[; *o.Fh.*kb Uwҩ֝!iS蹎?p.a=_m;!Gĸ58}HŊ74*Eg9G)tVeΜT?8P ;?v ":;txd$ g ;], &%i͔.Հkh FֺlQ $*w=8'@k#{K ,CW*SUr$ u|Dt|G -Q}@=ֈ;SΙ\f*+\I؎t 8ESۯ\i3t. ҽbocCJwgV=bv)OjNcg{=TZtt;}*N9u[xMY.V4B lt@!(\(;0sϚ Гӿ@TtT[Y%L w⯙;r ,+72i# 2[CUi8L l943|$o+; ]2)}J\ \c @r/)\#pWS(a/DxHH]9{opt9S&S̲BgA OѤ2t|™Y(EiB}Ѕ|ԞKI>!!f|sd$C!x)=}'ҳB(:Vc(2R"r@D >xWCWelVFM 94Bz"6D!<vW5mEg/qe RT&+d܂rEi+n|Tl׼pq2i 9VG2aev/SQL?R pQe+:}1 ܟC@'P0~&7ţP\# !ª:&1 n\{biLE?bw9-_ݹO[GS*bF8zE߼Ҷy<ȡk|S8%獠Tq:J9U4URW4N4?)q1ń=YJ.*:;C6-vDEUR)㭀IA"6bzA/]t{\FU u:7: p@4>#ݷ KKa-E a7PšLaÚu:_EI1 ɳW3NR|%STILڗ=P_!w MRPGZĒfz\FoXjQ@jE d_ ;.F:Vnj95spJD)B5HQpT`Dp{ݠ&3m;/d^;2gzZ=f )~vy'IYQqW5Rr8^jS/ :-Au_aFW[HEPݾ_)d9a,AOwE\ v@҇$~+|y& MxrytB+6ibT OA$@-]؆;..+īӣBZH^}H۹A0s|-^@퐣惓rAٰ3noF M 2I48A8RjiGeQCvኙA3A3 [V^xtB'_Q@QS!D3v'[& '#, b(VKS(I]C4+>Q8IDTS} H=Gz6#1ga&dahuweq~f=U]Tߖ^aЩκp<`cCq-IjIy4>s{9"u;欯= Y-z~c AFXqK0S^],&..k=|QG@C*u$wH=vĀ#7miXr=JV),;1}%p^wo#]Cωdvf 1m]~N:םph[aYzόhQ6y~ٝ^ x1wyOL}JzbNQONyrS<&z(Idv3NWiuc8Ohyf?>a҈2j~ ka?WY> ~߆ΣsIxS>?Y h*Ȕ t#F.Od.XH3o>crt%;v+swfFbx(EƔ D/mUD@֡,^i-Gd(O`rczfrFzo}hphkGxk))@\(xq ǃZܵ[^ӹSǞ" βOݡnH&. |dqWRo ~@ծ]\L*ߤXH0 g3ez7/ a]>!c8zRH#_q~d䏬b9F |?hTD3<1uHW02KH 8pӻ !,(00gS;ƨ&0mu,aqvZa]Z~A`y23;9?(w2dN<%F!o8INYdCBbS?(Jvu ?ݷ_78q,+7u[[u6UӞ %}3#&譝$^#P^.}JuFٵPudNjL}oQE8xOnvSl͝ڮ0#KQzHYN4; ֈ%eA_(z?<8>׹\ޝv==_:H ü~EޣXR]y]\#{W"8P{ @'ËxI$bX(!5ʰ=6݃u~DHn'OaYq+fm?-ߘ}ST˥B|~'dWjߩd1г]Bs\[$O,l'Tھd D HW8:(G?}j*8K0w叡=2q״, zL^ PKu5 2nUhn dv_>7}auL#X:mClDP*,Z4n'dv35U7vioe.Y# ]S-ֳ2ri.zJ(z 2#$b _-S5p]e6avicGbEdvOL_uV7?:xPM h]c)]&KaE{Nq 0h TD wZB㻵2&Ou乀$F%9xG\,c7fHu36-%9cbpV"& YUTn1bd0tPꦄׅ4Eq}R&)D"jEKj+[;;|ePCG+v] dϥ&*] 0v7*&$C{̛udI2k>׉Vi.X[m ^S5|>dRCLpZsP XwB\[^J+Umʯr)i@K{PWc*3G s؍7_LHR8 naeCk( )wN%%v6BdzUW` oX{zٴLTl4c86U+VsS(2aH׳z:۵3|/uxB~qVizcu{n)w\/!{ނEhXP']X*>L8LoRV3`Y.qهwֽ'38/nʜNI9 /ri\OݒZlq׌)sk.梶7V2uhmW5GLc"6ct蓈yo*HEϕu@Rl'_y?IJa9z*Ů4ոȎvN-h4Y{Q-}tbJ׃zpHKE0OF`{~__ؿ~kJHxD !gx?+zI4> Hx'Tpĵ9vTnYwkآo7dJQ|M; !z{+5dT6edH~P-w!XHʆb;~\}2`œY潈9d.ܴ9zN޳a;OyT$ QR,qb|3ʂi564X"Gfchi-yel0hi2iOv#(.({\UQGl:a*>%`gaHc"׈R&ѓd(n@W2`+Ԯ}ES̄䎋%_ItÍ~QO˷S ,qTwNt598pLSō[a:D wLebYk du3cTQ(2.aķ]7.y.׊/ o;L1TtokK]Yysy*{P :@茠܌ qA_[i[#h? F\(G 4'&pti 9דG=!~Z O%Ada(,΍/Ӫg)HFW։Q9yc2پӐx_h"NS{ H#u}J#rYxnڲI1jN.ɰB-?QL\>/ 7q,\_%oƵO7uI{n;n [v X]p@1RE~q+k7u@'hhn:Z^W~&>VCD25D ~ pF i"ո`)x} sNƯ5vF2˱eWva/ىQoGe[ V&9pZ=1x'"ϮY[zjKr a^=9 p.>עbbyel6g<XORی.!|BaU#6LhǕj]Ÿ2ZWP v=C'&gDi3O0_:RMF&`USn{55Mu-x*Y04̺[i=fk]XeWskiG`Ob|Ab0ډ; >XER^ | o|{Zeӫ9PkiCA(\gz>rh|a0Ad-qهyf_B< RSnt4ojxf"RR+o- d]S\0^r_^:w"$ Spǯ+*+j4-SWYzu,~ 5RӍ6SuJ.qpb.ӳ,bf0Z}h#^C9pkxΔ,XAKC/jh5}vK@/&FKksv5#%i(Q?"qq14 P>\X|;* #1Y%ѝ_ĚJHOKRܩ ¿$HcQujwW[h? K򠮟ҲgÍlKcs9Oh}R;ɟ$ؘtzuTXty 0,ȋ-/5$`cwc9b{뀵bl?zouk}lW Gr5L3t60<n@8aVd00İo%TԲ>\IG]y0tLY􍫂o(z*؂7<7Dlsi40ޣ{`E]+n%'{ീ]J94z.rSln9:jJ4!rźJ_0D]c1n%Lr·-r OtP_j:xfMtɆYYhT'[1_1Mu'5 W:W \+ەjWxEׂ>W#lo{Ͽ{Z<;S##/~Oc QC⑓& 40hU{pO+?Wn<ƨ:îӅoٗyy!M2HJN a0sӻ^^m鉟l3ϓ)©#BxHSEx$e*C|㤀f/HVTسW}!{\&߻[hg9qVF&()6Q<gR!^*N^ v@vCJ  Q46ڜ9gO7MqUC=umП4=bn^ `]ʧo|r'Ӯ|&\S"˱?D,A8$/cW@hBe'Mo7!L+$S& Anq|LW:Trq#\*g4۴I&JV &.iJKp7԰)'厛Ly.k0 ܀Z|Tas4+@ ӛs>>% 0fm=a};+; }6V-5tp # Bd_& ,\ #{:҉DD@Qz}[.KeD$<',3h;a:D543pa4Շ)Oźٸ7 }xZcxWtfNv^ ,^Ljrd03`Ccw1אƏ4">Z$0VG,}0Fx>TMLooA;CZ҅mdbĩԜ+U6i`/9 Wsgu{ݙl sN oj뛁);qv KEGR,qǚG:f(<-׶ ,^lדVbhy7EO=:'&@F]ugZgĤpegV*}/1?'OZve|+Uf!,l cWi Cj;cPKC; ;ߢ n[fY YU;WF"@>YIdɡFϻM 3czq>"W`+`xБo}<8S\ʪ4Y\n)24}\m^Z\/*ƚ<tf6mVיˍ%Wk)A%$RxHa!rzW>?vFjMB.U n:w|汒`JXf0]WDmXi`G.8ȶxR+rCtuj"/+hIz/{$]AJo"@ m ~H愴C" 09z/*`9hIF@Yu\;=nhO22K:D3 6qjpJ`T!_NJSPF pM92ޔeuG]aE rwSetb^ 36KgPEHjk-m-䖪"& APtgh3HBO WxB-@"˱Cj@W[l}Y'Rw²V h['D[Lfw@]h>`qbՊpg~< \ An߃^.aFp, Аn5Ȧf,WKO2/).jܲ GʢI OGTQkpmu:NCGQ֫\e eo=qѥH̀F/CVfV}*HLs2y0 )`aL ^uEϛtH %? ؎~R:s~m[ע{296ҽ=`PNYavTh"lȵmmI3\t˨-Wg_ϕB @mX^4c9Z65"Cq@>L_I1 %+^؁$iz>n?[ 8vF-,2v;rvTFKnjGЄ}tO8UWbq θ:psU~s77[U+;oE;97@17!CvWFm6.Pι!Ho$'*Wo+o+T,k޳2tȽ$M&5:JVoV˓hGw )ݣ7ĜW752;KquFwÃ+ޥ40vHDu%^bf+`ey{[)j)A!yU~mFzɻ1xymtCU]@8i)yJ Y = ԍo_*6rDSa/_C8` p;c&\πVfžjc0B ^w!1Y \ gEEnYNZh qT.:xS6h| @.V:[R/ѓPGiCX&o}j7ysB>K*?]CIv0 I#JeГ+?N١xYf`NP˱濣PC2*kaZ59i(V{]d^F6j_y]Z( T#)Laˆ 7ct+m'Wx\3mťNgRϖ\Jc+xÁ:"$40qWK[i-1v4. et$W{ڼ;e/)f#M"o~~ T*_8na}j*:Ҫf==>2 ͛=]،L϶zJrEw9JotBy ]5u{2 | MSFKE?8W b-1jR& .ARr(}}~yTAp$"'G_|F%G"0uy]ٰڑ@[rݺ]WC^/ b`Qt~ )TT8B:cnZ8 rקB<_6h,^.g&)]'&Xug5۵D٥<޽|J@bޔ<,H: ]3,ΚØ JGDj1se=hgl76jX> ./0́ARe>a$KI+~n#uYVя:t0 ə6>OqYfX)N utWUFb2&_. %݀'n!w>?^˽@e(y7}cH><*_JK\*9$acg)5 9QdGF>=~^3/0FN ))LiCg5S fFm)_qdeU9nʋ+p`UDz7_pen^Q OW(!#A=mWBag܄2~ZN$],#UCGs0'Io9L)\լ b^YAFc` ˆ&Ѯ5S`׌/Ү|؍ rv&dXB37ioYaA:/ yh}%]ew G۫䭪~Tx3xfP;@n IU*\TLęRO%au>gb@,PSiӽC*ԃQ1ZM*:It4V-3p~3o)BʵN yЩC<.eht IӋA 0p٩&d8A6²OH{Ԍ ZM"AQܟ~PӲ+J["vP~IBUB. $^?S_ccRמ1 YQǺ^yDܔ >(P/#w UgƱp݀c>bx#L$݉+#B6_i78uO~4Swl JKǫ|Cx'bfk)jTNd!.iؒdqRWl]\?:/勘s9<*q `@xTB7ߕ'U?>j,a?)5^4`@VbQ3 Y.A|o*2\3ӖdN TexS2<[D&[+9^C27ڧsAF`m9RNUqHFVQZQvappp2e{moЩ n {%KT:6= + q:xнgaPxhHwexG.R5(hi@ARfA:޻M-cSJsm͋b R@4A.-iKbM3S"⣓=fREhމ'̦3iBոekKN/_QDR,^f̝9|,M]`!>g: t)ah:4C/X3hhџUǔ eέ72'_p-—UZ݉?DcL͋aVe1˘2cU;Nw1@a4&h8H$""Ya^C(eduj`ArD $6D#W3MFT߯N 45|Eid6#Էp#qc3v8QSKLBfGC̢rv56:|HC^`?jW+x& J2<4J.JKͬ@$0ɱWQNz!)˵?DCB/6Ef[r¼!„ÃDldX=ɜ*ΖEEZ<;>j8!R~Yv2wτE3 iL bT3)*̝͸&7@d1PcJ2@w&i=XZXgL=|KffțD2 >2>km<9TJ% 261#Q\p\ß_*y k)ZڑX؄ⵌ'ciEo>p ғtԬ+ԠXw{<S8V($7`ܣD-$?S2'G ^=ꍼb3*ʣɾ)Z*FbAy#Md^JQ;|'{ X{Ѐ-tGx{QLh\o -V?G[a̓($ ^(KN<] ImB@"쫀٦6XY 2CP;`1}f# @s A0qdQR=zDq eЫ[2_#& gĒ\'ZXb5#>ŚZGBvjd:5DՆ5-a'!j.gj!`.454Dd+?}K| !Ȉ IӮViO9 hMFJLjܹGT5QE'NNw sI#`:5p3j^u |Fݮؒ2.ӹXo{1Rn˾L3@\\mo]8.#ilϗl8h *(`haz b\b**D]-)~(g/`O`"C%+w1dV,^4:;u'zKe.as|1!<|q e\;b } h $SeW]DD #\ډ~"%J߼K%,A#m.&JT\N!''S3^ Qɪ|vS W_j*;YufxJ:A@!>y &%0'_ܴ/#Lx?X/mfO~ ,ZS{*H_krflߵrTo7YGP1 eL+rd] p9)UM*kצW "ǯG~eڧf-PҊ'RžkAR3\9n~=wtX?khPDc1,#ğ_W*܁>cJ-;ǶZf̬.ZN^] J?aU 2Vz71MB,x21t]Q8hh ϱR+F!oĻOYfH4$mGgPW&J9c#PHs؀']B7`B굟<)ul۵+go qաDUA܈uDO۟r,}c^:Tso/kzgF4i~"lVJljqzdVXXԩ"-<1`JF.ם!dyE%>ܖ,@3癒z,u˖_@ԑ}P$l􀞴,]Gߞpy.q``h/ pfAKvhPŻ!JĄG^|ހ# ty ¼taeiD0() h j.IOh8ÌK/͔q0zޢ=q[t<3A:2Qv _j+oe X}URtXţ"?MaO}1{Һ'atƪ伉p廞{ 3H٘o$uآ¢b$f$cɖ=h65m Mas߿Fj mvWKm*Pgh:^x:Q^ f+ƤLCr"VҼa,Ja%: : rЩfa͊B4ՄkuD̆ MF b>\ZV6S4=0}}r8WRt^)/v0uP*56v&u ; g^v8$> u·S7.%-dي4rt 0 ~ JA{.w$7Z9!63 J#ؾ:nEF$R )46 S^j!w_k͖Z(C2ݳ35,tP@rl3^"Te-qh흱+ (ZfoewO`#kH_9N']tee\lz ɬ0zpԅ Iq1 3Ld 25C8,LR RrRނ 0NcL7xi0aѪτWjǀş\Q}mgJoV=WK`R̸p^|0lr!"˃]wk7o)o~!˸WSOv:Eus*6iN,vXL AT7QW@>[ώ=ڲ+D?Ғ*(J8b6٠gH%lP':t#tnoڊ|L"^*._AHmV ,r9PXR+wi˘P&D2 Ȼw8Sc3Q GY[[*s4ulGf3q3#|g&ZutP eszE!۰s[@ *@`%u]{WjK9 KN=$uHeO88&S10WzHMG䏉tj\ ua"S+w|zraHM2@Z+g D͏ I|niS8)`Ej"Km8q~Ӥ7g"CC!N\g*Bzp/^a  a ]G|1;]}Ot>>ܩw&`j")"H6P.꫘n Vil` T8hf3LjQ;osdɦD@w&8~x;l΁q﷢(4 BkV؈b s x2ƿH5t K᧤$fIjttݬZ&{xT̀wk.B!@+AM0U|m-~BlO[6>hG/oʉ:]?6D5A8 "d8iܚff"費UńR|i*D BȰ۹|UgPr-Ԁqtjt0$B~[矴i*J&ziKtM3>!Q5l]wu]dIAgm0 ;+NEa b}4hF ذ= _s">P*yGC͆gt$4̱S[ 8Xe)|Kka$hw4R80wx?K_)pPXVS#~JD=A r|($*e[Н"V*#T'GYe u^Bv"XX%'ժT2jMYRA44n*Ԭ>3EvۯT߇z%) 5bP;WVBmx_Al&X/UJTLB^ix}a d!E st[[*,ӢYeP+ރd\zݞ&#o5O@il*{k(׻kĀѱrh I{֔م?Q]Ot?+A !fAMfe`ZR 1=zPZe >Zi+..(lBFڹ #qMA#T5٦,6.Y}dWWy18r{~ŝۧa97GȬR!WǯmYo6QqnOk11Mv|I?DU˳[a!V%Mojm DZ=GG05Xcy( }2Q]YļvH|Dq"/ߠlc2F) &Q ?h);  94ΈzI)j3A⸮C )F@&5/"0#::P>WRLXxj]֊i'-rZز6׍탓IRB49w5Y۬x)/[\@0ϠxГ|ckײ,2_[b\4t DGzcte^~ Bu]:]}FjH4R1t<;I1{)DPY\zor(&d&qkn{S,31 .lCf#"r_ɾec` >~rjB; ѺgWDֽA=#m31+Ե˲?D,I#վ >0` 䝈&8s=eINq9s_B+ACG`j?Dddzdx,M_DaV*W"U$^l-xd1d/=v%q*sWݾe6*Zex-jvFO{dȌbozAuOnM/cR"^2 {+oEs)Ojٍ|)Uw׎M xHkE5RL-$rD`Ώ7?p MҒ$>pWih rXog}e2(^ <+ ׫UR#a[*8e <|VA=*6aW0+`:wmʪ ̘|%=At-J/d& }M#tr%U^V ,I<ǎ f^HK{G{ޟ͏porl] |[oMliZ4V^;( yh 擅.!R2|n;k tфA0 G7Aztb5>" ĖjҨG4?VY`fS;pcU`D* w)pt$60^a6zI|C_-IVIho;Qpw{ߑɳ,j3(s>$_+u+m (*(9nR#W4WCFmmgĨA^!F ~b݈V09,ÖͧhA CXh.oֺfAN,vN(D`aU*e-"M(m_8KrLP%m=앭;}F񼙳\(l IЩ2nS{RM/)w$OvmQcg '{ߐi2jzVo XZGuag" _zQVhlUE97U,HC0̻Y˾-=IB1L :8]L=g031/ 3;1g<(NHHImd⢆8=Ddׯ=UEE`Ԙe lKxJL< e(\.6aQ[^^y  R~}m|bx*6VAZCmLScĿ'q^n>1`LZdLwi\z71EdyzV~x&&NBӝ-[CZo]}7 8͌Gܗ>Ϲ^:C|nR/Q_/3n _]AO|HNYIo1n H )Ȟ"Y*w͘H^EoI}&3qR :!3r;ׁ?$+y>c3G=+ Ϲ:r pvLd*yz!Ȏ1 4$tAu,3|JQ| Ӝ0^td7Iϗ hDE_jhn7Jk(jl=(ɚ04;%` oKu%xqx_L4Oˏ[Wr3ȘYdY[U $M|v+ vae@0=C8'UC}h;%^3&m@|P77r]PʈOBzmb F.?iȑ?hgSs"GяKM_[=.VG~˓!t~ܠL.2+HԼv&gqTf*JՊ@,F6bRVh&`4pEj krt)I|މYȇIH&HPjG)_Js&ݬkT7#1H.|5 lTk{Ѱ8Cl -C L}6j(I }MydEGVRLӤBF+xq|v@ S9+0Ri+8Djk4nB-%. ֨FK\Na*TPڈاj( AĬ_q*!A R(&U6ٿqk2g,u]t.3$SAtOE2\YTvv[+-]WT GZ]/|r`))*=ؓ6lMh $c6sR):@r;#RO8sqsDXGv_=5{Šr\A] ?P8rKtz Cuhg9F8$,bSZ_cPDJ¸^ȁ!y]q퐸qYuk)9>}5[YbIܳj %'>v{fWڔ+H^{3(oϩ+5KoByMIS[""MFGZ)gŚmKhm)쓊!: X_-Zc*~qsiNszvkAq/֫=,rMXTtoTCJɚIGnӫUwY( aG@*;}࿁p79fLu[pk}x֘!il;!ӈ TA~!{h^Q85RGV Zu0Vm' ֐ bf.9:L"^;#0܇E?5 +4 1|-f?,q׎xā)#ԑhe΄'s ƱЗ{jtEA H|(p)|(2 tS:lHaZPcH#8S{$5"4ͭuLzd̟*pAYpʷvJr0\^X j͒T wzTB &PܲV `POu7c|9Eڥ&0o =9m?1)`"gAD~cXrTxAQZzmz=[W'h7(<KNzBTt gQ" /wX^WvY|/=*Z |7G>LóuNQ [aa:\IH)%3cs!2_@J/) #.r,Eogu=|Qmn/F꠹V\Cèb1JZK1;zӼvӜBS*o,dt]úv+Jph=pkI"lBBm4 XڦlYSMiCΡکS$2>&=i)Lkغ!i =?_Sr/Fz{tF]?c`O֗ef!XTc }o OHw gN9V- iZi??<0QV=V@ɑK Bdnvḙ+Z)r]#|^p-TYʮv~yk"]nx{.cTBJ PkcppOsr? %0 .PN\*,;aՕ=y޽d y| rYTde6츨acwc1FsdQZ!7\t~[Fv=}ZE]*ұ@t1·U[ܙ(qaw[τ$u>n\6'cmbN'cJׁ/|N[b4,~Y QFWNс5^#;-C5h%;ӿ/9hBQ#8\$[t)1}k7tje /XGm2rԖyIBDTt*3I€Jd6ϙ˴$5aOR7uJH2KiT+Bȁ([irGW%pCwP)MD-AS'xD{?~%gpEF 0DrNП܅˴Mq;'$$=UGbDKAJp0Mspj.(G*óݱY%1[BW ༆)w!b 횹|Pm$* 6+/22?fJVUGKM,%:J | ٌQ8RpbN`U/>@b1>^6xw.Rr-J @K̍W20m9ݶClb&2l[r%pz }Y"/)ԎLAm[c!E *Q/i5H;E/K8Qd]hdDŗz`tr1HM ?_lշV2߈#1? BI=[&XWvEn?݄[z;uhy Ha-q`Qor !led*(Ti9 dZS15ZֲeXl~#l0 &9OtDB C;p}P2C9 %8tc}rG@9JMS׶b0xMolH)@ /-إKZE0Ij="cI4#+"{=WcP]B#Wi'VB0 #?DSwk7Ũ'D]/!#Ҍ ¦%{HMdcTa|ՊQgB?1<S@I92NHtڗE^i^&WJ]sfNn%Za@Jkr<I>myʑoNu^ 9~>=ָoU)b*'x uW@@ҒnIz82v/e X(-EsupWU}665;d•H- S20C]5`\82ʈ9pUdMEE4Uz2E,oEC.%\K;c/qxǼj62P( S1 375׿^mt.H?gjql L P̋BX (\g n%x0wfD t"%jrP]_jF¿&ᥖO#3aM(nz[}9۾I&橂67˿pv[Vr2֋Pz5nx.b5蘱bQ.n7Ȭ'zvN۽ ;o݁ya-r U(oO ] Ys0M ^m Nl@l|ƕ9wO'yUԄ}vL!{rv8_ q &Jfd3k1~wrn;Rч:)IEz"\lB3{}<{kMAJynZ.բ*NNqp`̇hF!i,DL,*ޜME@?RJ3M28C:JT4{abiTi} (>T)E_ 2=K@A?"Jhu=eO#sw5WI[K`1#O[6Or P&/;hkQ9#-(}YTI{m% e$9᬴1O"~Y_P$9я=0OZjdɱΔW%.tƨE׹6PacJqEB3I0<ܹ#^e/<\+xߺ5,Ih-RBKUOԛbetc9vMNO=$cKn9?I 2,8 G!,m>w0AO' NA?e2Ao6V= !7Fb@ۘ+Wrf9!dW202a^Nx5@(A𻫯Lo*=E<'Wx0q\4IXi"7~9"^{^0V_l[ ,3(4hc OE-.[!5Z"ׇsE:ɚ /?]Db(ޱ )x,ۻ` *8xRC uV.}#R[Vj֯M遡>طS 40EX1GNhW3c%#, {GH`&%|z4U8n+@&1` 2^A\j ( !/_A2-*0~tbP{%1ָFu,J`_`VGp3y[^#2{9ncrLjb"y9 wU*C2 m+ezCd-u\ˤו^c}%)QޠČ-/mf^uSt`DǨ.(W LQ4A ])b` -˶IvM4nvF{ S>*b- o^ou4= 6piAXm6q[BrrBtNzIeAi̙<"(;cm2V2*_qwx"j#]O֥J? v]l\J @2?SEj>"peGGz ÃL.3QR v Es&l U(lqe4]@bxCR [#wTMo}?vS a0QpY4 WS/FFMgӰGQ}%:>C6Ņ4&R(|ߌɪ21aTۉB1@IST,xhbPnwl245[@7]#DKF x*Kv@O%s\c2)STqމ}㐺w%D‹䴅E wK+S8ۣ ('LJd+7{Vs,faq< f힔-9DѶdu}T]81'YwHV$9@T#5ׂ@{#Yq3!2X!X{JiLͷzBŶΖsJxǴF31-+fmȓ{Rpw Xlf 3P5d'0=a&khf6 ,2"4v8[BqyV5> <3<">7ApxVKy꛽f&7у@vr׺D/N.U=x2HdZ̖\z7qt+9<rԼ Vv~?@ X3ЩHv'=٬+E̘F]NOV.7Cv|:Ffa* 7ǶϳS1!dn`CE <6#s_X5inz+74Ym~2 6hq@[enX] 4u Y}2tA'n!NgEߖ<㫟s~v:R~] 4#4r1Dc̑]co)MڃzI/wj~罣NI̸%IXp#ez#4ğ4þ59V)%7xVC?m\s7 1HpR.bS |Qw5l D2埓oVu0K`;MwuCH*aϾxՐߞ-t󌥛 pڂ6(DdQ143'mPO'xν Slcq )N2TB!%~a-&Gr^L5b@>g)EqHr,k܅ͅ 첎l!|5hV8x,,h Q.g&T5.LbI7k girw0&.&hה5BUQ5M8<1inttv;):J)'*VAHy9m !1k&NG EJ==\*⒔ C 4)9V# yo$i+c {#*D^CUY%l{H=-:O)mqNpK ASHČ .&-ҬDH5RA}kp7W`\ €-kcaR'z$Bεc ~}\-7'@Gzs긢DͳP7\J^ ۧ:2oMB-W0XXB2Uᗌj-4esn(zœP0_ JJz JvZS1]oP@\IQLz 62I֧grI`DyN4c-judЖp(Nye셭sng-ۉY5^h\8[T!j%BMN_( Uշl,ƑEw +̛Wf"Hx#Zwy U^d iŕDpVN9L[^U\lּo\Xڤ@ >C;rDx%ĹY#c:=U6y7Fφ:>L$(D{ϦcEވCԜDyPByꯝ - C,Sk3> 8g'xQd/c< (M \I3 I"#AvB.&U% ?g^qxU Di$jD &$= 3z@4je%]ݙe ns{^fŌ?(K|BZxzK98y*2Y+&wbcߚv *g@[r{Z7hS O4xSBj8-Y!V9MūUl M&pTO(H_jxrd\=MnyMS>z@EwD4#1|N՚.~dQE 4rCy-d>uQ0w6mq+H M"7.v6]TST}E\w1UqLPSAHlR`PK#3i$ .Cδb Q7ժkN3Ҝ'e5Ɵ||Ζ>w/ju Ҫ,*5Ya߿Hz_!yM3sADPk"oQvI/,Y.;oWIÖ^H usoGJ|g<>?Eg8 k>UQp8ò\ߪe?La] %)2pR5ln[D%Zj\C#'(_u/Y1bxV }AcvA~HnDt?J., ^hU__./QDck<É ]E.QQ?S'0H>ᐁ,-?xv/EW_uT(b]b`+  %~8N$5Y$-T;SȋR9 (}E-BL ہmw{s@dn]2^UicIhD4]mrBf0`0n_/ovVJXʞIMS ;IV;U6$حZ/HG<;sJ#[Ґ# <+8UjHiAODHR4j.ȞT`@P~?b귓I_魭+ 3GC3OPJzI6Cū2p)%44jf `UK"G[ ~S`%NդNUrᣯCAy4%[e蘆/]fc28Y[ڀ#s_(BJTTFB888f8܂ṉG %onQ1\źRBЁ:)w&5|Oi#Ila+)ctS:Z!pT gm|4O:q9hL][2~bZ ɎU³J_RJTk\^.f"h]̙-N Jbd{l*cZ'|͇^ ڂ2 /v*I?8l_(J?Ѥy*2,HrS̓92\7(kҐEk1%_UyQa BvD!1?/*+ϩs =G5e8Aܸ[$ʐ@/H贘xia|$4Rh_) lD)9Yr,`45"I[r~Ngb{5"R5w_J@ ӟL%!,\d  FzѶU~ HHyInԻiiLJ;(8@Oט5>*:zhfʐ'sG'6GM3P/+s6Jq:ػ<kyp G8@ڹ"],6 VFvWߦT+px`jܩUMt"=9rj92;iVnUaY 9lgҎ6uJhڬ4ơaa/iwz^?p/AJyHFT[ĦFS>J7?gs'7cA7-% >bԜ%qE|oIQ>3Bv^ ?>$crpB:ݤnH=TgA^T;)Ieƴ}:x1Ό]_ubah,4HEɲZi'E[n}}FGb]n څ`Db!%^CXw6U(/ŏ:d25U&N,}>imm@V@@&҃Lml 7O9m<AskYp q> vCCDw`A]$5AKדnƎQ8{Ȱ|"VMN'' )‚k \XFIIf|&毟yMs*#X+57)g^(tAEVj*D'B(Jlx8c?(7OS+xdz,Dpi fCvn9O}.jB/dдS#F7?6%vͻX'vk{Ez?c*(\Xq e=A@A>^^3`;{R% Kk첚J7r^ 4~rpKwO97Yd&.a.͝dF`p݊pcٻ0(d(:xP~5\wj'%-EY' %4a]m)] xme0;(ADg(EAI2C8rnW_б;ي}IʝcBtfhBxA֛#Rgf>#3My6+1yA UpwD+1 ·b[\+xoMmBگ2׸rÊ ;iXy@._e֎̮L_azisQ̎x4LNpt ]xk&^4KsS=gWI8RYCa,4GB', ^2[:Z2"pR-Llr,ح X8?KBn"\iS Ј,?<,\, /t^k\~v]ӹz%DސE삣ϸwICqBDcEAWؗhF"٨ 7l ?0?q POl62s %k(a3H;9ud" 6v9x\z_Gn9L5iXJG[<{-P=6WXu G~a@V6׉rUS{ϟ ;cni͡~XeNQu)6Z%Y}:L G(8qV PT1عqGVf7e'm"~Ď69`Ex!.?"r*6V'xfoŪ1Rl.18UG5\'D:0&>I3I$Q~jOIM6D۪[lv'6UA-,+bM@\0İezyi%_`(8\%I¦~=d,&S4\ijKhʕXx:T$j%=d`2p{?DاE".,^Pi'Ŗ\`fFВHjb Y޳(@#TPWHxDB=W䂱N?luU aŁM,J|\utd :Ux_?"Kl) g%y1ˀy'F2iK2v bapEPVDDR$M+IžpB3~ɊH%=WHW]<AMPY>zdo_%ǔ[" `;`d g.u#>fɹbAg]'EyU.fa1~T+RZk%u0Us3Ԭ>'O-79`Rz5y^m. !~3nl*tacE5(cHu$r AH,kߥny Y$ v>,c?D]^&1\xP6ֵ}4}yuPm-Ⱥd#>H!޹Z+P/@2> X3漶 h z53b#x#(^әXAq0C:`9vC5'&L6l`WqE@DY 8r%y{ f>[Nݙ&ă+P(ĎwPdXj.? T[ev)cWM[dbUs;ERfDƩ3  51;k]A5w*et'.%§zͧ5g:GJ"f"m߼.h1TL+'0VvJXN6 L Ȭ#|ШFU{y2L@"NKJS _MVCWֈhݞ.[Ǧcw -N3-z3WvɍRE,YEH7aN+Ԡ moUuGЏ*nvӜܵ2v߃iZ= pyչ@I% ZB}_`7 BX <ų^ԡ6u*ZWKq7"G5|;V>;ty/ŔYФ(Q,]zLb6 Ƅ1n򒢑̉ؿ7w(vT/Ss ,x^(NTB\j{Dut8udb1*yz<5rDt,&Ԛ ˋAF*0<_ر4TCI0.Pm{ތaC6kƬG>cdY8eyD]C㌲kčПֹ pii-C qUX%PL?mӴ_TbUTZo?C)EouѲ r( }X52LZ}ג_ r"7B+L*@5"p%5+YIhNB_^~fȐ84vT? 0pleq0P28)_s6OTkZHH_ufϸolz* F`0Sd/0>!KXvܛ-C3?cP4Z#>ZÙ3 F&8[֓xkTzFF,t#O{B`[Tר̱E6vi/li?zϙtbi$ t>ڕqP 4moTV 8jI:%:$tGQ0AWX]j(T-¥?$u$3E^ H" 4 EiRT9xv +F  ǵu8sHnBC+M5qɺ9tGL 崊,'Zϟ* /d %!ɕd,rޟ8$0Ej;c 78{黆EF+%FǾU` 1?KHn?TiNDUCj^nC)e߅7ooŻ `N Z`8Q;oBÊn#F[x 1 PzЅ;Tks\^hpפ[< ;K׭q謓>^]ݕcϬ3z|^.'p+S=cXcܰyuDڍ|E"[ZbnX/ {{2_$yJzBbhёȲ9zWkۉ+ģׄE(41%ეr@%~l6`_b~(ח[J@hཿz1[.^~Ff$VZ4aGf#t\\^"zrAa}=>#LZ_Jhk}(7}|A WFHtLuq>Il"&:וuk#U SO'䜂d{0.tlPTћt^MB;y#~#750nBB,WiaeQ\ji`O7*X)fRj;*ܶ]D~0~8`%V*HtUm4(Zլ8𢵃PG9flVj27^vpjҎ'b7ش~ƁN ptoHm1Ubtt}oPL~[(?Rw_%u]՗ZBrB|y*&K>ּňxGjń)Ig] |dyt$ʇ|C4&p:sE V|s %i{ӖjX]n;QlIgxp+$e~%w\9C uX,EPpۆیdx5` N_:>xZ5[.T$){jAS!'; +eG%[o[sf@iTX}ztDp@t~HUpTX`:u aZQª$gaA)pYd>?̖~pAw9@r<)XDV"ݟyz,rCmnib/^(lhe3mwT$U}42y嶹bYIgU0Tܩ}1sWA[nZw64G'NY|9`n-xdgn4 _rtN9GKLj9}. $'}bWdWRkA[P}B4\S5ꓲшdr>veTmo<2gf/"2-og.M FUUOđmpaxס:hmG&L-Cno@S[.aP.o_&[ˣRnX6}тQȭ ?tx"ŏ )܈Z?B#Fo|Q+իuA_ rә#wpXql85 N)I`9y'D#&Kz*yz7H Fԍ0'!ϟbgSYx'm1{b?'R|(QHߵx~n2R:PrCkߙ628a><OFbf=Ԛ7A@T NPQ ^5ҸRX/5Lٹ2ztpj-C. 6Y+5bS#gxI`NYi.\XbcO ɱks<ΆQ'K' k溪@ %&q(ۑO3r Ƣ]}*:y[?7Tm@ibV_U}t&Ҙ RQ){&PJ`xq?LU2/: [ ؇I[&a}.u]S2]&3er#SCZYF|ܒdqXP[Z52}t\Đ G"S4sȻ!LFP#^hz! .,*ΜcYp[B|xUj]S /|qR iw]ڡz;(0GrcЙ(}QS|U;$$nuFX`jgԪF :P1".:=[#h>ܜk`|Nc _jDU׀ZR*q.{68rngNHB{Yrd j+dbOAW9x32N߆cD`_K]"~k4EuUtIiD.JyU^ҔPi#(4摼M@]iIaqa |J =^:'qtc]ֻ 8RBVLEiu)Oؾ)l;'ZI,t~ڳxv//%q=8š!wChWG>8;CHX{%u I?Uwe$]jWhجCoame:W-3_Վa}D襽F{Z٦nEr˵pA"Fɺ5|seqngC|{䕺b:ArkcoPߝB$p|L g&6>{k Ex"N`Tg0?_b͗MN@%e#ыVB,a['DYW$s!I&-{,3C="ҶJlB bvAmHƷ:[){jCqE^T妅$X$XeՇC)Ģ&l0)^=,~Lcۙ?)7̞otxi7)F޻,&3ZҚ `^9@$mw$ l݆Z%3ڊHr2;1FR͡x ݗ(덆Z9 ]xpoKW3 ^u3GCZ+ԙ#tG(?I3*=MD7䮟[iNuMgFluAEi/-!C-G5dh5T$eJܛelTAm\AINrb?%β/0G}{nlct FD=D|P uL9Kgt*:f0'kliRHF=Βt;S*̄ozxӀˤ"Bȹ*:ktϻ6$|Ϩy(l:Z2(׌׃h5hHtU!vwԭ0P= BQ>kB8oHDZ<-J^` )v[+)!Ȕa? v~!$Oqg$/AlWs ;m<ӳP;iu3 l{D~9SYeM0cķ9%֬# m.8H6)XJ )i'l+bVڌ/V$Is q>$|(,;k#xHwYon<浰$"ɺ_{⮎NsmF{+g@Juw_XgJ} tX.eŌ$C%.TSo1 du&>s-+ፅzh.._½/98 /Y]ѬJ8Ҥw&{NkT⍡蘗o ;{g߆%<!f}_aF[h'/>tn<~{ڈ0&;Y1,:^v&D,iug@Wn 5ym;~*趚urXr<*A n679Ub`?)`r.Cѷ4I" E;Js\[+XрSk$.$=R;Y :a^%':&⟞qM-/k;9xhnm_1Qn[^Y|xIq֥LM\Tʨ.,K 2Me}rbqt#}#FcWyi/R3ySy@0d'~ML7>VxiBqɇWNYziPRr T^Ugv?1V,]$1v^>;AX Hd%wK*z0m͝²qnexS?ma3xrP1+ z/M<ԌmdfvEM-qX1$l(qjyCGT3_{Y[{+^G̾RIG.'1VE0N>.7t$5I ba^'F56ئaXh+9QЅl9&~TwpPQ Ki}xrZP 'Usk݌uVfi~~ f2 öti~a8r5ePH[Wp N. & ~Z'a<8^Ȩt.p8ͫ]]y;>AͭhS)KV2дTD3#Q".m 舌wت_KEV]8zma5N*TM^[4LXD itOm$#4Í%0YzV0k>T:.0ňYBG͑ u͋*Dy= j܇oT.o"?09{5g1gF#1I 3Vе )f_O8Nnq"W y者zBBA BAAc:R:pit9CP@oDžV|qpL_n$K3FW@\W4PH#ҙ w&Ѩ aPCpZ}9 V@Lj[C>ʁ8] q( @2Y26L1fVF,(L7qt&&$L#كBXbZ@DIN$OkfĮomF$`a߷nݭK7d<(w&x9|c /4cP<( ˦'V< ?"X=@{8t`B;y[N5* hBwx#S<5ކThh~ђ6 U ͩRc^PޝLA7G0<쭩`ϞtU5?*V %_ojd֨xV_g/AO+Łi : :@ nMW f2a!p o1r2PC lO_^,Iο]iݐy[cp&8ZG}5e1|C^Z:7r,fje*فFˠgW軏n j~Ld;)m& [9=gem*U!0% u|b44Q<wȬ^!z?zSBV` /-X7@Ƽ.$cSL PG5u눓Y'6Gr9m2@q6\hDF@u`ieIt@Bcٸxe5) +*s/)^?661G@gǹhQ& \3zRSz /{Di1)1n#=%%GSǥ.WH u!'xFJÓ:ـ%m࿦^Q *Z Ȧ$"fp;Џh'Ncb.i`<g\>1Z< pԞ{3 ]E"[Ex[p=llزJR>`SQ^ fuR7IAvZ#}iMӄ'`( TEO6~eقY$辰͐x恧%/bsY">nKJ9z|]P$:E`z'fKӥu[UK/QԙMǜHpA.T[wړ5-Zx-6_jFۃž43H%s3eZ!^y8HunX~P~ UhuYСgfd@bN2Ե5~C-a7El9OQ\Y6,Dq˙«C>MӔ3,j5ᆵHN tPσ-wxPb'\ cPSS턴~nh {k(h%A>KXeNCS{%lFtp]jtMhN&j`u& *Xtu%]D#c}>mSi`^z9Hdch08ZWiLvR)ĹB fm|al&-ZM?*3 >Z}0R(34bZԷSx273Jo뇦YH9a~|˅)x IyF ,~ ]"l[N\Kpi{:-τyRmx<"=ኻ'=A.VoZ?}9hsIѽzޥt A_!v`d +u1 [)$gȆ`r|H;inDTa/O-> r:t `eHy1tI6ʊBT!DnA<׶X<(|HrI̶47T&1 \>}_OC-j^DrNiR)tlIȾ䮦9*MJknHF\7rek\ }1y#jD,(vmxԶ엎`!cﲬ~L޽^m5wBI俊֏yV|L͉iBBO_7,{!7zam "x"qLo 9ta[FdS#xW퉪ԕ1_;sb͜-gNNk]&R^*Xu#1ۈKJ~K*-[\,jĝsz(vR@ S渐s}v>Z:`blt_JQ9H Ҩi؃fL&&0̮|+wJ 52E sQ9&/B Ƥl]dNGgpә0p߂CIp-"g\vAQY8 x9X]ր Hq-K0ɀ.,snm'(L*ŀF̓ᠷ$2pnШf1❢ ?:#_v;V?,X' !ع7$E&"3X8]r661C#c@$oZqZ}utO#2_m`&>uUo7*#=b3aNrϽ{t?k'-ۅR}VI34“ֺIg ™e[}W8N A>KMTqO2)%jxj4@XST:櫥 m~X1hQ1꾉oc[>_K6ʛ? B&C,3iCSg5ծu:紏'moC3~ۇ-ac7bI_䔾9iFKYga#P#ɕ"$R l T/:ݝ}VTBxL ,l.@3(y 1v6$[+(EXJTCV3%N |z˚h1%j}@g!NjIs@x&P? ]],Ko^OR&B0^2vXhpPBוdrc;t #l5P5{ <Ӎ~ρó&.{ռgT P{O-pF%WHa.r K' Q֤wrե$&^3v8_c.q0:; x<[5"C]m"L/ON Jx~Ϲ,NIӢY:%Lf/#y`ݪA ȵbLJªZa} _EE D_ {vvRy3dCtvbyRcxqrH'zOF?K]m8|Ϳfh~DŽm{[Y-F,P> ۺq]ȧz՜c Yr[;8ꀎ*ZP@łZ9ao/οy^}VߚX7{f['= >4o)mU?^7F/S^c$I&M-A^Ғ~46cxtC-bg)՗?cY{%j1AR$(>r틛˿N J oJ,LғWHp2=RǞ}ۦvBFze[ JzU{T I7U ݒ H®zM>ySE!o m4Il+hz!4k2F̨pxd $x7 ~t(Pq%g hϖX\viJة;_G4(߳7b=_[p`@#;f <9<7 vd]pfj<`~zyH&^!iC 5 T4嘦qK]d<0˨bfMǡ*aQ.44RLM9_=zLshg 9DK .Q=Ro,*`}L;gN#`n60e* Ňl+=ߙx?uwoD{k|/pƷq򐢄04?fIJ<%Ȭb풫hohƦmiZBRjue.ƑY"~ǾX8T&P) &y(I`0K?l/hݯuZ|tVAl#ݎ( ҷoZ+>/;7@XtYk@ڸWqw0A% o1X]kʂš.ivV.>ڍظf4gY_3227QClp9-@nJ)&i wɃ#2NAqJ&0Zjsp%RIT˕?SOPQy'2h&3DQGmS}DuM:񂏊فg7s &l -ZQ~UC:L,OH']?mF A+8t'n!DTN&mwp0r^Fz^LEb#`2O}.(&^E8n@(}Hq G`+%fi ^IH8*s3`K[N-#ɔƣ?D_ׁ2lVJ1|k[hCP8z`i!|uUx;.Wey11W<\YGΛQۖI^VR!J@5% Qݴ8pþ#֑0`Ӳ/τ ! 6Z86psreFE"7"fr;kK3 N͓:K 2ͦogjs+E-0 nڦ/a`p0ce.^ @߶PA3sؗt%ځL&U_yxKgӂpfF0W~EebvQ9HRB2'tjb_Kf!Cߋ#Z,"j>O֙g35*Y|͆NB1jl\ L˹DCW.EhUY ihn)M\näS0AI* *5VcN6u}Vgɦ_}\I%?CQ9]Xإۆ# Z j]D WsqmwՊ+ķBV5FAi- bR-Uzy PP`;e8:w22F2:ՖĄ\FU檫Tִ#MeU,>Òw7LA1vrWhIsX8,A~x+n8cxyqKu~ˈ8.;iӀ -WRsۈ?mb0> $=xfޜQatY:!񴢭|&ýA4u3 "$T7p 4] fR,ܓmb)+:Xt\O%쎹7 ElFINy#R@)&luSsm+VAV"C:}ء am:Hոf_& .ZTE”.\/1L PA4 gx`0^;YJFŶqj]NCwSI7 k\Fv0 gjWVc9S}Yc)guqq0$Vߡ,>qa'3KP T[\A) )Tjq#S_h<0m{CeY-`4q:U=ceMX.3nb?Q@vHucũ̆X Uޚ4 >Gs|o1 ]X#m9+u.DTȸ'|u|35 2% >f f ?r5u\"1%Du7hrF%sot^+x3-f?]9načW#dDkulX" Yzp ޓF2]Q )ޅ_=;.9LUۮ`T?1,k /]uezpjW%vT?NzvZbR%v%R #M3~ C#jP`Z̦,Uؒ5fy g]4p`P\IoAlyrlw5_0԰#򅩇,3s* ;"?d?b'Luq/xn{6ƺQ2UQ/Hd}*Շ@DK}9)D &gSd6tX52'j?镂 rA{ r7G֡``T ʻ9O5R;yPi:%ѐX.pߝ.|Z4ۍ,|/7 B}GF@:G`:tW@ˏy`ĎU=@3O82z3!f`Tr\0u $I[93кQvI_w|݁*2E'}JgZneѸ)+,}W}{a&Rcq4BV4rv\gy4^֟y/oՑ5\].4b^]‘zW̊Ė<"~H= 5luC6pU:ehm*+ݸ"y sgSLmͤl6IG:ί.HV[d]7ػ14I%4&VQk=ANO +û ~ 4᫊} .X.ljIsѧniB1Wfݔ]q@`#6 Ӓp\px@tӪ@<%xhB%g.XodkW,d!wŮwYf1lxJpauīsn*Wx  ˧kSтJW23EX뚱b;2՚t64G 0& 3ud˱r7h(wATf=(>6.@wI ]oɼDPw;\ 3&`Y2m*-@?✕q 38Bv(~M5Gn!S*h)k6\x]b}}pץD}\4ѩ1Gk ݦ6ڹ+#%]fd4I[BsjTQ\C)ߟʅp?c n)^tz3N 7aDjqb~٬bdpw )cc^+d= ԇ %QZ&%ct6&뚥?ʿbNV?B3ߦі²dmQ,Sq[Wd(zoYij1Ąg1ÚlH )'lW=nEc~`87~7o?@}f,QI$FH>dCO&49 #WB&cO,iS"zI,ܖsӞӊL|2i ĮvwX=lc{/+4#]):^F/Z된mUZfv~k=㥐v}![ÿWryn=Hfyn< &,7=>Dl7J?f=sVL _+4$D<̥65;)A75{;XJ5stwh4(0'|L.X0wM3 r/UK)V2mXT`p\ttDG yIbw nrUJ?:GJĉ,^G/AѿBm;fJ<Ѿt}.q]c˓{~ǬNsl~r@hHcq^{@Qh^Yk㵏LKvBIOʃdʐ [(Eq)v|ESDA:P/biT g.iz? %x/XJ߃=<,cΔt8MYx Wz}Lo{? ĖyKdϲFo=1?ͥt,X= F3N۠'繗#pMw%ߒv3X\\}tcQCoXP}̭_V0BO0e?Q {2-(1$q냪{Ht&dRoJ"4e SQ:vy.*\[b@g=%FKBEEdbԜ hë &>d1G >J0 2OTyawSߴg )<0|D]AΖakOy(1vp$5rW0扩Q3<;g7pp*9ķx0UR> PG{RShbiȯB^U;\oddPCZ觝HNщ}9u0ҽafLC x3Ds- zw80$lz, >M=E3XHz,_"-&-گHHggnӼފY5}0@"mo!]٫7 ț?Ou\E+Y&9y MEGXMS<],iǐa.C` 2 ևJ?fwԃMl9|u+]X8X.a(a__CF$%TQjn}aVW-%"3GEfՖjNq<`G-50 6;j-:%}~KaCh]<([dR AL"Xqխ=nEu.(enq >?CF.i9 ]kr:>fůuM9Y1t؛uh*POIЮ2Q #SaYU2)nhv0ͳ.N^㮬6+Nߞ~e?Tmr*ZWTZv%v Ue>ԅVNl"eRrʙ4_Ƙx2g]}&J0Rh]V򞥼! 6EWz)>ˆHB a: deTi)ʠgu΁#+QxR`9ѦܣhQwX9[3 _\,xa:ˁD C# f W(ޡB VқzrQkԢ]c+g}k!evܰZ?['rA)So Zޫk&aA$nǣ̷;E^=?{F4󺟋]V/ncf6~ɽ*yd]VuT\~HB?R$GbT_s-/rD{_MMTe$+=d(Tm+ /#~Y;4yH(l˻n5uIZUQ. ̆: Cĺ2r'pFTǭ#,Rw Qc|"(I] yW=Bs?ꆩt7}P.cz.yv*ܬfVW:9L<օEhȑnq! X7R{@󃓼뤱{)7 iߩ/{! Iʾ$w8 >ȅkdR69f8  z?ޙۭ/l"sВy''ܽ,wkr5efG,{c 2OIkDŽ'q65GS.&O a!U4&b("~uFgw/~q(V Cc_+>>8d# bhO'F@PDnݟOƘ;R'JBs?!_\j.ߘZm7g(UjDAsɽC^UaiCQaFqy7 ۉA% l 9Bj O@h@4j KSc{?c6w?kyJdppFYǮ,ozh%!D,VKzXOkϩq.>K?{"$wp!ns9OqR~k3>3(/j=.̙7ظ؜$=D}%&}M9C,p9_Qm@@,_6쑼hآTC\HB@"U"UDNLxun`zEMt# :"ɥQ.#d%~E# 8tD}&imb-cEl>>_F'͍UPKĔ_'wCaot_\j|ߖxUPyx5b1uO.͎qlXCpZgoFL4MKC߉n:tg5 t3mj4Gt@8ǘBi&Q+[:Nq0}cRJ`O*Rl>\jz1=z?F=#ʎO$BDn:(QxD-_A5HhY;dN]e!t%U)-ٸ ǧhhWBX*)ePkGT_F Gf+}2Co@ PlEf#VWQjnW;*_h\]6`?Vw!MF"=w aOnvhAyJKt.ik[STWTTk" ^P+m <ηKi β8J[*(= 7"Y0NI]?}1(0pk.&6L*,^5l^3?HpTzc` KuJ޼r j(2o8<Ńgb`Қ@mh̥ e?W$U?H)?M>c/WgZgH̸nAʪ/ i<@8o&: 7(#a)Hxk+嗾H P}?7ӯ2_->-LHhd$ZvuZfA}IuIwѱ y(ud|{)C#TENʛl@bf59 W?ɿ\pkS=!72 Cڻ$gM㱋6E> wx$ck"P{H+X>Q=?cwhLv[Ʉ'a*cQwQ;$RsA$84ش}mU;ǜ.?/!kTAUҕc>_rmTH k'aCcUU$C}iۤ8۔j Wk ji6bٯ`[D 0)z'QWi!< 2Ĩ5Ч(cFU_yc=AZqUjЉ a& |JG"o"]^|'>U "uBp,Y'֐_gRkخ|ccˍ=23"pv UNWOs$pۤYZs|Gaf궲+r@65-Ѵ]D*@  Cs"S*;hca4Mj]cp ,m\0L-/lfeD48"0pE3 *)~wh lϞk8ڄmo%G*N |M7FV<&׫%xVA AUӐ=ApUele@[}Ke=!PoĆ6rBWhCԿsVLb!C' p5o oLK()"DEh(FZlo+ΙMzW[¹;VPawe`_~kc8 ݭuF#S`Ď!)O+ъufF{~$(h|oWB9.x7ހ\h袙ԋ`,[FAٗL]_#}R66S%Lvw:!OUd.!ޞt%Ӑi2T+۸#{ݶt[/e=mo%7Kr #hJPނ,l| hY;6K}"܀/6'uMBrt kბ+~xVؼ"0G^;%w1ipLv2  .L_[2WS[|,W'~F^q֏Ϟ\O[%Ut~թCW}U,pRؒ{**^)3#3<]*+ Q?:}lrz,\|2!2^q2t} &Y;YP0q_|CYV6&_@$oXemt¸-NV&E~UC|=Шܽ sdJF'i;佌 mOJre1`_ $ܲ#<[e/\ljnѪ+~-c[[5- hZYZطi6'&)I˚b'#BFS/o2nd*I}rGҶ'нE!hHBb:C777k8@Ă18A+6:Ua-%Ӓ_IׅjciT79$<$k53(hZ`#`PV.b/aNVN._о@;Jww(Øl4RwiL#2Y:٧y32DID[է?fLlko\S2?w/ۗeU̮)n6`CC9/q=e <p:o 3!lRH14qwLx2䘮3.q.ŐhMٺA}<ۭ`pJQߜ_睌/8sjME1j4T%\>#WҢnAհي ȡY\Y} ~FM41j*Hnw0#UĀMuEs) Uc żI:ZKzkpdB/m]J1p>SrрYoWgftiLcFHvCnF)#L&"||61uW.} mu0q|ENDxE+ͅH X J*uX_BGND*i[l'E_.^2XuAB l.jH_'nlj\)w>gQH3-CBD2 ƾJVMd_ zQvFJgwTm9OPQ6W_ʽmvE0!}Ƌuu\uĪ$*w/I/OMלy:@?J͍e䶴qYJx7-4[:][z#^:̡UY$hT6_̄OV:˜bC^2[ؚl< >^HWTΈSa)t@JWX 5)1MMf(NL N7ec q]#U累d77eJA1 \ƣ׌ {_-.ƊvԾөG?FjDS6\}8[ZT0= H<{ =oșYI愾FGyXTO-&jtZurX'CPOɟøv7θ5yt+"ͧg^n^;DYS3>z Zd!Y7ֺ3՞x 9֜[{x̣ Q9JF]㚌 Ϡ E>h+M|BEb:TRaicnΎH>ʑ8jv(OF)d.P>wyXG݉D;;IeYmL7 g ԟښkٗcYR,ֲӉj4狕-DQ,j ZhUfug"bkuoW3c4k3ie񣸣;M,6W(lm4Nqحn7 bcWSAк.Ʊ3`z)p6}o<Ԅpd"O;w ?dFFfY|d=y_%Na鷙ݐ?-SYEE6£}::+7MU VIJ6+iOcɄvLY,/Ya;K] -R+4U_0`=]-5Tr,Kr>>REv1}]ܖ^Aʻ,jWs4,vY,Ķ싿cza1U~Jmxf:Hj( ;͗ENXGf͢^boo og{FX7Bz,qU]H,mG/vAHþ!q;Cv 9Way#v)+ zgaU#.=r N;*䂛xQjKۺ/{b;۝ '\O1=Zoo@A8<=gyz']970c ;,9YXpxarNܖI$B<97z!y<\(/ 7E1G.YA||=%?mdgnxi!] iϬd; O,,R' /#󻙄_dMY[]9qy0V37Æ処,K(.DBi3Z\bmmwgv6iu};xU񠥠d"OF3o^$4xGm0Fumr܏P6Ĵ~Gs%11û%qFP0^?YN;%-*V/p>U}]3NiI*W݌AXwիD?8E(;:&:tmrFBvYu1)"nN[ K> @O4){`|[XǴ 8䀈3Ut>We~P9.Qe&1Xk ;̷ ңszP`$ Uy^^zd|ڌ WT[7ɜsfZH&#eσ;=^YS.NO~]"Іw g^ҭT>ioS,;{)A c(ejU|x;T\"P[4a'Y4IM-#{f@@<*_$QrU7[fqu0 ?5V|^x*)v͗5`=`ٵSVi.&/N$?{1QŇMKY< ܁S[*Ƒc.\r@q,}Y%׊`[l֧(!^+ɍ} 8f.jK6_.H*q+$tִjw^w*<+W( O}ɐ%60QK~!~FY:=ȋ o fG y/ (%g2́.pN Ӻ\%O|nwSh:?]g֖bؔ6vQ>>1~_NF+'H!Jbv䄯IgX+$="Fˈ*CЂ0^>nGw+J,F"5HCl|7$clGHw$!ՉR({ (K4I8g0_a&Ӂ_,TRՍlNOfVAUKwo:K8V@imG{;g822kM2ȣMdI=筂"ɹ"b 6gtYt<"[^̍vQz&zf=*! ҞA0bԴ\;/zxEY~3[`Ϻ`Q' Ff4gU1(nUi`jq娻"ϫHm!]'wDFFUՇtKIQ9]3|bfw)0N(U ,m3shH :9EHmA3&dFLۂOV@t1Y9-(>*QieʧIa.QZ /h zJ8(n1->cm=jW7Ҡ 8{@Pkƈ1< ;iWNwghj|߲kU ~# cRAQsI .0էMI|-pz:;k)t*՞Icpf'SpQEp,1B!xϻ0s-U~O;-y+6H^Q+YLI9E;$(sBYs']ú@T\W"ҨwV.g*Үk~-yD/M큧MZ"AV ;-0& |p)<ϲYAp(p Z`,8f%îa t;ߢ5F>]x-ߢ% v4חE6PeRQ 5\ĕ IPH3beޗ#lQ w) ڤAL?2QȻBrj):c7:yE 57fd1'm5\2`ȇN^ }9#gw4$ZU6glht1Y[_!M'"Bd7 Q^bj0;n$awdEe9 {v#h&zQd@Xi$]筂8aEP*H?Bv1 >RI ߅`9=RӭÀ;NG)Kbx/*jl`Xȟ,Jn&54D3 v3~i;Ɲ Nʖ|}W0L&2{;%{-99&+E> "GrS:؞lur P{ \zjXzf>|_9L܏$flg|t'-_sn2#~KV+R$\y N(O%lb\5ySG?R%Df*^.C֛|VL#H.9DۇeHhƒb/>Vǔ3@@tՅ8&3>%"ܚ`.Ktu`S6m.Ksmu 71 \؞4u0pi-j508 mLëVM%moች%'׉(`dWj|.<\Kͥ(?t}6KS'yDH: sm->(~4{}Oj7+Gj1 Njx.ݡ{* mjP;:孤jnTk9-5L*Q^Ū2bə?iciFUt.w.;AW Mٮ۳ ];^qɸrTr}קt!6N=7W jO1<ۺPh38q7sdl{W'$6"֌\~fLei|Qq=iV cCy"\/߸&`Wd)P ]&Yԗ?\M1碭uOeՙޞF^GFd^SBӇ0 ]"Rb+:m˼ُYrh|O 1&NLڸlQKaӖZ&Sã1pU߲~H5-;Ѷek) W Q^M_"_h'hGQq,#YJ쬐M0>AaL9+^WIJ9ޓ,,G'+mX>dr2d'3LBedQC|=# gES QRP-=<7S.CN6Ż!"$,]OUW٦f5 }; 'g.Ahn ۡBncmCyQH skٳ*"M1iW5k)Ow_hGn5yäħQ9˕ZY SP]|f$IYV6'dm$r a\(듚8*y`[ry9_7VCjqr8p&MfRDi}DOȈJKtɓz=TH|wyyϬ)qGuwIeum>}3i=KO,K%?*{[L2ّuuO]{x ]7+JfW^F poTN+~4آ6:'+_w \D^.-JŚJ󓓅Y-B'UY7œ դ+Pŭ<!~RXT!rr~kt\87cP)|==j`h%W+]֨8JFXb#PKgn $h}$|X*%cVOUK_da*J(s,S{@6SP@jT} GxݽEڮBe=Ĕ&+\4GvI켜 ٯ|ꟶ`6Z\5tپM*~澂Na@I.Cϵ+ᯥ=I32?Ւi#:^dNgMwvx9e#]D>m|>4*'4.-o^IDꖔ^Q8hesTk?doKSu3XGZ:?!ƓEn҂sBpv1Q@5Iطœ?)]fY!Κ7W٤RS͘4*f4enS~#I!U[[sOI6'nIC{ t.4O„U >AX~9>{Hkl)_H eY>o6}&',7 Ԃ]ߦ'X]E(VȶT|ĥfONH]Ӂ'#vl3.~3КllG~;.$gapfq%\l9_j\3чs3OkBevGoF\8^5Rts ?kQI M>5tlϣUwΈC٤u[(u t8M#| RWzt  RX%A &c47dk'@#ɛSvDdB)_hV;W=="'Bk%>*9c+H^o%uwG92.^+>MxN @PAt@bPXvA_pX_O܉!l|M= *]geMQfPGDŽ4} G`B7g0:>gk۹Y- WsG-Jjm(M#]e7y Qjhġ}59j,BWzy=n @]l b{s҇eV&d1\~VQd%iG\tVјxj! U:u "{:}"?ٜ >Ray.G\:z2 sn/]3 am KN OBܚr0ı-LDi`1Kq}-+Sse2xW┱LS`8{oxY*_~w2Ë$/Z ǍIamf,b4Q).>)Q$~3R/>^wMiRzUFI=LnjTA!5J4T`Ů%i&_Q%<|ʢMT12w?=F|ܕax0}ja wҟ~#z iڈ8[l |9xFFHDflQ.~bhJi8n%9(ARP#Ųۿ;'RC1+6:LjU ٜ#ٮzf:Ynvx m'Qbty&+Uwg0P9ʍ͛X*qdCrT޳^.{cgm5UН> a'!قhԿWzFǴP6Os>w[8I+.HAv?`=mxox!z;|HrY M8Y_+bȸ<"l"6*枑rSK7 M^T3ZR糔_5ґf_(V}9uЮybQb=Nmk~.`=qk^fMl[ s'.l@gGjnIam[=XR`&mE(|GQhLq!HMPhc|/},-qvr?)BK"p𿟄al&qs a~U`3@v3#EWg݀Eh\QԝC},: .]֦TN>߃+Æ|0tlB'/w@,)9g0' XVb' 5;O<ە r8+ %􇔉0ڱL,Ft'iO#;[XWPǴ; {UT}b—ߕB)8xO7]ņЄ 5ʏD`yu6w ¹ 18X'5aK|'`6dp x⊿oqa&`Y. S{#PG>:;~9)Vc:<@ ǻ&"NS-0Wx"hP0 tguž;0A^7#=3[D-:L;md S^8/=4JK7fTNq(f)ywUS?jLtu?$! ww@!Ut<2[B;c=j6&x?6kH )&]}UH6NhtWVbի^fZi5Zsٿ^6{Lkw}*c ZPBtȯ%HqےцŽ!\#D[YގhZ$c_b㡺so9!0|sQ`jWW=H5{RዸBoܒ@%79uN}0\0_|t ^a~$$̌d3c#'uA5_Yt ֤;)e3!Ish+GZP)No' %O -_1bp7[ }.6Σ{F7੻Xhc%^C \Րzwv=6 ~&M>__(xM#i0&ֲXȥWBRW)Q!o(>glĜ0P}ûmz*ɓ E4X>S PzFӯc{nw ٥E.\9-zCȫshYO0>Ȣo3<e'цq cz}z#_q( (EQ%a4aӜ߻}KHΘP+܉}E寷3 \U[+ÑAB?$!hÀj{("bG*#}-̝,Mś_xIkIH%`v:%=ܟ 'IךtUcgIOSl٦ &[-՗U7. Ad6 /L)H9D蟬F.[@+H5كH~J 9QtwBObLP8O)\~c Yrۏ 5ʼo7vόMW L]i$[V,/ul aDHvߩ?fքX v@<,D1@D4&2qGv`xx%5S/ZIg2[}cЦZ]ob 0wL?w5\)fT&Y#{].CV,7%ٛH?W0)Wcʾ (KV(ɀ Iv CONpXbwh̗bå_ Q4hCL;ZKo4;4[j t4}H Wy/R *9CNjC{*K,zCx>>WMS`S* ]86[r#[[#a $2T -q@n傱iGf5JO4sb8t_e ݿî ԫ" [3sϘ D[Œ R?Z󫉅4jS?>X#/V];C=C]O˗I2umJg+)$9 lB5kVbf━1Z]ʶJzX wCH4 W3,p2&WINM/Gzw7ufjq K!P!_־L_&pJVPCqȅWajqCNBL܄n9U1)>v}g\O[~Wىx"fvX؜#lP[H+FW^H^B їS61MDNH GX€50۱,.dX؀w@f?8Pj>ܟp %BQl|R$ԦQ Nri]>ɢ-X9K6͸mV?d і.=vRSkv{yp5ݢoF薋hx[`1C f'qGT>CKu`lq[r[<(~0g41[B9 (qw嵈;P\a29g!m@ɢ4\ys 삺)$clMOiF"م>! {yr!q/yjG0wc[۟9K>sMZ*&izWLe9.q?ovZ. kqZ.r \F:diʍ ' w4ɤE &/]`xHUK+a=0y\/`UigJ0R@ZVٕNok(afFqua\@mp2<[Չnc'q׃VW]32Ygf늤97UO" `(jC# w u9*2 ۻUQ2]I|[y1ގL_',u:~`QSMX+ur tǺvA oU QpUc*>]sxmFg6#T w"MJVV+YK]:S yOo#6c_H `ޱۖ&X$du@Y@ cJb܃ yCN:|&Qm7[QwL^ź!4蹇/ѧ_ȱ`,i<N硡o:vzJد0tvՑKܥI 33抗^3jeyvRsyQRX @7EzVZV~^zHD=6̱:,2?T.enp)-"ҚOeckDzSU}D̆FuT2NvH8<( V7$k9 *mg$DM ;=?]i׽|=fَ%#KoT16?ԃƒmoj vM&+CK~ڰΥUXjBqGj;;bĠC`Eц]e8X@L9p9 9k{s?X /-0#W8hoK7I$ MyViڸRs!2i$B)2=0^/`e52A“]Za4(}՘+rڤoIN2f>-z"1u8T o4$??ܕȼIYdIOkQ8Д3=21ϰ$88 ;̛E ߾*aE) s VsBet4_ h"|< `xDo:q\Z)]2uE)~^2:c\4݀SSهd W56]cQs%Ϸ=G|\>9˗@@]}B$$!!$$@Ya=!$1$2" # HI QE `BCc !C$@2I)HYdQW%-%D 'ڑ&![q JaSI6u+-":cXki-',cGs0T2[\dB ' l IC !!RI `HI*B I$E@$$912q"CĄ0 hLa*f H *:fI1LF/.cT+|UehkqkF8F$RVVX 5sdԓ3LHꄟS_3:Ѭ N"6CLudQITѢtpL:rΓRUU)j\ٲcֹξCICݶң{5W_y`':$!ܚHThI"رdRBz `I3PZʴXW)d$DZvVGQ m2H# 0QPWrw0{xk _o|Ǯ!DI=RzL TrT=DV0=&CI0YJdaA&<25sz4yҖ3fF ;?D&)O <; v;;gg XE!E!RV,&14!%FcZabBi>Z@)f/NnQV˟5 _Mn[n>}ag֕ ;RH0j؊bHed-+E#_ @sYM-,$!lݰ4`9P@\j``Z~ZK/sa'5%dXy=c2˖g4"Jb4,_Za fS -IvjN9eTCF^E8Z 1o<'?7lI,M$E+Dm"1aP+mBM}7`tn%yXPKUzgnK6/ڂo($ۮK7ц}nN!"VJY f,*#QV"&!@X SVV'3mv]ӏ+ Yڽ'zlwwrۨ0S7%.ݏ(6!$ `E+ red5@\g.@@HL`thk6ۗ} KirmΨ@v kԉXUhrm3"tO&SYJB$X3O+L-f0,SZԶqh'IJ(yY |١Tkc6 bA%'"[/F|WGçNhVI1/FZbQ:"c#i Ja7fXݡWxlb:r#_6YF-l6$Dg>nz;m(NL6!Y+ 2Za$W"JF3)˘RRIJ#[AS;]ݖl:քx5{R6$2Vue:Ma UQL .e9a[[,<֦?$=樬Bn UdJC[y" fwmKq83H2Bƶtvi42#b.e>gS~w~$ dB^1YŒ$Y. `-ҵlhV7 rC++\]u #n4K\GH(ݻHhQc-lXaq_azt9H"1$: S,U^!|rc)-eyc568xC95[ /\M$^>nX@QPĀbJ V ޷eT%3ְ ֱiB4MBzXPm&>Bmq• ᅦaL>Qٱf@IXli"P`,LƲ\nVv6\컛l&ݱ;BT MjXQaA|7z-n,M@X*lʈ8-) XVd],;($0I`Jцv㝢4sa&I\噟*y3; 0EɲB,Ax% R U 1eb8tII5;WXKnvg ,ɥVR235w;]`^7s]o|gGPQɁ$ rgL[,ܥ2=X΋ %afo8N""}7[lxe A +G>G>]+mdݐ큦bM!EbX $$"Ni @"ba:pH!;tWvHKP4 ;;]@ $Rqo!9$+"yT hU-hV+6<#neBv)c L#X]fTĥqVx|?MIٜ1T6q[F)JRڪ[,*m.[ 3Lf8#0YLʶ Xbgj.liDى},Og?W?!|$w+$r{d( L`0>A\/X,B| 6iGTXi!>U6F,lHҧ=g6HFȰE z btfQ3 t]YpJ -MQL-AkdUڰ3Ii C)>{;gO 7bHiT 4lʄ ئX,uv) ѵYY6R)Mb#,e;PJ,kf֣xL݁o!!*", +*39a'$39hT^p iKW4a{,T 1#8M< 4 v6ߕw>x<O aXx" + 4c!D,|dk UKrE&0#+Yd DnuTn%FՂ(0ځaYƢseX{ @]C}'*c1AAV} [4cR,ismmb2#ڢaKgRJtڶT11&8A@AC LVnzp~u"N:s[(JHpfW0PJUKS}߿= $9215Ѭ7K.d*E;ӻIv)I!7^b5@H@YҦ iwvk v׏I Ģ-Iؘ$aDM[3I+8r!n8e=.iKVG=6['+pHEOFKyn' +f02,me֩O]EŀR,e\!cDx1kRF.5in--iC:sNtNBR"pvl}鱒nN/o8 ӻ.DKH 0]e^ޫ#R#qtQ,il?b=.NkB€Sg@I[:̀&Ű)ly[C# 2 ?u#W;?C?dv?9Y( ᠬU""φʓtTa dKe]4>ђ$ Lb}rT9P,Qˣ?oB'怫n>)tf?}{nj_ TPU>%(UX`(0QAAQTQUab!YE$REX (H,łH*Qa$PPYEbYUVAF0PQH(DDb`q e֑@I őVETP^ RX)Sa$-+Ğ)RhbBV HLfPghЦJ% ,G?uq7"n6H,eHEj amE1敀,PPB c"@0maRD3M\ļ;mǞ©&;Mb[L_vbD`Yِ(ٔfbTDƘVmcRz] !(՗l5"ps,QWd5<Ǔ'$R<-`! P6aN`LXuea>i.쥌tӫC:j+:26Pm!Y $aG2q^Oџ7wݑ@TEX*;(, 0&! ӽs3mT"kp ;[a:$nYjmgs;ÉXDcDW|I tNAUdPdUH͐:5"颅UcP%Y{yB>[G J6B7w V&m3%U}>[Eb*C$16qQAQ5lE)BQeEcG;p;]7peQq;RdTfbrujcV z=:"ta蕁ԩ ʊ-EP9BM2AqE!偉 @+|jq-lgK,JގՉОKҐ9ld8вߧzD691n(3E t  ΘU f@R``+xQ vԞsaJx ,bXbk/;{T|v}y]B4P LdQk%Tb';JJ1Txĩ]5M\D{5`TIܤMk6!,a,wex|Une[KSfs\rr`EEBrk *Y 'RHɵ:eдlJX)#aj1R%Eiu!uPZ2Z!}CJEIY6UQF 2]ĶLIdX69.F-B0H;Ð#؄]-BSuEjY)lkgr:!0: y Jb) P:2.+ KFj&ڡ$Vm(-fERZ Y4ZRӛ[_o+7I$3,T &+ RJĊ f23LrUkE3uŠJbXV2'zНV l룹kFwq MӁUnM)_T|/N"!:RtLBU @ 1Pp3ɓȁH!kb؄QJR X<ĬYD3 J`JnZ@@p!)[C fqӑln>6j'f W.2V_ۛ! L`n2)f1dR̷uD ACC m{6GY{ЂBw.@5e;D2$0Qb7z]9yqErn`YTCf "SGC 6iKGH7Z&D2a+B4@bEzisl3g7*,X'4itlE$!ŶQIeh([FO;[yOs!>~Dy@ٚCyv2IYMƥd+q2J) ar;Yy!LXwQՊU\˗2u-~3 uHc=2bTdPR+eb*UQzҢbJH2#K[L.>mxseǗ&%Y\ Rc}?aI8Vl(@+$4PQL'ZdJS) %) 2$ ]nf6s]i9ZǚIf vK ۦm˻HH1#>߳}䒡@)ɨ}nb*;J%@$oi%ebʨjV[B&LRU;uwk">*qk`eV2h9)+*Q"aVumP󼶋ݮ̄XAbGL0b0jl*& +MfD okL7lR]saalM"^k[B^Nۧ~en`KJVoiWv  )JZD NհHemc&ئܚMv'q8J֣Zħq^3~onRs7w @昲+32w @ \dg(PzXA:d|W/z]~G?dꪨzh)=HT%f! (-->%[\5j!FTH1IĴCݬo t-mhK?۲kgG~ǔ9JLj  py&$''N:}فh!b.G.hFBYَY‘ZgU_sϟ_QCg?2|Os!UgӉ!Y,r&0["1m|XZZ6|;[2ݵc-S*']m4ʙz;3ѓ1&Yx>yg7dIAy&`!Xev% Bx7-%!6Qr[%k涰]555a{pD3~(xow쎧Tau`6@Q`QZ R[5.R,{ p!fukLFmߩP:D9I,y?aϔ?MN"vp>^/w] xHx<6f^(ȰBxnb,-te4@Āk6m[VMѣ+l>v><1"<Ԇ t~/A=| OH,I~Tg,J-8[Lk. ci^,>?cwHd$wwrT* *iYѤJB @J|ٲ7R"!/&DZn),aǯkw{Y$ȡmcABuB=zB$ e ¿]q8iF@ , MkiRfi7۔ZPmj3߃}YH}rհ4@q!VTp$l=a\ D,Irq49V{i籞k;< j ++U 蠹—ZM6jĄ&MiMF߫pѦqnGףk1MTkc0TB,~Z9 nn%T7@;!X(bJ ʂ %iCzA wf۝8)6[-j{(I `i1 H" #* *R*W C۝Xv"#`FVe{Rm!wS{ 89+fAX T8ֳB3()J ]]| o0bp?U'o=z,PQQF@!{()$FiJ*)&OIi)Yj+'67jje۔e źfQO>ΓFko`BnГOK>rVubȪ:X"ZeTXhJKpD }Me\%8MĖ=N.Q-\8W]nW{c@Y)&V*F$djLL``la\R[;iwCMi+;t-2ZNQq p>q߷>o8>+$ b 0 &@qO\_nJlPm"O80%5>UrI_yr6BjcBX?q=WE_ByLjbBJLJ)C2`}#Qh5QmBPIqyy49.i\ƩaZx;IᇇT1*HH TV1O )R )P)!hQٖ'KD79u\OWm:3jC kƟ8=l($ECBVbUe(qp!D7YyiH}F[nRF۲HM=8Yj[7++`IќK߅gN!́ڽԩڑ@P"1((E PU24)hZPeqDCM!i*4L gJ#GRG)'^#+;Pv G(WJ0Hi"lj @QIzB9eMa؄Qc¸i֫8pE)8«m}WΝ9sk,P VPkE9c%&aXtS 1<c\Dj jX,8]˭\U0G9a$q2vc$ x&DJp*hI(C)-`ғd&ľIXk͡!)zt+*vڑWLWZ>'NԓJh+f3*cZ,++S;rRf%aF!4 $ʉO؃ %l-!kRvwɰi?Ot{xoE+@{ cL ZaIl;YSo}eÄW ۰ R{+dH<-"Y܅[rnDlMl l1@֥R2dM2jm 4rJR` k44b$7Ci,Yl'fb A l T*rjiK9,@90Q@yY%dN*P: nې:',ZG'SkӖ0a)cl`JYt5zV"܆uRRa!sOhK6  Y݇h !)O߸Z*) =0Y7E3ETNr'NTG@T `q} I a (FVl(ʈC$I7=8;tds`1$ mMX EW4|Xa 85 6ӚLчe nkd|3~?4H Q6yY`h!u,[0^n'LK`݈ag  5؁+[8NNS|{l$L"Tq@UUJ e[I!Æns$YePlXO e*,uWv?gy$odUY", $wՁEX7Nt]*Bwڷ4t6@7)N.?myG|ߠu ԯZVEL`) EFEh!f@ln5/C]lMJ-:EZG 6mL!#ae) F!3ܸ,nɞ˺=b7U}k_al.Xw w/q~K + *@!A"ϯEA*TDWLϽ&}Ki\/юEa ʔk)r2XwV+|OG7ay1E!ݴ lAv"",+1$v, k bw]@$Ҭ{{yN]7HN&QBۗrv[M$ A HIE6a Ty5TƦųk / m݆HBr)=.^R.*+١z0y{"'FCm* a ηFifHC(tI9Z9]*-4UA"ȺLpqL*֌MQXbTRc)WaPM]Dm[,ػbe%;yPg۩TvP-e>qj=`sEVư QaR*TzCItZT(,1NBh͊PmԾ ,8^UyQVyRV`zu}ǫ:"L<K,qjs1)I@[p2ɳTv]G]AX[P3k)<,| 5Rn)J7=C<~Gys;Sa$Ш,0M} +! 1k3;f(mЬ&QHO&ZS l #72Im.2:8۾X2Qw[bdJf1w6펆5MJ ۑw(8h;fsy;ÕXbt۟NUduDX,9IPXM0P)M-qۻdы6}G Ϻq/"أeg.H -4hD9Svrq$X,(U8ٓb !RbdIi +$ј#I)@NgK B[jو\ PZ͆2Pu1\{VA ARbC ΕR嘬mRe brnnث ьѻ:0mgvFx8$Վ~BO'Dys,fJT ܀)a!t.xS!m-3` R ,x~Gw 80D B 0) fS$(AbKKDQH(aaDmEe3B>^.en$6_nV49YJ{hƕ nKi{!X5@䐩VUXP X69F2$7qeLVbbTR-8k/q Q 0F3wݼz'3K,֎5[͚My/3IŪD%b#IY iD, # %$*bbtՒŠe@<;6L[yQ*sfx4ug$XI& TQ(@]U\ӓ $+hc]%35-/7[ىm殚hf9SnL6\HIb"2ͪUa1;INIB#YX LGojF=t`\hش':wn?sܖA}`27[.ZϬ&0 LUk|ֺJYqV}}+yГsLP X-NȫB\O{$5]7gSu<эl(@y@!->$Y, eTvXTI}f McBSP dkwVY-Ҳ9 %nB6k>'o>}4VHOkXA1b*VX"E)RQAEYAbȫ$X!P((Q@X(( ,PX*ńR~t>CAV,$2< @Ӧi%Dj-DnJ̴\#>zb4 ؿ-f0'@c۴\RSkUjrIߞLqgqk*w*BVw,SrlLG)("oͻa'7qa5~,I!q*e4FW ZCSߧ dd40:#eBiXʱ OQPiA D@@ Q&ض Te!mP*_#i)msf=tv>^߮ۜUg6jEj<V Dv, -f T*3RKPY)4YPNin.ҍZ֪xUqO=O?aoNH,(VMG@*IP+8`LWۍa˷i(2j7S?ˑ', ݎ҄V}]J Ҡ?9|*I6@]E)$̕Ei1+® H@W ev]R&w"C ljceen͝l4՜'z2G3}ӬȤPR:A%dV*UHF+=cL5y٦Uyn[@+\f]fggk+1gQ5g~7(SPUNLDVc q*ݺ¢AxTa ZX/YgȘb HQxKԶK=-pYЯ~͋Ǔ/sb[VBM)2R,%@+ l8ՑpLIgbS(WegfԵ[n{:[k-wh`,Y6˝}o=aox$H@< (ddP%TE)ilJ VF0<o%\c-eS煿+6wYe4P3kQ\Npik>Nl$ Z(E! Ř1 DI)JX0SmL ;.Ě[B,Tsji ҲpLQ eS>nO|sHO>iͪ! 2،6̂b8m3*x7kkݖnة n#6S[5ykL3>OYKLHEN(f,Iiَ,"$bbhf38lՈ]ͺd K=qwHؗ{ COtZ}~Y+HzC$L3jk͆-H+nSpҒ5et˾@E)h-\:Ӿq "93 `#TZFU۲UZ4sѰ<"=;<eE2̮ڣvrcۧ۽/r2qDQ (T1PB E,Y 0 1KZ(}rgpPň4҉%`0`k,߱hMŢqL$+}F8g'|mÙ4 JV"̲Vsd4XUI5 ]Z %'!%psgH :$b,F fǝTc=owu, %NWAk*L@P"jbdĸQJaeupdWh`g)7X\ԣʫE z7bB,iC);d?go-wĒ,ER2AERCVe&#RJJr JxݖM[mZH/{-";G%ﲮ2V2~[oOaC:U:Bu-,QGʃ dJP-B`K}MłF(CIBV%mB JH#Ui*ϫD3~wГ ER RqdVeQ"jLa m EH{67hle6<٦RZ|y66H(1V"ł@*I23WYC ]dU0f(ؙ(۳1*okZ1cN١ ж#5dYe860Ϙ" f 6@ݤ`dnIR]cXc %4&lvыQ{(^r*7uUd"'):!ҁY:!UƕL10)4ILvM7IiG9.u*N "TP. EǶ+u_f0bem`A=@wWSƍ*ALʱ/n&_3koд{^``U`)*,&2@+2+ P:nO^}! va7B6 64dU[X9˪o<X_ߜ$@RNl!"ÍJda$I7-|Lg9vD2T;˲ BuCK smĖx"1$8V{܏|S< Ԅ'e T:0ꕅb"",RVe zT&0I|9Hzi*8a %dq/MXC׉-υCc]v짨['OY l5PCVf9DkXvB\DrFI1"HJٻ6ĆiV^!81-(hTةR M {oB@ϟCI `TƱKTU*nYFҫ ( PT$LPi+v,ډ)|餸'%;xA@IEvV)ԒTL d(duJdEd mVa HDhzܷ؀WfkCo7jaeJ=Im0SO+u6HbDN.D@`mjQ]+E6[ lJ̶[j^̷L1Vp;TW! .ZQn(x6#=K> "v:0줕 V 9TRP,Z֍Ĭ%$QI*r_ulbvW.n`,aNHf>-l7wR,r4=$ А茝 1$V*PbȡTQ+a*Ksj:Jwwukb6(NLṺܖyZXE;0zy/E @1UBYPX"+1 bkJCFUGvQksF0 ;]#5h=j(mۆ<4q$O#p!$& d,mSdْn 7i-i"IDA%f5m[I6pY`\NX+KJݩTHIP%E,vjݐ bC++ކ-IY5dHL6 dww6MHh'9H;vwKɲ(\#|v_l+DeO7SH$NjBBۙM!!mrU 1ZU-BF!Om,e6UyvN !Mg,扉ZbR3;$@"O~"_>{QВlb*a"(,d$ a1(l $"anFY)/)f8 5JƆ+@մqO"(F'->a%$弬 X@ Z0\Ŋb37f(#k f gn8!$*eq9,XNY)e,f_)h%MZsG~.εuh@3(ֽ1k) Q+4P&XD[{{k"h @Szӈ1r, h_hXuB. zeTATOS@مV(Ft*ejhҸ)T" Bd u54xRU^jՐ[,0pnm%#Jx3k3R}>O4BUF(Nld@2̀*Ơز@mwvi<9> X%3˂TsCͼMIgPP"Հձ1 PÂ/%i[b;3R$0#P %YAL B"l:m,ZTH*hJ¡ R=TE k{)GtOsXRvbsim'-UujJZcXQ'`?lV'$BC1,EِY)j"I([Y+FdBBۄ 2"viYDce}K:Zۻ?Fq& QdHE *"$PHa5MfǨ,Bqj`5j w&n݈Bh udڋY;g7cݝ̥ONc79;+'D0#j"IX* PmYEҥBbuiNQ*"#e AHq°SHV`XpD>w/ܞ-f:w?rE8P2ytgstat/data/pcb.rda0000644000176200001440000001264314413507477013563 0ustar liggesusers[y|LWߟDJVA4$s' u=L&!9#*Ebƒjb˃TWZ"E)b9'כOOO>9{=sgզ=bH?עg:?>?K үo}&49ue ;*dR[gn[/ܶzw-sk-nyǻnp_}޹C# Z gsmidl: mVm+x6hRhqU &m]̏ܶYk۽ܶ+VXdsp[6Wx +׿pNk5}tr^--ns/[dZ's2Wm':`+ݻmbnU#ۋ SK`v0yW7FhYS//l=X׿̗H 8H#jB[~SѳxnM1/k򬙐7ۆwvʇA|R;%7 2[ Ve"gmp/.7y֘ V4j ~= 8/npC/6@Gwaf\5W.kk_k`O~=xuq-c^ǚ6.KKo{\֨VjŒ ;@^56+1P,\e/%#/~z수zUD/rkcg=ϰ_"1 MK=O3 oFrH9s7͘#8K`fB=FDMc}KP?ݚ{c .q)kFܰQFv3wa vzèӵ !ˊR؟Vk1nC+lnuɗO0;g?|kɻt;rVcC?kB?2\ m ȧkud[m8n8eĨ}Nm'r1F0\|7B}DL{y硪8Ux85i^?+cG ]@ooU/qZ>O guEgޅ{joop={~fN]z]z{2}="x0 7mTȌ;\pt Z@oz\y*2lTS٣{*)zyZNqI/Օavi h3p-wؾkxzw߁7t[;з]#}8~س$O>xK N]c=NA}x.s56j^^e[s'>iFC~skU{녪v:Q7pJ[G` 'ޚ޳ N w@<@g= ca>K)< -n{6GCD z⹣i.=ڨKPŇ_e/H ;k g1& Y3 `-j y.|j79hz?W oY-`-F޴a.:;nV^ ݻgMف_KA{רW^'t;;||T O[@{dôm7;Nƾ0;^ >3>|e_'<Σ,ss?JF_NEry*<7dGUy5ijMc>?]]Vl6OVU֋/qFg׵2ecO1Ųڪfc>?Ä"KYk_Pns5OMzd5M<%6Ӹe8oy4:1/qq'+kLr;z/i^?ZsxչZ OwCPeղ}9'i?r-Ζ4VfiJ}UݧDmM[}=s:Uku}z/Z>:WUz_p˦ (d@mm퉸0}5%+8Uc'ΘzuU>4*#|E/XgӘ-ׄ͞lQ >&YxO/%8̭ӱ͟R~~7Lݶw+-yR豊ntZASvEO 2z;]W{|_L;)UjƳw:r(7kJr?CM4NACєZHrZ#$-ѳ ViiM:Uu^Nry*<YG:2᧗_76>[H5l'ݯg#X6gk1S<~^yv:o>~6\n}4]q%r?i}o+a'/敱>uWEup,N!!Pa$ Z^ g=! ^hh@9NsS)Sn۷nݻvNVJYFԿqvfF(QQETQrIPpTUERDA` U`EAT E BʥDU<Uӄ f%e<'$8I5ى#.C4TˌUE1CPPĒ23R4(8"*#PEd(+"ː͖H*P1*"A N),DENbd$Uu/d͆ @ KeT #4R#5Y%(U,^c$isvB@ Go/$ۂcBv %! I5l!LRBܳ⺤ؼJn,:{tf0-/S)V4!1גHl|SH)|(ѭ=2o~!^̤{I>na եqdd0HFS\F@ LãL:lnʩ,'gg~iQ_ceLi.`Y߱aqUYb\b/+SnK{QQvd|-%it6[]9+m1!<sѴacLf[;vz (&b.tVqv-JE=jpOבEb՜h[pÏ͢J¦L!C8BxB>淹]YX$ Y@k>ʇaձPy3Y3}:K} l=涂Ў-mҳnx֓ׯ[L@S3/جJxUhDDDDDD@$HI$fV)}`׸뮺\_Jx:@dwZֵk%@Z*R)JJrJRZmO5.eYenZֵk[8Ȯ뮻 TJ P*%@TJ{Ӄ챘.\/e)R[J*%@ zJRKT],Ex ^-RI#u7=L˾g)P^>YdIATa& G'TUUk:{PQ;4Xz9rd\nݻv۩P*%@#i2Ojr,000 s0)F TJ P*%@NT)JR儷9vvL5]u]wn[ g0uc0` LdTJ P*%@-Ua߿~qqmkZkZֵlw]u]*%@ץZֵk%@ R뮺뮺TIެ;ZֵZp 9UUUUQ) $SI$$INI$I %9e'J^Fx9GլW"""DDDDDDDDDDDDD@?q:%u]uݻv^E-UUUW|:fICB9l:rT= ¥H$N$ &/镬TV-3SAsv3'2 ͮ%鬟}N<\VT)N|n)ڽ53?)(/=u"\!EHŸ:H?hYf*'h>"(G; +;J=ktM]5RcmwbH]v6\ҧ3m5&*!ݦ\ضMuU7m56݉555M֪v [wqud]F]7[Qj 5i[cEujݲj5XG5vwsIȘUرōtUmXUGwWFL\Iu m pۭ.KNP-ZJhd*۹a :QY.Zhڢ莻+㺦[nmIxG̍Pd(MߺMܱ8w`_HoVlfnː16 mnE usBiZws4vs2pIic7ȜU{3i͚겪ۻN7Csmfm6kQ&V+¥#,pe\mHbv_ 3]X4v,Z{&bdky ^ɶug`+ LCpٚev|^dCxLT Za8ݛ{jZLF+Zna^̽ݗA+F}5FH:|6ЧQQ*lX0w}(kJ<l6f-:k,{P3!M >4][3|][iq@bu[fW;ڦَiU1am83=NJ%.*Q,Hól+B,jUUTFu I,!X8zheeCMr<̣$#9WòGZvIe ERVL3HHu4`BBQwRR"ɔeb&V!PUD=HPȋ$$Yݨ3:iUeU3Ep3ebJTS(PSN  J@XXE2aPXQHUR j\X]U!th0fKPyItzfQh=FVvyhGwXh5X4/* ,Q*Kj-.,茥!"lh 2J b FHHAEJ=8X(a18V%iۗ9a ,YEI(H( dP% cHQjBH $$ɤm!c `p!o3ZsoAP47M#nn j"޹6yg'n  m񾇅uy_Y~46v.~ƒ%f╣a\M@KH24rÿqgx~VEk>zhub謓]>zv?ZvUY0S`ahBاuXg9 =^OZxھ;2S'u9!xm Rk}G 6{/V^pSQs\88:g,&Gu^UY2Niܾitz2 EѴsMotچ tp\H|*Yق4{MZZuCh7rMvszN.Õ-XHCC$!_4 V%dXp\Ib))rA* Tx_Bt6$bADI$k=;1(/)ut\HIYU@Q!C:䦊6c %iECu**e_4. sT}Caߓ\Ҫ1TTPE"#TXb`,b#F(Ļ!ck۵]e &[< VcNc[alsj%3 + ~)I9f5rmD3^R=ٸӵ3yE$|VN{;$Ofhߦ4VR3ܮW0H+ehPሁ>G/7GS|nengwc4DaH!D7P)xj-PnViۭ~} |v]=:D'uApB=0P0R-[2) tD cP`1/nI!廡ªJcc4~=bg#TLUl ˻n-e|~n ϖZml\ɺ\p4!;6FR 9!ևꭜ݁1@! p& jP!>̵%v)ν X}?,&K4ٟw^fٯNDu-m%hOپƪER- џjѿ,2%i.r~?c/rOziP)kl9qPTR(<.8kҲ%ZQo\EPÐ]⓲: U̮*?>)qSCw K E3_ 6NuĽ)iYVYoSs{D/7{fmAo7PiF,tal@א!k&ӆOXqcʚo m:MtlJR{)X޸vİi`iv f~^Ʒ;C~]rNɮ0!O}k$ #;)Gb8n#%xU18'>rbb]SF,fbC[A18ȡNc}LhsXQ87\zj\U£ibtY()„98gstat/data/walker.rda0000644000176200001440000137570414413507500014302 0ustar liggesusers7zXZi"6!X])TW"nRʟ$85EҤ :|Nr+(}IKMel6+B闷bJ;K̫OM[<åLQUWW^7\r6Ƴs"D;b̟BxQCu%Lrޝ39ٗf ;دPϨ`>ωI,2v ֎SSBB`\k" 4igQK1UtIhCPl2]=>}WZr9Dq6e h̎VAm"3!<|fvqXY .Ziݡ<բ́}$iq cRYw GWݱrob- M-%ىJiFDk|ނ G0{gIxAnqe=YkLװI5rCp5>UC9(1`@shnCcL؇i 4Ja;84ywOLB}۰83`~M _ 7S@5l }1bR]Jc\iy> GpDnmvr5Њj n O~&6hbuwYi+Slc[6gA񠨩}[I[n;{L].%W7R#,tnEFbknT C :qC޻m24 ߮)Ow5ڠkwz;saOG=;`( 5=}bZ2P%g:)z'gT+5?m|WwIPV %! ]qoD e2`l&CT rA[`\9CTl|4*EC!MM$af֦8KT,7Z m:{)7MArN!`o'{,Ds~DX!WA?hгHf39ɹQaqSO+sSZZhG%2/#&\x2v6 x#PF5SR1G7Oi 8p0M9,+3J|ZYrCӱ?$7Oןs/*E3ۮؐRn86CdvKۓGEOnF9;tXxQT\/)_"f(Ku5isc OP|u25^7i̤PjĠSb2^ޒ3AŃϫ2С {FłXz*M\*"6[>~/82a>}Cxj4 x),z9W[` *# ֬M4>C3K"FXeqD/1- S] ǢQPܚ\³ia4^iYI XGp5 Ypw]|#oEPkat'+e ݾHhEWEqr;::ڡ&,cZ|2;Ⱥ~ᕧi5ST- dF Uncײ6Ӹ<V'9Yv̙)MԽV;Z^AYYoEzjma9\_>>puLueOjrX&)7Tb(={|#%3.zXAZ2@cByOј-7`\-x" S{=WJ9gU5X;5|.;T;2cvĞe8/>g ;atߢErbyK'$,ڔ+ek*}=-t Y9[(n>:xNۿc]SW^oګOh@}Z7;xIf1i]Y2 gF9X23 f2_# W;=r3u/I=gQ^G)C#sF ZYaA`*c$ތYg:պ->8wCv)oܚH,@2;%z +n{·(> Qؠ @W2J+[t54N;j1];&?R)N;sR;s}3=mBC*.qdx}S/7k&aa쀮>d3);|BAbdDGAU^0X)j%G9ƋMeraycJNl[EOEOPA`1ƀC@ /=7ي9{ 8K+N1ڢI)d8E͎AGL2b-x-0+KI9Q-°~ dipȤLdpՉgJwk04NiU*0#Ps8YN 3/9=KxRa , XuϽ6i_X(gOb>M*|*D 񩻡к߉~+Պ'b#XJsl,MP|ŬJ|]E|MRX|'_4a}HdX?ƙ&5.FMg5%tز5k2[D߁A8tsMI-pp ;Lo\{{n|^o fU;-!sATos>+~J_z? ԇ%=gǐYh-IA ~ Nն[}! L(]i_8ikyTdjS7Kg  p_TcX$'Y07̼$4c;QG`~WEG1GRW6jv`Xr rn~;l 5EqgV)Z"cd-.grNvK0=e\*Z<8ʞG ;a(mKGP;UϦt_32;gqHb3 AuBr/i)꼃n^*.P|yxʕгd! Mк))K"1t_DXX$A}uh_#9"OnNK = -t.q[[ 5o7 wP@Z !>j!jtP q>nZG(4WO1wWӟuR~2my@iꅥ5Qe|Ȧ/f %>&qrOj Ų:U?ES\C'V/[W1j=#uB)"4 5w4c}*\03tFT| J릃ǶУ#e[~opǣ=3s>+̥: E7k(O[-J*jIbB'iۣQ,1P͒#;2x  xY%>h4gUMTQxŒѻBjCJIH:YnBJ/F%f bs!ͫ 2N ZE"]ۉldP$\\™IGZa I*S@cg4 O$/7Ĵ)fH-~ED0,P92s>Yva59-gIXEbt!,r(ڈҵoRuuMU.Y 1Yd!" ӛW\(eMƓNK 8z3jV٭u4dyuRB'Bzζt$;]v3yX0 n<({6޵cV@U?}LJ K)6V@BW#Ǡ/ pNrRPˬWX4]3CiAf$M_,ArH!2"̀A60>YG};q_5~M\Ȼ)\Ē=]vH9Dcu l[qncʧ}2M#XP@4]<$LqL&JJy\8"58) ~лM@35Eh5ꔷ\8Z~BnU"d},R+v1LAljvXԖj[~w}-XڎRG(>;uƫ8JLRݳ}]С𢴼$Hgl|rj&8LЂ 3KRpZ"Y^+üb=oSmL|ug {a0 FnQ#gofLW`0)ifdI01aShl}Zn݌bPljJ\f *{)p1 Y5?mUP5f\+5:=WX+LJF`~?cMb_>1Jg}/2I 9NCAOG̽HQ%vt|[DJBl,IX?]]#Cf[73Ĕ,sCs2 c`ǹȌen%S-y6{E| 5+mHHuwűFɤlGgz'hW2}_!қ=,~g\/#ZwGZ(u$<¯3ү$Prd6x#p.y,}W5!@nnclץ?M7XqJd7CdkFcb`'.*5M0j' *; 6X^p8uh/WӚOX X0\pc+)8GCGJO3u0~S6*vzOå3aP}0{~=e6Ȑzsf7?-N]?U)vxL~=iDDnIBSn8ŋKxk xM,sW9J:/I7mk 㷯'?j/J雀HnPGb<6j,rWQDؠn '9'OlVsiKN;\ eUlZ Yg\߽@dz_ |g>)Y]ЃU"HL>քHn޽|$2[w_mjM^UmBb8dF%!/+,j~HAO!O2ai 0ğךEڐIyܮދӒ@\_xӘ+glJʲdXw.߇=JHH}Pոѿ:ku򛯊/L3oI:P'|;7/}Ghw0ŏ4^Ys@a_C>Al| XpLymmZ-1~(O%,u7%>6h$XK+4&H4b|`1qN} |CsVo1$`4 ,<Gy$&[gՈ=Js}ͺ0E,' ԡL0dRÞ0I9%I'V3c.Pߒ2R 29 <@Eu oocuTGZ#uz̚#4%Rne꒢x8 ;O$0۸Ǹ~H!90/FSM*b0zSιYE>TY;b>[|'MaYds.?=%1]Jct:F}_b];RJ%9w:^vp-4CZUs Wh%' 0 QDG {[[E\-'I? 8:`[Y &}-$YzSu;0ɾBc ( " *4m' ola'z°훝!%`o qزQZq__H \kҙ\\5A=mQvG<\R Fl&u%Cj5螰M*;Y)"raLJrfa34䝦 qAMlFX1}X]W+A} 9jՕ93kCP+qs"t`e^ksu!ݯ%0\U?.j90d-,l=c[7uՙOY,@sEUٔj,=M!A爟J [l] U/}aS/^Ț E{B>|Gl~EvJ k(cͮ#%Uܝ{6.H9&Δ b[*E[A6+^@Xc_:ߜ˟ڻB΃ xU֔CO,bk8PƗB(6m>A=C_0h"NFFf=ЗR!>w8Uv=;z` b0wV#ꆐ-6 y߻(!5!g_eRR,z+_Jۙ2>1=?NiZDŋE| G͖C:H4I&yxUmDFC 7j>[ d7ꦀ ŐUl-˩ܻ_ Չ! pi1W>6}<sIR5ETIX9 ܂` mFю|KFGJZ[t xUAD\|.#B*&xtǍZb[''pb|ƒԝ8ʕ$qQnmyeFONf 0*v*@3 |С2+ڌzǝ kVi<)yV%>080uӪ05[{8PUBg%1tLHQ]jLeҦ0#QP8E8rY3.J(t5 ҩOAH!rx$I}3;04 s8ۓ9SD:*|Yq]ULW˞s}_Ȍ^Tl2oH_ĻD"l/0M'40L6:lyl>QWdGKq8,(s1y@bixݹXt8xqEJ)*Ĭ):4O'}^!Ȃ?)@7 U+؟\ VWwd|܎΅n=4ְxџ5=)?Ou*سZi]im7My2W]g=HCOfygaO6`WR$MQJL2kDk8 ?XkU|Kϓ>IÚnK Rw(&@B!O%Cx' Ŧgl`~.䄞Bf7:3!faKBj>VHH?|vJIqSEI@b B1hYzUY"$GBJ]Ü3@=ib] 07ڇ Ưhuڌv-j0PfJHkI!XB#{w/|,܃=:Y:o <"UmcWf Шa흥 %C-%"K6gGfE&N1$zu")=㋇'}.kdžYqpQ HͻwV썑(Vmb'~ψA ?3|ߴU-StuX<Ÿա.g #AՍdXxw8"ú%+[}Q?_  ECx ݬ5j$t:&(AΫ!/3K>7O7t1b/2qY9u7#JJ['{eQ,FV.5V"]TL{z7&**9 V0 f}=.!n;}n5?T鸑z]8aFj$#&Rme 5s3/hpL)EnYZNyǃl?@N!JMljj,Nr ۏ04ɿ4P_5U-y'I_ a" W:>9BlJT ۧOBg9RL˵B]f\1u%Xbr8%EsaA_Ljc!,߅$ߨ5m&PAp]gяBaU>X [v[Fb! \\Gfj9ܻlI"|g8FnԹB>6A IARjO{Ń% ޜ?as?4vA)gگc-`TgrRHSSM `vuتh]x)'0Hfd6̊D> lni:yt۾F;C+8wҮ OGL&A=nAsbjwZ-Em󍪾B$Sr:)LIyYpd)҈DEЏ UY˷P*9JL(0ηl\QyN胤syIX.1)ZGoGCigilv)=APMqkqCioQP R?Kx540* W%ra?;%=K7cTᎩ*HĶk5l` U O6?."Zs”vhIEM={ KIPz#S ] <;<=B-0ؖU0[V ;i֋r *I }{5+켥yҁKIyNҹB80mL=pٹ& H!c{RrBim헑Lukekc8q8zTd>qFO2K쩇`mg~fOuYg,obF%u[ @Vޑ'N'LEdmU˄JF2̖Wྞ&,Ѯ` jua.XOB!4T1r-Ϣr'2Kv-i/nBWF+z |vjvqQԥDweLh,nɴK} | *r/ ƆrXˆRnf[d –m>qtgK܌6e|kr^l5h`|lR8_qU~S cKHE ,d3CP&l BK%dtI@O5HFBS_Kd[=*gL+RsS߱96: ,rQhXoGۦ2T6m\ 8M{0`Jv0$ huFLqʁ+J6>d[AX1 1[6Y.h{hW; f8G;/i[ %|]l( _gy9 E37ٽ5~[2rn&ǩQ}xwaPӽd*zrA$N7ϯÌSk -gd?((<K{Μ^đ@7Qݾy<;VOt5cZ{W(F#F[6'H Y5.pKNڻZ4BH bUݚR89Y>JϣUR;lIsM NxG&F~8n]|=bfka~RǴ7Uжl-X=Hew/ 9;H᪣]SN˴¯ dca26Az HAbO9Wn,Q~+(8 0rm]S˕졃w Pe{*ٙSD0o`PTz 7cڊ!E1Ur (VUWd3ۢ?]t'G1Pg~ohR&sCZ=đ"7[zXyGJTq$(ܕ^*D؏^zcOVoW.sNLh.~xrRKmBs̙f蒜(`xs.L#WAM-W_" znU!kv Xsg۬|y,3k&,PδKBɢstB^%cz.2;g+IqHՅf xt4jR 㣭|Y3D)d_IWҘmw2敱,Q( $1<GD;Ŀ/p)SyIJ23flN$\[ۥ*PawkC#\o3rTmadb X>-4|y^/<#+-f%oE wd@OcFG4:6C%QXsM:J[隷*0=#2zJP`~a7C+w^'gAW .IK̶,WaFqs]bʢe( 08S7^?Ω̈́iwߑHO/7KxL8x#4>j{iIbn]'Pb`ᆧ^P5I4͔g. JwX̽, ֚0h +'+ H(/V uǣ7߈鸞C3LA:k bVȽr?#eqv:$eJMt}  O[N?F>҅_)kYZwlHYV }0.<&؂YǢ<tp|#iq .x|ZSҵn%lb#ǦgI(29fC|  XfD:z`0 It2v4H_`5z*l%ۮm8k}88]$!]40 A UNmŦD(=&@\'ny;{"'A#^(t`rӫv]\&uTj1JϖSZqlR8%LXQV+wc3D^5գbmVނHDGpCǦ,/ EYݭW4 H%;ţ J[@u<?éƒl:ͪv2,'1A)=ְV2um`pelj2[=l)nnmJ6K-cl0hogmZA pFy7JkͩJU!ݰiw-k=7)Bd5} 9 &WGՀle8j Ta dT;0Pf* x?eQqE>̮&6ŝP&ʰ JFU&U4pcs4$Ϗ,FZCh;9;;R 5F!6tW_yB}CP>4`63mrxs8y _`A^Mڦ?\fۡZ»FO N}qr8ɚX΍cXn(ԇ9<(k) m7avV/g~V2t8Rm)r)9Z=N >mMQj;;;kfY9?5_oi/tlœn_5<6 p]ѣ5{@M}$eQz-;ޙ݀ (f,~#|DLȹjOܼfub]V6 T]ǯߦm*q,%~ ])b*g96:1~]Re>@\op7`zxMDdVYK"7)[S=9RXDLի ?:[],MfiguvC`KKspѨŒK)xDrI8ЕH$ٰw0շT jVu?DK/Jr~ݼqVxm&1?,=g ,5oXtCa.,OPX{pֱ]KrGXf^3WDX9$(d}'ifwAdmm`܋rFNodh 6u!ɾm4QiB'Npڈ4YY"$8OG@lQJāEbRҡY-}tәՒ֬=7:I,[H q/|=dN$& ynCl6LQ|$=[GfPLwZ^=k-`Ry.em˜ʖ"i(:ͱn6LR ePDUh(1l7}##ڳǣPN]ݖdէ{M΢䈢g˭:v+eC HUEz+ +* ˚ TgEBհ6u&2ݔx }_\NNJc732awG:/R4>jMA71`<(ક*c;3j0ًA(y닌}7h)d[,> CRے,[(vʹ',RȖu }A`6ʙ dc& : \g3-YWD[2 PV/7/)M?}*n&Vz]-yOZ[)C {֚QŚ/;يR)Dcuh1ֈ\~9ٳ]; /K]52GPɜhbaw7;*xx`@){Ww;xV* a~W51Zxݸ(Nu5B ;Qԍ8kB3D*n>7 =H*eG6AHPyZyv,n|y>4@xv1>2O;E^#?GB.ەI܈壈(xFlգ|C/x[5tU 4"GޙYԌEwabF!;ݚeZa'5<'|"tT5G62E VK.ܷ=N%=Z4rHgL1vmN< k9T@TqfsY.@u+ʀfC3$n8QyFBcX+d 8) id+yqHur&3_=s$[s|_>se|ڳ/_zb-Ed0>JB tfdQEMcRdHDbNlZr1mWYMHw1V|2nY]b H3 =Rut],lsدEBZ-m ׶ =1X  s(ShF (,pQ ʩ. j< ,, xuL~±o1"rW "9Y 6ʶ #/g|& ZqK g3:ਁ~ᑔ sC1}w.&B} GȒ&Za> }[d4I)~_>Rcdҙ֦*K+⹤j@bg9fxc @Y3+HO 3 <c^{&tÔq0Eچ;,}=ڑ{UYCb9ÚP RYs(Ұ/U*^2n3ZLNTd)]g´21I8P1 UGsLYiKA,.fJE!W/jR}7a֚a}5reׇ3sk 'jsNU@I@9,Ϭ1bh9+ʫ;G5qe>@9i4Q K0XA9P`kxȻ yhPQ^BB7tu*+Yc5 jgӎ{"+S3aOG4(}|ʳG]PM-3<:de2dRS+FB!P({{zdK=#BѦsRಿE"{AJ\݊4_'kS7~"uyvv^FTCPA~&}5 _2xfSk!SNH~mj h4@3Uv]]cp,weg{ kAb"X;/ww$G u:<8\ߋ1WE=y" m/ R@IpvXL060뇉F& ׁB2Cy>$.+5VõV{®G;:2l~ gݗ(o=h"1 -.ۮjJD~/DtX*e+wkI7L6>8^2o{ac.r,^}&ȀAc.3qDVYMвԊYz62Zy}囻fܯ,sLڟ(A/nAA ^ЀoZnA^˹r[p'Z{E,q`4wc L:N $iwюaQ2\w( hoːGRuExrqF[ gԹfW3ccBhj2(a|o{g߬#UqBJ'1UOMx4nի d%T{ aXZ;%X!RH*7@J@v}IDC ?;‰_;?bǻ>y;IvpTLjXe[mʇGyֈ/M6D97$ !B#+ĆiXw9!M5UpAk| G`oU80P*An JQIY0[ |!B ax$2Vlx_|~f2e ~{M Et"P@w(5_qr zY,۝TӤ ɘu3!7Ìӕ3Aώh\c3;$G[s#tS2F =3rpk}'kyiONhSz9KIToDjꮬՀJV<sD=^(aA3CD}._e7N7a#}$-]qnɱJ{JE+,S--JE9^ G墧eQԉ_sm3JN% }{Ls&iCYj285BW7lU8еٱ˜bfa^fIZ ~J+Uv p- _IpX#לGPi)[_6UrRŪo{/&㰖̝Pd?%쓖5EœaS/>s҅qGI 2 tY]sʨ?0' gƋjPBP^8Hgp{M_0f8bHM/nߚ:㺸E5V"Rd8yPJG:J1V숣/Tՠ+}CfM*th+gi*t # +BWjK:LF!ĈSSs:jt_9d=\uupc,yA^mG/1&H$,W610%F-bl4N\ޣ VAꘃ| /ŽK 9`:8&+I3謵Ɍƺw"f`υfO$؍l  &iN^K !s;L[7xHz赣nid8C2E0Ol#QE1&9'Yᦑ=دhoܹ ViL+MՂ>F $yg"0_R\ԭZ,c>@@]}p&Soaa>̺"R0jnDFZISs%tJڲ$gtN@34H*# wcĐ&Ĕ -2V!mdv]̽sߟnf>G5܎q9bV*D_e)}z}<+Wnh}OhdSj\>/,0VӥLMjP f[m @'%#$npFCGext fcGMA`TTqRwĉRl=nZK 5ZY4d\&yJ]x`C3U;{[ Տ`P}K>zN@GRjFؠn}(~O+mϐfgwfRtr=ףcɁE94Er Cb2.6)NEN{.I -bOqp@+v3KtR໥9楙 5Ù4H_T!16 џl%;ʧAs%7yR$3NK--ɱpE;I*NЇyrbT7Ρ`;2d%(1|8p\6bTiC^wABIRi \~Ji5׾\ !go:tud>5u:nkg]NU?^Q*K0a"ivt Xt]eM6'!T۽g 兯\h5:"+hfeZ<"~ Ӥ겅5Rc~O0FKŴS (rCM}h ؅hg۬YIfpW8As ʗߛ.jXVC֑wM<߁)'Q2Vp[}R4dS Q 7#w"8J%%w 'E5TLmG`,$?ߞԕx3> ;j2IJJ73.f(%\&>%qGa{ˇwrA"aCC+a(I~%2gN^gAȡ_go4kcq3K_=XP'Ww+S%JDkls(E!o,- fmp\u^k6Fa wCVܸXX^M]'aܞ.l5Fnde܃zz_dYǢU=o|mֺ۫GH Lni`2xi\#Z®d \*Pq=]гAyJ#fξYeȤпvhCUBӼJI@qn$"mp+b4D*C v;Y3"GcHFIaGl7DX,Q ^7Tp/ ZӦrf$\TDҮ:gݠ)=6lE/)B,^SW; *!qP[Lb1(nlj(#^K9<1ߙ28E9NDn08jY YdlvO缬9]eOtPf/?g : d vf{3>yXbuTۏ0bp|9Dzy/MbuHwp)޲W952k:P5Ͳ&~ 7u*FD #i( d\-9$@ƊĹgM R='0i|2jki^ML= &g .Ca}}1Z*8G%lWExBsU|@.BX)[X +g2l~C2WV3CA`fx]G'W돜3!CJCD|Id 9kxF܃l/~]@[Jg6DDi\d}u#WprW7.,Dt}'#RI6삀F@'KWYm\k^鉺ׅAϫƝ.<%LB hJP#iݟ]x++{=A ]RQjR^scO&\2ĵ[B,}[>euv}Rh+q)ĸu* v\cLH+>鼘htm UY(;oUeӾnv(2-/" xS|oB9I܎;_ .,_ ͉y&jr bN"4k6&fդtGl=ڭC0URC88BʛX۶_&'*{>%>uRfKJT"pl|9(n+0r$-ˎeIXzaDJVU7 (2j\6;0I3`2W f> ל)֞mNZ 5 C-seU$kN6;_md~ [:3ŞYɍlD7#s:`k Pޤ[IP#] :W)cNJok .h•ՍΛE P([3^Aev y~<-jKa}]RT~ 'uCh wS 87 Rĕ2oyУs©d yEIbM*ԂNh9v!v3(^ef}) {t$x6Fg?,09M>sj &Pߑ?\Riq+~Ꝇg"@Uˍ%qags/`<*%N}s n;ՆbNE{O0If~m3It,g~Ti}KRhtEp4C+/)n*c*8]`aͥSD ˏ/n3D?D 9;My RW!S$p#.S}~ Qǧ'?XyEK8Hl]}$etQeF䗠8ef"]|h.'tà蛪j=@64yS~}$ ,=gOVOW*4+uk`W8O,!f7l?BZY$r SXS&H<q$l{4a1\i-=90"dʹԇz^No>ȗCEqcJ%uF[!gqz;ueU\e[oFBXZEdGbb-lg4AB"P;b֮ EUĈAsQߡYF9D{89vir]|, pɵRDjq&j3 z>Kq JhھԞK]kݸ|>7iYC:m(7eĢ 99pV6_E?Thjׁqݩ,Y9 s)W鴟gm t ԣ~LpBL`uQ#VݍQ\_jQzEyX zcI[$g* B=Vϻ V[PcE@KS}x8-m(5_X5zD'HT\ v4\}Pdo" {h l7 ӷ.ޓ8T%PUhu~.T0_ZD*)U_ `Y+#ONEJ"~7$$EXe6RŅx Ѫ_;A@awT#5E"IP|#2<-~p||ʱA,B1 V9N쌏\WZȸj容mR0Co2c@#aERClo ^: ʽSQkeaQD~oSV /o\x-+;K2_DFw }$Uz^Qif\}e⦡cs=h_i@\&i7[o;D }+'bbR$פ$sMI=TE)pd JC٫#†7%s(/ +,m{gc5Gǵmw,>fRxH5mk'OOtk¦qlLs=Av/TМY޷vTr`B x';|ыAX8Д-'O朼:e$ ~GeL2ut:5]9ZwNj(s %13Ov!*h4ׇL+){+qE^6yDʋDVR5y~l:v&b i~{}h وF u_d͟X3༘weRw*ξx?8SN.#D_VeLT}%+z&-7yő/署kŬc o911'i8Fʹ9 KVW#q<(v/qny}x9 <):A\j5{{\g\ɹ)BpNRͻ>>(qr~v4TVxFMs%kBy'&zo_)(D90])}ed $";D2I+ۭ*6Fo"ۆ0 #z+A3P#@_Yz;+r䘧jU&̕5n8xǛ7Ix_)(N38,1؂eм*2\E<@h|GQL)0 gDY? T(dv(Ugf8J\ѰC tLBSW#1ۭ_a&;ZZ!z\dc{+VS_CYf͑* %P]za~Miخ1 DLӐG岆IoШy' *t?D<̕uJ j, I6ysZ?{u@o~ρӷo%˲'0?:3&I#aoM`z"q##wZCJB,˼jQV}qqiفZyt#Bbs\ux9xz"TIܯdK~]9{0>ߞ'o ;ȉx3!(%΄~*u 4 = ]+SKT}LvƘ9/;UXZ``IW2nEU7#&Cp}jY&w}YYҥNEM7 4ٮxOh!&>V%KM^ٛyd$ΔQ,0­H>ifFpfa7] X^K,bd>6 xex߮X_n_Es^/ [/q0U!!Lzgi`_Xp} QhCwOZ.ih'ݠhOH2&):iS`(e= &F?ԐU5?ziًd cPBmAB,X5blBB& VWuÊOSM"r7>!fzעlHSD }(:Wo}0ax[Q&"P6&Q&m4oAh0'8 PPTݮ{Ğ+˷RmbsoeU<hvL5/HaPm!}wtyteByթǵ̬avP> yh+zN>t*zD&rY)K$E hk$rԎu:|i bT(2 L8bRxS'XSƏGk%qB$tҍȢ*ESVlc =ĠTOf){ЏSF#;p~VUx@Bz'Bo.|~yԍa \usS/> ٠ܼ!V<ٽǀ?9{ KŖ?yO7NA%M44P4oZs /}E{cYSCu&RIE.rHt8:\ uݖ(ea80b*4% e6'cAAr HwjowB4DTFu.nhKB]z̖T[h@&߽dvȄA^k_ m|3Z=]Y8_@*v dL+N"93y1-.˜T_frj}JV|ʁlӝu/HYEDn%4{Ȳ; Ÿ3ؾM6EWjo3~l,~=[23[Hb9lh~4"Bjc{VBUiXSu1KLD ONؔ F(#ghH/0R\oK|!8kN7`g7̂e0)yã !ҍNImš>ȍ"Gԏ:> 4b1!qBVjZ?'BFX -U$kҙQu.T<ԡJst<:h\k=P}{9"azlcd+fyz挳>TlD$"S[޲czB,G:kgX Eߑ8,L`f5I6E u*щ3toz-uf@vNh/&Z2G*bs%j[Kw'y-PCw|l [6.˝mŐm ޸b ;$iSOK:>_2-IVR 5VTB<5myzFePHB@jj MuЎ^c|}µ+*.a[DoanZTU6C F- 0Ot8nF=)hyT2oK>;}@Z/UkOgy b!L{'Pd~ef<1LˉFFC6H@'I I˅Yт[(g T-Svx%uKiݟZƒ2JBA[)'ΛH]L'k0=R`KB|)19RHON3UB"vjC@hhkߏG`a f"zGZ Դ2K@t][Hߞ 3i=[A~ZЫYH{Mh:-aՓ#Oh3=5~'M ;3U(c6VffzQ[ͭߧ#pD~qYq6HmGFdp*;=flvc쯒?$JY`lƤeS#̽Q.h(_Vȝ#qn ϛeOMf^BW:m75Ud-:̾N>lWN!kkgո"XꪾMQ^e\Q Y} }<Dž̳L(֖e3S$Y\D3Y[^uڿju|Gyla|E|! o¡f&j  8R>=g "=HVNON)"xDtlun].vubc=4E>[k}@r[aJ #Zͱ1ck ܁fmB52$=;!,nMՙ(he@KX c"u%Djfտ$KKJ d{"~ܭ׋MUt>8hM{?k$8FC0e/c!lS ~[^c{rPJQq[]ATM KȤ˓3|zaƹu:[Mq:iQϘiA}%<\/S>^;n*2C`.)c",{-H[c7i}k\jqy=3O'nJ,Y:TyAkoHG Gݘz)-B=3!Y&=ݪH˟}R:ٽU!Ɔ2lNG=_n_5 J;$~1<,yqi,pPM*1eD3; V flP S=l=tLlٗ&:;cVHTH[Gz5S F)2 #>9GKZ2c8p  L8gPc6>qS!p ֲ@詆(r!v\&<1.'rZgf+`*"r NXf/'U?L^!pjb)|mel2i:Jzq$NFa)P Zצ-e Ӛ򘅑נPRl0H%!^ZMg)@}G"j< h MU*>=MVL.zwi} 0O~V9M=Im# f;FtuUV{ Xjģ@JpP}r3P8ǥׅВ;Dio"Q=E}t^ph7bP{TZ6T# ;z" `ymIU nksKcEe,bFz z!_F`[z(w VAIz1A~({za4[JnXtrG"nI>;+껷?I4`O~|1b{q)ւ 05679ln\n5@h N yls1xau/>|xBJ~87Yf׳v5Mn 4o9&*:kƳb07w>OqrVhF.8UBy 'f%jWJ͵#zB eG6]69ZеmZq2$R(oSY|HOIBb{G[mXd88:v#峀7_3b`{BlDlPQy3|=lb7w&[P6z{_UU!qv܍+%h6oo?i~no[yΞ<%ZY' < ˪&)rm)MGB, p ;=KQeCM'WEٰTU(%;sUꑪ|P ]~5IDzIb7⇈[ޒKFi,dbTjB. `3.KCV+Hn[wUtSe:Lz2oB"adIQt ss_<:d%8'r"U M c{ٕ%]|8G?/0EfW(aXnn Yn` ߽QW/ uw?zÜ.FuMmJȫ%A$ڒ)w';NߵdwR[%YcvA)QjTxmE־k;8 )u3?#%׋38Q97Oέ>@>B_HĢkV'P Ҫ!ho OryX䦚'[c_'/ [n;'mSd:iGQK{EkSoM^ӈB7`-DŽ^00hث_vj{bڜ7V&O-J h=P条Ap9CR}B!RtWiG]o/1*=G0ɒvG=}١/ҘG;WL BŒ>gטP'@@ٍl? ua4Q*howq>|>ZO)1FjtS-=Dyi9y&F5bՄrcFpjEؼ8B!`aNՍ"0共2V s5!5ӰI[- GSmާIy3dIӿ9qt΅\Jϩˆ/%7A㽯CJqbe Az:px8`Mlr J,!R][2pu2,W;≊+ \wzSA4FEbƟA!ksp1j3$_Ii}~@SnVZ/t;'&n%ˍf]BWK)-r @`5z"%ՍH{,ZJwNcqJ>fVc L|Rjߙ>˫Ud=J;'iuߪ9'Q Ù I Џk _wvI7xc\7;l@e;na 6@1QMH(~:WsSLI1|:c{~mDa=x0ox+&.q̩@^ՂVQ2 *zF\2y6µ.GK]J)`5Ȋ AuLC:JbFLiSoYnF׆y8a_9E ) 2~?w:7(kZi9봀748D}m R֓``utN,ɷA6/Q(f?d[Bܢ2ɳӴ(KґRf|R;嬲oj0瘱S xג; B" rϮHh&ԍEC9Jյj8oRucdQ-x)8!j'옎ye9D嬭 !v~Je4:}"!͕S$+ k9DC#+ͷ+dO%!) DOwU9;Op D{}ͻXwuT #% , yxBK %/P?c|O` j|yldd0Xr3 uu;q5 ^!P'qGNgν =/+Gz޻ͺs-8Gg1>Ҙ 9/e@4e. 6\YpLP3u?V,0^>J0JSzPV<𗣠}e2쁩6is>,h3]t͞"}zڠʍ| (?y8j ey5m=kq{x/ޏVpvݦy?TA@fQ&H Zn3 jmgBrY$EOWna_x&+X}\>q!m{mD:E`ˤMc."w|#qeC ,|ZLwVkeeUXx)[Q(`Pv){6R=ZΥj;x펴Oyyb ~*`TigB.R`<  (<B}.h:wbbf*貈ˆvdE"?!>HolKOpet2^vz xpF8o̔3-βNUZ{j&}9<_VBMT4-]in$܍f[ HeÍHI ח𲠞Ybq#o?ߩ_|ʅ%~YF[vz "ԵKX]k*љW!H9x]e*:(sy۸:@M27 PAXOdA]bѼ İAǟAyҽE<f >MƓSrD[KQ[4ڳr NqL^,O+@)L T;w2u{q>7aq^W? ep7 yֹ5Mot*& H~>nROڽ1svFd"'s+mɞ4/?ΧJQ鵢(pc +xa@gOu'nr mBq+a&#d* a-VGPDh[^KS}C2ZpDً&s|,O7xiߝ5^,izHm>[j-Ug2Ap~R@컍:Qyoh)b)ǔw z~w fDi!t)&ZU |gNs'GCeEU;Pߪ:ӓWj0|V+laluIZESK$qgfX@E# @t޵nזQ9Tc8 TRI2O,h;)c9Ņ96|s0'_@ l`+e Vl*'"t\W*d~-&3t]Ј{ȿESA,z=Xw\xGR\H1h\v'JDQ'RGEǏWto{n~orfTɀUڢKP'_3dIjy-qnY6>TY qaHL*GMEٚS(n,$iv_DW.oK5;dA*Υc4nIq%c;Pp8E_QƒlFg w.l(j߰'D%lszsM@+x>ƳQ|רsg.$lju'*Q|4tt㲥Bm', j>j4fD-?ŽT n#wH'4OQ2;<ʐPd<nd~Ȣ9;*:Ge u);]. <,]CCg:E=Mf|*߶{م yz'}ǹ ymG_G醫 @Ur9&eWmb %DtO;lYE.[dۃ29^T6 lo;8B@3Ic@W0!! !>c#ȽPK>m^;Lo5y͛cܨYC75Tߙ@@r}H6>Z|s?23U.*o'N > Vd . B?lQ7(9G7g*=ꉧ4߄ǘ.Vlr9S?ƹ0Fz7eiq>LEHPFc gX!ksmT/WcSʭɵ%./x?J_9*;zڠZwHvZlE.xz钚>@Y1w1vFzPV)G)US b!C:7>*Tءqv-JؖISuv%vmfd2 xZ4Jڋ=(B۹#2ⓢ1vbZ_h2{[X_E\ %һ/h2)B9T2Rׅjh*ҘU~xnjBYB? aم* {=8\PPKc6nBpMQc?a7/k k(9^<|]~ V8zqhXcν䉑qy+xuE+0_ۦvUc^maY'}JAn4? qQ5ߡWbOjA".Xſy u+vdi2jw ;զt¾!"vv33;]3{N1,>T/\>U"=$)lX/CF\p' 1OXf~o2DI!@xukZ #6@櫼,/ACWd1墰=;)N{&}s'gQ\׼7&dvZ|ڱX.w3IhjS4!߬K E༔BLbָiXNۭJeX 1_=*h*;AQ?* I+(r”LuSa\'7#tK0 ~3<xyIW@0|I\b*7:F5 q̭ s3Q t'A+OV$Q_yi (/R8sOMn21~Qۨ#(0PhU/\2ƣL~N};3_I-+l~.8(I?HsQrfͰt~ u<5X'A䚶{u;!S>ykܑKd]R#wv2hud:;@쑅1Fք5嚴90 aI:J-ɸ-J'nFk!!b 2/9BDV Ϥqj]F1eBJXJ*WJʯ `2BqRQCkܼ%(ЌiZ!AR5/ȩ^ת WJ߲Ø1[W(b>|L~uxNcnZђ;6߄jog5y+m ,Z"Ι%15$-3={DC`/5yUW';N9(H`DzYW(GP4Uː(v š~<h& R9BDcAU~Uy oB$TP1ymTh{SpZ=/p *U, @Qa`l$,!4m7j^Vr""$u@P#$.Fxp;OZPo*Rng}e /2{Oakf&z\fCaA3%D8 CJ:I=-]4cZ;nsZ˴Nсzbpui=HyuA! ;Qc4/񼖎-+8_4Ftn|y !X~{[}4v*/۳yJd|NBObWyٍW$Q&Ȑ&_M.il높yu (=WDMפ]@ӢN̾msc x )1 LIk&~*kX]mheLn\;G@E(}/@1*,Ηեov\jH|\opvoF 52y!mn܊fR_@kTs]m9{Fo_Ȁ&+p=O^%ݎ _ࢩgmwfC'S0ۀ.qC6>)KOuq;<6mpQT'3BcZR?m{Z {'C8=hy%$Xkzׁ;E6=/5L@-[ua]quAo~Ltr_yJ[YK ;j!Ut3>~Lp'|7THk{A!0IR#,`$o(ڑ o"]7F=r[P?.cH^Fǎ#0w?lz+匀Y i5#݀l) v","y ؓ>3e`S⿆< }m_`pQ(ZR5 `pWMEZ7:*V^ u21kVă\`CC@VMŸ汘y}cY3B9# ュH }_ u"`*Ė[BnVg뤽Truők+9E-w:=[*3oX)qh}v_&lɳ;?a0cĮީXIF#/\ׅJ2Q}3j.xIuwX>PSMP|=$̥ 7b-');zF̆%k2 i PW1fRϼVᩂMɀR=R F`GL-]*}Y]l;L}``Qڲ^N 2]-AץEAdRK.J5aN60'XNP{MѨ U{tחm/tӆfрYjАCy=YHKS%gnvk\ϯB'U̢]|oSs@;[KSDr BysQS$ S@8' \s*'O)XLu4D*Y6Yi ;q4_iMq6VCCkbV-<꿝:HL76ڃB=믝TxVyI$KOڝA`*1徊3/$H^$kVlYkd>a|vqOQatz<B<_'6zeyg5xhc˲ 66\\5aHYf}wND_~Ԙ. a^oB$7qvE-A@Co9PMTc?R7%uu#6E,;o8%lIs2y&V,vt t;Iعwa6fC␆=ZrJcs - LpY<읆 >+E?+в@Q-G J99@⫆70Qw@)߶%:<(?wkY^u#ehoV"#ge>QAAH{[]%u-xX A"St),"KDG dHCB+mTdޗwҡ?cL-}{YǥLT>1Qഒ+5a:d(Q>F*_Dpsc>SUjLxH:~0~޹1Tϗ;i+ C RuyW8/Ϫk7lM_~8P;i!qAOIVG0HHB;^D^|ˡaRZ!Y/Ʌw Ƭ%k,N)}LwYE]~3M ?zzG %aB՗[M%GI>15 =zT`°Q]Ao<5C2 ,S@-HT#oFzȑ/l,&l5ր4 4ZQH-BsH5~1 Mnx4 [09X1m]gCBp)T{fd)wDc>9zKC 4' ]FOtÝ[ 2czB7(%8~ a}~np\2hh1G[~ cs'Tyd^Ϸ%Et9dk-l:@EtճUIASU5ϡptzUP–!R MPԥ[d>b]o'$@E?\~ xp{ATK)/xo 8ADc]W}3vbit(rFAxmS܄{)<8)}Zךb;Pv?qڗ_Ӫi}9bƪD7`x)h!ˑDaZr56vmoGط|YB;Gt-qfSyT3eW~EQ&5}ٱۙ?IO )/k*C`9.fY~!*RӖ3KcG-{jxRc 0QEީ4yȲ9j%M0UahIhF|$d;Mr eNղLrof`.pGM;iƊ.RXlb><P0YԨ4 $sȦ 8jEB ֆ 1xOujѨ;Π̥O*͇ݷ=f7k^0طyGyl6ےLE@P ۼ4wBuJtYtiV}d&᜸#m"7ǩf vݟ"Ȧ c@2M3uڪP+i ¸+d/YE3{IޠZ dPݟ( %^Y_p| jL zE9 (t@f@$Ԕ>qi|y5׿哝RϮۍWWN{q3߸3{a°H:iݹnXxjRn,F1ծq&hzՙN+㰔avHZڂ"y@6ܯF4~Y3l,eŁe ݼ4͕X˘jN+i!R)Ĉwi.Kr p0 v~$FjVl46d0) 7 8'&ooE~!ꩾYn~#;Uz̳q)2$~,80&EEȼ4w&%X&Vx:|j&&HT?K]N$|U"oi5x=ܼϾ?z/”֢0ETWƿ'fxӁ@{* A=8Td۪ŅA9')kmx #)ɘrJ΅WKx{DZdv|kCae6 +VxN=XaT4>|sH6++sJylt~`D*/FrI j|_KG蔫(BuYu G##/ꌝ +F>]xI|G[A 38rs3]Ih]9aڨ5](/$'6L4[~uJN(ijB UNR!oa,W;1|g.WHA!'`hdHK=-wZ)%gG%wMyZz4 m oMK>:Ի-1NVap:nQ7I:(Y%1bQm?!>p`CgŞdks}ڦvzfOOT% %j #HvC*!O?0q}q2̨^Uz(7bz qӼrΛ`PLBf38g\2c7nq :f&Quf iNʴh8x10iT^6@ B-3U}[et!:&Z`=WRSp,]~E '˷Ѝl*{11pW BKkmD}$Lbgx+% 3=_}U/W #D|Xߛ*Dbp]+"7J5Hau̦8ٽ/DL_Y8G5ȟr0Y-jHQYq!=yx61| qOji}u%|`U5iؔo}'D2jRg.YUHKېl>?RݦsGt nVB 3P%̐DZPqV6GM]Kt&к$EWAݡH9AN='ۢ6yч.˷on )wr-4e5+r9tmAv5g3;N6sd] %3g޹Ik>Ps[Aש1GU;"´]Bs*t|NW@ _8K2  cQK5*(ԟVIlP}#!BVLtnZmA+>ˑ室zBv7y]M*1i'} (JRe%Dzی 6H<.7#a1{Ӳi!7?I1U@s;)ƫƩݕvuZZ5j:!ua3e]q9q}bx^ KkqB_'ˢ[ɏ=T ݶ&ѺYRnB1^X^ff& iGկNL[0/}*|Dz.e$*Et6>2Iex!(\ GҢLs8fwy{˓XYYWR]Y5S#ծ/*@TcU-V Y|T›~ I֫ՠ'g͝{ 5GoX#S#۴{$=en+~pIys vJ-F<֤dw JA_ ˤ5f盹Ҫ$8I_фX*7,+S ωx%5e8Oq֐dS]$9]د{CۍyG-g?bH)((:.pb1o\Z޺_: 2pthn@w^n*jXk&Z-724{rb U=\w:Qc;^z&TXw"(l;mPks*LS7GeGndZIـ,qgv=!]uNzG]Nl#i86O޴%\EtD?}$C$;+pI*;4[>uF*Q^ !.<#DC]i45Y>~>ǀԜ8 R߇64'y/I`d#/c`mi>UȵU2jSw^!}ޘaai(;$>yTw]P3Ku,FT[zwj@F},MP-dC?}sks ;q$PՇX۾K:#0܆=[[E;mLTѿx(WCm gKQxAԂGD'K䳎.w:+Q,\@҃7S&lEDʭo&\5Þ4TH+QKT6\&E2j(%J?|򻳻$9˾K8O+O]f?M- TN{dz㠒U׻b\UT"`Jh-0;P"I1#-2|yMA53QV(W*F 4۬zB!ѩZ4v#|;5,X˰+m475[h=B:BZ2Sjq֐O#eL0'gt.`>[fU;1 bQǔcƹد:{!:uC<^uЅzr-{J>9-?vSz q_4,|E*Q &QXn9viA-ix +VަX3!Z*\ݟW^&DEv`]4) Nh㲋bFދ3tev$yV0eVRZŇFE7EK-\ᅡr`]tFXS{no%D* AUlUD =*u#tV K^rtTfIݺ9HCi2 >v{۟K9ק{Y+q x㌂ ;%0^ɐ"޺L'JZϺ?RgcpdԗCu\"PlB$R‚3s}mNb[Á%kۦ%XR@[x(*$WJIyîEңt̴ɧUv uXۨߏwǫ@4wH$#u: (N/q1*+i]JWz@ Y ?XnX5,&o@"Vܩ@~jy'?Q\'>lpjK&&4"9霢E/ڎL7ox,[4A:o,P2SZ'|FwA?@d)3Pct<*}^nYvضl'xT>@dfL!dv_r)< Д&vi",zQϑCv7-|-YqWHz^T3x!bΉ𻑤6=r,ȴoQFq߂jl4=_SՃMԛI`t=*Cb J= q\B_u.-fE6n/ĥ;]̀Sį.iʂ ƥʿ6GEőRv7`Ib @ś]  Y(Ø[F#Oz:n: 瘗DZ|J\Hq>+c_SJRQB L.A6q`ڊ;\s;=ifȭX?"N˲VK*MNX Tbm}7M`o]WNX}JuH\+-10aWo7o!}MmC dB̢jո[X\4k5:{){bOj:a+ٷo xEH3vZt] \Zy@SOIڮߒXdڔRhw:hҦڔ(o'Gz3V2Q3aBO: = K*1AQK9өo7)T8LbDxb +S?b~pۍIdV|k w鸾lJlIR[LmS[!"6'r+8Hߙgr;P3˜`:BLGIFϫ8[`132`/itsFhG+LA(>1{TI)*Ǭjw2J3\>“kd4,KY|VD)4iTQkKa_/3+a D&xP(+g*)AZw{DQcGIsϨWi4 dP|Z)jT_BxURi;\&gd젉lv1U'$ZǨ ^-})oX?H4[. mNF n)85CCN*EڣA3flOnG+vh͑ӽ|t5|3Js`* `}-mbPYҨyY|=FYM`_Ha?qobmtp|3dTaHD )nDfn.(Q~2`ǟRjgg&a-3md|'Y,%gdb)qmY>I80+f$I$bӛNZX a.wEG>48JWC9(i.g!g2 QuJ݀y;jڒܝ1Y"DOJA\w=7Q]fURUU6UUD]μݍ$&̶Ɉ\H3jBs$$^j\nqe&)Bu'6`Җ8\S;JHJGd^"4*/0C5)'woLH)Y7΍˂fi:*t!>xTpC6@Q;7Z2aUC(^5/9l#4,jb$Qf(>' d+eU~yZ O< љ : -E.xhm-jA 0U@*n}%/MIK~7CM U bUXu4$ƕ< hAp\#I_OSٔ/:1,`:~A#K13})e^7r.(Xp3ջRc@$(+D4u/E!cH21X Gc x6̴HH"d /5:EcP7S(g\8K-gw³0Y_ɿg ^1X$ %X+ӌ~itB2]e,O9v>YȪ谶^zxM\@) 8֪4#Q,lMޙYpo$eLpMrzSyj9 ;:9qoҝ2 ?ufYxQJ;l/NpB$jh#>(;`zx?wcT :B<\2tߟ _ȝrN0S˗תCXIDBuOYKֆ^\c9y{A&,'pl.: =i/"dx~iEk9n|3aG&2 T͝k!쵌 r *5|. 3z@9?iEC0?.}DݖɕtY&SIvgVX2sq|v~tA s&<`ޚ5#~-м0mv\°yDdVdͤ6@Iqko8_2͞ _}otsLj}B S67O8]ͶOYxy:A%Q;39Zvo8IEIX%'21l>z=X|`oO͗&CjZ3mSuK` ԪH" ͬΡamEn Ҋ66QРR_? ٜ4q&y' yE/O_ՕQwdj_E ΗdEUkiPoXE'.lȘч˅y\XXEiQS֚]¬MlLԂԜ\9ˠu$6 @cж3Ls \\ 3=k &̳\^Ej1F=K'It,҄{$kq5'bHtNތjrE!GjSm{.lHF֩R>?qAߦ{lHhF3 ibXPS8/! vEGӧV粃8!/9JeABCFduM̘CjF9l3ֲW,wګ|A9]"?֔{.D-˨R2+f叆6NαV-N3Q(bOm!tMѦ5SH'̝ FdE`P4o:`Gy1La'gL WBkRLRs=p@qGI 4"ruBÍh r]hockh9 Vcf QYZ?*4;T#!1~bf5fMk6a[ - y眓qI9?T&ԽRO}?EW|_FpVeDx(/z!6#Ghè R ݵ#ѲII"7M_Z ߂^ߤ7d(^9Aɵb:ﱏPX6pvJV-ЭCu2SP@5X֢b(?OX!t9SPTBiI]Nn L.#b(;IUlqȌvi.5WtPV}o:¢_cB%cCtIգ}ϙXVk*09w .>K_ma2)D;~'<#^V> @,(Wك>nH\ (K( 'ϾI|œgO;=ej9^Y!H0JYR;,H,$WD[~ $n9Lgאʟ*\ SJuJWvDԽ"Nic9 Tjy/>>M2PR wRN>GvE!PHuN9Պ$vTvp~zĀ!wW1X@KR%2ki>̡5% $b&SfK!SRwsL.~D%=^zH5kyQD螓G)vGv+iuauK A8+PکJ^pA4ґf2>$Mj44уSbN몈pdX%8^$Ɩa㑥)^)UaLKC>#y q #b/8?cwUHooEl)k9+AԻq/څu>NAp 1w*G1%:שΎ_-4 [(nfBJOɘ .0GrW}CE &$Ϣr 4;+ZsQZ9'!85M6V)|V=߷s}]ޣ8LnWr'mmVz!#/'Uq,2d=yhL0f]3䉺ْTdOa ($\4Sp5QZl'F2tPu|z-ܒɏ rIX@mH}Š&אkҎhQc!"gɑ@ڴx31$+%Q{l*Q4|=pG~rW;F]$t"reqtp"ތw;*S@)p'AWHM;TH;ϗXb ʫz:GZf!|W%0#YF]>m `Zb0jO ?a'_.]A )@OO uCb[1sO78盶ӘyA۲X͸Ʃ;,dgi"5`F=!eAgT-XYT-YeS_bި.10FHIϑ_UL2$ mnw뭠1Im%g Sn Zg8ЃspV|=L M(~'o0i + zdvck'Zm 2UBFg6 $e0 3WA>hB~ʔb~wEM/28XV`գdu;V?¯hd:~Bdq~Ұ~^nfk(!G?k4w;1:V[.y rwv>F U񢎢.CU3ױ'AIR i!"+@%Kx*@gy93J ׈+ȠDtVٌt$ȴ%c#][ύ24YC_±B^ v',5q2%]¤cIf Iˎ PkM֔e;NqrgEaU4уA'3CǎaΠb90 0 g?yyE g++%nVzlȽ t~3eʨI(7JDa$]}‰Nvwĵ{ɴ&+pZ4.gu'pHͤCQVҸb׾nX7ϕ$DU^v( tG쥐 aK}8B`)8ɉ{"]`=i *!Zn)D(ƇLG]q`L(nlpםfUBrMuվ3'YO^tCu#N DNDb1)!;+Bڐk#]M<)@coL9G2*SU>99lz9s$_DUOECa?\įu"|*!O I-JiZJvG{!x:g7JsYIJ  ֩}a}.Y*儗hVb$h4`ѳ/ԇ`Q/5t@e[Ү3?ફ#vcWE EʣcRB6~vDDx %5N{i[W!1An7:P3ߨ>~~wTVYԁ D>)+`=ғ~wSw)O/rbsOەƪsBL <#_S>* 1D$v c!Wm0*NHϝܝG&)̔``(lw4#UAi*VcONN Irz"ZǫDVNeN1sR:/3OIGZ$ ק~ck-W e8'eЯBMc|Qtܚ*i~YuSiǯ?kA4"MLP`I(["=ffW,3E7mH^G_U_b/F N!# L}j͋5fpY" eeն!(4rC,#/S:x,g9_76%hɧ׏'S wUP|N`2B>UMb햎aXqj:%Z yZ$w` ă=[ ,ۣ;4SyF=߇u:,rx;}6Rfq:C5;RXFD~^qB1s,{*aA.<9(+$D:M\4<. dxA݅]qN:`hadF~ơL TnöПT B*Vc#X}иNi'{VF'L"goH946/|_⸕z_vA CUfO蛅6I`1%<!di7d,pzM(1 Oi=,1% ax  b >)ׁbo#Qf5a韑aykn,dM; |\L׬5bgUG  YJOv[QPCPF55t Ai^":q? 77jL55͏qt nC om gՅ.C6j!+e}':w45 LTVQ17jĨ=sJ2G`~WmN?lA+Ͷhs?Ln; >-{0(R]pkO6ܵ5ʆ"\/g_ ?f"Nx]`ڞ:8vdv0MvcT5 Q%='x~yХB[qֺ6=g**\?S[yE1'=˴2*,eb+658h tb]S:(˪;}8V'+'yzcчNSPW"ak4l&D % ؍?U\_T B9%xBx\Q /hM5# mprUoZ8I3 2  9 [Ŕt6).ިl0Kg3F`˪K;SuuteGĊ̣ܮwu`O-,P>y;@9IKZwcHP8!ڗ1jWCҭVAEN|yA|Ԝ2䈗mMϏ}kh1@2{/<۰B_fK9p&9G:g.(8'$4>I?w-23ibeyFFBKRr8 h!%ʂ9" -#-~#|~`p&V'`}\\s,3t|Ff%:ҿf6uᨁΛy3UBγP7eTd/i ?Rlx!?95i}ToG]u.uڽD|K#6-h\ r:D3 8J~ .W>@;D4n((UxxRGF˫CZ$2y#@l  1駕.^y۩4r%\5qF{/>uCq,P$;d{ZlQJՇIEXV" cd[R4[vǏ4~mغ`{erxף |k0X&a] ŽqܡQW`v"|Qxr9C,̏\?m]^+uc'Ԣ&#v԰V.HLj=ƺ*LBj ][Om}` . LU|3s>bt#_WY ':0^w&sW[MW>x[кLP9D3$zH6$FC;6.' 8d" gW-GmQR&bF\{-)Ȗ^<!' &b| ~\4gB]I2A-+KtT)J~SUej@ Y!?7Hai QNf:+.ad6ɍXQXbDcMKL<ftyk ΂|&J=A!.Dӹ ϨcA?G)AJOt!x#V? Qs@Id)z5ZJD]v/q{b PK0Xg-_2~@: \g6yy7\yHs@TܔgͶ'uh@H =1HYŝt8C gX4%.PAM!9dA MV>tUσ~#lYWn47 (Q p_BiKřg w?czC8dn= {o}r_0a]D1{69Bl #lr/r@x@;XXZt'R~67S%Ë錑ԉ,krh:v]P+8 tC՛һ\0o^ 5 i?$!Ϗb:^#9&wKں5&ퟌuhC&` i;7cL-:yvgz'w)xetl/zd Z35OS*i]וg~_HdD3Ql/)3&*څJ ~͢ ]jTf|UnwۯW9xx`ݬ_0_ocm9XOi(0YfĊ,I$s꽼OcƷr}Zkuv A:DȾ|1ukLZ(h:I%Ǫ;g\Lal}pYavGy&BB޵rj LڭJ*A>ͨ& 1t/|f<(Fv-,!(slx:OxW4WυYpV&$tC1HIm`~cpiX>q3bEl?_7ۖc=1FU .q+5!tآ.Yہ7s3,WNS2 ~,)Z%?{$iGϿ}hqV~A2R$#l,ɻȱX/avbϑr1SY{袪D㥃j/Q?8f=c0;^oDG; E-s`:GCȳiHW+eYsGW-ƽNXg,tBOs+z$X -X\3:O2[~:< ,_a[EcD "0ĄP%?}/*nN΅W’%OGenO֭ 9B46+-]xC~eձdֺY…}5vyg4aÍ_CFp[iŠڙ@i7w3FQ,SA7Zn KgA[#d橨d4œ6pHU7 > pyZ36E]z]Gp_#5Iջ9RC2rLD %0~|v<ţMt Ba_ 76-:9omܝs1metNdQڹjXDH%"=$[Θ=,F~_dss7dO9ƪ~o};l}|lڢL:;͋9wvNHxf֧lĊc S-I=n ڔ !X+>%yE[g]mqӽ!MLZ.|v +Ǹ TqxГ2[U%iBأgDUХ}!!:ih)ﲪ jdAl\i*WڥuĊ$z+bժ+{e p$B_KZ;wy$ B!r^cD "f{4yEj\_NgclX+&=2<ܫ~lPѱrVd r־uʪ# i8 nO9XOw@O%ְ֝N*(f┞J23-* xd@2uILv6Q{TG*poYFȐ 2fAf#DnE=ٯ<5J+}U:ؖC:bXBξ8jJ=a3M YK\#tM  1#ӻg$îO6<ԒegbMp-@%sp^nxd_l :/I9K~(7%r gWiBv V\&F 2;6^^QwZX 45HHȱ3H2?H+t~INncdlf; [~kS(."W-JBad$yaVMn1^ *CJ8m)_-LssGY(hѮl3&^޹IJ{pN= )zQn/E]Zn KMEK~<@ U)(2;UUu+  O^ϔ?- Kyo0md[`8O0X?(Z4 '[:(ξ{`A4:F*q=?xR :8Ǧ ? cͭЁ0Jsu^kbQޖ7ު(1ԧѯ.S6"59|[ZoOqཛྷeje61;?Zzq*Ƞc yE>~K19y{vGwt0WRGe;Vd'*blUq3UYI|Wsdpгz8J70F O "Ys!b17yU^t)-'%׬f*yϖ$Z뉯nV4fPl_&I1KC5N`[6 / >B2D?.C:0Q .:2̊e\വ]݁qa_v"*n ~tH.E⅓9;OLo#z1`wQ{12Y $;P]ʦE)tyi݃+r2 =S6 Y;F;Jfi^~${A_ҢPdf*T{b.fS^a:7D=zסs8av#*7ɞ禯+y :Rp%ฑNߏ\/ rp5c͎1, f ̐]Y> DH~CǛxXZ7uyI/s~Xct 甗4>3Ή9 `~o#0/RDYaJ7'k؂&)aivT .vF| g_]0Fx(>js;O*7h2ɰlVAІj;-'UGl4´DAEq2 ܮTMK\ ڌz6|{zK2Hĥ+bOH%C?GeW@ε;PDd0M8n6Mr?.aG nyW@^p !:],8rMG?:{fy XAvO}-@̈́7jVDH>^|7F[4 c/E g@),d%\e۶6v\vCF`>(k?>#Cxa ,=˴0?c&KUs_qP~n X ޾YAG` 6x'6(ȌiEo I?k0ϻFOxgj[O@n7LSiQ crɜfx,Jd0zunRN|]kΟE$"*~_ѫߤ[kQb<1gX>bAw锳k~C2u{KCsNc/h$QuXsRԺDxYq_}G_-v`f(]zq>v(ζKr zqX2CZaCh*FAז5ԣx0\NB ^06 V]SOhs/afj%z!p"!=2"' ƒX}[V9>W_(&.PTa>&g|;;IFF"<2J}qA$ɶ|+yZL5sWڔ*r{bZb}[;`!T >0Tƛl8pNv[{F1XFHG?3fYEh@>Hҭ~7ÿ~IXc8@SG7AB3V\ =j\Es3.'ZiP +^Bl:v$tsY_z"VJW6+MU-#2 sE;>=Zp ^Lὺؿ+L:gX 4:|J 1ӊ\歺 c>d l0w" HATc S^9rqaN!M ~D+4xh?0i,ԥ!>w2BdZߺ7+bW H3#}ˉ~uO #J~0+|sS\H[U.-`N!i -z6|v9$LjeBʰ/&#f%Z"ߝA CD2[&9-i 198m±m;?7<%LdGz^4n{A!biV? X;D ~o=ڿ.؇4q_ o9WrK0?Oy&@;k ٢LISF)Lpxn%fw|Zn.$=’crpVhfpx<,ݵL3|`ooWr"fR(t% 1 vźUћz! Rcj7$Jq{}P;C220"3I~N 3P sj41}mq݀]ԇ/ /EhBg>F8cg;T./m֡i}G8>cx֞m)]B25 qS2`/p$#ֳq_YWz>@Ve302xyF-x̜K|DU]ֿuH_rfZb郍g/\a[.1DFϲ6.^ncv<̾dmo)wIr Pg2NIecU>NՀVNJ RS`:p Y(Y8GªacR`*Z7LI )2dв@U ׊!!3As|S&s/dtM@8aVℙ+t Ԑ]'k鵋JS@2VK sYXؤݖ#)*6ƆXsj06Xf/&{Z._ul48*X%<S{5';92/xF.Hm|HtbbQhSN&8.^>ZqcA^yKu&S>udcena !M"80squ@U\yUU~@c=dKZG>qJuBppHixآM["ȑubo(!*ƪsÍY%%!ZV72@xՀr,(_tas. :d-G(7ANJ{e X|HA[᧼b+}EZ()v%*5]|+T(J%m/Si?U^˾ j\ߪ>ArvёlxT4k( ۼ, \f\QקIď*v?>|tLbՕp wNJ! N/v̸fEKVΝáΘ0W y^JJoQJIrsaP4݉jAd^x6dǓ~,>g%P \??b2C>C#1RRsP26A*%yޔBn"wu& 1nʷ‰ۙ٪B.(OBȠ);sLNdS6>LrT,88%5(~*/m铄)d+@({I4tRvߏhەyn hap 9޸w.H^ۆc2ywLm!rKM}B4k_3̲ϲ ;WaW(zE6} 7N}|C~r5Ťt!,hi!2sqx0 0n%֣ O/*.NGWhj${뀍-醣8)Ю/~sJJ~gR w@YoX|&3/P2:p&ƚ&ڗc.'b {j.NLM +bk6 0wRGۜA֏swNſ&WۚG" qU!|Z{X~* Qӄѻ$L)qmW}6{id [G6 *: rirU%*];&bKjj٥5T :%J|k=>^ɎCҩnXԔi~eV1YqjcrLu}>WE@$,"9S/Ĩ[ۖl禵jSg7 @ϡG] 7zQHkz2~ZtR(/!g<(!g(Xm삒ҚɺaD_>\Fsn s NRf32Ă_aZ*몝zRAelE'$u83Kn[>!9R|R!b?FTA/>svη`>&;l>9"tPLML X n5 |oAQn|»8sy| 4?jM, Y*R0h W5G̓OR0 ?v~,- h7uQAXCTL , yc`*NB}$ڐNp/XaZŝ-s$|x,:jX` _d'(B.T(UI1'Ռݦ|Fz%~R*W^FzU螕ox(ި/$!Q5x KY(2*xja Bwhy:Eid}gC)euy&tmR-[Ӝ-OHЧG{(L u_[6Y I{vFIDĸӊ4Q7r^ U tdp[+"sy֑gK__mWdQZw-ep\HESPWwb3ƸŴ_)hP#鱣-ub < _2o_'OH2C<902#-t߃հ=`vojgvci2tnuýBAY}g/˧4?O(o Brnh`* T[+;-JQJ=-'Td0Fs+l/^"b=fw}At)O?GLwE]:궒pB^Hn3hh_;l MTR[!Ƶ -k>Y>(7Ff;J&Q @*~K+W>I|zPkvG؁D%uy:Rǎ v}N>FGIf_2?' /3 X "I w"EeinX". p_hn'= Us\Y~`[Ghڗ2?GdVq{['AGjnl 7W0#eg{찆^R'Ix6vЈȮfh­̰YV]S]"()z҅ -%UبgbӲ+[k-8,H|YI^^i`\V!+?~Pª,cMe :iQ!%7Z5fd^ẛe"/ k\Υ`i-mšKNoe_Lz[q+U.|Qk;ؤ4uhFF'u~R }rFLaLZH Tw>}LS)_>AM.:sOwOp=Ɨ^ڔt:nԐX;ӛ ,.3Z`5h//W-)G8vaTȋIkN9w˭]zʭT9R%58{|&Iĩ+bԡ!Ҙ2{!ænΕ66k&n7b݅g|Nآi25-a<y7Sn̨O\=ڬ[d*%X|zz㩉5 [4)iVmTې)ز:.:EaF◫[sꬡ33s;RUCE~Q\&9GG9$ݑ9YH*:'k;)vsY"U.x5ģE/|:h~(U;96Fb2 {))R``X0s$X6_)L#nXRhqſ3n-;B;^ QT;5x%D5c90Kw_p: %@sNǠCYWVl#kw4tu>E3Q`uvNE4:i}Ϟp2&jXcxOffh(GԳڹYFj+u*lE #0zy }PpB>l3i4١JmŌ lnv.G72Ш"%,> WD|3P^,TƏr9 Vr9Qϧ"xIvmN1qb} VHe{c:Qg!PUUz ?9eПh#XkNN>|ƛtx1\I$E%8uCrz?cb7Β9L]6BDvMsnI $2S]1:?(KlR~Sdya|bP&rlƔԏ栛 FM麙kmnM9FOCؤ|PC%Y}Dl4AQ|}y:r;dї-Q65{}ALOLRaQ-qJ=02GM+Zc`C1c3O%$2TLG0Tsg,&*l&)us-m pgTLFK P7n_mo[16˯oa12*r>N-"K giG=nTu#? x4E}WՂ!o5Ó-g o_|-xG H͐3.g?VgUU?_sHlvQ7ε&rՖ }w jbhM]0+SaiQύ&ɯlkMy]gf%FZDDriB'oEF@ 9MDm~T:\R*nUG[| οs2$ғh߆)Y I&@f I4 `_WH1OzIkE77 lbDێO3\WNv_$~ϋmp&5{a9c%K9Gxp,>dɞot F z?ңzD0 9y_Hiq?EJR{/eL ,KD"7hl"W#m~<>B@Br_v?C K/2_h 5[!ɹFA&/ *J\Ɖ\[}~ǥ{b6ύ\4 ,$ :'J34jiWl!EoLVCJХv 9Wi*bejf<"r#?[KSj^bffYʺd{ĢȑMJ⣛\~**Ŵ;K[07~!st9 7'b7iۃbaUi޶'Y$)%_X\m[6 EoU(O1'LXf!.Eȴ­G\PdAcuZC+[XL4vTFX= i}<$E'ԡ ogA&p_ XHPj''`08s2?܃PEZ&B I.;}I6AyC'wx%EY; lXqk^МȰlRmr9Z.ڭ2@} _P?}sI.s~l VWFC 5~L9C< N:쪇ȏT/KަoEe~uǛO]uWmEX$oI൓vؿ+`MSeCü2CR ~6`:P^m߶9Pw b嶪IPxD2D^ 9PS)Na OI'K˞ XsIB~/a=RG8^v7X3=QIn[222%A ۋ}]Y$p4| ޢL[S!wyٳF'U26hfCPnw-|D8НF=)%ϊm){Zbv^bSZ^$4$ů!t-~:oz,NG20&4 +9^PG>Hn7WO~Τ*d|x/}W?R; !m9P?: Œi祊72/>!r]!6jMJ@L`}7: LfU):bH1f4O6Zf7FW>QTx|5@+=EG?'mĜmg?-Ј̉\WĜk fux{Y9[")s%T5b+e :1EӱC9Е`j~6i@uxeLJ^ћ;O|l|y|3Qd̻Lj&J 0vj|AGȞY()JqPu_-<8+t5-'ިW6X:+hd9"ɷ#.L6L.1aŨQ37|q?Go'i+=ػѴ鰮S(CU'/amNjh!ȗ-_A# qͅ"ZK3 -o+AXz2Z1p16qyfh|,| 6C5RrLq*%[û$ K{ׅ;aRX1/I܊Ad06V0">ShlauYa8i+$ dz3cv%9}nz} zբ=N621Af-?ͬ+l>bFZe.`8$va-~,ۭU=Yk3#ќScEoVxx13AüCuT >]҈OdzNxȮCE;A=63 h,OfDnw] .plt u%ڇ:JSNbm?xqeg:dFɽɶ[G45iy8Ƶ+-pK|j Mz,= 6NNWr`Oந-Yu F]H<{XMerƄf$ \6k]"ƖAgB>2a=#dZyjC 5.G|ʞ˽]%KHqS'I4_ AAy{;_n"Ao~\1F\AX~sm M^F/{`&m8W\;"]J`)]ո$d-5tGMapTAcwFpC (U>h;XD.Eal<)aWg 1gg%1&ieeE jx`L&#$ O;Rd7Lb7I2[%\߾ڶ7. "r0QÎ?rQf(L\OrG4q VKF5,V ,)b+KqHnn[2\r},Ol mSשQFXHUG,`DYc3>3Bm> IC`B0?V2% N.7G7 a"Od!ITNj|8O-KtJc$ L!>1M\Xe11zx?4*8ͨeJ([#.#6ePϕGJSrpU8SHJr1{v1b74^luQ-&p|\F%R]J Jb\[㱧1VMBڅQFa{fZZ\-\ۆj"F`f@ߵ kk),)1kBxNsC#^h9(|M+puz Wy{DȎE ߪ@"¶{@.]nagYͨ)J? D['+EuC,u[]$:l:K? \!~2fh+&,a!!ИTYuKC.0:3dMf:*-rS2 A㱂~KT 5)ؕ{|ۻ4%fS6 I4PamˣB1 -4pCo]Z0!|R#@e6qa쉾JY9ԚF?Vĸ 9{7f9)cFR&qeЗkzQ:noW@?>Ìlֱ7__m>rÖ8WST,O&N]sF6%e $:g6k5 $- ȶ.Y&mPs؋'kz\_7RQJgLs1Mx:\g|:HY4[ܿt+2UT]'u\fPBmX!\XJE0<-8*goiȶ5,,@$}OIsTpUWN׬,. 㲪X\R<9ƭ;Mїc@v= žܧMrEmu%VKɡQ{srPXRzaL ߚ G;>Q ~nZ}sxuS9uZ[ebrRd BIaŎk坎D#*z)}*j.bYL-W35:n%xŶdS2ڟS8MEqs!IJ [ҶR>35ZC:b$ @=\N! f}UuȒ,A[b6xqQD$izV[BYRHTghCB+ʖP$AZ9K;ȖBOt|\Ũd`p;7]arRL)?+ R"?IY)xg0(ѷ }re%;52 ׏&LЗLXtbn4eצ}( V#uQjِ˹lj|KZ jH v˸Id>N#chV՟?ũ-UUo3 D$PzH!u |TSwr?AGq")A %Y`hB< Bpv6?[sbPCBvRBX:WL2c::=x^0aԠ^x:kFYt!*[_zhw9 6˛$#4|Ve๖fܒÍh ?PB*iiD==d,c5|*j-;˩Y7 E<^*]x{!jϛ, FLw(O 񱱰2oCNRy2f;\(=Gye$;} $oS(t\Bx8>zu(pz}/)cA4 t%+2IH.y,@07 CӨd4LN9;5AO >}zIuO's6xr,SYq; (y7`֩m J6dJJ,X9bOf<ӫ5fWK%tX%Y=e (WSQ T)FL65f/cF=4uXf_ Eeu-<b߶}8bܙ3}T}.1 C{A lӳ=ߏbVA4r r F;2#HB @ziK~pBn)3U1b­0ʼ}. O}` ^ d#\ʲ 6QmOIGD阸QbsdCxGWqqq{:: u60F U$GjTEB+-2RU8q +O%K@?g4{h߉s~"=w ZW ~s"H]hcsOd@EZ;g ܷC'(n1~&XUE!\ƥetlfϝU'RWD}ҀoJT\VIdiiZo Qϡ }6RΙWT$0[u 2#p8 -ZԱpXDBQI_W%/a8IJZh@Ok }ir&HL- n?)~Hꦰ`3N,]L pkQ0\=D'@5'$8+L4(2B{5}egð X5sHve fc>Ob ̏}D ֢TWaŔ5|Ǫg 6;q@zw$ſ Q(VV4 kذ#;W\Bd;zCv]}4EZpw(GGF DX[-ϛR;ܮp"$cg"$De FS7/J/@&G Q4Yc| [i.}TCC-P#o9k"SjBhKdv(d4CT;-+Kdi%VdFtD h֯-\-ÉR0~Q`Dm^Urxr}w,>0}dtl:Qn_n6uU/F k_ϲ1V$w頦[~;Q^qb׋NtjH4.UA[f̅M) ~B%>T)G+OUK_$\v Sc]k3bvn:صXAE,Ǔ?368pQJbT1t*Imu4Fƶ(l+*ڔhD ٠ (M=gxS@3Ò\N ϐ1TЀA{՜ rOg駳)7):)ɐO(^ͧAx)~z8# }o^Yg\O94wK%v(S:w|%4H5$حES 04ˢ_c&Z@v#iE#+PcGmb+|W#Q&~ihblخK˯,q45{厞l|ߗi*FceU= <灏NW?BRbb+QW~g+eN7 h-$މQ#bkM.Ž'z,_MN+lτJ34zH-20.n>޻"FZ"<1NQˑ>eͫ.S˴0H;C[ k l^$87i+aS)TZ0Ǟ񝏱3b6IDk82dd-5ṖM̏Ȣl{h k%N)B{cFLx"ObԲZwn:!7 E!m.QƳ: !oi/qK6#x§e⹩IS&fT|,cDH+pxy x1K]d*oAEWqLbq/_Xemƞsbs+,:Uaϵg KxT09JJĴ ~ڜh8V9*%NNIx=nR8)xCeeurqp}T旾Fl{i׳1坓h+"@|m$>ٴ;u݃t3CvZWJD.|2])"RVcN&wqZF!8qch<3ƒ5}bG9t65!$9+OJ񁓼4iX0ƾHg^E+GGFfubX+yB2zҎ>\F]wtsH "V@Ť\GŮ<Kϳ|DO^@A@> Ir8,q?V],ǠBۖj`i_zb#'1YIJ~@U3~cRߠ#j5wmjd 9)E֎Ei7* z3h!1MSk cjOpD"Zر5a%q&d B'zse0ђү 8y[M<ib,Og-~f3Z4ǻƭCS㺗B/)<JDr:~Y|=MF*"Z+ĩx|41q)뚦RrEU+6c<=n۠g+۪h_,>)=* Ryy4M'(bXe;qzX^zWV9ܔo}t BD:+EIֿz>:cewJkSYNīw\!C[&:o `kA>f%T`wִ:!fs+epg>` {_Y?s|а+ϑP^8f>RJGP9 )! w!1x ވrhCR@X$cD.AU*Uҽݭ\(5X L*5{we$`@׏kNpF3! ԋ,\Y/_BVf**#@'Sld')ZtLT{$4 3ǎ˹'I٩…`3׾r]|z5z6wi@^t[=(jv? GtGd9{r8:\4FjåP!UfͅlanjoH(珉&:c:<nd1[xLvɁY)- 11E /oE7?ɢ}Qw5/̾+VC!nkV4ii3[gloTMTE+H! )BQ} 1cRz|i\`Om(έ-\3~h H~vp=:o⒝mz@qoE~Hx Cձ6#GSBgjv|31ᤳr|*ZVey ;Dόd!HJLz(5ToCșMM9rKO,c^F+j@KJ իo]Zg(8[H g`i1&5#F8Y 0CFLc/54*l8X~"y0$: ]NjGLj?V {QCi :a/-}| )kiU5JtDo˚)w ]]wN7\1?<._  AF =?*uJѮ*&ڴq1TP ʒlR98d@=UkKgJ( 5ڬ9Zl^\wF`3? cNւv~sA[9%A=[X7ji% J8bk=P28:l+ 0$jv8Kw\/'0-D (:Pt 7#y."ml c?kϐnguPXAW1U=N{xs%ס`>8H%ߣu9o7&m 7KŸ-"SM8Cyyj28 vwxԨ@MfJJųn< qDpܓ_jE!'H@SnL+ Q*M!y\ГN|5̷3I:TV3V/Gzz?&C(qmGppJ~0l{9'%jQ2oy58ɢN e )I>i((r($F.TPcMt< g 6o[/@Q3\Sޭ>XNoՙMLOP6p",7F0hEl$!@΃#@'E3'B.1 Oɥ>Z \O|.錼3O_HCzc,ڈMs>:2Ic9bV0ht)Jkb+ƥ8301"p20m^wJD1!g`AoUoDAU,OfW]5FلTT~-HLJ.(k2݆WH^AL$T j*tJ'r=Ҭف/r/Ž9yBZجc^=dw|a}puEGmgXsW#Ib/T_b"pZ K:e3 .V>M/D}帋y.nzc~ϾWCQ#CR_(>.ħƏWzO+xHbDRvduE5O 3+֫xX\8 #;kfH]k,m BrmRҘ}<_^~#o_T&٢RLy=.<T:!!11exH'T|u`*)Ѩ>چ -M7dc+ jxT }O) a\hPb7WĿY/A=Q5Qq+jִӃe7Dhfk(d:~ Ãm7uula]鏚 B-B}{DP@c̾i_ 5S 5-1GHhaÄ=00Pt{5!EybEFt2Wq8uJ$B>)[fv_,f+5w'kwb0>B: \A=s:p zH{:cYӇ}D[`&CI3HrgB*NЧS$núB=mcbش1WqnH 3^̉Q@_tpK|7jܧ%7hu6V /tډ%">,mUP/,ɞއ3-_*y{lLe ֌ 61Ht߱d<\fM4M,u,+lIkT2Q3N. "_=`))A90kCNIK=}Zx8CX{IO~ئqa -̇Q~"HGӵs OwwNllXg0/t* UFFxGkd}ﰺ0BlJ@h/a`m|R>kalZX?=ʞor%AELXrxБSSw5LgDఓ$f0lC9n]^ądo*|̗ TJP&Ѓw8B.](Vhlw-; L߽sL*TI]i f<̜~aE̿D>uQ]NGވgT6=F~Y $WC<",4qiL('7mk*ظ&-u@V(+{PE>KICa4ƱeǖqʽfI5sJJoOW!׬ЧŭZ aqF)󽖧t1iOgI $=T:bD5Aݸ2W2VlM]۹:hdRbt6GӠ <S)6ƯjpLpt7ô~gUG⻏:4 x)J*mg`^Oh*kΓѽa.)^>ar9 C'rVcg"w+3j7i룙yٚڙ㷹M E? VL5Ā)u{k$Op8&M_kGijzp<^fE@/C`ꕅڄ:6W,tZ@6սf0næT Q`OʇQ?%`vHi^u%/nPա@6x- Ei@¦  ͆3B|yMb '0&.ѿz0nJf ̬{4br>0 &'d{!Dh#|8ŎiՏYy1sgR;C8֔hu8_&R:~$m lw~V$E/!OtrtvA?$9#);axL0ŴFmg11 ߏ#Bc )ʱKiO<܏@ldK|IGX3Bgms5L|Iu:krB35[ZMGǚigēQEժÚ^!b\,i2:UOnLq#6p fG/zSCd}#unqOF] |N|f2z\y mB/2b`:zN7r.dÍ[qsuPڠ!=łj 5..J\-|j+!r o1/R&`gvD Oۻ0:!XF[d. hY@!:ʈYwl}K$PHtF v*d}M}ҘޥF3ɂO=C8kN<6a2E`4=8A@M|yfN##\/[9hDDI5@y})PrR'[5+Ɠa]!__5r2d6o#(obl!O5 vr 3qizN\>ƵDžJqYiг;8$vI<DF;R5 Sļ: pmw b-0 N%޴fTywێ]W"$]͍0N44|RDgjdӊ;CΊk!YC7b/҃={ N lD7/MFB .)EM>@(Lu&Tq@eO{D.;;w@1>et@zoAU֛?[ӕ/=Y\6{~eAgVI-G@R<n w}mܮ}~wm&p98`pz>X9*f0yd$[1$69BOYvt@'tDdSXO8ċ.By~77hϙa0D>3pGFLrU( F{F>^<ԔԲtRzƷWWG q^˵{Q$׷Qp_cY OJYC=` ʆiF#AzXq鵿EGPU$TO=[eB%ql^oͨ<)Bp,'H޻>=V&>& ;i۞q X5g"Т]s !Sz{؃<8 P{=pE }wqQڌNR_xpN{GH\Nc9i4O&,/^ߐbxSȦ[&mcr1S᪯}OVGmLG:"EaEu@&@5)cKRVX19&?A jLW.Qrscc@|[λJmf%[,Gb/}R͟QcK>@ȸ5oj=c`y-j0-jdaWH9I.9P kn]Wq.dbL]e,7 ӈ-p` ?t# H0604)UB ET%'VGמBU jU #r|QQ#H8F8T=4)ULh=|:﫦pSNXHtek/n2u^o0`R0> D1qܢc W(T V;z3h1]Smp 08T?1υ37҂hh>9TQ?oXdz2eyLNI5$46p'y*mx5~=D0f|_/mo70ZnkY떧T:x0teBlG2 eZZ}Q a"6?Hz7;]Rsat&)sZ\݋<THDWvNg]Znuc P yL;2`z+.1 ϹВ2R!Z:F^ !LUv!gK I~< |s#ETGdrV9S@H K֌y5pNSdhͥT6# +~>g߻MeO%!:PD@HNڐjI@!bβxO9<3DƆmh&.\N6<:c-$afA"@h&E]9r=!Xg Y{%c\~ӿ0^9d=LG]2Ԙ.?E|Ǡ'25S,ryLX[\jRRRH*>\X;]+*X𥄥>oH*5u{$+EM"n5pVz( 8Bfc*V>ZXh`Ro//f:QC,#w bJbT3 >"mɜ5\Bp`'O#ceo(?h1.5l,7Q*bʤM^#aʔ$A[OټByKNOw5rhm6ܐteH +sQq 7q:ATA _Կ*Hg4GŰ{y[V{c4B%CLrXc_|gm2J)6SY%%ZcȾ&HUḾ> TH׾x&{ɖ6%w=5KA0?{/9BlP{|'hhct`*`08sL`;!\ʪֳ_Bm}|ķy K^8(Ű's_O\g{_zdEV`smrڬnN8am|/L@J5i\OOONfV=Q|fx Vʆ"FE/*k!F3^vtԌu7َ3a&b|Y]#)f$tN-M LyнՊ[J67Gv, Dr:Ԑ>)@{.(KXlKRa=lZқլ&\JRk>ą,a7jJ@iS;49%כ;V(vy02.g2z!C=H#oQvBaMJ㕏rC~!ޣ!0PW"MJa&1oZu!pz|O_Dvqdy k\>0ּ +0ЛxuQe 噺>I<墩K@0.*k!9['g* mT"HyP;k2ɻ䣘9v+$b\4Җ{GEZ`i]3 ur,|=|<Ge=8]8fA{,VaZӀ{7~?`awNg!10CX{hMr*%w *T/N4ݧ2 u7C|kT6Ohrf]<&n,(?s&~QJ.iI! d88'k=ԅ$]үžKğzK)"8kU׺cˤuH"]  فBd@̫R*1ph*,esjoN$L:e ^Є ⲋT\=$`,/fV9b/K-|LEc$q]B?&@w9IGue >uKϹ;J ZlkO?m%)Fu*ϧͫe6d7sҙw<-|T>{6Bkw U*y> (iai۞ 9;g!.\e/Tڍ7T 2 oW)`zxd|b#9v֞q_yz,h,yVs ^$Vz>Oe3%WG j1%CQYZ99ˁﮦS(uB 47֎*u{gi̴^8DJ4(PW F(-Ʒqf?2[37KtK;n ?uc5)n)v\2@Q۶9N1ltV} Vy!&cHx@sa\zUTJ^zE U;n'pMC@j3B 8Ww2_ĵ(chLAJA?!`(7*z Esi]fa^gD"[45@*5nm{:x1Sh7{- 87i>C^37[#gswD{㩚(~~_4;c%6ag uWZ/Eo|Of8fOVG6$mxy0GL˅n\5Tg?ekR3?Uc^:Bdi2GE{Trtd[I&9kʩVl/@AUࡍ%\[;[3@ KVׇjR&/v=9TI6^C6j[86g;iC+1{CI"XNs`UVÁ`Xc 'j=A6sldK,0l1}02 1eqn2 $qc7kǨw|;K+1vr&p'ذw; o%!QT U? n5:#l[ VԎWavRgXGL⪆V2MY=aVY~5A@NWYƒoO,lȧUi]:{EC%Y:Y,J# c^K ?哣k%a Ù uYN?͐ӷ~cD)C4phIyrgnuRf-@CWpCe„`\>d10):W 2wbbic 輛vr ]!`AV'LGs껝Z iSFQe B#CL$Ӏ[]TL})09[6[9Gϻ)^%R${iߝУJr-qu:ix1,7\?{[.9n$v]մDd L\=dq&9' t$ؙ)+9hSwCّ*aC5Oz6ث'm1O<ԇ R-Z~&?  07wת؉Jf@ \_ӓCVp쎪׭9VH<SEӻ+% jX . PraXX--aX7/8hhɵQ`hF0,vZ&fdX6rlMNMrotnA;J/yO\'7)&//wyɶJ-kwB]/MY{>o#j?L?&? uRCtnf h}մII&~3@QMx?O ZWlF#W(>0wT}S̤w1SNU,k`sӆ}DVOk? ?G7^X*p%7aU ?VI uݦZ솆 8r.ZgxTM7tѱl_8;]wbn23A2+OzUݓM5yH$9z8 TfWrDnM(P _0-k뿤?j̀ۄe_ *aAۚZXMitmH7[5~p`ب It|b]S'?'YTkTp&\ҰaxVĘ,R 3Lm2-&'*.Eq5\ ]A q؝,crX+\\԰5e @?bas/\<6a0Qox?Dw? &G2e/,qwy6ҭl0N ;{Cl5_-#cMSX!l4^dOSBr*$n%:&1UQCC+.ƬOZd4I^ƶlsw.L^j|ԯ|KodRm&c-#A'*CYؤbٞ7A'8 dL@0Եs VO Ƀs _ѹbjXY^XEgӕbU;Wɢ{/OhUMңel58 (,JVۈS- Z*n1*7v̾v{Y\ˇ?1 7+<{6zn`s=jkaB]NnUQ4N,n#ڵ3#DWG5qGL.,ޯsF 5Ctc_A `*fw:^qu"ڟ=E$oWj?ua@RE"ݲqNF8ucʜ!F k YWe9R>ʹ3!g۝=#+dՎxjC(6 sv͈"]Q(ML[Ψn/"d%Gv=ߦQjyD)]:TsbX(_b F8oK =S&i4KEkbZNjP\Uu#NMEnpC$<[C0 TQ4v4߹dmJE@UsJ;'2 >[rv+]? 6^=M{T(h3-͸dG;1\ՈUFjr(ḦPY zxLIHvhw OmP)XKOH ߩgfm"U@ 6NB8Cċ\aT 3>D 9;" &f 2ƒtlpގ.V85gr7g*[,$9X&a&_K}nS \oqy̝JNPi5}e<4RD.LNOH ɻ+Bj@8%]ֈ@4{*ӥ_ 88Qi)JfY'|xFw\B]@kbq.CO9m,mjf .\U+ %; `7(wbf`b#EwxW]hKb͹[k2l'EXk\dp O̙ -]y.N0 =,S5JeEh'XIȺkҰED =POY~]0`/5ȥx(K@& OZ?`Js?@lkZ!Y 26'g:R '6?<` |VJO{<ۙnBx<c^5‘/jn5=ݳlʣMcu[w.!N *?G߹ O}GF{,@@&yMB_VWn"pp >WHN٦*1ubi^yҝa,NVݳhomөV±16`;I^SC*S[4'}h=ȄZeΐƮI,aIaW-m0d,I{/i ˗CƬwAYB%~bs<'62Y[M`JEŨ6WJx  š-HR?uPqʖ ,xjHx{182B(9kYP8p:}A$≸l;Q׽I@^9%8F 9undOgBbOm#K/Io% iL+8a; [G&TM#-Y xҾh3m(Ͽ ٰ}qO=] nr:tBA')\xmw?eDeCJ `|\H=FU@_=?/^ʗ݂_9pm ϋ%]f ,Cb~Z*V,Iyd[eq9+c [T<Z[i:il0d|i~ܢFX9p7F 7e8{ I@rw+0iyp^Ɯ|UJRggc({[Akdls ζ/,gEZ?n0<`SOgf Wwbc CDVjgjq`J%ȀR="L6w 57f5Iu-?mEK$)+Lī`.$_f*UMsBth؂t-. T`ʅUGUeD a=ӾiT 7.;t{??ԡGhV'>=5SgeIɚ!ɐeE7*:A/$+D`Lҕù9IC3~.p=*A_yϡ^9YN ,\bш+2[_DŽ xq^zjG<6d6c>&  !"gZlakZw876y]gy#*f'zq{&(an/ɒUugQm,+AjPG1+twu FR@v/X^gEW1q:Xiٜ9Ez`\M;:s|%7?${h*ag b}֘7vۊCLgBEg<7hς ARdӾsgZOq@o>* b;o69f? ֍DE[v9\nQAyQ*./!iRF=`-Y͔̾gOI]:OΉe+?v $QPr^pe3"Xt6d (P)j߅HiA ̭ȫk0xӐ/SZZ}H0jS\C1\j=x 2P[k9 -|vr+]kd}6`0Tdr87wY;vp=W@V0^MBIRUka|Pk!QvKZ!Y$\u|c{ 6oR͂|Z 7H4`r5RkuИF7SX'-8 ?@黚g& 8aTrMiv^2m{q1-Ù^=U(u}4پ"#3]72*CPml5ɴuݭYqaUGnܯGEU!c]oA| tIE5(SoNɇP݀F:4Q{h%,?B{9uQUsbf0OEy2*P dL#]px6kv9b\kWU1ikܺD!@~/I_4G, 耕y~׋\dKvr2.((؍ g HKZWjѵV~8d7c }/@5L+_Rw@sNK09u:o5=/ t(3eX#٘Jo ~10^êA'SC%pC;bAeԒ2aHB(aEK7>+]ᱤoRK^/03]F^~ԆOҘjj#j]TtP$KLY㋡pz0Oj4V.a*lWQS:o%IΏ]Uׄ6 1q80 }M֪YyK ȇğCvn.'",H98qb:f!g8b $0dK«kެ7J68>vebvE|eh: N|H02#wG]Voq4I!O|Tqpl*M~]\[ W&CJ18{xG8*:Q&>dB?f, xG߷'7uSFiO+X%mh=kVDUcۦ cze.M%0mVʢo _7sRURGc N'Cn*qX_j9!7G\&‰ݩэT6bc~Xgl_9\ԞANm Y.Ō.݊!$?$1!S±IڟyDK'Ap=!ij K#9.qm;' =kXo t**s# I)nZ$$ ZGY]K#NuO}X[\%h\ԃ˾ٹr#DJ6]HT_P?hur4ӜqhFU~{_>NY.u_Ff bF%K,2Q,饼25npXXzW|tBT0{0[{25UיndZ|CJoT@#.zW&/iH8R( 1 JbA>FA!Fp‘ޮ[E~rGJcNJ2tuajAI4i =nWC7Ru&™Byն=MW'rdXL3ZQ*jrb WdGҐʕ0e_}.B%)LG[6% {i}XltS[(v50+{t!klk_qODXmv51U+3Mhmp)E123 @UQO\%연6>Ys%ͣK8w9YiR(yRԹ#7wXNڤ-@tL5@3}(i<{7Z.u/EiX]Ѣ:@Dpz#1z9&T:z@Վ561g=l3L}@UP;9<;Vm|ZqX9-9S༪/v ]h9 MZyqK;]cW ;NcFTY7 GɃn VQN Z6s(u(Fo,roj95q.Cqq1~9?\PEp 4V;H>`׉fO/3BKc)=v3k>?[>u%[B5HlIzURMݠT\ *ԥf+,l L3>{-R:uH[n4QH|0ՙM^e$p{b]]Yt7x,<*F7 {g׳sI,&mgm@alcS> /|!hU}Y;2dC3obZQZ(d+h.z4\\브|M iuZF][_}GvJxm^GO]Δ7WdMP#Ό}p* 3Q8M^ ]5X퐵c9p}NtKuH)V ӭĵ{sZ9fMNN,n{:!'ؕEe1 kY}~kk\c c>/]N#֜6ia9=%O(Kߠ"q~2q i^ȴ|vz>uiTBoi5RznVϪy4G:]&:6PYZl4WQ@ żHm~`ί͆6y )9ßR~B0RM׬ۉM7h0!-sBMG _`E{R"u#BA*_U|3(bojn9,h>j)2}?o + ]r+-r>`w.T]# s#]\.єJD#`k9Ldq#&- /%jAi'z_ ń^YMb!~y I%(@a/Уn\|~q<=bax&iAyx'VO񭆟8d8ב k#qA{_p/gwPJĻg=A׾¿zˑ)cv1qiň[ ʼnh6.#K+U% JAQ'aZKFH+7 edd)ԱQIITqi:nkh8BpF\ak []h"We|g]"Ccs }GW ?̍CA0BG’xxFRƒk"J21|0%g=m]a=a.o7hvN<~T߄*MC.s;+1qun7}bXO{aY3iC)C 4+6hq~\3)V`eD~@r0\{[s1boO)U(+_kHc}ILljc$WȄ~7!߉huRl6j;$+K;c0>0Ue Yd88]Rে!|`j%mnBwalF0A)\"G&PVsvD왦juF{Er92suP.U7Ū3+B{j={p`H7˴W2AT5:T yK-+wHRXSL^s]ҹVڴ1Q 6qFOkk:l؋?S?JqdD9n^r6U1{ \6 tH]#V`K5F)IٴUNO!ęPy%YR.WƽUP[cM{Ƞ׊ůAE}Bɲ9c`Cc.PhchV@El9@ArHKЍu te(碨 z;N7pf&Fa=ߟy迅{s謁 f6LV 1Y9&h^ ԴO>2聨X6+A=2_tX2$ O F}9=΃Ӡģ<|[:6 9H4-LOpPLξ_Hбqnv!#d 2(h;@fq fT]5(`2~j?9ld9"=IUeG 6&/oS qusfs)L[;"?|:RMƾ s_9)E7Ctss:ƐZA8ԏ__~|K*GPq4=@sW|EzL)w]"~|+.-s`Lxt iQ o;l1vsFġ:gxýh_n,̱i&Hg3T`vyD=|ǰrع/؈`\y%* P3) odk=& a@䚟@"FgwDE6$9nS22ݹST9^h_#v+u~|chG$ ~]`YDN>(dtCr\Eq!+ vj%~v+6;9 :TJ}YY9[uP6l1zxqg?fU&z> BGגm7Ix tl(2:K԰qX>TqXrԏ4qgPtMQUqt&3/&mPÖJlMO39 d*¸R"lr6'O6@@.mhF= 3Ua^K&)]s WjN7Y/32ڎ*D$l?%kx2g.lim㊷-[XRBFכ%?=`TESVf> D|H <$Si~@}3aCS8d(c԰h*Sޑ$ђol}dA"60 i^ٵv{k&b;E݋Ԃmo/JYkL&8r $l4&Mml%Aϩ+zsl <{pp[.]XDc)h5Tj.0T%'XȊ`f}R(ْR W {ew(p$|!R(MVLpTEiyȕsP^ "\ 4o0=g}EMֺ hP= j [RT6v8AT%]xi_& ?ce&Y[9 h1d-8Ùyw+8 W/o8v%r6kCh7r41csANƔ3NpnPJKڛx4IiŴКWa!HLh@MXv2mO}d1XYs]2Vf%֫s3(Gdy`h器W=7QWRKZ'f{SaJvNmW<8;N:xݨHZ4pj$7o_@aMɗ$;=Amg\Tr3lEz[l7T9N"1@#ExZu_{{i^mď)ݸP,~o[jN1_B~b?fxbq|̇[A}:D ;X_ E`h9|iU64WJNC)xSZ5NIWa&3=']<.Wpew}b|\(04ۚ/6bY|=⼊ʎRqvPH_tk8m4Jl3d>/S𹘣sYk FI?r*?K]<u#0jm?yV˨9Q쮽#&U86̄izZ4=alčIwZul!g.[(_A tV Q;0XbQuF`UG,EPap=aL@@M ԱFn0@ine"}‚dFEU-OTNI)dٰf7z #- p&2}nV<xBq=NKH)}c_%RK886cst.֛o+[A.J;pWJ6y"!:QA˜sț' 0APtNL=y XR.V89hG+oݾ~R毬ъ`*DJwPjT H`kD"*7B%Q}mS%dy_ҖpEa-pHTw|؉vTn]EV9МOk̓et;۰}$CDH]d9>%!ZPMLESԍLҒ ze%=ϔ<9^(4KZxLe9#"X@Re"aX>u l)' тղ-A`90:^vZ?U')eOXl4ni@`ɏ3`9wh ,3wX +is`U?PgxUՑP 3ρ~NRvWʙmͤzLƢ:"@Ot"`x+~Uãכk}dL޶@Є!4Gkn|Q/vGLNh2D#}yΝ3˅5z q0|L{bT/D~Ώago/+h}fyu`e[oHBhȻ92 yy ouLr#z" X1!t[%= W=LЅ*3_^<<ʙf}Tq&qNsk'|oi}}g߰6oVk(\. [Е;j-qݭ;O%T/g>7TpPss "N-L<'&)%%h7 mP5%YVW#AQI؟)eMУ9p(%>Y}r}N̡5{y2E]H9Zp#U̟1|_R56 >fU2i - ҸO|]hJջ+:}[oYtpG`MC3_5m7V+szi#p3;^q-USx`>'C:1sƋuf.y,U{ CK2H1U8Q[ۤp4iwh&ʡ6Nvۇ à  :֐/;,hG#djbA˖~@;6J|smdyUGm6i&Ujڼ-Yx6}FRxa)XCW MLݛS tLީZd̄ex^eD#D"D4ma;Y:|(ɴ̃^ Tꀚ@kwӑ&1 w>6{tP!;IBzF\xC !@~ IBVm/*V}>t!p%٪r0jB/qFSA6U\2敲$ :Yw 4Q5}"@6HiA!Uq\A8HJ2%t1.O1}BYC6-6tŮ<q\>:%+ƖS2D"F# Â|9ňO~ec w>4(Vkkw}gQTùcgC%'H)5~Wy%9ڵ޻ G)@̓ o/ﱪf9q}.^q8 $O?%n?'Ե˵Ŗ9H<aIK/Q_{28.)i1Sxxt%Aʂ1|TA2|s6eLUk82!lp/ .gٮm}e'hsb<lQ݋p+^ no>{Z #,h߻;Ϗnv]“3]nI񦜟sA@6Smw%Pi`Es4sCdv P8Þ")/D`fyZaK:OsA6t>J0gE>TeɦtNp #t$OGD5Rz@j"Eڟsd[Z9v5L$S̹v2ki ̛eZ3g]-&`)uc% (BU \uy֮=:U͜kW%)p gGhJebY mllc h'k;[uź7F[•ߙ`I5E *VyCi]0;.s(#uFth84t ݛ[Ny]Az'"3m-oDG8[Ow$$K}D(0} e=ЧHM{|"Deu(c}ҵ;UFÞ/[~7餋Y!\!Xq , F%hf.$Krgƥb]f2()uƆ׽W|񗽰E@FVpFT7?*}=FaTUH|C$-59*Wnzjt^P68ӯ,?r5Ō7SOPSa)\v7' eceTG悞0ӓj'anMܥGH`"lxH?"/GT| #!tz0E=l̅0lk;k9GV鄅kTYt?CŸuū;?>WbIG3ج{T@c 'j/ ॽ_(Tԋ~~#եJ䑯3BR)u0dN7 Mhue@#yr [X:T᪓*e#Eh"z|v1q+X KPFqP IػcDZ>&xk3H[>MUoT 1j=.I LD%& 7r:bPs >%/Z_+|R~@S?e q~TPDhXwlxUur~(c>̃.xpy}>ko1Yʑb #6 XL;V Zh%65L:>] 4h!7K='*{I4iOD. _l-BK[q4>%c/qYp@ t~lH(BF3`/^@U= ?m nBmB]>3PP{sxo E)n_;^S%%H=+u0>G܇~޳}>eTbF3d8):[AV!,X* I]c{l!P)K>tDZ;eI݊Ȳ*bQYFⶂTn=1h.JwD6 >$ƜVכ]# (ީu̶,\k"RnDV  o~ 5Un(C Mʖѓ&{pr牘WOA(KԈ/OI&L-phM`}֕5\%,u$ kR\5N؝SmΣa=7>Span$py2nopSR''̫;44*tFM;ccϣ/mbc"[V;g,y-=s%sS UD}U]Е[ݬ=B6ȥ]_1`[2"bVt=LTFkj4#twO$MHqZ=}䀌p`3fp!#ٜ165 Ch4qNNxjE\j'* Ԡݞ\ UsU{BE:o3.Sd Jn̤eNVv+i7 T=4֛G t]ŧQUˌXp >O2HC1bbj .AAe6O^P`OyaWb[yڮp3tFӺ&[~+֨AiN$69uD=G`AVNX۸Bcd}pRʶN*_P49$+ \'uK6>-a9,:(idY{=`B7BNPK|UeL>Я^M`'M8՝n5{3kJB&Q ~~ee3Ifc"p3EAEҌD˘9܉F_*DYrA">hMD^QS^)b1a[/]n?(b)ʉ'h{[WzPrjWD)asMFYv?@a,[| ߉s ^wCWi \`f7Ik)qW?p =7. Tfq\7} pkk>r}Ȃbv o # UޫRZ4`W@o҄4Q SE.2{yu*\l_ٱsn8avLft7/R_˻T0wHN4вGJ>Q?21Ҳ_9#JfV;ߪ3g{~+2OR 7؛ڜ`e̙9\<ѝ$]VdEwW4FInhJh fQK* ?r8ˇr+yVhbl>=O!5޵zAB814!~>b/&K&q҉AnqCg}ld_A`Yra sL=%au^0|x^rQ"YUy)+ J>'0uU(``PE\UJ76Xa*{T(h-ʫc#+ߊ%+11DwG/H|:V^ʹQ%HVl%k3e ;g훶{x>9J&lA_$x[*SD{SI7ϻlG=Cmdus4)b# \j`4v)z-́ZVz}[tSZ_ G 逻0c>'MʝwG.[317Ȋ㰅_bO`"8b2X4VLxyw4NrpL32QS _Ł1"wzd \l1?'(>3CŠfqQi],u<+ZLaR('j4'/?m #1tv'5ƶ\Yj-7صײ$jRUڣ\p8en!(JNrT\y批}tW|-TkjYHI?ġf>iNgwtP d`HrїJJ+$lrΟBfw,/>gYԠhc=@-_s}9SڹW@_o`F9:hDiJ>jM3>#B-_Vg૱vJ1C(ɚ.|M2eb ^n@r ;iUݭ1G/Q^5RN7Ȃf:u}- Wl # qq<.v1]){*"xHW%(T룠Te,ϟ}BpU$F+줥x?Ef7'xx2Ra9ƿXf+P&;$~WYr~40/yy?qlIwueW|MF7D)|ϤLAz~e`:F>1b:M7#'d)dwFҏ!kU![sMu!G*2a/cs6p>gfީcݶLuCK %R Vg#pi3i|[:f` wt}8ZOa6G4i$#ZT^b<}R6ۊ{-+AL,S_eսh@^lqBwCPQbgՒKqUm8abx3}1\p2U;AF%*j\zX%z& ͙YK˛_??HIdzv!զG 4{)yP:0~1͢l K"`bKmS Zs 7XD;OQ@b@zȈܦL>='%4]d}hΟ"8 ;֩v 9g<^fbT1LkH -ū)P=vivbiaD!̘_9}Ӄ:_En?I Ih7KQrni`l71n]+EUA"UvM"`8vgi.W쌩pCQHЍuK1<#m]Z  8;D"wU/{8 "1){J~i H|KǷWFFs,,ff\B&/F^5X)=!,~ 8cW-6ZWpIѶ` r3"vͯ.Z4X*B#zYlO|vɡy-=Ç@0"h iI\喗#QftXZNN(F{;۰C2cN'x+M*G0tcX*hoct.۽k#El~=zwߙ/]MVjcJ)>,]JQ16RïƳ;??4"8DF.-; KeSᙝE0|H~Ο*.{jI 2/Cnpd9-RME[yf z]Nyۘ,߆9b311_\L`GT*}ד^tzuSOJ#_|cy(ľ<;VLڭʚ-2 HՈJRxPť'zZOrs9M+bO\[V:ro,Y?ʹ?X6hݮ/+=ĵ^n9mw8{3BKT8&G|pzg_~J#Ѓ/Zq s'LjY(y ӄrQ&q) g<0-s3H^%im5O9E젟fDLBp궓``R]"i툝; JxPrq83`g1-c-݄66d,ͳI5}ڷ]9f=m& \vIaU*i|ƿ Qn "Ϗ S,?߮D]_T>R'E@+4gWU*)WbiZG9 浨?$h iΠ#Vm#T7 ΧF 3`x0u1P2zԉ L+=0{6拏1VsZAE aYRJW@q5{ ڑS0|!~t%Cx )d>$vY`>4LZtD-)|Lq:5a Sա@6ouIQǡ\\8夳oxr!' mL$t M+¨0&MHIV簵Jk6d .k'c !>LGuНC+ rȊR)D@v;w_b/!ݽ֜́q)(!BAhzXWIB#jw2߆ZQb:@Jjm J8! Z-x}M\2ofN_u` B)`&ܤB0[xOC^y 9AN~P|`P3 Ї~z5`c;#pof.[$?j%5IS RRfTA|y/Xp_+k4 Gt)[k}^5WnR!'7x#rqr;n HAUoҿx_Ʊf M@4 a djP}K'<;Qv#R#U9gt8O홆'%+Ot*{[ ~2H f ч) UDɗ=fßZ_hvym'PN̋%|#ΠMp8QAK͋"ycb}RVe}v>p?jKRȲy!QL }ozuJv؁T=' D:t@)zKúqNFm]x$|n@z[+HvF#JY!VM!Z;'uVW8==&c=׀a m=ʣ~!7̬69_Ia6}EY݈*Fa,[\K]u ^@ 7kO 0~-p}z&P5r $%`INMv|,B@ŷJPk[Ǽ߇ U&|곹>2r(ʐH_"eWf;L >DӟsSY! -c?FM*N`|$t.B݇l!!Nw%λfĺusuF 0w%"BiMʮ'9gN,Ӫb4:c` PZ_4t?O6~U+Ȉ B$ZP-̷-K %8*:u&zO[`r, $@bdzZ*mY{yt\jU͍cn?ll޽uy7vY6\aERWM #O]#tQDcfEVff]Vdwl˭-r "?3;c y ݊gMU:NԩVLg,-s-q-ta]9)8tU:%z `F߷V;.|j j0TPUbtF6 PՑ*Ɓl^mg%:0{so.Ld*$]ly7 m @rݰqP?\. /@!317W3>>\,!y15 * f:) pZ?hL w~H90%R!idgp g uP~w`3x֪:mR|Ej&[څtIE^\,_sJCo35[9a>5W8=s_3JAR"F6~y`f6wa9T2f`_ь1dxoZ螡Nt',^ַH%4~hsFBzu)wP5[S.(9z^7W%{|GB6O%O3tm31S >O ^+U )PM2ӥլhS2t^ .)ګ%kEǬI=֛u); s^"a.dHIC@_C}-сˣ8$O WdΉ_7s:}#[%DWaDžP/дvjfNx%6Jc^OJ}NX!47{N _ 0yo!E^ho'VhɆLBdE+YLI}w[O=V`'.)Y1, :mί3tec)6 QgWX7 z_G5_IB8"@B tkэ5p3T ]Uopob^=A84xƍ`)!E5?߄M%'אK%)A#و6Q *) p _y uvA+&C`r+B _,w}'92cpJȾ"9%/#B6s6ڰǰ۪՟:u&%Y. _Bn۹4Rf>lx9){6$(TXkp gbj&!3ݰF2VCcPn;y "7=EE2QPzħ+ yIAsv>jcԎ"G'` JKBIi|(f'v2R`_.|@hl /7+U@vL7%"B@,Ηjbi IQ1v3 7š;UQza%,_șlfVM4!1F +81k3Xzۡ(*oGOE%:F! V d0:r4X}aM4oc L|}byCxŘyQ 55Q!:Q2-Vf'XHP[$>w$VYaA8@&oȸ[ql!:˳5 !V Eu ]1舝J[;[[rLnD<{~n:EHuZhY!S& vOHzz5Jm+`KeQIX߸{oLQZn(vD@m]t;Ʉoz>:)M} G6T/ܓcUTGlN%gW:ה|(9WHE V5c?E*<}U6J w`1`eV&:ωpϴ[7eH ޖR7Փ?3.w|ۊؗӍz*:{dcX^)c;&'DwF+qic?%iIrmn]Sџn&G-TLZONB.ZBM/2VvPQ\#:Hj_&V, Mx44c,;WМp;Q2ӯO'%NLk"pڐp-߀+F8;O]#TT:XRoYO!%Nk \\@o.Æi;ъdpK,=vHAV- AEʇpIH8r K^|!^he9I%J/o6ϡ9ybI>G>!zvθ^yZU˰g-X?#(BbKșQʆ בb_gM1Dd:m qI ~gTk.!֗%χls@Bmu)dW'MŐv\3^vSV-qsOV@}}=h!v(L+5>2Ng鸉$.jexveTh ENׅ!T)C#$Ze,R!ÎAm4./5&*1ZTf꨹[|qпMdL}ͽI^C`]&5͖u/Z3Yl2:?1= E)xoԺM=J+3<|d RD["[rU}cVoǨ\CYX @"t.!m f }'y1?/HsdTΙkTo~4*3)r@S> ;q "}w**qrwN|);9P3+ HFF&/^&B#2=Ld8kR7Xuқh1%} { Y2,ZC~j=> ~Ox{jVrB)0݆u⸸/YVUڤM|Pd@?_%GA!fD TSCp(q~lhR0n`ߊAM&~_ it:&mqXbkіkZ*uEzub I)T|E,is9ᵀOQ4q%qx샊? [y/~eNS۵%8IH OkѳuD\Db^x<[ a6O!zv8ȔF o'fAtN3IG A- uֽq bg g%h KwE ,k3Q ՝ϱͧPxbŪ,5ù_!މ3&f 4TTkzi N`MYYRS|J%* qx8xokSI?|oȪgB`k *jRGd4X$c(;'pR}&1rW+ vXHfG/q8*xHwrv9} l_(F8Shbڇ(h4XGߙ2𫃢e48 a Y~Lsuur_@OC8ӞZշ1}eXkf)Oce?c)dQeݧ~XN43'J͈`,%7 ee6[jQVpFjYX %D CDGϊ?Uu},u`,%se>7b"ca`01^R=%U2N#Xž~SɁ̙f+МeӦmހ='e\L$Ň杫s7 oJzh0uH.C#E]Yw3X8C𦞣yOPo8ҬI06;"Q=9b3Uy e+ ?Fhƛbc =Yt]~ o@6^%eQ^YBSjJ( Wm{]I%Xʱ߱͗k>q:ˁZ9e.Fa*y`˖8fϭϡ3񡜌Rt1߇g%$Ax =fCeK]XX(CZȏ>YbuYDLw}zcԭ!;n]Gċ H+oX*BrCW.JBS9k`va~iкvBi *F3hA`-v;Wu\L,?;;cU,ς#R߳z —t~$AB5y6W'㩘_%ڨĄ&KMQ,C.〛ϋ #qL e3BԎJ-ڨtDze)M;lNgE/c|^nK^}*2yO<XG)CYbv& &E=Uv#-I(2qxYP)!8?PA4fi]LJͳO{ZIHOXKjů!Ĥ?  xW [7㲫[5)և1 d4zDKh3[Vk֪-NUI-ȶ,y&&:m$L:׉$t! .ko$)ڍPi^=bV4e4%a,*IӘlJydw_6DJS@*~jTBf__=h0J=0oӕ: ֐_J1́!s֥t(U:W;)&+2Ae5ۀ>7FͳTmۿ|5/pgH"'J_"OaKy'!*Y;/϶='`+O7s'9d6heF g]1 ޫ:0Hz"n&yM*nDḀ4v;>V`W(KҠJeW/X;VCxmlEÝ }dI~'ܓ?70VNZ7^㮾"nѽQ)l%WX$gϲgOnm믇2qJ8:\y 8\!|QAF{P h$/6=ϋ|ry.VT@ :9YI#c^(/VB㼇ΙbUxm^@KYچ.C#U tIYX5>OawQF`[eagw|E; bH_k,.ĚCav(0MzvE0@n`0]]4Wg&<ڙM">c(ս tUkfLbe rEs>z1C ͮ10z xHX#,P"9i;|JaW,wQ0:SotFE]18M nṨx.G<+J!krP%cQp-4j=~jpz(%Mww<~o Vwm`cK WJ: Q$$}v';|CCjq&X&ca_R .癦GЊi$+HaёA/jݩXʑ]n싖!7Q'ͯ{7˜~ \r՝ydRvL/AݵN+iMx> "ԑ.bW։tڤx%71>XkIRKSV})UrllXTy)3w+KDnfv4+g>0 Gզx7n2ZÏu`})K`%vn-f#j$g)7ZD*3Am:SG|:hZ9|t{b䉶ݚ04HQ h=$+V{5z'0@Nԏ K3MCվ-&.X7P'rpi F||L]_6/C+ߜb[\7N! ]-f_@,uUкްOL;ކ%ɠfJ+HR[L.I/bD̷#X~]1,Kk:ջ7C/(ݼjTI耵 s ׾mvpR,5e bLp|Lb1g^0|_sH8<ģt<ږ#u~M,B)X?lW)bޕu$utAKgz\3Т~$TM[ʼn 2- 4QSmgQ~5G };\mקI)ä2PZp wO[[!V77q0>TQx$'h $#sVBp^a( qu*A"%k.#{ yi:@ ʳZh)l||MeY6hk]~Ƕ84t); (c7 C "#yWa$ĤrbybƐ ъ: 2߱?đpAذWCe}u%nA U :Å7l9@}ܿv_^sC y@7`ed=c?Z6c:: ۛHos΋ݸOb0ʔJ~hԡ_:C`nBm:P78~\tʷl 1FkW߿QT,Yd=gű~#T<fa7wXQ:VA# UzG<_X㒠Mÿ9)61*U}2u~.NU5p/TMx6H8BSP 4֘bT:HQgYo?xq1бS;|TJe͏D%5P l.bbl(`2r2ٛ`ITflZ ]o7[#Ľ"U]ird<ȭ)|RM g|yoGM,#t愅$ʉkkD#LwrG5Dt:VM oajx7{~,,JYܻkh:4N:a2 I Q0i8,<řbZosH['ib4taZ|,r'ׁn3ƁEպ8ޯRJݹF ^pͷdOyX4LtIUB/nএ*W qt|ɑ1|8!A?<}rEŨ9DM" +2SȾF=xu8_k8(\{v "g)c.7fC : 63_{wV#?QD_NQ\o[Y(IZΎ;CLqd`q?a/)+J-9!9^  HbC6Pܮ +:vĠx}0~ --&s$y] fLQrP'H}޷~ؚALQj^Pb# '<Ӆ^r8ȉ8sD`9TX/|jEDv` ҡ*1-rIs::%?Ö % VΖy]^q >jvq,@IZŬ$Eن y+qDED!~ȏt)PWi!fw\ eH7U}amfm9.9,zy-~d|}`4rTB-Wn\:!HTѲ)3Qx_6kOpm70-HՋ&UX**(S_ԙ> 2$ϙ1J`5ɁdSehU!ƪʏdrx `ُmk\]l( ؊?G~8Q-.o5sO2 8ac82_YVt Eɛ8q.7XoiMґm[hs} 9Z LzAC+P9=#\W589hu럙Fxȁ(+zC{{ksY zW|~Ϡo6VSD4\xTs^FcäIiIDl|R'A8xP EG{OZiBћ $<(~:Z[3*.ȥ9`uJ22+=?^fLg` \0?>@ݰ{#ۑԃ S[uRwY#F:t| V, h<ۅW}&,_CXE/GIѫrΐ,JfpF'f ;|Jƣ/Tz+M1#-s5Ǽw]Ϩ:#JJE&56&"*ָfCvA 0D-ϖ6&.{}OnU;zѾZQdFY/BXE-ұ4.5ꈈM$g7`JcmX7R S[9p@|mjl4a$ͩ6-FBU˝7;RL|tz+,Sc`I͍aKq:PO^}<];*!%DYM?4/)nL-s,o0%BSSCJTk9Qwb#BY{j/ʜr2,gr?x^|. EY}d.>%r* 7># 5"'aX*Kۨf >,=?63xp/R0d>݉!0Bw JZ5'e?XTjQSQWJ;pؚ;k@ǭ}u3{xȟ(Jm11f2x2fGJ3uvb(Rng%Q8DF VV6Ŀi]3Nf2:x%uzkkfMQ?5R٨njՠK``Z4V}5 $j"O&Ҹ [ne9~.ǂ٥ᒤ@F@;k;7&l "Hub-wGLgi_C 3Q"+] ܸ_aaH1hpsC~=3=Wcr,Jy:+D9<܋&Oԃ`̷*w5I3ޫN:;_#sXYoAaYhP;;vOY|_T3ӕ_G.xTG&=-*sdž6kT^c6\+i!b0f'`ߎ}iԒkp]8{cX>5z\9s9@mnXJg+p֣O:Cj"cJ(3ޥu[rا(uEy4Z펾krW*8wBCȘL14mUB9nHKM-)~+t߅Pɒh`ǃ$R*=(ͧ@g",!FHǮbCx-=҃ 3>0WufuG.xaL$MaC qMUR% ٦}+VG%)ɘd4Q%ެw/ KqZ=‘VL@D㵞Q}|aCWԒBDT,Fkp!a*)\P5 A"?m;w5gj/sZ'sW=umlf&`ӝXOt~J^Tȼ"!S7;rqeͣL'y23bmv䌩8cyXp> (אc Ɂ{wۜGS,1-U?f*ŕѣЈPZY;[T"E 5zcrdqov *+|۷ c6Hh)."?`/&ЕIwF[dXTH $(R+|78yeY["\QN0N֒חh1b)6Z?f%\F_s>Dj 3!O߆QiGD닛#AMeYl<{ R9˲\#+glw֞}|8|OVхS |_foP~t S ?:=u姟kB.((Qe4K].)ma Yp Èw2},WOP2}\̓I?x/O.\bG݆w/7#ֳj*oamo&BvXvF$HKR Ԃ.cv_[z>a r'W\W v;;͉郄kV<6H!kc[ʩ;I;K`h~ƑL;z x8/ <+zE,ˬah.L{_ZV+.EΫvqF! 76`VM.טxˍqn.-_3_pnո"H Yo70L8k''>xtjPl4䡷Ƌg7@|5XWO+,7FL)F7գ /D0 UѳeNSזn)akzac#!g~a0mq^1#O̊=ixvy vLBKtJ/B7m8Aw7sH=ETk|~;pP*Eѐ}P6~~4DEp1$ʼnhta57Ztť i:}g4W9qX݀E♸ dh@r nٜ$kGξK)uw@ړ\r%ы `OavZ6Yyǭ '{k" 'cG4Qц`G{B{GGx-MlBp ۺ*= $y*=lEi/Px HRiijjVcp|"[eզX.XH/#rк.jz7,M$LhYR*sTpD,Lg[Zch^a:@]5WGq1FwvbX0gZW_pK`|/\n}X4"?)Wb)87A[A#@z!yZ壹օXRy~̚nG|`>KSD#Y((ҢfRgl0pw>C-sB=xs 54j{vɽs>L g?u$j޿)@42QĿQ+GbsRTlA`Jiآ3ta 7EG RNL".?y_Ap 簜eՍUtnfmd4 zp3#d}6]ԺR bI1YeR#:y̾˰61zKt- xv<8yG>:_aXYdFڏ7:aJb"OE:#׺1Xj=`v[\eDph;҉Q?9_>M*'KЬ0K&|;}Q7yixA6ͧԠsFB_L=\MBIۂ|MZCr+{D\sp9BUq#ӴSᎃcO]K# >GvEzi@c-Ց`׺K$azOiS;9w'fNDF3ռ5" N7OD WfOFXf8ƨ"@r;Q쬷1F8ѹNIEgúN]/Wђ| r?4b'iU9=qi EB5KBjsgn7Y YV> )3k= J_jHa:dgB6=l+%n:6M.PSKypa.SSwAoчARcv>^sKӴ3<#qbK[X ݘ:֡28z(%4!#dmZ4쩌ש ~_GIJ@ASI"-m%JN >hHuf5ֽ\bM5aJ &'[t.tsm9bPw4>eُ2X]+Jٰ!AJr8ʺ .bSz#q[tb#}G& +U4 ~=rӳo!Y0 |ܘ-0 U:$ DQu_/?:G;v{WE뻱bz Ӏi|ZA_k QNFEy9|bܷAH",aY!IߩY<2Y<1ԾU<,Q4뜱ќB7 LpoEaFxNB/,WU`],0=_Wyj!I?WN5^!"'=X0/eN@qq?7p5odtNc`]1&Z>;48E̸ּ3ېrQȑj5CQ\¬?~*\zo- B3ɁwAB XehK.-Q9.0eYaQL[Ÿ.2J/4 I3X/xM"6]"Aۀ?p>(ӐiOMcs 7U3h!KپB!CwCfl;q)K &۟{tjSWPJC%g8:̧)G:< C!Cc *QD)eX* z=[&acjRͫSt5s.T3:5I*&RM!FNHrߥD,NhdžYҋ(p `+=QW7w1whBOz\1=z5F\0NP޽M#0 YvY޴0!"7p6f1k'PS~_9y %{,Ņ 臄3Yv&wSKf4 {|^YBT=r!}|4]J"Vgm 7}Ƀf<*f2KEo0u8 ~0U9ce1uus3+ /)jxMR~$ vFAOrPC*WؒƑ0)hk-`OtǏ>XJ42`͞!|DBa?EUDCW~{'"wUƠO[V3ţb׮pVҠOA 3R,A%! ;Ix5> ,/hw0/f_[`5sg  ?d&:"P)Oܚ$FDq =`O䊡PTL1׳ ,5aR0$;=} DeX훬R *8r1$grd <^kLNO%=ή:yb^h Z=9k[̀sЁ vu:4י賒vwK}mYi*<5V/vѬKmCp"O)[*n0uO>Mqwsӟ^ h_z Ӛxb^jE6[]CC4"?g_[a4B[ 0]Я̟vB)EX쒳D2 ٜkkjQ[^<6GSuzA4_i,,T{c+cB㞳s`r~M<%? f`ZkxW>bl"ZmR{uM WtIDLSE$eO_LL,=mzcd=@h!P,Ah,lp0_n<{R9 NcS]2XZL}sߙ<{g^c2U2I&Ta)j\[%v 2sccJ /[Hє2[jOS[r7-gYzmҬ&k& ?T@³g\x#Kt0C#b,ip_jLDLcۥP &$OS:yؠ6pYɖepLQr\_VAQ~=6abU)zfD~|)b_*.f$".R6U f/q 5LOA/LFiKg~Nb;,RH0L]*0]~HUE YP]b{vo6nL j+{\AZ6%[Zp ]?(2,tkKjhA)-K v㕁s$7n$`eC>iOKtLO#mK.6zpeLyOʑ/D|2iXt&Eƞ K 蠸FЄWC~xoCL7e%,"Q&4oY7gG&G b.;GoETbڱ-Q^$gPGa~=,`l<N):_|bO?$!o”… $AB4,UB(8Ė(z,s i=Bq[`&o/,-3a' 0o:dr'"eK8>5@\»d3yDh,R0SC@3猢FuYdv;@csS~ȇZ-_l瑎x1ދFvkA!8%҆;eH&Rwy4s%YE16d+! xՂe;ѓw"*L2,9a1phE(ڕ[O",`]DlO6Kx0[6&ޫsTFj~{*tHg Y ZA$:e, â qavMRsv[R#f#^~0 }M*xoLy 2WY8R!p&l jƩ qd +u<, Sե߉ cvO$Nܴ[ {ok+ Fk \I{ii`Ju/l}knpyNmTfGxi7aP,=^}v 1(R/sr7V G\WQI4?AiдnӸgDŽߛL#:_FJlv1ŎwƯZ`Blk `O߻o^7KҥJޣz~( )Dڈ*Ya]`=,7f<Յ:$j7IBVT$l|!-`+ӽrXVCt@dpODNȼc /KtӸ<ֵL}pdžj_JO|Ɔ`kJ̼T8!喽h[Gs篼Kiz ץGt!sʍ 3M!I¤rO%.4oWT2y[DUaUo ǔ8''IеȈg1l+*<[y .~\'lI <pEXcљxNVù,Oj/7ʲužly a#IZ)}_'5X d" urmS6Dx/kU_PGj9*pL w oL8"iCS 1!IItu\=A4Ǻ]s\*l/5tQLJ*[ʥĄ{TݕM } cmO7rt6k}aP-&;h'vF@;3B1gqE|ohfApP/uVr&^$cV#Oj|XO$M<6AℇUŭ~AmiÖCU{HJPI=kѵPP)"bC{Tcn`<ޠ ⶵXDA$&.Jz\a)[@xh_<(ZoRFõVci6&o;ogC֝9QRs XK4 $m*,֔+Hjx v&ܖ>aF%2H~csp=:aK/_{wfe8 ?q~=kP,ucPQYdG"יsU^&+ۋ(rK{KU _4Y>yKfC>$;o.qEg3`mVIp.D-"B#*}\j232 ȦW.W;7#9(%>$Fƃ!U+a*wV&{2#na<{9?7 :29ԦI׻fN +=&MLߕC kPN9W5] ,+:Uu|k<4a}l2ës=q7R&DrpWB5yND~IE3NaT&~Tq9)Dya"~W /IC;(U_|Ya?7ЅnU8sg>ؾ`4*Јd t6 =T&pbNtvwc0/7;MWgDSU<7dapoH EY>*`2h;mPWԢ +yVlm碔 ;qԏl6[CH"b.ZL[Nps`}Iz._73L뫫(z] xr%zF0B_8rU3"Q~O]p\vfVc&@n1N`ORW#cڄwg3]bGrThc14M ~ PJaCʨr4:;4!"i3PU?P/…D+l4(XP37ȴQ4x p/.NٶO|MaWZdCʹ4 T5쵻{5d gD=J%׶i*clF{*Ӎ,ŗܺUU^ҙAƸf JƩJZO͐UUQ$6kX-ُ&ztNKǴ^C$'RΙs70A=ϾPp/al%O d%xLad6y3[bE!lCsod2:Y:r%e@F^IYUp8.UX_E?>G ŚY⁘-%7cA4Wedegٵ5Av5{a<!X4-ⱃ78:֬p B'>$"6_ v ʨnA"락D,@%*PDKTzcrD)5 dS)V> >aX9^#\-JU˜؍f!j0%e0ٍF`CHfBQ9q^̰&"o<_SpR$4$وG&xאG; 3tvV*$kEТwv4ru2w{GR7dd'5Ѐ2 RVwzu?Dm!`-)?+$sKGr#.CDɝc8ѐDˊ޽6 ٚ;$U C{l]<,q2>_ضg0qF1Ưo)ݙ>S~+Ye=KSN@@0&#X'%Ԁ0l.L /{Z´9҇OYP^S6z"έA"z[)f|`5SslG VuU6OI2n‘&Շ54s(8-'EǛG4)\Ӎg k(&/;S{_R+ $w^OAK Qfo^Gh~A! Mm`̖X4x3So!m7iK).A2'%=b汃{u)[Śe:3} CiuQ6Vu.f]HʼA,&kS*S vHpbNK D4lyxFAkmgթتE_Ff d2ޫK}D ?li|-|}%b[*6ŠRΜ]LԬŅ#i1|p*[w;瞾C۽-{͋2e"dX;Dm;'/1t R^T? ~CyO+)wFꉋ}*l6Vɮ?N&"pviU' +I3h a uPm]~,iW?F}g5d|ŵr8]?K9F"0h=?mMM \:t:꿲CCw- C@}mrzwAg@(><`A9L̹ y]Tqo\(B6 2e;V*IVL}]`'>fmn (zGأ>q#Sxrᚧpи8J`"t _q;8؆d|kpD >BFeJϟvGPɩlPTjR:NLCC: &'c/swEBQn'[!a;V<S*,1gL,7,SHD%!Q':3qHFu]1k% :A=m{R #baGZ X"F+ċ8%2o5uCr$:rNʳsWM3}xZs#eB6nq+.e+z~CܙN'?F[쎽| +EMfd4[Fb-4[&h|&c*U/ ~KT^BG?aI f[;NX aQ5!o]NU;_*V 7bcΈc1y|2GS&TR:ÞK ȂLٵ[O#η t7$УBВyV=Elj0X8ʅlׂA=#XY떠"'่#yem}]l!;rH.s4ߧ˰°|,GHSruJ^i@T7?G'J`nŷ8Ǖ_)?fV,AǩhqϠzrWJ O;ǎ8T@ݩRE:yn6-vMc{53t]n;qI 9+Fj{,5U9-ۇ:֯S/ Dɵ^E9<)pϕJU^1S/\__ <\c]vE-+5Jo勧"2QzG?gyO6O4N U )m2+^&~e46BR?Yk+EvysޤAƣylD!V c4/cfc7IRȦ* *oU&mr4ICuZ )ܽh a1T2ﺐ4Vx~%R?DiI GQ|3=FTĿOy8 !cǒ؄bi5O:Ukz,#;K]s n)+Ger|0H"cC^h8\< ';<_;?LJp&'>;-SLQ8[ŏmGl㛚׆x 埏 v,uX m7>B{NkoTwnV#2,GūUj6NNtTVFJ|q-~fêU*|H 0^5Cbt~P'~&`2ɝk@bd"}Bqy1lv-#zyx 4x$T`'Z-=54Roϧa"L_ Û[.袷*4⚀C_}ybnd0lvQ6HĶd`on FefSKP? ofruaK:i]܉CkuQVq8ZiXX oćU$ɚyLjh%sASnmC`]R%PJtzuFK3J?ƔմbAwM (BSqTnL+&?6It-+S P-SO76n jI+?ϟ%@UF rLsiLN%*A|S]=܋ f΅1DwhWeD睵NIL=ʜ3|9`064ݚn=JiWhJ7!w6`Wvz6TIH/PK?ࠏKKh.w /FP/P3Qst/m[6WzdP!X`97ZR!%$n}0TG88E PmX{X;YpSe)f@$S5M!+^5,ZUsi'Y'-bxWK^ 4|;46[+?1craCE}qϸE~pw U}8_ E=QGOSl,\,t"`[tK-xx^1V`Oߐ-  Φ#ݮ ж:ۀ85K 漽 )Kk7a!4@IoӜ0j>jQ*I4]]Ni%̴֞kc-'nY9Cex#=Uu 6't(zۭdE|c z {)o1sKsyֈS9)-4QbRfX,V㌂b!:PKڼ0k; L G'ƹPU'0ّm?\w-8↹m6&axef4L}R<|$!M.շ# :6z2$>8/O\Gwl}to#G6V X4f%>>b5 ;~!Kbk">w'\]ŚI .*(<DZ1*WXM<24|1c di_ۛHW&-l>a+ƶBuAG#_:6JX:䡧7䖽c<˓Cp ܗZ_ ȣ6 գ/MMԅ)7JXѿq^jD}>WF7DQa(#i~RWP$[1EPo0k'62CEɆ6g]#m~OĨ%~)t?-k_&_‡Q@(ZGl~"OtpOgQO|qS_ 2, VqaP'`kZ[֑>@-YE ߴCwlV/"0U;} TPBz]K>p EK6{sh_\nM0O|^hzYw$q'Hי/5tA9 ز(eet"iL}{k=E<ؽ<}@lX#%T^;G>,;ưO1|:KfH ɭNC5ҩI%;{ Nr!N /a>83]osd,Gk3}4%Ja^+%jrOlULHWJ|JoU:YJx{@4XO-smX>sp4b|s◃cŒXy}Ӊ"A2E@FX ?/#v(1ɊPZ -fVdn&ٌ8K9x+e/[WǙK Fbs36c,WML˹Is_i+Qu4^s[DI\ wjAoJ/'/q dm#]sп(j6y"ڍBp«_d0.`1 p=]xHuslK?\c@Ak'(W6\_zI9)wl4钫oUe5W({Ogm ELU&ѸћQgysù"kNSJXx_ Cdҩ]. =8x:D.`m$<[_}mԹ$a/_5Ҵn̈CtCV/y{XUI(kZVL7(^W!e;HDY-K.;NjЋ3N ?Yoõocc™G8]d{ҤYGOw7K!Gk r=VӇMzb]Lx;]piҶD9D}?:J%br2@(S/ @'-q:aOAT<`uiLW?G\Vy{e4Ϲ+f9KMGV#Y'o ]aa>\>T0uWg0P'ڙ9>&:\Hă:܆^7FkB,A<ڬv  GyFp_;|Qj˫31+*]%KwFƒ2慾KOW>v4RzR) 3y+VxW BAR!*-qp7!z] Eji; #}9 |PUï難oZLk*m6.pRп` nx[tP݆]vWFeWL_txMHJe/pE,16>MkJ`i(R7boɫV\HC3#'tL',7:"^(pn9AE"cO*Yvu OM.*] / ,dt!q\-O ]_lԹx5|hL"YO)׆.KJj2TĿIH`yl\&y.vBMy?Qd?(q$z,??4$\ʁo8`@sna Vq &z컧 .3 yp|g EͻlVAl H"2/޵^+y,BmOP!NՉdWY My02AeV ,֒#6r͛ {#MHe᳡(]KN]ϫ23TI7蚫4Psݡ^CH_&m8j0̃ !+)da` 3$#=KTCz?`F&j՛B Xl$7FVo*FSP~HB,]ׄi@=h(GكQU=F h%?{D5,9rQ|YIz]%#Ŀv􉕡Ez#=&<9ذ#@a#^ZU}yo,XUqk+7AU'%'R `͢ɳߛ@o ehdpJPW>~ YT(?:cUL1״9 1$kNwݣU耝j$r4AX [\$£NH̴}e^ft5DDd{85 *+RL-!%_y-Bq ,vHnM%?2ٺstU3ou]TqTyR qdt8D7nΥf&"@"Y n.u+A 2xp>% /=~dᅪ0 _%P3%-5Enگo$ʽlDB~b s\YZX+"g)Vg@6˴nAMZ@p ip6x 5zϡlb8aNw&z,U瑉UԲ 2 avߑ_@ 'yIKL< p .&ᶗTɋ,ׁ1\M{|Y db:CY-'",e4# J:߁4_F.Kţ;6xy.gdUh!2LyujCp,xV.mx`i4:뼪/v!1RcnF $+۰=WXbo|s:bU8kI.A1i~f?a7$@+ºYt0`f1nUJ(S Xi@otNew8KlT}8@.GcDm2a5чW]axNxHP_oQj۲>u49(D%Y&A2R6. (F~Clo'_#E<%:0XG9T tdD0iK(N yyP^99vF0"f5HҧkyK^ coE%)ʗN.Oڔv/_{2vJrlaUbs#R8Njf\Ad^vG|s ۄל@WoRs fU\YI%XV&Fbic!x_$d1e!*!{mDЊ>-ORGVZS s'W@xxF11P skvqޒxd7,I|MŵcUӿ~VCvR=4EvT}?č{e \n3Z<$zRlH_FѱuLϿ/|1@BH+2FyLȍK멊(P<&Og*zM_rכZ[wPO Bm^Ll%{M`oo#+-RlUaG8{-=XFrq5])}u A4;`z`dщ@ GpWȳԣ)3֖@ ELHJXSLDuoU6 vȶ(q|r.ـN=mbK݌dZ ܉xm&$Gf/ "8TۛAY Ϙ6q^\Y:<< 3x(T 7irb,7ˆtǒjT([NC4/!3*/0 6:DhǣHY^!ft$~H|HR>:>bW1ysJo--40G$)fDt۔nЕѹFh@+#y1!sͪSk׬7z>B(%?s2"UA0>ĐIf8L`Gjת6{iٶ@7-~r:I$>I֙+=Q,?O;{ KtrVGj5'7}FOSl?ʵm0ܯ 6>N[; Fkv [T _?JꚵOtx4qK\eN4 su_cr‚Ig @{ԯ %`; =nL+) f <@,M]ჽ"=e-'k#W")A3L+i.W/ݽ9{U6[a_ٲl*exgӥg}GͯE1h2L 0Ҵ7h]ҴB{ 61_C'ع9 O bVQ:k7U?mh1̘)A`vlY]pN?ns9k:ظ$O,-鱝(5̅K#eR=)zSq)o@zڌ|E $kl}*'~6s9q-pTHk6N#O¹sDC1 %XA67#WӫDv/ qO& 10Ҏrܙ*tlizY@2B[AKSWuvu{AQ޶аCTD;o"DzR lU)E6ݛȮ*7dc|/eJ7i|pYI ^ywޯϱR qIa$*wjG-!q ODɺL$MƏb*3jTW}uHiD1eã%ñ|ц®O@.Vըfvg1@UjKFI TTXadqцxb;~?#cX䅓=/Ι~Mۗ 1;I<#)ꂍq7#Z㌰Vqn2}|?ÚgM0kQOB$v[{s=e6u":|V'3# ^OV2; =x G_בDYʫ&#j7Y#- d4ڝήE9P'=qZ`dqcp#t|58֝c>vAhzKAӣrVkU Rї;b/ց2P,#Z@YA K~nF5v( 9 I "״h[ TD!YLKx ϸ`+Rbe:i1J&eD_Y8O (&a+zm݀*Fi|͉|tVW#vwwVC):[vz:kƘ-gψ"G2Vk08KW+rŨPִ-LM u!"cQu_4E7_ j.n.d]IbpzsCR*#By%-6PX4o1-N edޕ8~~@T8|i?ߥHݬ? J V`ʚq lDy}[j]F5{?:@;a$ uI.U ~ /}Ajˆ\RfS!xI׃kC}TGF~Q9|(Dz QË dAVZҧJ9FmDca2E7n׏g}[Q(氙gK@H{n߉,eP/ Cn/􅀈5B{?wP78C_,gE5HW\ ݱ;h\{-Ϡf7PI#+ HRRG%2 )vЦVFöߒ8vݹtONOZN񗲼0ޥ0J 2&!b:~U?S[!CH O^7ۊ%Iǘ(1Hb3EyFLb쯼j+/ 70e {~>>dN@# /G@Y-ptdhފ(rlf|xf{+6GSu.zv[~Hs_0DZ*nk8{WsZY À/^" ䷜"%u,ڒ`EMp'jbĪ+@F~`BըsShD߈ɘؗ'Z }dHGG^8i"ITRN_:лDd;GuOusva) mWy6:d:4RbUoz(HXd⻃S'I2>5* WA%](_mJ h\"Qyө:*:]mMUw+LhPr}0/K]u.x Iɨ':zפnc$ Nh.D<9v[;t@%di%j*ώ#G Ɠx 7mVt=T&rF8O oHꛛW%8Mu?V,2f\Yxa-i}R&%3=NPR?Qu]V>R#o'yDЯK3?z9C ( ڤS=~"ZŒ>K,ex.r%9c)kK)0/\gfets[qp.Fgrd1q6߇dW4Yw1)u8d?cIWפ&%Ir_`RԀ*)x*,p$ 4<ɌJ{1C<2hE/ x3h%*:rUןR޽3\dAAcG&;AZIfaҚǺNz(+d!XV($ (K6^. o>hJ ٌ'w^ ’kW^ 7:0vB ?wnmN_ZE(N$݉amWHI2ϡDpTkK" T:iG]]˥b.:@|Ӳ`zGW"p-9c=\Kx+2O<*Xe^_oaY Mכ+kJ)[׳C# y1F:3^S bWyV ,N]$A15\zb`ƛJ_YB1lK4=wO_ a|nZd+C/~' ebRlPop߹H]c0S}JQ]Oښ~&oJh{ GS" $ hL@`6kEJV!$%aQ-'2}Bv]swᙝɁTrð-d$uc36-єd<7J703F=n QQyk9ɶ Xa=ĐUL6fhp9fJnt1/DŽ,0GG"E* -+焂4Gn<@ܽ٣Ə<_+S(ᦴ"#4(p^`ǩ< M( GdIý<F} ` c0M,tFF5}B*kB$Q|dx8avSjࢋG0ˮxHC{䁉Eqfz臃e*e`Ukc.N|KTH|v ֏pJ3%&3nL.IU>nRT,1|*XRRv MVhe%i2P\i:d6W+KF'XB[Ŭ';%c"lmc+cf biop_|S쎌QRQhU$ L 5ߌsҴnirA*¼'K1 J8.ˬQ%=NfܨUFb5\O@N\{7i)5/'c#4Α6] CX=فU!rN=rȴ-!Q㌁ZЃ˫e+A%0\Vw1-)`imu&et{D= )]Ɏ^?Jbn[_IMAϏzQi{j?mh-Q_rJ 9#PRe1v!e&Ljler{Zd-|e հ$:8P"LILHn}C{INntCӵobf=kR3"f@g\\ڠ[WۧoGz}s]ظ'`H~=cE;~:Y3;ɰH谨OpPEh:wts,Y+`䢢Q@0 :3˹ h/;"xlrLnmMB> o/\VZ؝tLIB.']/db&fnD2)O <;ְmW]=zf6z aECA_,G% (vH;@^_/ F|۴'ѼLf&`hexݶL BJZǎ3F=co.Dg Q/fvݾ̶5'B{e:Nš#P](d=T=0:|- t޷x'?xҚ@krKVGE 'ƆV6;i0hf>{(r$#yJ&؞A ǡ@zuNm8 TJ+;eXPK:K'GڃFT&^_Yʳ4sDmŲ '=Z;mhS~^SA_ m݉3Q@::UyC͕u2ĺ8,hi,$lSTw Zs^jڪs(mJqS'GE!#"s;@B-נe/=)tlMr=㤿-&Ȑv\ 8nRv̰r{ٮL}}@𽠟bϢ7az:_T$@Z]>K U*~i]0zk\L,;ݼm8%6ވTQ+-gD tf X!X2R7?z9Qg Zu/[ AAmpjY}wLRqM>iơВ*\:mϧC2UWG5~f~%JQ p R-=r,i/F  򡡼Ċ`XRK(4)!WgĺO^sJ?s>XRﻂFM{sAycfIF"`;.bgR%-d|geL&eNżRVl wۗ ~mofúc's *mSTJ3ȃA#<@Թ " z+`|څ9^OP˕uaZ/kq^Z<dxI';E,NSo`jmtp>.y?oЋST8hH)dSWTV̧c9E;8#V-a4p/ 4#)8u^CSu=Nj}| V%AןL8ܗ-'K}Qqګpd%֟ץQҢ3=j^œ%|&(gg [{u1ޠE3HH(wd+.Y K,U@Ʈ/@ƽVw4MzѸguϦOq\Il_60˹S2h{xtݐhpN>JY?9(=jȞ9 vEY8GTT6n_(jJj3ƞG|WzbJ'7~M/1ԴdݠMϟqKs`eU\ sn7):cbxX̖Q/oWe[(HO+mpRZf <=IŘgqkl=l:ER~ +̯uioFp>'ψ˶(Yքިy.3%E}wof3]:ޢ+7?ӮG{zXvjN$ ^E-C"pg-ǘ3Z] ʾU5J%6T3!\3Jj̏l C\P` Ck r_u;|%~rJ~e3Q\+1vJXn ńox&{ݾxxcTOzӾO+w]WWF f˔ b,iMd%2j1'GX!ensR2n`uσ yЛ܎l 7T{1ncߣ3 %K;m+/?BYf9`Vqvw,!A,G*qy~7#&L6#\ڎ hn|[ۃ߾=^I;8 $Xt6AA(('CΪlTUh?H% 3AEWDR+]V BDWl)6"ۭ̌y~:^8,BUH],[Oo^|O6CUJ<[AtSݪ8˞i 2ۚc`ZUG%TCt!Npo deɵxïx1HӚ{w\ 5!V};lSK! F2:f34_B,GP 4TLqXcu;3Mhyz#/G ̼]H*M'kHZln3mD(%FɴE Ԣ%gtF۔,] HV 1u*{?"<\b*:̔W#+ i>/~ Xמq"&ElǁRtf]2vS!Tag7 MZY)a|vi.g|A=`ϭ\5hL^whC%C1a])Bn{< w)`Mek5k EcCSq 0ɊF@bv@֑qG#4,?s .hV֑s 9F'Z(aS?fȝ{ &Ϧ:cCж2QHA4lJ!b)o_\钿=vGN[a?L<(GXͩcm谒f%)~}wyR'PfɐHFИ% -WNRV`rL` q ;{"Vo'= Jr>:ύ;lA ҇#pu[oosfކҩ1/z#m>^+b 7)V:YH(8h h"M3e~ jΟ+&ZaW13\jU=cװ7tp)4pGr*}cĈӛK:ٰ~_)h>1ҳ'եdŃFO~\ r MU *$,i ,xkތy^PlKDiKbț6.zCs2w78 ljf/n $۶p"&ޔ/8d?[wõ?~ {j1e!+2c3IO l J |[=] #;O%ㅔJ 48F "T5>P`dkd#A.: mqƐ")Q?Sr.]`j'=Yq|"3Y+tr^4PGrF5>H @<ի Yt;޿ZÝo6"(lGNȸ[Kju4rdU`/eN"x7? z K4}N SW^ewݫ8NEC>I.lƄT^l1Ta7c-jʹh%~!A_ H:}ī5t犯F'ߠ y<`%d䬏~ }4s:!*׷j癁Z 6#R~eb>ZKt+@+ lKh }>vjּ.qz:OT3T9}<*&mMPeXak*u?[-'*nO5QA|e{15j~ֵ`PPtBI6el#YӏXdh(oii$Qܴ]{?>v QZ C$CyVo{_T;h2ސG$7_uFm97 SbF3.fZO5Ym%-&&ǔo9mE@:cZ _I !VӄѧPو`z/dz2V9BD55&\*%sv9 PzYCg"9{pƱ q*1uf|rA{vG@5H_њ2zMt%%Fӭuv<Yzh>>$z.`m!7N<$4m^騑m4) Zɰ{, yzjA L{ gNixA6$A}7mKt t-r1k\29C!T+NprB29YQ݅Ȼ~ _;Xfe!ǣ1iPia{6-m=*s$ '5/kYF+ ̩v*%l^}D5{7on9$~=.8V"[._ ᱿nuE ^ST6-nZEkw-yuSs )XL*c,d0NoE4t*f߶ G2|/>KUL[s3< hm&74\X(=0` 8w@Z6,tnHn@Q7Aa.")I#/k$6\bhI'(:-$xZX,)vc@_`I1b2T6UUKbF7 uQ'!o`&sIVN¢'S[\/A'k({xyrA=dx6sT{!JHpp9WTű,.Ylx~0vS?Y EniTpsAbJLPt߰$_aiihRHrteﲠ C8R"Ma_lϴ)?[0m{=Bk zHkR;.,[w+.lb'oe"4 lrURB$ˀSg8BtiY5վ<{wձ'v,'{&QYnVVXYVzbg{skrN5ˣjc GNq4+S |/o>Tgz>ɹ?XLEѲ HMF+'=;DJ)ۯY4]?1L=,|W3bYḩc84|#2X:|Pے :|:y0/OӾ:s+FEBhj @e=~=OVOSnUՐ6P;Qk]& ̳ҹ$e[S ;W|+?*%t!S߭@;A}fx$|` X(qN5 27ՙqos11$$p;Yo]&]$ xw\TvIAjCO_aے\%:ҋsTOQ&T3_'P]}/u{{| 2PG>ya>Q[Um! J3N C %xkauaWK%  iXk׀vV@uy9j:n=+バOR^Gok Jj ȽZ+|Wlcޚ:ߊsvhd”ąd`FIU[%7ㅅD<I+LF:^c5v mۈH_E$c9,EmtY*f'Ei.8[9Lۯp_$"a.$I 'U i~6j]GWG/+I*l&^lm+b42 8 ~.FN X8@-R7}.v:x<4`b0\X/FEŻΦf3d+,jO9O8+h;~"`Ō(N\$C逕Iͫ}ԫ/]rڽI輆LeUelm"" ]>bV[-Iu>ʲ3l̏ÐBySwf .tt4 0R5?zp*4xd s >loa]]ϫIkҕa4BA{&N~>pFthmʎ:R4%?ANNFA)7>~_hKEI-|sIHIK_*p݈4h0jX[}j;hr1d谂.o7@bOo^w*V( [?$v7MIuYcGz7^YA&vABŕtw*F,(5uwEm V<%6HR+ٙ;߮-#A0)Of; yxvEDg\m&I}? S=[:|_\ݢ276DxTuM*M7=uy^Uom{$a^AW'$鎢0u+ُ韂Pȉ#h|66.B!]]PO7Rw'\p!ݨQ?Q/!:9uvqr&?޼|w3RN,tp:n4j}Bc*BD-mux!]W/, TjϟZb#3i,z*9ciq|K}X77 Gaʆ#xW߀7RU[c[5eF];NۤȾV0; tROtKLice=SAO# xJTL>ᣕCsT}3pMzѢvc3)c .N+1ed_|Fȥmjj=ՐS[bߪ@_aeC[VDȻp$*ٶ3͡s-Id$JOZ fO D=1 W49B\(IYHIsR]VAik3tLn9ePZRmɰ^?R2P)蜂o.ӁkhMȴQhU*'_^Eja0,B;Ӆ%R]_KcVH 1lxB6YX p IH%;@BxqAR7|BVy/j3IRp t/2s/,Gy }MAgɆPӕ@Pf4.*Yղ.i:.Ƒ iq.6 ?pdarrU{*t~9U(ypihrԣ{Z`s<9 3DW:cQRAz (89?J!k2,*یx}`LBOL #K/ e"Wš5^O}u H< If,I^F J_BПMۮ,]uoS99^mX< y-*+ىd$ee;@mXLUO\H6<9(\-ڛ29u c3*pCjK{'iM 0un|}:-[hFe=Ҥljww(n%";.Md gnSy0셉bu쉈s<}Eup´Gbfo`k|O*D;sI*p͟N%8dso+/ɪ[6Y|FЕ9d+6Kyd]běl2M:\Ϩ%tum.,'<#)GCL7߶KP0p̮4,1u tkѡRl_ aB*Zyw)?=55 h*WǀaP"?1WyY7%7P/޴1 n0o *H)YɨTƂ=#J+͆k^2'|O-Q)eLsG,?~UqJ|tOBT$3d.-ރYZbNRYB$v0nRǢSua]rizHl[fv{ c1y.odM~$đ -WI.i8&~$sIEX:U@El`D<s WISH W+9]SQDW;_dXȏy{ٍ̂:'TԮW*ЦG2lJdQ)#!2S@z]IА,á9i W kL)m;4A6?ύ S__(qٟ1ZpN!>+1Wئ7$Rh ؊A/uVߘ)D6u0;yzct= ^Vdz0tB1 &E>.LQ)hɒA'u벬R6:}bv$$rEt+!y?V0t6nXoqSidU"2$CirRRη'a1$cz~93YJNj!:iıK2㼜K'\j2 @]ʊUƼ,H[kET"*(+~W{*_ d.zRFJ#ΐU)%_S52>6^z{!~;j7{&|}Pb+^dsԓ 7i lbg?_/JR ,#Q62Hʗr{lk!ɩZ;vEQN )m:Q*6A;F V$/A ^(䄷r9@NH?m?¯h+s{8 gB n :E׮t>ⷂP ~7W0:tmEM$1yWq+(#{yHy7.kGDb* ^bTگN+n .H6n hCa!a%.j|/\MgPyG;5)Wyۧ9dR3_fUM< ]Rk~4 -+mqy4{őfmTF eEFKSX( Ϥ,Ayj u8.&c QaI7h~m_B;F k^_C?AWh4Kv'Vd\0?w nڰԃGK_~5d%vup'95 7I 8#ARȟ5qHQ&OqLJ^.-0ho%*|_ӟa=%omȬ%\D }H?vju`9KW$Ȼ;D/q:YI ;׷2pVg-1uU)ܧ0c2:*-tub|3&"$2OBi6l+9} V; pY{ꯋBg\)-HƋWum9\Œ|¹^Qtk{~' bDsi2F-+i=<+'0s sB)U~wJ2=U:_.=?2ݕbH]GaeoA5yZt,ms~3IL6^2/җHO=LYABf*|vq`ěb)5^t;rإԏ/'w|t)`iCMGh\3@T+2L=5`D g}(ũu :8gRgNsf! P6AeV i&#m?Dwޞ[h9CỤ/ɽIrJjaXl}.Ԗ꫽ U3jd&i/(ۇ͛j{(ٞ uia(8U4F2DQH8Bzu.\ zoh-Ӟ!Iu;53 VVQVs1h/d|DuhmF wSpqlf}صhɠȚ5)MZي4:L(gc>(bwc- '4(Xf'ě:b_hGs#μvyq୮ a1-`668jF5}{b7Ş9I!8LۚF*B4ӓ\;PHFIύ1S`|/z'mu{ Li>Ms.Vey\N\6җ*V 'XY{+OOMYnsǚ5P_![q#-9na/%SrE[M](m|nh=Jjѫ`),%R /pb}P?u*:k";֛f=&+ݖ"/B땪,%grqĬ\U=d.>醞$sa,ޟ9.#h_M n׵[o~L14f&<> ϻkòD0ȻDK;oƙ 2q_V0(UGqL][g(fOqz'͓ +opj }F`ot3c4F k*Hg`h3 gNƋo0jናŊ52gr={jބzlg ڶn?h֠>$=Og0IIfj9 7'Js  Mk@i Yg|PLJ1qtpIL[4&j_w@$Ccc%' 8ZN^[v3a a,_i!0Rܠ GQi_[ϕYr"(O̔.G:qED|||2F:&r{$`4o'Yk#~6cvy3;[6~ޝpGPJ ejL:G G6S)_#/Ρyj~>j*$P0ږf3EC3ܦʥ;vE Ju;b d]MR[rO652H\4tYO6[:Lٲ+8rڈu#9M<1qJ#y?s#5ֶ>K4F-$7z[&@n-LmN'#OUu85 "a?h9u=9Y{,8lh1y{hyo{] 60Fwt0XK$vH\8X99)RfɅUus,in$UA"\;u,4r$E4{%>9ѭq1t+e5Vg4^^Ȇ"|7<5Di/͙N] }Pbn~;ԛW $my wMuKJ8?[!^APO1H*[8ϑB mnC@ PkKinoͮBk\!%mX&x[ yAR;>\kn:qb.tu6Rimgg)^I2ֵ 1V~@_Ү|#_&NuňJ\"bRlDl`iRV?In 6!YYJ> #>ӏ#? ]=AP=33誆3PK1t_-5ݾp9T+׌EW0\,X"F?Ҋ_+`NHZ2yJJ3M6ShNO T[}'35'Zrm O[b9k5_=|ˏ0 8oaz*cSf;VT㤼bc#8jB (Qկ󩪵+j kU~/0N`r4p/w[ J[1 jY@@Tn {ĂmZ;NFJ볺DžN4 ,m5YDO j%veKM 5~GҶMrwc*ɽw]&kMVb.?[DXP`m sDDvF+KnIއl4{;ح5,9Y3*Fр/lq"@DɬTS1زMHG䫛}tB0O7pvUVOYN|Po!Z&a *fJ4F9rȜ O~i--ڮm]ri]Fq4m8Dbx0&̙ !V 1:`@Jcy9.oJOk8,Nn9qϊ`|cGfůҖ?4HkƕVZXCC25M oCxG!oMhw5Ûf$cRBNP|}f,{A>ǟB/|"JrFg7gz+K~֌ma)Fl:O1UK0UjǴ+/x)2^Vy\f!6zK>>٦X eBwec:H%z[da2c@u+'ANaST#H{+F? JM!wAm`6~n[# ['7tmXaB4tfSv+Rk UF‡M|S܋a iv?bg@x,{q# if-xn^-ٟգx`JAPb|}x|6F:T@uOB%yə|0' 痫E?;Q]zRoە>6{J>d{2JfbвTOOSuR;]vLK,OqbeP> ӽ5`ރ}J[@%L Ӧqe#eROq*>~TX0hx;)_}DZok ɮ3?BɌ7f31'.Xe4vdd%WbRT|pAљ`O.CFvK ^**pv,V_2΁YƀMRΊ4ugsZQxp72s55m, J1#::Qz 20<@Hq)T&(qFF^G?+b@LrORTxpxo/hg8`&ٚ72_^sB ).[RԨz8`5vk/Y Xקm&0ohilHjh2E *iS^Twnj'|V'c ڨk[B\#}М&{ׯftqJg,%]Dt+eӋye݂A5FՓp]BJ@Q|%`gB&zz\!oj}_~bWczVS)lGZ']*:nΦ+xb&95k_#IY [6K5i]`E _孹b#ﮰe^}k 5O`[_lF^/.]ugTҋ9ϒn-1DHBFTgs;:bfzaz NjrrnsT(F<̌3kҒ߀7KYpGS8ewY=즴Qvc&"0ڳZ)9J\=ǹΨ,ht^{a܁270zA0x*/ aaأ"{:$JbB/rbci+OD&!;FMj6YS_ǮSTFvh-K%peGQ$`-!2@^~wZkK 5}qC7 HX!ynjlc#.߭cd92:&^kAbdµXlh-xǵ#U? &iL9)|`Na?b8=T&_SB=ʹ}:cp/>ypjio#Lh@ʮD@c1n5 ?(]@i>"=R[l<cEj|m.FsRY>UI ]jHqqSf2)Y >ʋZk&_$N"\摸~IUqڹx5Tؼxa&-d:FCLl3ZI/7T(v%7)`?">4>Et[ؘZfǛbG1>xYY_js!`{J,8N"|mUM(Yy!p T>xgS TAPO7۳:b! B4N]:#%ΫOxhȆFr^Uڞl@qpq`%;SYC'}6:2_u0rD_ݽkzLtlUU:Q4;Vֆ5:hۤ&Pߪb?JM#. W%h; S KuKqa\D*};ՁjΝ^$Ϋ|Բ 3 @Ҿ!̬R`0il[V@ĚOoBZT4w<lo|tnAd;c>>kCW՛?y*=2m{TnehQ\wTܸ< =~*DW.F+Xl6tA.Ry{UA3:<&ӟ<^jt9W #ԃy}{}#mTx g%Cea3ZyѹD`-Q~V ho> d+,|>%KtE G*E0–}^cVKO0x?F˥u|B@DHj9)`%'u] D<;G%b>a ZU܌NqK7sh]`DFj>ݟ!) T+Mͪ={M+@`15/{'1q`>Ͳ"; :8>Khc6PƓVn&h86 @ /wܩۈ ˂6h2ddt0*ؗEH*@MHeͨ腆A#"X<ց}zȲ>Ye+ZDuܢhPjw`C#W(Ê B !꘰U.#zA1-3,DN6 N VnP-•|q)ro],d"0!bAQmԬ5ceX_z,,q*|ad@񧷇\•O'<`Uȅ:g75?\[B!1C@Ultד < zWh!fNh]c+Ӡ<8JSYtH$Cj m!a1E/_bv`Qp`j*X<Ü9A6uNvfVZ(fy#)'bQ< I꫋tz&R,HrbW.8k"a` 'jʷ.O.*,Fh12'lYGC5f[ OsQ 'e = bLZ;] S\%mKkO&`G#0k+[}}gftGChb\S6ޓ@r?#GvBC[Q,qÒ?޲ ~9*0ӠN;٪Y+BV&,K-?E B^ &$tb. Js5LbJ(*ڠ}bVD6W_"5tojW?^ژegoD0CW~NJ8"eM5J.=bNِ^r?_zY(W2mNGޝ\>qq8=nQq),){eUjw>gcy].c^B)v%(/x'= B'' '=(TgYUa:N[. b W/}6uftZNVVzI5 Â_ O=%30u 97(?gIJ,Q_"&ϔ&_0IaŎƪ+X5:R8h=%B [?txz/:(k7J+Ux}\w(eDѹLu%MM3I@*fG4/@B]/F>kLmݤXMoLxjJK` h}$ӃjAѳs.*נgLufnBcN)RQTNZ¦В}yb'Qm5۵gPIylَv>8kϖJ=dY3hCE<f\2鲛β%`Xnp:ݢ {r91}B^r_řh!6VVasvK#VOUr3 R)+w ~3DӊC.=BJCJ6%xU] c {+ z>M-u"8۹G֒CHXRn,ҷ_W$`9A׍P$TmiXf(SQi_0mfۚnvwn/3 ;)~#usB!l,vj.t.2"&7XM0=]8' - fXOqYS<l3dldTmuVԱzq#sP.6BVa.k'K`pt3*nDdj׾]e Cm:e7BlrI¡ %mfxbMOxT%2 >Ar hGa$ٿ=,`%G#y+2HN~'KʀcK dH)<)iHX1|']% pUeK9aCjv'HL[ zJ_ ͬS!2TTNsԿZ v:8i;MqQA*3ÖEd4gu 8J:"~NyÛ_HG|#jv‡S]$cD$8&g {"5?P`(fĘcMx/ x#f;Axߔmo⢳z&:f9y.#_jΈPD{jl<`!D-{Z &G]% 6߹5@hBGGk: 2(MyK JdmD&Ussg6[}Y7߅/mRVb&`ǒ}Mf e36r U?x2kވ]>9[Kq:`^A9]- S*Qq Qљz; 7QR.zF\X5iQU f6`& BM;(dSM"OMXSޛFߑ٥oN]Lpf=sM؝UVϪ.w<(sj2~W/0[v"wHE o?] ȐS-8%=#U0 Cg W^sOBc;`.@h+`8peDvH=EEgAӫOY0blK "UtcrmQ`s~[MZ)}q e4=qTnG~Sm?j sى~=Jm۬)AFnfæ3mNǣ 2:۬&Be-w== e GWCa)lyJ RMC-v7ƴww׽ {%WtGf!(j_W 2μ֋J16TOWBD\balm?;uF6TRUـNoFslRoU[*5K-s>f*V*&ǯf5a6J # .kwݜt MtoOy!-k[(}C~)O*1)n! g2ì]^$ϵ= 5&xr0?ܓ4dѯ)c`w0IVJ ko2?a>LF0Y .1<`}U\ʺw0Z ~KS@(e@Nd)]#wl/W"UŤQOg_pc[dKX,J軂z2#k(/wf ÜѭI.O@" K ϶4oɹ֣GL=gdpk%? R\F))nQca-sc JFD{SCP {$oʐxT@);9"ZYzrpK,i-6' v\Mx>gIcYcOnBrS$:޵ A v:9aS?Nșؖ5~9T:(YJF%h|fn(y' ?0}/2drXQn?4xV6H>/32R=c$%*f U-)P#Rh \E X7nn_s9["g{Y1AŮiV9G>bN|T,m ZĢVAQ2m  !CkaI3~F7DIL"G@פKX𳁲Q*#۵-ξ 516d:9+D(,6;+d-U>2(h%ZgƄ{<% gy[ &S"eBAvØbqџ)2=g|umkOLe0~Ib梳htFϬwtm%e& ~A?n&bU@S|JMN9#ɴXY e<X["o=J!ʙ@ :Ww#Qnگ9̡sOvClfSj DSR޿Fd7bԳISbrSDP1v'|_+ZBš1G8ޜU1s1zpJ>azs)+2 ?450"u9;q|'ڻҚU'ݰ[Pg^bmArDւlh-YDjtzNX4",E|TkG!|Y 0_]2K)̬10QDH7*_MsgLx`\mCViOPobSRXDyВ#P\.:vRMPdb'dO*~j9|DP<:]79g\mS[VѶQΒtƸ>S>fC!m9}C VklX%3\17Y5}6uB2lR;Rb܏[(@.eN.$U,G|K()MCe8,(V)dpF~^w|,hDcBr-$" +"o2 MYJ/>7n6\9Z ^PmIl 082[F9)y'bQ7H8l2L/'7wR{XO IWjatEAAc?%*pX`h2*Zȹ恍.[y+^qa#_a7 ]ؒX~;Pvmn_tSqWv97,}}Ydd+Q@%{=츭bҹlA2^iNG]b@#BpJpJ{,&018X*{U`Ⱂblajx) .\Po "T˔7r I6$L">is׈e'1%1쮞fjY!x$('?c`0 5'#ydQ `X, D ̔>08_5E gL}/W:5f}UBoE9p5^ۺ|>K]78Nk5 R@d/*07]1#*ڏ  ܥ}LWʑݤIosfUF<~2 u&tUp@҈3Izd qfŐHG{ݸa&d+BW{gІYH5JjTѢRgqA;jUvonA&ku{׍%P-ǔqH#V?!bBLEĬa?}@곒UϚ}B!lYHkvRx+^%C9YLJܞD4h\;CFd?VG)}1!=:w]zߊvb2 Ys-.H ѩt@~( [HJGG-^5ш "|} {6O$E'aL HAKP$>Wksdʮg99rdj 26a_+J]hP5|Z2 {G_!c.Ux[K ̓R1NOPpI^q୒t_lTn^uĒ VэE%5mU!>{ώepkPI1N焀뢄}Qw/^m< ؒhGum3/7FUأahFm:v4x91zi=I,G+3@9h7Vz2$t!Kb|E>&|1rtx~$+ }j9ވ\{;eLAkDuM!OBOvUu {Gv⊨b{Y M(Mﲫzߟ[@O^D&s"8*ii60ZK:SH4 7b@^(5"};OTM4yCy%,K|g ׄe<5<5sMr! LZ5ԂsJ 0tqZIag@$F2m?%$,҅)ZF\XL<'EoL1ՁxM>qm$|\ 5ӡΊ;Njk2[S<@)mur7'T)9o"m6:%\RmTCRr:pjG:˾--ɌijX#xD?oƱF`L=Q*p k7VS[5V/HJgK(0Ѝ`\◺90P/ }:n ֨`^M<55NP\&"]@ !a@&R6p">97 d=k}r,L*C1n LzWDH&"$ymobR[!'-7˧BzLܟ_{@qo6r wGLi VAVf(16ja32Fn+XT% ufO!3[dVa!n<ĵgje 0sI<7'!#͓\S$q8[2YNq m K T qbC:<^?]}+dpL{X7C!m,s½ hju7b Yzv_LҎ%f9C5N5WbtL{}ʙg2L+(LJVe܉E$Q}aeE:8D.! ܉JYtb9~beF{ lАe r=QQ 3 z`(42S'/1%OGM*&M;(4OD9K^uH!?Vh򹓣/bW1M~XX:=ii;|}gBCh+.7QR0 tjft2׌b`i$)$!O!/%T~RRuZW~Z$^ LX}pre臛7 v+4]YNCI憑//y7c):mFdSL%I}?Nǀ[:_x_O{_ӯQ|j\xׅJRnβն=t'SөE?r- 5և ^d>(AU-ug|`J78E7ߊnD%&2a> V~n$ml&*y+)u~>flj[w[*3f\KV\\;bVQiM#[hD&r/fl7|DZSi7!rVY> w /"^ ԭnmiU8wd/wmt:DNrdxMyXсRUa_.o r3S 0;]sj9]DGl&Xg.yQ4"|>hq~7IM@pY@pYb@B lKᴢ<8>YP];KU$nE;ͮ)1 L;ÚGXÛ|6aC~˂R/D(kONF]Pf\)y.`hFO/5&D{\v`mƇUp)O%*3"&3T/!(U @r\blCL'DuUؗ"}բ*+F4wL\pϹ?@|oa@/{@A Mk=xJ<J"/cWSmz,r}rb}<͕mrZ-ǭsş/RsyQJ&9rgYenEUm^+z*+wl(n>Jq|z=c3V.c]\BT& ӂ S++6ܱ D8'NrQ)_4WC@^CQՃm*"̄n҄HB{?Z֊!uO,.\ ~J\oAg-Xh˴]`.{:ؓkNeoŅdn^NҺ:"p܂CE0c]k:vԌ&,G{-}f;_XD]6%c€鶒3qqQ'o8(X9tNyőAv:fck 3VK cnȇЇӊ^@ߞQA\Dz.ﳝ඙9`NWdm\؋%#C2)CH gK ^|֧mQYX}=(-Y+x l*y.>r7s1Z3;8 C)( =*sGOWEK{Hȃ7MxbzgZ |`l2>v%瀭[D I`oc![ ]GvZg#2MהA"JF@7\[bTH;HLFSH~{wͺ:sz0Jn8x<w-Ƒw cUDzL) J8atHQ^#;^YHv5;ŶqLu`д̉\;;x,JBwwb.rGﳖ=^'z0r{RKQ49Bd֯>m)1ކD!ل0 !<#i&M2q]%{FL'piCx% ia%cb?DW'tJ2ٍAS ]oo=at#?N#&d!\Z=_#mb&۵!FSD[iقvL '4Zˋ{D_5S3z~%5=QOP$,NC[6sTm1,4!]7Y퓆3X6-ݶ\.zK +LWd+eܘ̽=2\`Ӟ< M]!dGw-2Ǜ*em4;z;[ hD㵠4(63Qw $Sվ чMx@D|ޒgff!@{[y2IJ6A/ Xڑ nDelGxǞKx1cG#*-eGh&Q(AߝLun,ҵ qAj-NR@X[xȺqZtA\mV< d|'1(&숲=s;;`ChtASqD<BP;8uWnw(@Z{ % $ܒ9N  "Y)l1|A#C9ϴgRp 0bEYPTtJ6oSRBQrD3ڻW)%!byJ;bmDfk:T4l2.Ga m5: 2dE#<ՌȞ.Թq4[Db`g]Z95 ?* 'V'vE׃-Y GB3~yNӽmZ R·IJߚ'l3-~Aw\LT+^GQV=0L/B$AΰWk@?Yz&30d%m0Ape(gڣ=2v;kCﲔ>Pu~qck>T!se(c)ԂQ `Λ_%2;=Oo#;5ܞc1C?zv3*F veMki|<rSH4x;,D)QO<7\ Vj9ȓ$6*Dh-7zOѶَEIMt ^VO@0{C~a xCZ(5'!`g9tw\ͺCRf;6Sw1bTz3^ƶh7Ț| ѹSݎ؁! 9'¤~4GdLp2=:&X! ;"3,˨?X}͛`8` Ys#% s\e;dK4P8y;e;唶}^?"% 2촡pfKJ!~ 7=@xȠ9cjԉGev,JӼN|}{QR$ 3ZPrWy0kM_< oL\W$3,S&*{ &QU.JF+UG+rm s{}Bz ӌ<, e .s 38r6l,rW$sDV‰T3 N_ۑ 47D([&q(δNzU%xφ>=b V8ƬDO >iAuLt, u+6}rK,bs#`8jFDEt@tBBTu.2 9 5r(p0i> sK+IK 7߷;ka6ힹL֛?{Xbv޵^'r0D9]GvB8'GR+@?E).V"aGjQߗ"akeFJdknly a.3,T<#yH/ #r7gn3D`z|<wR5i\=fOqފ }Zr-/%+j.zaДA=ץAoD~!PN6:G:0'k'9xAI{w?@n"xq [K!lr5 8Oq%4eUVjPΠ [9okZvM q0م ЬjT0$^/m4a\:s@ _\+㝅*qNg¼o-ͪޯ nj۾άdcsꑫXJj?tӹ{ΰhp *.#Gp(-Mx0y:L|KӺa7F ŕl,(7̩`X8ݱ ߒMsg J%i)Sô~Ԭ5<9Ǧg rɫs-)Om\ܼj2I5D<dB?)Fx]++hfn;imgnzI v*p: c&Sm h1f@$Idl*(H ~/=u fN̏Ǩ]EiۂJ:,ʄK-9`V:8tӧE՞6'G(^hJok扅v22N+>̿EB&{0|kg-4K &i77eifI`>oѦQlch;)`a\`)ѺX:t\1Z8!% i[qə6Q54im<58*r}Uhc9`if O·7>s"d~y_G*ݎ|`NyOcV+3ض xG`1&<2[S}Cr.-Z0~lXھDqwD% Il `QOvsٳzBvs]"7--2&#|>I!,}*:n4헉+|g4n}4b<ѐdȍjd+pj`TӉ(R_ 0K[.Quǣr &v@ {\$珄HE $W> ie򞬄eg6]SgBNW`DnrWR류 9jti_Tc ff}c,\?K*ٛ9BM$+^" D~mu[z, [ߪ[sc*aM҆&~Kő#jYkI Z 5з* .U '}M~o !,hsS 5J]:QEf&[٠QxvH kp{ nOfY޲rw|V`P~"ꖟKux!#v1zy foߟ =vCRj!Ձϟ wf^YcoH` KKd+H72m2]1mx-䣖:A`|Vޟf(ZNJ`8J> V&DmЂeؙ-A2qvK<+RkL631|Tvz#k^RO&Z,0撨k(BϢvw\we>?tra+å%:IP7iW28N%m۴S1k0xˀUg>ͲN:VGjX~UQ{ aǺ#McK%ټħ&|GhMִF̾-Fb-fi8I>,6qV7 {_Gj}݁ɦv=TSV0-MC87;fWv+FF30Ait=fgy_pueX$km;{J؏ >|CBEޥ-4a8}]YgP,*]ü>Gy"CLߊ[[gGa!-⵽p$ODǽW,IE[Q$wY3b`Uvn]dcȎX=N=< k_B2{أia6t;޵شn=9#[. Ӫ { .a^ :')Lri&?(9"<jZ<ɕ@nM?iΨ7޸Q$!߸qHg=TF\SEtP99;fIz**"d) la@+ H}Qh'n=!nnTui~7.Ɲ3ʍ2*(|fNo{竺\"S fAT4M'D iPJUD5%"V'x!XqzWj)NsD{|pVhYTGx?0q&{"y$ڟ2;ZzY.l{dž6G"I ]%qn`UR @+MO(-KMX֓ _V9Ifv,!&=8К !~gje>ldܿw Ub/HO痹\be[ax!uqb9cw[o[,TJ=?nЭ`wכ䫺E_W; ZSOaJyHbYHpw ӥ9e|QهgN/ ɼ^Y jqQDWy/MTtvfLFmV7qi+Ղ1/BQ$fFc/T᪷d) trjи7(u-Œ5, Rȕ#gKsV@KX5mF}L#{i5MJꇁa=kUTVnx@QR2jӋpd!D7u͜dD {O"CBi & ϟ:^bЄ`lbn*?'tlkWZi dXj+mƼ3ssͶ#}TNcpB y.n6H{U"`Et# r̐ay7`c~ ѣ _pXW_UO l,' @RhQwhts}u @ #n9~}̵Z$W;z\~H$_дtϛismJo\PGI׃8 xߴ=yy۔¨_'팂$UEd,DVhЀܔhsp~ tn˺/'; uqwCu|uxz,j!|jaT n453bf$ zGItkdSf ˲z4SY:!ї`}qN Ĭ) 8$bq6>hF*# &7g4PSc\v~~JKUkxͫ8md:=!4Z[ Ň-A_e wܙ7\R[!Kg^cXj2"\d!vNm~+4g2+m+ )Po~=~g#IY8ؐBR>VOCڍB-pY{Nk*ٕ@;Erv/Or&ZoV~ѓW[N5i*G*Bnrb]F B`bX{Ձg R2K[~ 5^Acj:s:]2=iIrҁxP&%a~,| [!ڱ /&x ba?]4qU0n;/q=L eF %xzwo_4NL[%/w Zyj`sq(L'lH!gs*v̀\_C g>.Ue w P'|iU#u_/o-48(؉iz{ sgZpBPč; P2-7-+qU};|k:'|>,9hOYC%`ڔ:@TF|*EgQqуhuwEb=q"a=Knњɩ Ugɇ: |طf_#*i❗ziSjQxoW>plyZtД=QY<4`$1ig˝PRm\306·lF~pBz~0RV&o@%J8;(MT \ PM6q~fI7|V:=tY Q|US:/ l~,_jRҷ $N2O0e4Z 1r5cMH|]2DYy2DQDiFC4~9t]g=\W?dX rN?:;ww[Y>rKN&*[L` ޭ[EKk?Aj05g9ZbZ3^%_\DD %ਈOfs-oHy=;wV$Q*nCqk;Tqm}2zQMw6>8htC30[uk2{IQ#,W,Spf8| +0,%:mZ|>z)G 6( 4RiCe_)'1k-ڡ NYt&ӮO/szD~,U Vy0/*!T%g tѪE&!1zǐN'QұqOF(pqIן=-8n+Pa?ǦZ[b~n.bY3"~g4]գe>-og8Vg*As^9Zdw ܱgg.QE}OdWXrm6 U@^55M4Z ;eɧ Y%fasHiaZRjE i<'MEoCL Dm\*z3ՌdI6]\JWs)"-n~`ٖQ> zr\Tw%_)TLf)HC9kJ5,eG R1wyKFBal6u <ރ̺P$w+IhL@Z QTؔ~k?ZV}^BVB[YzkU^ίUxQ W7xK=4KN*,)(we{sWwTE8R<>Rh7{gM g`CGJ%]QgR@KeWdJ8/[8|h)ӗ U/ꟍ97أcAN d-}ݐ"'HO%yWBPy5KsIBEettv-Ġ̤RQ}k2t<3py<%%(Yz2zXc-/~y :KؓroW ǝ71Om5BlPR$zÊV|?RR4֌7T޼Me.B^ӡAƻOX(OΛkP+@:Gb=o ys8mwo S6ī1'IDRoʯ+1c)Bi߽swK[)Oq,C[ 8)伥g ~.AƯ5-|=wΏ3s> [ qV—4Fn&&Yz:홞g"MA'u梉 CT'?3m#4yIH5g.@{=wNђ8b Ex"xSe:Le徵Z*M}#ڃ] "hV2_yL OϕT}[;6$ ^[<U(8`dj*5#0bg9G2 e޸M(D+x hQ4ޙZ+!PBS%tukxt)~^%)ݒ3|t?B9}2}>e]~d1T[^bw <68S|!>&`hua u};T㸳E;a׫X܇Y3wje~Æ|:֢ ͑$LtȽv RwË()~\pǬDgVA!MqBgl z_A mxgv#6@m/*sE@;r| ke'oU(Ѻhn@SˆzVb-_`B=tNN8#P|ᗸK<q u(bhOp;2[oK7g(B 2 Fe ]Y^j}W  vg]CaqJV%Yzܩ/ar"䖆=1}V=}ߡkC}D64*pcV[^]t.Sŧ#PDmzv$D[{)B PfO!![x3Iq 9t*FCXw`E2VbP f YR-^Սӷ. B9NT> ' 10#m~c&r͚byRΰ|+Hq]71?JYȵQ0}8\^nrY hifFS>:8&[gW⚻G/+HbNr7'GOO|u!,,@mZZ掋bQiIIomd*:@=љDz0+L@>leu@NvnfDǒ!$rP'ifFr,0y断):qOFJ+Q0f*OYл b5k>RrANU8.O$Dr]jشL ij~XX25Л0G3z!c+`g]n +u12*+\S4h9w(jbg}R6x[{B8 V&&lˇ^ݤT[P&vhG2Nƣx)7b1s@j_uk!PI<k/ZO_u%Y{2 h #;/W&AU%8h`F5FQ )ѯR8} ̋9&'H .[  A XsJ!}sr<'AjXi؜z)[+ jްDcvf&e<#^Ty8}Ba&tf7K آ ]:MP*M߶0crUZ:9  /\xy:Fc (TpX1cUBmG32uij92"9gNg+?j3c -K|ĉ=`Fa|Uj?SbZ֑]cT`5Py/I'HÙr -$pC(YF"}nh%>}o ͓m  K^Ԯ,CP6[6v1yƢSAt<,;z$4"CkTaSlD+8N(k0 A2z2yG;?wF,ЛzךJZle&#d-r"q=CFN$kȽ@v"q7؄:sKtK-v:l\ȏV~أNU},z͇J^t"BAeUtGiJ۽p.ڼ)?Ӊg7|?~GeΛNEJ;[)##l,s&4 *'81{{#5i!.yqDd9>@xJ3sV%q溷!~:K˷MSpk[fRf7#gS9Bz-7P4bj:B?^gZ+)#~v@Y~zL2v'Lng[eߑ-z 1U!]3JP94,qZUhwlW/"+cY$^J0;~B|)|8{ݱJbb'{=JP fӘ>]{JQs6pOUc4 i#ޚk^ tPM39{h4@L {BdAu U} Q+gCWuWA|Kvk gHAE @V9/y&|)a]K8F&LP pm0Ha&!KpקD6[w!9-hͦ`Xs4cva,)PcLenF!::g8܆MB`7 qY](Vƭ5mni*pxyM$ =J5ݣ^$˅-|Dt>Ԅۉm)J} *vS< 3^@]35[vV'Ȥ5vdIsMp\+CHYg& ì@ Tó蔹E@!f;xpX4)0عEμ#'ckyy\bXU(=17Lb:U%3E .X50ӲI-d< ] ^ iAYwr{Ͽu !=qI 8gtڀ%z晰$_#/u6p".CS:!ؓd iZ[O7 .W%i^!2AE.8J˜7!Z%QLR$=b&ᦖ*8o`s_,v JGPm# Scj>,{4h֧*'+Ҵ[& 3~Y͉2KT,'Y^w %z]GT2pz NafJq|l*&{=eۀI2gAz,û58ZG9LXqKv:!A>慷RȘa9,>'pSOfyvڝ,Q"JBu泝:j%g$rI*,V ~΄_*Մ|;cʇ$SPvWpʕC\jZ`߇]^t4$J-]f]d>}."Wb8 Q zN;Q.E! 'KBUG閿V%Ki\x)L2נp g5Pi2{qM2n5 mLԼйp؏Gn Q9/>e* e,Knqrz -}mί$T*=N7.$hd>߀}큱9v`d%I''OS$H0{]ݍ}KS+|ǧ->a#O/cXY uS􎹹.N ]{aHzp6 !f DXmDύLiVW~pOkIcTѩkDUo'm4c/f3H|[Q/e". !H\ :<霷`05:+P AwW0LU^fƍ.tJ- Q<ZbiKxaoo)/topo7oio~XӎOvQoenaP|D΅Dj(Chbl0BgV Z/#$s짆_Ѐ)=AO͉;h(D1mkJ{o+a`OSݶ1_#ST^ZRvOG &xHh&mߵ"~e^*0 Jaa&j^vHXQO~%k&m9Hd1jH 0\З0v,] '(dVS v%qze]8Y{r]rTDd}4c4Y ^2ΣL.辰@jvah˜&~7t5` a. -O"p,"0@D; ,xߊn)S? VWsoh@eyQeFG!-_:FNVh2Fi yr(^JGM:[k0%{S!yh-9ċ4<#bAE? e8CbFa~S/mC3X"*Xq7jXI{ZjsOdhc\0z+֕ٝRk:^ Q l SH U:eGaoÌr)ͭGbvpeS-;֜y v@:!;TbيlRY|aX_7d,1=")%F7T_"zn%{a֡*De0ze`qm̬^=<֩( G1iP@ʲԺoa`ʁk]CJ<{[Q]JMQK7n6E B;%PV.)82`8f|aJuZT/: cyۥ~Hr W^ext#1y)!0QZ3_V6mK6;XYb;CR̖59c5Nr]'|VR근TV0)2#o =զ/ ֑o'{gޏz17!p9 6J,<senwqR8᮵c` $C9kB%-i4?<9,Dwo^!ՏY!H_- K1j'!syȏV9৤T9 '5EK6`.ѴwcZ[utr9~-܅mc v˩݌Ri^]ǰ4Q/+mvֳ=I ޳͂R;u?*|9}nQm{8  Ʉ6z[5 >J{(4A.A5(׉OvBlG(N~-8 `2źQ.ښBӲ%tWB>l aJzgY~ L26DFcͧzH]*k̠ DyMW _с9 ;Lң86ߴ>y+'iB:"|eKʇ _zDHt`HƮ2zƟ*Ml)$T XlP$^j}j"/vxC+rnWlΆ"42jZZ7fGxeI8/+ JWDPIдC. dE^z^rtZT&ׯ"s3lEw-&#:ejBBk`Y췿M}&zRba\ rJ^.JhuFa'O#}"Z7a‰-062G{(; A.\n`Fk{2-^$8YG\ycY38ЄgnEwY/*M–<޴/H JV5R#>oxԴWQNfX $p-*E%n&Dkz_>uGkV>̺j'F]P72scŷUˆ C3| 3#3ڿ> Ag˞V<@,-{Dܤ&& p 0! =%D਋NA9fg\SV +ߤ=CX*0m}ug_a]p Nfe7kMXyۮͫ04i{~7awy'ٽ /ngm7s >b`~qm:2OQ |Z}txX n lω pi#DZ huwp54ՁB3t,G[hyI EQt./Hp&bΏ{L'^#5k?Bfi6 bg GGs{ Wy캣fqYV:dPSWC*ZkGz9%H+jmDQK24-T]N0,[ңP^_~ ䷠IԴ>uA%vˤ_&V~ԖHi8(g:,0S~gAuӌ)noL?uz|som+$K阹7H,:銧LZ^h q͡ջA` X0'cy~zX5K'`J@k+_RCxXw_>($78KZl]lfF%|Vk`{mW/"RPAU&0t&wvq|G\g-;kȪAZǵ -%OP4^рnbV$RO4@۫McmU. 'ur#ԢTȔnؓ3Ս} 'X';HZp~ LS!D {u9 "ܿ/;rWl+췠lCSLPYgmbiGJo߽OnknBwSN^cS.}4wK : ˘s1&Nx/Xq8UȁE傾t:Z9B]'eb˩6ƎF'BeJeE}IvQQy-yVZؐo^v.o9ك*9 .54" @k@ 1km#J*' ,2__|{G%SЦ0BLw G -byy^h_(I8Vّ󻓕IzְpM0@[w3?`vk] \f. Ȳe$ x hxp_]N[t9s2'S7ʏU>+`BתgẅkYp]7b@) p^5ÀKJ~5`b<(_Zdv;JV) )K@B= USeatHa\$Za"`{o~:,(#YMvFIR(!~] 5c||!C2z7>l z%Ո|ݍu/ѥc;.1} %-RK N:Iy.X1ŽRm|҆v.Orak'oe eo~^˕LEoE& %έbN(jIE%9|R3ps\KߎKI3_~zၭz~8_:ނ/OWeȔP{艨>3~S<\3z-ѬH~e/=\0'Q+I!{K^*|lnM}u@P-h(tJ f5 rƷ@/0*V<ĺ>x`JU/85nrXs]I oWkGZdз'ȕ*5J(8<<*;ѹMII%ko#ͬD<|E;yX\ @kWN3v7A]36MYLV1=@HC!gV~p-sH 0pI#ӳ Uo D>Q-3U Z$: \E$`c(fXCSFcXPfKs65i%'(N\yQmdtrKQ1րg$П rpq] \ ZNGJFXތZ$z z'rAʂewdq eʉ(;ލ3C+T}XbO)u2:Hdq Eҁ_fBZtCxK.^5qjܰa?7YŗZ .r3ט<DO R^^_l"K;xYGpYks4VyȀv{_$Msn/(^ Lv|wE E2W8UFLAM&(pq̿ՀVOɹ t6#S@dX{{8+_'BZ"M*@Ԣ-[NX(.-BES mzGZM6U$KWw{KɱY0} zu%AjX^\ 8N_+q/#A$N޾ʠ'z }RD5g[WcP9\yWzvwq X%QᄍCd2t"pÕ6m!N0\hp(ŋ;B놁$GU<+~$ceYJ'}*dRr~K`a˙۝4t/B$w&phY9K)rlel=W&9&T^C<^D:k W\Hx"&EOdJk#ϟ7wSЌ ۝-4/me 0ZE^_d)s3/NKsjL[uIР06O#c*dJ6sr;v p&{ҾdJ|)o, kGPd >H=RuI|jpv'VG&-v'=^c;-P.* gqO)0 7P t=gU lj5| ڢ4((,m544ݥ[yD5~U2poM\9jD)|^@.VZKktk hoR5dp??#gb{^D@ۊQx絰p|)y^`7Om~[B.2G$dxҫFl ֠`@NJ& Mlkm4)ucU| ikx^\zTq)jD|/'=6PcZ,[&\:$kvLHnX7hr.AwD a| EM+\Z բ%6rZD'P"3}7dT:JDWt"CM[l0KKOFήidiAEQU[ *v W0COCyǘO)0>\JB%l%6~1+,RAףωpFJpDCM_R{Gr"a8{"ցfA*N|n7qa 6KB%N4կ'.M&D59`ReaQ6?z.eE GB0c2 Z]mbKviR BF¿3|,"`AkK&VVq0K@K"^/:M$o1UAEis/ŒpZE`20ovǭ3%M.vcTeaM O~:B1Ko 7w^4],oq+GroatdFƧeniwAv#6*'"K-E^ pV+ ?wqOa+Nć qiڃml2s1<Zj &{:"]- ׈ɻc>fWʦ$3xM!0 MK{X<*%Jǵ l"].mbrSBAUZ J+i65 \OMԫ#'pҶs$ !2Ad-7Rըina2e)6%ݪМ2$恺#fcjz"A72ItHA6W7RB{:ɀ`[l5HW<cXdؘ~Y-G}{}34#c8F6oUD'%x?bOH,K띿U0*k{POm*IK;_D u?պn|;9+ߡ{pH+(pYdj ¸a:zQB׷dǭdΕgh7d{&MGjy ^y6D_` i^63¹ڬXltsI8~X%ԅxJ늁gϗ7-h%Ґ.TӚ9m0x!4m ԋB*="7?v E`{.o<9g(N|.MuVfX,+&aצ:o u%L+"ۧiZ=Q\Y1,REzГ_cYZ+RFFwe/s= =DU-)! 7LԤd3l`sHAf]H2eNT]C<>$60/Op3%5wɩ4cIXP%- {?=Y 7Fкcpq .R&!^d? A$A(lx[ f}r҈Hl S V24X c"sڿQBklG7ޡ8O~4F\FJȶ+`QѨ |xԺ4);T{~/H>? n: #+Zo߶%+kU*r+y3 GB<ƚxE_~ 5LvEKu\oXa'THxؓ]ܒ3; ?V6w:ȰKa[h눩ap0")J7 {f0ޠٔc" !hAaV@{PwP"ճ ~R:[i4lK`@I0ZH.%u>-Ęz&Ɔ" /!$ O!Ep[X7Mgn}<"ro:nS=ba/UT>e-%.o ^>)傏ed<τW9VKHu)whJndSb93haw x]ֳ#2txɑE%En#4BÇ2Z1*%]q:6}&㝇ՋÙhM?`S0K81^S(Sг{C*l-"Jca) Uo'T-E+0|vQ\s6E6_ Kh ZWOMPXӦ$wVH|d#R lLv,•Q"-IVBW|'媌yud41]Gp|`߷ďߌf,Iqp#'h`k{G~-?%#n2|IhBO߫>ÿCe=S¸e4Na*<ɞTNd]xXC+Ϲ:pX ?8t?Xq"[7/-YJ f$U7f >s:y0UF&7A*@@ 1ge_WoGӻ{&抭F(h!fl9 I,)kcU![Svop%Pg=˜OAT9$߹Tt n1XʟiHDն"΋ΘOp'[!^Ri*(rC/Q/|0K0  Yy+& X#u&,V EUP!9+$ @@UW|4W\vki90zPD:.@!./&sGOjZ$tܝHr!ݙSb72pWscF\o9mUq s _:&Q"+MQQ)ryFk%o4W6<S&7!w I+ъln +J4)[Re.kY"?aˡ9]$g5HOb@ј/t<b iZ$8 QI=Vh4D\xay%YCZ2O?Qn& UIS\:$.~wU?PBh܃nٍM<7}VdLrQg@z<ͭtS'xdOf"dI-ʤdL+(hJZѸndv&Ց`1K]+6@Do/ 'pYɈs54)(zAgҠ:e?~e$Hc;<,{MH{ 7ˉJ7@Ts]YW=XHS4qCgFR$&0֘ U nq}cl -''iq*ut Qhqu;٫Lh`ܤKT^ԣu+J 湓h#b'- Hw '_EUʰ ZTS6;m@Ն'`߳.uzd)JBYN ~3EK64i싉iE bNco HU;o~r /2vn)%0Dlb/.u'?=q}q *G-}L3&&S]xWbGh/|3YWsJ+X42wr=f#?áHXfOֿOަgW<)Eȍ_H`eXÄ)pGV̳ҬbA.t2dM1_EkHTP$V=i.)5qˬe^%b:M=C/kO#Akόʻ:#tuY\Č"Etga]ZxY'(Ox >?\^yn)UBӞ"㢻գS3;Y\a=n_eVKGGȫY؈=* `U*݊Trw,W sGX_+$`O~^/c-Pwlmxأ ɦԅVLū¢9;Z; KT7oFo"6(Q7~6+-I:7w>(jO9L`윦ꅡ\!oD7w6%ǑƘHL~M p)/H%lD+ƈ_QhI۲5t/&ٺpt@D7E=&akNqnh&*V3J/97hJ-n 0*a>tD_wT )ҔKWD}}lN}܆ՇW24CuqmY ejڻX:GDA)j}պ6RS{= (G`4&lOS:ևMrڥHlV3 x߆-1a")fpci9Pf'jPT,LE?jh$qPY36Yt0r()I Jm2"Ag4VN4пMuh!'L{SyV.AڴL.-jN 㐁dzT$},d͊PJT)ƅƩkMy:uBb`!;pZ&>b+li: 3iEFGznq(QwO'N>-&:mcAvw Uhyn=8 9R+]1A@L_f*̄_ua `O@$~!T'VB8?o#I"mj#M5 h蹾 OPhYc0nv'%=_,f兣,6]YәOX*[;z~h^y2sۥd2֌/aJ)MsKuX ?ʾJh|!?gv>N=f5:g<4Ǭ"!#.~zAH23ޱ55a@Fc±>L6[ee׉gzcPQdzMh? 0Ƕ1Rnތ㡍FyٙlP$jBeB|&PɝNAA7KRJdԵSG u$I/4ߦrsz GU JrYnsmĄҲVo+a:P-K6{哋)`ٖ{C]yw+r| =ȑ:([ZpU~v:Cy4:g;f/#M ڝM荚^+(k>U&ZmvǡGRga*bZwD.)D=@oѾ5lF9"+K{gEe_ڴMQ LUچ'g m2H݃; Ρ'9|iC1(*H6% /@XА` 8iA*wU^%Mm.(_lIf-4ŕ9hFW{+ z;kٓCn>E#}Qwv8av^?ڻILӴ IJ,`Q$b#L(v`b3.a$QZ ivTtp^=8͖M!kW>be9|L oS\!ךz惙_(A.%1}V8G>4zelqaهä;h%%&Ӏ%X?nY7&uwLM=1Yt94b4E)bأ hx=U !h(TF<1 yh; d[7ViB+E;^&/~HB8 7l鈸kYt^0rކ%bldIE(1}]vPL BK(d#5d-|> 5ZAzY'3 {)@(!9Qd+-[Vf. m4"I@vP$a7Ҭ3켪4dʮ!fO>3>F1ULܥ(b(~4PSTwF`'B.g0[G9RpH'`ݹJ>es:Zm3>sD@)ibTzEXCC#~FS0RgeCA+k7д=T#Խر34 ߛf'L.`# "vxluM:^ղ: Qݪ&6^53Djͬ~.BBK;Qn"0ZIA_6 [3@UP0>ЏQ t3`h,,Q5TL;%4gLBf"^i\=#> d:1oEuEE=Ekgp(9 ؀O뫖)ԟ7t k/ŧע,J'{E V\&Aw+%4U !s\#>_MsV$ʉ@^l^[ҺvWw&G[3]24%ZJoςqg6~~{ycy[qC,lw8Gp0 AbjSŭ5crj<'Q@RJd|4L|M!G _Lp NVp:xJ;zy20n e0 Yr 'I8@ezk6@ț#A#`CB9+PTm5K-r/͙x>]Qʡw+}a> S Q&T3Իӵ:SU[[SG!XW&֒#8H*o`Z6 ^^y"dP/`' ow] ɂFۢE/_Hm#rBf奞L3bk-,; 2tA[E^(g4{۱zUk2WA w,L`5 =hT淡?{reEŤ|kJB&$GcdCOMHw6Vt%K$d@s+D:ko'9 cWw릹1,_; `+Tx"(,E+څhQ+U~^8`EBLCkl@*dzA?(]c2TKǠk,xfz4ԝw{(Gb;~%S )p0|FC^Lvpm-O{6QeAݵ R-\ӛTj~?bE+ݕJJB;$ ؁fEe؏^=v4Cٛy4(RWirϷ!0}2.Pb؈]9>TMXl6]ƃ)oG&ڞJW8E=:ET=}yn#2-zȸ m?Ogwџ?8h:6dvP!WZLq'/]Z!TFd@ޖP1 $!_X!Կ^ _vۘک3^3´D1n~e=0#O:2)Ir\6u$ 4۝<[|X9rIE Ws#Paܴk6k%G${ohq {h ,NWtR/_^%}Xa9) prb G>y2m`k\GYym؃ s`k.q0hr}g A|c!Wτ ?کNlӪ' I": 5w02kzՠ!9}Ǿ@/Kw]q IY:FMq{+f{W[$%p39G4ztqC Xw 8 3K TnUb#}ժ>K}xbtK1܋辰vaNmS8ᗇUJ`AY,;Ì |R:~e.!e$1$:c%c!Hpn>jf&C~mU0p-XDe!Y* Kj1t-G *j,Xl|xGXvއ 6 ,Wre{׏e U>t ]rY  9hkg9&x)̽q?e-l1oAu'S<{2fG$YԫWXB%R 6=x{$Vxo>37k 1ڋڰw͸h4YP#7i6h)nO-J0YJW6x8sGL>LxAcLz^JElqˡW24S9_jy=͏&s`F#|QxzA,Fg1BqfyeS28TdīZVvCGP!sSfqkw0 9^`dTN{@K 1b,ůvM{ Ǽ^\4pNWg9j;:?ʷgVԠJdo-ج3?U}PTʇP1[zQ;{ٯUJĮ,3E@E#8^YPJwq~,._><GfXft-Uͭ_,7D@pR*p~X-hܿErp)dR?(MwƞǸ16hpv*,|F[ܞ:'4zg_^;-oTQef z |Ux|Tȵw: [Rw͔fws7Ň.@p,>;JrÈuDQuz5zZHlAu5}d_)):n$HřY 8eZcF)~ *s+աCVG$Dھ oq2F]4׸z<Po<ͥE0saU(>ckφk|ʞg]^1Oǟ%.Te_7c3^ [9+H98I͋…~+vfK_Hc73xDHj ĝTU1n"Ge#"SßkmA.s]*SZ\d6MayD LHآmc[`Aĥrs2ݮ b,/΢^ŀJi7jKqf8{"?5s< >Z"v*ixhQ#xbG&J5&@+g/h aQZ[$?h7@~{S$ȔA>_*XN/AzWSaCI6CAL~m{ jI G= ŠDwL@}6XWlFن,qA\?HЦt-ԮF1\jbΚ,(#8Ds/\ -KhF[wAbKѺz`{7J||jkluXUuQ{mJ*q17PmNٝ#JAΆSkJf f=^5KZy< L?Юj"84[QZkcF`i*i8 L! ᡉ'k1Uu-vVbA(^V+g\BDi߱%^"3V]: *tk-3mαfc,Ȋ\Xup< "_Rv`ga%Y|`[Hl^|У=pЅ\ݼebwz}쫆I 禣0ῳEOM[ y${ӟ{z:MsuxVu|kohؤR!{MESJ2<=g{ߵZ/vh2;̕Y+6E\υR6âї]_L~7Q改FRZ6eZwW-Ÿ̘>h [cxp5Ww')>7,`=][ӷf )֨Aώz(gLW;.VʊY-mh} T-Y, @͛%0+[CsQEp%>)8hM;ȇw<YSXCU[0 [$alpicxwWw6Ŀ@W@{gg1l_{䩾Չ qZcz'Ad=YwjT +f"bY C]{wzI7Q`ZO*;ܡ9{K+*r_bZt#ӳWR3>M6{yb9^A%$+°6!M=+Ԅ f0$C |v0p<[қ&a)YDp^m2b;>q:mOA<V4SV=e'(y$f}2O݅ gx.["ԅJ9y\ئ%ou]f.Oي@J}ǐLj9Mb?UJܚu\pkd'Iҟ(Xxr-vi*剟g?!DOeA,sK]D[g.hʼGC'qⶉ%btup#6X荞J2X>tv7Wƌ^EIdi;{^r4>#PoyڥI"!,oi9y,TzZȒ(*Sgm" ;?Cw9Gg!8-tF(Zyw s#êٱ0'k|g6>(cLSD8z9b$ocV^UdKxpк /UIt\1箠ApaiYH!dx2@^1 5YIW_ސ%3nDtW%_/ O#v8gp(ee1ӬٺP+B+&O7GV-P\DǓ1H}:Vu+-o5񀣥/.w a=c]UX)) ƲX=>b=>$e;K2Z ޥKx ג4{'U! !LE !8u,^PvHT4#NiKQ\=ISdTr[KETai[>/B k\fqcѼmsˋV'l9~'\$m[p.3 qo*0|`Fd<Ү}{IԅZMlvU̟ϣ4%R-EF%}%` /v}_[LYu44FC֤j@kV K[4i~ůV<w-г-)4+t $\A"Qغ SGfMB6r҆E -e.PʐD37jhf'?mzo*_|TLv?jpEzE1rSYF4$fP2Xo)36ۘZ%`B_?lP+1Gž4d t̝'AW*sx8B^L4ߠ'ᑾj⦻DCWo~'=Y{yɋwnEU)(&wkh̥WͫpK%t:h81C]7&,TwTw+A=3G?;20A٫Z֜ͨnar@i|uh&fKѪ.g:ԩX([sƭ2 O+:H1 !^KH 01ٸ0$\m-ѹ-£{lJs{4ܧDvEM~~-cFH l6#5U5=Nb+)"1)&ԥ;tI[wP݆g)> :9<~ò<2GXc~M&=ؗ 8[:\:̎ԖkjN2F9ԁ$isbRO,:ϖVr?<]3; o1qRSFkkHY Hѩ4SEn(Qo!&; u;96o PS@oȇ e`/il-2(&{S@ .MXg mwF Z|w7r`:,i%r+}eI[ꎁvsQNFeր;%Ιpl4@3]"+$x"1"D|`ɠG zB6uBkJUs2Tkdy_|^wI2U4{%o暼#rj3|ޟW(Eaqȇ#y#ǀ'4)d"@O;i[#U8 M*dM|ʧ f>']wbþ);){ 莮7b4rAWa"m#dOi6ޙ3!7(׽Tsl<ZѾrXk!)')M8Ô-KxDna 9ONb_rW$4=g2tҶv.Ndz jyY]q?gPWr /HS▟Amu)&6m%̕0oOрؾsl&w=~ev猖fRt]z+ a6By> m(م xr@jt= XrN!b ث]t:F1ö";m`P/!TBn<L_pt Mґ-d_ZH7Anr&NjV7Ѫ\BB*(Q SkQU+Ĉ~GćHD5,:?jj%j353PZtY m p *4BjW9X"r ?OTw3& %yPZ ,XjP'ثn:#5qTrפ\62]߱s9ǿZqWi8TL}ye9dS)D&`,$a-凝7#A.$iΘ`ZI3F Q(! {?PG ,$P]i#Up}!`T ܻ9o8[Nֳ+t. D_6]=).ZAĝNo\+vog"(nE1dAJҴ1.47=n;G_#li. -IYH@9NiF/gb@*L醕8BW$!M"NOwN&vUK5;7z@",  w9ʊcs':6d/^XVSgmE1c^ 1 }oc탳`J%gM- QY7.WG2`=B$zw~ڗ:OPdU>K%}&Ue븮^X+u^Vi~?#498.L^u-,WA2Ϭ#uGK*!Q3gs1sV*: }k3ߙeҧsӥITc([=tkՒoq:Gpc0zC!iN[8cŖ٦c3VE]Zz֯AQn@{q*ˬDwmԡO~WSd`mPv*) CH͏1`̶YG܄g[҆r / ERaDVUyhL%oG{ ![]+2G4ͧОuNN\0rDXc|^Mgc; ;Ǖ\ a6m$/IG :?=V m*?v__6] c@k}mKM08O")/ FcBGŝy7 UNsv?nYp]_0x/&ި+]?fG c7OܱJ`ět(:bÑ{ 6y{B#HY6gQAj+Jgh4/~OTs >l7GƯN~o`OOcn'!zA$ґ$ $2抧>{@jʌIB(6X_rpض9o1# }3]/ޏ%ngY_UN3\(zZ?ޠ[xftCD6Ġ7 LUKhڑ@f`0(~&S^2f&@ȴQ*~l%"O_\0*doO~J3HB7,3Z4ϟO힁}u_Xv4GzF?ru_/9*;lRЇPٟAϚ%ҍ<#'r ,Փ0H$ RJA2EkWeP ol;fcJm\aJ,X0g`9O+ =-4: ICݹPENOm3:1&XJJJA+^i((f仍vX>ϩSQR׼!6Qrw"wdf9++QCWߴEUMa^Zc,tG9>If}q.6 ;IY c7ynS(@!uj%m–V3m:@sL;XB2 LG^D7+C|ڛG2}%k{BҬVL8@ J}`rAp,/}jݶNbHtP"K'Gp7QVB8`h0K3o?2 {J+`;+ d1HsQqe: .'Ѩb!F=]XGxr~߯ϯ"Ky.ݭ'9!p5vz e4(:6v2t٭7᠝iXsaޛ~m8I?,؋kL#1fR '}~ĭ2 wЈ *?J B_ Vw ]AGwazfZՏ(w%6͂6qf >efcM'q'td[ eq{W ]!)FhŽ9(y5Cڢ s6yhEZNIl WO7'RaMAl-54x|J@O{,YpTp0l)M*r6T%ΊOGΗASoYLPl)۷^*)y3&ya<ܬ;WJEi 7:ֆsX!2] X޿,Ag_5I̥v~`YpG }Ѹ2܂bQpF\I>IYLCTig/i8˥x>‘}tt:+2i//nUX:4 ,3 L1[ h FHYT?1=qH݂|PW&U!̾h?]2'T('y/Uɶ4sBQ>2u3|"nnT7%Z=IVD+ɉ$*Uc =O@WEUKDmQ;C-i#@Ѿ,:;0GZR28K5 s9;:w.WX3X܃L{Fa.> {N  8|8'7j\ov7>Y-s[srͼ@APBM2eS7/ 1GWdIcg黷z:3b* 7qpSoD*k{?Ɖ @ $W7( K&{G;d-I1+Ӡ0:{ԧb/?u}xl3X`\#x߮j;%Ӄp?C5d%&(3*$vn3qNmb' ި26C;ɾ_c?ky8IRQ~rwYNo/XMl*3e: үTӿ@57!8KBJMsy|) Yh+biv&32jrm Qvi %7Zx{2'box1>Oi1w$w~uq.YaeiWhb215!l:;]n jz13& ZO 3RǼ> n1!\7IyFM_?UKZ  Pw2tS}% @ SK 楐<.75p~@TjF0o ).9!-!LHKtOkEf4,lC _YZR6@~B9RXFrt9+SVKƮvwFapf1[& |?k}AdNjX0Y~՝sCpBbQ>3^SGN,Wc%hU[̚\v(y?;2vǣu2eea'7Sy T H5ZUN;Yݽ%pDn2q>GS{"_*C XIq!7/=7E=Q z] PqUuW.\t')l>V<xЙFІ$3lUC sbR<QG\knKCS_+ O&P0 ؎G˷fBφoװr-SL2D%ߡ>;]n86[@:kSݡ/$ ,P Y Cw J(06}$E&b[A,n"@A֡ݸ;LCu@(Dg{H2Yf{ \bgO h|&[`Fa6'9 2*a#Wid๰ZY\ .Yi5`4>FBN Y 37|I%pT i2{#SZӹ1]!ח0Q=W'C;@J<;' NWFԑ..$h\Q z;i+ {yGl!g55 uY!>3|f(mOsszdCA&L4^|) +Ĭp ӥN:>Lho7#٨p=M9fi9K(J R9J)1z%HE}Aq$g Hfٸw**:$fV`?;Rg{%5a )W˷9e׏{Ak2/*?A&%DhUUQYݞKeMYu_8즊`7-a$賠deNˀ $ /{%UF>VOם-UU|b6sQ.2x߀u^;#V͑" 3-K 4S1HȡJ=w hN{rQY WH~T&sCЦ5"d7˼ kX`'{Jnb˅3$$˜ k/*_=iמ Aȼ$L\[i;ipΈo0 T5([6pM˲@'b7L{k ~{ _Z]*?"%ɁLu0mMԦ;Ba`L_+ߥJq5C h#91KE*gܪ~_4)Ľ+ᝏ19 eg)F 5XY $îƴ ]Ix^+ai/DDS T[DZF.s۱]4Cp?hhC5-G[AxGN#S}0īC'\N-Ԓ3ʴC`8j5`lP.jx&&Et7l= q-Ȭ*Gr yW3o(BGѫU%`Tp\c3Ռn8E\a5ϒtmZL3F;3PUSe,>&5 i:#? Giʬ'/%@{4P+ X# #LK!"MXlO`Z+ 31EC'.TpJǍ*g٪];A<#DΫ5Gct#bT:>&yiarY!sv+ B/MEoAӵ6H1^=41Z .r#> wit.+da$I~#@=>:gf 8G#٧c]$my*(6t{#FƒF ϹXBgJl4qUl&-6L&VIϭMRG4vQQ}Aa֧!ƙJEWD{Dg[sn{H󜼌¬?%wL7lԴQAaw5' @[2V&%U29;iE.e`yHRLisRFOY s0쌀 !]0{@a|hN9Feb:uoC舼5 }$*]rahqӖ]IpXvCypWzcnNu5vgjY) 79/*_uěCpPYGc;`(߶Uc>σ\9O̲N^ݢHj=,Q+ŵN7+cڍ5K?4jMHg™M7r$ b;L~RN}Iai YlV-ѭ;…zT|` ԋ/+G%j8r<5 cUÀ__w-.,b*rUNq#]6mODLL1A|"n^榁 ?B|70 B.L;C."7513 Cg>e{w%Ϣ3Ӹ|$a"z~1HE{/GUF-iHQ*cuoyS_-SD!`,okt\ǾhU v7NVkKћ@m60IsT9##Q|bYv&0 (,*?KH]eAۛN+M2?j;acֈOb$i]|Q̸ؙ ԃ_uK *Ӕ5hrr2>#E+Ɓj\zīM;cpk E{uFWq,|m!6 0G@5%gE_dqd=%'ۄkj\Y;}yվN߷8E#(:u Y)RA7P?Ka.@d;> U#+Nyt&= ,TdSF9k\H=4Ne^3>bH܏MV^-CвZ}VSؙI{KTmPHAI]R*9EuLM饤p5uXߋu41R&qOS?TK_ӈѢ“v1ǀ}y2sgݹ8#^|oUQ}*X_u7A*%lPnX(u]v-DkHUPQ=9n՘zQqiV;!/^X [=\T5Z"5D^P+6#P9J-(R-&}Ϲc1Qq: [FK!T-2lzC )kkm:ȰsbbM" .|eɖKtT/)Mv1Pg>˦!.@"Њ@?n"s#Y!Pźܞ3PZAh+AM$U 0̩eA>i}գ=HEHATG=B1!Z#Ri ttYM4_`8~Rk ,K:^Wo-[QYQr+;HԽxx$[04@6OïY8i0Gw[k_\+9oqdܹ=0SUeiL򍳾N'dr?T({)7w$a@kzZUN/{.N#z[G}Y: {)YNq-Ӏ"z5mGe$J%R1,|"7PrJU89-bm1N2c~cԑ&J}q- "Kbb&H +94LOPbXVMQ/[zhY6>&*@IXJ[11R o [ "Kֽ;F=%Yjd.&|X5{bæʇnq'D"҂6?nȼpfT? }"zJ9LHoYĪ&oh֢1 eF[iyysxdU t|=cmS8X"_Sr8EFgPz#bqp9xng5`{j;8\}ຏ=Rii GRF >m{^$RPvm"Ҡ{PnߜL:*㉨o;7`KN`pcȒUQ:8 (MO 5Zo 3qoߝa0,;< /?e(D(gV U?Ι6 Eɯ)WfpV0o J$!->/ϫj N=Si9$ݲW+zis$5Lu @+qo2Q,0|[ރī7U(L9Y5O*b%ӣH#ӗ>o{7Chskvۊ}|%8VF9ڀ<= Qߍmttr"Fi1hdK`&U{ފt7&P%!/CSd'G4;9̘8sk6m Ѝ }[}=,<{"Y:wsZ#][pCK0ݴw(pO@ljB?%/pT[T+QkD ZSݫWKw+C35g`D '_/͖ΙJr9*L}'E Up6GI+%vo'LYfz(O2ZZ\`/|:?Wj=Fe$Ve&uxFV ,d<"t ݧt\pR&JNgur[twl66=Gti*j] AD64%i~"ea %Alu8y7hhlN9.A ;ǙQ#q3/-o(5&AJLn4ȡ4_ocpwjK|j΁03ԭGKBHĔ fw NTr+ϲ:Rw OVz 7Naw#I^ǃ{rC(bqr3Y?͌i2qLUaQ0&PJڟfԉuAM42AHk;q|.Y4H b#ٻ?]1\Vx.x:߄9<y> wסᄩjl3 *`LE ^j%<<;}A?q*;7!aϮ i.t\]!Ѹ4Yck 0Cxazh7DM(qþ߃eA#D~v Z!#% ju tẄ́ ?Z#̀_V=נ[%~. #gY_јSq;sd$=i+uNˏQ9 &g4Kb^rF75Ƌ*\\cMs? '] ,YԘۮ! .E_ eM``9Hu lV!n f{G^FzݲɄ#ҍC&<~biD99F9q<)}٩#SX!h`-UGK/=)DMv[N̳@|B9# %Wu?tse5P4Gw>!Y?O?88rbz’? rokx@F t^_lDW^9UVg.jRi<!fPPB&a_Y4!Aev^r, lnA7گpE#xWAGGKCHXT?ڞ I{#AE`MY]F+N#oo08\ k ů#Pp%f|$WsH#_ݠ>ޫ+r>͎:~Zv'efwOyURu* ׶@ Mz!%nga 68%{u[ekbn q֒e%c}3.k>S:zY >@vg4v- *Flly'Y$f~~jYJd1/`*dDdGj7q6 ĬtU+)Tay}<&E 1@|eWA7rN7;KnKg3ޜUA:J&ٸØ;+d a)7H\܍MJ«x)D`l5$kzTl'G%\AJH5RYy;cfƢXvav:n;0F"hUc_VwTs㡿)hǘT ,fhu-:FPVmb@ m+o͈t@66`5$10ٹ' H9$H]~ DΎ;1Ǚǻ3 -ϧD% ֌v$$5|*\۲G@@sj|zbsjW$ڞ1/y?2I/'=6\ | |mmȼU2R}&6"{P?-+5Ŀ%A5Cc I(j4>dȝƃ#%8R՜k ܵB,rv2A&1>sCg>#ԱȺ罜 m+Hd.ᷨ+ -.F ζ]+B|e9dQSk|$_{<&cvE>J@y[o{S X?7LQiW6{ɘdZ";v$\iR_Thr\ڽ(}5ٓK3_fZihL~Јu<,ycY@}Xq͜˒o”zT*DefZ†*{ODNoI G`s5mM/)!?K^ٸ?V N &߬q U*3 <_e Иj-ˀ-:vl/`{:eFq6Lj1+6+s9Rt@ޗ3rԄ~ 8I*7hm W_xunXs֤7ƄD}Pha|]m^C+{UzO  E%IXType_Q.|5.{YE9 @M[GkQ7IS4{KCǚ12 .[/]`K|,JqM^iOǧCW!%lYrJFX!پ8a4.nqgLaJYrjZE&Ogv NUk͗dEXM5ݛD'l1 l8[9`٘B"n9 E Uc.;wܸDyJLF|msr>܊Vg#/ԫ6  q 0vS?kaН9d<~s]m6jͫ=E &:×[4Bg ?:Q0[6vȩ/&g +eX/d~g%BH8+'dl"^"4ץBvGM=S+7j?w2!7$C V_d{%eQn80YγR4usG>J~iI{y?C@{LuU5/܅Eud jCEc%D Z-5#3*EjW@;Q28o)gj1]U pS}Fڴ $7blSm/:||  lti5un e&R5}S_g12?1Ä\RbiXj TvvDu_}{ ~>s )C&7.@FƸ2x0ɟw\0rv:#"La4ǖ)r ֽ/~:YVA6j(]d:lm}H d| rdiN9[8^C7 Ǥ;'\XpJ|)p0INOL_9(Ve ڬbsa.N$qð}/ahtT,-o {_*NΣl!]o޶=&i +TsУ U"Щ@4G&a"PE82m 5bۉ{{-AJw#gg%g-Rw t`A'3MVI,&@jwluve7][˷%X{V9˃jyNrFC qI 7:=>:){Pz3Գ],a#ljC+f()u0zg3Bπ9J"Kűy1Եl"$xF,X r//]mcgkO:[,ŒaVap}w9_Հ\ u`f] 1GVj+ǷM񁑫~SƪD;K<6vo4w*b"mjPajZ;DͫFȂK ˵îBi!vfb-_G QOk.?5ǻB∮wTe|D_\)nU\8j^^Ml.87-<5Y}]ݏ]萳9|HG9F9Pv*Dm$cjGBRΜOK!V0eNy`۶[g4sx\WΌ"tc_E OI9@Ðxp՞} I lYL \^ 7:7R(|{ACi>!t@lZ7oDn48KD7 LMi:%(TX:RV}v5m)K[L"U4L"r6YSy@jW5>[W5x߸J 5{b$SNn]<IIY,Mtֈr?>؉/8pB"T #PT)\ L2#"&pZ颖rn EÛ eڽWN\$.HUѻ9#>0㖻mGD)@_VuL0:`,!XAc_W'נ%ݏRd;_\~;cbWuiV'`qD`{Qgc(< ީ~r G e+MOmp}"\<n* Q0-N;sZ[DWid͟(;YݷM"W/y!pyB䒈~ Ҍ9b_\`7b> q9?Yº5s(6dy~m-B[Q9{sZ~z6CTqRWA.r] EO:] &/h`ѥ̌s Ž `eČ6} w$%SQxFUmliQ<:[6_CGİ-b>_Vc_BwJڻ $((@#59e'S7'A]Sa,q#f-+|_y֗Jx^rG ?c 'Yȍ3NgImbӐ+LX3ia8u9d1.q}ĩyI ơЮ ``T ku1M/ cqROGe oOQXoQ4B$>ƗޫD7&{>F77 J˽`{NAо1偮\.naU ּ4+ }UEڹ߯@L0Zsrv]uDޘM2a:Q$P&4*6=Џ0![|fanϊ¿պo"MB mf ]}ib:Ps[CTF?'N:lyԌ㰊] $'RMKOIjPm{*+ Y%.גSɏ~)!;h= N|Y}%.6y 6/$;Q܆J.H̰9zI[HI,ww1vT0ߑl.E90Eѻ͸7'A_yx%kYGc]&QY7_,@ti w-f$m&o)'H2x@Ÿ| t_l=_5rR)j,2u|ɶ:dxw>aj4O7̛6C/PfI%o:>?0r3Gvn/&?"7v*5d^/GiȎ?jJUcɑq| {krwvqSCu+575V0_Fy*h LЎ pP";a+Ax1]s/0eQWs檌?NqٲҖ2]..+T&P0I/33>F6߬S45@4,P+XТZ?/p֘"t { EuTE@k@oxްrpyc183>Xx&`~|i\X8Xꅲ ֲWo >yu6BdD^AqXbDs?w =pU"TxY?ZH,ZWԾ+D{l3`YA` el&Tu)FWj\a2(_+9-R3wy qvoNbgr6V_ǹ`6@p${0!\#G]TmȜ,4DLX6:?sd>w`%0OKݑYs1Ko?#*C>p sc3Hό (n`3I&H(3 FI53>4X ܬ]GjhNdi(9q=+_>&_tpvO|SoQ3(~`U;?!j,]jB6(}^{Y_pR_\癣j"$OPaAzi\QM8,tjM$76%^sbbayGZ&b L/^pC!#*f/Jg۴ 6 nN,7yu"Oΰg Gnxcm}}~s#xr]Pqz,R6*<fMyTfh1Ӥm H3ؙ("&(>V#NW$+gi`0(t<uh iܙƪ˻l ])'Di&M=bgBM1~'{u:4LC>\egdhwd}^xk\"ЅJI? xыV&!(gTgbͷ_AM@'C v{aZ[_l%'.cߕt13Y/j#2wd de *jLc@ VW()AxCϽ2^Kŵu3e`9 sT1t: l\}헔h?8՜R=R"~&|  EoMMBDj\>MUL:[FT~l_ۊI4l3jjsP qQRMgk} \O9M6ޏSef㽄>8ޛ컚Nj vqѧXilg؈GQ1qkBh%6wQ$K. p!mh. G7b:}A<}2o^Y$jY~[ &sS>D"ޔʅm{Q!ټnؑTPU>%{Y0N>o\l4!ˇQ {U™v,Kw^0xڀUbgو7'[H՚)n&7(UGĵрdbvOXh^|,NyRo!*)SHj1ԍƦ_$CRSr;w]/pl>M\CkIJwx?mZf 3%oSM^+X,ϟCϖk6H8.7<=ۆ ŭ,jo+Լ˩2< }9/-$@;̪C6K{b&G D*t$H-8:lY}9Kٺ-mAwgD,iS r2ևe/):NU{aKw]|> Vdf?.S}%{zorXYu=8Qk[i{2S?0v -9hiXR_4,RR\#B"l<_b1f> RgKyLtLza")tkuP }GF-w).[A{ׯhM`P߷0&e* =79f AԌ}2G=Z M|ؙvgw}ϷE+;WTڧqKb)&^RJ;k/Vn#cT%q]VQ_SɽY_J(ŏN8qu9|ҰSE1"ujں"Rqí 7MZ-օEvN5bXTշ'ӚE݉I([ \at`LUʖnt.@쌙*O":dEc{'?Z \0)X~&]I,XdAכ'GVH cl#s :_N@+؋HȽFKRMFN79~/Hsc9Fd3Czf/弲倮]iU&MVHrGGK,{Se[Ky}ITJF_[uȂF?ՠ78Qٱ nD_Eq9`iáɱ^NĜIdC9RЇc|$4 ]&8!gFdοyf4 E6rM,U᩿,)΃F \¼}'2l= f$MAs3c70>4\Fz2H[tz۳YKz`Y _1w+8?{\|[ Pa"bvi |5LAN2L:-ةqwv 5I !RY>*2%  } 0j.&_B23Q l;g*X|`k/6x6]wK Јi2oUǹYr_fol7;*Q y5< )-5D7#qMX~q$N/=;LZP[X# nAaa{?ZUR` z;͛_O (|hѡᅭ,Wh˷3*HޙNHlc-t9N6(a5GbՍX$VoW ;- )$i0rNRoFA|Ö9D 7C[kS|մ$9ˑ]5XR̋TpBVe#k# n"< yf=Oۉ$jypQC>ʹ8Y hP9&2 δP_$#+g4Us5mqmYo<hX/QQc#|UIZ!Q3rLzfa#QcʵӆR2%\ufb黖.>b/|`>\s(ZAZҧD +<5ɚLA<"#@UWc I(>0p Xi/:;VW"Sz--?GOv wv6mƐ!Sܓ ^MXeYb9:le&CYIBN^`\R؜ x4 k% ـ!n*{GrlX'a(H5A쟝ݳThH?!&CJ&/&KT/@#++$Kyź6Vdn5f]zLNRuJ*}꺄{B_m `Y3ps`j$GV%M<ǒZB:4Cx4+H:oV~ ɋ֪,\ Szg;1Gv]#RŕM==kiADtSJ̥'#' : ^+!*5i`W5))a~od(RZCMʀzӜ!ec A,MJ%CZ}MkppTp.>ϚB>pQ쥮0b ,DpY$y0* +ZZ#hҎ#"ؖ-ޡ;K׻ؼC"L <7vT"hrȷc-:74ʚ{6?{]#5asIvTcV:$ 6F\%eP硈 D\4jKښ-ӄP0QRٟxfi@&I;omRŦ4ҼȐo`)CμfS-aƾ3b9,dټe\ hce-3ixvjPn65ڱHX(<1 ) *NR46]3m^~1ڽJ79jb+֢uoXfGNt.WE/+v#3Ӡ!FA!MZBhjnGD.j2)+5W5%=$oi}3ݬ =-Ce4ݎQ:ֵog,ьaWuYhhcr7Eqe I VZwr(? MRN?Tr<$4MV^gG[Dk Є/%.[  DWfHI ɏ}e&U;lda yu2 {r"& rahNcEHJo@$L5[jfDhcYS7WA# gpAvw1W0f8Hk9~0a0u ,O+2͒k3A>D&}3X;uT{~”(sj=0xQ5jyp/ 6꾱g2ex5߫7c,̯Y ^Uow :bkZGADKX.3,A$W75 ,\- Y­q|O6WVdn Iy`勊-F"DRp~i >b7bnKGVjPĢ ZAm[~O ݂#=]/ 1bgM.,rtuSU2j>XMh5 se, ޝ|@r@m w @ +3z33u+ ՂGصD|R_-04?U|'oPNj;Xf_%%Ά/nAUy-+ޞxR8( yԦph.WxOx"Y IաGye^{ Rξy.n% Ҿ?ڹ%1#:Uоz&=b.A/IA3LN I8U|x,KiYtsG˟ӹ|*zWR$":qs@&$KB9J%J&]{n82!1:~'bXOJƱ!^:NI3y#j2gb_:_}?sd3 W5oUu?<.~%:_#B:>_Zqʟ59SG26YA',kTPbkN| IՀP/E,%Zj9"j)R^B]WXqFlS 0 ̍ N%(kARD{v'$ W;F/dA]_TT3O,ɿTvwYLaqwU Lz8t$3[ HSJpt!R5ҹ.zАhZDAESL9W;)!Q^\8R~pn~aY3Uo-8ᦶ7U!eaU+"mtE#HFtAx(Vl" /pXeZ&=[z#M="+8mmrw{TXS 9%16ZAq$ll>r[YI0 2!.őyt$?ymhמSh<-vXXqZl R~.F\ذUo,|LKً۪xQvcsMh r5A{p:% `#GzȐ =uv*PaZ,d'fLNmf%s܈:ڬpQ5$/rfDNvaEn!#w4yFntW2Ծ|)kVH]28hg$iP,S N3ݖCjŎ9 Jf&wzRWꥻO)aÆܣ ;kM_zd/nVlfvN *pi<͸fL/G b\= J;q-ʌA Iw]5#v2]$&"b&[~I8 To ,/uߌ'v7K^ }!Yʳu>Li"-D eұ℺Bڊ5w߇hx%F*$ u,.3譲7"U n%`'4#M%k`[bp=T,l'RDf >}.hNQ\4ė\t6S󟏩ЕMm*C_ј+-OLڛ(R׃p@Re ɕ"O[_~?Or^ZvJWMOV ׈RTtGWv!έ+ $ |<7 ڴȚf$ N[H/H<)g"YɻYJL KXl*:A 㪼ܫi(tG$AYlt@ uLaYb}{Syp1uy.Xsɂ489D  .]w* .OЁ*ŞN6ֻ?[G^8UxoZ(?(}yKa\ ;q7ZޕzޑE.9{GŇ CVgJҎ $cXc $!,k3yYb#31үX}?1GYyy ھ}j\dң|0 [*N)ˉҀ !-YpúQf<Ӏ yPb%wyG.eDPw~/m[fKG{<'D$Xm0w9.⏦kGŶK|zV|zTuZgyuXB bV[<)Āg 0P1YnZcR:SQ>#DC7n'r|ƤsΊT fEvSgt\ɬmT<RZ8s7p=v3~ MzFB6;~tj3!,2l;֍,]) ⳜPpG`&*tR*rUP~x+S cX {k: 6+Anzvۯ_"V&gm*RIWh~OS܊c0oSgyץt\=8#8H_^< Cń>N,WLF ]3] Ұy(4(pKхr.Hx^O']?U"S5& 0,ӌEv_ += lj@SȤm] +kGx ch;xZ W?K٫mi}Gi74~Z*K![)N73ãEJeDj?{Bf'\tF3Yr oWnRX+_̆ȬԖ;=qeuʗnuROEyƠC]yX@^]Xj_D*EŞEM{wOXS?:v\$0y/NVl4.kd;0;"0!ܐ?:.y ? )t04W2/ mj{=A:";Ao#jlu-,)sx#ܠKؑ9xs]y? ܙ,!7C>JqU,ZS"THPTKȔ3QJm9L}8WSE_stH8)|) VkgfIKb A~gISO*Y0>%{R_P~Uڎfm4&cEcmҾM_-Z{P<b)ځbNo:]!<ܔn m f>!KE=w5tjLƳ_“F v7^$?u৴46`a5\C+hԍL5]vJtVû 9bvCydY"$ #|қ(1x jɜP{{~Ot=o_tk*M">o.tMe}"wvNtM. >ۻi*l1ԑ4Xh .}R0i_%86On$jcaea ~fi_:GBmFPέjJzY5 RփF4UCB2&}z6*v?Kѵ <s62et\w ƹƑI|C MV { wǙe:VM*z"o`Qwoy EBUzEPOIqgU-621s8mu~rJy0RkS1pWf;;b w%1|~cɬNu">"kJ@~ӚD?:~(`k޵ᰨ!M7❣kIL};s"=15GԷj$k9y."ӈn>N4fxSPe[cXn{1-;>X-N ߲YJټ4lnpplL*K&;@Xh»`v jPi9FD~}$>k K8Bn-̟:z|WtILLMPg=Wݝx C$щ U/atuP=y>.xfEB*_R%Ƨzq cr&D]Ъh^nD8|FYj3|IT5RzݰvA䤥]9{$S`vL&nمUL쯯3m5EIN[m^T1o"U!a/R6pDUޓzk[ge,CE~7r]k|I DvGy7sM`4M5UP>iWYQ8vdz1MW[bSy\0ۨ:جl Qh^)121=Kc;CuL?"~[@XDaCHE%=f 39 I~] 'X́(R,9M?s|?I(ZD)ǩ= zχIN(#\@EuTG\>Xty3G,Z qwPO6Thc)^AqPȣ޵RBf'>!FZCR:*#Jm7KB(u9d:!1v~i[sMTlCvfGr 7/9Vo3r(ѥa xD-&QuCgk$ye0zbjIiU\o:Fo /49v4)[ri9p>8 0-FD Rh뼌?q\w`Z۞O$ .J#P_6_1һ3(f?9@81Γvrb9^〫~QC2 RsV&VD,\6Bj0SH:pϗRv()fH틭$ߙdՁS*HL#ǤS]?,|wX&l1Mۯg_T{p[X QA͏XInaAH`1 VDk%W8"/Aʙ^ު`/fI>VywQ4I~ݣI: @0aB` enNOeW;?9.j.Vk"[x$v%y}(@@"_yvX߈'C+u!/Ǒ"}/ԳGuѽ$蹝)@d dugR"=2<ށ؄V.hv2EaEpiv ~lթ4 ~h z#U"g9*M;_TW}l60Fo>S$\nS"Ɖ-#X5 FUc8639$4e'R1vqSL `pnA^w=*hU>Lާ Vkvh|TE À@h&3;C~ w?$4m.pAGYb#Se*ϯXaeO64HWҘ򠇲N)[v&ؚEU+T/ŦRLD|8ǒw)kq0nqƋa$yp5Zb:`y ;Eϕ9g=xh9է6+6"7ՖȘg4|=.5c&9DA'K<m0f>up']ʠɠ&ٖ0[ՠC*c{ʿ4z)6*3-( u}8dj}G&%F$TWS\#2tyCu,: N3%^pp}vJW*EON;i4] Uvov^$үM2==>8;,4>#-ܝQ*8ll- CJD7ǔ)*g~^3}ۨ$ȝ:vATz7,.ǸG8ݬL$\hWXATgQ.k4~'H}E ?QP`K;S ,:Z 2a̵qåFugA<>:pYƃHc\`8vPiKP{֙;NJ&qVwV慡gܼϟNv+[?- ik* {[+N+S8Y 3H>eIHU[OWd)$'0,YJ'NHJu-x$29uKPukP%#sѺ[ɹ"{ޛO7ݏ9|m`Lj"FZ7ŒD3RRN\`"@S))d b<)nxY>U;K@ Ot_^01lkWվ5}||a'Zh.#r%/G. g/<1؜VIUz~zl\2|NJ>:rڎ# |ʿ8!FsgSW/aʀ{bn0$c6 {)9*۩/Q`B졷Rfq6t+PD!WK:tXpx'I'͏2}tTL',&1!;q;z%Re8=K X6pR#􁔽#gES@]ʡ^- )|U9{C4K.5a *G]O5JkpY{.z}y,$dDo!:>k>XNipjh|EG_^B]VlHi]{+0~WF|3'[X/4 YXIS'S >'Y+u\gr0ܽ4:prRatrDC)5(X JfMdr Fx~M)^|E2]A[o (Rl&Ǎy%%iV)b'N3LS.F<IF}n98@>y/ 9MRMh& KK<'GZˏ!oVx]̕(Pxlw}XdZNTj&CZ*'mxm̍V=S*ع]hf0 9A?P19iTƣ}dm/=#RoHQ >כ-142py sdc+V|2*͢@˿b 4:fd{2OUs)n AuQwf?ź~օ؇Pq+))n鿗4黽[Z Ds }$@*^nvH3k6#SKP-Mz]@bU'p4;ۂ({443BS{,}LfӇ[xOJ;l VnPHu& M~jQ0 S[)Zh-QT vT"8%>,WP.,4rӗ+05LRl` #1I LlPnF`yɈ.[6\%$XNg0oJMJbP`.R0OP{X Wn65Qrr [(!l8J f3$eO F[GZgW>E޴>MonٰXA2q#((]u:+ O1|dw;b{0quXGk\;EencI+AG%!Lڰݤs[vj<[4V#+ `  vYMڇ"Q- *2WtHٟjut@ҁ]Dg?A%) (gzޕE#_;\+Ov8}y^}U,-GTM''Ym[MQ O@?x~#b gKmoق"aa짤l5$"2_ȺfCڼt3+*&,'?gu]ImN+ifԣa=F̴ `3 M LZI}~ $% Z;)5\:<5ϳ=Gk/|2%͝SMU7"!BJBf=dUgE IІ1r݆2 6rR#xK@k|KËYRY !8gVKN"rcT, >׸'snؓ9[)mrV=5F 'sFoV |tT; Cguܙ'Ά^!_;S=ȺS*9ڼH&^ =2{ԎoiŽn|8?/p B9M["Cz!1xf~C2ٳBӳgA 9C9ﲤ1/Y_ Fo  d'4(JacM!߯+1cK}0G E*bUG0m u@5HF3  A`lvړSBA7*3_Rma`:vwgrLφA8) o#%p 8]bGܑ]%.xo[yxPliܴc~ IqM|-Ɓ4NzvoH|äqr̶r4<ɺ뚥Id+",G-Zۅ Fe !jiMgx= WkҥoOAc1N&vYITCU?/mJm l+ :664FsPk=!y4 (iCv $93>tnf]dfH;p榼ڲְgtnoӁz(9G4B!fLl;.ۗV&2Z\Q侟J_%`_:bF l Z yΌՍ@]AHp;l*^>5PF.6sjf 2Noթ/`"}tya8a'9r/3hAU^B'LGFa Mbax \[JR K'flퟐJXi&F6< 5vnBodf.!qVkQَڌ(矊wuF2աyZk(]7^YC%p8#ߦ43)\p3i2J0-+rٓtxB^dyNDw KlppDg,ov?eHX%흢{)E:+ҁWtͿcS< nT 9{O> %ԌN[暡Aϗ }c2& JO)CNC,*'E=y8 *F ϱ;v4@/RL~GZ_m2l{rxk[@ 3 遧ꎲ c);6Nz۰63\`nD&Dq1U|j;^,XXa0N&`^P- =Ru#f j@cu]8iWQt%қ:T4[Hä9O!}*bPsGWKk$c5= D(h1'CL; k2ZR8YaT| IM7wLy Uo wđDT$:d"zNiNaFO?F{͌CQGƝ߽ks1J e\%0E8# .cB39r<2/r`Q׮^㷭2e` 't=H4 ,([1wQC5`Rf^#Jlns;^ԧgi ԗRWDӽyo$nକy eBBdȢ.`g2bj$SKYK5r+F ON~y_~j./RaW.$3Ҋ~r]=)ҚSE'k:ʊZhkSԧ9??4yΗoFL,Oִ,;H)9vWNN gao<S[]Λwce%.\e4t"!ȑϓ/ȝ9Joņ5SiCX=XPLI IdI[.a-ĕskzi 1Ȯ@8>/\1"@8 K[(Ǟ7]ouhd7Ik]R#eTo#oXhc$l*^'lxmp-o8[4Azk2EĕeyI|w,8!Kɮ^3vX@Uj%SO(U[K}lp̀1k'?rP/ZDV]>UGQf55p$&?sAI t ,{M;Ío P oq]o0<&1=wkB`NLO{f:j">S |IJ. 1êX]z<gѦi[lZ ˡ?~g*SB''Cα3?P;GiRW"Ş3cAIt uO}%gk?Q4Hv=s%/M<3JIŞiHaBm3V5飾 ˞-^1鎰Ʋ-@ubHvY ,MO'f6TF detal& ь<f Қlvh8O4DבKšN]UvD%DS$փ( F00ͧ!s %`%3][$v`v7EQajt5\]9}6ɔ˅/Qϭ;a@]lëu4dfC,4^ T Ӊ?ãPŗXMԵU*rV0Jv0E𶪻M͋9RЃՃoe |'j:K&2[;{#ۇPg+9 }HX elT5"s<ĥWQGK.P5Hl }$<ջf2Sf<^ySp\]bzrXS{Rk:#PD\mǰ@jL>Hz1L\L[xb+R[2v|po{&@Y!yı(Q¨h 2$O:' , SGnܓlN璩AW B#8vMLDCnT+ū$g^jH;~9wbp.vFYGsIRYKW^CQ'hy+S 'U̞\iC+$t%mnꇥ@E\;; 2KnkYي^k`$lD45{SM+$1f\{ Ϲ#+ĔY܎E+*;qi]7VlO4"<^&wT7+n7$^(0f9qPl%as]bϘk`&'`Z4S8K\l~${(8@]@_d3x)jF>n)01\p7 vvӑ!Y("zOn 5[?`dIɧvsMX{2çnKNo .ΣEC>(X%un ١舗=fYls駏isAt4䔣Dt>J5Eg6Y2|y g6 (YC()fC0(V?ap[}@}ЂҨ/&Qs&n8F $kɏR0RJtr=*G>h5m`YԊ'3֛uH,^HϏ(I'Z*bN^sAf.k5),IlNW*X/CT53d&Ă 4 ekISjoZarUM&0d=f/IR#'24?ejlx{ygğRORڊW̪^ @I"z/c=;ZL(#vmO&; 0^6N#\P+I.W-ry a%^ E~£`[H)+'.VA:8s/(wVZ@حʨjv]Slq;]DubmI4gN,{c94_^SO! \ x^?w㎙no3&PoZj veC#hSϰ^WX;612^^D @H$碚 AHb _ Y|2͐BޓJ3E 7OܺE-E+wcK{mԡ,a=}y-}`*wi mN 7,ԭF 9ٵv|PK0'4T*}Q'IW|) #Zz ܡYW8 آAsCEM9;1ř730ݢ r*o՘/+=2B"El|*M|PL[1Ǎ9F[Kxreeֶqt6½V4h3O } 3AC0oM䣅!%}pN{v@)Mc!keur_63g}UD|5iBR99(݌TR@a W!. o6?٫k@-uyM؊ )Jy1m^T8oPǖwxbh}n\G)Ꮋ_omW^c3ӝ:Rj4rO1"=MͶZ[VFݷl9=fq0s]DmMEw]_MOl^̩;POo;@ΗgSP" FELbXrQQWwRY2ʰgPU#K0O;DžsJ4Y =ߙ E6d +,< ͫd5Uͤo+w֪12Y)tlU@ 9Yyc!EJ΁/u`GYg0͙$AijbjLKO|dҪU q#12qMMI궊3*,k\]Msk~PI|-)1ԅTk]H~s(iz ݻCQX,ۅ2QO6M۔}]dqђ@7餗qӳl"я}mJhV&[eQ!0t,'ugA<"BD#X^~s>9ϟX{3N$6T )9D'LĒABaGe|`5k  GA} '[|Iւ^.pVr`5RRN?_4l 1]2Y-h`8/yap SQ94fp7Y˓?乗=9Ue>/꼵y٠d2›8=E@:/]a|8]xg{"UbwVdV?7~r1Ry=Rk/FU+4V [ -`8B޺ܻ/ {+J9 8ђɡ4b )Q=wթE6$brHHpwS557mEݐ¼ {6[f̆Erbj͗0A=S8{Qol}f"aM0ZjPjphU(/"ԙ%oi`_Y*5دh: =Miz"V~Jc%!҃ocܕHt0뼖#@-.5f~\`J/Q dNq2V癡X_18iJHgS ޞy";ɻ9fCjPj4o󏪝dGxp?[JN(cPG&pDs '$t|DV+uc ]d=oD2z\-^ܚzFP/ wYRZf72oX%nխ4 v=P2 >äLt@&Sc$l{O@|Ìf&p afqBa{2IM?*;@Yk(ypanB}>ţ%b%fMB?G|sQQɂ(2 k*|I8|9yǁ(; meq*01L_0 ㉐;=k\YQ'̦D͒l#1_ c!}Pemo\|6Y&%dTb`яrQ?bdeZ^K/wIHJk'P~|MpTB'FXɐ >A.{Q1 : Zю޸M603 \H#z'u\:d1)C,RbahnDCK2\*JgIaty*N-ўB7gjEnIP# lpc@ey=iq\/'xHV hp4= &T;)b?!bكƱKmr-Hdw;@NEyf"%/I+̒$I9rI$F$d(L2G?9*`H8[†p;[͛ S8r לѱ5aF t5F'(ACxEJ+YB] `Vist>FAgd5,vH(Fs鮲}?CsUWJ(Ց2\ԝuK$g*C\v$ӗN:;FC)`ƕ%SRJ]LbNfۗ] ;oe~/?2Vx0R3 TЗ1VN0[^eE8wC9ZOޞ{~1fWX;4dRAW:+r#h{XYnT+:&\D_C rmm\3r'769ݻYe~HNUZewHx?nAҐfU@ }8iI3Jط且6m^`]ZX-Y> rVZFJx_y $NEt`h[oшB]$%."_.?ŝ+'a[XOtfƚ:ȿHbXNl K$GF 4} 5eiz<0Ll#ܪ.G376P:Tc|Aۚ&xM0>茒ꌆL~kL*Q^˼d}u^H>4Z11>5H ]{OiOQ$3R Ҷ`DІ9/,̌bMm-Ȭ@E4o~GY^cuɌ8bZpBA/XOm 6VVB͈ڿs画BI +R5:1bdUVNGUGm+6Z.9D\W*);0 buF\koD[RWd (_6b;}pm |t۞G.[m@?k-]}7k^Ps 6w{jd^<;g$uo)2_CN>'㕼UoJ ^-mX5%BߒH+Rпμխ"TC0RgsijjlWAo|$8Ww 8O:\,/!U%9`&@wgY[dR ~ߚctkbg8E)oygRDDvߛѳаXZΒI\fX`^Rӝ88y:6ӿ" &᭙lr%8U=j_+[)k,<__l‘?qYKcVH|XmBPRi!8*D'E]zwYdF\Om|5JIYDZ.;5yE(I9 tT>C_X ^bO R J@Ɓ#`׋DD0-HI@趎 ||r  ʁze/h Ggv4g`0"xOWͮ0#wT(مy6$56lR$a^jb!Y>n9tm^,ƿgH+iaQ\gD S '\VrFҁmsjrXciu ߸,'D }p#)y4#)^!c̰` yWw뼀BaD)gPdoWb>lw<[f9N?P %չTwd7H030]טYs0KS5 sGZ9t {ߡ-пkBфLmMݞbD, X^%>մw$,a_ *7!^=C uOdžT`wFAZW$(K# b!'gFC S'rϱƍ1]CVr;e=hP84 ɽ~VLShxMFǩj^q~/%O"j|}ЮPG&dMbIzJ߈/|9d!#̋tl> V-UIxyuNL U@+F۪`)1eܟzԛ֗Y8W?Òh; u` y)6t8E6u.",C>Ȕa1nl}& VxҘ ,냡M(Mכּ/S"KNϐqӓ߬+l^iPQ5WadQvĺ/LPÙcU%D#뺊>9S#R*z\G`xy8vC7l5gBwˮE`BaO͍Ϊã;L2[ EU78DzW;ǘ(M?㽙0-h3Xm.T; ?86jj{o/5,j*z-SQ v l$U6΄ב*p5!_  u5F.lq%1d~LNZ#U+|T:=`0R1'JOr{T,1B /8 $LUl_:T&F`q Us aF-= ׆;椎԰)MU _>2m1f"#l7~:5Kx rEGzUI/agKxlC@3BrKzldnVX0=?p3x<}y7j*<D P9 |ߏB"V)lTl.i8CYP <}FS$ь2bYNI),mj$ q֒Q4WV!P( 9a'UjVJa3LW{"vKbMo#!X`OgpxB4IWӐeČު <5]H"dE,ÈJ9 D47S'E#n2gR;}MSi$~|a=㖖˜v(of>_3?Ԁ "Og(^dW=7.hlCl4n+#d|".0L Kzq(!ո hl>OVaj^ ]5 뮩eDZ#<.Vn)䦂D@"|e%$ ;i`+{^$D}`(Tol +Pـ;a2(' wJřS _>mej r6ˆ G)\.KҦ-zXT֣C<Nh>\u7NUЛXTAhe"'J8[TV\ck6ln.dk$U+<NS!@@6y*lEn[9y20lu$%Ȉ&jj[6Pp_M⃟=MTgwbzYox;x|>2;qK&!07جK?E''#d>S6TL %2vxޗ1 Ͱs32jțq_ڲnr{ [Y{xYTLKq^|_\OSS@p[ChޟJbsuk#S덉4P7#d+3tdQð Y3;k5*J+Q $@d i D 5MGڀ Rf =$BQ|ֆ6T\4{Ik6ԻgLۘ.&̕xH|QnLCE0$*ꇎ>rP@=SwU u]1i1`@) ֿp Sdyꘕ>UvϪrNg]m csHfSG+5j/6\7NT"eP4:ŀVf PT80|0m+Ye_BazgynW™L=J_%Ή'XxKgQCJWy$hcuԷzfD1$Gr.WF`$>sj}=/0@^7y(k:i!0n[nojȽ|&]b 7 L ?SƊZaޑmRF{ϝKEftLn0q{}(g{o6o4+4nƐPZopjoGbBu~x31tb_q W`gsAS eh[?䕖XINaV 7yqAݱ!l"I_}q\oO Рh~VXmcb_j6""9`Gz 5ίq m6Ϝ@ءnŻlw:k*T.bme,?_qoV- z4ַkO|svH>!&S aNѵLs赌5&"4!rv <_fp$M;)~K;8)ENIx];_hr8a͕>#ޞ\6wjBuFӸE ]).s)7&6^;DH)Nt LskF[2 !N?r92nSt"qmkSzhpض1=ͯ\f"7 ae="@-m z2)n'N1,DTZzYOlTfWL<үIbn x*awI>F6=Dcv[ۤhf싪lEEut6a7Ami^gC6 fs:At^H95(ϫ؊H }(P?==Cr~*u)ߺMVCYD^ݩީõ{n3[ c@UhSAМ_D {s E&˩̈tku|$soaO.Ž/|sj&>*#) !lYԥY\{NF%Figs7Xx(vHW%mnJqDrgf7ŋQCiP-@SBc^֐hm;\A} }?';ݥ}4-+}Tgc$a!&%}GjHU\m)7Qan{Xl6Hn{QnVQVM  8=g_'hT$="(M9۲SEN\޸q~H% E<׬#m S#nyx!,RV ?jԘj7I\'_B D gLn 7\[W݇hQl;t\as|b]WmaOFvg w)?B*۰dI/*܃soZIYJ#Sl?# A'51@2"1!cG3Јzka5uvs$ڮ*غTu SˢwR,Ysq"_ SdPX:H=o gWgf_$Cm$MF9RpՊds˗rU c(sQ%Go箄 n?+* 6287d>ܣ#Uc n)tؓfjsV<:li'8Ҏw\B"E~HQBNXOޓ>A[!{Fu*(mXPZmgIFʻ H$(>'Mԍg=g_ߦS}Eef(yAa¿JnTA(ٶJ2su&wF4_v} c`Qd{W¨ t(}gUk2Lۃ-9\}?ӂgty3 y\fp|3朑a ?x~fCxt|kPu2UyK2m7'~H`P>WL[Wh?(_-3xA^yG<'1XfZ!CuHۺAsY !Ggp$ORIY!4yx$aFz+vZܳs/ tn9ֱ*yf\LAT@JPgfz JzKϔxD= PnE7$0E<&ʲ J\Ub c.AMUCQXMٹw:>0cB>RPfRkӸƽ:;EUrB;;/'?Ss BB`kKXpgkupG!$$~ޠm]QODX!e?E%1 +l*>,4cC5G~ǣuBX2= ~vDfދ:GdBN$ NJo$([s{b& [q<~V@pP֨pCNzOb1(@9GْZ{OFfSG ԙb:p@_ S< _eoc/j'FD_UAG,X[Jdb*d0gT6k5,D5=^[K_`'1D0pm#ϐ1:Q 7 hɳxc Q])Р@-,ZX_%-sfܻ9ءDerKʾ^IYO"?l "C`15ocz ?ʟg4LF-/fMMihZeEj`$x6iHkdaRG]o r3+N//SRe>y:ݍ` FS7#~K_6j"#XzƷjşv}2kTowwK ۆͽEM d/`$ݠkKd8.D>XIWiT+ *z_͢cj3.Gz./5{mEI~!'IV}շix"e):}Wٰ71s+H܏H=?O!x~_AJreU 觇2G}d?e8?v1E(Ӝ#3'rYlDb6 ,֯o|kn վ[&RdgܧYCOX Y^kf? z@,PeњH[X}iae'8j&~FyJEx{~ΠfRyH5NԶI>N"z?Cm(*A ,h- OoK=\Ț^!7JtOJxW78HP8ORW#w-뱦Gx ^vb";XBMvzJ|#vl-k"ưv(tӥۿ!zSZ/p;@r٩TKW׈._IMĀAuӬ{2Gt}29͑F*)\N'!{*®JEJR ;ȹ6i :]&^na) ^)Z,jӨOGQqd\ɧym< q|k"hp/FK7.w#CyYdGd'{2| %>PGHDj-Jǀ܎ h,?\CF0 E:AEA>yXMiMQEq_ƼwCA'8@;-HMLAZJ&Cczq7aQ\mC*؃riG7R?OqK8Eg4pXޟl6r@H;DLp64,sy:.CAp\e% =< _DC!l ]0%@h o; ֲw tnnba3˦Ft8fP!ix>u{Z^қjXX0N^s v @YXM0iTq孅l$H$k@ zAڃ'Ѡ]N9YQIqD4%sB9;2 nXO A%>U Ğ2I-]oֻV]\xm}w&::>[ 6[TyOzL=\KXm2vбn ۖUϾY{lOuktvאӳΥͣε WW50 =P>^M*"le:"X~u %"L,z5+Ux]FaKwq9_c=Pe[e|ZƓx0zhrAKج8s 'oؐ\V`e2>4xCL )O@+: bvcQ6Xrsidj eee dT3b޵8~cwʡ.gFnA()!92kCG5|\(M95?uD_6`xVY2K9=t!ߎj:ܛ+,:~S1 rE37rF۔j(|WF=4m 1of?Qo^56hd[}qԞvcGZ6qzmŰ 6ˁ=![M:%H%hd'RU; Ajsm8Jw9h#ydgw ZVrQGd&*q*)}yeW{MM 'g~\{VJŒ2B=O>F+Ysvy{ZiP/8Bx_"qqq-2# 9;9WUʔaäEI-K ;* 6[rblWF&^|i:63`dO_*Ɯ`R#񖐧:Kν-V "q0`|#(ͪrY~b)؀0ƩqU+WRpe]|w(`@8ǝٻPr"ܥ< 쥯$UnX z.@`L}Bt4ELڂ2跀#pl0\K'OӘ~)Fk=GҫwA(ǟq" CX1Ko;hc1hT^834cmWY 臘,ƯͲx'@kF< uyUV]@t>E=uT⑭P0C<" 6*1q 5##H&Gymcv{ WMP]]3l ٳ&ӕ<`9y>[8r†LaiHcq!C_4[kXE1V@h,FaϕɻLFHme/i؇AZ4h& d!zȋShb9M q ro_?<ĩv'~CtHIF?~퇮)nuCz\D}5Ò1)\3 rW &Gu"6Ar,`必H՝JMLD,$H3jTv8a@ XV!sWzWW&,oJJ\ E)IDbOj:yR.KIgU,¢%!޻">dN/+`k#qJZ)푨z+U[:8~A֭9/3 vj*\v$Z&i/>Ȃ*# lmf^=IWHT ̣ %֏(%s7טRЯ w>9dt( RW +8+O˚YBeo]$#ɥ_!/h'lJ!t8: X{[|m~ d0(Mk´Xf+Q])ZIZ"OkQG~7|$_kYy0;Oa-$.uoIJ5@,nWkQ{1G4 AGFsgn{Lҫ 2>*2ߴhFGwJ <ϯ9rJ"4}6\II-9V ٥uڥXghe7Bv:eB⯄4d&lgӺQ!<ݏuW47@)ieH-h+Ayp,V;擈EUNKif*at!*:H]{eim 9IY -s*ߘy~CmhX]Sݮ V3WVZd*IJ B͞ Oo8,.,AeCpƛW8߃4Oe DppMNBaw։ܶCҦL*?yR0,p=t݊Fh u/q; eL%41Lz0Ὥpqw`H])a= R Pd} M"z6SJ`}jY;@Șʑ~EC觙#Q6M\{KQU 2s I>A$0} ڷϰ&n@eB-2Ȟ Wx?1-܎F->;Isks@0i-F2M'|: &6k@;zmɑMtrhZ9<@* q'" &Hl-вм;n(GSJAavTHn|(Y󀖦`OUƉ ,wCxFv?ڝԤ*ka pgIϽg7ZvWd!iVZ{𛘥nXq.pI s2:܄PM+RˮuV9["GSQ1LE`CL `lƥO[( *Ju$8@׿~͙]p엛ѵ|%Zz!q pC y &mï56w`$I\5,Lc6R bnxKڅ8ɡ]*TSk0 `:s&cJ@mbUWR6D^ ЂRra;Wd߾f.ЙymVTY4WIBK[q{9M4oG+'TpU<?W8D 1ʅ#''գ?Ѩ`5W YZS^r|/!جOw].qϲ_G%EH#srVf2hU/3( 6&gGs(B# kzA( 9%9^ DB hjl5le\dm`/}1%ٍOr:%Z], ?屷o";3_ yH@yN=(]P*@fkG|_aY&I2 >i 3#"0OtXpUd~OyS[s fPN >w&"qC/tBad'aX&C(WH@dg'obV`n(6Jhe_.;ձXQov3{XBh)aSYA]⅂zZčCR᜺Qd삵Dԍ]o9ŝ)^enʡN4YpG`ۏ7i&d .SF s^m$>Ov1MO:P6U[]>Z;KY!A6Tؠi>Y~+B RF7\B #vbDŽ)x7 {h;.+ACxLhNؠDdT7k]G H'l=sKR_9vKD[}<[Ǜ!0{) T;H؎ӑY@ܣ(F^~^ }w yյzDH$1luEfΆ &niFRJ^ 89qҐpbeijOvP9.O'h2>D0:EJk+ʱauؠS|Pg-l̫u=dn|>ͦN}0yQC7 \&K_j`:Ά]$J+?M>YxlYlIe5%x;#~O ' PBd} b|$݌Tg|s mq9 $PBw})/уɱWOm]oOJ9||mZ$c7-HƿZF}?~kx^ZMx%,r_ZH0e/>^r&8%JͱCMIȞrMd2vW0*ݱ kz{E1WdE dl@k e8%-Zᚻ̑cPu`7}J Q hP}xn%XWKFT8t,_0&iA]ui-G~#h\ٸ16Ñ vAKvq7-#_e&S*ؓ^RH-ӇbL y>;֌7P?]8u6]A` P4BRp??[Jβ'Id2aK֧"ݹκ_ŒS_[UF(ZVfW.#'j0SoA~;: pA dR/^FW[ poAS&wiY]`wʄ(N0  ps@2h' iйF.{,l3ǖ^ϴuR{o:%5I8ηRy2ѥ!8"Bxߊ}Ī 0@%}2hx& Fc+ʖ/G eHh,Ieanh, _+;Vݧd::%B0Y/biU jj̤6]2"i>+T&o "cZGo*qJo9<Ȭ%F*#oT86:c.q7vk AL+U U*/MsJruùXQ)<֒Ao Y$*d?]{uOP]g3#jϭ/.>JnOE<3H-BxPަ^-R e3I,A%Az^ TnT6$fؼhb ]LD7{Nڔ#r هD_q!|!7Q1Xr£?+㐻dT[{.-\g{p)JP8,/JbhQ"=lt(uԭTz/VũFJd$di$NUWa!$[CH4\]-fC=?,$7w - UY2Ϋ*DA:iΆ {jscB EI3&wxtOm WhFF# k pR- {#R\&w(nY퓟,cSpX % u굁^x Q:ܗ 9֫/AaۿG ?¦W?H ُ` JЏҳ\(Ȳ[d6\bΰ(Ox6vyiV^H N5?> պ6I^uu89 p3G|ZZRy<-&_wAE/reTG?šeuFqh-V2^_Iܷ<[aXMNf I 5e{xG̒x?D,]z'(-Q*Sr662+ _{ )ǩJ&rc:LtO*D?a׆xz#1YFDWT#:N]]kA5ʿ@-^yjpzpWH5\a/paA+vT=}kxuܫ`AbhFٰ#JuAIn(0 Ƨ5n.U.IC\:BcZ&R7 (6.lJV^_a#[tuV쐸_"4O8j0? ֕o"(ߒ^jpcq 9_aIT{ŷR+(̾mW4!m fdj'8목[K* u}Ĩtp6c&[u( # 4S_Ή83\3b4\Q{ˇ[1бAg|{X4kolmy^pFh;cy yEq@\[n#CͲ0yАNꣿ[*gp#l/ 9b~<آ\j XJ&гzs =JD*DZ6*NBi_ȼz;O6zʻlGsfaHdWa><:TKKWn2 S`Tϙ*ʆ:t wpbєuV@`B&aSGFIq{8㊃0EBOG\[]s紲Vϳp !BhG+nK'aѐʀ4A{~139ŁVJa<v^whfr<ԝIBXϧ 6uw|= "3f_f+BTMGصivSajxtDzL9Z{B"~OZ\'}Pܒ|̔q`ߓrm;/V 7`)rd ⑃$Of1[MQ_ɚ9;f *cd;vB9MS=m{)+z*qS.۱IdT6,r7{k" 7 EԟkLl Fso3$˃Z &B4/)C]Rz4q7gMW xmo2zY.oK ƨ@]teŰяF3 ]tV5%ڜqUX9/ 2@" 8'5gwDY@p1s$|y(g-L:Z}ԺE oZ`扮iPQ[|S=9G}i_11=3gJc 60ȧ!z=".*kH ޑ8塀3a%1}H3Rkp yZaegyP:e4h"gZ +-9j{ZHG){fQ =5DlV&\\㭖/ZtJY O{!ܐƸ}LARc\]4'5&uA̵$۟ SoimKie74u8nC_7o umMR[Lc8-Db/Ugk[è*NCmo$\$.]H_{C$e0}OdbҺS1w\.4T098:bo8B&`UOW¢ 4&Jm3s"I",Jy U]C+q5D]#n 3[[E9:9l(.jþÇ0O6Vm+a)l mju=q6m%n!J]v8>M54f%Y#Mv}&4D`uE˶F;uU}tH͢9|.'MK]V[ydL❶8X2tyEC,<l5T1Y0.1 027([RpEllwfS ssFbBdT t`:Su)4Ŭ}P&㘹i--Ps kNojy"-C\&HrPk/l->D `~ll+}GޚF֍#; Mc!$V]S9HSue>G[3O ls'iǕpAEgDT:70WIJM|KpxҢȀzOy^a0 5^[o 'dP~ "9vgvge7:0eFg&)x>ϤM4h, Ȼ*פ!NFeg.VD`^Ʌ<߷F!GHٚz"esґ&lٷCpq@ֺ1U;s?/qH|ęeqk1;Խ,e`ةUjB,HbsMpR \2P6Ke@jaLmۊS6zGNʴJ0(?R]4GS.ԧ_ ~H8#T-?RtG -aڠ-nG\~py5Zrkkmg3Lq&dqF|^ 32){܃;ٿ磫!:E$63RA/ 4Tr.bg0C UvbV b:?r}1)݅'Hi #-+=Kny/kQ > nLsƯHl3:4/f;^@^%*pC?8KP+>޿]`@)cTR\h JW9ůr"Q\B @HvjI&#gxI{]* AS Jƣݪ"< |yImcVYy8;܋mgo[$&}e@767$4axH%-r8{iZ.ޜ3ܞDS~e {ZCJ 7Uh' nM`W:Y< &>ȉ\cz^gAAxm pJ`O#߲T<]t[L6FqtK2DQnPT 8H*lј(rfX ˇ}T"GÛGqiلR7~P>WN#<@n0kC}xm0WRv~.mRqg(E}ԯ".]ސ cD\UL O+c>}풇 z: {cp ZČC BRӫJԾe!U!ݓ#(T*nϔI"Wv8}Ӗ|aaT< ahٴFRI>48&`z (!&1yGvu/6ɎpXJϷ ^* cX4%dn~'$b0NϋZ))2YQ<X\3Iv d ͆ H4Ah 6%^$ٕPf޷ǰf@!'7dd ,zgUQnA]$>ooX/Țr 1"01úy5GFRsAC|Lc~jNLCA{>;N.h)(':.4|-$̼_b=Q:+.s?hCS9ڷb7lY:wb,~E :,;)G:7fDPd8uld 9c9E8TQ2 9񙊢jdRWįl `6$4꠳RLfszAvF{HFΘ& sb ,o#>\vf& `f(oAEw2ĉ'Y _vIH:ݮbd$uVT~>/P HIPhXSUb yT-Ȯ lC.;ZO{Q|IPTy]D,j9QU(8 Nj3P3aʄ4Q-ؚO5zҿCWohwh.VkZԱJE&'\D<_Z3.{;:#nV. Է[YgA-7֗6Q(^rI-<j&Xu݇91()h^-6GX HvZ;ш:GCz戕|y깞@;B38LZODб jdsSdҞ磊3rd Zn<3<;5ΰaW`njQ2EA>0ʊ"ğQGj ɴ>c2I;huiv>qk8o3Y 'Mcd<^]1sJ7qT72_4W&˝^ 2X,;L\E(nT+/zek tc[2p[?NV_Յ*{RxuVԉҢ;|HҸu`%Z#{#t-d@o)Xc\;ǀq?v4U, \K%vZ*4[5G쭟@LV-<|c}z}YLBn?IѥJq3h=ԾC{?M-\zʾșM|ͽ4A 9ݳJ%rVX[z6aVyGKpOlnƪp~F@/|pk.K96& ,:ufG7D+G܅5&Q{h!+ 1kф$lZ2ϵP uȴL*~Ehֻd- Sˊ_ؔ9&"?fLuBCŦ*+4+ Ḱ){Y\f^F^G:zƍ(*eYP]ΫeG(~ч3+娝R.vy#N#8zp- ŏdx`/U֒q&eGVuў\Y~AE@gϔ}Jmduoo)gd) ^a+_K͚K4J|p&OJXVԣ%Fm$ۻ[@h `$ oaؚk Kw UB-.p5a+\wtn}w Y"߳Vor' 0TrU>A9Үkb N񂃭9{qNE c>LilA6qC +x@~$lUi'\:fՖ6?sd羯l!q0PZ4^yuRt (,qwc&=y#ad}Y"b蘽ex MIsHN1ٍڅP]!S-|z];MllӕJtqYB =t_%vMw_BbE6E1XSXQvkTIuJ)YS>oH7ԑvM,[VKqXۯ,*V +)i,[ R՗r<[⎫T)˿lQIaJm`\k;k1Hݗz .'~wGTh 0/=W hvL YDr "5uM(G3jU\Dy*Y\Wt%=, Bل j:@V1~a>'JI%c9+]%f>18 6~9*󰋏dC=VD:Wt@|Z}$%񥆑 t7@,,7d!p\@YgRDI`#His_]9|5~^0|2g;_Z$A0/|?3[>Q䮧*X%3p3HuGFts'}IV펟b qh5:rJY$HN*f3 z$ 9&JqO:=̫p#Nxؿq1 XMmO]𤀰az#]#WҢkywPnLo`%4-Q7&v~eVi*o]h/1 -S{wFZ8 k hw2`Mx*m9*'`@ J9{ki1xPF>b>N*_ Vu,3s)ɥgrŜ)X!:&$XD>a6'1z1Ndm4-WǠ& Y.h&qJ^4!A':PLύ$~Il+7MԒ {O}֝n-Sߧ OiuN&` Oz}nu;nG *C#dN;3G+Ӓh\I+n}oZ_fR^"(Q6Kg:8QdQc U&&cs,_.3fdz\ڇ! %;RHbY6h@vSqJ$~kS4ꆞg7hy&{Ty0ݲ"e`P;8 ũgf뮪{^>?f W7c%AIX!\Jf]N> )^F~gE+x=7|ǣ7 T]U2#} TzUBZKg~49g!jiH20r3&aM>CX$ O8 FRZi'ؠX{ΗI.Ҋ&KyPͦd8Auҋl:^)HvK=` J?@K< x/_Yr$^(Kq#`t8A`F))IxxPmP Q ӝy:itú%2DW E6GR2a O }գ!kEG<_7!묖Kx)ǟslOAyNPOAbXVtr*RckFĠ`xMnmoy!5MOlpNHw/(wc3*9HN# v[A*8S_8G˽27c?x0+SG?p$Å G.Ot̓.Q!7ܸDܦfs|j[ADH#^B-+SB6ɓS:WT7BNP)bC?Z+AY{Z5F4ěJ*Oz6ຠcx:`Jd ~rQ,o2`@n\"[( ן(ai6s$ʵ%4 C RoU+ b[23 falvYzX k*h>Kg㦄1w$)m1>%qnT6K.tK;#Vf /͍՘ *1myaL/"PSsD~D@ڪ>G/@qS_ -xhcŭۓӶV<0Nb^x_ujZ2"lV6ugUSmUO7૦Q*{"k`YXBXwœ(+Yi MUo|U˜ms,,Oay qx{YɸU%λ %Q0fc# 9RQ|LTO OFʌaGˎ jWS#]_\~דaήSJŚ_oFslc!Oir zS׹L]b! P-$-k.KSc϶5@d#f% ׁ3\Qېq?9p*j5,Kcn1o[H^y/k^'k ݨm 2 T S>"|'r}'; Pc2}Bry)[RdJG}S qVQ8 &8Ȕ@Uxc؜R<ˊ TWwțT4g{) Us~R#y389} r ꉀvխ(XC4>qb%Xˬ‡m%T Ë{-=WAwet,$TXC#HgeP"M9<[qgh:y5XڠtoAi(+R5TҕeKxPߎ"XҒ5?]uy[yI|MFfnԻ28dˁUEfp)2\l),(m5KOlU9Z_FCflu!O] 2c Sq r 1c"[TFũ܊5N%y=vH;ҮQu![o1;UjҝfPqӔi`p>ܐ%B?:Kj;{Pg̴G"nGL3#cK7<@І~ ex@RG!M[`P[iH.p`oCfXiڬ`x%Q o7VZ>eD h+ѽVAWHj<1Fsxs$8Y-kܗ-ZOSeP-:n҉T166TV3Ts9 *Z%Uo  WC} Qضij橥EǤS],|dR`~.Z ȓ#wy|TƉӎ_V@;2f_h5=*tôڣ!,YLcl(zIS)F Z&ܞ&uZ/Ƿ^aRnd=m90-uLjh wnmuErm?dd_l']׾S6ΣX{X M0BWo-jç\8ٞ@xEbW<ې,s߽N+[{UJ\7GTL&6oi#)9K'ӇB矛RۣC'R|%fUǷ(z?fx> ة[on 㠮VFIeh69ZnH%?SVE(u@G@f5/ $73=MSsO]%o0)Rtgs|YǤ0w/0Bق9 'lj93bxρN"l.1a8s^yaqKz&Rd+ SЋygY / {DaPsߗ!sDq7E9fΕ9~ayzv-* 99)uO4A 1 lU|/ϖ erw@0dE<,m-0 L?艔&9y KS3*@"w,Li4}iBgƜ%ޓGr_׸9۳1 ?=H> n&b"•&lL((IcŠҒ{OҶr<@%g8̸\'?23z\p^!3"6H|_rO{mBpT8!aCڎ]Җ9~NhhCrDW8fpKs='ɯ_%Ce\6ۗ$gVx/~H uCm7mh>Fh…6'g.~= TT pU] T~ydx`1> u nS7{mrVq ټdXnwq(@eku0^~V SslVנԻ$ǼxoLxvgИ7j̬=[^))<]~sy-VNV3Y`nF&C]|PK(5vXZ˵8)0k5."@t5L&t&v_dU{Tթ w34?LB-(r9|అvhNUhD͠cLjxXvJ||xa;lźTfwY"TR]iO uT;7Ԣ)2Qb]vqxR՗*?*HTJq=O 4ĖFzx;%;?7Q.l. CGgczr/X={R_G`V# =iwFpvNhX[Ң c(ظ갶'IEo*r_}b~ YV6{z^I`2)FqXg2S\-&bN'n׽4Ž7񇣯ŠMCNjx嗉*kTv! SJ+ i*`S!n={ JϳjzBi+i.bwVnU.(8_nHf_C`J\ {>v"Tc'otco)1x95ODO R`EJAw-ЇCĸ.Ϊ3f1~_SM̊XTyCÓH#lSY{OzU5l=DX:ZJ D&==d1]Sr ~Ky~`]^\A N̳MEKAXr\# 8;Dfk>, Xh7wJ&q"z"WN(7Jo_M{H V>X,OЄJij! Mdks:wImKHjbp& tA.-#Kѫ6g!SJR%~r o?>(/Pm@1ӍE'ɦCYe#$\ӂ𷡝|,G:7J/ F-3`9JG֋,eK;Z% 0"R ]k&hIu˥bOI6>N݉pZmؽ½lѣ~qZlٷD8h#cQYMg8…+~BEߦ!\\.%6"  ,yJ d0 &r䨔`8Nh_w[[!zzRΘʒvċi`1vi,:%Lb3Hl욏*t`z19T׊ˣ=,a%*//RQEVMU`"?D]0o׫@rQI'?9Mn͐ei]sWUKt |?o)}+R*A״("nv;<0" ro B/9 )k߈ ǽ?gpExL Q//$YD|9';qc/0۝N1,wmMF+%`y1״Z=;](ϭJ6#n3 7 X=! Q&Yb[vaZVTi(s'ȓFtE)In,ZYMi,l -7{D5Q_i$jߓ7=ku <{D[U|N~"D}@ipۂVӞ&uo,QFKQD"K X4 Xf߷1VAu/]6(93DYV *P-ph$z`:qAlVI~4"fQƭ󵵥ߊ:gǔŒlR]wylvX,`R7DNӤt̰Ľ]"9+`,#uQ_,cza׏uLEAd Ih}%8]n}5 6z,qk1,|'`Ӵ2 ͓z Lx$5{:imN6S.TR~&6] m+Z]rᅰ9#wN䢤g9qkMY@҉oKseh%pEڙkn4 `s_}C1$`&# _a2L㦖V;YX@.;O·g;L,wrP}6kLչzh\h~sQwj39c)}9ul}AϒY VX/,xA+~t [ Ο U9cUq>%8Eu79x v4cF&B` H ^כLC[&BT49W|lc l_n _A(ݟ(]7\|Þnx^|:h'']IΛ ui0EU\ y _p|ꪥWjO#IA\2F>sjgh5n$y& uVjc6mW9 6SWSҥƮ խwۄfY/'#r7xj+ц~92$'/;#-1q0HwҽC7d5o_ N0Vړ1$+ AJ,)obXl@GjL1mVM[6_g"Y&y﷕72wG]ᨇ6 (E9m4.ږY<#~.H8*Y?GNّqX3/#/v}Xy%hQü,C2 >~Q&ʧ,Ol3Fm?wle0ZݦNBRd\?ha);M%7چBqPܱ ̫Z.DVl!k3 (e\-r:X~:d68@9sWV`d)6份A,ET'¾ۨHʿy=}%qbOמfK1-rȵ=l@ *h"-8O_wxr~<ҹ:Oq3#L1gh"LԖ6;+-%uexDF[!7hם.2Las ^kѾp)Mdozx8:ߐ;DH}Jȿ$r> W}GE3]F 3SހbNra;iYq9n eqYۈjQpz<sb5 ӆ.A?Fk/]ltl n.7Xr6yo9H+t$ O7O{ h̺w$\&lheJ?W+Yq)g#[ mg*'z鼒+) !b3zޮL&D˅)?6]+e:̒uÌx ^s9,a/ Qjn(?j+6S !`c\s΀GȰO,D> [W۽@$ bڍpܷ_H|r:[݁0R,C#YbݍH@gt8vV_GZ]':ϻ]=Q-tJRCpٗͿU4p1$G6sqDÛ Kl9WzU%E rysؔ'="t_X1y26@^+RY!gW)i+LUO쯒7 ġla<[U;oHPܐH#w7ρS;f[AB\U'W{_ʚCX_E B_`s"3<ݹw(A+S^S ]|"M}VN2Ge@c?b$e@@yh6h&dJXp̊X}}w*&Jg(9? vxh5m Vóݲ(€U) U-|Y)Owu3OS ڤsqDE#̅U~rJ#Zju)p)YI:!bcHU=n{yÉgt2} Bto8 \̲M s]fV+&OĘwMK?e7JmQiE~rCGl u>zrb޻^MݟS>p ׵g>u6cr!?д''zS휽Ђ?/tfZl} V ~f! ߄d<p:oDCP\Ъ'Ki EVyVlQ{wQ lfq %1~} .c3ܟh&.qHr);-c٠kBs޺w Q3반8aGD=+uC"e=%իP/ӌ2Gܨ3h1B WߙXBzSQݠd'hbR bG4>AD~Ӻa\?C\y]D&&"CfPKcw8p|=t>p˺9[ ޣ3Z 7MEu"g?.䦵`Fd5aZ0Q̛rpt>䴭`pIZ<fHB˨4j_pV6N#Oi~ɏ^j z,Zdq?5SsVYszPbLj? b+Ft2ZK7=O0[UUB_Wj. 33iDѴ\ Ў= y$ko6i"vF:|n{}s3\"ޏ`y|)yYGt`3ȶywDLj.~.hBӕ) ??H QgZ|F`gՅp$RjN\Ɩ$iCHC4=@:zrSOʵ%gC7dqwsnc9a~'|Дw+Jg̳[{&OEGתbW0uA$݇?tDY?JCJO5  K3 |Θc`_SV :&(HY?Aro^u O%̷@-ByKʑ/g(1И^yQNfZ !6uk+5ك4)Ov뒐ٜ|1M7//thΟPBbGgذJI"Ϝ6´3ѻާˈ7E99R\#%yl_}`ylϚc1'l KVcBONOGB^z=!3^}fCZ$q]7L X8NrAiw~OlC4iWwQܘu:{@)-6?uV`wtPKUdޛWe8$}Ki$ R=S>Rs."ǃ#X ECǾ#fxh-*o~#ų}4v2(Ӂp4${=jEQgx, "{ :5IeTb gn9_l>;߳ԞMvnE5}Y8!x$k6O 1 a<-(1Z=z  \(9$3~԰'_0xC/;X;y1o7E*-et!@x6=T7b&۫$\tHފ2 GɥT\(^d- =:oe{%@1ZFYL }-2󄜟E&ea?Ľ* ?uV5cƶk,d QMJ`aB-mxM]N\Uڱ? WǦN[Pu1̘KapO0"gC(MwqaaLv#k\'pg^k]z=Dlw&찫N{WMm*qMX譯t2 RH qȅLrCZYz[!w`pM tqP$\X(5'p?P{j$;?>{c=Kq)/K% ۔{N ،H7.3*~ֻ)kJB !P!B {g\aZ՟2yiJ0=s!̪x O]KLv2Y>!`c`Z `T%yJo@0n0_GGi,~Tbp38ifEeOՇCתhIDtJ]y'ƑLV'4Vtb~Y(N mu!kG/Y(;@&T@"c? 4⚯C4#Z6Lo =2p]a'Qf $XU1tGT @ d:@͊hΫ:^?a: Ocrѱ+#vs7yբ[pa]噪{P"b.GĢVJ&Z?,թh] vV##D+4cX[Dh_d|+Hx(*{HLp^^uPN-Ɉ({tb_xL.BtA6Ox=,ܖ]'qۉ'GCur"?e\obYD~MJ/SK%Qh-wN̤,8X"VN Rd;ηI+TWjT7U*T9F8?ԒT%,q"0K! ֛B<8LU18볂f+U*g>Z:hK`]ju!$Ibd2a-|MptR[(!9,BfnoLULb8;-4`NAc=/H(iKA,ZT*BkpV`oPN$R8B#T,bڧ^З105*W7j&].ei/bLhZ{v|XV @Fqb ~Q$*=2O_:= lӗ$])`#?kX[dXm4ƝDŽk|z A^$x#x:?Ӊb܀ `hFo o3&+av\H'zӦ/#m-Wk Ǥtz W vr2JG_>p7Pߌu"d+ߧ|b@a])Z.^oZ*=O:#՜hiYs}BXlRNbB)dѻ+g yCD:Bᖵ;ѐ>XÊh4y<*~ɚpRm|eOf(pLvE`-xٹm JYfTT~=7dw*YJx6Ip7k4<3L,>1Wq ,Ĵ×NR373IN3S ZF@XOMMK l3C OR~`~FȩZyMR͆A!}~ c~B)IIujvj<%mJ,P?:}rM}9_. ۽}]!Hl1L JLPMH\:ݯ`1v ("g&2za 8 s^i=J1\3.O9O\jAaPeWx8mF0$(X+'ZTΕeZd5aٲvXV `+eQ*V{,fNF%D2C> c*i8b}oo{~DG-i3hPWI:L>P=,>_PniUF39̂fIʒdI5mݠ tm\_fH jiQ6_[iV|2jP=lȿf~aw[ע'Ւ`;Qc)r! (uV8QRxtKeMڽ".cELj#P=@!vey"Y]0REF݃`g@:%ވTwb^O P6 B-ҋ o&AoyV)M2`tj?yn}Snq̼ 8):zp YoYNc{䏮IDqyl. .&ETZPw\LgrMh;PeK52nZYZAwcU}-|2Ċ\㮫 Z+1Q.쫴?@V%qH/sZ" 9E A I`X}OB#Ze易ڸ_OwX wE(O72Kn%fk Ș,Νn|݁@zOGptdVztIwd&\;|M]n xմMyJ5/BO%N1._BM;mgQ & tWf Ut%I"_>%N9FuwAB?f(XcFgC(}YW6 Hk7hQ hJxGr6ЙrF9\0JRd`])6l/ μ-=PfVz9O Wt{`nQ i OIXwEmRPYNʊߐ]n8 ^a;dTccRCU1W +=`B"I529S2r̅-(\E[Y/+!Ā>ĜnFܡlA|1~7ܓ& O/.9!f JL%lXE=0N_-@R͐P>}$XnFEpePR+Pֵ ܸ.=bz<" T +e? bPzҮ%+&i Mm*[oR<tcAВ2\TWYehEʢK2=_ E1+zr =J G,FB'4뺹:5>Vqf`#OiCVx3:7F/|uk+2LC]PJ|@9hPn4ɡZϧ|cbLlfR[A}KI0,+Avf J`RW|0aeC{=Gj?Ur3]Ԁ瑪 [:/Lp>& DqYq]r>IVD!f]^OF|K49DR? L'k&݌i q6MZI"))OFGpE,i1;M1ܟB =0I~ǗI}ݧWc~'Є`UexrjY㮃PmaSTmmb6TD @19+j)o8ڡB#O0j9;yD\?kv:d1 EBSN~U:ؑxTW=zNv=|n\Q=Q^ z`zxӒigZ>}t_eu{E %\)L:HkM̨-nlۧId/v{sɦ3;(Tp -uY^؄} qosO -\&4@ [ԗr773sMqOXsa6>չB {3, 'gԡa"Yq@֘l6+Q @.faS xLM_-Zp(mS_AV \aQឺ Oj)8D$7semcZl_7^'f(hv||Zd!S,6@׎{Dy䈔YP k !j%bY>kH4phX^XA|OKbḠ`` 5 DGZ69rnqh$hݺ]݌% ch@{:|7{O>V7Ϝպz=%e"KވՔZGW|S+0k():5k6>ߡBMƠH oǷlO8z/7_i'NR9.=u  źNZA'7?L-  6A09#՚SΒ׿Iz zZ Bc_Zuରc8Q1C Cbγ:02=ݰH7gڮS93V'󍽥^F 8|a,pfum?_Т @#;Shc#l}F}`9m;^׿jER /Rr3d(wە>G 4W Rq }V;8S5EІI6jݩ+Sd? CF5nۻpF1T;I5%{ME{H ^MCð-ૄN,9#zD,dž9i5F\iMGyv^ 8ӷ@sP0ڥ7).I.I߯:#nS_6`x LPo*uTm.IφrXu9@"bmuYO~ᐯ-ig@FrGHYBc$A=*MyGr|vA[FęhH] L1[!Ͻ""Owh㶹yW,J3:A)|X! 7$A7ѫB iإ+ |Z¥&Ko`=s ;RJJ꜆~:ˆI 2`W jUwSyDsQOU $vjb^ɫ+p[CI;2A6-o;<3dDp+J_:ya(>/5q( Tqk pb#k#- ,S:[.ى~~QUe;%w90[fql{>P,X qC%(?:1^.FMUͱr2u0?<' 6XS3]q$x ˷64̫ฉ( `>zCvu +U%8-e{N2~ .Rn]k̺&t*h/5K#)6" ;G؈8x uZt^3/bAo ɑt6i-a)רR, epו[XK׿J8O78QwI屽9f~KE_jq" ܏اLJg~a1QWMQ E=X@HJ0k\N$Q üL={&՜ .OB$ K'r ׍j]59V,oH!ؐ+gNqWWTi1ocƞk4BI;.1!VzKv|ދ+ =4E]`,.Y7yRP˕{ڀ<6h%NR~S=VbkY?ڛ/czmm;;xVi2dR?3AyuTmE27[y'Errh^9Y]Ό|#uyMw3XuG%JG_}xarӧj9Imߠ;(N[KeLMîrHc')jA><'\b}Β~%MDr{{I=wu"DNVl-psQ*}x6~l@3F;+-Գ"P! sV_*9t,TXIb7}!R:5ϓw|{!l[-+8Qi?]R h==P{ cY)@\ z- ց6nJ#[Q="KI@x| 0,FӍna^vnu[Yg{J;wZ5zvGUWL:Srlb/³G5өˆB,_IJ]/vmRB"ܟFt0p_mЗlN}'ݧ, c`zWCycSXE#&m}{rt%\^"?)g+g\R[XBPjgqEdaq]LytQ2 ahAZ_Zi:5)"0KQêzT9**AH[@Lܾ9`EK\cu΢iq*[N[_ًwPqYď߸[MA,43pl G(XbAbiO̬Y-0Zܸg;Q4И%ʑ=~)炸xp+b)q0=xD}^iP35!kiz8hr:ewM(I%ˇ%V#9&TJwAG MbHᦝHu?z4[lqviQwC/#S]anCV: ^[H.(ۢпkOiUba5a&qxP!|5GhXoМČVLJEq>E"PiE5((գ yeq/s9RܙFw찏5w3ď:/QRApK6,-5hr:#zPa.q8a;Eb0&nޭ՞ '{KF>鸚rp?Kg! -"~" vdc,ϋ+&5i1d2!zs\ɁJ ƴGq~*)CC KW'>ӽt폞Cb[R 8`xgiC_updh6r dM}c\$M2誫n?L.%  Lɺ|1noLb s=Ex'۷҃o\J|^{hmkvfko.al18sߞ|aH7\[l^ ]W"kHm%PQM`Wםts 'K bThiD)sw s)ͺ5ʬUVpkꪉiE+zkm>DAE|qK۷FOuH_RDY G t ( Dɽ@9&%?0 -,ti<rQޗe7b] Zhu%_ߚlӝ<(Ի&z PtXC .dVJjĭG5=Fbza-6\=<8FZ% .DR; g2 >(]΅GzIߊ'bWpIV} =y(M߽iףhXy͛ |ʃS`H Cxq ('ў7%<2^5 VèOve䐌֢-Do(VbԐ#UԜZAKPigU 3ob+jKϗVE f$p,VΌizA{F) m2wMctC&@Q,ڧ0':ƍFގœ=)KL9VsۖpL?YʁC;:шKW,&0fnnjjo0/$V3x/e0)˲ƳGl,\gFӴEۂ"7Q>+d %vb_j_"B к} šbYۄ2cNEIUAauЙXp-61|nC(r.+w`R ̇r;rK-ɹ֓P CX[˜ݑci {"%qϕM){ QTF7Ywh7r=b4ɦ<2jWPТT9Ή>Ƕq9,z~Z7+Ãer3SL@kRlBY(T)%Lŗ`YN RikCza3Zc`pQA {;Ā~GnmH1+(.>]Z\0EeGD9'Nޓ'.h41fqϲ/LvgTWH$=aԞp }:cVsjרEH[ϒJٛgx~J:nQ3t Kh8u텖ztIA` ZiHSV->j3%ksv>]ءn?z=b%xyUfu!Z؎p%=T☦n)|wiVS.e;eM17{W?$ho0HPJfUhVXgE3ԉTA]=ƾO@Bė`&e$L M6_w 4R1gjul$^R4k.+qt>*?֋åNӭZzy8 |O{,&H;e !fOH[BV[t.xPݾE>].uZ<5}Yx(p͖|%͗krj7pt +؜ܧ4fRP<$.@UOG]3bXC b?Pe@TX:b՗RUu?7Ij0̢vP[Rxli%͋8o9dK$y7sU` g惜MmȄu<ˣkD(d"QacYHa|?h:;+0ˋ:k;X?%D)[c81oJ#M0t[['4 ߝRp*QmOZ2J!F8Ui H`y~m4#&kG햂8ϱu(U(/.aElu3 ep3p-I2  t} RO+g} Z#qb0DR9c}ض8+ !2%68팮d6th;ZQ$ֳD$P7`GP0@N7X" A9,0cM'ڟ[$\۽D'+}H|DBݢ7Z{- 8m#RV iN5aMTFQܩ^_"YcOa}Ote_LHf_N/]%#4*z  Ӵ,5`zVZF&G J^m, PbB}sKZC&U:R {t&8~̨Axv!n%lTbY!JPd*N!T޽SQ[V^u,7P9;~~r\}!h.L5glTjoWv*b>!7 ғ2*;H F-w&q-}Fx ;<IDUP٤!5RڻȕJho&2()(|$֡'}Dtp@"W3?CQ2وFŇ)Tq$umb)"p!Wcq76h$($A;E  xn 9[.ov^m(/kvGUsѐVQL4Lt[mKmnnnJ,7TZ=`NٽY}~d'z"eԃffbZCg[b^<^}ׯqFRdN+PȐ_Ώ2ͅF$rnCp/iL=mPb9Nw`#x\)*h\^1j-*EЍ*>2( zZJZݒYJQ_'Mq5d;Z=F~cJ$58՞ y+M=LԛAȰq4Hi׉.cLcLtgdL8VvTfaK T֭ݛneZ`y|5q  C܇m&' =&>Tu3 { \+7) 1R_HғdJ1K'yT{ҩq "7PNT[P} "s%%bn~n3qJ_>7:`]:K'8 [֫dų W#@Gqn %5ʞ&)Nfő"]7zTwʚ#d֝ ۈԲ'9|~`N/bDU{-Wf~NCXB_ܚ!Zܔ8K.3Pr\ePjdi'wKh'/t儮+`+:ZFe&Ku ] ? C-ǎi; RfIm~j|Ӈ2.mٱtjhuffWeK[;9wѠu(6 qԔ\q 1,"0(f C}w8],ĎH%7-9JCwbiqZSC=$TTC5AQCCՃ;A;5W$,Pa: l)|@oJ382p`*JT!q0ghIG7;]x {**iAV8.E逘P۽<#?t!B[* ,(,cbVD郃f>rc(ՒNFj +W@ =⏥#zwo(,2u#Xc]Kbq|8տ(=X).?%,Pa85&f8ְ57q Q=mX1z?Wc؛*F_b4څZH5tð.,DG_ߣt Gx&δ'CHcPbl$ 6\{K  O:Eg(#`¢ףR]n5oh`!$ظC;L? Yӥ3|%.0ph#;`pO6'Z mĞ\n: dĩ. W`:75 H/j r\0+ ocŸ:i8&{ sNǰ` 1݄3$I/ 4PYLur)áL6w#3F u=nte'@IK-~[9^R9Ёvc!?&]Yh%pݲ_T>_>ߓp$v6(}j =]=C9uK݁Ɏa5YԒiqЈBP69RȏЛ5%F#'N#ڝr(Xe^]owZ_ͧ) a3C!>)w 13ƱNRe3!X`qu?XjMc)?/.l!vT0[L4"p>^J'.{Ь8 r}np^jaè@/h/Mv&#>ӥ[[SpaSIDlam7 `frĞ 4{Ug 1*J Qz4ܚN#p==4DKk-]gY-A7E0)5#3\Pb 2zyoUG5J,9RVQÅbKlc}FK~@ ;`!(瞁Őg2k|U0.9~è^ ݢ,tHBxQq;,dswg|G3t!->Ya~ЫNr\0X/ɯTnK9h--u8aQdv{ݴXC4PM@5cՉS37;ǟusk[ | #C4voO!|Y'[Ɍ3f|9\v c:CŬ긊;B+ ,jh=Ԫgy@.D'8pټ@Qwn9-^麙>>ȥFzvر@J.GmR…L2umj%t4>AО6& ^+z269|R%gi;.8fت򬕞Rʿ<@dnxIO.\q>1V7mnޮ[7:~F1L:8joa[R!0Q-cGZ-Cu1A1Baz@N+?&ɵ/ m@up UVܞS|ĊH(?QOEc^֯M|-.@gNFa5Ϝa36pL- aX݋$AYXc΄.UK]3˓%œX4ㆄp+@˥^enϑ O闹/HX*Dr>*`jR)( JfƱz?^e>>E z <5,JW}P%"29u`՝ E!FS/zi@ F<5I7AtMu"#z/)kC^N7$1ĝe[EXWZ{-~ AHnegUqU!!Yiٟ5S8*2SׄSzZ3{8{bRƕ(G~<;om_…wʳj I+kƏ7Yk:, (qcIL{&uw?XC ˢeOQհeW- +tc2,p^ꩦʌm q<"ֆ'===H~^/eg5MK-: z!]o=mJ1|#S''FO DZ7k#pPNtDyqtzpe*rߟS3ƿ>ېiHbQUb1y`N~crHfRGCN`FS2Vl ߡ#1$%x*k gLenY ,׍ Z3[wM)ڌɽv{qLjt*xͭ#3nQceUO9v&Nsiw2ed&i~0eZ b4z5+ƝgVt^lg^aN?c^O^!m'N4m\C/T_ܷp֕Nמ(b¡oS2BSƕ]_K應(B\A宇8?DKү@$T/sZ[t+h)mtw):'m̹P DN;HBI66=k++'(|ܲrۻK+%B>]q=ɸsG 8<:Ǔ[̀ Yv C ^9boq TVG2[xg7G/ɺ36IDԞTTؙݗU}Os,3tϳvKG0|lV[eM%SB-O\Q^&6Ib f5G+!K~BF>%L,y4'sb:Tjj`*nYdOƅbU]j#2ppBOF[#eq!4d_WjsHMZspm{ ݖO&s 6];$̿u"Fg$P8fV0(uw2}?Pn-0®on+~@*{pLKnU7#{Rj@-ńa Mg7gޕ0(D}JG= ([DW<,؏m\LƉulk#e;(VW{Ā,_MNimu֎YW#qf%VugQ0b_gJGiM25YTfvMO_7 [D(2H%@in*S ~cfc6OV21nݺ{ *$ GY&MHSIKôgW8[*q5uPd˙_a 8pRs /O'Bݝk_9STψgљAmYNITG+Zј~9t:"\R~ŶPXL8y\d\FXm>O71ndA ǝ41[E}l1TF}$ uIQI7 TG=pvaQ>a~Ix[ Cvx Rsc37&qpyTgD_\5@ñkfd5,dL增gn3y`w~#[2x E2xd_$LDdخkz+Z7#ER?OdpGD|U "?YJs$35#앳NxE--i\h1WՅƷ c~ęOʼn\LcT@]ʗH8ΌA,?^-FF :D _Fm 9)^m:vBkWM @6KZvd8&cXQ#*}cPk_(+-CMkHljķonJ _9:v؈rwrЧܱp.s4r|V_fM`dx, (aɿrBX90\JjKt1rݴ6qglJ$*[3VyVj?Tf7s3FmDdDu}&hSWDHD;soė7!OT8zCf xZ;+ _:IWqb ot̃$k^`DЇ:\16N覃c`| k/̬FL@9W\u]W7R e{<^i4;ӯ]eK^/mY]i Db4k"){Uf%F!֏,<,/}kҧ7-/&8aŷn)w? PXIB3Ӕ  E53}l8(}ќO8WU|kq ~- .n/r8Y3 DR,E\Ѓ?P9z T l*ZGiёJ@|&.1Պ$x!.!e&6Bk*ШB65'ՀH'Ѯёui1 ~E:o3 &DZ.u@6-fC_Wt^Nےp34|d1! {,R0dq |X!|. k5yY.O*h-Bp֚d:ֺ֟jEa@(du5 b;QyU%tMd_L@";(GE86يAHZ_E}> w9&4JO_>fHmmxϚ #᷐8@q 11v tύrHi 8_[ i/ / GG ?~sU"̢[OU,v&C%.喡ϖFj !.JsPX,rv:EWYgžCH-1r+-ӎТ1$D=!dC@*-Ф1SǼc2QpPFHkMo ]+/9ba96~wnX@{qLh=kRQ1GpǖJSVILփ'W1j?x,Zۤ?jV/g7v_}7I}az,5\'Shy=&OUKiV]ktcA ]>fkG̤˙PA$wIBJ;%LRF݈[y19PC382ȿui6ظHUf\XXkej;ľsBO[:S8V QGD9,|F^t;/iVy!GjY ~`E\Y¿FNx\IC_g6yH>ؔ f"=2~qvDkB GFA;A$@؉Vy 6<ͶLƤn2+{[_6A-UX ݸ ]&]CshS.FŽ Ʋ4G,M OO3|ثjRU ~t5.|6l[v3MbW2Ke(jP[殡@Jo6Yt!pm|#ոM'/Nę_0DHx}[ 5H{ NL j'F@Qq_+XMZh^SeL;r* ^{+0́5z 녟RcW.'@ ':B#R,,ߓ:쬎m;翭fR6j:VˆZ^xElgmxjR-/:C3wۏW-+,Zڢ$,UJ9M.zZ@ΣWKhNE8RMd+:ֲmtN@ҖA*mwyƀL8BSw# lb0="lV@*!!PɞwuTRW5|ܵzGyxih˄9DgH)FMoڑ<Ȗ A~^$[ @QTVvS[a_n%-.Bzc^]_XzuP}|Y_dm[n\MD?vRcP(D ' ޻jck@4tR^*zQ:`J {fnnYucH[>x=ē`+w;m/Xm :|^i `j 8zbQN2/]ɚjp R8QbSu*:]ӛkM|G<]y4fZxpu+s5it@ rkv(s=S~fcOrԿRɩ(MԐؙZ~Y,dT\5u8[F0I`]Í$׽ >W^r)&^x[/8#f@HQֶWi.scoobunj@;NQz~l$BspC3yT|iѦp TuRڵΒб%2ײMrQ` Hfe dP@>oӢk"I*1MI"PZ(8s;=J%/N*OȾt!jvYg²s)u'K髼!_ZGgs~d^Xb[!I&P&|ǓhuZ6q^&֜j,)wPBc@.OUoPY^Y>>8Ӏ\W%{>9Sαa7[.w$8@`5T|eF>ĢCdk‘u!j ڡl L ?cx+33WmVe!WVGy 2^ +8ېn$|##ƊY-G{ݸLlSS4ڷv'[#v>Dxcɴ]jF77HSQ0AF|Kyq37B,{D=] Hir)pm}kCxmMi|n͖Z۸U۽8ej*Ķe0o7)|-")*7BbnK0o^{,i`M~#NF儌UE G~b"nU3HH%XGZq95yQNj_1,@ǙWTfʶq]\d4NV}',ƛ_ᴆ!)c/PӃ./M-.sTJQ'0Eު5#" լ?DeB,`n)5ڳ[ g0A}|-Dں9^0&#N] S./6c^fbVfn^?.+u%[D->ZBP̫vU q,UWQ 7 -x=TRsSDKcy怕.wCQ+% $ߑuj iNDyEisNP$6Q2Rg 7EfwUnVE@ost7n8x>=|)-y%ym_/HDI[ aJӖ2EHqlzڭ́Hlǻ`CI?Q @ AleoR(2CYk 3;AYG SЊX b&,IOvƙP4FRշ9%46pFBܷ~, G3kv|q޾Zc7Y͢2C"q2!J) :5trwQxiY _Ϳlj-_DC׸R%Ƕl3 @2C|J:"ʟ+1n v[qPuGh}ɗ,gIQUSvgUQYn֝m9G&U'&Fcz l> ~ck%'_9WRD1,_Q 5'S9oAm:eUAųp[q֡c]PXߐ A$,Gț$ҥfCמ/F>5H#*ZttfF lC*atMn YpYs$ӭZ7&=:?.%c$ǒF.TR۫-?|Iv6~p7#"rq֡C LflfFo@Hi`p+KW+婜UJr eNJx6Oe]jXT}mϳQ ch(2я#d㢌z})x>,ޖGucיi᱈ f Ӽ@{} a:C@ry 񴋗HKM!)tomqO A8w NJc94Lmk q dC94Ɇ2qKJFe{E+ot9,@3FɇTfcUARhHfSzN)BH1Ab@(I~cjBF%~( /{oQ g@:G/wՅ" 7%,fns0g&l Vp]} jx6aWD;SNhi9Q4鞓QdӀX7' Bb(QHpPY2t)A3 I X2_ pôXRm,M4p!ޟ4"g}`oLa] 0|hLP*%,qqfѰ[̣W`Q}kZ>یʳHZ*uOVי.ѤU1Sc Yi$"^VENaQ[O"ԝO+CitR3T^0 v`bĕ.F΃Ƚ++aZ"=I< aa1VuUSІT=;vK呠"kTA:ҹvA#5d0=&Ewպ`PFH¯J@V=CX.Gy:i%.fzI-o%0iGDFuZY 9flS\Þhe^,Yl{0>}X%#v:ZD,:ne~'T'UM6"|C.-(AfOWdrxjbps7O}*` >u*ÉG~ș}uVίDq5Qxql kH|y&|%9<$[ Q ETAŸ+sc0yt߽:ja".gzx t#1ʼnu%[\O%;[~U{q1)'Ull=>\'3Vؔ"%9>X.;Fl7pO !B1Ti˿S˃jv=ٴ mFvm?+ʷ](C~.FhͷĻi}} xn̹i@|A`PC0%')ȉB\UMOa!pXNXV߲ |U~fdi3kM eLS $s]q.X(:j"EL2 sV٭ݺUĹZN V-[ 9ulBk@&Ud 8iY#Mlqg@=%,b ls[[a 4[PtH,!pqm'}{sVQ|hX[,dΒb|3_pRgT"TGc\Q;猡9; [Q7Nd u["PThL\aIdҟxUϱǠZsʈ؛at?\Q8P2=}>/XyKhmK6%u " s}rN?7x5=0Kʙ0.:ȓ\p%KiUahXG]w@^YAĺ;'a?!cZ1dlxH9j%A uCkUnN˔M">jMBAm}ݵW_Ii!ա~G/x6KHݕ썟OC1Pbq;Fi3lhEB~n 4#yտa'x=%}1NEq-X%&LMZVSNش4TۈZ@ "ߪM崴iDiL@21Yf{/P/AT.:Usğ+~!P*a-DHmaLKTB2j7mNWW V\Q5i&4Wj*)ҧ4"_0/ o&L+P@Q2+p*U8DO⫖ +j[ٙWFRCm"}el;?T^yf'1a<$*<$Y"2_gsŜq0i(]'*3!ti:#jEE%N%PҩKЧǡQn!.]?(t= U32gRѦhʹz?6Ր]KQIնyh d> m=n:e{&I31yo&8`v+X6OƷ_ˏ;_V%`H-CM-{##y(%0i:gZg<,.p!Jq7[FpcJ}c'Sx9, , VB!Ͳ<_=LN#>cÿs'.=_6_e>wX:s=)Z$D?qPV"/Tӽr??JRK1fUWP|uzOi>žFwPv%"LO4M"G,KƥJY:fqQCkq+"7A|n=项}]t!yyR!l]1iӶ`yI Zr&*y栟f,T1[n GO;By>ϣBH c$5U#]G=+DBBogfy(i-^t* l>):2MPJ7U'@"EQuIɵx(e3{xdl` gۖ+WgC9qzUiϝP`eό$]$o`VjFxۦ-zM;'+X>zo"TJBB)K Fgg٨nL}{]m!Cȓ &ս>c֨1T #[BP\ cYf9 Xmq'#zYcޡ`sIfQ D~*kVė0S./kMzpMa1[&1qL0$PdꞋƊ4kPu|0Sevm E:i3=ۅ#{0%]p3{ti JM<`M>A@ u5?x/6)[ΥbZFr*~1 TA~* }coK' QY}A^@ig F ?ԅR ֚>Bi7-[#yBR>Q! hAdZXŠ/7d Ur/wQrMm@%mcP hiVcc@+AT7@8ol&y "<^LZОNbWHOOXI?H |? 4!#FGec?*]āB~qb~Q6.F÷֠ x:CO8H1Jח/7b2ϙGYpȻ(En"3 =2rX>u_WFS,Ĩ >XA"@31.a_:?&86nqW"JS3xFPAtk[SLYzp7A5aJ'} Zh>"Yna}g78vbiZLJP>AD#30ɁG^Xű,HCq\[ pXR8f"buԭL r ߘ.S78PDSTh-ԣs{䍈 J8jʆJy"a&܊@tjMT4fЁt:OJGL6+CieJr jY8xW V]DT? xQx3!w7mom3.8&Uo谚~M s %2b>:JE/%:y44M61 {~]6b}irxBmP)c k2v;ũU*ipwg^Q߻ wttV30]pa'VPܒΡΧgwKV  س4C3.6m?:ДSpD0h}+ V-U7hqJ4B'WJ\ -#B6q.4m*W,+(ZK?)P#yc;zCW6$fAda(>* mMts7I\/ؐ!LJ'xu ;NCE]$PS h8`HS8?\W2Њ1]WSJ. @g 5_[$ EC{^<:T^F>F}փWw.Ȟ/w^2Y5ߑq/| vkf1^;A VXrOK@~ʎI P\!8(w=x\SLϓ{) JgB(t. ӊ3 4] Ow+kE `u~I\'!#thߦMkԃDg.sen|pToI)e:ㆌ9 PR,G\ ,RZ7_%Lj6,cPa_ R'ȹ=9X)nXjy}۞{_۠fE]ԏ5Q,)xr Gv/ J"w,ge/Z\bcO3;+5p7Yaaa?s:m>:|?{#؈k4\f w)ã}ʀU֌=E;ޡz/F]E- BEQ /p68uw?܍D9KbRwvnmI <ʤ{kV^S\z{IF!B?!_aHN+5υfρ@ [#%T5e6JV E8vf3O?2atFRV~$͚!VYދo!$BԒPoi.`c"ԉ$J<=9~ >H^K60C<]MD }]q"/m0piLOA)p;[yMэ{`L Wtv9xQx<Ɛϛ)X.Nح|Z@S بNj>f`)3l-WsEtw}X*Q(P c+B%性"!o gA &}92,DvRֹNS^@>Gf6ND34blD5LyLwx"BR{f+a@Du؈E>$\/~GWu%?,h6A. 7{"OZ6m* d3T:G`K<i0r-DR34Rijh07a*?pàmOT+Su$< E@b.3d@c7 ĥW maY3 KRAN9Aں<8E<ϭ]0odYLX9W0{n3f `wלj?x|3|of]g &zV{B ,ce6wC.|#5Qnn퀶D/SӉK ;Uh>fR(|C7ds!PGu:8 *P3_S( |ϕ^VxcWj/6Tu\ iˋG QjR 漵#ߧvLBldmbC+(GTx&FoUQNdmo*# +x׻+g$NaIGeSzlg'9۪ڧdYNN'Co j.AjGML`h3x\(kL;u"EHn$AɠeQz._yC&|ŮCc9t*sRH|J8DyO.x\~홚CcH@Cd憐83klbѮx3p4j?,2 ֹ:t[-0ekf-퇕 paѪWa"V%?fF=|rp;psLc(aȨfDjUa=%QUazI=o&oA:fE4tM7Wךy{I)?e9ҹU;v$_KŽ UO _qzHO%ź(19Z)IEӾkǷ +!,%\GgW ^^ۏF$p93: QP"y1#6N?_Vtйtfr%U3"ꇿ~=P-^Ztā>SkWFx6~Rz}})Z>~*E`UѧK>xh27Pm}zG(?ǏbV3Vȍ*ku].w)Yopg]<|q:$@e@:tq\_)Ip (cg7fOzs EP!2;jA%]#l^J74Q{9V+ܛ( H7LI <[SI 8*WcJ)]( H;wnP1zR1_MM\>0 YZgstat/data/tull.rda0000644000176200001440000001154014413507500013755 0ustar liggesusersBZh91AY&SYmmbI|i‰Gv^ݾ-{ehIOA4h=II$^fʘ^pɬ)Sy77׌g)P1J cPU9xa!QwJyş%ei"@@JIɆtM;ACoS*l+r\eDD]6 W@\ /&U _6@~%?]=&7 %0T7I4(B* (E*֔(%ǁ!(u(ƴ5UU (UuhDE*ֺ҈E@0 aIMR6`vLJZ[^c]|SamE a1'dL/764S(GKsXq%CP@:Pz"SY/A~I%K-іь*QXUVIRUQVPT*Ұ,cF5QPJZAU-kDDeVʪ$@:R0@(µBQ-K*%Rime*EHնՋUj*шԱҨCUc/A~*o@ؠ|T:0+EpjնT\ "J_t\o룱x\;(F4l ԘdLjuNX{6H F;YxA7 @Q: k5r }9hljeqdBOƀ:02rPӺyyV[^nq["F/W (u{h`#_qr}.B_ (p8Vp(H9*zy2˥Oʱ*[~殮ԃc 1^I7ufk6Sd'{Mc&/{~BTl^@$L'`gȿ\g PH!((~I:0 w'mQ P+B]qt&JV\%E1Z[a q3y ٫nZ+v90_!Dc%s7WpQtAcbn>2($u6`Pu!y3#Gt9U]ƯQ*`Ah+Zջ-9ts]2Z{܎>3ߖdmG_a&7.ϧxl†UnE[)vj_k=dڒLψ͟/\8s·Ipu܎7Q\^I}Х{|gM8Ja& b^f;{9{IHA`Ru (KTAZ "D+QHR2p @ݠ!] $" NEa5dܠHb$qaYH5$đBVYXФDQzܑ$}s= #/1d"5J$˂Cm7~KN;:h!|"vSZ|jLg 0p"J?V`z;5=kmG}y/D-,c%gK׶%}Ҩ2gCŔ 7qH)B,dAAUEV+DHF)TDUsE9OBӳM4f67͌}l](&T9 TWy}]:"! N^-K9hcFkf>Lw=} \}!^1W rfWѲiKTk̿GV..঳'WPX<{ D̼)kWB o]]xZ?^. @IH@!4Xlgɳ]h_ܣ#yL:s0ribݬ׼CC2 kX$ |6D-uU1sWR 9zBO" _D3|Q+@_K"w uY]{e}Ί'&3Z#oΡ,43Hn5b !и1, ڇ^'_RGU;%V?x`>cG$K~xM"54Ł(ε`dɊu$P3(uQ=b @З<$ rQ_0ȧΘPR Q@Ģ\ lcP q ;d% Ho1{d!tJ '_t0K qai RU&vڋ}Q\1m_]HSɩރ.[+juA]H,g屳aık'9۹,^V}JEF2$EU`EQ=$9gPQݮW T4NǓ,.ori+}p0"㇀ =h4$ޏR'/iNkXx0j1޽uf #f=lN`k P?n}o S3۱  $^!~NU;oH@@H( Kk-V@ JYJm1 $U6e8ݎ\ iA¶d:zM#tKlԝBIAv[ ߾VT h"(HT6gstat/data/oxford.rda0000644000176200001440000000544214413507477014317 0ustar liggesusersBZh91AY&SY"JO$t@@@F@@@@@I Ʈ}wD{xKiLS1LmF 5(ژQM F4z&&M4Ѧ@S2CdATz`#&dCC&aOFD@hQ)hh4&M142bb22bi`Ʉ1@@4AhS&4M 4Ѧ 4ѦHhd d))5sF L8ndb&f\11!666Ӷ $4@ЀcTM0 ˖^ρ H,J1zeQ҂fh(R Ta6v{ \\'6ϯ^fZ<'Y [S|h bݧKYT.}t^^57!5C !Pb61ɭ $$% gVv{nFQ0^]4]7S=[F1MU̚(E/turyxy^-:^/C=y?) ÁEedeP ̢] ,BUncR&Y8@U‘Jp@UT HRG庻:\ x:܍`ЉñE5)*xIƴi{U8SQ(?0Q5}ҦPt:є] V/*iZlr8>l%)T(j-=2jy=3ˋy3 qwU7 It6Y&9'mr- #mj?&*7i0\6Kc,UږKPbwsN"ΉmZy qR##%h>)r AmJAd\R;uzKk6MEĄIst/88]p((PP r(%OwY9f>%Ny$I$I$I$I$I$I$I$I$I$I$IBxI$DI$I&nf[PYZi:a" )TER*1(e(nیfU[r˹ۻtw&swn.nMؠ҆ kTR[s\\TEUQmU^VբQQ)}W#dH'L,L6E/,PVР-B(SsWJ a\PP@6';YYyyyyrB t=jիW1 vG{iŨM ]Znݻv۷eUr$I$J5UUUUUT"P'5u~'LZ g{^^u鰌(eU힜]'[g\k }"~߿~e0@($H I&fPI$E3sSR)H0AI$P` ܀sA>>~gŞxz_2Mcu+2Ǚ5sfF<&52/@AޞNL|3S#*(iIMf(hQ(`ifhף*z6C\^%dQm^^7mb+5+{UyQZz]mY]xzwEˇHּP HC BR! bLUdNxcssw(W5˔˖w\IFd sn.](W@\ױjV+xk67X9[x[%j6WjUjɣFTj5I"DdH0P6I\8I%(3HAd;jEZXƊ-%ͻZ",EMjV׸՚@Y$+J Q ZQ*APuv< V /*8CZ] orPL%L2h|Z}-Ǧv\\jqfѮTǿ21pWb&QB#dV@/.*W @738\g~P 8Ne  @PPN'٥;!upeovE}i [~+,Y C~E#c'_KIBohvLL_)T7,U"0l4w6reؕ7w+i%ztyJn{G_ŧAxutniiΟg3YN255vg]a՗j@aUC Eh{pB|8軜4/ORڥK6%RhE)Ȩn$ HR!tDaCWuhXkLeGl'nN39<*Ş :%Y D Ψq,Ñ4"Ӝ4=++]_`;pچ`B>@Z:D: f= 2.10) Imports: utils, stats, graphics, methods, lattice, sp (>= 0.9-72), zoo, sf (>= 0.7-2), sftime, spacetime (>= 1.2-8), stars, FNN Suggests: fields, maps, mapdata, xts, raster, future, future.apply License: GPL (>= 2.0) URL: https://github.com/r-spatial/gstat/ Encoding: UTF-8 BugReports: https://github.com/r-spatial/gstat/issues/ NeedsCompilation: yes RoxygenNote: 6.1.1 Packaged: 2023-04-06 09:22:07 UTC; edzer Author: Edzer Pebesma [aut, cre] (), Benedikt Graeler [aut] Maintainer: Edzer Pebesma Repository: CRAN Date/Publication: 2023-04-06 10:32:40 UTC gstat/build/0000755000176200001440000000000014413507474012504 5ustar liggesusersgstat/build/vignette.rds0000644000176200001440000000054214413507474015044 0ustar liggesusersRMk0 u۴] Av=s.]EIllNn~XS$!c͢vXgDGNDπ 3d^>Wk 9X(!DLS>^"/2S VVj9_H-+HVq 5И5RBA i(|k0 #JS++Cj_pTZ-*[y<-.uNi_<`GnGHS̋dZ 3tca2VP۟25^<㦖)@z.E n?%9(JMt 7\mgstat/tests/0000755000176200001440000000000014413474732012547 5ustar liggesusersgstat/tests/vdist.R0000644000176200001440000000054613777370515014036 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y mg = meuse.grid gridded(mg) = FALSE mg= mg[1500,] krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=FALSE, maxdist=1000,nmax=10) krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), vdist=TRUE, maxdist=1000,nmax=10) gstat/tests/allier.Rout.save0000644000176200001440000003040414314525262015623 0ustar liggesusers R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > # Sytze de Bruin's post to r-sig-geo, Nov 16, 2015: > library(sp) > library(gstat) > > # some data > x <- c(215, 330, 410, 470, 545) > y <- c(230, 310, 330, 340, 365) > fc <- c(0.211, 0.251, 0.281, 0.262, 0.242) > por <- c(0.438, 0.457, 0.419, 0.430, 0.468) > Allier <- data.frame(x, y, fc, por) > coordinates(Allier) = ~x+y > > # gstat object for co-kriging using linear model of co-regionalization > g <- gstat(id=c("fc"), formula=fc~1, data=Allier, + model=vgm(0.00247, "Sph", 480, 0.00166)) > g <- gstat(g, id="por", formula=por~1, data=Allier, + model=vgm(0.00239, "Sph", 480, 0.00118)) > g <- gstat(g, id=c("fc", "por"), + model=vgm(0.00151, "Sph", 480, -0.00124)) > > # predict at single point > g$set = list(choleski = 0) # LDL' > A <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) Linear Model of Coregionalization found. Good. [using ordinary cokriging] we're at location X: 450 Y: 350 Z: 0 zero block size we're at point X: 450 Y: 350 Z: 0 # X: #Matrix: 10 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 0.000000), # row 2 c( 1.000000, 0.000000), # row 3 c( 1.000000, 0.000000), # row 4 c( 1.000000, 0.000000), # row 5 c( 0.000000, 1.000000), # row 6 c( 0.000000, 1.000000), # row 7 c( 0.000000, 1.000000), # row 8 c( 0.000000, 1.000000), # row 9 c( 0.000000, 1.000000) # row 10 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 10 by 10 rbind( c( 0.004130, 0.001419, 0.000896, 0.000566, 0.000224, 0.000270, 0.000868, 0.000548, 0.000346, 0.000137), # row 1 c( 0.001419, 0.004130, 0.001840, 0.001398, 0.000879, 0.000868, 0.000270, 0.001125, 0.000854, 0.000537), # row 2 c( 0.000896, 0.001840, 0.004130, 0.002003, 0.001424, 0.000548, 0.001125, 0.000270, 0.001225, 0.000870), # row 3 c( 0.000566, 0.001398, 0.002003, 0.004130, 0.001865, 0.000346, 0.000854, 0.001225, 0.000270, 0.001140), # row 4 c( 0.000224, 0.000879, 0.001424, 0.001865, 0.004130, 0.000137, 0.000537, 0.000870, 0.001140, 0.000270), # row 5 c( 0.000270, 0.000868, 0.000548, 0.000346, 0.000137, 0.003570, 0.001373, 0.000867, 0.000547, 0.000217), # row 6 c( 0.000868, 0.000270, 0.001125, 0.000854, 0.000537, 0.001373, 0.003570, 0.001780, 0.001352, 0.000851), # row 7 c( 0.000548, 0.001125, 0.000270, 0.001225, 0.000870, 0.000867, 0.001780, 0.003570, 0.001938, 0.001378), # row 8 c( 0.000346, 0.000854, 0.001225, 0.000270, 0.001140, 0.000547, 0.001352, 0.001938, 0.003570, 0.001805), # row 9 c( 0.000137, 0.000537, 0.000870, 0.001140, 0.000270, 0.000217, 0.000851, 0.001378, 0.001805, 0.003570) # row 10 ) # glm->C, LDL' decomposed:: #Matrix: 10 by 10 rbind( c( 0.003399, 0.372269, 0.208612, 0.127967, 0.016746, -0.025847, 0.223862, 0.148767, 0.104047, 0.038371), # row 1 c( 0.000000, 0.002661, 0.483725, 0.327484, 0.153742, 0.233021, -0.125118, 0.262410, 0.219271, 0.150536), # row 2 c( 0.000000, 0.000000, 0.002276, 0.540203, 0.303585, 0.058071, 0.314376, -0.175899, 0.295181, 0.243817), # row 3 c( 0.000000, 0.000000, 0.000000, 0.002484, 0.483068, 0.000301, 0.115816, 0.377362, -0.115338, 0.319418), # row 4 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.003690, -0.038142, 0.000474, 0.120915, 0.377730, 0.075630), # row 5 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.003019, 0.354325, 0.235465, 0.164684, 0.060733), # row 6 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002623, 0.415337, 0.347059, 0.238266), # row 7 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002458, 0.467207, 0.385909), # row 8 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.002658, 0.505569), # row 9 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.003570) # row 10 ) # X'C-1 X: #Matrix: 2 by 2 rbind( c(665.433994, -232.313340), # row 1 c(-232.313340, 729.440848) # row 2 ) # beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Cov(beta), (X'C-1 X)-1: #Matrix: 2 by 2 rbind( c( 0.001691, 0.000538), # row 1 c( 0.000538, 0.001542) # row 2 ) # Corr(beta): #Matrix: 2 by 2 rbind( c( 1.000000, 0.333447), # row 1 c( 0.333447, 1.000000) # row 2 ) # X0 (X values at prediction location x0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 0.000000, 1.000000) # row 2 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Covariances (x_i, x_0), C0: #Matrix: 10 by 2 rbind( c( 0.000638, 0.000390), # row 1 c( 0.001516, 0.000927), # row 2 c( 0.002126, 0.001300), # row 3 c( 0.002298, 0.001405), # row 4 c( 0.001738, 0.001062), # row 5 c( 0.000390, 0.000618), # row 6 c( 0.000927, 0.001467), # row 7 c( 0.001300, 0.002057), # row 8 c( 0.001405, 0.002223), # row 9 c( 0.001062, 0.001681) # row 10 ) # C-1 C0: #Matrix: 10 by 2 rbind( c( 0.008927, -0.017995), # row 1 c( 0.061935, -0.028550), # row 2 c( 0.225195, 0.078344), # row 3 c( 0.356735, 0.190177), # row 4 c( 0.094128, -0.023136), # row 5 c(-0.021119, 0.004935), # row 6 c(-0.033508, 0.055601), # row 7 c( 0.091947, 0.242576), # row 8 c( 0.223200, 0.398927), # row 9 c(-0.027153, 0.088995) # row 10 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 0.004130, 0.000270), # row 1 c( 0.000270, 0.003570) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.000129, -0.000107), # row 1 c(-0.000107, 0.000089) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.001926, 0.001532), # row 1 c( 0.001532, 0.001931) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.253090, 0.441258) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.002332, -0.001369), # row 1 c(-0.001369, 0.001729) # row 2 ) # kriging weights: #Matrix: 10 by 2 rbind( c( 0.071177, -0.064988), # row 1 c( 0.108451, -0.066123), # row 2 c( 0.268160, 0.043141), # row 3 c( 0.401959, 0.153312), # row 4 c( 0.150253, -0.065342), # row 5 c(-0.076273, 0.056759), # row 6 c(-0.077605, 0.093781), # row 7 c( 0.050632, 0.277731), # row 8 c( 0.179933, 0.435972), # row 9 c(-0.076688, 0.135756) # row 10 ) > g$set = list(choleski = 1) # Choleski > B <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) Linear Model of Coregionalization found. Good. [using ordinary cokriging] we're at location X: 450 Y: 350 Z: 0 zero block size we're at point X: 450 Y: 350 Z: 0 # X: #Matrix: 10 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 0.000000), # row 2 c( 1.000000, 0.000000), # row 3 c( 1.000000, 0.000000), # row 4 c( 1.000000, 0.000000), # row 5 c( 0.000000, 1.000000), # row 6 c( 0.000000, 1.000000), # row 7 c( 0.000000, 1.000000), # row 8 c( 0.000000, 1.000000), # row 9 c( 0.000000, 1.000000) # row 10 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 10 by 10 rbind( c( 0.004130, 0.001419, 0.000896, 0.000566, 0.000224, 0.000270, 0.000868, 0.000548, 0.000346, 0.000137), # row 1 c( 0.001419, 0.004130, 0.001840, 0.001398, 0.000879, 0.000868, 0.000270, 0.001125, 0.000854, 0.000537), # row 2 c( 0.000896, 0.001840, 0.004130, 0.002003, 0.001424, 0.000548, 0.001125, 0.000270, 0.001225, 0.000870), # row 3 c( 0.000566, 0.001398, 0.002003, 0.004130, 0.001865, 0.000346, 0.000854, 0.001225, 0.000270, 0.001140), # row 4 c( 0.000224, 0.000879, 0.001424, 0.001865, 0.004130, 0.000137, 0.000537, 0.000870, 0.001140, 0.000270), # row 5 c( 0.000270, 0.000868, 0.000548, 0.000346, 0.000137, 0.003570, 0.001373, 0.000867, 0.000547, 0.000217), # row 6 c( 0.000868, 0.000270, 0.001125, 0.000854, 0.000537, 0.001373, 0.003570, 0.001780, 0.001352, 0.000851), # row 7 c( 0.000548, 0.001125, 0.000270, 0.001225, 0.000870, 0.000867, 0.001780, 0.003570, 0.001938, 0.001378), # row 8 c( 0.000346, 0.000854, 0.001225, 0.000270, 0.001140, 0.000547, 0.001352, 0.001938, 0.003570, 0.001805), # row 9 c( 0.000137, 0.000537, 0.000870, 0.001140, 0.000270, 0.000217, 0.000851, 0.001378, 0.001805, 0.003570) # row 10 ) # glm->C, Choleski decomposed:: #Matrix: 10 by 10 rbind( c( 0.064265, 0.022086, 0.013942, 0.008801, 0.003487, 0.004201, 0.013502, 0.008523, 0.005380, 0.002132), # row 1 c( 0.000000, 0.060351, 0.025382, 0.019938, 0.013290, 0.012840, -0.000468, 0.015517, 0.012189, 0.008125), # row 2 c( 0.000000, 0.000000, 0.057370, 0.023954, 0.018091, 0.002846, 0.016530, -0.004230, 0.014644, 0.011059), # row 3 c( 0.000000, 0.000000, 0.000000, 0.055509, 0.020471, -0.000277, 0.006286, 0.016960, -0.006686, 0.012514), # row 4 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.056523, -0.001665, 0.001218, 0.006437, 0.014711, -0.005337), # row 5 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.058108, 0.022018, 0.011347, 0.006008, 0.001147), # row 6 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.050877, 0.027084, 0.018381, 0.010720), # row 7 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.045247, 0.026914, 0.017658), # row 8 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.042645, 0.023811), # row 9 c( 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.046872) # row 10 ) # X'C-1 X: #Matrix: 2 by 2 rbind( c(665.433994, -232.313340), # row 1 c(-232.313340, 729.440848) # row 2 ) # beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Cov(beta), (X'C-1 X)-1: #Matrix: 2 by 2 rbind( c( 0.001691, 0.000538), # row 1 c( 0.000538, 0.001542) # row 2 ) # Corr(beta): #Matrix: 2 by 2 rbind( c( 1.000000, 0.333447), # row 1 c( 0.333447, 1.000000) # row 2 ) # X0 (X values at prediction location x0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 0.000000, 1.000000) # row 2 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.244216, 0.440933) # Covariances (x_i, x_0), C0: #Matrix: 10 by 2 rbind( c( 0.000638, 0.000390), # row 1 c( 0.001516, 0.000927), # row 2 c( 0.002126, 0.001300), # row 3 c( 0.002298, 0.001405), # row 4 c( 0.001738, 0.001062), # row 5 c( 0.000390, 0.000618), # row 6 c( 0.000927, 0.001467), # row 7 c( 0.001300, 0.002057), # row 8 c( 0.001405, 0.002223), # row 9 c( 0.001062, 0.001681) # row 10 ) # C-1 C0: #Matrix: 10 by 2 rbind( c( 0.008927, -0.017995), # row 1 c( 0.061935, -0.028550), # row 2 c( 0.225195, 0.078344), # row 3 c( 0.356735, 0.190177), # row 4 c( 0.094128, -0.023136), # row 5 c(-0.021119, 0.004935), # row 6 c(-0.033508, 0.055601), # row 7 c( 0.091947, 0.242576), # row 8 c( 0.223200, 0.398927), # row 9 c(-0.027153, 0.088995) # row 10 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 0.004130, 0.000270), # row 1 c( 0.000270, 0.003570) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.000129, -0.000107), # row 1 c(-0.000107, 0.000089) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.001926, 0.001532), # row 1 c( 0.001532, 0.001931) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.253090, 0.441258) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.002332, -0.001369), # row 1 c(-0.001369, 0.001729) # row 2 ) # kriging weights: #Matrix: 10 by 2 rbind( c( 0.071177, -0.064988), # row 1 c( 0.108451, -0.066123), # row 2 c( 0.268160, 0.043141), # row 3 c( 0.401959, 0.153312), # row 4 c( 0.150253, -0.065342), # row 5 c(-0.076273, 0.056759), # row 6 c(-0.077605, 0.093781), # row 7 c( 0.050632, 0.277731), # row 8 c( 0.179933, 0.435972), # row 9 c(-0.076688, 0.135756) # row 10 ) > all.equal(A,B) [1] TRUE > > # TRUE > > proc.time() user system elapsed 0.576 0.056 0.625 gstat/tests/krige0.R0000644000176200001440000000205513777370515014063 0ustar liggesusers# test -- load data: library(sp) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid) gridded(meuse.grid) = ~x+y library(gstat) # test -- idw meuse.grid$idw <- idw0(zinc~1, meuse, meuse.grid)[,1] x <- idw(zinc~1, meuse, meuse.grid) all.equal(x$var1.pred, meuse.grid$idw) spplot(meuse.grid["idw"],col.regions=bpy.colors()) v = vgm(1, "Exp", 500) # test sk: x0 <- krige0(zinc~1, meuse, meuse.grid, v, beta = 500, computeVar = TRUE) rownames(x0$pred)=NULL x <- krige(zinc~1, meuse, meuse.grid, v, beta = 500) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var) # test ok: x0 <- krige0(zinc~1, meuse, meuse.grid, v, computeVar = TRUE) rownames(x0$pred)=NULL names(x0$var)=NULL x <- krige(zinc~1, meuse, meuse.grid, v) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var) # test uk: x0 <- krige0(zinc~sqrt(dist), meuse, meuse.grid, v, computeVar = TRUE) rownames(x0$pred)=NULL names(x0$var)=NULL x <- krige(zinc~sqrt(dist), meuse, meuse.grid, v) all.equal(x$var1.pred, x0$pred[,1]) all.equal(x$var1.var, x0$var)gstat/tests/variogram.R0000644000176200001440000000056613777370515014676 0ustar liggesuserslibrary(sp) library(gstat) data(meuse) variogram(log(zinc)~1, ~x+y, meuse) coordinates(meuse) <- ~ x + y variogram(log(zinc)~1, meuse) ind=seq(1,155,2) var1= meuse[ind,] var2= meuse[-ind,] g <- gstat(NULL, id = "lead", form = lead ~ 1, data=var1) g <- gstat(g, id = "zinc", form = zinc ~ 1, data=var2) v.cross <- variogram(g) plot(v.cross) gstat/tests/cv3d.R0000644000176200001440000000031513777370515013536 0ustar liggesusersoptions(digits = 4) set.seed(1131) d = data.frame(x=runif(50),y=runif(50),z=runif(50),v=rnorm(50)) library(gstat) xx = krige.cv(v~1,~x+y+z,d,model=vgm(1,"Exp",1), verbose=F, set=list(debug=0)) summary(xx) gstat/tests/cv.R0000644000176200001440000000073413777370515013314 0ustar liggesusers# try bivariate cokriging; cross validate first variable library(sp) data(meuse) library(gstat) g=gstat(NULL, "log-zinc", log(zinc)~1, ~x+y, meuse, nmax=10) g=gstat(g, "log-lead", log(lead)~1, ~x+y, meuse, nmax=10) g=gstat(g, "log-copper", log(copper)~1, ~x+y, meuse, nmax=10) v=variogram(g) g=gstat(g, model=vgm(1, "Sph", 1000), fill.all=T) g=fit.lmc(v, g) g set.seed(13131) summary(gstat.cv(g, remove.all=TRUE, nfold=5)) summary(gstat.cv(g, remove.all=FALSE, nfold=5)) gstat/tests/cv.Rout.save0000644000176200001440000001075713777370515015007 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > # try bivariate cokriging; cross validate first variable > library(sp) > data(meuse) > library(gstat) > g=gstat(NULL, "log-zinc", log(zinc)~1, ~x+y, meuse, nmax=10) > g=gstat(g, "log-lead", log(lead)~1, ~x+y, meuse, nmax=10) > g=gstat(g, "log-copper", log(copper)~1, ~x+y, meuse, nmax=10) > v=variogram(g) > g=gstat(g, model=vgm(1, "Sph", 1000), fill.all=T) > g=fit.lmc(v, g) > g data: log-zinc : formula = log(zinc)`~`1 ; data dim = 155 x 12 nmax = 10 log-lead : formula = log(lead)`~`1 ; data dim = 155 x 12 nmax = 10 log-copper : formula = log(copper)`~`1 ; data dim = 155 x 12 nmax = 10 variograms: model psill range log-zinc Sph 0.7132435 1000 log-lead Sph 0.6133020 1000 log-copper Sph 0.3634211 1000 log-zinc.log-lead Sph 0.6367012 1000 log-zinc.log-copper Sph 0.4570044 1000 log-lead.log-copper Sph 0.3934910 1000 ~x + y > set.seed(13131) > summary(gstat.cv(g, remove.all=TRUE, nfold=5)) Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] log.zinc.pred log.zinc.var observed residual Min. :4.779 Min. :0.05426 Min. :4.727 Min. :-1.317697 1st Qu.:5.396 1st Qu.:0.10872 1st Qu.:5.288 1st Qu.:-0.230224 Median :5.858 Median :0.13745 Median :5.787 Median :-0.034374 Mean :5.895 Mean :0.15249 Mean :5.886 Mean :-0.009094 3rd Qu.:6.367 3rd Qu.:0.18303 3rd Qu.:6.514 3rd Qu.: 0.244075 Max. :7.358 Max. :0.60571 Max. :7.517 Max. : 1.414147 zscore fold x y Min. :-3.35764 Min. :1.000 Min. :178605 Min. :329714 1st Qu.:-0.58683 1st Qu.:2.000 1st Qu.:179371 1st Qu.:330762 Median :-0.10755 Median :3.000 Median :179991 Median :331633 Mean :-0.02766 Mean :2.852 Mean :180005 Mean :331635 3rd Qu.: 0.70691 3rd Qu.:4.000 3rd Qu.:180630 3rd Qu.:332463 Max. : 3.43370 Max. :5.000 Max. :181390 Max. :333611 Warning message: In checkNames(value) : attempt to set invalid names: this may lead to problems later on. See ?make.names > summary(gstat.cv(g, remove.all=FALSE, nfold=5)) Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] Intrinsic Correlation found. Good. [using ordinary cokriging] log.zinc.pred log.zinc.var observed residual Min. :4.644 Min. :0.002371 Min. :4.727 Min. :-0.4190977 1st Qu.:5.308 1st Qu.:0.004975 1st Qu.:5.288 1st Qu.:-0.0773273 Median :5.777 Median :0.005875 Median :5.787 Median : 0.0006165 Mean :5.883 Mean :0.006609 Mean :5.886 Mean : 0.0026164 3rd Qu.:6.422 3rd Qu.:0.007419 3rd Qu.:6.514 3rd Qu.: 0.0825770 Max. :7.676 Max. :0.027247 Max. :7.517 Max. : 0.4659503 zscore fold x y Min. :-4.793253 Min. :1.000 Min. :178605 Min. :329714 1st Qu.:-1.080725 1st Qu.:2.000 1st Qu.:179371 1st Qu.:330762 Median : 0.007242 Median :3.000 Median :179991 Median :331633 Mean : 0.050487 Mean :2.974 Mean :180005 Mean :331635 3rd Qu.: 1.117469 3rd Qu.:4.000 3rd Qu.:180630 3rd Qu.:332463 Max. : 6.475831 Max. :5.000 Max. :181390 Max. :333611 Warning message: In checkNames(value) : attempt to set invalid names: this may lead to problems later on. See ?make.names > > proc.time() user system elapsed 0.614 0.050 0.655 gstat/tests/unproj.R0000644000176200001440000000406014413474356014211 0ustar liggesusers# DOI 10.1007/s11004-011-9344-7 # http://mypage.iu.edu/~srobeson/Pubs/variogram_sphere_mathgeo_2011.pdf suppressPackageStartupMessages(library(sp)) library(gstat) if (require(sp, quietly = TRUE) && require(fields, quietly = TRUE) && require(sf, quietly = TRUE)) { data(meuse) coordinates(meuse) = ~x+y proj4string(meuse) = CRS("+init=epsg:28992") ll = "+proj=longlat +ellps=WGS84" # meuse.ll = spTransform(meuse, CRS("+proj=longlat +ellps=WGS84")) meuse.ll = as(st_transform(sf::st_as_sf(meuse), sf::st_crs(ll)), "Spatial") meuse.ll[1:10,] variogram(log(zinc)~1, meuse.ll) cloud1 = variogram(log(zinc)~1, meuse, cloud=T, cutoff=6000) cloud2 = variogram(log(zinc)~1, meuse.ll, cloud=T, cutoff=6) plot(cloud1$dist/1000, cloud2$dist, xlab="Amersfoort, km", ylab = "Long/lat") abline(0,1) data(ozone2) oz = SpatialPointsDataFrame(ozone2$lon.lat, data.frame(t(ozone2$y)), proj4string=CRS("+proj=longlat +ellps=WGS84")) variogram(X870731~1,oz[!is.na(oz$X870731),]) utm16 = "+proj=utm +zone=16" # oz.utm = spTransform(oz, utm16) oz.utm = as(sf::st_transform(sf::st_as_sf(oz), utm16) , "Spatial") variogram(X870731~1,oz.utm[!is.na(oz$X870731),]) # Timothy Hilton, r-sig-geo, Sept 14, 2008: foo <- structure(list(z = c(-1.95824831109744, -1.9158901643563, 4.22211761150161, 3.23356929459598, 1.12038389231868, 0.34613850821113, 1.12589932643631, 23.517912251617, 3.0519158690268, 3.20261431141517, -2.10947106854739 ), lon = c(-125.29228, -82.1556, -98.524722, -99.948333, -104.691741, -79.420833, -105.100533, -88.291867, -72.171478, -121.556944, -89.34765), lat = c(49.87217, 48.2167, 55.905833, 56.635833, 53.916264, 39.063333, 48.307883, 40.0061, 42.537756, 44.448889, 46.242017)), .Names = c("z", "lon", "lat"), row.names = c(NA, -11L), class = "data.frame") coordinates(foo) <- ~lon+lat proj4string(foo) <- CRS('+proj=longlat +ellps=WGS84') vg.foo <- variogram(z~1, foo, cloud=TRUE, cutoff=1e10) cat('==========\nvariogram:\n') print(head(vg.foo)) cat('==========\nspDistsN1 Distances:\n') print(spDistsN1(coordinates(foo), coordinates(foo)[1,], longlat=TRUE)) } gstat/tests/stars.R0000644000176200001440000000547214314525262014031 0ustar liggesusersSys.setenv(TZ = "UTC") # 0. using sp: suppressPackageStartupMessages(library(sp)) demo(meuse, ask = FALSE) suppressPackageStartupMessages(library(gstat)) v = variogram(log(zinc)~1, meuse) (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) k_sp = krige(log(zinc)~1, meuse[-(1:5),], meuse[1:5,], v.fit) k_sp_grd = krige(log(zinc)~1, meuse, meuse.grid, v.fit) # 1. using sf: suppressPackageStartupMessages(library(sf)) demo(meuse_sf, ask = FALSE, echo = FALSE) # reloads meuse as data.frame, so demo(meuse, ask = FALSE) v = variogram(log(zinc)~1, meuse_sf) (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) k_sf = krige(log(zinc)~1, meuse_sf[-(1:5),], meuse_sf[1:5,], v.fit) all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = FALSE) all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = TRUE) # 2. using stars for grid: suppressPackageStartupMessages(library(stars)) st = st_as_stars(meuse.grid) st_crs(st) # compare inputs: sp = as(st, "Spatial") fullgrid(meuse.grid) = TRUE all.equal(sp, meuse.grid["dist"], check.attributes = FALSE) all.equal(sp, meuse.grid["dist"], check.attributes = TRUE, use.names = FALSE) # kriging: st_crs(st) = st_crs(meuse_sf) = NA # GDAL roundtrip messes them up! k_st = if (Sys.getenv("USER") == "travis") { try(krige(log(zinc)~1, meuse_sf, st, v.fit)) } else { krige(log(zinc)~1, meuse_sf, st, v.fit) } k_st # handle factors, when going to stars? k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) st_as_stars(k_sp_grd) if (require(raster, quietly = TRUE)) { print(st_as_stars(raster::stack(k_sp_grd))) # check print(all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE)) } suppressPackageStartupMessages(library(spacetime)) Sys.setenv(TZ="") tm = as.POSIXct("2019-02-25 15:37:24 CET") n = 4 s = stars:::st_stars(list(foo = array(1:(n^3), rep(n,3))), stars:::create_dimensions(list( x = stars:::create_dimension(from = 1, to = n, offset = 10, delta = 0.5), y = stars:::create_dimension(from = 1, to = n, offset = 0, delta = -0.7), time = stars:::create_dimension(values = tm + 1:n)), raster = stars:::get_raster(dimensions = c("x", "y"))) ) s as.data.frame(s) plot(s, col = sf.colors(), axes = TRUE) (s.stfdf = as(s, "STFDF")) stplot(s.stfdf, scales = list(draw = TRUE)) (s2 = st_as_stars(s.stfdf)) plot(s2, col = sf.colors(), axes = TRUE) all.equal(s, s2, check.attributes = FALSE) # multiple simulations: data(meuse, package = "sp") data(meuse.grid, package = "sp") coordinates(meuse.grid) <- ~x+y gridded(meuse.grid) <- TRUE meuse.grid = st_as_stars(meuse.grid) meuse_sf = st_as_sf(meuse, coords = c("x", "y")) g = gstat(NULL, "zinc", zinc~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10) g = gstat(g, "lead", lead~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10, fill.cross = TRUE) set.seed(123) (p = predict(g, meuse.grid, nsim = 5)) gstat/tests/na.action.R0000644000176200001440000000156613777370515014562 0ustar liggesuserslibrary(sp) data(meuse) data(meuse.grid) set.seed(13131) # reproduce results # select 10 random rows; # create two missing values in the coordinates: m = meuse.grid[sample(nrow(meuse.grid), 10), ] m[c(2,8), "x"] = NA library(gstat) ## this is not allowed anymore: try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.pass)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.omit)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.exclude)) try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.fail)) # select 10 random rows; # create two missing values in the regressor variable: m = meuse.grid[sample(nrow(meuse.grid), 10), ] m[c(3,7), "dist"] = NA krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.pass) krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.omit) krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.exclude) try(krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.fail)) gstat/tests/windst.R0000644000176200001440000000634414413474732014211 0ustar liggesuserssuppressPackageStartupMessages(library(sp)) suppressPackageStartupMessages(library(spacetime)) suppressPackageStartupMessages(library(gstat)) suppressPackageStartupMessages(library(stars)) data(wind) wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) coordinates(wind.loc) = ~x+y proj4string(wind.loc) = "+proj=longlat +datum=WGS84 +ellps=WGS84" wind$time = ISOdate(wind$year+1900, wind$month, wind$day) wind$jday = as.numeric(format(wind$time, '%j')) stations = 4:15 windsqrt = sqrt(0.5148 * wind[stations]) # knots -> m/s Jday = 1:366 daymeans = colMeans( sapply(split(windsqrt - colMeans(windsqrt), wind$jday), colMeans)) meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] velocities = apply(windsqrt, 2, function(x) { x - meanwind }) # match order of columns in wind to Code in wind.loc; # convert to utm zone 29, to be able to do interpolation in # proper Euclidian (projected) space: pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) pts = SpatialPoints(pts) if (require(sp, quietly = TRUE) && require(maps, quietly = TRUE)) { proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" utm29 = "+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84" pts = as(st_transform(st_as_sfc(pts), utm29), "Spatial") # note the t() in: w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) library(mapdata) mp = map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=FALSE) sf = st_transform(st_as_sf(mp, fill = FALSE), utm29) m = as(sf, "Spatial") # setup grid grd = SpatialPixels(SpatialPoints(makegrid(m, n = 300)), proj4string = m@proj4string) # grd$t = rep(1, nrow(grd)) #coordinates(grd) = ~x1+x2 #gridded(grd)=TRUE # select april 1961: w = w[, "1961-04"] covfn = function(x, y = x) { du = spDists(coordinates(x), coordinates(y)) t1 = as.numeric(index(x)) # time in seconds t2 = as.numeric(index(y)) # time in seconds dt = abs(outer(t1, t2, "-")) # separable, product covariance model: 0.6 * exp(-du/750000) * exp(-dt / (1.5 * 3600 * 24)) } n = 10 tgrd = seq(min(index(w)), max(index(w)), length=n) pred = krige0(sqrt(values)~1, w, STF(grd, tgrd), covfn) layout = list(list("sp.points", pts, first=F, cex=.5), list("sp.lines", m, col='grey')) wind.pr0 = STFDF(grd, tgrd, data.frame(var1.pred = pred)) v = vgmST("separable", space = vgm(1, "Exp", 750000), time = vgm(1, "Exp", 1.5 * 3600 * 24), sill = 0.6) wind.ST = krigeST(sqrt(values)~1, w, STF(grd, tgrd), v) all.equal(wind.pr0, wind.ST) # stars: df = data.frame(a = rep(NA, 324*10)) s = STF(grd, tgrd) newd = addAttrToGeom(s, df) wind.sta = krigeST(sqrt(values)~1, st_as_stars(w), st_as_stars(newd), v) # 1 plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) # 2 stplot(wind.ST) # 3 plot(wind.sta, breaks = "equal", col = sf.colors()) st_as_stars(wind.ST)[[1]][1:3,1:3,1] (wind.sta)[[1]][1:3,1:3,1] st_bbox(wind.sta) bbox(wind.ST) all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) # 4: roundtrip wind.sta->STFDF->stars rt = stars::st_as_stars(as(wind.sta, "STFDF")) plot(rt, breaks = "equal", col = sf.colors()) # 5: stplot(as(wind.sta, "STFDF")) st_bbox(rt) # 6: stplot(as(st_as_stars(wind.ST), "STFDF")) } gstat/tests/fit.Rout.save0000644000176200001440000000227713777370515015157 0ustar liggesusers R version 3.2.2 (2015-08-14) -- "Fire Safety" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(sp) > data(meuse) > library(gstat) > v=variogram(log(zinc)~1,~x+y,meuse,cutoff=500,wi=100) > v$gamma=c(0.5,1,2,3,3) > fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=TRUE) model psill range 1 Nug 0.000000 0.00 2 Sph 7.878195 1567.77 Warning message: In fit.variogram(v, vgm(1, "Sph", 300, 0), warn.if.neg = TRUE) : partial sill or nugget fixed at zero value > fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=FALSE) model psill range 1 Nug 0.000000 0.00 2 Sph 7.878195 1567.77 > > proc.time() user system elapsed 0.708 0.244 0.718 gstat/tests/fit.R0000644000176200001440000000034713777370515013466 0ustar liggesuserslibrary(sp) data(meuse) library(gstat) v=variogram(log(zinc)~1,~x+y,meuse,cutoff=500,wi=100) v$gamma=c(0.5,1,2,3,3) fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=TRUE) fit.variogram(v, vgm(1, "Sph", 300, 0),warn.if.neg=FALSE) gstat/tests/blockkr.Rout.save0000644000176200001440000000513713777370515016022 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(sp) > data(meuse) > coordinates(meuse) = c("x", "y") > new.locs <- SpatialPoints(data.frame( + x = c(181170, 180310, 180205, 178673, 178770, 178270), + y = c(333250, 332189, 331707, 330066, 330675, 331075))) > library(gstat) > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7576 19447.67 2 (180310, 332189) 663.4915 16991.33 3 (180205, 331707) 251.4606 21579.71 4 (178673, 330066) 532.5776 73807.91 5 (178770, 330675) 664.4039 23589.17 6 (178270, 331075) 565.5436 155113.23 > > new.locs <- SpatialPoints(data.frame(x = c(181170), y = c(333250))) > > disc = c(-15,-5,5,15) > block.irreg <- data.frame(expand.grid(x = disc, y = disc)) > block.irreg x y 1 -15 -15 2 -5 -15 3 5 -15 4 15 -15 5 -15 -5 6 -5 -5 7 5 -5 8 15 -5 9 -15 5 10 -5 5 11 5 5 12 15 5 13 -15 15 14 -5 15 15 5 15 16 15 15 > > # first disable default Gaussian quadrature used for block integration, by > # setting nblockdiscr explicitly: > krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40, set = list(nblockdiscr=4)) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > # now pass the same block discretization as block.irreg: > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = block.irreg, nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > # check weights argument: > block.irreg <- data.frame(expand.grid(x = disc, y = disc), weights = rep(1/16, 16)) > krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = block.irreg, nmax = 40) [using ordinary kriging] coordinates var1.pred var1.var 1 (181170, 333250) 268.7324 19568.76 > > proc.time() user system elapsed 1.080 0.056 1.139 gstat/tests/merge.Rout.save0000644000176200001440000001564514314525262015464 0ustar liggesusers R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics" Copyright (C) 2022 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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(digits=6) > # illustrates the use of merge, for merging parameters accross variables: > # Z1=m+e1(s) > # Z2=m+e2(s) > # Z1 and Z2 each have a different variogram, but share the parameter m > # see documentation of gstat() function > library(gstat) > d1 = data.frame(x=c(0,2),y=c(0,0),z=c(0,1)) > d2 = data.frame(x=c(0,2),y=c(2,2),z=c(4,5)) > g = gstat(NULL,"d1", z~1,~x+y,d1,model=vgm(1, "Exp", 1)) > g = gstat(g,"d2", z~1,~x+y,d2,model=vgm(1, "Exp", 1), merge=c("d1","d2")) > g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) > predict(g, data.frame(x=1,y=1), debug = 32) Intrinsic Correlation found. Good. [using ordinary cokriging] we're at location X: 1 Y: 1 Z: 0 zero block size we're at point X: 1 Y: 1 Z: 0 # X: #Matrix: 4 by 1 rbind( c( 1.000000), # row 1 c( 1.000000), # row 2 c( 1.000000), # row 3 c( 1.000000) # row 4 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.135335, 1.000000, 0.029553, 0.067668), # row 2 c( 0.067668, 0.029553, 1.000000, 0.135335), # row 3 c( 0.029553, 0.067668, 0.135335, 1.000000) # row 4 ) # glm->C, Choleski decomposed:: #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.000000, 0.990800, 0.020584, 0.064259), # row 2 c( 0.000000, 0.000000, 0.997496, 0.132344), # row 3 c( 0.000000, 0.000000, 0.000000, 0.988677) # row 4 ) # X'C-1 X: #Matrix: 1 by 1 rbind( c( 3.245289) # row 1 ) # beta: #Vector: dim: 1 c( 2.500000) # Cov(beta), (X'C-1 X)-1: #Matrix: 1 by 1 rbind( c( 0.308139) # row 1 ) # Corr(beta): #Matrix: 1 by 1 rbind( c( 1.000000) # row 1 ) # X0 (X values at prediction location x0): #Matrix: 1 by 2 rbind( c( 1.000000, 1.000000) # row 1 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 2.500000, 2.500000) # Covariances (x_i, x_0), C0: #Matrix: 4 by 2 rbind( c( 0.243117, 0.121558), # row 1 c( 0.243117, 0.121558), # row 2 c( 0.121558, 0.243117), # row 3 c( 0.121558, 0.243117) # row 4 ) # C-1 C0: #Matrix: 4 by 2 rbind( c( 0.206482, 0.089387), # row 1 c( 0.206482, 0.089387), # row 2 c( 0.089387, 0.206482), # row 3 c( 0.089387, 0.206482) # row 4 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.500000), # row 1 c( 0.500000, 1.000000) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.051360, 0.051360), # row 1 c( 0.051360, 0.051360) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.122130, 0.093662), # row 1 c( 0.093662, 0.122130) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 2.031619, 2.968381) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 0.929230, 0.457698), # row 1 c( 0.457698, 0.929230) # row 2 ) # kriging weights: #Matrix: 4 by 2 rbind( c( 0.308548, 0.191452), # row 1 c( 0.308548, 0.191452), # row 2 c( 0.191452, 0.308548), # row 3 c( 0.191452, 0.308548) # row 4 ) x y d1.pred d1.var d2.pred d2.var cov.d1.d2 1 1 1 2.03162 0.92923 2.96838 0.92923 0.457698 > > # Z1 and Z2 share a regression slope: > g = gstat(NULL,"d1", z~x,~x+y,d1,model=vgm(1, "Exp", 1)) > g = gstat(g,"d2", z~x,~x+y,d2,model=vgm(1, "Exp", 1), + merge=list(c("d1",2,"d2",2))) > g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) > predict(g, data.frame(x=1,y=1), debug = 32) Intrinsic Correlation found. Good. [using universal cokriging] we're at location X: 1 Y: 1 Z: 0 zero block size we're at point X: 1 Y: 1 Z: 0 # X: #Matrix: 4 by 3 rbind( c( 1.000000, 0.000000, 0.000000), # row 1 c( 1.000000, 2.000000, 0.000000), # row 2 c( 0.000000, 0.000000, 1.000000), # row 3 c( 0.000000, 2.000000, 1.000000) # row 4 ) [using generalized covariances: max_val - semivariance()] # Covariances (x_i, x_j) matrix C (upper triangle): #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.135335, 1.000000, 0.029553, 0.067668), # row 2 c( 0.067668, 0.029553, 1.000000, 0.135335), # row 3 c( 0.029553, 0.067668, 0.135335, 1.000000) # row 4 ) # glm->C, Choleski decomposed:: #Matrix: 4 by 4 rbind( c( 1.000000, 0.135335, 0.067668, 0.029553), # row 1 c( 0.000000, 0.990800, 0.020584, 0.064259), # row 2 c( 0.000000, 0.000000, 0.997496, 0.132344), # row 3 c( 0.000000, 0.000000, 0.000000, 0.988677) # row 4 ) # X'C-1 X: #Matrix: 3 by 3 rbind( c( 1.774607, 1.622645, -0.151962), # row 1 c( 1.622645, 7.676050, 1.622645), # row 2 c(-0.151962, 1.622645, 1.774607) # row 3 ) # beta: #Vector: dim: 3 c( 0.000000, 0.500000, 4.000000) # Cov(beta), (X'C-1 X)-1: #Matrix: 3 by 3 rbind( c( 0.793363, -0.225695, 0.274305), # row 1 c(-0.225695, 0.225695, -0.225695), # row 2 c( 0.274305, -0.225695, 0.793363) # row 3 ) # Corr(beta): #Matrix: 3 by 3 rbind( c( 1.000000, -0.533366, 0.345750), # row 1 c(-0.533366, 1.000000, -0.533366), # row 2 c( 0.345750, -0.533366, 1.000000) # row 3 ) # X0 (X values at prediction location x0): #Matrix: 3 by 2 rbind( c( 1.000000, 0.000000), # row 1 c( 1.000000, 1.000000), # row 2 c( 0.000000, 1.000000) # row 3 ) # BLUE(mu), E(y(x0)) = X0'beta: #Vector: dim: 2 c( 0.500000, 4.500000) # Covariances (x_i, x_0), C0: #Matrix: 4 by 2 rbind( c( 0.243117, 0.121558), # row 1 c( 0.243117, 0.121558), # row 2 c( 0.121558, 0.243117), # row 3 c( 0.121558, 0.243117) # row 4 ) # C-1 C0: #Matrix: 4 by 2 rbind( c( 0.206482, 0.089387), # row 1 c( 0.206482, 0.089387), # row 2 c( 0.089387, 0.206482), # row 3 c( 0.089387, 0.206482) # row 4 ) # [a] Cov_ij(B,B) or Cov_ij(0,0): #Matrix: 2 by 2 rbind( c( 1.000000, 0.500000), # row 1 c( 0.500000, 1.000000) # row 2 ) # [c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0): #Matrix: 2 by 2 rbind( c( 0.203564, -0.100844), # row 1 c(-0.100844, 0.203564) # row 2 ) # [b] c0'C-1 c0: #Matrix: 2 by 2 rbind( c( 0.122130, 0.093662), # row 1 c( 0.093662, 0.122130) # row 2 ) # Best Linear Unbiased Predictor: #Vector: dim: 2 c( 0.500000, 4.500000) # MSPE ([a]-[b]+[c]): #Matrix: 2 by 2 rbind( c( 1.081434, 0.305494), # row 1 c( 0.305494, 1.081434) # row 2 ) # kriging weights: #Matrix: 4 by 2 rbind( c( 0.500000, 0.000000), # row 1 c( 0.500000, 0.000000), # row 2 c( 0.000000, 0.500000), # row 3 c( 0.000000, 0.500000) # row 4 ) x y d1.pred d1.var d2.pred d2.var cov.d1.d2 1 1 1 0.5 1.08143 4.5 1.08143 0.305494 > > proc.time() user system elapsed 0.551 0.044 0.588 gstat/tests/cv3d.Rout.save0000644000176200001440000000371613777370515015233 0ustar liggesusers R version 3.6.2 (2019-12-12) -- "Dark and Stormy Night" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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(digits = 4) > set.seed(1131) > d = data.frame(x=runif(50),y=runif(50),z=runif(50),v=rnorm(50)) > library(gstat) > xx = krige.cv(v~1,~x+y+z,d,model=vgm(1,"Exp",1), verbose=F, set=list(debug=0)) > summary(xx) var1.pred var1.var observed residual Min. :-1.163 Min. :0.116 Min. :-2.240 Min. :-2.1755 1st Qu.:-0.571 1st Qu.:0.175 1st Qu.:-0.876 1st Qu.:-0.7881 Median :-0.201 Median :0.192 Median :-0.219 Median : 0.1175 Mean :-0.165 Mean :0.208 Mean :-0.142 Mean : 0.0233 3rd Qu.: 0.161 3rd Qu.:0.240 3rd Qu.: 0.500 3rd Qu.: 0.8508 Max. : 1.085 Max. :0.426 Max. : 1.857 Max. : 2.5224 zscore fold x y Min. :-5.168 Min. : 1.0 Min. :0.0068 Min. :0.0034 1st Qu.:-1.875 1st Qu.:13.2 1st Qu.:0.2397 1st Qu.:0.2466 Median : 0.245 Median :25.5 Median :0.4867 Median :0.4525 Mean : 0.017 Mean :25.5 Mean :0.4997 Mean :0.4969 3rd Qu.: 2.020 3rd Qu.:37.8 3rd Qu.:0.7473 3rd Qu.:0.7394 Max. : 7.354 Max. :50.0 Max. :0.9875 Max. :0.9872 z Min. :0.0016 1st Qu.:0.1865 Median :0.4485 Mean :0.4714 3rd Qu.:0.7240 Max. :0.9942 > > proc.time() user system elapsed 0.776 0.050 0.815 gstat/tests/line.R0000644000176200001440000000305113777370515013626 0ustar liggesusersoptions(digits=5) library(sp) data(meuse.grid) gridded(meuse.grid) = ~x+y data(meuse) coordinates(meuse) = ~x+y # choose arbitrary line over the grid: image(meuse.grid["dist"],axes=T) pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) plot(Sl,add=T,col='green') # use the default spsample arguments of predict.gstat: pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) plot(pts, pch=3, cex=.2, add=T) library(gstat) v = vgm(.6, "Sph", 900, .06) out1 = krige(log(zinc)~1, meuse, Sl, v) out1 points(180333,332167,pch=3,cex=2) # use the same line as block discretization, and predict for (0,0) # (because the block discretizing points are not centered) out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) out2 compare.krigingLines = function(formula, data, newdata, model) { out1 = krige(formula, data, newdata, model) pts = spsample(newdata, n=500, 'regular', offset=.5) out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) print("difference:") as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] } compare.krigingLines(log(zinc)~1, meuse, Sl, v) # one line, consisting of two line segments: pp2 = rbind(c(181000,333500),c(181000,332500)) Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) krige(log(zinc)~1, meuse, Sl2, v) compare.krigingLines(log(zinc)~1, meuse, Sl2, v) # two seperate line segments: Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) krige(log(zinc)~1, meuse, Sl3, v) gstat/tests/unproj.Rout.save0000644000176200001440000001002114413507432015660 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > # DOI 10.1007/s11004-011-9344-7 > # http://mypage.iu.edu/~srobeson/Pubs/variogram_sphere_mathgeo_2011.pdf > > suppressPackageStartupMessages(library(sp)) > library(gstat) > > if (require(sp, quietly = TRUE) && require(fields, quietly = TRUE) && require(sf, quietly = TRUE)) { + data(meuse) + coordinates(meuse) = ~x+y + proj4string(meuse) = CRS("+init=epsg:28992") + ll = "+proj=longlat +ellps=WGS84" + # meuse.ll = spTransform(meuse, CRS("+proj=longlat +ellps=WGS84")) + meuse.ll = as(st_transform(sf::st_as_sf(meuse), sf::st_crs(ll)), "Spatial") + meuse.ll[1:10,] + variogram(log(zinc)~1, meuse.ll) + + cloud1 = variogram(log(zinc)~1, meuse, cloud=T, cutoff=6000) + cloud2 = variogram(log(zinc)~1, meuse.ll, cloud=T, cutoff=6) + + plot(cloud1$dist/1000, cloud2$dist, xlab="Amersfoort, km", ylab = "Long/lat") + abline(0,1) + + data(ozone2) + oz = SpatialPointsDataFrame(ozone2$lon.lat, + data.frame(t(ozone2$y)), + proj4string=CRS("+proj=longlat +ellps=WGS84")) + variogram(X870731~1,oz[!is.na(oz$X870731),]) + utm16 = "+proj=utm +zone=16" + # oz.utm = spTransform(oz, utm16) + oz.utm = as(sf::st_transform(sf::st_as_sf(oz), utm16) , "Spatial") + variogram(X870731~1,oz.utm[!is.na(oz$X870731),]) + + # Timothy Hilton, r-sig-geo, Sept 14, 2008: + + foo <- + structure(list(z = c(-1.95824831109744, -1.9158901643563, 4.22211761150161, + 3.23356929459598, 1.12038389231868, 0.34613850821113, 1.12589932643631, + 23.517912251617, 3.0519158690268, 3.20261431141517, -2.10947106854739 + ), lon = c(-125.29228, -82.1556, -98.524722, -99.948333, -104.691741, + -79.420833, -105.100533, -88.291867, -72.171478, -121.556944, + -89.34765), lat = c(49.87217, 48.2167, 55.905833, 56.635833, + 53.916264, 39.063333, 48.307883, 40.0061, 42.537756, 44.448889, + 46.242017)), .Names = c("z", "lon", "lat"), row.names = c(NA, + -11L), class = "data.frame") + + coordinates(foo) <- ~lon+lat + + proj4string(foo) <- CRS('+proj=longlat +ellps=WGS84') + + vg.foo <- variogram(z~1, foo, cloud=TRUE, cutoff=1e10) + + cat('==========\nvariogram:\n') + print(head(vg.foo)) + + cat('==========\nspDistsN1 Distances:\n') + print(spDistsN1(coordinates(foo), coordinates(foo)[1,], longlat=TRUE)) + } Spam version 2.9-1 (2022-08-07) is loaded. Type 'help( Spam)' or 'demo( spam)' for a short introduction and overview of this package. Help for individual functions is also obtained by adding the suffix '.spam' to the function name, e.g. 'help( chol.spam)'. Attaching package: 'spam' The following objects are masked from 'package:base': backsolve, forwardsolve Try help(fields) to get started. Linking to GEOS 3.11.1, GDAL 3.6.2, PROJ 9.1.1; sf_use_s2() is TRUE ========== variogram: dist gamma dir.hor dir.ver id left right 1 3115.1190 8.971063e-04 0 0 var1 2 1 2 1908.0468 1.909846e+01 0 0 var1 3 1 3 1405.6211 1.883757e+01 0 0 var1 3 2 4 1837.5667 1.347749e+01 0 0 var1 4 1 5 1522.8765 1.325847e+01 0 0 var1 4 2 6 119.9386 4.886139e-01 0 0 var1 4 3 ========== spDistsN1 Distances: [1] 0.0000 3115.1190 1908.0468 1837.5667 1481.6293 3775.6751 1480.4477 [8] 3081.7541 4090.4022 665.9348 2683.1516 Warning message: In CPL_crs_from_input(x) : GDAL Message 1: +init=epsg:XXXX syntax is deprecated. It might return a CRS with a non-EPSG compliant axis order. > > proc.time() user system elapsed 2.028 0.818 1.946 gstat/tests/krige0.Rout.save0000644000176200001440000000367513777370515015561 0ustar liggesusers R version 3.0.2 (2013-09-25) -- "Frisbee Sailing" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > # test -- load data: > library(sp) > data(meuse) > coordinates(meuse) = ~x+y > data(meuse.grid) > gridded(meuse.grid) = ~x+y > > library(gstat) > # test -- idw > meuse.grid$idw <- idw0(zinc~1, meuse, meuse.grid)[,1] > x <- idw(zinc~1, meuse, meuse.grid) [inverse distance weighted interpolation] > all.equal(x$var1.pred, meuse.grid$idw) [1] TRUE > spplot(meuse.grid["idw"],col.regions=bpy.colors()) > v = vgm(1, "Exp", 500) > # test sk: > x0 <- krige0(zinc~1, meuse, meuse.grid, v, beta = 500, computeVar = TRUE) > rownames(x0$pred)=NULL > x <- krige(zinc~1, meuse, meuse.grid, v, beta = 500) [using simple kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > # test ok: > x0 <- krige0(zinc~1, meuse, meuse.grid, v, computeVar = TRUE) > rownames(x0$pred)=NULL > names(x0$var)=NULL > x <- krige(zinc~1, meuse, meuse.grid, v) [using ordinary kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > # test uk: > x0 <- krige0(zinc~sqrt(dist), meuse, meuse.grid, v, computeVar = TRUE) > rownames(x0$pred)=NULL > names(x0$var)=NULL > x <- krige(zinc~sqrt(dist), meuse, meuse.grid, v) [using universal kriging] > all.equal(x$var1.pred, x0$pred[,1]) [1] TRUE > all.equal(x$var1.var, x0$var) [1] TRUE > > proc.time() user system elapsed 3.424 0.064 3.490 gstat/tests/sim.R0000644000176200001440000000054413777370515013473 0ustar liggesusersoptions(digits=6) library(sp) data(meuse) set.seed(158229572) new.locs <- data.frame(x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075)) library(gstat) krige(zinc ~ 1, ~ x + y, meuse, newdata = new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, nsim = 10) gstat/tests/windst.Rout.save0000644000176200001440000001133214413506706015664 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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(sp)) > suppressPackageStartupMessages(library(spacetime)) > suppressPackageStartupMessages(library(gstat)) > suppressPackageStartupMessages(library(stars)) > > data(wind) > wind.loc$y = as.numeric(char2dms(as.character(wind.loc[["Latitude"]]))) > wind.loc$x = as.numeric(char2dms(as.character(wind.loc[["Longitude"]]))) > coordinates(wind.loc) = ~x+y > proj4string(wind.loc) = "+proj=longlat +datum=WGS84 +ellps=WGS84" > > wind$time = ISOdate(wind$year+1900, wind$month, wind$day) > wind$jday = as.numeric(format(wind$time, '%j')) > stations = 4:15 > windsqrt = sqrt(0.5148 * wind[stations]) # knots -> m/s > Jday = 1:366 > daymeans = colMeans( + sapply(split(windsqrt - colMeans(windsqrt), wind$jday), colMeans)) > meanwind = lowess(daymeans ~ Jday, f = 0.1)$y[wind$jday] > velocities = apply(windsqrt, 2, function(x) { x - meanwind }) > # match order of columns in wind to Code in wind.loc; > # convert to utm zone 29, to be able to do interpolation in > # proper Euclidian (projected) space: > pts = coordinates(wind.loc[match(names(wind[4:15]), wind.loc$Code),]) > pts = SpatialPoints(pts) > if (require(sp, quietly = TRUE) && require(maps, quietly = TRUE)) { + proj4string(pts) = "+proj=longlat +datum=WGS84 +ellps=WGS84" + utm29 = "+proj=utm +zone=29 +datum=WGS84 +ellps=WGS84" + pts = as(st_transform(st_as_sfc(pts), utm29), "Spatial") + # note the t() in: + w = STFDF(pts, wind$time, data.frame(values = as.vector(t(velocities)))) + + library(mapdata) + mp = map("worldHires", xlim = c(-11,-5.4), ylim = c(51,55.5), plot=FALSE) + sf = st_transform(st_as_sf(mp, fill = FALSE), utm29) + m = as(sf, "Spatial") + + # setup grid + grd = SpatialPixels(SpatialPoints(makegrid(m, n = 300)), + proj4string = m@proj4string) + # grd$t = rep(1, nrow(grd)) + #coordinates(grd) = ~x1+x2 + #gridded(grd)=TRUE + + # select april 1961: + w = w[, "1961-04"] + + covfn = function(x, y = x) { + du = spDists(coordinates(x), coordinates(y)) + t1 = as.numeric(index(x)) # time in seconds + t2 = as.numeric(index(y)) # time in seconds + dt = abs(outer(t1, t2, "-")) + # separable, product covariance model: + 0.6 * exp(-du/750000) * exp(-dt / (1.5 * 3600 * 24)) + } + + n = 10 + tgrd = seq(min(index(w)), max(index(w)), length=n) + pred = krige0(sqrt(values)~1, w, STF(grd, tgrd), covfn) + layout = list(list("sp.points", pts, first=F, cex=.5), + list("sp.lines", m, col='grey')) + wind.pr0 = STFDF(grd, tgrd, data.frame(var1.pred = pred)) + + v = vgmST("separable", + space = vgm(1, "Exp", 750000), + time = vgm(1, "Exp", 1.5 * 3600 * 24), + sill = 0.6) + wind.ST = krigeST(sqrt(values)~1, w, STF(grd, tgrd), v) + + all.equal(wind.pr0, wind.ST) + + # stars: + df = data.frame(a = rep(NA, 324*10)) + s = STF(grd, tgrd) + newd = addAttrToGeom(s, df) + wind.sta = krigeST(sqrt(values)~1, st_as_stars(w), st_as_stars(newd), v) + # 1 + plot(stars::st_as_stars(wind.ST), breaks = "equal", col = sf.colors()) + # 2 + stplot(wind.ST) + # 3 + plot(wind.sta, breaks = "equal", col = sf.colors()) + st_as_stars(wind.ST)[[1]][1:3,1:3,1] + (wind.sta)[[1]][1:3,1:3,1] + st_bbox(wind.sta) + bbox(wind.ST) + all.equal(wind.sta, stars::st_as_stars(wind.ST), check.attributes = FALSE) + + # 4: roundtrip wind.sta->STFDF->stars + rt = stars::st_as_stars(as(wind.sta, "STFDF")) + plot(rt, breaks = "equal", col = sf.colors()) + # 5: + stplot(as(wind.sta, "STFDF")) + st_bbox(rt) + + # 6: + stplot(as(st_as_stars(wind.ST), "STFDF")) + } Warning messages: 1: In krigeST(sqrt(values) ~ 1, w, STF(grd, tgrd), v) : The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'. The unit 'secs' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide. 2: In krigeST(sqrt(values) ~ 1, st_as_stars(w), st_as_stars(newd), : The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'. The unit 'secs' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide. > > proc.time() user system elapsed 4.489 3.497 3.766 gstat/tests/rings.R0000644000176200001440000000624413777370515014030 0ustar liggesuserslibrary(sp) library(gstat) set.seed(13331) x = runif(10) y = runif(10) z = rnorm(10) d = data.frame(x=x,y=y,z=z) bl = c(1,1) nd = data.frame(x=.5, y=.5) # single block: library(sp) coordinates(d) = ~x+y nd = SpatialPoints(nd) xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) ring = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) r1 = SpatialPolygons(list(Polygons(list(Polygon(ring)), ID = "xx"))) a = data.frame(a = 1, b = 2) rownames(a) = "xx" r1df = SpatialPolygonsDataFrame(r1, a) g = gstat(formula=z~1, data=d, model=vgm(1, "Exp", 1)) args = list(type = "regular", n=16, offset=c(0.5,0.5)) yy = predict(g, r1df, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx,yy)) ## multiple blocks of equal size: nd = data.frame(x= 0:4 + .5, y=rep(.5,5)) nd = SpatialPoints(nd) xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) ring2 = cbind(c(2+0,2+bl[1],2+bl[1],2+0,2+0), c(0,0,bl[2],bl[2],0)) ring3 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) ring4 = cbind(c(4+0,4+bl[1],4+bl[1],4+0,4+0), c(0,0,bl[2],bl[2],0)) r1 = SpatialPolygons(list( Polygons(list(Polygon(ring0)), ID = "x0"), Polygons(list(Polygon(ring1)), ID = "x1"), Polygons(list(Polygon(ring2)), ID = "x2"), Polygons(list(Polygon(ring3)), ID = "x3"), Polygons(list(Polygon(ring4)), ID = "x4") )) df = data.frame(a=rep(1,5), b= rep(1,5)) rownames(df) = c("x0", "x1", "x2", "x3", "x4") r1df = SpatialPolygonsDataFrame(r1, df) yy = predict(g, r1, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) all.equal(xx, yy) ## multiple blocks of equal size: args = list(type = "regular", cellsize=.25, offset=c(0.5,0.5), n=16) yy = predict(g, r1, block = bl, sps.args = args) xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx, yy)) ## multiple blocks of varying size: nd = data.frame(x=c(0.5, 2, 4.5), y=c(0.5, 1, 1.5)) nd = SpatialPoints(nd) bl = c(1,1) ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) xx1 = krige(z~1, d, nd[1], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) bl = c(2,2) ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) xx2 = krige(z~1, d, nd[2], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) bl = c(3,3) ring2 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) xx3 = krige(z~1, d, nd[3], model=vgm(1, "Exp", 1), block = bl, set = list(nb=4)) r1 = SpatialPolygons(list( Polygons(list(Polygon(ring0)), ID = "x0"), Polygons(list(Polygon(ring1)), ID = "x1"), Polygons(list(Polygon(ring2)), ID = "x2") )) df = data.frame(a = rep(1,3), b = rep(1,3)) rownames(df) = c("x0", "x1", "x2") r1df = SpatialPolygonsDataFrame(r1, df) args = list(type = "regular", n=16, offset=c(0.5,0.5)) yy = predict(g, r1df, block = bl, sps.args = args) xx = rbind(as.data.frame(xx1), as.data.frame(xx2), as.data.frame(xx3)) row.names(xx) = 1:3 xx = as.data.frame(xx) yy = as.data.frame(yy) row.names(xx) = row.names(yy) print(all.equal(xx, yy)) gstat/tests/variogram.Rout.save0000644000176200001440000000515213777370515016357 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(sp) > library(gstat) > data(meuse) > variogram(log(zinc)~1, ~x+y, meuse) np dist gamma dir.hor dir.ver id 1 57 79.29244 0.1234479 0 0 var1 2 299 163.97367 0.2162185 0 0 var1 3 419 267.36483 0.3027859 0 0 var1 4 457 372.73542 0.4121448 0 0 var1 5 547 478.47670 0.4634128 0 0 var1 6 533 585.34058 0.5646933 0 0 var1 7 574 693.14526 0.5689683 0 0 var1 8 564 796.18365 0.6186769 0 0 var1 9 589 903.14650 0.6471479 0 0 var1 10 543 1011.29177 0.6915705 0 0 var1 11 500 1117.86235 0.7033984 0 0 var1 12 477 1221.32810 0.6038770 0 0 var1 13 452 1329.16407 0.6517158 0 0 var1 14 457 1437.25620 0.5665318 0 0 var1 15 415 1543.20248 0.5748227 0 0 var1 > > coordinates(meuse) <- ~ x + y > variogram(log(zinc)~1, meuse) np dist gamma dir.hor dir.ver id 1 57 79.29244 0.1234479 0 0 var1 2 299 163.97367 0.2162185 0 0 var1 3 419 267.36483 0.3027859 0 0 var1 4 457 372.73542 0.4121448 0 0 var1 5 547 478.47670 0.4634128 0 0 var1 6 533 585.34058 0.5646933 0 0 var1 7 574 693.14526 0.5689683 0 0 var1 8 564 796.18365 0.6186769 0 0 var1 9 589 903.14650 0.6471479 0 0 var1 10 543 1011.29177 0.6915705 0 0 var1 11 500 1117.86235 0.7033984 0 0 var1 12 477 1221.32810 0.6038770 0 0 var1 13 452 1329.16407 0.6517158 0 0 var1 14 457 1437.25620 0.5665318 0 0 var1 15 415 1543.20248 0.5748227 0 0 var1 > > ind=seq(1,155,2) > var1= meuse[ind,] > var2= meuse[-ind,] > g <- gstat(NULL, id = "lead", form = lead ~ 1, data=var1) > g <- gstat(g, id = "zinc", form = zinc ~ 1, data=var2) > v.cross <- variogram(g) > plot(v.cross) > > > proc.time() user system elapsed 1.528 0.076 1.612 gstat/tests/covtable.Rout.save0000644000176200001440000000276513777370515016176 0ustar liggesusers R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree" Copyright (C) 2015 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(gstat) > d=expand.grid(x=c(-.5,.5), y=c(-.5,.5)) > d$z=1:4 > vv=vgm(model = "Tab", covtable = + variogramLine(vgm(1, "Sph", 1), 1, n=1e4,min = 0, covariance = TRUE)) > vv model psill maxdist 1 Tab NA 1 covariance table: [1] 1.0000000 0.7039712 0.4319496 0.2080384 0.0560108 0.0000000 > krige(z~1,~x+y,d,data.frame(x=0,y=0),vgm(1, "Sph", 1)) [using ordinary kriging] x y var1.pred var1.var 1 0 0 2.5 1.017767 > krige(z~1,~x+y,d,data.frame(x=0,y=0),vv) [using ordinary kriging] x y var1.pred var1.var 1 0 0 2.5 1.017863 > krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vgm(1, "Sph", 1)) [using ordinary kriging] x y var1.pred var1.var 1 0 0 1.5 1.267767 > krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vv) [using ordinary kriging] x y var1.pred var1.var 1 0 0 1.5 1.267863 > > proc.time() user system elapsed 0.704 0.276 0.670 gstat/tests/line.Rout.save0000644000176200001440000001066514413346074015313 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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(digits=5) > library(sp) > data(meuse.grid) > gridded(meuse.grid) = ~x+y > data(meuse) > coordinates(meuse) = ~x+y > > # choose arbitrary line over the grid: > image(meuse.grid["dist"],axes=T) > pp = rbind(c(180000,331000),c(180000,332000),c(181000,333500)) > Sl = SpatialLines(list(Lines(list(Line(pp)), "a"))) > plot(Sl,add=T,col='green') > > # use the default spsample arguments of predict.gstat: > pts=spsample(Sl,n=500,'regular',offset=c(.5,.5)) > plot(pts, pch=3, cex=.2, add=T) > > library(gstat) > v = vgm(.6, "Sph", 900, .06) > out1 = krige(log(zinc)~1, meuse, Sl, v) [using ordinary kriging] > out1 An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180333 332167 6.1618 0.008025 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 Slot "ID": [1] "a" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > > points(180333,332167,pch=3,cex=2) > > # use the same line as block discretization, and predict for (0,0) > # (because the block discretizing points are not centered) > out2 = krige(log(zinc)~1, meuse, SpatialPoints(matrix(0,1,2)), v, block=coordinates(pts)) [using ordinary kriging] > out2 coordinates var1.pred var1.var 1 (0, 0) 6.1618 0.008025 > > compare.krigingLines = function(formula, data, newdata, model) { + out1 = krige(formula, data, newdata, model) + pts = spsample(newdata, n=500, 'regular', offset=.5) + out2 = krige(formula, data, SpatialPoints(matrix(0,1,2)), model, block = coordinates(pts)) + print("difference:") + as.data.frame(out1)[3:4]- as.data.frame(out2)[3:4] + } > > compare.krigingLines(log(zinc)~1, meuse, Sl, v) [using ordinary kriging] [using ordinary kriging] [1] "difference:" var1.pred var1.var a 0 0 > > # one line, consisting of two line segments: > pp2 = rbind(c(181000,333500),c(181000,332500)) > Sl2 = SpatialLines(list(Lines(list(Line(pp),Line(pp2)), "a"))) > krige(log(zinc)~1, meuse, Sl2, v) [using ordinary kriging] An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180667 332583 6.0424 0.0053191 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 [[2]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 181000 333500 [2,] 181000 332500 Slot "ID": [1] "a" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > compare.krigingLines(log(zinc)~1, meuse, Sl2, v) [using ordinary kriging] [using ordinary kriging] [1] "difference:" var1.pred var1.var a 0 0 > > # two seperate line segments: > Sl3 = SpatialLines(list(Lines(list(Line(pp)), "a"),Lines(list(Line(pp2)),"b"))) > krige(log(zinc)~1, meuse, Sl3, v) [using ordinary kriging] An object of class "SpatialLinesDataFrame" Slot "data": x y var1.pred var1.var a 180333 332167 6.1618 0.008025 b 181000 333000 5.7060 0.011043 Slot "lines": [[1]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 180000 331000 [2,] 180000 332000 [3,] 181000 333500 Slot "ID": [1] "a" [[2]] An object of class "Lines" Slot "Lines": [[1]] An object of class "Line" Slot "coords": [,1] [,2] [1,] 181000 333500 [2,] 181000 332500 Slot "ID": [1] "b" Slot "bbox": min max x 180000 181000 y 331000 333500 Slot "proj4string": Coordinate Reference System: Deprecated Proj.4 representation: NA > > proc.time() user system elapsed 1.703 2.198 1.248 gstat/tests/covtable.R0000644000176200001440000000057013777370515014501 0ustar liggesuserslibrary(gstat) d=expand.grid(x=c(-.5,.5), y=c(-.5,.5)) d$z=1:4 vv=vgm(model = "Tab", covtable = variogramLine(vgm(1, "Sph", 1), 1, n=1e4,min = 0, covariance = TRUE)) vv krige(z~1,~x+y,d,data.frame(x=0,y=0),vgm(1, "Sph", 1)) krige(z~1,~x+y,d,data.frame(x=0,y=0),vv) krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vgm(1, "Sph", 1)) krige(z~1,~x+y,d[1:2,],data.frame(x=0,y=0),vv) gstat/tests/allier.R0000644000176200001440000000164213777370515014153 0ustar liggesusers# Sytze de Bruin's post to r-sig-geo, Nov 16, 2015: library(sp) library(gstat) # some data x <- c(215, 330, 410, 470, 545) y <- c(230, 310, 330, 340, 365) fc <- c(0.211, 0.251, 0.281, 0.262, 0.242) por <- c(0.438, 0.457, 0.419, 0.430, 0.468) Allier <- data.frame(x, y, fc, por) coordinates(Allier) = ~x+y # gstat object for co-kriging using linear model of co-regionalization g <- gstat(id=c("fc"), formula=fc~1, data=Allier, model=vgm(0.00247, "Sph", 480, 0.00166)) g <- gstat(g, id="por", formula=por~1, data=Allier, model=vgm(0.00239, "Sph", 480, 0.00118)) g <- gstat(g, id=c("fc", "por"), model=vgm(0.00151, "Sph", 480, -0.00124)) # predict at single point g$set = list(choleski = 0) # LDL' A <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) g$set = list(choleski = 1) # Choleski B <- predict(g, SpatialPoints(data.frame(x=450, y=350)), debug = 32) all.equal(A,B) # TRUE gstat/tests/blockkr.R0000644000176200001440000000214113777370515014325 0ustar liggesuserslibrary(sp) data(meuse) coordinates(meuse) = c("x", "y") new.locs <- SpatialPoints(data.frame( x = c(181170, 180310, 180205, 178673, 178770, 178270), y = c(333250, 332189, 331707, 330066, 330675, 331075))) library(gstat) krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40) new.locs <- SpatialPoints(data.frame(x = c(181170), y = c(333250))) disc = c(-15,-5,5,15) block.irreg <- data.frame(expand.grid(x = disc, y = disc)) block.irreg # first disable default Gaussian quadrature used for block integration, by # setting nblockdiscr explicitly: krige(zinc ~ 1, meuse, new.locs, model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = c(40,40), nmax = 40, set = list(nblockdiscr=4)) # now pass the same block discretization as block.irreg: krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = block.irreg, nmax = 40) # check weights argument: block.irreg <- data.frame(expand.grid(x = disc, y = disc), weights = rep(1/16, 16)) krige(zinc ~ 1, meuse, new.locs, vgm(1.34e5, "Sph", 800, nug = 2.42e4), block = block.irreg, nmax = 40) gstat/tests/na.action.Rout.save0000644000176200001440000000652713777370515016251 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(sp) > > data(meuse) > data(meuse.grid) > > set.seed(13131) # reproduce results > > # select 10 random rows; > # create two missing values in the coordinates: > m = meuse.grid[sample(nrow(meuse.grid), 10), ] > m[c(2,8), "x"] = NA > > library(gstat) > ## this is not allowed anymore: > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.pass)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.omit)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.exclude)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > try(krige(log(zinc)~1,~x+y,meuse,m, na.action = na.fail)) Error in na.fail.default(structure(list(x = c(179220, NA, 178740, 179300, : missing values in object > > # select 10 random rows; > # create two missing values in the regressor variable: > m = meuse.grid[sample(nrow(meuse.grid), 10), ] > m[c(3,7), "dist"] = NA > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.pass) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1 178860 330860 6.530134 0.2415196 2 180260 331860 5.389567 0.2406041 3 180100 331860 NA NA 4 180460 331820 5.213370 0.2417197 5 179660 330580 5.550859 0.2398778 6 179740 330300 6.108648 0.2395392 7 180220 330660 NA NA 8 178580 329820 6.533801 0.2415453 9 180100 331900 5.580264 0.2397758 10 180780 331900 5.095967 0.2426499 > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.omit) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1877 178860 330860 6.530134 0.2415196 1015 180260 331860 5.389567 0.2406041 1056 180460 331820 5.213370 0.2417197 2199 179660 330580 5.550859 0.2398778 2556 179740 330300 6.108648 0.2395392 2985 178580 329820 6.533801 0.2415453 975 180100 331900 5.580264 0.2397758 992 180780 331900 5.095967 0.2426499 > krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.exclude) [ordinary or weighted least squares prediction] x y var1.pred var1.var 1877 178860 330860 6.530134 0.2415196 1015 180260 331860 5.389567 0.2406041 1056 180460 331820 5.213370 0.2417197 2199 179660 330580 5.550859 0.2398778 2556 179740 330300 6.108648 0.2395392 2985 178580 329820 6.533801 0.2415453 975 180100 331900 5.580264 0.2397758 992 180780 331900 5.095967 0.2426499 > try(krige(log(zinc)~dist,~x+y,meuse,m, na.action = na.fail)) Error in na.fail.default(structure(list(dist = c(0.00135803, 0.423804, : missing values in object > > proc.time() user system elapsed 0.490 0.047 0.528 gstat/tests/stars.Rout.save0000644000176200001440000003615314413506715015520 0ustar liggesusers R version 4.2.3 (2023-03-15) -- "Shortstop Beagle" Copyright (C) 2023 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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") > > # 0. using sp: > > suppressPackageStartupMessages(library(sp)) > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("+init=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 > suppressPackageStartupMessages(library(gstat)) > v = variogram(log(zinc)~1, meuse) > (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) model psill range 1 Nug 0.05066243 0.0000 2 Sph 0.59060780 897.0209 > k_sp = krige(log(zinc)~1, meuse[-(1:5),], meuse[1:5,], v.fit) [using ordinary kriging] > k_sp_grd = krige(log(zinc)~1, meuse, meuse.grid, v.fit) [using ordinary kriging] > > # 1. using sf: > suppressPackageStartupMessages(library(sf)) > demo(meuse_sf, ask = FALSE, echo = FALSE) > # reloads meuse as data.frame, so > demo(meuse, ask = FALSE) demo(meuse) ---- ~~~~~ > require(sp) > crs = CRS("+init=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 > > v = variogram(log(zinc)~1, meuse_sf) > (v.fit = fit.variogram(v, vgm(1, "Sph", 900, 1))) model psill range 1 Nug 0.05066243 0.0000 2 Sph 0.59060780 897.0209 > k_sf = krige(log(zinc)~1, meuse_sf[-(1:5),], meuse_sf[1:5,], v.fit) [using ordinary kriging] > > all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = FALSE) [1] TRUE > all.equal(k_sp, as(k_sf, "Spatial"), check.attributes = TRUE) [1] "Attributes: < Component \"bbox\": Attributes: < Component \"dimnames\": Component 1: 2 string mismatches > >" [2] "Attributes: < Component \"coords\": Attributes: < Component \"dimnames\": Component 2: 2 string mismatches > >" [3] "Attributes: < Component \"coords.nrs\": Numeric: lengths (2, 0) differ >" [4] "Attributes: < Component \"proj4string\": Attributes: < Names: 1 string mismatch > >" [5] "Attributes: < Component \"proj4string\": Attributes: < Length mismatch: comparison on first 2 components > >" [6] "Attributes: < Component \"proj4string\": Attributes: < Component 2: 1 string mismatch > >" > > # 2. using stars for grid: > > suppressPackageStartupMessages(library(stars)) > st = st_as_stars(meuse.grid) Warning message: In CPL_crs_from_input(x) : GDAL Message 1: +init=epsg:XXXX syntax is deprecated. It might return a CRS with a non-EPSG compliant axis order. > st_crs(st) Coordinate Reference System: User input: +init=epsg:28992 wkt: PROJCRS["Amersfoort / RD New", BASEGEOGCRS["Amersfoort", DATUM["Amersfoort", ELLIPSOID["Bessel 1841",6377397.155,299.1528128, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4289]], CONVERSION["RD New", METHOD["Oblique Stereographic", ID["EPSG",9809]], PARAMETER["Latitude of natural origin",52.1561605555556, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",5.38763888888889, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9999079, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",155000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",463000, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["EPSG",19914]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1, ID["EPSG",9001]]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1, ID["EPSG",9001]]], USAGE[ SCOPE["unknown"], AREA["Netherlands - onshore, including Waddenzee, Dutch Wadden Islands and 12-mile offshore coastal zone."], BBOX[50.75,3.2,53.7,7.22]]] > > # compare inputs: > sp = as(st, "Spatial") > fullgrid(meuse.grid) = TRUE > all.equal(sp, meuse.grid["dist"], check.attributes = FALSE) [1] "Names: Lengths (5, 1) differ (string compare on first 1)" [2] "Names: 1 string mismatch" > all.equal(sp, meuse.grid["dist"], check.attributes = TRUE, use.names = FALSE) [1] "Names: Lengths (5, 1) differ (string compare on first 1)" [2] "Names: 1 string mismatch" [3] "Attributes: < Component 3: Names: 1 string mismatch >" [4] "Attributes: < Component 3: Length mismatch: comparison on first 1 components >" [5] "Attributes: < Component 3: Component 1: Mean relative difference: 1.08298 >" [6] "Attributes: < Component 4: Attributes: < Component 2: names for current but not for target > >" [7] "Attributes: < Component 4: Attributes: < Component 3: names for current but not for target > >" [8] "Attributes: < Component 5: Attributes: < Names: 1 string mismatch > >" [9] "Attributes: < Component 5: Attributes: < Length mismatch: comparison on first 2 components > >" [10] "Attributes: < Component 5: Attributes: < Component 2: 1 string mismatch > >" > > # kriging: > st_crs(st) = st_crs(meuse_sf) = NA # GDAL roundtrip messes them up! > k_st = if (Sys.getenv("USER") == "travis") { + try(krige(log(zinc)~1, meuse_sf, st, v.fit)) + } else { + krige(log(zinc)~1, meuse_sf, st, v.fit) + } [using ordinary kriging] > k_st stars object with 2 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's var1.pred 4.7765547 5.2376293 5.5728839 5.7072287 6.1717619 7.4399911 5009 var1.var 0.0854949 0.1372864 0.1621838 0.1853319 0.2116152 0.5002756 5009 dimension(s): from to offset delta x/y x 1 78 178440 40 [x] y 1 104 333760 -40 [y] > > # handle factors, when going to stars? > k_sp_grd$cls = cut(k_sp_grd$var1.pred, c(0, 5, 6, 7, 8, 9)) > st_as_stars(k_sp_grd) stars object with 2 dimensions and 3 attributes attribute(s): var1.pred var1.var cls Min. :4.777 Min. :0.085 (0,5]: 316 1st Qu.:5.238 1st Qu.:0.137 (5,6]:1778 Median :5.573 Median :0.162 (6,7]: 962 Mean :5.707 Mean :0.185 (7,8]: 47 3rd Qu.:6.172 3rd Qu.:0.212 (8,9]: 0 Max. :7.440 Max. :0.500 NA's :5009 NA's :5009 NA's :5009 dimension(s): from to offset delta refsys x/y x 1 78 178440 40 Amersfoort / RD New [x] y 1 104 333760 -40 Amersfoort / RD New [y] > if (require(raster, quietly = TRUE)) { + print(st_as_stars(raster::stack(k_sp_grd))) # check + print(all.equal(st_redimension(st_as_stars(k_sp_grd)), st_as_stars(raster::stack(k_sp_grd)), check.attributes=FALSE)) + } stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's var1.pred 0.0854949 0.2116778 2 2.710347 5.237542 7.439991 15027 dimension(s): from to offset delta refsys values x 1 78 178440 40 Amersfoort / RD New NULL y 1 104 333760 -40 Amersfoort / RD New NULL band 1 3 NA NA NA var1.pred, var1.var , cls x/y x [x] y [y] band [1] TRUE > > suppressPackageStartupMessages(library(spacetime)) > > Sys.setenv(TZ="") > tm = as.POSIXct("2019-02-25 15:37:24 CET") > n = 4 > s = stars:::st_stars(list(foo = array(1:(n^3), rep(n,3))), + stars:::create_dimensions(list( + x = stars:::create_dimension(from = 1, to = n, offset = 10, delta = 0.5), + y = stars:::create_dimension(from = 1, to = n, offset = 0, delta = -0.7), + time = stars:::create_dimension(values = tm + 1:n)), + raster = stars:::get_raster(dimensions = c("x", "y"))) + ) > s stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 1 16.75 32.5 32.5 48.25 64 dimension(s): from to offset delta refsys x/y x 1 4 10 0.5 NA [x] y 1 4 0 -0.7 NA [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct > > as.data.frame(s) x y time foo 1 10.25 -0.35 2019-02-25 15:37:25 1 2 10.75 -0.35 2019-02-25 15:37:25 2 3 11.25 -0.35 2019-02-25 15:37:25 3 4 11.75 -0.35 2019-02-25 15:37:25 4 5 10.25 -1.05 2019-02-25 15:37:25 5 6 10.75 -1.05 2019-02-25 15:37:25 6 7 11.25 -1.05 2019-02-25 15:37:25 7 8 11.75 -1.05 2019-02-25 15:37:25 8 9 10.25 -1.75 2019-02-25 15:37:25 9 10 10.75 -1.75 2019-02-25 15:37:25 10 11 11.25 -1.75 2019-02-25 15:37:25 11 12 11.75 -1.75 2019-02-25 15:37:25 12 13 10.25 -2.45 2019-02-25 15:37:25 13 14 10.75 -2.45 2019-02-25 15:37:25 14 15 11.25 -2.45 2019-02-25 15:37:25 15 16 11.75 -2.45 2019-02-25 15:37:25 16 17 10.25 -0.35 2019-02-25 15:37:26 17 18 10.75 -0.35 2019-02-25 15:37:26 18 19 11.25 -0.35 2019-02-25 15:37:26 19 20 11.75 -0.35 2019-02-25 15:37:26 20 21 10.25 -1.05 2019-02-25 15:37:26 21 22 10.75 -1.05 2019-02-25 15:37:26 22 23 11.25 -1.05 2019-02-25 15:37:26 23 24 11.75 -1.05 2019-02-25 15:37:26 24 25 10.25 -1.75 2019-02-25 15:37:26 25 26 10.75 -1.75 2019-02-25 15:37:26 26 27 11.25 -1.75 2019-02-25 15:37:26 27 28 11.75 -1.75 2019-02-25 15:37:26 28 29 10.25 -2.45 2019-02-25 15:37:26 29 30 10.75 -2.45 2019-02-25 15:37:26 30 31 11.25 -2.45 2019-02-25 15:37:26 31 32 11.75 -2.45 2019-02-25 15:37:26 32 33 10.25 -0.35 2019-02-25 15:37:27 33 34 10.75 -0.35 2019-02-25 15:37:27 34 35 11.25 -0.35 2019-02-25 15:37:27 35 36 11.75 -0.35 2019-02-25 15:37:27 36 37 10.25 -1.05 2019-02-25 15:37:27 37 38 10.75 -1.05 2019-02-25 15:37:27 38 39 11.25 -1.05 2019-02-25 15:37:27 39 40 11.75 -1.05 2019-02-25 15:37:27 40 41 10.25 -1.75 2019-02-25 15:37:27 41 42 10.75 -1.75 2019-02-25 15:37:27 42 43 11.25 -1.75 2019-02-25 15:37:27 43 44 11.75 -1.75 2019-02-25 15:37:27 44 45 10.25 -2.45 2019-02-25 15:37:27 45 46 10.75 -2.45 2019-02-25 15:37:27 46 47 11.25 -2.45 2019-02-25 15:37:27 47 48 11.75 -2.45 2019-02-25 15:37:27 48 49 10.25 -0.35 2019-02-25 15:37:28 49 50 10.75 -0.35 2019-02-25 15:37:28 50 51 11.25 -0.35 2019-02-25 15:37:28 51 52 11.75 -0.35 2019-02-25 15:37:28 52 53 10.25 -1.05 2019-02-25 15:37:28 53 54 10.75 -1.05 2019-02-25 15:37:28 54 55 11.25 -1.05 2019-02-25 15:37:28 55 56 11.75 -1.05 2019-02-25 15:37:28 56 57 10.25 -1.75 2019-02-25 15:37:28 57 58 10.75 -1.75 2019-02-25 15:37:28 58 59 11.25 -1.75 2019-02-25 15:37:28 59 60 11.75 -1.75 2019-02-25 15:37:28 60 61 10.25 -2.45 2019-02-25 15:37:28 61 62 10.75 -2.45 2019-02-25 15:37:28 62 63 11.25 -2.45 2019-02-25 15:37:28 63 64 11.75 -2.45 2019-02-25 15:37:28 64 > plot(s, col = sf.colors(), axes = TRUE) > (s.stfdf = as(s, "STFDF")) An object of class "STFDF" Slot "data": foo 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 64 64 Slot "sp": Object of class SpatialPixels Grid topology: cellcentre.offset cellsize cells.dim x 10.25 0.5 4 y -2.45 0.7 4 SpatialPoints: x y [1,] 10.25 -0.35 [2,] 10.75 -0.35 [3,] 11.25 -0.35 [4,] 11.75 -0.35 [5,] 10.25 -1.05 [6,] 10.75 -1.05 [7,] 11.25 -1.05 [8,] 11.75 -1.05 [9,] 10.25 -1.75 [10,] 10.75 -1.75 [11,] 11.25 -1.75 [12,] 11.75 -1.75 [13,] 10.25 -2.45 [14,] 10.75 -2.45 [15,] 11.25 -2.45 [16,] 11.75 -2.45 Coordinate Reference System (CRS) arguments: NA Slot "time": timeIndex 2019-02-25 15:37:25 1 2019-02-25 15:37:26 2 2019-02-25 15:37:27 3 2019-02-25 15:37:28 4 Slot "endTime": [1] "2019-02-25 15:37:26 UTC" "2019-02-25 15:37:27 UTC" [3] "2019-02-25 15:37:28 UTC" "2019-02-25 15:37:29 UTC" > stplot(s.stfdf, scales = list(draw = TRUE)) > > (s2 = st_as_stars(s.stfdf)) stars object with 3 dimensions and 1 attribute attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. foo 1 16.75 32.5 32.5 48.25 64 dimension(s): from to offset delta refsys x/y x 1 4 10 0.5 NA [x] y 1 4 -1.11022e-16 -0.7 NA [y] time 1 4 2019-02-25 15:37:25 UTC 1 secs POSIXct > plot(s2, col = sf.colors(), axes = TRUE) > all.equal(s, s2, check.attributes = FALSE) [1] TRUE > > # multiple simulations: > data(meuse, package = "sp") > data(meuse.grid, package = "sp") > coordinates(meuse.grid) <- ~x+y > gridded(meuse.grid) <- TRUE > meuse.grid = st_as_stars(meuse.grid) > meuse_sf = st_as_sf(meuse, coords = c("x", "y")) > g = gstat(NULL, "zinc", zinc~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10) > g = gstat(g, "lead", lead~1, meuse_sf, model = vgm(1, "Exp", 300), nmax = 10, fill.cross = TRUE) > set.seed(123) > (p = predict(g, meuse.grid, nsim = 5)) drawing 5 multivariate GLS realisations of beta... [using conditional Gaussian simulation] stars object with 3 dimensions and 2 attributes attribute(s): Min. 1st Qu. Median Mean 3rd Qu. Max. NA's zinc 101.7643 199.59256 300.2140 399.8017 544.0327 1817.2057 25045 lead 32.7799 73.03151 107.9339 133.1725 178.8162 638.9396 25045 dimension(s): from to offset delta values x/y x 1 78 178440 40 NULL [x] y 1 104 333760 -40 NULL [y] sample 1 5 NA NA sim1,...,sim5 > > proc.time() user system elapsed 6.827 3.845 6.117 gstat/tests/rings.Rout.save0000644000176200001440000001044713777370515015515 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(sp) > library(gstat) > set.seed(13331) > > x = runif(10) > y = runif(10) > z = rnorm(10) > d = data.frame(x=x,y=y,z=z) > bl = c(1,1) > > nd = data.frame(x=.5, y=.5) > > # single block: > library(sp) > coordinates(d) = ~x+y > nd = SpatialPoints(nd) > xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > > ring = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > r1 = SpatialPolygons(list(Polygons(list(Polygon(ring)), ID = "xx"))) > a = data.frame(a = 1, b = 2) > rownames(a) = "xx" > r1df = SpatialPolygonsDataFrame(r1, a) > > g = gstat(formula=z~1, data=d, model=vgm(1, "Exp", 1)) > args = list(type = "regular", n=16, offset=c(0.5,0.5)) > yy = predict(g, r1df, block = bl, sps.args = args) [using ordinary kriging] > > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx,yy)) [1] TRUE > > ## multiple blocks of equal size: > nd = data.frame(x= 0:4 + .5, y=rep(.5,5)) > nd = SpatialPoints(nd) > xx = krige(z~1, d, nd, model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) > ring2 = cbind(c(2+0,2+bl[1],2+bl[1],2+0,2+0), c(0,0,bl[2],bl[2],0)) > ring3 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) > ring4 = cbind(c(4+0,4+bl[1],4+bl[1],4+0,4+0), c(0,0,bl[2],bl[2],0)) > r1 = SpatialPolygons(list( + Polygons(list(Polygon(ring0)), ID = "x0"), + Polygons(list(Polygon(ring1)), ID = "x1"), + Polygons(list(Polygon(ring2)), ID = "x2"), + Polygons(list(Polygon(ring3)), ID = "x3"), + Polygons(list(Polygon(ring4)), ID = "x4") + )) > df = data.frame(a=rep(1,5), b= rep(1,5)) > rownames(df) = c("x0", "x1", "x2", "x3", "x4") > r1df = SpatialPolygonsDataFrame(r1, df) > > yy = predict(g, r1, block = bl, sps.args = args) [using ordinary kriging] > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > all.equal(xx, yy) [1] TRUE > > ## multiple blocks of equal size: > args = list(type = "regular", cellsize=.25, offset=c(0.5,0.5), n=16) > yy = predict(g, r1, block = bl, sps.args = args) [using ordinary kriging] > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx, yy)) [1] TRUE > > ## multiple blocks of varying size: > nd = data.frame(x=c(0.5, 2, 4.5), y=c(0.5, 1, 1.5)) > nd = SpatialPoints(nd) > bl = c(1,1) > ring0 = cbind(c(0,bl[1],bl[1],0,0), c(0,0,bl[2],bl[2],0)) > xx1 = krige(z~1, d, nd[1], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > bl = c(2,2) > ring1 = cbind(c(1+0,1+bl[1],1+bl[1],1+0,1+0), c(0,0,bl[2],bl[2],0)) > xx2 = krige(z~1, d, nd[2], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > bl = c(3,3) > ring2 = cbind(c(3+0,3+bl[1],3+bl[1],3+0,3+0), c(0,0,bl[2],bl[2],0)) > xx3 = krige(z~1, d, nd[3], model=vgm(1, "Exp", 1), block = bl, + set = list(nb=4)) [using ordinary kriging] > r1 = SpatialPolygons(list( + Polygons(list(Polygon(ring0)), ID = "x0"), + Polygons(list(Polygon(ring1)), ID = "x1"), + Polygons(list(Polygon(ring2)), ID = "x2") + )) > df = data.frame(a = rep(1,3), b = rep(1,3)) > rownames(df) = c("x0", "x1", "x2") > r1df = SpatialPolygonsDataFrame(r1, df) > > args = list(type = "regular", n=16, offset=c(0.5,0.5)) > yy = predict(g, r1df, block = bl, sps.args = args) [using ordinary kriging] > xx = rbind(as.data.frame(xx1), as.data.frame(xx2), as.data.frame(xx3)) > row.names(xx) = 1:3 > xx = as.data.frame(xx) > yy = as.data.frame(yy) > row.names(xx) = row.names(yy) > print(all.equal(xx, yy)) [1] TRUE > > proc.time() user system elapsed 1.260 0.024 1.288 gstat/tests/merge.R0000644000176200001440000000151513777370515014001 0ustar liggesusersoptions(digits=6) # illustrates the use of merge, for merging parameters accross variables: # Z1=m+e1(s) # Z2=m+e2(s) # Z1 and Z2 each have a different variogram, but share the parameter m # see documentation of gstat() function library(gstat) d1 = data.frame(x=c(0,2),y=c(0,0),z=c(0,1)) d2 = data.frame(x=c(0,2),y=c(2,2),z=c(4,5)) g = gstat(NULL,"d1", z~1,~x+y,d1,model=vgm(1, "Exp", 1)) g = gstat(g,"d2", z~1,~x+y,d2,model=vgm(1, "Exp", 1), merge=c("d1","d2")) g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) predict(g, data.frame(x=1,y=1), debug = 32) # Z1 and Z2 share a regression slope: g = gstat(NULL,"d1", z~x,~x+y,d1,model=vgm(1, "Exp", 1)) g = gstat(g,"d2", z~x,~x+y,d2,model=vgm(1, "Exp", 1), merge=list(c("d1",2,"d2",2))) g = gstat(g, c("d1", "d2"), model = vgm(0.5, "Exp", 1)) predict(g, data.frame(x=1,y=1), debug = 32) gstat/tests/vdist.Rout.save0000644000176200001440000000241613777370515015521 0ustar liggesusers R version 3.0.1 (2013-05-16) -- "Good Sport" Copyright (C) 2013 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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. > library(sp) > library(gstat) > > data(meuse) > coordinates(meuse) = ~x+y > data(meuse.grid) > gridded(meuse.grid) = ~x+y > > mg = meuse.grid > gridded(mg) = FALSE > mg= mg[1500,] > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=FALSE, maxdist=1000,nmax=10) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.007376 1.102622 > krige(log(zinc)~1,meuse,mg,vgm(1, "Exp", 300, anis=c(0,0.01)), + vdist=TRUE, maxdist=1000,nmax=10) [using ordinary kriging] coordinates var1.pred var1.var 1500 (180260, 331300) 5.50671 1.100095 > > proc.time() user system elapsed 1.308 0.052 1.370 gstat/tests/sim.Rout.save0000644000176200001440000000352413777370515015161 0ustar liggesusers R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) 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(digits=6) > library(sp) > data(meuse) > set.seed(158229572) > new.locs <- data.frame(x = c(181170, 180310, 180205, 178673, 178770, 178270), + y = c(333250, 332189, 331707, 330066, 330675, 331075)) > library(gstat) > krige(zinc ~ 1, ~ x + y, meuse, newdata = new.locs, + model = vgm(1.34e5, "Sph", 800, nug = 2.42e4), + block = c(40,40), nmax = 40, nsim = 10) drawing 10 GLS realisations of beta... [using conditional Gaussian simulation] x y sim1 sim2 sim3 sim4 sim5 sim6 sim7 1 181170 333250 267.385 27.5686 428.144 381.576 151.119 175.890 293.273 2 180310 332189 429.437 659.6579 564.023 611.666 612.756 619.791 771.961 3 180205 331707 205.978 412.7276 271.827 380.349 169.488 369.822 266.026 4 178673 330066 117.479 684.0663 399.148 585.096 606.396 867.866 807.634 5 178770 330675 780.072 837.4628 682.690 911.052 600.984 783.019 749.476 6 178270 331075 1025.778 1582.0269 614.235 332.377 660.228 589.447 972.018 sim8 sim9 sim10 1 294.107 113.347 279.991 2 776.498 724.160 901.692 3 338.021 630.244 140.272 4 127.301 957.242 444.007 5 533.773 748.144 623.960 6 1084.170 537.604 -214.972 > > proc.time() user system elapsed 0.467 0.020 0.479 gstat/src/0000755000176200001440000000000014413507477012177 5ustar liggesusersgstat/src/sem.h0000644000176200001440000000125613777370515013143 0ustar liggesusers/* sem.c */ #ifndef SEM_H # define SEM_H /* avoid multiple inclusion */ #if defined(__cplusplus) extern "C" { #endif int calc_variogram(VARIOGRAM *v, const char *fname); void fill_cutoff_width(DATA *data, VARIOGRAM *v); int is_directional(VARIOGRAM *v); void fprint_header_vgm(FILE *f, const DATA *d1, const DATA *d2, const SAMPLE_VGM *ev); void fprint_sample_vgm(const SAMPLE_VGM *ev); #if defined(__cplusplus) } #endif #define LONGSIZE (sizeof(unsigned long)) #define MAX_NH (1UL << (4 * LONGSIZE)) #define TO_NH(x,y) (x + ((unsigned long)y << (4 * LONGSIZE))) #define HIGH_NH(x) (x / (1UL << (4 * LONGSIZE))) #define LOW_NH(x) (x % (1UL << (4 * LONGSIZE))) #endif /* SEM_H */ gstat/src/data.c0000644000176200001440000006131214127263756013260 0ustar liggesusers/* * data.c: basic i/o routines on DATA structure */ #include /* sqrt */ #include /* memcpy */ #include "defs.h" #include "data.h" #include "mapio.h" #include "userio.h" #include "utils.h" #include "block.h" #include "debug.h" #include "glvars.h" #include "defaults.h" #include "mtrx.h" #include "lm.h" /* free_lm() */ #include "gls.h" /* free_glm() */ #include "nsearch.h" #include "gcdist.h" const DATA_TYPE data_types[] = { { DATA_UNKNOWN, "Unknown file type"}, { DATA_ASCII_TABLE, "Ascii table file"}, { DATA_EAS, "GeoEAS file"}, { DATA_IDRISI_VEC, "Idrisi ascii .vec"}, { DATA_IDRISI32_VEC, "Idrisi binary .vct"}, { DATA_IDRISI_BIN, "Idrisi binary .img"}, { DATA_IDRISI_ASCII, "Idrisi ascii .img"}, { DATA_IDRISI32_BIN, "Idrisi binary .rst"}, { DATA_IDRISI32_ASCII, "Idrisi ascii .rst"}, { DATA_GRIDASCII, "ArcInfo gridascii"}, { DATA_GRIDFLOAT, "ArcInfo gridfloat"}, { DATA_CSF, "PCRaster map"}, { DATA_T2, "T2 map"}, { DATA_ERMAPPER, "ER-Mapper file"}, { DATA_GNUPLOT, "Gnuplot binary"}, { DATA_GMT, "GMT netCDF format" }, { DATA_SURFER_DSAA, "Surfer DSAA ascii grid" }, { DATA_GSLIB, "GSLIB grid" }, { DATA_GRASS, "GRASS site list" }, { DATA_GRASS_GRID, "GRASS raster" }, { DATA_GDAL, "GDAL raster map" } }; static void calc_data_mean_std(DATA *d); static void grid_push_point(DATA *d, DPOINT *p, int adjust_to_gridcentrs); static double point_norm_1D(const DPOINT *p); static double point_norm_2D(const DPOINT *p); static double point_norm_3D(const DPOINT *p); static double pp_norm_1D(const DPOINT *a, const DPOINT *b); static double pp_norm_2D(const DPOINT *a, const DPOINT *b); static double pp_norm_3D(const DPOINT *a, const DPOINT *b); /* great circle distances: */ static double point_norm_gc(const DPOINT *p); static double pp_norm_gc2(const DPOINT *a, const DPOINT *b); static double pb_norm_gc2(const DPOINT *where, BBOX bbox); static void logprint_data_header(const DATA *d); static DPOINT min, max; static int fix_minmax = 0; const POLY_NM polynomial[N_POLY] = {{ POLY_X, "x", 1, X_BIT_SET}, { POLY_Y, "y", 1, Y_BIT_SET}, { POLY_Z, "z", 1, Z_BIT_SET}, { POLY_X2, "x2", 2, X_BIT_SET}, { POLY_Y2, "y2", 2, Y_BIT_SET}, { POLY_Z2, "z2", 2, Z_BIT_SET}, { POLY_XY, "xy", 2, Y_BIT_SET}, { POLY_XZ, "xz", 2, Z_BIT_SET}, { POLY_YZ, "yz", 2, Z_BIT_SET}, { POLY_X3, "x3", 3, X_BIT_SET}, { POLY_Y3, "y3", 3, Y_BIT_SET}, { POLY_Z3, "z3", 3, Z_BIT_SET}, { POLY_X2Y, "x2y", 3, Y_BIT_SET}, { POLY_XY2, "xy2", 3, Y_BIT_SET}, { POLY_X2Z, "x2z", 3, Z_BIT_SET}, { POLY_XZ2, "xz2", 3, Z_BIT_SET}, { POLY_Y2Z, "y2z", 3, Z_BIT_SET}, { POLY_YZ2, "yz2", 3, Z_BIT_SET}}; void set_norm_fns(DATA *d) { if (d->mode & Z_BIT_SET) { d->point_norm = point_norm_3D; d->pp_norm2 = pp_norm_3D; d->pb_norm2 = pb_norm_3D; } else if (d->mode & Y_BIT_SET) { if (gl_longlat) { d->point_norm = point_norm_gc; d->pp_norm2 = pp_norm_gc2; d->pb_norm2 = pb_norm_gc2; /* if (gl_split != DEF_split) pr_warning("longlat data cannot do quadtree, setting split to %d", INT_MAX); */ gl_split = INT_MAX; } else { d->point_norm = point_norm_2D; d->pp_norm2 = pp_norm_2D; d->pb_norm2 = pb_norm_2D; } } else { d->point_norm = point_norm_1D; d->pp_norm2 = pp_norm_1D; d->pb_norm2 = pb_norm_1D; } } void init_data_minmax(void) { fix_minmax = 0; set_mv_double(&(min.x)); set_mv_double(&(min.y)); set_mv_double(&(min.z)); set_mv_double(&(max.x)); set_mv_double(&(max.y)); set_mv_double(&(max.z)); } void setup_data_minmax(DATA *d) { if (fix_minmax) ErrMsg(ER_NULL, "min and max should be fixed"); if (d->id == 0) { min.x = d->minX; min.y = d->minY; min.z = d->minZ; max.x = d->maxX; max.y = d->maxY; max.z = d->maxZ; } else { min.x = MIN(min.x, d->minX); min.y = MIN(min.y, d->minY); min.z = MIN(min.z, d->minZ); max.x = MAX(max.x, d->maxX); max.y = MAX(max.y, d->maxY); max.z = MAX(max.z, d->maxZ); } } DATA *get_area_centre(DATA *area, DATA *d) { int i, j; DPOINT p; d->n_list = d->n_max = 0; d->variable = area->variable; d->x_coord = area->x_coord; d->y_coord = area->y_coord; d->z_coord = area->z_coord; d->type = data_types[area->type.type]; d->fname = ""; p.x = p.y = p.z = 0.0; p.u.stratum = 0; d->n_X = area->n_X; if (area->n_X > 0) { p.X = (double *) emalloc(area->n_X * sizeof(double)); d->colX = (int *) emalloc(area->n_X * sizeof(int)); for (j = 0; j < area->n_X; j++) { p.X[j] = 0.0; d->colX[j] = area->colX[j]; } } else { p.X = NULL; d->colX = NULL; } for (i = 0; i < area->n_list; i++) { p.x += area->list[i]->x; p.y += area->list[i]->y; p.z += area->list[i]->z; for (j = 0; j < area->n_X; j++) p.X[j] += area->list[i]->X[j]; } p.x /= area->n_list; p.y /= area->n_list; p.z /= area->n_list; for (j = 0; j < area->n_X; j++) p.X[j] /= area->n_list; p.attr = 0.0; printlog("prediction centre at x=%g, y=%g, z=%g",p.x,p.y,p.z); if (d->n_X) { printlog(" where x0 averages ["); for (j = 0; j < area->n_X; j++) printlog("%g%s", p.X[j], jn_X-1?",":""); printlog("]\n"); } else printlog("\n"); push_point(d, &p); d->minX = d->maxX = p.x; d->minY = d->maxY = p.y; d->minZ = d->maxZ = p.z; d->mode = area->mode; d->n_X = area->n_X; calc_data_mean_std(d); return d; } void centre_area(DATA *area) { int i; DPOINT p; p.x = p.y = p.z = 0.0; for (i = 0; i < area->n_list; i++) { p.x += area->list[i]->x; p.y += area->list[i]->y; p.z += area->list[i]->z; } p.x /= area->n_list; p.y /= area->n_list; p.z /= area->n_list; for (i = 0; i < area->n_list; i++) { area->list[i]->x -= p.x; area->list[i]->y -= p.y; area->list[i]->z -= p.z; } area->minX -= p.x; area->maxX -= p.x; area->minY -= p.y; area->maxY -= p.y; area->minZ -= p.z; area->maxZ -= p.z; } static void calc_data_mean_std(DATA *d) { /* * Calculates fields mean and std of d with mean and standard dev. (/(n-1)) */ int i; if (d->standard == 2) { /* we did this already.. */ for (i = 0; i < d->n_list; i++) d->list[i]->attr *= d->std; } d->mean = 0.0; d->std = 0.0; if (d->n_list <= 0) { pr_warning("calc_data_mean_std: n_list <= 0: %d", d->n_list); return; } for (i = 0; i < d->n_list; i++) d->mean += d->list[i]->attr; d->mean /= d->n_list; if (d->n_list == 1) return; for (i = 0; i < d->n_list; i++) d->std += SQR(d->list[i]->attr - d->mean); d->std = sqrt((d->std)/(d->n_list - 1)); if (d->standard > 0) { for (i = 0; i < d->n_list; i++) d->list[i]->attr /= d->std; d->standard = 2; } return; } void setup_polynomial_X(DATA *d) { int i, j, degree; degree = d->polynomial_degree; if (degree < 0 || degree > 3) ErrMsg(ER_SYNTAX, "polynomial degree n, `d=n', should be in [0..3]"); for (i = 1; i <= degree; i++) for (j = 0; j < N_POLY; j++) if (polynomial[j].degree == i && (d->mode & polynomial[j].mode)) data_add_X(d, polynomial[j].poly_nr); } void data_add_X(DATA *d, int col) { int i; for (i = 0; d->id != ID_OF_VALDATA && i < d->n_X; i++) if (d->colX[i] == col) ErrMsg(ER_IMPOSVAL, "X-variable: column appears twice"); d->n_X++; d->colX = (int *) erealloc(d->colX, d->n_X * sizeof(int)); d->colX[d->n_X - 1] = col; } void calc_polynomials(DATA *d) { int i, j, do_block; #define CHECK_BITX if(!(d->mode & X_BIT_SET)) ErrMsg(ER_VARNOTSET,"x coordinate not set") #define CHECK_BITY if(!(d->mode & Y_BIT_SET)) ErrMsg(ER_VARNOTSET,"y coordinate not set") #define CHECK_BITZ if(!(d->mode & Z_BIT_SET)) ErrMsg(ER_VARNOTSET,"z coordinate not set") for (j = 0; j < d->n_X; j++) { if (d->colX[j] < -1) { switch(d->colX[j]) { case POLY_X: case POLY_X2: case POLY_X3: CHECK_BITX; break; case POLY_Y: case POLY_Y2: case POLY_Y3: CHECK_BITY; break; case POLY_Z: case POLY_Z2: case POLY_Z3: CHECK_BITZ; break; case POLY_XY: CHECK_BITX; CHECK_BITY; break; case POLY_XZ: CHECK_BITX; CHECK_BITZ; break; case POLY_YZ: CHECK_BITY; CHECK_BITZ; break; case POLY_X2Y: CHECK_BITX; CHECK_BITY; break; case POLY_XY2: CHECK_BITX; CHECK_BITY; break; case POLY_X2Z: CHECK_BITX; CHECK_BITZ; break; case POLY_XZ2: CHECK_BITX; CHECK_BITZ; break; case POLY_Y2Z: CHECK_BITY; CHECK_BITZ; break; case POLY_YZ2: CHECK_BITY; CHECK_BITZ; break; default: ErrMsg(ER_IMPOSVAL, "unknown polynomial number"); break; } } } for (j = do_block = 0; !do_block && j < d->n_X; j++) do_block = (d->colX[j] < -1); for (i = 0; do_block && i < d->n_list; i++) /* bl is a single point-list if IS_POINT(d->list[i]) */ calc_polynomial_point(d, d->list[i]); } void calc_polynomial_point(DATA *d, DPOINT *pt) { static DATA *bl = NULL; int j, k; bl = block_discr(bl, get_block_p(), pt); for (j = 0; j < d->n_X; j++) { if (d->colX[j] < -1) /* do eventual block averaging here: */ for (k = 0, pt->X[j] = 0.0; k < bl->n_list; k++) pt->X[j] += bl->list[k]->u.weight * calc_polynomial(bl->list[k], d->colX[j]); } } double calc_polynomial(DPOINT *p, int colX) { /* * fills polynomial field (x, y, z, x2, y2, z2, xy, xz, yz) * with standardized values * * Counting on the following behaviour: * first, all data + valdata are passed through setup_data_minmax(), in * order to get the right values into min and max; * then, the routines calc_polynomial* are called. * changing min or max inbetween would result in rubbish. */ double x, y, z; if (fix_minmax == 0) fix_minmax = 1; /* stop touching it */ x = ((min.x==max.x) ? p->x : (p->x - min.x)/(max.x - min.x)); y = ((min.y==max.y) ? p->y : (p->y - min.y)/(max.y - min.y)); z = ((min.z==max.z) ? p->z : (p->z - min.z)/(max.z - min.z)); switch(colX) { case POLY_X: return (x); case POLY_X2: return (x * x); case POLY_X3: return (x * x * x); case POLY_Y: return (y); case POLY_Y2: return (y * y); case POLY_Y3: return (y * y * y); case POLY_Z: return (z); case POLY_Z2: return (z * z); case POLY_Z3: return (z * z * z); case POLY_XY: return (x * y); case POLY_XZ: return (x * z); case POLY_YZ: return (y * z); case POLY_X2Y: return (x * x * y); case POLY_XY2: return (x * y * y); case POLY_X2Z: return (x * x * z); case POLY_XZ2: return (x * z * z); case POLY_Y2Z: return (y * y * z); case POLY_YZ2: return (y * z * z); default: ErrMsg(ER_IMPOSVAL, "unknown polynomial number"); break; } return 1.0; /* will never happen */ } void free_data(DATA *d) { int i; assert(d); if (DEBUG_FORCE) /* let atexit(qtree_print) do it's job... */ return; if (d->P_base) { /* segmented: */ efree(d->P_base); if (d->n_X && d->X_base) efree(d->X_base); } else { /* non-segmented */ if (d->list) /* CW at all MV on output both P_base and d_list are 0 */ for (i = d->n_list - 1; i >= 0; i--) pop_point(d, i); } if (d->sel != NULL && d->sel != d->list) efree(d->sel); if (d->list) efree(d->list); if (d->colX) efree(d->colX); if (d->qtree_root != NULL) qtree_free(d->qtree_root); if (d->lm) free_lm(d->lm); if (d->glm) free_glm(d->glm); if (d->grid) free_data_gridmap(d->grid); if (d->point_ids != NULL) { for (i = d->n_list - 1; i >= 0; i--) efree(d->point_ids[i]); } if (d->beta != NULL) efree(d->beta); efree(d); return; } DATA *init_one_data(DATA *data) { if (data == NULL) data = (DATA *) emalloc(sizeof(DATA)); data->colnvalue = 0; data->colnx = 0; data->colny = 0; data->colnz = 0; data->colns = 0; data->coln_id = 0; data->colnvariance = 0; data->n_list = -1; data->n_max = -1; data->nsim_at_data = 0; data->init_max = 0; data->n_sel = -1; data->n_sel_max = 0; data->id = -1; data->log = 0; data->standard = 0; data->what_is_u = U_UNKNOWN; data->centre = 0; data->region = 0; data->mode = 0; data->dummy = 0; data->force = 0; data->vdist = 0; data->square = 0; data->average = 0; data->every = 1; data->offset = 0; data->prob = 1.0; data->skip = 0; data->lambda = 1.0; data->calc_residuals = 1; data->is_residual = 0; data->polynomial_degree = 0; data->n_averaged = 0; data->fname = NULL; data->type = data_types[DATA_UNKNOWN]; data->variable = NULL; data->x_coord = NULL; data->y_coord = NULL; data->z_coord = NULL; data->s_coord = NULL; data->V_coord = NULL; data->point_ids = NULL; data->id_name = NULL; data->mean = 0.0; data->std = 0.0; data->sel_rad = DBL_MAX; data->dX = DBL_MAX; data->sel_max = INT_MAX; data->sel_min = 0; data->oct_max = 0; /* default: don't use octant search */ data->oct_filled = 1; /* in case of no octants */ data->list = NULL; data->sel = NULL; data->P_base = NULL; data->X_base = NULL; data->lm = NULL; data->glm = NULL; data->n_merge = 0; data->mtbl = NULL; data->n_X = 0; data->colX = NULL; data_add_X(data, 0); /* add intercept -->> UK, defaulting to ordinary kriging */ data->qtree_root = NULL; data->grid = NULL; data->togrid = 0; data->point_norm = NULL; data->pp_norm2 = NULL; data->pb_norm2 = NULL; data->beta = NULL; data->Category = NULL; data->var_fn_str = NULL; data->nscore_table = NULL; data->variance_fn = NULL; set_mv_double(&(data->Icutoff)); set_mv_double(&(data->mv)); return data; } void print_data(const DATA *d, int list) { int i; printlog("\ndata id: %d\n", d->id); if (! is_mv_double(&(d->Icutoff))) printlog("ind. cutoff: %g\n", d->Icutoff); if (d->Category) printlog("category: %s\n", d->Category); if (! is_mv_double(&(d->mv))) printlog("missing value: %g\n", d->mv); if (d->beta) { printlog("beta: ["); for (i = 0; i < d->beta->size; i++) printlog(" %g", d->beta->val[i]); printlog("]\n"); } printlog("sel_radius %g sel_max %d sel_min %d\n", d->sel_rad, d->sel_max, d->sel_min); if (d->n_X > 0) { for (i = 0; i < d->n_X; i++) { printlog("X[%d]: ", i); if (d->colX[i] == 0) printlog("intercept "); if (d->colX[i] < 0) printlog("%s ", POLY_NAME(d->colX[i])); if (d->colX[i] > 0) printlog("%d ", d->colX[i]); } printlog("\n"); } printlog("n_list %d n_max %d n_sel %d\n", d->n_list, d->n_max, d->n_sel); if (list) { printlog("current list:\n"); logprint_data_header(d); if (d->n_list) { for (i = 0; i < d->n_list; i++) logprint_point(d->list[i], d); } else printlog("\n"); } else { printlog("current selection:\n"); logprint_data_header(d); if (d->n_sel) { for (i = 0; i < d->n_sel; i++) logprint_point(d->sel[i], d); } else printlog("\n"); } } static void logprint_data_header(const DATA *d) { printlog("\nidx x:%s;", d->x_coord); printlog("y:%s;", d->y_coord); printlog("z:%s;", d->z_coord); printlog("v:%s;\n", d->variable); } void logprint_point(const DPOINT *p, const DATA *d) { /* * print contents of p (non zero: use d) to log device */ int j; printlog("%3d ", GET_INDEX(p)); if (d->mode & X_BIT_SET) printlog("x: %4g ", p->x); if (d->mode & Y_BIT_SET) printlog("y: %4g ", p->y); if (d->mode & Z_BIT_SET) printlog("z: %4g ", p->z); if (d->mode & V_BIT_SET) printlog("v: %4g ", p->attr); switch (d->what_is_u) { case U_UNKNOWN: break; case U_ISDIST: printlog("dist: %4g ", sqrt(p->u.dist2)); break; case U_ISWEIGHT: printlog("weight: %4g ", p->u.weight); break; case U_ISSTRATUM: printlog("stratum: %d ", p->u.stratum); break; } for (j = 0; j < d->n_X; j++) printlog("X[%d]: %6g ", j, p->X[j]); if (d->point_ids) { printlog("ID: %s ", d->point_ids[GET_INDEX(p)]); } printlog("\n"); } void push_point(DATA *d, const DPOINT *p) { int i; /* * add one point p to the data structure d * [counts on the fact that erealloc(NULL,size) calls malloc(size)] */ if (d->prob < 1.0) { ErrMsg(ER_IMPOSVAL, "sample in R, not in gstat"); } else if (d->every > 1) { /* EJP: WAS if ((d->n_list + d->offset) % d->every != 0) */ if ((d->n_list + d->skip + 1 - d->offset) % d->every != 0) { d->skip++; return; } } if (d->n_list < 0) { message("push_point: n_list < 0: %d (%s)\n", d->n_list, d->fname); ErrMsg(ER_NULL, "push_point(): n_list < 0"); } if (d->n_max < 0) { message("push_point: n_max < 0: %d (%s)\n", d->n_max, d->fname); ErrMsg(ER_NULL, "push_point(): n_max < 0"); } /* * use rather large blocks of memory for points: */ if (d->n_list == d->n_max) { /* increase memory: */ /* resize d->n_max: */ if (d->list == NULL) { if (d->init_max > 0) d->n_max = d->init_max; else d->n_max = MAX_DATA; } else { d->n_max += MAX_DATA; /* or else: d->n_max *= 2; */ if (d->init_max > 0 && DEBUG_DUMP) pr_warning("exceeding nmax, now %d", d->n_max); } /* resize blocked memory bases P_base and X_base, and list: */ d->P_base = (DPOINT *) erealloc(d->P_base, d->n_max * sizeof(DPOINT)); if (d->n_X > 0) { if (intercept_only(d)) { /* create a single instance of the X row: */ if (d->X_base == NULL) { /* first time */ d->X_base = (double *) emalloc(sizeof(double)); d->X_base[0] = 1.0; } } else /* each point needs it's own X row: */ d->X_base = (double *) erealloc(d->X_base, d->n_max * d->n_X * sizeof(double)); } d->list = (DPOINT **) erealloc(d->list, d->n_max * sizeof(DPOINT *)); /* * realloc'ing may have moved P_base or X_base, so reset all pointers: */ for (i = 0; i < d->n_list; i++) { d->list[i] = &(d->P_base[i]); if (d->n_X) { if (intercept_only(d)) /* d->P_base[i].X = d->X_base; */ d->list[i]->X = d->X_base; else /* d->P_base[i].X = &(d->X_base[d->n_X * i]); */ d->list[i]->X = &(d->X_base[d->n_X * i]); } else /* d->P_base[i].X = NULL; */ d->list[i]->X = NULL; } for (i = d->n_list; i < d->n_max; i++) d->list[i] = NULL; /* for savety */ /* rebuild qtree_root: this is avoided by setting nmax */ qtree_rebuild(d); datagrid_rebuild(d, 0); } /* * copy information on current point into P_base and X_base arrays: */ #ifdef SLOW d->P_base[d->n_list] = *p; #else memcpy(&(d->P_base[d->n_list]), p, sizeof(DPOINT)); #endif if (d->n_X > 0 && !intercept_only(d)) { #define SLOW 1 #ifdef SLOW /* slow... copy X row */ for (i = 0; i < d->n_X; i++) d->X_base[d->n_X * d->n_list + i] = p->X[i]; #else memcpy(&(d->X_base[d->n_X * d->n_list]), p->X, d->n_X * sizeof(double)); #endif } /* * adjust list and X pointer to this copy: */ d->list[d->n_list] = &(d->P_base[d->n_list]); if (intercept_only(d)) d->list[d->n_list]->X = d->X_base; else d->list[d->n_list]->X = &(d->X_base[d->n_X * d->n_list]); SET_INDEX(d->list[d->n_list], d->n_list); qtree_push_point(d, d->list[d->n_list]); grid_push_point(d, d->list[d->n_list], 0); /* * this will be ignored during read_gstat_data(), the tree structure will * be filled only during the first call to qtree_quick_select(). * Later on, it does have effect if simulated points are pushed. */ d->n_list++; return; } void pop_point(DATA *d, int list_nr) /* * removes DPOINT list_nr, and makes it point to the last DPOINT * also changes d->n_list */ { if (list_nr >= d->n_list) { message("pop_point: list_nr >= n_list: %d %d\n", list_nr, d->n_list); ErrMsg(ER_NULL, "pop_point():"); } qtree_pop_point(d->list[list_nr], d); if (d->P_base == NULL) { /* * free this one: */ if (d->n_X > 0 && !(intercept_only(d))) efree(d->list[list_nr]->X); efree(d->list[list_nr]); } /* * change the last pointer to this: */ if (list_nr != d->n_list - 1) /* we didn't pop the last: */ d->list[list_nr] = d->list[d->n_list - 1]; d->list[d->n_list - 1] = NULL; d->n_list--; } static double point_norm_1D(const DPOINT *p) { /* calculate norm of vector (p->x) */ return fabs(p->x); } static double point_norm_2D(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ return sqrt(p->x * p->x + p->y * p->y); } static double point_norm_3D(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ return sqrt(p->x * p->x + p->y * p->y + p->z * p->z); } static double pp_norm_1D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x) */ double dx; dx = a->x - b->x; return dx * dx; } static double pp_norm_2D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x, p->y) */ double dx, dy; dx = a->x - b->x; dy = a->y - b->y; return dx * dx + dy * dy; } static double pp_norm_3D(const DPOINT *a, const DPOINT *b) { /* calculate 2-norm of vector (p->x, p->y, p->z) */ double dx, dy, dz; dx = a->x - b->x; dy = a->y - b->y; dz = a->z - b->z; return dx * dx + dy * dy + dz * dz; } static double point_norm_gc(const DPOINT *p) { /* calculate norm of vector (p->x, p->y, p->z) */ ErrMsg(ER_IMPOSVAL, "long/lat: this function should never be called?"); return gstat_gcdist(p->x, 0.0, p->y, 0.0); } double pp_norm_gc(const DPOINT *a, const DPOINT *b) { return gstat_gcdist(a->x, b->x, a->y, b->y); /* dist */ } static double pp_norm_gc2(const DPOINT *a, const DPOINT *b) { return pow(gstat_gcdist(a->x, b->x, a->y, b->y), 2.0); /* squared dist */ } static double pb_norm_gc2(const DPOINT *where, BBOX bbox) { /* ErrMsg(ER_IMPOSVAL, "great circle distances cannot be combined with quadtree"); */ return 0.0; /* always inside, no quadtree */ } int coordinates_are_equal(const DATA *a, const DATA *b) { int i, equal = 1 /* try to disprove equality */; if (a->n_list != b->n_list) return 0; i = 0; while (equal && i < a->n_list) { equal = ((a->list[i]->x == b->list[i]->x) && (a->list[i]->y == b->list[i]->y) && (a->list[i]->z == b->list[i]->z)); i++; } return equal; } int push_to_merge_table(DATA *d, int to_var, int col_this_X, int col_other_X) { int i; DATA **data; data = get_gstat_data(); if (to_var >= d->id) { /* should not occur by construction */ pr_warning("use push_to_merge_table only backwards (%d >= %d)", to_var, d->id); return 1; } if (col_this_X >= d->n_X || col_other_X >= data[to_var]->n_X) { pr_warning("merge error: variable out of range"); return 1; } if (d->beta || data[to_var]->beta) { pr_warning("cannot merge to or from fixed (known) parameters"); return 1; } for (i = 0; i < d->n_merge; i++) { if (col_this_X == d->mtbl[i].col_this_X) { pr_warning("merge error: cannot merge column twice"); return 1; } } d->n_merge++; d->mtbl = (MERGE_TABLE *) erealloc(d->mtbl, d->n_merge * sizeof (MERGE_TABLE)); d->mtbl[d->n_merge - 1].to_var = to_var; d->mtbl[d->n_merge - 1].col_this_X = col_this_X; d->mtbl[d->n_merge - 1].col_other_X = col_other_X; return 0; } DATA_GRIDMAP *gsetup_gridmap(double x_ul, double y_ul, double cellsizex, double cellsizey, unsigned int rows, unsigned int cols) { DATA_GRIDMAP *t; int i, j; t = (DATA_GRIDMAP *) emalloc(sizeof(DATA_GRIDMAP)); t->x_ul = x_ul; t->y_ul = y_ul; t->cellsizex = cellsizex; t->cellsizey = cellsizey; t->rows = rows; t->cols = cols; t->dpt = (DPOINT ***) emalloc(t->rows * sizeof(DPOINT **)); t->grid_base = (DPOINT **) emalloc(t->rows * t->cols * sizeof(DPOINT *)); for (i = 0; i < t->rows; i++) t->dpt[i] = &(t->grid_base[i * t->cols]); for (i = 0; i < t->rows; i++) for (j = 0; j < t->cols; j++) t->dpt[i][j] = NULL; return t; } void free_data_gridmap(DATA_GRIDMAP *t) { efree(t->grid_base); efree(t->dpt); efree(t); } static void grid_push_point(DATA *d, DPOINT *p, int adjust_to_gridcentres) { int row, col; if (d->grid) { row = floor((d->grid->y_ul - p->y)/d->grid->cellsizey); col = floor((p->x - d->grid->x_ul)/d->grid->cellsizex); row = MAX(0, row); row = MIN(row, d->grid->rows - 1); col = MAX(0, col); col = MIN(col, d->grid->cols - 1); d->grid->dpt[row][col] = p; if (adjust_to_gridcentres) { p->x = d->grid->x_ul + (col + 0.5) * d->grid->cellsizex; p->y = d->grid->y_ul - (row + 0.5) * d->grid->cellsizey; } } return; } void datagrid_rebuild(DATA *d, int adjust_to_gridcentres) { int i; if (d->grid) for (i = 0; i < d->n_list; i++) grid_push_point(d, d->list[i], adjust_to_gridcentres); return; } double data_block_diagonal(DATA *data) { DPOINT a, b; a.x = data->maxX; b.x = data->minX; if (data->mode & Y_BIT_SET) { a.y = data->maxY; b.y = data->minY; } else { a.y = 0.0; b.y = 0.0; } if (data->mode & Z_BIT_SET) { a.z = data->maxZ; b.z = data->minZ; } else { a.z = 0.0; b.z = 0.0; } return sqrt(data->pp_norm2(&a, &b)); } D_VECTOR *push_d_vector(double d, D_VECTOR *v) { if (v == NULL) { v = (D_VECTOR *) emalloc(sizeof(D_VECTOR)); v->size = v->max_size = 0; v->val = NULL; } v->size++; if (v->size > v->max_size) { /* (re)allocate v->val */ if (v->val == NULL) v->val = (double *) emalloc(v->size * sizeof(double)); else v->val = (double *) erealloc(v->val, v->size * sizeof(double)); v->max_size = v->size; } v->val[v->size - 1] = d; return v; } void free_d_vector(D_VECTOR *v) { if (v != NULL) { if (v->size > 0) efree(v->val); efree(v); } } int intercept_only(const DATA *d) { assert(d != NULL); return (d->n_X == 1 && d->colX[0] == 0); } double v_mu(double mu) { return mu; } double v_mu2(double mu) { return mu * mu; } double v_mu3(double mu) { return mu * mu * mu; } double v_bin(double mu) { return (mu * (1.0 - mu)); } double v_identity(double mu) { return 1.0; } gstat/src/mapio.h0000644000176200001440000001133113777370515013457 0ustar liggesusers#ifndef MAPIO_H /* avoid multiple inclusion */ #define MAPIO_H #ifdef HAVE_LIBGDAL # include "gdal.h" #endif /*! \file mapio.h \brief functions for reading and writing grid map in several formats */ /*! type of grid map format */ typedef enum { MT_UNKNOWN = 0, MT_CSF, /*!< PCRaster format (binary), API in csf directory */ MT_GDAL, /*!< GDAL format */ MT_ARCGRID, /*!< ArcInfo gridfile, gridascii (ascii) or gridfloat (binary) */ MT_IDRISI, /*!< Idrisi 32image file, ascii or binary */ MT_GNUPLOT, /*!< binary gnuplot 2d matrix format (cannot handle MV's) */ MT_T2, /*!< MIKE SHE ``T2'' 2d grid map format (www.dhi.dk) */ MT_ERMAPPER, /*!< ER-Mapper V5.0+ dataset with a single image channel */ MT_GRASS, /*!< Grass raster format, uses grass' gis library */ MT_GMT, /*!< GMT Grid format, uses NetCDF library */ MT_SURFER, /*!< Surfer DSAA (ascii grid) format */ MT_GSLIB /*!< GSLIB grid format (only a 2D subset) */ } MAPTYPE; /*! ER-Mapper celltypes used for read/write_binary */ typedef enum { CT_NONE = 0, CT_UNKNOWN = 1, CT_UINT8 = 2, CT_UINT16 = 3, CT_UINT32 = 4, CT_INT8 = 5, CT_INT16 = 6, CT_INT32 = 7, CT_IEEE4 = 8, CT_IEEE8 = 9 } CellType; #define UINT8 unsigned char #define UINT16 unsigned short int #define UINT32 unsigned long int #define INT8 char #define INT16 short int #define INT32 long int #define IEEE4 float #define IEEE8 double typedef enum { READ_ONLY = 0, WRITE_ONLY = 1 } MAP_READ_STATUS; /*! structure to hold grid map information */ typedef struct gridmap { MAPTYPE type; /*!< type of grid map */ MAP_READ_STATUS status; /*! READ_ONLY or WRITE_ONLY */ const char *filename; /*!< name (or base name) of grid map */ char *history, /*!< only used for CSF maps */ *description; /*!< only used for some maps */ unsigned int rows, /*!< number of rows in map */ cols, /*!< number of colums in map */ base_size, /*!< size of malloced area (cells), in case of blocked allocation */ current_row, /*!< current row, if reading/writing is row-wise */ *first_time_row; /*!< have we been at this row before? */ CellType celltype; /*!< cell type */ int is_binary, /*!< is this a binary map format */ swap_buf; /*!< swap contents of base buffer? */ double x_ul, /*!< x-coordinate upper left corner of map area */ y_ul, /*!< y-coordinate of upper left corner of map area */ cellsizex, /*!< size of grid cells in x-direction */ cellsizey; /*!< size of grid cells in y-direction */ float cellmin, /*!< minimum value of grid map */ cellmax, /*!< maximum value of grid map */ misval; /*!< missing value flag (if present) */ float **grid, /*!< 2d matrix holding the values (pointer array) */ *base; /*!< base pointer to malloc'ed or mmap'ed area */ void *CSF_MAP; /*!< cast to MAP * */ #ifdef HAVE_LIBGDAL GDALDatasetH hDataset; GDALDriverH hDriver; double *GeoTransform; #endif struct gridmap * (*write)(struct gridmap *m); /*!< write & close a map */ void (*read_row)(struct gridmap *m, float *buf, unsigned int row); void (*write_row)(struct gridmap *m, float *buf, unsigned int row); /* see mapio.c remark around #define CSF_ROWWISE for the last two */ } GRIDMAP; #define SQUARECELLSIZE(map) ((map->cellsizex != map->cellsizey ? \ ErrMsg(ER_IMPOSVAL, "cannot deal with non-square cells"), 0.0 : \ map->cellsizex)) GRIDMAP *map_read(GRIDMAP *m); int map_cell_is_mv(GRIDMAP *m, unsigned int row, unsigned int col); float map_get_cell(GRIDMAP *m, unsigned int row, unsigned int col); int map_put_cell(GRIDMAP *m, unsigned int row, unsigned int col, float value); int map_xy2rowcol(GRIDMAP *m, double x, double y, unsigned int *row, unsigned int *col); int map_rowcol2xy(GRIDMAP *m, unsigned int row, unsigned int col, double *x, double *y); GRIDMAP *map_dup(const char *fname, GRIDMAP *m); GRIDMAP *new_map(MAP_READ_STATUS status); void map_free(GRIDMAP *m); GRIDMAP *map_switch_type(GRIDMAP *in, MAPTYPE type); void map_name_nr(GRIDMAP *mask, const char *base, char *name, int nr, int max); int map_equal(GRIDMAP *a, GRIDMAP *b); #endif gstat/src/userio.c0000644000176200001440000000620514127262566013653 0ustar liggesusers/* * userio.c: i/o routines for error, warning, log and progress messages */ #include #include "R.h" #include "defs.h" #include "debug.h" #include "utils.h" #include "s.h" #include "userio.h" static const char *error_messages[MAX_ERRNO+1] = { /* 0 */ "%s", /* 1 */ "bug in function `%s'", /* 2 */ "variable not set: %s", /* 3 */ "variable outside valid range: %s", /* 4 */ "value not allowed for: %s", /* 5 */ "no filename set %s", /* 6 */ "write failed on file `%s'", /* 7 */ "read failed on file `%s'", /* 9 */ "cannot read real value from `%s'", /* 9 */ "cannot read integer from `%s'", /* 10 */ "syntax error: %s", /* 11 */ "illegal option or missing argument on `%s'", /* 12 */ "domain (math) error on `%s'", /* 13 */ "out of dynamic memory (try local kriging?)", /* 14 */ "i/o error: %s", /* 15 */ "no command file%s", /* 16 */ "%s user interface not compiled in this version", /* 17 */ "writing to pipe `%s' failed", /* 18 */ "reading from pipe `%s' failed", /* 19 */ "function call prevented by secure mode%s" }; /* * error handling function -- print message and error to string, and * call error message handler. */ void gstat_error(char *fname, int line, enum Gstat_errno err_nr, const char *msg) { assert(err_nr <= MAX_ERRNO); if (DEBUG_DUMP || err_nr == ER_NULL) /* print file&line */ Rprintf("(%s, line %d)", fname, line); if (err_nr == ER_NULL) error("NULL error: this indicates a bug, please consider reporting this\n"); if (msg == NULL) error(" message: indicating a software bug, please report\n"); else error(error_messages[err_nr], msg); return; } /* message() calls for messages preceding a call to ErrMsg() */ void message(char *fmt, ...) { va_list args; /* char *buf = NULL; */ char w[ERROR_BUFFER_SIZE]; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rprintf("%s", w); } /* print a warning message to string, and call warning message handler */ void pr_warning(char *fmt, ...) { va_list args; char w[ERROR_BUFFER_SIZE]; if (DEBUG_SILENT) return; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); warning("%s\n", w); } void printlog(const char *fmt, ...) { va_list args; char w[ERROR_BUFFER_SIZE]; if (DEBUG_SILENT) return; w[0] = '\0'; va_start(args, fmt); vsnprintf(w, ERROR_BUFFER_SIZE, fmt, args); va_end(args); Rprintf("%s", w); } void print_progress(unsigned int current, unsigned int total) { static int perc_last = -1, sec_last = -1; int perc, sec; static time_t start; R_CheckUserInterrupt(); /* allow for user interrupt */ if (total <= 0 || DEBUG_SILENT || ! do_print_progress) return; if (sec_last == -1) { start = time(NULL); sec_last = 0; } perc = floor(100.0 * current / total); if (perc != perc_last) { /* another percentage -> calculate time: */ if (current == total) { /* 100% done, reset: */ Rprintf("\r%3d%% done\n", 100); perc_last = sec_last = -1; } else { sec = difftime(time(NULL), start); if (sec != sec_last) { /* another second -- don't print too often */ Rprintf("\r%3d%% done", perc); perc_last = perc; sec_last = sec; } } } } gstat/src/getest.c0000644000176200001440000004127113777370515013646 0ustar liggesusers/* * getest.c: choose the predicion function at one prediction location */ #include #include #include #include #include #include "defs.h" #include "data.h" #include "utils.h" #include "mapio.h" #include "userio.h" #include "debug.h" #include "vario.h" #include "sem.h" #include "fit.h" #include "glvars.h" #include "mtrx.h" #include "lm.h" #include "gls.h" #include "sim.h" #include "msim.h" #include "block.h" #include "getest.h" static void est_quantile_div(DATA *data, double *est, int div); static void est_skew_kurt(DATA *data, double *est); static double inverse_dist(DATA *data, DPOINT *where, double idPow); static void save_variogram_parameters(VARIOGRAM *v); static void reset_variogram_parameters(VARIOGRAM *v); static double sample_mean(double *list, int n); static double sample_var(double *list, double mean, int n); static double sample_std(double *list, double mean, int n); static double est_quant(double *list, double p, int n); static int CDECL d_cmp(const double *a, const double *b); static double *vgm_pars = NULL; void get_est(DATA **data, METHOD method, DPOINT *where, double *est) { /* * given all data[i]->sel, get_est returns one or more values to *est, * according to the method of calculation set in *method * sel must be not NULL, where contains the location of the estimate * PRE: data, where, est; * USES: several estimation routines. */ DPOINT *block = NULL; VARIOGRAM *v; int i, j, n_vars, n_sel, *is_pt; double *X_ori = NULL, *local_sim; enum GLS_WHAT gls_mode = GLS_BLUP; const double *sim = NULL; /* return value of cond_sim() */ for (i = 0; i < get_n_outputs(); i++) set_mv_double(&est[i]); block = get_block_p(); if (get_mode() == MODE_NSP) ErrMsg(ER_IMPOSVAL, "Getest(): mode not specified"); if (block->x > 0.0 || block->y > 0.0 || block->z > 0.0 || get_data_area()) SET_BLOCK(where); else SET_POINT(where); n_vars = get_n_vars(); if (get_mode() == STRATIFY && (where->u.stratum < 0 || where->u.stratum >= n_vars)) return; local_sim = (double *) emalloc(n_vars * sizeof(double)); is_pt = (int *) emalloc(n_vars * sizeof(int)); for (i = 0; i < n_vars; i++) { set_mv_double(&(local_sim[i])); is_pt[i] = 0; } if (DEBUG_COV) { printlog("we're at location X: %g Y: %g Z: %g\n", where->x, where->y, where->z); if (IS_BLOCK(where)) { if (get_data_area()) printlog("block set in area()\n"); else printlog("block size: dx: %g dy: %g dz: %g\n", block->x, block->y, block->z); } else printlog("zero block size\n"); if (get_mode() == STRATIFY) printlog("stratum: %d\n", where->u.stratum); } switch (method) { case DIV: /* BREAKTHROUGH */ case MED: if (get_mode() == STRATIFY) est_quantile_div(data[where->u.stratum], est, method == DIV); else for (i = 0; i < n_vars; i++) est_quantile_div(data[i], &(est[2*i]), method == DIV); break; case SKEW: if (get_mode() == STRATIFY) est_skew_kurt(data[where->u.stratum], est); else for (i = 0; i < n_vars; i++) est_skew_kurt(data[i], &(est[2*i])); break; case IDW: if (gl_idp < 0.0) ErrMsg(ER_RANGE, "idp must be non-negative"); if (get_mode() == STRATIFY) { if (data[where->u.stratum]->n_sel > 0) est[0] = inverse_dist(data[where->u.stratum], where, gl_idp); } else { for (i = 0; i < n_vars; i++) if (data[i]->n_sel > 0) est[2 * i] = inverse_dist(data[i], where, gl_idp); } break; case LSLM: if (n_variograms_set()) { switch(get_mode()) { case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) gls(&data[i], 1, GLS_BLUE, where, &(est[2 * i])); where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; if (data[where->u.stratum]->n_sel > 0) { where->X += where->u.stratum; /* strictly unnecessary */ gls(&data[where->u.stratum], 1, GLS_BLUE, where, est); } where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: gls(data, n_vars, GLS_BLUE, where, est); break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } } else { switch(get_mode()) { case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; if (data[where->u.stratum]->n_sel > 0) pred_lm(&data[where->u.stratum], 1, where, est); where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: pred_lm(data, n_vars, where, est); break; case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) { pred_lm(&data[i], 1, where, &(est[2*i])); where->X += data[i]->n_X; } } where->X = X_ori; /* and put back */ break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } } /* else */ break; case SKR: /* BREAK THROUGH (SK handled in gls()) */ case OKR: /* BREAK THROUGH: (OK is special case of UK) */ case UKR: if (method == SKR) gls_mode = GLS_BLP; else gls_mode = GLS_BLUP; switch (get_mode()) { case SIMPLE: X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { gls(&data[i], 1, gls_mode, where, &(est[2 * i])); where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; case STRATIFY: X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; gls(&data[where->u.stratum], 1, gls_mode, where, est); where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: gls(data, n_vars, gls_mode, where, est); break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } if (gl_order) /* order relation violations: */ correct_orv(est, n_vars, gl_order); break; case GSI: /* BREAK TRHOUGH: */ case ISI: switch (get_mode()) { case SIMPLE: /* estimates go to est[0+1],est[2+3],... */ X_ori = where->X; /* remember... */ for (i = 0; i < gl_nsim; i++) { restore_data_sel(data, i, n_vars); set_beta(data, i, n_vars, method); for (j = 0; j < n_vars; j++) { /* estimate or update: */ if (i == 0) /* estimate */ gls(&data[j], 1, data[j]->n_sel < gl_n_uk ? GLS_BLP : GLS_BLUP, where, &(est[2*j])); else /* update */ gls(&data[j], 1, UPDATE, where, &(est[2*j])); /* new simulation: */ if (gl_order <= 1) { sim = cond_sim(&(est[2*j]), 1, method, &(is_pt[j]), gl_order); /* put data from simulation i; */ local_sim[j] = sim[0]; } where->X += data[j]->n_X; } where->X = X_ori; /* reset */ if (gl_order > 1) { /* 2,3 if pdf, 4 if cdf: */ sim = cond_sim(est, n_vars, method, is_pt, gl_order); for (j = 0; j < n_vars; j++) local_sim[j] = sim[j]; } save_sim(data, where, i, n_vars, local_sim, is_pt); } X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (! is_pt[i]) { where->attr = est[2 * i] = local_sim[i]; /* last simulation */ push_point(data[i], where); } else data[i]->nsim_at_data++; where->X += data[i]->n_X; } where->X = X_ori; /* reset */ break; case STRATIFY: /* estimate goes to est[0] and est[1] */ X_ori = where->X; /* remember... */ for (i = 0; i < where->u.stratum; i++) where->X += data[i]->n_X; for (i = 0; i < gl_nsim; i++) { /* load data from simulation i; */ restore_data_sel(&data[where->u.stratum], i, 0); set_beta(&data[where->u.stratum], i, 0, method); if (i == 0) /* estimate: */ gls(&data[where->u.stratum], 1, data[where->u.stratum]->n_sel < gl_n_uk ? GLS_BLP : GLS_BLUP, where, est); else /* update */ gls(&data[where->u.stratum], 1, UPDATE, where, est); sim = cond_sim(est, 1, method, is_pt, gl_order); /* save data from simulation i; */ save_sim_strat(data[where->u.stratum], where, i, sim[0], is_pt[0]); } /* store & push */ if (! is_pt[0]) { where->attr = est[0] = sim[0]; /* last simulation */ push_point(data[where->u.stratum], where); } else data[where->u.stratum]->nsim_at_data++; where->X = X_ori; /* and put back */ break; case MULTIVARIABLE: for (i = 0, n_sel = 0; i < n_vars; i++) n_sel += data[i]->n_sel; if (n_sel < gl_n_uk) gls_mode = GLS_BLP; else gls_mode = GLS_BLUP; for (i = 0; i < gl_nsim; i++) { /* load data from simulation i; */ restore_data_sel(data, i, n_vars); set_beta(data, i, n_vars, method); /* estimate or update: */ if (i == 0) gls(data, n_vars, gls_mode, where, est); else gls(data, n_vars, UPDATE, where, est); /* new simulation: */ sim = cond_sim(est, n_vars, method, is_pt, gl_order); /* put data from simulation i; */ save_sim(data, where, i, n_vars, sim, is_pt); } X_ori = where->X; /* remember... */ for (i = 0; i < n_vars; i++) { if (! is_pt[i]) { est[2 * i] = where->attr = sim[i]; /* last simulation */ push_point(data[i], where); } else data[i]->nsim_at_data++; where->X += data[i]->n_X; } where->X = X_ori; /* and put back */ break; default: ErrMsg(ER_IMPOSVAL, "Getest(): wrong mode"); break; } /* switch (get_mode()) */ for (i = 0; i < n_vars; i++) set_mv_double(&(est[2 * i + 1])); for (i = 2 * n_vars; i < get_n_outputs(); i++) set_mv_double(&(est[i])); /* print_sim(); */ break; case NRS: if (get_mode() != STRATIFY) { for (i = 0; i < n_vars; i++) { est[2 * i] = (double) data[i]->n_sel; est[2 * i + 1] = (double) data[i]->oct_filled; } } else { est[0] = (double) data[where->u.stratum]->n_sel; est[1] = (double) data[where->u.stratum]->oct_filled; } break; case SPREAD: if (get_mode() == STRATIFY) { if (data[where->u.stratum]->n_sel > 0) { if (data[where->u.stratum]->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "getest() needs distances"); n_sel = data[where->u.stratum]->n_sel; est[0] = sqrt(data[where->u.stratum]->sel[0]->u.dist2); est[1] = sqrt(data[where->u.stratum]->sel[n_sel - 1]->u.dist2); } } else { for (i = 0; i < n_vars; i++) { if (data[i]->n_sel > 0) { if (data[i]->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "getest() needs distances"); n_sel = data[i]->n_sel; est[2 * i] = sqrt(data[i]->sel[0]->u.dist2); est[2 * i + 1] = sqrt(data[i]->sel[n_sel - 1]->u.dist2); } } } break; case LSEM: v = get_vgm(LTI(0,0)); assert(v); v->id1 = v->id2 = v->id = 0; v->ev->evt = SEMIVARIOGRAM; if (data[0]->is_residual == 0) data[0]->is_residual = 1; /* !! */ v->ev->recalc = 1; calc_variogram(v, NULL); if (gl_fit) { v->ev->refit = 1; v->ev->fit = gl_fit; save_variogram_parameters(v); fit_variogram(v); /* write back locally fitted variogram model parameters: */ for (i = j = 0; i < MIN(get_n_vars(), v->n_models); i++) { est[2 * i + 0] = v->part[i].sill; est[2 * i + 1] = v->part[i].range[0]; j += 2; } if (j < get_n_vars()) est[j] = 1.0 * v->fit_is_singular; reset_variogram_parameters(v); update_variogram(v); /* not sure if this is needed */ } else { /* write back locally estimated sample variogram values: */ for (i = 0; i < MIN(get_n_vars(), v->ev->n_est); i++) { est[2 * i + 0] = v->ev->gamma[i]; est[2 * i + 1] = 1.0 * v->ev->nh[i]; } } break; case NSP: /* FALLTHROUGH: */ default: ErrMsg(ER_IMPOSVAL, "getest(): method not specified"); } /* switch */ efree(local_sim); efree(is_pt); return; } static void est_quantile_div(DATA *data, double *est, int div) { static double *list = NULL; static int i, size = 0; double mod = -9999.0; int n, run, longest_run = 0; if (data->n_sel > size) list = (double *) erealloc(list, (size = data->n_sel) * sizeof(double)); for (i = 0; i < data->n_sel; i++) list[i] = data->sel[i]->attr; qsort(list, (size_t) data->n_sel, sizeof(double), (int CDECL (*)(const void *, const void *)) d_cmp); if (div) { /* get diversity and modus in sel: */ n = data->n_sel; for (i = 0; i < data->n_sel - 2; i += run) { run = 1; while (i + run < data->n_sel && list[i] == list[i + run]) { run++; n--; } if (run > longest_run) { longest_run = run; mod = list[i]; } } est[0] = 1.0 * n; est[1] = mod; } else { if (data->n_sel < 2) return; if (gl_quantile == 0.5) est[0] = est[1] = est_quant(list, gl_quantile, data->n_sel); else { est[0] = est_quant(list, gl_quantile, data->n_sel); est[1] = est_quant(list, 1.0 - gl_quantile, data->n_sel); } } return; } static void est_skew_kurt(DATA *data, double *est) { static double *list = NULL; double mean, std, skewness = 0.0, kurtosis = 0.0, d; static int i, size = 0; if (data->n_sel <= 1) /* need at least 2 for variance */ return; if (data->n_sel > size) list = (double *) erealloc(list, (size = data->n_sel) * sizeof(double)); for (i = 0; i < data->n_sel; i++) list[i] = data->sel[i]->attr; mean = sample_mean(list, data->n_sel); std = sample_std(list, mean, data->n_sel); for (i = 0; i < data->n_sel; i++) { d = (data->sel[i]->attr - mean)/std; skewness += pow(d, 3.0); kurtosis += pow(d, 4.0); } est[0] = skewness/data->n_sel; est[1] = kurtosis/data->n_sel; } static double inverse_dist(DATA *data, DPOINT *where, double idPow) { int i, j; double sumweights, sumvals, value, weight, dist2; static DATA *blockd = NULL; if (data->n_sel <= 0) ErrMsg(ER_IMPOSVAL, "zero neighbourhood in inverse_dist()"); if (data->n_sel == 1) return data->sel[0]->attr; blockd = block_discr(blockd, get_block_p(), where); for (i = 0, value = 0.0; i < blockd->n_list; i++) { for (j = 0, sumweights = sumvals = 0.0; j < data->n_sel; j++) { dist2 = data->pp_norm2(data->sel[j], blockd->list[i]); if (dist2 == 0.0) { sumvals = data->sel[j]->attr; sumweights = 1.0; j = data->n_sel; /* break j loop */ } else { if (idPow == 2.0) weight = 1.0 / dist2; else weight = pow(dist2, -0.5 * idPow); sumweights += weight; sumvals += weight * data->sel[j]->attr; } } value += blockd->list[i]->u.weight * sumvals/sumweights; } return value; } void save_variogram_parameters(VARIOGRAM *v) { int i; if (vgm_pars == NULL) vgm_pars = (double *) emalloc(3 * v->n_models * sizeof(double)); for (i = 0; i < v->n_models; i++) { vgm_pars[3 * i + 0] = v->part[i].sill; vgm_pars[3 * i + 1] = v->part[i].range[0]; vgm_pars[3 * i + 2] = v->part[i].range[1]; } } void reset_variogram_parameters(VARIOGRAM *v) { int i; for (i = 0; i < v->n_models; i++) { v->part[i].sill = vgm_pars[3 * i + 0]; v->part[i].range[0] = vgm_pars[3 * i + 1]; v->part[i].range[1] = vgm_pars[3 * i + 2]; } v->fit_is_singular = 0; } static double sample_mean(double *list, int n) { int i; double mn = 0.0; if (list == NULL) ErrMsg(ER_NULL, "sample_mean()"); if (n == 0) ErrMsg(ER_RANGE, "sample_mean(): no values"); for (i = 0; i < n; i++) mn += list[i]; return mn/(1.0 * n); } static double sample_var(double *list, double mean, int n) { int i; double var = 0.0; if (list == NULL) ErrMsg(ER_NULL, "sample_var()"); if (n <= 1 || list == NULL) ErrMsg(ER_RANGE, "sample_var(): <= 1 values"); for (i = 0; i < n; i++) var += SQR(list[i] - mean); return (var / (n - 1.0)); } static double sample_std(double *list, double mean, int n) { return sqrt(sample_var(list, mean, n)); } static double est_quant(double *list, double p, int n) { /* * function returns the value of the p-th quantile * of the ordered list *list, row exists from list[0]..list[length-1], * p is in [0..1]; * a missing value is generated when the quantile lies not within * the valid data range, and is undetermined therefore */ double order, where; int below, above; if (n < 2) ErrMsg(ER_RANGE, "est_quant(): < 2 obs."); if (p < 0.0 || p > 1.0) ErrMsg(ER_RANGE, "can't calculate quantile outside [0,1]"); order = p * (n - 1); /* order = n * (p * n)/(n + 1); */ below = (int) floor(order); /* the index below order */ if (below < 0) return list[0]; above = below + 1; /* the index above order */ if (above >= n) return list[n - 1]; where = order - below; return (1 - where) * list[below] + where * list[above]; } int CDECL d_cmp(const double *a, const double *b) { if (*a < *b) return -1; if (*a > *b) return 1; return 0; } gstat/src/sim.c0000644000176200001440000001631014232776373013136 0ustar liggesusers/* * sim.c: functions, special to (un)conditional simulation */ #include #include #include "mtrx.h" #include "defs.h" #include "debug.h" #include "glvars.h" /* gl_nsim */ #include "userio.h" #include "data.h" #include "gls.h" #include "utils.h" #include "lm.h" #include "s.h" /* r_uniform(), r_normal() */ #include "sim.h" static void simulate_mvn(const double *est, VEC *result, const int *is_datum); static void simulate_uniform(double *est, VEC *result, int orc); static unsigned int n_orvc = 0, n_total = 0; const double *cond_sim(double *est, int dim, METHOD m, int *is_datum, int orc) { /* * distributions come as { est1, var1, est2, var2,..., cov1-1,.. } * and return as { sim-1, sim-2, sim-3, ..., sim-dim } */ int i; static VEC *result = VNULL; static double *sim = NULL; static int max_dim = -1; assert(dim > 0); assert(est != NULL); assert(dim >= 1); assert(is_simulation(m)); assert(est != NULL); assert(is_datum != NULL); if (dim > max_dim) { sim = (double *) erealloc(sim, dim * sizeof(double)); max_dim = dim; } result = v_resize(result, dim); for (i = 0; i < dim; i++) is_datum[i] = (fabs(est[2 * i + 1]) < gl_zero); /* `zero' variance */ if (m == GSI) /* generate zero mean correlated noise: */ simulate_mvn(est, result, is_datum); else { /* m == IS */ correct_orv(est, dim, orc); /* affects est */ simulate_uniform(est, result, orc); } for (i = 0; i < dim; i++) sim[i] = result->ve[i]; return sim; } static void simulate_mvn(const double *est, VEC *result, const int *is_datum) { static MAT *M = MNULL; static VEC *ind = VNULL, *sim = VNULL; static PERM *p = PNULL; int i, j, info; volatile int dim; p = px_resize(p, result->dim); for (i = dim = 0; i < result->dim; i++) { if (is_datum[i] == 0) /* non-``zero'' variance -- do simulate */ p->pe[dim++] = i; /* index of simulation point */ } p->size = dim; /* * now dim is the number of pos. variances, * p points their position */ if (dim > 0) { /* there is something to be simulated */ M = m_resize(M, dim, dim); for (i = 0; i < dim; i++) { ME(M, i, i) = est[2 * p->pe[i] + 1]; /* variances on diagonal */ for (j = 0; j < i; j++) /* off-diagonal: covariances */ ME(M, j, i) = ME(M, i, j) = est[2 * result->dim + LTI2(p->pe[j],p->pe[i])]; } if (DEBUG_COV) { printlog("# simulation covariance matrix:\n"); m_logoutput(M); } /* decompose M: */ M = CHfactor(M, PNULL, &info); /* LT is zero */ if (info != 0) pr_warning("singular simulation covariance matrix"); if (DEBUG_COV) { printlog("# decomposed error covariance matrix, with zero LT:\n"); m_logoutput(M); } /* make ind a iid N(0,1) vector */ ind = v_resize(ind, dim); for (i = 0; i < dim; i++) ind->ve[i] = r_normal(); /* generate N(0,1) independent samples */ /* make MVN */ sim = v_resize(sim, dim); sim = vm_mlt(M, ind, sim); /* create zero mean correlated noise */ if (DEBUG_COV) { printlog("# correlated noise vector:\n"); v_logoutput(sim); } } /* fill result vector: */ for (i = j = 0; i < result->dim; i++) { if (j < dim && i == p->pe[j]) { /* simulated */ result->ve[i] = est[2 * i] + sim->ve[j]; j++; } else result->ve[i] = est[2 * i]; } if (DEBUG_COV) { printlog("\n# simulated values:\n"); if (is_datum != NULL) { for (i = 0; i < result->dim; i++) { printlog("%g # (%s)\n", result->ve[i], is_datum[i] ? "datum point" : "simulated"); } } else { for (i = 0; i < result->dim; i++) printlog(" %g", result->ve[i]); printlog("\n"); } } } static void simulate_uniform(double *est, VEC *result, int orc) { /* * depending on gl_is_pdf, assume indicative (1) or cumulative (0) * densitiy function in est; * sum of all estimates should equal about 1, which is not * the case when cumulative, when last estimate should be * close to 1. */ int i, hit; double cdf, rn; static double *pdf = NULL; if (result->dim == 1) { result->ve[0] = 1.0 * (r_uniform() < est[0]); if (DEBUG_ORDER && (est[0] < 0.0 || est[0] > 1.0)) pr_warning("order relation violation: P %g not in [0,1]\n", est[0]); return; } if (pdf == NULL) pdf = (double *) emalloc(result->dim * sizeof(double)); for (i = 0; i < result->dim; i++) pdf[i] = est[2 * i]; /* local copy */ if (orc == 4) /* cumulative indicators: make raw pdf */ for (i = 1; i < result->dim; i++) pdf[i] -= pdf[i-1]; /* make pdf from cdf */ rn = r_uniform(); hit = 0; cdf = pdf[0]; while (rn > cdf) { hit++; if (hit < result->dim) cdf += pdf[hit]; else break; /* fix hit at this interval */ } /* hit now denotes the class in [ 0 ... dim ] in which rn falls */ for (i = 0; i < result->dim; i++) if (orc <= 3) result->ve[i] = (hit == i ? 1.0 : 0.0); else result->ve[i] = (hit <= i ? 1.0 : 0.0); } void correct_orv(double *est, int n_vars, int orc) { /* * does ``order relation violations corrections'' (acc. to GSLIB pages 77-81); * if IS_PDF: correct < 0, > 1, sum <= 1; * if not IS_PDF: average upward/downward correction as in GSLIB's ik3d. */ int i; static int violation = -1, size = -1; static double *down = NULL, *up = NULL, *ori = NULL; double sum = 0.0; if (down == NULL || size < n_vars) { down = (double *) erealloc(down, n_vars * sizeof(double)); up = (double *) erealloc(up, n_vars * sizeof(double)); ori = (double *) erealloc(ori, n_vars * sizeof(double)); size = n_vars; } /* save original */ for (i = 0; i < n_vars; i++) ori[i] = est[2 * i]; if (orc <= 3) { for (i = 0; i < n_vars; i++) { est[2 * i] = MAX(est[2 * i], 0.0); est[2 * i] = MIN(est[2 * i], 1.0); sum += est[2 * i]; } if (orc == 3 && sum != 1.0) { if (DEBUG_ORDER) printlog("sum!=1: "); for (i = 0; i < n_vars; i++) est[2 * i] /= sum; } else if (orc == 2 && sum > 1.0) { if (DEBUG_ORDER) printlog("sum>1: "); for (i = 0; i < n_vars; i++) est[2 * i] /= sum; } } else { /* orc == 4: cdf; do the GSLIB upward/downward averaging: */ /* upward correction: */ up[0] = MAX(0.0, MIN(1.0, est[0])); for (i = 1; i < n_vars; i++) /* don't go down && stay < 1 */ up[i] = MAX(up[i-1], MIN(1.0, est[2 * i])); /* downward correction: */ down[n_vars-1] = MAX(0.0, MIN(1.0, est[2 * (n_vars-1)])); for (i = n_vars - 2; i >= 0; i--) /* don't go up && stay > 0 */ down[i] = MIN(down[i+1], MAX(0.0, est[2 * i])); /* average upward/downward: */ for (i = 0; i < n_vars; i++) est[2 * i] = 0.5 * (down[i] + up[i]); } if (n_total == 0) { /* first time */ if (DEBUG_ORDER) printlog("order relation violation:\n(before correction) --> (after correction)\n"); } n_total++; for (i = violation = 0; !violation && i < n_vars; i++) if (ori[i] != est[2 * i]) violation = 1; n_orvc += violation; if (DEBUG_ORDER) { if (violation) { /* print the order correction */ for (i = 0; i < n_vars; i++) printlog("%g ", ori[i]); printlog("--> "); for (i = 0; i < n_vars; i++) printlog("%g ", est[2 * i]); printlog("\n"); } } } void print_orvc(void) { if (n_total > 0) { if (n_orvc > 0) printlog( "number of corrected order relation violations: %u of %u (%.1f%%)\n", n_orvc, n_total, (100.0 * n_orvc)/n_total); else printlog("no order relation violations\n"); n_orvc = 0; n_total = 0; } } gstat/src/block.c0000644000176200001440000001662013777370515013445 0ustar liggesusers/* * block.c: calculate block discretization at a prediction location */ #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "glvars.h" #include "block.h" /* Gaussian quadrature adapted from Carr & Palmer, MG 25(5), p. 514: gauss[4]: -0.8611363116, -0.3399810436, 0.3399810436, 0.8611363116 gauss_w[4]: 0.3478548452, 0.6521451548, 0.6521451548, 0.3478548452 both divided by 2 */ static double gauss[4] = { -0.4305681558, -0.1699905218, 0.1699905218, 0.4305681558 }; double gauss_w[4] = { 0.1739274226, 0.3260725774, 0.3260725774, 0.1739274226 }; int reset_anyway = 0; void reset_block_discr(void) { reset_anyway = 1; } DATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where) { /* * Purpose : get locations that discretize the estimation area * Created by : Edzer J. Pebesma * Date : april 6th, 1992 * Modified : jan 13, 1993, june 3, 1993, june 23 1993 * Prerequisites : where; * the contents of block (if not NULL) may not change * during the run of the program: only once the full * discretisation is calculated. * Returns : DATA list with 1 point (x,y,z) or a list; * Side effects : dynamic memory (re)allocation for d; * uses IS_BLOCK(where) to determine whether point or block is needed; * discretisations is rectangular using dimensions of *block; * * only the x, y and z field are used for locations, * weights are put in the weight union. */ int i, k, l, m, ndim; int ndiscr = 0, restart = 0; /* * if restart != 0, block descretizations are re-calculated. */ /* * ndim: number of dimensions (x, y, z, ..?) in data * ndiscr: total number of points discretizing the block in this run * lastndiscr: number of discretizing points in last call * gl_nblockdiscr: number of points in each dimension in discretizing grid */ static double *dx = NULL, *dy = NULL, *dz = NULL; static double *weight = NULL; static int max = 0; DATA *area = NULL, **data; /* * d has the points of the discretization of the estimation area; * dx, dy, dz and weight are remembered in case blockdiscretization has not * changed */ if (IS_POINT(where) && d != NULL) { /* point shortcut */ d->list[0]->x = where->x; d->list[0]->y = where->y; d->list[0]->z = where->z; d->list[0]->u.weight = 1.0; /* weight */ d->n_list = 1; if (DEBUG_BLOCK) { printlog("block discretization (dist is weight):\n"); d->mode = X_BIT_SET | Y_BIT_SET | Z_BIT_SET; print_data_list(d); } return d; } /* * calculate the neccesary number of block discrimination points: */ ndim = 0; ndiscr = 1; if (IS_BLOCK(where)) { if ((area = get_data_area()) == NULL) { if (block->x > 0.0) ndim++; if (block->y > 0.0) ndim++; if (block->z > 0.0) ndim++; for (i = 0; i < ndim; i++) ndiscr *= gl_nblockdiscr; } else ndiscr = area->n_list; } if (area == NULL && ndiscr > max) { dx = (double *) erealloc(dx, ndiscr * sizeof(double)); dy = (double *) erealloc(dy, ndiscr * sizeof(double)); dz = (double *) erealloc(dz, ndiscr * sizeof(double)); weight = (double *) erealloc(weight, ndiscr * sizeof(double)); max = ndiscr; } /* * (re)allocate the memory neccesary: */ if (d == NULL) { /* allocate ndiscr: */ d = (DATA *) emalloc (sizeof(DATA)); init_one_data(d); assert(get_n_vars() > 0); data = get_gstat_data(); d->pp_norm2 = data[0]->pp_norm2; /* assign distance function */ d->what_is_u = U_ISWEIGHT; d->n_X = 0; d->colnx = d->colny = d->colnz = 1; d->list = (DPOINT **) emalloc(ndiscr * sizeof(DPOINT *)); for (i = 0; i < ndiscr; i++) d->list[i] = (DPOINT *) emalloc (sizeof(DPOINT)); d->n_max = d->n_list = ndiscr; restart = 1; } else if (ndiscr > d->n_max) { /* resize if n_max < ndiscr: */ d->list = (DPOINT **) erealloc(d->list, ndiscr * sizeof(DPOINT *)); for (i = d->n_max; i < ndiscr; i++) d->list[i] = (DPOINT *) emalloc (sizeof(DPOINT)); d->n_max = d->n_list = ndiscr; restart = 1; } else if (reset_anyway) { reset_anyway = 0; restart = 1; } if (restart && ndim > 0 && area == NULL) { /* set up block regular or Gaussian block discretisation */ i = 0; switch (ndim) { case 1: if (block->y > 0 || block->z > 0) ErrMsg(ER_IMPOSVAL, "block_discr(): block y and z dimensions must be 0"); if (gl_gauss) { for (k = 0; k < 4; k++) { dx[i] = block->x * gauss[k]; dy[i] = dz[i] = 0.0; weight[i] = gauss_w[k]; i++; } } else { for (k = 0; k < gl_nblockdiscr; k++) { dx[i] = block->x * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = dz[i] = 0.0; weight[i] = 1.0 / (1.0 * ndiscr); i++; } } break; case 2: if (block->z > 0) ErrMsg(ER_IMPOSVAL, "block_discr(): 2D block->z must be zero"); if (gl_gauss) { for (k = 0; k < 4; k++) { for (l = 0; l < 4; l++) { dx[i] = block->x * gauss[k]; dy[i] = block->y * gauss[l]; weight[i] = gauss_w[k] * gauss_w[l]; dz[i] = 0.0; i++; } /* for l */ } /* for k */ } else { for (k = 0; k < gl_nblockdiscr; k++) { for (l = 0; l < gl_nblockdiscr; l++) { dx[i] = block->x * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = block->y * (-0.5 + (1.0/gl_nblockdiscr) * (0.5 + l)); dz[i] = 0.0; weight[i] = 1.0 / (1.0 * ndiscr); i++; } /* for l */ } /* for k */ } break; case 3: if (gl_gauss) { for (k = 0; k < 4; k++) { for (l = 0; l < 4; l++) { for (m = 0; m < 4; m++) { dx[i] = block->x * gauss[k]; dy[i] = block->y * gauss[l]; dz[i] = block->z * gauss[m]; weight[i] = gauss_w[k] * gauss_w[l] * gauss_w[m]; i++; } /* for m */ } /* for l */ } /* for k */ } else { for (k = 0; k < gl_nblockdiscr; k++) { for (l = 0; l < gl_nblockdiscr; l++) { for (m = 0; m < gl_nblockdiscr; m++) { dx[i] = block->x * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + k)); dy[i] = block->y * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + l)); dz[i] = block->z * (-0.5+(1.0/gl_nblockdiscr) * (0.5 + m)); weight[i] = 1.0 / (1.0 * ndiscr); i++; } /* for m */ } /* for l */ } /* for k */ } break; default: ErrMsg(ER_IMPOSVAL, "block_discr()"); } /* switch */ if (i != ndiscr) /* silly check ! */ ErrMsg(ER_IMPOSVAL, "block_discr()"); } /* end if restart */ if (IS_BLOCK(where)) { if (area != NULL) { for (i = 0; i < ndiscr; i++) { d->list[i]->x = area->list[i]->x + where->x; d->list[i]->y = area->list[i]->y + where->y; d->list[i]->z = area->list[i]->z + where->z; if (area->colnvariance) d->list[i]->u.weight = area->list[i]->variance; else d->list[i]->u.weight = 1.0 / ndiscr; } } else { for (i = 0; i < ndiscr; i++) { d->list[i]->x = where->x - dx[i]; d->list[i]->y = where->y - dy[i]; d->list[i]->z = where->z - dz[i]; d->list[i]->u.weight = weight[i]; } } } else { /* where is point */ d->list[0]->x = where->x; d->list[0]->y = where->y; d->list[0]->z = where->z; d->list[0]->u.weight = 1.0; /* weight */ } d->n_list = ndiscr; if (DEBUG_BLOCK) { printlog("block discretization (dist is weight):\n"); d->mode = X_BIT_SET | Y_BIT_SET | Z_BIT_SET; print_data_list(d); } return d; } gstat/src/lm.h0000644000176200001440000000216613777370515012770 0ustar liggesusers#ifndef LM_H # define LM_H void pred_lm(DATA **data, int n_vars, DPOINT *where, double *est); void make_residuals_lm(DATA *d); double *make_ols(DATA *d); MAT *get_X(DATA **d, MAT *X, int nvars); MAT *get_X0(DATA **d, MAT *X0, DPOINT *where, int nvars); double calc_mu(const DATA *d, const DPOINT *pt); VEC *get_y(DATA **d, VEC *y, int nvars); int is_singular(MAT *X, double epsilon); typedef struct { VEC *beta, /* parameter vector */ *y, /* data vector */ *Xty, /* X'y */ *weights; /* weights in a WLS model: V-1, 1/sigma^2_i */ MAT *X, /* design matrix */ *Cov, /* covariance matrix of beta */ *Chol; /* Choleski decomposition of X'X or X'V-1X */ double MSErr, /* Mean Square Error */ MSReg, /* Mean Square due to regression */ SSErr, /* Sum of Squares error */ SSReg; /* Sum of Squares regression */ int dfE, /* degrees of freedom error */ dfReg, /* degrees of freedom regression */ is_singular, /* flag if X'X is singular */ has_intercept; /* model has intercept, J is part of X */ } LM ; LM *calc_lm(LM *lm); void logprint_lm(DATA *d, LM *lm); LM *init_lm(LM *lm); void free_lm(LM *lm); #endif /* LM_H */ gstat/src/fit.c0000644000176200001440000002125413777370515013134 0ustar liggesusers/* * fit.c: fit variogram model to experimental variograms; gnuplot fit driver */ #include #include /* getenv() */ #include /* strstr() */ #include /* fabs(), sqrt() */ #include /* Rprintf() */ #include "mtrx.h" #include "defs.h" #include "defaults.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "sem.h" #include "glvars.h" #include "reml.h" #include "lm.h" #include "fit.h" #define NEARLY_ZERO 1.0e-30 static void wls_fit(VARIOGRAM *vp); static double getSSErr(const VARIOGRAM *vp, PERM *p, LM *lm); static int fill_weights(const VARIOGRAM *vp, PERM *p, LM *lm); static int fit_GaussNewton(VARIOGRAM *vp, PERM *p, LM *lm, int iter, int *bounded); int fit_variogram(VARIOGRAM *v) { DATA **d = NULL; int i = 0; long n = 0; if (v->ev->refit == 0) return 0; if (v->ev->fit != NO_FIT && v->ev->fit != MIVQUE_FIT) { if (! v->ev->cloud) { while (n == 0 && i < v->ev->n_est) n += v->ev->nh[i++]; /* check if estimates exist */ if (n == 0) /* bad luck */ return 1; } else if (v->ev->n_est == 0) return 1; } if (v->ev->fit != NO_FIT) { if (v->ev->map) ErrMsg(ER_IMPOSVAL, "cannot fit model to variogram map"); for (i = 0; i < v->n_models; i++) if (v->part[i].sill == 0.0 && v->part[i].fit_sill != 0) v->part[i].sill = 1.0; /* avoid lot'o trouble */ } if (v->ev->fit == WLS_FIT_MOD && !is_variogram(v)) pr_warning("this fit method is not recommended for covariograms"); v->ev->direction.x = sin(gl_alpha * PI / 180.0) * cos(gl_beta * PI / 180.0); v->ev->direction.y = cos(gl_alpha * PI / 180.0) * cos(gl_beta * PI / 180.0); v->ev->direction.z = sin(gl_beta * PI / 180.0); switch (v->ev->fit) { case NO_FIT: break; case OLS_FIT: /* BREAKTHROUGH: */ case WLS_FIT: /* BREAKTHROUGH: */ case WLS_FIT_MOD: case WLS_NHH: wls_fit(v); break; case MIVQUE_FIT: if (v->id1 != v->id2) return 1; d = get_gstat_data(); reml_sills(d[v->id1], v); break; default: Rprintf("%d\n", v->ev->fit); ErrMsg(ER_IMPOSVAL, "fit_vgm(): value for fit not recognized or not implemented"); /* no default: force compile warning on missing option! */ } return 0; } static void wls_fit(VARIOGRAM *vp) { /* * non-linear iterative reweighted least squares fitting of variogram model to * sample variogram (..covariogram model to sample covariogram, cross, etc.) * all information necessary is contained in *vp. * * uses Marquardt-Levenberg algorithm; * the implementation follows gnuplot's fit.c */ static PERM *p = PNULL; int i, j, n_iter = 0, bounded = 0, timetostop; double SSErr, oldSSErr = DBL_MAX, step; LM *lm; p = px_resize(p, vp->ev->n_est); if (! vp->ev->cloud) { for (i = j = 0; i < (vp->ev->zero == ZERO_AVOID ? vp->ev->n_est-1 : vp->ev->n_est); i++) { if (vp->ev->nh[i] > 0) p->pe[j++] = i; } p->size = j; } lm = init_lm(NULL); /* oldSSErr = getSSErr(vp, p, lm); */ do { print_progress(n_iter, gl_iter); /* if (DEBUG_VGMFIT) printlog("%s: ", vp->descr); */ if ((vp->fit_is_singular = fit_GaussNewton(vp, p, lm, n_iter, &bounded))) { pr_warning("singular model in variogram fit"); print_progress(gl_iter, gl_iter); vp->SSErr = getSSErr(vp, p, lm); return; } update_variogram(vp); SSErr = getSSErr(vp, p, lm); /* we can't use lm->SSErr here since that's only in the X-filled-with-derivatives, not the true residuals */ step = oldSSErr - SSErr; if (SSErr > gl_zero) step /= SSErr; n_iter++; if (DEBUG_VGMFIT) printlog("after it. %d: SSErr %g->%g, step=%g (fit_limit %g%s)\n", n_iter, oldSSErr, SSErr, step, gl_fit_limit, bounded ? "; bounded" : ""); oldSSErr = SSErr; timetostop = (step < gl_fit_limit && step >= 0.0 && bounded == 0) || n_iter == gl_iter; } while (! timetostop); print_progress(gl_iter, gl_iter); if (n_iter == gl_iter) pr_warning("No convergence after %d iterations: try different initial values?", n_iter); if (DEBUG_VGMFIT) { printlog("# iterations: %d, SSErr %g, last step %g", n_iter, SSErr, step); if (step < 0.0) printlog(", last step was in the wrong direction.\n"); else printlog("\n"); } free_lm(lm); vp->SSErr = SSErr; return; } /* wls_fit */ static double getSSErr(const VARIOGRAM *vp, PERM *p, LM *lm) { int i; double x, y, z, dz, SSErr; /* if (fill_weights(vp, p, lm)) return 0.0; */ for (i = 0, SSErr = 0.0; i < p->size; i++) { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; /* fill y with current residuals: */ dz = vp->ev->gamma[p->pe[i]] - (is_variogram(vp) ? get_semivariance(vp, x, y, z) : get_covariance(vp, x, y, z)); if (lm->weights != NULL) SSErr += dz * dz * lm->weights->ve[i]; else SSErr += dz * dz; } return SSErr; } static int fit_GaussNewton(VARIOGRAM *vp, PERM *p, LM *lm, int iter, int *bounded) { double s = 0.0, x, y, z; int i, j, n_fit, model, fit_ranges = 0; IVEC *fit = NULL; VEC *start = NULL; if (p->size == 0) return 1; fit = iv_resize(fit, 2 * vp->n_models); /* index fit parameters: parameter fit->ive[j] corresponds to model i */ for (i = n_fit = 0; i < vp->n_models; i++) { if (vp->part[i].fit_sill) fit->ive[n_fit++] = i; if (vp->part[i].fit_range) { fit->ive[n_fit++] = i + vp->n_models; /* large -->> ranges */ fit_ranges = 1; } } if (n_fit == 0) { iv_free(fit); return 0; } fit = iv_resize(fit, n_fit); /* shrink to fit */ lm->X = m_resize(lm->X, p->size, n_fit); lm->y = v_resize(lm->y, p->size); start = v_resize(start, n_fit); for (i = 0; i < n_fit; i++) { if (fit->ive[i] < vp->n_models) { model = fit->ive[i]; start->ve[i] = vp->part[model].sill; } else { model = fit->ive[i] - vp->n_models; start->ve[i] = vp->part[model].range[0]; } } for (i = 0; i < p->size; i++) { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; /* fill y with current residuals: */ if (is_variogram(vp)) s = get_semivariance(vp, x, y, z); else s = get_covariance(vp, x, y, z); lm->y->ve[i] = vp->ev->gamma[p->pe[i]] - s; /* fill X: */ for (j = 0; j < n_fit; j++) { /* cols */ if (fit->ive[j] < vp->n_models) { model = fit->ive[j]; ME(lm->X, i, j) = (is_variogram(vp) ? UnitSemivariance(vp->part[model],x,y,z) : UnitCovariance(vp->part[model],x,y,z)); } else { model = fit->ive[j] - vp->n_models; ME(lm->X, i, j) = (is_variogram(vp) ? da_Semivariance(vp->part[model],x,y,z) : -da_Semivariance(vp->part[model],x,y,z)); } } } if (iter == 0 && fill_weights(vp, p, lm)) { iv_free(fit); v_free(start); return 1; } lm->has_intercept = 1; /* does not affect the fit */ lm = calc_lm(lm); /* solve WLS eqs. for beta */ if (DEBUG_FIT) { Rprintf("beta: "); v_logoutput(lm->beta); } if (lm->is_singular) { iv_free(fit); v_free(start); return 1; } if (fit_ranges) { s = v_norm2(lm->beta) / v_norm2(start); if (s > 0.2) { /* don't allow steps > 20% ---- */ sv_mlt(0.2 / s, lm->beta, lm->beta); *bounded = 1; } else *bounded = 0; /* a `free', voluntary step */ } else /* we're basically doing linear regression here: */ *bounded = 0; for (i = 0; i < n_fit; i++) { if (fit->ive[i] < vp->n_models) { model = fit->ive[i]; vp->part[model].sill = start->ve[i] + lm->beta->ve[i]; } else { model = fit->ive[i] - vp->n_models;; vp->part[model].range[0] = start->ve[i] + lm->beta->ve[i]; } } iv_free(fit); v_free(start); return 0; } static int fill_weights(const VARIOGRAM *vp, PERM *p, LM *lm) { double x, y, z, s; int i, retval = 0; if (vp->ev->fit == OLS_FIT || (vp->ev->cloud && vp->ev->fit == WLS_FIT)) { if (lm->weights != NULL) v_free(lm->weights); lm->weights = NULL; return 0; } lm->weights = v_resize(lm->weights, p->size); for (i = 0; i < p->size; i++) { if (vp->ev->fit == WLS_NHH) s = vp->ev->dist[p->pe[i]]; else { x = vp->ev->direction.x * vp->ev->dist[p->pe[i]]; y = vp->ev->direction.y * vp->ev->dist[p->pe[i]]; z = vp->ev->direction.z * vp->ev->dist[p->pe[i]]; s = get_semivariance(vp, x, y, z); } if (vp->ev->cloud) { lm->weights->ve[i] = 1.0; if (fabs(s) > NEARLY_ZERO) lm->weights->ve[i] /= s * s; else { pr_warning("infinite weight during fit"); retval = 1; break; } } else { /* no cloud: */ lm->weights->ve[i] = vp->ev->nh[p->pe[i]]; if (vp->ev->fit != WLS_FIT) { if (fabs(s) > NEARLY_ZERO) lm->weights->ve[i] /= (s * s); else { pr_warning("infinite weight during fit"); retval = 1; break; } } } /* else cloud */ } /* for i */ return retval; } gstat/src/direct.h0000644000176200001440000000022313777370515013622 0ustar liggesusersdouble valid_direction(DPOINT *a, DPOINT *b, int symmetric, const DATA *d); void set_direction_values(double a, double b, double t_h, double t_v); gstat/src/sim.h0000644000176200001440000000023213777370515013140 0ustar liggesusersconst double *cond_sim(double *est, int n_sim, METHOD m, int *is_pt, int orc); void correct_orv(double *est, int n_vars, int orc); void print_orvc(void); gstat/src/pqueue.c0000644000176200001440000001110513777370515013650 0ustar liggesusers/* * priority queue, Jan-Apr 1998 * * I did a net search one day, and found so many implementations of * priority queues that I decided to write my own. For the fun of it. * * This one has no limits and needs a generic (qsort-like) comparison * function for element comparison at initialisation. To enqueue an * unordered array of elements, elements are sorted with qsort(), before * they are merged into the ordered queue. Only pointers to the next * element are stored (so it's basically an ordered single linked list). */ #include #include #include #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "nsearch.h" #include "pqueue.h" static void enlarge_queue(QUEUE *q); static void enlarge_queue(QUEUE *q) { /* * don't use realloc() on `empty': all pointers to the * first element would have to be moved along with itself. */ int i; Q_ELEMENT *block; block = (Q_ELEMENT *) emalloc(Q_BUFFER_SIZE * sizeof(Q_ELEMENT)); for (i = 0; i < Q_BUFFER_SIZE - 1; i++) block[i].next = &(block[i+1]); block[Q_BUFFER_SIZE - 1].next = NULL; if (q->empty == NULL) q->empty = block; else q->empty->next = block; q->max_length += Q_BUFFER_SIZE; /* register block to free later on... */ q->blocks += 1; q->block = (Q_ELEMENT **) erealloc(q->block, q->blocks * sizeof(Q_ELEMENT *)); q->block[q->blocks - 1] = block; } QUEUE *init_queue(QUEUE *q, int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b)) { int i, j; if (q == NULL) { q = (QUEUE *) emalloc(sizeof(QUEUE)); q->max_length = q->blocks = 0; q->empty = NULL; q->block = NULL; q->cmp = cmp; enlarge_queue(q); } else { q->empty = q->block[0]; for (i = 0; i < q->blocks; i++) { for (j = 0; j < Q_BUFFER_SIZE - 1; j++) /* connect elements: */ q->block[i][j].next = &(q->block[i][j+1]); if (i < q->blocks - 1) /* connect elements between blocks: */ q->block[i][Q_BUFFER_SIZE - 1].next = &(q->block[i+1][0]); } q->block[q->blocks - 1][Q_BUFFER_SIZE - 1].next = NULL; } q->length = 0; q->head = NULL; return q; } void free_queue(QUEUE *q) { int i; if (q != NULL) { for (i = 0; i < q->blocks; i++) efree(q->block[i]); /* queue buffers */ if (q->block != NULL) efree(q->block); efree(q); } } static Q_ELEMENT *get_free(QUEUE *q) { Q_ELEMENT *e; if (q->empty->next == NULL) enlarge_queue(q); e = q->empty; q->empty = q->empty->next; return e; } void enqueue(QUEUE *q, QUEUE_NODE *el, int n) { /* * insert n elements in array el into the priority queue q */ Q_ELEMENT *e, *where, *next; int i = 0, p; if (q == NULL || el == NULL || n <= 0) ErrMsg(ER_NULL, "enqueue"); /* * first sort array el */ qsort(el, (size_t) n, sizeof(QUEUE_NODE), (int CDECL (*)(const void *,const void *)) q->cmp); /* * and then merge them with the priority queue q */ /* * find p, the number of elements in el[] that are smaller than * the first element in the queue, if any. * (Yes, we expect at least some of them to be closer than q->head) */ for (p = n; q->head != NULL && p > 0; p--) if (q->cmp(&(el[p-1]), &(q->head->el)) <= 0) break; /* out of this for loop */ /* * put these p elements in order at the queue head: */ for (i = p; i > 0; i--) { e = get_free(q); e->el = el[i-1]; e->next = q->head; q->head = e; } q->length += p; n -= p; /* * We might be done by now (n zero). * Process the remaining elements: */ where = q->head; /* starting point for insertion: */ next = where->next; /* the next element */ el += p; /* start of the remaining elements */ for (i = 0; i < n; i++) { e = get_free(q); /* get a free queue element */ e->el = el[i]; /* copy contents: */ /* * unless where is the last element, shift a position in the queue * when the element is larger than the insertion element e: */ while (next != NULL && q->cmp(&(e->el), &(next->el)) > 0) { where = next; next = where->next; } /* * now next points either to NULL or to the first element smaller * than or equal to e. So, insert e after where and before next: */ e->next = next; where->next = e; /* * the next element in el[] will should follow after e, * so shift where one position to start looking after e: */ where = e; } q->length += n; return; } QUEUE_NODE dequeue(QUEUE *q) { Q_ELEMENT *e; if (q->length == 0) ErrMsg(ER_NULL, "cannot dequeue empty queue"); e = q->head; /* get first queue element */ q->head = q->head->next; /* reset first to next */ e->next = q->empty; /* put the dequeued element in the empty queue */ q->empty = e; q->length--; return e->el; } gstat/src/gcdist.c0000644000176200001440000000256613777370515013634 0ustar liggesusers#include /* sin() etc */ #include #include #include #define POWDI(x,i) R_pow_di(x,i) #include "gcdist.h" double gstat_gcdist(double lon1, double lon2, double lat1, double lat2) { /* http://home.att.net/~srschmitt/script_greatcircle.html */ /* taken from R package sp source; Copyright by Roger Bivand (C) 2005 */ double F, G, L, sinG2, cosG2, sinF2, cosF2, sinL2, cosL2, S, C; double w, R, a, f, D, H1, H2; double lat1R, lat2R, lon1R, lon2R, DE2RA; if (lon1 == lon2 && lat1 == lat2) return 0.0; DE2RA = M_PI/180; a = 6378.137; /* WGS-84 equatorial radius in km */ f = 1.0/298.257223563; /* WGS-84 ellipsoid flattening factor */ lat1R = lat1 * DE2RA; lat2R = lat2 * DE2RA; lon1R = lon1 * DE2RA; lon2R = lon2 * DE2RA; F = (lat1R + lat2R) / 2.0; G = (lat1R - lat2R) / 2.0; L = (lon1R - lon2R) / 2.0; sinG2 = POWDI(sin(G), 2); cosG2 = POWDI(cos(G), 2); sinF2 = POWDI(sin(F), 2); cosF2 = POWDI(cos(F), 2); sinL2 = POWDI(sin(L), 2); cosL2 = POWDI(cos(L), 2); S = sinG2 * cosL2 + cosF2 * sinL2; C = cosG2 * cosL2 + sinF2 * sinL2; w = atan(sqrt(S / C)); R = sqrt(S * C) / w; D = 2 * w * a; H1 = (3 * R - 1)/(2 * C); H2 = (3 * R + 1)/(2 * S); return D * (1 + f * H1 * sinF2 * cosG2 - f * H2 * cosF2 * sinG2); } gstat/src/reml.c0000644000176200001440000002604413777370515013313 0ustar liggesusers/* * iterated mivque (reml) estimate of covariance components, following * Christensen's 1994 derivations Math.Geol. 25 (5), 541-558, and * Kitanidis' 1985 derivation (for estimate covariances) Math.Geol. 17 (2). * * Pre: data pointer (later: extend to 2 or more, crossvariograms?) * initial variogram for *data * Post: returns pointer to the updated variogram * if output != NULL, all iteration steps are printed to log device, * with final variogram model parameter covariances * Aug 1994; * Mod. (I-Aw) Nov 1998 */ #include #include /* fabs() */ #include "mtrx.h" #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "glvars.h" #include "select.h" #include "mtrx.h" #include "lm.h" /* get_X, get_y */ #include "reml.h" static int reml(VEC *Y, MAT *X, MAT **Vk, int n_k, int max_iter, double fit_limit, VEC *teta); static double trace_matrix(MAT *m); static MAT *calc_VinvIminAw(MAT *Vw, MAT *X, MAT *VinvIminAw, int calc_Aw); static void calc_rhs_Tr_m(int n_models, MAT **Vk,MAT *VinvIminAw, VEC *Y, VEC *rhs, MAT *Tr_m); static double calc_ll(MAT *Vw, MAT *X, VEC *y, int n); static MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out); static MAT *IminAw = MNULL; VARIOGRAM *reml_sills(DATA *data, VARIOGRAM *vp) { int i, j, k; MAT **Vk = NULL, *X = MNULL; VEC *Y = VNULL, *init = VNULL; DPOINT *dpa, *dpb; double dx, dy = 0.0, dz = 0.0, dzero2; if (data == NULL || vp == NULL) ErrMsg(ER_NULL, "reml()"); select_at(data, (DPOINT *) NULL); if (vp->n_models <= 0) ErrMsg(ER_VARNOTSET, "reml: please define initial variogram model"); /* * create Y, X, Vk's only once: */ Y = get_y(&data, Y, 1); X = get_X(&data, X, 1); Vk = (MAT **) emalloc(vp->n_models * sizeof(MAT *)); init = v_resize(init, vp->n_models); for (i = 0; i < vp->n_models; i++) { init->ve[i] = vp->part[i].sill; /* remember init. values for updating */ vp->part[i].sill = 1; Vk[i] = m_resize(MNULL, X->m, X->m); } dzero2 = gl_zero * gl_zero; for (i = 0; i < data->n_list; i++) { for (j = 0; j < vp->n_models; j++) /* fill diagonals */ ME(Vk[j], i, i) = Covariance(vp->part[j], 0.0, 0.0, 0.0); for (j = 0; j < i; j++) { /* off-diagonal elements: */ dpa = data->list[i]; dpb = data->list[j]; /* * if different points coincide on a locations, shift them, * or the covariance matrix will become singular */ dx = dpa->x - dpb->x; dy = dpa->y - dpb->y; dz = dpa->z - dpb->z; if (data->pp_norm2(dpa, dpb) < dzero2) { if (data->mode & X_BIT_SET) dx = (dx >= 0 ? gl_zero : -gl_zero); if (data->mode & Y_BIT_SET) dy = (dy >= 0 ? gl_zero : -gl_zero); if (data->mode & Z_BIT_SET) dz = (dz >= 0 ? gl_zero : -gl_zero); } for (k = 0; k < vp->n_models; k++) ME(Vk[k], i, j) = ME(Vk[k], j, i) = Covariance(vp->part[k], dx, dy, dz); } } if (reml(Y, X, Vk, vp->n_models, gl_iter, gl_fit_limit, init)) vp->ev->refit = 0; else /* on convergence */ pr_warning("no convergence while fitting variogram"); for (i = 0; i < vp->n_models; i++) vp->part[i].sill = init->ve[i]; update_variogram(vp); if (DEBUG_VGMFIT) logprint_variogram(vp, 1); for (i = 0; i < vp->n_models; i++) m_free(Vk[i]); efree(Vk); m_free(X); v_free(Y); v_free(init); return vp; } static int reml(VEC *Y, MAT *X, MAT **Vk, int n_k, int max_iter, double fit_limit, VEC *teta) { volatile int n_iter = 0; int i, info; volatile double rel_step = DBL_MAX; VEC *rhs = VNULL; VEC *dteta = VNULL; MAT *Vw = MNULL, *Tr_m = MNULL, *VinvIminAw = MNULL; Vw = m_resize(Vw, X->m, X->m); VinvIminAw = m_resize(VinvIminAw, X->m, X->m); rhs = v_resize(rhs, n_k); Tr_m = m_resize(Tr_m, n_k, n_k); dteta = v_resize(dteta, n_k); while (n_iter < max_iter && rel_step > fit_limit) { print_progress(n_iter, max_iter); n_iter++; dteta = v_copy(teta, dteta); /* fill Vw, calc VinvIminAw, rhs; */ for (i = 0, m_zero(Vw); i < n_k; i++) ms_mltadd(Vw, Vk[i], teta->ve[i], Vw); /* Vw = Sum_i teta[i]*V[i] */ VinvIminAw = calc_VinvIminAw(Vw, X, VinvIminAw, n_iter == 1); calc_rhs_Tr_m(n_k, Vk, VinvIminAw, Y, rhs, Tr_m); /* Tr_m * teta = Rhs; symmetric, solve for teta: */ CHfactor(Tr_m, PNULL, &info); if (info != 0) { pr_warning("singular matrix in reml"); return(0); } CHsolve1(Tr_m, rhs, teta, PNULL); if (DEBUG_VGMFIT) { printlog("teta_%d [", n_iter); for (i = 0; i < teta->dim; i++) printlog(" %g", teta->ve[i]); printlog("] -(log.likelyhood): %g\n", calc_ll(Vw, X, Y, n_k)); } v_sub(teta, dteta, dteta); /* dteta = teta_prev - teta_curr */ if (v_norm2(teta) == 0.0) rel_step = 0.0; else rel_step = v_norm2(dteta) / v_norm2(teta); } /* while (n_iter < gl_iter && rel_step > fit_limit) */ print_progress(max_iter, max_iter); if (n_iter == gl_iter) pr_warning("No convergence after %d iterations", n_iter); if (DEBUG_VGMFIT) { /* calculate and report covariance matrix */ /* first, update to current est */ for (i = 0, m_zero(Vw); i < n_k; i++) ms_mltadd(Vw, Vk[i], teta->ve[i], Vw); /* Vw = Sum_i teta[i]*V[i] */ VinvIminAw = calc_VinvIminAw(Vw, X, VinvIminAw, 0); calc_rhs_Tr_m(n_k, Vk, VinvIminAw, Y, rhs, Tr_m); m_inverse(Tr_m, &info); sm_mlt(2.0, Tr_m, Tr_m); /* Var(YAY)=2tr(AVAV) */ printlog("Lower bound of parameter covariance matrix:\n"); m_logoutput(Tr_m); printlog("# Negative log-likelyhood: %g\n", calc_ll(Vw, X, Y, n_k)); } m_free(Vw); m_free(VinvIminAw); m_free(Tr_m); v_free(rhs); v_free(dteta); return (n_iter < max_iter && rel_step < fit_limit); /* converged? */ } static MAT *calc_VinvIminAw(MAT *Vw, MAT *X, MAT *VinvIminAw, int calc_Aw) { /* * calculate V_w^-1(I-A_w) (==VinvIminAw), * A = X(X'X)^-1 X' (AY = XBeta; Beta = (X'X)^-1 X'Y) * * on second thought (Nov 1998 -- more than 4 years later :-)) * calc (I-Aw) only once and keep this constant during iteration. */ MAT *tmp = MNULL, *V = MNULL; /* VEC *b = VNULL, *rhs = VNULL; */ int i, j, info; if (X->m != Vw->n || VinvIminAw->m != X->m) ErrMsg(ER_IMPOSVAL, "calc_VinvIminAw: sizes don't match"); if (calc_Aw) { IminAw = m_resize(IminAw, X->m, X->m); tmp = m_resize(tmp, X->n, X->n); tmp = mtrm_mlt(X, X, tmp); /* X'X */ m_inverse(tmp, &info); /* (X'X)-1 */ if (info != 0) pr_warning("singular matrix in calc_VinvIminAw"); /* X(X'X)-1 -> X(X'X)-1 X') */ IminAw = XVXt_mlt(X, tmp, IminAw); for (i = 0; i < IminAw->m; i++) /* I - Aw */ for (j = 0; j <= i; j++) if (i == j) ME(IminAw, i, j) = 1.0 - ME(IminAw, i, j); else ME(IminAw, i, j) = ME(IminAw, j, i) = -(ME(IminAw, i, j)); } V = m_copy(Vw, V); CHfactor(V, PNULL, &info); if (info != 0) pr_warning("singular V matrix in calc_VinvIminAw"); CHsolve(V, IminAw, VinvIminAw, PNULL); m_free(V); if (tmp) m_free(tmp); return VinvIminAw; } static void calc_rhs_Tr_m(int n_models, MAT **Vk,MAT *VinvIminAw, VEC *y, VEC *rhs, MAT *Tr_m) { int j, k; MAT **Pr = NULL, *Tmp = MNULL; VEC *v_tmp = VNULL, *v_tmp2; Pr = (MAT **) emalloc(n_models * sizeof(MAT *)); v_tmp2 = vm_mlt(VinvIminAw, y, VNULL); /* Vw-(I-Aw)Y == Y'(I-Aw)'Vw- */ for (j = 0; j < n_models; j++) { Pr[j] = m_mlt(Vk[j], VinvIminAw, MNULL); Tmp = m_mlt(Pr[j], Pr[j], Tmp); ME(Tr_m, j, j) = trace_matrix(Tmp); /* diagonal */ /* using Tr(A B) == Tr(B A) */ for (k = 0; k < j; k++) { /* we did Pr[k] and Pr[j], so */ Tmp = m_mlt(Pr[j], Pr[k], Tmp); /* off-diagonal */ ME(Tr_m, j, k) = ME(Tr_m, k, j) = trace_matrix(Tmp); } v_tmp = vm_mlt(Vk[j], v_tmp2, v_tmp); /* Vw-1(I-Aw)Y */ rhs->ve[j] = in_prod(v_tmp2, v_tmp); } for (j = 0; j < n_models; j++) m_free(Pr[j]); efree(Pr); m_free(Tmp); v_free(v_tmp); v_free(v_tmp2); return; } static double calc_ll(MAT *Vw, MAT *X, VEC *y, int n) { /* * calculate negative log-likelyhood */ static MAT *M1 = MNULL; static VEC *res = VNULL, *tmp = VNULL; double zQz; volatile double ldet; int i, info; IminAw->m -= n; /* |B'(I-A)Vw(I-A)'B|, pretty inefficiently, can 4 x as fast: */ /* M1 = m_mlt(IminAw, Vw, M1); M2 = mmtr_mlt(M1, IminAw, M2); */ M1 = XVXt_mlt(IminAw, Vw, M1); CHfactor(M1, PNULL, &info); for (i = 0, ldet = 0.0; i < M1->m; i++) { assert(ME(M1, i, i) > 0.0); ldet += log(ME(M1, i, i)); } /* y'B'A'(B'A'Vw A B)-1 A B y */ res = mv_mlt(IminAw, y, res); /* the m-n residuals B(I-A)'Y */ tmp = CHsolve1(M1, res, tmp, PNULL); /* M1 tmp = res -> tmp = M1-1 res */ zQz = in_prod(res, tmp); /* res' M1inv res */ IminAw->m += n; return 0.5 * ((Vw->m - n)*log(2*PI) + ldet + zQz); } static double trace_matrix(MAT *m) { /* returns trace of a square matrix */ int i; double trace; if (m == NULL) ErrMsg(ER_NULL, "trace_matrix: NULL argument"); if (m->m != m->n) ErrMsg(ER_IMPOSVAL, "trace_matrix: non-square matrix"); for (i = 0, trace = 0.0; i < m->m; i++) trace += ME(m, i, i); return trace; } MAT *XtVX_mlt(MAT *X, MAT *V, MAT *out) { /* for a symmetric matrix V, return X' V X */ static MAT *VX = MNULL; int i, j, k; if (X==(MAT *)NULL || V==(MAT *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->m != V->m) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (V->m != V->n) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->n, X->n); VX = m_resize(VX, V->m, X->n); m_zero(out); VX = m_mlt(V, X, VX); for (i = 0; i < X->n; i++) { for (j = i; j < X->n; j++) for (k = 0; k < X->m; k++) ME(out, i, j) += ME(X, k, i) * ME(VX, k, j); for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } static MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out) { /* for a symmetric matrix V, return X V X' */ static MAT *VXt = MNULL; int i, j, k; if (X==(MAT *)NULL || V==(MAT *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->n != V->m) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (V->m != V->n) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->m, X->m); VXt = m_resize(VXt, V->m, X->n); m_zero(out); VXt = mmtr_mlt(V, X, VXt); for (i = 0; i < X->m; i++) { for (j = i; j < X->m; j++) for (k = 0; k < X->n; k++) ME(out, i, j) += ME(X, i, k) * ME(VXt, k, j); for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } MAT *XdXt_mlt(MAT *X, VEC *d, MAT *out) { /* for a diagonal matrix in d, return X d X' */ int i, j, k; if (X==(MAT *)NULL || d==(VEC *)NULL ) ErrMsg(ER_IMPOSVAL, "XVXt_mlt"); if (X->n != d->dim) ErrMsg(ER_IMPOSVAL, "XVXt_mlt"); out = m_resize(out, X->n, X->n); m_zero(out); for (i = 0; i < X->m; i++) { for (j = i; j < X->m; j++) for (k = 0; k < X->n; k++) ME(out, i, j) += ME(X, i, k) * ME(X, j, k) * d->ve[k]; for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } MAT *XtdX_mlt(MAT *X, VEC *d, MAT *out) { /* for a diagonal matrix in d, return X' d X */ int i, j, k; if (X==(MAT *)NULL || d==(VEC *)NULL ) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); if (X->m != d->dim) ErrMsg(ER_IMPOSVAL, "XtVX_mlt"); out = m_resize(out, X->n, X->n); m_zero(out); for (i = 0; i < X->n; i++) { for (j = i; j < X->n; j++) for (k = 0; k < X->m; k++) ME(out, i, j) += ME(X, k, i) * ME(X, k, j) * d->ve[k]; for (j = 0; j <= i; j++) /* symmetry */ ME(out, i, j) = ME(out, j, i); } return out; } gstat/src/init.c0000644000176200001440000000435013777370515013313 0ustar liggesusers#include #include #include // for NULL #include extern SEXP gstat_init(SEXP s_debug_level); extern SEXP gstat_load_ev(SEXP np, SEXP dist, SEXP gamma); extern SEXP gstat_fit_variogram(SEXP fit, SEXP fit_sill, SEXP fit_range); extern SEXP gstat_exit(SEXP x); extern SEXP gstat_new_data(SEXP sy, SEXP slocs, SEXP sX, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP force, SEXP vfn, SEXP sw, SEXP grid, SEXP degree, SEXP is_projected, SEXP vdist, SEXP lambda, SEXP omax); extern SEXP gstat_new_dummy_data(SEXP loc_dim, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP vfn, SEXP is_projected, SEXP vdist); extern SEXP gstat_debug_level(SEXP level); extern SEXP gstat_load_variogram(SEXP s_ids, SEXP s_model, SEXP s_sills, SEXP s_ranges, SEXP s_kappas, SEXP s_anis_all, SEXP s_table, SEXP s_max_val); extern SEXP gstat_predict(SEXP sn, SEXP slocs, SEXP sX, SEXP block_cols, SEXP block, SEXP weights, SEXP nsim, SEXP blue); extern SEXP gstat_set_method(SEXP to); extern SEXP gstat_set_set(SEXP arg, SEXP val); extern SEXP gstat_set_merge(SEXP a, SEXP b, SEXP c, SEXP d); extern SEXP gstat_variogram(SEXP s_ids, SEXP cutoff, SEXP width, SEXP direction, SEXP cressie, SEXP dX, SEXP boundaries, SEXP grid, SEXP cov, SEXP pseudo); extern SEXP gstat_variogram_values(SEXP ids, SEXP pars, SEXP covariance, SEXP dist_values); extern SEXP gstat_get_variogram_models(SEXP dolong); #define CALLDEF(name, n) {#name, (DL_FUNC) &name, n} const static R_CallMethodDef R_CallDef[] = { CALLDEF(gstat_init, 1), CALLDEF(gstat_load_ev, 3), CALLDEF(gstat_fit_variogram, 3), CALLDEF(gstat_exit, 1), CALLDEF(gstat_new_data, 17), CALLDEF(gstat_new_dummy_data, 9), CALLDEF(gstat_debug_level, 1), CALLDEF(gstat_load_variogram, 8), CALLDEF(gstat_predict, 8), CALLDEF(gstat_set_method, 1), CALLDEF(gstat_set_set, 2), CALLDEF(gstat_set_merge, 4), CALLDEF(gstat_variogram, 10), CALLDEF(gstat_variogram_values, 4), CALLDEF(gstat_get_variogram_models, 1), {NULL, NULL, 0} }; void // attribute_visible // optional R_init_gstat(DllInfo *dll) { R_registerRoutines(dll, NULL, R_CallDef, NULL, NULL); R_useDynamicSymbols(dll, FALSE); R_forceSymbols(dll, TRUE); } gstat/src/pqueue.h0000644000176200001440000000166313777370515013665 0ustar liggesusers#define Q_BUFFER_SIZE 100 /* something more practical */ typedef struct { union { QTREE_NODE *n; DPOINT *p; } u; int is_node; /* is u the QTREE_NODE (1) or rather the DPOINT (0) ? */ double dist2; /* squared distance to target location */ } QUEUE_NODE; typedef struct q_element { struct q_element *next; QUEUE_NODE el; } Q_ELEMENT; typedef struct { int length, max_length; Q_ELEMENT *head, /* pointer to first element in queue, NULL if empty */ *empty; /* pointer to empty elements (a stack), NULL if none left */ int blocks; /* size of memory block */ Q_ELEMENT **block; /* pointers to malloc'ed memory blocks */ int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b); /* qsort-able element comparison function */ } QUEUE; QUEUE *init_queue(QUEUE *q, int (CDECL *cmp)(const QUEUE_NODE *a, const QUEUE_NODE *b)); QUEUE_NODE dequeue(QUEUE *q); void enqueue(QUEUE *q, QUEUE_NODE *qpt, int n); void free_queue(QUEUE *q); gstat/src/glvars.c0000644000176200001440000006025714314525262013643 0ustar liggesusers/* * glvars.c: has global variables, choose defaults, check setting integrity */ #include #include #include #include #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "defaults.h" /* default values for gl_* variables */ #include "glvars.h" #include "gls.h" #include "block.h" /* * this module contains all global variables, along with some * routines for initialisation (of structures), resizing during runtime, * checks after reading command file and before starting real calculations, * obtaining some "local" global structures, printing all that's held, * and so on. get_n_vars() etc. are for clarity that these variables are not * changed outside the area where they're set. */ static void init_gstat_data(int n); static void clean_up(void); /* * global variables (glvars.h, defautls.h): */ int debug_level; /* debug level */ int gl_blas; int gl_choleski; /* do choleski instead of LDL? */ int gl_coincide; /* do the variable locations coincide? */ int gl_cressie; /* use cressie's estimator ? */ int gl_fit; /* do not fit a variogram */ int gl_gauss; /* gaussian quadr. block covariances ? */ int gl_iter; /* max. n. iter for mivque estimates */ int gl_jgraph; /* do jgraph plot in batch mode ? */ int gl_lhs; /* apply Latin hypercube sampling to Gaussian simulations */ int gl_longlat; /* indicates whether coordinates are longitude/latitude, or Euclidian */ int gl_nblockdiscr; /* block discrimination in each dimension */ int gl_n_intervals; /* n variogram intervals */ int gl_n_marginals; /* the n marginal distributions */ int gl_nsim; /* number of simultanious simulations */ int gl_n_uk; /* min. # of cs points to use ok */ int gl_numbers; /* plot numbers on variogram plot? */ int gl_nocheck; /* do not check LMC/IC ? */ int gl_order; /* do order relation correction */ int gl_plotweights; /* plot kriging weights? */ int gl_register_pairs; /* register sample variogram pairs? */ int gl_rowwise; /* deal with raster maps row-wise, or as complete blocks? */ int gl_rp; /* follow random path for gs/is? */ int gl_seed; /* seed is set? */ int gl_sim_beta; /* simulation mode for beta: 0 multiv GLS, 1 univ GLS, 2 OLS */ int gl_spiral; /* do spiral search if possible? */ int gl_split; /* see nsearch.c: was Q_SPLIT_AT */ int gl_sym_ev; /* default symmetric ps.cr.v./cr.cv. ? */ int gl_gls_residuals; /* calc. gls residuals? */ int gl_sparse; /* use sparse covariance matrices? */ int gl_xvalid; /* do cross validation on first variable */ int gl_zero_est; /* est. variogram at h 0 seperately? */ double *gl_bounds; /* boundaries semivariogram intervals */ double gl_cutoff; /* variogram cutoff */ double gl_fit_limit; /* convergence criterion on fit */ double gl_fraction; /* fraction of max dist for cutoff */ double gl_idp; /* default inverse distance power */ double gl_iwidth; /* variogram class width */ double gl_quantile; /* sample quantile */ double gl_zmap; /* height of the map */ double gl_alpha; /* alpha, beta, tol_[hor|ver]: anisotropy parameters */ double gl_beta; double gl_tol_hor; double gl_tol_ver; double gl_zero; /* zero tolerance; 2-squared */ const METHODS methods[] = { /* methods and codes */ { NSP, 0, "nsp" }, /* do nothing */ { UIF, 0, "ui" }, /* variogram modelling user interface */ { OKR, 0, "ok" }, /* ordinary kriging */ { UKR, 0, "uk" }, /* universal kriging */ { SKR, 0, "sk" }, /* simple kriging */ { IDW, 0, "id" }, /* inverse distance interpolation */ { MED, 0, "med" }, /* (local) sample median or quantiles */ { NRS, 0, "n$r" }, /* neighbourhood size */ { LSLM, 0, "tr$end" }, /* uncorrelated (or weighted) linear model */ { GSI, 1, "gs" }, /* gaussian (conditional) simulation */ { ISI, 1, "is" }, /* indicator (conditional) simulation */ { SEM, 0, "se$mivariogram" }, /* sample (cross) semivariance */ { COV, 0, "co$variogram" }, /* sample (cross) covariance */ { SPREAD, 0, "di$stance" }, /* distance to nearest sample */ { DIV, 0, "div" }, /* diversity and modus */ { SKEW, 0, "skew" }, /* skewness and kurtosis */ { LSEM, 0, "lsem" }, /* locally estimated/fitted variogram parameters */ { TEST, 0, "test" }, /* do-nothing? */ { NSP, 0, NULL } /* terminating field */ }; /* * "local" database, accesible through get_* functions */ static VARIOGRAM **vgm = NULL; static DATA **data = NULL; static char **outfile_names = NULL, **ids = NULL; static DATA *valdata = NULL; static DATA *data_area = NULL; /* area that discretises block */ static DPOINT block; static METHOD method = NSP; static int n_vars = 0; static int n_last = 0, n_v_last = 0, n_o_last = 0; static MODE mode = MODE_NSP; /* MODE_NSP, SIMPLE, STRATIFY or MULTIVARIABLE */ int init_global_variables(void) { /* * global variables init. (glvars.h; defautls.h): */ method = NSP; mode = MODE_NSP; debug_level = DB_NORMAL; gl_blas = DEF_blas; gl_choleski = DEF_choleski; gl_coincide = DEF_coincide; gl_cressie = DEF_cressie; gl_fit = DEF_fit; gl_gauss = DEF_gauss; gl_iter = DEF_iter; gl_jgraph = DEF_jgraph; gl_lhs = DEF_lhs; gl_longlat = DEF_longlat; gl_nblockdiscr = DEF_nblockdiscr; gl_n_intervals = DEF_intervals; gl_n_marginals = DEF_n_marginals; gl_nsim = DEF_nsim; gl_n_uk = DEF_n_uk; gl_numbers = DEF_numbers; gl_nocheck = DEF_nocheck; gl_order = DEF_order; gl_register_pairs = DEF_pairs; gl_rowwise = DEF_rowwise; gl_rp = DEF_rp; gl_seed = DEF_seed; gl_sim_beta = DEF_sim_beta; gl_spiral = DEF_spiral; gl_split = DEF_split; gl_sym_ev = DEF_sym_ev; gl_gls_residuals = DEF_gls_residuals; gl_sparse = DEF_sparse; gl_xvalid = DEF_xvalid; gl_zero_est = DEF_zero_est; gl_bounds = DEF_bounds; gl_cutoff = DEF_cutoff; gl_fit_limit = DEF_fit_limit; gl_fraction = DEF_fraction; gl_idp = DEF_idp; gl_iwidth = DEF_iwidth; gl_quantile = DEF_quantile; gl_zmap = DEF_zmap; gl_alpha = DEF_alpha; gl_beta = DEF_beta; gl_tol_hor = DEF_tol_hor; gl_tol_ver = DEF_tol_ver; gl_zero = DEF_zero; init_gstat_data(0); /* EJPXX * if (valdata == NULL) * */ valdata = init_one_data(valdata); block.x = block.y = block.z = 0.0; set_mv_double(&gl_zmap); get_covariance(NULL, 0, 0, 0); return 0; } void push_bound(double value) { static int n_bound; if (gl_bounds == NULL) { n_bound = 0; gl_bounds = (double *) emalloc((n_bound+2) * sizeof(double)); } else gl_bounds = (double *) erealloc(gl_bounds,(n_bound+2) * sizeof(double)); gl_bounds[n_bound] = value; gl_bounds[n_bound + 1] = -1.0; if (n_bound > 0 && gl_bounds[n_bound] <= gl_bounds[n_bound-1]) ErrMsg(ER_IMPOSVAL, "bounds must be strictly increasing"); n_bound++; } int n_variograms_set(void) { int i, n; for (i = 0, n = 0; i < get_n_vgms(); i++) if (vgm[i] != NULL && vgm[i]->id >= 0) n++; return n; } static void init_gstat_data(int n) { int i, n_vgms, n_outfl; n_vgms = (n * (n + 1))/2; n_outfl = n + n_vgms; if (n <= n_last) return; data = (DATA **) erealloc(data, n * sizeof(DATA *)); for (i = n_last; i < n; i++) data[i] = init_one_data(NULL); vgm = (VARIOGRAM **) erealloc(vgm, n_vgms * sizeof(VARIOGRAM *)); for (i = n_v_last; i < n_vgms; i++) vgm[i] = NULL; outfile_names = (char **) erealloc (outfile_names, n_outfl * sizeof(char *)); for (i = n_o_last; i < n_outfl; i++) outfile_names[i] = NULL; n_last = n; n_o_last = n_outfl; n_v_last = n_vgms; n_vars = n; return; } int which_identifier(const char *id) { assert(id); for (int i = 0; i < n_vars; i++) { if (ids[i] == NULL) ErrMsg(ER_IMPOSVAL, "which_identifier(): ids[i] == NULL"); if (strcmp(ids[i], id) == 0) return i; } /* else: extend data space */ n_vars++; ids = (char **) erealloc(ids, n_vars * sizeof(char *)); int Length = strlen(id) + 1; ids[n_vars - 1] = (char *) emalloc(Length * sizeof(char)); snprintf(ids[n_vars - 1], Length, "%s", id); init_gstat_data(n_vars); return n_vars - 1; } const char *name_identifier(int i) { static const char *cp_val = "data()", *cp_area = "area"; switch (i) { case ID_OF_VALDATA: return cp_val; case ID_OF_AREA: return cp_area; default: if (i >= get_n_vars() || i < 0) { pr_warning("i = %d", i); ErrMsg(ER_RANGE, "name_identifier(i): i outside range"); } return ids[i]; } } const char *method_string(METHOD i) { #define MSTR_SIZE 100 static char mstr[MSTR_SIZE]; char *str, *co, *un, *gsum = ""; if ((i == ISI || i == GSI) && gl_n_uk == DEF_n_uk && get_n_beta_set() != get_n_vars()) gsum = " with unknown means"; str = (get_mode() == STRATIFY ? "stratified " : ""); un = (get_n_vars() > 0 && data[0]->dummy ? "un" : ""); co = (get_mode() == MULTIVARIABLE ? "co" : ""); switch (i) { case NSP: snprintf(mstr, MSTR_SIZE, "exit"); break; case TEST: snprintf(mstr, MSTR_SIZE, "Test Option"); break; case UIF: snprintf(mstr, MSTR_SIZE, "starting interactive mode"); break; case SEM: snprintf(mstr, MSTR_SIZE, "calculating sample variogram"); break; case COV: snprintf(mstr, MSTR_SIZE, "calculating sample covariogram"); break; case SPREAD: snprintf(mstr, MSTR_SIZE, "spread value (distance to nearest observation) on output"); break; case IDW: snprintf(mstr, MSTR_SIZE, "%sinverse distance weighted interpolation", str); break; case MED: if (gl_quantile == 0.5) snprintf(mstr, MSTR_SIZE, "%smedian estimation", str); else snprintf(mstr, MSTR_SIZE, "%s%g-quantile estimation", str, gl_quantile); break; case NRS: snprintf(mstr, MSTR_SIZE, "(%s:) neighbourhood size on first output variable", str); break; case LSLM: if (n_variograms_set()) snprintf(mstr, MSTR_SIZE, "%sgeneralized least squares trend estimation", str); else snprintf(mstr, MSTR_SIZE, "%sordinary or weighted least squares prediction", str); break; case OKR: snprintf(mstr, MSTR_SIZE, "using %sordinary %skriging", str, co); break; case SKR: snprintf(mstr, MSTR_SIZE, "using %ssimple %skriging", str, co); break; case UKR: snprintf(mstr, MSTR_SIZE, "using %suniversal %skriging", str, co); break; case GSI: snprintf(mstr, MSTR_SIZE, "using %s%sconditional Gaussian %ssimulation%s", str, un, co, gsum); break; case ISI: snprintf(mstr, MSTR_SIZE, "using %s%sconditional indicator %ssimulation", str, un, co); break; case DIV: snprintf(mstr, MSTR_SIZE, "within-neighbourhood diversity and modus"); break; case SKEW: snprintf(mstr, MSTR_SIZE, "skewness and kurtosis"); break; case LSEM: snprintf(mstr, MSTR_SIZE, "local semivariance or locally fitted semivariogram parameters"); break; } return mstr; } int get_n_vars(void) { return n_vars; } int get_n_beta_set(void) { int i, nbeta; for (i = nbeta = 0; i < get_n_vars(); i++) if (data[i]->beta != NULL) nbeta++; return nbeta; } MODE get_mode(void) { return mode; } int get_n_vgms(void) { int n; n = get_n_vars(); return (n * (n + 1))/2; } int get_n_outputs(void) { return get_n_vars() + get_n_vgms(); } const char **get_outfile_name(void) { return (const char **) outfile_names; } VARIOGRAM *get_vgm(int i) { assert(i < get_n_vgms()); assert(i >= 0); if (vgm[i] == NULL) vgm[i] = init_variogram(NULL); return vgm[i]; } DATA **get_gstat_data(void) { return data; } DATA *get_dataval(void) { return valdata; } DATA *get_data_area(void) { return data_area; } DATA *create_data_area(void) { data_area = init_one_data(NULL); return data_area; } DPOINT *get_block_p(void) { return █ } METHOD get_method(void) { return method; } void set_method(METHOD m) { method = m; return; } int is_simulation(METHOD m) { assert(methods[m].m == m); return methods[m].is_simulation; } double max_block_dimension(int reset) { static double dim = -1.0; if (reset) dim = -1.0; if (dim < 0.0) { if (data_area != NULL) dim = data_block_diagonal(data_area); else dim = sqrt(SQR(block.x)+SQR(block.y)+SQR(block.z)); } return dim; } void setup_valdata_X(DATA *d) { /* * fills '0'-X columns (intercept) at the right place * e.g. data(a): .. X=1&2;data(b): .. X=3&4; data(): .. X=1&2&3&4; * this leads to "0 1 2 3 4" for colX, but should be "0 1 2 0 3 4"; */ int i = 0, j = 0, n_d, n_all; /* * # positive X's in all variables should equal # positive X's in this */ for (i = 0, n_all = 0; i < get_n_vars(); i++) for (j = 0; j < data[i]->n_X; j++) if (data[i]->colX[j] > 0) n_all++; for (i = 0, n_d = 0; i < d->n_X; i++) if (d->colX[i] > 0) n_d++; if (n_all != n_d) { pr_warning( "nr of X's in data: (%d) should match X's in other data(...) (%d)", n_d, n_all); ErrMsg(ER_IMPOSVAL, "X column definition mismatch"); } /* * now correct for 0's */ for (i = 0, n_all = 0; i < get_n_vars(); i++) n_all += data[i]->n_X; if (n_all == d->n_X) return; /* we're done */ n_d = d->n_X; d->n_X = n_all; d->colX = (int *) realloc(d->colX, d->n_X * sizeof(int)); /* fill backwards */ for (i = get_n_vars() - 1; i >= 0; i--) { for (j = data[i]->n_X - 1; j >= 0; j--) { n_all--; /* position of current X in d */ if (data[i]->colX[j] <= 0) /* intercept, x, xy, x2, etc. */ d->colX[n_all] = data[i]->colX[j]; else { n_d--; if (n_d < 0) ErrMsg(ER_IMPOSVAL, "setup_X(): n_d < 0"); if (d->colX[n_d] == 0) ErrMsg(ER_IMPOSVAL, "setup_X(): zero error"); d->colX[n_all] = d->colX[n_d]; } if (n_all < 0) ErrMsg(ER_IMPOSVAL, "setup_X(): n_all < 0"); } } return; } METHOD get_default_method(void) { int i, Xset, Vgm_set; /* * no no prediction locations or no data: */ if (get_n_vars() == 0) return NSP; if (valdata->id < 0 && gl_xvalid == 0 && data_area == NULL) { return UIF; } /* * check on X variables */ for (i = Xset = 0; i < get_n_vars(); i++) if (!(data[i]->n_X == 1 && data[i]->colX[0] == 0)) Xset++; /* * check on variograms */ for (i = 0, Vgm_set = 0; i < get_n_vars(); i++) if (vgm[LTI(i,i)] != NULL && (vgm[LTI(i,i)]->n_models > 0 || vgm[LTI(i,i)]->table != NULL)) /* was: ->id >= 0*/ Vgm_set++; if (!(Vgm_set == 0 || Vgm_set == get_n_vars())) ErrMsg(ER_SYNTAX, "set either all or no variograms"); if (Vgm_set > 0) { if (get_n_beta_set() > 0) return SKR; else return (Xset > 0 ? UKR : OKR); } else return (Xset > 0 ? LSLM : IDW); } void set_mode(void) { int i, j, check_failed = 0; if (method == NSP) return; /* * simple, univariate: */ if (get_n_vars() <= 1) { mode = SIMPLE; return; } /* * (get_n_vars() > 1): * multivariable prediction if all cross variograms set parameters merge */ for (i = check_failed = 0; i < get_n_vars(); i++) for (j = 0; j < i; j++) if (vgm[LTI(i,j)] == NULL || vgm[LTI(i,j)]->id < 0) check_failed = 1; if (check_failed == 0) { mode = MULTIVARIABLE; return; } if (n_variograms_set() == 0) { for (i = 0; i < get_n_vars(); i++) if (data[i]->n_merge > 0) { mode = MULTIVARIABLE; return; } } /* * stratify? ONLY if: * 0. get_n_vars() > 1; no cross variograms set ==>> has been checked. * 1. no pred(): or var(): except for first variable; * 2. No masks and valdata->what_is_u == U_ISSTRATUM * 3. mask is a valid strata map, n categories > 1 */ mode = (valdata->what_is_u == U_ISSTRATUM) ? STRATIFY : SIMPLE; return; } int decide_on_coincide(void) { int i, j; if (get_n_vars() <= 1) return 0; if (get_mode() == STRATIFY) return 0; /* data may coincide, but prediction locations won't */ for (i = 1; i < get_n_vars(); i++) { if (data[i]->n_list != data[0]->n_list || data[i]->colnx != data[0]->colnx || data[i]->colny != data[0]->colny || data[i]->colnz != data[0]->colnz || data[i]->sel_min != data[0]->sel_min || data[i]->sel_max != data[0]->sel_max || data[i]->force != data[0]->force || data[i]->sel_rad != data[0]->sel_rad) return 0; /* don't check filename: 'file.dat' and './file.dat' */ /* * Consider the data file * 1 2 NA 3 * 2 3 4 NA * with x=1, y=2, v=3 (for var 1), v=4 (for var 2). * This is only distinguishable by doing it the ``hard way'': */ for (j = 0; j < data[0]->n_list; j++) { if (data[0]->list[j]->x != data[i]->list[j]->x || data[0]->list[j]->y != data[i]->list[j]->y || data[0]->list[j]->z != data[i]->list[j]->z) return 0; } } if (DEBUG_DUMP) printlog("(identical search conditions found for all variables)\n"); return 1; } void check_global_variables(void) { /* * Purpose : check internal variable consistency, add some parameters * Created by : Edzer J. Pebesma * Date : april 13, 1992 * Prerequisites : none * Returns : - * Side effects : none * also check Cauchy-Schwartz unequality on cross/variograms. */ int i, j, n_merge = 0; METHOD m; VARIOGRAM *v_tmp; /* UK: check if n_masks equals total nr of unbiasedness cond. */ if (gl_nblockdiscr < 2) ErrMsg(ER_RANGE, "nblockdiscr must be >= 2"); if (method == SPREAD) { for (i = 0; i < get_n_vars(); i++) if (data[i]->sel_rad == DBL_MAX) data[i]->sel_rad *= 0.99; /* force distance calculation */ } if (get_n_beta_set() != 0 && get_n_beta_set() != get_n_vars()) ErrMsg(ER_SYNTAX, "set sk_mean or beta either for all or for no variables"); if (!(method == ISI || method == GSI)) { if (gl_nsim > 1) ErrMsg(ER_IMPOSVAL, "nsim only allowed for simulation"); } if (method == ISI && max_block_dimension(0) > 0.0) ErrMsg(ER_IMPOSVAL, "indicator simulation only for points"); /* * check if both block and area are set */ if (data_area != NULL && (block.x > 0.0 || block.y > 0.0 || block.z > 0.0)) ErrMsg(ER_IMPOSVAL, "both block and area set: choose one"); /* * check for equality of coordinate dimensions: */ for (i = 1; i < get_n_vars(); i++) { if ((data[i]->mode & V_BIT_SET) != (data[0]->mode & V_BIT_SET)) { message("data(%s) and data(%s):\n", name_identifier(0), name_identifier(i)); ErrMsg(ER_IMPOSVAL, "data have different coordinate dimensions"); } } if (valdata->id > 0 && data[0]->dummy == 0 && ((data[0]->mode | (V_BIT_SET | S_BIT_SET)) != (valdata->mode | (V_BIT_SET | S_BIT_SET)))) { message("data() and data(%s):\n", name_identifier(0)); ErrMsg(ER_IMPOSVAL, "data have different coordinate dimensions"); for (i = 0; i < get_n_vars(); i++) { if (data[i]->dummy) { data[i]->mode = (valdata->mode | V_BIT_SET); data[i]->minX = valdata->minX; data[i]->minY = valdata->minY; data[i]->minZ = valdata->minZ; data[i]->maxX = valdata->maxX; data[i]->maxY = valdata->maxY; data[i]->maxZ = valdata->maxZ; set_norm_fns(data[i]); } } } for (i = 0; i < get_n_vars(); i++) { if (data[i]->fname == NULL && !data[i]->dummy) { message("file name for data(%s) not set\n", name_identifier(i)); ErrMsg(ER_NULL, " "); } if (data[i]->id < 0) { message("data(%s) not set\n", name_identifier(i)); ErrMsg(ER_NULL, " "); } if (data[i]->beta && data[i]->beta->size != data[i]->n_X) { pr_warning("beta dimension (%d) should equal n_X (%d)", data[i]->beta->size, data[i]->n_X); ErrMsg(ER_IMPOSVAL, "sizes of beta and X don't match"); } if (data[i]->sel_rad == DBL_MAX && data[i]->oct_max > 0) ErrMsg(ER_IMPOSVAL, "define maximum search radius (rad) for octant search"); if (data[i]->vdist && data[i]->sel_rad == DBL_MAX) ErrMsg(ER_IMPOSVAL, "when using vdist, radius should be set"); if (! data[i]->dummy && ! (data[i]->mode & V_BIT_SET)) { message("no v attribute set for data(%s)\n", name_identifier(data[i]->id)); ErrMsg(ER_NULL, " "); } if (method != SEM && method != COV) { /* check neighbourhood settings */ if (data[i]->sel_rad < 0.0 || data[i]->sel_min < 0 || data[i]->sel_max < 0 || (data[i]->sel_min > data[i]->sel_max)) { message( "invalid neighbourhood selection: radius %g max %d min %d\n", data[i]->sel_rad, data[i]->sel_max, data[i]->sel_min); ErrMsg(ER_IMPOSVAL, " "); } } if (data[i]->id > -1 && (method == OKR || method == SKR || is_simulation(method) || method == UKR)) { if (vgm[LTI(i,i)] == NULL || vgm[LTI(i,i)]->id < 0) { message("variogram(%s) not set\n", name_identifier(i)); ErrMsg(ER_VARNOTSET, "variogram()"); } } n_merge += data[i]->n_merge; } if (n_merge && get_mode() != MULTIVARIABLE) ErrMsg(ER_IMPOSVAL, "merge only works in multivariable mode"); if (mode == SIMPLE && get_method() != UIF) { /* check if it's clean: */ for (i = 0; i < get_n_vars(); i++) for (j = 0; j < i; j++) if (vgm[LTI(i,j)] != NULL && vgm[LTI(i,j)]->id > 0) { message("variogram(%s, %s) %s\n", name_identifier(i), name_identifier(j), "can only be set for ck, cs, uk, sk, ok, sem or cov"); ErrMsg(ER_IMPOSVAL, "variogram()"); } } if ((m = get_default_method()) != get_method()) { if (m == UKR && (get_method() == OKR || get_method() == SKR)) ErrMsg(ER_IMPOSVAL, "\nremove X=... settings for ordinary or simple kriging"); if (m == OKR && get_method() == SKR) ErrMsg(ER_IMPOSVAL, "method: something's terribly wrong!"); if (m == OKR && get_method() == UKR) { message("I would recommend:\n"); message("Do not specify uk if ok is all you'll get\n"); } } if (mode == MULTIVARIABLE && get_method() != UIF && get_method() != SEM && get_method() != COV && n_variograms_set() > 0) check_variography((const VARIOGRAM **) vgm, get_n_vars()); v_tmp = init_variogram(NULL); free_variogram(v_tmp); } void remove_all(void) { while (n_vars) remove_id(0); /* hard way */ /* for (i = n_vars-1; i >= 0; i--) remove_id(i); */ /* remove_id(n_vars - 1); */ /* the hard way; remove_id(n_vars-1) would be the ``easy'' alternative */ gls(NULL, 0, GLS_INIT, NULL, NULL); /* cleans up static arrays */ reset_block_discr(); /* resets block settings */ max_block_dimension(1); /* reset */ if (gl_bounds != NULL) { efree(gl_bounds); gl_bounds = NULL; } if (valdata != NULL) free_data(valdata); valdata = NULL; } int remove_id(const int id) { /* * remove id id, and reset data, vgm, ids, outfile_names */ int i, j, id_new, id_old; VARIOGRAM *vp; assert(id >= 0 && id < n_vars); /* reset data */ free_data(data[id]); data[id] = NULL; for (i = id; i < n_vars - 1; i++) { data[i] = data[i+1]; data[i]->id = i; } for (i = 0; i < n_vars; i++) { j = LTI(i,id); if (vgm[j]) { free_variogram(vgm[j]); vgm[j] = NULL; } } /* copy variograms: */ for (i = id; i < n_vars - 1; i++) { for (j = id; j <= i; j++) { id_new = LTI(i,j); id_old = LTI(i+1,j+1); vp = vgm[id_new] = vgm[id_old]; if ((vp != NULL) && (vp->id1 >= 0 || vp->id2 >= 0)) { vp->id1 = i; vp->id2 = j; vp->id = id_new; } } } /* reset identifiers: */ efree(ids[id]); for (i = id; i < n_vars - 1; i++) ids[i] = ids[i+1]; /* free outfilenames */ if (outfile_names[2 * id]) { efree(outfile_names[2 * id]); outfile_names[2 * id] = NULL; } if (outfile_names[2 * id + 1]) { efree(outfile_names[2 * id + 1]); outfile_names[2 * id + 1] = NULL; } /* shift pred(xx)/variances(xx) names: */ for (i = id; i < n_vars - 1; i++) { outfile_names[2 * i] = outfile_names[2 * (i + 1)]; outfile_names[2 * i + 1] = outfile_names[2 * (i + 1) + 1]; } /* shift covariances(xx): */ for (i = id; i < n_vars - 1; i++) { id_old = 2 * n_vars + LTI2(i,id); if (outfile_names[id_old]) { efree(outfile_names[id_old]); outfile_names[id_old] = NULL; } for (j = id; j < i; j++) { id_new = 2 * (n_vars - 1) + LTI2(i,j); id_old = 2 * n_vars + LTI2(i+1,j+1); outfile_names[id_new] = outfile_names[id_old]; } } n_vars -= 1; if (n_vars == 0) clean_up(); init_gstat_data(n_vars); /* reset sizes */ return n_vars; } static void clean_up(void) { /* free variograms */ if (vgm) { efree(vgm); vgm = NULL; } /* free data */ if (data) { efree(data); data = NULL; } /* free valdata */ if (valdata) { free_data(valdata); valdata = NULL; } /* free data_area */ if (data_area) { free_data(data_area); data_area = NULL; } /* free outfile names */ if (outfile_names) { efree(outfile_names); outfile_names = NULL; } /* free identifiers */ if (ids) { efree(ids); ids = NULL; } n_vars = 0; n_last = 0; n_v_last = 0; n_o_last = 0; mode = MODE_NSP; } gstat/src/nsearch.c0000644000176200001440000005246414314525262013771 0ustar liggesusers/* This software module is copyright 1997 (c): Steve Joyce mailto:steve.joyce@resgeom.slu.se Remote Sensing Laboratory http://www-umea.slu.se/~fjasj/ Dept. of Forest Resource Mgmt. & Geomatics Tel: +46 90 16 69 57 Swedish University of Agricultural Sciences Fax: +46 90 14 19 15 S-901 83 Umea, Sweden Distributed freely under the terms of the GNU General Public License as a component of: Gstat, a program for geostatistical modelling, prediction and simulation Copyright 1992-2009 (C) Edzer J. Pebesma Edzer J. Pebesma (E.Pebesma@geo.uu.nl) Landscape and environmental research group Faculty of geographical sciences University of Amsterdam Nieuwe Prinsengracht 130 1018 VZ Amsterdam -- The Netherlands */ /* * qtree.c: quick neighbourhood selection routines for gstat */ /* * Edzer's CHANGE LOG from Steve's original contribution: * converted most float to double; * bbox size initialization -1.0 * added some ErrMsg() error message checks * changed qtree_quick_select() call (DPOINTX disappeared) * made is_leaf(node) a macro; removed max_ppnode -> Q_SPLIT_AT * added flexible 1/2/3d tree support: detect from data->mode; * added bbox.mode field; * modified routines like in_bbox, sub_bbox to detect tree dimension * qtree_free(): node->n_node should be N_NODES(node) * init_qtree is now called from qtree_quick_select() * added bbox_from_* routines * added get_index macro: searching is not required * added qtree_print() functions * might have missed some. * (after 2.0:) * Q_SPLIT_AT -> gl_split * implemented the priority queue mechanism, see PR bucket quad trees * demonstrated at http://www.cs.umd.edu/~brabec/quadtree/index.html. * (this enables efficient search when only max is defined, i.e. without * a radius -- especially in case of simulation this seems really * efficient) * removed min_bbox -->> this became obsolete with the priority queue * * I guess many of my modifications assume you have sufficient memory, * and that you want to use it to speed things up. */ #include #include /* qsort() */ #include /* sqrt() */ #include /* DBL_MAX */ #include /* INT_MAX */ #include "defs.h" #include "userio.h" #include "debug.h" #include "data.h" #include "utils.h" #include "glvars.h" /* get_method(), name_identifier() */ #include "mapio.h" #include "nsearch.h" #include "pqueue.h" /* include _after_ search.h! */ #define N_NODES(x) (x==NULL?0:(-((x)->n_node))) /* a negative n_node means it's not a leaf */ /* * this is a 'tuning' parameter defining the number of points in * a quad before it is split into 4 * #define Q_SPLIT_AT 4 */ /* * another tuning parameter defining the minimum quad size allowed. * (multiplied by d->sel_rad) #define Q_STOP_AT 0.5 (now obsolete) */ #define is_leaf(node) (((node) == NULL) || (((node)->n_node) >= 0)) #define is_qtree_search(d) (d->qtree_root != NULL) #define get_index(pt, bb) \ ((pt->x >= bb.x + 0.5 * bb.size) | \ (((bb.mode & Y_BIT_SET) && (pt->y >= bb.y + 0.5 * bb.size)) << 1) | \ (((bb.mode & Z_BIT_SET) && (pt->z >= bb.z + 0.5 * bb.size)) << 2)) static void init_qtree(DATA *d); static void init_qnode(QTREE_NODE **p_node, int is_leaf, BBOX bb); static void qtree_push(DPOINT *p, QTREE_NODE **p_node, int recursion_depth); static BBOX sub_bbox(const BBOX bb, int i); static int in_bbox(const DPOINT *p, BBOX bb); static void qtree_split_node(QTREE_NODE *node, BBOX bb, int rec_level); static QTREE_NODE *qtree_expand(const DPOINT *p, QTREE_NODE *root); static QTREE_NODE **qtree_find_node(const DPOINT *p, QTREE_NODE **p_node, BBOX *bbox); void qtree_print(DATA *d); static void logprint_qtree(QTREE_NODE *node, int depth); static BBOX bbox_from_grid(const GRIDMAP *gt, const DATA_GRIDMAP *dg); static BBOX bbox_from_data(DATA *d); static void qtree_zero_all_leaves(QTREE_NODE *node); static int CDECL node_cmp(const QUEUE_NODE *a, const QUEUE_NODE *b); void logprint_queue(QUEUE *queue); static void init_qtree(DATA *d) { /* * Initialize the root of the search tree: * Since this is called from qtree_quick_select(), we know allready * quite a lot. This helps choosing sensible values for the * top level bbox origin and size. */ const GRIDMAP *gt = NULL; DATA *simlocs = NULL; int i, mode; BBOX bbox; if (is_simulation(get_method())) { /* * sequential simulation: the simulation path (through DATA or GRIDMAP) * will make up for (most of) the search locations: */ gt = (const GRIDMAP *) NULL; simlocs = get_dataval(); /* in case of simulation one of them will be non-NULL */ } /* get initial estimate for top level bbox: */ if (gt != NULL) bbox = bbox_from_grid(gt, NULL); else if (simlocs != NULL) { bbox = bbox_from_data(simlocs); if (bbox.size <= 0.0) bbox = bbox_from_data(d); } else bbox = bbox_from_data(d); if (bbox.size <= 0.0) bbox = bbox_from_data(get_dataval()); if (bbox.size <= 0.0) ErrMsg(ER_IMPOSVAL, "bbox with zero size: remove neighbourhood settings?"); init_qnode(&(d->qtree_root), d->n_list < gl_split, bbox); /* ML1 */ mode = bbox.mode; for (i = 0; i < d->n_list; i++) qtree_push_point(d, d->list[i]); /* now they won't be rejected */ /* ML2 */ if (DEBUG_DUMP) { printlog("top level search tree statistics for data(%s):\n", name_identifier(d->id)); printlog("bounding box origin ["); if (mode & X_BIT_SET) printlog("%g", d->qtree_root->bb.x); if (mode & Y_BIT_SET) printlog(",%g", d->qtree_root->bb.y); if (mode & Z_BIT_SET) printlog(",%g", d->qtree_root->bb.z); printlog("]; dimension %g\n", d->qtree_root->bb.size); } /* qtree_print(d); */ return; } static void init_qnode(QTREE_NODE **p_node, int isleaf, BBOX bb) { /* * initialize a node in the search tree. * bb.mode tells the dimension of the tree (1D/2D/3D) */ int i; if (*p_node == NULL) { *p_node = (QTREE_NODE *) emalloc(sizeof(QTREE_NODE)); /* ML1 */ (*p_node)->bb = bb; } if (isleaf) (*p_node)->n_node = 0; else { if (bb.mode & Z_BIT_SET) /* 3D: oct-tree */ (*p_node)->n_node = -8; else if (bb.mode & Y_BIT_SET) /* 2D: quad-tree */ (*p_node)->n_node = -4; else if (bb.mode & X_BIT_SET) /* 1D: binary tree */ (*p_node)->n_node = -2; else /* no x/y/z bit set...??? */ ErrMsg(ER_IMPOSVAL, "init_qnode: invalid mode"); (*p_node)->u.node = (QTREE_NODE **) emalloc(N_NODES(*p_node) * sizeof(QTREE_NODE *)); for (i = 0; i < N_NODES(*p_node); i++) (*p_node)->u.node[i] = NULL; } return; } void qtree_push_point(DATA *d, DPOINT *where) { /* add a single point to the search tree structure in d->qtree_root */ /* * do not do this while reading the data: suppose we'll never need * a neighbourhood selection after all! */ if (! is_qtree_search(d)) return; /* min_bbox = d->sel_rad * Q_STOP_AT; */ /* * if this point is outside the current search tree, * we need to add another level to the top and try again: */ while (! in_bbox(where, d->qtree_root->bb)) d->qtree_root = qtree_expand(where, d->qtree_root); /* * finally push the point onto the tree: */ qtree_push(where, &(d->qtree_root), 0); return; } static void qtree_push(DPOINT *where, QTREE_NODE **p_node, int recursion_depth) { /* add a data point to the quad tree starting at the node specified. */ QTREE_NODE **p_leaf, *node; BBOX bb; bb = (*p_node)->bb; recursion_depth += 1; /* printf("recursion_depth: %d, max %d\n", recursion_depth, MAX_RECURSION_DEPTH); */ /* find the leaf node where this point belongs */ p_leaf = qtree_find_node(where, p_node, &bb); if (*p_leaf == NULL) init_qnode(p_leaf, 1, bb); /* leaf == 1: sets ->n_node to 0 */ node = *p_leaf; /* If it is already full, split it into another level and try again: */ if (node->n_node == gl_split && recursion_depth < MAX_RECURSION_DEPTH) { qtree_split_node(node, (*p_node)->bb, recursion_depth); qtree_push(where, &node, recursion_depth); return; } /* XXX */ if (node->n_node == 0) node->u.list = (DPOINT **) emalloc(sizeof(DPOINT *)); else node->u.list = (DPOINT **) erealloc(node->u.list, (node->n_node + 1) * sizeof(DPOINT *)); /* ML2 */ node->u.list[node->n_node] = where; node->n_node++; return; } void qtree_pop_point(DPOINT *where, DATA *d) { int i; QTREE_NODE *node, **p_node; /* delete a point from the search tree */ if (! is_qtree_search(d)) /* don't bother */ return; p_node = qtree_find_node(where, &(d->qtree_root), NULL); if (*p_node == NULL) ErrMsg(ER_IMPOSVAL, "qtree_pop_point(): could not find node"); node = *p_node; for (i = 0; i < node->n_node; i++) { if (where == node->u.list[i]) { /* don't preserve order: copy last to this one: */ node->u.list[i] = node->u.list[node->n_node - 1]; break; /* from for loop */ } } node->n_node--; /* free memory if empty list: */ if (node->n_node == 0) { efree(node->u.list); efree(node); *p_node = NULL; } return; } void qtree_free(QTREE_NODE *node) { /* * If a push or search fails, you might want to consider getting rid of * whole tree and default to exhaustive search. (SJ) * [If you ever get so far, exhaustive search will take * a nearly infinite amount of time. Instead, tweek gl_split. --EJP] */ int i; if (node == NULL) return; if (!is_leaf(node)) { for (i = 0; i < N_NODES(node); i++) qtree_free(node->u.node[i]); efree(node->u.node); } else efree(node->u.list); efree(node); return; } static void qtree_split_node(QTREE_NODE *node, BBOX bbox, int rec_level) { /* * split the quadtree at 'node' and redistribute its points */ DPOINT **list; int i, n; /* first copy the points to a temporary location and free the pointers */ n = node->n_node; list = node->u.list; /* save temporary copy */ /* make a node from this leaf, overwrite u: */ init_qnode(&node, 0, bbox); /* redistribute the points into the child nodes where they belong */ for (i = 0; i < n; i++) qtree_push(list[i], &node, rec_level); efree(list); return; } static QTREE_NODE *qtree_expand(const DPOINT *where, QTREE_NODE *root) { /* * expand the top level of the search tree */ QTREE_NODE *new_top = NULL; DPOINT old_centre; BBOX old_bb, new_bb; int i; old_bb = root->bb; old_centre.x = old_centre.y = old_centre.z = 0.0; if (old_bb.mode & X_BIT_SET) old_centre.x = old_bb.x + old_bb.size / 2.0; if (old_bb.mode & Y_BIT_SET) old_centre.y = old_bb.y + old_bb.size / 2.0; if (old_bb.mode & Z_BIT_SET) old_centre.z = old_bb.z + old_bb.size / 2.0; new_bb = old_bb; /* * set the new bounding box: Steve, could you check this? * (I didn't grasp your original bbox setting here:) * * set the root bbox to the new_top bbox: */ if ((old_bb.mode & X_BIT_SET) && (where->x < old_bb.x)) new_bb.x -= old_bb.size; if ((old_bb.mode & Y_BIT_SET) && (where->y < old_bb.y)) new_bb.y -= old_bb.size; if ((old_bb.mode & Z_BIT_SET) && (where->z < old_bb.z)) new_bb.z -= old_bb.size; new_bb.size *= 2.0; /* link the old root node to the proper spot in new_top: */ init_qnode(&new_top, 0, old_bb); i = get_index((&old_centre), new_bb); new_top->u.node[i] = root; new_top->bb = new_bb; /* make this one the new root */ return new_top; } static QTREE_NODE **qtree_find_node(const DPOINT *where, QTREE_NODE **p_node, BBOX *bb) { /* * find the deepest leaf (end node) in the tree that bounds this point's * coordinates. * It's bounding box is saved in the location pointed to by p_bbox */ int i; if (is_leaf(*p_node)) return p_node; /* find in which node we are: */ i = get_index(where, (*p_node)->bb); if (bb != NULL) *bb = sub_bbox(*bb, i); /* recurse into this node: */ return qtree_find_node(where, &((*p_node)->u.node[i]), bb); } static BBOX sub_bbox(const BBOX bbox, int index) { /* * return the bounding box of a quad-tree child node based on the index * layout of octree index: * * | dz <= 0 dz > 0 * --------|-------------------- * dy > 0 | 2 3 6 7 * dy <= 0 | 0 1 4 5 * | * dx ? 0 | <= > <= > */ double size; BBOX b; b = bbox; b.size = size = bbox.size / 2.0; if (index & X_BIT_SET) /* 1, 3, 5, 7 */ b.x += size; if (index & Y_BIT_SET) /* 2, 3, 6, 7 */ b.y += size; if (index & Z_BIT_SET) /* 4, 5, 6, 7 */ b.z += size; return b; } static int in_bbox(const DPOINT *where, BBOX bbox) { /* * check if where is inside the bounding box: * _on_ the left/lower/downside boundary or is inside the box */ if ((bbox.mode & X_BIT_SET) && ((where->x < bbox.x) || (where->x >= bbox.x + bbox.size))) return 0; if ((bbox.mode & Y_BIT_SET) && ((where->y < bbox.y) || (where->y >= bbox.y + bbox.size))) return 0; if ((bbox.mode & Z_BIT_SET) && ((where->z < bbox.z) || (where->z >= bbox.z + bbox.size))) return 0; /* so, where apparently in ... */ return 1; } /* * pb_norm2_?D() functions: * calculate shortest (squared) euclidian distance from a point to a BBOX, * for ? being 1, 2 or 3 dimensions */ double pb_norm_1D(const DPOINT *where, BBOX bbox) { double x, dx; x = where->x; if (x < bbox.x) { dx = bbox.x - x; return dx * dx; } bbox.x += bbox.size; if (x > bbox.x) { dx = x - bbox.x; return dx * dx; } return 0.0; /* inside box */ } double pb_norm_2D(const DPOINT *where, BBOX bbox) { double x, y, dx = 0.0, dy = 0.0; x = where->x; y = where->y; if (x < bbox.x) dx = bbox.x - x; else { bbox.x += bbox.size; if (x > bbox.x) dx = x - bbox.x; } if (y < bbox.y) dy = bbox.y - y; else { bbox.y += bbox.size; if (y > bbox.y) dy = y - bbox.y; } return dx * dx + dy * dy; } double pb_norm_3D(const DPOINT *where, BBOX bbox) { double x, y, z, dx = 0.0, dy = 0.0, dz = 0; x = where->x; y = where->y; z = where->z; if (x < bbox.x) dx = bbox.x - x; else { bbox.x += bbox.size; if (x > bbox.x) dx = x - bbox.x; } if (y < bbox.y) dy = bbox.y - y; else { bbox.y += bbox.size; if (y > bbox.y) dy = y - bbox.y; } if (z < bbox.z) dz = bbox.z - z; else { bbox.z += bbox.size; if (z > bbox.z) dz = z - bbox.z; } return dx * dx + dy * dy + dz * dz; } void qtree_print(DATA *d) { /* * plot the full tree (2D), in a format that can be read by jgraph, found * at netlib or at http://kenner.cs.utk.edu/~plank/plank/jgraph/jgraph.html */ printlog("newgraph\nxaxis size 3\nyaxis size 3\n"); printlog("title : %s [n = %d]\n", name_identifier(d->id), d->n_list); logprint_qtree(d->qtree_root, 0); return; } static void logprint_qtree(QTREE_NODE *node, int depth) { BBOX b; int i; if (node == NULL) return; b = node->bb; if (!is_leaf(node)) { printlog("newline linethickness 0.3 pts %g %g %g %g %g %g %g %g %g %g\n", b.x, b.y, b.x+b.size, b.y, b.x+b.size, b.y+b.size, b.x, b.y+b.size, b.x, b.y); for (i = 0; i < N_NODES(node); i++) logprint_qtree(node->u.node[i], depth+1); } else { printlog("newline pts %g %g %g %g %g %g %g %g %g %g\n", b.x, b.y, b.x+b.size, b.y, b.x+b.size, b.y+b.size, b.x, b.y+b.size, b.x, b.y); /* if (node == NULL) printlog("newcurve marktype circle fill 1 pts %g %g\n", b.x+0.5*b.size, b.y+0.5*b.size); */ if (node->n_node > 0) { printlog("newcurve marktype cross pts"); for (i = 0; i < node->n_node; i++) printlog(" %g %g", node->u.list[i]->x, node->u.list[i]->y); printlog("\n"); } } } static BBOX bbox_from_grid(const GRIDMAP *gt, const DATA_GRIDMAP *dg) { /* derive a sensible top level bounding box from grid map topology */ double sizex, sizey; BBOX bbox; if (gt) { sizex = gt->cols * gt->cellsizex; sizey = gt->rows * gt->cellsizey; bbox.x = gt->x_ul; bbox.y = gt->y_ul - sizey; /* * bbox.size should be set to such a value that the smallest * leaf fits exactly over 4 grid map cells */ bbox.size = MIN(gt->cellsizex, gt->cellsizey); } else { sizex = dg->cols * dg->cellsizex; sizey = dg->rows * dg->cellsizey; bbox.x = dg->x_ul; bbox.y = dg->y_ul - sizey; bbox.size = MIN(dg->cellsizex, dg->cellsizey); } bbox.z = DBL_MAX; while (bbox.size < MAX(sizex, sizey)) bbox.size *= 2; bbox.mode = (X_BIT_SET | Y_BIT_SET); /* i.e. 3 */ return bbox; } static BBOX bbox_from_data(DATA *d) { /* derive a sensible top level bounding box from a data var */ double maxspan, dy, dz; BBOX bbox; if (d->grid) return bbox_from_grid(NULL, d->grid); bbox.x = d->minX; bbox.y = d->minY; bbox.z = d->minZ; bbox.mode = d->mode; /* ??? */ /* bbox.mode = d->mode & (X_BIT_SET|Y_BIT_SET|Z_BIT_SET); maxspan = MAX((d->maxX-d->minX), MAX((d->maxY-d->minY),(d->maxZ-d->minZ))); */ maxspan = fabs(d->maxX - d->minX); dy = fabs(d->maxY - d->minY); if (dy > maxspan) maxspan = dy; dz = fabs(d->maxZ - d->minZ); if (dz > maxspan) maxspan = dz; /* with d->grid_size entered by user: if (d->grid_size > 0.0) { bbox.x -= 0.5 * d->grid_size; bbox.y -= 0.5 * d->grid_size; bbox.z -= 0.5 * d->grid_size; bbox.size = d->grid_size; do { bbox.size *= 2; } while (bbox.size < (maxspan + d->grid_size)); } */ bbox.size = maxspan * 1.01; return bbox; } static void qtree_zero_all_leaves(QTREE_NODE *node) { int i; if (!is_leaf(node)) { for (i = 0; i < N_NODES(node); i++) qtree_zero_all_leaves(node->u.node[i]); } else if (node != NULL) node->n_node = 0; return; } void qtree_rebuild(DATA *d) { /* rebuild tree */ int i; QTREE_NODE **p_leaf, *leaf; if (d->n_list <= 0 || d->qtree_root == NULL) return; qtree_zero_all_leaves(d->qtree_root); for (i = 0; i < d->n_list; i++) { p_leaf = qtree_find_node(d->list[i], &(d->qtree_root), NULL); leaf = *p_leaf; leaf->u.list[leaf->n_node] = d->list[i]; leaf->n_node++; } return; } static DPOINT *get_nearest_point(QUEUE *q, DPOINT *where, DATA *d) { /* * returns the first (closest) DPOINT in the priority queue q, after all * unwinding necessary (which is effectively recursion into the tree). * * this and the following functions: Copyright (GPL) 1998 Edzer J. Pebesma */ QUEUE_NODE head, *el = NULL /* temporary storage */ ; QTREE_NODE *node; int i, n; while (q->length > 0) { /* try: */ /* logprint_queue(q); */ head = dequeue(q); if (! head.is_node) { /* nearest element is a point: */ if (el != NULL) efree(el); return head.u.p; } node = head.u.n; if (is_leaf(node)) { /* ah, the node dequeued is a leaf: */ /* printf("node->n_node: %d\n", node->n_node); */ if (node->n_node > 0) el = (QUEUE_NODE *) erealloc(el, node->n_node * sizeof(QUEUE_NODE)); for (i = 0; i < node->n_node; i++) { /* enqueue it's DPOINT's: */ el[i].is_node = 0; el[i].u.p = node->u.list[i]; el[i].dist2 = node->u.list[i]->u.dist2 = d->pp_norm2(where, node->u.list[i]); } n = node->n_node; } else { /* nope, but enqueue its sub-nodes: */ if (N_NODES(node) > 0) el = (QUEUE_NODE *) erealloc(el, N_NODES(node) * sizeof(QUEUE_NODE)); for (i = n = 0; i < N_NODES(node); i++) { if (node->u.node[i] != NULL) { el[n].is_node = 1; el[n].u.n = node->u.node[i]; el[n].dist2 = d->pb_norm2(where, node->u.node[i]->bb); n++; } } } if (n > 0) enqueue(q, el, n); } /* the while-loop terminates when the queue is empty */ if (el != NULL) efree(el); return NULL; } void logprint_queue(QUEUE *queue) { Q_ELEMENT *q; QUEUE_NODE *e; printlog("current priority queue size: %d\n", queue->length); for (q = queue->head; q != NULL; q = q->next) { e = &(q->el); printlog("%s %12.6g", e->is_node ? "Node at " : "Point at", sqrt(e->dist2)); if (e->is_node) printlog(" [xll=%g,yll=%g,size=%g] (with %d %s)\n", e->u.n->bb.x, e->u.n->bb.y, e->u.n->bb.size, ABS(e->u.n->n_node), e->u.n->n_node < 0 ? "nodes" : "points"); else printlog(" [index %d, value %g]\n", GET_INDEX(e->u.p), e->u.p->attr); } } static int CDECL node_cmp(const QUEUE_NODE *a, const QUEUE_NODE *b) { /* ANSI qsort() conformant comparison function */ if (a->dist2 < b->dist2) return -1; if (a->dist2 > b->dist2) return 1; /* equal distances: prefer DPOINT over a node to speed up things */ if (a->is_node != b->is_node) return (a->is_node ? 1 : -1); return 0; } int qtree_select(DPOINT *where, DATA *d) { DPOINT *p = NULL; static QUEUE *q = NULL; static QUEUE_NODE root; int sel_max; double rad2; /* if this is the first time calling with this d: */ if (d->qtree_root == NULL) init_qtree(d); root.is_node = 1; root.u.n = d->qtree_root; root.dist2 = 0.0; q = init_queue(q, node_cmp); enqueue(q, &root, 1); if (d->sel_rad >= DBL_MAX) { /* * simply get the d->sel_max nearest: */ for (d->n_sel = 0; d->n_sel < d->sel_max; d->n_sel++) d->sel[d->n_sel] = get_nearest_point(q, where, d); } else { /* * also consider a maximum distance to where */ if (d->vdist) /* select everything within sel_rad; cut later on */ sel_max = INT_MAX; else sel_max = d->sel_max; rad2 = d->sel_rad * d->sel_rad; d->n_sel = 0; while (d->n_sel < sel_max) { p = get_nearest_point(q, where, d); if (p != NULL && p->u.dist2 <= rad2) { /* accept this point */ d->sel[d->n_sel] = p; d->n_sel++; } else break; /* reject, and break while loop */ } if (d->n_sel < d->sel_min) { /* * d->sel_min was set: consider points beyond radius */ if (d->force) /* proceed beyond d->sel_rad */ while (d->n_sel < d->sel_min) { if (p != NULL) { d->sel[d->n_sel] = p; p = get_nearest_point(q, where, d); d->n_sel++; } else { /* a zero d->n_sel will result in a missing value */ d->n_sel = 0; break; } } else /* stop: a zero d->n_sel will result in a missing value */ d->n_sel = 0; } } return d->n_sel; } gstat/src/mtrx.c0000644000176200001440000003016014314525262013325 0ustar liggesusers/* interface roughly follows meschach; implementation rewritten from scratch */ #include /* memcpy, memset */ #include /* fabs */ #define USE_FC_LEN_T #include #ifndef FCONE # define FCONE #endif #include #include "defs.h" /* CDECL */ #include "utils.h" /* efree, emalloc */ #include "userio.h" /* ErrMsg */ #include "glvars.h" /* gl_blas */ #include "debug.h" #include "mtrx.h" /* get rid of -0.000000 output: */ #define _zero_(x) (fabs(x) < 1.e-7 ? 0.0 : x) /* 0. book keeping: initialisation, memory allocation, zero, copy, print */ void m_free(MAT *m) { efree(m->v); efree(m); } void v_free(VEC *v) { efree(v->ve); efree(v); } void iv_free(IVEC *iv) { efree(iv->ive); efree(iv); } void px_free(PERM *p) { efree(p->pe); efree(p); } MAT *m_init(void) { MAT *mat = emalloc(sizeof(MAT)); mat->n = mat->m = mat->max = 0; mat->v = (double *) NULL; return(mat); } MAT *m_resize(MAT *mat, size_t m, size_t n) { if (mat == MNULL) mat = m_init(); if (m * n > mat->max) { mat->max = m * n; mat->v = (double *) erealloc(mat->v, mat->max * sizeof(double)); /* takes care of NULL m */ } mat->m = m; mat->n = n; return(mat); } VEC *v_init(void) { VEC *v = emalloc(sizeof(VEC)); v->dim = v->max = 0; v->ve = NULL; return(v); } VEC *v_resize(VEC *v, size_t n) { if (v == NULL) v = v_init(); if (n > v->max) { v->ve = erealloc(v->ve, n * sizeof(double)); v->max = n; } v->dim = n; return(v); } PERM *p_init(void) { PERM *p = emalloc(sizeof(PERM)); p->size = p->max = 0; p->pe = (int *) NULL; return(p); } PERM *px_resize(PERM *p, size_t n) { if (p == PNULL) p = p_init(); if (n > p->max) { p->pe = erealloc(p->pe, n * sizeof(size_t)); p->max = n; } p->size = n; return(p); } IVEC *iv_init(void) { IVEC *iv = emalloc(sizeof(IVEC)); iv->size = iv->max = 0; iv->ive = (int *) NULL; return(iv); } IVEC *iv_resize(IVEC *iv, size_t n) { if (iv == IVNULL) iv = iv_init(); if (n > iv->max) { iv->ive = erealloc(iv->ive, n * sizeof(int)); iv->max = n; } iv->size = n; return(iv); } MAT *m_zero(MAT *m) { if (m != MNULL) memset(m->v, 0x00, m->m * m->n * sizeof(double)); return(m); } VEC *v_zero(VEC *v) { if (v != VNULL) memset(v->ve, 0x00, v->dim * sizeof(double)); return(v); } MAT *m_copy(MAT *in, MAT *out) { if (in == out) return(out); out = m_resize(out, in->m, in->n); memcpy(out->v, in->v, in->m * in->n * sizeof(double)); return(out); } VEC *v_copy(VEC *in, VEC *out) { if (in == out) return(out); out = v_resize(out, in->dim); memcpy(out->ve, in->ve, in->dim * sizeof(double)); return(out); } void m_logoutput(MAT * a) { unsigned int i, j, tmp; if (a == (MAT *) NULL) { printlog("#Matrix: NULL\n"); return; } printlog("#Matrix: %d by %d\n", a->m, a->n); if (a->v == NULL) { printlog("NULL\n"); return; } printlog("rbind(\n"); for (i = 0; i < a->m; i++) { /* for each row... */ printlog("c("); for (j = 0, tmp = 2; j < a->n; j++, tmp++) { /* for each col in row: */ printlog("%9f", _zero_(ME(a, i, j))); if (j + 1 < a->n) printlog(", "); else printlog(")"); } if (i + 1 < a->m) printlog(", "); else printlog(" "); printlog("# row %u\n", i + 1); } printlog(")\n"); } void v_logoutput(VEC * x) { unsigned int i, tmp; if (x == (VEC *) NULL) { printlog("#Vector: NULL\n"); return; } printlog("#Vector: dim: %d\n", x->dim); if (x->ve == NULL) { printlog("NULL\n"); return; } printlog("c("); for (i = 0, tmp = 0; i < x->dim; i++, tmp++) { printlog("%9f", _zero_(x->ve[i])); if (i + 1 < x->dim) printlog(", "); } printlog(")"); } /* 1: vector-scalar, vector-vector (BLAS-1) */ VEC *sv_mlt(double s, VEC *v, VEC *out) { /* out <- s * v */ out = v_resize(out, v->dim); for (int i = 0; i < v->dim; i++) out->ve[i] = s * v->ve[i]; return(out); } double v_norm2(VEC *v) { /* 2-norm */ return(in_prod(v, v)); } VEC *v_add(VEC *v1, VEC *v2, VEC *out) { /* out = v1 + v2 */ if (v1->dim != v2->dim) ErrMsg(ER_IMPOSVAL, "v_sub size mismatch"); out = v_resize(out, v1->dim); for (int i = 0; i < out->dim; i++) out->ve[i] = v1->ve[i] + v2->ve[i]; return(out); } VEC *v_sub(VEC *v1, VEC *v2, VEC *out) { /* out = v1 - v2 = -1 * v2 + v1 */ if (v1->dim != v2->dim) ErrMsg(ER_IMPOSVAL, "v_sub size mismatch"); out = v_resize(out, v1->dim); for (int i = 0; i < out->dim; i++) out->ve[i] = v1->ve[i] - v2->ve[i]; return(out); } double in_prod(VEC *a, VEC *b) { /* a'b */ if (a->dim != b->dim) ErrMsg(ER_IMPOSVAL, "in_prod: dimensions don't match"); if (! gl_blas) { double d = 0.0; for (int i = 0; i < a->dim; i++) d += a->ve[i] * b->ve[i]; return(d); } else { int one = 1; return(F77_CALL(ddot)((int *) &(a->dim), a->ve, &one, b->ve, &one)); } } /* 2: vector-matrix (BLAS-2) */ VEC *vm_mlt(MAT *m, VEC *v, VEC *out) { /* out <- v m */ if (m->m != v->dim) ErrMsg(ER_IMPOSVAL, "vm_mlt: dimensions"); out = v_zero(v_resize(out, m->n)); if (! gl_blas) { for (size_t i = 0; i < m->n; i++) for (size_t j = 0; j < v->dim; j++) out->ve[i] += v->ve[j] * ME(m, j, i); } else { double alpha = 1.0, beta = 0.0; int one = 1; F77_CALL(dgemv)("T", (int *) &(m->m), (int *) &(m->n), &alpha, m->v, (int *) &(m->m), v->ve, &one, &beta, out->ve, &one FCONE); } return(out); } VEC *mv_mlt(MAT *m, VEC *v, VEC *out) { /* out <- m v */ if (v == out) ErrMsg(ER_IMPOSVAL, "mv_mlt in situ"); if (m->n != v->dim) ErrMsg(ER_IMPOSVAL, "mv_mlt non-matching sizes"); out = v_zero(v_resize(out, m->m)); if (! gl_blas) { for (int j = 0; j < m->m; j++) for (int i = 0; i < m->n; i++) out->ve[j] += ME(m, j, i) * v->ve[i]; } else { double alpha = 1.0, beta = 0.0; int one = 1; F77_CALL(dgemv)("N", (int *) &(m->m), (int *) &(m->n), &alpha, m->v, (int *) &(m->m), v->ve, &one, &beta, out->ve, &one FCONE); } return(out); } /* 3: matrix-matrix (BLAS-3) */ MAT *m_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 %*% m2 */ if (m1->n != m2->m) ErrMsg(ER_IMPOSVAL, "mv_mlt non-matching sizes"); if (! gl_blas) { out = m_zero(m_resize(out, m1->m, m2->n)); for (int i = 0; i < m1->m; i++) for (int j = 0; j < m2->n; j++) for (int k = 0; k < m1->n; k++) ME(out, i, j) += ME(m1, i, k) * ME(m2, k, j); } else { double alpha = 1.0, beta = 0.0; out = m_resize(out, m1->m, m2->n); F77_CALL(dgemm)("N", "N", (int *) &(m1->m), (int *) &(m2->n), (int *) &(m1->n), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->m) FCONE FCONE); } return(out); } MAT *mtrm_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- t(m1) %*% m2 */ if (m1->m != m2->m) ErrMsg(ER_IMPOSVAL, "mtrm_mlt non-matching m arrays"); out = m_zero(m_resize(out, m1->n, m2->n)); if (! gl_blas) { for (int i = 0; i < m1->n; i++) for (int j = 0; j < m2->n; j++) for (int k = 0; k < m1->m; k++) ME(out, i, j) += ME(m1, k, i) * ME(m2, k, j); } else { double alpha = 1.0, beta = 0.0; F77_CALL(dgemm)("T", "N", (int *) &(m1->n), (int *) &(m2->n), (int *) &(m1->m), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->n) FCONE FCONE); } return(out); } MAT *mmtr_mlt(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 m2' */ if (m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "mmtr_mlt non-matching m arrays"); out = m_zero(m_resize(out, m1->m, m2->m)); if (! gl_blas) { for (int i = 0; i < m1->m; i++) for (int j = 0; j < m2->m; j++) for (int k = 0; k < m1->n; k++) ME(out, i, j) += ME(m1, i, k) * ME(m2, j, k); } else { double alpha = 1.0, beta = 0.0; F77_CALL(dgemm)("N", "T", (int *) &(m1->m), (int *) &(m2->m), (int *) &(m1->n), &alpha, m1->v, (int *)&(m1->m), m2->v, (int *)&(m2->m), &beta, out->v, (int *) &(m1->m) FCONE FCONE); } return(out); } MAT *ms_mltadd(MAT *m1, MAT *m2, double s, MAT *out) { /* out <- m1 + s * m2 */ /* return m1 + s * m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "ms_mltadd: dimension mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) + s * ME(m2, i, j); return(out); } MAT *sm_mlt(double s, MAT *m1, MAT *out) { /* out <- s * m1 */ out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = s * ME(m1, i, j); return(out); } MAT *m_add(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 + m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "m_add size mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) + ME(m2, i, j); return(out); } MAT *m_sub(MAT *m1, MAT *m2, MAT *out) { /* out <- m1 - m2 */ if (m1->m != m2->m || m1->n != m2->n) ErrMsg(ER_IMPOSVAL, "m_sub size mismatch"); out = m_resize(out, m1->m, m1->n); for (int j = 0; j < m1->n; j++) for (int i = 0; i < m1->m; i++) ME(out, i, j) = ME(m1, i, j) - ME(m2, i, j); return(out); } /* 4: matrix factorisation, solving systems of equations */ MAT *CHfactor(MAT *m, PERM *piv, int *info) { if (m->m != m->n) error("CHfactor: 'm' must be a square matrix"); for (int i = 1; i < m->m; i++) for (int j = 0; j < i; j++) ME(m, i, j) = 0.0; /* zero lower triangle of Fortran order */ if (piv == PNULL) { /* Choleski: */ F77_CALL(dpotrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), info, (FC_LEN_T) 5); if (*info != 0) { if (*info > 0 && DEBUG_COV) warning("the leading minor of order %d is not positive definite", *info); if (*info < 0) error("argument %d of Lapack routine %s had invalid value", -(*info), "dpotrf"); } } else { /* LDL': */ if (piv->size != m->n) error("CHfactor: 'piv' must have dimension equal to m->n"); double w, *work; /* first query for size of work, then allocate work, then factorize m: */ int lwork = -1; F77_CALL(dsytrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), (int *) piv->pe, &w, &lwork, info, (FC_LEN_T) 5); lwork = (int) w; work = emalloc(lwork * sizeof(double)); F77_CALL(dsytrf)("Upper", (int *)&(m->n), m->v, (int *)&(m->n), (int *) piv->pe, work, &lwork, info, (FC_LEN_T) 5); efree(work); if (*info != 0) { if (*info > 0 && DEBUG_COV) warning("D[%d,%d] is exactly zero, meaning that D is singular", *info, *info); if (*info < 0) error("argument %d of Lapack routine %s had invalid value", -(*info), "dsytrf"); } } return(m); } MAT *CHsolve(MAT *m, MAT *b, MAT *out, PERM *piv) { /* solve A X = B after factorizing A */ int info; if (m->m != m->n) error("CHsolve: 'm' must be a square matrix"); if (m->m != b->m) error("CHsolve: b does not match m"); out = m_copy(b, out); /* column-major */ if (piv == PNULL) /* Choleski */ F77_CALL(dpotrs)("Upper", (int *) &(m->m), (int *) &(b->n), m->v, (int *) &(m->m), out->v, (int *) &(m->m), &info, (FC_LEN_T) 5); else /* LDL' */ F77_CALL(dsytrs)("Upper", (int *) &(m->m), (int *) &(b->n), m->v, (int *) &(m->m), piv->pe, out->v, (int *) &(m->m), &info, (FC_LEN_T) 5); if (info < 0) error("CHsolve: argument %d of Lapack routine %s had invalid value", -info, piv == NULL ? "dpotrs" : "dsytrs"); return(out); } VEC *CHsolve1(MAT *m, VEC *b, VEC *out, PERM *piv) { /* solve A x = b after factorizing A */ int one = 1, info; if (m->m != m->n) error("CHsolve1: 'm' must be a square matrix"); if (m->m != b->dim) error("CHsolve1: vector b does not match m"); out = v_copy(b, out); if (piv == PNULL) F77_CALL(dpotrs)("U", (int *) &(m->m), (int *) &one, m->v, (int *) &(m->m), out->ve, (int *) &(m->m), &info FCONE); else F77_CALL(dsytrs)("L", (int *) &(m->m), (int *) &one, m->v, (int *) &(m->m), piv->pe, out->ve, (int *) &(m->m), &info FCONE); if (info < 0) error("CHsolve1: argument %d of Lapack routine %s had invalid value", -info, piv == NULL ? "dpotrs" : "dsytrs"); return(out); } MAT *m_inverse(MAT *in, int *info) { /* out <- in^{-1} */ PERM *piv = px_resize(PNULL, in->m); in = CHfactor(in, piv, info); if (*info != 0) { /* singular */ px_free(piv); return(in); } MAT *rhs = m_zero(m_resize(MNULL, in->m, in->m)); for (int i = 0; i < rhs->m; i++) ME(rhs, i, i) = 1.0; rhs = CHsolve(in, rhs, rhs, piv); in = m_copy(rhs, in); m_free(rhs); px_free(piv); return(in); } gstat/src/data.h0000644000176200001440000002677113777370515013301 0ustar liggesusers#ifndef DATA_H # define DATA_H /* avoid multiple inclusion */ #include /* INT_MAX */ #include /* FLT_MAX */ #define ID_OF_VALDATA INT_MAX #define ID_OF_AREA (INT_MAX-1) #define IS_GLOBAL(d) (d->sel_rad >= DBL_MAX && d->sel_max >= INT_MAX) #define DELIMITERS " \t,\n\r" #define N_POLY 18 #define POLY_MIN (-19) /* lowest index */ #define POLY_X (-19) #define POLY_Y (-18) #define POLY_Z (-17) #define POLY_X2 (-16) #define POLY_Y2 (-15) #define POLY_Z2 (-14) #define POLY_XY (-13) #define POLY_XZ (-12) #define POLY_YZ (-11) #define POLY_X3 (-10) #define POLY_Y3 (-9) #define POLY_Z3 (-8) #define POLY_X2Y (-7) #define POLY_XY2 (-6) #define POLY_X2Z (-5) #define POLY_XZ2 (-4) #define POLY_Y2Z (-3) #define POLY_YZ2 (-2) /* -1 is reserved for "no intercept" */ typedef struct { int poly_nr; char *name; int degree, mode; } POLY_NM; typedef struct { /* structure to hold one point value: */ double x, y, z, /* x, y and z coordinate */ variance, /* the attribute's variance */ attr; /* attribut value (data value) */ union { float dist2; /* squared distance to estimate point */ float weight; /* weight in block discretization */ int stratum; /* stratum of current point in data() list */ } u; double *X; /* row entry in X matrix for this DPOINT */ unsigned int bitfield; /* most right bit: IS_POINT (0) or IS_BLOCK (1), remaining left bits: index of this point in d->list */ } DPOINT; /* qtree_search structs (nsearch.c): */ typedef struct { /* defining a rectangular bounding box */ double x, y, z, size; int mode; } BBOX; typedef struct qnode { /* the struct used to define nodes in the search tree */ int n_node; /* >= 0: number of data points in this node */ /* negative (-1) if u is a node list */ union { struct qnode **node;/* pointers to 4 or 8 other nodes */ DPOINT **list; /* or pointers to data points within this leaf */ } u; BBOX bb; } QTREE_NODE; typedef struct { double x_ul, y_ul, cellsizex, cellsizey; unsigned int rows, cols; DPOINT ***dpt, /* 2d array to (DPOINT *) entries in list */ **grid_base; /* base of blocked memory allocation */ } DATA_GRIDMAP; /* the management summary */ /* polygon structs: */ typedef struct { double x, y; } PLOT_POINT; typedef struct { PLOT_POINT min, max; } MBR; typedef struct polygon { MBR mbr; int lines; PLOT_POINT *p; int close; /* 1 - is closed polygon */ } POLYGON; typedef enum { DATA_UNKNOWN = 0, DATA_ASCII_TABLE, /* ascii table */ DATA_EAS, /* simplified GeoEAS format */ DATA_IDRISI_VEC, /* idrisi .vec */ DATA_IDRISI32_VEC, /* idrisi .vct */ DATA_IDRISI_BIN, /* Idrisi .img binary */ DATA_IDRISI_ASCII, /* Idrisi .img ascii */ DATA_IDRISI32_BIN, /* Idrisi32 .rst binary */ DATA_IDRISI32_ASCII,/* Idrisi32 .rst ascii */ DATA_GRIDASCII, /* ArcInfo */ DATA_GRIDFLOAT, /* ArcInfo */ DATA_CSF, /* PCRaster */ DATA_T2, /* Mike-SHE grid format */ DATA_ERMAPPER, /* ER-Mapper raster dataset */ DATA_GNUPLOT, /* gnuplot binary grid */ DATA_GMT, /* GMT netCDF format */ DATA_SURFER_DSAA, /* Surfer DSAA ascii grid */ DATA_GSLIB, /* GSLIB ascii grid */ DATA_GRASS, /* GRASS site list */ DATA_GRASS_GRID, /* GRASS raster */ DATA_GDAL, /* GDAL raster */ DATA_EXT_DBASE /* CW external database */ } DATA_TYPE_; typedef struct { DATA_TYPE_ type; const char *name; } DATA_TYPE; extern const DATA_TYPE data_types[]; typedef struct { int to_var, /* merge from current data to this variable */ col_this_X, /* merge this column number */ col_other_X; /* to this column number in the other variable */ } MERGE_TABLE; typedef struct { int size, max_size; double *val; } D_VECTOR; D_VECTOR *push_d_vector(double d, D_VECTOR *v); void free_d_vector(D_VECTOR *v); /* CW added, FTTB copies of DATA members * SEARCH_CRITERIA should become part of DATA * Dit zijn degene die ik begrijp */ typedef struct { /* DATA::prob sample later */ int force, /* force neighbourhood selection */ sel_min, sel_max, /* min and max number for neighbourhood selection */ oct_max, /* max # pts for each octant; 0: use no octant search */ oct_filled, /* RETURN VALUE? number of non-empty octants in selection */ square; /* use square search neighbourhood, default circular */ double sel_rad; /* radius for neighbourhhood selection */ }SEARCH_CRITERIA; typedef struct { /* structure that holds data info and lists */ char *variable, /* attr name, log(..) */ *x_coord, /* name of x coordinate */ *y_coord, /* name of y coordinate */ *z_coord, /* name of z coordinate */ *s_coord, /* name of stratum variable */ *V_coord, /* name of variance */ *Category, /* category value, for indicator transform */ *id_name, /* name of ID column*/ *fname, /* file name */ **point_ids, /* IDs of points */ *var_fn_str, /* VarFunction string */ *nscore_table; /* normal score table output file name */ DATA_TYPE type; /* what is this file? */ int id, /* id of data, number in command file */ n_list, /* # points in list */ n_original, /* # real data (read from file, not simulated) */ n_sel, /* # of points in selection: sel */ n_max, /* maximum # in list */ nsim_at_data, /* nr. of pts at simulation locations */ init_max, /* user-specified maximum n (to save memory) */ n_sel_max, /* maximum number in sel */ n_X, *colX, /* number and columns in X matrix */ log, /* is attr.value log-transformed ? */ force, /* force neighbourhood selection */ vdist, /* use variogram value as distance crit. */ n_averaged, /* number of averaged data so far */ colnx, colny, colnz, /* column-numbers */ colnvariance, /* column that holds variance */ colnvalue, /* column that holds attribute values */ colns, /* column that holds u (if strata) */ coln_id, /* column with ID */ sel_min, sel_max, /* min and max number for neighbourhood selection */ oct_max, /* max # pts for each octant; 0: use no octant search */ oct_filled, /* number of non-empty octants in selection */ mode, /* mode: 1(x),2(y),3(xy),4(z),5(xz).. */ dummy, /* is this variable a dummy variable? */ standard, /* if standard: data are standardized by dividing all values by data->std */ calc_residuals, /* 1: do calculate OLS residuals for vgm est */ is_residual, /* attr values are residuals lm X */ polynomial_degree, /* degree of coordinate polynomial */ togrid, /* shift data values to grid centres */ square, /* use square search neighbourhood */ centre, /* centre area + points() at area centre? */ region, /* select data in region? */ average, /* average measurements at identical location? */ every, /* sample only every x-th observation */ offset, skip, /* starting at offset */ datatype, /*KS added what idrisi data type 0=integer,1=real 1/18/99*/ filetype; /*KS added what idrisi file type 0=ascii,1=binary 1/18/99*/ enum { U_UNKNOWN, U_ISDIST, U_ISWEIGHT, U_ISSTRATUM } what_is_u; double sel_rad, /* radius for neighbourhhood selection */ Icutoff, /* cutoff value for indicator variable: */ /* colnvalue = ("real value" <= Icutoff) */ minX, maxX, minY, maxY, minZ, maxZ, /* min/max of coordinates */ minvariance, maxvariance, /* min/max variance */ mv, /* missing value */ dX, /* max. vector norm X-space distance */ prob, /* inclusion probability (to sample data file) */ lambda; /* lambda value for box-cox transform */ int minstratum, maxstratum; /* min/max stratum */ double mean, std; /* sample mean and st.dev. of attribute */ /* CW members to hold data in this struct (DATA_TYPE!= DATA_EXT_DBASE) */ DPOINT **list; /* list of data points, of length n_list */ DPOINT *P_base; /* base for pointer array, if allocated blockwise */ DPOINT **sel; /* list of selection indices, of length n_sel */ double (*point_norm)(const DPOINT *); /* eucl. vector length */ double (*pp_norm2)(const DPOINT *, const DPOINT *); /* point-point squared distance */ double (*pb_norm2)(const DPOINT *, BBOX); /* point-BBOX distance: nsearch.c */ double (*variance_fn)(double mu); /* variance function */ double *X_base; /* base pointer for X arrays, when allocated blockwise */ void *lm, /* cast to LM *, see lm.h */ *glm; /* remember: several matrices/vecs needed in gls.c */ /* next 2 entries are for merging regressors across variables */ /* to avoid double references, each entry var should be less than ->id */ int n_merge; /* merge_table size */ MERGE_TABLE *mtbl; /* entries in merge table */ QTREE_NODE *qtree_root; /* a tree-based structure with pointers to list[] for fast neighbourhood search */ /* POLYGON *poly; */ /* where the polygons go */ #ifdef WITH_SPIRAL SPIRAL *spiral; /* spiral search index structure */ #endif DATA_GRIDMAP *grid; /* grid map topology if data was read from a map */ D_VECTOR *beta; } DATA; #define X_BIT_SET 1 /* also used in nsearch.c */ #define Y_BIT_SET 2 #define Z_BIT_SET 4 #define V_BIT_SET 8 #define S_BIT_SET 16 #define D_HAS_WEIGHT(d) (d->what_is_u == U_ISWEIGHT) #define D_HAS_DIST(d) (d->what_is_u == U_ISDIST) #define D_HAS_STRATA(d) (d->colnu && d->what_is_u == U_ISSTRATA) /* following routines do not depend on sizeof(int) (K&R II, p. 48, 49) */ #define left_bits(x) ((x) >> 1) /* shift one, zero most left bit */ /* #define right_bit(x) ((x) & ~(~0 << 1)) */ /* zero all except right bit */ #define right_bit(x) ((x) & ~((unsigned long)~0 << 1)) #define set_right_bit_on(x) (x = (x) | 1) #define set_right_bit_off(x) (x = (x) & ((unsigned long)~0 << 1)) #define set_left_bits(x,val) (x = ((unsigned long)val << 1) | right_bit(x)) #define GET_INDEX(p) (left_bits((p)->bitfield)) #define SET_INDEX(p,val) (set_left_bits((p)->bitfield,val)) #define IS_BLOCK(p) (right_bit((p)->bitfield)) #define IS_POINT(p) (!right_bit((p)->bitfield)) #define SET_BLOCK(p) (set_right_bit_on((p)->bitfield)) #define SET_POINT(p) (set_right_bit_off((p)->bitfield)) #if defined(__cplusplus) extern "C" { #endif DATA *read_gstat_data(DATA *d); DATA *get_area_centre(DATA *area, DATA *valdata); void centre_area(DATA *area); void push_point(DATA *d, const DPOINT *p); void pop_point(DATA *d, int list_nr); void free_data(DATA *tmp); #define print_data_list(d) print_data(d, 1) #define print_data_selection(d) print_data(d, 0) void print_data(const DATA *d, int list); void logprint_point(const DPOINT *p, const DATA *d); DATA *init_one_data(DATA *data); int coordinates_are_equal(const DATA *a, const DATA *b); void init_data_minmax(void); void setup_data_minmax(DATA *d); void calc_polynomials(DATA *d); double calc_polynomial(DPOINT *p, int colX); char *print_data_line(const DATA *d, char **to); extern const POLY_NM polynomial[N_POLY]; #define POLY_NAME(i) polynomial[i - POLY_MIN].name #define POLY_DEGREE(i) polynomial[i - POLY_MIN].degree void data_add_X(DATA *d, int i); int push_to_merge_table(DATA *d, int to_var, int col_this_X, int col_other_X); DATA_GRIDMAP *gsetup_gridmap(double x_ul, double y_ul, double cellsizex, double cellsizey, unsigned int rows, unsigned int cols); void datagrid_rebuild(DATA *d, int adjust_to_gridcentres); void set_norm_fns(DATA *d); double data_block_diagonal(DATA *data); int intercept_only(const DATA *d); double v_mu(double mu); double v_mu2(double mu); double v_mu3(double mu); double v_bin(double mu); double v_identity(double mu); void setup_polynomial_X(DATA *d); void calc_polynomial_point(DATA *d, DPOINT *pt); double pp_norm_gc(const DPOINT *a, const DPOINT *b); void free_data_gridmap(DATA_GRIDMAP *t); #if defined(__cplusplus) } #endif #endif /* DATA_H */ gstat/src/select.h0000644000176200001440000000004713777370515013633 0ustar liggesusersint select_at(DATA *d, DPOINT *where); gstat/src/utils.c0000644000176200001440000000472113777370515013512 0ustar liggesusers/* * utils.c: error checking functions for file, memory and string handling */ #include /* free(), malloc() etc */ #include /* tolower(), isspace() */ #include /* strlen(), memcmp() */ #include "defs.h" #include "userio.h" #include "utils.h" #include "glvars.h" #include "debug.h" void efree(void *p) { if (p == NULL) pr_warning("efree(): NULL pointer as argument"); else /* there's little point in calling free(NULL) */ free(p); } void *emalloc(size_t size) { void *p = NULL; if (size == 0) { pr_warning("emalloc(): size 0 requested"); return NULL; } p = (void *) malloc(size); if (p == NULL) { if (DEBUG_DUMP) message("malloc(%u) returned NULL", size); ErrMsg(ER_MEMORY, ""); } return p; } void *ecalloc(size_t nobj, size_t size) { void *p = NULL; if (size == 0) { pr_warning("ecalloc(): size 0 requested"); return NULL; } p = (void *) calloc(nobj, size); if (p == NULL) { if (DEBUG_DUMP) message("calloc(%u,%u) returned NULL", nobj, size); ErrMsg(ER_MEMORY, ""); } return p; } void *erealloc(void *p, size_t size) { if (size == 0) { pr_warning("erealloc(): size 0 requested"); return NULL; } if (p == NULL) p = (void *) malloc(size); else p = (void *) realloc(p, size); if (p == NULL) { if (DEBUG_DUMP) message("realloc(%u) returned NULL\n", size); ErrMsg(ER_MEMORY, ""); } return p; } void set_mv_float(float *f) { memset(f, 0xFF, sizeof(float)); } void set_mv_double(double *d) { memset(d, 0xFF, sizeof(double)); } int is_mv_float(const float *f) { const unsigned char u[sizeof(float)] = { 0xFF, 0xFF, 0xFF, 0xFF }; /* will choke if sizeof(float) != 4 */ return (memcmp(f, u, sizeof(float)) == 0); } int is_mv_double(const double *d) { const unsigned char u[sizeof(double)] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; /* will choke if sizeof(double) != 8 */ return (memcmp(d, &u, sizeof(double)) == 0); } /* * almost_equals() compares string value of token tok with str[], and * returns TRUE if they are identical up to the first $ in str[]. */ int almost_equals(const char *tok, const char *str) { int i, after = 0, start = 0, len; if (tok == NULL) return 0; /* must be a value--can't be equal */ len = strlen(tok); for (i = 0; i < len + after; i++) { if (str[i] != tok[start + i]) { if (str[i] != '$') return 0; else { after = 1; start--; } } } /* i now beyond end of token string */ return(after || str[i] == '$' || str[i] == '\0'); } gstat/src/vario_fn.c0000644000176200001440000001300613777370515014151 0ustar liggesusers/* * vario_fn.c: contains elementary variogram model functions */ #include /* req'd by userio.h */ #include #include #include "defs.h" /* #define MATHLIB_STANDALONE */ #include #include "userio.h" #include "utils.h" #include "vario_fn.h" /* * Copyright (C) 1994, Edzer J. Pebesma * * basic variogram functions */ #define MIN_BESS 1.0e-3 #ifndef PI # define PI 3.14159265359 #endif double fn_nugget(double h, double *r) { return (h == 0.0 ? 0.0 : 1.0); } double fn_linear(double h, double *r) { if (h == 0) return 0.0; if (*r == 0) return h; /* 1lin() or 1 lin(0): slope 1 (and no range) */ return (h >= *r ? 1.0 : h/(*r)); } double da_fn_linear(double h, double *r) { if (*r == 0) return 0.0; /* 1lin() or 1 lin(0): slope 1 (and no range) */ if (h > *r) return 0.0; return -h/((*r) * (*r)); } double fn_circular(double h, double *r) { double hr; if (h == 0.0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); /* * return 1.0 + (2.0/PI) * (hr * sqrt(1.0 - hr * hr) - acos(hr)); * probably equivalent to: */ return (2.0/PI) * (hr * sqrt(1.0 - hr * hr) + asin(hr)); } double fn_spherical(double h, double *r) { double hr; if (h == 0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); return hr * (1.5 - 0.5 * hr * hr); } double da_fn_spherical(double h, double *r) { double hr2; if (h > *r) return 0.0; hr2 = h / ((*r) * (*r)); return 1.5 * hr2 * (-1.0 + h * hr2); } double fn_bessel(double h, double *r) { double hr; hr = h/(*r); if (hr < MIN_BESS) return 0.0; /* return 1.0 - hr * bessk1(hr); */ return 1.0 - hr * bessel_k(hr, 1.0, 1.0); } double fn_gaussian(double h, double *r) { double hr; if (h == 0.0) return 0.0; hr = h/(*r); return 1.0 - exp(-(hr*hr)); } double da_fn_gaussian(double h, double *r) { double hr; hr = h / (*r); return (-hr /(*r)) * exp(-(hr * hr)); } double fn_exponential(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - exp(-h/(*r)); } double fn_exclass(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - exp(-pow(h/r[0],r[1])); } double da_fn_exponential(double h, double *r) { double hr; hr = -h/(*r); return (hr / (*r)) * exp(hr); } double fn_pentaspherical(double h, double *r) { double hr, h2r2; if (h == 0.0) return 0.0; if (h >= *r) return 1.0; hr = h/(*r); h2r2 = hr * hr; return hr * ((15.0/8.0) + h2r2 * ((-5.0/4.0) + h2r2 * (3.0/8.0))); } double da_fn_pentaspherical(double h, double *r) { double hr2; if (h >= *r) return 0.0; hr2 = h / ((*r) * (*r)); return hr2*((-15.0/8.0) + hr2*((15.0/4.0)*h - (15.0/8.0)*h*h*hr2)); } double fn_periodic(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - cos(2.0 * PI * h/(*r)); } double da_fn_periodic(double h, double *r) { return (2.0 * PI * h/((*r) * (*r))) * sin(2.0 * PI * h/(*r)); } double fn_wave(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - (*r) * sin(PI * h/(*r)) / (PI * h); } double da_fn_wave(double h, double *r) { return cos(PI * h / (*r)) / (*r) - sin(PI * h / (*r)) / PI * h; } double fn_hole(double h, double *r) { if (h == 0.0) return 0.0; return 1.0 - sin(h/(*r))/(h/(*r)); } double da_fn_hole(double h, double *r) { double hr, hr2; hr = h/(*r); hr2 = h/((*r)*(*r)); return hr2 * sin(hr) + hr * hr2 * cos(hr); } double fn_logarithmic(double h, double *r) { if (h == 0.0) return 0.0; return log(h + *r); } double da_fn_logarithmic(double h, double *r) { return 1/(*r); } double fn_power(double h, double *r) { if (h == 0.0) return 0.0; return pow(h, *r); } double da_fn_power(double h, double *r) { return log(h) * pow(h, *r); } double fn_spline(double h, double *r) { if (h == 0.0) return 0.0; return h * h * log(h); } double fn_legendre(double h, double *r) { /* *r is range; h is angular lag */ double r2, ang; if (h == 0.0) return 0.0; r2 = r[0] * r[0]; ang = h / (PI * 6378.137); /* printf("dist: %g, ang: %g\n", h, ang); */ return 2.0 - (1.0 - r2)/(1 - 2.0 * r[0] * cos(ang) + r2); } double fn_intercept(double h, double *r) { return 1.0; } double da_is_zero(double h, double *r) { return 0.0; } double fn_matern(double h, double *p) { double hr, ans, phi, kappa; phi = p[0]; kappa = p[1]; if (h == 0.0) return(0.0); if (h > 600 * phi) return(1.0); hr = h/phi; ans = (pow(2.0, -(kappa - 1.0))/gammafn(kappa)) * pow(hr, kappa) * bessel_k(hr, kappa, 1.0); /* ans was for correlation; */ return 1.0 - ans; } /* * Ste: M. Stein's representation of the Matern model * * According to Hannes Kazianka, in R this would be h=distance matrix delta=c(RANGE,KAPPA) maternmodel<-function(h,delta){ matern<-besselK(2*delta[2]^(1/2)*h/delta[1],delta[2]) ifelse(matern==0,0,ifelse(!is.finite(matern),1, 1/(2^(delta[2] - 1)*gamma(delta[2]))*(2*delta[2]^(1/2)*h/delta[1])^delta[2]*matern)) } delta<-c(RANGE,KAPPA) h=Distance Matrix maternmodel<-function(h,delta){ matern<-besselK(2*delta[2]^(1/2)*h/delta[1],delta[2]) multipl<-1/(2^(delta[2] - 1)*gamma(delta[2]))*(2*delta[2]^(1/2)*h/delta[1])^delta[2] ifelse(matern==0 | !is.finite(multipl),0,ifelse(!is.finite(matern),1, multipl*matern)) } Now 0*Inf is impossible. Hannes */ double fn_matern2(double h, double *p) { double *delta, bes, mult; if (h == 0.0) return 0.0; delta = p; h = h / delta[0]; bes = bessel_k(2.0 * sqrt(delta[1]) * h, delta[1], 1.0); if (!isfinite(bes)) return 0.0; if (bes == 0.0) return 1.0; mult = pow(2.0, 1.0 - delta[1]) / gammafn(delta[1]) * pow((2.0 * sqrt(delta[1]) * h), delta[1]); if (!isfinite(mult)) return 1.0; return 1.0 - bes * mult; } gstat/src/vario.c0000644000176200001440000005617113777370515013500 0ustar liggesusers/* * vario.c: basic variogram model functions (init, print, update, etc.) */ #include #include /* getenv() */ #include /* toupper() */ #include /* DBL_MIN */ #include #include #include "R.h" /* Rprintf() */ #include "defs.h" #include "mtrx.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "vario_fn.h" #include "glvars.h" #include "lm.h" static int is_valid_cs(const VARIOGRAM *aa, const VARIOGRAM *bb, const VARIOGRAM *ab); static int is_posdef(MAT *m); static ANIS_TM *get_tm(double anis[5]); static void init_variogram_part(VGM_MODEL *v); const V_MODEL v_models[] = { /* the variogram model catalogue: */ /* first one needs to be NOT_SP: */ { NOT_SP, "Nsp", "Nsp (not specified)", NULL, NULL }, { NUGGET, "Nug", "Nug (nugget)", fn_nugget, da_is_zero }, { EXPONENTIAL, "Exp", "Exp (exponential)", fn_exponential, da_fn_exponential }, { SPHERICAL, "Sph", "Sph (spherical)", fn_spherical, da_fn_spherical }, { GAUSSIAN, "Gau", "Gau (gaussian)", fn_gaussian, da_fn_gaussian }, { EXCLASS, "Exc", "Exclass (Exponential class/stable)", fn_exclass, NULL }, { MATERN, "Mat", "Mat (Matern)", fn_matern, NULL }, { STEIN, "Ste", "Mat (Matern, M. Stein's parameterization)", fn_matern2, NULL }, { CIRCULAR, "Cir", "Cir (circular)", fn_circular, NULL }, { LINEAR, "Lin", "Lin (linear)", fn_linear, da_fn_linear }, /* one-parameter (a = 0), or two-parameter with sill */ { BESSEL, "Bes", "Bes (bessel)", fn_bessel, NULL }, { PENTASPHERICAL, "Pen", "Pen (pentaspherical)", fn_pentaspherical, da_fn_pentaspherical }, { PERIODIC, "Per", "Per (periodic)", fn_periodic, da_fn_periodic }, { WAVE, "Wav", "Wav (wave)", fn_wave, da_fn_wave }, { HOLE, "Hol", "Hol (hole)", fn_hole, da_fn_hole }, { LOGARITHMIC, "Log", "Log (logarithmic)", fn_logarithmic, da_fn_logarithmic }, { POWER, "Pow", "Pow (power)", fn_power, da_fn_power }, /* Wackernagel 2nd ed., p. 225 -- not working yet */ { SPLINE, "Spl", "Spl (spline)", fn_spline, NULL }, { LEGENDRE, "Leg", "Leg (Legendre)", fn_legendre, NULL }, { MERROR, "Err", "Err (Measurement error)", fn_nugget, da_is_zero }, /* the folowing two should always be the last ``valid'' one: */ { INTERCEPT, "Int", "Int (Intercept)", fn_intercept, da_is_zero }, { NOT_SP, NULL, NULL, NULL, NULL } /* THIS SHOULD BE LAST */ }; const char *vgm_type_str[] = { "not specified", "semivariogram", "cross variogram", "covariogram", "cross covariogram" }; VARIOGRAM *init_variogram(VARIOGRAM *v) { /* * initializes one variogram structure * if v is NULL, memory is allocated for the structure */ int i; if (v == NULL) v = (VARIOGRAM *) emalloc(sizeof(VARIOGRAM)); v->id = v->id1 = v->id2 = -1; v->n_models = 0; v->is_valid_covariance = 1; v->isotropic = 1; v->n_fit = 0; v->fit_is_singular = 0; v->max_range = (double) DBL_MIN; v->sum_sills = 0.0; v->measurement_error = 0.0; v->max_val = 0.0; v->min_val = 0.0; vgm_init_block_values(v); v->part = (VGM_MODEL *) emalloc(INIT_N_VGMM * sizeof(VGM_MODEL)); v->table = NULL; for (i = 0; i < INIT_N_VGMM; i++) init_variogram_part(&(v->part[i])); v->max_n_models = INIT_N_VGMM; v->SSErr = 0.0; v->ev = init_ev(); return v; } void vgm_init_block_values(VARIOGRAM *v) { v->block_semivariance_set = 0; v->block_covariance_set = 0; v->block_covariance = -999999.0; v->block_semivariance = -999999.0; } static void init_variogram_part(VGM_MODEL *p) { int i; p->sill = 0.0; for (i = 0; i < NRANGEPARS; i++) { p->range[i] = 0.0; /* quiets valgrind? */ set_mv_double(&(p->range[i])); /* trigger errors if misused */ } p->model = NOT_SP; p->fit_sill = p->fit_range = 1; p->fnct = p->da_fnct = NULL; p->tm_range = NULL; p->id = -1; } SAMPLE_VGM *init_ev(void) { SAMPLE_VGM *ev = NULL; ev = (SAMPLE_VGM *) emalloc(sizeof(SAMPLE_VGM)); set_mv_double(&(ev->cutoff)); set_mv_double(&(ev->iwidth)); ev->gamma = NULL; ev->dist = NULL; ev->nh = NULL; ev->pairs = NULL; ev->n_max = 0; ev->n_est = 0; ev->zero = ZERO_DEFAULT; ev->plot_numbers = 1; ev->is_directional = 0; ev->evt = NOTSPECIFIED; ev->fit = NO_FIT; ev->recalc = 1; ev->refit = 1; ev->pseudo = 0; ev->is_asym = -1; ev->map = NULL; ev->S_grid = NULL; ev->direction.x = 1.0; ev->direction.y = ev->direction.z = 0.0; return ev; } void free_variogram(VARIOGRAM *v) { int i; assert(v != NULL); if (v->ev) { if (v->ev->n_max > 0) { efree(v->ev->gamma); efree(v->ev->dist); efree(v->ev->nh); if (v->ev->pairs) efree(v->ev->pairs); } if (v->ev->map) efree(v->ev->map); efree(v->ev); } for (i = 0; i < v->max_n_models; i++) if (v->part[i].tm_range != NULL) efree(v->part[i].tm_range); efree(v->part); if (v->table) { efree(v->table->values); efree(v->table); } efree(v); } void logprint_variogram(const VARIOGRAM *v, int verbose) { /* prints contents of VARIOGRAM v to R console */ if (v->id1 < 0 && v->id2 < 0) return; /* never set */ if (v->id1 == v->id2) Rprintf("variogram(%s):\n", name_identifier(v->id1)); else Rprintf("variogram(%s,%s):\n", name_identifier(v->id1), name_identifier(v->id2)); for (int i = 0; i < v->n_models; i++) { Rprintf("# model: %d type: %s sill: %g range: %g\n", i, v_models[v->part[i].model].name_long, v->part[i].sill, v->part[i].range[0]); if (v->part[i].tm_range != NULL) { Rprintf("# range anisotropy, rotation matrix:\n"); for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) Rprintf("%s%8.4f", k == 0 ? "# " : " ", v->part[i].tm_range->tm[j][k]); Rprintf("\n"); } } } Rprintf( "# sum sills %g, max %g, min %g, flat at distance %g\n", v->sum_sills, v->max_val, v->min_val, v->max_range); return; } void update_variogram(VARIOGRAM *vp) { /* * update min/max, n_fit, descr * assumes that models are not changed: they can only be changed through * read_variogram(); */ VGM_MODEL *p; vp->sum_sills = vp->min_val = vp->max_val = 0.0; vp->measurement_error = 0.0; vp->n_fit = 0; vp->max_range = DBL_MIN; for (int i = 0; i < vp->n_models; i++) { p = &(vp->part[i]); vp->sum_sills += p->sill; if (p->sill < 0.0) vp->min_val += p->sill; /* else */ /* up to gstat_1.1-1 else was there; see https://stat.ethz.ch/pipermail/r-sig-geo/2015-December/023814.html */ vp->max_val += p->sill; vp->max_range = MAX(p->range[0], vp->max_range); if (p->model == BESSEL || p->model == GAUSSIAN || p->model == EXPONENTIAL || p->model == LOGARITHMIC || p->model == POWER || p->model == PERIODIC || p->model == EXCLASS || p->model == LEGENDRE || p->model == HOLE || p->model == WAVE || /* more??? */ p->model == MATERN || p->model == STEIN || (p->model == LINEAR && p->range[0] == 0)) /* sill is reached asymptotically or oscillates */ vp->max_range = DBL_MAX; else /* transitive model: */ vp->max_range = MAX(p->range[0], vp->max_range); if ((p->model == LINEAR && p->range[0] == 0.0) || p->model == NUGGET || p->model == INTERCEPT) p->fit_range = 0; /* 1 would lead to singularity */ if (p->model == LOGARITHMIC || p->model == POWER || p->model == INTERCEPT || (p->model == LINEAR && p->range[0] == 0)) vp->is_valid_covariance = 0; if (p->fit_sill) vp->n_fit++; if (p->fit_range) vp->n_fit++; if (p->model == MERROR) vp->measurement_error += p->sill; } if (vp->table != NULL) { vp->sum_sills = vp->table->values[0]; vp->max_val = vp->table->values[0]; vp->min_val = vp->table->values[0]; for (int i = 1; i < vp->table->n; i++) { vp->max_val = MAX(vp->max_val, vp->table->values[i]); vp->min_val = MIN(vp->min_val, vp->table->values[i]); } } return; } /* double get_max_sill(int n) { int i, j; VARIOGRAM *vp; static double max_sill; vp = get_vgm(0); max_sill = vp->max_val; for (i = 0; i < n; i++) { for (j = 0; j <= i; j++) { vp = get_vgm(LTI(i,j)); max_sill = MAX(max_sill, vp->max_val); } } return max_sill; } */ double get_semivariance(const VARIOGRAM *vp, double dx, double dy, double dz) { /* returns gamma(dx,dy,dz) for variogram v: gamma(h) = cov(0) - cov(h) */ int i; double sv = 0.0, dist = 0.0; if (vp->table != NULL) return(SEM_TABLE_VALUE(vp->table, transform_norm(vp->table->tm_range, dx, dy, dz))); if (! vp->isotropic) { for (i = 0; i < vp->n_models; i++) sv += vp->part[i].sill * vp->part[i].fnct( transform_norm(vp->part[i].tm_range, dx, dy, dz), vp->part[i].range); } else { dist = transform_norm(NULL, dx, dy, dz); if (dist > vp->max_range) return vp->sum_sills; for (i = 0; i < vp->n_models; i++) sv += vp->part[i].sill * vp->part[i].fnct(dist, vp->part[i].range); } return sv; } double get_covariance(const VARIOGRAM *vp, double dx, double dy, double dz) { /* returns cov(dx,dy,dz) for variogram v */ int i; static int warning = 0; double ctmp = 0.0, dist; if (vp == NULL) { warning = 0; return 0.0; } if (! vp->is_valid_covariance && !warning) { pr_warning("non-transitive variogram model not allowed as covariance function"); warning = 1; } if (!vp->is_valid_covariance && !DEBUG_FORCE) ErrMsg(ER_IMPOSVAL, "covariance from non-transitive variogram not allowed "); if (vp->table != NULL) return(COV_TABLE_VALUE(vp->table, transform_norm(vp->table->tm_range, dx, dy, dz))); if (! vp->isotropic) { for (i = 0; i < vp->n_models; i++) ctmp += vp->part[i].sill * (1.0 - vp->part[i].fnct( transform_norm(vp->part[i].tm_range, dx, dy, dz), vp->part[i].range)); } else { dist = transform_norm(NULL, dx, dy, dz); for (i = 0; i < vp->n_models; i++) ctmp += vp->part[i].sill * (1.0 - vp->part[i].fnct(dist, vp->part[i].range)); } return ctmp; } static int is_valid_cs(const VARIOGRAM *aa, const VARIOGRAM *bb, const VARIOGRAM *ab) /* * Purpose : Check Cauchy-Schwartz inequality on cross/variograms * Created by : Edzer J. Pebesma * Date : may 6th 1992 * Prerequisites : * Returns : return nonzero if |g_ab(h)| > sqrt(g_aa(h)g_bb(h)) * Side effects : none */ { int i, check_failed = 0; double maxrange = 0, dist, dx, dy, dz; for (i = 0; i < aa->n_models; i++) if (aa->part[i].range[0] > maxrange) maxrange = aa->part[i].range[0]; for (i = 0; i < ab->n_models; i++) if (ab->part[i].range[0] > maxrange) maxrange = ab->part[i].range[0]; for (i = 0; i < bb->n_models; i++) if (bb->part[i].range[0] > maxrange) maxrange = bb->part[i].range[0]; for (i = 0; i < 101 && !check_failed; i++) { dist = (i * maxrange)/100; dx = dy = dz = 0.0; if (i % 3 == 0) dx = dist; if (i % 3 == 1) dy = dist; if (i % 3 == 2) dz = dist; if (fabs(get_semivariance(ab, dx, dy, dz)) > sqrt(get_semivariance(aa, dx, dy, dz) * get_semivariance(bb, dx, dy, dz))) { check_failed = 1; /* yes, the check failed */ pr_warning("%s %d %s %d %s %d\n%s %g %g %g\n", "Cauchy-Schwartz violation: variogram", aa->id,",",bb->id, "and cross variogram", ab->id, "first failure on dx, dy and dz:", dx, dy, dz); } } /* for */ if (check_failed) return 0; else return 1; } void check_variography(const VARIOGRAM **v, int n_vars) /* * check for intrinsic correlation, linear model of coregionalisation * or else (with warning) Cauchy Swartz */ { int i, j, k, ic = 0, lmc, posdef = 1; MAT **a = NULL; double b; char *reason = NULL; if (n_vars <= 1) return; /* * find out if lmc (linear model of coregionalization) hold: * all models must have equal base models (sequence and range) */ for (i = 1, lmc = 1; lmc && i < get_n_vgms(); i++) { if (v[0]->n_models != v[i]->n_models) { reason = "number of models differ"; lmc = 0; } for (k = 0; lmc && k < v[0]->n_models; k++) { if (v[0]->part[k].model != v[i]->part[k].model) { reason = "model types differ"; lmc = 0; } if (v[0]->part[k].range[0] != v[i]->part[k].range[0]) { reason = "ranges differ"; lmc = 0; } } for (k = 0; lmc && k < v[0]->n_models; k++) if (v[0]->part[k].tm_range != NULL) { if (v[i]->part[k].tm_range == NULL) { reason = "anisotropy for part of models"; lmc = 0; } else if ( v[0]->part[k].tm_range->ratio[0] != v[i]->part[k].tm_range->ratio[0] || v[0]->part[k].tm_range->ratio[1] != v[i]->part[k].tm_range->ratio[1] || v[0]->part[k].tm_range->angle[0] != v[i]->part[k].tm_range->angle[0] || v[0]->part[k].tm_range->angle[1] != v[i]->part[k].tm_range->angle[1] || v[0]->part[k].tm_range->angle[2] != v[i]->part[k].tm_range->angle[2] ) { reason = "anisotropy parameters are not equal"; lmc = 0; } } else if (v[i]->part[k].tm_range != NULL) { reason = "anisotropy for part of models"; lmc = 0; } } if (lmc) { /* * check for ic: */ a = (MAT **) emalloc(v[0]->n_models * sizeof(MAT *)); for (k = 0; k < v[0]->n_models; k++) a[k] = m_get(n_vars, n_vars); for (i = 0; i < n_vars; i++) { for (j = 0; j < n_vars; j++) { /* for all variogram triplets: */ for (k = 0; k < v[0]->n_models; k++) ME(a[k], i, j) = v[LTI(i,j)]->part[k].sill; } } /* for ic: a's must be scaled versions of each other: */ ic = 1; for (k = 1, ic = 1; ic && k < v[0]->n_models; k++) { b = ME(a[0], 0, 0)/ME(a[k], 0, 0); for (i = 0; ic && i < n_vars; i++) for (j = 0; ic && j < n_vars; j++) if (fabs(ME(a[0], i, j) / ME(a[k], i, j) - b) > EPSILON) ic = 0; } /* check posdef matrices */ for (i = 0, lmc = 1, posdef = 1; i < v[0]->n_models; i++) { posdef = is_posdef(a[i]); if (posdef == 0) { reason = "coefficient matrix not positive definite"; if (DEBUG_COV) { printlog("non-positive definite coefficient matrix %d:\n", i); m_logoutput(a[i]); } ic = lmc = 0; } if (! posdef) printlog( "non-positive definite coefficient matrix in structure %d", i+1); } for (k = 0; k < v[0]->n_models; k++) m_free(a[k]); efree(a); if (ic) { printlog("Intrinsic Correlation found. Good.\n"); return; } else if (lmc) { printlog("Linear Model of Coregionalization found. Good.\n"); return; } } /* * lmc does not hold: check on Cauchy Swartz */ pr_warning("No Intrinsic Correlation or Linear Model of Coregionalization found\nReason: %s", reason ? reason : "unknown"); if (gl_nocheck == 0) { pr_warning("[add `set = list(nocheck = 1)' to the gstat() or krige() to ignore the following error]\n"); ErrMsg(ER_IMPOSVAL, "variograms do not satisfy a legal model"); } printlog("Now checking for Cauchy-Schwartz inequalities:\n"); for (i = 0; i < n_vars; i++) for (j = 0; j < i; j++) if (is_valid_cs(v[LTI(i,i)], v[LTI(j,j)], v[LTI(i,j)])) { printlog("variogram(%s,%s) passed Cauchy-Schwartz\n", name_identifier(j), name_identifier(i)); } else pr_warning("Cauchy-Schwartz inequality found for variogram(%s,%s)", name_identifier(j), name_identifier(i) ); return; } static int is_posdef(MAT *A) { MAT *b = m_copy(A, MNULL); int info; CHfactor(b, PNULL, &info); m_free(b); return (info == 0); } double transform_norm(const ANIS_TM *tm, double dx, double dy, double dz) { /* returns variogram distance given dx, dy, dz and VARIOGRAM v */ double dist = 0.0, tmp; int i; if (dx == 0.0 && dy == 0.0 && dz == 0.0) return 0.0; if (tm != NULL) { for (i = 0, tmp = 0.0; i < 3; i++) { tmp = tm->tm[i][0] * dx + tm->tm[i][1] * dy + tm->tm[i][2] * dz; dist += tmp * tmp; } return sqrt(dist); } return sqrt((dx * dx) + (dy * dy) + (dz * dz)); } double da_general(VGM_MODEL *part, double h) { /* numerical approximation of derivative: */ int i; double low, high, range, r[NRANGEPARS]; for (i = 0; i < NRANGEPARS; i++) { if (is_mv_double(&(part->range[i]))) set_mv_double(&(r[i])); else r[i] = part->range[i]; } range = MAX(1e-20, part->range[0]); r[0] = range * (1.0 + DA_DELTA); low = part->fnct(h, r); r[0] = range * (1.0 - DA_DELTA); high = part->fnct(h, r); return part->sill * (low - high) / (2.0 * range * DA_DELTA); } int push_variogram_model(VARIOGRAM *v, VGM_MODEL part) { int i, max_id, where = -1; /* * add the part submodel to v (if part.id < 0) or else * modify the appropriate part of v, having the id of part.id. * do a lot of checks, and set .fn and .da_fn functions. */ if (v->n_models == v->max_n_models) { v->part = (VGM_MODEL *) erealloc(v->part, (v->max_n_models + INIT_N_VGMM) * sizeof(VGM_MODEL)); for (i = v->max_n_models; i < v->max_n_models + INIT_N_VGMM; i++) init_variogram_part(&(v->part[i])); v->max_n_models += INIT_N_VGMM; } /* * check some things: */ if (part.model == NOT_SP) ErrMsg(ER_IMPOSVAL, "model NSP not allowed in variogram structure"); if (part.range[0] < 0.0) ErrMsg(ER_RANGE, "variogram range cannot be negative"); if (part.model == LINEAR) { if (part.range[0] == 0.0) part.fit_range = 0; } else if (part.model == NUGGET || part.model == INTERCEPT || part.model == MERROR) { part.fit_range = 0; if (part.range[0] > 0.0) ErrMsg(ER_RANGE, "range must be zero"); } else if (part.range[0] == 0.0) ErrMsg(ER_RANGE, "range must be positive"); if (part.model == POWER && part.range[0] > 2.0) ErrMsg(ER_RANGE, "power model range (parameter) cannot exceed 2.0"); if (part.model == EXCLASS && part.range[1] > 2.0) ErrMsg(ER_RANGE, "exponentical class model shape parameter cannot exceed 2.0"); if (part.id < 0) { where = v->n_models; v->n_models++; for (i = max_id = 0; i < v->n_models; i++) max_id = MAX(v->part[i].id, max_id); part.id = max_id + 1; } else { /* search in list: */ for (i = 0; where < 0 && i < v->n_models; i++) if (v->part[i].id == part.id) where = i; assert(where >= 0); /* i.e., it should really be in the list */ } if (v->isotropic) v->isotropic = (part.tm_range == NULL); /* * check that the .fn and .da_fn functions in v_models * will indeed be the correct ones: */ assert(part.model == v_models[part.model].model); v->part[where] = part; v->part[where].fnct = v_models[part.model].fn; v->part[where].da_fnct = v_models[part.model].da_fn; return part.id; } VGM_MODEL_TYPE which_variogram_model(const char *m) { char s[4]; strncpy(s, m, 3); s[0] = toupper(s[0]); s[1] = tolower(s[1]); s[2] = tolower(s[2]); s[3] = '\0'; for (int i = 1; v_models[i].name != NULL; i++) if (strcmp(s, v_models[i].name) == 0) return v_models[i].model; return NOT_SP; } double relative_nugget(VARIOGRAM *v) { int i; double nug = 0.0, sill = 0.0; assert(v->n_models != 0); if (v->n_models == 1) return (v->part[0].model == NUGGET ? 1.0 : 0.0); for (i = 0; i < v->n_models; i++) { if (v->part[i].model == NUGGET) nug += v->part[i].sill; else sill += v->part[i].sill; } assert(nug + sill > 0.0); return (nug/(nug+sill)); } DO_AT_ZERO zero_int2enum(int zero) { switch(zero) { case 0: return ZERO_DEFAULT; case 1: return ZERO_INCLUDE; case 2: return ZERO_AVOID; case 3: return ZERO_SPECIAL; } ErrMsg(ER_IMPOSVAL, "invalid value for zero"); return ZERO_DEFAULT; /* never reached */ } void push_to_v(VARIOGRAM *v, const char *mod, double sill, double *range, int nrangepars, double *d, int fit_sill, int fit_range) { VGM_MODEL vm; int i; init_variogram_part(&vm); vm.model = which_variogram_model(mod); if (nrangepars > NRANGEPARS) ErrMsg(ER_IMPOSVAL, "too many range parameters"); for (i = 0; i < nrangepars; i++) vm.range[i] = range[i]; vm.sill = sill; vm.fit_sill = fit_sill; vm.fit_range = fit_range; if (d != NULL && d[0] != -9999.0) vm.tm_range = get_tm(d); if (vm.model == STEIN && range[1] > 100.0) { vm.model = GAUSSIAN; vm.range[1] = 0.0; pr_warning("kappa values over 100 overflow gammafn: taking Gaussian approximation"); } push_variogram_model(v, vm); } void push_to_v_table(VARIOGRAM *v, double maxdist, int length, double *values, double *anis) { int i; v->table = (COV_TABLE *) emalloc(sizeof(COV_TABLE)); v->table->n = length; v->table->maxdist = maxdist; v->table->values = (double *) emalloc(length * sizeof(double)); for (i = 0; i < length; i++) v->table->values[i] = values[i]; if (anis != NULL) v->table->tm_range = get_tm(anis); else v->table->tm_range = NULL; } static ANIS_TM *get_tm(double anis[5]) { /* Part of this routine was inspired by FORTRAN code in GSLIB, first edition: C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% C % C Copyright (C) 1992 Stanford Center for Reservoir Forecasting. All % C rights reserved. Distributed with: C.V. Deutsch and A.G. Journel. % C ``GSLIB: Geostatistical Software Library and User's Guide,'' Oxford % C University Press, New York, 1992. % C % C The programs in GSLIB are distributed in the hope that they will be % C useful, but WITHOUT ANY WARRANTY. No author or distributor accepts % C responsibility to anyone for the consequences of using them or for % C whether they serve any particular purpose or work at all, unless he % C says so in writing. Everyone is granted permission to copy, modify % C and redistribute the programs in GSLIB, but only under the condition % C that this notice and the above copyright notice remain intact. % C % C%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ int i; double alpha, beta, theta, sina, sinb, sint, cosa, cosb, cost, afac1, afac2; ANIS_TM *t = NULL; /* About naming convention: gstat GSLIB =============== anis[0] ang1 (first anis. par. for 2D) anis[1] ang2 anis[2] ang3 anis[3] anis1 (second anis. par. for 2D) anis[4] anis2 */ #define ANIS_ERR(x) message("parsing anis. pars. %g,%g,%g,%g,%g -- error on %g\n", \ anis[0],anis[1],anis[2],anis[3],anis[4],x) #define DEG2RAD (PI/180.0) for (i = 0; i < 3; i++) { if (anis[i] < 0 || anis[i] >= 360) { ANIS_ERR(anis[i]); ErrMsg(ER_RANGE, "this value should be in [0..360>"); } } for (i = 3; i < 5; i++) { if (anis[i] <= 0.0 || anis[i] > 1.0) { ANIS_ERR(anis[i]); ErrMsg(ER_RANGE, "this value should be in <0..1]"); } } /* from GSLIB: */ if (anis[0] >= 0.0 && anis[0] < 270) alpha = (double) (90.0 - anis[0]) * DEG2RAD; else alpha = (double) (450.0 - anis[0]) * DEG2RAD; beta = -1.0 * (double) anis[1] * DEG2RAD; theta = (double) anis[2] * DEG2RAD; sina = sin(alpha); sinb = sin(beta); sint = sin(theta); cosa = cos(alpha); cosb = cos(beta); cost = cos(theta); afac1 = 1.0 / MAX((double) anis[3], (double) EPSILON); afac2 = 1.0 / MAX((double) anis[4], (double) EPSILON); t = emalloc(sizeof(ANIS_TM)); t->angle[0] = anis[0]; t->angle[1] = anis[1]; t->angle[2] = anis[2]; t->ratio[0] = anis[3]; t->ratio[1] = anis[4]; t->tm[0][0] = (cosb * cosa); t->tm[0][1] = (cosb * sina); t->tm[0][2] = (-sinb); t->tm[1][0] = afac1*(-cost*sina + sint*sinb*cosa); t->tm[1][1] = afac1*(cost*cosa + sint*sinb*sina); t->tm[1][2] = afac1*( sint * cosb); t->tm[2][0] = afac2*(sint*sina + cost*sinb*cosa); t->tm[2][1] = afac2*(-sint*cosa + cost*sinb*sina); t->tm[2][2] = afac2*(cost * cosb); return t; } gstat/src/msim.c0000644000176200001440000002321313777370515013314 0ustar liggesusers/* * msim.c: multiple simulation database + output * Written during my Post Doc at UvA, end of 1996. * Rewrite started on Sat Apr 10 20:54:05 WET DST 1999 */ #include #include /* qsort() */ #include /* memmove() */ #include /* sqrt(), ... */ #include "defs.h" #include #include "debug.h" #include "data.h" #include "utils.h" #include "vario.h" #include "glvars.h" /* gl_nsim, gl_format */ #include "userio.h" #include "mapio.h" #include "mtrx.h" #include "lm.h" #include "gls.h" #include "sim.h" #include "msim.h" static DPOINT *which_point(DATA *d, DPOINT *where); static unsigned int *get_n_sim_locs_table(unsigned int *size); /* global variables formerly in predict.c; set in s.c */ unsigned int n_pred_locs = 0; #ifdef SIM_DOUBLE typedef double Float; /* doubles the memory requirement -> may be pretty much */ #else typedef float Float; #endif static Float ***msim = NULL, /* * The msim table entry for variable i, for simulation node j, * replicate k is msim[i][j][k] */ **msim_base = NULL; /* base structure for blocked allocation */ static double ***beta = NULL; /* * the beta realisation for variable i, draw j is in * beta[i][j] -- and has dimension data[i]->beta->size */ static unsigned int *n_sim_locs = NULL, /* n simulation locations per data variable */ table_size = 0, /* offset strata table size */ **s2d = NULL, /* * s2d: -- find (POINT *) from msim: * msim[i][j][...] -->> data[i]->list[s2d[i][j]] */ **d2s = NULL; /* * d2s: find msim entry from (POINT *): * data[i]->list[j] -->> msim[i][d2s[i][j]][...] * ((the latter two are necessary because simple counting fails * when point simulation locations coincide with data locations. In * this case, a data DPOINT is not added to the data list, and so we * need to keep track _where_ simulated values were located in order * to write them back to output (file/maps) at the end)) */ void print_sim(void) { /* print complete contents of sim_values -- for debug purposes only */ int i, j, k; for (i = 0; i < get_n_vars(); i++) { printlog("variable %d:\n", i); for (j = 0; j < n_sim_locs[i]; j++) { for (k = 0; k < gl_nsim; k++) printlog(" %g", msim[i][j][k]); printlog("\n"); } } } void init_simulations(DATA **d) { int i, j, size; assert(n_pred_locs > 0); /* should be set by now... */ if (msim != NULL) free_simulations(); n_sim_locs = get_n_sim_locs_table(&table_size); if (DEBUG_DUMP) { printlog("n_sim_locs_table: "); for (i = 0; i < table_size; i++) printlog("[%d] ", n_sim_locs[i]); printlog("\n"); } msim = (Float ***) emalloc(get_n_vars() * sizeof(Float **)); msim_base = (Float **) emalloc(get_n_vars() * sizeof(Float *)); s2d = (unsigned int **) emalloc(get_n_vars() * sizeof(unsigned int *)); d2s = (unsigned int **) emalloc(get_n_vars() * sizeof(unsigned int *)); for (i = 0; i < get_n_vars(); i++) { /* msim stuff: */ size = n_sim_locs[i] * gl_nsim; msim_base[i] = (Float *) emalloc(size * sizeof(Float)); memset(msim_base[i], 0xFF, size * sizeof(Float)); msim[i] = (Float **) emalloc(n_sim_locs[i] * sizeof(Float *)); for (j = 0; j < n_sim_locs[i]; j++) msim[i][j] = &(msim_base[i][j * gl_nsim]); /* index stuff: */ s2d[i] = (unsigned int *) emalloc(n_sim_locs[i] * sizeof(unsigned int)); d2s[i] = (unsigned int *) emalloc(n_sim_locs[i] * sizeof(unsigned int)); /* now let's trigger some Seg Faults if on error: */ memset(s2d[i], 0xFF, n_sim_locs[i] * sizeof(unsigned int)); memset(d2s[i], 0xFF, n_sim_locs[i] * sizeof(unsigned int)); } } void save_sim(DATA **data, DPOINT *where, int sim, int n_vars, const double *value, int *is_pt) { /* * save the last simulated value(s) in msim; * data[0]->n_list and data[0]->n_original (mode != STRATIFY) or * else n_vars (..) denote where it should go. */ int i, row; DPOINT *which = NULL; if (gl_nsim <= 1) return; for (i = 0; i < n_vars; i++) { /* store current simulation */ row = data[i]->n_list - data[i]->n_original + data[i]->nsim_at_data; if (sim == 0) { /* fill d2s and s2d entries: */ assert(row >= 0 && row < n_sim_locs[i]); if (is_pt[i]) { which = which_point(data[i], where); s2d[i][row] = GET_INDEX(which); /* d2s remains MV */ } else { /* newly simulated */ s2d[i][row] = data[i]->n_list; d2s[i][data[i]->n_list - data[i]->n_original] = row; /* please go and check it -- this last line took me 4 hours to get right */ } } msim[i][row][sim] = value[i]; } } void save_sim_strat(DATA *d, DPOINT *where, int sim, double value, int is_pt) { /* the same, but for stratified mode */ int row; DPOINT *which = NULL; if (gl_nsim <= 1) return; row = d->n_list - d->n_original + d->nsim_at_data; if (sim == 0) { /* fill d2s and s2d entries: */ assert(row >= 0 && row < n_sim_locs[d->id]); if (is_pt) { which = which_point(d, where); s2d[d->id][row] = GET_INDEX(which); /* the entry for d2s does not exist */ } else { /* not an original point, but a simulated one: */ s2d[d->id][row] = d->n_list; /* newly simulated */ d2s[d->id][d->n_list - d->n_original] = row; } } msim[d->id][row][sim] = value; } static DPOINT *which_point(DATA *d, DPOINT *where) { int i; double dzero2; #define WPWARNING "if you are simulating with a Gaussian variogram model without nugget\n\ then try to add a small nugget variance to avoid the following error message" dzero2 = gl_zero * gl_zero; for (i = 0; i < d->n_sel; i++) if (fabs(d->pp_norm2(d->sel[i], where)) <= dzero2) return d->sel[i]; pr_warning(WPWARNING); ErrMsg(ER_NULL, "which_point(): point not found"); return where; /* never reached */ } void restore_data_sel(DATA **data, int sim, int n_vars) { unsigned int i, j; int id, idx; DATA *d0 = NULL; if (gl_nsim <= 1) return; if (n_vars == 0) { assert(get_mode() == STRATIFY); d0 = data[0]; for (j = 0; j < d0->n_sel; j++) { id = d0->id; idx = GET_INDEX(d0->sel[j]) - d0->n_original; /* current sim: */ if (idx >= 0 && d2s[id][idx] != 0xFFFFFFFF) d0->sel[j]->attr = msim[id][d2s[id][idx]][sim]; } } else { for (i = 0; i < n_vars; i++) { for (j = 0; j < data[i]->n_sel; j++) { idx = GET_INDEX(data[i]->sel[j]) - data[i]->n_original; /* idx < 0 -->> original data, don't restore */ if (idx >= 0 && d2s[i][idx] != 0xFFFFFFFF) data[i]->sel[j]->attr = msim[i][d2s[i][idx]][sim]; /* data[i]->list[j] -->> msim[i][d2s[i][j]][...] */ } } } } void free_simulations(void) { int i, j; if (msim != NULL) { for (i = 0; i < get_n_vars(); i++) { efree(msim[i]); efree(msim_base[i]); efree(s2d[i]); efree(d2s[i]); } efree(msim); msim = NULL; efree(msim_base); msim_base = NULL; } if (s2d != NULL) { efree(s2d); s2d = NULL; } if (d2s != NULL) { efree(d2s); d2s = NULL; } if (beta != NULL) { for (i = 0; i < get_n_vars(); i++) { for (j = 0; j < gl_nsim; j++) efree(beta[i][j]); efree(beta[i]); } efree(beta); beta = NULL; } if (n_sim_locs != NULL) free(n_sim_locs); n_sim_locs = NULL; } void setup_beta(DATA **d, int n_vars, int n_sim) { double *est; const double *sim = NULL; int i, j, k, sum_n_X = 0, offset, *is_pt = NULL; assert(beta == NULL); /* entered only once */ /* allocate beta */ beta = (double ***) emalloc(n_vars * sizeof(double **)); for (i = 0; i < n_vars; i++) { assert(d[i]->n_list > 0); beta[i] = (double **) emalloc(n_sim * sizeof(double *)); for (j = 0; j < n_sim; j++) beta[i][j] = (double *) emalloc(d[i]->n_X * sizeof(double)); } for (i = 0; i < n_vars; i++) { if (d[i]->beta == NULL) /* push bogus values */ for (j = 0; j < d[i]->n_X; j++) d[i]->beta = push_d_vector(-9999.9, d[i]->beta); sum_n_X += d[i]->n_X; } printlog("drawing %d %s%s realisation%s of beta...\n", n_sim, n_vars > 1 ? (gl_sim_beta == 0 ? "multivariate " : "univariate ") : "", gl_sim_beta == 2 ? "OLS" : "GLS", n_sim > 1 ? "s" : ""); is_pt = (int *) emalloc(sum_n_X * sizeof(int)); if (gl_sim_beta == 0) { est = make_gls_mv(d, n_vars); for (j = 0; j < n_sim; j++) { sim = cond_sim(est, sum_n_X, GSI, is_pt, 0); /* length sum_n_X */ for (i = offset = 0; i < n_vars; i++) { for (k = 0; k < d[i]->n_X; k++) beta[i][j][k] = sim[offset + k]; offset += d[i]->n_X; if (DEBUG_DUMP || DEBUG_COV) { printlog("var=%d, sim=%d, beta=[ ", i, j); for (k = 0; k < d[i]->n_X; k++) printlog("%g ", beta[i][j][k]); printlog("]\n"); } } } efree(est); } else { for (i = 0; i < n_vars; i++) { if (gl_sim_beta == 1) est = make_gls(d[i], 0); else /* gl_sim_beta == 2 */ est = make_ols(d[i]); for (j = 0; j < n_sim; j++) { sim = cond_sim(est, d[i]->n_X, GSI, is_pt, 0); for (k = 0; k < d[i]->n_X; k++) beta[i][j][k] = sim[k]; if (DEBUG_DUMP || DEBUG_COV) { printlog("var=%d, sim=%d, beta=[ ", i, j); for (k = 0; k < d[i]->n_X; k++) printlog("%g ", beta[i][j][k]); printlog("]\n"); } } efree(est); } } efree(is_pt); return; } void set_beta(DATA **d, int sim, int n_vars, METHOD method) { /* n_vars == 0 --> stratified mode, check d[0]->id to find out which * data we've got here */ int i; assert(d[0]->beta); if (beta == NULL) /* use the values entered by the user */ return; if (get_mode() != STRATIFY) { for (i = 0; i < n_vars; i++) d[i]->beta->val = beta[i][sim]; } else d[0]->beta->val = beta[d[0]->id][sim]; return; } float ***get_msim(void) { return msim; } static unsigned int *get_n_sim_locs_table(unsigned int *size) { unsigned int i, *table; *size = (int) get_n_vars(); table = (unsigned int *) emalloc(*size * sizeof(int)); for (i = 0; i < *size; i++) table[i] = n_pred_locs; return table; } gstat/src/utils.h0000644000176200001440000000272613777370515013522 0ustar liggesusers#ifndef UTILS_H #define UTILS_H # include /* size_t */ /* some famous beware-of-side-effects macro's ! */ #ifndef MAX # define MAX(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a,b) (((a) < (b)) ? (a) : (b)) #endif #ifndef ABS #define ABS(a) (((a) >= 0) ? (a) : (-(a))) #endif #ifndef SQR # define SQR(a) ((a)*(a)) #endif #ifndef PI # define PI 3.14159265359 #endif #define NULS(a) (a==NULL ? "" : a) /* LTI: lower triangular matrix index, stored in an array: col | 0 1 2 3 ----+------- 0 | 0 r 1 | 1 2 o 2 | 3 4 5 w 3 | 6 7 8 9 row and col may be interchanged: LTI(a,b)==LTI(b,a) LTI2(a,b) is the index of an off-diagonal lower triangular matrix: col | 0 1 2 3 ----+------- 0 | x r 1 | 0 x o 2 | 1 2 x w 3 | 3 4 5 x */ #define LTI(r,c) ((r) >= (c) ? (((r)*(r+1))>>1)+(c) : (((c)*(c+1))>>1)+(r)) #define LTI2(r,c) ((r) >= (c) ? (((r)*(r-1))>>1)+(c) : (((c)*(c-1))>>1)+(r)) /* Note: `>>1' replaced `/2' to circumvent an hp 10.20 optimizer bug */ #if defined(__cplusplus) extern "C" { #endif typedef struct { char *str; unsigned int max_length; } STRING_BUFFER; void set_mv_float(float *f); void set_mv_double(double *d); int is_mv_float(const float *f); int is_mv_double(const double *d); int almost_equals(const char *tok, const char *str); void *emalloc(size_t size); void *ecalloc(size_t nobj, size_t size); void *erealloc(void *p, size_t size); void efree(void *p); #if defined(__cplusplus) } #endif #endif /* UTILS_H */ gstat/src/getest.h0000644000176200001440000000010613777370515013643 0ustar liggesusersvoid get_est(DATA **data, METHOD method, DPOINT *where, double *est); gstat/src/msim.h0000644000176200001440000000112513777370515013317 0ustar liggesusersvoid save_sim(DATA **data, DPOINT *where, int sim, int n_vars, const double *value, int *is_pt); void save_sim_strat(DATA *d, DPOINT *where, int sim, double value, int is_pt); void restore_data_sel(DATA **data, int sim, int n_vars); void save_simulations_to_ascii(const char *fname); void save_simulations_to_maps(GRIDMAP *mask); void lhs(DATA **d, int n_vars, int stratify); void init_simulations(DATA **d); void set_beta(DATA **d, int sim, int n_vars, METHOD method); void setup_beta(DATA **d, int n_vars, int n_sim); void print_sim(void); void free_simulations(void); float ***get_msim(void); gstat/src/vario.h0000644000176200001440000001470113777370515013476 0ustar liggesusers#ifndef VARIO_H # define VARIO_H /* avoid multiple inclusion */ typedef enum { NOTSPECIFIED = 0, SEMIVARIOGRAM, CROSSVARIOGRAM, COVARIOGRAM, CROSSCOVARIOGRAM, PRSEMIVARIOGRAM /* pairwise relative semivariogram */ } SAMPLE_VGM_TYPE; extern const char *vgm_type_str[]; #define LENGTH_OF_MODEL 100 /* max string length for one variogram model */ typedef enum { ZERO_DEFAULT = 0, ZERO_INCLUDE, ZERO_AVOID, ZERO_SPECIAL } DO_AT_ZERO; typedef struct { double tm[3][3]; /* 3D-transformation matrix */ double angle[3]; /* angle in , ccl from pos x; angle up; rot. angle */ double ratio[2]; /* ratio axis2:axis1, ratio axis axis3:axis1 */ } ANIS_TM; typedef enum { NO_FIT = 0, WLS_FIT = 1, WLS_FIT_MOD = 2, /* 3, 4: gnuplot fits not supported */ MIVQUE_FIT = 5, OLS_FIT = 6, WLS_NHH = 7 } FIT_TYPE; typedef struct { int n_est, n_max, cloud, plot_numbers, is_asym; int recalc, refit, pseudo, is_directional; double *gamma, *dist; unsigned long *nh; double cutoff, iwidth; SAMPLE_VGM_TYPE evt; FIT_TYPE fit; DO_AT_ZERO zero; void *map, /* variogram map structure, i/o using files */ *S_grid /* variogram map structure, passed from S interface*/ ; struct { double x, y, z; } direction; DPOINT ***pairs; /* optionally, the point pair list -- for j in [ 0, nh[i] > ((DPOINT ***)pairs)[i][j*2] and its successor are two pointers to a pair of data points that were used to calculate gamma[i]. The length of pairs is (at least) nh[i] * 2. See register_pairs() */ } SAMPLE_VGM; /* a sample variogram */ typedef enum { NOT_SP = 0, NUGGET, EXPONENTIAL, SPHERICAL, GAUSSIAN, EXCLASS, MATERN, STEIN, CIRCULAR, LINEAR, BESSEL, PENTASPHERICAL, PERIODIC, WAVE, HOLE, LOGARITHMIC, POWER, SPLINE, LEGENDRE, MERROR, INTERCEPT } VGM_MODEL_TYPE; typedef struct { VGM_MODEL_TYPE model; const char *name, *name_long; double (*fn)(double h, double *r), /* variogram value at h of basic model */ (*da_fn)(double h, double *r); /* it's derivative to the range parm. */ } V_MODEL; extern const V_MODEL v_models[]; #define NRANGEPARS 2 /* max number of range parameters in variogram models */ typedef struct { VGM_MODEL_TYPE model; int fit_sill, fit_range, id; double range[NRANGEPARS], sill, (*fnct)(double h, double *r), /* (partial) unit variogram function */ (*da_fnct)(double h, double *r); /* (partial) derivative to range of unit variogram */ ANIS_TM *tm_range; } VGM_MODEL; typedef struct { long n; /* length */ double maxdist, *values; ANIS_TM *tm_range; } COV_TABLE; #define COV_TABLE_VALUE(tablep, dist) \ (dist >= tablep->maxdist ? tablep->values[tablep->n - 1] : \ tablep->values[(int) (tablep->n * (dist / tablep->maxdist))]) #define SEM_TABLE_VALUE(tablep, dist) \ (tablep->values[0] - COV_TABLE_VALUE(tablep, dist)) typedef struct { int n_models, max_n_models, n_fit, id, id1, id2, block_semivariance_set, block_covariance_set, isotropic, is_valid_covariance, fit_is_singular; VGM_MODEL *part; /* the basic models */ COV_TABLE *table; /* covariance value table */ double block_semivariance, /* average within-block semivariance */ block_covariance, /* average within-block covariance */ max_range, /* maximum range: where sill is reached */ sum_sills, /* sum of partial sill's */ measurement_error, /* measurement error value--def. zero */ max_val, /* maximum value that is ever reached */ min_val, /* minimum value that is ever reached */ SSErr; /* fit result */ SAMPLE_VGM *ev; } VARIOGRAM; #define dist2(x,y,z) (x*x+y*y+z*z) #define TM_IS3D(tm) \ (tm->angle[1] != 0.0 || tm->angle[2] != 0.0 || tm->ratio[1] < 1.0) #define relative_norm(v,x,y,z) ((v == NULL || dist2(x,y,z) == 0.0) ? 1.0 : \ (transform_norm(NULL,x,y,z)/transform_norm(v,x,y,z))) #define UnitCovariance(part,x,y,z) \ (part.model == INTERCEPT ? (1.0) :\ (1.0 - part.fnct(transform_norm(part.tm_range,x,y,z), part.range))) #define UnitSemivariance(part,x,y,z) \ (part.fnct(transform_norm(part.tm_range,x,y,z), part.range)) #define Covariance(part,x,y,z) (part.sill * UnitCovariance(part,x,y,z)) #define Semivariance(part,x,y,z) (part.sill * UnitSemivariance(part,x,y,z)) #define DA_DELTA 0.001 #define da_Semivariance(part,x,y,z) \ (part.da_fnct != NULL ? \ (part.sill * part.da_fnct(transform_norm(part.tm_range,x,y,z), part.range)) : \ da_general(&(part), transform_norm(part.tm_range, x,y,z))) /* (part.sill * \ (part.fnct(transform_norm(part.tm_range,x,y,z), part.range * (1.0 + DA_DELTA)) - \ part.fnct(transform_norm(part.tm_range,x,y,z), part.range * (1.0 - DA_DELTA))) \ / (2 * part.range * DA_DELTA))) */ #define EPSILON 1.0e-30 /* for small, non-zero anisotropy ratios */ #define is_covariogram(v) \ ((v->ev->evt==COVARIOGRAM||v->ev->evt==CROSSCOVARIOGRAM)) #define is_variogram(v) \ ((v->ev->evt==SEMIVARIOGRAM||v->ev->evt==CROSSVARIOGRAM)) #define is_direct(v) \ ((v->ev->evt==COVARIOGRAM||v->ev->evt==SEMIVARIOGRAM)) #define is_cross(v) \ ((v->ev->evt==CROSSCOVARIOGRAM||v->ev->evt==CROSSVARIOGRAM)) #define MODELHASNORANGE(m) (m == NUGGET || m == INTERCEPT) #define PARTHASNORANGE(m) (m->model == NUGGET || m->model == INTERCEPT || \ (m->model == LINEAR && m->range == 0.0)) #if defined(__cplusplus) extern "C" { #endif extern const char *v_model_gnuplot[]; extern const char *v_model_names[]; extern const char *c_model_gnuplot[]; VARIOGRAM *init_variogram(VARIOGRAM *v); SAMPLE_VGM *init_ev(void); void vgm_init_block_values(VARIOGRAM *v); void free_variogram(VARIOGRAM *v); void logprint_variogram(const VARIOGRAM *v, int verbose); void fprint_variogram(FILE *f, const VARIOGRAM *v, int verbose); const char *sprint_variogram(const VARIOGRAM *v, int verbose); double get_semivariance(const VARIOGRAM *v, double dx, double dy, double dz); double get_covariance (const VARIOGRAM *v, double dx, double dy, double dz); double transform_norm(const ANIS_TM *tm, double dx, double dy, double dz); void check_variography(const VARIOGRAM **v, int n); void update_variogram(VARIOGRAM *vp); double get_max_sills(int n); double da_general(VGM_MODEL *p, double h); int push_variogram_model(VARIOGRAM *v, VGM_MODEL part); VGM_MODEL_TYPE which_variogram_model(const char *m); double relative_nugget(VARIOGRAM *v); int vario(int argc, char **argv); DO_AT_ZERO zero_int2enum(int zero); void push_to_v(VARIOGRAM *v, const char *mod, double sill, double *range, int nrangepars, double *d, int fit_sill, int fit_range); void push_to_v_table(VARIOGRAM *v, double maxdist, int length, double *values, double *anis); #if defined(__cplusplus) } #endif #endif /* VARIO_H */ gstat/src/nsearch.h0000644000176200001440000000137013777370515013777 0ustar liggesusers#ifndef SEARCH_H # define SEARCH_H /* avoid multiple inclusion */ void qtree_free(QTREE_NODE *node); void qtree_pop_point(DPOINT *p, DATA *d); void qtree_push_point(DATA *d, DPOINT *p); void qtree_rebuild(DATA *d); int qtree_select(DPOINT *where, DATA *d); /* 2-norm distances from point to block: */ double pb_norm_3D(const DPOINT *where, BBOX bbox); double pb_norm_2D(const DPOINT *where, BBOX bbox); double pb_norm_1D(const DPOINT *where, BBOX bbox); /* define the maximum depth of the quadtree; * Fri Jul 4 12:05:47 CEST 2003 * if this is not defined, more than gl_split points at * a single spatial location cause infinite recursion * 10 seems a reasonable value: 1/2048 of the bbox dim * */ #define MAX_RECURSION_DEPTH 11 #endif /* SEARCH_H */ gstat/src/block.h0000644000176200001440000000014413777370515013444 0ustar liggesusersDATA *block_discr(DATA *d, const DPOINT *block, const DPOINT *where); void reset_block_discr(void); gstat/src/reml.h0000644000176200001440000000035213777370515013312 0ustar liggesusersVARIOGRAM *reml_sills(DATA *d, VARIOGRAM *vp); #ifdef MATRIXH MAT *XVXt_mlt(MAT *X, MAT *V, MAT *out); MAT *XtVX_mlt(MAT *X, MAT *V, MAT *out); MAT *XdXt_mlt(MAT *X, VEC *d, MAT *out); MAT *XtdX_mlt(MAT *X, VEC *d, MAT *out); #endif gstat/src/s.h0000644000176200001440000000024613777370515012617 0ustar liggesusersvoid s_gstat_error(const char *mess, int level); void s_gstat_warning(const char *mess); double r_normal(void); double r_uniform(void); extern int do_print_progress; gstat/src/mapio.c0000644000176200001440000000622513777370515013460 0ustar liggesusers/* * former mapio io functions, now only skeleton things doing row/col <--> x/y */ #include /* floor() */ #include /* FLT_MAX */ #include "defs.h" #include "glvars.h" #include "utils.h" #include "debug.h" #include "userio.h" #include "mapio.h" static GRIDMAP *write_error(GRIDMAP * m); #define SWAP_N(a,n) swap_floats((unsigned char *)a,n) #define SWAP_M_N(a,m,n) swap_multiformat((unsigned char *)a,m,n) #define CHECK_ROWS 1 #define CHECK_COLS 2 #define CHECK_CELLSIZE 4 #define CHECK_X_UL 8 #define CHECK_Y_UL 16 #define CHECK_SUM 31 /* sum of all checks */ #define BINARY_NATIVE 1 #define BINARY_NON_NATIVE 2 #define DEFAULT_MISVAL -9999.0 #define SURFER_MISVAL 1.70141E+38 /* * create a new GRIDMAP structure * allocates memory and initializes all fields for a GRIDMAP structure * returns: pointer to GRIDMAP structure */ GRIDMAP *new_map(MAP_READ_STATUS status) { GRIDMAP *map; map = (GRIDMAP *) emalloc(sizeof(GRIDMAP)); map->status = status; map->type = MT_UNKNOWN; map->history = NULL; map->description = NULL; map->filename = NULL; map->rows = 0; map->cols = 0; map->base_size = 0; map->grid = NULL; map->base = NULL; map->first_time_row = NULL; map->is_binary = 0; map->celltype = CT_UNKNOWN; map->misval = DEFAULT_MISVAL; /* only for arcgrid */ map->cellmin = map->cellmax = FLT_MAX; map->CSF_MAP = NULL; map->write = write_error; map->read_row = map->write_row = NULL; map->current_row = 0; return map; } static GRIDMAP *write_error(GRIDMAP * m) { pr_warning("%s: writing this map format is not supported", m->filename); assert(0); return NULL; } /* * give x,y coordinate of cell center for cell [row, col] * libcsf has it's own function; other formats assume increasing x * for increasing cols and decreasing y for increasing rows * returns: non-zero if row or col are outside map limits */ int map_rowcol2xy(GRIDMAP * m, /* pointer to gridmap */ unsigned int row, /* current row number */ unsigned int col, /* current column number */ double *x, /* return value: pointer to x-coordinate */ double *y /* return value: pointer to y-coordinate */ ) { assert(m); assert(x); assert(y); if (row >= m->rows || col >= m->cols) return 1; *x = m->x_ul + (col + 0.5) * m->cellsizex; *y = m->y_ul - (row + 0.5) * m->cellsizey; return 0; } /* * converts x and y coordinate to (row,col) pair. * * see comment for map_rowcol2xy() * * returns: non-zero if x or y are outside map limits */ int map_xy2rowcol(GRIDMAP * m /* pointer to map */ , double x, /* x-coordinate */ double y, /* y-coordinate */ unsigned int *row, /* output value: pointer to row number */ unsigned int *col /* output value: pointer to column number */ ) { assert(m); assert(row); assert(col); if (x < m->x_ul || x > m->x_ul + m->cols * m->cellsizex || y > m->y_ul || y < m->y_ul - m->rows * m->cellsizey) return 1; *row = (unsigned int) floor((m->y_ul - y) / m->cellsizey); *col = (unsigned int) floor((x - m->x_ul) / m->cellsizex); if (*row == m->rows) /* on the bottom edge */ *row = *row - 1; if (*col == m->cols) /* on the right edge */ *col = *col - 1; return 0; } gstat/src/gls.h0000644000176200001440000000074213777370515013143 0ustar liggesusersenum GLS_WHAT { GLS_BLUE /* generalized least squares best linear unbiased estimate */, GLS_BLUP /* gls best linear unbiased predictor */, GLS_BLP /* gls best linear predictor */, UPDATE /* update estimate: use previously calculated weights */, GLS_INIT /* initial value */ }; void gls(DATA **d, int n_vars, enum GLS_WHAT pred, DPOINT *where, double *est); double *make_gls(DATA *d, int calc_residuals); double *make_gls_mv(DATA **d, int n_vars); void free_glm(void *v_glm); gstat/src/userio.h0000644000176200001440000000302413777370515013660 0ustar liggesusers#ifndef USERIO_H #define USERIO_H enum Gstat_errno { ER_NOERROR = 0 /* no error */, ER_NULL = 1 /* internal error: should not occur */, ER_VARNOTSET = 2 /* a required variable was not set by the user */, ER_RANGE = 3 /* range error (outside permitted values) */, ER_IMPOSVAL = 4 /* a variable was set to an illegal value */, ER_WRITE = 6 /* write error on file */, ER_READ = 7 /* read error on file */, ER_RDFLT = 8 /* error while converting a string to a float */, ER_RDINT = 9 /* error while converting a string to an int */, ER_SYNTAX = 10 /* syntax error */, ER_ARGOPT = 11 /* error in command line option arguments */, ER_DOMAIN = 12 /* math error */, ER_MEMORY = 13 /* memory exhausted */, ER_IO = 14 /* i/o conflict (e.g. redirection not permitted) */, ER_NOCMD = 15 /* no command file specified */, ER_NOCURSES = 16 /* no curses user interface compiled in */, ER_PWRITE = 17 /* error while writing to a pipe */, ER_PREAD = 18 /* error while reading from a pipe */, ER_SECURE = 19 /* secure mode: operation not allowed */ }; #define MAX_ERRNO 19 void message(char *fmt, ...); /* message() calls always preceed ErrMsg() */ #define ErrMsg(a,b) gstat_error(__FILE__,__LINE__,a,b) void gstat_error(char *fname, int line, enum Gstat_errno err_nr, const char *msg); void pr_warning(char *fmt, ...); void printlog(const char *fmt, ...); void print_progress(unsigned int current, unsigned int total); #endif /* USERIO_H */ gstat/src/Makevars0000644000176200001440000000006013777370515013672 0ustar liggesusersPKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) gstat/src/mtrx.h0000644000176200001440000000377013777370515013354 0ustar liggesusers#ifndef MTRXH # define MTRXH /* interface copied from meschach; implementation rewritten from scratch */ typedef struct { size_t m, n, /* #rows, #cols */ max; /* max size, memory allocated */ double *v; } MAT; /* dense matrix */ #define ME(X,i,j) X->v[j * X->m + i] /* row i, column j, column-major access */ typedef struct { size_t dim, max; double *ve; } VEC; /* vector: row or column, whatever matches */ typedef struct { size_t size, max; int *pe; } PERM; typedef struct { size_t size, max; int *ive; } IVEC; #define PNULL (PERM *) NULL #define MNULL (MAT *) NULL #define VNULL (VEC *) NULL #define IVNULL (IVEC *) NULL #define M_FREE(x) { if (x != NULL) m_free(x); x = MNULL; } #define V_FREE(x) { if (x != NULL) v_free(x); x = VNULL; } #define P_FREE(x) { if (x != NULL) px_free(x); x = PNULL; } void m_free(MAT *m); void v_free(VEC *v); void iv_free(IVEC *v); void px_free(PERM *p); #define m_get(i,j) m_resize(MNULL, i, j) #define v_get(i) v_resize(VNULL, i) MAT *m_resize(MAT *mat, size_t m, size_t n); VEC *v_resize(VEC *v, size_t n); PERM *px_resize(PERM *p, size_t n); IVEC *iv_resize(IVEC *v, size_t n); MAT *m_zero(MAT *m); VEC *v_zero(VEC *v); MAT *m_inverse(MAT *in, int *info); VEC *vm_mlt(MAT *m, VEC *v, VEC *out); VEC *mv_mlt(MAT *m, VEC *v, VEC *out); MAT *m_mlt(MAT *m1, MAT *m2, MAT *out); MAT *mtrm_mlt(MAT *m1, MAT *m2, MAT *out); VEC *v_sub(VEC *v1, VEC *v2, VEC *out); MAT *m_sub(MAT *m1, MAT *m2, MAT *out); VEC *v_add(VEC *v1, VEC *v2, VEC *out); VEC *sv_mlt(double s, VEC *v1, VEC *v2); MAT *m_add(MAT *m1, MAT *m2, MAT *out); MAT *m_copy(MAT *in, MAT *out); VEC *v_copy(VEC *in, VEC *out); double v_norm2(VEC *v); MAT *CHsolve(MAT *A, MAT *b, MAT *out, PERM *piv); VEC *CHsolve1(MAT *A, VEC *b, VEC *out, PERM *piv); MAT *CHfactor(MAT *A, PERM *piv, int *info); double in_prod(VEC *a, VEC *b); MAT *sm_mlt(double s, MAT *m1, MAT *out); MAT *ms_mltadd(MAT *m1, MAT *m2, double s, MAT *out); MAT *mmtr_mlt(MAT *m1, MAT *m2, MAT *out); void m_logoutput(MAT *a); void v_logoutput(VEC *x); #endif gstat/src/gcdist.h0000644000176200001440000000011113777370515013621 0ustar liggesusersdouble gstat_gcdist(double lon1, double lon2, double lat1, double lat2); gstat/src/vario_io.c0000644000176200001440000001011113777370515014147 0ustar liggesusers/* * vario_io.c: functions for point-point, point-block (co/semi)variances */ #include #include #include #include "userio.h" #include "debug.h" #include "data.h" #include "vario.h" #include "block.h" #include "glvars.h" /* get_block_p(), gl_zero, gl_longlat */ #include "vario_io.h" static double sem_cov_blocks(VARIOGRAM *v, DATA *a, DATA *b, int sem); double sem_cov_ab(VARIOGRAM *v, DPOINT *a, DPOINT *b, int sem) /* * return Cov(a,b) or Sem(a,b), * taking care of IS_BLOCK(a) and IS_BLOCK(b): */ { static DATA *Discr_a = NULL, *Discr_b = NULL; static DPOINT *block_p = NULL; DPOINT *tmp; if (block_p == NULL) block_p = get_block_p(); if (a == b) { if (IS_POINT(a)) return sem_cov_blocks(v, NULL, NULL, sem); Discr_a = block_discr(Discr_a, block_p, a); return sem_cov_blocks(v, Discr_a, Discr_a, sem); } /* * if one of them IS_BLOCK, make sure it's a: * (because block_discr() will otherwise store block * discretisations in both Discr_a and Discr_b) */ if (IS_POINT(a) && IS_BLOCK(b)) { tmp = a; a = b; b = tmp; /* swap a and b */ } Discr_a = block_discr(Discr_a, block_p, a); Discr_b = block_discr(Discr_b, block_p, b); return sem_cov_blocks(v, Discr_a, Discr_b, sem); } static double sem_cov_blocks(VARIOGRAM *v, DATA *a, DATA *b, int sem) { /* * Purpose : calculates (once) and returns Cov(a,b); * if a==b && a denotes a block discretisation, the value * is put in a->block_variance and a->block_xxx_set gets 1 * Created by : Edzer J. Pebesma * Date : 25 jan 1992, 3 june 1993 * Prerequisites : none * Returns : sem == 1 ? Sem(a,b) : Cov(a,b) * Side effects : none */ int i, j; double block_value, dx, dy = 0.0, dz = 0.0, dist, ret, weight, dzero2; DPOINT *dpa, *dpb; /* if (a->what_is_u != U_ISWEIGHT || b->what_is_u != U_ISWEIGHT) ErrMsg(ER_IMPOSVAL, "weights needed in SevCov_Blocks()"); */ if (a == NULL) return sem ? get_semivariance(v, 0.0, 0.0, 0.0) : get_covariance(v, 0.0, 0.0, 0.0); if (a->n_list == 1 && b->n_list == 1) { /* point--point */ if (gl_longlat) { if (! v->isotropic) ErrMsg(ER_IMPOSVAL, "for long/lat data, anisotropy cannot be defined"); dist = pp_norm_gc(a->list[0], b->list[0]); ret = sem ? get_semivariance(v, dist, 0.0, 0.0): get_covariance(v, dist, 0.0, 0.0); /* printf("ll dist: %g, ret.val %g\n", dist, ret); */ return ret; } else { return sem ? get_semivariance(v, a->list[0]->x - b->list[0]->x, a->list[0]->y - b->list[0]->y, a->list[0]->z - b->list[0]->z): get_covariance(v, a->list[0]->x - b->list[0]->x, a->list[0]->y - b->list[0]->y, a->list[0]->z - b->list[0]->z); } } /* now a->n_list > 1 or b->n_list > 1: block--block or point--block */ if (gl_longlat) ErrMsg(ER_IMPOSVAL, "block kriging for long-lat data undefined"); if (a == b) { /* block--block for a single block */ if (sem && v->block_semivariance_set) return v->block_semivariance; if (!sem && v->block_covariance_set) return v->block_covariance; } /* else: continue */ dzero2 = gl_zero * gl_zero; block_value = 0.0; for (i = 0; i < a->n_list; i++) { for (j = 0; j < b->n_list; j++) { /* compare all points with all p */ dpa = a->list[i]; dpb = b->list[j]; weight = dpa->u.weight * dpb->u.weight; /* avoid the "zero-effect" if a or b is block: */ dx = dpa->x - dpb->x; dy = dpa->y - dpb->y; dz = dpa->z - dpb->z; /* avoid ``zero-effect'': */ if (a->pp_norm2(dpa, dpb) < dzero2) { dx = (dx >= 0 ? gl_zero : -gl_zero); if (a->mode & Y_BIT_SET) dy = (dy >= 0 ? gl_zero : -gl_zero); if (a->mode & Z_BIT_SET) dz = (dz >= 0 ? gl_zero : -gl_zero); } if (sem) block_value += weight * get_semivariance(v, dx, dy, dz); else block_value += weight * get_covariance(v, dx, dy, dz); } /* for j */ } /* for i */ if (a == b) { /* remember within block cov./sem.: */ if (sem) { v->block_semivariance = block_value; v->block_semivariance_set = 1; } else { v->block_covariance = block_value; v->block_covariance_set = 1; } } return block_value; } gstat/src/defaults.h0000644000176200001440000000366013777370515014167 0ustar liggesusers#ifndef DEFAULTS_H #include /* INT_MAX */ #include /* DBL_EPSILON */ # define DEFAULTS_H /* avoid multiple inclusion */ #define DEF_alpha 0.0 #define DEF_beta 0.0 #define DEF_blas 1 #define DEF_bounds NULL #define DEF_coincide -1 #define DEF_choleski 1 #define DEF_cressie 0 #define DEF_cutoff -1.0 #define DEF_dots 500 #define DEF_fit 0 #define DEF_fit_limit 1.0E-5 #define DEF_fraction 0.33333 /* fraction of max_dist for def. cutoff */ #define DEF_gauss 1 #define DEF_gpterm NULL #define DEF_idp 2.0 #define DEF_intervals 15 /* default number of intervals */ #define DEF_is_pdf 0 /* default to cdf indicator simulation */ #define DEF_iter 200 #define DEF_iwidth -1.0 #define DEF_jgraph 0 #define DEF_lhs 0 #define DEF_longlat 0 #define DEF_n_marginals 0 #define DEF_nocheck 0 /* do check */ #define DEF_marginal_names NULL #define DEF_marginal_values NULL #define DEF_nblockdiscr 4 #define DEF_n_uk INT_MAX #define DEF_numbers 1 #define DEF_nsim 1 #define DEF_ofilename NULL #define DEF_order 0 #define DEF_plotweights 0 #define DEF_pairs 0 #define DEF_quantile 0.5 #define DEF_rowwise 1 #define DEF_rp 1 #define DEF_seed 0 #define DEF_sim_beta 0 #define DEF_sparse 0 #define DEF_spiral 0 #define DEF_split 4 #define DEF_sym_ev 0 #define DEF_table_size 0 #define DEF_tol_hor 180.0 #define DEF_tol_ver 180.0 #define DEF_gls_residuals 0 #define DEF_xvalid 0 #define DEF_zero (DBL_EPSILON * 10.0) #define DEF_zero_est 0 /* ZERO_DEFAULT */ #define DEF_zmap 0.0 #endif /* DEFAULTS_H */ gstat/src/debug.h0000644000176200001440000000412313777370515013441 0ustar liggesusers#ifndef DEBUG_H # define DEBUG_H /* avoid multiple inclusion */ extern int debug_level; /* * DEBUG macro's: */ #define DB_HELP (-1) /* print debug help */ #define DB_SILENT (0) #define DB_NORMAL (1UL << 0) #define DB_DUMP (1UL << 1) /* dump global variabels */ #define DB_FIT (1UL << 2) /* fit diagnostics */ #define DB_DATA (1UL << 3) /* drop data */ #define DB_SEL (1UL << 4) /* drop selection */ #define DB_COV (1UL << 5) /* drop covariances */ #define DB_ORDER (1UL << 6) /* order relation violation */ #define DB_FORCE (1UL << 7) /* print warning if neighbourhood selection */ #define DB_TRACE (1UL << 8) /* print numbers */ #define DB_BLOCK (1UL << 9) /* block discretization diagnostics (data) */ extern void printlog(const char *fmt, ...); #define DUMP(a); {if(debug_level & DB_DUMP) { printlog("%s", a); }} #define DEBUG_HELP (debug_level & DB_HELP) #define DEBUG_SILENT (debug_level == DB_SILENT) #define DEBUG_NORMAL (debug_level & DB_NORMAL) #define DEBUG_DUMP (debug_level & DB_DUMP) #define DEBUG_FIT (debug_level & DB_FIT) #define DEBUG_DATA (debug_level & DB_DATA) #define DEBUG_SEL (debug_level & DB_SEL) #define DEBUG_COV (debug_level & DB_COV) #define DEBUG_ORDER (debug_level & DB_ORDER) #define DEBUG_VGMFIT (debug_level & DB_ORDER) #define DEBUG_FORCE (debug_level & DB_FORCE) #define DEBUG_TRACE (debug_level & DB_TRACE) #define DEBUG_BLOCK (debug_level & DB_BLOCK) #define DEBUG_OPTIONS "\ # gstat debug option values:\n\ 0: no output, be silent (same as -s)\n\ 1: normal output (default value)\n\ 2: print all global variables and extended error messages\n\ 4: print OLS and WLS fit diagnostics\n\ 8: print all data\n\ 16: print every neighbourhood selection\n\ 32: print all covariance matrices, solutions, design matrices etc.\n\ 64: print variogram fit diagnostics and order relation violations\n\ 128: print warning on forced neighbourhoods\n\ 256: print current row,column or record number\n\ 512: print block discretization points (data)\n\ to combine options, sum their values -- 1023 invokes them all\n" #endif /* DEBUG_H */ gstat/src/vario_io.h0000644000176200001440000000156513777370515014171 0ustar liggesusersdouble sem_cov_ab(VARIOGRAM *v, DPOINT *a, DPOINT *b, int sem); /* covariance: */ #define COVARIANCE(v,a,b) ((IS_POINT(a) && IS_POINT(b) && !gl_longlat) ? \ (get_covariance(v,a->x - b->x,a->y - b->y, a->z - b->z)) : \ sem_cov_ab(v,a,b,0)) /* generalized covariance: */ #define GCV(v,a,b) ((IS_POINT(a) && IS_POINT(b) && !gl_longlat) ? \ (v->max_val - get_semivariance(v,a->x - b->x,a->y - b->y, a->z - b->z)) : \ (v->max_val - sem_cov_ab(v,a,b,1))) /* * CME is the measurement error-adjustment to GCV or COVARIANCE: * see Cressie, Statistics for Spatial Data, revised ed. 1993, * eq. 3.2.25-3.2.27, and page 379 */ #define CME(v,a,b,dist) ((IS_POINT(a) && IS_POINT(b) && \ (a == b || dist(a, b) == 0.0)) ? v->measurement_error : 0.0) #define GCV0(v,a,b,dist) (GCV(v,a,b) - CME(v,a,b,dist)) #define COVARIANCE0(v,a,b,dist) (COVARIANCE(v,a,b) - CME(v,a,b,dist)) gstat/src/s.c0000644000176200001440000007431714127264041012606 0ustar liggesusers/* * all functions exposed to R */ #include #include /* #include */ #include "defs.h" #include "data.h" #include "select.h" #include "utils.h" #include "userio.h" #include "vario.h" #include "fit.h" #include "sem.h" #include "glvars.h" #include "debug.h" #include "mapio.h" #include "msim.h" #include "getest.h" #include "s.h" static DATA_GRIDMAP *gstat_S_fillgrid(SEXP gridparams); static void gstat_set_block(long i, SEXP block, SEXP block_cols, DPOINT *current); int do_print_progress = 0; #define NAME_SIZE 20 /* buffer size for name */ extern unsigned int n_pred_locs; /* msim.c */ SEXP gstat_init(SEXP s_debug_level) { do_print_progress = 0; remove_all(); init_global_variables(); init_data_minmax(); GetRNGstate(); debug_level = INTEGER(s_debug_level)[0]; if (debug_level < 0) { debug_level = -debug_level; do_print_progress = 1; } return(s_debug_level); } SEXP gstat_exit(SEXP x) { PutRNGstate(); /* write seed back to R/S engine */ remove_all(); return(x); } SEXP gstat_new_data(SEXP sy, SEXP slocs, SEXP sX, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP force, SEXP vfn, SEXP sw, SEXP grid, SEXP degree, SEXP is_projected, SEXP vdist, SEXP lambda, SEXP omax) { double *y, *locs, *X, *w = NULL; long i, j, id, n, dim, n_X, has_int; DPOINT current; DATA **d; char name[NAME_SIZE]; PROTECT(sy = coerceVector(sy, REALSXP)); n = LENGTH(sy); y = REAL(sy); if (n == 0) ErrMsg(ER_IMPOSVAL, "no data read"); if (LENGTH(slocs) % n != 0) error("dimensions do not match: locations %d and data %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim <= 0) error("too few spatial dimensions: %ld", dim); if (dim > 3) error("too many spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sw) == n) w = REAL(sw); if (LENGTH(sX) % n != 0) error("dimensions do not match: X %d and data %ld: missing values in data?", (int) LENGTH(sX), n); n_X = LENGTH(sX) / n; X = REAL(sX); assert(n_X > 0); current.z = 0.0; current.bitfield = 0; id = get_n_vars(); snprintf(name, NAME_SIZE, "var%ld", id); which_identifier(name); d = get_gstat_data(); d[id]->id = id; d[id]->n_list = d[id]->n_max = 0; d[id]->colnx = d[id]->colny = d[id]->colnvalue = d[id]->colnz = 0; d[id]->x_coord = "x"; d[id]->y_coord = "y"; d[id]->z_coord = "z"; d[id]->variable = "R data"; d[id]->fname = "R data"; d[id]->lambda = REAL(lambda)[0]; has_int = INTEGER(has_intercept)[0]; /* increase d[id]->n_X and set d[id]->colX[i]: */ for (i = d[id]->n_X = 0; i < n_X; i++) data_add_X(d[id], i + (has_int ? 0 : 1)); assert(d[id]->n_X == n_X); for (i = 0; i < LENGTH(beta); i++) /* do nothing if beta is numeric(0) */ d[id]->beta = push_d_vector(REAL(beta)[i], d[id]->beta); if (INTEGER(nmax)[0] > 0) /* leave default (large) if < 0 */ d[id]->sel_max = INTEGER(nmax)[0]; if (INTEGER(omax)[0] > 0) /* leave default (0) if <= 0 */ d[id]->oct_max = INTEGER(omax)[0]; if (INTEGER(nmin)[0] > 0) /* leave default (0) if <= 0 */ d[id]->sel_min = INTEGER(nmin)[0]; if (REAL(maxdist)[0] > 0.0) d[id]->sel_rad = REAL(maxdist)[0]; if (INTEGER(force)[0] > 0) d[id]->force = INTEGER(force)[0]; switch(INTEGER(vfn)[0]) { case 1: /* d[id]->variance_fn = v_identity; == leave NULL */ break; case 2: d[id]->variance_fn = v_mu; break; case 3: d[id]->variance_fn = v_bin; break; case 4: d[id]->variance_fn = v_mu2; break; case 5: d[id]->variance_fn = v_mu3; break; default: error("unknown variance function %d", INTEGER(vfn)[0]); } gl_longlat = (INTEGER(is_projected)[0] == 0); d[id]->mode = X_BIT_SET | V_BIT_SET; if (dim > 1) d[id]->mode = d[id]->mode | Y_BIT_SET; if (dim > 2) d[id]->mode = d[id]->mode | Z_BIT_SET; set_norm_fns(d[id]); /* so gstat can calculate distances */ if (w != NULL) d[id]->colnvariance = 1; /* it is set */ switch(LENGTH(grid)) { case 0: case 1: break; /* empty, i.e., numeric(0) */ case 6: d[id]->grid = gstat_S_fillgrid(grid); break; default: error("length of grid topology %d unrecognized", (int) LENGTH(grid)); } d[id]->polynomial_degree = INTEGER(degree)[0]; if (d[id]->polynomial_degree < 0 || d[id]->polynomial_degree > 3) { error("polynomial degree should be 0, 1, 2 or 3"); } if (d[id]->polynomial_degree > 0) { /* we're doing polynomials through degree: */ if (id > 0) { error("polynomial degree will only work for a single variable"); } if (n_X > 1) { error("polynomial degree only works when no other predictors are given"); } setup_polynomial_X(d[id]); /* standardized coordinate polynomials */ } d[id]->vdist = INTEGER(vdist)[0]; assert(n_X <= d[id]->n_X); current.X = (double *) emalloc(d[id]->n_X * sizeof(double)); SET_POINT(¤t); current.u.stratum = 0; current.attr = current.x = current.y = current.z = 0.0; for (i = 0; i < n; i++) { /* loop over points */ current.attr = y[i]; current.x = locs[i]; if (dim >= 2) current.y = locs[n + i]; if (dim >= 3) current.z = locs[2 * n + i]; /* track min/max coordinates, also for z, for the qtree bbox */ if (i == 0) { d[id]->maxX = d[id]->minX = current.x; d[id]->maxY = d[id]->minY = current.y; d[id]->maxZ = d[id]->minZ = current.z; } else { d[id]->minX = MIN(d[id]->minX, current.x); d[id]->maxX = MAX(d[id]->maxX, current.x); d[id]->minY = MIN(d[id]->minY, current.y); d[id]->maxY = MAX(d[id]->maxY, current.y); d[id]->minZ = MIN(d[id]->minZ, current.z); d[id]->minZ = MIN(d[id]->minZ, current.z); } for (j = 0; j < n_X; j++) current.X[j] = X[j * n + i]; if (w != NULL) current.variance = 1.0/(w[i]); push_point(d[id], ¤t); } check_global_variables(); d[id]->n_original = d[id]->n_list; efree(current.X); UNPROTECT(1); /* sy */ return(sy); } SEXP gstat_new_dummy_data(SEXP loc_dim, SEXP has_intercept, SEXP beta, SEXP nmax, SEXP nmin, SEXP maxdist, SEXP vfn, SEXP is_projected, SEXP vdist) { int i, id, dim, has_int; char name[NAME_SIZE]; DATA **d = NULL; dim = INTEGER(loc_dim)[0]; if (dim <= 0) error("dimension value impossible: %d", dim); if (dim > 3) error("too many dimensions: %d", dim); assert(LENGTH(beta) > 0); id = get_n_vars(); snprintf(name, NAME_SIZE, "var%d", id); which_identifier(name); d = get_gstat_data(); d[id]->id = id; d[id]->n_list = d[id]->n_max = 0; d[id]->colnx = d[id]->colny = d[id]->colnvalue = d[id]->colnz = 0; d[id]->x_coord = "x"; d[id]->y_coord = "y"; d[id]->z_coord = "z"; d[id]->variable = "R data"; d[id]->fname = "R data"; has_int = INTEGER(has_intercept)[0]; for (i = d[id]->n_X = 0; i < LENGTH(beta); i++) data_add_X(d[id], i + (has_int ? 0 : 1)); assert(d[id]->n_X == LENGTH(beta)); d[id]->dummy = 1; for (i = 0; i < LENGTH(beta); i++) d[id]->beta = push_d_vector(REAL(beta)[i], d[id]->beta); if (INTEGER(nmax)[0] > 0) /* leave default (large) if < 0 */ d[id]->sel_max = INTEGER(nmax)[0]; /* I doubt whether using nmin for dummy data _ever_ can have a * meaning, but hey, let's add it anyway. */ if (INTEGER(nmin)[0] > 0) /* leave default (0) if <= 0 */ d[id]->sel_min = INTEGER(nmin)[0]; if (REAL(maxdist)[0] > 0.0) d[id]->sel_rad = REAL(maxdist)[0]; switch(INTEGER(vfn)[0]) { case 1: /* d[id]->variance_fn = v_identity; -> leave NULL */ break; case 2: d[id]->variance_fn = v_mu; break; case 3: d[id]->variance_fn = v_bin; break; case 4: d[id]->variance_fn = v_mu2; break; case 5: d[id]->variance_fn = v_mu3; break; default: error("unknown variance function %d", INTEGER(vfn)[0]); } gl_longlat = (INTEGER(is_projected)[0] == 0); d[id]->vdist = INTEGER(vdist)[0]; d[id]->mode = X_BIT_SET | V_BIT_SET; if (dim > 1) d[id]->mode = d[id]->mode | Y_BIT_SET; if (dim > 2) d[id]->mode = d[id]->mode | Z_BIT_SET; set_norm_fns(d[id]); /* so gstat can calculate distances */ check_global_variables(); d[id]->n_original = d[id]->n_list; return(loc_dim); } SEXP gstat_predict(SEXP sn, SEXP slocs, SEXP sX, SEXP block_cols, SEXP block, SEXP weights, SEXP nsim, SEXP blue) { double *locs, **est_all, *X; long i, j, k, n, nvars, nest, dim, n_X, ncols_block, nrows_block, pos; DPOINT current, *bp = NULL; DATA **d = NULL, *vd = NULL, *area = NULL; SEXP ret; SEXP retvector; SEXP retvector_dim; extern unsigned int n_pred_locs; /* predict.c, used in msim.c */ float ***msim = NULL; nvars = get_n_vars(); nest = nvars + (nvars * (nvars + 1))/2; n = INTEGER(sn)[0]; if (n <= 0 || LENGTH(slocs) == 0 || LENGTH(sX) == 0) ErrMsg(ER_IMPOSVAL, "newdata empty or only NA's"); if (LENGTH(slocs) % n != 0) error("dimensions do not match: locations %d, nrows in X %ld", (int) LENGTH(slocs), n); dim = LENGTH(slocs) / n; if (dim > 3) error("too many spatial dimensions: %ld", dim); if (dim <= 0) error("too few spatial dimensions: %ld", dim); locs = REAL(slocs); if (LENGTH(sX) % n != 0) error("dimensions do not match: X %d and data %ld", (int) LENGTH(sX), n); n_X = LENGTH(sX) / n; current.attr = current.x = current.y = current.z = 0.0; current.bitfield = 0; /* assuming points ... */ SET_POINT(¤t); /* and then do the block thing: */ if (LENGTH(block_cols) == 0) { bp = get_block_p(); bp->x = bp->y = bp->z = 0.0; /* obsolete, I'd guess */ if (LENGTH(block) >= 1) { bp->x = REAL(block)[0]; SET_BLOCK(¤t); } if (LENGTH(block) >= 2) bp->y = REAL(block)[1]; if (LENGTH(block) >= 3) bp->z = REAL(block)[2]; if (LENGTH(block) > 3) pr_warning("block dimension can only be 3; using the first 3"); } else if (LENGTH(block_cols) == 1) { /* if > 1, block contains multiple 2D blocks */ ncols_block = INTEGER(block_cols)[0]; if (ncols_block < 1 || ncols_block > 3) ErrMsg(ER_IMPOSVAL, "block dimensions should be in [1..3]"); nrows_block = LENGTH(block) / ncols_block; /* nr of rows */ if (nrows_block > 0) { area = create_data_area(); area->colnvariance = 0; area->n_list = area->n_max = 0; area->id = ID_OF_AREA; area->mode = X_BIT_SET; if (ncols_block > 1) area->mode = area->mode & Y_BIT_SET; if (ncols_block > 2) area->mode = area->mode & Z_BIT_SET; for (i = 0; i < nrows_block; i++) { current.x = REAL(block)[i]; if (ncols_block > 1) current.y = REAL(block)[nrows_block + i]; if (ncols_block > 2) current.z = REAL(block)[2 * nrows_block + i]; if (LENGTH(weights) > 0) { area->colnvariance = 1; current.variance = REAL(weights)[i]; } push_point(area, ¤t); } SET_BLOCK(¤t); } if (DEBUG_FORCE) print_data_list(area); } X = REAL(sX); assert(n_X > 0); current.X = (double *) emalloc(n_X * sizeof(double)); current.u.stratum = 0; d = get_gstat_data(); est_all = (double **) emalloc(n * sizeof(double *)); for (i = 0; i < n; i++) est_all[i] = (double *) emalloc(nest * sizeof(double)); /* * the following is to fake gstat's default method handling: * we got to suggest that we'll go through a list of prediction * locations, a la the gstat ``data(): ... ;'' command. */ vd = get_dataval(); vd->id = ID_OF_VALDATA; vd->mode = d[0]->mode; /* set min/max[XYZ] */ vd->minY = vd->maxY = vd->minZ = vd->maxZ = 0.0; vd->minX = vd->maxX = locs[0]; for (i = 1; i < n; i++) { vd->minX = MIN(vd->minX, locs[i]); vd->maxX = MAX(vd->maxX, locs[i]); } if (dim >= 2) { vd->minY = vd->maxY = locs[n]; for (i = 1; i < n; i++) { vd->minY = MIN(vd->minY, locs[n + i]); vd->maxY = MAX(vd->maxY, locs[n + i]); } } if (dim >= 3) { vd->minZ = vd->maxZ = locs[2 * n]; for (i = 1; i < n; i++) { vd->minZ = MIN(vd->minZ, locs[2 * n + i]); vd->maxZ = MAX(vd->maxZ, locs[2 * n + i]); } } /* fill, and standardize coordinate predictors from degree = x */ for (i = 0; i < nvars; i++) setup_data_minmax(d[i]); setup_data_minmax(vd); for (i = 0; i < nvars; i++) calc_polynomials(d[i]); /* calc_polynomials(vd); */ /* still no data in fake vd */ vd->polynomial_degree = d[0]->polynomial_degree; if (vd->polynomial_degree > 0) { setup_polynomial_X(vd); /* standardized coordinate polynomials */ current.X = (double *) erealloc(current.X, vd->n_X * sizeof(double)); } /* so far for the faking; now let's see what gstat makes out of this: */ if (INTEGER(nsim)[0] == 0) { if (INTEGER(blue)[0] == 0) { /* FALSE */ if (get_method() == NSP) /* choose default */ set_method(get_default_method()); } else set_method(LSLM); } else { if (INTEGER(nsim)[0] < 0) { gl_nsim = -(INTEGER(nsim)[0]); set_method(ISI); } else { gl_nsim = INTEGER(nsim)[0]; set_method(GSI); } n_pred_locs = n; if (gl_nsim > 1) init_simulations(d); if (get_n_beta_set() != get_n_vars()) setup_beta(d, get_n_vars(), gl_nsim); } set_mode(); /* simple, stratified, multivariable? */ check_global_variables(); /* it's there, better do it now */ if (debug_level) Rprintf("[%s]\n", method_string(get_method())); #ifdef WIN32 R_FlushConsole(); R_ProcessEvents(); #endif for (i = 0; i < n; i++) { print_progress(i, n); if (LENGTH(block_cols) > 1) gstat_set_block(i, block, block_cols, ¤t); current.x = locs[i]; if (dim >= 2) current.y = locs[n + i]; if (dim >= 3) current.z = locs[2 * n + i]; for (j = 0; j < n_X; j++) current.X[j] = X[j * n + i]; /* transform standardized coordinate polynomial here */ if (vd->polynomial_degree) calc_polynomial_point(vd, ¤t); for (j = 0; j < get_n_vars(); j++) select_at(d[j], ¤t); get_est(d, get_method(), ¤t, est_all[i]); #ifdef WIN32 R_ProcessEvents(); /* avoid terminal freeze in R/Win */ #endif R_CheckUserInterrupt(); } print_progress(100, 100); PROTECT(ret = allocVector(VECSXP, 1)); PROTECT(retvector_dim = allocVector(REALSXP, 2)); REAL(retvector_dim)[0] = n; /* nrows */ if (gl_nsim > 1) { PROTECT(retvector = allocVector(REALSXP, gl_nsim * nvars * n)); msim = get_msim(); for (i = pos = 0; i < nvars; i++) for (j = 0; j < gl_nsim; j++) for (k = 0; k < n; k++) { if (is_mv_float(&(msim[i][k][j]))) REAL(retvector)[pos++] = NA_REAL; else REAL(retvector)[pos++] = msim[i][k][j]; } REAL(retvector_dim)[1] = nvars * gl_nsim; /* ncols */ } else { PROTECT(retvector = allocVector(REALSXP, n * nest)); for (j = pos = 0; j < nest; j++) { for (i = 0; i < n; i++) { if (is_mv_double(&(est_all[i][j]))) REAL(retvector)[pos] = NA_REAL; else REAL(retvector)[pos] = est_all[i][j]; pos++; } } REAL(retvector_dim)[1] = nest; /* ncols */ } if (gl_nsim > 0) free_simulations(); /* SET_DIM(retvector, retvector_dim); */ setAttrib(retvector, R_DimSymbol, retvector_dim); SET_VECTOR_ELT(ret, 0, retvector); for (i = 0; i < n; i++) efree(est_all[i]); efree(est_all); efree(current.X); UNPROTECT(3); return(ret); } static void gstat_set_block(long i, SEXP block, SEXP block_cols, DPOINT *current) { DATA *area; VARIOGRAM *v; long nrows_block, start, end, j; if (i >= LENGTH(block_cols) || i < 0) ErrMsg(ER_IMPOSVAL, "block_cols length less than nr of prediction locations"); nrows_block = LENGTH(block) / 2; /* nr of rows */ start = INTEGER(block_cols)[i]; if (i == LENGTH(block_cols) - 1) end = nrows_block; else end = INTEGER(block_cols)[i+1] - 1; area = get_data_area(); if (area != NULL) free_data(area); area = create_data_area(); area->n_list = area->n_max = 0; area->id = ID_OF_AREA; area->mode = X_BIT_SET & Y_BIT_SET; for (j = start - 1; j < end; j++) { current->x = REAL(block)[j]; current->y = REAL(block)[nrows_block + j]; push_point(area, current); } SET_BLOCK(current); if (DEBUG_FORCE) print_data_list(area); for (j = 0; j < get_n_vgms(); j++) { v = get_vgm(j); if (v != NULL) v->block_semivariance_set = v->block_covariance_set = 0; /* don't store under these circumstances! */ } return; } SEXP gstat_variogram(SEXP s_ids, SEXP cutoff, SEXP width, SEXP direction, SEXP cressie, SEXP dX, SEXP boundaries, SEXP grid, SEXP cov, SEXP pseudo) { SEXP ret; SEXP np; SEXP dist; SEXP gamma; SEXP sx; SEXP sy; SEXP ev_parameters; /* SEXP y; */ long i, id1, id2, nest; VARIOGRAM *vgm; DATA **d; GRIDMAP *m; unsigned int row, col, n; id1 = INTEGER(s_ids)[0]; if (LENGTH(s_ids) > 1) id2 = INTEGER(s_ids)[1]; else id2 = id1; vgm = get_vgm(LTI(id1,id2)); vgm->id = LTI(id1,id2); vgm->id1 = id1; vgm->id2 = id2; if (INTEGER(cov)[0] == 0) vgm->ev->evt = (id1 == id2 ? SEMIVARIOGRAM : CROSSVARIOGRAM); else if (INTEGER(cov)[0] == 1) vgm->ev->evt = (id1 == id2 ? COVARIOGRAM : CROSSCOVARIOGRAM); else { if (id1 != id2) ErrMsg(ER_IMPOSVAL, "cannot compute pairwise relative cross semivariogram"); if (INTEGER(cov)[0] == 2) vgm->ev->evt = PRSEMIVARIOGRAM; } /* vgm->ev->is_asym = INTEGER(asym)[0]; */ vgm->ev->pseudo = INTEGER(pseudo)[0]; vgm->ev->recalc = 1; if (LENGTH(cutoff) > 0) gl_cutoff = REAL(cutoff)[0]; if (LENGTH(width) > 0) gl_iwidth = REAL(width)[0]; gl_alpha = REAL(direction)[0]; gl_beta = REAL(direction)[1]; gl_tol_hor = REAL(direction)[2]; gl_tol_ver = REAL(direction)[3]; gl_cressie = INTEGER(cressie)[0]; if (LENGTH(dX) > 0) { d = get_gstat_data(); d[id1]->dX = REAL(dX)[0]; d[id2]->dX = REAL(dX)[0]; } for (i = 0; i < LENGTH(boundaries); i++) /* does nothing if LENGTH is 0 */ push_bound(REAL(boundaries)[i]); switch (LENGTH(grid)) { case 0: case 1: break; case 6: vgm->ev->S_grid = gstat_S_fillgrid(grid); break; default: error("unrecognized grid length in gstat_variogram"); break; } calc_variogram(vgm, NULL); if (vgm->ev->S_grid != NULL) { PROTECT(ret = allocVector(VECSXP, 4)); m = vgm->ev->map; n = m->rows * m->cols; PROTECT(np = allocVector(REALSXP, n)); PROTECT(gamma = allocVector(REALSXP, n)); PROTECT(sx = allocVector(REALSXP, n)); PROTECT(sy = allocVector(REALSXP, n)); for (row = i = 0; row < m->rows; row++) { for (col = 0; col < m->cols; col++) { map_rowcol2xy(m, row, col, &(REAL(sx)[i]), &(REAL(sy)[i])); REAL(np)[i] = vgm->ev->nh[i]; if (vgm->ev->nh[i] > 0) REAL(gamma)[i] = vgm->ev->gamma[i]; else REAL(gamma)[i] = NA_REAL; i++; } } SET_VECTOR_ELT(ret, 0, sx); SET_VECTOR_ELT(ret, 1, sy); SET_VECTOR_ELT(ret, 2, np); SET_VECTOR_ELT(ret, 3, gamma); free_data_gridmap(vgm->ev->S_grid); UNPROTECT(5); } else { if (vgm->ev->cloud) nest = vgm->ev->n_est; else { if (vgm->ev->zero == ZERO_SPECIAL) nest = vgm->ev->n_est; else nest = vgm->ev->n_est - 1; } PROTECT(ret = allocVector(VECSXP, 4)); if (nest <= 0) { UNPROTECT(1); return(ret); } PROTECT(np = allocVector(REALSXP, nest)); PROTECT(dist = allocVector(REALSXP, nest)); PROTECT(gamma = allocVector(REALSXP, nest)); PROTECT(ev_parameters = allocVector(REALSXP, 4)); REAL(ev_parameters)[0] = vgm->ev->cutoff; REAL(ev_parameters)[1] = vgm->ev->iwidth; REAL(ev_parameters)[2] = vgm->ev->pseudo; REAL(ev_parameters)[3] = vgm->ev->is_asym; for (i = 0; i < nest; i++) { REAL(np)[i] = vgm->ev->nh[i]; REAL(dist)[i] = vgm->ev->dist[i]; REAL(gamma)[i] = vgm->ev->gamma[i]; } SET_VECTOR_ELT(ret, 0, np); SET_VECTOR_ELT(ret, 1, dist); SET_VECTOR_ELT(ret, 2, gamma); SET_VECTOR_ELT(ret, 3, ev_parameters); UNPROTECT(5); } return(ret); } SEXP gstat_load_variogram(SEXP s_ids, SEXP s_model, SEXP s_sills, SEXP s_ranges, SEXP s_kappas, SEXP s_anis_all, SEXP s_table, SEXP s_max_val) { VARIOGRAM *vgm; long i, n, id1, id2, max_id; double anis[5] = {0.0, 0.0, 0.0, 1.0, 1.0}, rpars[2], *sills, *ranges, *kappas, *anis_all; const char *model; sills = REAL(s_sills); ranges = REAL(s_ranges); kappas = REAL(s_kappas); anis_all = REAL(s_anis_all); id1 = INTEGER(s_ids)[0]; id2 = INTEGER(s_ids)[1]; max_id = MAX(id1, id2); if (get_n_vars() == 0) which_identifier("xx"); /* at least "load" one dummy var */ if (max_id >= get_n_vars()) ErrMsg(ER_IMPOSVAL, "gstat_load_variogram has been called with max_id >= n_vars"); vgm = get_vgm(LTI(id1,id2)); assert(vgm != NULL); vgm->id = LTI(id1,id2); vgm->id1 = id1; vgm->id2 = id2; vgm->n_models = vgm->n_fit = 0; n = LENGTH(s_sills); for (i = 0; i < n; i++) { /* loop over sub models */ model = CHAR(STRING_ELT(s_model, i)); anis[0] = anis_all[0 * n + i]; anis[1] = anis_all[1 * n + i]; anis[2] = anis_all[2 * n + i]; anis[3] = anis_all[3 * n + i]; anis[4] = anis_all[4 * n + i]; rpars[0] = ranges[i]; rpars[1] = kappas[i]; if (LENGTH(s_table) > 0) push_to_v_table(vgm, rpars[0], LENGTH(s_table), REAL(s_table), (anis[3] == 1.0 && anis[4] == 1.0) ? NULL : anis); else push_to_v(vgm, model, sills[i], rpars, 2, (anis[3] == 1.0 && anis[4] == 1.0) ? NULL : anis, 1, 1); } update_variogram(vgm); if (REAL(s_max_val)[0] > 0.0 || REAL(s_max_val)[1] > 0.0 || REAL(s_max_val)[2] > 0.0) vgm->max_val = get_semivariance(vgm, REAL(s_max_val)[0], REAL(s_max_val)[1], REAL(s_max_val)[2]); if (DEBUG_DUMP) logprint_variogram(vgm, 1); return(s_model); } SEXP gstat_variogram_values(SEXP ids, SEXP pars, SEXP covariance, SEXP dist_values) { double from, to, n, d, x = 1.0, y = 0.0, z = 0.0; int i, id1, id2, cov = 0, ndist = 0; VARIOGRAM *vgm; SEXP dist; SEXP gamma; SEXP ret; if (LENGTH(pars) != 3 && LENGTH(pars) != 6) error("supply three or six distance parameters"); from = REAL(pars)[0]; to = REAL(pars)[1]; n = REAL(pars)[2]; ndist = LENGTH(dist_values); cov = INTEGER(covariance)[0]; if (LENGTH(pars) == 6) { x = REAL(pars)[3]; y = REAL(pars)[4]; z = REAL(pars)[5]; } id1 = INTEGER(ids)[0]; id2 = INTEGER(ids)[1]; vgm = get_vgm(LTI(id1,id2)); if (ndist > 0) { PROTECT(dist = allocVector(REALSXP, ndist)); PROTECT(gamma = allocVector(REALSXP, ndist)); for (i = 0; i < ndist; i++) { d = REAL(dist_values)[i]; REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } } else { PROTECT(dist = allocVector(REALSXP, n)); PROTECT(gamma = allocVector(REALSXP, n)); for (i = 0; i < n; i++) { d = from; if (i > 0) /* implies n > 1 */ d += (i/(n-1))*(to-from); REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } } PROTECT(ret = allocVector(VECSXP, 2)); SET_VECTOR_ELT(ret, 0, dist); SET_VECTOR_ELT(ret, 1, gamma); UNPROTECT(3); return(ret); } // Added by Paul Hiemstra, 30-06-2008 SEXP get_covariance_list(SEXP ids, SEXP covariance, SEXP dist_list) { double d, x = 1.0, y = 0.0, z = 0.0; int i, id1, id2, cov = 0; VARIOGRAM *vgm; SEXP dist; SEXP gamma; SEXP ret; int length_list = LENGTH(dist_list); cov = INTEGER(covariance)[0]; id1 = INTEGER(ids)[0]; id2 = INTEGER(ids)[1]; vgm = get_vgm(LTI(id1,id2)); PROTECT(dist = allocVector(REALSXP, length_list)); PROTECT(gamma = allocVector(REALSXP, length_list)); for (i = 0; i < length_list; i++) { d = REAL(dist_list)[i]; REAL(dist)[i] = d; REAL(gamma)[i] = (cov ? get_covariance(vgm, d * x, d * y, d * z) : get_semivariance(vgm, d * x, d * y, d * z)); } PROTECT(ret = allocVector(VECSXP, 2)); SET_VECTOR_ELT(ret, 0, dist); SET_VECTOR_ELT(ret, 1, gamma); UNPROTECT(3); return(ret); } SEXP gstat_get_variogram_models(SEXP dolong) { SEXP ret; int i, n = 0, do_long; for (i = 1; v_models[i].model != NOT_SP; i++) n++; do_long = INTEGER(dolong)[0]; PROTECT(ret = allocVector(STRSXP, n)); for (i = 1; v_models[i].model != NOT_SP; i++) SET_STRING_ELT(ret, i-1, mkChar(do_long ? v_models[i].name_long : v_models[i].name)); UNPROTECT(1); return(ret); } SEXP gstat_load_ev(SEXP np, SEXP dist, SEXP gamma) { int i, cloud = 1; VARIOGRAM *vgm; which_identifier("xx"); /* * vgm = get_vgm(LTI(INTEGER(id)[0], INTEGER(id)[1])); * */ vgm = get_vgm(LTI(0, 0)); if (vgm->ev == NULL) vgm->ev = init_ev(); vgm->ev->evt = SEMIVARIOGRAM; vgm->ev->n_est = LENGTH(np); vgm->ev->n_max = LENGTH(np); vgm->ev->gamma = (double *) emalloc (sizeof(double) * vgm->ev->n_max); vgm->ev->dist = (double *) emalloc (sizeof(double) * vgm->ev->n_max); vgm->ev->nh = (unsigned long *) emalloc (sizeof(long) * vgm->ev->n_max); for (i = 0; i < vgm->ev->n_est; i++) { vgm->ev->nh[i] = REAL(np)[i]; vgm->ev->dist[i] = REAL(dist)[i]; vgm->ev->gamma[i] = REAL(gamma)[i]; if (cloud && vgm->ev->nh[i] > 1) cloud = 0; } vgm->ev->cloud = cloud; if (DEBUG_VGMFIT) fprint_sample_vgm(vgm->ev); return(np); } SEXP gstat_fit_variogram(SEXP fit, SEXP fit_sill, SEXP fit_range) { int i; VARIOGRAM *vgm; SEXP ret; SEXP sills; SEXP ranges; SEXP SSErr; SEXP fit_is_singular; vgm = get_vgm(LTI(0, 0)); vgm->ev->fit = INTEGER(fit)[0]; for (i = 0; i < vgm->n_models; i++) { vgm->part[i].fit_sill = INTEGER(fit_sill)[i]; vgm->part[i].fit_range = INTEGER(fit_range)[i]; } update_variogram(vgm); if (DEBUG_VGMFIT) logprint_variogram(vgm, 1); fit_variogram(vgm); if (DEBUG_VGMFIT) logprint_variogram(vgm, 1); PROTECT(sills = allocVector(REALSXP, vgm->n_models)); PROTECT(ranges = allocVector(REALSXP, vgm->n_models)); for (i = 0; i < vgm->n_models; i++) { REAL(sills)[i] = vgm->part[i].sill; REAL(ranges)[i] = vgm->part[i].range[0]; } PROTECT(ret = allocVector(VECSXP, 4)); SET_VECTOR_ELT(ret, 0, sills); SET_VECTOR_ELT(ret, 1, ranges); PROTECT(fit_is_singular = allocVector(REALSXP, 1)); REAL(fit_is_singular)[0] = vgm->fit_is_singular; SET_VECTOR_ELT(ret, 2, fit_is_singular); PROTECT(SSErr = allocVector(REALSXP, 1)); REAL(SSErr)[0] = vgm->SSErr; SET_VECTOR_ELT(ret, 3, SSErr); UNPROTECT(5); return(ret); } SEXP gstat_debug_level(SEXP level) { debug_level = INTEGER(level)[0]; return(level); } SEXP gstat_set_method(SEXP to) { const char *what; what = CHAR(STRING_ELT(to, 0)); for (int id = 1; methods[id].name != NULL; id++) { if (almost_equals(what, methods[id].name)) { set_method(methods[id].m); break; /* id-loop */ } } return(to); } SEXP gstat_set_set(SEXP arg, SEXP val) { const char *name; int i; typedef struct { const char *name; void *ptr; enum { UNKNOWN, IS_INT, IS_UINT, IS_REAL, IS_STRING, IS_D_VECTOR, NO_ARG } what; enum { NOLIMIT, GEZERO, GTZERO } limit; } GSTAT_EXPR; const GSTAT_EXPR set_options[] = { { "alpha", &gl_alpha, IS_REAL, GEZERO }, { "beta", &gl_beta, IS_REAL, GEZERO }, { "blas", &gl_blas, IS_INT, GEZERO }, { "choleski", &gl_choleski, IS_INT, GEZERO }, { "co$incide", &gl_coincide, IS_INT, GEZERO }, { "Cr$essie", &gl_cressie, IS_INT, GEZERO }, { "cutoff", &gl_cutoff, IS_REAL, GTZERO }, { "de$bug", &debug_level, IS_INT, GEZERO }, { "fit", &gl_fit, IS_INT, GEZERO }, { "fit_l$imit", &gl_fit_limit, IS_REAL, GTZERO }, { "fr$action", &gl_fraction, IS_REAL, GTZERO }, /* { "display", &gl_display, IS_STRING, NOLIMIT }, */ { "gls$_residuals", &gl_gls_residuals, IS_INT, GEZERO }, { "id$p", &gl_idp, IS_REAL, GEZERO }, { "in$tervals", &gl_n_intervals, IS_INT, GTZERO }, { "it$er", &gl_iter, IS_INT, GEZERO }, { "lhs", &gl_lhs, IS_INT, GEZERO }, { "longlat", &gl_longlat, IS_INT, GEZERO }, { "sim_beta", &gl_sim_beta, IS_INT, GEZERO }, { "n_uk", &gl_n_uk, IS_INT, GEZERO }, { "numbers", &gl_numbers, IS_INT, GEZERO }, { "nb$lockdiscr", &gl_nblockdiscr, IS_INT, GTZERO }, { "no$check", &gl_nocheck, IS_INT, GEZERO }, { "ns$im", &gl_nsim, IS_INT, GTZERO }, { "or$der", &gl_order, IS_INT, GEZERO }, { "q$uantile", &gl_quantile, IS_REAL, GEZERO }, { "rowwise", &gl_rowwise, IS_INT, GEZERO }, { "rp", &gl_rp, IS_INT, GEZERO }, { "see$d", &gl_seed, IS_INT, GTZERO }, { "useed", &gl_seed, IS_UINT, GEZERO }, { "spa$rse", &gl_sparse, IS_INT, GEZERO }, { "spi$ral", &gl_spiral, IS_INT, GEZERO }, { "spl$it", &gl_split, IS_INT, GTZERO }, { "sy$mmetric", &gl_sym_ev, IS_INT, GEZERO }, { "tol_h$or", &gl_tol_hor, IS_REAL, GEZERO }, { "tol_v$er", &gl_tol_ver, IS_REAL, GEZERO }, { "v$erbose", &debug_level, IS_INT, GEZERO }, { "w$idth", &gl_iwidth, IS_REAL, GEZERO }, { "x$valid", &gl_xvalid, IS_INT, GEZERO }, { "zero_di$st", &gl_zero_est, IS_INT, GEZERO }, { "zero", &gl_zero, IS_REAL, GEZERO }, { "zm$ap", &gl_zmap, IS_REAL, NOLIMIT }, { NULL, NULL, 0, 0 } }; name = CHAR(STRING_ELT(arg, 0)); for (i = 0; set_options[i].name; i++) if (almost_equals(name, set_options[i].name)) break; /* break out i-loop */ if (set_options[i].name == NULL) ErrMsg(ER_SYNTAX, name); if (almost_equals((const char *)name, "nb$lockdiscr")) gl_gauss = 0; /* side effect */ switch (set_options[i].what) { case IS_INT: *((int *) set_options[i].ptr) = asInteger(val); /* Rprintf("int arg: %s val %d\n", name, asInteger(val)); */ break; case IS_UINT: *((unsigned int *) set_options[i].ptr) = (unsigned int) asInteger(val); /* Rprintf("uint arg: %s val %d\n", name, asInteger(val)); */ break; case IS_REAL: *((double *) set_options[i].ptr) = asReal(val); /* Rprintf("real arg: %s val %d\n", name, asReal(val)); */ break; case IS_STRING: *((const char **) set_options[i].ptr) = CHAR(STRING_ELT(val, 0)); break; default: ErrMsg(ER_SYNTAX, name); break; } return val; } SEXP gstat_set_merge(SEXP a, SEXP b, SEXP c, SEXP d) { /* merge a(b) with c(d); */ DATA **dpp; int id, id1, id2, col1, col2; id1 = asInteger(a); id2 = asInteger(c); if (id1 >= get_n_vars() || id2 >= get_n_vars() || id1 < 0 || id2 < 0) ErrMsg(ER_IMPOSVAL, "id values out of range"); col1 = asInteger(b); col2 = asInteger(d); if (id1 < id2) { /* swap id and col */ id = id1; id1 = id2; id2 = id; id = col1; col1 = col2; col2 = id; } dpp = get_gstat_data(); if (push_to_merge_table(dpp[id1], id2, col1, col2)) ErrMsg(ER_IMPOSVAL, "attempt to merge failed"); return(a); } double r_uniform(void) { return(unif_rand()); } double r_normal(void) { return(norm_rand()); } static DATA_GRIDMAP *gstat_S_fillgrid(SEXP gridparams) { double x_ul, y_ul, cellsizex, cellsizey; unsigned int rows, cols; cellsizex = REAL(gridparams)[2]; cellsizey = REAL(gridparams)[3]; rows = (unsigned int) REAL(gridparams)[5]; cols = (unsigned int) REAL(gridparams)[4]; x_ul = REAL(gridparams)[0] - 0.5 * cellsizex; y_ul = REAL(gridparams)[1] + (rows - 0.5) * cellsizey; return gsetup_gridmap(x_ul, y_ul, cellsizex, cellsizey, rows, cols); } gstat/src/sem.c0000644000176200001440000005542413777370515013144 0ustar liggesusers/* * sem.c: calculate sample (cross, co-) variogram from data * K.M. refers to changes by Konstantin Malakhanov, see also mapio.c */ #include #include #include "defs.h" #include "mapio.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "glvars.h" #include "select.h" #include "gls.h" #include "mtrx.h" #include "lm.h" #include "defaults.h" #include "direct.h" #include "sem.h" #define SEM_INCREMENT 1000 static double valid_distance(DPOINT *a, DPOINT *b, double max, int symmetric, DATA *d1, DATA *d2, GRIDMAP *m); static void divide(SAMPLE_VGM *ev); static SAMPLE_VGM *alloc_exp_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev); /* variograms: */ static SAMPLE_VGM *semivariogram(DATA *a, SAMPLE_VGM *ev); static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev); /* covariograms: */ static SAMPLE_VGM *covariogram(DATA *a, SAMPLE_VGM *ev); static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev); static int get_index(double dist, SAMPLE_VGM *ev); static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev); static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev); static void push_to_cloud(SAMPLE_VGM *ev, double gamma, double dist, unsigned long index); static void resize_ev(SAMPLE_VGM *ev, unsigned int size); static void *register_pairs(void *p, unsigned long nh, DPOINT *a, DPOINT *b); /* * gl_cressie: use Cressie's sqrt(absdiff) estimator; * ev->zero: * case ZERO_INCLUDE: use zero distances in first interval (omit); * case ZERO_AVOID: avoid zero distances; * case ZERO_SPECIAL: make special estimate for distance zero; */ /* * calculate sample variogram from data * calculates variogram, crossvariogram, covariogram or crosscovariogram * from sample data. Data are obtained from the central data base (glvars) * using get_gstat_data(), and the variogram requested is that of data id * v->id1 and v->id2 -- a direct (co) variogram when id1 == id2, a cross * (co) variogram when id1 != id2. * * if [[v->fname is set and]] (one of) id1 or id2 is a dummy data, the * actual sample variogram is not calculated but rather read from the * file v->fname. This is done to enable separate sample variogram * calculation (in batch or on a fast remote computer) and model fitting * (e.g. on the desk top). * * returns: non-zero if writing sample variogram to file failed. */ int calc_variogram(VARIOGRAM *v /* pointer to VARIOGRAM structure */, const char *fname /* pointer to output file name, or NULL if no output has to be written to file */ ) { DATA **d = NULL, *d1 = NULL, *d2 = NULL; assert(v); d = get_gstat_data(); d1 = d[v->id1]; d2 = d[v->id2]; if (d1->sel == NULL) select_at(d1, NULL); /* global selection (sel = list) */ if (d2->sel == NULL) select_at(d2, NULL); if (v->ev->evt == CROSSVARIOGRAM && (v->ev->pseudo == -1 || v->ev->is_asym == -1)) { if (v->ev->pseudo == -1) { /* v's first time, need to find out pseudo */ if (coordinates_are_equal(d[v->id1], d[v->id2])) v->ev->pseudo = 0; else v->ev->pseudo = 1; } if (gl_sym_ev == 0) v->ev->is_asym = v->ev->pseudo; /* pseudo: always, else: only if set */ else v->ev->is_asym = 0; } else v->ev->is_asym = v->ev->pseudo = 0; if (gl_zero_est == ZERO_DEFAULT) { /* choose a suitable default */ if (is_covariogram(v)) v->ev->zero = ZERO_SPECIAL; else { /* v is variogram */ if (v->ev->pseudo) v->ev->zero = ZERO_SPECIAL; else v->ev->zero = ZERO_INCLUDE; } } else v->ev->zero = zero_int2enum(gl_zero_est); assert(v->ev->zero != ZERO_DEFAULT); fill_cutoff_width(d1, v); if (v->ev->map && v->ev->S_grid == NULL) return -1; v->ev->cloud = (v->ev->iwidth <= 0.0); if (v->ev->cloud && (d[v->id1]->n_sel >= MAX_NH || d[v->id2]->n_sel >= MAX_NH)) pr_warning("observation numbers in cloud will be wrong"); set_direction_values(gl_alpha, gl_beta, gl_tol_hor, gl_tol_ver); v->ev->is_directional = is_directional(v); if (v->ev->recalc) { switch (v->ev->evt) { case PRSEMIVARIOGRAM: case SEMIVARIOGRAM: semivariogram(d[v->id1], v->ev); break; case CROSSVARIOGRAM: cross_variogram(d[v->id1], d[v->id2], v->ev); break; case COVARIOGRAM: v->ev->is_asym = gl_sym_ev; covariogram(d[v->id1], v->ev); break; case CROSSCOVARIOGRAM: cross_covariogram(d[v->id1], d[v->id2], v->ev); break; case NOTSPECIFIED: default: assert(0); /* aborts */ break; } } return 0; } static SAMPLE_VGM *semivariogram(DATA *d, SAMPLE_VGM *ev) { /* * calculate sample variogram of 0.5 E[(Z(x)-Z(x+h))2] */ if (ev->evt == PRSEMIVARIOGRAM) d->calc_residuals = 0; ev = alloc_exp_variogram(d, NULL, ev); if (d->grid != NULL && d->prob > 0.5 && d->every == 1) ev = semivariogram_grid(d, ev); else ev = semivariogram_list(d, ev); divide(ev); ev->recalc = 0; return ev; } /* semivariogram() */ static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev) { unsigned long uli, ulj; int i, j, index = 0, divide_by = 1; unsigned int total_steps; double gamma, ddist, head, tail, gam; while (d->n_sel / divide_by > 0.5 * sqrt(INT_MAX)) divide_by <<= 1; /* prevent overflow on calculating total_steps */ total_steps = (d->n_sel / divide_by) * (d->n_sel - 1) / 2; print_progress(0, total_steps); if (DEBUG_DUMP) printlog("Calculating semivariogram from %d points...\n", d->n_sel); for (i = 0; i < d->n_sel; i++) { print_progress((i / divide_by) * (i - 1) / 2, total_steps); R_CheckUserInterrupt(); /* printlog("step: %u of %u\n", (i /divide_by) * (i - 1) / 2, total_steps); */ for (j = 0; j < (ev->map != NULL ? d->n_sel : i); j++) { ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist >= 0.0 && i != j) { head = d->sel[i]->attr; tail = d->sel[j]->attr; if (! ev->cloud) { index = get_index(ddist, ev); if (gl_cressie) /* sqrt abs diff */ ev->gamma[index] += sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); ev->gamma[index] += SQR(gam); } else { /* SEMIVARIOGRAM: */ ev->gamma[index] += SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) ev->gamma[index] -= d->sel[i]->variance + d->sel[j]->variance; #endif } ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], d->sel[i], d->sel[j]); ev->nh[index]++; } else { /* cloud: */ if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { if (gl_cressie) gamma = sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); gamma = gam * gam; } else { gamma = SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) gamma -= d->sel[i]->variance + d->sel[j]->variance; #endif } uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(total_steps, total_steps); if (DEBUG_DUMP) printlog("ready\n"); return ev; } static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev) { typedef struct { int row, col, ev_index; double dist; } grid_index; struct { int n; grid_index *gi; } grid_ev; int row, col, irow, icol, i, max_index, index; unsigned long ula, ulb; double gamma, ddist, head, tail, gam; DPOINT a, b, *dpa = NULL, *dpb = NULL; max_index = (int) floor(ev->cutoff / SQUARECELLSIZE(d->grid)); grid_ev.gi = (grid_index *) emalloc(2 * (max_index + 1) * (max_index + 1) * sizeof(grid_index)); grid_ev.n = 0; a.x = a.y = a.z = b.z = 0.0; /* setup the grid: */ for (row = 0; row <= max_index; row++) { for (col = (row == 0 ? 1 : -max_index); col <= max_index; col++) { b.x = col * SQUARECELLSIZE(d->grid); b.y = - row * SQUARECELLSIZE(d->grid); ddist = valid_distance(&a, &b, ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist > 0.0) { grid_ev.gi[grid_ev.n].row = row; grid_ev.gi[grid_ev.n].col = col; grid_ev.gi[grid_ev.n].dist = ddist; if (! ev->cloud) grid_ev.gi[grid_ev.n].ev_index = get_index(ddist, ev); if (DEBUG_DUMP) printlog("row %d col %d index %d\n", row, col, grid_ev.gi[grid_ev.n].ev_index); grid_ev.n++; } } } print_progress(0, d->grid->rows); for (row = 0; row < d->grid->rows; row++) { for (col = 0; col < d->grid->cols; col++) { if ((dpa = d->grid->dpt[row][col]) != NULL) { for (i = 0; i < grid_ev.n; i++) { irow = row + grid_ev.gi[i].row; icol = col + grid_ev.gi[i].col; if (irow >= 0 && icol >= 0 && irow < d->grid->rows && icol < d->grid->cols && ((dpb = d->grid->dpt[irow][icol]) != NULL)) { ddist = grid_ev.gi[i].dist; head = dpa->attr; tail = dpb->attr; if (! ev->cloud) { index = grid_ev.gi[i].ev_index; if (gl_cressie) /* sqrt abs diff */ ev->gamma[index] += sqrt(fabs(head - tail)); else { if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); ev->gamma[index] += gam * gam; } else ev->gamma[index] += SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) ev->gamma[index] -= dpa->variance + dpb->variance; #endif } ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], dpa, dpb); ev->nh[index]++; } else { /* cloud: */ if (gl_cressie) gamma = sqrt(fabs(head - tail)); else if (ev->evt == PRSEMIVARIOGRAM) { gam = 2.0 * (head - tail)/(head + tail); gamma = gam * gam; } else { gamma = SQR(head - tail); #ifdef ADJUST_VARIANCE if (d->colnvariance) gamma -= dpa->variance + dpb->variance; #endif } ula = GET_INDEX(dpa); ulb = GET_INDEX(dpb); push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(ula,ulb)); } /* else !cloud */ } /* if we have two non-NULL points */ } /* for all possibly relevant pairs */ } /* if this grid cell is non-NULL */ } /* for all cols */ print_progress(row + 1, d->grid->rows); R_CheckUserInterrupt(); } /* for all rows */ efree(grid_ev.gi); return ev; } /* covariograms: */ static SAMPLE_VGM *covariogram(DATA *d, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = COVARIOGRAM; ev = alloc_exp_variogram(d, NULL, ev); for (i = 0; i < d->n_sel; i++) { print_progress(i, d->n_sel); R_CheckUserInterrupt(); for (j = 0; j <= (ev->map != NULL ? d->n_sel-1 : i); j++) { ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1, d, d, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += d->sel[i]->attr * d->sel[j]->attr; #ifdef ADJUST_VARIANCE if (d->colnvariance && i == j) ev->gamma[index] -= d->sel[i]->variance; #endif ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], d->sel[i], d->sel[j]); ev->nh[index]++; } else { if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = d->sel[i]->attr * d->sel[j]->attr; #ifdef ADJUST_VARIANCE if (d->colnvariance && i == j) gamma -= d->sel[i]->variance; #endif uli = i; ulj = j; push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(d->n_sel, d->n_sel); divide(ev); ev->recalc = 0; return ev; } /* covariogram() */ static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = CROSSVARIOGRAM; ev = alloc_exp_variogram(a, b, ev); for (i = 0; i < a->n_sel; i++) { print_progress(i, a->n_sel); R_CheckUserInterrupt(); for (j = 0; j < b->n_sel; j++) { ddist = valid_distance(a->sel[i], b->sel[j], ev->cutoff, gl_sym_ev || !ev->pseudo, a, b, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (!ev->pseudo && i != j) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += (a->sel[i]->attr - a->sel[j]->attr) * (b->sel[i]->attr - b->sel[j]->attr); ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], a->sel[j]); ev->nh[index]++; } else if (!(ddist == 0.0 && ev->zero == ZERO_AVOID)) { gamma = (a->sel[i]->attr - a->sel[j]->attr) * (b->sel[i]->attr - b->sel[j]->attr); uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } else if (ev->pseudo) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += SQR(a->sel[i]->attr - b->sel[j]->attr); #ifdef ADJUST_VARIANCE if (a->colnvariance || b->colnvariance) ev->gamma[index] -= a->sel[i]->variance + b->sel[j]->variance; #endif ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], b->sel[j]); ev->nh[index]++; } else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = SQR(a->sel[i]->attr - b->sel[j]->attr); #ifdef ADJUST_VARIANCE if (a->colnvariance || b->colnvariance) gamma -= a->sel[i]->variance + b->sel[j]->variance; #endif uli = i; ulj = j; push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj)); } } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(a->n_sel, a->n_sel); divide(ev); ev->recalc = 0; return ev; } /* cross_variogram */ static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i, j, index = 0; unsigned long uli, ulj; double gamma, ddist; ev->evt = CROSSCOVARIOGRAM; ev = alloc_exp_variogram(a, b, ev); for (i = 0; i < a->n_sel; i++) { /* i -> a */ R_CheckUserInterrupt(); print_progress(i, a->n_sel); for (j = 0; j < b->n_sel; j++) { /* j -> b */ ddist = valid_distance(a->sel[i], b->sel[j], ev->cutoff, gl_sym_ev, a, b, (GRIDMAP *) ev->map); if (ddist >= 0.0) { if (! ev->cloud) { index = get_index(ddist, ev); ev->gamma[index] += a->sel[i]->attr * b->sel[j]->attr; ev->dist[index] += ddist; ev->pairs[index] = register_pairs(ev->pairs[index], ev->nh[index], a->sel[i], b->sel[j]); ev->nh[index]++; } else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) { gamma = a->sel[i]->attr * b->sel[j]->attr; uli = i; ulj = j; push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj)); } }/* if ddist >= 0 */ } /* for j */ } /* for i */ print_progress(a->n_sel, a->n_sel); divide(ev); ev->recalc = 0; return ev; } /* cross_covariogram() */ static double valid_distance(DPOINT *a, DPOINT *b, double max, int symmetric, DATA *d1, DATA *d2, GRIDMAP *map) { double ddist, dX, dX2, inprod; DPOINT p; int /* mode = 0, */ i; unsigned int row, col; assert(a != NULL); assert(b != NULL); assert(d1 != NULL); assert(d2 != NULL); /* mode = d1->mode & d2->mode; */ /* * even if modes don't correspond, valid_direction() will * calculate valid distances */ p.x = a->x - b->x; p.y = a->y - b->y; p.z = a->z - b->z; if (map && !gl_longlat) { /* transform here p to allow directional 2d cuts in a 3d world */ if (map_xy2rowcol(map, p.x, p.y, &row, &col)) return -1.0; else ddist = (1.0 * row) * map->cols + col + 0.5; } else { if (!gl_longlat && (p.x > max || p.y > max || p.z > max)) return -1.0; /* Changed K.M. Fri Feb 27 15:56:57 1998 */ /* if ddist < 0.0 then we don't need to check for dX! */ if ((ddist = valid_direction(a, b, symmetric, d1)) > max || ddist < 0.0) return -1.0; } dX = MIN(d1->dX, d2->dX); if (dX < DBL_MAX) { dX2 = dX * dX; /* allow only points for which 2-norm ||x_i-x_j|| < dX */ if (d1->n_X != d2->n_X) ErrMsg(ER_IMPOSVAL, "valid_distance(): d1->n_X != d2->n_X"); for (i = 0, inprod = 0.0; i < d1->n_X; i++) { inprod += SQR(a->X[i] - b->X[i]); /* printf("a->X[%d]: %g, b->X[%d]: %g", i, a->X[i], i, b->X[i]); */ } if (inprod > dX2) ddist = -1.0; /* printf("dX2: %g, inprod: %g ddist: %g\n", dX2, inprod, ddist); */ } return ddist; } int is_directional(VARIOGRAM *v) { switch(v->ev->evt) { case CROSSCOVARIOGRAM: if (gl_sym_ev == 0) /* asymmetric cross(co)variances: */ return (gl_tol_hor < 180.0 || gl_tol_ver < 180.0); else return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); case CROSSVARIOGRAM: if (v->ev->is_asym && gl_sym_ev == 0) /* asymm. cross(co)variances: */ return (gl_tol_hor < 180.0 || gl_tol_ver < 180.0); else return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); default: /* symmetric (co)variances */ return (gl_tol_hor < 90.0 || gl_tol_ver < 90.0); } } /* * this function should be changed--the mask map stack is misused as * to define the topology of variogram maps. * * use min/max coordinates for block diagonal as maximum cutoff * Returns: about 1/3 the max. dist between any two points in data. */ void fill_cutoff_width(DATA *data /* pointer to DATA structure to derive the values from */, VARIOGRAM *v /* pointer to VARIOGRAM structure */) { double d = 0.0; int i; GRIDMAP *m; DATA_GRIDMAP *dg; SAMPLE_VGM *ev; assert(data); assert(v); ev = v->ev; if (ev->S_grid != NULL) { m = new_map(READ_ONLY); /* process S_grid to m */ dg = (DATA_GRIDMAP *) ev->S_grid; m->x_ul = dg->x_ul; m->y_ul = dg->y_ul; m->cellsizex = dg->cellsizex; m->cellsizey = dg->cellsizey; m->rows = dg->rows; m->cols = dg->cols; ev->iwidth = 1.0; ev->cutoff = m->rows * m->cols; /* not a real cutoff, but rather the size of the container array */ ev->map = m; } else if (gl_bounds != NULL) { i = 0; while (gl_bounds[i] >= 0.0) /* count length */ i++; ev->cutoff = gl_bounds[i-1]; ev->iwidth = ev->cutoff / i; } else { if (is_mv_double(&(ev->cutoff))) { if (gl_cutoff < 0.0) { d = data_block_diagonal(data); if (d == 0.0) ev->cutoff = 1.0; /* ha ha ha */ else ev->cutoff = d * gl_fraction; } else ev->cutoff = gl_cutoff; } if (is_mv_double(&(ev->iwidth))) { if (gl_iwidth < 0.0) ev->iwidth = ev->cutoff / gl_n_intervals; else ev->iwidth = gl_iwidth; } } } static SAMPLE_VGM *alloc_exp_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) { int i; double nd; assert(a != NULL); assert(ev != NULL); if (gl_zero_est != ZERO_DEFAULT && ev->zero != gl_zero_est) ev->zero = zero_int2enum(gl_zero_est); if (gl_gls_residuals) { if (a->calc_residuals) make_gls(a, 1); if (b != NULL && b->calc_residuals) make_gls(b, 1); } else { if (a->calc_residuals) make_residuals_lm(a); if (b != NULL && b->calc_residuals) make_residuals_lm(b); } if (ev->cloud) { ev->n_est = 0; return ev; } if (gl_bounds != NULL) { for (i = ev->n_est = 0; gl_bounds[i] >= 0.0; i++) ev->n_est++; } else { /* check for overflow: */ nd = floor(ev->cutoff / ev->iwidth) + 1; if (nd > INT_MAX) { pr_warning("choose a larger width or a smaller cutoff value"); ErrMsg(ER_MEMORY, "(experimental variogram too large)"); } ev->n_est = (int) nd; } /* * zero est go to ev->gamma[ev->n_est - 1], ev->nh[ev->n_est - 1] */ if (ev->zero) ev->n_est++; resize_ev(ev, ev->n_est); /* initialize: */ for (i = 0; i < ev->n_est; i++) { ev->gamma[i] = 0.0; ev->dist[i] = 0.0; ev->nh[i] = 0; ev->pairs[i] = (DPOINT **) NULL; } return ev; } static void resize_ev(SAMPLE_VGM *ev, unsigned int size) { if (size > ev->n_max) { ev->n_max = size; ev->gamma = (double *) erealloc (ev->gamma, ev->n_max * sizeof(double)); ev->dist = (double *) erealloc (ev->dist, ev->n_max * sizeof(double)); ev->nh = (unsigned long *) erealloc (ev->nh, ev->n_max * sizeof(long)); ev->pairs = (DPOINT ***) erealloc(ev->pairs, ev->n_max * sizeof(DPOINT **)); } } static void *register_pairs(void *pairs, unsigned long nh, DPOINT *a, DPOINT *b) { /* * while I'm here -- there may be a problem when ->list != ->sel on * the DATA used, but I don't know why. Probably will never be used. */ /* resize pairs; add a and b to it */ if (gl_register_pairs == 0) return NULL; if (nh % SEM_INCREMENT == 0) pairs = erealloc(pairs, 2 * (nh + SEM_INCREMENT + 1) * sizeof(DPOINT **)); ((DPOINT **) pairs)[2 * nh] = a; ((DPOINT **) pairs)[2 * nh + 1] = b; return pairs; } static void push_to_cloud(SAMPLE_VGM *ev, double gamma, double dist, unsigned long index) { if (ev->n_est == ev->n_max) resize_ev(ev, ev->n_max + SEM_INCREMENT); ev->gamma[ev->n_est] = gamma; ev->dist[ev->n_est] = dist; ev->nh[ev->n_est] = index; ev->pairs[ev->n_est] = NULL; ev->n_est++; } static int get_index(double dist, SAMPLE_VGM *ev) { double frac; int i = 0; if (dist == 0.0 && ev->zero != ZERO_INCLUDE) return ev->n_est - 1; if (gl_bounds != DEF_bounds) { for (i = 0; gl_bounds[i] >= 0.0; i++) if (dist <= gl_bounds[i]) return i; assert(0); } if (ev->iwidth <= 0.0) { pr_warning("iwidth: %g", ev->iwidth); ErrMsg(ER_IMPOSVAL, "ev->iwidth <= 0.0"); } frac = dist / ev->iwidth; if (dist > 0.0 && frac == floor(frac)) return (int) (floor(frac)) - 1; else return (int) floor(frac); } static void divide(SAMPLE_VGM *ev) { int i; if (ev->cloud) return; /* has been done in the first round */ for (i = 0; i < ev->n_est; i++) { if (ev->nh[i]) { ev->dist[i] /= ev->nh[i]; switch (ev->evt) { case SEMIVARIOGRAM: if (gl_cressie) ev->gamma[i] = 0.5 * pow(ev->gamma[i]/ev->nh[i], 4.0) /(0.457 + 0.494 / ev->nh[i]); else ev->gamma[i] /= (2.0 * ev->nh[i]); break; case CROSSVARIOGRAM: ev->gamma[i] /= (2.0 * ev->nh[i]); break; case COVARIOGRAM: /* BREAKTHROUGH */ case CROSSCOVARIOGRAM: ev->gamma[i] /= (1.0 * ev->nh[i]); break; case PRSEMIVARIOGRAM: ev->gamma[i] /= (2.0 * ev->nh[i]); break; case NOTSPECIFIED: /* BREAKTHROUGH */ default: assert(0); break; } } } } void fprint_sample_vgm(const SAMPLE_VGM *ev) { #define EVFMT "%8g %8g %8lu %8g %8g\n" int i, n; double from, to; if (! ev->cloud) { /* start writing: distance 0 */ if (ev->zero == ZERO_SPECIAL && ev->nh[ev->n_est-1]) Rprintf(EVFMT, 0.0, 0.0, ev->nh[ev->n_est-1], ev->dist[ev->n_est-1], ev->gamma[ev->n_est-1]); /* continue writing: */ if (ev->zero == ZERO_SPECIAL || ev->zero == ZERO_AVOID) n = ev->n_est - 1; else n = ev->n_est; for (i = 0; i < n; i++) { if (ev->nh[i] > 0) { if (gl_bounds == NULL) { from = i*ev->iwidth; to = (i+1)*ev->iwidth; } else { if (i == 0) from = 0.0; else from = gl_bounds[i-1]; to = gl_bounds[i]; } to = MIN(ev->cutoff, to); Rprintf(EVFMT, from, to, ev->nh[i], ev->dist[i], ev->gamma[i]); } } } else { for (i = 0; i < ev->n_est; i++) Rprintf("%ld %ld %g %g\n", HIGH_NH(ev->nh[i]) + 1, LOW_NH(ev->nh[i]) + 1, ev->dist[i], ev->gamma[i]); } return; } /* fprint_sample_vgm */ gstat/src/gls.c0000644000176200001440000005136613777370515013146 0ustar liggesusers/* gls.c: module for multivariable generalized least squares prediction given a linear model Y = X Beta + e, gls() calculates from the selection d[0]->sel,...,d[n_vars-1]->sel, the multivariable BLUE estimation of x0 beta (and Cov(x0[i] Beta, x0[j] Beta)), or BLUP of Y(x0) (multivariable universal kriging) (and MSPE Y(x0)) BLP of Y(x0) (multivariable simple kriging) (and MSPE Y(x0)) (BLUE: Generalized Least Squares (GLS) best linear unbiased estimate; BLUP: GLS best linear unbiased prediction; BLP: GLS best linear prediction) UPDATE: only update y, beta (BLUP); References: a. Christensen, Ronald, 1991. Linear Models for Multivariate, Time Series, and Spatial Data. Springer Verlag, New York. (Ch. VI.2, VI.3) b. Ver Hoef, Jay M., Noel Cressie, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. [[[Note: eq. (18) should have a `+' between SIGMA_0 and C'SIGMA-1 C ]]] Notation (variables and comment): v' the transpose of (matrix or vector) v C-1 the inverse of matrix v (`Cinv' in a variable name) n total number of observations in data selections (rows_C) m total number of variables [n_vars] p sum of number of X columns (for non-empty data selections) [cols of X] y data vector (y[0]',...,y[n_vars-1]')', y[i] is the i-th variable [n x 1] C (generalized) covariance matrix, C[i][j] = Cov(element(y,i),element(y,j)) (element(y,i) is the i-th element in y, not the i-th variable) [n x n] X design matrix [n x p]; beta parameter vector [p x 1]: E(y) = X beta C0 (generalized) covariance matrix with y(x0): C0[i][j] = Cov(element(y,i),y[j](x0)) [n x m] X0 the value that X would have at location "where" [p x m] (Note: Christensen's x0 is Ver Hoefs X0'; I use x0: e.g. x0'beta). */ #include /* size_t */ #include /* sqrt() */ #include "defs.h" #include "data.h" #include "utils.h" #include "select.h" #include "mtrx.h" #include "lm.h" #include "vario.h" #include "vario_io.h" #include "glvars.h" #include "userio.h" #include "debug.h" #include "gls.h" static void fill_est(DATA **d, VEC *blup, MAT *MSPE, int n_vars, double *est); static void debug_result(VEC *blup, MAT *MSPE, enum GLS_WHAT pred); static VEC *get_mu(VEC *mu, const VEC *y, DATA **d, int nvars); static MAT *get_corr_mat(MAT *C, MAT *R); #define M_DEBUG(a,b) { if (DEBUG_COV){printlog("\n# %s:\n", b); \ m_logoutput(a);}} #define V_DEBUG(a,b) {if (DEBUG_COV){printlog("\n# %s:\n", b); \ v_logoutput(a);}} #define UPDATE_BLP (pred == UPDATE && last_pred == GLS_BLP) #define UPDATE_BLUP (pred == UPDATE && last_pred == GLS_BLUP) /* static MAT *convert_vmuC(MAT *C, DATA *d); static MAT *convert_vmuC0(MAT *C0, DATA *d, double v); static MAT *convert_vmuC00(MAT *MSPE, double v); */ static void convert_C(MAT *C, VEC *mu, double (*fn)(double)); static void convert_C0(MAT *C0, VEC *mu, VEC *mu0, double (*fn)(double)); static void convert_MSPE(MAT *MSPE, VEC *mu0, double (*fn)(double)); typedef struct { MAT *C, /* (Generalized) Covariance matrix */ *X, /* design matrix, y = X beta + e */ *CinvX, /* C-1 X */ *XCinvX; /* X' C-1 X */ VEC *y, /* measurement vector */ *mu, /* mu vector, E(y) */ *mu0, /* mu at loc x0 */ *beta; /* parameter vector */ } GLM; /* structure is locally defined, will be held in void *glm in DATA */ static GLM *new_glm(void); /* * n_vars is the number of variables to be considered, * d is the data array of variables d[0],...,d[n_vars-1], * pred determines which estimate is required: BLUE, BLUP, or BLP */ void gls(DATA **d /* pointer to DATA array */, int n_vars, /* length of DATA array (to consider) */ enum GLS_WHAT pred, /* what type of prediction is requested */ DPOINT *where, /* prediction location */ double *est /* output: array that holds the predicted values and variances */) { GLM *glm = NULL; /* to be copied to/from d */ static MAT *X0 = MNULL, *C0 = MNULL, *MSPE = MNULL, *CinvC0 = MNULL, *Tmp1 = MNULL, *Tmp2 = MNULL, *Tmp3 = MNULL, *R = MNULL; static VEC *blup = VNULL, *tmpa = VNULL, *tmpb = VNULL; PERM *piv = PNULL; volatile unsigned int i, rows_C; unsigned int j, k, l = 0, row, col, start_i, start_j, start_X, global, one_nbh_empty; VARIOGRAM *v = NULL; static enum GLS_WHAT last_pred = GLS_INIT; /* the initial value */ double c_value, *X_ori; int info; if (d == NULL) { /* clean up */ if (X0 != MNULL) M_FREE(X0); if (C0 != MNULL) M_FREE(C0); if (MSPE != MNULL) M_FREE(MSPE); if (CinvC0 != MNULL) M_FREE(CinvC0); if (Tmp1 != MNULL) M_FREE(Tmp1); if (Tmp2 != MNULL) M_FREE(Tmp2); if (Tmp3 != MNULL) M_FREE(Tmp3); if (R != MNULL) M_FREE(R); if (blup != VNULL) V_FREE(blup); if (tmpa != VNULL) V_FREE(tmpa); if (tmpb != VNULL) V_FREE(tmpb); last_pred = GLS_INIT; return; } if (DEBUG_COV) { printlog("we're at %s X: %g Y: %g Z: %g\n", IS_BLOCK(where) ? "block" : "point", where->x, where->y, where->z); } if (pred != UPDATE) /* it right away: */ last_pred = pred; assert(last_pred != GLS_INIT); if (d[0]->glm == NULL) { /* allocate and initialize: */ glm = new_glm(); d[0]->glm = (void *) glm; } else glm = (GLM *) d[0]->glm; glm->mu0 = v_resize(glm->mu0, n_vars); MSPE = m_resize(MSPE, n_vars, n_vars); if (pred == GLS_BLP || UPDATE_BLP) { X_ori = where->X; for (i = 0; i < n_vars; i++) { /* mu(0) */ glm->mu0->ve[i] = calc_mu(d[i], where); blup = v_copy(glm->mu0, v_resize(blup, glm->mu0->dim)); where->X += d[i]->n_X; /* shift to next x0 entry */ } where->X = X_ori; /* ... and set back */ for (i = 0; i < n_vars; i++) { /* Cij(0,0): */ for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id,d[j]->id)); ME(MSPE, i, j) = ME(MSPE, j, i) = COVARIANCE0(v, where, where, d[j]->pp_norm2); } } fill_est(NULL, blup, MSPE, n_vars, est); /* in case of empty neighbourhood */ } /* logprint_variogram(v, 1); */ /* * selection dependent problem dimensions: */ for (i = rows_C = 0, one_nbh_empty = 0; i < n_vars; i++) { rows_C += d[i]->n_sel; if (d[i]->n_sel == 0) one_nbh_empty = 1; } if (rows_C == 0 /* all selection lists empty */ || one_nbh_empty == 1) { /* one selection list empty */ if (pred == GLS_BLP || UPDATE_BLP) debug_result(blup, MSPE, pred); return; } for (i = 0, global = 1; i < n_vars && global; i++) global = (d[i]->sel == d[i]->list && d[i]->n_list == d[i]->n_original && d[i]->n_list == d[i]->n_sel); /* * global things: enter whenever (a) first time, (b) local selections or * (c) the size of the problem grew since the last call (e.g. simulation) */ if (glm->C == NULL || !global || rows_C > glm->C->m) { /* * fill y: */ glm->y = get_y(d, glm->y, n_vars); if (pred != UPDATE) { glm->C = m_resize(glm->C, rows_C, rows_C); if (gl_choleski == 0) /* use LDL' decomposition, allocate piv: */ piv = px_resize(piv, rows_C); m_zero(glm->C); glm->X = get_X(d, glm->X, n_vars); M_DEBUG(glm->X, "X"); glm->CinvX = m_resize(glm->CinvX, rows_C, glm->X->n); glm->XCinvX = m_resize(glm->XCinvX, glm->X->n, glm->X->n); glm->beta = v_resize(glm->beta, glm->X->n); for (i = start_X = start_i = 0; i < n_vars; i++) { /* row var */ /* fill C, mu: */ for (j = start_j = 0; j <= i; j++) { /* col var */ v = get_vgm(LTI(d[i]->id,d[j]->id)); for (k = 0; k < d[i]->n_sel; k++) { /* rows */ row = start_i + k; for (l = 0, col = start_j; col <= row && l < d[j]->n_sel; l++, col++) { if (pred == GLS_BLUP) c_value = GCV(v, d[i]->sel[k], d[j]->sel[l]); else c_value = COVARIANCE(v, d[i]->sel[k], d[j]->sel[l]); /* on the diagonal, if necessary, add measurement error variance */ if (d[i]->colnvariance && i == j && k == l) c_value += d[i]->sel[k]->variance; ME(glm->C, col, row) = c_value; /* fill upper */ if (col != row) ME(glm->C, row, col) = c_value; /* fill all */ } /* for l */ } /* for k */ start_j += d[j]->n_sel; } /* for j */ start_i += d[i]->n_sel; if (d[i]->n_sel > 0) start_X += d[i]->n_X - d[i]->n_merge; } /* for i */ /* if (d[0]->colnvmu) glm->C = convert_vmuC(glm->C, d[0]); */ if (d[0]->variance_fn) { glm->mu = get_mu(glm->mu, glm->y, d, n_vars); convert_C(glm->C, glm->mu, d[0]->variance_fn); } if (DEBUG_COV && pred == GLS_BLUP) printlog("[using generalized covariances: max_val - semivariance()]"); M_DEBUG(glm->C, "Covariances (x_i, x_j) matrix C (upper triangle)"); /* * factorize C: */ CHfactor(glm->C, piv, &info); if (info != 0) { /* singular: */ pr_warning("Covariance matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ P_FREE(piv); set_mv_double(&est[0]); return; } if (piv == NULL) M_DEBUG(glm->C, "glm->C, Choleski decomposed:") else M_DEBUG(glm->C, "glm->C, LDL' decomposed:") } /* if (pred != UPDATE) */ if (pred != GLS_BLP && !UPDATE_BLP) { /* C-1 X and X'C-1 X, beta */ /* * calculate CinvX: */ glm->CinvX = CHsolve(glm->C, glm->X, glm->CinvX, piv); /* M_DEBUG(glm->CinvX, "C-1 X"); */ /* * calculate X'C-1 X: */ glm->XCinvX = mtrm_mlt(glm->X, glm->CinvX, glm->XCinvX); /* X'C-1 X */ M_DEBUG(glm->XCinvX, "X'C-1 X"); m_inverse(glm->XCinvX, &info); if (info != 0) { /* singular: */ pr_warning("X'C-1 X matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ P_FREE(piv); set_mv_double(&est[0]); return; } /* * calculate beta: */ tmpa = v_resize(tmpa, rows_C); tmpa = vm_mlt(glm->CinvX, glm->y, tmpa); /* X'C-1 y */ glm->beta = vm_mlt(glm->XCinvX, tmpa, glm->beta); /* (X'C-1 X)-1 X'C-1 y */ V_DEBUG(glm->beta, "beta"); M_DEBUG(glm->XCinvX, "Cov(beta), (X'C-1 X)-1"); M_DEBUG(R = get_corr_mat(glm->XCinvX, R), "Corr(beta)"); } /* if pred != GLS_BLP */ } /* if redo the heavy part */ if (pred != GLS_BLP && !UPDATE_BLP) { /* but BLUE or BLUP */ X0 = get_X0(d, X0, where, n_vars); M_DEBUG(X0, "X0 (X values at prediction location x0)"); blup = vm_mlt(X0, glm->beta, blup); /* X0' beta = beta'X0 -> vm_ */ if (pred == GLS_BLUP) V_DEBUG(blup, "BLUE(mu), E(y(x0)) = X0'beta"); } if (pred == GLS_BLUE) { /* we did the blue, it's in blup */ /* * BLUE = X0 beta; Cov(X0 beta)= X0'(X'C-1X)-1 X0 */ Tmp1 = mtrm_mlt(X0, glm->XCinvX, Tmp1); m_mlt(Tmp1, X0, MSPE); /* X0'(X'C-1X)-1 X0 */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); P_FREE(piv); return; /* Quit function */ } /* * now the part that's got to be done every time, for x0 and where change: * resize matrices (BLP, BLUP): */ C0 = m_resize(C0, rows_C, n_vars); CinvC0 = m_resize(CinvC0, rows_C, n_vars); /* * fill C0: */ for (i = 0; i < n_vars; i++) { /* cols */ for (j = 0, start_j = 0; j < n_vars; j++) { /* rows */ v = get_vgm(LTI(d[i]->id, d[j]->id)); for (k = 0; k < d[j]->n_sel; k++) { if (pred == GLS_BLUP) ME(C0, start_j+k, i) = GCV0(v, d[j]->sel[k], where, d[j]->pp_norm2); else ME(C0, start_j+k, i) = COVARIANCE0(v, d[j]->sel[k], where, d[j]->pp_norm2); } start_j += d[j]->n_sel; } } /* if (d[0]->colnvmu) { X0 = get_X0(d, X0, where, n_vars); C0 = convert_vmuC0(C0, d[0], X0->me[0][0]); } */ if (d[0]->variance_fn) convert_C0(C0, glm->mu, glm->mu0, d[0]->variance_fn); M_DEBUG(C0, "Covariances (x_i, x_0), C0"); /* https://github.com/r-spatial/gstat/issues/80 : */ if (glm->C == NULL) { /* ErrMsg(ER_IMPOSVAL, "covariance matrix NULL;\nsee: https://github.com/r-spatial/gstat/issues/80"); */ pr_warning("C or X'C-1 X matrix singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); set_mv_double(&est[0]); return; /* xxx: return NA's? */ } /* * calculate CinvC0: */ CinvC0 = CHsolve(glm->C, C0, CinvC0, piv); M_DEBUG(CinvC0, "C-1 C0"); if (pred == GLS_BLP || UPDATE_BLP) { /* * BLP = mu_0 + C0'C-1 (y-mu_i) */ V_DEBUG(glm->y, "data values y"); if (DEBUG_COV) { printlog("beta is:\n"); for (i = 0; i < n_vars; i++) for (j = 0; j < d[i]->beta->size; j++) printlog("%g%s", d[i]->beta->val[j], j == d[i]->beta->size - 1 ? "\n" : " "); } glm->mu = get_mu(glm->mu, glm->y, d, n_vars); V_DEBUG(glm->mu, "mean values (mu_i)"); /* y - mu_i: */ tmpa = v_resize(tmpa, rows_C); v_sub(glm->y, glm->mu, tmpa); V_DEBUG(tmpa, "Residual vector (y - mu_i)"); tmpb = vm_mlt(CinvC0, tmpa, tmpb); /* C0'C-1 (y-mu_i) */ V_DEBUG(tmpb, "Weighted res. vector, C0'C-1 (y-mu_i)"); v_add(blup, tmpb, blup); /* mu_0 + C0'C-1 (y-mu_i) */ /* * MSPE = C(0,0) - C0'C-1 C0 */ Tmp2 = mtrm_mlt(CinvC0, C0, Tmp2); /* C0'C-1 C0 */ /* if (d[0]->colnvmu) MSPE = convert_vmuC00(MSPE, X0->me[0][0]); */ if (d[0]->variance_fn) convert_MSPE(MSPE, glm->mu0, d[0]->variance_fn); m_sub(MSPE, Tmp2, MSPE); /* C(0,0) - C0'C-1 C0 */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); P_FREE(piv); return; /* Quit function */ } /* * GLS_BLUP, universal kriging estimate remains: */ tmpa = mv_mlt(glm->X, glm->beta, tmpa); /* X beta */ tmpb = v_sub(glm->y, tmpa, tmpb); /* y - X beta */ tmpa = vm_mlt(CinvC0, tmpb, tmpa); /* c0'C-1 (Y - X beta) */ blup = v_add(blup, tmpa, blup); /* x0 beta + c0'C-1 (Y - X beta) */ /* * universal kriging MSPE: * (a) Cov_ij(0,0): */ for (i = 0; i < n_vars; i++) { for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id, d[j]->id)); ME(MSPE, i, j) = ME(MSPE, j, i) = GCV0(v, where, where, d[j]->pp_norm2); } } M_DEBUG(MSPE, "[a] Cov_ij(B,B) or Cov_ij(0,0)"); /* * (c) (x0-X'C-1 c0)'(X'C-1X)-1 (x0-X'C-1 c0): */ Tmp1 = mtrm_mlt(glm->CinvX, C0, Tmp1); /* X'C-1 c0 */ Tmp1 = m_sub(X0, Tmp1, Tmp1); /* (x0 - X'C-1 c0) */ Tmp2 = m_copy(Tmp1, m_resize(Tmp2, Tmp1->m, Tmp1->n)); Tmp3 = m_mlt(glm->XCinvX, Tmp1, Tmp3); /* (X'C-1 X)-1 (x0 - X'C-1 c0) */ Tmp1 = mtrm_mlt(Tmp2, Tmp3, Tmp1); M_DEBUG(Tmp1, "[c] (x0-X'C-1 c0)'(X'C-1 X)-1(x0-X'C-1 c0)"); /* * (b) c0'C-1 c0: */ Tmp2 = mtrm_mlt(C0, CinvC0, Tmp2); M_DEBUG(Tmp2, "[b] c0'C-1 c0"); /* * (a - b + c) = * Cov_ij(0,0) - c0'C-1 c0 + (x0-X'C-1 c0)'(X'C-1 X)-1 (x0-X'C-1 c0): */ m_sub(MSPE, Tmp2, MSPE); /* a-b */ m_add(MSPE, Tmp1, MSPE); /* +c */ /* * done: */ fill_est(d, blup, MSPE, n_vars, est); debug_result(blup, MSPE, pred); if (DEBUG_COV) { /* calculate kriging weights explicitly: */ /* Tmp3' * glm->CinvX' + CinvC0 */ Tmp1 = m_mlt(glm->CinvX, Tmp3, Tmp1); Tmp2 = m_add(Tmp1, CinvC0, Tmp2); M_DEBUG(Tmp2, "kriging weights"); if (DEBUG_COV) printlog("\n\n"); } P_FREE(piv); return; } static void fill_est(DATA **d, VEC *blup, MAT *MSPE, int n_vars, double *est) { int i, j, n_filled; static IVEC *v = IVNULL; if (n_vars == 1) { est[0] = blup->ve[0]; est[1] = ME(MSPE, 0, 0); return; } v = iv_resize(v, n_vars); if (d == NULL) { /* GLS_BLP, initializing */ for (i = 0; i < n_vars; i++) v->ive[i] = i; n_filled = n_vars; } else { /* n_vars > 1: avoid possibly empty variables -> NA */ for (i = j = 0; i < n_vars; i++) { if (d[i]->n_sel > 0) { v->ive[j] = i; j++; } } n_filled = j; } for (i = 0; i < n_filled; i++) { /* only adress non-empty variables */ est[2 * v->ive[i]] = blup->ve[v->ive[i]]; est[2 * v->ive[i] + 1] = ME(MSPE, v->ive[i], v->ive[i]); for (j = 0; j < i; j++) est[2 * n_vars + LTI2(v->ive[i], v->ive[j])] = ME(MSPE, v->ive[i], v->ive[j]); } return; } static void debug_result(VEC *blup, MAT *MSPE, enum GLS_WHAT pred) { if (! DEBUG_COV) return; switch (pred) { case GLS_BLP: V_DEBUG(blup, "Best Linear Predictor"); M_DEBUG(MSPE, "Prediction Covariances"); break; case GLS_BLUE: V_DEBUG(blup, "Best Linear Unbiased Estimate (X0'beta)"); M_DEBUG(MSPE, "Estimation Covariances, Cov(X0'beta)"); break; case GLS_BLUP: V_DEBUG(blup, "Best Linear Unbiased Predictor"); M_DEBUG(MSPE, "MSPE ([a]-[b]+[c])"); break; case UPDATE: V_DEBUG(blup, "Updated predictor"); M_DEBUG(MSPE, "MSPE (updated)"); break; case GLS_INIT: ErrMsg(ER_IMPOSVAL, "invalid value for pred"); break; } } double *make_gls(DATA *d, int calc_residuals) { /* * if calc_residuals == 0, return value is allocated, but not freed */ int i, j, size; double *est = NULL; DATA **data; GLM *glm; glm = (GLM *) d->glm; if (glm == NULL) { data = get_gstat_data(); glm = (GLM *) data[0]->glm; } if (glm && glm->C) { /* renew: variogram may have changed */ m_free((MAT *) glm->C); glm->C = MNULL; } select_at(d, NULL); /* where == NULL --> global selection */ if (calc_residuals) { est = (double *) emalloc(get_n_outputs() * sizeof(double)); for (i = 0; i < d->n_list; i++) { gls(&d, 1, GLS_BLUE, d->list[i], est); glm = (GLM *) d->glm; d->list[i]->attr = glm->y->ve[i] - est[0]; } efree(est); est = NULL; } else { /* no residuals -- return beta & Cov(beta) */ size = d->n_X * (1 + d->n_X); est = (double *) emalloc(size * sizeof(double)); /* fill the GLM stuff: */ gls(&d, 1, GLS_BLUE, d->list[0], est); glm = (GLM *) d->glm; for (i = 0; i < glm->beta->dim; i++) { est[2 * i] = glm->beta->ve[i]; est[2 * i + 1] = ME(glm->XCinvX, i, i); for (j = 0; j < i; j++) est[2 * glm->beta->dim + LTI2(i,j)] = ME(glm->XCinvX, i, j); } } gls(NULL, 0, GLS_INIT, NULL, NULL); return est; /* possibly NULL */ } double *make_gls_mv(DATA **d, int n_vars) { /* * allocates memory for est (return value) but does not free it */ int i, j, sum_X, index, size = 0; double *est = NULL; GLM *glm; DPOINT where; for (i = sum_X = 0; i < n_vars; i++) { select_at(d[i], NULL); /* where == NULL --> global selection */ sum_X += d[i]->n_X; } where = *d[0]->list[0]; where.X = (double *) emalloc(sum_X * sizeof(double)); /* replace */ for (i = 0; i < sum_X; i++) /* fill with nonsense values: */ where.X[i] = 0.0; size = sum_X + (sum_X * (sum_X + 1))/2; est = (double *) emalloc(size * sizeof(double)); /* fill the GLM stuff: */ gls(d, n_vars, GLS_BLUE, &where, est); glm = (GLM *) d[0]->glm; assert(glm != NULL); for (i = 0; i < glm->beta->dim; i++) { assert((2 * i + 1) < size); est[2 * i] = glm->beta->ve[i]; est[2 * i + 1] = ME(glm->XCinvX, i, i); for (j = 0; j < i; j++) { index = 2 * glm->beta->dim + LTI2(i,j); assert(index < size); est[index] = ME(glm->XCinvX, i, j); } } gls(NULL, 0, GLS_INIT, NULL, NULL); efree(where.X); return est; } static GLM *new_glm(void) { GLM *glm; glm = (GLM *) emalloc(sizeof(GLM)); glm->X = glm->C = glm->CinvX = glm->XCinvX = MNULL; glm->y = glm->mu = glm->mu0 = glm->beta = VNULL; return glm; } void free_glm(void *v_glm) { GLM *glm; if (v_glm == NULL) return; glm = (GLM *) v_glm; if (glm->X) m_free(glm->X); if (glm->C) m_free(glm->C); if (glm->CinvX) m_free(glm->CinvX); if (glm->XCinvX) m_free(glm->XCinvX); if (glm->y) v_free(glm->y); if (glm->beta) v_free(glm->beta); if (glm->mu0) v_free(glm->mu0); if (glm->mu) v_free(glm->mu); efree(glm); } static void convert_C(MAT *C, VEC *mu, double (*fn)(double)) { int i, j; double sqrtfni; assert(C && mu); assert(C->m == mu->dim); for (i = 0; i < mu->dim; i++) { /* assert(mu->ve[i] >= 0.0); */ /* be more friendly: */ if (mu->ve[i] < 0.0) ErrMsg(ER_IMPOSVAL, "can not take square root of negative mean values!"); ME(C, i, i) *= fn(mu->ve[i]); sqrtfni = sqrt(fn(mu->ve[i])); for (j = 0; j < i; j++) ME(C, i, j) *= sqrtfni * sqrt(fn(mu->ve[j])); } } static void convert_C0(MAT *C0, VEC *mu, VEC *mu0, double (*fn)(double)) { int i, j; double sqrtfni; assert(C0 && mu && mu0); assert(C0->m == mu->dim); assert(C0->n == mu0->dim); for (i = 0; i < mu->dim; i++) { assert(mu->ve[i] >= 0.0); sqrtfni = sqrt(fn(mu->ve[i])); for (j = 0; j < mu0->dim; j++) ME(C0, i, j) *= sqrtfni * sqrt(fn(mu0->ve[j])); } } static void convert_MSPE(MAT *MSPE, VEC *mu0, double (*fn)(double)) { int i, j; double sqrtfni; assert(MSPE && mu0); assert(MSPE->m == mu0->dim); for (i = 0; i < mu0->dim; i++) { assert(mu0->ve[i] >= 0.0); ME(MSPE, i, i) *= fn(mu0->ve[i]); sqrtfni = sqrt(fn(mu0->ve[i])); for (j = 0; j < i; j++) { ME(MSPE, i, j) *= sqrtfni * sqrt(fn(mu0->ve[j])); ME(MSPE, j, i) = ME(MSPE, i, j); } } } static VEC *get_mu(VEC *mu, const VEC *y, DATA **d, int n_vars) { int i, start_j, j; mu = v_resize(mu, y->dim); for (i = start_j = 0; i < n_vars; i++) { for (j = 0; j < d[i]->n_sel; j++) mu->ve[start_j + j] = calc_mu(d[i], d[i]->sel[j]); start_j += d[i]->n_sel; } return mu; } static MAT *get_corr_mat(MAT *C, MAT *R) { int i, j; assert(C); assert(C->m == C->n); R = m_copy(C, m_resize(R, C->m, C->n)); for (i = R->m - 1; i >= 0; i--) { assert(ME(R, i, i) > 0.0); for (j = 0; j < i; j++) ME(R, i, j) /= sqrt(ME(R, i, i) * ME(R, j, j)); for (j = i + 1; j < R->m; j++) ME(R, i, j) = ME(R, j, i); } for (i = 0; i < R->m; i++) ME(R, i, i) = 1.0; return(R); } gstat/src/fit.h0000644000176200001440000000023013777370515013130 0ustar liggesusers#ifndef FIT_H # define FIT_H #if defined(__cplusplus) extern "C" { #endif int fit_variogram(VARIOGRAM *v); #if defined(__cplusplus) } #endif #endif gstat/src/direct.c0000644000176200001440000000727013777370515013626 0ustar liggesusers/* * direction.c: evaluation of directions for variogram pair inclusion * Optimized by Konstantin Malakhanov (K.M.), march 1998 */ #include /* cos() */ #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "defaults.h" #include "glvars.h" #include "direct.h" #define MAX_ANG (PI/2.0) /* * direct's little private data base: */ static double alpha = 0.0, beta = 0.0, tol_hor = PI, tol_ver = PI, cos_tol_hor = -1.0, cos_tol_ver = -1.0, /* Changed K.M. Fri Feb 27 11:13:47 1998 */ dir_v[2] = { 1.0, 0.0 } , dir_h[2] = { 0.0, 1.0 }; static int all_directions = -1; void set_direction_values(double a, double b, double t_h, double t_v) { /* do some checks: */ if (a < 0.0 || a > 360.0) pr_warning( "alpha must be in [0..360]"); if (b < 0.0 || b > 360.0) pr_warning( "beta must be in [0..360]"); if (t_h < 0.0 || t_h > DEF_tol_hor) pr_warning( "horizontal tolerance must be in <0..180>"); if (t_v < 0.0 || t_v > DEF_tol_ver) pr_warning( "vertical tolerance must be in <0..180>"); if (t_h == DEF_tol_hor && t_v == DEF_tol_ver) { all_directions = 1; return; } else all_directions = 0; alpha = a * PI / 180.0; beta = b * PI / 180.0; tol_hor = t_h * PI / 180.0; tol_ver = t_v * PI / 180.0; cos_tol_hor = cos(tol_hor); /* Changed K.M. Fri Feb 27 11:14:15 1998 */ cos_tol_ver = cos(tol_ver); /* Changed K.M. Fri Feb 27 11:14:15 1998 */ dir_h[0] = sin(alpha); /* */ dir_h[1] = cos(alpha); /* */ dir_v[0] = cos(beta); /* */ dir_v[1] = sin(beta); /* */ return; } double valid_direction(DPOINT *a, DPOINT *b, int symmetric, const DATA *d) { /* * return distance when vector is within the tolerance section; * return -1.0 when vector is outside tolerance section. */ double norm, inprod, dist, px, py, pz; /* Changed K.M. Fri Feb 27 11:06:07 1998 */ /* dist = d->point_norm(p); */ dist = sqrt(d->pp_norm2(a, b)); if (all_directions == 1) return dist; px = a->x - b->x; py = a->y - b->y; pz = a->z - b->z; if (tol_hor >= MAX_ANG && tol_ver >= MAX_ANG) return dist; if (tol_hor >= MAX_ANG && pz == 0.0) return dist; if (tol_ver >= MAX_ANG && px == 0.0 && py == 0.0) return dist; if (tol_hor < MAX_ANG && (px != 0.0 || py != 0.0)) { /* * check in plane: */ norm = sqrt(px * px + py * py); inprod = (px * dir_h[0] + py * dir_h[1])/norm; if (symmetric) { /* the most often case */ if ( fabs(inprod) < cos_tol_hor) /* if cos(alpha) < cos(tol) then alpha > tol! */ return -1.0; } else if (inprod < cos_tol_hor) return -1.0; /* Changed K.M. Fri Feb 27 11:18:24 1998: I have eliminated most of checks for the following reasons: if (because of numerical reasons) we get fabs(inprod)>1.0, then it really means that inprod is either +1.0 or -1.0, i.e. the angle between point vector and variogram direction is either 0 or pi. In case of SYMMETRIC it doesn't matter - fabs(inprod) is then bigger then cos_tol_hor, so we accept this point pair as it should be. In the case of not SYMMETRIC - if inprod>1 then inprod is bigger then cos_tol_hor and we accept this pair, if inprod < -1.0 then it is smaller then cos_tol_hor and we reject this pair. This way we also do not need to calculate acos and to check for domain errors afterwards. */ } if (tol_ver < MAX_ANG && (px != 0.0 || py != 0.0 || pz != 0.0)) { /* * inproduct in */ /* Changed K.M. Fri Feb 27 15:47:13 1998 */ inprod = (sqrt(px * px + py * py) * dir_v[0] + pz * dir_v[1])/dist; if (symmetric) { /* the most often case */ if ( fabs(inprod) < cos_tol_ver) /* if cos(alpha) < cos(tol) then alpha > tol! */ return -1.0; } else if (inprod < cos_tol_ver) return -1.0; } return dist; } gstat/src/lm.c0000644000176200001440000003175314115426745012761 0ustar liggesusers/* * lm.c: contains routines for linear model y=Xb+e, e independent. */ #include #include /* size_t for DJGPP */ #include /* DBL_MAX */ #include /* sqrt() */ #include "mtrx.h" #include "defs.h" #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "select.h" #include "glvars.h" #include "lm.h" static void predict_lm(LM *lms, MAT *X0, double *est); static void create_lm(DATA **d, int nvars); static VEC *get_weights(DATA **d, VEC *weights, int nvars); static int get_colX_nr(DATA **d, int var, int x); static int zero_weights_count(LM *lm); void pred_lm(DATA **data, int n_vars, DPOINT *where, double *est) { int i = 0, global = 1; LM *lm; static MAT *X0 = MNULL; global = 1; while (global && i < n_vars) { if (data[i]->sel != data[i]->list) /* local selection */ global = 0; /* and jump out of this loop */ i++; } if (data[0]->lm == NULL || !global) { create_lm(data, n_vars); if (DEBUG_FIT) { printlog("at location [%g,%g,%g]:\n", where->x, where->y, where->z); logprint_lm(data[0], data[0]->lm); } } lm = (LM *) data[0]->lm; if (lm == NULL || lm->y->dim == 0 || lm->is_singular) { for (i = 0; i < n_vars; i++) { set_mv_double(&(est[2 * i])); set_mv_double(&(est[2 * i + 1])); } if (lm && lm->is_singular) pr_warning("singular X matrix at x[%g], y[%g], z[%g]:", where->x, where->y, where->z); } else { X0 = get_X0(data, X0, where, n_vars); if (DEBUG_COV) { printlog("#X0 is "); m_logoutput(X0); } predict_lm(lm, X0, est); } return; } double *make_ols(DATA *d) { /* return value is allocated, but not freed */ int i, j, size; double *est = NULL; DATA **data; LM *lm; lm = (LM *) d->lm; if (lm == NULL) { data = get_gstat_data(); lm = (LM *) data[0]->lm; } select_at(d, NULL); /* where == NULL --> global selection */ /* return beta & Cov(beta) */ size = d->n_X * (1 + d->n_X); est = (double *) emalloc(size * sizeof(double)); for (i = 0; i < size; i++) set_mv_double(&(est[i])); /* fill the LM stuff: */ create_lm(&d, 1); if (DEBUG_FIT) logprint_lm(d, d->lm); lm = (LM *) d->lm; if (lm->is_singular) return est; /* all NA's */ for (i = 0; i < lm->beta->dim; i++) { est[2 * i] = lm->beta->ve[i]; est[2 * i + 1] = ME(lm->Cov, i, i); for (j = 0; j < i; j++) est[2 * lm->beta->dim + LTI2(i,j)] = ME(lm->Cov, i, j); } free_lm(d->lm); d->lm = NULL; return est; } LM *init_lm(LM *lm) { if (lm == NULL) lm = (LM *) emalloc(sizeof(LM)); lm->y = VNULL; lm->weights = VNULL; lm->beta = VNULL; lm->Xty = VNULL; lm->X = MNULL; lm->Cov = MNULL; lm->Chol = MNULL; lm->SSReg = lm->MSReg = DBL_MAX; lm->SSErr = lm->MSErr = DBL_MAX; lm->is_singular = 0; return lm; } void free_lm(LM *lm) { if (lm->y) v_free(lm->y); if (lm->weights) v_free(lm->weights); if (lm->beta) v_free(lm->beta); if (lm->Xty) v_free(lm->Xty); if (lm->X) m_free(lm->X); if (lm->Chol) m_free(lm->Chol); if (lm->Cov) m_free(lm->Cov); efree(lm); } static void create_lm(DATA **data, int nvars) { /* * obtain base necessities (y, X, weights), and calculate the rest */ LM *lm; int i; lm = (LM *) data[0]->lm; if (lm == NULL) /* create */ data[0]->lm = lm = init_lm(NULL); lm->X = get_X(data, lm->X, nvars); lm->y = get_y(data, lm->y, nvars); lm->weights = get_weights(data, lm->weights, nvars); /* * check for intercept: */ if (nvars == 1) { lm->has_intercept = (data[0]->colX[0] == 0); for (i = 1; i < data[0]->n_X && ! lm->has_intercept; i++) lm->has_intercept = (data[0]->colX[i] == 0); } /* * calculate: */ data[0]->lm = (void *) calc_lm(lm); return; } void make_residuals_lm(DATA *d) { /* * make (local or global) residuals */ int i; double est[2]; static MAT *X0 = MNULL; if (d->is_residual) return; if (d->beta) { /* pr_warning("calculating residuals with respect to pre-defined mean"); */ for (i = 0; i < d->n_list; i++) d->list[i]->attr -= calc_mu(d, d->list[i]); } else { select_at(d, NULL); create_lm(&d, 1); if (DEBUG_FIT) logprint_lm(d, d->lm); for (i = 0; i < d->n_list; i++) { X0 = get_X0(&d, X0, d->list[i], 1); predict_lm((LM *) d->lm, X0, est); d->list[i]->attr -= est[0]; /* y = Xb + e, so e^ = y - Xb^ */ } } d->is_residual = 1; return; } static void predict_lm(LM *lm, MAT *X0, double *est) { /* * make a prediction for x0, store pred. and variance in est[0] and est[1] */ VEC *blup = VNULL; MAT *tmp = MNULL, *ans = MNULL; if (lm->beta == NULL) ErrMsg(ER_IMPOSVAL, "lm->beta NULL: sample too small?"); blup = vm_mlt(X0, lm->beta, blup); /* X0' beta = beta'X0 -> vm_ */ /* * Cov(y0^ - y0) = x0'X'X-1 x0 MSErr, or x0'(X'WX)-1 x0 MSErr * for this, solve X'X b = x0 for b, then b = X'X-1 x0; ans = x0'b * MSErr added when prediction is pointwise */ tmp = CHsolve(lm->Chol, X0, tmp, PNULL); ans = mtrm_mlt(X0, tmp, ans); ans = sm_mlt(lm->MSErr, ans, ans); for (int i = 0; i < ans->m; i++) { est[2 * i] = blup->ve[i]; est[2 * i + 1] = ME(ans, i, i); if (max_block_dimension(1) == 0.0) /* pointwise prediction */ est[2 * i + 1] += lm->MSErr; for (int j = 0; j < i; j++) est[2 * ans->m + LTI2(i,j)] = ME(ans, i, j); } v_free(blup); m_free(tmp); m_free(ans); return; } MAT *get_X(DATA **d, MAT *X, int nvars) { int i, j, k, rows, cols, colX; for (i = rows = cols = 0; i < nvars; i++) { rows += d[i]->n_sel; if (d[i]->n_sel > 0) cols += d[i]->n_X - d[i]->n_merge; } /* if (rows <= 0 || cols <= 0) ErrMsg(ER_IMPOSVAL, "get_X: size <= 0"); */ X = m_resize(X, rows, cols); m_zero(X); for (i = rows = 0; i < nvars; i++) { /* i: var block index */ for (j = 0; d[i]->n_sel && j < d[i]->n_X; j++) { /* j: column index */ colX = get_colX_nr(d, i, j); for (k = 0; k < d[i]->n_sel; k++) /* k: row index */ ME(X, rows + k, colX) = d[i]->sel[k]->X[j]; } rows += d[i]->n_sel; } return X; } MAT *get_X0(DATA **d, MAT *X0, DPOINT *where, int nvars) { int i, j, start_i, cols, colX; for (i = cols = 0; i < nvars; i++) { if (d[i]->n_sel > 0) cols += d[i]->n_X - d[i]->n_merge; } X0 = m_resize(X0, cols, nvars); m_zero(X0); /* initialize; now fill non-zero entries: */ for (i = start_i = 0; i < nvars; i++) { for (j = 0; d[i]->n_sel && j < d[i]->n_X; j++) { /* for X-column k+.. */ colX = get_colX_nr(d, i, j); ME(X0, colX, i) = where->X[start_i+j]; /* colX is row index: X0' */ } start_i += d[i]->n_X; } return X0; } VEC *get_y(DATA **d, VEC *y, int nvars) { int i, j, offset, size; for (i = size = 0; i < nvars; i++) size += d[i]->n_sel; /* if (size <= 0) ErrMsg(ER_IMPOSVAL, "get_X: size <= 0"); */ y = v_resize(y, size); for (j = offset = 0; j < nvars; j++) { for (i = 0; i < d[j]->n_sel; i++) y->ve[offset + i] = d[j]->sel[i]->attr; offset += d[j]->n_sel; } return y; } static int get_colX_nr(DATA **d, int var, int this_x) { int offset_x = 0, colX, i, j; for (i = 0; i < var; i++) if (d[i]->n_sel) offset_x += d[i]->n_X - d[i]->n_merge; if (d[var]->n_merge == 0) return offset_x + this_x; for (i = 0; i < d[var]->n_merge; i++) { if (d[var]->mtbl[i].col_this_X == this_x) { /* hit: merge this one! */ colX = d[var]->mtbl[i].col_other_X; if (d[var]->mtbl[i].to_var > 0) for (j = 0; j < d[var]->mtbl[i].to_var - 1; j++) colX += d[j]->n_X - d[j]->n_merge; return colX; } } /* so, we're at least at offset_x, but how much should we add? */ colX = offset_x + this_x; /* i.e. the maximum... */ for (i = 0; i < d[var]->n_merge; i++) for (j = 0; j < this_x; j++) if (d[var]->mtbl[i].col_this_X == j) colX--; /* ...minus all previously merged entries */ return colX; } static VEC *get_weights(DATA **d, VEC *weights, int nvars) { int i, j, size; for (i = size = 0; i < nvars; i++) { if (d[i]->colnvariance <= 0) /* no weights */ return VNULL; if (d[i]->n_sel > 0) size += d[i]->n_sel; } if (size <= 0) return VNULL; weights = v_resize(weights, size); for (i = size = 0; i < nvars; i++) { for (j = 0; j < d[i]->n_sel; j++) weights->ve[size + j] = 1.0 / d[i]->sel[j]->variance; /* ->variance > 0 is assured in data.c */ size += d[i]->n_sel; } return weights; } void logprint_lm(DATA *d, LM *lm) { double SSTot; char line[] = "-----------------------------------------------------------"; int i, coords = 0; if (lm->dfReg <= 0) return; SSTot = lm->SSReg + lm->SSErr; if (d != NULL) { printlog("\nmodel: %s = ", d->variable); for (i = 0; i < d->n_X; i++) { if (i > 0) { printlog(" + "); if ((i + 2) % 5 == 0) printlog("\n"); } printlog("%g", lm->beta->ve[i]); if (d->colX[i] > 0) printlog(" [col %d]", d->colX[i]); if (d->colX[i] < 0) { printlog(" %s", POLY_NAME(d->colX[i])); coords = 0; } } printlog(" + e\n"); if (coords) printlog( "(Note: coordinate coefficients apply to normalized coordinates)\n\n"); } printlog("Summary statistics (model %s intercept):\n", lm->has_intercept ? "with" : "without"); printlog("Source df SS MS F\n"); printlog("%s\n", line); printlog("Regression %3d %12.6g %12.6g", lm->dfReg, lm->SSReg, lm->MSReg); if (lm->MSErr <= 0.0) printlog(" Inf\n"); else printlog(" %12.6g\n", lm->MSReg/lm->MSErr); printlog("Error %3d %12.6g %12.6g\n", lm->dfE, lm->SSErr, lm->MSErr); printlog("%s\nTotal, %s %3d %12.6g\n%s\n\n", line, lm->has_intercept ? "corrected" : "uncorr. ", lm->dfReg + lm->dfE, SSTot, line); /* if (SSTot > 0.0) printlog("R2: %g\n", lm->SSReg / SSTot); */ return; } LM *calc_lm(LM *lm) { /* * calculate Chol,Xty,beta,SSErr,SSReg,MSErr^... * ASSUMES lm->X, lm->y and optionally lm->weights to be filled! */ double y_mean = 0, w; int i, j; /* static MAT *QR = MNULL; */ static VEC *tmp = VNULL; if (lm->X == MNULL || lm->y == VNULL) ErrMsg(ER_NULL, "calc_lm(): y or X"); if (lm->X->m != lm->y->dim) { message("size: %d %d %d\n", lm->X->m, lm->y->dim, lm->X->n); ErrMsg(ER_IMPOSVAL, "calc_lm: matrices wrong size"); } if (lm->X->m < lm->X->n) { lm->is_singular = 1; return lm; } /* * allocate structures: */ lm->is_singular = 0; lm->beta = v_resize(lm->beta, lm->X->n); lm->Xty = v_resize(lm->Xty, lm->X->n); tmp = v_resize(tmp, lm->X->n); if (lm->X->n == 0 || lm->y->dim == 0) return lm; if (DEBUG_COV) { printlog("#y is "); v_logoutput(lm->y); printlog("#X is "); m_logoutput(lm->X); if (lm->weights) { printlog("#w is "); v_logoutput(lm->weights); } } /* * create, in case of weights, V^{-1/2}X and V^{-1/2}y: */ if (lm->weights != VNULL) { for (i = 0; i < lm->X->m; i++) { /* rows */ w = sqrt(lm->weights->ve[i]); for (j = 0; j < lm->X->n; j++) /* cols */ ME(lm->X, i, j) *= w; lm->y->ve[i] *= w; } } /* * create Chol = X'X (or X'WX) and XtY = (y'X)' = X'y (X'Wy) */ lm->Xty = vm_mlt(lm->X, lm->y, lm->Xty); if (DEBUG_COV) { printlog("#X'y is "); v_logoutput(lm->Xty); } lm->Chol = mtrm_mlt(lm->X, lm->X, lm->Chol); if (DEBUG_COV) { printlog("#X'X is "); m_logoutput(lm->Chol); } lm->Cov = m_copy(lm->Chol, lm->Cov); /* save copy of X'X */ int info; lm->Chol = CHfactor(lm->Chol, PNULL, &info); if (info != 0) { lm->is_singular = 1; return lm; } lm->beta = CHsolve1(lm->Chol, lm->Xty, lm->beta, PNULL); if (DEBUG_COV) { printlog("#beta is "); v_logoutput(lm->beta); } /* * estimate error variance: */ tmp = mv_mlt(lm->X, lm->beta, tmp); /* X b */ tmp = v_sub(lm->y, tmp, tmp); /* e = y - X b */ if (lm->weights) { for (i = 0, lm->SSErr = 0.0; i < lm->X->m; i++) lm->SSErr += lm->weights->ve[i] * SQR(tmp->ve[i]); } else lm->SSErr = in_prod(tmp, tmp); /* e'e */ if (DEBUG_COV) printlog("#SSErr is %g\n", lm->SSErr); /* * estimate SSReg (Draper & Smith, p. 81, Section 2.2) * (unweighted, corrected): beta' X'X beta - n * y_mean^2 * (weighted, corrected): sum weight_i * (x_i beta - beta_0)^2 * (unweighted): beta' X'X beta * (weighted): see below */ tmp = v_resize(tmp, lm->X->n); tmp = vm_mlt(lm->Cov, lm->beta, tmp); lm->SSReg = in_prod(lm->beta, tmp); if (lm->has_intercept) { for (i = 0, y_mean = 0.0; i < lm->y->dim; i++) y_mean += lm->y->ve[i]; y_mean /= lm->y->dim; lm->SSReg -= SQR(y_mean) * lm->y->dim; } lm->dfReg = lm->X->n; if (lm->has_intercept) lm->dfReg -= 1; if (lm->dfReg > 0) lm->MSReg = lm->SSReg/lm->dfReg; else lm->MSReg = DBL_MAX; lm->dfE = lm->X->m - zero_weights_count(lm) - lm->X->n; if (lm->dfE == 0) lm->MSErr = DBL_MAX; else lm->MSErr = lm->SSErr/lm->dfE; lm->Cov = m_inverse(lm->Cov, &info); /* (X'X)-1 */ if (info != 0) pr_warning("linear model has singular covariance matrix"); /* next, multiply with sigma^2 */ sm_mlt(lm->MSErr, lm->Cov, lm->Cov); /* in situ mlt */ return lm; } static int zero_weights_count(LM *lm) { int i, n_zero = 0; if (lm->weights == VNULL) return 0; for (i = 0; i < lm->weights->dim; i++) if (lm->weights->ve[i] < gl_zero) n_zero++; return n_zero; } double calc_mu(const DATA *d, const DPOINT *where) { int i; double mu, *from; assert(d->beta); mu = 0.0; from = where->X; for (i = 0; i < d->beta->size; i++) mu += from[i] * d->beta->val[i]; return mu; } gstat/src/glvars.h0000644000176200001440000000516313777370515013656 0ustar liggesusers#ifndef GLVARS_H # define GLVARS_H /* avoid multiple inclusion */ typedef enum { NSP = 0, /* initial value */ UIF, /* variogram modelling user interface */ OKR, UKR, SKR, /* ordinary, universal or simple kriging */ IDW, /* inverse distance interpolation */ MED, /* (local) sample median or quantile */ NRS, /* neighbourhood size */ LSLM, /* uncorrelated (or weighted) linear model */ GSI, ISI, /* Gaussian/indicator (conditional) simulation */ SEM, COV, /* sample (cross) semivariance or covariance */ SPREAD, /* distance to nearest sample */ DIV, /* diversity, range */ SKEW, /* skewness, kurtosis */ LSEM, /* locally fitted semivariogram parameters */ TEST /* does nothing really */ } METHOD; typedef struct { METHOD m; int is_simulation; const char *name; } METHODS; extern const METHODS methods[]; typedef enum { MODE_NSP = 0, SIMPLE, STRATIFY, MULTIVARIABLE } MODE; #if defined(__cplusplus) extern "C" { #endif int init_global_variables(void); const char *get_outfile_namei(int i); const char **get_outfile_name(void); int dump_all(void); void check_global_variables(void); const char *method_string(METHOD i); int get_n_vars(void); int get_n_vgms(void); int get_n_outputs(void); int get_n_beta_set(void); int which_identifier(const char *id); const char *name_identifier(int i); void push_bound(double value); void set_method(METHOD); int is_simulation(METHOD m); METHOD get_default_method(void); METHOD get_method(void); void set_mode(void); MODE get_mode(void); double max_block_dimension(int reset); int n_variograms_set(void); int decide_on_coincide(void); int remove_id(const int id); void remove_all(void); #ifdef VARIO_H /* vario.h was included before this point: */ VARIOGRAM *get_vgm(int i); #endif #ifdef DATA_H /* data.h was included before this point: */ DATA **get_gstat_data(void); DATA *get_dataval(void); DATA *get_data_area(void); DATA *create_data_area(void); DPOINT *get_block_p(void); void setup_valdata_X(DATA *d); #endif #if defined(__cplusplus) } #endif extern int gl_nblockdiscr, gl_seed, gl_n_uk, gl_cressie, gl_zero_est, gl_fit, gl_iter, gl_xvalid, gl_gauss, gl_sym_ev, gl_jgraph, gl_blas, gl_order, gl_n_intervals, gl_gls_residuals, gl_asym_vgm, gl_numbers, gl_nsim, gl_lhs, gl_longlat, gl_n_marginals, gl_sparse, gl_rp, gl_coincide, gl_nocheck, gl_spiral, gl_secure, gl_split, gl_register_pairs, gl_sim_beta, gl_rowwise, gl_choleski; extern double gl_rho, gl_idp, gl_cutoff, gl_iwidth, gl_zmap, gl_quantile, gl_fit_limit, gl_fraction, gl_alpha, gl_beta, gl_tol_hor, gl_tol_ver, *gl_bounds, *gl_marginal_values, gl_zero, gl_zero2; extern const char *method_code[]; #endif /* GLVARS_H */ gstat/src/defs.h0000644000176200001440000000072313777370515013276 0ustar liggesusers/* * provides some definitions */ #ifndef DEFS_H #define DEFS_H /* avoid multiple inclusion */ #include /* but assertions are off, by default */ #define CDECL /* empty */ /* * several buffer sizes */ #define MAX_DATA 1250 /* not a maximum, but an increment step size */ #define INIT_N_VGMM 2 /* * (for glvars.c:) something, not bigger than 127 * because of user interface (crazy though) */ #define ERROR_BUFFER_SIZE 1280 #endif /* DEFS_H */ gstat/src/select.c0000644000176200001440000001636614127264064013630 0ustar liggesusers/* * select.c: neighborhood selection for local prediction */ #include #include /* qsort() */ #include /* memcpy() */ #include /* sqrt(), fabs() */ #include "defs.h" void Rprintf(const char *,...); #include "userio.h" #include "data.h" #include "utils.h" #include "debug.h" #include "vario.h" #include "defaults.h" #include "glvars.h" #include "nsearch.h" #include "select.h" static int octant_select(DATA *d, DPOINT *where); static int which_octant(DPOINT *where, DPOINT *p, int mode); int CDECL dist_cmp(const DPOINT **ap, const DPOINT **bp); static void print_selection(DATA *d, DPOINT *where); /* beware-of-side-effect macro: don't call with ++/--'s */ #define DPSWAP(a,b) { if (a != b) { tmp = a; a = b; b = tmp; }} static int select_qtree(DATA *d, DPOINT *where) { if (d->n_list <= 0 || d->id < 0 || d->sel_max == 0) return (d->n_sel = 0); /* * global neighbourhood? */ if (IS_GLOBAL(d) || where == NULL) { d->sel = d->list; d->n_sel = d->n_sel_max = d->n_list; if (DEBUG_SEL) { print_selection(d, where); } return d->n_sel; } /* set up or resize selection list, d->sel */ if (d->sel == NULL || d->sel == d->list) { /* first time or after forced global selection: */ d->sel = (DPOINT **) emalloc(d->n_list * sizeof(DPOINT *)); d->n_sel_max = d->n_list; } else if (d->n_list > d->n_sel_max) { /* no, something has changed... */ d->n_sel_max += MAX(MAX_DATA, d->n_list - d->n_sel_max); d->sel = (DPOINT **) erealloc(d->sel, d->n_sel_max * sizeof(DPOINT *)); } if (d->id > 0) { /* 2nd, 3d,..., n_vars-th variable */ if (gl_coincide == DEF_coincide) gl_coincide = decide_on_coincide(); /* establish first ... */ if (gl_coincide) { int i; DATA **data = get_gstat_data(); d->n_sel = data[0]->n_sel; for (i = 0; i < d->n_sel; i++) /* copy previous selection: */ d->sel[i] = d->list[GET_INDEX(data[0]->sel[i])]; if (DEBUG_SEL) print_selection(d, where); return d->n_sel; /* and we're done!! */ } } /* * So far, no selection has been done. * Let's see if today's job is easily done: */ memcpy(d->sel, d->list, d->n_list * sizeof(DPOINT *)); if (d->sel_rad >= DBL_MAX && d->sel_max >= d->n_list && d->oct_max == 0) { d->n_sel = d->n_list; if (DEBUG_SEL) print_selection(d, where); return d->n_sel; } /* * now we're sure that (a) sel_rad is set, or (b) sel_max < n_list, * or (c) oct_max is set, so let's do the smart thing: */ qtree_select(where, d); return -1; /* more work to do */ } int select_at(DATA *d, DPOINT *where) { /* * fill the array d->sel appropriatly given x,y,z,d->sel_min,d->sel_max * and d->sel_rad: possibly by corresponding semivariance value * first select all points within a distance d->sel_rad from where * then select at max the d->sel_max nearest and return no selection * if there are less then d->sel_min * if "FORCE", then select ALWAYS the d->sel_min nearest points. * * corrected variogram distance feb. 16th 1993 * changed search to normalizing to (0,0,0) first, aug 1993 */ if (d->what_is_u == U_UNKNOWN) d->what_is_u = U_ISDIST; /* we're going to fill this right now */ else if (d->what_is_u != U_ISDIST) ErrMsg(ER_IMPOSVAL, "select_at() needs distances"); if (select_qtree(d,where) != -1) return d->n_sel; /* * so, now we're at the stage where one of the following conditions holds: * (a) we selected all points within d->sel_rad * (b) we selected (at least) the nearest d->sel_max * (c) we selected (forced) at least d->sel_min, possibly beyond d->sel_rad * Now, should we select further, sorting on distance? * */ if (d->vdist) { /* use variogram distance as sort criterium */ int i; for (i = 0; i < d->n_sel; i++) d->sel[i]->u.dist2 = get_semivariance(get_vgm(LTI(d->id,d->id)), where->x - d->sel[i]->x, where->y - d->sel[i]->y, where->z - d->sel[i]->z); } if (d->oct_max) { /* do octant selection */ d->oct_filled = octant_select(d, where); /* sorts, adjusts n_sel and destroys distance order, so only */ if (get_method() == SPREAD) /* then we've got to re-order them */ qsort(d->sel, (size_t) d->n_sel, sizeof(DPOINT *), (int CDECL (*)(const void *,const void *)) dist_cmp); } if (d->vdist) { qsort(d->sel, (size_t) d->n_sel, sizeof(DPOINT *), (int CDECL (*)(const void *, const void *)) dist_cmp); /* pick d->sel_[max|min] nearest: */ if (d->sel_min && d->n_sel == d->sel_min && d->sel[d->n_sel]->u.dist2 > d->sel_rad) /* we forced: */ d->n_sel = d->sel_min; if (d->n_sel > d->sel_max) d->n_sel = d->sel_max; } if (DEBUG_SEL) print_selection(d, where); return d->n_sel; } static int octant_select(DATA *d, DPOINT *where) { /* * selects the d->oct_max nearest points per octant/quadrant/secant, * using euclidian or variogram distance */ int i, j, noct = 1, n, start = 0, end = 0, n_notempty = 0; DPOINT **sel, *tmp; if (d->mode & Z_BIT_SET) noct = 8; else if (d->mode & Y_BIT_SET) noct = 4; else noct = 2; sel = d->sel; for (i = 0; i < noct; i++) { /* for each octant: */ /* start == end: */ for (j = start; j < d->n_sel; j++) { /* for the remaining of sel: */ if (which_octant(where, sel[j], d->mode) == i) { DPSWAP(sel[end], sel[j]); end++; /* j >= end */ } } n = end - start; /* # of pts in octant i */ if (n > 0) n_notempty++; /* Yahoo, another non-empty octant! */ if (n > d->oct_max) { /* to get the closest n: sort sel from start to end: */ qsort(sel + start, (size_t) n, sizeof(DPOINT *), (int CDECL (*)(const void *, const void *)) dist_cmp); /* swap the remaining ones to the end of sel and forget about'm: */ for (j = start + d->oct_max; j < end; j++) { d->n_sel--; DPSWAP(sel[j], sel[d->n_sel]); } /* accept the first d->oct_max: */ start += d->oct_max; /* proceed with the next octant: */ end = start; } else /* accept all n: */ start = end; } if (end != d->n_sel) { Rprintf("end: %d, n_sel: %d\n", end, d->n_sel); ErrMsg(ER_IMPOSVAL, "octant_select(): remaining points"); } return n_notempty; /* # non-empty octants */ } static int which_octant(DPOINT *where, DPOINT *p, int mode) { /* * it's pretty hard to get this right for perfectly alligned 3D data: * in case of omax=1 and only one point at exactly equal distances * in each of the 6 directions, not all 6 are taken. * For 2D (omax=1, 4 points) this works, however. */ double dx, dy, dz; int x = 0, y = 0, z = 0; dx = p->x - where->x; /* < 0 : p in west half */ dy = p->y - where->y; /* < 0 : p in south half */ dz = p->z - where->z; /* < 0 : p in lower half */ if (mode & Z_BIT_SET) z = (dz < 0); if (mode & Y_BIT_SET) { x = (dy < 0 ? dx > 0 : dx >= 0); y = (dx < 0 ? dy >= 0 : dy > 0); } else x = (where->x < p->x); return (x | (y << 1) | (z << 2)); } int CDECL dist_cmp(const DPOINT **pa, const DPOINT **pb) { /* ANSI qsort() conformant dist_cmp */ if ( (*pa)->u.dist2 < (*pb)->u.dist2 ) return -1; if ( (*pa)->u.dist2 > (*pb)->u.dist2 ) return 1; return 0; } static void print_selection(DATA *d, DPOINT *where) { /* Add this statement to filter out * empty selections if (!d->n_sel) return; */ if (where) { printlog("selection at "); logprint_point(where, d); } else printlog("(NULL selection location)"); print_data_selection(d); } gstat/src/vario_fn.h0000644000176200001440000000305713777370515014163 0ustar liggesusers/* unit basic variogram models */ double fn_nugget(double h, double *r); double fn_linear(double h, double *r); double fn_circular(double h, double *r); double fn_spherical(double h, double *r); double fn_bessel(double h, double *r); double fn_gaussian(double h, double *r); double fn_exclass(double h, double *r); double fn_matern(double h, double *r); double fn_matern2(double h, double *r); double fn_exponential(double h, double *r); double fn_pentaspherical(double h, double *r); double fn_periodic(double h, double *r); double fn_wave(double h, double *r); double fn_hole(double h, double *r); double fn_logarithmic(double h, double *r); double fn_power(double h, double *r); double fn_spline(double h, double *r); double fn_legendre(double h, double *r); double fn_intercept(double h, double *r); /* the following functions are not all defined */ double da_is_zero(double h, double *r); /* NUG, INT */ double da_fn_linear(double h, double *r); double da_fn_circular(double h, double *r); double da_fn_spherical(double h, double *r); double da_fn_bessel(double h, double *r); double da_fn_gaussian(double h, double *r); double da_fn_exponential(double h, double *r); double da_fn_pentaspherical(double h, double *r); double da_fn_periodic(double h, double *r); double da_fn_wave(double h, double *r); double da_fn_hole(double h, double *r); double da_fn_logarithmic(double h, double *r); double da_fn_power(double h, double *r); /* unit derivative-to-range of basic variogram models */ double da_fn_exponential(double h, double *r); double da_fn_nugget(double h, double *r); gstat/vignettes/0000755000176200001440000000000014413507474013415 5ustar liggesusersgstat/vignettes/spatio-temporal-kriging.bib0000644000176200001440000003163513777370515020661 0ustar liggesusers% Encoding: windows-1252 @Article{bakar2015, author = {Bakar, Khandoker Shuvo and Sahu, Sujit K}, title = {{spTimer}: Spatio-Temporal Bayesian Modelling Using {R}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {15}, pages = {1--32}, url = {http://dx.doi.org/10.18637/jss.v063.i15} } @Manual{Beygelzimer2013, Title = {{FNN}: Fast Nearest Neighbor Search Algorithms and Applications}, Author = {Alina Beygelzimer and Sham Kakadet and John Langford and Sunil Arya and David Mount and Shengqiao Li}, Note = {R package version 1.1}, Year = {2013}, Url = {https://CRAN.R-project.org/package=FNN} } @Article{Bilonick1988, Title = {Monthly hydrogen ion deposition maps for the northeastern {U.S.} from {J}uly 1982 to {S}eptember 1984}, Author = {Richard A. Bilonick}, Journal = {Atmospheric Environment (1967) }, Year = {1988}, Number = {9}, Pages = {1909 - 1924}, Volume = {22}, ISSN = {0004-6981}, Keywords = {\{NCA\} Precipitation Quality Network}, Url = {http://www.sciencedirect.com/science/article/pii/0004698188900807} } @Article{biondi, Title = {Space-time kriging extension of precipitation variability at 12 km spacing from tree-ring chronologies and its implications for drought analysis }, Author = {Biondi, F.}, Journal = {Hydrology and Earth System Sciences Discussussions}, Year = {2013}, Pages = {4301-4335}, Volume = { 10 }, Url = {http://dx.doi.org/10.5194/hessd-10-4301-2013} } @Book{Cressie2011, Title = {Statistics for spatio-temporal data}, Author = {Cressie, Noel and Wikle, Christopher K}, Publisher = {Wiley}, Year = {2011} } @Article{DeCesare2001, Title = {Estimating and modeling space-time correlation structures}, Author = {L. {De Cesare} and D.E Myers and D Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {9--14}, Volume = {51}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00131-0}, ISSN = {0167-7152}, Keywords = {Space–time correlation}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{DeIaco2001, Title = {Space-time analysis using a general product-sum model}, Author = {De Iaco, S. and D.E. Myers and D. Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {21--28}, Volume = {52}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00200-5}, ISSN = {0167-7152}, Keywords = {Space–time random fields}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{finley2015, author = {Finley, Andrew O and Banerjee, Sudipto and Gelfand, Alan E}, title = {{spBayes} for Large Univariate and Multivariate Point-Referenced Spatio-Temporal Data Models}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {13}, url = {http://dx.doi.org/10.18637/jss.v063.i13} } @Article{Gasch2015, author = {Caley K. Gasch and Tomislav Hengl and Benedikt Gr{\"a}ler and Hanna Meyer and Troy S. Magney and David J. Brown}, title = {Spatio-temporal interpolation of soil water, temperature, and electrical conductivity in {3D} + {T}: The {C}ook Agronomy Farm data set}, journal = {Spatial Statistics}, year = {2015}, volume = {14, Part A}, pages = {70 - 90}, issn = {2211-6753}, keywords = {Digital soil mapping}, url = {http://www.sciencedirect.com/science/article/pii/S2211675315000251} } @Article{hu, Title = {Spatio-temporal Transmission and Environmental Determinants of Schistosomiasis Japonica in Anhui Province, China}, Author = {Yi Hu and Rui Li and Robert Bergquist and Henry Lynn and Fenghua Gao and Qizhi Wang and Shiqing Zhang and Liqian Sun and Zhijie Zhang and Qingwu Jiang}, Journal = {PLoS Neglected Tropical Diseases}, Year = {2015}, Number = {2}, Volume = {9}, Url = {http://dx.doi.org/10.1371/journal.pntd.0003470} } @Article{Kilibarda2014, Title = {Spatio-temporal interpolation of daily temperatures for global land areas at 1 km resolution}, Author = {Kilibarda, Milan and Hengl, Tomislav and Heuvelink, Gerard B. M. and Gr{\"a}ler, Benedikt and Pebesma, Edzer and Per\v{c}ec Tadi{\'c}, Melita and Bajat, Branislav}, Journal = {Journal of Geophysical Research: Atmospheres}, Year = {2014}, Number = {5}, Pages = {2294--2313}, Volume = {119}, ISSN = {2169-8996}, Keywords = {spatio-temporal kriging, spatio-temporal interpolation, daily air temperature, MODIS LST}, Url = {http://dx.doi.org/10.1002/2013JD020803} } @Article{kj99, Title = {Geostatistical Space-Time Models: A Review}, Author = {Kyriakidis, Phaedon C. and Journel, Andr\'{e} G.}, Journal = {Mathematical Geology}, Year = {1999}, Number = {6}, Pages = {651--684}, Volume = {31}, Url = {http://dx.doi.org/10.1023/A:1007528426688}, Publisher = {Kluwer Academic Publishers-Plenum Publishers} } @Article{lindgren2015, author = {Lindgren, Finn and Rue, H{\aa}vard}, title = {Bayesian spatial modelling with {R-INLA}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {19}, publisher = {University of Bath}, url = {http://dx.doi.org/10.18637/jss.v063.i19} } @Article{marek, Title = {Using geovisual analytics in {G}oogle {E}arth to understand disease distribution: a case study of campylobacteriosis in the {C}zech {R}epublic (2008--2012)}, Author = {Luk\'{a}\u{s} Marek and Pavel Tu\u{c}ek and V\'{i}t P\'{a}szto}, Journal = {International Journal of Health Geographics}, Year = {2015}, Number = {7}, Pages = {1--13}, Volume = {14}, Url = {http://www.ij-healthgeographics.com/content/14/1/7} } @Article{Nash2014, Title = {On Best Practice Optimization Methods in {R}}, Author = {John C. Nash}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {2}, Pages = {1--14}, Volume = {60}, Url = {http://www.jstatsoft.org/v60/i02} } @Article{optim, Title = {Numerical Optimization in {R}: {B}eyond optim}, Author = {Ravi Varadhan}, Journal = {Journal of Statistical Software}, Year = {2014}, Month = {9}, Number = {1}, Pages = {1--3}, Volume = {60}, Url = {http://dx.doi.org/10.18637/jss.v060.i01} } @Article{pe1, Title = {Mapping Sea Bird Densities over the {N}orth {S}ea: Spatially Aggregated Estimates and Temporal Changes}, Author = { Edzer J. Pebesma and Richard N.M. Duin and Peter A. Burrough}, Journal = {Environmetrics}, Year = { 2005 }, Number = {6}, Pages = {573--587}, Volume = {16}, Url = {http://dx.doi.org/10.1002/env.723} } @InCollection{pe2, Title = {Spatio-temporal mapping of sea floor sediment pollution in the {N}orth {S}ea}, Author = {Edzer J. Pebesma and Richard N.M. Duin}, Booktitle = {Fifth European Conference on Geostatistics for Environmental Applications, GeoENV2004}, Publisher = {Springer}, Year = {2005}, Editor = { Philip Renard and Roland Froidevaux }, Pages = { 367--378 }, Url = {http://dx.doi.org/10.1007/3-540-26535-X_31} } @Article{Pebesma2004, Title = {Multivariable geostatistics in {S}: the gstat package}, Author = {Edzer J. Pebesma}, Journal = {Computers \& Geosciences}, Year = {2004}, Pages = {683--691}, Volume = {30}, Owner = {b_grae02}, Timestamp = {2013.04.17}, Url = {http://dx.doi.org/10.1016/j.cageo.2004.03.012} } @Article{Pebesma2012, Title = {{spacetime}: Spatio-Temporal Data in {R}}, Author = {Edzer Pebesma}, Journal = {Journal of Statistical Software}, Year = {2012}, Number = {7}, Pages = {1--30}, Volume = {51}, Url = {http://www.jstatsoft.org/v51/i07/} } @Manual{RCoreTeam2014, Title = {R: A Language and Environment for Statistical Computing}, Address = {Vienna, Austria}, Author = {{R Core Team}}, Organization = {R Foundation for Statistical Computing}, Year = {2014}, Url = {http://www.R-project.org/} } @Manual{RCoreTeam2015, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {https://www.R-project.org/} } @Article{Schlather2014, Title = {Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}}, Author = {Martin Schlather and Alexander Malinowski and Peter J. Menck and Marco Oesting and Kirstin Strokorb}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {8}, Pages = {1--25}, Volume = {63}, Url = {http://www.jstatsoft.org/v63/i08} } @Article{sigrist2015, author = {Fabio Sigrist and Hans R. K\"unsch and Werner A. Stahel}, title = {{spate}: An {R} Package for Spatio-Temporal Modeling with a Stochastic Advection-Diffusion Process}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {14}, pages = {1--23}, url = {http://www.jstatsoft.org/v63/i14/} } @Article{Snepvangers2003, Title = {Soil water content interpolation using spatio-temporal kriging with external drift}, Author = {J.J.J.C Snepvangers and G.B.M Heuvelink and J.A Huisman}, Journal = {Geoderma}, Year = {2003}, Number = {3 -- 4}, Pages = {253--271}, Volume = {112}, Url = {http://dx.doi.org/10.1016/S0016-7061(02)00310-5}, ISSN = {0016-7061}, Keywords = {Geostatistics}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{yoon, author = {Seo Youn Yoon and Srinath K. Ravulaparthy and Konstadinos G. Goulias}, title = {Dynamic diurnal social taxonomy of urban environments using data from a geocoded time use activity-travel diary and point-based business establishment inventory }, journal = {Transportation Research Part A: Policy and Practice }, year = {2014}, volume = {68}, number = {0}, pages = {3 - 17}, url = {http://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/vignettes/spatio-temporal-kriging.Rnw0000644000176200001440000015665013777370515020700 0ustar liggesusers\documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue,citecolor=blue]{hyperref} \usepackage{alltt} \usepackage{amsfonts} \usepackage{enumerate} \usepackage{graphicx} \usepackage{multirow} \usepackage{natbib} %% following the RJournal.sty \usepackage{geometry} \usepackage{booktabs} \usepackage{amsmath} \RequirePackage{fancyvrb} \RequirePackage{alltt} \DefineVerbatimEnvironment{example}{Verbatim}{} \renewenvironment{example*}{\begin{alltt}}{\end{alltt}} \RequirePackage[font=small,labelfont=bf]{caption} \geometry{a4paper, textwidth=14cm, top=1cm, bottom=1cm, includehead,includefoot,centering, footskip=1.5cm} \raggedbottom \RequirePackage{setspace} \renewcommand{\abstract}[1]{% \setstretch{1}% \noindent% \small% \textbf{Abstract} #1 } \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \date{\footnotesize Mar 25, 2016} \newcommand{\code}[1]{{\footnotesize\tt #1}} \newcommand{\samp}[1]{{\tt #1}} \newcommand{\pkg}[1]{{\bf #1}} \newcommand{\CRANpkg}[1]{{\href{https://cran.r-project.org/package=#1}{\bf #1}}} \newcommand{\email}[1]{{\href{mailto:#1}{#1}}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \bibliographystyle{plainnat} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \title{Spatio-Temporal Interpolation using \pkg{gstat}} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \author{by Benedikt Gr{\"a}ler, Edzer Pebesma and Gerard Heuvelink} \graphicspath{{figures/}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \abstract{ We present new spatio-temporal geostatistical modelling and interpolation capabilities of the R package \pkg{gstat}. Various spatio-temporal covariance models have been implemented, such as the separable, product-sum, metric and sum-metric models. In a real-world application we compare spatio-temporal interpolations using these models with a purely spatial kriging approach. The target variable of the application is the daily mean $\rm{PM}_{10}$ concentration measured at rural air quality monitoring stations across Germany in 2005. R code for variogram fitting and interpolation is presented in this paper to illustrate the workflow of spatio-temporal interpolation using \pkg{gstat}. We conclude that the system works properly and that the extension of \pkg{gstat} facilitates and eases spatio-temporal geostatistical modelling and prediction for R users. } %% main text \section{Introduction}\label{sec:intro} The collection and processing of spatio-temporal data is rapidly increasing due to technological advances and the societal need for analysis of variables that vary in space and time, such as weather and air quality variables, and crop yields. Analysis of spatial and temporal correlations is useful in itself to get insight into the character and causes of variability, but they are also important to predict values at points from neighbouring observations. Spatio-temporal interpolation can potentially provide more accurate predictions than spatial interpolation because observations taken at other times can be included. In addition, spatio-temporal interpolation allows predictions to be made at single locations or entire fields in between and beyond observation times. However, adding the temporal domain implies that variability in space and time must be modelled, which is more complicated than modelling purely spatial or purely temporal variability. The spatial, temporal and spatio-temporal dependence structures, for instance represented as variograms, do not necessarily coincide with each other in terms of their parameters nor in terms of their family. In the simplest case, a spatio-temporal anisotropy parameter might be enough to deal with the different dependence structures, but this poses strong assumptions on the process. Interpolation of spatial random fields is a common task in geostatistics. Simple approaches like inverse distance weighted predictions or the well known kriging procedures have routinely been applied for many years. Nowadays, modern sensors allow to monitor different variables at an increasing temporal resolution producing rich spatio-temporal data sets. This calls as well for theory and methods to deal with these data sets to gain a better understanding of the observed spatio-temporal processes. While the theoretical aspects of spatio-temporal geostatistics show good progress \citep{Cressie2011}, implementations lack behind. This hinders a wide application of spatio-temporal modelling, as typically extensive scripting and thorough understanding is necessary to build spatio-temporal models. Handling of spatio-temporal data in R is provided by the \CRANpkg{spacetime} package \citep{Pebesma2012}. In this paper, we present an extension of the \CRANpkg{gstat} package \citep{Pebesma2004} (version 1.1-3) that reuses the \pkg{spacetime} classes for the estimation of spatio-temporal covariance/variogram models and to perform spatio-temporal interpolation. Our implementation handles various types of spatio-temporal covariance structures and facilitates spatio-temporal interpolation. The notation of functions in \pkg{gstat} are extended in a way closely following the purely spatial design. This allows a researcher acquainted with \pkg{gstat} to readily use spatio-temporal tools. The use of the newly implemented functions is presented and illustrated by mapping spatio-temporal air-quality data. Another package that offers extensive spatio-temporal geostatistical functionality is \CRANpkg{RandomFields} \citep{Schlather2014}; further packages are mentioned in the SpatioTemporal CRAN task view\footnote{\url{https://cran.r-project.org/web/views/SpatioTemporal.html}}. The paper is organised as follows. The next section introduces the general interpolation routine and describes the different spatio-temporal covariance models, followed by a section introducing the German rural background data set for 2005 and performing the parameter estimation (i.e.\ covariance model fitting). Cross-validation results are presented and discussed in the section thereafter. Conclusions are drawn in the closing section. R scripts reproducing this study are available from within the \pkg{gstat} package as demos. \code{stkrige} re-estimates the variogram models, \code{stkrige-prediction} re-executes the prediction for a time series and a couple of stations, and \code{stkrige-crossvalidation} re-runs the entire leave-one-out cross-validation (note that the latter takes a few hours). \section{Spatio-temporal dependence modelling and kriging}\label{sec:theory} In the following, we will assume a Gaussian spatio-temporal random field $Z$ defined over a spatial domain $\mathcal{S}$ and temporal domain $\mathcal{T}$. Typically, a sample $\mathbf{z} = \left(z(s_1,t_1),\dots,z(s_n,t_n)\right)$ has been observed at a set of distinct spatio-temporal locations $(s_1, t_1), \dots, (s_n,t_n) \in \mathcal{S}\times \mathcal{T} \subseteq \mathbb{R}^2 \times \mathbb{R}$ that may include repeated measurements at the same location or simultaneous measurements at multiple spatial locations. Often, one is interested in modelling $Z$ from the sample $\mathbf{z}$ in order to predict at unobserved locations in space and time or simulate from the conditional distribution. Across our domain of interest $\mathcal{S} \times \mathcal{T}$, we assume the random field $Z$ to be stationary and spatially isotropic. Hence, the field can be characterised through a mean $\mu$ and a covariance function $C_{\rm st}$ where the spatio-temporal covariance only depends on the separating distances across space $h \in \mathbb{R}_{\geq 0}$ and time $u \in \mathbb{R}_{\geq 0}$. Note that extensions beyond this set-up can easily be derived as has been done for the pure spatial case using for instance universal kriging to overcome the stationarity of the mean. The general spatio-temporal covariance function is given by $C_{\rm st}(h,u) = {\rm Cov}\left(Z(s,t), Z(\tilde{s},\tilde{t})\right)$ for a separating spatial distance $h$ and temporal distance $u$ and any pair of points $(s,t), (\tilde{s},\tilde{t}) \in \mathcal{S}\times\mathcal{T}$ with $||s-\tilde{s}||=h$ and $|t-\tilde{t}|=u$. In general, this covariance function is hard to estimate but a couple of models using simplifying assumptions will be presented in the following together with their spatio-temporal variograms $\gamma_{\rm st}(h,u) = C_{\rm st}(0,0)-C_{\rm st}(h,u)$ and encoding in \pkg{gstat}. Given a valid covariance function, the covariance matrices used in the linear predictor are easily obtained and the same algebraic operations as in the well known spatial case yield predictions of the desired random field \citep{Cressie2011}. A major difference is, however, the computational complexity of the matrix inversion. Typically, observations are made at a rather high temporal frequency leading to a number of spatio-temporal locations that is too large for global kriging. Hence, interpolation based on a selected neighbourhood of a subset of all data points becomes beneficial. Additionally, this relaxes the assumption of stationarity, as smooth variations in the mean value across the domain can be respected. The related class of dynamic models also addresses the computational complexity resulting in a temporal Markov structure. Implementations can be found in \CRANpkg{spTimer} by \citet{bakar2015}, \CRANpkg{spBayes} by \citet{finley2015}, \CRANpkg{spate} by \citet{sigrist2015} or \pkg{INLA} by \citet{lindgren2015}. \subsection{Covariance models} The covariance models implemented in \pkg{gstat} and presented in this paper are introduced in the following. Besides further extensions we focus on the basic classes of the \emph{separable}, \emph{product-sum}, \emph{metric} and \emph{sum-metric} spatio-temporal covariance functions. The building blocks (in the following denoted as \code{spatialVgm}, \code{temporalVgm} or \code{jointVgm}) of the spatio-temporal covariance functions are any of the purely spatial variogram models already available in \pkg{gstat}. Each one of the building blocks is created by a call of the function \code{gstat::vgm()}. Remaining arguments such as \code{sill} (the joint sill), \code{nug} (the joint nugget component) or \code{stAni} (the spatio-temporal anisotropy used in the \code{jointVgm}) are scalars and refer to parameters of the entire spatio-temporal covariance function: \begin{enumerate}[a)] \item The \dfn{separable covariance model} assumes that the spatio-temporal covariance function can be represented as the product of a spatial and temporal term: $$C_{\rm sep}(h,u)=C_{\rm s}(h)C_t(u)$$ Its variogram is given by (see Appendix for details): $$\gamma_{\rm sep}(h,u) = {\rm sill} \cdot \left( \bar{\gamma}_s(h)+\bar{\gamma}_t(u)-\bar{\gamma}_s(h)\bar{\gamma}_t(u) \right)$$ where $\bar{\gamma}_s$ and $\bar{\gamma}_t$ are standardised spatial and temporal variograms with separate nugget effects and (joint) sill of 1. The overall sill parameter is denoted by "sill". The R package \pkg{gstat} encodes this model as: \code{vgmST("separable", space = spatialVgm, time = temporalVgm, sill = sill)} The separable model has a strong computational advantage in the setting where each spatial location has an observation at each temporal instance (a \code{"STFDF"} without \samp{NA}s, \cite{Pebesma2012}). In these cases, the covariance matrix (and its inverse) can be composed using the Kronecker-product of the purely spatial and purely temporal covariance matrices (respectively their inverse). \item The above model extends to the \dfn{product-sum covariance model} that we give here in a slightly different notation as \citet{DeCesare2001} and \citet{DeIaco2001} by $$C_{\rm ps}(h,u)=k C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)$$ with $k > 0$. The corresponding variogram can be written as $$\gamma_{\rm ps}(h,u) = \left(k \cdot {\rm sill}_{\rm t} + 1\right) \gamma_{\rm s}(h) + \left(k \cdot {\rm sill}_{\rm s} + 1\right) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u)$$ where ${\gamma}_{\rm s}$ and $\gamma_{\rm t}$ are spatial and temporal variograms (see Appendix for details). The parameter $k$ needs to be positive and the following identity defines the overall sill (${\rm sill}_{\rm st}$) of the model in terms of the model's spatial and temporal sills: $${\rm sill}_{\rm st} = k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t}$$ The above equation can also be used to estimate $k$ based on the three sill values. An alternative formulation of the product-sum variogram can be found in \citet{DeIaco2001}. The \pkg{gstat} definition of this model reads: \begin{example*} vgmST("productSum", space = spatialVgm, time = temporalVgm, k = k) \end{example*} \item Assuming identical spatial and temporal covariance functions except for spatio-temporal anisotropy, allows to use a spatio-temporal \dfn{metric covariance model} where, after matching space and time by an anisotropy correction $\kappa$ (\code{stAni}), the spatial, temporal and spatio-temporal distances are treated equally resulting in a single covariance model $C_{\rm joint}$: $$C_{\rm m}(h,u)=C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The variogram evaluates to $$ \gamma_{\rm m} (h,u) = \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right) $$ where $\gamma_{\rm joint}$ (\code{jointVgm}) is any known variogram that may include a nugget effect. The following line generates the model in \pkg{gstat}: \begin{example*} vgmST("metric", joint = jointVgm, stAni = stAni) \end{example*} The spatio-temporal anisotropy parameter $\kappa$ (\code{stAni}) is given as spatial unit per temporal unit. In many cases, this will be in m/second, as these are the base units in our implementation. All temporal distances are hence internally re-scaled to an equivalent spatial distance using \code{stAni} and treated as metric 3D-space. \item A combination of spatial, temporal and a metric model including an anisotropy parameter $\kappa$ is found in \citet{Bilonick1988} and revisited by \citet{Snepvangers2003} as the \dfn{sum-metric covariance model}: $$C_{\rm sm}(h,u)=C_{\rm s}(h)+C_{\rm t}(u)+C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ This model allows for spatial, temporal and joint nugget effects. Thus, the variogram is given by $$ \gamma_{\rm sm}(h,u)= \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ where $\gamma_{\rm s}$, $\gamma_{\rm t}$ and $\gamma_{\rm joint}$ are spatial, temporal and joint variograms with separate nugget-effects. This model can be defined in \pkg{gstat} through: \begin{example*} vgmST("sumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, stAni = stAni) \end{example*} \item A simplified version of the above model is to restrict the spatial, temporal and joint variograms to nugget free models. Additionally, a single spatio-temporal nugget is introduced and the variogram takes the representation: $$\gamma_{\rm ssm}(h,u) = {\rm nug}\cdot {\bf1}_{h>0 \vee u>0} + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The \dfn{simple sum-metric covariance model} can be obtained by: \begin{example*} vgmST("simpleSumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, nugget = nug, stAni = stAni) \end{example*} \end{enumerate} \noindent Note that the above mentioned spatial, temporal and joint components of the spatio-temporal covariance and variogram models need not necessarily exhibit the same structure. Taking for instance the product-sum and sum-metric models that both contain single temporal and spatial variogram models: the best fits of the respective spatio-temporal models might suggest different variogram families and parameters for the pure spatial and temporal ones. This is due to the target of finding the best overall variogram surface resulting in (potentially) different marginal models. \subsection{Parameter estimation} Fitting routines for the above variogram models are implemented in \pkg{gstat} through the function \code{fit.StVariogram()}, which calls \code{optim()} from the R core package \pkg{stats}. Additional parameters to improve the numerical optimisation can be provided to \code{fit.StVariogram()} and will be passed on to \code{optim()} (using R's three-dots mechanism). As some of the parameters are limited to certain ranges (nuggets need to be non-negative, ranges must be positive), it is advised to use an optimisation routine that allows to impose limits on the search space (i.e.\ \code{L-BFGS-B}) and provide sensible limits via \code{lower} and \code{upper}. By default, the method \code{L-BFGS-B} is called and the smallest lower and largest upper bounds supported by the model are given. The estimation of the spatio-temporal variogram models relies on a sample variogram empirically derived from the data. In contrast to the spatial variogram line, the spatio-temporal variogram is represented by a surface for lag classes composed of a spatial and temporal separation distance. Different from the spatial case, a spatio-temporal sample variogram contains lag-classes of zero spatial separation describing pure temporal dependencies. Without duplicate observations, no estimates can be made for the lag-class with both zero spatial and zero temporal separation. The sample variogram is calculated through the function \code{variogram()} that dispatches the call for spatio-temporal data objects (of class \code{"STFDF"}, \code{"STSDF"}, or \code{"STIDF"}) from \pkg{spacetime}. For a visual judgement of the fit between sample and fitted variograms the \code{plot()} function can be called to show the variogram surfaces next to each other as coloured level plots. Alternatively, a wireframe plot is obtained by setting the parameter \code{wireframe = TRUE} (Figure~\ref{fig:allVgmsWireframe}). A further option is to plot the differences between the sample and model variogram surfaces by setting \code{diff = TRUE}, see Figure~\ref{fig:allVgmsDiffWireframe}. Additionally to visual comparison, \code{fit.StVariogram()} provides the output of \code{optim} as attribute \code{optim.out} of the returned S3-class \code{"StVariogram"}. This attribute includes valuable information to diagnose the success of the \code{optim} routine. It contains for instance the convergence code (\code{\$convergence}) or message (\code{\$message}) and the optimised value (\code{\$value}), which is the mean of the (weighted) squared deviations between sample and fitted variogram surface. Furthermore, it is advised to check the estimated parameters against the parameter boundaries and starting values. Additionally, starting values might also influence the success and result of the optimisation, as local optima may occur due to the interdependence of the parameters. Alternatively, the user might want to start a grid search in order to better asses the sensitivity of the estimates. The fitting approach is identical for all covariance models. However, with the flexibility of the model also the number of parameters increases, making a numerical estimation at times cumbersome. Starting values can in most cases be read from the sample variogram. Parameters of the spatial and temporal variograms can be assessed from the spatio-temporal surface fixing the counterpart at 0. The overall spatio-temporal sill including the nugget can be deducted from the plateau that a nicely behaving sample variogram reaches for 'large' spatial and temporal distances. An important issue is the potentially different orders of magnitude of the parameters. It is at times advisable to rescale spatial and temporal distances to ranges similar to the ones of sills and nuggets using the parameter \code{parscale}. \code{parscale} needs to be provided via \code{control = list(parscale=\dots)} and holds a vector of the same length as the number of parameters to be optimised (see the documentation of \code{optim} for further details). \begin{table} \center \caption{List of implemented weighting schemes for variogram optimisation. Methods 3, 4, and 5 are kept for compatibility reasons with the purely spatial \code{fit.variogram} function. The following notation is used: $N_j$ number of pairs, $h_j$ mean spatial distance and $u_j$ mean temporal distance for each bin $j$, $\gamma$ the actual proposed variogram model and \code{stAni} a spatio-temporal anisotropy scaling.}\label{tab:weighting} {\small \begin{tabular}{ll} \toprule \code{fit.method} & weights \\ \midrule 0 & no fitting\\ 1 and 3 & $N_j$ \\ 2 and 4 & $N_j/\gamma\left(h_j, u_j\right)^2$ \\ 5 & reserved for REML \\ 6 & 1, no weighting\\ 7 & $N_j/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 8 & $N_j/h_j^2$ \\ 9 & $N_j/u_j^2$ \\ 10 & $1/\gamma\left(h_j,u_j\right)^2$ \\ 11 & $1/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 12 & $1/h_j^2$ \\ 13 & $1/u_j^2$ \\ \bottomrule \end{tabular}} \end{table} Currently, the implemented fitting routines are based on the (weighted) mean squared difference between model and sample variogram surfaces. By default, all values are associated the same weight (\code{fit.method = 6}), but other options are available that allow for different weighting schemes based on the number of pairs, spatial, temporal and spatio-temporal distances or the variogram's value. Table~\ref{tab:weighting} lists all currently implemented options. Depending on the target neighbourhood size of the desired interpolation, it might be beneficial to narrow down the spatial and temporal distances and to introduce a cutoff. This ensures that the model is fitted to the differences over space and time actually used in the interpolation, and reduces the risk of overfitting the variogram model to large distances not used for prediction. Please note that methods 2 and 10 (Table~\ref{tab:weighting}) involve weights based on the fitted variogram that might lead to bad convergence properties of the parameter estimates. Furthermore, the scalar \code{stAni} in methods 7 and 11 will either be the actual fitted spatio-temporal anisotropy if it is included in the model or a fixed value that has to be passed as \code{stAni} by the user to \code{fit.StVariogram}. The latter is advised, as the former might lead to bad convergence properties as in the case of weights based on the fitted variogram mentioned above. As the estimation of an anisotropy scaling might be cumbersome on a visual basis, we provide the function \code{estiStAni} that provides estimates based on the empirical spatio-temporal variogram. Four heuristics are available based on (i) rescaling a linear model (\code{linear}), (ii) estimating equal ranges (\code{range}), (iii) rescaling a pure spatial variogram (\code{vgm}) or (iv) estimating a complete spatio-temporal metric variogram model and returning its spatio-temporal anisotropy parameter (\code{metric}). The choice of the weighting scheme will influence the selected model and different weightings might be further assessed in a cross-validation of the selected model. To increase numerical stability, it is advisable to use weights that do not change with the current model fit. \subsection{Kriging} Standard kriging (\code{krigeST}) and trans Gaussian kriging (\code{krigeSTTg}) have been implemented. As spatio-temporal kriging based on the complete data set might be too computationally expensive, local kriging is an attractive alternative. This poses the question of how to select the "nearest" neighbours from the spatio-temporal space $\mathcal{S}\times\mathcal{T}$. A natural choice would be to select the spatio-temporal locations exhibiting the strongest correlation to the unobserved location. Depending on the spatio-temporal covariance model, the relation between spatial and temporal distance in determining the strength of correlation will vary. As a proxy, we use a spatio-temporal anisotropy parameter that relates spatial and temporal distances in the same manner as in the metric covariance models. The k-nearest neighbours within this metric spatio-temporal space $\mathcal{S}\times\mathcal{T}$ are selected using the R package \CRANpkg{FNN} \citep{Beygelzimer2013}. The interpolation performs iteratively for each spatio-temporal prediction location with a local subset of the data set. Without neighbourhood selection, kriging uses all data. As the metric induced by the spatial and rescaled temporal distances are only proxies to the strength of correlation between locations (see Figure~\ref{fig:vgmVsDist}), we provide an option to search a larger metric neighbourhood. Within this larger neighbourhood, the covariance function is evaluated for all spatio-temporal locations and the neighbouring locations with the largest covariance values are then selected for prediction. However, this approach might still suffer from a clustering of locations and alternatives such as a staged search (find spatial neighbours first and select a set of temporal instances for each spatial neighbour) or an octant search (select neighbours per spatial quadrant from preceding and following time stamps separately) could be considered. However, these alternatives are not yet available in \pkg{gstat}. \begin{figure} \centering \includegraphics[width=0.9\textwidth]{vgmVsMetricDist.png} \caption{A contourplot showing how the spatio-temporal sum-metric variogram model (as estimated in the application below) and a metric distance relate to each other. Distances are rescaled by 1/5 for easy plotting.}\label{fig:vgmVsDist} \end{figure} \section{Application and illustration}\label{sec:data} The data set used is taken from AirBase\footnote{\href{http://www.eea.europa.eu/data-and-maps/data/airbase-the-european-air-quality-database-6}{AirBase - The European air quality database}}, the air quality data base for Europe provided by the European Environmental Agency (EEA). We focus on a single air quality indicator, particulate matter with a diameter less than 10~$\mu\rm m$, measured at rural background stations for 2005 (${\rm PM}_{10}$). The data base contains data for many years. Besides rural, also urban areas are monitored and not only at background locations (e.g.\ traffic stations). However, these processes are considered to be of a different nature and should be treated separately. As a use case, we therefore limit our data set to the rural background stations in Germany. Figure \ref{fig:dailyMeans} shows for 8 randomly chosen days daily mean values of ${\rm PM}_{10}$ concentrations for the entire monitoring network over Germany in 2005 with 69 rural background stations. \begin{figure} \centering \includegraphics[width=0.95\textwidth]{daily_means_PM10.png} \caption{Daily mean $\rm{PM}_{10}$ concentration $[\mu\rm{g/m}^3]$ at 8 randomly selected days in 2005.}\label{fig:dailyMeans} \end{figure} In order to fit a spatio-temporal model to the air quality data set, the empirical variogram surface is computed and used as input for the fitting routines of the different models. The empirical variogram is based on spatio-temporal bins that span regularly over space and time. Regular measurements over time (i.e.\ hourly, daily) motivate regular binning intervals of the same temporal resolution. Nevertheless, flexible binning boundaries can be passed for spatial and temporal dimensions. This allows for instance to use smaller bins at small distances and larger ones for large distances. Temporal boundaries, instead of lags, are required when the sampling of the data is non-regular. In cases where regular temporal observations can be assumed, this is utilised in the sample variogram calculations and any two temporal consecutive observations are assumed to have the same temporal distance. Figure~\ref{fig:allVgmsWireframe} shows the empirical variogram along with the proposed best fitting model of each spatio-temporal variogram family as perspective wireframe plots. In order to better identify structural shortcomings of the selected model, a difference plot (Figure~\ref{fig:allVgmsDiffWireframe}) is a helpful visual diagnostic plot. Beyond the selection of the spatio-temporal variogram family, each component of this model can be chosen from any implemented one-dimensional variogram. In Table~\ref{tab:vgmFits} a selection of fitted models in terms of their residuals compared to the sample variogram surface are shown. The best fitting spatio-temporal model of each family is given as: \begin{enumerate}[a)] \item separable model (weighted MSE: 6.82): \nopagebreak \begin{tabular}{l|rlrlrr} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & sp.-temp. sill \\ \midrule space & 0.86 & Exp & 558 & \hspace{-2\tabcolsep}~km & 0.14 & \multirow{2}{*}{124} \\ time & 1.00 & Sph & 5.6 & \hspace{-2\tabcolsep}~days & 0.00 & \\ \bottomrule \end{tabular} obtained via: \begin{example*} separableModel <- vgmST("separable", space = vgm(0.9, "Exp", 200, 0.1), time = vgm(0.9, "Sph", 3.5, 0.1), sill = 124) fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(100, 1, 10, 1, 100)), lower = c(10, 0, 0.1, 0, 0.1), upper = c(2000, 1, 12, 1, 200)) \end{example*} \item product-sum model (weighted MSE: 6.91) \nopagebreak \begin{tabular}{l|rlrlrc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & k\\ \midrule space & 6.8 & Exp & 542 & \hspace{-2\tabcolsep}~km & 1.2 & \multirow{2}{*}{1.61} \\ time & 8.7 & Sph & 5.5 & \hspace{-2\tabcolsep}~days & 0.0 & \\ \bottomrule \end{tabular} obtained via \begin{example*} prodSumModel <- vgmST("productSum", space = vgm(10, "Exp", 200, 1), time = vgm(10, "Sph", 2, 1), k=2) fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 0.1, 1, 10)), lower = rep(0.0001, 7)) \end{example*} \item metric model (weighted MSE: 10.05) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule joint & 123.4 & ${\rm Mat}_{\kappa=0.6}$ & 453 & \hspace{-2\tabcolsep}~km & 17.4 & 189 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa = 0.6), stAni = 60) fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(10, 20, 5, 10)), lower = c(80, 50, 5, 50), upper = c(200, 1500, 60, 300)) \end{example*} \item\label{bestfit} sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & 0 & & \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & 0 & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 7.3 & 185 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 100, 1, 1, 0.5, 1, 1, 100, 1, 100), maxit=10000), lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st = 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1000, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5000, nugget.st = 20, anis = 500)) \end{example*} \item simple sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrlc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & \multicolumn{2}{c}{anisotropy} & sp.-temp. nugget \\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & & & \multirow{3}{*}{$\Bigg\}$ 7.3} \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 185 & \hspace{-2\tabcolsep}~km/day & \\ \bottomrule \end{tabular} obtained via \begin{example*} simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120, "Sph", 150), time =vgm(120, "Exp", 10), joint=vgm(120, "Sph", 150), nugget = 10, stAni = 150) fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 1, 100, 1, 10)) lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget = 0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000#, nugget = 100, anis = 1000)) \end{example*} \end{enumerate} The variogram parameters are numerically optimised using the function \code{fit.StVariogram} and the \code{L-BFGS-B} routine of \code{optim}. The parameter \code{fit.method} that controls the weighing of the residuals between empirical and model surface of \code{fit.StVariogram} is set to \code{7} (the spatio-temporal analog to the commonly used spatial weighting). A full list of all weighting schemes is presented in Table~\ref{tab:weighting}. In our application, the residuals are multiplied by the number of pairs in the corresponding spatio-temporal bin divided by the metric distance: $N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)$. The spatio-temporal anisotropy is estimated beforehand and fixed at 118~km/day. This weighting scheme puts higher confidence in lags filled with many pairs of spatio-temporal locations, but respects to some degree the need of an accurate model for short distances, as these short distances are the main source of information in the prediction step. Note, that different weighting schemes will in general result in different model parameters generating different interpolation values. Our selection is based on the assumption that well filled bins provide more reliable empirical variogram estimates and the fact that short distances are the most important ones for a local interpolation. \begin{table}[t!] \centering \caption{Weighted MSE (\code{fit.method = 7, see Table~\ref{tab:weighting}}) for different spatio-temporal variogram families and different choices for the one-dimensional variogram components. Columns denote the spatial and temporal variogram choices. The metric model is only applicable if both domains use the same family.}\label{tab:vgmFits} \begin{tabular}{ll|rrrrr} \toprule model & joint & Exp+Exp & Exp+Sph & Sph+Exp & Sph+Sph & ${\rm Mat}_{\kappa=0.6}$ \\ \midrule {separable} & $~~\cdot$ & 9.87 & \bf{6.82} & 10.42 & 7.50 & $\cdot~~$ \\ {product-sum} & $~~\cdot$ & 10.09 & \bf{6.91} & 10.64 & 7.59 & $\cdot~~$ \\ {metric} & $~~\cdot$ & 10.25 & $\cdot~~$ & $\cdot~~$ & 10.59 & \bf{10.05} \\ \multirow{2}{*}{sum-metric} & Exp & 4.10 & 3.60 & 3.89 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.73 & \bf{3.31} & 3.36 & $\cdot~~$ \\ \multirow{2}{*}{simple sum-metric}& Exp & 4.10 & 3.60 & 3.94 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.98 & \bf{3.31} & 3.56 & $\cdot~~$ \\ \bottomrule \end{tabular} \end{table} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsWireframe.png} \caption{Sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsWireframe} \end{figure} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsDiffWireframe.png} \caption{Differences between the sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsDiffWireframe} \end{figure} \begin{figure}[b!] \centering \includegraphics[width=0.95\textwidth]{pred_daily_means_PM10.png} \caption{Spatio-temporal interpolation of daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest 50 neighbouring spatio-temporal locations. The crosses indicate sampling locations. The cell size of the grid in UTM projection is $10~\rm{km}\times10~\rm{km}$.}\label{fig:pred_daily} \end{figure} For comparison with classical approaches, we interpolate across Germany iteratively for each single day using all available data for variogram estimation. The purely spatial empirical variogram can directly be obtained from the empirical spatio-temporal variogram, by fixing the temporal lag at 0 separation. From the same set of variogram models as investigated for the spatio-temporal models, the exponential model (partial sill:~66.5, range:~224~km, nugget:~13.5) is the best suited based on the optimisation criterion. Alternatively, we could have fitted the spatial variogram for each day separately using observations from that day only. However, given the small number of observation stations, this produced unstable variograms for several days and we decided to use the single spatial variogram derived from all spatio-temporal locations treating time slices as uncorrelated copies of the spatial random field. Once the best fitting spatio-temporal variogram model is identified, the interpolation can be executed with the help of the function \code{krigeST}. We use the sum-metric model that obtained the smallest RMSE (compare Table~\ref{tab:vgmFits}) to produce a gridded prediction. The interpolation domain consists of daily values for a regular grid spanning over Germany in UTM projection. The cell size is $10~\rm{km}\times10~\rm{km}$. Figure~\ref{fig:pred_daily} shows the interpolated grid for the same days as Figure~\ref{fig:dailyMeans} alongside with all sampling locations. Additionally, maps depicting the differences from a leave-one-out cross-validation are presented in Figure~\ref{fig:diffs_daily}. A time series view is presented in Figure~\ref{fig:timeseries} showing the observed and predicted time series at a single location along with its 95~\% prediction intervals. An animation of the entire year of daily mean ${\rm PM}_{10}$ prediction maps can be viewed online.\footnote{\url{http://gstat.r-forge.r-project.org/STpred.html}}. The interpolated maps are generated for a set of time stamps \code{tIDs} and a grid over Germany \code{DE\_pred} by \begin{example*} krigeST(PM10~1, data = DE_RB_2005[ , tIDS], newdata = DE_pred, fitSumMetricModel, nmax = 50, stAni = fitMetricModel$stAni/24/3600) \end{example*} \begin{figure}[t!] \centering \includegraphics[width=0.95\textwidth]{diffs_daily_means_PM10.png} \caption{Differences of spatio-temporal predictions and observed daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest (approx. strongest correlated) 50 neighbouring spatio-temporal locations.}\label{fig:diffs_daily} \end{figure} \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{singleStationTimeSeries.png} \caption{Subset of the time series of observed and predicted ${\rm PM}_{10}$ at a single station in Lower Saxony along with its 95~\% prediction intervals.}\label{fig:timeseries} \end{figure} To further compare the different approaches, a leave-one-out cross-validation was carried out. The spatio-temporal interpolations are done for the closest 50 and 10 neighbours assessing the impact of the neighbourhood size. Inspection of the ranges of the variograms in the temporal domain, suggests that any station more than at most 6 days apart does not meaningfully contribute. Furthermore, the local estimation allows the spatio-temporal random field to have a varying mean value over space and time. The purely spatial interpolation can be considered as the extreme temporally local case, where only observations from the same time instance are considered. \begin{table} \caption{Leave-one-out cross-validation results. The column wMSE refers to the optimised value from the variogram estimation.}\label{tab:cv} \centering \begin{tabular}{lrr|rrrr} \toprule covariance model & wMSE & neigh. & RMSE & MAE & ME & COR \\ \midrule pure Spatial & & 10 & 6.15 & 4.09 & -0.01 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 10 & 6.08 & 4.04 & -0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 10 & 6.08& 4.04& -0.01 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 10 & 6.11 & 4.07 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.16 & 4.08 & -0.06 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.14 & 4.08 & -0.02 & 0.84 \\ \midrule pure Spatial & & 50 & 6.10 & 4.07 & 0.00 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 50 & 6.05 & 4.04 & 0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 50 & 6.05 & 4.04 & 0.00 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 50 & 6.07 & 4.08 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.09 & -0.01 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.08 & -0.02 & 0.84 \\ \bottomrule \end{tabular} \end{table} \section{Results and discussion}\label{sec:resultsDiscuss} In terms of added value of spatio-temporal kriging measured in cross-validation results, Table~\ref{tab:cv} shows hardly any benefit in the illustrative example. This effect can to a large degree already be explained from the spatio-temporal variograms: a temporal lag of one or a few days leads already to a large variability compared to spatial distances of few hundred kilometres, implying that the temporal correlation is too weak to considerably improve the overall prediction. Nevertheless, investigating a process with a higher temporal frequency will likely show a stronger correlation in the temporal domain. Looking into station-wise cross-validation statistics (not shown), the four stations with an RMSE of 10 and larger correspond to the locations with the largest annual mean concentrations ($>22~\mu{\rm g}/{\rm m}^3$). The added value of spatio-temporal kriging lies in the flexibility of the model. We are now in the position to not only interpolate at unobserved locations in space, but also at unobserved time instances. This makes spatio-temporal kriging a suitable tool to fill gaps in time series not only based on the time series solely, but also including some of its spatial neighbours. A very irregular sampled data set would as well largely benefit from a spatio-temporal approach, as spatially close but unobserved locations in one time slice are not of any help in a purely spatial approach, but the spatio-temporal model would benefit from the observed value nearby at another time instance. In a completely regular data set, the distance to a spatio-temporal neighbour is at least as large as the pure spatial distance and hence the correlation is weaker. Furthermore, being able to capture the covariance structure over space and time might foster a better understanding of the process under study. While we see spatio-temporal modelling being a powerful tool, the cross-validation results in Table~\ref{tab:cv} show that spatio-temporal kriging will not solve the problem of all poorly spatially captured phenomena. Further preprocessing steps might be necessary to improve the modelling of this $\rm{PM}_{10}$ data set such as for instance a temporal AR-model followed by spatio-temporal residual kriging or using further covariates in a preceding (linear) modelling step. Providing the best possible model of $\rm{PM}_{10}$ concentrations across Germany was beyond the scope of this paper. The selection of a spatio-temporal covariance model should not only be made based on the (weighted) mean squared difference between the empirical and model variogram surfaces (presented in Table~\ref{tab:vgmFits}), but also on conceptional choices and visual (Figure~\ref{fig:allVgmsWireframe}) judgement of the fits. Even though the function \code{fit.StVariogram} provides optimisation routines to fit different spatio-temporal variogram models, the numerical routines in the background may struggle to find the optimal parameters. Besides the lower and upper boundaries of the parameter space, the control parameter \code{parscale} of the \code{optim} function is a valuable option to improve the convergence of the optimisation. With passing \code{parscale} as entry of the list \code{control} a vector of scalars must be passed that controls the different levels of magnitude of the variogram parameters. In most applications, a change of 1 in the sills will have a stronger influence on the variogram surface than a change of 1 in the ranges. The problem becomes more difficult with an increasing number of parameters. In our application, using the simple sum-metric model as starting values for the full sum-metric model improved the convergence speed of the more complex model. In the presented application, the sum-metric models turns out to be the same as the simple sum-metric model. While this might at first sight be due to using the simpler model to generate starting values, different non simplified starting models converged to the same result. Generally, it is important to keep in mind the strong interaction of the model parameters. It is typically not easy to distinguish how much of the spatio-temporal nugget and sill is attributed to spatial, temporal or joint components. In this paper we considered a joint numerical approach, but step-wise approaches where the components are estimated separately could as well be considered. The interested reader is also referred to \cite{Nash2014}. However, all optimisation approaches follow the premise that the studied process can be approximated with the given model and available data. If this premise fails, no optimal model can be selected. An extension towards a restricted maximum likelihood method (REML) to fit the spatio-temporal variogram model would be desirable, as it overcomes some of the above mentioned drawbacks of the method of moments based approaches and would additionally provide standard errors for the parameter estimates. A REML approach would allow to take into account that sample variogram values are correlated. However, for large datasets (as in the spatio-temporal case), it is computationally more feasible to use a least squares fitting. To reduce the correlation of the variogram values, some randomisation could be implemented in large data sets, to calculate the sample variogram based on partially overlapping or even disjoint sets of observations. The selected anisotropy as proxy to the relation of spatial and temporal distance in determining the strongest correlated neighbours might show a distortion for some models when only few neighbours are used towards the true set of the most correlated locations. However, this effect vanishes as soon as the spatio-temporal range of the model is sufficiently represented through the set of nearest neighbours. As mentioned by \cite{kj99}, an alternative to space-time kriging might be co-kriging. However, this is only feasible if the number of time replicates is (very) small, as the number of cross variograms to be modelled equals the number of {\em pairs} of time replicates. Also, co-kriging can only interpolate for these time slices, and not inbetween or beyond them. It does however provide prediction error covariances, which can help assessing the significance of estimated {\em change} parameters \citep{pe1,pe2}. Several of the space-time variograms presented here may be approximated by sets of direct variograms and cross-variograms. Fitting variogram models to sample space-time variograms is in our implementation done by \code{stats::optim}. Our example script uses method \code{L-BFGS-B} and provides upper and lower parameter boundaries, e.g.\ to make sure sill parameters do not become negative. There has been a lot of research in optimization since the methods in \code{optim}, some of which has been reported in the special issue of the Journal of Statistical Software \citep{optim}, and we do see potential to improve the options in this respect. The approximate selection of the most correlated neighbours solves the lack of a natural notion of a joint distance across space and time. However, other sampling properties might introduce a bias in the prediction. The prediction at an unobserved location with a cluster of observations at one side will be biased towards this cluster and neglect the locations towards the other directions. Similar as the quadrant search in the pure spatial case an octant wise search strategy for the local neighbourhood would solve this limitation. A simpler stepwise approach to define an $n$-dimensional neighbourhood might already be sufficient in which at first $n_s$ spatial neighbours and then from each spatial neighbour $n_t$ time instances are selected, such that $n_s \cdot n_t \approx n$. The presented example considers stationary random fields that are isotropic in space. Further extensions towards more sophisticated variogram estimations allowing also for spatial geometric anisotropy are desirable. One could for instance plot variogram maps for spatial separation in North and South direction for each temporal lag. However, the current implementation does not allow to use the anisotropy parameter \code{anis} of the pure spatial variogram definition. Nevertheless, a preliminary rescaling of coordinates would be a possible workaround. This route has for instance been taken by \citet{Gasch2015} performing 3D+T kriging . The soil profiles in their study show a clear difference in horizontal and vertical variography. To correct for this, the depth dimension of the data has been rescaled to correspond with the dimensions of the horizontal distances before hand. In the subsequent study, these pseudo 3D coordinates have been used to fit the spatio-temporal variograms and perform kriging. The code in model definitions is meant to be kept both flexible and simple. This is based on i) re-producing the notion of the geostatistical models in the R code and in ii) reusing existing definitions and functions of the pure spatial cases that have been available for many years in \pkg{gstat}. The data handling benefits to a large degree from the implementations in the \pkg{spacetime} R package. \section{Conclusions}\label{sec:conclusions} The spatio-temporal extensions to \pkg{gstat} allow to model a set of spatio-temporal covariance functions. The implemented functionality eases estimation, visualisation and understanding of spatio-temporal covariance functions. The extension and reuse of already available function structures and nomenclature facilitates an easy translation of spatial workflows to handle spatio-temporal data. The numerical estimation of the variogram parameters might be tricky and needs a large degree of the users attention. It is advised to carefully check the outcome of the \code{optim} routine after optimisation. Spatio-temporal kriging predictions can be made in a global and a local neighbourhood set-up, while the latter will be the preferred solution for most spatio-temporal data sets and common computer hardware configurations. Spatio-temporal covariance structures carry valuable information, but a spatio-temporal model is not guaranteed to outperform pure spatial predictions. The benefit in terms of prediction quality of spatio-temporal kriging becomes only apparent if sufficiently strong correlated locations are added with the temporal dimension (i.e.\, if the model permits strong correlation across time). Nevertheless, the spatio-temporal covariance model might be of interest in itself. Besides some publications where the authors of this paper were involved in, such as \cite{Kilibarda2014}, the software presented here has proven useful in several independent publications, examples of which are \citep{marek, biondi, hu, yoon}. \section{Acknowledgements} This research has partly been funded by the German Research Foundation (DFG) under project number PE 1632/4-1. We thank two anonymous reviewers for their valuable comments. \bibliography{spatio-temporal-kriging} \pagebreak \address{Benedikt Gr{\"a}ler\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{ben.graeler@uni-muenster.de} \address{Edzer Pebesma\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{edzer.pebesma@uni-muenster.de} \address{Gerard Heuvelink\\ Department of Environmental Sciences, Wageningen University\\ PO Box 47, 6700AA, Wageningen\\ The Netherlands}\\ \email{gerard.heuvelink@wur.nl} \section{Appendix} \subsection{Derivation of the separable covariance and variogram identities}\label{sec:derivSep} The separable covariance and variogram identity is readily available through \begin{align*} C_{\rm sep}(h,u) &= C_{\rm s}(h)C_{\rm t}(u) = sill \cdot \bar{c}_s(h)\bar{c}_t(u) \\ \gamma_{\rm sep}(h,u) &= C_{\rm sep}(0,0) - C_{\rm sep}(h,u) \\ &= sill \left(1- \bar{c}_s(h) \cdot \bar{c}_t(u) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h)\right)\left(1-\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h) -\bar{\gamma}_t(u) + \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(\bar{\gamma}_s(h) + \bar{\gamma}_t(u) - \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \end{align*} where $\bar{c}$ and $\bar{\gamma}$ are normalised correlation and correlogram functions respectively. \subsection{Derivation of the product-sum covariance and variogram identities}\label{sec:derivPs} The product-sum covariance and variogram identity is readily available through: \begin{align*} C_{\rm ps}(h,u) = & \ k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u) \\ \gamma_{\rm ps}(h,u) = & \ C_{\rm ps}(0,0) - C_{\rm ps}(h,u) \\ = & \ k \cdot C_{\rm s}(0)C_{\rm t}(0) + C_{\rm s}(0) + C_{\rm t}(0) \\ & - \left(k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right)\left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right)\right] - \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right) - \left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} - {\rm sill}_{\rm s} \cdot \gamma_{\rm t}(u) - {\rm sill}_{\rm t} \cdot \gamma_{\rm s}(h) + \gamma_{\rm s}(h) \gamma_{\rm t}(u) \right] \\ & - {\rm sill}_{\rm s} + \gamma_{\rm s}(h) - {\rm sill}_{\rm t} + \gamma_{\rm t}(u) \\ = & \ k \cdot {\rm sill}_{\rm t} \gamma_{\rm s}(h) + k \cdot {\rm sill}_{\rm s} \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) \\ = & \ (k \cdot {\rm sill}_{\rm t} + 1) \gamma_{\rm s}(h) + (k \cdot {\rm sill}_{\rm s} + 1) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) \end{align*} %%%%%%%%%% \end{document} gstat/vignettes/ifgi-logo_int.pdf0000644000176200001440000002421513777370515016650 0ustar liggesusers%PDF-1.4 % 4 0 obj << /Length 37 /Filter /FlateDecode >> stream x+2T0BC]C]\.}\C|@._I endstream endobj 3 0 obj << /Type /Page /Contents 4 0 R /Resources 2 0 R /MediaBox [0 0 240 86] /Parent 5 0 R >> endobj 1 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ifgi-logos-crop.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6 0 R /BBox [0 0 254 182] /Resources << /XObject << /Im1 7 0 R >>/ProcSet [ /PDF ] >> /Length 38 /Filter /FlateDecode >> stream x+2T0BC]#K ajj˥km  endstream endobj 6 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20080508123050+02'00') /ModDate (D:20080508123050+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 \(Web2C 7.5.6\) kpathsea version 3.5.6) >> endobj 7 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./ifgi-logos.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R13 9 0 R /R12 10 0 R /R7 11 0 R >> /Font << /R8 12 0 R /R10 13 0 R >> >> /Length 14 0 R /Filter /FlateDecode >> stream xXn7)xkD,A H$ڻlU"1G#c_v+\譅 X3of#?-*#jt(j!°){FT6:yǭtluxD=[X4כoY2ڤ ߓ1ARkEbmݾ2-Kjqu(bME< ѱKؒ`vxd_ۭYw_m޷n}5 :@Vk;|; Y\+mŒ \' EU;}P ZWtN~5$)7YͽDxUp#lȩvT#mڢ:QiO7?۶9?'vVNi)>wHv"frFh{28 7 XQv㪶%H 3˾ =}.R%`s*Q*%hnܛ;kv s'*JFU0Cfgôa`QX8ycx#&9xU ]19rp!˅BE8?^(c$G)2 QeWY5(C" #SZ5brr!(& _l =N7\e=_H JID+l#'DM#]-}OIIZMq/w9 )P<P FByfҔ_6SCF@[ar4uZXmNм hm_؉c** rlz<c|P] f:20m5ȹ D,ܓ#tNT+F^ML|uhєJt=Nt']5:t1'ܝȶo5MHAW 灃WO^eХ) PxsIj"꫿(/KBq³f"c\~Kҟ RM +iIY]zcдnL7` v"iNFaw,f톝œfgGƹ Mv@cu xCb^ U ly),x 3%E䙣M SUP ZEUj2$A `>)8!<.U5@&%Qƒ+W`.k1"A4 7&ŋ$2/+VUJɪNX؀(7A-$ endstream endobj 8 0 obj << /Producer (GPL Ghostscript SVN PRE-RELEASE 8.61) /CreationDate (D:20080508100429Z) /ModDate (D:20080508100429Z) >> endobj 9 0 obj << /Type /ExtGState /op true >> endobj 10 0 obj << /Type /ExtGState /op false >> endobj 11 0 obj << /Type /ExtGState /TR /Identity /OPM 1 /op true >> endobj 12 0 obj << /BaseFont /KRQJGX#2BDIN-Bold /FontDescriptor 15 0 R /Type /Font /FirstChar 32 /LastChar 117 /Widths [ 232 0 0 0 0 0 0 0 0 0 0 0 0 426 285 0 0 543 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 659 0 0 648 0 305 0 0 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 534 0 0 0 548 342 555 0 275 0 0 0 0 573 543 0 0 0 501 0 573] /Encoding /MacRomanEncoding /Subtype /Type1 >> endobj 13 0 obj << /BaseFont /YSWVLP#2BDIN-Regular /FontDescriptor 16 0 R /Type /Font /FirstChar 32 /LastChar 167 /Widths [ 249 0 0 0 0 0 0 0 0 0 0 0 264 426 270 0 522 522 0 0 522 522 522 0 0 0 297 0 0 0 0 0 0 611 668 0 673 600 0 650 0 282 0 0 573 816 0 0 630 0 0 588 548 683 546 0 0 0 0 0 0 0 0 0 0 526 545 490 545 530 314 543 562 253 0 536 297 879 562 530 545 0 421 496 332 562 447 724 0 447 459 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 526 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 530 0 0 0 0 562 0 0 0 0 0 0 0 556] /Encoding /MacRomanEncoding /Subtype /Type1 >> endobj 14 0 obj 1906 endobj 15 0 obj << /Type /FontDescriptor /FontName /KRQJGX#2BDIN-Bold /FontBBox [ 0 -197 608 720] /Flags 4 /Ascent 720 /CapHeight 720 /Descent -197 /ItalicAngle 0 /StemV 91 /MissingWidth 1000 /CharSet (/D/G/I/L/a/e/f/g/hyphen/i/n/o/one/period/s/space/u) /FontFile3 17 0 R >> endobj 16 0 obj << /Type /FontDescriptor /FontName /YSWVLP#2BDIN-Regular /FontBBox [ 0 -226 794 719] /Flags 4 /Ascent 719 /CapHeight 719 /Descent -226 /ItalicAngle 0 /StemV 119 /MissingWidth 1000 /CharSet (/A/B/D/E/G/I/L/M/P/S/T/U/V/a/adieresis/b/c/colon/comma/d/e/f/five/four/g/germandbls/h/hyphen/i/k/l/m/n/o/odieresis/one/p/period/r/s/six/space/t/u/udieresis/v/w/y/z/zero) /FontFile3 18 0 R >> endobj 17 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1282 >> stream x= PTU ܫ^cݥ0- %N!XwXTtMǍD?A4fISTPވS i&`ҙ|]:8uWfsf͙1MAaJ9Õ̓f3Bg&K'3Os|1{}aS. ц yzQkh)?;3Ck(FZD[~Ūmyfz6˒eg>+l2 /̈,c~ F ^`%d."$$NV(7%ђ8r f2}E1ņwSmWJ}龎ۨa} y)^}ج?)Rh2=tT% 8]oȍPaƩig5/bP`TC9m -asL cuGLGaζi-{<XWf [.ƊhjGZxY 0"+A>s7h5}Yۣ6XŁJC UT籯YVlm;g4m)پ+'_s>.rO*(b,;&xzi*Wj`(ٝ/SExGbCt+HƒG`epX R=:ϵ8Q^f  iSJK}u" }(tc BG3[N:N \5by^:xnvP"wE9]=VJ{E_'3Y)ssQ U|Cm@gڢ9;ʹ|LI][BH'%K.\uKn}rQ'{QY7T=YVvrmy&2\gm e9mlk8W=h[s) +`%9yժ/ck܄0\{~o> stream xVyTT0=ƥyS .ɱ5D("Ae}`AM@$h6 "[E@A E n%jIR7i@.==yo~] 26Btw+Yq8[II.æRlj||٥pmO##'z%a)V X& ˰tNLHd!!52%!4561!42*125&rg2>6,%4%cߣAM nkv'F$E\#f}jwφ8ߝ~ll+-|j%%uY(yh'Z6#gZ -@ ?d~&  7-G H9 3$G,4A3Q!ZJCh6ꐘIH %mFKvH.iB<'_Ȏʺe-L\`=fafpV [ml`pӧ5G k9xILV}1'o=}pΘpI3 هnE.;W#j$Rc KRc ^|2q)܏?=UXs l7Zsdrzkϖv+>\[j B (tjH';eS\D|*]Z_}K&Sm|zf>t| Wé2Uq ̝+˔r1kD RB(]!7adn45PD C<;3i;:wH/N. rN s=::55.;Ԫ揮^ܛjR}Jg JgûbٝR]WՅ+T5ɭpn/n9y(--wxQ: >i̷Su%ׄ/ ܟzؖ܅[Kkj [ب6wV+Nf<d͘=(Mv{a ~@J(I1גWRT[z<>[ʃ9k-5Ug޸/9ɛLJXL/>ddg؆4|߳m05E|â3u j-4OxH7@ʨ63xzP:(܂+4+_mE B}  BhջO q4EMI .O\/{oTžZt!?I]Cg`Mٌ.|ts.x6F -էw> YTT˒ŋifq㶿]sOvT3\שM\_[_|@b*aBPP4Ի) ph a6XnN>]aN-=V }T!W ^+?PGw'_D$l Wc5.o n?Љ\[{Cc[y~5>(3?&Z)9(dZ7r.H| ࡺ֎^|Zd 6%\w.,r"|I/A43 K32CucoL+WRer⣫+7a?<q|{Ͷ#.ͣ Mܝ ov UKccG̼B I6?aYnΪEq8{oc<;K˵Wނx$ڮm>bW)~{km:+Z8 _V9lΜCkQ9+vg)7 zO0ӸE͛E#0r$GjR+HxʬB>Ie_,!:\ΤB(|K<x1Av޼ b>%s_a/a LmcL((7Q6k 5L3p!ca?Ue~~N)tf!*MW}N"t;X2-6G;)dKߡlk⫸S};3~{P5P@ :;ɫؤSv qӏ7qDf@6Gir4gFR?}#}խc:tOcz4M87pm~9*$pTL?hkI0 gPlfHA ':h~i$a5CU?XJ!9 M#gcR[qqT˾Pߵǻ u5?_Oep_J^-NE,> /ProcSet [ /PDF ] >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [3 0 R] >> endobj 19 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 20 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20080508123111+02'00') /ModDate (D:20080508123111+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 21 0000000000 65535 f 0000000234 00000 n 0000009362 00000 n 0000000131 00000 n 0000000015 00000 n 0000009427 00000 n 0000000544 00000 n 0000000816 00000 n 0000003058 00000 n 0000003191 00000 n 0000003238 00000 n 0000003287 00000 n 0000003356 00000 n 0000003731 00000 n 0000004275 00000 n 0000004296 00000 n 0000004571 00000 n 0000004968 00000 n 0000006341 00000 n 0000009484 00000 n 0000009534 00000 n trailer << /Size 21 /Root 19 0 R /Info 20 0 R /ID [ ] >> startxref 9805 %%EOF gstat/vignettes/figures/0000755000176200001440000000000013777370515015067 5ustar liggesusersgstat/vignettes/figures/allVgmsDiffWireframe.png0000644000176200001440000010776313777370515021653 0ustar liggesusersPNG  IHDRFZo.PLTE.3:<ORXfkt}3.3R3s:::f:\s\ffff$+3::::f:::::::\R:f:s:::::AHPW^eff:f3f\.ffff:ffffffsffffffmt{3::::f\ffff.:ېsېů̐ \ff::f۶sې寶̶"&+04ۀ.ې:ې۶f۶ې۶9>BLPUY^cglquz|sne`R[RMfD@;s2-$ې۶  C`) pHYs&? IDATx콍IzU{朜92bDL%b$$$,$FeaH .$127Nlx ,pYޥGwUS]v=~]  ڷQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!B  *0 AT$` H(APQ"AEF!TQAB*e%j(Rpa]~S`KF!MB4- h[ 70ڹ^߹ϴW{o4VWG}j}hqK\(}5}2/=zqK\(Ŕ8J%'`sĊ@o.AڋntFuĊ/Vb/UW[(/jK?P(17_o[,D-WMZTm~] 29緖_}1 +&OWiG"YmOӳaaMҭCqiy o1'-ƥىcTu1GtA41jKy<  i/J4~fxŨ8ySKNLFjFvC4Jpcs~7x5eSo-DRDm1*:99XŜLνKkƯc?4~fLMn=1 K^ z7|o-DRD1*pO_X0:Mޤ{BF9M4~fxt_NLF[c-_WJ | ޸2;Q[&M? 6MazksI)c/׻:F6[#o,/]7)O  3aF=Ge[o\Za5y':H]Qq Fb zd5Kk F݌5r"raT4y DKIF0"Ќ]'F;Jz)MK]yj6atzKn`4[.ʎ!q01[rBMob,J[۽tot62|oT<߂{9#+ 5cFӱQr-㕘F4DKn6RojF+z_0Hup 0 Yj3b#y(,ٶDMwԦɋ+Yt8~HFߚF2;QyIk$r0?@&0r~d+x3"m&nڌ'U*'cZbgӯn,$)hc?-'QolRf'jQVmnm31Q|[RJ ٭ 0 Yj3UOLR0<:>69J<5_oY~ŲL}WCḺʵfW~Fy~l,>TgCț r%7caQ+`tS4_X1phF7Ձm=4 Tw`,`tS8ށіC?MuxF[j:F!ZH1JV (C~S`KF!MB4- h[ 7;,` o*`o)T(D#RpQF~S`KF!MB4- h[ 70 o*`o)T(D#Rp_a]~S`KF!MB4- h[ 70 o*`o)T(D#RpQF~S`KF!MB4-J0 [ 70 o*`o)T(D#RpQF~S`KF!MB4- h[ 70 o*`o)T(D#Rpa]~S`KF!MB4- h[ 70 o*`o)T(D#Rp(01 Eu*o)T}χY[ 7U9F߾`+Rl-T,RpaG盫!}su:[n  orNzbUgmbMEQ޲GP`KJ"q\iMrێdZֺ~SlvgξCzvf˶:kMu 0z#&-Ζ 9a[_U:P STuovV]EM*1zηG6(ʂMu8s1PtB=VBbo֥D;$TG?7k.*us嶭d0 եPrT{6ܧ2iz>0j5&~o|mk\^By\uƟ[btsa>,=8Vc:Fӯ;hKpon~JݛΫ7 7F=ݖoV熜=_TWU-uS•~R%~GkJJw{ >ku!vPVNJ>wٖzo3R+3)mUpze*e.qwwU輍%U`.;Nu+ΪsiW[2YP>j!E}Uԍ%f˞R7UnQ 7 >걭r'@>a*P:iK7Q]37[u ?և~9GhhfNA؟UN{?0gWVi3:hg`4gOᢶis?naػMe?͈emؿNjY4n?0ZPJKP^?0zgFm 뻕?{py -fۙpE{=[v*F#R=J(oЖ6H ~4~ b3D4yt3wBSJK։1չʼ os8oi홳hɟQw=Lea +MQ,ܗufĵ] vDX~ܱ-Fm ;u/b(귗cw#F"1we8ULct%o 'D *u0 ^A]^tO B TfuXeh˟ѩw**NVPSkTV+:@F/נb5˦)״m4~`yWWkz\`IEhUmϊQ`Q-~R7ݟ0zHnϊѥrcU8ܟ1zPolnAtB6=@F)J)F5nK3iwD&=@F[Gf=҃ؿ;xQ2PߊhoHpGz9ke$ooAvdaYۣhgǨ\B"jK?O4aj;̴*4~`T|Xa(kBz@QY U~]Az@Q##)[푑C&V!}?߄h͞Oܺ]1*pusBۦ{QF5ƃT;Ro=RO @z`i \m&Ymn+B`T%v{~ qt])-FNH70-O?0~tޗXyяu6}H5Um'蛫U|%|3|(AMG8(ᄃC_~obtiqzR|~̇||?*MɍCqr(`4ྯ_~o8Zo_s;߬-ݏzFCK DJp}sŻ4oFtw.ڞ[{qw߱M쯺z5~Fmu;@?E%VI@2<qt~FSQm2ust'?ݩohFU%boF1݋ [ȇGOjvu ֋90F}-=1[yW p; FGSNM 5 oL~?F7.ky}ǬFGhh4FC-K0٢?hGڲWĨg؟Yksc(hI${7xS>:G#1*q>KRT ۯYHFͮ{.7.dchnuK({:_@_}`,ϊ`t a4=F5({b (U粟 FuF%}|tbbR/c+h$GOdU7cT=:&qustf!x5L9͇hwߙ~O!Ǩ8j<]9z&aWt-thzou;s3GFGw#4~`4eW"1٠] dR&a;scTa9zD'Mږ7{BR1єI$ƨщ+E?c1/QMݢeMhooSF]8*at䨻r EbpKfx:[n+&v-7]=-0pTǨLQ>'9z٥}?Hk11::MS :ECw/~sB}z*F S1ʧ=7=Oѷ/G0:sĨ}l{{+ޟs5\4;_ш6xMhۻ)F'1:qTǨeǙjNz' Z)JBs}JE0a?0Qtt~I$QO3UR_ν")-Nm\Me0#G'Y۞|D1р'hO?`sߟ9*5m{ a9n0t2"¢0*qTƨ@㆐Ǩ x)#G%zMA_8δ I$ۈQQ>f=aTh~Mg$F4~cE]0⨜0L g=mѮ0zïj-c6"х쑁oGY[äצwυ\%W]w^4: b4_"1=`trL@Tfڜ=afEwq솷$눘zctype OĨQ6sT,6hJ0pT Lz{z-J} G9FW *%+(7iL!]q߂QEڕ3@&4HZ8>-9Zbzy 2*؞}>Qѵ+eOdW6< ]`0=>^h?YR) Ś8:bT(ǪQmR dbt1?$-t]b(oIQGY6$IF 9,թm[[Q'VlSIG]ct(cT(zr"kRÍ@F8rGw ^胍8 FoيQ1#T6 *8`t4noٓ n[_bT츊9(:XuQ6QqBvt#7JM1+ǨcOdt-/9jQUMMFlVj0*qMwBmm~~~> n -?sQ+{&GUrz0*8N~dkQPGijQ8*.;&F?5W1+Ei#F6K4FU>9:|ճvTt:F]h~F+G%JH=y(I[jQSL,Q N *h}h\翌oatQv߅Qt38F#b98Qy^c%Vu4Q~ |tsmF%NJ]0:p0:pT28F#bJ0mN ]{9Tt}+#gQbtS`hՄF#up7F-{ݱ[1j<7Rn-&8"ߓE59[G'ۘLQ1gAڧ0$F w:15GQmrc5߳jBk FbtcS|ieQ)稽SF)3-_Y0:qtŪ<%2(: i<4G˘QGmA:>[㑈~W|](:qTsmsԅэ9 Rn/=V(ĨQ'F2!*D59 ҥsA}odtb|6uPt[hTG5V:Ү{0qF`Q'E5lQ'; FG9FI 9Q)zON )_{^e@pԇщk 8:Q 2DQW1tTp4Ч `'FK嶁r ?FUZ0 bj;)jt N{m1c00RtIQBs:ߐx{:23]0GQmC42'FPCR^3WY&G(/b*c<{1A꠺w IDAT#&^ \x;(:Ee.yu2_Rt;V։1rԎ_ѩL[0r7xNH-ǽ*kNQ*&N):a\,r$|"0ѭ8 n,Gh]#Yy!frZeèyxw Wk<Y$FׄT~Ӡ>̤pTrd:(J-U"y^CBCdcw6aTNGG:Q*L娋|ckZhCg{qpJхLF/0r}a˙`Eatd_W飨$ (at0+FUǼ5@jp"k1:_lǨOL税QE?AJN`t[@D̤徽z:QHRiH ST娺dщR_ǼA~uרʉk* PHQϤk]9EI S? rtԍϘӷ3QQEiRD?FG/.g|3,Q}ƨ EqB9S: S$ |9j))0JmD9,Q#Heگbt\\DOm[V )2FGN2HӐsYeʟQoA0 EK a}˸fY(:h(uvW kW RAQ GI-׾f22q_YP`vۨ09jb?\騙Z;cH' F:oJQ rԑSz)KGQH蓕#F- (0*e> uRt> QGO:AX3QQ_2*c7vo}`TNGsD$`tEKMGs?\SQQ Eg.ɣd 8Th^ٌP~Z6VhBA~FctgόJ ;F#`HFhwQ?FSGX E२;hӞ~W- (cA@z'NW`v۸"1m- F )G$㥨3.]| G 1*wYOLAQqύQg:ڝ8TaÙKQ* Vkh /GW~0a^ +GCɨڂFft@Ĩ?EWrgB+Sԙv~FG% U((?~*]oO}K=]FCUC̃QKl QG d陣!~j{rt_蔐$&Ehwľ=S*FGJ>v5 iEm-Q ')05Z.=vg_U8 2Q 6d+{0NOl\F)b1jpxA)iɨOc8.S F? `t W1cthV2*OH ΌсFi$e>J()0T^ޯ) rsTh|G'g#[#vߞjmOh`Qc-9̂x0st?_ pt$Qeѵc?a6Q-$X5;ϘckW70jKGg} ]Ş٦aètFoURR?FTE1?Fş RR2zb^`WD^G5j51`ZuHMɨQK: SbԸ3ẍ́4> Pf_QsӰr2 +uVo>rᲜRةѡ'z$Qh+zLGAQM- 7 F] .0o}Tҹat/gQy&`trBIQ*GU8j^I2¨F1r4 lkd4.mƿ~KzDRT(30: GBRIFokkIsd?G *èjy'%1hO /NG *`Tߖd4&ؒt Rj71*?3bQ)%LFm]eՒ(*cj {FQ. =2/;%¨9ٖ/sƤ=[ |31,*]Hj8m(0JmAfy¨xcoFr g:jbThBؒ&'蒘 vQ)X4E,HFmKZQ[:Ycm,' s@bQ F%z77(*N@2EQ#A,QQ+Gw]$$hEbTNHCѬ vFcthZIpC0 rZQaZ8Rۺat}o7@^Rm&SAiިW@h.FׄԲ, 5f:8Xh FWZTh 0~#$ N"F6Gy$$DQFg6 hWct5/oǨ `2hdKGuU9¨QGс-2 - c1%1 v~ƞZcr|2JGreuIy~1ZZQ F:1z_ W 喤qԏP8{{?C <_:Jx:7QFwbt#$Tk0Z10g1*sgE%bsԚj-1-mkIqʈwxі.cTp4x( FiJbv9*ƿPT?`hau6([͏c3%ХkGܢ8QN>Yl&GQGљ~]'"OFQmb&2GO,JOhjLQG1ju!Q]\s`tNH-騵 VQɨQm b59btx 7: >jtK 1*8`MM3HZQ)U"Y,mAI%`hF܏JGGt?G^}q:I Q`|ےX FuaYXxJGe G0FhF峨oq?Q&z(#GU(7 RFۖƨ 8僧bԝ1Fєp4QS8QQ>9E1'FaxNԱOZŢ0r4%#كt8 Eg>^RMG{ dtT({β1`Z3muby<(K6aT{8'DQX,C'Ѭ?m#f1st~Q``T([s${9.E%`ThFs@jW?k7~8 id--(J̡%sQQ¨6?`T`tMHg*dFQ#1r45(1=FG#1g?n/^QF(;GTJJ{^[(9eɗH.M69U@Nq?=縟"ħwL5 $e+< o.W0PzbFebTY"a%lZσN̍, YOR02`|䲴/ jR- z(պ(.w߁]\Ēk<G8 7& M9Fɷ-.QkcHJ9у`TvFK39z+GSQe-`|۔=X>]P"F Q=_bQr>ݷbtƿ1G#1-kuz0TZ0S&:A^,Q}4=F헰$hGw`?Ya7hLYl+*fѴb_ez #G#1:ʴNMd'ƿ~C~zIDޗRW2P (7Qmc לbaD {0jֿ@NuߏQ3ètt~DtљRg2*sT<wF# HO3Dž1`c>IO{ 4~Q1z0F=sD0uvD|{bn9ѢQ*h(S1/{7k*i~Ͼ0-隟OS\F#jQ:mucc#(a2ڼ+u@j`thF3>QijE,;HwaАDKe~>\f[(Ϣ&.ZIIdZox;9-bb4m)}Ư>2dǨ:XLa-c }x"K DbthF a}Jt4c|^(qתRo:JJ)(Ѷo_ oIo>rVXJ)}87G@u?uNGQ7~BGMhF i?ۊ4_uy*,R6h^:j?JJ 11 a1:[oFcthv^0z|:] .8=]>_s|6FOgè=%h(}oёquV_$ѿ>P30/ȹ/8P ;0j1&Dy [ӡaThèSHG{Ǩ>Hj:QK:j\5~WL`קghtu6>uȒ0ˇ0LPlY{ۉRw 9aTIH0j8DChh&F*'ƨ ʥJ$a;=5"y%S6Z (G9O:ENi!uQB^F`44~aqcn3/FY F{W6{_y{q}7ܗIR^ϷGEQ$t>}wih8*0|$27b>|c}&Oy,#rc jїfu_.)蜐~RdfwŌtHѱ洈*4o}}&c91/r$XfYHg!޹4\.ؚFL}S0z_\t_Iѱ00Q-̫k¨HHلс{}Wd2z#Y^dmicE~FMIGٯo\bړd#8 _eKH˯Z]Ok2daziڬ5q,y=4Ž}ƨ!Z#/O̖~U\)@K_y?+:[n;Ϛ{ҳ8yF Hο&dGatٯ8XWS6~S0zօ(^9:;蛫{?'&CǞ}ƴ f7qDrA6‚G΢0:$́р@ܧl~)U0wKQl.h}aUgm+G[ﲋ95:t3fB7Ɲ|Q62ݏT}ݧmA޷pU2uJR̄i7KΖۊ)muO1糠jNQˈ dԝ֎~ON^;>Bm_? [1)(JZߪ#eqlm}Y8:n*Gz#O]I iy;gn2+¨Q1Qu/Ǖ"qTæl ,O2yIN`x8zgY(#ȅn ˍQaQ?G%35BelH@Av/(ј J,}B~4$o{h[)OKB*|~u)hQ=[Chpw֑z'U]GJ vШi{J _w$P,f&Gc}rkx9Z?QiOuƱ;k Fb#+_ƨlVSa,ceFSwQOˍ$h;(QvݹP=mh~Ũ5e;NstS~8}eO(:\Ypuk986#F;Z+/CEX-#e?!Xz e'ES}Fr\BCYk IDATnN+؎[F35u1kFn?jX F'܏xYZl>Y/b=4~`ԫkOCC U"9XFERT> ը:mChEo `4V{RR0*@rbw]x[ݲvb?0ћ{7[Q(eu^eD64~]1nF=^^jݷ?%JX\Fz]Wm?K(7U[Y9s4ȎF/o_83~ےMh{]Wlȷ]&Khα8G ?u'-T&bP\Banjٽ/J1:)s,z3>=?Ql+/u](-`F{W1_ud^nGٵyX·`n)kČښKo_?[rp(JbzZwnW1ˏmIX3%:Zv!&g/(öwenN׳?^+կaAiㆶW"`u)<~ACZ~4~1z\{jPwxeڔmNeJr&Wr]ZRJ=jjc-[tٟGύQ~SEyu4oP;iq;ZdBQ]4c9O͈k(dO=s73ct0~g΍n=w[cv7b-)] d'[ߑgo(2]coU&ƞ0jz2GeDY5?y?9FkZ\ MZرɩqL_ZO.秝pZX?ʖ DdD5*%{/QS{sč/f#\YLRkoۺ&늭A#H?0/ʗARaQ5Jq C{uY(oi?ĉRJY[uݺVG3עmw?0*4O ,U ,V"J4c?|/X"#urM>J1G層GIEi3S:w?0j1N: ޕa_`u"K7C]Osu?i袷|-l؛K~A|BSB̿Sm>ԩ$XVF{gR7W쏎͇FoO֩0:L2[; \T/~>țkUmbRN~MvTUu[p yWKhQ?/QbZG]C'uk_?SFUͫoysn}7˲7AL}O ֮V@RHiܯlD5?J~]*:뿾eŤx;CI>Dj?w?oOQCjׁ-qci3~9saJ]{N_~+`SԵLbi|7kѐ|Mv1 DKJ{pg ,bϟ/)߯p`sty4.!mŸ]<$Z 5xTk,nk[FRx ~[$w_?SȢ܎jlok?PFzx<7LswƬxLv>t3Ukog_ڻ]atS?0_zͶPa^Q్|`^}`z)g}TA ]}Ȍ &W goi[F=Vl$ok~7un"mH]GL,b.Ը!c9&AiO$~۟5~`)5E`hA,--) xeu\7.M/ h~WX{c)%7pO.?HW: .¿*2-hZ&@j<]ގT"ih?ܿQcyumk^z5?`B(ih?ܿѐ̹V{{]bU*.o!~MF#,Vtm= 2z"Z4~`4iDZ->($n }Ov$op}osJOֆ!8_cb\k~ڏ[_{TߗnhƹhCkWz9?jL<'@ܒ^#ڗLBߗnhnģ93hfLB;Nir؍jXi^1nzPOF#`pKF'U%oR#qjlJoÅz`K~7X0oo]bވ'ަs-[ih$X[Wu"U w$M7:l$ƭxp(mJ-4~`4GbYu͢v{~iˊ,A w 'F _?ܶA&mnl+=oo)Thngy \{oZRܻTտ/d34OB< o*`4_oILѭ/Zxk}+QKoD~yt.սq}Fo*iXM7Wsq2#~?|&TDʂ- [~{+zymq9"C- %ԱD۵c;1F샿~[ 70J#n۵m˦{vY[ 70J7 _'buY%xOxxo)T(=([Ҽ4XO- cNbsg`KFI-jc~+2o)T(Ow_De o*`Lw|z V- MlƖ-J_ u˿[ 70J_`f- h[ 70 o*"Fnr;mVgmbMEeuZQr[X~S`t1UTu*o)TeFUgmbME%b1TgmbME4$0?wu*o)T]^~S!h[ 7(,` o*`o)TH[ 7)F1oĂ-x鼂-+SL [ 7-F$/Fw+Rp0Z:[n  o*`o)T(D#RpQF~S`KR0BvMB4- h[ 70 o#a d? nB-v#`o)`P`K[ F(/Rh7b?0 [ Fh1c__~zW~&\Bdov#`]i5>_oI?}̚Gz?Mh7Fh%~CԥV}1塣۱~n6^V0:@p/iF0@C|K~FZJiF0J/{n"~8ސ|K4 >s9>y1__> +WV38I,꫶sH3vUqwv#`\f矜6b !Ti6cc?xRGI* F-~1W(Ŵ#&`zŦ#SO_|g?O[/SX">2V]_g|%~Y9otv#`\/4mBX)'Y9^N=Di+3:IGگ`uW?^g< pn yR9ΖߊY?\F\X˔[3Fm~.FqB/^N0ڍr4`]%K|?䟆̷ܘXS6oBJ3MEcve F  i0yKt|h;Og~Vm%_0܁?iF0Jnt|+|F';gWsߔJ1N0ڍQ:d|E6zIpχWcTfRi8Mh7F)J̓+?X-f|!+ _Sg| 1dCJ3ʂ?Mh7F|ub, F(NFF|ub?0 0 QQ:B*d2[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7bVX(do)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#`o)ߍQ(_~7F|[ w#ݰQ.RpP`KnB-0 F(/RpP`KnB-0 F(/RpP`KnB-,,` F(/RpP`KnB-0 F(/RpP`KnB-0 F(/RpP`KnB-F!`KnB-Q.Fo'Uh-T,Rpb`Snѷ/> [ wLGWFBł-Q&F_? [ wL޲bcV~7ei)hێ$['ֺ>Tl 6voҳcTD.CyurM"=5FLhʞbFK&w{"Q} Rn5/DZt,Q*o OimPF1cQU%}X5 Q=Fm9SY] 211D2qTuh'ǵj.uǵZBF߾͓L;>#PE ::DECLDUhJB΂PE(/>{$0Z]y(];">+w.u/uWM(=w>!`^mF>T&`W{ NuЦbRXhRo]V=iu:Qze]=r5~ױjtZĪIB}QBLmCYm>F(6tweQU.`DᕲuGKE -ICrpm|P ;)p*0Z(0}p_:͏ҁ,`DdQLܶ -5&&D mh0j\7ڳF3vG 5oZ~l8a; b-͉ M])u*ba'qr W絋 hӿr_CeF#wT7R o[ nplG!`4f/c#yUv a0l"ys7{vvGm4jFAnn"`tmp_n)࠳vm;T`˧JC9:8ֽسQ5KHyD.`T|Ir?Wz"z0Ԩi-&{-?V`mbj= 敗Fh2)jQwwV=b Ӷh7F-jn3ٚv#`[6vUpR-Fa\i@TF]?^#'!"o^d dpwY\Dcc<G%}%lɵwd{{c?0ڍѷ/GCގ/Iq ΁>ͦ;r"|BM'-,9[a~Ӗh7:Fy#7덧%b߃ni?0ڍNewEuwtI6 ߃dؿT]Ls4AShZ(.#~h7:՝tQT*a6h'qh7bhX-[YQ{4Ψ&  Z^DcFErr&$s"`?YѬ2:jP/Fa?Y@꙽a~=QZjk?0ڍ2(#E:h~`% ޳P eﳫ24FhI!(݄όMzFh&Χ l]SW;FhaϾiNث흃i$dBO{p"0JPfGp"0J@UKDwE!ۺ?nFRTJ}#at)=v#`9< L(jfcpNFљ1rʨ7Up.7(vk?0ڍΌQBxA%y vm!6E6~`͑Z5qtT%nL|?e@$FcZ?V!kiF(}sL@c}.D./@Fr>> IDATRqͶxl7SL*Fd"N~ τ]R/oc?CF * me2ItT4H~wٸB1_9[F a2Gǘ.)6~c6oYdFXQ[_ܛh7bPXu͛9 Ga'FUa@-{˛+ Emk+h`L*l0ztnw3ctk3UF4ƅg5)Ňmn~`a_}1Uh0(c:FAJFc(0j^.aQPF߾,s D2{bwUS/ob30jh~`*Y0:ıdjJecpjt@QF/SS/Bl݇$e"vms dʑϋ=ӈ_"Rݏi}^ĞO?5@dh^0z0gިdkĨ+G0*8:GQcqDցq?QÛ5!0:tb> *t)0pt rKNm@J X1:'J+]6L vL-Dd:"Y1:pTq}jNQ6St vQc賬ѧ3E厽Mѣ@ L3W>6CF0)*sT 3{* H^ #Gg. ܣP L%6bsucThm ޫQ+EgJW1I&d=ΆXqFN]h]6hAN1OeW1k*Hуl\Gcè *G'y@_0~ULS}U,D))0z09}&ߟ ?'~v֚ )`*Gի*F+t:ZaԈ0F2~}VV )~3Fjew{+F+V}΃јb#yaT(QK2jn倻*f90깊0pw ޛGkݟ}\\FH0PTz{2jTL}1W1 Oul9$j$CFbu_8:]RRdG0*>ՙAFtt]هrKrgD_Ų1:qty(k} q`T uzqTZPG]yu^>5bŰQDG0*aTiie[|臮g_~qg`Tq({^żuO80z4R9eU(:p-pT㙣82#yFojGatpQ,QDCG0*8_fd?FDŽTd0ߢc${=WF=*槨0z4R92 F98)}v4g*9cKFhVF5g_/bGXD;s*0*QW }fF K \ctf? PTOH[,`R9aR)*s8V)*n*aT~OM~;*\+}\'ǨV(. Q F]騍گ@Z@V߰Ĩ*è+^t疀!20cT-G d=@hC { 1TO{ ʉI]8jl;EُQFMMMh:'|[VoCFr0a0:QkGN\Z7ܷQk\0*љi? ppY 3FW1/F嫘E `T*H d=@T}/ CaSMӀ~EcԖcMFԵ7 FO4tbQ.>elu>T,`t-HUj?9Oű24 OaT?֨~e(&S܇2ݮ#af=GA~QO g`8J K _)QQ蚐rLd=]K G`t)1F@vWe2Ev3fw}dV $ӹ0z}b-(YJf G}kFQ:M ٿ,he1KL Pi?0z< |gf>50jp|9*ubʧ;Oh7:=Fr1ʟZ1jR 0Գ[@3CZg{dTo-=&*n%eat|̤@d7Eu.Zp`T~i~`:FFA@.èl HN)g\8Rtu<GXd2d?0z@ efBtΝ!)*HfwިwaELc11oh}Qc4]Vy"r$@f#H8@|e3MSF5Mjbt2_uHH uanG\}PPR0@_4_@3R"y dQ+H=x8:'~}FiSBjynx%u.1>J '>.<18pF2Hn%ksWrw 3(㗱Ct6zJJcI9d)FH^޻JHq83k1 +wK1:/fĞ^s?=A]JRcTD4􀢏Ğa2B=SQG"R_2hFr0^Qʋ.l ih6}xKʺ9ib辺<hgA~.E [9j -~wIHY$EGC kBzGׄ4ꥃs*0Eѕl(Qk$ iƺO<#,Eщ g2FbD_~n e'FGW9(^U8jԍѻuF0)0 d[$'`t^ d-:+GQc"i}h=`rB:Mё @eF}e30}x&!?q,w'm 2ʢX&F#b>J7H-GCܱpch?FeL52Vx4sFr$W1~0Grb#8jaT̘0gG] n.bPֹ1Dr*Fy$3_G=ELsp2¢/brBj?LTXݏ~.bPpY,y8O7(ߛ Wfb"]Ġ2޲5,֨up41:=?2чV8 F 1#9 QǨMUZeYwp|frT_ch?:#F\}">0˒0r4uڢ9BmYue$F} =GfMHwutB}D _ HVݧst DɎy\XQ})qy9E aw?/_h0`5kd(sSm ѧ9j؟Ql2Eуl%yNDZ4Ȅe1Qb*CB'FG廯ѯW1GDŽ_*F@qD [(Dr(ɨD\n<1 W쏾3>(0z2Xc!KǨ_ ;Wl[*$O KӍm &/Q}u?VNҧPIM̩ct·JkU58x8"ci_O5PKa GACUt#}w..!MǨ<ұ'RT29}֛/v,FŸի'\{.bdԁыr+O:/Fc)@~fN٧&Gj2+B ,,}>S|[9|{QE"âv`T֍}"/Ȯ8~{Ql7FcY۔[s腹1za >H՟ MLF-]g;t%|+G9(UFO1EwS1z'*LF/*G}wJvct|.Qz;4`cc??ȇtQLGD{. 0/c?]CLMыJ LYTcT񑥨Hc6s=627&+a&_b3I%}4|`~F}ΈQIbm|#?d3FQ-ehQwȫJI?_櫯 ath&FMiP΍QX:XVȮ88:O2k, Q@vp/8l2ÇGAt*hQFێM?E iꉤa̎ ]i%f~fBjIptrY a܇(U=ctԱ(Ee樉 (k: d#ܿГo:1Jv}T'r/1XF^\98L+bBO Sl \&l RѮ܇HU@(DVѶC" }DO&FW,e>:!*)}Elv'`Wme/{r"UFP Bm/AT0džG6-AMQF~{X/Ulg/!Raԕ'Bm'Ǫ0{J׎'Qb;Dǀ_rZ5"+`["%z;ᄒ S2zs"UF[O" #w&g;`QISVud*hI3,Kk:mv}TE4[֑PVѶKmvc9rzD/_TC* ɫTѶBqjKEXm ݟ7gg|é݇HQyȋ+Bm$_mZ]p4Gq|4ڊ"J V=cVtw#.b=Ev# 5ZM7hRqomZelBQ7WL>hcAqbuaFQQ~$ EBm,}䣡 ==:Kxx>5?/[ .ۗf$AnTvo7pBBmGE81.;զ[_kI+'~iy*F;s)h7*~Ph6{Z0*BY Jah7FSwTKfZ"y;"m~-n&lsZU!=5)vdn~%nu+H1Zy1)S c>cnz v;oh8vS^LHiS4#v#`ԫkˣ1adV.a?U#EakwwL6Xy@vڟ[懲q}BVwȍdx[Z쮫?jE> `ԣw?wqMU<\ {*v`/w_?h+β>Zڟ79bC$:=Fkq+1wms51:s:}3>dgdDCʎBiﰢs1ze 9fc\r̜HDJPfX}>y כh#2Gh̜^HZd+6.F1ˏ*)n| f/(>~f% wյF̽RYŴLinI3/kϫM#8fڨ-_Yhl]6϶5t ;IDAT_uK;kd?0ڍN|2WJ7UB3xsEvmGmd?0ڍQ1b⽷SbA=jJFPh7:=F_?td5gYPc>n[(_lڛh7:3F_ً{ttUɮ;(#vScrRquɭ{0#=ng?0ڍNQ7Wߔ,̈j}͒Gb5KFѹ19%_SJ8&/;7Jl%zmi?0ڍ΍Q.i.xIJb^coK=>4fcSn2sAOEU(~4LLFsҲH`KnNq̈] |Vy<[2+~Zd}v#`Thns=}_)2m~*Տ.znrMsnJ&/2'עJ^<8D~g֏J՝$bnr97" +5*y}i*T}߫>h7b{X'(V⍊dysZz>m3tWDNү>h7FWC9O^Di2m?5F0A#އ|%%;^WMk(ĭ|_-F~]n9 'vn}EFNQEK^܈>Djmŭșh4WF&>FI#Ή-9?2  u/p@C3u,FkCo{S ۓ0cĉjrC3E-O~+|^)~&WUoj?0ڍѐ|/;a@N{9ŐF}_p5K"$%?F:5Fo<&Fqp>ﵽ, )Z{s댥߮DFF_5"`cg!dCǼvj>$ި&YYokMta/!=Hd+ȮY  HYVd "1!0w]r{f_u}NO ^KO*WQfP/. ^Sy@x?m/zo=3FW5㗷t{Yr{ c/z w?W5ga >QKs]m>rBT3kOAh [=y.=Gdv-]^߰NqBgfԨ0;&ϯ8gMo/,|-8׌5ƪvT>9v->n+OAiY8|C1[3qp>naw?t\8kOAycIv9WdM6wGY^1~j jt!쯵ēG*\_)SfPSºnc橕CR ;n|5FpO;َM6Hʎc 긾a{Ew]~ӨQ3ix\F—rsϚQڭf_5~j jt0juT2uU=zQvbWʩOAլro.k(yFzA,NcG\tpZWvASfPs]{USuEkt=9@?i_FF͠Fj_+[n6^M}7qqv}|Işi1;SfP%-aá%969oXUEA"~Q3F~o:ٗ<<l 5fԨ"-H{@ɱ=O3)fԨ"Fx&IF.hO?h'U5F͠FsTaS>yL tk?BSfPn6arbj!uϼ(mCQ3GӨ;Ə;jK8w6m~rhB#DA.{\ky/E'BQ3eQ{Mm0~8&2*}{.|"=DA.&Nm~x׼cmSe\]v+ ~MԨh.ezڙ=5`G\4sϓ-DAol8{'fT|/+t5QfPv~!~'7ttej܅w~{? _5j5}ks_i!{rݬqį5O[kSc;~gkF͠F%n7Avl'S1/Wnji踁Yr s[k2>Ԩ,q W C QRg_7D ,q yG5i5*rmYkF͠Fe|_zQ!~ME"k"}35zi==Yįh7U}75z_!fiӿѓEH a^9Ehμӿ%^#~Mo`f m$/,Ĉ_!Fќ%d]#~MoƬ~5z_(&7E>Df;LC/DfQfk"}3J=Գn&7X"~MoF{w.\Y&7X>%d|g!FH 4Ek"}3Q#~Mo5|į͠F5(&7E>DfPGH j_A"k"}3Q#~Mo5|į8V!!DQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDQF@jDg-ğIENDB`gstat/vignettes/figures/daily_means_PM10.png0000644000176200001440000014034213777370515020623 0ustar liggesusersPNG  IHDRFZoYPLTE.:Rf3s:\f(.::::::::@LR^dffffjv|3:.̐ \fRs呶̶'+2ۀ.ې:6:BFMQY]ehltx|tpldaRYUMIfF>:s2.'ې# H`̰w pHYs&? IDATxmIwm&nd 7EiMI6 iYt9k%NH@qsTp>>/n}녪+5jԨbԨQƺjF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF5jF{}wO MQ5ZF=GQFv37MWVjF5{o7F_ǁU5j}A?spi;LJ5j>펇F)=5*jԨQcwZ]BG%DE%xhhQ !QaQ asUE%DE%Fx?T5Z^TBHT@XTBXhtgcQ !QaQ aO#E%DE%FNW10LJg=/OUKhk̢6 X( xBHϚHN;?}0_CQx7m2[FWקQ~BF'np(\FoEe"  =O^B5ߛ2PH0uAxoٟ߂3_:˺r oVyxx@`ϡ2J a,@Z̄4'ԧFIxX5m?eXնAh?5V@aT yx@`u3|H/椪vѯGo~ͦ>kKN`9ߚ^`%{d܄?|O0E2z_2*Q&7!IUJtz?ZeZ_ hz5.}Ӭ<sC#a!ƴetB} V&7!Ic7諫MY;4?O{Fv_UQ<~3vk<\Q: $C}H/椪))Uv+aD>|Y ueq!3 +kVBFe|-u/` ?V{ ht:vy4 y?|߆| ZцFwLHsRhY9Nm'}dpf 0E2zl,S'=e2ҜT5:Lesׄv:`F[7k4!VAѨ#O.і靓cSxB̓椪\B tqjlպ Lw%b3p(Tlc,em\Wb^R+Ah=?ߪG]WNp}n`JXLTBXTvq~YجGBooU]T"Q5^${!T5Z5ꈪQ," A;`2htC2I2c/Qţ376F( PS B;h3YTOj+׷d5By*!G샐تFɢVa5k(!g 啐+vAhmK(A+c*|ֶarcQ%UM%k/+!z2!ZR5 r|>p\Ш%JIUBU!wyM,Hhm B$Q м$T5*H{K$+Bܒd#!ï5:#]f9x]BLX m5:nEPf]Qra&!.VBhڹFǙJ) <)\c4"ľ&ɄSIB{רvtu#t2l^gbB4l  ]rwt9YDFB|*NM@◁,4B\SٹޛF7I(ǑJȓmزFՑ+tHij |H){dzԆ7zIBڝ<+! NP {6j0yъSţみqSmУGG '5KH# Yqrxt%T5J“\akT7g}2oУGG e;˗LHݙwwɉ\Fc6SG5{5!QFB4B?x8 !BDh.BUꖾ2n#G~8==*/Gi]УGG L-Sl,LɉQCU!p,䂼4uPRը FR2AH(3LJ*j4'Qu֏5o9 }rUG8~s fBF+!Kf\F-Q PP)q}XF!kPuB"J.k4Q}/޻Tw:rb8v-Y1["DBEY e"4VBvFh>BUðd;PСLbxR2!yP]eM^$E%^`&T5&~FDjoNa?pd𧟅P 8nÑ~7izzz4).$䐐,2%DKˣUJF3:>vyC=AqvQ2O6ϟ< VxQ/CqW\R %K"Ѝ6.6o蹡%?ߺ}Qآ&~ArBKz(HiGoݸ1y={w;j iԗڕBzsGMPnf\ǏG_ryBY9^qcˣ{&tQ7v%s,/.&:5 k$wG]++OujB |nP< ݽxԩ2 U_((Ո:tmdN&pzX Fs ɔ+dqC(}{W(b U9QpG'k(By>Bf';?!F%T5BQܧ, iO1e'wQ%QBFSLBFSLY 5)Fe"4(F Oaon6ˀQhSQr &[~?V+!ݢr Uj]5BivXS2LEAK"Y`.{'[4/!wV IըQ2Y1].%lbE"^ӥPB9!"k#K [U!tFLU<\P*_YGF@FB9E xўwh6E ^G{BOUBJʎ[%tyўa*ړktڈEPtXiEyܺ\:#EG;BS6wax&|Bюs*M]tG2ʣ!RE{{!Qzv֭0f"4H./=4WGc;rv[=(9ljV<Ћ}(̣$1D=zrLƳH]^{ԜJVОTIsAc4zVG$'JGse1PFON=4){hOF_)ь3*ĤQZr-FI]֯_@Igg ĤpB6d}6M4׫їm`oj9P'j4 25%[OHhBUj>{{t\%j o _F[4F_= h!hN޹{hBͨQ-lFhը+== O4N}pS]X%KvKУ !"'X"У !-29 ZT(/!BemQ ZThB]>{fzTׁm4EЩX6ʄ'V|izGȱI(֢2Uwujn4ܐ zkFIhQpPZTZ7f5L sh! h^Vƥ̻6<nQ.f%0[_XF Oo)%!&h1IZTzt5uLxR .H( *!ׄ'iQQ$zLu9BU;j QnxdhT ǤEGzcK<5a=k ; hLQ\õKm䮘| ^Ĥjt(ml}օPʁ52 pI{^ĤjtE4jg*iu}Pivw!B 1 uoX-Ij{K=7M}!__#ZKW$az4`-);'_UE!z+4ℚe ŞbڔF?rN=3_LS1YESoJCh( %Lb|4N/@!6GA-Fhcʡgٖ[KMܔгï"4l&I,%]n !jCɄԍQ!膨Eg'm?|இVYomQ!Kzr’*dZKq4r[Wa$r[D"z++-EI@ ϣF;0ԣ5)7CNI8hCB`yvo)<0MBTIx KBF!BnIH잂x{E մ'q>BE+!3LPFx ր!Ƅk6#ctir@MЎ qgi7mG(N߽O1FiZkXǸ%sz!s(Gmr{zx _+/HH RnO$A'4nCk%n+M&DkA2Zߊ?bZF"N#ƴ+|QGK„dDDhܣ'ӽ=r {dBzgAQ+ŷ'khmGG  B#yI"!.+! x9/hw$w~j%.>Q3/wGG!& 94 9^PFw^csBY~ˣrv>f34:6*Kcs*!oWBCϝYPFwN{Jbx;FxOU.=FzL( 95Z oy8N)yF?(^jfaw b\_ 4'i4BAzB.j !F_'SW1{XXQ]UBzP#k!i,-BԨeNO(R?uaiE`ӣˮ c,/rY -tK2B; tǶ(JhTӇ_ %Kح^@ 'm$W+ OeP`e]jQ!!nˠ4BEInȠ41N}z̴5̦4tZoyB=P }iGY%!iQ۷C< BҢrS(ţUy5 _Omu w XRsۢ:M|?tBr[T'PAHnj4q 7`5\ ֠e Aʩ5J9ԦáGm@P +4!Fڧ4VZd$DШ~Orΰ:94jըRZ?ժLG(Q3mӢGzӢG?.$ iBN #mGKxVCz2E-r̈ ʦ'e'Dനх3rZ^ 9-jy4Pըg#xiQãPFӢGy3k"䴨rZh(mk4<h6EpZT(-gƟe $䴨QR<|чrZT LiQpBU;>=گ*%~e '4u"!Pij!턬hx3FS ~n )%Dhѩl/>bl?(QZݲ =bl?QRLs#WI5JPx~+3 `V:ʆCãztBϟ%TFYYWG*P,y-фFs| Cݣ7&&'xhVdBϟM %&&uoBQR͒ YFI5F4*/-{l%,vyTyi#,ak'ͣK'djt8fD}=6j]X!;ktn@Fӝ%17!SiN'diTv$=)F k45kNUEIj%Kh*!{(ZɄ 'Uǝ6GEծpBoj6GEծGwUR&6E,EhӢGpXt8r0lKQ!`6s*+YpX9G EmYZG&u IDATss[tG$T$}WzT ۣ0~]zT\j'am֣]ӤQWzAJ#t)or4VfBŭgޕ5iխ.k3̄-zL]cZeJ[ϼD%u% $T5FuX(J$jXegTIhwF'rhtKj [,u (Yђ50+)PFs*Me!{#ĈhrtBU1>qtKG(xc4o/Ps&&xc4oݭP>}TPSP UGEc>uwG(آ1 ˣ4I h!WCD(آ R U2~_uC ‰Oǧtل^_N.MSGS&B];JȥѨѥ 7 \#ߙ 2VI3Wsq!85S4O  eS1Ь;+z-0jT,M4OVƓQ B_{]M_}xޣ|[Ji ƝzA*-iԗ-ţÓS/Zd\{d*PFJ˗G h]$X4LvO`c^D!ʴQ!FƂ^Ci(u=0XP߻ y4 7^5ڌDvLEq(ŪЋ'R5Zw)T,v*bIj5J1M_ѶbQw7LHE'GIn E4vB8@,JXF`e] e`Z^Urh7oe`Fv(!_#K~OH륯O%Gqv%bږF+|;On`o(8ݩעN؟ע9Ehg/Ei6ѮYH#~Nߠt^ x-)᪻BŠעH}X1!-M#%[!M^mTV!ۏC8aAar9&?W0Gm$IbCnUQTF`&﷐;'2f8NRУGGB !Bo=xr< ڇFE&ilB lУ!D1(P|h֣ sO{ըYgApmD4^-uF=<-uߞ =jKP&RBOaB &xZ':JvCpPEA-]X ,aB .ߡF5 DPOE\+AC(V. !&`Q+iX/B8ڊGZd _E%"B>=BŃZ9,nH6fJ#اhOVQkE&EGoޔ "{w:L =!S=zv&=!`%ʢ IO0q#գ׮IG>c"գ7opr&sLwf zLhY lBI7VBgS!{gЍvMhY Vi]?v5zQZ'h#9GVŠ@!E(YggGi՜#܄A]5U:ڈjnBŠWBvM(Е6sQbP+4wzћ7MvyM-$ѳ3ӣ]mxj=|:PF8ZWn\ Ž{M,&kLvyAyMq|ބFIqףoG&Am<~ÇM%$ mC:{4 mޕq G9MOVQ%^}-o{4 8ŽlrxC~lr^Q(hFBlry%W{du9jGx#GCOIB#sI^>|m-5xN0Ub{2x4'!LF]WqJrRNӝ`5ze>5ʡDB>I$NYQmc?2r[Q '"&^ ܥ'ktO5E>ܥ'kc+h|'߃d"/.=YQ1RR)սaX4Xo3xALa.e}Y22,QkME2,˨ќhtm`xtq|;!c 4(!EQ6Ec<BEQ6EcXTtvG8+~IV|A?bQ}S1^B(붖8bQ}  AjG(Fg\qfwh|V 12^i 6>VqXW:8;XT~юPt]MH cĢXv"t[+!r bQm}F;B}3|'+hڶbF1=($8Fx&6E{}@DfK'$1aFA,sсȻCD2^6yAhG,{PQH]꟬U)It sjkRN`N+9mUE01^D)'DF'BڵBиI dM,'DF'BhJ D_ƝmJ{LHhxC;Ƅ2 RݿAUWqisBD(a,ҮM%. z7OBYT%(&;eA JH;DhxVƏ0z]ij9C9jNlw?P/86%LlQqÄ4BxuÎ o٢Ʊ M 3#-j2f꟬V4:7&ER1SSIf`BmQ㓚M"tn貄Bpn(z5"hk~dteω55<ߣ55J!$B#hk1Ѣ<%5j?2d"ZxQHjԬ}L1͑ kU|CQ~Bȶh=:FZۢ#Ģ܄\9ZՌX4cXazEZ `-}$#!j3-ڈip@GZ ,l4F(jr9S)M󍴴]6)!Z)Ӣb͸>d-$5@iр@'Zz5֣! N,WLaUE5JCϦj4!EU,pDF R5DcQG"5:#t jmQG/S`Z( !UE$AA Skl9z,J|NBFsXhoഝӈn<P'g$(ͣ Y GycQG"i4ģ<yjԕS/G8lJoAͧQvhtNB'I!P;o+V4-lsT)OPiTviFBa5$1'!4:'!բگF&vvxa;5v~>BU~{>BUj9 jνV<&F=J. zيxOȘ4xN<=xNHhHk'լa/11nkE'&&q$Uwb`[&Q$!E= zIeJh EQBKph0ԣi0A9A}nǶÍgGۢBbl; % 5'M#|-N??];)=4e| Goܿg E j9,&m=T8HLaQ/A̦rO^ȭ_{+ps4E970ihAEat\G(z`BqQPXhQ.!~2~BJ8~֯G?m~MIH]e)5+L2|x簘ȗ*& KkQ ?ofzG@~4aH?Tw]/lp!VN[%4S=Bi76@nJKBov1 !CVNԷ[ h4EV\i`B`!NZ`$QE6'!aJvU=CH pZ|_v\dk4}_Ǎʗ8B/v9qAD=jÕkQm-'M WݻGYi7-е6\?oyAC.!yShxVn_}Qš^@ȸjɄ=ryTxThTqѰIB =|LqQBmK&tˣ2śoh"M>weXYGo}2.%zJh2۷5@YCأ*![Ʉ]*еkGUB4z]L}ݛ75Lj.QѴ>w/УGG Fxђ =|{Ti4OL5أZ Y`hjej4,QDBFRI#УF @ݺMÇGF  K1'k@5rl~]DW1$k4aO8y:`b:;3|8]BhÙW֨ٙн6|aZ0O1y]}?]oÙW֨Ձ {u&  M>þ-FkU`S!C ]\<4 LxJ"dh4;{\rYu&<#!C ](ҨAÕLN鑸S[3fшN5E;Eg tˣ(!SNB>1R4y@hѸs1q5=Joy݆1,]3Dw]\%lCuT,pP].MEMrn: *M$j\.}&΢GIU7F_+E21քyzPxBORQJѣCZ!Eۢ ݻ(%M}eBom섮_wxגּKO(Os1Šy4yzhNm9д;/(rhLWk:̢^ Kh>ёш,`FDcg] #=YF-lZ̠F_GB 9P襌0BrY 3nvK(|{NڠT\FΊk%25ۺxV"z-Sajy0~IFF/boW35Ԩ x+ŁIG-55xj5>@t84(Q3TF`uOƠQE1R5]ΉW>F}ń4g v+H&(C&ǴQ(LFK|UBtȰF֭#ܣv&PF9}UBXrnq*ڙB)EQ/r]އc(FjQt7|Xb-Q &NB}{웿HjTt>7[ ըލi[w0BݙF}"W_Lp&^6tZY1™C;yQ= Lp&NjEEz61™PB"΢pOr hWh('8kx&HZN4QM0+F5H!,Ѧ ! &4jn*&|FדO?=!(ӝ| "tmt)wFCۣ~5qz ϫ>tǔw.*I! #cmh$ {駐GR ,+X IDATE=RoaX@c-~ OCӊFa2LH5aQnBhxVz#u o׵k 0$@,HmU=r8LYvA3,;ԙҰѮm@cch6BS]} Բˣ!p#PejTx-}eƲe}t>ZT޿{fY#kE3ˣiƪkQr\ik,J'Q&B^vؑ, {" Hh6MLŷFˢ9NV֞%q܄NO?ġ FEAK{h2!a%t—&$mCoXzhnBi[mmxeQУ@AUlx^\h?"n=\!1kV쑳s#A#DG_0R =3=LHJ"vktF%ѥ'k" )m:tPd,*2w-ijܣ<ʦ0BjTWqnS z("DHq>h(,Xth^Wqr^(`QwʫlШ-ky4:|4j>n<4E"5*@ "$O6P d%v@g*駘e^6PjO֭Qhk4!p(tdx"Sz5  4YlԩǏ{RN1%{IHhbh_`)#DQT.,2r)96QgNS71s{O]5-AԨ]bQ!,,z<Dݢ#y5*}'4®nB<]z<o9 b4z 嵼[bCG?#v?7unQ [vGUHfZnj-~BF Y'̴Z .eF Y `BDHEۢ.&Μ5q#|hmþ~waai=D:b['dXFcգ6!fqBڡBG(6!f*r)k<^R?dbv4zuIbeՆy(aޤ]({g=N8&5Дrfѹ g#W4(!W#txB5zUF~(:ںFڧQu/%+[:FH?0F`F05̩ #YU8!{L2׼PdzUa,{jtg^~2hectJ:Ghdޥ{4ѼƜ_C(wmf"Xf%,'{Ѩ#ydmqԨOrnG J(RFYCErbHI2gEg!?٧F# V^`H>ݻM!dX43!2Clzbr܄'kըH`arg»O Zy,:J@]G Lh*4:wPKsVMj2l)jdP*FƨWbj[KHh^B$?6N5B\Y%-e 2cyBÓjTkIdX& = =q]! !G&Bu)s֞T =VBʤPOEg!kte8n;i)}O֪a7,C>E]!e,CZRd\htL#4mGwh#F5k(sYtĻUBhfJ5[U?F`% %;T '4ˆvP=iqyJTBH^ɞ4J]I9:BgЪtBb儦'h\m*N|y=T\jwE>BJ5SH3jJ'ID%!dGUFdFyF%LȪrO֩Ѵיb\ SI(OJp;pӨ ֜9PL`'-1+!NOVncop򤫄t EeNQ&GMFQ5RI>o~u`n0MFBIB/Z{u#'( QaȒ`֋,*!,6ÇG37do<%%VNh:nW 9q& z50LZT3N }9dUBJdBB ÓxQٷ616> ?AȵcB)CУ!r:W44:uyQ$MH_sͣ%ttDK["n6h=ZF3] `5q&ѣ%H"| q#zt-A/]FLT:4:dwMKuHb儬NuJbH,BQFDh=>S?K>^Kh9-Bb IܻQ= xTOB;hXi2L_$fXR4(ӆ9#S4RUaJ' hXJ2f]fQ~Daιz 6EGWMWfQ >6jFv^606E'e#QYt{spf0 ͢G3ʚ}QYth[f_-k.`Q9Oj|A XT~;w4L(k: {E6nPE凾rEv]imѱӧGrp Dͣ&g&<  ^yEh+(XGjTgQ!Eq. A~kt5zB9k"3-𺵇oSl.BD4nB.uituitKVQ[pMBZ 3xF+!%5BҨrO ǡdPfmp#' 1jBYܒH!oų:i1]Bƨ]<mpۦFU#u]k?,ӄ'Fcb?#$FBm('$G86s:9h&BƉ ]"B~ ihWJ*F9| BH'tq{tzu6BϞ1{TAm2uQYu>B''5 ]k#5mt6BW˸%6ͧ]/لq<9{T't e [3zۣƶփ.r d By.Oۣk]% c dZt>BW{tSSGz a,aw‡}~jnrxԩW;G$GuIךG$trQеknzߣ[觟:<+M[P1ɭ[uv܄rkG?&zsʭk<%2Kj[Ou&:A@uQ^lB܄2kG?zT]sʬk|iTQ;ШS@@)RLjkCШS@@rF'%E=QnBF3j:&L̄4f T5*Nd ucP0 uc'+FQZ'rB4JK'Qb-R1BUfM6~6ÑmEhEYzj,mrbةoTfBr5:&آmbĄj}hIEMFyiC'!4@wL]r~)kuFyP._ !j#'7+{Mt98ȉzբ}oi^p2O/Mx2r hF)`$du5:Zt*|~{tx8 zm&hѩy0MȨ6 ,&B>jsM*Yt=VQJEesG:R;EFu&z~ʞlEOgƴ(эZF:Z<9TG8mî *_w _!n^cBza$چF&L5OB#{S"X#䜧_ < m5:>bhf^0B+(W%hV5uB(l~dY F7H. F#{5BFb-6QbQ:5ۍ̾ NngMȩB.25xv }Ղ.#" 9!\Aȱ1}BhHL!i#(#)9_}^hQ(WM[>:U~y&;,I6"Ьf4lDLPaђ=j?a`BHB*!EKh|-٣xCJ9ҢQFax1QB /;,R 59,UڢF[7o<:Ϫ2\18"J%D !厈q#ͣ I̽=&ѣ+YQJ =|b >M YzܸuڬFph42+F8FE40h4ZDC)wQ✬F8F5Z,gI %ktvF9#kkt]3\FBT#tJ([PFg"$f$ԨV4B;h3RQIh|f/dJ(Ox42 %bZhTVR-̸lB>7T6JD(բ ZYitbA6\x{AgѢ_t " zi)j6dS!Eo"ivSԂmȦB gLڽFylQGUGɻ2;OzF="[рzt~B gL-کF6{z*գEXQr'OR=JLh}QrTJ-gLB ._ݹz+θ)A΂R31ӓ' %ۨGiNOJTOy3o:=ͣ"d wkUite xRZc:G,XF#ĖIQjjZ<ͺ^FK#ĖMQj8δ)A'D()F 4Z!J2R).کFE:Dkn^Beb"57ziHL-EFS`%'chqE'<1YH~r4]ӕpipsk4\ ]ܒ:SBW;N<8~֯5:6~;!T$*!,a4x[љzјokt|@+NlEw" Jfyד3T5ez3%IZ"ez3FdeW1e+!<5+!,c5k~/xKԜ3ez3%څF{:oYjr|3תR #JͷB)Mi;FwC sBOSKsTt[Ѹ\9Ove,Q%fB/-Q5jжf!t O #6<6I(ޕ6P販47{-89z,FiWн{^Nhɉףã"F3R{tB%qrh%tףsO'2~q3eJ;~Tz5T}نμTz=TiX.!D9 i?zBjtTz\^J]\}h5{E4\Qu[hR D/GSh&BwHMh&BWJڍF˟mɣI-'X4/<:z&fܙuI;aI3:kziP B|DHd!y"kHp8Ȓ!4@d%&JDH}:Zk]S{[/ AL5*!!{TlSٛFc,]テ*DoTbf ETzHhz4/!x`;ړ]htܶWt\ Ck(HxC,2*!zD yDoh*!FVBT.Ch$:'0 IDATG]m*L -Ph؆L\"4<^<=htڎws~z5VH֐^:@*!^B K5ZF xkB¢¢jtQ !QaQ aQ5zTBHT@XTBXTn=*!$* ,*!,FU[J JQ;L`?W3p W/8zo YπWVelPVKxó_1>FzRۍ8T?qp6|*3>]%x WǬ|@z19ZqDըHԻqf~-_MkǯOb+(/!귲(m 3kF@+%d88UFka(>84R}֖%ov2[?+(3!dNBƫsF/غFV ?o#Q_뻿NPke֘Z&F,Q< -ZVJHuzѪ)\Z?c|Xν(~]ҝwsz C>'{7zdfGbNzf~ʓs>'u2^`ajoC1 | .3h[F\k(/ m,c}2Z'!Un!CTq89o. k52)V pҞee`-deIq b<'mTB8ncv/#+]l:rq'T5f#teb@'CTB8bۄ J< A?"t,)a1Q5&uŕ+(Ӡl֣L7ѪQ5Yը+FŢjtmũy4!B4Z ajtqPn$,E["GF7KhFXe[#O1m)&գ&T5ڏE5B*!GL5nxǖ5:d 1N u~_ ANbkrrl:!ƾ*g+!0^B+3i( 8js Q !JlFC0 X2!zeD%&(Q7e˞M&BhVC_,gFx j۞II&kܫ;L4+JJKD(&HNw\ׇvC=ZFG}'JɓBIAB_JɶuBioOwoz1SM(T) ._%a芒²mPF|UA;?Fie$K(!J^,Q2!Q!PFu 9pr ~8/_5>Q`'tt{P.@Usiݹy}B!E DQ#'e5* ٧!]H.JȎEn~]]˴b#ioeOeT_ a e&m[qTITBPɹEjtMݤd7NF?֊r;+xohcV,i$DQb< X) & A&F3hnIF{yP 7)L50G4w-Zti]2Ohm բ2ls!TGTB@ɹbJ4>p%QڔGFRϿłeC!ydPI(58~$Dhr&BUDZMYѓ{G+Br^B{L!CH^hoWBahS b_umb;mцP@JL0!;hHaqOcAߞqհuqB"!i'BXTգ>Q aC+VBXBbMFA$pL2<\sK_TBֳb U9seFZ)k7NJk!>T؏畐`BU}nK߱oilΕ@}/3Pj&Н'%!Q L(Աm'sŖeT YJjTϝ bzTFܙ vR eT soPը:aɐ_mJ"9C}Sڕ Fk#8uteڝ7pd!TT~ ܁"҆#'"QeO/o.zj }XD$!5xQ!P!_8o4]'..Е+.Ghn0:ɣã`h{ Ԯ+3CbF.BH7pxB{wxX;+W-5/&oByH֊XW.AH7pxBYwY)wxG$$#:P~ѿQ:$71j5MMo8kƟ=cpcHXQ-cPTd)kʦeq8T'NTNp\BUZjWnբ{*RFIE+ R1ˢ!֦Y'!4}^BaɭZ?D-7ޙU8MmO-PN@!1+!-IMSQ=ףX]BW/ڈ5r ;!UJ"'md! BUm /b<U.ۈ KNgL"%%D}5ҽmolC9 ݼchc{F~QsQy"ʣ72ȣOy56Og#tf% "t$?}"ңhQG::J(Fy5{AB[u4bnތD1nH(@H{!q5k1G/^{2УYMAy5Gr|hx`hB7ogSEy%1.N}p[xAG:=%yiԇU0]iP<#ԃfSj͌w*֢)&eHJ!Т2Uu-ڗ;kC&tzj{Ch_ N-DhO|( ORZt(ɉQ/!ȢѠPChWQJIdѮ1ڇFqR_m? 9KhPe }xF) rq-JLQ !Ȣm3qA.n4 ,ږ8><!1hTLif-:nj_A iQG5J#Xll B]P7g#4J#Xt!vqQRXt<!h4$տaoW?pf˗Tw6H7"D>S6Hl.E."qkm]5nǪP%>WdRKGQϺ &4]T?ލ1z%Ŏ 7FuB׺d5!Ԩ *U[G4*ճxQFt" շ#0񔶞i OuhbGP i]{Q!hF>GQ\hO]IyXbblYǴџ(還5?x(CfQBsQ\æF#T5Lۡr*nԂ`,mx5jB,:zdBa= ^=dZF BEGIN?-Ij3qS5:zZsԎ%y4vϠP5J ԀЛF TI;F TIjЛPhh-EZ=*7c^SLBF sBH(tAi4gyyN1Qi%:.pZP)MiTCOP;4Q|)Ѣx;23vQB-|43!4Z4;!c%\nOH<@+iO6ѩ1Lz\A([ajE4&wYmpBd:a[4MjrWՍѡ Fi а-1,ChKMnZ5jUȲ~o)%5 ~m)Yӄ'!P!Z$@H92J jtBlEiO6Q{ӁH2-.zޛFjlBTIxޓb5jsO'45dX؊fmd'msE*si(;LAD!Y"DTP,JHNvDB[(\h1YTLBIִ 1R~]< &D\BE+!8&B(f5?1X;rڂJ;z1R~BEC xB M !A#D,w]HHFP[FwآF{LN {)z@. j0unBEbGT5;6!gsY(njljRFBM !Ff:4!FnEwQzI1aZYqY(%hV YtW ᔎik,{vRb"#6))A͢%f=i4hE)aݱb5SMHnJ0}J"N3n)PըYâ/(X~@; u=qHu&vщPZ>-"UNeKBI{Z-yW B"ԤzѣjZ T5:75B57f.1o.+ BMIHǢG'T5O?A <4JZ2!s}!(DY[UBF m[?ҨHxO%4*;ғ f&dkTvԨl~9Bht#ahTQ M#d܄LVBfX]G(9tF\5~sU2%1溡J C%ڴFg)w1բFE eζѣBc.20E{N]PPQG~ )7i- rXІ5:hѢn%'T/Лo=t~[ Q7iQgvHhɐE!]n>ѫH:ĥzSFsdBSX%h0Bo*APifBJYFH'[{U|`t^" #F ktehj4:`h4QMMnK(&7*Be0}4kICh}sˣ4BUhQ5Zg#h(Bׯu*Nߐ 4.z h sˣDBU 1Lw}ن<ַJ m_xԙK3# &t:QG%τZ<>F=dE<%)LjGC e_R<3\Ɇj4mSb)B=|t0 94%Jokh(!FIJȥQ it6_|~!t*Ǹ58!&?+mF't|{OhKYsktqBM^BArkukT%( IDATM ֛W,(jQKu F'DZth#eO:>&x]isǒwۨUZd\ixRזG)J&DӨ'ŕ+GG.NQO[TpӯM gwdڲFDF_T=QR jգZ4Fd޺zt2l5Jgw%eڲF^QR4˗G_޺zT5lhdwMхW?8.>2ikˣV"W7y xk2MȧQ +m{s OnBBy\}m{ޛ#Lxrhʯ=|JA~/k(!A~&TF:Q2MjTKmtߺ,Šs4 AtyF] e-~1ht5j@R!̢CIehFcEBy!vIqE4:|-*/a9(+'4Z@hF&\rdr Xtme8PecwE[4nX?]DE:D߈qrIE[4!G.a` 4X E ]PoP˹ F~FmlWLh4ڕĪ ahWoQvBЊ@Bע4B[(TH+?PPaZ1E5 #Y$+%h%$ٳFRx a;ZTm8/UBS[`k@I(>w%4>٨FRYD( 5oTSWM$kȌH&BQFWEqPbh0>BMbGrפ3R"h=(D~R#$_oDFtXBA46 tr^1/Iq`*tr(:Q xR%M1?UG$痋~9\È7q賜! z_v )PHo"2V'(@NO'bC2PejBRsM/SrT7GQ]M+42 *J{16Qsgf/7x4{[ U@NN<ﲮT! -O!D cT^~G1>S!FcpSHAa(w0el\mM6g# eb=VB;h g[B^bs[0ԤA/$FYSweB3K8ggR]B3"li y0VVPț˱FYE* =i:#qtq y./b]BhP[1.N!Oؾ5cv~|%[j` D36G < }]BBl^6)BDl>>j+-vgt'cϞQ(I!t'ѩBl.Z!t'Bl^^R8I!O>cc& N:GR*~WB|>{Sbq q(r? c*Ks)M rz6B>F 34>bc3mrF 3BuơnNk :gbch+Š5!۶hW 6G~ si"+Yn}̦AO=:(W T!.F 9z|,t q1zyisPl?uPhX'FaK1:`>sTQH1:@GG*읣BbQM0G9P!ў~ ߭B:1-sgT59fF@!;Zz4ѣ#yrR}:= sX)3Bzn (o_9/ƞRH`ހӧaIW$x 9z|lsem%UH`h|w:p&иNz'@~F.ؓF}Q FcwR!&p \'@|hZؓF}Q FݫLo@J!̦(_pT5F!hLI!,F_)ƨoT͢(_9:T+90L!XLN!e6[!$F_st% YbԷj*Ą6 F 3):ԃ|!rTjLߜLF!t&>V5% Jʤ8Pb~cMUV,Ԅ'Fs%G ;#L&<10=FCQ-P>0]B O +o̶/!0j;h 0jTFͶg&P]h1~lѪt6 9ٺ>f[0EkΡ8]!6$CL+h'F~쬕7a aW"}}V-èwS4Ijx !?T S C!H| ?^~Jyh?@5̡Ly (hͭP=KSH3)4<>Bav޽^1|G͔uIrUp 0]ʆg|R^N ۣ(4RH·A՜Ph\=i~=C9*n12f!auN!ZUò CZxSvkj:F+N1Yoi22B?rhBul.|joĮlCJ 90 T"*4]Y`0 l(/"YˆQW`A^UU0F5RJ$e&c'T8̈́Wڨr.o3aU7J*- 8 3;F y8'%THiXEYˎ yKF7թiwTK?=|"cT^@t `t:/Ѭ"d0:|S+"jDN!ÞcT 3591|[njg@Qc4B%W "ǨBO7E+5>ҐNQ+g< [h ڠtIrRtl6zc{cBy&K4c4n>/E74Γ(䤨m:} n\]mLSJw) 娎Ѭ MPP꧀p5xԜ %5I{ , MPPn):~c{8jQ y20*{w@j@V1 ( \ ˽`B*(¨XAoN=q3*j?c8cTB >nv)(:$@%cPk*B8(tX9:lNEATOջ1QLpdz"QLpBr._oMʨЇ8jW[f!щb;16!xv/a"*iz"Ѯ alk xLɜ Q!Fs(ԯdl2Wʨ[j3 ǏaIJ!1IЋaI3)ĨF!=PBbTLи"uZ5+BHN} ZNQ7GY ʵP/Q(QBN) hޞ IFs+Y:hIF uVQaJ _}E\N*¨]@OB ` FN=Qt&&:GѨBub4M1 Zƽxڢm~u 1Q!s~R]g.ͨ-:BP"n)Ec ֈ]``궭FW WCѮ>ujL! Fn y(WK Fn%8 y(QX<|[X*hP!-*1*Xc;CLBCXoxE/fB>}VJ0t2*gUu_TC!h>BA+Ĩtל?ɑ'}W6 E # ]!(EQHM20*XCEɠrumWSwGHC EPWP(mD]+& VQ۶ʂPQ :'k XuwgpTD!K2Jh"OA!!h=mhPQ BT_]$ ]6x4\B(hVhR~EoL NP븿ݙP\d }t!hG{(`{P(`KWHB;GT?`ZݝQ%Pȍ&1ozhQhbGq ҭGїIfiPK]FH^B 2i֧O nD!ݵE;R!e*T i WQ^(A\Fp7c5r8[BZXB">^YcO]B ]\ݢBڑ5bq Zy0jeq`Q+B]Ʃ?x5|<7LfPjY<_!,g{-&F % :s`us2u^!6FqњIp3HLBE(stRl"9uYʁQt}o3c F=WiDŽ'BF+d!g ]f򽶹ZBF+tshB5bxצfP|yŭ,fP`1T;MY?<*txAQTG*m6Uu{sK!Rt2J6-?NQBO͠5Z^Z>ƽ1$8 R\pPbp,\!mc^&$a4ӧ}p =ysPSP@n<>&yW0E4~sF ֓$^my%FO}T%*c)rP8h2K\)s0:,ƚOׯu FcyuRt~ 1x{x5>6ѬCI2lE<ɥѬHq w=hWs)h4jB,B~F6VQ cLJ 9WO!*$Ȥ0x\o)Љf"v?bUcy0 !>ypT) fxy!B7Nֆxvի)E#ba$W8 Q4щH(FU;hN\EB0Z=hjy</ Ľy3]1QW8BdG9*V0b!JS(]Z 4OM`ۢ0 @rL)k_mV)Jﮔ(Ga{?mZ ] G9 5Ji iDV;>{ GM>B# FA57(q:؏]{6+8FR mQQ#mbD0jbh*du# X!1jbh*# ޫG7F-JLݞp8O4!֨ݷEEꡀ(\!EQko(t}(\!EQko(tU/ph F? k(Jߎwơ0ڕ+^( ŨG2 T@a=\ QBmzSKS}Bb`*h֎ҋ(tuqQB$n!dc3m汭hc4S`ڍ1<|`c4>C8R̓?ko&WPpp Q( bJUQ}+5!I60Z)Xmֳ~rJQG'%L*7Hd )saJQr(e R4BU7)jr$Ԇ̨PꟺF*ꎛKnc M(HvREQDriBJ̼!R1:Gw4] 9!RH˫/\aNx (3B!R{ʤѪ[O|[ q[&F1~?wjJQ'G]E{䨂]H+$ySJpՔNfSe+gU&T:h5ىP4Bӫ6F)Eu^HLvc{VWg ?Д.:*;<6?B=:ݾ)E]u|[!e"9laRQǷ$N?Q!m,VS8k XPvcu UG2d,07W W(_Q!AwװFTHjQ=ΰ#GorF*vQ=ƒBrK!m}N2]Bz1쾇(sZE39<֎wu0RHo``\ѸB BB:Ɓ&J Yҧ`=Nq106Vщf3ͦ"Ÿܓmڅ6F߽҈E!M-QS6F{R )F@!'uI F*|N"74]wv:F(n#ەR\X?V9zCFk}A!vF=kFXxs^Ջ(d d^u|[ v/O9Jom&7dIDAT*0dRXUW+)z*s?駖1^!k؇Z9E}+hwFA~vV "[ކ*f.j՚B=b1B"T&=EIZ0*b[¨QhUH5Sg%(A!t,BvzYB tYd5c6\@BS)JQ(]wqڢB90j(1R5 !N*QZ%kQb\lZBƓvq5bTuKs/P'NQ#dZ_u]ܾV`BStCov|ʴF+;I]STAh1M5zYD!sBeV(dcA 2Ai۝PRjÃщBF͇߬d?>@cIB֌ VPmasf&VfBL!]!B F'o \}y[heqRm'C犲(iV|oӋ(d%!Wɧ56 [!U>-[ءt($*EZ1huZR{;|:3BQ*eTNiʠ7(_f&ͤPFL(M@&5&UHhtJR.T!F#f3{R4f63Y;͢PZ>CYGe(cI|UhJ*BDZN*d,BHZNr(4nY([0RP}aLd0):\$TFy YUH9 Y,ˣv ͤPV*ƔZ mhs B)RzctleQ\# VY6֋QZd6mH6 o& )qHTdb qi-, eh"H46VQ5];^[DȂ$Ǩʍ.ShDEPt? u+h (>^jHO/6I/f(EשPV ɘuQ(y WQ򵋒1Q DQ((ͽdJ1J vHzBRP,^6^m;ݢ Cv\_Eh(4n V 4L8҃qQ(* EV9RB [YFWQZn)J(:|sb9а+J&1D8ת(v:|sb9аRkدlK#K%* Z Pe뗔uG {蘭 8Z9dx- EGa?Gj*>'O9cZH%Q9LPޓ,B~Z~L\rQo=G^}DJ(&q3bPAhMnvLSB߅R5pQ+ ;%D:2c4B+[r~֟(B56k+XZ!{%+4޼qvYs+ I6ݛӖۿ|_SQϘB,ֺz\RQϘB,[[G[!!O!F7>nHcrrԃќ_BLF*$29[(tu[RF`0)"B݇ќ epPȋm+tuQzt~m v+웁qlV:E6(,rmB:Ek|nZ!F+[(s=`2):p"-3m $*GW(F+G q 􈻣;uU+k,V&EMДSʤ^B&G IQ[PvmJPCQLU?ziw #2)st Ů3XLvUyJQj E2)qt; 10*X zN?~48\븦P#}^g( ͭPJw2#(68UZhX)R$F_N7  )v eC*[`tHQctHvVѦWZ$ˉV! #|]BH0 @oA RHm.0 ;$l:nԤtR*l>) 5ZҜ9[Ph4Δr5FNoIK1M3\ MYL %lUX%n΅9᩻N~(X!^!c^iVrlivr"Q/$x 简RxΌeB@}{ȕYZgMa &&Sjӧ!)fc4G' )uzt F)tr"Qb OͧP9Lлi ؖ0ZUjy;OcCLĈ ~MBks6?{W Hsjk\ mhY1MS'Ph4BB+htӘVNc(IDcľ4ƴQH!96iLӠ-orQ(6iL[<-1mR(vFߏJ=>z9|(*٧wovS訐RQGE+deOA8QtM E$8GcYӣPtQ%)uæG?脣xrlm7:5= E'݁BM~B G1y?> s4q˞!~$wy FV\5F=h9B/4Μ1]BYc qN?F٩ρB( V [ZRlB FiXBS?(U (4G!- u(Y!Z6L6Q| )gI!a.Z!_ *$L *$L(6{#.Q+Y5,1h~ yoR!.FkVzEQt9*>FTEѷQl|)(-îp| 9(z[ՊR 19j&zN' U!7E]Bst{ )J:$F ;q 1WKV,qFJ}h6*lV+t{J"FV^_zy*89`(o߲9J̈ ${xIKuno%fDae(F wd_BBo29X 7ݺBLC`/hNU0P |WY FgSh5)6uaw-d\l.V!Иl]֌ ]Bh5hFMV2ct J5aI! @`Ϫ-y@MJ!6ELF$6E)fR=Ĵ 6/Q5RuHP[P_3DbRuH,;F*V@- ˗9jUH7|><09*.SHaiNr)h92J]b{ `Jp>GaSTlb[ q[oS4QhHYFRh8 RgV͛Ga~Z Vehf|p(YV0p}ߊP:y&ѬD0yY1xיbti 15Z0*`4fƬ`4fϲQ 1r.0*3TAʞ:#Q!&P a4YV0q!5$1ᩉ4 1ILxj- bCLhSHj)YV0z("JQ3̈́QBQIP4$P IMxO˭Ԅ|g1|DWj=1>H܇Ax)p.b(Hbwu͵DO$I0;: T[ 7 R(TE]Bèx}d['${ q3Ee+?r;=fZ$+$"evE+T0񥚏55mZB DQ(SH% (.z-aT$F$Iyl -:S;[B;èWQ!TxbN F^e*HX(qvQv#x((UQ(7@ B(9aVC8P%)$0bq( >TC ^Zu(| F9qО!LMC| FYS(@Ƭ.a.a Fl\M-(| Fo.Z1TPFW;N Qh1יP*%;X1d ǢP<9uj p1E+{T.j ZB$n(f&\IJv+}*tq'/u][mŋ %PHbvq F1rwḧ́QL/”XB3E!]\9&Qxһ0G3/م\/”XE]\9'9`mF~͈D\($)dP.^TfMmF(BSa49Q(M fB h2GghBnnF )"Ԋc4Q :r#Baa(C!꙳޿9hbMQ)Q^!D5Q+@IE_gfS W(6ĔHb i~Ռ BFQAי5(^+hn4S`iI.FYr(fDthteQ(L4 e9#Fם0Ec)BaF΢к0y`Y91 V2fwD=1*%-G( 1Cwx0!.:F!!nX!!`=m)9+{tdA!FgRTĨB7QލBcsC (K!*$*, r49.FFxF M4Q43$fQG9:=h$`R`umY1ʘ #=dxV($ #e=8, OY9^&%QTN`kКx)X͎gt2>`Q4;$wb<@.j):rQ E FQ_68J+Y1:Pt(#8f@сRp([/ ҃cJh(&Gɑ5I4 W3؃ ̫eE!w/ 2>W0Qr`i;I={fp{t`_Srex(#t- 丼R Ĩ0 M/{溅QFhN1*dbS Qxr$hAS_'s5FIQgE@2}zƨ3ɆF+xHկHQ:Fhx*1*T(VA6BaňW(DQ`>C)ĹPZ|*r9ۺ1s4M!s"4+hpraThz%dEBM@[t U)>FO;FM#;E@;B*BHT}w zE(d4}aKkr" -z5;FԾV(Dδu- }m+*,/SPA!$|Gp[| mͽT0̩^WE( ·LrCVB)_(DzVuyFJ37kr;J@ys1nO!t/Co 1C] 0-EҜN^~%Mzċ~9 , !QeصBT~|5JޑDV :>Â*l4nrV( dl0뿪?Q !/F^vWa%3[9H154ۃB @Z^~GQR!h/?ьR Ay(X?T3bVHD!Ohu a3PYT <ͣ |_SۺM*Q9%{%Έѕ*/ 'B6RSѾ6J,VXΤE`XboŊ+ƲbŊcYhbŊl֑bŊۀ9oXb6`s>TXb?m&@L}bŊm¾)wFbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1+V F+VeŊ+ƲbŊcYhbŊ`XbXV0ZXb,+-VX1!8vcIENDB`gstat/vignettes/figures/pred_daily_means_PM10.png0000644000176200001440000024167613777370515021651 0ustar liggesusersPNG  IHDRFZo_PLTE.:Rf3s:\f(.::::::::@@@@LR^dffffjv|3:.̐ \fRs呶̶'+2ۀ.ې:6:BFMQY]ehltx|tpldaRYUMIfF>:s2.'ې# H`Z9^ pHYs&? IDATxu(v\?⊹`$Ob rWV|oIěw?:8uNUWUW >Ғ`sG[l ho`-n[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,-bE1[l(6Fb-[lŢb-Xbct-bQln[,->g?Okct-x%jvtct-x룿)K'WI6FbٟTrtct-xǟ+@tIbct-x;e.Jb9G[l;f|t1zE:bN&1͇ .F7F=bN&s[vre'[rrх?|6F;:#':gsrA_~v+4hY5;>AaL_[PےQ=7!ҽ=Q?/Oγ#>O蛝ɑ_c/OݓtMhaY7;>ADt#?H_r1 w*0ݻF~>DX|'N|pTP|1ic͎O;QWhӴ:;/`4oˉ)VN?xNt❆?fm&VZEd߈cv׬d緪Kł{t~wYW̎Oh*~{~AKs7ԓ(`qƁgǎeSN~p&x whgm&Gf7lmk*<;0dSM'|  zHowўىv1f'hcT_f{xN/`vv2[ݑ῾M'|  Okfv|6FQ4+(P|z;;=kCһwMǿcV͎OhSν1kv$6*G0ٙO?Pcrװ+~2MGicV͎Oh:boWs(|#:@vfMhx?ѵٙ]x7;ݓ#<&z |]8{v;Mز-;ؒ{[lŎ'>0])^x Pw#ewLr\|f$kvNl9qlÃm:SvNmN8>X,h#h=x o߾U[Uw_#:Be'dTI1>U"/w_#Vڱ|C1`?}n˯ɠZ`Tj[^~XQՂ,'c O'A׈Uv3Q1\Bo2Ԕ^~X!$A:WqNNF5au Q'yvQ.vk~_Yuh(NwZѳI;tx`*G5hϾ6:C(2=N*9qhQݱ?쬲cr4G~-( -Dqx[;ڦb(7F OoͮpssgFG3W,d}fcWqwQszǚeT[3LMgc4)Q(dt[3=E輣莒MΎS)dtGi{{XQ(dtGwUS(TtW )dtQՎ0t4c!;۱эt]l*St{(TP\ ;n\=Fy)at7KlөxwFҎ1 ^ 7A0j_/ऒi߫ wve+7Fۦ6TbKuO͎uꔜ.o:,L"mßڍ_3 >S+eǴYFtvVޱwjA[gv[ſbv2$+UpM'(QN/cexqwv xUr Sم5忼nv*Eww7f~j1}z*zkCvVޱ jKO/i:q"OfX2)&fXv2*:40nF5`Tw0 Yy^Q3,jݦ:x{UZѕs5uފ˜cT#~v;;]o(%gD? 볳5SŨtN5 h:f 0VOs}]؎Ɛ3h0f"ͶM4_[qKҊXQ?4,Z(){uN ` سiK03WBFO|<z;:[(ETݞ{BWG)GXPnFnϸ"5/UϤ] $h~קױ}Agg4ƔrE硸UQקۦӬUp\x!+:Oz|\NLvQvuh<p6|Q3Z5N ^ <@(;}dg>=Adgjt"1?C9avj4-Xo“Ĩ٦Sƭyicjlf/}sq9fd.3Sa%`̖6] 囻{vk2:qwo泣zqٱMgg}Fy¦όLS>{m:nҌdCe1SI^ӱѱ5;qֶ= W=Yx>mJ g}O.{hp,0_>O.zu3,=`e\q+͕ 7y2Tx>tɱ?Y5{k:Ž.]*ņgڱpvɟ\"F۲1GPDEF}Q-ݔ0!ԗne?&kEAPq,Kώf2:[cb^SNOhJMu<;,z*QKvBFhujci;h"(K%N)~Urs8)MѽBaߧi<j>0 Xv|}PIu7)~Uۉ􌼵=qs@e2Z'1jesI7F#2QUZD#FOJvB8j ,I*aMըhI3FVzsL9e)z3C[-;(Wjl3󊞜)j;Xڌgl鎵1яw(0J9X*F!;h'&5{gT?P(٩n:}n^TnTg8|F S¨Sv+n)a 3gJRhFXln7B_Ps#K/_NRv`iذVn3Y:m(# n~&2iםكrXl9I,%F ίl[=OHt$XXy!rz}SfSrO)uù1EGF+pEZGc88T2:$foqEm`7:AfT6;(bF=GkCatH0߱4ZG1;Wn-9FFFx"V,C)'\_xK農3W%o^?i"r{٩3:0۱xT2 6;ϰ1Zj2c+dwEJTS쨱QV;9ER/HT#/d4c50Jo:pkzMu<3 /YD޹/eT 3;tnfFMsYySF;FvDP}e}C6*hҠ_vlٱC#dƀxLbΨjJT.9foGAGbnh.9IAA5P\*M۱,%Rv;G|`R96 V6љ2aQ+ڎ^7F+SPou F?0-7{C7Fʔd'Fq-9@%,-9cQxzQU>;hwNy3| v#Ĩ8\J1Z(0ԁjz8dF Rv|CFQM'dTe!2*f'`T^F!ZA[5JlmAq—gCяECRrtn]gŋ0AFeY_eT0Z9SzL8d!+F%FOҧcTβ˫YFRFac4n}zɤF C0V9ZN.<@mr@Q!fT%2Kd.Vd^W(::D^wꏡ0h+ Ӆs7C`Taޔ=y ~=0Auޞ)K ^fG}AʎkY3Bm{psg U#^QxX";j7CP@k폩eGO@cien/D#۱qw3N}~9Žf~sBGy(" >XÇpUU1:1͎w2;gtr4fTFSx]LaY#'LQA϶ҒFkv,I3:h`s`wQVJ0jQU Nf1`|g=gLR IDATSČ~쾲Q99ffY~eQEcT?I=FMV᎕g FA%o&MgUUSb>uM60J<Ǩ)H¡2j3J1"ljj5 j4N'K.9QsNa3s/Gf:᎕etcsL/3 :wQf@-ŷ÷/]]87%۱O1J.d4 eþ7o]|oHڢ/ ʧ ?XEPzP}?LUꨞpΙnJ<2(xsOҙIN4hh{fFCw0K'sbKgZ<rg)AyvsٹJerRF<*JSb;t$;f|j\Q`B!uV%F'EwhUv3C40BJ3JQc2:7bRѨSߍQ F=f y3>& )FQ ][bFWd9j2e>[F?|[ȨzVϖQ,;Ah =֌~nHalj^O!L՗X¹ѧO;0+3芌SjT`t)F-xZјd0F}21zY/^1TQ1$WbT%R(Q3M\e5Q/;Poh2U©" mW%'ڱNSF;yFO 8F/(量IFM5jT)fT-]gx\`4ܹ}mQS Ε1Aed0jgTh-A0Fͺ"FUAj([ҟQ8  ?PҎUƨڱ.=gT%\v1,%'j Os P_P Q;KL3ʹxx}nP Av"9ޚJ 4-ώ˫R!.xBD7.QAf d*;hG {CC\4 sh^~0AcFb1GNeߚ^/n@՟S+h]2`TeQ)`#gv̨C_ԌL1:iFo⩳SF?( m-dt uHg mZP(c3 ;fY:uF.`cTN,ZPz#QuApzE'Fu\ƊƌavҘڐQXQ;h'!gT+҄#بUt=Fݫ79^cqꅱըKϨ"vH\w`OAFKQjX4b4uhFCS(F]#55(xը4`ԝdFݺOkdt3Ꚏf#Gqѕ^X.;hi5jޡQ O5xflv6F5Ķ5:F+0 5cmGjFǢO8X(к | mhKvf=-c i8ROFAjb}jt,c1j劮ĨΎ˹CEKq;]hG!:;"-rA>ݸ( jgG-F~#9{,M%.,!FwZ1vmm|C4%F5q )F z=KQ*Bq1z&QS5mQ=U_ Wڢ]~MFӊٱqQ0{Q+'^ȹ*F2 C1{èN=H"nQu21 E$kQ DFu 2٩g4!BFذ8iQ[?jvRFZ 5ӧU 2 H%(Ey)6 C 7kQx.C]f{*QӛciMv܃m6'N2⟇V%A ]b4M=RP^x҆h$Ȩ@g.ޱRR,dԑqcq b/{9u ;kީF:QӟGGM0(9'i SMv>|gy2 So 3=ƠbԒYFtQQQ<T1>eTס.- Ϩ3kkiBbjֈQԦJR2q#0jUTgg_B)gf0(UknjIHЧ'Vnʎ/ g43룣?w'sOnNM5qQQtTdtj7X3Z7SO5XN}z?QrFc7'kFmuipFy (91 եRR3J甝Qx X>3 告?{w{ͨVQ78xO03(F zl0*W;nTrPp4QVah %ݒ:T3zrW5ݳl5J{Icա;=_ s+ *p\VP7:󍒡>)s\pQhÁ&;Y73)k9?8GqRb\]1o\3޽ށ]hJ_MSkŨ^n#0WP(>'ַow؏ﶽd-d6_. ~+ɓizੋӂ1ǟcM_rtg>Qęm`e|=FaёQUZF0ژ1zN ($zd -br6=2 '1j7zcɓ0B7q;du(h(-tGfMF:QU;])m1=1 f<ͨ9* K c#7F/"F_IFɓ1l҆]~,d9;2 ""fmR(&5fS.`T9'dT%G1]C ̋QS>aT0V^< -,c_dGDeFU5 O1?Ǒ [;OӝbʪQcTA*bT5  %Nc`i+PvVet,fԇ笃T0.%geFQ,;3 e>/bTRvvhJG?cK%k7E zrʌ-'A2+I?eRo,*j4fTO1y Y:62u?]Pg4Ng-=qvZt #hheE*} T7p-ǎ.:AqrF|ic_c퉄ޙu#r~>=)>0 t4ɨ@Zqz+z5Fsف1^B_PJ{<)Bsats3|*~=fQQ Q*0,F1;@rd'"F>|ictb[G11zӓQ  lJBtk9?hT1 N˥<~]6F{2J٩cT٦ ]8Qp{bM12*m%=A Xх٩aԻI?FqXTuz**0ꆍ#z0:teuR&ŒͺPǨwy>lJ,a?WctYv%>;UAgg gtYv=@z3F(egtQr%>;1&2e%gt43-QACߕQ:ib5,;NveBFjtYv*UKЯSNJQ4piRT}!ElyP7%o\h&OUr4uT:v X/"6 R9$ "9哥gӪk|,7@Uj AҋemQ}&3S5bU#MZ=%F];d^~j-|J׈w~䊖߿a{1J*HSGFˇ bF61Jax=-oF_.FBFd(Fg}ۑ*;dW~=/j4Vѧ!M0-0޲xÃ͓t:>wA/o/fGFSvn9[\P%Yf=%Tu> zt?A|(i0*I|JmSvNFTM=ɵƦlL\3#)F f0 oèTד}ч,%ٹEJ2ZնgRB1HrF[ڊ& / A$(g03|btԛmW ]^PRT x:047E[kOlhPtJs&D7uM0*qT cR?rL*ɶێFJfa0 ]at-cU%`TgS̃b9ZhxGf3bgQFKgtbR)g45TXtvϨARFbDvU5ڋQ0EJh;gheӹh/FS]QcTTQW7KvfvPV6}1 uF2*g!05hgTkt((,tje",b͎ -[Sg:0!X:66Zʌ08t.cȷΔQICd( L=a3]1juϑbOZj<'2+ƅ(gQe4KVvfT?EFQ(ufx"e<<8}6x5>MчөgQDQ [01 (%`ԉ ppUFt]D2gcQׇRnj4`Nk8F?bty5gYFӝ^.f)>^0Q=[ߣ =ctUs ^Nr' Qb*v1SHfR1x͡:%)YQhM,,~3FZ sfDc&;KGD-`1*ՠ.hSU;3MgQHj'T 2ؼMըn|C*;G|QF ڕBFF'HCF^o5%1 #F'HCF~a]yI/+oXFbFsM\ѯ eSH!SeGر-eR|F1$҅3<(x@Al*>Ѫb4ӧ.GJNѸl&nمs2/kt^^ v~׌ˎa=1 >iHOVR=_kFy9+F Fm 6 :2KqtQխOB_ñc~cQP(,F$Ք(8F}S 2Gaa5 nhQ?56Jc4ݩfPX@S[:gb9Ϩ6J(& ctԬ\yF N=:*qy%O+J-6٩/d4a(N1jÞa'sR] TQ)զj2\ ^KCFLZ ?5}v޺e3Mv$*sZM9aI:hR#NWKth(֬od1Jw,? Wf Qd ~+ٳOvNMG*xқY=P\ǂZF=G0,Fx{O>F HM 3 dThJO2>Ǩ:Ύ\pu3z;FcEj!iF!(5QE`|Ѯ&G*O?r_Qj{ 3E/!W0 қPy3F!˨{ Qt~T;ܡ9F!Ǩm:)]~VFEGNz^g꟧}gf'bT(2 ȖjG3J+a'FCn\G=^}Q$ѫEpghԳ0Uu!`F? O3~Q<(ͬ{1*9Z_Ɓf9FDZQef:/dGSQUm|P7fDy(2zsN23o4ޟˌhgTp~l49FDy 1*9*N+71Oҗ :;Cd$d6M(\_;J1O2z_dNqhizo:p&Vf@:)F,BKx)Ȏ &$vI{69t((k:B 2O0cť$0'@?0* IDATR9+n5gC9:5M/zFw(o:^%ٜ憎թ/e49S_oh>;!` !~JFFϋ}ىQg69c# !WjAyj⫀+7 ړQV2O0xe]nh1'gL0gƨk:ը0ഀ+ P~" s}3g zK?v0 >. 劶2 +x3fQoѨ$OcjT8J1*գL70&F7F+SfUu}9KnTH~SO=WJgEgA1?6*d4I(̎$q[lf,"XaFnߔ-AIв|xCBF <1z9(?Qu|"Fn~(`4ߡQaAN}ܧmX`D>Ǩv.gvͨĨ&C9/V` 'eӭ3:=Djƴv`});FF+ SL)FM24 ~S:=h30tWj`^<˞,F`Wmp-U͎էX. M1ZjU RW-gKPG,EcL KұQ_XQFPqhc L|`'eP R6)txF' KN]0EE%_c u3%L"eFaޮhX&%3F{3 3*U9D}1{clo`pg)X0u140:3:^1P[癊cTTS%C1)ըN /0:3*")jxD4dѐQoDQ}jtƨ__IՌ{LR*BAwDb&' u-EGMWiQ2Fmr.ā Xu*G!OX͎ͨEjH@iQc}uM5H_rH;1Z<6'3^3*t EBcI39#^Wߚcj5C8+0Z<6ԍQ Sv21wk'@([" zH\Pڧ]'RE {OԩOqDOzu*U^!~ <:Y:R*ZM]fQwSlv=/5hjbFT ʟ=#=-5 v }ģR4$&S(څтg{c3ЗQb|3*Lg.2 d(8JӌRvQPQoGARr8ӗQbQ_'ṥcB]lQ7-؅Q5(dsQ 9Fjف2Q^h\V}2+F3*gQt5ЗQa}'K;1P(E 8`P ET%^, -e4t2d,fN}Li=p/U;3af; 1%oy$o)H}KOŘ]3 ݵ;ϔbt6~DʎY#F4Ũ ujN@~oP*[Z:ţtL2%l)8Y(e/r* ONV BBMc\f F/0t+c//-VUu'{j]s͛ΌYRF7Pͨ3TWOԗQ<%QΨY֗QZ_hG2ጂe<-FjFa¨0:xM _fT/+5yi3jy0:,%KvdtZF<(L[ ՇcTףE)G/XT3jzbN܅сh_fT}J3o'K0vg4ge59FotQnH;,3TwFM=7F/ƳŽh4ϴj3j*,0NhFi~c 6F_,,PP{b:ZŨ gn)Ξީgh9ф+v(tUocH7@JQL)j?yFU-#-u<Ծ]| Z׌PzDg< NyZTbASNs!\Wu^òt>LO),F աmxC V@ok9V )'"¨Qc*tҀ/ 2(^so(u-{7=FXQZQhg4"DэѮR=lFȀeƨԅ(H7F v[їh{5v%Fp=2=Fjt~1dcg5z?FתF1FF0Z0Iݪѣ@sΎITYMOR$(=B38vX5K|\1(/HY*1R?Tk5o };_~ XJmg{EO%3F6!m -7\VUh!Sy=F=zD>>b 0IFR9]Q}L569jt)`\sЌјQ|Ж0g..}:XF(mvUkKuJA32_>F1V hE_Y3ЇQJͧWfԊ̓ F ;0!0Q( nQ(e@! Ռ2 ՄՌ½f[\(RF`T5g?3 Qo1U'8PF_/ftBm^e2ʎAM /q 2OMRhpjsj yA  QڄmKKp]00c (%FV:r^B @f2o^qk;Qh@dt$O&E~WYi WN %Hp(:(RfQL>("bFA`TW2ވ&-cT6x9F]-)Fph9BDX≛ӌFըfјљj1[ږzpT`ԎjH)UF3k jyw%%EҌTW#3|`&}®uMF9.\ҙQ%)V`u1^`TFFu5 2 b,h\`_NhѮz}t?3*j*yXQfю(vA{!F0(]d^5H}0 u}ʳQ(cԛ/`4{qBhsV0TƫKtSZ)b \]U%W .eFeG{0:uQx;(-bB!PЩ1uQtL^5`Tj^`Q0&hFVfdG1u mFըB42S2ʗ>a\1x%uRzygv@h}IMpcb›m}V׷FF/=Q`X:x3+ j;uޚ&]u/#9: O0!N=5QŨdCIfvRiD>$rw08jPfeuEQQ\S5( X/W1)Kq=;]ٽ60׈~1!0z1(nWɨw`EobeYWiFo e3Ima4tTbNߓP'Ql $F@3I`1z%'` X>̔eh 6eC2OЕWQ(gԵR{<UgBc>GR) j^#ktѨLW'ѩ[ Q9+Ӆ*gyQӱ:NnRΙ>Ҍ*D9Q! zXE~>3N5J To[)XEO+6:2:yF!=Lhxj)+]g]v1;zk&b׍ (.uQw}zFgLBF);vIF!V4dT ztd4z(K(A0)0N\LޞA'Ϥv #$QAq<IA1M4 f9tqɹ6uQOx޺|<|N1.NPhӧ./S;7,um6iXX'w -TG0QxEе||3==-b=O:3:=dxY_/aԽ4VQx7%ȨSXE}PzU_Պ>ө.at}è06څQՓä".Ҍ>}X5==61H6x8Yhtp+$vU3 9E[(:A3cT#:ѩd%ъ5yQ)9zP}0t44[N=R~1z8hĨVt'+M.U ѤKdF/Ռ^M?hVvFM^b4temQ3SߵmRtQwF Rt I1GF2p)&Q=\YiF[5?U^kN=j0(`hFѷfu'ٞIN=2G`t((שS1:3BHQkDi:bBH\,-|ш/x)$G734,1*Sn)h~l4XπKPRuRDly"f~~2Fŧm.ZzFsߨn6N Q+8t(8O`TPaui Ռh ZՌo1ZW1Z,c5jFS z2:]ƨ)0s~ShrFm1:5H bԿ0*((F!ϨU6io~#(~ [~Ōf<>fXdfEJ_ CѹgX K=5o3/(a=FbbFFݸk :J2]8f4qW RF;iDӇrFy> ث/F{2FQuT t}ѦjPcUB9j ~R;(˫ўr7FgW bS)RIlHs[FĨREAN綾-;\>S cԫG9{ON}OHJ":Iz{ ftz􂧓DΊ]7 ∸)Fm7ʊ<%hp4YAozcd%F,ZBF/QW1JF.d-` eݻ$uPh~Y(5 h5F}h)3 hƒeըT60jC1:3:QN6F FҌȌ51^Q(%gQySQQUbvaT);3*eg.3 vF홧Ĩ%gЊNb4A)OΨsF}OlM aO* *<4w fC,9=)b5qFn-.;_8LXǍ#SENcT5 Gh&3jIF?(DA3 K*3&;ӾҲ RN\s9٥yIBR*sexRy^b_fM;@@6XEhx4(^NI(M e؅_f(1z^Ũ% FUFJ(0dg%FF@}bEi FmvQ,fԙ)3B>-({9(%g%F ŲN}L.}({r<3Uh~:;ƨaTKQs:dtF:2 ڋ63 0sT=`ѝ1 %( w_ 2JkI+;&F5D!8Y(mZ3ᗌQha3*?(?/IQL4]h^}-̨FΌSƨՔIGs~ Z(Q ZQou[oFTuji~-Bv:1:QTS2ʒӗцZ+&/pke ZZL+!a&@??oq ;fOt>"2Cvy,-CJ5rȎLpa,K#(` +[TcւxػõXqo71jĿ`hN̨BF`*FnetRBJQ^0*Vt)iCic4E;R!F(f.Mc;A[hv[5KjQ"ڟweS_ʎylY(}1:#jKDvQܐ=?Mv1FSߊbv p?[~H6ydEJoU cώACi58P[*0*;yKU cIvJ!k3K)7e4HLp_<6*f4ZB+$QS1FU?8T`4zn O"nVE;0:T1j ZXQT#/k?T1juqjuYUWF/ ctbrD0\Pi1kώ1 ¦w|1:40JhQڍS(+EfʾC=z0 =hUWcTrтr4;uj@j4(?̨Q~Hc^` t~ j4 QTrFurQtj4h`F?|,(]AW &Q:ZʨٱxU7Fhs3sZcgJ/,ԟvfUdP(⺀ьMzP+3JM-F(W7"F ?.gCv,}`[@|jTHRA.,'>Ǧp_5M2Js^0IQh CO10>1?oT/gpTF_,`dNQuj+GjT=bb&;xkQe.FUHm(`f4_ҩ6FU"F3SSK"K:(RFWh3è0Q<3/at)cvǚcEF-ԇh0?q=њxN7](k9F2F˪ѪdS`r53:2^[Q{Mf;p.1z(eT(F\QLw3qk: 0*_Dd4F$u uQEtH2;Ϲ%3.Z/%0z׉^$9 ϏHǂ3W[:;.ӣi%$ 755&wF$_PdE5{Kp?=vNnjnɎ>0:36/2: ~W2j_)dt`zu١B3:=dUFdؤRzzɭMaHؕ_uQhhKrD8EǧvdzJ7tQ0*d&yFA5-b>;iFO [Y(Yëjцf4ٍg=zXQq5T!1Z K1߁Q3^-b:;N/02 p2J_}:Gʼn$Ψї0ڐjX3jFQrUZGѦ윀h4$RT5JDgjTWmzߚa_ dtB4fZ-fg)>jԑ9 yFql4dFyrfg'vFAg}JqigPʌj{9FUBFw3q2 c3U1 5}_39SVŨTl؍ܴ%FSu@ =f.Qdӏؤ,F頥9FW(0jj\嗮_e'&R¦ѷĨNhjtnb+pEeԈå#uꃓe.?iȨqT=k:1}_pl4(N}NH1 O}F/Kry.k05Qcu1zQ¨8q5vSK/M1Mڱ 4DaSo#(QhQLn:f\T`l4(e'өQ=p0/V藴cR4PRt(fK}4F H=^- g|FyaiQU:;܅+Ǖ(;؎u~tk :}J8ufgW?cCu8 jUUDsEԏjTfa$]b@w{ G&KuT/9"`kf)h`qSqjJWQ=9x}_ݗ|5fF!ї>]âz5NKeӝ{hېM:;{f!^@93E=F1 cku&F~Igl01 ;mQzan XF!\3;on0:DLt1VFDQ L|F(5>FPvDTTѦj u I1;軀Q=9I(DM zpWpQ]RjU3_͊L0meT|_س b_U_wrܾ'1c+ZV>-F'GF_:Fժ+։ƒkbtyn);8/hH=Qb1jFAsF);PP! }&;.A!~[$vl;QAjkҮMw,]1D }ʨT~5+Y^cԭj{(^Aep-&ict;#K/ `4FQ+3Pv0z/؛QcASLB5~(fg9F=ըeTذ ˟Cd®o5X* o P5Q3:b{!B8f{eM{X8>^R-¨f+@<#V`.N!&;ԤZUGF0j^-w>94]ώ nFUi`MQ:TG6&3>ZRzFg*et}g'tgQK3gc)gQ֩/fT}<`-Qw$ѮYĨVQZFºN=/SԎB2z7}`To `ìI i8^qO΢Wɠu0:nml?G0OϛӮíF݁53(FQK/;Y&"|])×쀵!)TQ\v*|cj#E{/TU辻vܼ(`w,CgYFa48n)#b SZ,sg5+Y09; 풵<2=ѱBFF (8*>(h˿hF?c)mag,`5ؽTcѮigwbʫљxibgr0kF505;FgP(jFifE G zYQ)f;]~1J51A5}JEQU+99ם,7qs/ *1_ɼ\%0ʿmx(Y4d?>v0(w#t}3I 13_ $"=y LN=N3}jFk{}cÎNGMvQ7T(عSXׇ(a.q]ݏQ? <ĥYUGth:fTW7FQ=c$>Q<-ǎYGct8uM3GF7FgfF1(Û١Q`Gv5K[rWs͌b(=^0: /<F!b;6voO*U~wW+#t6}uM1*YJo^ #1`e4N} 1$=P.MDECAb h1eYA_$#Gy`$=.ۤ5]j뽋y.DOiՎ =42ڥXQ=^jGF{Ԡ-Fћ}U(sMgmF!\Tp:=Ĩ.G(?bFa70g!t|{ 4FcFU8hԣ:hCF,xzl4ft_hݾ/ "d3m &ol<;aQQ`ITF`T>'H<.s4tcwZt_oYNGyvrn?ϥ(:A߫fS|3L_x78Z&)A:۠c10S=NAAO.rtݾv/enet.cT;*1 ;;`_v@gg(aFGc-enhw 3:2=]|Uo䀌P(%ѡQ039ѡ甝`kv=bTm樓&ѷN}sxITŌ&:B;gӉz\v3FMg1jeW icwvN}` b183av2z#wzT82:.fdFYBFݑMk1=9vcA 4mA׌rt<oR})FyF.ѵ3** 5)-`U+",o0*g3+gb_61;慣b'wg22'= ykr\.MجgNʎ3W<X0 7~žIx>+IR>LA{WFմp=0KқGT&N_Ρ?Eoɦ7A~qN0Owtg'0* 0 z,ƌ>16幤9ʡfQqNr>Π++.Q*!QOvsT5SwQV;2 3 ñsz2:ui7e17ڶٌ"QwhWFОvs;Do(Y (.dt:3'}z/WQQ0B:-9+k4߸0e3e~VQ0q.2F6@>ӌ0V×:ք'=kgӾM0>:>Q9d j1;`ؤըY(*IIFX(:ghųނn0_2FA0 aFScNc]_('sFF08Ȅvbtbv(ae(뵕}` 1HXFU_X2FkQ9wTaڜѥQmVL9勝qFvx\ Se((w'>:V/StNΘfp;u+e 6><)3VQbNLU8 OfrK} [av? |TPL~IXFCP]-,"X2e_'eG~&("R#Wb cMPg37рQ=n*,Z1*=ٝ(s23Qt4(xo9(/l95sTb~Fur&2 (`aT+&THQ20n]}.֘2J~ְa3:FQ1CYFǘf-Q|b|inX´j73z3[()L~} AF!Q/՟Wg0ʣ[b 匪TtW7Q3Z?ZMq5#HGQRyY(!G6N4_NўǰQ+AږڡN敥ՌTgg-ӍzS?I}-&@-2ʆe٤7? wJл>d+k*l[NʶD]^3N >pX|FQtdGu Wc9(h3FEa'2;S-F`&4}]чQpA 1 MtQ5UcFEbjԳf4Qk;L߄섫QO3 ,cfQ<ؔ(f=Q0QgMeTNUNa|F4VޏE\F(liFcDQY~Y(hkFՍRF2J]5ŃMYb5Fߖ2Z-h`Sv>Q=Ek-liFchFlFN9>fGp6;*RFT2Jܚj[a}fti],ⱠŅ0:6pʂG@qh!ۓ~jq+N3_O&BQig(MgL1SC3Z,=Y+uuGzwq'2&$LqE0)kOc*tBvvш!FG0Z訙 :Fч0Z(3$Qe<^l1J8q< 0l'-BGwx1 aF06}cѯ}8Ek;Fݷ]u:р`Mx6gcvoNnרy"ȨRc{iӨun DME3Zݨ{U}4l\QgSeљђd1j7Fgv׉0qDUj F'(ZhmvvQ ẂvZW0C=wVtǨHz^%}?p:C'XbT<@G68R OeҖLY7`םQQ߇g1 h}v tFa6F=#gg^FiSeą7lGͩ(!ZM|ӰPlf'(bZF(vvI&'Ex f*;;# 6}L0v e#)9o1Pf isF G3d9 'j3 }3GgbȎR6e'Sh95N2jh_a8Àlyw08 As`iP8ؖ>0O볣?w7WJ;(E[CGau=,"MFM9KdT-O$$4is>)]? ep}=!90:b4:SAXd]\ď]֟ь>Ȩ\*2˨tt&FMv f 5,@hz)݆([^Oc3bXhzi5;`OetF} FeF3f>dwQ߂Q;;Fd*37FeT1ѭFЌZbOFqסٙh*;ͨJ$Fj4̴PCݝ1: o cM#8FZա`a%5dd0; :طx5BvwRgӧ XHqv(7__Ug3mef#eF3J{2/bfKV6e4:ԁQިSKSFkte7K1[2(oup~[F+,2ї R(4c42{R>u `OLFh]eMѬ=+Й^ vXkAVu2 AdTq*0KuHꈷ:irvx[$AovQj$тzIJ 6MΎ̻8d PqBk?u}X7}l^fA`&F"F(FɌ"}'3:4et|Ծ}vqFa2HiFeB-#=9~o3!~.0 הQttvFS0*:{a߄Q3J\ľ3G7QX ;(qnhF.le5J 7i/d'RVf0N0J4QF0uFwQꤦ6A:?/8?-G7Qas@4S@g@qkP3_Oy5ͨ=RnFD_希ɒ:Ѷh4;Ռ~_! EiElОQb0zF;d^sFa]vNsFaMh9.Fg1U:T~F_N5!; ,h$9[[z/Q??ؔ_ݸjC=dg`tMhbשd3N0+S}@xb:w$?T:"4Yxg';:]Fzj';E6<J[=Cg1?cLJ1y1ƍ̕ F  ϒU͌HV1?ծ0*GZ 5bv! ;̨h&dN~]̳f3Y_mH=@'Fa1FgU ;Q.9Ѥ[}[m}huӶǂ:2QO&h)è?Ԡo8XcPt*]TK<`/zdPNeʎ zT|~I9\߶Qn 4Vw?iTҖJ*ZK>; 񙫲eC WKi zfMՅٶY-.5iXv3&ʌQfrIqʃ-*;1 ЃQOKz؊fTvjʨX3WՏ6>F0 R.30ۭ7j`׶w*A32`T.Ư,;}Վը3J9ڗ+}v:m+IKhvQ:*l=CxwGK (D_v$/UXQ*Eg 5\obaTiOy0C|JĄ@t3$h nYjZ Qr`/14;u12;;hz6FY]#ƓqG¨Ѽg3v5اe37귌ѥ̌X{(;a'F%G븡pPx<С,{rZى|XLRQb{{ױͺYhQ)ڙgfMv;'2vh:956}+F}4gt 7q~a4;h(ڻ3'; -d| 2×}ӼQ?{5M`4<ԋю0Z)x֝BW,x=GGfD QFQ(eh6`4̎uXg0F Fc'6btv2ʫQP9څA0ZDUF:(_H10EovMve FC:09;2ޗѮ)R4mNd~SFNތѻs1Zfo 0EVMv(E2j;ڑN ^btde53zF|;;=ђ.l1uB] [,ƞ p Ξz?dn /eup pX0 Ia=\-Lf=34tQyB(2}A1ф%3%pyRl٩blG+Nl&jǮδ0H˕/Mv}d0z5ZQndhu5=;Jb}iry=MTSwdrk1 Cahyvhŝщ9<;(\bu10.fgaЍQޣw{'ϼhɌP8eg*.XX.8?vK߼pWYJࡆxË븤^l{FG! z0|;;` Z¨ Q-!JtQp|)Z>zAFS1҅-2 hFhQ(l/s!umBOFMb?2FKI+`4hFo.o#n9ښ݇[N?Fӵ4F>RߑQцf-7)9= 95; s/gg.[w<9[g,NYw6joQ(u?<;xr6.CXJ(OPkiiwF/~z/ȴfrW-u6F윽w F3:y0v3;;mg4=´01jҷ{c37;=hߥI)1z-,Ռ E ^u;-NyՌOatҁh [[;.Ia) d0m#z4Nmsy&]ް[dF^N17d_9fԹHY{Ja^EZNhRͨ=vd0dK}&#u FR(3YmǨwGQQrڨFU3yOFhA5dQbTF_caty%s5]QߖQs'=wg>;(SW~.F] 1ӨohG)̮F:k7bvFoT IDAT(*:2R~ǂTԼ(p#FjZ= "92r+10FegюF2t)=?wђ׻׌ªg(u*JsF{BhYL(d4\eWr]Y3:a?FάAzuFf|PؽKlASv1;4B+,R`Աde{l+.ate^,Qny gtty5o:(;$g̎q*Gz/, [}dN?$誎Q(^?bGvƍ;x/V3 bFG1 !Fe+$\Zъ!ؾi|;uQZVA  }OΎV Wv$ښ k;[ٱoozW xsc-7}; 7̤yoe ?t&蕝F1_ʾc ykwAgħä~-KIc ;&١~rod Fh5l;ۘn51&F6!gl]KY 6١~roe/2kAqk){;[qozX&A $ ]Q(ooC:J-E49l-KN87$ha_7"0MKߨO'v&GMί'F%sv[?f0J/eS!umOC1ѳ۶fٱ eGom&P[ٱo5'h*ا|b2TDm}~}c ٱ~mmrXٮ̐V1 Zc̾oy30޼v14;O׿ mgrNX[#Uə#;֭K5Z(c|0vΚ| MAmEmv[# nӢ: co%gط}LFp&EVPE .M6Ύw82LԷL=#%gط j>CXZKL7z^r k=P62:;Oo?gmrܭ7nۚ̒Vl^LcUgP'"NQq4?uv&mI,n%;X%9XݧX%;X}%;X%9XݧX%;Xct%Xb0 F< 01wŷ$zѴo"Old 9Q8yz-Tm#`tM`u';u΁,)T No6AE{`U:G©LFyr֝%|(wv`V[s`-Zs0e1Z?]X >o(bp_[fg(ڽUO$'/V5&2mӁ0j1EMmyڎ;;`(+Ffop숽➊@-zvN]/Vw1M9Fp?S~N(QF032; S䬯(bښka4,qD_n{V  ylFv06rv&f<&:axFONNPka0DT>`Œ`tzGX ~&V?Ƞem_XP yO}֞=Y mBe?(ԇ{V1]5|p"3NV6ktd{X'AFrm 3QjF&eZݞ>"%_D%iANQh4&lFg'RVt=Q0v\FM+QQX7dT*~_t`0* }cTVG&=F`4=I_NUcA4eϨ1dPX$5p 9b9*JIʳ[Z47;بFuOu+%Qq`6=g>; ~Ȇj=>JY->+pTkT2.<4-R3:1zq]QW`( rYTwu?;Y1MQ# O#2On*{7gMǖ;+ߩgnFH0jZ/E􊚛C\gwj)w5FKjTW:pf=9[VhFl#x/Et?J&l3i1V ֊LF7ǝr&Zbړ~Kr(ݤoΡ(mRv S"͜Ѭ=#=R15R2*9btN2R2jԥ1F/|I6N2ZgEku Fn7y`QQb>"땴atwQBRwD yxk܀wΓy%S((y9χy mi lL>E\ud+ZQF_lj݉e$s^I3FٸҎ2CaFg0j=!ݲshӺA&=v~ɉhgF=E FX]}_H=vn҇YBF5 :tv2=Bq쌌>xPh-Eg߁uro(QF;v711SV^Ќь0ʯ,O9̬)Q:skdIϨV}`UVyx.ӖM4>+2]͓[v(}jTwfئohFr2w׏L~IlhctUɨ8դHSp7,OxuhFW^}ae_ś1u-;d!Nh6]{f'yVS~]EvAIl"󦈁q,]E'o񓸨Y`~rncrS/E()D.RRnՄQ eeT:}:-;m $LOQtY1Qh ;WBV0z{}NFC֩>U>~.δ!nFc (f jHϾ8C'h ;~$ӹo4hXы <=?뭵:FhJbTg귋0  ;VA:yLԞQV1XMg4/;] 6o45ъka4|5zFad,b+1U2 AE0z$ud+GŌgtaF>Z1z:x}dշRdT_,`4>+ejϿy#EW^͘~wN©c6z>+(.lm(t`bN$'Qq`5cSQ/w1p>C5O.7;5RC=sg%+1etctxV3FՁ3:T3ZQ"zLp7 1t,%1T\LA=KUڊѣf,魑FQ4*4;3'AsR'dRLI<;d{^Y%B,SQzFZOՌ&7bT ԯ7;b9j0:F;F3'8jQA_ɨbZ'30Z,!z r3Od=TRow G9=:;١^JF}FUr*eOor`q ˏV3:g{F%w]xn_pFPVRNeϳuvDfv8Vv$~a)JgF{f;;=xL'LT-F #wN_J_u$5tre(uQaŨ( ({ITv\FYh-D7Qizrq1*F?b 1zs06= u\FYh-O񗖅gЈDvQV.! ftZ>F4рSeF:R>ѓ ftiԛ`(z1cN09[$)]gEd' 6gfN+ʨcF1hFu{2FOE A)F3e6އTvvQaL3 S۹^FGyEvFEO1G(WbJ2NCF$1 6bI iF0 )ȨW#kF]'7j0 rjtѬ]gGd0'<d{~Xf4;4zQ<@9s0jգueQZuv]7:2zw 7wfXD厎=>Fr:;˨(ß4t?1aly8cT9:XV`nl;P^yJa:X(ͨ,F qn=1q`TQpuu`=Q2cc1 f1J0V?F]G:˨}~+F(%βl8ZŞ3*Wy*QQlzFQ&` LmL6|F]'(VjՇ咊uwIFE&Fsu aLHCLˀ0*,XvvQy9aGǒ?q-=RO6~0ķe_}b Q?{},#}4Nѱa1a34EQQsZxv|T jQfT GBf(a0+3Oau"Ĩ؝qG}X2F1Nw"F>Xfԙ:j;j2{TzĖy*͎<axv2ь^S^cb5Bu\\$N&*9QSѦQ3rFY$=FfwԤfbTrFH2ST:L/q?EQ n<"VKgg`t[F=ը(/1 U}U2ۨh{ԯE2 Q{D4;{(jǨ$&(1J2~eǨRM .MdBVy>2j8JNr'0 iFY bT2*/d"ԈQP(Ut,+ 镛8+rԶT^dPx-ð$9U $GUĘ<~g&QْWfYODF#:'&q t-eyL>:.WT3ՔؼhFHi鵘%=b|Ii1z'4qWiA <)Fq Wq;(2o aTHvjP(!٩`/aşf`4\k&*I$)e-ĂttehFZѭ=N BR9_-(xBfoPh>0ʗGEsUw.'`M*E3pQ2*dA*e2( y]~*(?R`ZD*ڞQZ^q/A}QhQO`Tͫ(bt (bFX; jQS5¨^,b4%N. FU`1R $\FbT(+9]5$zHFyr&1*EICFU߰qb'67ιK!=;3TS_XjLQH1fz9Xb]ZohAy7@nBǘBbd3MXZ q\hP <%C_}=stiR`G 1*-$9*;hYt2/]\E0ڃRٰT3:ދbץ%ٙQEiQ6}([@^=|!őoE9 F[Q[h;?gftXT3 d+I32VpIN|EF潵vsvvfd *MIFM ウF^>FOG$fcVoTFgΌrKWjT>pI* 05}28g32 ePqFm:#٢~)0 ͨJ1jSWp“ufo٧g,(`1ze42̌JCMG)Fm:#4)4{>$cjQ}(3G{fgmoC1 Bճapo1nO0+w5th,Feb/`TgBeݸW5pvQq3II:(X(nR>j| O(l=.?\~ >Q` Jw{.hc(~nQ~HJH!!P^2蒹E?=`q.p p"6>Y8:R+xn *Js{uZH,DFg`CQ%ՌgȨ7:#:(+G65Gs cuyQssJeie*;kc,ȨՌ7%0 PQ>#8ԑQw~>F Gu ѧG 8Ue.;FF/|Fev F>2UӜJG5vv(Fo{`Ե0`8g3e;6T.O`T'}oFy9U5aeTgT(՗Q\*.Äz"x\1֢fR5mxǙ $Zv{eLN~5>S,i<24h@Pʫ=RiNu -uco[}hbkP1hQV?Yèr)p/Z0e4b:%>cJ5m(tѩ&wߩza5Q\ n(fwbH1Q=.L"F}5zO &GNgtZrhjTͻMM: AFےMbTMy3RFhKQl1E@i)eVqS:;kbTMyjĨ}6=fT%d4,FQf}&r[ O&$zFjtھS(^dS0f .rUFV}&r~Fmy:_xB&)nP=k} uu7F̌ƨqtC-F[1{E%-hZt5ʶ;]FegSQΰIFo6luQWtv1JWjF\F Qh脙1k-gtJvV¨uẻNT1TA3FFQ6Sx{4-여6$dlwz(%6dnjUGs rVՁE3I~(Ku:;w!H'HO[Ћ=|\w8 4'9zu~s?O *zf!_S]goQ ˁ`ֶPthrMv(RfEߕ3d'hFuoC&Mbz[Us̿/l\Q4}aJɌQn%>73c\?dNF(>`HLqr *Foeg-f9Uh0Y:2c? jFE'):Q9w7ꃌ"qQY!z Q:ъ*hGF+-tFq]b=B8;,3uQj(p3N{Gl;x 70롱oبUiv WP(Mc;}A8}<'* !AZ&;)Z1_].* cѰegF U(~1zYa0:BΞ0Q=18шeof23?Ψu&+Z093jf'QhRVE5LFR(F雋-VT]%g;Qhhh9XgmT &&z6chYFCF߿H{8(b+x~r3Qj߳iM';/ /??"|x;~y PN`4!OC'4 \'F DRMv]TvI<3o<r.Td((톈\0:js,-yQRGP*֠an>1/R`Y-(1rg"b7쬕QBZQ:$h:;ke42F3 )Fٝ6Q0 IFJ#㌢9}Uh匲%67M1c) IF9i#Ҍ"d9ٌ1z(C4{ޮ0ړQ\^1:4`TMaf3zb6b'ըX9os`tH3'zF5:i^s:FÈ`^1*:(:ڌQP#TYhQ/ʙcpr 2ћkԋ]g͌jG3SU& Ey`wI8Rx^F]7%cְWeZ qf,!JNA)Fd9:9;:;#}%wg=Ug^x,P(Buv=bT/A/A7Ϩw{(^Y01Qp<2`4!STWSQ_"Qe45ZQ`>K$ݚG3bTU>0¬F%Ө³ɨA3:::}h,`Tק( HF./?;h&0b1z&`~wgtF)ڒQ=jZ_~m1CѬjt͌2Gur0zd1:Bb4]7ٙm)zQV:cF-FݫjtMmǫQ(f479Q&h07`ԮFG:F/G(SQ(ftoF3AU x$Hy/)H^*K2 ?#\'ui@vRvaFQeitKFͨ}F( 9QNCpQ)S`xgx~Q(;]瞸=ﱊ:j2 M| OF昝nhF gr`(eИ :`tID N3ʞ`Hgf{@ 5س$'0?LGӌ:sVDfط8tEh2j|HY޶M3-$uQGQOR4( ft@Fǂ(%fri˫p+fRhI5MfaWa 5fk(N g4k{Qs,FmVFsgaurvPNzFֻ;2`PQ>`?wS9o4hRѼ.Z}N[>QcfdXQ+Qw1 IDATsщF,0ZQbf4WHaFbv>88?DћјyfAڌQTEoFݓڕ_ͨqR=zoԜYhtf'g y MWb#ןɯ?oo$|/D`XcL |9-1崺=%#3,&BPB](qocqpΣїQdT;j):֘5g˨pB%¬1 .fԻ&0j~ɨ?RY&w6?}?}< +Ok YIl“mv!f4(HlG[3 3W*k7Q́&F.L3j/B2jM;mf/~+!*6XeMrhb*G ՓQ(xըm e2~߁Qm/AV'ZjGg`LGChjQcӦ1V(g1jU`j9o ..F! SߖQuuNYFa$d1jṲQe:T8˨HɃ_S%u]jCݗmص7ݍ\ 4v[Xqz"Z˟!(pz dvA] AL>2}dvrW 1E QF+U02z'."BX"}KDXg LKk [6δB&j2%P|9~?Q 6=Pb؉X*; QFo~yVe/jQ%ь Cه%u(A1>iisbF2(2rr *F'FiQ+2i'ӭ eT0)Dm-=ĨS9ȮE.YO!F1*`4;$?bcϩ_'/e#Fs$}R/`1YQsU#FE`Tg>ӖѲjTuNfTH qFur,vbU=$$%ٱ@3&PƓE(,ѩz>;F#Wm]щsFpv5!HIF[Ug|aj44f4pտSذ8t5^`іёи˖`/i9o\򊔜g47nӎ(NRiĨ6(=f%"潤{(oA$D2Rl"pڢl__ak{BHgC69|XbOchdjeg*9xX?ࡤ ~;n:'޼JBA1XE%(5Raz׹;fȎAsRzPmKe!; 1ʛ"T2j_׮Iea F#:ԜQoϡ1(i!XBƌZsS G1OQ:jf֌5,FŁe0 Qkƌ2F!;xFW&*+c&Mfԏ8TvdI+Fڱ d#+; Zgg+R4atZ=1 c UђїhF=:Z(zJS 䬍ƍiFY1³ǔsmިd7 Uђ3b~F=\=X!Xj =ёQb6-7*ӳIYQ5vF.ӵeO2 meVR*WzYH (,N݂69urik1DQ',?DY-#—b1t[Ӛ³gjFHPG3ROIeT,:jc%@1JXZī(!E8WP1Rh؉7Ñ BJ"a0p=(a#(Yx9(qfW'Q;:yOCQ5GŨ#h)NUd=tųnFYq o'nA3Q(ѿ8F4fT:[dFuvF+~z \1oaFoCVF\ͨ_Q0U]0Z-Zg 0d47ʪϓ&&WvBF^gg5h(d0jߚv]=K2Tӷ` D }gF.c!?J?Ț?Y_֞@j[J uEA`@0ʍ@Kotphbƨ3{iv $h czh1#X@1j[Z7dT5Neղ{xQ _&Ah;F8_GF1'?Un NǏd~dZ1*Χϩ_3T1jbZ1:& 9mѳt5*FӲ.ѧ-i(~}0zCMO,Uy۷wћ-i(~M*¬œ" }Re0*Z4(.3*qj2F$27ڎQ\;ZkQp&H35 N@|3dL%)|<#V}N?Fi>r F)KJ2:bPRP8a΁{v_=B1JXjf(I(^|;b( Y0zz:}p:^ ~689UJkPa(=F_NgtgT$`c V$X2:w!&sI>= 0WzLzA$b>>J.1:Fn@ّ@ AQ tF|F3?=M3ʯt"x1*ABbtS"7FK!VPN0!T0:><+a(iiQ*XeHQf##E4t~FyBV/cT7 6hg3,rHSre 2G_GR| ~-`.C]F_ff# Ό0ʟ _(HC)F!ΨS*:/9)Fe2 1 `~IFaFFFk!XG y>Eaj>`ؓQgQh4w-cfd.Qh?oT2::cT*fdTU;d1 ՐJGj>w 8{HcȧxJLY(&AEpϝtT[*h_at~@_"!Fd5j@@\I1:֣0*ӂRE5PjE@ȷ0ڜpbjrzuz`gwQQycIF!QIbH0:% mUOҨE+¨NN6sZyHFL 3z3zW)0zdTR*=8Vfcכ-h]9ZSbT)J1ʛޢQO;Zhp(ѦGFe׻T`{G0_usS%ѕ=/c5QŨzQ hmYӨ0Ekt.05Ѩ{GUɗ8SըVzu2 Q}{SFv>Zƨ]Q\F4ѫMU}pJ3d0ھRƅ"Fh-j0 $ը&SǨ7$q4q47$w1<GzT-F}FeѱLK1*;F\Fe}FFۺ%Q0 $ը#ZS.2¯2CX6xFkAr1 5Tߦ*WJy|ayOAw _0X-B9vTXRC$T PQO`sSw~QJPE|: u`Uqtp_N!S|2q~:2j=׌'rs]8!4~շ; x*@#%SPʦ1>c񾠕(PF}F31e {4ȥ~AFoNdA3bOG0PQH2jpĿC9fӍ06*E匆I申91zdByV% *DL3dhɸV+( ^5j0|jk\`WFC0QA1F1i`ԻEr 1Vӂpn`Tnd2j7cpŨWjD'0J F)j}ӌFnfsf/'33K>ɨ 0/>OyOEWFo F9Ad]ݺk%ѻVW^pF D)F3cD*~]fTO|}p*>kzèS;5Se8 =cT^DD%g7ֹ7=@*;Ύoݨzچbw> b Lp2 T]mpYcM<4L8X Z}ApðTԦ2(9I}Q֌rI}^( %VՌ#.eQ[ƪўBQ' FoCVIZĨ_^wbT:d8LWE"Btam5j3$D~:?aЬ&0*/5js4`5zLWeT4#js4`5jU9F`^)(ݪ/eyF>lj!jF|21J1 3 Oc92jI2[=i(/{2yJ1jn([ę_oyMf~xu$'vbl1(~ؓ^ Sͺ>ꍳX/EF lԶQpE\(:y(=<yy+i71JWGܐϝ`dG3{c:zqAIOj s`T[ʞ̎1$Ÿ USe MVvLF>.cTNf- KU3b8z8=N5Qf0hqKtۅdvz1bK5ʢQ0,QQ.Fx2՜Rz~I FiΨXlQg4ʨiYɨ ֌"Ph5Ŧ&ɟf2z/(ONsF=KیpbThDXI¨('ֽ] FQ~7g_ zFsU{BVuc`h(G"U T%jTX FӚP0f>KB=:;&A riF5Q T-z[3Q*ΨNNF-z2Oאe&0j:ui%kUޭg̎In0J(GxG j 㖂 3oxPT]߉Ƃx6#E۔AF ڝH}f^iWVKiJ]fu0tR:ln* =1uG KQū̎ɨciQJQ#z 2x1Lցe$ca4QF:s?Q a6(SJwQ-dtGեZFgC%V5 e:H37Q*Ru/ΙP(Y7BFO[3Jd N xaTסAF#5zTr{(1o(èΎd1o5D~r6suIAȨWB)@2 dTVNaDӊQSXҌκ3j.ct 0 I(y3J4[`k'UdvG=Fd Ҍ?QbF &5B(hq(h*XG)fT49n!F/2 N>Q`y)k^`T.gof2:ߋ:\F A5x Tqx~'}odmRJc F%^%JѰ7Gg'/(bT옌:=usO1 %@v25^7 :?T3jI,9,UAT $t&5΍MmDQ?ݹK |@L@v( bW6mTh@(!(Jߜ j:FĨ(D(F-rm3JeFLN \Q':>|FF2:t(8Ln2FQݏ2% bQ5vof3Jtd&0S脌*:|F@')Ĩ(B-at~49I|6eCL:9.RQ~Qq(1jؠ )3*&B-F]FSoMoOj*@v0 &pٌҿQO(bTf:xTpk3 uFC(FmFe2N}5 3 [eO-*F]EjdFJ/jf/Fuh ;atrݤs/Uտ(*@Oby0ͨ3"trS9b=m#6Ho Oi1N*RNMt 83Qla#fv4n9Vo!(zh9j0F'Q%(6陏*97p(g0jÃYur8s!2o{mn7!rF?DQݑ5Đ}'F|F]NN&sr̩H5dߞQmkh¡Ǩ@T/gyѩ/ˇymF9;ŨsfQ] -e'Q8f FߢotG]Gg'Q(..1 41;= O=|蘷Q3v7kU~(^bdJHklFHF ox$2ѽo+BTFm (Eҡ(fX) Uґ({5/c>*F͝1 WQQ@)SBcF!sQjr2?1*F FɇN2z!ИQ1&gǼ}*BNuh;m{1 G,(c9ە:?aVv,(F-DL49Ro 0ƎGʵE2zX vklW; Q@F8#eC"e|K;9|_X ɏ(݅/[ZrKޤw}ͮfTBXKKt kA^L_1!0>>>RS @j`]5gTw0  ګI6ˎu%=m(`Tg'QJ#bvRò(eI5pF76XUͿf?&aFdݳeff{i0_2ݱ4.QQo&מ(J1 <Ҍr2{F0 S m&vk (Z0 N,yp@CS5{aQ?g'Q(].p;;6eyjT<K83ʵM`Wfv*'`]+9(0*QW} t5GM Mx֨FoMѻ;Q(]9aԮFG5:3 4_ /U/QQ>~vFAb0 qFAQ^R6̎èZ`0z3FTeFYA(b uQQhI1}h%B+^(،Bl=CtE娓(X5/RDSdcˌ.&FAgeIQ}IˌH$PŨOӨw 5q5(،Bl=CtEAtΎ}(>)$Z6( " gP_uvWcr>˝HxLU)& 6#dzГaWh A=#(V,KM\PqIyź'*9lt)̩;mfl@ը=oQl)zA^Sb>"p{TvbG*w2ݡccԪFA\#[o<*dvB ˃{wr&=;5oՖ҆}0~`%(T0Eٿ,F C{19&F)JΌ!)AE}F~qQ;rR$AQhY(0j;(Za~.+Fyr F9ݣ&АQ ,Qf0 LXbhFh.hCG>F73oDFe=ZȨ_e2׃b}sbh]f"'˨tQ݈}шbTJxΨp`;H5McdxB*|TK=ICbxq!'_; F mz.Zt-BɌ0eXnQ mM#n/Ϟ\I5bF!(֠⿟$ku.~F^:1Fv&Yߑ(QKQ@ʾPBC /$>;rtF+1 AFeC2Q+y|.ݞ(wQ1z " YJ8mq@F᝷uh-{TT:.yd3}i(&Gk1>6QpTdMrTvT(4h+F(Yhe#wKhK(0;ojGmϨcFFuŗ7ѥG`FZF]V)ȟZ|q1_(88T̼UȨ͞<4i6 CQ3sq1?9ɹNN5wiq H~jQFХS_fT7[5ˮ9eԺ5ij cѬnڠٖ7wRK̍#?Yi:XaU F F!(ȿ5qF hԔ3{b*$f}b\njǨpԀ#*$&gj Fo F F!(%3QF{XC`clUFɩjTu.2Zq1;e>*cu^-0:77+S2FE5ʨ]&2 }U5 U/źTѨ.21o|[j%ZS(`fT_ $Ԩ矘lVRS0gR?FgjaTQF=ˢ6JEM5ʒS¨h3+*G`Q{TQ<Ѣ>X~ͲbQd$(O-FE~3#(F/^[^m@oY&9[aR4Ȩ4b^kc>FtFxiBrn 11?̼lèT3#Dw-Q[+BqZ$8}Ԋ(d !E-e셣S|^I ?tfUԌF-[Ťҙg@؋?yO=C6ώye=A)s(Fu>цrFRb]d3*&i6N9%:;qF/mCړ~Rm}T0 LQɲNN . 2f3:;aJjԛb`ԍjeg)QYʴ/- Փ}l6eaڱmUȨsOb6hsF|QЛ+/2B%+ӾգK ː^d^ʨB4f42FE GF:]`^|_FfǼ]NNNɳ)|T،jK/Dp/UIGKcT[:oə- bS;>:bAvF#pZKZ`T[ lKx@ؔ51~˲!Fο]CǼ]?|I[c;mDϟ 5vV=Ug cOeNQwHi%F[c;$ 6eip蘷K?uLuϦ _h >cfT6률eуc: mh}0:y/-G(FRt[6)gL=+o}\uvҎ^mp1*:>o GbEve׿!ӿB)|؄RG 1K 8%e,ۡQS`=ePDçIvbymyTa(DTF[8:X録0%.4Qn0ʂ3*P^V>G(fTQ0hF7x>УdX"-1`"~9!yo8Qa=2um`4ތn}iŨ[nh 0d!GhurtftkhCQn0jfǼ}nG19څ&(xv36蝚Z0: F7sz1j$[b͉e>FhB]! dT G^K3ʂ>1 Nuy6$64NݔvJBf'(wbT9쐌N>2_Ly13R 1hCGܮftV1[o9nmJFur\^h3c1J];m0ZFuvFP>Z0VnyMF}u5yhhs5]T3zQՎhtFveqvZ0&&ϦLFu޿\A16a<< (s nc_Lbx~#UU Yʖ(p`Ioe75cT˨`T;rKƝ@2Q@xjb13{k|% k+A߆r bQ1F9 $菶B=GQYrBy~z3feߜAEvdTxxY=e=R-  1j8*OW:{!5L}$?_шC9Aȳ(e1e)˳R+Ґ;Qc6ʎ{m%ԉ NךMx1p7z IDATn^ٌbϬnxct!*JQDC8IT*^[,g1 <2*?kOOFO:F_nMΌ6WAFt1)Ъoh29J.Rݪhۇ(~3jO*]jL;2ZE[.`tԞJsӗf%Ũ5ZR*L{2(9DF##kQ{h/q`QB!@U g6GÌѨƮQQF604Q(wӭF`3ڷQzd`[0r87Ag_rQW 'F?~[l#RFoRiGu鵠cL_5aɘg-l|"Q=$%'˨ \6¶J(2;}b߶;~)+B9&5>$Qѐ*,J65;+3-Ua(*v 'kY:*Fu۞ ?kYj*;ro5?=Ǚ, z2T2 zkI,0[3jdQ)Ӛc Q?hW0j$形 Ռq ٰ0zh-Fv# 0}bT'2x[5o";i!F25eFݪQAγgd&)u|Tjfr2ƨeFŜn\Vg>(Fh`VlU2FjT3Z1ԘQ0Qjv.[=)F(6QMZ5}5j0zـp5(( ^fT`ںՌV 3(c`"O@ɨg!dh0`M wl4ąOd|'"eGF}$;:.;_X(F5UӽO,B-7l.3Lne5T穻'pP66:Gxb ")OoM]͒ z[!F5uN~g14,hQ0V6d>FYL`Wz01 Q5o!G0/cTdFݾdF!g=ۛ2ʓ"k*`3gN܀[QQR6OSzؚeըdhF#Uw 2i ZR2bc_FiG3騙st2 0騙`6*Ό G{3za&'~fe_FMG;2A3RЌBA9T?6=1 1ьY>[Ѽ-FQHFovѼ}-F魕b4Q*Cl9Q0 )Q`tj\p.4o2Nx UŌ-NQa4T_OF+]-1F0N72 5}1vیӌŨΎ7˳d,F 02jjj7-k(_@d0:;jBڗ lsF->t[v9j15(SFKs!>+7F:a>D(MRP5HZ/vFC:? kMvè'4JgR`Bn:8gzAEUhAqZlY=Qwuf^KGC8iO|^O8luw#~O8| 1j EB9t ,G{072BvgQ隌ΎgG:ѝQe%92z]FNc`Ԋ(G}5lwaZF@_FWF?delԯjFhQߚh40SF׭F21z<;Өm]]ǙpVQcl-uSQߘsyp٩F I.*9{Ԩdr?P\SOv9GЇ8X8Hh(lF!:C#7;`ffɓ1@F%qM!T,ĥgoׂ3M}zu%Z(5;209Vv}'!56cTY(Jgf4 ([ dtg4F(l¨nׯ=DfhTdgc1z݄Q5Z 2挂jد(ˡ8U_0l(Wc O}2|OJvQLџ }]@?N%|KBPèptUFd:z)p)mF2!9> HJJ5zt}Fsb:zf~X )T̨zI>;S{@R*r תQ*h4XKI_`:; BP+UcQ[P | C[ChKU2;I'w)[Esю;~<jųqR負Yv޽fg0WQUebR u]kG0F +Y;ܓ}r5]Q&`4!fFev.A0Zg)z-&"V2f;`t9zP>tb (xV2F=}r6#{^&WE$ ='jpB3;3dI5G8'3δ=}^4 `԰ X!&(1T8`(u.Wɨ~zoꌪӄQzFkuv Qr0퓳YRa ^iZh4;Q&TF}jͫQV5!;Y6iFrtuFQV5gt9Qz8vγaCv,)Gz/n00cp8F{:¡s~s7`þByQn?ū;=ңdk/Bzu6m^ր2(MdS0)oz;b6񸽅[c+@F1B$ʟV'<7gS OO~j˨bT4ѫ(ɨAn1 pQeSF?4bUsF2˶`#|8yt0`4=~`T6a}{F)GamvԦC`~FG59TFj׾0ꗣفNhQGG5 |Xɏq{;JB} *R LĐ[=\A FHXPdmV721Xf?ZAjGQP:~AXzgY ժP&hZtett FC验ޫ)F1/D1:Ӵ_Z(FbK`kQ5otF3 !i0E0j*҆+eoWЂW`0 B1o4x~37|d*lnQhԫ:2Bò]vbw;ʨl'VX+h+k˼ތn ^xVKFA7eIFgTw,;1z:&4K 厮ʨ.I}ͨ *DzZKK&cT_sfL5:.AYQBPQ}:2))+;84˖M~Z"}62;fIJקԵTyDηV:(M94Ff'jF֌FSzb9bF7:0z2q(tb`4٬h('gVerьk0:3dgT F9^/ >Z KCͼ(%ګ@S)p:Qqmi'i }Di9,%m(ׁXeٹ.sXAPIh/Ƭh7F 2-܉ΥhF!%;E.dKhƨ~كYT1ڒYP誌owa҇vc4R}ҞQUܾ3JX,(Wjh/EFqTtUFg<;WQQ-0<9w[`4Rզo*k0p*1EPj.$gW55ZozdHk=5Bd-5Ph?U8n6K-:F-B,.(Ͱ:Կ,%QRPv Uv?_,Px|Bv 1Il}.RNyI xM5m(lٱhV]<J eQ?9k0i(lќeFQ]vb'Պh4gϘr4g]Cg0b{4oԓRteewjԯ(d=ӡotUFnKFSe}ӣQ.)oA z?Xo]s<-1j\#E$􍆲$FJ8"9~QZON Q>jԔ/q2:+m[N9dP?A@8ᩊI25;Էft8Qvbe2#}d4FAu:JsށQZf%^hCCQhwF˳33FӺӁрퟝ.tftCg:tQ!:5D,1LRQgO?,~5 3g,Ft_TdD)iJMvXZLŹ0"xgն h^_~r6uAJ@K1j:;[@Zus FuF;2fы-2Z"+:oҌz34Z29FF|Ft 2ʫт2 _:G.~YahFM/FhF_h~rlFe9((+0%MɎhSFe1;9{hu|]|G-#4!AӏFcZ @H1N!F3׽5>)JdT}lPK;R'( w4T E3#F2zF+00Z}xyNBWFgGgn'C@GFsMFI߉Qv:ц~hNB_F3/dq7F-`4sRArz2J }]=R?#F3g'W-9އ^3#de_l:E*NCq*ñ4ʨ/cTTӕ7lקLS+Oh i?QKY\ z.3j,^s,]tl~3\Fӑ(7u9:FcF}M흝hۆѾk(^#U ž3USkFw\B7Fa Fks܌NhɐɕZ3:w2WSЎ}F:2Zcۅg,_p#((Ld #A ׇх\Х+J8:))+GUevlK-5v }=ʨc6?E$zȣ:k]ū:/tvd*fo9~N\4h)F F_d]5F 2ѫbF{^a#/֥ux3Z1SжW6`繠FQ6a_vIj b5ڀъk1 F1y-Fґ֌^hG)~NGF_hqvQFw]5ڱV<'11[zscd貔{ CǢmAaj>F3鎈9F F"(e HO`$Q53^a :2^eh'GGFhr5ZhcbhdVbt CL;99ߚlVxC`cvюVT==ќۄѿ4rt]Fk~O¦gbgQj_vtmSsO'MGݝeF{[ǑV0o[¤((63:ϞYKv]њULekA96iΰt<9`QҨ׌ږ>׵+*DчyNFyv2eCѩWm)}2,Ok0@uyɉJ' kK. ^GEyT{>Gmٺ=UIl1.`r1 (=c=U_8d{d9N-e9Hcx,O[̀=`XjK9p|5cד+>ܪ ̞>jjͱm1=/o o'x{NmaJfO},MniFT4zN|0k?MN1;ݲj@gϥQMY8Ce/ѵGO{Z-wmO]|`n'sfzd9qD1vhG)y5s.Cw3S;{=%FfQǬ2$zJOnɞhӞhztR{ȵgO3 C=מzE[ML4y(:t,]`ϯ=t(ҞzpIl3;?f{QG s­iOzpIU6Wo ?ikO&ҾdO\1Ҟp#'ړNSϞӊkϘQ#wj=7MSd]gԌi';cB<b[F y~ -G g,M^ӝ-߻E&`O vԈL/I5XRܼ[ӽRS/^=XRmeú'fƒ;/f뛄k2w qF'=6/xf˓%ԤŞ?{R;ԩ$e)󏞷rYo2x7`O ʕKMC3|f=#JwG6Ơ=ƞK7s '{({zñn\fc]@gO̻pĵfۓC]=?إ=UgA]95 'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{$  'H=@ `O{L|43Þ?>7S,e ϯA>'.D%,4kY2Mth{>-#8wrr=}oC'8wrr=~1mitkh4k{-%=T!a"\{4k {ѣFF1+Ig-mOX#NᘕYKLسg }7[>C#8wrr=>y&dYXYID˽}usO\~8c⧖3'\ƌv,NNg}p NN?h~=bVf-1Y '#Y1+Ig-㔥;yYKLسNaϱ3 ž{Ĭ$Zbžp{/],GJҬ%&Y gpq.g;8wrr{<`O ˹L^UJ^s3{h4kY},s8cVf-1aOؓWj#gNK9z`Ϝ\ܞh4kYgܡwP9aXI&-8 d1+I5s=;_橈ln]zkIcXN*,쉘 gv?C59R?M9F)~,UM98Ht_^T d1+IUST{|GSk+踢9幸=2"чz}|4udNݘtɊQ :.F{ =|/fW=KbVf-1k#ij?i'cW&. d1+I3喝ю ZIQ Z]9 !Qj{ۿ}X#Ns B G{oZg{~NE'=YIĬA=Uo2L+=U%7 `y9SGӶ=gUݚڞSt9ayow=i-,쉘 ˵FsؓuϜ'YIĬ՞ З# [/5~=u1^7'PѺ{NLhT;kOU,Sn}4elFlm0ٴyF'Z{Ĭ$ZbVr1M}m2V9nug `O퉖1+IUس'b*$Yس'b*$Yس'b*$Yس'b*$Y@NN.nOYID˽`y;F.:ח-+<7|t%ugu]E/nOԹn1lS׷ wF9 .n˖[#=O4kY=_Vu9}au}yYKܳsa<.dv9,t΃Q~q؋o=k:܀)TuJZY1OrG{\Xo~FܙKd+?Lrs^6}aO55?UPMK?/0^=K{"BoL݆z^ Z}6ѧ׳nsHϹ>8kg&#uIַ 5Cgxч~D |tGՇS_~:=tFC=\G))zh{ϖ=Z1'#;:۳?#pN';n6\;g9}=瞸l$3t6_y4rWbO{&;< ..k]B iž ؓ{ 9(҄='%lOyyBy4aO{x{JpJ |^L ;.wP3~O`w{6Sz]{怑g|#绰faAR0а79-=r 얘ԖmD3:ONFe6_y4rW=68;D ErP3 {*`Oiyn<=,FNT0oTc̽aɞdO8=^T!hmS-gڶ-1~}bpA1ϐ&Z sJ+Ԟcuq=i}{ iž s{=yNFmў蘩A!} s5|SQLO-H)ӛL=?>ž=}jT{z-^~ .ϭk ӿlϟ_L[6-T{E@ (ϝ}nٳ>oĘEG1'qq{{a2lTlkt%eO-xCEL:-w=/>RSg-w;Od$ױg׿=mGb)ݞy= y۩qLE}}g,e@O^%T)f1\ZĬ;: Ǟ"{*gKgԁ=jLz&|4ƌ9 {J9=zQMWj?_0'$`ʒ9˘}Խpaq)fB%!H ܿmvSxr$6eLznϮS=ppʡ {6{ϝ]ygGeȘߦ>~%_3btN?]iY<r8=}noN9'NcooG{O[Xsm*-c|9:4}O".|m%ӑs?W5x=v%Ӟ"I݊p)o)g(amV)u[==#q0Uϐ={~yz+~؞K3dO2$;r %Xd!qbz=g[6wxKH7//әt{z_9c c3ǎduo3=_峧=\Z~{D+1g2=P,m\sx= {lN-Cw IDATγtu~Etz{N{F=3>vg`{ZcFq{GW>tWG:o+s^UsbGΜWBnRgO|PJq륯6ZϤK2ši_&sWs}H!ٳ >ܑPɩjQmÞ:կmG_FJd j{xCL' +K1% vq{rhzjsЙr{=Stbgak0p7`WXmT{3ώ̻I=\DyyB;$tg{{/8='\{.Şд3fgiizѬ\ʝk -ԗA9)8VxЖgٺ+ƞnPFFO;K'l 2m\g$gB{O-gO~||5>/t۔}TTٳ`gpY8I}:LkW=W)Tjƒ6_O0n !c1(b>Iri>=m̝Ѧ!+={<_fn}m}=KӐTxĽW/z1rLN%Ct{9Gdav{Z;P{jy6BT=}2ҫUgͪ~4sz$ۓn{٦^ǩtw$fg{cj}l s7I,խ*UbOf>ӈHzFL0}.Yĵg(hڶzΞaޤ.ŞǞqy l15h@:Ak4F=&Y Dn%[Ӥ-]0|n= KړV:g;hZe,Ijcy ۺEii74S=ZP绗zz.lkӆ{,(Ѡ{dI1%a#r{ޓU",">[g#iqw=S&ō؈ Z =Qb; *9Iܔ:+31od<ʞ橞؅9ma= c8di-f }ԉN=LgX;ڞZߞvgbi5b[\0KFu*8̞O QUNbOyy{5EA'o `4F\¥ZITw{;z>csk乷QtOX{1=3qdؓr!=luX91JsDŽ܌=}cϾ=N(9iI2_N' ({F5ҋ(46>,՞V՞!͞ϝ(ޔ[w'?ٓ lǸn4Rd[sx {&j$ ozF*]i8Sf8T_JiCEoϵFx=N+޴zhg}+ϞyslRX$/>X {ANk9=+;h絧awWl/*Ǟ˸!kjCafDgݺ?Ϣ]_KF-H^֞ʿStIχnޞwiF $%y-s7ys>*: B{؞OAp#d~m?C+ 3gKW/39nŘODk{ٳ%j7fVt[jNʌiEɞ3CssS9ks,1`A3SjnzeO!}ٳ秉IӐ c8j|%hO^ъߑ!{fbdsv= ײ2WeҔtG\33=5{g=ln{knQ>{ƏpRT w =Ub7q뙇ʧ#O'[7 lXC=gN#.nOE9&)H1=õ>'ii{?`Kl0~D<$smnjx{FH*?ZjO7:C/[&K}e%;>m:C=#H+z/QL!/)f = yn8O$L1-u|#joyW[*&_Nh,”ѧ&$'`/{6{} [sy;J[;K;-]w8oǯ:q*nie޷)2yVIȱFo3n۴Vױe? ߜ~ƺb U.&ۘjXXUz N\N ;_ľWgz;mVkĹ ؐnFF1s H5d{ g ;(l)Q~Oj1DSe^Edh&ɞ3`O]? Ӎ8{ Y/G(%eGŪbE\Q̖aϵ6$T>Q _@'~pP&١L~q=c͋ 3,萈5gJY+iF[[6Kөe;Eݷٓ|p0;}gU>=9u4W5I\*[XEd>w'zuͭ Gmq{ۓ,iψ:mOP T=}tפ ֶh={1{Pîzng,lHQzNŴGؓ3nOZ׬̭_*?_>]3m7δc3=ɕ"Ϙց3G6:.ӗigOxNc==g=c9j=1=-ynqfҬz4%MY_fv؊ayi-v|ű|wcO_bӧ fbU}ʿp?ΞHOHHmm~䯏e>(!eṈI*$M:=A3ٞ4&٤I=ӕJ>Yq/:Z=u兛~O+1tr\Dj;߰VzGbʼTyt*3Hsg}*\-;Ӯz¹b͞2T='",hϨ+^h{FtM`dV}W=aO [t~b$THȷbuT3rD1\*V+{[st1sl{?:;nb^bbt2wGBΓTc D<6ډ)Nh5H{΃I幄kad5lϥnnƤj,j$ U>'^]t(ؓl'S:>wU ܰ6u7u{&3c<9/nؓ v&س_Wh{&RTiU$Z"{37t/ߞᕌ݆6{ ){ObOsh{҇YIwmsƌ•OߞƏZg!Wѧ1?gYe9By_-NYӞY|SOI1Tj [JX4k`ٞwVh|o.K$P2yv՞^dvDUVw[F5̉Ua{O0qn{g=e2aZ4;w\Vm%b={ᮗLnJZ opݞvRnOj~J6nÄb=]fuu]ynYI'?g~pDU=WqL v:ֽCa3IS9՜.h{*B&Kpg=㇍Vwdb=g TC4ٞ;]LoO]'Vƶ< {pglsxTnOz5ŵ uŶ^^#iCsaތgw14NwUV{Oazسi,ij%؞;hH}Zړ9(,`OP4$ȉ |7RԞwL)K<1wŞ[T?CF)\qgsaV3"93p2O$>lH|eO:&$g,F)6:{nlDgy3a23_0r"ڞFݞt_tf|bԞlTJ V&ՂdJKd %=ɞ}ԞS5#۲ڋ֝n 7N W=)KKG]ö5ұqMg=Ϙ|zNnOs;$na]{&gX4iO0fy. ٓv> B} Ԟ1i =CbOVeed iqPf峴=e8LyR̞Kcܝ/$Sӟָ&kPzž=;=[n,tOzMf{No㫞e{cpj{iT~{)KђPEQ|#vTΩhFHȪgm|43Js,bۓ칭b-S#g r9-nKi#: S4]n6tDeT>=-vҐY?>7s1_ȫR{U=^aK홵fgJ=Cg{*WuZķZ ϯA>SZrf]wL359Dj؆I ;}硾4Bw#3wsEaiT=waoO~rA`'Ad{ꘑIUr[L}g{L|۞ߞ}h{ ۓsIVjO>ێ1 TPwg>|}|ϜŮ Wkn}3 l~5N"xRޤeP Lm^@Ky'8*=}ZJkt42z3Og.g ӖM t \C@rgLJdJVd^mϻ0餯v7SܘWUO~3Q );|70ې쌡 %q'ߔWr_0=gg$Vg?eX$ĞYhOfkTtN^Z !70W5spFW>JN^- dhB 9./0ogGQgfn_I+bO׳=:_6}CjL=`OjΜY=IU>)YzRxdϸOIϞ:b{FwzWgO]zt=sħzvEdmO]s'ʭzs{[=_JΖ_#PЗl!Ghi.^[!\n4,aO{Нk!`O|jώigD'yCs7f+-LI&{Cs䕚AO-qNPO 2.ɒws'O{1e3 X4q1Xty3nֲ'DޖV.=uՠۈߌW7JTYzVG|UNMrdSyy=;gVcOos:ҍb7USg{#S;۳~[j}}]ߒ^ؼ8@OL{t!GU׵ο~\c5>1-[?[isוֹ^!wp:FAc1۸cp= {ʋ]i}VyCUO)ݖsmy\ХŅ>juFmhHog yk~-=̍` ۻ6|YV˰sGrat 4#*̭pa1YYZ-{O}q( E5k3S;c}c#(y6p[ ,e1Ӗg>#LU3ƞLmS{9UOghqFWN7_Lgg NGNq./1bt|<3<t+'W,Ny{S*׬VZ߭ >#wLxR0& W';S߸kM)yjy`.hڼֳFzb:%uT4*]Rz=-ws׹;'_/S?=Io0zǙlt[$Mw'_=gw`hqq#L3q=!i=< nc\LK>|78j9I2Q'GL{y߲qWҴM<7KLEZbܣQ>p 3|IKdHRMQunŔTkKy:-n8a fBy=_nJؓ )%KΦQ>Mu4<6O'V>ړ9Uqmc=O7~==}lS6LF<!n\;k=<1au3XY^sgQaNf{D$"Mvd*B{'ăы3bҌy$,ExIY|&䘒xYly,3c)=ia9yy[*I\ p hKF|2;m'n:s3;$w%\mWj!i]<ž6 WaOi)49(?w ՜ЎlcLZ}!|iaoVV44= sj{bϕSZl=:\x:4{۳:+qjm;X֏8h:Yf{i͙=n{CR9zyL=L uf{i@i?+t%;ƞjwɲ$xS@ОCީs.Xr?Zcqƻ)fggPЅ{žDJEx,'nQٳP'M`&MҢyvbBjxq{͖$iu4+Mv(Ui39Ds7 HzEUߧ˜!:Zb%$QsOY3 e/VI'}Jy ݙҼDJҼ[sCyA~8cVf-1+Io"{Js1myG_{^W_5KqV nel>/O+a6UsC6ڟ>ޚ<ؚK?VWZ0fsH:*7ޟ WRg:GˋJ\K_hO+C|?Ef*f<+-yk`n!)pP|U{==,|mqc1|Ľh=7$\>gɛ)/ƛp}2>>O3WCh<-7pEs1[S;yT2tfOZ~X͟i>i}GjRJ_dO;GcNbzV$ *Unfzl͉[-Cp˞CusJ^OtCN8r}5[|3hJ\Y%K/.=ٚy55B=>i#{XKm_B{T:5_^$}͔Kߵcrؽ[Nf>4O# u=N|yjZÉ(m&5yI5{Uu#猿Z~R|=:lYM=2/VH3n1d? Lio\TO_H!ΟIPɎfsҊ1[?Y鐭)ȓ&\JԞ~O9cin͝!)Na }K/Ao[:<_KF'Q|=1}J27ȟ穒_ϖ!՞ Ζ!b9oMa[Se)~2 =UԱ;˨wCPgz 0//Y=3}2'CVS%3cĜ'xN 9yǟJ([S[s6n}de=cQ*,Wl:N"{=//~4{ߞϚi%eJ[7!O1az<6SWɚkĽr;j)sIps_s1U>sn-6G=31jEӟ>7}ElI׹;)&w"OvHo;'e}yYL12[&)Ix7ȸuk }kk*2{%̊r΍6q(7 N,}3wD \{>cfI{<>Heh;VzCoMIGlMzܩ(iO\68zgSe=//>-kVr~O~S{VeO߲`ysff7 4xsry6)#J0v5 | #w|=׏OkS|?ENSAU2 ojf{9hY(d}|I >˦oUVYK[5,|whuG;,Uk-+uٌ,|EyqjYx)(l3gua)CM9J]6! u/] )(EOmtc=C;J]>[wk]Qj.̬QuisQU]"詍fF=ץnS3([5xM-;\ k*gF\Ѩk5LD4 0s! ,&ոW(_|Hyǝ}ePjY%"Q>{GfHbL.hW5,wh`n@CuOjg/SkYvD4 СT3qg]ee.u58S5FYx(h 4 p8F@NQ'(h 4 OqMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj.qMEȂj4@"8NJI q@PxBIW4 %A\(q@PxBIW4?⯽g򭪪?rai?y[?)o$g!ujʮ{ =zl{8&jg*hj'FF.7gٺK]W'uRҜH:tÜC{Մ$FfC7jH[bKj4ꑬ*ZZnX)ё뤤9t9ШGH5^i`^F#IIs"s?V}ojQ^wumMW!9]?ä^O>,>B} `CbqpvCSvѸ ӥq8hOwt7Bhc*XmB9bhT½om~k{i}LЩ"L֨&:(Yg&xbQ3|39v5qt+FquM7V֣t±pb AM,(hT½T673wg [| Wk0Nn^o>b2ʱFr×< OͯF7{h`]4n~Q 1.4N}h?4 ]U΅*po#. ]o]O_+MHfܜFChfAvp>6c%gFqMMkNGCu8ѡ_4Yt.TѨw6A7\r||'nҎqrsǫ㆘f}~g~{GZ0.Jb vBӭ;gcHC~&TѨ?Kukq6f)&'݊jHqi.џV3L\b vB⵿gt}gqE}wuhT]ŔnVdIG4::~Fj=КXը.PX?Uc HvѤFG9k2:b%F9i-vW37}otht|ht.~Йhht|F<pu"'G8ѹOohTJIM//cM5roT}%n7:Ǜ=?t>ۻ<ѾӮM3BSHvюZ3<7ڦ;_~F9i-?]ݛNjzdt6A`jߴFE4z9:=SLB&f S'#x|8NktaP+4*%͉kUFtSFѨ}=hq99Prr8Sf'uv1gF73Cf"zHw&'45тg4*ωޅDƟg_&vǯNnHup5*ȿ?:S.t3.&6`]4n]JS4*@͂?w\ =:)iN$a1}{ظ"'J4zuRҜH:t,2=w\=.&*Dpr4OM Q( >޿TI,@\h^/ wqѷ'_I,A\hza ·h]zjif)(kpNv\j$z( p%h4ơo/+( p@HzzEp.Ev=@SLJfZh(9P7-xԗMF(A8A"yf6=ńFA aĺ0}zga(G(Bwؐ;<-=ʄF jՌwL#F(A8! _zr 4 %A8CRmS%sf@PCjQ=}5~  ThzrBIT^E]囯Q4 %A8Mp^]ABIBu+M(&')o;4|4d>:' /DGCfy!f0<|{uT \($/B7]>b82p(CTk0:L7I2Y@7'FA ¡05:$]x($P,BǝEpuS\ޜ41}M?t=Q@A R6oý׋+z[C2Q Q3ǩͨ^T>;3A4ilL(C_kF,&JhSa}+x~Dx!B!׋sJݭr4 J+@ (Jj[nh˱rDžO)qK)IQpc;?7IO0r[_oz*Ii#tj,ujO8r" .BL?T0聤(8A3zPjS('xGfh\*>W%Q< .9c9ejt1kKr8ѦiԻGG蟵SW$h8dw@E߲dnGϫ4ףօ{Aaz 5ѣeofZ6H5A 4 =r:-X>&aH5^:MQr'?NKtA0qѩ4zk疆=.*uFz^uFFa3uZFhW<@uQQޥ5귍>(f^h>Fw2Ŕ h&QaکYmgSQ–iѷjXj,@ μo^7< hYj3gM/-7{B49Bi2ys_l=T0舵kyǃF? gs'Ɯu/MA]~vO?,fՙz) L@Xc}kkQO/u&- 嫇oz4DDH.7K[{46LSD$Sorl_fĺ (r\ճuzDOf4àYFa#20譽P.34ތFٚ$ (lbLSښ3WAlhvU)kϾ.gNރݬik4ibY3dԨz |062hmpbM^鿰՞- ܟ_̊ &ˠY!hcׯb85zotӥ(v#[#z< 0si.%rI~ pJom1yz'kp?;<)|>S/phoZ|35F^aF\ˑ ^͌Gzs>{&<&Lt-`YkjGD3Nc5zlֱrExun-bSLuN+8r=Qf;T>\dltfaP}msi q589E~1834_i5ؘfy4:BaЉ=zH~Y-rV  Ѧ4Oh"f?nhxzxxSL#֨ i>I8Іa׌ÓEq]gv2(^a4j. 릓v:a?R~^ѨRdَ%D͙P& 5.瓖蜥4ϙr(flrFeNe)g?c${JkU;.K;O9ԳF科nՃEG-g,&ǔY~1)Lkߨڧ.F?$7yQ͐hl*~ofrY^/h[iO&5InpF2֨۽ rK*xw(/[>[s&i,For,4轸I$ר5Өq +E1CAb'ѫuoi=wCnFO؈6:hH$륟odeQ3Ϧ ٓM#A)~CƢ. ȥɚ}劼`šR%0z^l`om`? ׃Fiim5 Uh.("Z[(}j/>Xi)֬T"]SL;Izq4Qk*cSÎr%?9j5J$O[!UN"㔏daA"$ Х7%iiV($8rz<ٚ>ƤnI鵪RBX[#FZ,AGj ֤y)h g_6|FvvID!DFL9ٯYXZF!'?Ť $QW?f_/Ʀ=DpJ-Aʼܜu5EU&~M\ޒgiI%)ڞwqjm7Ʀ=BL~];>Eڅ7+o4M&`k}޸Wj\U;{LU5O=NoPjq][ ojY5k7oӏBRHU,-R}c]"׫)iTB[R^/7w9VYdO"B@-IDATҨI)=PDQa>C6"Jݻ|Lǵx=,W۬67E}lVߪ>w3iTLXn1󪨚)YUUݛϗ&+FjwB"]m1<%Σ#> :vF)jTtm"0g8Ixo4MOȭ%kfialHBcv*JR^\LgJ}hfmKDV6񧷩dkHP6 eb$#Qdӏ~%~6o*&ʀ5j3'Tg]nd=zlk#v9m*\~nvu܀Y8U7\gL.E^-'Þh6)2;(ڿ2uel֨.&\@QQL?w;k5ܩ5*mOyv)m *Y3J{r[0!=^Կ^N;DP#݈A?V \ǂVf9ɤ7GXh{'t/7zrzja*b U qV9Xoڷr4݊-)ةU%F3qoMhL Y5Tͼzb bĭ0"mސ9 ۚ$ofW!xښD#nEǎ6cAK{C\u -w#Ǿ^7_ٶy }&Z(H"^fqn"{t7{iTjBEx㒂}G_{϶=y,(5%D }}LU{i ĭ4_oҨZR4e3U.||cZ4I12#) 1 wQ.-)w15lQ!joBm@S??4⿽G%IiǟL1y'ӐFu^*HPjIvh iuo//oE:gl|괌:&Piuڗxk̬{ϥ? ~\G]?׎1[t,3}#N0X5I 5s9v2Viuk3%-ùU|pjq*d0F?;v&=9R!+8ʱNÓ$iG+ub5øH}@/BV)95*W$`鋘9zrET8V7ߋ\ũ Q޵ǖZgVL5j-ܟ.K>hIR )lOPbƣjH:؃h[Iw4UX[{Btty#uUblKsU_UkdƓIFճg7$Lrf-RASW8\ ǫQt{R]$QHK4"Io׀͟3H@_[N$kMN`6h'FoU$8[j9F [ի;8>FjިHm.VK,WG^w^ӣFk)nքiIb*X~~_źEOSLSD5MprFΣ?4G:Vď\-]l"Em].ˇuޘ3W"T/wj3n&FNjz'ڀ[f4zGB=X:g̦4,RӨ-]н֮5Rj(U=lij"׍NN ߕ_)c#P=6@4F-tpOrĮӈ f Thj2FіFo朷e3O#+fXS|8,UHx[A3z4q4b1.GX+d &8Ƨkt J͕F m! .5T7ȺZ ehdHFJ_Jqf%?DNo<4\]j=͕I_Y+8h4\u>('8]Ѩ:*Bi,[6V'^?5͠HuFɸmGjh5ev'=]'ƪ4EmI9=ըK 8ީ,{ E2[ĬQ5ۗD?à(Uq jcw;ĮQ7;{^?$+uՋkbc㎈ѝ4S lWRTQl4'uSM+Qh6*-U.El G5@U4&q^ŧǨ˕-)( hl׌۠j|^iWP*ZBݗ)&Q4o4ڿ9#czPM3W=-w$}2#-aO=tME۩K$[D@.:Mɡw!4 vLҢ^ѯ{Rd6OulO$=DuSר|9Z=}$U&W@ط8/ vd'tWg5F2~{YM:@UT@ЧB8mᔱñwI$jcS OeM)J*8Hk4H,x,W}\1uű8Z#Fv@w3f^轠*5JFE4il=鉃q_>x[ݱ o/F},w*lS5qmo.Fizx<r+^רH:b?}!BRmB.W̛d޼#>*Ƥѩ1/+z꣠QCWN&0״{ek/h:jR_W,EMߑt-fjTN4 t, 'PӸ㋤l KYb(Nٽ4LirM3 ɆK[2%4y:/Y07}z}I6XW1閴F?(UvK]Js*?SkT+ ߷9S$VtRL`e鐿䦚 3 j{%SmJAbhkzx)RӬҾ2T4R,Th5) Ͷ4ћRS2ZR,=_h5+^ jRUJ)ȱʳUYǖ5J7XeRkH2\֨n=a[?ߴ8d!ԊTޠI>aekF7tU[?KuRT=)!ϕ6*ՐWU:m~>j}~7hT~}:MS)5#Ut>ihTTn)6CƇG:g߄AiZ6ՌVˉѹ37FΠ#IiZEYSjVʼn1lrb%=D]=~N]A'b_/JkčiJ%4arCu>m{pׇ]tRl"`ܤH4&wn.dT4u)Yf_ё2ң6icQUqx|F_:}5'ݰƚZ)~c4 wL^ȨFWD<juìIf:IL/i&DޏȧBkcHΨ5m^-px#y~n,է}qJm^My ~X IL#/ŋ-IS5: FdS7"tW~i42YaD=G>Չ_`h{n"/9+DsGȦ6k{7 zmy)TFQx[U.#TqJMʽSkՎOuGԪ|~oIdS5/e4 ~9]hlǥgE[-eȥ.qkvwYjlڻRE҈"/M6U>"hUu[8uk9#qiS([Dȥ*!5z[&a:~$DXG٢V@O65ivo>W13JɈ4bcE[E[ͤ_\jLj1⩤I><4#" (ir%ɠ \*LW5zU-oN>rFΊXr%zȡL*Jo/ʈ_>;<0<|r"YQJ!`Vnv>27~nzK\ү=&RTH2,ڊ"ZdS4ZtV D;Ds<,­`Vj/T#&ium?;FKѾR""\A4 q{@ <Qi+@O1M` <F6w+M` <jvo7 <~!hJQ( wyㇿjOuiV>.45uG;,Uk+q|<T){PO\>~MC$_հ%ђFj6÷bì|<ԥ(]-j (h 4 p8F@NQ'(h 4 p8F@NQ'(h 4 p8F@NQ'($ͭjzkAy($ QH[O͗u~|A4 IF!ff]]ߏF',8hsw'ɠQǵuh~Ⱥ7I5z~LžFp.hNb5jCk51S?1unAp>N_+ufZ7zѬ%5퓲bhO1 񟆇ǖ~Gf©_d=yx ٠QA=<^_JZƏʸ5mF(^L(xB`(QH4 qW,.&QH4 p8F@NQ'(h 4 p8F@NQ'(h 4 p8F2 IENDB`gstat/vignettes/figures/diffs_daily_means_PM10.png0000644000176200001440000011265713777370515022006 0ustar liggesusersPNG  IHDRFZoPLTE.3:Rf3s:\f:::::::fff3:.̐\fRs呶̶)ۀ.ې:cRfsې`r pHYs&? IDATx콍䶍y'Iڻ'Nۤ&q;:*I J$\v* R7ȇ?RUEMMMMPSSSTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLeTMMMTFԪLF$,jySB)!̔f~Met0SB)!̔f*L a0SܔfJ3%䦄0SB)!TF'7%L a2?~"W3jK_sxOޫ-T 񛸜0?"=D^/?\K=ڒI*?n^NBӼ@2jώ'0b=~{BpuN(Ճ|?m 2~5l߭{W=?OM >j!؏uOLF=݂iL$7-j/;'DY Ͼ 6F% i2~ߌ17hCQ4&j{^wpow {? $tAd҄~~7_}B)/7URr|%Ҵ&jʨc(hoq_иy@FmMf# !W.㜇5NhyiZr5Ie;j^6\i~?Y2uۃuOhE# >1nS&ֆiM$ֽ8[  ιM[v)B?54G8R~ĬwBeѠNhE^r5Ie6K`a`oZ<dܺ ~ĬwB٫8{H2*ˢiJ$Qk?gl[Mhowdd#fe'SdTPԃ4 2{.7nK6N(XKm?68g E=(LӖI*}gaͽm _#|Hl5 I&iBk/#;y,%4%j޸m=q׼4[7<"1(_a<$LAE} %Odfx MuNȗQK(G:' > 9!ϩ4 2bvsSa|L F`z;)/>3ʳ mA~Ƅ\MRݟd;- u~o x#/m@o6!DF~wBpWMsZ3JOKB&_e/Ⴞ>D_ho%YmB؝z؏uOJa4' OB&8>tv1W[m~,AF}f|BO ?"?! MTƚfO‰JO+B&gJ3%LetrSB)!̔f*L a0SܔfJ3%䦄0SB)!FQ555դeTL a0SܔfJ3%䦄0SB)!TF'7%L a2:)!̔fJ3M a0SBNnJ3%LeO`aJ3%n?os؉)!̔fJ3>6uL a0{ÄvcJ3%Lem?Oa%L a2”fJR<0SB=` 4%L a2=q%L a2V*k@hAIx!䕠6{'˨`pDsNEjJ6R&!h]\pҷ]HʼfM lu F}_Gv%!{(!%5=!Q,,הfJ3%q9 2B֗|MOHeǶITE*֗|)!.*kiWB8B7E au'x5GI*v!2J*!z7gQB =]F-Hno}Ѝ@UNgJs0gz:"mm7 !V&JZΡvC^B]ϖcMQ gKMAJu%Wn e#2zFDLL˻w%w0g!䈄.71فv ۗ9;?!RVS AޘD7y*!. x]ܭpٗ/JCRSBKHR$oDVBńqB*-hb~ (aAKHP$D^';P]1*΀.7 )勧G%ZT*!!7Njy+!5A3R=ƥtt†,ϑO%Ԕ"/0 %jB& .vَ[=\CO$잖}-P¡Y{"ILW-!rՐ . ^rs1;o;Bh{eo4^GlF(RBFNu%t/J|>284JYC-\%['PPй`=j8Pb%D=V=,{Zy:)=Hm!˲aGhSG%忈Ywa!Ŏ#^8 DM|y)B#W%t)!)־/b8Q{*ˆ8UB B_AB=F Ny_:稫}j %dD )!lzUF+Fm q[6JhQBWRݝ/8{JxS )!JIRݝ&VC|GhA{qPT aNTjB2˷:?[[ֹP+]40aIuPe M ^ea/'T(Z:~=,ўdt] 0 ]I^cu޷#T&K<uiKJD,sy{2< Meo/߾LGL~"͏=0Δe}~B>%uTPpı 9_GM0\8_Lp[Lӯ+"s92YH(| 7E#=FSRGLN#39_L}3*mRZ^ֹ'rd#p|U4ǑC+ (-GrZ4c9z4݄H2Jk?? (%YHh:5xYʷ?}J 9~jɄF~OhGB5ѿ3M&0JW22 c']1KTmI{C™r>Cr[MRFׇQؽ c ` y>!%< }6!2 _Be\tC#(ȿ:˱`_O 'Dч(~B2xwNM_**}f+YX* BrUA^OFA*{n4,eX0Cڭ hI:|` -A!2`g_B2>a W%ɜQ + Sn7T` &JM^_P駘v~)?M`z=t6s 2u,9D&*p =i- zSdoI~_TLHON$ YdK] H^8BsQ&mhB,}bB}~P&" _zY؅`UHp :^; W( b6beP}/|E/(o_ >LLj 0 [[y3B)~ چ2wxR<.7[-z%sY9EPXkEzL\Nm 1نw;U[ oC[q)21q>P){q2gBɯ#EHX%JHUmfUPPt6z0c&5B{9B.$HET"b<$TцΪH(݆HFHXހ2j;Ȇ2?8f}2sDńLLq  oSAFȟ^S3IBm\$0 B6D3 R=Ghcݾ00*JE# MYH N*֬! W:Uۆ"G;I8B '<L&G}uq:9COOr_XmhVn 2x=^s)i@oLjeAcl4BLh/D(Ќ2ҙjˍp# $B4qMV b]1/eDBT !bq%UCjCʨeFtS.yX2Zr$$HHHXFIXWGe\I(,o64CUQ4uDi3TFFISܴ7QBmhfMErebܲ']` lA]@ iKVBд2n&Fk6Gc, BvA vJVKPBjBmE+ B'n'drަ\ZF>Ba""ݠNOQ;":xvU\+>)H$mk zń("BBlSBz.ĝ\yH%԰ I"\{KBg =XFkek%,?-x|ѩtQ:B:"͜*BFGkC3J~zBhh9c:u-X>N=OT[(ABDvOB2o&TFel¶B7letLܳP%[nE i[ΫDk *vDpʵ.:hF!>Fety,6s,k'r!ietO{piT[\7 # K2\fvJɨ2{ymhM~=!FJ; d4O> Lhv-*q@4f# ;xВѐIum|B6?PӅYB' YB*t2*;_v#@|4:z$4HېU##_u't"&4^nt{}rݤ7P EPj75}7M\%bEq{54jE%DM\]PP sǎ"*˦'DWE(7s"eM$#(n_]Ԇny*hy#c,BvB,ŷb3*Nbzb,&pȄHBJ$4㉄2*Ahr%m{mN3cP+TQÀhzҼ9 {#F%Ҽ9 o$TjB(3p9b8Kh)S%%RH%J(TFÔBf;JhbׇJm>PJE&XBI$4o11 g񶤊f~ ?XE(<6RQO% 1dTaJhe@'K_Oa^>9?&PCQ Q7#1)Le4ְb0W߄,&PHPSEyB8¤]> ]Jhgm褄TF䵷ð7+CTgBTFIY{&$؆&`WnIY$[U:j.&^uύOH MH s*"%e)[s\80XF2BNmCqRB3h;Gh%XE'$ۆbPB7b)Pu"!uKׄ|u e_BSg|`ݪEp߄NUBi¬cB3+k;GCuC!݆j SB1 M,m:K $xR;7qj-'ZPByWFo/7^ɯPm~%!2Zmw8@ Iٔf}XF?0JH zPZ\P QRLn |B%(!J)%ZԆhUFߢ+i{;c%xB>%dm(ʨM\ig)_.=!7P 9gP JĄ0mhZ?WRb'Y%gB{V*)s fJHPbU<-!L$ېʨm%&~H|w¯ErRRV$eug>uT YhC);.3s~ʼß=JH P!Jh Udt^?Q[h&s~?m/EvB%(/FPF' $fJ%h΅6 %H] `_LCn,.'$f{(Zz|Ƿ c.|7OG O$$&#\9ZoپVV;B Ao`%\X-!^6޳YVr)]Iym/ t@ ^*LM~n -n6x P zd2ZX130`K:S9!T#222\m~2? q.L-oa&Gӈ B~2࿅Y eZ*LbZRͷ[&=!t[nCMV&?vsCj-Y+i}&>׹hy6h̄~Mqlؾ:p#-ELVBV8WBGHh1}; HMF% ͍9ϕv"q 6:LG蘋]UtLB mC {ل2 '2`F-x.Boi$ jBpfUtPBtDב&De(-86Pvs H$|&奐!bh <*Bhv6zDQU^Ɗ]4L tJ8W*6QBBmHetY8lȊ]G0L V4QJn?:8۷!oQ9w' g|uz$(:MlP}r_?Wo0ͻQWEKuAO09g廀O(N roC~6rѨeE%,](teG1ބPu($$vK–|PI(EF*iJ=%tqɭѸ m~~*Q Pm($T qX+)B> PmІ|nԻE =V1\_(/u?]Dv46 .!EBPHtI ChIڎ( XP|9ȹ9K39 !*ѫ~BNIWbf'^LcOQѭۘlA Qi[}9d2Z>BTtn^>N.[)vf:˾ѭ«P1n\DN@h)$4JUd3O$ H S}"gw]dBݷ!OFBQM* gQN2ngw1/Rn6ZLȔܶ [[B^Pmȕu! m2f+-˜ )7N]8 .!vl4(BLK 2d2L%"/bp|J eBd-!LEO!6#4'ńori{73F|AF a*mSѦTF\E/Q/E ]CHe%>]=urH2ryT- mzoڞ\kTQIF+ys,ħ>>:xBBi*Jh82Y1̨2fL` tZE:XPU?J(se欂 +1%WrٙUg>>8:uZi $$?wA(ԯ?HqM(h *wOgNCQ'O!ļ@B*)dTvbt_c< B< PH4hB I0[2#*ݒq!NAuAF[ėᒾImK(nG"&%JELK YK(FȞRFwl^m޿|&WGJRQ@H=K<5/se71 Z}3~!p_BՄ 맄+ PFsWdNw7zxXP87|uw&q ToP YB[|AQD RFkW ळ:92ZK(vȲP]hJH UJ(\mHW gそ2Bg ֆlO؄XUt*hІgBU?Fίtz?2|$utlOLB6%`ml"+_t4pq|SS2f3'KhCzvM*c4SpJe$ԱP6/mrG5ׯ5jC: ]F9[sli%)MO7RBU]HJ7W:ke;|JQ;\D\LD'2vYBZHN$!tx?j2''t-ύsQTGKLT$2$)Ir72B]DvHՏ%deO1Qe4X#s6/n+u#"pIĞH]NY$T׆ ܆z$T*nC\FBF\EMب.6}qdci8ݎY^Ի6emKB&{ڏGQ'sWeoYz-,萙gE5C6F,.!= r7B.Pl- PP͏ՄoC2{XxQk~ttMfeL-L=09mm~( B` *B/g2*ڎБu +ۣpfM.vȌ,:ѫ%PV#P/N1` t%` >ƶP؆*j'D(5jCVmh;WFSo+T=5a89ɁQjd)8!53s{SE#D7PԆ Ek yhC2ȝ$2,x5\TJ|&jޅ:x2ٸ.'>D(%lC\BU˔)mC@ z< 9aCV( |+#!$DQէ& ~@ ]BnJې16$2FhC2{Dvs7xV{#e&}حҊ2(pBAR𭄐w55%+ J . zk>7#] Kϫ(=MEswҩ0B~eB2hCLBn9x7$ڤ [Fh']h6F[_rlY{ڨp'B~5;CH<7#²C ma%"Bp ClІ$Fe4a22 |r tsے68X!LF*IV3 Gh'5Ak fHaZn1 ,]PYJ -KE4=!xX?BdwwODFm{l_[CJ6/Y3HC ]GB>e/B:_ܞ)E"bkPF!'.5bBby$ĔQ؉TH׽0\@h;Vb~8ߏUtjLN$X}({5X# 1etFB/ZP6G(y<t8\Mv }|}h߳`B/"킐>˕V*/b%" DZ]Fyi p$H(@D=-?!y28;&S.@& ?Bh`upFbey=`vB[r#D"djReo=ٷ.npIh JT} quІtQ媓ߧON?h~w+!8"t@@%G6r?zB,@64.e4ǹ6&Hp*KhC͔bB<@6df!4BqD'8݌i"t 1Dm6t=8eJB{M'[mO(~8$DWQ{3Ŕ*fɴ!3$ee[X/ZBX'`7bDZFe+zBJ-g .}U@ӈ( zCo  "lC\qBv9!2d:} Nhp xW.p;.i,EPpI܆ ZC 1v1;iC*\a|#JhMUɣ:ќJF=<&rǔ6lCkC {D2-.ic>l +A mRB[d tO祉y;nSe{m xZmHz_s/tw<Z'*RG`-Њ6n@vU9mm=ehzBw(iٱqƩp޼uA$ yke3arkCfk2vkU㬝}U%:ſ Ze4xnX6楈y 16΍yymhXr;O.ѕe4,~OMḧ́Zh? Ӳ%e4B/&2˕a|daw32 DŽ/Lhbe(|e|dn&Oe|Dۆcׁn{:B[:Zy\&Ը͞%{.f6^e^Bn,{Q^IhKGVÓQse*CF' &,rB)OHBF(PJsBy=!,Sr|^6X]{ZHGx*М?,SPvJfQwΞ pY%ZkDM BqRF;J!%c M#+i0J16pMvM8'n6TvΜ$2vvO EU(BaRJLHh6$,J(8׷6UX*z0Dޖ*QSD{BXPB6#䄥oB"C[$0'!VjDE[r;! 5 -**w}r+!*Ӷ&TFЂ+U.!J{ !V9 ԁV0!Ѳ:H?ȧà*-mHe<%L'JEk.7s =CF寠_%ټ4B 2ZomoDWQBMLHF#ja PBLHD#j*F(!Ԧ&$Jh1G+!qJdBѢb~}Y""Ƴ%ԼB3KQB*zPGQ!ϧg<+!SmUYha^~-ђ俇i P˼ZjQ2Z"\GkrBkH)R ;r˪TP*!)RS |U 9g|5~QG }@j$}S a>pUG薥bͯEVh)5$U"qOA-V*$c[[q괱Ƕ"q N{TBǶ2*G2F1+Q]\ 2BY'TkPBLIzZ"׊] TQ(~mi:EEZEhPmi* [cRFb+RFkbkvJlF-0)BϐQ._n.&t9$T$M(#)bz[UYWvcZ(Ue]KF(!),Q!SL_EHHE'#@#^Q=@F/Ee^F҇ULP~egz գq}tڠ*xBF('z) ;^ISӄAUB =dyls+R>i)Gzf[GJ!({FPY*J2yjb}U]DL?r3@ <f$4n3~kYoo42 y6F(zeDp?wm ksw^%wE(؄d9!esosH%x:HeBX)!v=@F]?n7w[xMTN PھڜPo +U].Sn ; Yh;..BVBJN/=.U52 Bpk(5;&c^ΚT!G(W%#-(S %T\{\&3˷u*0z_[w9NH<.9}qAGyJ+ B 6:B_^$&}h=ʏSo"MKs(!,G@[E  ?J wױnM"t /%O'`"ĭ}﷩t}/GQYB/!~1Y*TO4IJX/2 ֆ ߿I=1ӼtQaB+wk{;Ы g_6Le4sRq19^"WٿMIkNf-BBázS5h3z6ZK(jK9 Yg;W{ :'xQB7W[5є?nDq N:`{jԭ E,=!ϛ5ϏreO:r6cD _Wx-rv f{7KuN(f}OKMOxQB7 S{* M [W&x]$N#QBЫkuz7AB[ۏ:eoV(lۨ^lo":n%<9ƒQBЫ'dMd.7$Σ|?Jq>Ԧ2jm."`kR'ۂ0" ϾDbB@MPN$J~ɞ}mHI*.7'zJ*Q8ޔM a&'t5Z4oocpUB-JlRr۸* E %|)!TF=Pm %q:$p]NKp RSФv#E ey0eXplttIPBq~(ЄDgIB{u Me4:7RS2#z𞍮%LAHR$|qT dF&$\TFDr[g-xVB$eW%`u%tx!1SBNʫXIk7&NT91˗okhdM o"t%"b%DehTt4somB"q6B*\]H(S'8.PҖHlˡv=ЧO)UBY67zvu#pGњ!!RMΦCDB>tT mRI O=IFa.||tTx!D|uq03䰺>r{WrX]?gV$?.$d|l:p`K yQ%tXBF[:PBFbQ0!zB2(BHJXF@Q{ ԫDHUF2 7e>9Om2(BXE@MՈ! 2ږ 2z~o1%[_s_zBQأ QC QcTF}pP|]vFav?Q뱇.p*!bUBA;FHe6].(XwK/] M+oCJȳHEP`N:B*DAVNC]$ݞ[7,RȪJ%!sl\ܻ@Gx=~%[Z}BsB7eR]lh*/6(ߢ&gA=3 G64!9ې貋D՚f%ճIM[y =AwA2mR͹ܒmk,NMC"Zo Ah62{va K[4j-btE*= A 13OzdT%zO]Ag7Z m4!Dμm2!0THU1szWp>c!؆'D.ӶҟI8*Uf. D >B=!>5 =JFW<=aRGno T"dT | [I5Q.PCU5PmU5(鲺%0 6?uŒxⲎRKz.LLDezBxmU0J!څuK!2j9`7`[?JTwWQ`op C+B=(hxц`u M- }l5h:%ϺkaR" "!x( V Gz2 ᦵ!pk`6 _oI.'9M#p%F)^:֎A' #IAŠm2RQF=gBNVIZͪ F$D8" g֔m>B aDBdԟDXFNaͪ M(n, ڜ(ZACv¨.B(\:jC eTB\bxmhR=4YA; աPuz@R"P$GbmYY2x̤ pdXۗ$>#8 a*z-sz4Dр6Yf2s^r{.YrEB- 'dx OQ !']bɊԼuʷ!7rw2mh2n#!+m<5XE mv܍ ǷߖPBן9z4N"mm(Q4{ej TePB%!4,r<%ډNN EOp&'zЖ4:sLF@2*dgtم&^ l"׈TL QЬ2AJ-Qn9_BHho>B.-+ga&@ M uJhZ^ARF5) _rJv2!b5+cPfGjn7p.E%ٱe4)yrkYh"BnJ(&\}8 G6!!tlPmgtԫ nB:ZeGK0#S * !ΪD\m „TFm-UQIUŤDKʘPB@|B_#DB&2z$vQg.%~eoB |% KG+˦'Bo]ߟ[Fߢ[·IEșG,/eMF UF ^>PBζDOF!2Z,1"L1>)X2*7:!fRuRe.?H~=u B^AINF$$:}ntFdpo)&RѸO K#w4L^ZKHB(\B<7$QQђ{J|B=T4!'a;!9>JFɉ2K/)S;ѻ ɩdT*odku+e, l&Bz9,SBtUFô*ZIJŸ$ԭ|F17+ZB)!̔fTFϴo|6<%eP/\`[F$2$^7rR.KWʨ੓ B)!̔f*aZfr*j.:bj.&jA6!!|2ZTB2j+RPF3 eVD&J3%ʨH 喔Ѣ**2uJ(!toT d Hz.PK(4%Œ12z]|nWE+r =@ 90 ,Y_Ѐҍ]JB%¬cB݇ƴjURijwN(l )>"MzPA![cu(!ߔfTF_z>>"My$!ZInfBT"XŸxAcMyャO$t6W%QBQq{ԖH3[CG RIYcBn{S祒&J+Ih^-]en +[M [JTdg&QsZY]&a'<_9'G)~8r] ]LJ_BY/ 4nQ7a4gwOϺkLl d=ru0,!C=9e.3?p*r55!?A 2J1B>%_v~MLEb8]K?t&Tt.POJhRBLPOf-r)fK=B*Zy$e(+xz&3kfk*e.n p!JWљ y7 ݳJBNPe6n=(2*eoM9?o8Qy-r(h(FA¥ߺ* D.u>5F&#T) d,,YJF_UFs?2r KsUXh5*ы@ %Yѷm2jۤhh-^7SҞfrshPBh?\&2H2}'MjUL8z6dLEKDb|BV#x)!422!k6k_s&-q S)-wu-EB.&'zBflBN/35)58h[_z@l#NWQңɜ4BCBv9NC"ц"V2_;Q(6Vt4#f$Uda B0&!j&!J`>gR%lmସH^y}yY>Z1Mݫ 9*!(mBsZh:Upg./m_VKX y)!Ž!$&]|)ټʅ[X.-{*S}bu%t m,h?#uhBb2T3g"o-4z_ mQ/_N-B5f#{NDI~_[7\^|"5*OűԄ.U3Yr{B+)8#UFNh^5>WOIPĄ-Y4%Qׄv-gh z_)fvS[Ly6 (!{<ź+OPrH yjNBU,cJy*ȼ&P2Մ%)!L&QIi3ɺG1NwgN+!,JȄg81Ќ2:#uPYH&.TBK%|dԐ)/E<,V>L ኲ6W3{JH g2J M&3O3nS{-hn&,~ ! }`O3(%ekt@,0(v+Pθ:M =3I^j1Ә9O9y~bϙ2&05!^)"%POd2Jɾ}/'a\g=/Lj5%(*lJA2JcEnňlsx͗!Fl>NM ۣdBB?uCE|Q C DbB5OƔPO&6)L9!Pl-`XJo"SBTgɨȓ[)DV)-b%{} :AOF@݆%dGQъ6u /3/UǷ-PB QEm(rmhB6-!{<6(8bx `/"+ 흀Y UT Jh7mWBxP\p/Z~Ra|8JD&I|!5q6tfU|ʙ&+oE,`zה}߉1ޢ  xLzB9N럖au}.LrϡuZC^CmOQ{a¶}mRȎ]w 00^I;M))!eD(̯0B2Z\|2tH |^{1NބPN>_"!FWQB޻B2ZaҨeW7,9t.-^ snTB^u3!lBF Ih=WFK,E d*ɗ̥FP^!SO(|;=!H( -hYhmjt(bh%!bQTmOBBfpB2ZHQuBCџ8/@FgmH(Y)([أ YE+=mp@ά0T"7"h %$Bh_ M0ȟT%02&1v33TR.$htN uFhl-k%.?PxV祉JpַN?[Ḧ́D> -zvBFt@hQB٦-Eht-.шw}@e,?Z)cPBlB&H)>"z8J㦅"GQ 0 GU|*!U#B +M&5I+b2%smDuTF QB:u]eTxL}Fou83lu< 윕S<.ROF'dE(&+lj.ɨt=`͙Jq ]5(XJKB*a.{L@|,DT /ǔ[ a/9MT rI/bHn݀Z aO(Xw N\t ֙(28VB&[T/cwy8~R*թdT"Xkqz#W tSŠ3 gBt+ Uɨb#wsih5$ڄoIメa<mH(ԟFF| nX<NkGm%߁O+tZEi:z!w~S*JeȦwOG]ܺ2Y%r C0`} jG)0r>ftlj靦LG|HMR a.9@V!,:BQ:"cY!'9fJErNJ3; "ēQ3G8'Sh4-;& ( a2z-! Yy>8Mˏɨ^ :AtjS;NLG#&`%vK- ONU}?OȞSFrY6턻IUguT p0!T <؅goe%d4hP$>.#̃SZ aey` !AhQB so\Nh^f ʨEkƁ?͗ 0c.] Bne''tzdUDdSYx/Rjp2ZTț&ɷk©8denm|eetףfPMrǔQgQTK4DMTHHTfB9!6T#+!{g@BOхk}LUU%d4VDB^% 6| adԻguгe|ަq&!5Q˦f՝<(&mRFu%2JcI/;*kmN :B60$BEm9ʪ"WFCkCxvu(mDqZ:B6GydBѱU!{<=2zt^wM(aA% B{YB5$iCBe*J մ!{<١|a.qsޞ$?(ZB&JVZ$Ԭ Sn2z#wYڏG\be?dl= t^; =U4t'sPNEڮ#Iڎ\%R6PnAExY(cPuAV[PFE[گ!nCPbB2|Ħ"k/qXj1PP"TY!PBEW'nCab)B2MT%@*%-XE$M)BdΕgPXv<&8$8 !qSD'SͻsBCrz.c ېGHD n( ΰshu=@)VO`! ąv@Ƚ MH [S? x`<eCF$R{U] s PGȻՆ$MH 2jʫ-df'.DTفʥfBB^Yk^:c!r&kC̚~'(Lh64ASyyıdT[y(@#{QJ$Pt)6ddTєCbHU՞ȜImPd@.& y+h>SU<^d '!_ ?Wщdw2ZT*Q[Mc @axr=![ ې8\І /%r y\Mha#قxe;g.mأ్/U>YPXQk6װPsB\E(!{T"B*:!xoyd8b5G F#25ЃeU\ Em0_w[.Ẅ́ ,2znk#|z0NCFQ5R烋퇐 d#iC *B20oNfTGŎD\A׆|@"-!^P&^QTF,['}E5=  @ن /Gv. 7C(脓c8BW؆XE/ ?RF f,&Jcg6H&%@!N u uIm(r\~娗ڎQSE#lҩ1lu ݃q<h(YC'&ZCTBYNjB/Jq*EYDYvM{P#Ju(!ĭ{H气q0=!{P 'J`B<=WFK݌I u!J5%Y#B2*3KOȨg5 )!̝S P3}w)K a&&,2f{%\e(M B{Ȩ|cV%Xt%r(yrB2d>Kk*Vj !fE@;JsX hzBh;㟶~] 扟4SBA'~-~\.+#6 B_Iv%{!*']F{L )h'Ht%$|!2'QF>F ;tPBH '[7z d4 ]F[LnSsXQ] vL%Z|BB @ p]="lvfm ZP %}`A5ZL@F%Nh pdt Tԏӷs%}%}`QBIj Ɨ̍z܃fQn2 ]H(NMoNhx}0Tt?vK]tЈ GP>jt9h%" NhN>~|8F̥"w?DUB"D!>DCBhf6? Wy'D)Bֻz,!"^Fk﬌6J!"B~qB'4&ӟ@;a2[_yZe"..Ȧ0P^6z5[2ĩm{JгcLBVm:B-{2j7xyx_דHEZFFp-!dkCh}xnJBfxB{2( p'2FIs?^pS5zkTqme#蕄SxIB{(F%z[UD(!Uֶ/ Zoœv mWP 'ĮuXJ#D(N:y3/)(۝e4z̶bMjdHFOI?߹9p5"$:z3挣IHe4ˤ۝wH1ZXk:xowPkHJOs w7RJw89W{˘׶|:~\spz}Q4(!J^ HhP^2>Ŀ 12,(2jWj)Q%*M aֶ;0+!a9Q26s*z!Hus*1xTrUAw{>7MU*{o0%<)#Ĩ1b-{2Q piLo7{r**HȭU]+_Eg$jCo%Բ .v= l8oTQq^Yr81TtB|j3ʷY .ɇ~q"9ړTq+3~{A4!@h?&NnIX1%! MJhx]6;+Zu0"4x#OlCv.8s*…,{0=PBmRBE aiP&$GRFo:mqE*sa2(jqx+&tZM~(./DNFс_uz2@ͻ@MJJ?ZFmJF'ߗx- +RoR.}y|k&TXdT Y{l_]|R{zʙJNWc0)d8J͘v!vMH6\mH"-4PTYL6=5՛LU\ݴg˒m sKЇշQ~5^~\64?>+@B$4NiEGQ6 fzb{+WQys?P*BHCŽP>s l4b^;50u BbLq7BIPnvO˻!__יeӟ#O~VTч$]eCBE҇肐F~t*]s}35=K?#&΂ B;|{bP׏?F ~uIZۧ$mՑZj=n=J}. y`F8$ $!tD(f탐G7*,'qvP_3Jb $|vAf?ׇ~I Z9=7nK +j \""sF; d|qOG=S_:mF /nnN3B il‹%l״$jm&xm"E,GWB_R˽n7UY]tHGF,(uOxBV5poKk]PLhH0ÛpBVLhp͓NJiuIE%4*oQIa&ibn,iViqY$Dh\-m(#/`ł vʕ-j7¡6Z:B y!I:6*ƷP-v6-GkAHQQ\,$ $HIutK !I:И6WLvEȴOrCt AmTXl..4nx:]\9!IFWy+*p@%$l ʳ9srC>\ F"4_t_;`zB Cz&4(AHlb` O$ԄQGءETFI!$e<3!lԔkܤ"4ǽ0YԡE6BR`Qw)*70E"!!1YQ߱L/o $2'AHHSAC٨XDm!7㒊[*FۯD Om"2,Ȳ2#2@H* a&m(U Tں.F9?lhDՁom Zt3fRo'[̤!,!yuLFM:BȻC`hJ24F =  !$%6jP9~!Щ4Q盂# ړs67eH6j}T9K zHAHUV6.w%^S*FUnGpK&{ݤgPYGTDh U#<a9uR:{߬0aDMvˎ^RY+2l4K*ϱ_$f W8F+6/Sn ݧ ql;*>фn6›/|qI4#Bt* QlTKɏZ*/1!NJ.nƋ06k.܊fld*A(JI*&Fʏo]{DBYiJ!IXe5}$m)6Z5%!L $鲫 {.jcz Gƻ<%u]BN.:i.L# $„|\t<{\\҄\<BLEѪ:9A+uiB!Q&ب=B)z"Wɇ6f,䤕{ Ke&k2 aUeYsmBb>YAHIp}%!)25h{@XZp1*~(?zL$!BH$dzBrn?B#2‹\{a|6kE2>!cvE6z^ KBe!OCȘ!p2yب"v^3y@{2-[u5,!EChme);M9&%3=}m?QK51CFj&#mRzJCR g¬OM/6CR f;$h*&3^yxB!ЄF <6zBYsȄ܃ ůdr]PN%PBiuAHLҞ6y̆jd{7P?Щ$M[voϔK?j.:<t-B>G b}pn^7#$:Wԣ+ZB#*F iތqczJ׋nҬG@>͕&A㷻;&WB׷Qam^w?B<ٞGLNͣvPHC}Em4e/1Uz.~ !P[~P<~ 1%d=-H^wBR?:$$9Fy{ϓ8ɖlb/;̽‷4YCh'T="BRDB'&4my9]T~FBEʐi ͗#!q7SMU<.6ci9/̡p  #H~ZB=(B-'f[%F1"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(B"I(BcI7fIENDB`gstat/vignettes/figures/allVgmsWireframe.png0000644000176200001440000012673713777370515021064 0ustar liggesusersPNG  IHDRFZoUPLTE.3:<FORXafkt}3.3R3s:::f:\s\ffff$+3::::f:::::::\R:f:s:::::AHPW^eff:f3f\.ffff:ffffffsffffffmt{3::::f\ffff.:ېsېů̐ \ff::f۶sې寶̶"&+04ۀ.ې:ې۶f۶ې۶9>BGLPUY^cglquz|wsnie`R[WRMIfD@;s62-($ې۶  &C`qN pHYs&? IDATx.u<C&M#qC3HV.&,`4tkIJ%t;[ E͵^{}us[[k}j DAD}K0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DID"Q"H$H$%I0*DIDԝ0"u,s1`T$:__=/H `T$zz}ɯv}~ؘ`T$޸w.Άw.}f[XkQHtZ0z9!u.CǢ4@H$h}F?U_S~Ui"(7a+/=I5%WU^^*+Fo*+Fq{0S/TUbMUU ֍J$U_S~UU^oqF//>꟮?{0?]2+?T 5{0~h^1zkzei%a$0xe^Qk8_^쁣0OQ]f_0W\vozڔ`q~h^q1[+X|%-9*Ɓ񧟞|3d%sV>] Ԑq}>. ~zdﺚ߆_==M+uVϜz48 <=ߙFџ^EcSCDS3koQohP禍[\Ҍ jh0dN= FK֜}t._v|sk{OӘӟT3kTNYl`ŨdۧRei t71eN= FK{z})c)s:9sZ]G׌qowq0*cThq}OO#6\kԏ"SOzp0.g/+CC֭f-_50Nva;F]M?u.MG:9먀Q,sI`4TcD;Yo3ŜSr9d<H|j~p8ڏЙhQ{izz2ŤOޛS}}1̩'hy\g,qwF?5v0m`4# o]h;0oYGnNYyl_6%G[Oƙuz0m`4|:$4- a5}8D4N1 53A9ocr4k1}Fgcion_è+sI0ZXKN=69͍4V 7Ӭ5YEͿhi~4=S?@Z gpF}0߲>Lk5F")T3ic`^7z4ct]=֍Z?Fո?o (F}0߲j`7~W671:]83]13l?95utk*=]5ꖥI]/o}qrPQ\*F}0߲.ݚ}?"flQSLs,q733l!U5tkۧwp0jO1* OvMYz|yS_ n"0~˚>fTCCwj-C1Z[/hq4*`NeH0ZUӨ܃;!hU FNrZU%mN;=ؿSkV1aT$jH1q/DkJܯ*(J0*#0%kJܯ*(J0*#H)q<kJܯ*(J0*#H)q4~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* _Q.H)q<kJܯ*(J0*#H)q<kJܯ*(J0*#0W~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* `TK)q<kJܯ*(J0*#H)q<kJܯ*(J0*#0 "\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%Wџ%kJܯ*(J0ښEצ:5.cilHܯ#_0ZUwKc]~MQ F{:V5;=+jgUUut Fk>v_R]U$W1/\X7l/͎boTu%&k@n-&YUbOŶׂ< #Ai3~5|v܏v=T0[աz4DvRObX,h[~r 6HڂѬb/2 A9%8 ERG%B>CzQ[l V^pRXP4Hk~ݧH5~`Q 4Gbi/i-ؿK-w RhUx}5QOSw I[ǃ!QvJQ G_\S%HwƖc`4#Ȁ RA A5cɚ%D;~}[!f_0y /C:W/_#:sH+ܷ@ڽ18mF\<0}{^_u/ϒvh-c>,U {HR,5ndϾ{v8bw,I{q)L)K)C~F+ F;pô+NHء ֬eXv[f'mL@V_~b85Ǝ#=X9ո5\޹w.:^~򫇾<=KءD@:^:]=$}=D?oYd/QjP8'߬} h$F޸+1C[ml?zy?w a}ȶf?hJ_>r֎Z`gorT~:I蝋 jKN sSJ!T*v]e,j51їO7P/H>wEZ3F iavLt3vING&iy/~yk9;}yc= L??S5z3 FF^` qmw?e[蘖78 * TY<~tڅu^ r@ R˓c(ݕzz٩E|"G1@oX2@:Fҷ`~:FZ(00YI"ݢ&j~FWMyrKOۛ$@؟[^|9ӾgYc/ Rc8 5ؽ~z[VW^MhTnqs{D);8f 3F/tFyaWO?s{/c)[YxdM8Zb4dRܴHػzl3UHz7{v ?[W2KqTqQ-KOֻ1/O)Hڿm;wsUyJG d7&@vM=;& 04{ڮcGk}т-Ƿщ?RHϝ(HMGoIѲ:װbt7I;Ֆs=\.!AjTNhvc:t K^N6E~2M!E?W G8jf}z#Y9/fy X2Q 5GRr4{ F_, J ]UO= ҫ{nD~}ܶHf ޙ h;PL 'voA "#)8Z"ȯrmNHJ@=jri\wp޺H G_25bKCcwC84pL F_WaP_mQeQ稲Q3[7aPh Gs_4<2xz[GpQ*\w0: (G$G"z9^ڭ &$Fμ %;,}w8_.gz.^6798JN؛C)%9Z0Ŧ(Q>X,?gvS/\sK`ck7 ObA:B%-:bFG]U; ͎w)Fހ1. *όfGih>5PG㕡Ma4<_E:M(dq IDAT5LjW>?^bm]9hstkS<#G;:8o.\FSmGfLd_*'Ql9Z1(Gm'rtrQ_r4{+F޸!\ %z] 02&-68]ݭ؉Qe>G(F_-[?WzGm u)8* r۝T#6HU B7E9:R¨v-[~ɥ i(}v[oj)46GCQ}m F]drT 9\ UNE9 c(hꤵݭ_Ҙh_z/ώ^qGsQ~k<r_0:Eқ4:}?8r_x.1^񙓣1NrT]rԘXzuFB!C2:F=WG8grTr_gbQ Y?&m.}7+EMjW|W}F5jUO0ێr_Ew pX) 0(鸘tu12/ͿUŅXiST):rw0Rэ0wو]@p/ e8.t9F^{DZQ'F)UO}1,& *:E}Sɸ>E"oF3Dè}6F~d?G.GR@Jdo#+j<>c8ZdptuƨRY (;~р-H/%V^a㨅7+_$p@ӭlnQ=?"0jMm{KxvM&%/ța4.i!Q딦sU(t~p^0|pp=582qܝݭ9F{d1!wקaܧ1Q5&G_|KdN&oRtŨo9}~5E} Fmo;1 5[~hGQs[ }.yiy?R2UD;yͥ( '2#0.C#R(59 X9:ﹶ~ /s4 FK~Hѵc?9(bt)p,·9 3Cc8'.wׂLd0M_3y]hǵyFe)E+aj>}1_QAgp#()TVO0pt?=( / *ͱmӭ8!ёD+HDŽ+v&+/嶢iE9j^}%,{EQآ']gV;¨Q~~BD"19$rt28P4[? P,GW9*Ͷ%FrTY: c E'9qhŧX 51j[Id_& Eѩ ȥd_xVPN ]Nс%ѡ+Ũ{hB9:V"_ֿAh(GnCYakVpt;S45(2,urtg(GPf")9ٓ;(Qsq,` ~}y}dg8 Fmm(Ø24cV5[rG]a4[?pTIc5Y#( RWyF YL0mKv+&G4GN G5GQkһ ap9ڻrԵc: ֭wO^daT rT0mK~+=G%ʡ&8-࿢p`~-G5Hrt__NW~%8(7徎ѠndR`oدvg1>RK@)GA-J9xV %f6f;ߕDv'ّ{s?. ]8XiLF1qT/X0:RqNb}Qxg;KnbL†(n[X}uwuK s4f2ơ)o2ˆR(5hC!ƹ *p";(0Fq@ FY2є19:B4k9z4ullstܸ c~o ڏFv F[Wa^?6G6G0S4'G N3FՋn=qDY:Fހ̃Q; /hf^1jptLP:g(cŨ1={֭o 9їr"m mfZ%cRè[V·S8zL喣d"|'L;FH9~^o`31L70qt^ jgra4,1JpԘ%2.(Q'/?/)2 E1b?w6zPN*G)6y1jl%rqYutwtPYL0ЌEOGƗ=E x9'1V'ݩt9Eb$`4ߖQ8VqèU);EQ4rt/a֋/G']nG9 ]'QYl T[mՌK}(NѸrt(\Gt{ҝL.G3}~⺃{(Q&t0<+.~hP34GM&E0 o~])jsX0#zG+A9w(KdYGo@sa]wpFc4Qko8:tY&GQ)rԙp4f"k)]GaT9ned;s<E9(JcT~1q?`b9jOrT0qv08hrt`h/GхrP"!rtNdhGm5SQ~[Ft"QG)G. 1XHڬP)Q D(c8ژ0ڟP>Qh-۱9:dNF З%r`3х㖵Drt([ߘg1aE(n?Fo:,SU.59ѩeqDRV"<0(m8.gP:79I(GLh,G#(G~;.Y.y4G=GrLdxꩧG0vJ Z5+GIq8,3&H>3{?ܹ |]8:1 (GўcoE<,:Bb@ǖ#8*_{xKx$-YNӒD8]jßf~S1.GaJ'̜eQ7Gh+G)c~n`4vO\ 7r.12̥h0YQ=vnэ1?br=4DSJt5n9jp93Ǖ-/y9iBuDQǢ'{wxtD۟Qn^^UΉe2Uv'Y2_4WٝH F1*kts,n^١rTyn\AJ0ʼe^*\9J֭*G[޽}2rHƗ|lcgǔe-(Liխ7 rv?U`4m~L(c_cJodgi]<ڡ[>#y.+T1Rv(3Q%RFG,6;˴~Í1d9tWj?{)_}OɈQ~ĭBvȖCLs\/W*3Eс&G9zue؟ 1h+?Qn}XgS: !;ՖyZ8F9:Q4bڦkQ/QǜY2>r4}W9Q!b1z ʸ55C[m%7GnE9zek[w9_ rXn tѯ8rT0/0 TV[fjɹIbP0хAͪ!O9j=<s8 ,fSeÈQeM/7d2WKrԼR*F9]Vߴl QxKpƒcj G9jTncat֌`t؎.GFQw~(~q}Ӳ5d%%2y\_[rQ#LLۜŤMm.G ( rG04`Zջ9؉QG/֠1gqg1r4WEZ0T9Qr Q%r@9ːJnƻoHM<,6eb(QG9}|ZQX"-&G5Ο<QHp_>,_7:lX92So*ݚnC&Q@%2-~"tVǹߝ\9Z1zW1M21q(Qo* ;qcy@&2>uwɡ<i-ȌQ~ԭBvh-s6=ErT}0QzІgZ2_9%XOY&4YqcpT2cTq냀jˬM(ǀ(ў!Qiijl-}U≌pthl9Z⋶ٔar~o?}'F7X evh-6ert(R!+Gs=Z,[KQ!W9\q&$i t>(GYwqu5%Ҕ٭0QEzkx5Z,[KF](&GKU,sPIsbQ폙e,K0X/Ggr(-EK5 ]rT%d"s;fQh`tW@ rԁQv9P4/HM@24Q*L7RQ7i4 (YSV9 FfZ8ƨBQ~J䡙Dir54v$~6d:FG,GIM)8RQFE(+,_KQQ-EyFs55w:9 Ԛ'/}IP֠h;NQQ RJ䝎Lgh (Or_7ނwf9Q 2nFuSQWh-c-F9ja) [_;bu?4FcbT߿ FmE܆Q7UEv9kƫ(FOaI&-NVV0zgNDci]LQn921"=V vWREXlF3x^6KCf"0ԭOMLhrt|sihCLkFr> #n_l ^1<;D=(,-G=O⾧υ$2Q2O` IDAT֎6~# F֭ӫfU6lu,^v 80+G fh#[keܷ0H.D3WeIo"ckE1b}I{㛹Z;m fSS)G{Z (GLҷȥܷ~֏QO9zt)Gߛ'~ ^ r4C2YS6.9M١ir߷isgܷёFٓYB ^-QTr"籭! o="t?e޹8sF\Wg>#4u?!**GhY}O}mg{щQC)yO:NO%&r@3 ~0(?e^QL0<:ҖCJhhKsd;01 O {!D3E1$qf5} 3qdqW+~/FS <6v:F8h]r?;.\c㺸]yh\ DC(~Fwm`ԡ;gWta qKdt1xs?¨ct4f_0=ӑױ'1v2j"E;ƨqS!4_0z{g}IQ3(GO1m$ѨCi -*Mc/F޸g$E}|>|\w[H?O}y1M ~_nj~M2P8Gâ{\w'RH?"1OwG#n ݀QU0<>}pш4^rXD<\q]{XC&hLd(4a.ߏcSOk@w1:h|p9 R1ʪ^o5\mq]Lf?!0[5;tt F5 'P C*ڣ.> Ee?(s6_o&ƅۥB]SHG!{˒CnC3?`tԼ*3365R c? 7WuZYQ΂^0:HY>Km?pҕ|j~}W&3Kvgрi`t_ê1g {⪈1:J^֢ʸfg?`TѰn6+gEgG͛>#7k? fݧv_0jXCŻ3 {<=+޽1k~*9E[fݧ,`tU_t{}_>Àk 8CPe?~wEw nv{Ra7#߱c\l=ԨYbO`Ttшы.s3TuӾS3|Pq_I`Te{=mgPBvϵ\L]+Hy2ut=4(X^Ph~Iv^0z5DPwS 90K1~iD*.>ct=Nb ߸Q] է>wk D`{\qw=~롬L_?rhR:spv{7} 1bx==3Nvaz(QmR/twO'<'7Pxzw')ntrF>tO_ƻMZ/Kg_bt{3c ˩xo39pǸGނ_0ѕ8^ b _!&ƈ{nT<:=m(nkuK)`f)Cgo{v5T~?#D/uy`< Կ0f:ڿw(yN7j >!cE6_-=sS`ԡa ac{[d|FMDߍק#?r~K4F1ȑ;ՖMwok7<{^󫸥s d(w2uGGނ?CLG\#ءdhX]<_qas8q*Ber86tK$FgCukү?p9.GK$?{,#? ?bFC[m1~ 8w,)>{:-?(g:bܯe:yV[zGx/{Mɠ{ڙzSZ.;ʞLYy. T5nڗCߗG]ѣ]7jzZ5^qsțWs?2Cyڕ`8v'tq^dh:Qk+\?ߡǂ!hRhh%#ƅ0O874,oy2Ҟ|]ݽo݉r]삧 Mgj)B qK|thmZ:WCbMf FIpWޞ:pO>y;p5 ~hqqQ62<@?7x5t7N k/7]OX6t׵ukON厊2*~3/НqgT8!n|qѷI)q?DP?Js")溯χtt9*g5%W`4^wd\p0Ĵ.L4D>z47ʹg_S~U F2>#e"iJ?3یkJܯ*hypatT ̫@Ɖ$0 \w8|Qas~~f_S~U Fsh~"_>,PIw/a{6.?a~ߑ 5%W`4phɇ'b7n^wbt$ה_U<ns5Q谰o½'.}C%ה_U\C̼'x;³.׍{5%W`49Zf6J0Wk%ה_UF`)j268;#5%W`4y ٧ʿU"%ה_Ulꚧ̡0n%0:-%ה_U|rq%ה_Uь]MbMU%_S~U FEy$ה_UQQ5%Wo%kJܯ*(J0*#H)q<kJܯ*(J0*#H)q4~/_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa)"\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UDŽQH$!CO2F?U_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`Y_{Oz[^<,7x?a}l( F-SJj +8tM=afq54>`4;>tqX4>ʲ:7kGI0ڎviO?.[ϞL5>SoWPGI0ڎvi_ Qs Tc-VGI0~E5Ѻ(OD^^u[p߭ s#܀F\y]et ˋ_a)bhn筮: FW7;$F]xi\}<k$>H:_IM?MZ 8zz.Zi F;;dДQ%6ϬM>x}k:JS8R-5a-LP9f~3F1;o?uݜ._:$F]x )Hxz>7ؙ"a8y|=v"G//~Ow{Xʺٺ`˺oJuuQ%6G硡Ȯⷦ s\ Y\SMLP]oqq3F1;Yq; 7G\{Gq4>`4Nsa2<0 .5a4aO^Uë?{<,el]t;R8icC/}ڈ-_1jr:uMU=a*{.[K֎( F)eF$125bxԇXgv_7t拔k?Q0 "\bM5vN,J0*#q_0*H쯩F FE)kǨH$Րʡc4^%ה_UQQ5%W`TGbMUaQ"\bMU%_S~U FEy$ה_UQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* %kJܯ*(J0*#ʂ+YjKQ5%WU^YjKQ5%WU^ؼ{_v0s١e_S~Uc}u/?YjKQ5%WU:F\/ ;Ֆ kJܯ* _>\}>N1eXV[2H)q1h8O1 FOXbMU^^ FOYbMUH蝋{*Fφ/'-1tOL K)q1zb=ʺӕ_S~Ucp5M1UL'-0_{cXԳtzyiRAbMUm{ܟkRAbMUvh-E$ה_U= IDATQQ5%W`TGbMU%_S~U FEy$ה_UQQ5%W`TGbMUa+~ FEJ0*#H)q<kJܯ*(J0*#H)q<kJܯ* %kJܯ*hk^VF=!q~h])X_Uc`bioIܯ_0ZI7Ϊ֐0jP;hWUu F7v Kv:RADt\NNvs}|}쥢 ~膢>Ry(}qQ`t+b=%Wձ/Dqc$W /-.H4Kmݨ$Mܤ ~hY1~Sөx ~hAvc/#RCpXjtu~N~ 8w ٠Xjrwٹlqz?z_ J0ZV! :4W۩=5~wmoo=P>6ʭOt:Yμѽt}}6e\ "/VK KdQ'6H[ʵw`U/`4P/іRNfDr+;Z"?+y3ףAC;nDv&H؍FߤDEN˧R/Ѐ 5HП\#g"G`nr-g1 طPUya3ww~dNDTFsB,mkًҗW3Tn/-=I-}y1~4F !}qٗwxn^mbTڳ;c S6F@J~=C`UؙэS%-|]Lv&Q?dnʵ76f0.\ʍ߱,g} F! olH91hbA QЅb\6`h+piB%&hXf aǐhz&~}a0Pw h9ZsY~sCoİ]{ w`_&x|MߋӺZ0POс*FKsh*oo!HμcCXLmpїwt+b`4p8Zѥݖbik ]t -gMǍ)rT/ ͹/URrԼ0Tg8GӢP,mjaмsy}dYLgh} R D"ݪQbmB%sqS0G;99ۯ&Lªٛyo}$ftL;p_:cI=0NhrsY~{8o 6$Zf> @9J `m0;z;M]{9\~m| (YnA泿֗sQD jTy/Sr&&G!Ѭ i&g ^ p$G$60qnFYZBh0u:Hq3sD FӘ;}eGQkH4?GR 7,t@Sg{Kh+OGc5sC9?OkJsQkHGsR~?'uJWG$Vl"簿x4NDg~CFD,4U:e9Q{5;hq51ѥ,sؿځp7@ك_0R..TrQmD$G 1}kIGΤ9[(~}%K~ҙM#?ͅh G~[h)5Gwo?_IGK݀9Q/5[Q }##=D68Jצ w51ԗ+}IggѱҦ6(v:ro}בc}JPLjh$G'8!j>yZFDor IޒmwxtGM_00Bgy69]!Z[o^4FBIeu&ijk} EGD -'Q|:!}28GD{ ~wq%9:yO2-`=Q^uj_d1:lQRΈԡ9]K\ր:0M/8:qD.c=#~NQx/x&Nk G]A֗ G񘫎Q"5!UV+D>˗QGqQ7 Ǩ3{oGɛ4Qx_}d_Qsen$G;~т8QO!V/8sc"@Bѷ98F ik?S9y<[cGDqt(`tnҕ)j`ѵKۻ$F'IvRxEU5< E-mbQF!_QG ]y W:8chQF}j]E6KwU:.Y hy7u?, Fj#k4Gh(GBTh(,96]&tsuο d[J_ndQ BCã󈴏5_04st@"DgrrQÐ>o=ypJ`_܍*G_}}),h2"hjnUDuqTTQ0jRb??'D꘨[_=}b yb1GIV ~ޯ18js1hG!Q型x H*1GOb c4]?EgQ~Qc]X 08xВH(ڐ(Ѱ#8Yg*"mQ/iY=G'9j=5ɇG`,U76ͤ,eqTg7pr4\ɺE R'G pqo;ư>ѵxpu?|AR (@3[CTè9<04~ϜA61ӗ䖣Z(Բ Mmc|\ZSh/9ٱ~1Q{hGGAQ9l ꕘFgpt8%91Z;O@Kr{ G~ȈhQ]GFDOc Kz9j ״.G@OsԼw~,xguD 3Dz*cZ0jQ|D4*Dn=p ~*mc[ZC&G!C_ҍQ{ *‡0 ]ljQ )G縧8 c!ʼGI9ׂQ Gu2GDC9 2. ڵ0)DF{SrH11ʾGI!rA~}~HZ<+7)Qkن=;isTPAã=D *aŹ(4kjTA#Ts5}bm4R9pz*hZ0sZzcqth8F-8ʸ(4ki$Fst]Ð(s"wHh5wr ?+G 1N6H`4Ӗ6]uS9 DMR&q}׸,!QU: h?qM1UDI/ M.#0Fp3㥯 .G9:C_n]6ChWX:YE!hhP3Q}ޱ`>%)ŴqikY4oQyZMdS"#o9 oIzcUV g0 a- ~~}{ՙCaIA][l]TGk/sɯv}~dPѨr4vl-]4GTeLk9:8?H]Y8Zo.77O#kR ~kHfc<~5Dҝ{~X4#H8 kFhD"/y2QtUf8v0ﵟv?>=JR )`I;+/YrIGPODu*L-["W{ɅJx+}<>ŧ ۿoS(qad9Fal5z2n$E7T.}Ӛf (GGֵL98Z`1٭_O_sZ o~ٺ(G^Zi3g2O#\Gʸer5 ]@׭_ pt/epn$q DV][In9brtx9ڙ05¶>\]\'ʸe%^GpTUD8;I;D_3O6!7~}~of:' {Vp_?z _w(90jrtBH$9q*Qc]V$S\D+D WO]v~=} =J^ŵQb[ãt]Xnj蝋H;qйb#.U7yw~!j`t\6I[X8!2ZV9 @ʈ1_|UFmQ[*kyoӚ ƈݡ[^\>QY#DM#\6IsYdoӷȑuL_PBm}4FYvQu4PVx( gZUGDxH2uJ&=}[mQmLkBD <N"c5/LQm*G19j@sQC$f ~GQ͞FQl RrD*G0㖣3D9ŸrނH[^HlpPnfF|Wƚ~_ʲJaj,_cwh-zW=aFDrԵ)FD)/G D^'2s`##G#ݧ>_N6n4c+(G= U>+;WE8GDhyIc&Ga(*4ft;0Z#KP1*ۣkR@qwE8{j*vU71:sZ/GD~>cM0(Th"#DA4O=7([#hB{~KG"FjVzP>+F_LMC)`L~a%9Bjg.]O/+Ĩ2Jbg[ͦ=`4[?+D5u[%rd~5y8&`Qɑ=ϩȥ~ݧ9qg1h-[hQCvgj['2QO(5Qf"O[\X"< F7O0~,K#eBbFf2nTjUGDkrLn>0$<&KD^YDމ+xg[/Q:ڈ(Ub9[D^ ^"[Kt2щg:^"ocTtJRGQF$Q7Gɧ"<Hk&ٓ1e -n=< rM`4F~(Q^"z(<ѩ`"owgruP(i`4ߖ ͘0Lu#CQo9 EQ ~u2#istHp3>urQ~z (lj`4ؘ]5!E5pt(%f"uDVS;FQd}F4.pBDŽH"K DѭGF9K,2Y;qEKc?=/ewјf`e(1^j D#ѧ4_KDV-V"g1Oјf`Cu`tyMY&x&3]ۭbf1'Gw}&Fybt9q_0q˴f@gF}z!([߇h<)QG"H'u{̙{Ĩ~G3B IDATL2m`4C3FYsTX&)iT"O3rLXJJ9ڧbi 'e$+aE0/u(G_pĨ] (u%<:1 !HQ'GhrTi?(n`4㖩D&FDŽ>`4[NR>E(bw&FTj{ ~«f&kʈtDRsQGs?rv_?5bь[q[W+QF'GKfZ< 4FEOFUǓh'NAԘ70q(m?Q F3nގ8aTl3,6ȱyܹXj4RRy)Emܘ"?bvb`'YDY=D]㨞 ,K9:f;LޱN50j;!z%bF威Lz8R'2i%9ݱN/׳-Gy< Fډ(G\Y%2s(yr k"QL1{vi Fra`4W_eڃEO Ff(Galc?hiQ͑D~QG7_w(iT9h? ^4<˳ڛ_!Z|=O_~8"'IF3~GqbAt0zƽL/w.ss.`娓D?׍|BQoy8Ǘh|jzfAqX"WΛ ?L(~UOẍ~=ULNK0: E9Pu2>03MpQr&? >#eiibh\95]^f-Qȉ(C4Gz_7'fQ?|ʯctbe}1U&_FB~ըgV1Ӗ8Y=U' ? qQzg/ͺe֖δG#+! ̾O̕p\7Z^EH`{#HH2h,T[3W]TF.K,'9Yv튊|7OFFF8e zl45sR:h҆(6:W' reirԓoPя~:~ب+U[ZtDtbrXhG]U 4qCqHO"'m']гyZ 7cҏب~2~ب+u[|DFD||J- yWlt=U4L8~~hW(G}D~بJK{l[.}sL@7)GS-(i:<-tӯ?lTѭ% %f䢴Q!UMP8Y7'"h7*G9>_~بNKèN.GT 4qCrt6aȤrԘ ']*W?Q}m9Y ~بRK3&f>}MQQhP SQD nedZ?GUj&FhnQwZS>92Гi8DvT]U+o~;.(ѝIm4GO&QG Ek&nv3"m/29۹oɍOᇍj4@9ʱE>*GGS4qKJ؁TLGPxF5 sfjR٨1'!h]-ؑɞ]hL%rjJzOJ`b>Z?lT)B9:׸Oѓ.f>ϤD]syC*z Fc(GK4 r4FM>@s5%ixD2|4r$UWQ")X浸`㉤amM4G)Q3?oQY"0UτG?G ᇍ^ t5l4裤c#& "ZL6=v"omHE%͘~ПO/uc6*jj$oG"C(L?ӄ "{y"g::Z_Y 6*hjyױQc(JgVK}|yDIcn"ovHE&0:+GS,Ji 6o .yݐ|zU&?Cוbf9!~S4>Z,mDh5}tn_38?z (>Gi㻰QWʚ|)GWmXu&:Qe} -12Ic9jBsƗޥMg'1بPDQ.G{MOy`/!5w6ѴP*Md1}R9Lm=j9: ?>,VEFبi\4>aK5"hT;z9'ۧ?>TQR[iNn|5хR|4@UGk8%gh"JϤO+G+%rC.ʸOPi"Sr4@g'KF_VgNkc.T6>:&}B9:MdN-F4SMLv M7b (G6Xiw#ߖ}B9kza\Oey3|tڽa0D֠/GGlҡD_X.]y 8I-mt!%薷D(9#}<$w$%e|qwh*`98vب+wvn,ZhV<eʪ&~T->Z|jLBzlt.Q:{aK?Z@NLd='5/}t_^ߘD6ܟ{ G c3r4D^s{|4"FJO8ŌLܞо 5~lΓXV1'h"}G9ZcFGƚIr4vY/+Xvry,)GkcV?QYL|6q]7v[ZzJ9:QrȿJFUG.(r4s]Q~,~"./G:ʍlthLkr3SQrOB}ޓ5FǍe?FhZz 潬l\1 *BQ/}Y,+:ܬ;e9jKFy.Ʊ з794(Gsa"K;X7l?uhojƼ[grT޻‰лP9|­lr4@68]/QFڙy{rԚF> Uzch,s_#}{:ѧ{cCSY掾myYt?|GE=:!rT~q]!=#h}6."Ԕy-:rTЭ!JۨQ1)%,z+?~u7ץHͲav=K=Cl|ͳmtYtD>LVP㢧L$rJ9*Α鶖)Ccg1aTuhlLoM+GuҊNk~^꡸Y뼪ӌNkق߁_FU$zw^c:(~W 9Vn:6 KN92H|XKby_vn KŦ6|3hrT+JPǼDVj_1m&[]Ǖz9'y=4R1~A_>ܾxnr8G }tW.Zz͠yF&e}TEf=oFٻ?TlT('l$6[ UC?oA0ب+M$ٓ޵QgPzd]\ ͵&o++q^'hJ-w׬ Dhszǻ?Ϟcd\s(3QmuIk}V=yS$70:6jg~~xo36 W=[YZnI;W$-K'8l4U10Th*Hٺ1?>K3flnvzZlա^yqڦpG#6(G5 Pi"xmffLվhhTR&iӆl[^>cuhWۮwoX6a)&ݙn4#.3}3NcV"+MW_9ܱc۽W? -ZlF]h&SF>֤ HcD#罋ڨf-Blӡ^٨[6;w61 X;no>6hF<#>m8'LQ!<)~2W~vܟeM]t(Ok<#v0/}3vTU΄wwώTN޶NzzQ:G74ǬFf!]&k&.X97ڙb*>:(U7i9KѭȌ2<'WwWN|FrerT8U q(&iy"h!ʃ߁$;6f|>>:hMr[|6ʠ?cr" +~/\ w;o4So6(Ge.ff6^9K[i= 뎊#k3mt'ݧoŻg9&h%FmpQFYHz6ڃl<&ڇ[:+ 5Qdj ݩ'*5+(__mBmԻe.CkF[i6*yFor4l8ꃟlY Ozڔrn (f;{ϖ) Dֿ)q-X\W~hX}/={2ym{H^u0iy4#)?I6^<9~J~+q]zVɃzr'UE^g~4#)?]sѸ\f!FFwш2T'cTDwS}^fn_!gǛb!a!5~NRYlLeHE+y9Md}kdZ@iрn![g 'v]Էz?b"]}[$Dрv~捤ԛ.(h/DWNdug׶jFOqHJe|Q9oLP%SO:DI`5!1pQFzI2IcqM?l1\ =?-Пبh,kڂ)죰os_$\}4Poz(Oy B=WH?eo~9K=Z69:#-rAoCj'- Y5/Mԁ)} 2v}}̇ˀO uNm5O6P0l =&`4(m_K_58~OE{g]Ry>z0׳w^ٰxW]I)}MuhA,Eb%Q룉G1z\P{"{9q~Q8٧ci ~/_Q_l lMcj/F56vEr6)h/7+#?j+hNʡsG׏w$P{#zjC¿} kQ{5ڝg)o&KGRѤ F/m4md# F>p84\#)Y#=IQ&kq1K?u6Kq]?᝝9̟;FTQw,Id=#]1b>lf=)}1sMy ?vґj=o>* +QM]K|/ۘ/~a?Q/}6Koj k o"U 6D7QZhcs )dA(.8mMuۨUq`7YrR6[g}mGb|"i"Lt_@\i7Q{R>%0MljMC{]P\v/>lԥ8"cDzZ?;L}zx4UEOonя?6ڪgO3o\4ܩ'5)wWQxaz{Hd>zǃ0o(/u6L3?DmQ}芞oNbȯŧUćSOZ}ovGPݔ ~OB>jw a5Yi-3Ux8vȑsW_ }B\FGsڵ`I4^|{-C UkeeLJߏF=Ρ; ⬳Ԏl4mp]:!+EL'>,kX ?lfG3[a}O;/Me[%j$tʍۀ)*?ltӗߵe'grDvn`,e IDATP~D^ǚa(˧NViF;3Fn"1>ޙn.jڐjx"gط7/Aro%aS)y}fm6&qx]Zd0ud6K*s⯚w)ѩ6N=cdOm*ntR?[ϋv mFeƻ<>CdfHm$]طqwhzHbѡ`"goBљD)w*]9ǢC;cFL`Olor#*~adwuᯛ27хvKa?ܑ>w˿ iO'.n{o8#D;WD_O6q09Ng}a0Kͅ7G;s诌o-aƑi(8ER1ӽɩAH? X6.mNk X0 }=f=t}}v+I4g;uoCk ~ƋoǺfܿwN_K[qu ?96*ӿdW f[LߎyIi[~o%4uW诊/(u6jSZ{!%%L٘`ӆ=3ԯC/=au޴l~/{a)u\F>۩dw2n!&?7D҃6ꗝ]?Ϥ#=1_i*o5g_ZFjv'S:0>("uTuWQvm~d E)%c"3r^]0_0?lԧ]FPL\1Y<=\G ~?Qv9Εݨl%EU>)_R_T`!yS*gF~sS_R_TQ5'¸@`Zw+@`z x* .&/)/*(#/)/*(#/)/*(#/)/T\Q-/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/d\Q-/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/*(#/)/D\Q-/)/*(#/)/*K5ltҰѝ1z> ݨ@l`^xg>TZ%E`W>9}}QZ%E%ǻg/O<ݟjRJHA_R_Trж(UP+!JCQm 6 A$l H$(AHܩ ڨj7 AQAFto'@ լMB-(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DB  6 A$l H$(AHQ `A"F!DBSjIENDB`gstat/vignettes/.install_extras0000644000176200001440000000003313777370515016454 0ustar liggesusersspatio-temporal-kriging.bibgstat/vignettes/prs.Rnw0000644000176200001440000002004513777370515014720 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The pairwise relative semivariogram } \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{alltt} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The pairwise relative semivariogram} \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma} } \date{\small Aug 29, 2011 } \begin{document} \maketitle \section{Introduction} The general relative variogram (Deutsch and Journel, 1997) is defined as $$ \gamma(h) = \frac{1}{2N_h} \sum_{i=1}^{N_h} \left(\frac{2(Z(s_i)-Z(s_i+h))}{Z(s_i)+Z(s_i+h)}\right)^2. $$ It is claimed to reveal spatial structure (correlation) better when data are skewed and/or clustered. The \code{cluster.dat} data set used in this vignette, from the GSLIB distribution\footnote{F77 source code for Linux, downloaded Aug 28, 2011 from \code{http://www.gslib.com/}}, seems to confirm this. From version 1.02 on, R package \code{gstat} provides computation of the {\em pairwise relative semivariogram}. The following code provides an example and verification of the computation using direct R code and using the GSLIB program \code{gamv}. The following code imports the \code{cluster.dat} data from GSLIB, which has been converted to have a single-line header containing column names, packaged with the R gstat package, and converts it into a \code{SpatialPointsDataFrame} object: <<>>= library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y @ The following commands specify a sequence of lag boundaries that correspond to the GSLIB conventions, and compute a regular variogram using these boundaries: <<>>= bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) @ To compute the relative pairwise variogram, the logical argument \code{PR} ({\em pairwise relative}) needs to be set to \code{TRUE}: <<>>= variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) @ Figure \ref{fig:vgm} shows the two variograms, as plots, side by side \begin{figure} <>= pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) @ \caption{Regular variogram (left) and pairwise relative variogram (right) for the GSLIB data set \code{cluster.dat}.} \label{fig:vgm} \end{figure} \section{Verification with plain R code} The following R code reproduces the relative pairwise semivariogram values for the first three lags, i.e. 0-2.5, 2.5-7.5 and 7.5-12.5. <<>>= z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 @ \section{Verification with GSLIB} In a verification with the GSLIB (Deutsch and Journel, 1997) code of \code{gamv}, the following file was used: \begin{alltt} Parameters for GAMV ******************* START OF PARAMETERS: ../data/cluster.dat \\file with data 1 2 0 \\ columns for X, Y, Z coordinates 1 3 \\ number of varables,column numbers -1.0e21 1.0e21 \\ trimming limits gamv.out \\file for variogram output 10 \\number of lags 5.0 \\lag separation distance 2.5 \\lag tolerance 1 \\number of directions 0.0 90.0 50.0 0.0 90.0 50.0 \\azm,atol,bandh,dip,dtol,bandv 0 \\standardize sills? (0=no, 1=yes) 2 \\number of variograms 1 1 1 \\tail var., head var., variogram type 1 1 6 \\tail var., head var., variogram type \end{alltt} Running this program with these parameters gave the following output: \begin{alltt} Semivariogram tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 58.07709 298 8.62309 8.62309 3 5.473 54.09188 1248 5.41315 5.41315 4 10.151 48.85144 1978 4.42758 4.42758 5 15.112 40.08909 2498 4.25680 4.25680 6 20.033 42.45081 2296 3.74311 3.74311 7 25.020 48.60365 2734 4.09575 4.09575 8 29.996 46.88879 2622 4.15950 4.15950 9 34.907 44.36890 2170 3.77190 3.77190 10 39.876 47.34666 1808 4.54173 4.54173 11 44.717 38.72725 1222 5.15251 5.15251 12 49.387 30.67908 438 4.56539 4.56539 Pairwise Relative tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 .36084 298 8.62309 8.62309 3 5.473 .63071 1248 5.41315 5.41315 4 10.151 .83764 1978 4.42758 4.42758 5 15.112 .77691 2498 4.25680 4.25680 6 20.033 .87746 2296 3.74311 3.74311 7 25.020 .89610 2734 4.09575 4.09575 8 29.996 .90023 2622 4.15950 4.15950 9 34.907 .96043 2170 3.77190 3.77190 10 39.876 .90554 1808 4.54173 4.54173 11 44.717 .75545 1222 5.15251 5.15251 12 49.387 .82268 438 4.56539 4.56539 \end{alltt} As can be seen, the values in the third column (semivariogram for the first section, pairwise relative semivariogram for the second) correspond to the output generated by \code{variogram} of package \code{gstat}. Two differences with respect to the gstat output are: \begin{itemize} \item for the first lag with distance zero, GSLIB reports that the semivariance value is zero based on 280 point pairs; \item the number of point pairs in GSLIB is double the number reported by gstat. \end{itemize} The ground for these differences seems that the GSLIB \code{gamv} uses a single routine for computing variograms as well as cross variograms and cross covariances. For cross variograms or covariograms, considering two variables $Z_a$ and $Z_b$ each having $N$ observations, the $N^2$ point pairs $Z_a(s_i),Z_b(s_i+h)$ and $Z_a(s_i+h),Z_b(s_i)$ need to be evaluated, and all contribute information. For direct (non-cross) variograms or covariograms, $Z_a=Z_b$ and the $N^2$ pairs considered contain the $N$ trivial pairs $(Z(s_i)-Z(s_i))^2=0$, which contribute no information, as well as all duplicate pairs, i.e. in addition to $(Z(s_i)-Z(s_i+h))^2$, the identical pair $(Z(s_i+h)-Z(s_i))^2$ is also considered. This leads to correct variogram value estimates, but incorrect unique point pair numbers. (Data set \code{cluster} contains $N=140$ observations.) In contrast, \code{gstat} considers (and reports) only the number of unique pairs for each lag. \section*{References} \begin{itemize} \item Deutsch, C.V., A.G. Journel, 1997. GSLIB: Geostatistical Software Library and User's Guide, second edition. Oxford University Press. \end{itemize} \end{document} gstat/vignettes/gstat.Rnw0000644000176200001440000003154014207202535015221 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The meuse data set: a tutorial for the gstat R package } \documentclass[a4paper]{article} \usepackage{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The meuse data set: a brief tutorial\\ for the {\tt gstat} R package } \author{\href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}} \date{\today} \begin{document} \maketitle \section{Introduction} The \code{meuse} data set provided by package \code{sp} is a data set comprising of four heavy metals measured in the top soil in a flood plain along the river Meuse, along with a handful of covariates. The process governing heavy metal distribution seems that polluted sediment is carried by the river, and mostly deposited close to the river bank, and areas with low elevation. This document shows a geostatistical analysis of this data set. The data set was introduced by Burrough and McDonnell, 1998. This tutorial introduced the functionality of the R package \code{gstat}, used in conjunction with package \code{sp}. Package \code{gstat} provides a wide range of univariable and multivariable geostatistical modelling, prediction and simulation functions, where package \code{sp} provides general purpose classes and methods for defining, importing/exporting and visualizing spatial data. \section{R geostatistics packages} Package \code{gstat} (Pebesma, 2004) is an R package that provides basic functionality for univariable and multivariable geostatistical analysis, including \begin{itemize} \item variogram modelling, residual variogram modelling, and cross variogram modelling using fitting of parametric models to sample variograms \item geometric anisotropy specfied for each partial variogram model \item restricted maximum likelihood fitting of partial sills \item variogram and cross variogram maps \item simple, ordinary, universal and external drift (co)kriging \item (sequential) Gaussian (co)simulation equivalents for each of the kriging varieties \item indicator (co)kriging and sequential indicator (co)simulation \item kriging in a local or global neighbourhood \item block (co)kriging or simulation for each of the varieties, for rectangular or irregular blocks \end{itemize} Other geostatistical packages for R usually lack part of these options (e.g. block kriging, local kriging, or cokriging) but provide others: e.g. package \code{geoR} and \code{geoRglm} (by Paulo Ribeiro and Ole Christensen) provide the model-based geostatistics framework described in Diggle et al. (1998), package \code{fields} (Doug Nychka and others) provides thin plate spline interpolation, covariance functions for spherical coordinates (unprojected data), and routines for spatial sampling design optimization. \section{Spatial data frames} As an example, we will look at the meuse data set, which is a regular data frame that comes with package \code{gstat} (remove the 88 from the colour strings to make a plot without alpha transparency on windows or X11): <>= library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") @ % the following is needed because lattice plots (bubble wraps xyplot) do not % show without an explicit print; in order not to confuse users, we hide this: <>= print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) @ and note the following: \begin{enumerate} \item the function \code{coordinates}, when assigned (i.e. on the left-hand side of an \verb|=| or \verb|<-| sign), promotes the \code{data.frame} meuse into a \code{SpatialPointsDataFrame}, which knows about its spatial coordinates; coordinates may be specified by a formula, a character vector, or a numeric matrix or data frame with the actual coordinates \item the function \code{coordinates}, when not assigned, {\em retrieves} the spatial coordinates from a \code{SpatialPointsDataFrame}. \item the two plotting functions used, \code{plot} and \code{bubble} assume that the $x$- and $y$-axis are the spatial coordinates. \end{enumerate} \section{Spatial data on a regular grid} <>= data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") @ <>= print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) @ If you compare the bubble plot of zinc measurements with the map with distances to the river, it becomes evident that the larger concentrations are measured at locations close to the river. This relationship can be linearized by log-transforming the zinc concentrations, and taking the square root of distance to the river: <>= plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) @ \section{Variograms } Variograms are calculated using the function \code{variogram}, which takes a formula as its first argument: \verb|log(zinc)~1| means that we assume a constant trend for the variable log(zinc). <>= lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) @ <>= print(plot(lzn.vgm, lzn.fit)) @ Instead of the constant mean, denoted by \verb|~1|, we can specify a mean function, e.g. using \verb|~sqrt(dist)| as a predictor variable: <>= lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) @ <>= print(plot(lznr.vgm, lznr.fit)) @ In this case, the variogram of residuals with respect to a fitted mean function are shown. Residuals were calculated using ordinary least squares. \section{Kriging} <>= lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) @ <>= print(spplot(lzn.kriged["var1.pred"])) @ \section{Conditional simulation} <>= lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") @ <>= print(spplot(lzn.condsim, main = "four conditional simulations")) @ For UK/residuals: <>= lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") @ <>= print(spplot(lzn.condsim2, main = "four UK conditional simulations")) @ \section{Directional variograms} The following command calculates a directional sample variogram, where directions are binned by direction angle alone. For two point pairs, $Z(s)$ and $Z(s+h)$, the separation vector is $h$, and it has a direction. Here, we will classify directions into four direction intervals: <>= lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) @ <>= print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) @ Looking at directions between 180 and 360 degrees will repeat the image shown above, because the variogram is a symmetric measure: $(Z(s)-Z(s+h))^2=(Z(s+h)-Z(s))^2$. The first plot gives the variogram in the zero direction, which is North; 90 degrees is East. By default, point pairs are assigned to the directional variorgram panel with their nearest direction, so North contains everything between -22.5 and 22.5 degrees (North-West to North-East). After classifying by direction, point pairs are binned by separation distance class, as is done in the usual omnidirectional case. In the figure, the partial sill, nugget and model type of the model are equal to those of the omnidirectional model fitted above; the range is that in the direction with the largest range (45$^o$), and the anisotropy ratio, the range in the 135 direction and the range in the 45 direction, estimated ``by eye'' by comparing the 45 and 135 degrees sample variograms. Gstat does not fit anisotropy parameters automatically. We do not claim that the model fitted here is ``best'' in some way; in order to get to a better model we may want to look at more directions, other directions (e.g. try {\tt alpha = c(22, 67, 112, 157) }), and to variogram maps (see below). More elaborate approaches may use directions in three dimensions, and want to further control the direction tolerance (which may be set such that direction intervals overlap). For the residual variogram from the linear regression model using \code{sqrt(dist)} as covariate, the directional dependence is much less obvious; the fitted model here is the fitted isotropic model (equal in all directions). <>= lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) @ <>= print(plot(lznr.dir, lznr.fit, as.table = TRUE)) @ \section{Variogram maps} Another means of looking at directional dependence in semivariograms is obtained by looking at variogram maps. Instead of classifying point pairs $Z(s)$ and $Z(s+h)$ by direction and distance class {\em separately}, we can classify them {\em jointly}. If $h=\{x,y\}$ be the two-dimentional coordinates of the separation vector, in the variogram map the semivariance contribution of each point pair $(Z(s)-Z(s+h))^2$ is attributed to the grid cell in which $h$ lies. The map is centered around $(0,0)$, as $h$ is geographical distance rather than geographical location. Cutoff and width correspond to some extent to map extent and cell size; the semivariance map is point symmetric around $(0,0)$, as $\gamma(h)=\gamma(-h)$. <>= vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) @ <>= print(plot(vgm.map, threshold = 5)) @ The threshold assures that only semivariogram map values based on at least 5 point pairs are shown, removing too noisy estimation. % The plot is plagued by one or two extreme values, corresponding to cells % with very small number of point pairs, which should be removed. \section{Cross variography} Fitting a linear model of coregionalization. <>= g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") @ <>= print(plot(v, g.fit)) @ <>= print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) @ \section*{References} \begin{itemize} % \item Abrahamsen, P., F. Espen Benth, 2001. Kriging with inequality % constraints. Mathematical Geology 33 (6), 719--744. % \item Bivand, R.S., 2003. Approaches to classes for spatial data in R. % In: K.~Hornik \& F.~Leisch (Eds.), Proceedings of the 3rd International % Workshop on Distributed Statistical Computing (DSC 2003) March 20--22, % Vienna, Austria. ISSN 1609-395X; available from [1]. \item Burrough, P.A., R.A. McDonnell, 1998. Principles of Geographical Information Systems, 2nd Edition. Oxford University Press. \item Diggle, P.J., J.A. Tawn, R.A. Moyeed, 1998. Model-based geostatistics. Applied Statistics 47(3), pp 299-350. % \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for % geostatistical modelling, prediction and simulation. Computers \& % Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://dx.doi.org/10.1016/j.cageo.2004.03.012}{30: 683-691}. % \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial % Prediction. Mathematical Geology, 25 (2), pp. 219--240. \item Wackernagel, H., 1998. Multivariate Geostatistics; an introduction with applications, $2^{\mbox{nd}}$ edn., Springer, Berlin, 291 pp. \end{itemize} \end{document} # g = gstat(NULL, "log.zinc", log(zinc)~1, meuse) # g = gstat(g, "log.zinc.res", log(zinc)~sqrt(dist), meuse) # lplot(vgm.map[["map"]], c("log.zinc", "log.zinc.res")) % vim:syntax=tex gstat/vignettes/st.Rnw0000644000176200001440000003643513777370515014554 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{Introduction to Spatio-Temporal Variography } % \VignetteIndexEntry{ Introduction to Spatio-Temporal Variography } \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}, \href{mailto:ben.graeler@uni-muenster.de}{Benedikt Gr\"{a}ler} } \date{\small \today } \begin{document} \setkeys{Gin}{width=0.9\textwidth} \maketitle \section{Introduction} Since \code{gstat} package version 1.0-0, a dependency of gstat on the R package \code{spacetime} was introduced, allowing the code in \code{gstat} to exploit spatio-temporal data structures from that package. This vignette describes the possibilities and limitations of the package for spatio-temporal geostatistics. To understand some of the possibilities and limitations, some knowledge of the history of the software is needed. The original \code{gstat} software (Pebesma and Wesseling, 1998) was a standalone computer {\em program} written in around 25,000 lines of C code, and would do geostatistical modelling, prediction and simulation. The \code{gstat} R package (Pebesma, 2004) consisted mostly of an R interface to this C code, together with convenience functions to use R's modelling interface (formula's, see \code{?lm}) and graphic capabilities (trellis graphics in package \code{lattice} to show cross variogram as matrix plots; interaction with variogram clouds using base plots). Starting 2003, a group of programmers developed a set of classes and methods for dealing with spatial data in R (points, lines, polygons, grids), which was supported by the publications of the well-known ASDAR book (Bivand et al. 2008; see also \url{http://www.asdar-book.org/}) and helped convergence in the user community, with in 2011 over 2000 subscribers on the {\tt r-sig-geo} mailing list. Package \code{gstat} was one of the first packages that adopted and benefited from these classes. To realize a particular idea, writing code in C typically takes about 10-20 times as long as writing it in R. C code can be more efficient, gives more control over memory usage, but is also more error prone--mistakes in C code make an R session crash, something that is hard to do when writing R code. The original C code of \code{gstat} (Pebesma and Wesseling, 1998) provides all kriging varieties (universal, ordinary, simple; univariable, or multivariable as in cokriging) for two- or three-dimensional data. When the spatial domain is constrained to two dimensions (and this might cover over 99\% of the use cases!), the third dimension might be used to represent time. As such, the {\em metric} variogram model, which allows for geometric anisotropy definition in three dimensions, can be used for spatio-temporal kriging. When defining the three-dimensional variogram as the sum of 2 or more nested variogram (summed) models, one can choose anisotropy coefficients for a single model such that this model is {\em effectively} zero in some directions, e.g. in space {\em or} in time; this allows one to approximate the so-called space-time sum model. It should be noted that at the C code there is no knowledge whether a third dimension represents space, or time. As such, particular characteristics of time cannot be taken care of. Since the second half of 2010, the development of an R package \code{spacetime} started. It provides methods and classes for spatio-temporal data, and builds on the spatial data classes in \code{sp} and time series classes in \code{xts}. This document will explain how data in this form, and methods provided by this package, can be used for spatio-temporal geostatistics. We will work with a data set with air quality (PM10) measurements over germany, taken from rural background stations available in the data sets provided by the European Environmental Agency. <<>>= library(spacetime) rm(list = ls()) data(air) ls() @ \section{Variography} \subsection{Temporal autocorrelation and cross correlation} We will look into a subset of the data, ranging from 2005 to 2010, and remove stations that have only missing values in this period: <<>>= if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) @ Next, we will (rather arbitrarily) select four stations, which have the following labels: <<>>= rn = row.names(r5to10@sp)[4:7] rn @ In the following, autocorrelation functions are computed and plotted. The resulting plot is shown in Figure~\ref{fig:acf}. <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 for(i in rn) acf(na.omit(r5to10[i,]), main = i) par(mfrow=c(1,1)) @ \begin{figure}[hbt] \begin{center} <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) @ \end{center} \caption{Autocorrelations for PM10; time lag unit in days.} \label{fig:acf} \end{figure} Auto- and cross correlations can be computed when a multivariate time series object is passed to {\tt acf}: <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ The resulting plot is shown in Figure~\ref{fig:ccf}. \begin{figure}[hbt] \begin{center} <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ \end{center} \caption{autocorrelations (diagonal) and cross correlations (off-diagonal) for the four stations selected; time lag unit in days. } \label{fig:ccf} \end{figure} From these graphs one should be able to observe the following \begin{itemize} \item autocorrelations for lag 0 are always 1 \item cross correlations for lag 0 are not always 1 \item cross correlations can be asymmetric, meaning that when $\rho_{AB}(h)$ is the correlation between $Z(s_A,t)$ and $Z(s_B,t+h)$, $$\rho_{AB}(h) = \rho_{BA}(-h) \ne \rho_{AB}(-h)$$ with $s_A$ and $s_B$ the two stations between which a cross correlation is computed, and $h$ the (directional!) lag between the series. \end{itemize} The plot further more shows that for these four stations the asymmetry is not very strong, but that cross correlations are fairly strong and of a similar form of autocorrelations. This kind of plot does not work very well in layouts of e.g. 10 x 10 sub-plots; {\tt acf} automatically chooses 4 x 4 as the maximum a single plot. To try this out, do a 7 x 7 plot <>= acf(na.omit(as(r5to10[4:10,], "xts"))) @ and note that here we see in the last figure (DESH \& DESN04) a pair of plots with nearly no cross correlation. This might have to do with the spatial distance between these two stations: <<>>= library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) @ (What is the spatial distance between stations DESH and DESN04?) \subsection{Spatial correlation, variograms} In the next steps, we will sample 100 time instances randomly, <<>>= rs = sample(dim(r5to10)[2], 100) @ we select these instances as a {\tt SpatialPointsDataFrame} and add a time index to them. After this we bind them together in a single {\tt SpatialPointsDataFrame} which has a time index {\tt ti}: <<>>= lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) @ Then, we can compute the pooled variogram <<>>= library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) @ and plot it (Figure~\ref{fig:vgm}): <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) plot(v, vmod) @ \begin{figure}[hbt] \begin{center} <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) @ \end{center} \caption{sample spatial variogram, averaged over 100 randomly chosen time steps} \label{fig:vgm} \end{figure} The fitted model is this: <<>>= vmod @ One should note that the fit is rather poor, and not forget that we only have 53 stations selected. The time resolution is rich (1862 days) but the number of stations is small: <<>>= dim(r5to10) @ We can fit a spatio-temporal variogram the usual way, by passing an object of class {\tt STFDF} (Pebesma, 2012): <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ Alternatively, if this takes too long, a temporal subset can be taken, e.g. using the first 200 days: <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ taking random days from the full period will lead to the a wrong assumption that every time index increment reflect a constant lag increase. As an alternative, we will here load the precomputed S/T variogram: <<>>= data(vv) @ % remove the model column to keep text and figures in line. <>= vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] @ Plotting this object can be done in several ways, two 2D-plots are shown in Figure~\ref{fig:map} and a 3D wireplot is shown in Figure~\ref{fig:wire}: <>= plot(vv) plot(vv, map = FALSE) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) @ \end{center} \caption{Spatio-temporal sample variogram map (top) and sample variograms for each time lag (bottom); both figures depict the information of object {\tt vv}.} \label{fig:map} \end{figure} \subsection{Fitting a spatio-temporal variogram model} At first, we try to fit a metric model with spatio-temporal anisotropy: <<>>== metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) @ As numerical criterion to judge the goodness of fit of model and sample variogram, the root-mean-squared-difference between the surfaces can be obtained by: <<>>= attr(metricVgm, "optim")$value @ The final model can be plotted with the sample variogram (Figure~\ref{fig:mm}): <>= plot(vv, metricVgm) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, metricVgm)) @ \end{center} \caption{Sample variogram map (left) and fitted metric model (right).} \label{fig:mm} \end{figure} \pagebreak Now, let us try to fit and plot a separable model (Figure~\ref{fig:sm}): <<>>== sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) @ To compare this model with the previous one, we look at the optimized root-mean-squared-differences between the two surfaces and plot sample and both models: <<>>= attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, list(sepVgm, metricVgm))) @ \end{center} \caption{Sample variogram map (left), fitted separable model (middle) and fittted metric model (right).} \label{fig:sm} \end{figure} A wireframe (3D) plot of sample variogram and fitted variogram models can be obtained e.g. by <>= library(lattice) plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5))) @ which is shown in Figure~\ref{fig:wire}. Further spatio-temporal model definitions can be found in the help pages of {\tt fit.StVariogram} and {\tt variogramSurface}. The demo {\tt stkrige} presents further examples and illustrates an interactive 3D-plot of sample variogram and the fitted variogram model. An interactive variogram exploration web-tool is avaialble at \url{http://giv-graeler.uni-muenster.de:3838/spacetime/}. \begin{figure}[hbt] \begin{center} <>= library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) @ \end{center} \caption{Wireframe plots of sample and fitted space-time variograms.} \label{fig:wire} \end{figure} \clearpage \section{Spatio-temporal prediction} The vignette in package \code{spacetime} gives an example of using the gstat function \code{krigeST} for spatio-temporal kriging of the Irish wind data. The \code{krigeST} function uses global kriging, but only needs to invert the purely spatial and purely time covariance matrices in the separable case. For more generic spatio-temporal kriging where space is two-dimensional, one could use \code{krige}, defining the observations and prediction locations as three-dimensional data sets, see for an example <>= demo(gstat3D) @ It needs to be pointed out that in that case, the time (typically the third dimension) needs to be numeric, and three-dimensional anisotropy needs to be defined properly (see \code{?vgm}). In case the data set is too large for global kriging, one could try to use local kriging, and select data within some distance, or by specifying \code{nmax} (the nearest $n$ observations). In both cases, it is advisable to transform time such that one can use an {\em isotropic} variogram model in the three dimensions, as only in that case the nearest $n$ observations correspond to the $n$ most correlated observations. \code{krigeST} provides a solution where a \code{bufferNmax}-times larger neighbourhood is evaluated within the covariance model and the strongest correlated \code{nmax} neighbours are selected. An additional consideration is that in space-time, observations may not be regularly spaced. In some cases, the nearest $n$ observations may come from a single measurement location, which may lead to sharp jumps/boundaries in the interpolated values. This might be solved by using larger neighbourhoods, or by setting the \code{omax} in \code{krige} or \code{gstat} calls to the neighbourhood size to select {\em per octant} (this should be combined with specifying \code{maxdist}). %\section{Spatio-temporal simulation} \section*{References} \begin{itemize} \item Bivand, R., E. Pebesma and V. Gomez-Rubio, 2008. Applied Spatial Data Analysis with R. Springer. \item Cressie, N.A.C., 1993. Statistics for Spatial Data. Wiley. \item Cressie, N. and C. Wikle, 2011. Statistics for Spatio-temporal Data. Wiley. \item Pebesma, E., 2012. spacetime: Spatio-Temporal Data in R. Journal of Statistical Software, volume 51, issue 7; \href{http://www.jstatsoft.org/v51/i07/}{1-30}. \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for geostatistical modelling, prediction and simulation. Computers \& Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://www.sciencedirect.com/science/journal/00983004}{30: 683-691} \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. \end{itemize} \end{document} gstat/R/0000755000176200001440000000000014413347046011603 5ustar liggesusersgstat/R/set.R0000644000176200001440000000304313777370515012532 0ustar liggesusers# $Id: set.q,v 1.7 2008-12-16 14:59:22 edzer Exp $ gstat.set <- function(set) { if(!is.list(set)) stop("set should be a list") if (length(set) == 0) return(NULL) ret = NULL n = names(set) for (i in (1:length(set))) { val = set[[i]] if (n[i] == "method") str = paste("method: ", val, ";", sep="") else { if (is.character(val)) val = paste("'", val, "'", sep = "") str = paste("set ", n[i], " = ", val, ";", sep="") } ret = c(ret, str) } ret } gstat.load.set <- function(set) { if(!is.list(set)) stop("set should be a list") if (length(set) == 0) return(NULL) n = names(set) for (i in (1:length(set))) { if (n[i] == "method") ret = .Call(gstat_set_method, set[[i]]) else ret = .Call(gstat_set_set, n[i], set[[i]]) } invisible(ret) } gstat.load.merge <- function(obj) { if (is.character(obj$merge) && length(obj$merge) == 2) obj$merge = list(c(obj$merge[1], 1, obj$merge[2], 1)) if (!is.list(obj$merge)) stop("merge argument should be list or character vector of lenght 2") ret = NULL for (i in 1:length(obj$merge)) { m = obj$merge[[i]] if (is.character(m) && length(m) == 4) { id = match(m[c(1,3)], names(obj$data)) - 1 # name ->> id if (any(is.na(id))) stop(paste("could not match all ids:", m[c(1,3)])) col = as.integer(m[c(2,4)]) - 1 if (any(is.na(col)) || any(col < 0)) stop("merge: parameters should be positive integers") ret = .Call(gstat_set_merge, id[1], col[1], id[2], col[2]) } else stop( "list elements of merge should be lenght 4 character vectors") } ret } gstat/R/fit.variogram.R0000644000176200001440000000766614406630061014507 0ustar liggesusers# $Id: fit.variogram.q,v 1.10 2008-12-15 14:27:29 edzer Exp $ "fit.variogram" <- function (object, model, fit.sills = TRUE, fit.ranges = TRUE, fit.method = 7, debug.level = 1, warn.if.neg = FALSE, fit.kappa = FALSE) { cl = match.call() if (missing(object)) stop("nothing to fit to") if (!inherits(object, "gstatVariogram") && !inherits(object, "variogramCloud")) stop("object should be of class gstatVariogram or variogramCloud") if (inherits(object, "variogramCloud")) object$np = rep(1, nrow(object)) if (length(unique(object$id)) > 1) stop("to use fit.variogram, variogram object should be univariable") if (missing(model)) stop("no model to fit") if (is(model, "variogramModelList")) { ret = lapply(model, function(x) fit.variogram(object, x, fit.sills = fit.sills, fit.ranges = fit.ranges, fit.method = fit.method, debug.level = debug.level, warn.if.neg = warn.if.neg, fit.kappa = fit.kappa)) sse = sapply(ret, function(x) attr(x, "SSErr")) return(ret[[which.min(sse)]]) } if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel (use vgm)") if (fit.method == 5) stop("use function fit.variogram.reml() to use REML") if (length(fit.sills) < length(model$model)) fit.sills = rep(fit.sills, length(model$model)) if (length(fit.ranges) < length(model$model)) fit.ranges = rep(fit.ranges, length(model$model)) if (fit.method == 7 && any(object$dist == 0)) stop("fit.method 7 will not work with zero distance semivariances; use another fit.method value") if (any(is.na(model$psill)) || any(is.na(model$range))) model = vgm_fill_na(model, object) fit.ranges = fit.ranges & !(model$model %in% c("Nug", "Err")) # no ranges to fit for Nug/Err if (isTRUE(fit.kappa)) fit.kappa = seq(0.3, 5, 0.1) if (any(model$model %in% c("Mat", "Ste")) && length(fit.kappa) > 1) { f = function(x, o, m) { m[m$model %in% c("Mat", "Ste"), "kappa"] = x fit.variogram(o, m, fit.kappa = FALSE, fit.method = fit.method, debug.level = debug.level) # fits range } ret = lapply(fit.kappa, f, object, model) return(ret[[ which.min(sapply(ret, function(x) attr(x, "SSErr"))) ]]) } initialRange = model$range .Call(gstat_init, as.integer(debug.level)) .Call(gstat_load_ev, object$np, object$dist, object$gamma) load.variogram.model(model) ret = .Call(gstat_fit_variogram, as.integer(fit.method), as.integer(fit.sills), as.integer(fit.ranges)) .Call(gstat_exit, 0) model$psill = ret[[1]] model$range = ret[[2]] attr(model, "singular") = as.logical(ret[[3]]); attr(model, "SSErr") = ret[[4]] direct = attr(object, "direct") if (!is.null(direct)) { id = unique(object$id) if (any(direct[direct$id == id, "is.direct"]) && any(model$psill < 0)) { if (warn.if.neg) warning("partial sill or nugget fixed at zero value") fit.sills = model$psill > 0 model$psill[model$psill < 0] = 0.0 model$range = initialRange return(fit.variogram(object, model, fit.sills = fit.sills, fit.ranges = fit.ranges, fit.method = fit.method, debug.level = debug.level, warn.if.neg = warn.if.neg, fit.kappa = fit.kappa)) } } if (attr(model, "singular") && debug.level) { rat = mean(object$gamma) / mean(object$dist) if (rat > 1e6 || rat < 1e-6) print("a possible solution MIGHT be to scale semivariances and/or distances") } attr(model, "call") = cl model } vgm_fill_na = function(model, obj) { if (any(is.na(model$range))) { model[model$model %in% c("Nug", "Err"), "range"] = 0 model[!model$model %in% c("Nug", "Err"), "range"] = max(obj$dist) / 3 } if (any(model$model %in% "Nug") && is.na(model[model$model == "Nug","psill"])) model[model$model == "Nug", "psill"] = mean(head(obj$gamma, 3)) na_sills = is.na(model[model$model != "Nug", "psill"]) if (any(na_sills)) { n = length(model[model$model != "Nug",]$psill) model[model$model != "Nug", "psill"] = mean(tail(obj$gamma, 5)) / n } model } gstat/R/krigeTg.R0000644000176200001440000000437313777370515013342 0ustar liggesusers# $Id: krigeTg.q,v 1.4 2009-07-07 15:42:39 edzer Exp $ phiInv <- function (x, lambda) if (lambda==0) log(x) else (x^lambda-1)/lambda phi <- function(x, lambda) if (lambda==0) exp(x) else (x*lambda+1)^(1/lambda) phiPrime <- function (x, lambda) if (lambda==0) exp(x) else (x*lambda+1)^(1/lambda-1) phiDouble <- function (x, lambda) if (lambda==0) exp(x) else lambda * (1/lambda - 1) * (lambda * x + 1)^(1/lambda-2) krigeTg <- function(formula, locations, newdata, model = NULL, ..., nmax = Inf, nmin = 0, maxdist = Inf, block = numeric(0), nsim = 0, na.action = na.pass, debug.level = 1, lambda = 1.0) { m = model.frame(terms(formula), as.data.frame(locations)) Y = model.extract(m, "response") if (length(Y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) has.intercept = attr(Terms, "intercept") if (ncol(X) > 1) stop("only formula with intercept allowed, e.g. y ~ 1") locations$value = phiInv(Y, lambda) locations$value1 = rep(1, length(locations$value)) OK = krige(value ~ 1, locations, newdata, model, nmax = nmax, nmin = nmin, maxdist = maxdist, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, ...) if (nsim > 0) { OK@data = as.data.frame(phi(OK@data,lambda)) return(OK) } # else: # estimate mu: g = gstat(formula = value ~ 1, # locations = locations, data = locations, model = model, nmax = nmax, nmin = nmin, maxdist = maxdist, ...) mu = predict(g, newdata = newdata, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, BLUE = TRUE) OK$muhat = mu$var1.pred SK = krige(value1 ~ 1, locations, newdata, model = model, beta = 0.0, nmax = nmax, nmin = nmin, maxdist = maxdist, block = block, nsim = nsim, na.action = na.action, debug.level = debug.level, ...) # find m: OK$m = (OK$var1.var - SK$var1.var)/(1 - SK$var1.pred) # copy SK output: OK$var1SK.pred = SK$var1.pred OK$var1SK.var = SK$var1.var # compute transGaussian kriging estimate & variance: OK$var1TG.pred = phi(OK$var1.pred, lambda) + phiDouble(mu$var1.pred, lambda) * (OK$var1.var/2 - OK$m) OK$var1TG.var = phiPrime(mu$var1.pred, lambda)^2 * OK$var1.var OK } gstat/R/fit.variogram.gls.R0000644000176200001440000001152413777370515015276 0ustar liggesusersfit.variogram.gls <- function(formula, data, model, maxiter = 30, eps = .01, trace = TRUE, ignoreInitial = TRUE, cutoff = Inf, plot = FALSE) { v = as.data.frame(variogram(formula, data, cloud = TRUE, cutoff = cutoff)) i = v$left j = v$right y = v$gamma h0 = v$dist dists = spDists(data) n = length(i) iter = 0 converged = FALSE if (model$model[1] == 'Nug') { if (ignoreInitial) init = c(mean(y)/2, mean(y)/2, median(h0)/4) else init = c(model$psill, model$range[2]) gamfn0 = function(h, th, m = as.character(model$model[2])) variogramLine(vgm(th[2], m, th[3], th[1]), dist_vector=h)$gamma minfuncols0 = function(theta=rbind(1,1,1)) { res = y-gamfn0(h0,theta) sum(res^2) } # If variogram is Power model, maximum range should be 2. # Also if ignoreInitial change initial value of range to 1 if (any(model$model == 'Pow')) { upperOptim <- c(max(y), max(y), 2) if (ignoreInitial) init[3] <- 1 } else upperOptim = c(max(y), max(y), max(h0)) th = th0 = th.ols = optim(init, minfuncols0, gr=NULL, method="L-BFGS-B", lower=c(0,1e-9,1e-9), upper=upperOptim)$par if (trace) print(th) while (!converged && iter < maxiter) { comb = function(i,j) cbind(rep(i,length(j)), rep(j,each=length(i))) cov = matrix( variogramLine(model, dist_vector = dists[comb(i,i)])$gamma + variogramLine(model, dist_vector = dists[comb(j,j)])$gamma - variogramLine(model, dist_vector = dists[comb(i,j)])$gamma - variogramLine(model, dist_vector = dists[comb(j,i)])$gamma, length(j), length(j)) cov = 0.5 * cov ^ 2 #cov = solve(cov) cov = qr(cov) minfuncrange = function(range) { res = y-gamfn0(h0,c(th[1],th[2],range)) t(res) %*% solve(cov, res) } minfuncsill = function(sill) { res = y-gamfn0(h0, c(th[1],sill,th[3])) t(res) %*% solve(cov, res) } minfuncnugget = function(nugget) { res = y - gamfn0(h0, c(nugget, th[2], th[3])) t(res) %*% solve(cov, res) } th0 = th # Avoid calculating max every time th[1] = optimize(minfuncnugget,lower=0,upper=upperOptim[1])$minimum th[2] = optimize(minfuncsill,lower=1e-9,upper=upperOptim[2])$minimum th[3] = optimize(minfuncrange,lower=1e-9,upper=upperOptim[3])$minimum converged = sum(abs((th - th0)/th0)) < eps iter = iter + 1 if (trace) print(th) model$psill = c(th[1], th[2]) model$range[2] = th[3] } if (th[3] / max(h0) > .99) warning("range parameter at search space boundary") if (!converged) { warning("no convergence, returning OLS solution") th = th.ols model$psill = c(th[1], th[2]) model$range[2] = th[3] } } else { # No Nugget component. Use only psill = th[1] and range = th[2] parameters if (ignoreInitial) init = c(mean(y)/2, median(h0)/4) else init = c(model$psill, model$range) gamfn = function(h, th, m = as.character(model$model)) variogramLine(vgm(psill = th[1], model = m, range = th[2]), dist_vector=h)$gamma minfuncols = function(theta=rbind(1,1)) { res = y-gamfn(h0,theta) sum(res^2) } # If variogram is Power model, maximum range should be 2. # Also if ignoreInitial change initial value of range to 1 if (any(model$model == 'Pow')) { upperOptim <- c(max(y), 2) if (ignoreInitial) init[2] <- 1 } else { upperOptim = c(max(y), max(h0)) } th = th0 = th.ols = optim(init, minfuncols,gr=NULL, method="L-BFGS-B", lower=c(1e-9,1e-9), upper=upperOptim)$par if (trace) print(th) while (!converged && iter < maxiter) { comb = function(i,j) cbind(rep(i,length(j)), rep(j,each=length(i))) cov = matrix( variogramLine(model, dist_vector = dists[comb(i,i)])$gamma + variogramLine(model, dist_vector = dists[comb(j,j)])$gamma - variogramLine(model, dist_vector = dists[comb(i,j)])$gamma - variogramLine(model, dist_vector = dists[comb(j,i)])$gamma, length(j), length(j)) cov = 0.5 * cov ^ 2 #cov = solve(cov) cov = qr(cov) minfuncrange = function(range) { res = y-gamfn(h0,c(th[1],range)) t(res) %*% solve(cov, res) } minfuncsill = function(sill) { res = y-gamfn(h0, c(sill,th[2])) t(res) %*% solve(cov, res) } th0 = th th[1] = optimize(minfuncsill,lower=1e-9,upper=upperOptim[1])$minimum th[2] = optimize(minfuncrange,lower=1e-9,upper=upperOptim[2])$minimum converged = sum(abs((th - th0)/th0)) < eps iter = iter + 1 if (trace) print(th) model$psill = th[1] model$range = th[2] } if (th[2] / max(h0) > .99) warning("range parameter at search space boundary") if (!converged) { warning("no convergence, returning OLS solution") th = th.ols model$psill = th[1] model$range = th[2] } } if (plot) plot(variogram(formula, data, cloud = TRUE, cutoff = cutoff), model = model) else model } gstat/R/gstat.formula.R0000644000176200001440000000152513777370515014530 0ustar liggesusers# $Id: gstat.formula.q,v 1.8 2007-06-08 06:45:52 edzer Exp $ "gstat.formula" <- function (formula, data) { # check for duplicated pixels; if yes coerce to SpatialPointsDataFrame: if (is(data, "SpatialPixels") && anyDuplicated(data@grid.index) != 0) gridded(data) = FALSE m = model.frame(terms(formula), as(data, "data.frame"), na.action = na.fail) Y = model.extract(m, "response") if (length(Y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) has.intercept = attr(Terms, "intercept") if (gridded(data)) grid = gridparameters(data) else grid = numeric(0) xlevels = .getXlevels(Terms, m) list(y = Y, locations = coordinates(data), X = X, call = call, has.intercept = has.intercept, grid = as.double(unlist(grid)), xlevels = xlevels) } gstat/R/krigeST.R0000644000176200001440000004452414314525261013304 0ustar liggesusers############################# ## spatio-temporal kriging ## ############################# debug_time_unit = function(tUnit) { # message("Using the following time unit: ", tUnit) } STsolve = function(A, b, X) { # V = A$T %x% A$S -- a separable covariance; solve A x = b for x # kronecker: T %x% S vec(L) = vec(c0) <--> S L T = c0 # solve for L: use Y = L T # S Y = c0 -> Y = solve(S, c0) # L T = Y -> Tt Lt = Yt -> Lt = solve(Tt, Yt) #Tm = chol(A$Tm, LINPACK=TRUE) Tm = chol(A$Tm) #Sm = chol(A$Sm, LINPACK=TRUE) Sm = chol(A$Sm) STbacksolve = function(Tm, Cm, Sm) { MyChSolve = function(A, b) backsolve(A, forwardsolve(A, b, upper.tri = TRUE, transpose = TRUE)) # Y = MyChSolve(Sm, Cm) # L = MyChSolve(Tm, t(Y)) # as.vector(t(L)) as.vector(t(MyChSolve(Tm, t(MyChSolve(Sm, Cm))))) } # b comes separated: ret1 = apply(b$T, 2, function(x1) apply(b$S, 2, function(x2) STbacksolve(Tm, matrix(x1 %x% x2, nrow(Sm), nrow(Tm)), Sm))) d = dim(ret1) dim(ret1) = c(d[1] / ncol(b$S), d[2] * ncol(b$S)) # X comes full: ret2 = apply(X, 2, function(x) STbacksolve(Tm, matrix(x, nrow(Sm), nrow(Tm)), Sm)) cbind(ret1, ret2) } covfn.ST = function(x, y = x, model, ...) { switch(strsplit(model$stModel, "_")[[1]][1], separable=covSeparable(x, y, model, ...), productSumOld=covProdSumOld(x, y, model), productSum=covProdSum(x, y, model), sumMetric=covSumMetric(x, y, model), simpleSumMetric=covSimpleSumMetric(x, y, model), metric=covMetric(x, y, model), stop(paste("Provided spatio-temporal model (",model$stModel,") is not supported.",sep=""))) } ## krigeST krigeST <- function(formula, data, newdata, modelList, beta, y, ..., nmax=Inf, stAni=NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax=2, progress=TRUE) { stopifnot(inherits(modelList, "StVariogramModel") || is.function(modelList)) to_sftime = FALSE return_stars = if (inherits(data, c("stars"))) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov if (sf::st_crs(data) != sf::st_crs(newdata)) warning("CRS for data and newdata are not identical; assign CRS or use st_transform to correct") data = as(data, "STFDF") newdata = as(newdata, "STFDF") TRUE } else if (inherits(data, "sftime")) { if (sf::st_crs(data) != sf::st_crs(newdata)) warning("CRS for data and newdata are not identical; assign CRS or use st_transform to correct") data = as(data, "STIDF") if (inherits(newdata, "stars")) { if (length(newdata) == 0) newdata$._dummy = 0. newdata = as(newdata, "STFDF") } if (inherits(newdata, "sftime")) { to_sftime = TRUE newdata = as(newdata, "STIDF") } TRUE } else { if (!identical(data@sp@proj4string@projargs, newdata@sp@proj4string@projargs)) message("please verify that the CRSs of data and newdata are identical, or transform them first to make them identical") FALSE } stopifnot(inherits(data, c("STF", "STS", "STI", "sftime")) && inherits(newdata, c("STF", "STS", "STI", "sftime"))) if (inherits(data, "sftime")) data = as(data, "STIDF") if (inherits(newdata, "sftime")) data = as(data, "STI") stopifnot(class(data@time) == class(newdata@time)) stopifnot(nmax > 0) tUnitModel <- attr(modelList, "temporal unit") tUnitData <- units(abs(outer(index(data@time[1]), index(newdata@time[1]), "-"))) if (is.null(tUnitModel)) { warning("The spatio-temporal variogram model does not carry the strongly recommended attribute 'temporal unit'.\n The unit '", tUnitData, "' has been assumed. krigeST could not check whether the temporal distances between locations and in the variogram coincide.") tUnit <- tUnitData attr(modelList, "temporal unit") <- tUnit } else { tUnit <- tUnitModel debug_time_unit(tUnit) } if(nmax < Inf) { # local neighbourhood ST kriging: ret = krigeST.local( formula = formula, data = data, newdata = newdata, modelList = modelList, beta=beta, # y=y, # for later use nmax = nmax, stAni = stAni, computeVar = computeVar, fullCovariance = fullCovariance, bufferNmax = bufferNmax, progress = progress) if (return_stars) { ret$._dummy = NULL if (to_sftime) sftime::st_as_sftime(ret) else stars::st_as_stars(as(ret, "STFDF")) } else ret } else { df <- krigeST.df(formula = formula, data = data, newdata = newdata, modelList = modelList, beta = beta, y = y, ..., nmax=nmax, stAni=stAni, computeVar = computeVar, fullCovariance = fullCovariance, bufferNmax = bufferNmax, progress = progress) # wrapping the predictions in ST*DF again if (!fullCovariance) { ret = addAttrToGeom(geometry(newdata), df) if (return_stars) { ret$._dummy = NULL if (to_sftime) ret = sftime::st_as_sftime(ret) else ret = stars::st_as_stars(as(ret, "STFDF")) } ret } else df } } krigeST.df <- function(formula, data, newdata, modelList, beta, y, ..., nmax = Inf, stAni = NULL, computeVar = FALSE, fullCovariance = FALSE, bufferNmax = 2, progress = TRUE) { separate <- length(data) > 1 && length(newdata) > 1 && inherits(data, "STF") && inherits(newdata, "STF") lst = extractFormula(formula, data, newdata) X = lst$X x0 = lst$x0 if (missing(y)) y = lst$y if (inherits(modelList, "StVariogramModel")) { V = covfn.ST(data, model = modelList, separate=separate) v0 = covfn.ST(data, newdata, modelList) if (is(data,"STSDF")) d0 <- data[data@index[1,1], data@index[1,2], drop = FALSE] else d0 = data[1, 1, drop=FALSE] c0 = as.numeric(covfn.ST(d0, d0, modelList, separate = FALSE)) } else { V = modelList(data, data, ...) v0 = modelList(data, newdata, ...) if (computeVar) { if (is(newdata@sp, "SpatialLines") || is(newdata@sp, "SpatialPolygons")) stop("Varying target support (SpatialLines, SpatialPolygons) for kriging variance is not implemented.") c0 = as.numeric(modelList(newdata[1, drop=FALSE], newdata[1, drop=FALSE])) } } if (!missing(beta)) { # sk: skwts = CHsolve(V, v0) npts = length(newdata) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] if (computeVar) var <- c0 - apply(v0*skwts, 2, sum) } else { if (!is.function(modelList) && (modelList$stModel == "separable" & separate)) skwts <- STsolve(V, v0, X) # use Kronecker trick else skwts <- CHsolve(V, cbind(v0, X)) npts = length(newdata) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] beta = solve(t(X) %*% ViX, t(ViX) %*% y) if (computeVar) { # get (x0-X'C-1 c0)'(X'C-1X)-1 (x0-X'C-1 c0) -- precompute term 1+3: if(is.list(v0)) # in the separable case v0 = v0$Tm %x% v0$Sm Q = t(x0) - t(ViX) %*% v0 # suggested by Marius Appel var = c0 - apply(v0 * skwts, 2, sum) + apply(Q * CHsolve(t(X) %*% ViX, Q), 2, sum) if (fullCovariance) { corMat <- cov2cor(covfn.ST(newdata, newdata, modelList)) var <- corMat*matrix(sqrt(var) %x% sqrt(var), nrow(corMat), ncol(corMat)) # var = c0 - t(v0) %*% skwts + t(Q) %*% CHsolve(t(X) %*% ViX, Q) # return(list(pred=pred, var=var)) } } } pred = x0 %*% beta + t(skwts) %*% (y - X %*% beta) if(computeVar) { if (fullCovariance) list(pred=pred, var=var) else data.frame(var1.pred = pred, var1.var = var) } else data.frame(var1.pred = pred) } # local spatio-temporal kriging krigeST.local <- function(formula, data, newdata, modelList, beta, nmax, stAni=NULL, computeVar=FALSE, fullCovariance=FALSE, bufferNmax=2, progress=TRUE) { dimGeom <- ncol(coordinates(data)) if (fullCovariance) stop("fullCovariance cannot be returned for local ST kriging") if(is.null(stAni) & !is.null(modelList$stAni)) { stAni <- modelList$stAni # scale stAni [spatial/temporal] to seconds if(!is.null(attr(modelList,"temporal unit"))) stAni <- stAni/switch(attr(modelList, "temporal unit"), secs=1, mins=60, hours=3600, days=86400, stop("Temporal unit",attr(modelList, "temporal unit"),"not implemented.")) } if(is.null(stAni)) stop("The spatio-temporal model does not provide a spatio-temporal anisotropy scaling nor is the parameter stAni provided. One of these is necessary for local spatio-temporal kriging.") # check whether the model meets the coordinates' unit if(!is.null(attr(modelList, "spatial unit"))) stopifnot((is.projected(data) & (attr(modelList, "spatial unit") %in% c("km","m"))) | (!is.projected(data) & !(attr(modelList, "spatial unit") %in% c("km","m")))) if (inherits(data, c("STFDF", "STSDF", "sftime"))) data <- as(data, "STIDF") clnd <- class(newdata) if(inherits(newdata, c("STFDF", "STSDF", "sftime"))) newdata <- as(newdata, "STIDF") if(inherits(newdata, c("STF", "STS"))) newdata <- as(newdata, "STI") # from here on every data set is assumed to be STI* if(dimGeom == 2) { df = as(data, "data.frame")[,c(1,2,4)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,4)] query$time = as.numeric(query$time)*stAni } else { df = as(data, "data.frame")[,c(1,2,3,5)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,3,5)] query$time = as.numeric(query$time)*stAni } df <- as.matrix(df) query <- as.matrix(query) if (computeVar) { res <- data.frame(var1.pred = rep(NA, nrow(query)), var1.var = rep(NA, nrow(query))) } else { res <- data.frame(var1.pred = rep(NA, nrow(query))) } if(progress) pb = txtProgressBar(style = 3, max = nrow(query)) nb <- t(apply(get.knnx(df, query, ceiling(bufferNmax*nmax))[[1]],1,sort)) for (i in 1:nrow(query)) { nghbrData <- data[nb[i, ], , drop = FALSE] if(bufferNmax > 1) { nghbrCov <- covfn.ST(nghbrData, newdata[i, , drop = FALSE], modelList) nghbrData <- nghbrData[sort(order(nghbrCov, decreasing=T)[1:nmax]), , drop = FALSE] } res[i,] <- krigeST.df(formula, nghbrData, newdata[i, , drop = FALSE], modelList, computeVar=computeVar, beta = beta, fullCovariance=fullCovariance) if(progress) setTxtProgressBar(pb, i) } if(progress) close(pb) if (clnd %in% c("STI", "STS", "STF")) { newdata <- addAttrToGeom(newdata, as.data.frame(res)) newdata <- switch(clnd, STI = as(newdata, "STIDF"), STS = as(newdata, "STSDF"), STF = as(newdata, "STFDF")) } else { newdata@data <- cbind(newdata@data, res) newdata <- as(newdata, clnd) } newdata } ## Area to point kriging # define a spatio-temporal variogram model FUNCTION that can deal with x and y # being of ST* with @sp of class SpatialPolygons OR SpatialPoints; # SpatialGrid/Pixels are coerced to SpatialPolygons -- as in the so case, see # krige0.R # sts <- STS(meuse.grid, stf@time, cbind(sort(sample(length(meuse.grid), 500, replace = T)), # sample(21,500, replace=TRUE))) # # x <- sts # y <- stf # model <- separableModel vgmAreaST = function(x, y = x, model, ndiscrSpace = 16, verbose = FALSE, covariance = TRUE) { if (gridded(x@sp)) x@sp = as(x@sp, "SpatialPolygons") if (gridded(y@sp)) y@sp = as(y@sp, "SpatialPolygons") stopifnot(is(x@sp, "SpatialPolygons") || is(x@sp, "SpatialPoints")) stopifnot(is(y@sp, "SpatialPolygons") || is(y@sp, "SpatialPoints")) stopifnot(is(model, "StVariogramModel")) # make x and y both of type STS/STSDF if ("data" %in% slotNames(x)) { x <- as(x, "STSDF") } else { x <- as(x, "STS") } if ("data" %in% slotNames(y)) { y <- as(y, "STSDF") } else { y <- as(y, "STS") } nx = length(x) ny = length(y) V <- matrix(NA, nx, ny) # switch cases for polygons in x and y if (is(x@sp, "SpatialPolygons")) { # x contains polygons -> loop and sample indexX <- x@index if (verbose) pb <- txtProgressBar(style = 3, max = nx) for (ix in 1:nx) { # ix <- 1 px <- x[indexX[ix,,drop=F],drop=F] ptsx = STF(spsample(px@sp, ndiscrSpace, "regular", offset = c(.5,.5)), px@time, px@endTime) # does y also contain polygons? if (is(y@sp, "SpatialPolygons")) { # yes, also y contains polygons -> loop and sample indexY <- y@index for (iy in 1:ny) { # iy <- 1 py <- y[indexY[iy,,drop=F],drop=F] ptsy = STF(spsample(py@sp, ndiscrSpace, "regular", offset = c(.5,.5)), py@time, py@endTime) suppressMessages(subV <- covfn.ST(ptsx, ptsy, model, separate=FALSE)) V[ix, iy] <- mean(subV) } } else { # no, y contains points -> no second loop, calc covariance suppressMessages(subV <- covfn.ST(ptsx, y, model, separate=FALSE)) V[ix, ] <- apply(subV, 2, mean) } if (verbose) setTxtProgressBar(pb, ix) } if (verbose) close(pb) } else { # none of x and y contain polygons -> no loops, calc covariance suppressMessages(V <- covfn.ST(x, y, model)) } V } #################### ## trans Gaussian ## #################### krigeSTTg <- function(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) { if(!is.infinite(nmax)) return(krigeSTTg.local(formula, data, newdata, modelList, y, nmax, stAni, bufferNmax, progress, lambda)) lst <- extractFormula(formula, data, newdata) Y <- lst$y X <- lst$X if (ncol(X) > 1) stop("only formula with intercept allowed, e.g. y ~ 1") data$value = phiInv(Y, lambda) data$value1 = rep(1, length(data$value)) OK = krigeST(value ~ 1, data, newdata, modelList, nmax = nmax, stAni = stAni, computeVar=TRUE, bufferNmax = bufferNmax, progress = progress) separate <- length(data) > 1 && length(newdata) > 1 && inherits(data, "STF") && inherits(newdata, "STF") V <- covfn.ST(data, model = modelList, separate=separate) Vi <- solve(V) muhat <- sum(Vi %*% data$value)/sum(Vi) # find m: v0 <- covfn.ST(data, newdata, model = modelList, separate=separate) m <- (1 - apply(Vi %*% v0,2,sum))/sum(Vi) # compute transGaussian kriging estimate & variance: OK$var1TG.pred = phi(OK$var1.pred, lambda) + phiDouble(muhat, lambda) * (OK$var1.var/2 - m) OK$var1TG.var = phiPrime(muhat, lambda)^2 * OK$var1.var OK } krigeSTTg.local <- function(formula, data, newdata, modelList, y, nmax=Inf, stAni=NULL, bufferNmax=2, progress=TRUE, lambda = 0) { stopifnot(!is.infinite(nmax)) dimGeom <- ncol(coordinates(data)) if(is.null(stAni) & !is.null(modelList$stAni)) { stAni <- modelList$stAni # scale stAni [spatial/temporal] to seconds if(!is.null(attr(modelList,"temporal unit"))) stAni <- stAni/switch(attr(modelList, "temporal unit"), secs=1, mins=60, hours=3600, days=86400, stop("Temporal unit",attr(modelList, "temporal unit"),"not implemented.")) } if(is.null(stAni)) stop("The spatio-temporal model does not provide a spatio-temporal anisotropy scaling nor is the parameter stAni provided. One of these is necessary for local spatio-temporal kriging.") # check whether the model meets the coordinates' unit if(!is.null(attr(modelList, "spatial unit"))) stopifnot((is.projected(data) & (attr(modelList, "spatial unit") %in% c("km","m"))) | (!is.projected(data) & !(attr(modelList, "spatial unit") %in% c("km","m")))) if(is(data, "STFDF") || is(data, "STSDF")) data <- as(data, "STIDF") clnd <- class(newdata) if(is(newdata, "STFDF") || is(newdata, "STSDF")) newdata <- as(newdata, "STIDF") if(is(newdata, "STF") || is(newdata, "STS")) newdata <- as(newdata, "STI") # from here on every data set is assumed to be STI* if(dimGeom == 2) { df = as(data, "data.frame")[,c(1,2,4)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,4)] query$time = as.numeric(query$time)*stAni } else { df = as(data, "data.frame")[,c(1,2,3,5)] df$time = as.numeric(df$time)*stAni query = as(newdata, "data.frame")[,c(1,2,3,5)] query$time = as.numeric(query$time)*stAni } df <- as.matrix(df) query <- as.matrix(query) res <- data.frame(var1.pred = rep(NA, nrow(query)), var1.var = rep(NA, nrow(query)), var1TG.pred = rep(NA, nrow(query)), var1TG.var = rep(NA, nrow(query))) if(progress) pb = txtProgressBar(style = 3, max = nrow(query)) nb <- t(apply(get.knnx(df, query, ceiling(bufferNmax*nmax))[[1]],1,sort)) for (i in 1:nrow(query)) { nghbrData <- data[nb[i, ], , drop = FALSE] if(bufferNmax > 1) { nghbrCov <- covfn.ST(nghbrData, newdata[i, , drop = FALSE], modelList) nghbrData <- nghbrData[sort(order(nghbrCov, decreasing=T)[1:nmax]), , drop = FALSE] } res[i,] <- krigeSTTg(formula, nghbrData, newdata[i, , drop = FALSE], modelList, lambda)@data if(progress) setTxtProgressBar(pb, i) } if(progress) close(pb) if (clnd %in% c("STI", "STS", "STF")) { newdata <- addAttrToGeom(newdata, as.data.frame(res)) newdata <- switch(clnd, STI = as(newdata, "STIDF"), STS = as(newdata, "STSDF"), STF = as(newdata, "STFDF")) } else { newdata@data <- cbind(newdata@data, res) newdata <- as(newdata, clnd) } newdata } gstat/R/panel.pointPairs.R0000644000176200001440000000206113777370515015164 0ustar liggesusers# $Id: panel.pointPairs.q,v 1.3 2008-03-10 10:00:10 edzer Exp $ "panel.pointPairs" <- function (x, y, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, lwd = plot.line$lwd, pairs = pairs, line.pch = line.pch, ...) { x = as.numeric(x) y = as.numeric(y) if (length(x) > 0) { if (!missing(col)) { if (missing(col.line)) col.line = col if (missing(col.symbol)) col.symbol = col } plot.symbol = trellis.par.get("plot.symbol") plot.line = trellis.par.get("plot.line") lpoints(x = x, y = y, cex = cex, col = col.symbol, pch = pch, ...) if (!missing(pairs)) { for (i in seq(along = pairs[,1])) { xx = c(x[pairs[i,1]], x[pairs[i,2]]) yy = c(y[pairs[i,1]], y[pairs[i,2]]) llines(x = xx, y = yy, lty = lty, col = col.line, lwd = lwd) if (line.pch > 0) lpoints(mean(xx), mean(yy), pch = line.pch, col = col.line) } } } } gstat/R/zzz.R0000644000176200001440000000066613777370515012604 0ustar liggesusers# $Id: zzz.q,v 1.10 2006-02-10 19:01:07 edzer Exp $ ### NAMESPACE VERSION: .onLoad <- function(lib, pkg) { # remove the require() call for 2.0.0: # require(lattice) # .Call(gstat_init, as.integer(1)) } ### pre-NAMESPACE VERSION: ## ".First.lib" <- ## function(lib, pkg) { ## require(lattice) ## library.dynam("gstat", pkg, lib) ## .Call(gstat_init, as.integer(1)) ## } variogram <- function(object, ...) UseMethod("variogram") gstat/R/gstat.formula.predict.R0000644000176200001440000000427114002373634016145 0ustar liggesusers# $Id: gstat.formula.predict.q,v 1.14 2008-02-19 10:01:22 edzer Exp $ "gstat.formula.predict" <- function (formula, newdata, na.action, BLUE.estimates = FALSE, xlev = NULL) { if (is(newdata, "SpatialPolygons")) { # locs = coordinates(getSpatialPolygonsLabelPoints(newdata)) -- deprecated, now use: locs = t(sapply(slot(newdata, "polygons"), function(x) slot(x, "labpt"))) SpatialPoints(locs, slot(newdata, "proj4string")) locs = coordinates(locs) colnames(locs) = c("x", "y") if (is(newdata, "SpatialPolygonsDataFrame")) newdata = as.data.frame(newdata) else newdata = data.frame(a = rep(1, nrow(locs))) } else if (is(newdata, "SpatialLines")) { # locs = coordinates(getSpatialLinesMidPoints(newdata)) -- deprecated, now use: ret = lapply(newdata@lines, function(x) sapply(x@Lines, function(X) apply(X@coords, 2, mean) ) ) ret = t(sapply(ret, function(x) apply(x, 1, mean))) locs = coordinates(SpatialPoints(ret, slot(newdata, "proj4string"))) colnames(locs) = c("x", "y") if (is(newdata, "SpatialLinesDataFrame")) newdata = as.data.frame(newdata) else newdata = data.frame(a = rep(1, nrow(locs))) } else { if (gridded(newdata)) fullgrid(newdata) = FALSE locs = coordinates(newdata) newdata = as.data.frame(newdata) } # resolve formula: terms.f = delete.response(terms(formula)) mf.f = model.frame(terms.f, newdata, na.action = na.action, xlev = xlev) X = model.matrix(terms.f, mf.f) if (BLUE.estimates) { # fake the whole thing to get a matrix with BLUE parameter estimates: cnames = colnames(X) X = matrix(0, ncol(X), ncol(X)) diag(X) = 1 locs = locs[1,,drop=FALSE] if (ncol(X) > 1) { for (i in 2:ncol(X)) locs = rbind(locs, locs[1,]) } rownames(locs) = cnames } if (NROW(locs) != NROW(X)) { # NA's were filtered in X, but not in coords: mf.f = model.frame(terms.f, newdata, na.action = na.pass) valid.pattern = !(apply(mf.f, 1, function(x) any(is.na(x)))) X = model.matrix(terms.f, mf.f[valid.pattern, , drop = FALSE]) locs = locs[valid.pattern, ] if (NROW(locs) != NROW(X)) stop("NROW(locs) != NROW(X): this should not occur") } list(locations = as.matrix(locs), X = as.matrix(X)) } gstat/R/print.variogram.R0000644000176200001440000000021213777370515015054 0ustar liggesusers# $Id: print.variogram.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "print.gstatVariogram" <- function(x, ...) { print(data.frame(x), ...) } gstat/R/krige0.R0000644000176200001440000001064414147167560013121 0ustar liggesusersextractFormula = function(formula, data, newdata) { # extract y and X from data: m = model.frame(terms(formula), as(data, "data.frame"), na.action = na.fail) y = model.extract(m, "response") if (length(y) == 0) stop("no response variable present in formula") Terms = attr(m, "terms") X = model.matrix(Terms, m) # extract x0 from newdata: terms.f = delete.response(terms(formula)) mf.f = model.frame(terms.f, newdata) #, na.action = na.action) x0 = model.matrix(terms.f, mf.f) list(y = y, X = X, x0 = x0) } idw0 = function(formula, data, newdata, y, idp = 2.0) { s = coordinates(data) s0 = coordinates(newdata) if (missing(y)) y = extractFormula(formula, data, newdata)$y D = 1.0 / (spDists(s0, s) ^ idp) sumD = apply(D, 1, sum) D %*% y / sumD } CHsolve = function(A, b) { # solves A x = b for x if A is PD symmetric #A = chol(A, LINPACK=TRUE) -> deprecated A = chol(A) # but use pivot=TRUE? backsolve(A, forwardsolve(A, b, upper.tri = TRUE, transpose = TRUE)) } krige0 <- function(formula, data, newdata, model, beta, y, ..., computeVar = FALSE, fullCovariance = FALSE) { if (inherits(data, "ST")) stopifnot(identical(data@sp@proj4string@projargs, newdata@sp@proj4string@projargs)) else stopifnot(identical(data@proj4string@projargs, newdata@proj4string@projargs)) lst = extractFormula(formula, data, newdata) X = lst$X x0 = lst$x0 if (missing(y)) y = lst$y ll = (!is.na(is.projected(data)) && !is.projected(data)) s = coordinates(data) s0 = coordinates(newdata) if (is(model, "variogramModel")) { require(gstat) V = variogramLine(model, dist_vector = spDists(s, s, ll), covariance = TRUE) v0 = variogramLine(model, dist_vector = spDists(s, s0, ll), covariance = TRUE) c0 = variogramLine(model, dist_vector = c(0), covariance = TRUE)$gamma } else { V = model(data, data, ...) v0 = model(data, newdata, ...) if (computeVar) { if (is(newdata, "SpatialLines") || is(newdata, "SpatialPolygons")) stop("varying target support (SpatialLines, SpatialPolygons) is not implemented") c0 = as.numeric(model(newdata[1, drop=FALSE], newdata[1, drop=FALSE])) # ?check this: provide TWO arguments, so model(x,y) can target # eventually Y, instead of measurements Z=Y+e # with e measurement error term e } } if (!missing(beta)) { # sk: skwts = CHsolve(V, v0) if (computeVar) var <- c0 - apply(v0*skwts, 2, sum) } else { # ok/uk -- need to estimate beta: skwts = CHsolve(V, cbind(v0, X)) ViX = skwts[,-(1:nrow(s0))] skwts = skwts[,1:nrow(s0)] beta = solve(t(X) %*% ViX, t(ViX) %*% y) if (computeVar) { Q = t(x0) - t(ViX) %*% v0 var <- c0 - apply(v0*skwts, 2, sum) + apply(Q * CHsolve(t(X) %*% ViX, Q), 2, sum) } } pred = x0 %*% beta + t(skwts) %*% (y - X %*% beta) if (computeVar) { if (fullCovariance) { corMat <- cov2cor(variogramLine(model, dist_vector = spDists(s0, s0), covariance = TRUE)) var <- corMat*matrix(sqrt(var) %x% sqrt(var), nrow(corMat), ncol(corMat)) } list(pred = pred, var = var) } else pred } # define variogram model FUNCTION that can deal with x and y # being of class SpatialPolygons OR SpatialPoints; SpatialGrid/Pixels are coerced to SpatialPolygons vgmArea = function(x, y = x, vgm, ndiscr = 16, verbose = FALSE, covariance = TRUE) { if (gridded(x)) x = as(x, "SpatialPolygons") if (gridded(y)) y = as(y, "SpatialPolygons") stopifnot(is(x, "SpatialPolygons") || is(x, "SpatialPoints")) stopifnot(is(y, "SpatialPolygons") || is(y, "SpatialPoints")) stopifnot(is(vgm, "variogramModel")) nx = length(x) ny = length(y) V = matrix(NA, nx, ny) if (verbose) pb = txtProgressBar(style = 3, max = nx) for (i in 1:nx) { if (is(x, "SpatialPolygons")) px = spsample(x[i,], ndiscr, "regular", offset = c(.5,.5)) else px = x[i,] for (j in 1:ny) { if (is(y, "SpatialPolygons")) py = spsample(y[j,], ndiscr, "regular", offset = c(.5,.5)) else py = y[j,] D = spDists(px, py) D[D == 0] = 1e-10 V[i,j] = mean(variogramLine(vgm, dist_vector = D, covariance = covariance)) } if (verbose) setTxtProgressBar(pb, i) } if (verbose) close(pb) V } gstat/R/print.variogramModel.R0000644000176200001440000000130013777370515016034 0ustar liggesusers# $Id: print.variogramModel.q,v 1.5 2009-02-20 13:53:38 edzer Exp $ "print.variogramModel" = function (x, ...) { df = data.frame(x) shape.models = c("Mat", "Exc", "Cau", "Ste") if (!any(match(df[, "model"], shape.models, nomatch=0))) df$kappa = NULL if (!any(df[, "anis2"] != 1)) { df$anis2 = NULL df$ang2 = NULL df$ang3 = NULL if (!any(df[, "anis1"] != 1)) { df$anis1 = NULL df$ang1 = NULL } } if (any(match(df[, "model"], "Tab", nomatch=0))) { df$maxdist = df$range df$range = NULL print(df, ...) cat("covariance table:\n") tab = attr(x, "table") idx = round(seq(1, length(tab), length=6)) print(tab[idx]) } else print(df, ...) invisible(x) } gstat/R/plot.gstatVariogram.R0000644000176200001440000001130613777370515015707 0ustar liggesusers# $Id: plot.gstatVariogram.q,v 1.15 2007-06-08 18:03:25 edzer Exp $ "plot.gstatVariogram" <- function (x, model = NULL, ylim, xlim, xlab = "distance", ylab = attr(x, "what"), panel = vgm.panel.xyplot, multipanel = TRUE, plot.numbers = FALSE, scales = list(), ids = x$id, group.id = TRUE, skip, layout, ...) { if (missing(ylim)) { ylim = c(min(0, 1.04 * min(x$gamma)), 1.04 * max(x$gamma)) ylim.set = FALSE } else ylim.set = TRUE if (missing(xlim)) xlim = c(0, 1.04 * max(x$dist)) labels = NULL shift = 0.03 if (is.numeric(plot.numbers)) { shift = plot.numbers plot.numbers = TRUE } if (plot.numbers == TRUE) labels = as.character(x$np) if (length(unique(x$dir.ver)) > 1 || any(x$dir.ver != 0)) warning("vertical directions are not dealt with -- yet!") if (length(unique(x$dir.hor)) > 1 && group.id == TRUE) { # directional, grouped: if (multipanel) { if (length(levels(ids)) > 1) { # multivariate directional: xyplot(gamma ~ dist | as.factor(dir.hor), data = x, type = c("p", "l"), xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, groups = ids, scales = scales, ...) } else # univariate directional, multipanel: xyplot(gamma ~ dist | as.factor(dir.hor), subscripts = TRUE, panel = panel, data = x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, direction = x$dir.hor, labels = labels, model = model, shift = shift, mode = "directional", scales = scales, ...) } else { # univariate directional, using symbol/color to distinguish pch = as.integer(as.factor(x$dir.hor)) xyplot(gamma ~ dist, data = x, type = c("p", "l"), groups = pch, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, pch = pch, scales = scales, ...) } } else if (length(unique(ids)) > 1) { # multivariable: n = floor(sqrt(2 * length(unique(ids)))) if (missing(skip)) { skip = NULL for (row in n:1) for (col in 1:n) skip = c(skip, row < col) } if (missing(layout)) layout = c(n,n) if (missing(scales)) scales = list(y = list(relation = "free")) else if (!is.null(scales$relation) && scales$relation == "same") ylim.set = TRUE if (length(unique(x$dir.hor)) > 1) { # multiv.; directional groups if (ylim.set) { xyplot(gamma ~ dist | id, data = x, type = c("p", "l"), xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, groups = as.factor(x$dir.hor), layout = layout, skip = skip, scales = scales, ...) } else { xyplot(gamma ~ dist | id, data = x, type = c("p", "l"), xlim = xlim, xlab = xlab, ylab = ylab, groups = as.factor(x$dir.hor), layout = layout, skip = skip, scales = scales, ...) } } else { # non-multi-directional, multivariable if (ylim.set) { xyplot(gamma ~ dist | id, data = x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ids = ids, panel= panel, labels = labels, scales = scales, layout = layout, skip = skip, prepanel = function(x, y) list(ylim = c(min(0, y), max(0, y))), model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "cross", ...) } else { xyplot(gamma ~ dist | id, data = x, xlim = xlim, xlab = xlab, ylab = ylab, ids = ids, panel = panel, labels = labels, scales = scales, layout = layout, skip = skip, prepanel = function(x, y) list(ylim = c(min(0, y), max(0, y))), model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "cross", ...) } } } else # non multi-directional, univariable -- mostly used of all: xyplot(gamma ~ dist, data = x, panel = panel, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, labels = labels, model = model, direction = c(x$dir.hor[1], x$dir.ver[1]), shift = shift, mode = "direct", scales = scales, ...) } "plot.variogramMap" <- function(x, np = FALSE, skip, threshold, ...) { x = x$map if (!is(x, "SpatialPixelsDataFrame")) stop("x should be of class, or extend, SpatialPixelsDataFrame") if (np) start = 2 else start = 1 idx = seq(start, ncol(x@data), by=2) n = floor(sqrt(length(idx) * 2)) if (missing(skip)) { skip = NULL for (row in n:1) for (col in 1:n) skip = c(skip, row < col) } if (!(missing(threshold))) x = x[x[[2]] >= threshold, ] levelplot(values ~ dx + dy | ind, as.data.frame(stack(x, select = idx)), asp = mapasp(x), layout = c(n, n), skip = skip, ...) } gstat/R/show.vgms.R0000644000176200001440000000535313777370515013700 0ustar liggesusers# $Id: show.vgms.q,v 1.6 2008-12-15 14:27:29 edzer Exp $ "show.vgms" <- function(min = 1e-12 * max, max = 3, n = 50, sill = 1, range = 1, models = as.character(vgm()$short[c(1:17)]), nugget = 0, kappa.range = 0.5, plot = TRUE, ..., as.groups = FALSE) { zero.range.models = c("Nug", "Int", "Lin", "Err") # print(models) L = max(length(sill), length(range), length(nugget), length(models), length(kappa.range)) sill = rep(sill, length.out = L) range = rep(range, length.out = L) nugget = rep(nugget, length.out = L) i = 0 if (length(kappa.range) > 1) { # loop over kappa values for Matern model: if (missing(models)) models = "Mat" stopifnot(models == "Mat" || models == "Ste" || models == "Exc") data = matrix(NA, n * length(kappa.range), 2) v.level = rep("", n * length(kappa.range)) for (kappa in kappa.range) { v = vgm(sill[i+1], models, range[i+1], nugget = nugget[i+1], kappa = kappa) x = variogramLine(v, 0, 1, 0) data[(i*n+1), ] = as.matrix(x) x = variogramLine(v, max, n - 1, min) data[(i*n+2):((i+1)*n), ] = as.matrix(x) m.name = paste("vgm(", sill[i+1], ",\"", models, "\",", range, sep = "") if (nugget[i+1] > 0) m.name = paste(m.name, ",nugget=", nugget[i+1], sep = "") m.name = paste(m.name, ",kappa=", kappa, ")", sep = "") v.level[(i*n+1):((i+1)*n)] = rep(m.name, n) i = i + 1 } } else { models = rep(models, length.out = L) data = matrix(NA, n * length(models), 2) v.level = rep("", n * length(models)) for (m in models) { this.range = ifelse(!is.na(pmatch(m, zero.range.models)), 0, range[i+1]) v = vgm(sill[i+1], m, this.range, nugget = nugget[i+1], kappa = kappa.range) x = variogramLine(v, 0, 1, 0) data[(i*n+1), ] = as.matrix(x) x = variogramLine(v, max, n - 1, min) data[(i*n+2):((i+1)*n), ] = as.matrix(x) m.name = paste("vgm(", sill[i+1], ",\"", m, "\",", this.range, sep = "") if (nugget[i+1] > 0) m.name = paste(m.name, ",nugget=", nugget[i+1], sep = "") m.name = paste(m.name, ")", sep = "") v.level[(i*n+1):((i+1)*n)] = rep(m.name, n) i = i + 1 } } dframe = data.frame(semivariance = data[,2], distance = data[,1], model = factor(v.level, levels = unique(v.level))) vgm.panel = function(x,y, ...) { n = length(x) lpoints(x[1],y[1]) llines(x[2:n],y[2:n]) } vgm.panel2 = function(x, y, subscripts, groups, ...) { lpoints(0, 0, col = 1) panel.superpose(x, y, subscripts, groups, ...) } if (!plot) dframe else { if (as.groups) { model = 0 # avoid NOTE on cran check xyplot(semivariance ~ distance, groups = model, dframe[dframe$distance > 0,], panel = vgm.panel2, as.table = TRUE, auto.key = TRUE, type = 'l', ...) } else xyplot(semivariance ~ distance | model, dframe, panel = vgm.panel, as.table = TRUE, ...) } } gstat/R/get.contr.R0000644000176200001440000000411013777370515013636 0ustar liggesusers# $Id: get.contr.q,v 1.8 2006-03-20 15:18:14 edzer Exp $ "get.contr" <- function (data, gstat.object, X, ids = names(gstat.object$data)) { contr.fun <- function(x, n, pr.idx, cov.idx, contr) { y = matrix(x[pr.idx], n, 1) V = matrix(x[cov.idx], n, n) beta = t(contr) %*% y Vbeta = t(contr) %*% V %*% contr ret = c(beta, diag(Vbeta)) for (j in 1:nrow(Vbeta)) { if (j > 1) for (k in 1:(j - 1)) ret = c(ret, Vbeta[j, k]) } ret } lti <- function(i, j) { # lower triangular matrix index, when repr as array mx = max(i, j) - 1 mn = min(i, j) - 1 ((mx) * (mx - 1))/2 + mn + 1 } n = length(ids) if (!is.matrix(X)) X = as.matrix(X) if (n != nrow(X)) stop("length(ids) should equal nrow(X) or length(X)") gstat.names = create.gstat.names(ids) names.pr = gstat.names[seq(1, 2 * n, 2)] names.cov = matrix("", n, n) for (i in 1:n) for (j in 1:n) names.cov[i, j] = ifelse(i == j, gstat.names[2 * i], gstat.names[2 * n + lti(i, j)]) pr.idx = match(names.pr, names(data)) cov.idx = match(names.cov, names(data)) if (any(is.na(pr.idx)) || any(is.na(cov.idx))) stop("colunn names in data not matched") res = data.frame(t(apply(as.data.frame(data)[names(data)], 1, contr.fun, n = n, pr.idx = pr.idx, cov.idx = cov.idx, contr = X))) col.names = NULL for (j in 1:NCOL(X)) col.names = c(col.names, paste("beta", j, sep = ".")) for (j in 1:NCOL(X)) col.names = c(col.names, paste("var.beta", j, sep = ".")) for (j in 1:NCOL(X)) { if (j > 1) { for (k in 1:(j - 1)) { col.names = c(col.names, paste("cov.beta", k, j, sep = ".")) } } } names(res) = col.names if (is(data, "data.frame")) row.names(res) = row.names(data) else if (is(data, "SpatialPolygonsDataFrame")) { rownames(res) = sapply(data@polygons, function(x) slot(x, "ID")) res = SpatialPolygonsDataFrame(as(data, "SpatialPolygons"), res, match.ID = TRUE) } else if (is(data, "Spatial")) { coordinates(res) = coordinates(data) gridded(res) = gridded(data) } res } gstat/R/stVariogramModels.R0000644000176200001440000010457714315124326015401 0ustar liggesusers# constructiong spatio-temporal variogram models vgmST <- function(stModel, ..., space, time, joint, sill, k, nugget, stAni, temporalUnit) { stopifnot(is.character(stModel) && length(stModel)==1) old.stModel <- stModel stModel <- strsplit(stModel, "_")[[1]][1] if (stModel == "productSum" && !missing(sill)) stop("The sill argument for the product-sum model has been removed due a change in notation of the spatio-temporal models. This affects as well how the spatial and temporal variograms are parameterised. Re-fit your model or use \"productSumOld\" instead.") if(!missing(sill)) if(sill <= 0) stop("\"sill\" must be positive.") if(!missing(k)) if(k <= 0) stop("\"k\" must be positive.") if(!missing(nugget)) if(nugget < 0) stop("\"nugget\" must be non-negative.") if(!missing(stAni)) if(stAni <= 0) stop("\"stAni\" must be positive.") vgmModel <- switch(stModel, separable = list(space = space, time = time, sill = sill), productSum = list(space = space, time = time, k = k), productSumOld = list(space = space, time = time, sill = sill, nugget = nugget), sumMetric = list(space = space, time = time, joint = joint, stAni = stAni), simpleSumMetric = list(space = space, time = time, joint = joint, nugget = nugget, stAni = stAni), metric = list(joint = joint, stAni = stAni), stop(paste("model", stModel, "unknown"))) vgmModel$stModel <- old.stModel if (!missing(temporalUnit)) attr(vgmModel, "temporal unit") = temporalUnit class(vgmModel) <- c("StVariogramModel", "list") vgmModel } # calculating spatio-temporal variogram surfaces variogramSurface <- function(model, dist_grid, covariance=FALSE) { stopifnot(inherits(model, "StVariogramModel")) stopifnot(all(c("spacelag", "timelag") %in% colnames(dist_grid))) if (covariance) { switch(strsplit(model$stModel, "_")[[1]][1], separable=covSurfSeparable(model, dist_grid), productSum=covSurfProdSum(model, dist_grid), productSumOld=covSurfProdSumOld(model, dist_grid), sumMetric=covSurfSumMetric(model, dist_grid), simpleSumMetric=covSurfSimpleSumMetric(model, dist_grid), metric=covSurfMetric(model, dist_grid), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } else { switch(strsplit(model$stModel, "_")[[1]][1], separable=vgmSeparable(model, dist_grid), productSum=vgmProdSum(model, dist_grid), productSumOld=vgmProdSumOld(model, dist_grid), sumMetric=vgmSumMetric(model, dist_grid), simpleSumMetric=vgmSimpleSumMetric(model, dist_grid), metric=vgmMetric(model, dist_grid), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } } ################################ ## separable model: C_s * C_t ## ################################ vgmSeparable <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma cbind(dist_grid, "gamma" = model$sill*(vs+vt-vs*vt)) } covSeparable <- function(x, y, model, separate) { if(missing(separate)) separate <- inherits(x, "STF") && inherits(y, "STF") && length(x) > 1 && length(y) > 1 # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) if (separate) return(list(Sm = Sm, Tm = Tm)) else return(Tm %x% Sm) # kronecker product } # separate makes only sense if both of x and y inherit STF if (separate) stop("An efficient inversion by separating the covarinace model is only possible if both of \"x\" and \"y\" inherit \"STF\"") # the STI case if (inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) return(Sm * Tm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = sMat)*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = tMat) return(Sm * Tm) } # covariance for the circulant embedding in ST covSurfSeparable <- function(model, dist_grid) { Sm = variogramLine(model$space, covariance = TRUE, dist_vector = dist_grid$spacelag)$gamma*model$sill Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dist_grid$timelag)$gamma cbind(dist_grid, "gamma" = Tm * Sm) } ########################################### ## productSum model: C_s*C_t + C_s + C_t ## ########################################### vgmProdSumOld <- function(model, dist_grid) { .Deprecated("vgmProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "vgmProdSumOld") vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma vn <- rep(model$nugget, length(vs)) vn[vs == 0 & vt == 0] <- 0 k <- (sum(model$space$psill)+sum(model$time$psill)-(model$sill+model$nugget))/(sum(model$space$psill)*sum(model$time$psill)) if (k <= 0 || k > 1/max(rev(model$space$psill)[1], rev(model$time$psill)[1])) k <- 10^6*abs(k) # distorting the model to let optim "hopefully" find suitable parameters cbind(dist_grid, "gamma" = as.vector(vs+vt-k*vs*vt+vn)) } covProdSumOld <- function(x, y, model) { .Deprecated("covProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "covProdSumOld") stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # double check model for validity, i.e. k: k <- (sum(model$space$psill)+sum(model$time$psill)-model$sill)/(sum(model$space$psill)*sum(model$time$psill)) if (k <= 0 || k > 1/max(model$space$psill[model$space$model!="Nug"], model$time$psill[model$time$model!="Nug"])) stop(paste("k (",k,") is non-positive or too large: no valid model!",sep="")) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance = TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance = TRUE) return(model$sill-(vt %x% matrix(1,nrow(vs),ncol(vs)) + matrix(1,nrow(vt),ncol(vt)) %x% vs - k * vt %x% vs)) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance = TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance = TRUE) return(model$sill-(vt + vs - k * vt * vs)) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix vs = variogramLine(model$space, dist_vector = sMat, covariance = TRUE) vt = variogramLine(model$time, dist_vector = tMat, covariance = TRUE) return(model$sill-(vt + vs - k * vt * vs)) } # covariance for the circulant embedding in ST covSurfProdSumOld <- function(model, dist_grid) { .Deprecated("covSurfProdSum", package = "gstat", msg="The former product-sum model is dprecited, consider to refit the new model specification", old = "covSurfProdSumOld") vs = variogramLine(model$space, dist_vector = dist_grid$spacelag, covariance = TRUE)$gamma vt = variogramLine(model$time, dist_vector = dist_grid$timelag, covariance = TRUE)$gamma k <- (sum(model$space$psill)+sum(model$time$psill)-(model$sill+model$nugget))/(sum(model$space$psill)*sum(model$time$psill)) cbind(dist_grid, "gamma" = model$sill-(vt + vs - k * vt * vs)) } vgmProdSum <- function(model, dist_grid) { if(!is.null(model$sill)) # backwards compatibility vgmProdSumOld(model, dist_grid) vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma sill_s <- sum(model$space$psill) sill_t <- sum(model$time$psill) k <- model$k cbind(dist_grid, "gamma" = as.vector((k*sill_t+1)*vs + (k*sill_s+1)*vt-k*vs*vt)) } covProdSum <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) if(!is.null(model$sill)) # backwards compatibility covProdSumOld(x, y, model) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance =TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance =TRUE) return(vt %x% matrix(1,nrow(vs),ncol(vs)) + matrix(1,nrow(vt),ncol(vt)) %x% vs + model$k * vt %x% vs) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix vs = variogramLine(model$space, dist_vector = ds, covariance=TRUE) vt = variogramLine(model$time, dist_vector = dt, covariance=TRUE) return(vt + vs + model$k * vt * vs) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix vs = variogramLine(model$space, dist_vector = sMat, covariance = TRUE) vt = variogramLine(model$time, dist_vector = tMat, covariance = TRUE) return(vt + vs + model$k * vt * vs) } # covariance for the circulant embedding in ST covSurfProdSum <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector = dist_grid$spacelag, covariance = TRUE)$gamma vt = variogramLine(model$time, dist_vector = dist_grid$timelag, covariance = TRUE)$gamma cbind(dist_grid, "gamma" = vt + vs + model$k * vt * vs) } ######################################################### # sumMetric model: C_s + C_t + C_st (Gerard Heuvelink) ## ######################################################### vgmSumMetric <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) vst = variogramLine(model$joint, dist_vector=h)$gamma cbind(dist_grid, "gamma" = vs + vt + vst) } covSumMetric <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) h = sqrt((matrix(1,nrow(dt),ncol(dt)) %x% ds)^2 + (model$stAni * dt %x% matrix(1,nrow(ds),ncol(ds)))^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(matrix(1,nrow(Tm),ncol(Tm)) %x% Sm + Tm %x% matrix(1,nrow(Sm),ncol(Sm)) + Mm) } # the STI case if(inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = ds) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dt) h = sqrt(ds^2 + (model$stAni * dt)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Sm + Tm + Mm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix Sm = variogramLine(model$space, covariance = TRUE, dist_vector = sMat) Tm = variogramLine(model$time, covariance = TRUE, dist_vector = tMat) h = sqrt(sMat^2 + (model$stAni * tMat)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Sm + Tm + Mm) } # covariance for the circulant embedding in ST covSurfSumMetric <- function(model, dist_grid) { Sm = variogramLine(model$space, covariance = TRUE, dist_vector = dist_grid$spacelag)$gamma Tm = variogramLine(model$time, covariance = TRUE, dist_vector = dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * dist_grid$timelag)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h)$gamma cbind(dist_grid, "gamma" = Sm + Tm + Mm) } ################################ ## simplified sumMetric model ## ################################ vgmSimpleSumMetric <- function(model, dist_grid) { vs = variogramLine(model$space, dist_vector=dist_grid$spacelag)$gamma vt = variogramLine(model$time, dist_vector=dist_grid$timelag)$gamma h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) vm = variogramLine(model$joint, dist_vector=h)$gamma vn <- variogramLine(vgm(model$nugget, "Nug", 0), dist_vector=h)$gamma cbind(dist_grid, "gamma" = vs + vt + vm + vn) } covSimpleSumMetric <- function(x, y, model) { modelNew <- vgmST("sumMetric", space=model$space, time=model$time, joint=vgm(model$joint$psill[model$joint$model != "Nug"], model$joint$model[model$joint$model != "Nug"], model$joint$range[model$joint$model != "Nug"], model$nugget), stAni=model$stAni) if (!is.null(attr(model,"temporal unit"))) attr(modelNew,"temporal unit") <- attr(model,"temporal unit") covSumMetric(x, y, modelNew) } # covariance for the circulant embedding in ST covSurfSimpleSumMetric <- function(model, dist_grid) { modelNew <- vgmST("sumMetric", space=model$space, time=model$time, joint=vgm(model$joint$psill[model$joint$model != "Nug"], model$joint$model[model$joint$model != "Nug"], model$joint$range[model$joint$model != "Nug"], model$nugget), stAni=model$stAni) if (!is.null(attr(model,"temporal unit"))) attr(modelNew,"temporal unit") <- attr(model,"temporal unit") covSurfSumMetric(modelNew, dist_grid) } ################## ## metric model ## ################## vgmMetric <- function(model, dist_grid) { h = sqrt(dist_grid$spacelag^2 + (model$stAni * as.numeric(dist_grid$timelag))^2) cbind(dist_grid, "gamma" = variogramLine(model$joint, dist_vector=h)$gamma) } covMetric <- function(x, y, model) { stopifnot(inherits(x, c("STF", "STS", "STI", "sftime")) && inherits(y, c("STF", "STS", "STI", "sftime"))) # the STF case if (inherits(x, "STF") && inherits(y, "STF")) { # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix h = sqrt((matrix(1,nrow(dt),ncol(dt)) %x% ds)^2 + (model$stAni * dt %x% matrix(1,nrow(ds),ncol(ds)))^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # the STI case if (inherits(x, c("STI", "sftime")) || inherits(y, c("STI", "sftime"))) { # make sure that now both are of type STI x <- as(x, "STI") y <- as(y, "STI") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # compose the cov-matrix h = sqrt(ds^2 + (model$stAni * dt)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # the remaining cases, none of x and y is STI nor are both STF # make sure both are of type STS x <- as(x, "STS") y <- as(y, "STS") # calculate all spatial and temporal distances ds = spDists(x@sp, y@sp) dt = abs(outer(index(x@time), index(y@time), "-")) if(!is.null(attr(model,"temporal unit"))) units(dt) <- attr(model, "temporal unit") # ensure the same temporal metric as in the variogram definition debug_time_unit(units(dt)) dt <- as(dt, "matrix") # re-arrange the spatial and temporal distances sMat <- matrix(NA, nrow(x@index), nrow(y@index)) tMat <- matrix(NA, nrow(x@index), nrow(y@index)) for(r in 1:nrow(x@index)) { sMat[r,] <- ds[x@index[r,1], y@index[,1]] tMat[r,] <- dt[x@index[r,2], y@index[,2]] } # compose the cov-matrix h = sqrt(sMat^2 + (model$stAni * tMat)^2) Mm = variogramLine(model$joint, covariance = TRUE, dist_vector = h) return(Mm) } # covariance for the circulant embedding in ST covSurfMetric <- function(model, dist_grid) { h = sqrt(dist_grid$spacelag^2 + (model$stAni * dist_grid$timelag)^2) cbind(dist_grid, "gamma" = variogramLine(model$joint, covariance = TRUE, dist_vector = h)$gamma) } ########################### ## fitting ST variograms ## ########################### fit.StVariogram <- function(object, model, ..., method = "L-BFGS-B", lower, upper, fit.method = 6, stAni=NA, wles) { stopifnot(inherits(object, "StVariogram"), inherits(model, "StVariogramModel")) sunit <- attr(object$spacelag, "units") tunit <- attr(object$timelag, "units") tu.obj = attr(model, "temporal unit") if (!is.null(tu.obj)) stopifnot(identical(tunit, tu.obj)) object$timelag = as.numeric(object$timelag) # needed for R 4.1 object <- na.omit(object) ret <- model if(!missing(wles)) { if (wles) fit.method = 1 else fit.method = 6 } if (fit.method == 0) { attr(ret,"optim.output") <- "no fit" attr(ret, "MSE") <- mean((object$gamma - variogramSurface(model, data.frame(spacelag=object$dist, timelag=object$timelag))$gamma)^2) attr(ret, "spatial unit") <- sunit attr(ret, "temporal unit") <- tunit return(ret) } if ((fit.method == 7 || fit.method == 11) && is.null(model$stAni) && is.na(stAni)) { message("[An uninformed spatio-temporal anisotropy value of '1 (spatial unit)/(temporal unit)' is automatically selected. Consider providing a sensible estimate for stAni or using a different fit.method.]") stAni <- 1 } weightingFun <- switch(fit.method, function(obj, ...) obj$np, # 1 function(obj, gamma, ...) obj$np/gamma^2, # 2 function(obj, ...) obj$np, # 3 function(obj, gamma, ...) obj$np/gamma^2, # 4 function(obj, ...) stop("fit.method = 5 (REML), is not yet implemented"), # 5 function(obj, ...) 1, # 6 function(obj, curStAni, ...) if(is.na(stAni)) obj$np/(obj$dist^2+(curStAni*obj$timelag)^2) else obj$np/(obj$dist^2+(stAni*obj$timelag)^2), # 7 function(obj, ...) { dist <- obj$dist dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) obj$np/dist^2 # 8, pure space, 0 dist = min (dist > 0) }, function(obj, ...) { dist <- obj$timelag dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) obj$np/dist^2 }, # 9, pure time function(obj, gamma, ...) 1/gamma^2, # 10 function(obj, curStAni, ...) { if(is.na(stAni)) 1/(obj$dist^2+(curStAni*obj$timelag)^2) else 1/(obj$dist^2+(stAni*obj$timelag)^2) }, # 11 function(obj, ...) { dist <- obj$dist dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) 1/(obj$dist^2) # 12, pure space }, function(obj, ...) { dist <- obj$timelag dist[dist == 0] <- min(dist[dist != 0], na.rm = TRUE) 1/(obj$timelag^2) }) # 13, pure time if(is.null(weightingFun)) stop(paste("fit.method =", fit.method, "is not implementend")) fitFun = function(par, trace = FALSE, ...) { curModel <- insertPar(par, model) gammaMod <- variogramSurface(curModel, data.frame(spacelag=object$dist, timelag=object$timelag))$gamma resSq <- (object$gamma - gammaMod)^2 resSq <- resSq * weightingFun(object, gamma=gammaMod, curStAni=curModel$stAni) if (trace) print(c(par, MSE = mean(resSq))) mean(resSq) # seems numerically more well behaved } if(missing(lower)) { min.s <- min(object$dist[object$dist>0])*0.05 # 5 % of the minimum distance larger 0 min.t <- min(object$dist[object$timelag>0])*0.05 # 5 % of the minimum time lag 0), pos <- sqrt(.Machine$double.eps) # at least positive lower <- switch(strsplit(model$stModel, "_")[[1]][1], separable=c(min.s, 0, min.t, 0, 0), productSum=c(0, min.s, 0, 0, min.t, 0, pos), productSumOld=c(0, min.s, 0, 0, min.t, 0, 0), sumMetric=c(0, min.s, 0, 0, min.t, 0, 0, pos, 0, pos), simpleSumMetric=c(0, min.s, 0, min.t, 0, pos, 0, 0, pos), metric=c(0, pos, 0, pos), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } if(missing(upper)) upper <- switch(strsplit(model$stModel, "_")[[1]][1], separable=c(Inf, 1, Inf, 1, Inf), productSum=Inf, productSumOld=Inf, sumMetric=Inf, simpleSumMetric=Inf, metric=Inf, stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) pars.fit <- optim(extractPar(model), fitFun, ..., method = method, lower = lower, upper = upper) ret <- insertPar(pars.fit$par, model) attr(ret,"optim.output") <- pars.fit attr(ret, "MSE") <- mean((object$gamma - variogramSurface(insertPar(pars.fit$par, model), data.frame(spacelag=object$dist, timelag=object$timelag))$gamma)^2) attr(ret, "spatial unit") <- sunit attr(ret, "temporal unit") <- tunit return(ret) } ########### ## tools ## ########### # insert parameters into models insertPar <- function(par, model) { switch(strsplit(model$stModel, "_")[[1]][1], separable=insertParSeparable(par, model), productSum=insertParProdSum(par, model), productSumOld=insertParProdSumOld(par, model), sumMetric=insertParSumMetric(par, model), simpleSumMetric=insertParSimpleSumMetric(par,model), metric=insertParMetric(par,model), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } # extract parameters from models extractPar <- function(model) { switch(strsplit(model$stModel, "_")[[1]][1], separable=c(range.s=model$space$range[2], nugget.s=model$space$psill[1], range.t=model$time$range[2], nugget.t=model$time$psill[1], sill= model$sill[[1]]), productSumOld=c(sill.s = rev(model$space$psill)[1], range.s = rev(model$space$range)[1], sill.t = rev(model$time$psill)[1], range.t = rev(model$time$range)[1], sill=model$sill[[1]], nugget=model$nugget[[1]]), productSum=c(sill.s = model$space$psill[2], range.s = model$space$range[2], nugget.s = model$space$psill[1], sill.t = model$time$psill[2], range.t = model$time$range[2], nugget.t = model$time$psill[1], k=model$k), sumMetric=c(sill.s = model$space$psill[2], range.s = model$space$range[2], nugget.s = model$space$psill[1], sill.t = model$time$psill[2], range.t = model$time$range[2], nugget.t = model$time$psill[1], sill.st = model$joint$psill[2], range.st = model$joint$range[2], nugget.st = model$joint$psill[1], anis = model$stAni[[1]]), # simplified sumMetric model simpleSumMetric=c(sill.s = rev(model$space$psill)[1], range.s = rev(model$space$range)[1], sill.t = rev(model$time$psill)[1], range.t = rev(model$time$range)[1], sill.st = rev(model$joint$psill)[1], range.st = rev(model$joint$range)[1], nugget = model$nugget[[1]], anis = model$stAni[[1]]), metric=c(sill = model$joint$psill[2], range = model$joint$range[2], nugget = model$joint$psill[1], anis = model$stAni[[1]]), stop("Only \"separable\", \"productSum\", \"sumMetric\", \"simpleSumMetric\" and \"metric\" are implemented.")) } # extract names extractParNames <- function(model) { names(extractPar(model)) } ## dedicated insertion functions ################################ # separable model insertParSeparable <- function(par, model) { vgmST("separable", space=vgm(1-par[2],as.character(model$space$model[2]),par[1],par[2], kappa=model$space$kappa[2]), time= vgm(1-par[4],as.character(model$time$model[2]),par[3],par[4], kappa=model$time$kappa[2]), sill=par[5]) } # product sum model insertParProdSumOld <- function(par, model) { vgmST("productSumOld", space=vgm(par[1],as.character(rev(model$space$model)[1]),par[2], kappa=rev(model$space$kappa)[1]), time= vgm(par[3],as.character(rev(model$time$model)[1]),par[4], kappa=rev(model$time$kappa)[1]), sill=par[5], nugget=par[6]) } insertParProdSum <- function(par, model) { vgmST("productSum", space=vgm(par[1],as.character(model$space$model[2]),par[2],par[3], kappa=model$space$kappa[2]), time= vgm(par[4],as.character(model$time$model[2]),par[5], par[6], kappa=model$time$kappa[2]), k=par[7]) } # sum metric model insertParSumMetric <- function(par, model) { vgmST("sumMetric", space=vgm(par[1],as.character(model$space$model[2]),par[2],par[3], kappa=model$space$kappa[2]), time= vgm(par[4],as.character(model$time$model[2]),par[5],par[6], kappa=model$time$kappa[2]), joint=vgm(par[7],as.character(model$joint$model[2]),par[8],par[9], kappa=model$joint$kappa[2]), stAni=par[10]) } # simplified sum metric model insertParSimpleSumMetric <- function(par, model) { vgmST("simpleSumMetric", space=vgm(par[1],as.character(rev(model$space$model)[1]),par[2], kappa=rev(model$space$kappa)[1]), time= vgm(par[3],as.character(rev(model$time$model)[1]),par[4], kappa=rev(model$time$kappa)[1]), joint=vgm(par[5],as.character(rev(model$joint$model)[1]),par[6], kappa=rev(model$joint$kappa)[1]), nugget=par[7], stAni=par[8]) } # metric model insertParMetric <- function(par, model) { vgmST("metric", joint=vgm(par[1], as.character(model$joint$model[2]), par[2], par[3], kappa=model$joint$kappa[2]), stAni=par[4]) } gstat/R/fit.lmc.R0000644000176200001440000000354413777370515013301 0ustar liggesusers# $Id: fit.lmc.q,v 1.8 2009-10-06 07:52:00 edzer Exp $ "fit.lmc" <- function (v, g, model, fit.ranges = FALSE, fit.lmc = !fit.ranges, correct.diagonal = 1.0, ...) { posdef = function(X) { q = eigen(X) d = q$values d[d < 0] = 0 q$vectors %*% diag(d, nrow = length(d)) %*% t(q$vectors) } if (!inherits(v, "gstatVariogram")) stop("v should be of class gstatVariogram") if (!inherits(g, "gstat")) stop("g should be of class gstat") if (!missing(model)) { if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel") } n = names(g$data) for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) x = v[v$id == name, ] if (nrow(x) == 0) stop(paste("gstatVariogram", name, "not present")) m = g$model[[name]] if (!missing(model)) m = model g$model[[name]] = fit.variogram(x, m, fit.ranges = fit.ranges, ...) } } if (fit.lmc) { m = g$model[[n[1]]] for (k in 1:nrow(m)) { psill = matrix(NA, nrow = length(n), ncol = length(n)) for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) psill[i, j] = psill[j, i] = g$model[[name]][k, "psill"] } } psill = posdef(psill) diag(psill) = diag(psill) * correct.diagonal for (i in 1:length(n)) { for (j in i:length(n)) { name = ifelse(i == j, n[i], cross.name(n[i], n[j])) g$model[[name]][k, "psill"] = psill[i, j] } } } } g } gstat/R/plot.variogramCloud.R0000644000176200001440000000437513777370515015703 0ustar liggesusers# $Id: plot.variogramCloud.q,v 1.7 2007-10-18 10:13:13 edzer Exp $ "plot.variogramCloud" <- function (x, identify = FALSE, digitize = FALSE, xlim = c(0, max(x$dist)), ylim, # = c(0, max(x$gamma)), xlab = "distance", ylab = "semivariance", keep = FALSE, ...) { if (identify || digitize) { if (missing(ylim)) ylim = c(0, max(x$gamma)) dots = list(...) if ("log" %in% names(dots)) { log = dots$log if (grep("x", log) & xlim[1] == 0) xlim[1] = min(x$dist)/2 if (grep("y", log) & ylim[1] == 0) ylim[1] = min(x$gamma)/2 } plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) .BigInt = attr(x, ".BigInt") head = floor(x$np %/% .BigInt) + 1 tail = floor(x$np %% .BigInt) + 1 if (identify) { print("mouse-left identifies, mouse-right or Esc stops") labs = paste(head, tail, sep = ",") sel = identify(x$dist, x$gamma, labs, pos = keep) ret = data.frame(cbind(head, tail)[sel,, drop = FALSE]) } else { print("mouse-left digitizes, mouse-right closes polygon") poly = locator(n = 512, type = "l") if (!is.null(poly)) sel = point.in.polygon(x$dist, x$gamma, poly$x, poly$y) else stop("digitized selection is empty") ret = data.frame(cbind(head, tail)[sel == 1,,drop = FALSE]) } class(ret) = c("pointPairs", "data.frame") if (keep) { if (identify) { attr(x, "sel") = sel attr(x, "text") = labs[sel$ind] } else # digitize attr(x, "poly") = poly attr(x, "ppairs") = ret return(x) } else return(ret) } else { sel = attr(x, "sel") lab = attr(x, "text") poly = attr(x, "poly") if (!is.null(sel) && !is.null(lab)) { if (missing(ylim)) ylim = c(0, max(x$gamma)) plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) text(x$dist[sel$ind], x$gamma[sel$ind], labels=lab, pos= sel$pos) } else if (!is.null(poly)) { if (missing(ylim)) ylim = c(0, max(x$gamma)) plot(x$dist, x$gamma, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) lines(poly$x, poly$y) } else { x$np = rep(1, length(x$gamma)) plot.gstatVariogram(x, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, ...) } } } gstat/R/fit.variogram.reml.R0000644000176200001440000000312613777370515015447 0ustar liggesusers# $Id: fit.variogram.reml.q,v 1.14 2009-11-02 21:33:17 edzer Exp $ "fit.variogram.reml" <- function (formula, locations, data, model, debug.level = 1, set, degree = 0) { if (missing(formula)) stop("nothing to fit to") if (!inherits(formula, "formula")) stop("first argument should be of class formula") if (!missing(locations)) { if (inherits(locations, "formula")) coordinates(data) = locations else if (is(locations, "Spatial")) data = as(locations, "SpatialPointsDataFrame") } if (!is(data, "SpatialPointsDataFrame")) stop("data should (now) be of class SpatialPointsDataFrame") if (missing(model)) stop("no model to fit") if (!inherits(model, "variogramModel")) stop("model should be of class variogramModel (use vgm)") fit.sills = rep(TRUE, length(model$model)) fit.ranges = rep(FALSE, length(model$model)) .Call(gstat_init, as.integer(debug.level)) ret = gstat.formula(formula, data) ret$y <- residuals(lm(formula, data)) .Call(gstat_new_data, as.double(ret$y), as.double(ret$locations), as.double(ret$X), as.integer(1), double(0), as.integer(-1), as.integer(0), as.double(-1), as.integer(0), as.integer(1), double(0), double(0), as.integer(degree), as.integer(is.projected(data)), as.integer(0), as.double(1.0), as.integer(0)) load.variogram.model(model) if (!missing(set)) gstat.load.set(set) ret = .Call(gstat_fit_variogram, as.integer(5), as.integer(fit.sills), as.integer(fit.ranges)) .Call(gstat_exit, 0) model$psill = ret[[1]] model$range = ret[[2]] model } gstat/R/turningLayers.R0000644000176200001440000003052513777370515014612 0ustar liggesusers# # library(gstat) # # separable model: spatial and temporal sill will be ignored # # and kept constant at 1-nugget respectively. A joint sill is used. # separableModel <- vgmST("separable", # space=vgm(0.9,"Exp", 147, 0.1), # time =vgm(0.9,"Exp", 3.5, 0.1), # sill=40) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), separableModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # product sum model: spatial and temporal nugget will be ignored and kept # # constant at 0. Only a joint nugget is used. # prodSumModel <- vgmST("productSum", # space=vgm(39, "Sph", 343, 0), # time= vgm(36, "Exp", 3, 0), # k=15) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), prodSumModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # sum metric model: spatial, temporal and joint nugget will be estimated # sumMetricModel <- vgmST("sumMetric", # space=vgm( 6.9, "Lin", 200, 3.0), # time =vgm(10.3, "Lin", 15, 3.6), # joint=vgm(37.2, "Exp", 84,11.7), # stAni=77.7) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), sumMetricModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # simplified sumMetric model, only a overall nugget is fitted. The spatial, # # temporal and jont nuggets are set to 0. # simpleSumMetricModel <- vgmST("simpleSumMetric", # space=vgm(20,"Lin", 150, 0), # time =vgm(20,"Lin", 10, 0), # joint=vgm(20,"Exp", 150, 0), # nugget=1, stAni=15) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), simpleSumMetricModel) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") # # # metric model # metricModel <- vgmST("metric", # joint=vgm(60, "Exp", 150, 10), # stAni=60) # # covSTMat <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), metricModel, turningLayers = FALSE) # dim(covSTMat) # # image(matrix(ceSim(covSTMat, 1, c(20, 16)), # nrow=20, ncol=16), asp=1, ylab="time", xlab="space") ## turning bands: # for cov-functions valid in 3-dim # adjust the covariance matrix (Schlahter, Chap. 2, eq 2.25) # simulate several layers (up-right hyper-planes in the 3D+T-cube) with random directions on a unit hemi-sphere # orthogonally project target points onto rndm lyrs and average the values for all rndm lyrs # -> one simulation of a 3d+T Gaussian random field, for 2D use a hyperplane in 3D # the tunring bands operator (numerical, 3-dimensional case) # @input: # model target covariance function # dist_grid: data.frame wtih columns spacelag and timelag for which the covariances are calculated # # @value: data.frame with columns spacelag, timelag and gamma where the latter contains the covariances for the 1-dim spatial and temporal layers # model <- separableModel # dist_grid <- as.data.frame(cbind("spacelag" = rep(1:150*1., each=4), # "timelag" = rep(1:4, 150))) # CAVE: distgrid must ahve the correct spatial and temporal metrics tbOperator <- function(model, dist_grid) { r <- dist_grid$spacelag derFun <- function(r) r * variogramSurface(model, dist_grid = data.frame(spacelag=r, timelag=dist_grid$timelag), covariance = TRUE)$gamma cbind(dist_grid, "gamma" = diag(attr(numericDeriv(quote(derFun(r)), "r"), "gradient"))) } randomDirections <- function(n) { u <- runif(n, 0, 2*pi) v <- runif(n, 0, 1) s <- sqrt(1-v^2) cbind(s*cos(u), s*sin(u), v) } # library(rgl) # plot3d(randomDirections(100), aspect = c(1,1,0.5)) # nLyrs <- 500 # coordMat <- matrix(c(1,5,5, # 1,7,7, # 1,5,7, # 1,7,5), byrow=T, ncol=3) # # coordMat <- matrix(runif(3*1001,1,5), byrow=T, ncol=3) # # # random directions in 3D # rndDir <- randomDirections(nLyrs) # # # how much does each direction contribute to the point # cntrbtn <- rndDir %*% t(coordMat) # # -> each column corresponds to one location, each row i to the "contribution" of the i-th rndDir # # cl_cntrbtn <- ceiling(cntrbtn)+10 # centre for grid; mind spatial index # fl_cntrbtn <- floor(cntrbtn) +10 # # covRow1 <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(250,20), c(1,16), metricModel, turningLayers = TRUE) # # sTime <- Sys.time() # simLyrs <- ceSim(covRow1, nLyrs, c(20,16)) # simLyrs <- lapply(1:nLyrs, function(col) matrix(simLyrs[,col], nrow=20, ncol=16)) # # lambda <- cl_cntrbtn - cntrbtn -10 # # cntrbSngSimLyr <- function(lyrId) { # simLyrs[[lyrId]][cl_cntrbtn[lyrId,],] * (1-lambda)[lyrId,] + simLyrs[[lyrId]][fl_cntrbtn[lyrId,],] * lambda[lyrId,] # } # # # reduce to the one realisation based on the combination of nLyrs turning bands # simTs <- Reduce('+', lapply(1:nLyrs, cntrbSngSimLyr))/sqrt(nLyrs) # eTime <- Sys.time() # # eTime - sTime # 0.7 secs/simulation of 100 random points # # image(simTs) # # dim(simTs) # # 1001 locations at 16 time stamps # # plot(simTs[500,]) # computes the covariance matrixes and weights once, applied to series of # variables/simulations where each variable/simulation is stored in one column of # the multiVarMatrix copied from krigeST to avoid repeted calls to krige with # multiple, identical inversions of the weights matrix # TODO: add functionality for temporal sandwich-wise processing: i.e. use the # +/- nmaxTime time slices to predict one time slice krigeSTMultiple <- function(formula, from, to, modelList, multiVarMatrix, nmaxTime=Inf) { lst = extractFormula(formula, from, to) separate <- length(from) > 1 && length(to) > 1 && inherits(from, "STF") && inherits(to, "STF") X = lst$X x0 = lst$x0 V = covfn.ST(from, model = modelList, separate=separate) v0 = covfn.ST(from, to, modelList) if (modelList$stModel == "separable" & separate) skwts <- STsolve(V, v0, X) # use Kronecker trick else skwts <- CHsolve(V, cbind(v0, X)) npts = length(to) ViX = skwts[,-(1:npts)] skwts = skwts[,1:npts] idPredFun <- function(sim) { sim <- matrix(sim, ncol = 1) beta = solve(t(X) %*% ViX, t(ViX) %*% sim) x0 %*% beta + t(skwts) %*% (sim - X %*% beta) } apply(multiVarMatrix, 2, idPredFun) } # unconcitional ## STFDF # library(sp) # library(spacetime) # library(zoo) # library(xts) # data(meuse, package = "sp") # coordinates(meuse) <- ~x+y # proj4string(meuse) <- CRS("+init=epsg:28992") # krigeST <- function(formula, data, newdata, modelList, y, beta, nmax=Inf, stAni=NULL, # computeVar = FALSE, fullCovariance = FALSE, # bufferNmax=2, progress=TRUE) ## krigeSTSimTB <- function(formula, data, newdata, modelList, nsim, progress=TRUE, nLyrs=500, tGrid=NULL, sGrid=NULL, ceExt=2, nmax=Inf) { stopifnot(zoo::is.regular(newdata@time)) condSim <- TRUE if (missing(data)) { condSim <- FALSE message("[No data provided: performing unconditional simulation.]") } else { message("[Performing conditional simulation.]") } pb <- txtProgressBar(0,nsim,style=3) # ST-simulation grid if (is.null(tGrid)) { tDis <- diff(c(index(newdata@time[1]), newdata@endTime[1])) if (!is.null(attr(modelList, "temporal unit"))) { units(tDis) <- attr(modelList, "temporal unit") } else { message("[The spatio-temporal variogram model does not carry a time unit attribute: krigeST cannot check whether the temporal distance metrics coincide.]") } tGrid <- c(as.numeric(tDis), length(newdata@time)) attr(tGrid, "units") <- c("", units(tDis)) debug_time_unit(units(tDis)) } if (is.null(sGrid)) { if (gridded(newdata@sp)) { # SpatialPixels/SpatialGrid: # based on GridTopology: use minimal cellsize of both directions; take enough to cover the diagonal sDis <- min(newdata@sp@grid@cellsize) sDim <- ceiling(sqrt(sum((newdata@sp@grid@cellsize * newdata@sp@grid@cells.dim)^2))/sDis) sGrid <- c(sDis, sDim) } else { # treat (as) SpatialPoints: # Average area per location --assuming-a-regular-squared-outline-taking-the-sqrt--> length/location --take-later-twice-as-many--> bboxExt <- apply(newdata@sp@bbox, 1, diff) sDis <- sqrt(prod(bboxExt)/length(newdata@sp)) sDim <- ceiling(sqrt(sum((bboxExt/sDis)^2))) sGrid <- c(sDis, sDim) } } # random directions in 3D rndDir <- randomDirections(nLyrs) # coordinates coordMat <- coordinates(newdata@sp) # coordinates (embedded in 3D) shifted + scaled to the grid index of the spatial gridding sGrid coordMat[,1] <- (coordMat[,1] - newdata@sp@bbox[1,1])/sGrid[1] coordMat[,2] <- (coordMat[,2] - newdata@sp@bbox[2,1])/sGrid[1] if (ncol(coordMat) == 2) { coordMat <- cbind(coordMat,1) } else { coordMat[,3] <- (coordMat[,3] - newdata@sp@bbox[3,1])/sGrid[1] } # how much does each direction contribute to the point cntrbtn <- rndDir %*% t(coordMat) # -> each column corresponds to one location, each row i to the "contribution" of the i-th rndDir # ceiling and floor + shifted to avoid negative indices cl_cntrbtn <- ceiling(cntrbtn) + sGrid[2] fl_cntrbtn <- floor(cntrbtn) + sGrid[2] covRow1 <- ceWrapSpaceTimeOnTorusCalcCovRow1(c(sGrid[1], 2*sGrid[2]), tGrid, modelList, turningLayers = TRUE, ext=ceExt) origDim <- c(2*sGrid[2], tGrid[2]) sims <- list() ## for (i in 1:nsim) { setTxtProgressBar(pb, i) simLyrs <- ceSim(covRow1, nLyrs, origDim) simLyrs <- lapply(1:nLyrs, function(col) matrix(simLyrs[,col], nrow=origDim[1], ncol=origDim[2])) lambda <- cl_cntrbtn - cntrbtn - sGrid[2] cntrbSngSimLyr <- function(lyrId) { simLyrs[[lyrId]][cl_cntrbtn[lyrId,],] * (1-lambda)[lyrId,] + simLyrs[[lyrId]][fl_cntrbtn[lyrId,],] * lambda[lyrId,] } # reduce to the one realisation based on the combination of nLyrs turning bands sims[[paste0("sim",i)]] <- Reduce('+', lapply(1:nLyrs, cntrbSngSimLyr))/sqrt(nLyrs) } close(pb) sims <- do.call(cbind, lapply(sims, as.numeric)) # bind simulations to newdata geometry if (!condSim) { if ("data" %in% slotNames(newdata)) newdata@data <- cbind(newdata@data, sims) else newdata <- addAttrToGeom(newdata, as.data.frame(sims)) return(newdata) } # function call ends here if no data has been provided -> unconditional case varName <- all.vars(formula[[2]]) ## conditioning # interpolate the observations to the simulation grid obsMeanField <- krigeST(formula=formula, data=data, newdata=newdata, modelList=modelList) # interpolate to observation locations from the simulated grids for each simulation simMeanObsLoc <- krigeSTMultiple(as.formula(paste0("var1.pred ~", formula[[3]])), obsMeanField, data, modelList, sims) # interpolate from kriged mean sim at observed locations back to the grid for mean surface of the simulations simMeanFields <- krigeSTMultiple(as.formula(paste0(varName, "~", formula[[3]])), data, newdata, modelList, simMeanObsLoc) # add up the mean field and the corrected data sims <- obsMeanField@data$var1.pred + sims - simMeanFields # bind simulations to newdata geometry if ("data" %in% slotNames(newdata)) { newdata@data <- cbind(newdata@data, sims) return(newdata) } addAttrToGeom(newdata, as.data.frame(sims)) } # # sTime <- Sys.time() # krigedSim <- krigeSTUncSimTB(stf, metricModel, 100) # Sys.time() - sTime # # # 27 secs for 100 simulated ST fields of 155 locations and 21 time steps: 325500 values # # # plot one simulation along time # stplot(krigedSim[,1:12]) # # # plot one simulation along time # stplot(krigedSim[1:12,,"sim1"], mode="ts") # # # plot the ten simulations of the first day # spplot(krigedSim[,1], paste0("sim",1:10), as.table=TRUE) gstat/R/circEmbed.R0000644000176200001440000002131514314525261013602 0ustar liggesusers## Benedikt Gräler (52North), 2018-05-25: ## circulant embedding following: Davies, Tilman M., and David Bryant. "On ## circulant embedding for Gaussian random fields in R." Journal of Statistical ## Software 55.9 (2013): 1-21. ## See i.e. the suplementary files at (retreived 2018-05-25): ## https://www.jstatsoft.org/index.php/jss/article/downloadSuppFile/v055i09/v55i09.R # extend the grid # input: SpatialGrid/SpatialPixels/GridTopology # output: extended grid of class GridTopology ceExtGrid <- function(grid, ext=2) { if (!inherits(grid, "GridTopology")) { stopifnot(gridded(grid)) grid <- grid@grid } GridTopology(grid@cellcentre.offset, grid@cellsize, grid@cells.dim*ext) } # only for comaprission following the above paper # expand and wrap a grid on a torus + calc distances # input: SpatialGrid # output: distance matrix ceWrapOnTorusCalcDist <- function(grid, ext=2) { grid <- ceExtGrid(grid, ext) rangeXY <- grid@cellsize * grid@cells.dim MN.ext <- prod(grid@cells.dim) gridCoords <- coordinates(grid) mmat.ext <- matrix(rep(gridCoords[, 1], MN.ext), MN.ext, MN.ext) nmat.ext <- matrix(rep(gridCoords[, 2], MN.ext), MN.ext, MN.ext) mmat.diff <- mmat.ext - t(mmat.ext) nmat.diff <- nmat.ext - t(nmat.ext) mmat.torus <- pmin(abs(mmat.diff), rangeXY[1] - abs(mmat.diff)) nmat.torus <- pmin(abs(nmat.diff), rangeXY[2] - abs(nmat.diff)) sqrt(mmat.torus^2 + nmat.torus^2) } ## FFT preparation with only first row of cov-matrix ceWrapOnTorusCalcCovRow1 <- function(grid, vgmModel, ext=2) { grid <- ceExtGrid(grid, ext) stopifnot("variogramModel" %in% class(vgmModel)) rangeXY <- grid@cellsize * grid@cells.dim cenX <- seq(from = grid@cellcentre.offset[1], by = grid@cellsize[1], length.out = grid@cells.dim[1]) cenY <- seq(from = grid@cellcentre.offset[2], by = grid@cellsize[2], length.out = grid@cells.dim[2]) m.diff.row1 <- abs(cenX[1] - cenX) m.diff.row1 <- pmin(m.diff.row1, rangeXY[1] - m.diff.row1) n.diff.row1 <- abs(cenY[1] - cenY) n.diff.row1 <- pmin(n.diff.row1, rangeXY[2] - n.diff.row1) cent.ext.row1 <- expand.grid(m.diff.row1, n.diff.row1) D.ext.row1 <- matrix(sqrt(cent.ext.row1[, 1]^2 + cent.ext.row1[, 2]^2), grid@cells.dim[1], grid@cells.dim[2]) variogramLine(vgmModel, dist_vector = D.ext.row1, covariance = T) } # simulate GRF with given covariance structure using fft # @input # covMatRow1: the first row of the covariance matrix for the fft # n: number of simulations # cells.dim: the original dimrensions of the grid to clip from the larger embedded simulation # grid.index: grid.index of a SpatialPixels object to select the right pixels from the larger square-grid # @output # matrix where each column holds one simulated GRF corresponding to cells.dim (and grid.index if appropriate) ceSim <- function(covMatRow1, n=1, cells.dim, grid.index) { d <- dim(covMatRow1) dp <- prod(d) sdp <- sqrt(dp) prefix <- sqrt(Re(fft(covMatRow1, TRUE))) simFun <- function(x) { std <- rnorm(dp) realz <- prefix * (fft(matrix(std, d[1], d[2]))/sdp) as.numeric(Re(fft(realz, TRUE)/sdp)[1:cells.dim[1], 1:cells.dim[2]]) } simFunGridIndex <- function(x) { std <- rnorm(dp) realz <- prefix * (fft(matrix(std, d[1], d[2]))/sdp) as.numeric(Re(fft(realz, TRUE)/sdp)[1:cells.dim[1], 1:cells.dim[2]])[grid.index] } if (missing(grid.index)) do.call(cbind, lapply(1:n, simFun)) else do.call(cbind, lapply(1:n, simFunGridIndex)) } # computes the covariance matrixes and weights once, applied to series of # variables/simulations where each variable/simulation is stored in one column of # the multiVarMatrix copied from krige0 to avoid repeted calls to krige with # multiple, identical inversions of the weights matrix krigeMultiple <- function(formula, from, to, model, multiVarMatrix) { lst = extractFormula(formula, from, to) X = lst$X x0 = lst$x0 ll = (!is.na(is.projected(from)) && !is.projected(from)) s = coordinates(from) s0 = coordinates(to) V = variogramLine(model, dist_vector = spDists(s, s, ll), covariance = TRUE) v0 = variogramLine(model, dist_vector = spDists(s, s0, ll), covariance = TRUE) skwts = CHsolve(V, cbind(v0, X)) ViX = skwts[, -(1:nrow(s0))] skwts = skwts[, 1:nrow(s0)] idPredFun <- function(sim) { sim <- matrix(sim, ncol = 1) beta = solve(t(X) %*% ViX, t(ViX) %*% sim) x0 %*% beta + t(skwts) %*% (sim - X %*% beta) } apply(multiVarMatrix, 2, idPredFun) } ### pubic function ### # @input: # formula: definition of the dependent variable # data: optional Spatial*DataFrame for conditional simulation # newdata: SpatialGrid or SpatialPixels # model: variogram model of the GRF # n: number of desired simulations # ext: extension degree of the circulant embedding, default to 2 # @output # SpatialPixels or SpatailGridDataFrame with (additional) n columns holding one (un)conditional simulation each krigeSimCE <- function(formula, data, newdata, model, n = 1, ext = 2) { stopifnot(is(model, "variogramModel")) stopifnot(gridded(newdata)) if (!missing(data)) stopifnot(identical(data@proj4string@projargs, newdata@proj4string@projargs)) varName <- all.vars(formula[[2]]) condSim <- TRUE if (missing(data)) { condSim <- FALSE message("[No data provided: performing unconditional simulation.]") } else { message("[Performing conditional simulation.]") } # prepare covariance matrix covMat <- ceWrapOnTorusCalcCovRow1(newdata, model, ext = ext) # simulate sims <- ceSim(covMat, n, newdata@grid@cells.dim, newdata@grid.index) colnames(sims) <- paste0(varName, ".sim", 1:n) # bind simulations to newdata geometry if (!condSim) { if ("data" %in% slotNames(newdata)) newdata@data <- cbind(newdata@data, sims) else addAttrToGeom(newdata, as.data.frame(sims)) return(newdata) } # function call ends here if no data has been provided -> unconditional case ## conditioning # interpolate the observations to the simulation grid obsMeanField <- krige(formula, data, newdata, model) # interpolate to observation locations from the simulated grids for each simulation simMeanObsLoc <- krigeMultiple(as.formula(paste0("var1.pred ~", formula[[3]])), obsMeanField, data, model, sims) # interpolate from kriged mean sim at observed locations back to the grid for mean surface of the simulations simMeanFields <- krigeMultiple(as.formula(paste0(varName, "~", formula[[3]])), data, newdata, model, simMeanObsLoc) # add up the mean field and the corrected data sims <- obsMeanField@data$var1.pred + sims - simMeanFields # bind simulations to newdata geometry if ("data" %in% slotNames(newdata)) { newdata@data <- cbind(newdata@data, sims) return(newdata) } addAttrToGeom(newdata, as.data.frame(sims)) } ### # Note: to avoid the smoothing effect, the irregular observation locations could also be independently simulated by e.g. their surrounding grid values ### ## circulant embedding for ST-ocvariance functions with grids along one spatial and one temporal axis # inputs: # hDiscrete = c(hStep, hn): spatial step width and number of steps # tDiscrete = c(tStep, tn): temporal step length and number of steps # CAVE: hDiscrete and tDiscrete must have the correct spatial and temporal metrics ceWrapSpaceTimeOnTorusCalcCovRow1 <- function(hDiscrete, tDiscrete, vgmStModel, ext=2, turningLayers=TRUE) { stopifnot(is(vgmStModel) == "StVariogramModel") hDiscrete[2] <- hDiscrete[2]*ext tDiscrete[2] <- tDiscrete[2]*ext rangeST <- c(prod(hDiscrete), prod(tDiscrete)) cenX <- seq(from = 0, by = hDiscrete[1], length.out = hDiscrete[2]) cenY <- seq(from = 0, by = tDiscrete[1], length.out = tDiscrete[2]) m.diff.row1 <- abs(cenX[1] - cenX) m.diff.row1 <- pmin(m.diff.row1, rangeST[1] - m.diff.row1) n.diff.row1 <- abs(cenY[1] - cenY) n.diff.row1 <- pmin(n.diff.row1, rangeST[2] - n.diff.row1) cent.ext.row1 <- expand.grid(m.diff.row1, n.diff.row1) D.ext.row1 <- matrix(sqrt(cent.ext.row1[, 1]^2 + cent.ext.row1[, 2]^2), hDiscrete[2], tDiscrete[2]) colnames(cent.ext.row1) <- c("spacelag", "timelag") if (turningLayers) { return(matrix(tbOperator(vgmStModel, dist_grid = cent.ext.row1)$gamma, hDiscrete[2], tDiscrete[2])) } matrix(variogramSurface(vgmStModel, dist_grid = cent.ext.row1, covariance = TRUE)$gamma, hDiscrete[2], tDiscrete[2]) } gstat/R/hscat.R0000644000176200001440000000151313777370515013041 0ustar liggesusershscat = function(formula, data, breaks, pch = 3, cex = .6, mirror = FALSE, variogram.alpha = 0, as.table = TRUE, ...) { stopifnot(!missing(breaks)) x = variogram(formula, data, cloud = TRUE, cutoff = max(breaks), alpha = variogram.alpha, ...) x = as.data.frame(x) x$class = cut(x$dist, breaks = breaks) y = model.frame(formula, data)[[1]] x$xx = y[x$left] x$yy = y[x$right] if (mirror) x = data.frame( xx = c(x$yy, y[x$left]), yy = c(x$xx, y[x$right]), class = c(x$class, x$class)) lab = as.character(formula)[2] panel = function(x,y,subscripts, ...) { xr = c(min(x),max(x)) llines(xr, xr) lpoints(x,y,...) ltext(min(x), max(y), paste("r =", signif(cor(x,y),3)), adj=c(0,0.5)) } xyplot(xx~yy|class, x, panel = panel, main = "lagged scatterplots", xlab = lab, ylab = lab, as.table = as.table, ...) } gstat/R/plot.pointPairs.R0000644000176200001440000000121713777370515015045 0ustar liggesusers# $Id: plot.pointPairs.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "plot.pointPairs" <- function(x, data, xcol = data$x, ycol = data$y, xlab = "x coordinate", ylab = "y coordinate", col.line = 2, line.pch = 0, main = "selected point pairs", ...) { if (inherits(data, "sf")) data = as(data, "Spatial") if (is(data, "SpatialPoints")) { cc = coordinates(data) xcol = cc[,1] ycol = cc[,2] xlab = colnames(cc)[1] ylab = colnames(cc)[2] asp = mapasp(data) } else asp = "iso" xyplot(ycol ~ xcol, aspect = asp, panel = panel.pointPairs, xlab = xlab, ylab = ylab, pairs = x, col.line = col.line, line.pch = line.pch, main = main, ...) } gstat/R/print.gstat.R0000644000176200001440000000451713777370515014223 0ustar liggesusers# $Id: print.gstat.q,v 1.7 2006-02-10 19:01:07 edzer Exp $ "print.gstat" <- function (x, ...) { if (missing(x) || !inherits(x, "gstat")) stop("wrong call") data.names <- names(x$data) if (length(data.names)) cat("data:\n") for (n in data.names) { fstr = paste(x$data[[n]]$formula[c(2, 1, 3)], collapse = "") #lstr = paste(x$data[[n]]$locations[c(1, 2)], collapse = "") cat(n, ": formula =", fstr, ";") if (!is.null(x$data[[n]]$data)) { data.dim = dim(x$data[[n]]$data) cat(" data dim =", data.dim[1], "x", data.dim[2]) } else { if (x$data[[n]]$dummy) cat(" dummy data") else cat(" NULL data") } if (x$data[[n]]$nmax != Inf) cat(" nmax =", x$data[[n]]$nmax) if (x$data[[n]]$nmin > 0) cat(" nmin =", x$data[[n]]$nmin) if (x$data[[n]]$maxdist < Inf) cat(" radius =", x$data[[n]]$maxdist) if (x$data[[n]]$vfn > 1) cat(" variance function =", c("identity", "mu", "mu(1-mu)", "mu^2", "mu^3")[x$data[[n]]$vfn]) if (length(x$data[[n]]$beta) > 0) cat(" beta =", x$data[[n]]$beta) if (x$data[[n]]$degree > 0) cat(" degree =", x$data[[n]]$degree) cat("\n") } xx.names = xx = NULL for (n in data.names) { m = x$model[[n]] if (!is.null(m)) { xx = rbind(xx, m) if (nrow(m) == 1) xx.names = c(xx.names, n) else xx.names = c(xx.names, paste(n, "[", 1:nrow(m), "]", sep = "")) } } if (length(data.names) > 1) { for (j in 2:length(data.names)) { for (i in 1:(j - 1)) { n = cross.name(data.names[i], data.names[j]) m = x$model[[n]] if (!is.null(m)) { xx = rbind(xx, m) if (nrow(m) == 1) xx.names = c(xx.names, n) else xx.names = c(xx.names, paste(n, "[", 1:nrow(m), "]", sep = "")) } } } } if (!is.null(xx)) { cat("variograms:\n") row.names(xx) = xx.names print(xx, ...) } if (!is.null(x$set)) { s = gstat.set(x$set) for (i in 1:length(s)) cat(s[i], "\n") } if (!is.null(x$locations)) print(x$locations) invisible(x) } gstat/R/krige.cv.R0000644000176200001440000000345113777370515013452 0ustar liggesusers# $Id: krige.cv.q,v 1.18 2009-10-30 16:11:21 edzer Exp $ if (!isGeneric("krige.cv")) setGeneric("krige.cv", function(formula, locations, ...) standardGeneric("krige.cv")) krige.cv.locations = function (formula, locations, data = sys.frame(sys.frame(sys.parent())), model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(data), verbose = interactive(), debug.level = 0) { gstat.cv(gstat(g = NULL, id = "var1", formula = formula, locations = locations, data = data, model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level) } setMethod("krige.cv", c("formula", "formula"), krige.cv.locations) krige.cv.spatial = function (formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) { # data = locations gstat.cv(gstat(g = NULL, id = "var1", formula = formula, data = locations, model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level) } setMethod("krige.cv", c("formula", "Spatial"), krige.cv.spatial) krige.cv.sf = function (formula, locations, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, maxdist = Inf, nfold = nrow(locations), verbose = interactive(), debug.level = 0) { # data = locations if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov sf::st_as_sf(gstat.cv(gstat(g = NULL, id = "var1", formula = formula, data = as(locations, "Spatial"), model = model, beta = beta, nmax = nmax, nmin = nmin, maxdist = maxdist, ...), nfold = nfold, verbose = verbose, debug.level = debug.level)) } setMethod("krige.cv", c("formula", "sf"), krige.cv.sf) gstat/R/predict.gstat.R0000644000176200001440000002317414147167202014506 0ustar liggesusers# $Id: predict.gstat.q,v 1.35 2009-11-02 21:33:17 edzer Exp $ predict.gstat <- function (object, newdata, block = numeric(0), nsim = 0, indicators = FALSE, BLUE = FALSE, debug.level = 1, mask, na.action = na.pass, sps.args = list(n = 500, type = "regular", offset = c(.5, .5)), ...) { if (missing(object) || length(object$data) < 1) stop("no data available") if (!inherits(object, "gstat")) stop("first argument should be of class gstat") to_stars = FALSE to_sf = if (inherits(newdata, c("sf", "sfc", "stars"))) { to_stars = inherits(newdata, "stars") newdata = as(newdata, "Spatial") TRUE } else FALSE if (!is.null(object$locations) && inherits(object$locations, "formula") && !(is(newdata, "Spatial"))) { coordinates(newdata) = object$locations return.sp = FALSE } else return.sp = TRUE max_dist = getMaxDist(object$data, newdata) .Call(gstat_init, as.integer(debug.level)) bl_weights = numeric(0) if (!missing(mask)) { cat("argument mask is deprecated:") stop("use a missing value pattern in newdata instead") } nvars = length(object$data) new.X = NULL for (i in 1:length(object$data)) { name = names(object$data)[i] d = object$data[[i]] if (!is.null(d$data)) { if (!identical(d$data@proj4string@projargs, newdata@proj4string@projargs)) { print(proj4string(d$data)) print(proj4string(newdata)) stop(paste(name, ": data item in gstat object and newdata have different coordinate reference systems")) } } if (d$nmax == Inf) nmax = as.integer(-1) else nmax = as.integer(d$nmax) nmin = as.integer(max(0, d$nmin)) if (d$maxdist == Inf) maxdist = as.numeric(-1) else maxdist = d$maxdist if (d$dummy) { # tr = terms(d$locations) if (is.null(d$beta) || length(d$beta) == 0) stop("dummy data should have beta defined") if (d$degree != 0) stop("dummy data cannot have non-zero degree arg; use formula") # loc.dim = length(attr(tr, "term.labels")) loc.dim = dim(coordinates(newdata))[[2]] .Call(gstat_new_dummy_data, as.integer(loc.dim), as.integer(d$has.intercept), as.double(d$beta), nmax, nmin, maxdist, as.integer(d$vfn), as.integer(is.projected(newdata)), as.integer(d$vdist)) raw = list(xlevels = NULL) } else { if (is.null(d$weights)) w = numeric(0) else w = d$weights raw = gstat.formula(d$formula, d$data) .Call(gstat_new_data, as.double(raw$y), as.double(raw$locations), as.double(raw$X), as.integer(raw$has.intercept), as.double(d$beta), nmax, nmin, maxdist, as.integer(d$force), as.integer(d$vfn), as.numeric(w), double(0.0), as.integer(d$degree), as.integer(is.projected(d$data)), as.integer(d$vdist), as.double(d$lambda), as.integer(d$omax)) } if (!is.null(object$model[[name]])) load.variogram.model(object$model[[name]], c(i - 1, i - 1), max_dist = max_dist) raw = gstat.formula.predict(d$formula, newdata, na.action = na.action, (length(BLUE) == 2 && BLUE[2]), xlev = raw$xlevels) if (is.null(new.X)) new.X = raw$X else new.X = cbind(new.X, raw$X) if (i > 1) { for (j in 1:(i - 1)) { cross = cross.name(names(object$data)[j], name) if (!is.null(object$model[[cross]])) load.variogram.model(object$model[[cross]], c(i - 1, j - 1), max_dist = max_dist) } } } if (!is.null(object$set)) gstat.load.set(object$set) if (!is.null(object$merge)) gstat.load.merge(object) if (is(newdata, "SpatialPolygons")) { pol = newdata@polygons if (length(pol) != nrow(raw$locations)) stop("polygons and center points length mismatch") block = matrix(NA, 0, 2) nd = as(newdata, "SpatialPolygons") block.cols = rep(as.numeric(NA), length(pol)) for (i in seq(along = pol)) { sps.args$x = nd[i] cc = coordinates(do.call("spsample", sps.args)) cc[,1] = cc[,1] - raw$locations[i,1] cc[,2] = cc[,2] - raw$locations[i,2] block.cols[i] = nrow(block) + 1 block = rbind(block, cc) } if (length(pol) == 1) block.cols = 2 } else if (is(newdata, "SpatialLines")) { lin = newdata@lines if (length(lin) != nrow(raw$locations)) stop("lines and line midpoints length mismatch") block = matrix(NA, 0, 2) nd = as(newdata, "SpatialLines") block.cols = rep(as.numeric(NA), length(lin)) for (i in seq(along = lin)) { sps.args$x = nd[i] cc = coordinates(do.call("spsample", sps.args)) cc[,1] = cc[,1] - raw$locations[i,1] cc[,2] = cc[,2] - raw$locations[i,2] block.cols[i] = nrow(block) + 1 block = rbind(block, cc) } if (length(lin) == 1) block.cols = 2 } else if (!is.null(dim(block))) { # i.e., block is data.frame or matrix if (is.data.frame(block) && !is.null(block$weights)) { bl_weights = block$weights block$weights = NULL } block = data.matrix(block) # converts to numeric block.cols = ncol(block) } else { block = as.numeric(block) # make sure it's not integer block.cols = numeric(0) } # handle NA's in the parts of newdata used: valid.pattern = NULL if (any(is.na(raw$locations)) || any(is.na(new.X))) { valid.pattern = !(apply(cbind(raw$locations, new.X), 1, function(x) any(is.na(x)))) raw$locations.all = raw$locations raw$locations = as.matrix(raw$locations[valid.pattern, ]) new.X = as.matrix(new.X[valid.pattern, ]) } if (nsim) { if (indicators == TRUE) nsim = -abs(nsim) # random path: randomly permute row indices perm = sample(seq(along = new.X[, 1])) ret = .Call(gstat_predict, as.integer(nrow(as.matrix(new.X))), as.double(as.vector(raw$locations[perm, ])), as.double(as.vector(new.X[perm,])), as.integer(block.cols), as.vector(block), as.vector(bl_weights), as.integer(nsim), as.integer(BLUE))[[1]] if (nsim == 1) colsel = seq(1, by=2, length.out=nvars) # pred1 var1 pred2 var2 ... else colsel = TRUE ret = data.frame(cbind(raw$locations, matrix(ret[order(perm), colsel], nrow(as.matrix(new.X)), abs(nsim) * nvars))) } else { ret = .Call(gstat_predict, as.integer(nrow(as.matrix(new.X))), as.double(as.vector(raw$locations)), as.vector(new.X), as.integer(block.cols), as.vector(block), as.vector(bl_weights), as.integer(nsim), as.integer(BLUE))[[1]] ret = data.frame(cbind(raw$locations, ret)) } .Call(gstat_exit, NULL) if (!is.null(valid.pattern) && any(valid.pattern)) { ret.all = data.frame(matrix(NA, length(valid.pattern), ncol(ret))) ret.all[, 1:ncol(raw$locations.all)] = raw$locations.all ret.all[valid.pattern, ] = ret ret = ret.all } if (abs(nsim) > 0) { names.vars = names(object$data) if (length(names.vars) > 1) names.vars = paste(rep(names.vars, each = abs(nsim)), paste("sim", 1:abs(nsim), sep = ""), sep = ".") else names.vars = paste("sim", 1:abs(nsim), sep = "") } else names.vars = create.gstat.names(names(object$data)) names(ret) = c(dimnames(raw$locations)[[2]], names.vars) if (return.sp) { if (is(newdata, "SpatialPolygons")) { row.names(ret) = sapply(newdata@polygons, function(x) slot(x, "ID")) ret = SpatialPolygonsDataFrame(as(newdata, "SpatialPolygons"), ret, match.ID = TRUE) } else if (is(newdata, "SpatialLines")) { row.names(ret) = sapply(newdata@lines, function(x) slot(x, "ID")) ret = SpatialLinesDataFrame(as(newdata, "SpatialLines"), ret, match.ID = TRUE) } else { coordinates(ret) = dimnames(raw$locations)[[2]] if (gridded(newdata)) { returnFullGrid = fullgrid(newdata) fullgrid(newdata) = FALSE ret = new("SpatialPixelsDataFrame", new("SpatialPixels", as(ret, "SpatialPoints"), grid = newdata@grid, grid.index = newdata@grid.index, bbox = newdata@bbox), data = ret@data, coords.nrs = ret@coords.nrs) fullgrid(ret) = returnFullGrid } } slot(ret, "proj4string") = slot(newdata, "proj4string") if (to_sf) { ret = if (to_stars) { if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov if (nsim) sim_to_dimension(stars::st_as_stars(ret), nsim) else stars::st_as_stars(ret) } else { if (gridded(ret) && fullgrid(ret)) fullgrid(ret) = FALSE if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov sf::st_as_sf(ret) } } } return(ret) } # call with: create.gstat.names(names(object$data)) # creates the names of the output columns in case of (multivariable) prediction create.gstat.names <- function(ids, names.sep = ".") { nvars = length(ids) names.vars = character(nvars * 2 + nvars * (nvars - 1)/2) pos = 1 for (i in 1:length(ids)) { name = ids[i] names.vars[1 + (i - 1) * 2] = paste(name, "pred", sep = names.sep) names.vars[2 + (i - 1) * 2] = paste(name, "var", sep = names.sep) if (i > 1) { for (j in 1:(i - 1)) { cross = paste(ids[j], name, sep = names.sep) names.vars[nvars * 2 + pos] = paste("cov", cross, sep = names.sep) pos = pos + 1 } } } return(names.vars) } getMaxDist = function(dataLst, newdata) { spBbox <- SpatialPoints(cbind(newdata@bbox[cbind(c(1,1,1,1), c(1,2,1,1))], newdata@bbox[cbind(c(2,2,2,2), c(1,1,1,2))]), proj4string = newdata@proj4string) d <- c(spDists(spBbox)[cbind(c(1,3),c(2,4))]) # d = apply(bbox(newdata), 1, diff) if (!is.null(dataLst[[1]]$data)) { spBbox2 <- SpatialPoints(cbind(dataLst[[1]]$data@bbox[cbind(c(1,1,1,1), c(1,2,1,1))], dataLst[[1]]$data@bbox[cbind(c(2,2,2,2), c(1,1,1,2))]), proj4string = dataLst[[1]]$data@proj4string) d2 <- c(spDists(spBbox2)[cbind(c(1,3),c(2,4))]) # d2 = apply(bbox(dataLst[[1]]$data), 1, diff) d = apply(rbind(d,d2), 2, max) # there are pathetic cases where this would not be sufficient } if (length(d) == 2) d = c(d, 0) stopifnot(length(d) == 3) d } gstat/R/load.variogram.model.R0000644000176200001440000000244313777370515015746 0ustar liggesusers# $Id: load.variogram.model.q,v 1.7 2008-11-12 10:04:22 edzer Exp $ "load.variogram.model" <- function(model, ids = c(0, 0), max_dist = rep(-1.0, 3)) { if (missing(model)) stop("model is missing"); if (!inherits(model, "variogramModel")) stop("model should be of mode variogramModel (use function vgm)") if (any(model$range < 0.0)) { print(model) stop("variogram range can never be negative") } stopifnot(length(max_dist) == 3) anis = c(model$ang1, model$ang2, model$ang3, model$anis1, model$anis2) if (is.null(attr(model, "table"))) covtable = numeric(0) else { covtable = attr(model, "table") if (dim(model)[1] > 1 || model$model != "Tab") stop("table can only have one single model") } # max_dist hack here for Lin(0) models: # if (max_dist > 0) { # w = which(model$model %in% c("Lin") & model$range == 0) # if (length(w) > 0) { # model[w,"psill"] = max_dist * model[w,"psill"] # model[w,"range"] = max_dist # cat("Conversion into equivalent model:\n") # print(model) # } # } if (!any(model$model %in% c("Lin", "Pow"))) max_dist = rep(-1.0, 3) # ignore .Call(gstat_load_variogram, as.integer(ids), as.character(model$model), as.numeric(model$psill), as.numeric(model$range), as.numeric(model$kappa), as.numeric(anis), covtable, as.numeric(max_dist)) } gstat/R/gstat.cv.R0000644000176200001440000000525314013273067013461 0ustar liggesusers# $Id: gstat.cv.q,v 1.9 2009-10-30 16:11:21 edzer Exp $ "gstat.cv" <- function (object, nfold = nrow(object$data[[1]]$data), remove.all = FALSE, verbose = interactive(), all.residuals = FALSE, ...) { if (!inherits(object, "gstat")) stop("first argument should be of class gstat") var1 = object$data[[1]] data = var1$data formula = var1$formula if (all.residuals) { nc = length(object$data) ret = data.frame(matrix(NA, nrow(data), nc)) } else { cc = coordinates(data) rownames(cc) = NULL df = data.frame(matrix(as.numeric(NA), nrow(data), 2)) ret = SpatialPointsDataFrame(cc, df, proj4string = data@proj4string) } if (missing(nfold)) nfold = 1:nrow(data) if (length(nfold) == nrow(data)) fold = nfold else if (nfold < nrow(data)) fold = sample(nfold, nrow(data), replace = TRUE) else fold = 1:nrow(data) if (all.residuals || (remove.all && length(object$data) > 1)) { all.data = list() for (v in 1:length(object$data)) all.data[[v]] = object$data[[v]]$data } if (verbose) pb <- txtProgressBar(1,length(unique(fold)),style=3) for (i in sort(unique(fold))) { if (verbose) setTxtProgressBar(pb, i) sel = which(fold == i) object$data[[1]]$data = data[-sel, ] if (remove.all && length(object$data) > 1) { for (v in 2:length(object$data)) { varv = object$data[[v]] varv$data = all.data[[v]] #atv = gstat.formula(varv$formula, varv$data)$locations #at1 = gstat.formula(formula, data[sel, ])$locations atv = coordinates(varv$data) at1 = coordinates(data[sel,]) cc = rbind(atv, at1) rownames(cc) = NULL # as there will be duplicates all = SpatialPoints(cc, proj4string = data@proj4string) zd = zerodist(all) skip = zd[, 1] object$data[[v]]$data = varv$data[-skip, ] } } x = predict(object, newdata = data[sel, ], ...) if (all.residuals) { for (i in 1:length(object$data)) { var.i = object$data[[i]] data.i = all.data[[i]] formula.i = var.i$formula observed = gstat.formula(formula.i, data.i)$y[sel] pred.name = paste(names(object$data)[i], "pred", sep = ".") residual = as.numeric(observed - x[[pred.name]]) ret[sel, i] = residual } } else { ret[[1]][sel] = x[[1]] ret[[2]][sel] = x[[2]] } } if (verbose) cat("\n") if (! all.residuals) { names(ret) = names(x)[1:2] ret$observed = gstat.formula(formula, data)$y pred.name = paste(names(object$data)[1], "pred", sep = ".") ret$residual = ret$observed - ret[[pred.name]] var.name = paste(names(object$data)[1], "var", sep = ".") ret$zscore = ret$residual/sqrt(ret[[var.name]]) ret$fold = fold } else names(ret) = names(object$data) if (!is.null(object$locations)) ret = as.data.frame(ret) ret } gstat/R/vgm.panel.R0000644000176200001440000000472513777370515013636 0ustar liggesusers# $Id: vgm.panel.q,v 1.7 2007-06-08 06:45:52 edzer Exp $ "get.direction.unitv" <- function(alpha, beta) { cb = cos(beta) c(cb * sin(alpha), cb * cos(alpha), sin(beta)) } "vgm.panel.xyplot" <- function (x, y, subscripts, type = "p", pch = plot.symbol$pch, col, col.line = plot.line$col, col.symbol = plot.symbol$col, lty = plot.line$lty, cex = plot.symbol$cex, ids, lwd = plot.line$lwd, model = model, direction = direction, labels, shift = shift, mode = mode, ...) { x <- as.numeric(x) y <- as.numeric(y) if (length(x) > 0) { if (!missing(col)) { if (missing(col.line)) col.line <- col if (missing(col.symbol)) col.symbol <- col } plot.symbol <- trellis.par.get("plot.symbol") plot.line <- trellis.par.get("plot.line") lpoints(x = x, y = y, cex = cex, col = col.symbol, pch = pch, type = type, ...) if (!is.null(labels)) ltext(x = x + shift * max(x), y = y, labels = labels[subscripts]) if (mode == "direct") { if (!missing(model) && !is.null(model)) { ang.hor <- pi * (direction[1]/180) ang.ver <- pi * (direction[2]/180) dir <- get.direction.unitv(ang.hor, ang.ver) ret <- variogramLine(model, max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } else if (mode == "cross") { id <- as.character(ids[subscripts][1]) if (!missing(model) && !is.null(model)) { if (inherits(model, "gstat")) m = model$model else m = model if (!is.list(m)) stop("model argument not of class gstat or list") if (is.list(m) && !is.null(m[[id]])) { ang.hor <- pi * (direction[1]/180) ang.ver <- pi * (direction[2]/180) dir <- get.direction.unitv(ang.hor, ang.ver) ret <- variogramLine(m[[id]], max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } } else if (mode == "directional") { if (!missing(model) && !is.null(model)) { dir <- c(1, 0, 0) if (!missing(direction)) { ang.hor <- pi * (direction[subscripts][1]/180.0) dir <- get.direction.unitv(ang.hor, 0) } ret <- variogramLine(model, max(x), dir = dir) llines(x = ret$dist, y = ret$gamma, lty = lty, col = col.line, lwd = lwd) } } } } gstat/R/gstatOptions.R0000644000176200001440000000061513777370515014437 0ustar liggesusers.gstatOptions <- new.env(FALSE, globalenv()) assign("gstat_progress", TRUE, envir = .gstatOptions) get_gstat_progress <- function() { get("gstat_progress", envir = .gstatOptions) } set_gstat_progress <- function(value) { stopifnot(is.logical(value)) stopifnot(length(value) == 1) assign("gstat_progress", value, envir = .gstatOptions) get_gstat_progress() } gstat/R/map.to.lev.R0000644000176200001440000000146013777370515013723 0ustar liggesusers# $Id: map.to.lev.q,v 1.2 2006-02-10 19:01:07 edzer Exp $ "map.to.lev" <- function (data, xcol = 1, ycol = 2, zcol = c(3, 4), ns = names(data)[zcol]) { len = nrow(data) d = matrix(nrow = len * length(zcol), ncol = 3) xnames = NULL if (length(ns) > 1 && length(ns) != length(zcol)) stop("names should have length 1 or equal to length of zcol") nr = 1 for (i in zcol) { if (length(ns) == 1) nm = rep(paste(ns, nr), len) else nm = rep(ns[nr], len) range = (1 + (nr - 1) * len):(nr * len) d[range, ] = cbind(data[, xcol], data[, ycol], data[, i]) xnames = c(xnames, nm) nr = nr + 1 } nms <- factor(xnames, levels = unique(xnames)) d = data.frame(d, nms) names(d) = c("x", "y", "z", "name") d } gstat/R/variogram.gstat.R0000644000176200001440000000203714147167622015044 0ustar liggesusers# $Id: variogram.gstat.q,v 1.9 2007-04-06 11:29:58 edzer Exp $ "variogram.gstat" = function (object, ...) { if (!inherits(object, "gstat")) stop("first argument should be of class gstat") y = list() locations = list() X = list() beta = list() grid = list() projected = TRUE for (i in seq(along = object$data)) { d = object$data[[i]] beta[[i]] = d$beta if (i > 1 && !identical(object$data[[1]]$data@proj4string@projargs, d$data@proj4string@projargs)) stop("data items in gstat object have different coordinate reference systems") raw = gstat.formula(d$formula, d$data) y[[i]] = raw$y locations[[i]] = raw$locations X[[i]] = raw$X grid[[i]] = raw$grid if (is(d$data, "Spatial")) projected = is.projected(d$data) if (d$degree != 0) stop("degree != 0: residual variograms wrt coord trend using degree not supported") } names(y) = names(locations) = names(X) = names(object$data) # call variogram.default() next: variogram(y, locations, X, trend.beta = beta, grid = grid, g = object, ..., projected = projected) } gstat/R/gstat.debug.R0000644000176200001440000000023513777370515014146 0ustar liggesusers# $Id: gstat.debug.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "gstat.debug" <- function(level = 0) { invisible(.Call(gstat_debug_level, as.integer(level))) } gstat/R/variogramLine.R0000644000176200001440000000232013777370515014533 0ustar liggesusers# $Id: variogramLine.q,v 1.4 2008-08-18 16:32:42 edzer Exp $ "variogramLine" <- function(object, maxdist, n = 200, min=1.0e-6 * maxdist, dir = c(1,0,0), covariance = FALSE, ..., dist_vector = numeric(0), debug.level = 0) { if (missing(object)) stop("model is missing"); if (!inherits(object, "variogramModel")) stop("model should be of mode variogramModel (use function vgm)") if (length(dist_vector) > 0) maxdist = 0.0 else if (missing(maxdist)) stop("maxdist or dist_vector needs to be set"); if (length(dir) != 3) stop("dir should be numeric vector of length 3") .Call(gstat_init, as.integer(debug.level)) pars = c(min,maxdist,n,dir) load.variogram.model(object, c(0,0)) # loads object into gstat ret = .Call(gstat_variogram_values, as.integer(c(0,0)), as.numeric(pars), as.integer(covariance), as.numeric(dist_vector)) .Call(gstat_exit, 0); if (is.matrix(dist_vector)) matrix(ret[[2]], nrow(dist_vector), ncol(dist_vector)) else data.frame(dist=ret[[1]], gamma=ret[[2]]) } # Sat Mar 14 15:11:55 CET 2015: removed this: # "variogram.line" <- function(..., deprecate = TRUE) { # if (deprecate) # cat("variogram.line is DEPRECATED, please use variogramLine instead\n") # variogramLine(...) # } gstat/R/krige.R0000644000176200001440000001445014013273775013036 0ustar liggesusers# $Id: krige.q,v 1.15 2009-02-20 13:53:38 edzer Exp $ if (!isGeneric("krige")) setGeneric("krige", function(formula, locations, ...) standardGeneric("krige")) "krige.locations" <- function (formula, locations, data = sys.frame(sys.parent()), newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) { g = gstat(formula = formula, locations = locations, data = data, model = model, beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, ...) predict(g, newdata = newdata, block = block, nsim = nsim, indicators = indicators, na.action = na.action, debug.level = debug.level) } setMethod("krige", c("formula", "formula"), krige.locations) krige.spatial <- function(formula, locations, newdata, model = NULL, ..., beta = NULL, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), nsim = 0, indicators = FALSE, na.action = na.pass, debug.level = 1) { # locations = coordinates(arg2) g = gstat(formula = formula, # locations = locations, data = locations, model = model, beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, ...) predict(g, newdata = newdata, block = block, nsim = nsim, indicators = indicators, na.action = na.action, debug.level = debug.level) } setMethod("krige", c("formula", "Spatial"), krige.spatial) setMethod("krige", c("formula", "NULL"), function(formula, locations, newdata, ...) { # manual dispatch based on newdata: if (inherits(newdata, c("sf", "sfc", "stars"))) krige.sf(formula, locations, newdata = newdata, ...) else krige.spatial(formula, locations, newdata = newdata, ...) } ) krige.sf <- function(formula, locations, newdata, ..., nsim = 0) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov crs = sf::st_crs(newdata) if (!is.null(locations)) { stopifnot(sf::st_crs(locations) == sf::st_crs(newdata)) crs = sf::st_crs(locations) if (!isTRUE(sf::st_is_longlat(locations))) { sf::st_crs(locations) = sf::NA_crs_ sf::st_crs(newdata) = sf::NA_crs_# to avoid problems not handled by sp... } locations = as(locations, "Spatial") } ret = krige(formula, locations, as(newdata, "Spatial"), ..., nsim = nsim) if (gridded(ret)) { st = stars::st_as_stars(ret) if (nsim > 0) st = sim_to_dimension(st, nsim) sf::st_set_crs(st, crs) } else sf::st_set_crs(sf::st_as_sf(ret), crs) } setMethod("krige", c("formula", "sf"), krige.sf) sim_to_dimension = function(st, nsim) { nms = names(stars::st_dimensions(st)) if (length(st) > nsim) { nvars = length(st) / nsim l = vector("list", nvars) vars = unique(sub("([^.]+)\\.[[:alnum:]]+$", "\\1", names(st))) for (i in 1:nvars) { range = seq((i-1) * nsim + 1, length.out = nsim) m = setNames(st[range], paste0("sim", 1:nsim)) l[[i]] = setNames(stars::st_set_dimensions(merge(m), names = c(nms, "sample")), vars[i]) } do.call(c, l) } else { if (nsim > 1) setNames(stars::st_set_dimensions(merge(st), names = c(nms, "sample")), "var1") else st } } setMethod(krige, signature("formula", "ST"), function(formula, locations, newdata, model, ...) { krigeST(formula, locations, newdata, model,...) } ) if (!isGeneric("idw")) setGeneric("idw", function(formula, locations, ...) standardGeneric("idw")) idw.locations <- function (formula, locations, data = sys.frame(sys.parent()), newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) { krige(formula, locations, data, newdata, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level) } setMethod("idw", c("formula", "formula"), idw.locations) idw.spatial <- function (formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1) { krige(formula, locations, newdata, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level, model = NULL) } setMethod("idw", c("formula", "Spatial"), idw.spatial) idw.sf <- function (formula, locations, newdata, ..., idp = 2.0) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov ret = krige(formula, locations, newdata, ..., set = list(idp = idp), model = NULL) if (inherits(newdata, c("sf", "sfc"))) sf::st_as_sf(ret) else if (inherits(newdata, "stars")) stars::st_as_stars(ret) else stop("newdata should be of class sf or stars") } setMethod("idw", c("formula", "sf"), idw.sf) STx2SpatialPoints = function(x, multiplyTimeWith = 1.0) { x = as(geometry(x), "STI") t1 = as.numeric(as.POSIXct(index(x@time))) t2 = as.numeric(x@endTime) time = multiplyTimeWith * (t1 + t2) / 2 cc = cbind(coordinates(x), time) SpatialPoints(cc, proj4string = x@sp@proj4string) } STxDF2SpatialPointsDataFrame = function(x, multiplyTimeWith = 1.0) { pts = STx2SpatialPoints(geometry(x), multiplyTimeWith) SpatialPointsDataFrame(pts, x@data) } SpatialPointsDataFrame2STxDF = function(x, class, tz = "", origin = as.POSIXct("1970-01-01",tz=tz)) { cc = coordinates(x) time = as.POSIXct(cc[,ncol(cc)], tz=tz, origin = origin) sp = SpatialPoints(cc[,-ncol(cc)], proj4string = x@sp@proj4string) st = as(STI(sp, time), class) addAttrToGeom(STI(sp, time), x@data) } idw.ST <- function (formula, locations, newdata, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, block = numeric(0), na.action = na.pass, idp = 2.0, debug.level = 1, multiplyTimeWith = 1.0) { stopifnot(ncol(coordinates(locations@sp)) == 2) ret = krige(formula, STxDF2SpatialPointsDataFrame(locations, multiplyTimeWith), STx2SpatialPoints(newdata, multiplyTimeWith), nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, block = block, na.action = na.action, set = list(idp = idp), debug.level = debug.level, model = NULL) SpatialPointsDataFrame2STxDF(ret, class(geometry(newdata))) } setMethod("idw", c("formula", "ST"), idw.ST) gstat/R/vgm.R0000644000176200001440000001110013777370515012521 0ustar liggesusers# $Id: vgm.q,v 1.12 2007-02-27 22:09:32 edzer Exp $ warn.angle3 = TRUE "vgm" <- function(psill = NA, model, range = NA, nugget, add.to, anis, kappa = 0.5, ..., covtable, Err = 0) { add.to.df = function(x, y) { x = rbind(x, y) row.names(x) = 1:nrow(x) return(x) } if (is.character(psill)) { # as of ``vgm("Sph")'' if (length(psill) > 1) { ret = lapply(psill, function(x) vgm(x)) class(ret) = c("variogramModelList", "list") return(ret) } # else: if (psill == "Nug") return(vgm(NA, "Nug", NA)) else return(vgm(NA, psill, NA, NA)) } stopifnot(length(psill) == 1) stopifnot(length(range) == 1) stopifnot(missing(nugget) || length(nugget) == 1) stopifnot(length(kappa) == 1) m = .Call(gstat_get_variogram_models, as.integer(0)) n = length(m) mf = factor(m, levels = m) if (missing(model)) { ml = .Call(gstat_get_variogram_models, as.integer(1)) mlf = factor(ml, levels = ml) return(data.frame(short = mf, long = mlf)) } if (length(model) > 1) { ret = lapply(model, function(x) vgm(,x)) class(ret) = c("variogramModelList", "list") return(ret) } table = NULL if (model == "Tab" && !missing(covtable)) { table = as.matrix(covtable) if (NCOL(table) != 2) stop("covtable should be a 2-column matrix with distance and cov.") range = max(table[,1]) if (min(table[,1]) != 0.0) stop("the first covariance value should be at distance 0.0") table = table[,2] mf = factor(c(m, "Tab"), levels = c(m, "Tab")) if (!missing(add.to) || !missing(nugget) || Err > 0) stop("cannot add submodels or nugget to covariance Table model") } else if (!any(m == model)) stop(paste("variogram model", model, "unknown\n")) if (missing(anis)) anis = c(0,0,0,1,1) if (length(anis) == 2) anis = c(anis[1], 0, 0, anis[2], 1) else if (length(anis) != 5) stop("anis vector should have length 2 (2D) or 5 (3D)") if (warn.angle3 && anis[3] != 0.0) { warn.angle3 = FALSE warning("you are using the third rotation angle; this code is based on the GSLIB2 code\nand must contain the bug described at the end of http://pangea.stanford.edu/ERE/research/scrf/software/gslib/bug/") } if (!is.na(range)) { if (model != "Nug") { if (model != "Lin" && model != "Err" && model != "Int") if (range <= 0.0) stop("range should be positive") else if(range < 0.0) stop("range should be non-negative") } else { if (range != 0.0) stop("Nugget should have zero range") if (anis[4] != 1.0 || anis[5] != 1.0) stop("Nugget anisotropy is not meaningful") } } if (!missing(nugget)) { ret = data.frame(model=mf[mf==model], psill=psill, range=range, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]) n.vgm = data.frame(model=mf[mf=="Nug"], psill=nugget, range=0, kappa = 0.0, ang1=0.0, ang2=0.0, ang3=0.0, anis1=1.0, anis2=1.0) ret = add.to.df(n.vgm, ret) } else ret = data.frame(model=mf[mf==model], psill=psill, range=range, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]) if (!missing(add.to)) ret = add.to.df(data.frame(add.to), ret) if (Err > 0) ret = add.to.df(data.frame(model=mf[mf=="Err"], psill=Err, range=0.0, kappa = kappa, ang1=anis[1], ang2=anis[2], ang3=anis[3], anis1=anis[4], anis2=anis[5]), ret) if (!is.null(table)) attr(ret, "table") = table class(ret) = c("variogramModel", "data.frame") ret } as.vgm.variomodel = function(m) { model = NULL if (m$cov.model == "exponential") model = "Exp" else if (m$cov.model == "circular") model = "Cir" else if (m$cov.model == "gaussian") model = "Gau" else if (m$cov.model == "linear") # model = "Lin" stop("no correct conversion available; use power model with power 1?") else if (m$cov.model == "matern") model = "Mat" else if (m$cov.model == "wave") model = "Wav" else if (m$cov.model == "power") model = "Pow" else if (m$cov.model == "spherical") model = "Sph" else if (m$cov.model == "pure.nugget") return(vgm(m$nugget + m$cov.pars[1], "Nug", 0)) else stop("variogram model not supported") # "cauchy", #,"cubic", # "gneiting", # "gneiting.matern", # "powered.exponential", # "wave") ) { vgm(m$cov.pars[1], model, m$cov.pars[2], m$nugget, kappa = m$kappa) } #$lambda #[1] 1 #$trend #[1] "cte" #$max.dist #[1] 1441.83 #attr(,"class") #[1] "variomodel" plot.variogramModel = function(x, cutoff, ..., type = 'l') { if (missing(cutoff)) stop("parameter cutoff needs to be specified") l = variogramLine(x, cutoff, ...) xyplot(gamma ~ dist, l, ylim = c(0, 1.04 * max(l$gamma)), xlim = c(0, max(l$dist)), type = type, xlab = "distance", ylab = "semivariance") } gstat/R/variogram.formula.R0000644000176200001440000000163013777370515015372 0ustar liggesusers# $Id: variogram.formula.q,v 1.8 2006-02-10 19:01:07 edzer Exp $ "variogram.formula" <- function (object, locations = coordinates(data), data, ...) { if ((missing(locations) && inherits(data, "sf")) || (inherits(locations, "sf"))) { if (!requireNamespace("sf", quietly = TRUE)) stop("sf required: install that first") # nocov if (missing(locations)) data = as(data, "Spatial") else locations = as(locations, "Spatial") } # gstat.formula takes care of the case where locations contains # both data and coordinates --- see there. ## ret = gstat.formula(object, locations, data) ## variogram(object = ret$y, locations = ret$locations, X = ret$X, ...) if ((missing(locations) && is(data, "ST")) || (is(locations, "ST"))) variogramST(formula = object, locations = locations, data = data, ...) else { g = gstat(formula = object, locations = locations, data = data) variogram(g, ...) } } gstat/R/spplot.R0000644000176200001440000000121013777370515013252 0ustar liggesusersspplot.vcov = function(x, ...) { basenames = sub(".pred", "", names(x)[grep(".pred",names(x))]) n = length(basenames) names = NULL skip = NULL for (i in 1:n) { skp = rep(TRUE, n) pos = 1 if (i > 1) { for (j in 1:(i-1)) { names = c(names, paste("cov", basenames[j], basenames[i], sep = ".")) skp[pos] = FALSE pos = pos + 1 } } names = c(names, paste(basenames[i], ".var", sep = "")) skp[pos] = FALSE skip = c(skip, skp) } spplot(x, names, skip = skip, layout = c(n,n), as.table = TRUE, ...) } gstat/R/variogram.default.R0000644000176200001440000001477213777370515015364 0ustar liggesusers# $Id: variogram.default.q,v 1.29 2009-11-02 21:33:17 edzer Exp $ "variogram.default" <- function(object, locations, X, cutoff, width = cutoff/15.0, alpha = 0, beta = 0, tol.hor = 90/length(alpha), tol.ver = 90/length(beta), cressie = FALSE, dX = numeric(0), boundaries = numeric(0), cloud = FALSE, trend.beta = NULL, debug.level = 1, cross = TRUE, grid, map = FALSE, g = NULL, ..., projected = TRUE, lambda = 1.0, verbose = FALSE, covariogram = FALSE, PR = FALSE, pseudo = -1) { dots = list(...) if (length(dots) > 0) { warning(paste("the following arguments are ignored:", paste(dots, collapse = ", "))) } id1 = id2 = 0 ret = NULL if (missing(cutoff)) { if (is.logical(map) && map == TRUE) stop("for variogram maps, supply at least a cutoff") cutoff = numeric(0) } else if (width <= 0) stop("argument width should be positive") if (missing(width)) width = numeric(0) if (cloud == TRUE) width = 0 if (is.logical(map) && map == TRUE) { cells.dim = length(seq(-cutoff, cutoff, by = width)) grid.topology = GridTopology(rep(-cutoff, 2), rep(width, 2), rep(cells.dim, 2)) map = SpatialGrid(grid = grid.topology) } if (any(is.na(boundaries))) stop("no NA values allowed in boundaries") .Call(gstat_init, as.integer(debug.level)) if (!is.null(g) && !is.null(g$set)) gstat.load.set(g$set) id.names = NULL if (is.list(object) && is.list(locations)) { nvars = length(object) if (!is.null(names(object))) id.names = names(object) for (i in 1:nvars) { if (missing(X)) Xloc = rep(1, length(object[[i]])) else Xloc = X[[i]] t.beta = numeric(0) if (!is.null(trend.beta) && length(trend.beta) > 0) t.beta = trend.beta[[i]] else t.beta = numeric(0) if (missing(grid) || !is.list(grid)) { if (!is.null(g) && gridded(g$data[i]$data)) grd = unlist(gridparameters(g$data[i]$data)) else grd = numeric(0) } else grd = grid[[i]] .Call(gstat_new_data, as.double(object[[i]]), as.double(locations[[i]]), as.double(Xloc), as.integer(1), as.double(t.beta), as.integer(-1), as.integer(0), as.double(-1), as.integer(0), as.integer(1), double(0), grd, as.integer(0), as.integer(projected), as.integer(0), as.double(lambda), as.integer(0)) if (!is.null(g) && !is.null(g$model[[id.names[i]]])) load.variogram.model(g$model[[id.names[i]]], c(i - 1, i - 1)) } } else stop("argument object and locations should be lists") if (inherits(map, "SpatialGrid")) map = as.double(unlist(gridparameters(as(map, "SpatialGrid")))) pos = 0 ids = NULL bnd = NULL is.direct = NULL if (PR) { if (any(object[[1]] <= 0)) warning("pairwise relative variogram assumes non-negative data") covariogram = 2 } if (cross == "ONLY") { stopifnot(nvars >= 2) id.range = 2:nvars } else if (cross == TRUE) id.range = nvars:1 else id.range = 1:nvars for (id1 in id.range) { if (cross == "ST") id2range = 1 else if (cross == "ONLY") id2range = 1:(id1-1) else id2range = ifelse(cross, 1, id1):id1 for (id2 in id2range) { if (verbose) cat(".") if (is.null(id.names)) id = ifelse(id1 == id2, paste(id1), cross.name(id2, id1)) else id = ifelse(id1 == id2, paste(id.names[id1]), cross.name(id.names[id2], id.names[id1])) for (a in alpha) { for (b in beta) { direction = as.numeric(c(a, b, tol.hor, tol.ver)) # boundaries nees to be passed into the c code only ONCE: if (is.null(bnd)) bnd = boundaries else # NOT the first time we're here, so... bnd = numeric(0) ret.call = .Call(gstat_variogram, as.integer(c(id1 - 1, id2 - 1)), as.numeric(cutoff), as.numeric(width), as.numeric(direction), as.integer(cressie), as.numeric(dX), as.numeric(bnd), map, as.integer(covariogram), as.integer(pseudo)) if (is.logical(map) && map == FALSE) { np = ret.call[[1]] sel = np > 0 n.dir = length(sel[sel]) if (n.dir > 0) { dist = ret.call[[2]] gamma = ret.call[[3]] ret_cw = ret.call[[4]] # Sat Jul 16 16:19:59 CEST 2011 dir.a = rep(a, n.dir) dir.b = rep(b, n.dir) ids = c(ids, rep(id, n.dir)) is.direct = c(is.direct, id1 == id2) df = data.frame(np = np[sel], dist = dist[sel], gamma = gamma[sel], dir.hor = dir.a, dir.ver = dir.b) if (pos > 0) ret[(pos + 1):(pos + n.dir), ] = df else ret = df pos = pos + n.dir } } else { if (is.null(ret)) { ret = data.frame(ret.call[[1]], ret.call[[2]], ret.call[[4]], ret.call[[3]]) names = c("dx", "dy", id, paste("np", id, sep=".")) } else { ret = data.frame(ret, ret.call[[4]], ret.call[[3]]) names = c(names, id, paste("np", id, sep=".")) } names(ret) = names } } } } } if (verbose) cat("\n") .Call(gstat_exit, NULL) if (is.logical(map) && map == FALSE) { if (!is.null(ids)) { ret$id = factor(ids, levels = unique(ids)) attr(ret, "direct") = data.frame(id = unique(ids), is.direct = is.direct) if (cloud) { class(ret) = c("variogramCloud", "data.frame") attr(ret, ".BigInt") = 2^(4 * .Machine$sizeof.long) } else { class(ret) = c("gstatVariogram", "data.frame") if (length(boundaries) == 0) { cutoff = ret_cw[1] width = ret_cw[2] boundaries = seq(0, cutoff, width) if (!identical(max(boundaries), cutoff)) boundaries = c(boundaries, cutoff) } attr(ret, "boundaries") = boundaries attr(ret, "pseudo") = ret_cw[3] row.names(ret) = NULL } } } else { coordinates(ret) = c("dx", "dy") gridded(ret) = TRUE ret = list(map = ret) class(ret) = c("variogramMap", "list") } if (!is.null(ret)) { if (PR) attr(ret, "what") = "pairwise relative semivariance" else if (covariogram) attr(ret, "what") = "covariance" else if (cressie) attr(ret, "what") = "Cressie's semivariance" else attr(ret, "what") = "semivariance" } ret } gstat/R/ossfim.R0000644000176200001440000000143513777370515013242 0ustar liggesusers# $Id: ossfim.q,v 1.3 2006-02-10 19:01:07 edzer Exp $ "ossfim" <- function(spacings = 1:5, block.sizes = 1:5, model, nmax = 25, debug = 0) { n = floor(sqrt(nmax)) + 1 x = 0:(n-1) + .5 x = sort(c(-x, x)) ret = matrix(NA, length(spacings) * length(block.sizes), 3) r = 1 for (sp in spacings) { for (bl in block.sizes) { data.grid = data.frame(expand.grid(x * sp, x * sp), z = rep(1, length(x)^2)) names(data.grid) = c("x", "y", "z") gridded(data.grid) = c("x", "y") x0 = SpatialPoints(matrix(0, 1, 2)) kr = krige(z~1, data.grid, x0, block = c(bl, bl), model = model, nmax = nmax, set = list(debug = debug)) ret[r, ] = c(sp, bl, sqrt(kr[["var1.var"]][1])) r = r + 1 } } ret = data.frame(ret) names(ret) = c("spacing", "block.size", "kriging.se") ret } gstat/R/image.data.frame.R0000644000176200001440000000036313777370515015024 0ustar liggesusers# $Id: image.data.frame.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "image.data.frame" <- function (x, zcol = 3, xcol = 1, ycol = 2, asp = 1, ...) { image.default(xyz2img(xyz = x, zcol = zcol, xcol = xcol, ycol = ycol), asp = asp, ...) } gstat/R/xyz2img.R0000644000176200001440000000203113777370515013344 0ustar liggesusers# $Id: xyz2img.q,v 1.4 2006-02-10 19:01:07 edzer Exp $ "xyz2img" <- function (xyz, zcol = 3, xcol = 1, ycol = 2, tolerance = 10 * .Machine$double.eps) { if (ncol(xyz) < 3) stop("xyz object should have at least three columns") z = xyz[, zcol] x = xyz[, xcol] y = xyz[, ycol] xx = sort(unique(x)) yy = sort(unique(y)) nx = length(xx) ny = length(yy) nmax = max(nx, ny) difx = diff(xx) if (diff(range(unique(difx))) > tolerance) stop("x intervals are not constant") dify = diff(yy) if (diff(range(unique(dify))) > tolerance) stop("y intervals are not constant") dx = mean(difx) dy = mean(dify) xmin = min(xx) xmax = max(xx) xrange = xmax - xmin ymin = min(yy) ymax = max(yy) yrange = ymax - ymin row = round((x - xmin)/dx) + 1 col = round((y - ymin)/dy) + 1 zz = rep(as.numeric(NA), nx * ny) zz[row + nx * (col - 1)] = z zz = matrix(zz, nrow = nx, ncol = ny) list(x = seq(xmin, xmax, dx), y = seq(ymin, ymax, dy), z = zz) } gstat/R/print.variogramCloud.R0000644000176200001440000000054313777370515016052 0ustar liggesusers# $Id: print.variogramCloud.q,v 1.4 2007-10-18 10:13:13 edzer Exp $ as.data.frame.variogramCloud = function(x, row.names, optional, ...) { .BigInt = attr(x, ".BigInt") x$left = x$np %% .BigInt + 1 x$right = x$np %/% .BigInt + 1 x$np = NULL class(x) = "data.frame" x } print.variogramCloud <- function (x, ...) { print(as.data.frame(x), ...) } gstat/R/gstat.R0000644000176200001440000001033314147167535013057 0ustar liggesusers# $Id: gstat.q,v 1.28 2009-11-02 21:33:17 edzer Exp $ "cross.name" <- function(id1, id2) { paste(id1, id2, sep = ".") } "gstat" <- function (g, id, formula, locations, data = NULL, model = NULL, beta, nmax = Inf, nmin = 0, omax = 0, maxdist = Inf, force = FALSE, dummy = FALSE, set, fill.all = FALSE, fill.cross = TRUE, variance = "identity", weights = NULL, merge, degree = 0, vdist = FALSE, lambda = 1.0) { call = match.call() if (!missing(locations) && inherits(locations, "formula")) { if (!is.null(data)) coordinates(data) = locations # locations = NULL } else if (missing(data) && !missing(locations) && (is(locations, "Spatial") || inherits(locations, "sf"))) { data = locations locations = NULL } if (fill.all) { # fill all variogram models if (missing(g) || is.null(model)) stop("fill.all assumes object g and model are supplied") g.names = names(g$data) for (i in 1:length(g.names)) { g$model[[paste(g.names[i])]] = model if (fill.cross) { for (j in (i+1):length(g.names)) g$model[[cross.name(g.names[i], g.names[j])]] = model } } return(g) } if (!missing(g) && inherits(g, "gstat") && !missing(id) && !missing(model) && missing(formula) && missing(locations)) { # here, only direct or cross variogram model is defined g.names = names(g$data) if (length(id) == 2) { m1 = match(id[1], g.names) m2 = match(id[2], g.names) if (is.na(m1)) stop("first id does not match available data") if (is.na(m1)) stop("second id does not match available data") nm = cross.name(g.names[min(m1, m2)], g.names[max(m1, m2)]) } else if (length(id) == 1) { m1 = match(id, g.names) if (is.na(m1)) stop("id does not match available data") nm = g.names[m1] } else stop("id should have length 1 or 2") g$model[[nm]] = model return(g) } if (!inherits(formula, "formula")) stop("argument formula should be of class formula") #if (!inherits(locations, "formula") && !has.coordinates(data)) # stop("argument locations should be of class formula or matrix") if (inherits(data, "sf")) data = as(data, "Spatial") if (missing(beta) || is.null(beta)) beta = numeric(0) vfn = pmatch(variance, c("identity", "mu", "mu(1-mu)", "mu^2", "mu^3")) if (is.na(vfn)) stop("unknown value for variance function") if (vfn > 1 && length(beta) == 0) stop("non-identity variance function only allowed if beta is supplied") if (missing(g) || is.null(g)) { g = list() g[["data"]] = list() g[["model"]] = list() } else if (!dummy && inherits(g$data[[1]], "Spatial") && !identical(g$data[[1]]$data@proj4string@projargs, data@proj4string@projargs)) stop("data items in gstat object have different coordinate reference systems") if (missing(id)) id = paste("var", length(g$data) + 1, sep = "") g$data[[id]] = list(formula = formula, # locations = locations, data = data, has.intercept = attr(terms(formula), "intercept"), beta = beta, nmax = nmax, nmin = nmin, omax = omax, maxdist = maxdist, force = force, dummy = dummy, vfn = vfn, weights = weights, degree = degree, vdist = vdist, lambda = lambda) g$model[[id]] = model if (!missing(locations)) g$locations = locations if (!missing(set)) { if (!is.list(set)) stop("argument set should be a list") g$set = set } if (!missing(merge)) g$merge = merge g$call = call class(g) = c("gstat", "list") g } "[.gstat" <- function(x, ids) { if (is.numeric(ids)) { if (min(ids) < 1 || max(ids) > length(names(x$data))) stop("selection index(es) out of bound") ids = names(x$data)[ids] } else if (any(is.na(match(ids, names(x$data))))) stop("selected ids do not match those of gstat object") g = list() g$data = x$data[ids] if (length(ids) > 1) { ids.cross = NULL for (i in 2:length(ids)) for (j in 1:(i-1)) ids.cross = c(ids.cross, cross.name(ids[j], ids[i])) g$model = x$model[c(ids, ids.cross)] } else g$model = x$model[ids] if (!is.null(x$set)) g$set = x$set if (!is.null(g$merge)) g$merge = x$merge class(g) = c("gstat", "list") g } gstat/R/variogramST.R0000644000176200001440000003777614314525261014205 0ustar liggesusersVgmFillNA <- function(x, boundaries) { # pads the sample variogram with NA rows where no data are available. n = length(boundaries) - 1 ix = rep(NA, n) #ix[which(1:n %in% findInterval(x$dist, boundaries))] = 1:nrow(x) ix[ findInterval(x$dist, boundaries, rightmost.closed = TRUE) ] = 1:nrow(x) # x$b = boundaries[-1] x[ix,] } VgmAverage = function(ret, boundaries) { # take out NULL variograms: ret = ret[!sapply(ret, is.null)] # take care of missing rows... ret = lapply(ret, VgmFillNA, boundaries = c(0, 1e-6 * boundaries[2], boundaries[-1])) # weighted average: # sum np, weighted sum of gamma and dist devided by summed np np = apply(do.call(cbind, lapply(ret, function(x) x$np)), 1, sum, na.rm = TRUE) gamma = apply(do.call(cbind, lapply(ret, function(x) x$gamma*x$np)), 1, sum, na.rm = TRUE)/np dist = apply(do.call(cbind, lapply(ret, function(x) x$dist*x$np)), 1, sum, na.rm = TRUE)/np v = data.frame(np = np, dist = dist, gamma = gamma) class(v) = class(ret[[1]]) attr(v, "boundaries") = attr(ret[[1]], "boundaries") v[is.na(v)] = NA v } StVgmLag = function(formula, data, dt, pseudo, ...) { dotLst <- list(...) .ValidObs = function(formula, data) !is.na(data[[as.character(as.list(formula)[[2]])]]) d = dim(data) ret = vector("list", d[2] - dt) if (dt == 0) { for (i in 1:d[2]) { d0 = data[,i] valid = .ValidObs(formula, d0) if(sum(valid) <= 1) ret[[i]] <- NULL else { d0 = d0[valid,] ret[[i]] = variogram(formula, d0, ...) } } } else { for (i in 1:(d[2] - dt)) { d1 = data[, i] valid1 = .ValidObs(formula, d1) d2 = data[, i + dt] valid2 = .ValidObs(formula, d2) if(sum(valid1)==0 || sum(valid2)==0) ret[[i]] <- NULL else { d1 = d1[valid1,] d2 = d2[valid2,] obj = gstat(NULL, paste("D", i, sep=""), formula, d1, set = list(zero_dist = 3), beta = 0) obj = gstat(obj, paste("D", i+dt, sep=""), formula, d2, beta = 0) ret[[i]] = variogram(obj, cross = "ONLY", pseudo = pseudo, ...) } } } if(!is.null(dotLst$cloud)) { if(dotLst$cloud) ret <- do.call("rbind", ret) ret$id <- "var1" return(ret) } else { return(VgmAverage(ret, dotLst$boundaries)) } } variogramST = function(formula, locations, data, ..., tlags = 0:15, cutoff, width = cutoff/15, boundaries=seq(0,cutoff,width), progress = interactive(), pseudo = TRUE, assumeRegular=FALSE, na.omit=FALSE, cores = 1) { if (missing(data)) data = locations if (inherits(data, "stars")) { if (!requireNamespace("stars", quietly = TRUE)) stop("stars required: install that first") # nocov data = as(data, "STFDF") } if(missing(cutoff)) { ll = !is.na(is.projected(data@sp)) && !is.projected(data@sp) cutoff <- spDists(t(data@sp@bbox), longlat = ll)[1,2]/3 } if (formula[[3]] != 1) { # there is a regression model: data$resid = residuals(lm(formula, data, na.action = na.exclude)) formula = resid ~ 1 } if(inherits(data, c("STIDF", "sftime"))) return(variogramST.STIDF(formula, as(data, "STIDF"), tlags, cutoff, width, boundaries, progress, cores = cores, ...)) stopifnot(is(data, "STFDF") || is(data, "STSDF")) it = index(data@time) if (assumeRegular || is.regular(zoo(matrix(1:length(it)), order.by = it), strict = TRUE)) { twidth = diff(it)[1] tlags = tlags[tlags <= min(max(tlags), length(unique(it)) - 1)] } else { warning("strictly irregular time steps were assumed to be regular") twidth = mean(diff(it)) } obj = NULL t = twidth * tlags if (progress) pb = txtProgressBar(style = 3, max = length(tlags)) if (cores == 1) { ret = vector("list", length(tlags)) for (dt in seq(along = tlags)) { ret[[dt]] = StVgmLag(formula, data, tlags[dt], pseudo = pseudo, boundaries = boundaries, ...) ret[[dt]]$id = paste("lag", dt - 1, sep="") if (progress) setTxtProgressBar(pb, dt) } } else { if (!requireNamespace("future", quietly = TRUE) || !requireNamespace("future.apply", quietly = TRUE)) stop("For parallelization, future and future.apply packages are required") future::plan('multicore', workers = cores) ret <- split(seq(along=tlags), seq(along=tlags)) ret <- future.apply::future_lapply(X = ret, FUN = function(x){ xx <- StVgmLag(formula, data, tlags[x], pseudo = pseudo, boundaries = boundaries, ...) xx$id <- paste("lag", x - 1, sep="") if (progress) setTxtProgressBar(pb, x) return(xx) }, future.seed = NULL # silence warning ) } if (progress) close(pb) # add time lag: v = do.call(rbind, ret) v$timelag = rep(t, sapply(ret, nrow)) if (is(t, "yearmon")) class(v$timelag) = "yearmon" b = attr(ret[[min(length(tlags),2)]], "boundaries") b = c(0, b[2]/1e6, b[-1]) # ix = findInterval(v$dist, b) will use all spacelags b = b[-2] # spacelags = c(0, b[-length(b)] + diff(b)/2) will use all spacelags v$spacelag = c(0, b[-length(b)] + diff(b)/2) # spacelags[ix] will use all spacelags v$avgDist <- v$dist * v$np for (lagId in unique(v$spacelag)) { bool <- v$spacelag == lagId v$avgDist[bool] <- sum(v$avgDist[bool], na.rm = TRUE) / sum(v$np[bool], na.rm = TRUE) } class(v) = c("StVariogram", "data.frame") if(na.omit) v <- na.omit(v) # setting attributes to allow krigeST to check units attr(v$timelag, "units") <- attr(twidth,"units") if (isTRUE(!is.projected(data))) attr(v$spacelag, "units") = "km" return(v) } ## very irregular data variogramST.STIDF <- function (formula, data, tlags, cutoff, width, boundaries, progress, twindow, tunit, cores = 1) { ll = !is.na(is.projected(data@sp)) && !is.projected(data@sp) if (missing(cutoff)) cutoff <- spDists(t(data@sp@bbox), longlat = ll)[1, 2]/3 m = model.frame(terms(formula), as(data, "data.frame")) diffTime <- diff(index(data)) timeScale <- units(diffTime) if(missing(tunit)) warning(paste("The argument 'tunit' is missing: tlags are assumed to be given in ", timeScale, ".",sep="")) else { stopifnot(tunit %in% c("secs", "mins", "hours", "days", "weeks")) units(diffTime) <- tunit timeScale <- tunit } diffTime <- as.numeric(diffTime) if (missing(twindow)) { twindow <- round(2 * max(tlags, na.rm=TRUE)/mean(diffTime,na.rm=TRUE),0) } nData <- nrow(data) # re-using the order propertie of the time slot to only store the next "twindow" distances numTime <- as.numeric(index(data)) diffTimeMat <- matrix(NA, nData, twindow) for (i in 1:nData) { # i <- 1 diffTimeMat[i,1:min(nData,twindow)] <- cumsum(diffTime[i+0:(min(nData,twindow)-1)]) } nSp <- length(boundaries) nTp <- length(tlags) distTp <- matrix(NA, nSp-1, nTp-1) distSp <- matrix(NA, nSp-1, nTp-1) gamma <- matrix(NA, nSp-1, nTp-1) np <- matrix(NA, nSp-1 ,nTp-1) # temporal selection if(progress) pb <- txtProgressBar(0, nTp-1, 0, style=3) for (i in 1:(nTp-1)) { # i <- 1 ind <- which(diffTimeMat >= tlags[i] & diffTimeMat < tlags[i+1]) if (length(ind) < 1) next tmpInd <- matrix(NA,nrow=length(ind),4) tmpInd[,1] <- ind %% nData # row number tmpInd[,2] <- (ind %/% nData)+1 # col number if (cores == 1){ tmpInd[,3] <- apply(tmpInd[,1:2,drop=FALSE], 1, function(x) spDists(data@sp[x[1]], data@sp[x[2]+x[1],])) } else { if(!requireNamespace("future", quietly = TRUE) || !requireNamespace("future.apply", quietly = TRUE)) stop("For parallelization, future and future.apply packages are required") future::plan("multicore", workers = cores) tmpInd[,3] <- future.apply::future_apply(X = tmpInd[,1:2,drop=FALSE], MARGIN = 1, FUN = function(x) spDists(data@sp[x[1]], data@sp[x[2]+x[1],]), future.seed = NULL) } tmpInd[,4] <- diffTimeMat[tmpInd[,1:2, drop=FALSE]] # spatial selection for (j in 1:(nSp-1)) { # j <- 3 indSp <- which(tmpInd[,3] >= boundaries[j] & tmpInd[,3] < boundaries[j+1]) if (length(indSp) < 1) next distSp[j,i] <- mean(tmpInd[indSp,3]) distTp[j,i] <- mean(tmpInd[indSp,4]) indSp <- cbind(ind[indSp] %% nData, (ind[indSp] %/% nData)+1) np[j,i] <- nrow(indSp) # Issue #7, Thanks to Roelof. gamma[j,i] <- 0.5*mean((data[,,colnames(m)[1]]@data[indSp[,1],1] - data[,,colnames(m)[1]]@data[indSp[,1]+indSp[,2],1])^2, na.rm=TRUE) } if(progress) setTxtProgressBar(pb, value=i) } if(progress) close(pb) res <- data.frame(np=as.vector(np), dist=as.vector(distSp), gamma=as.vector(gamma), id=paste("lag",rep(1:(nTp-1),each=nSp-1), sep=""), timelag=rep(tlags[-nTp]+diff(tlags)/2,each=nSp-1), spacelag=rep(boundaries[-nSp]+diff(boundaries)/2, nTp-1)) res$avgDist <- res$dist * res$np for (lagId in unique(res$spacelag)) { bool <- res$spacelag == lagId res$avgDist[bool] <- sum(res$avgDist[bool], na.rm = TRUE) / sum(res$np[bool], na.rm = TRUE) } attr(res$timelag, "units") <- timeScale attr(res$spacelag, "units") <- ifelse(ll, "km", "m") class(res) <- c("StVariogram", "data.frame") return(res) } ## plotting plot.StVariogram = function(x, model=NULL, ..., col = bpy.colors(), xlab, ylab, map = TRUE, convertMonths = FALSE, as.table = TRUE, wireframe = FALSE, diff = FALSE, all=FALSE) { lst = list(...) if (!is.null(lst$col.regions)) col = lst$col.regions if (is(x$timelag, "yearmon")) { if (convertMonths) { x$timelag = as.numeric(x$timelag) * 12 attr(x$timelag, "units") = "months" } else attr(x$timelag, "units") = "years" } if (missing(xlab)) { xlab = "distance" u = attr(x$spacelag, "units") if (!is.null(u)) xlab = paste(xlab, " (", u, ")", sep="") } if (missing(ylab)) { ylab = "time lag" u = attr(x$timelag, "units") if (!is.null(u)) ylab = paste(ylab, " (", u, ")", sep="") } x$timelag = as.numeric(x$timelag) # check for older spatio-temporal variograms and compute avgDist on demand if(is.null(x$avgDist)) { x$avgDist <- x$dist * x$np for (lagId in unique(x$spacelag)) { bool <- x$spacelag == lagId x$avgDist[bool] <- sum(x$avgDist[bool] / sum(x$np[bool], na.rm = TRUE), na.rm = TRUE) } } if(!is.null(model)) { if (is(model,"StVariogramModel")) model <- list(model) for (mod in model) { slag <- x$avgDist slag[slag == 0 & x$timelag == 0] <- sqrt(.Machine$double.eps) x[[mod$stModel]] <- variogramSurface(mod, data.frame(spacelag = slag, timelag = x$timelag))$gamma if (diff) x[[mod$stModel]] <- x[[mod$stModel]] - x$gamma } } x0 = x # needed by wireframe() if (!is.null(model)) { modelNames <- sapply(model, function(x) x$stModel) if (all && !diff) v0 <- x[,c("dist", "id", "avgDist", "timelag")] else v0 <- NULL for (i in modelNames) v0 <- rbind(v0, x[,c("dist", "id", "avgDist", "timelag")]) if(all & !diff) {# we also need the sample v0$what = factor(c(rep("sample", nrow(x)), rep(modelNames, each=nrow(x))), levels=c("sample", modelNames), ordered = TRUE) v0$gamma = c(x$gamma, unlist(x[,modelNames])) } else { v0$what = factor(rep(modelNames, each=nrow(x)), levels=modelNames, ordered=TRUE) v0$gamma = c(unlist(x[,modelNames])) } x = v0 } if (wireframe) { if (!is.null(model)) { if (length(model) > 1 || all) wireframe(gamma ~ avgDist*timelag | what, x, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, as.table=as.table, ...) else wireframe(as.formula(paste(model[[1]]$stModel,"~ avgDist*timelag")), x0, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, as.table=as.table, ...) } else # without a model, plot only the sample variogram as a wireframe wireframe(gamma ~ avgDist * timelag, x0, drape = TRUE, col.regions = col, xlab = xlab, ylab = ylab, ...) } else if (map) { if (!is.null(model)) f = gamma ~ avgDist + timelag | what else f = gamma ~ avgDist + timelag levelplot(f, x, xlab = xlab, ylab = ylab, col.regions = col, as.table=as.table, ...) } else { # not map, not wireplot if (!is.null(model)) f = gamma ~ dist | what else f = gamma ~ dist x$id = factor(x$id, levels=unique(x$id)) bp = bpy.colors(length(levels(x$id))) ps = list(superpose.line=list(col=bp), superpose.symbol=list(col=bp)) xlim = c(0, max(x$dist) * 1.04) if (diff) { xyplot(f, x, groups = x$id, type='b', xlim = xlim, auto.key = list(space = "right"), xlab = xlab, par.settings = ps, as.table=as.table, ...) } else { ylim = c(0, max(x$gamma) * 1.04) xyplot(f, x, groups = x$id, type='b', ylim = ylim, xlim = xlim, auto.key = list(space = "right"), xlab = xlab, par.settings = ps, as.table=as.table, ...) } } } print.StVariogramModel <- function(x, ...) { possComp <- c("space", "time", "joint") for(comp in possComp[possComp %in% names(x)]) { rownames(x[[comp]]) <- 1:nrow(x[[comp]]) cat(paste(comp,"component: \n")) print(x[[comp]], ...) } possAddPar <- c("sill", "nugget", "stAni", "k") for(addPar in possAddPar[possAddPar %in% names(x)]) { cat(paste(addPar, ": ",x[[addPar]],"\n", sep="")) } } ## guess the spatio-temporal anisotropy without spatio-temporal models ###################################################################### estiStAni <- function(empVgm, interval, method="linear", spatialVgm, temporalVgm, s.range=NA, t.range=NA) { if (!is.na(s.range)) empVgm <- empVgm[empVgm$dist <= s.range,] if (!is.na(t.range)) empVgm <- empVgm[empVgm$timelag <= t.range,] empVgm$timelag = as.numeric(empVgm$timelag) # in case it is of class difftime, messes up on R 4.1 switch(method, linear = estiStAni.lin(empVgm, interval), range = estiAni.range(empVgm, spatialVgm, temporalVgm), vgm = estiAni.vgm(empVgm, spatialVgm, interval), metric = estiAni.metric(empVgm, spatialVgm, interval), stop(paste("Method", method,"is not implemented."))) } # linear estiStAni.lin <- function(empVgm, interval) { lmSp <- lm(gamma~dist, empVgm[empVgm$timelag == 0,]) optFun <- function(stAni, empVgm) { sqrt(mean((predict(lmSp, newdata = data.frame(dist=empVgm[empVgm$spacelag == 0,]$timelag*stAni)) - empVgm[empVgm$spacelag == 0,]$gamma)^2, na.rm=TRUE)) } optimise(optFun, interval, empVgm = empVgm)$minimum } # range estiAni.range <- function(empVgm, spatialVgm, temporalVgm) { spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram","data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spatialVgm <- fit.variogram(spEmpVgm, spatialVgm) tmpEmpVgm <- empVgm[empVgm$spacelag == 0,] class(tmpEmpVgm) <- c("gstatVariogram","data.frame") tmpEmpVgm <- tmpEmpVgm[-1,c("np","timelag","gamma")] colnames(tmpEmpVgm) <- c("np", "dist", "gamma") tmpEmpVgm$dir.hor <- 0 tmpEmpVgm$dir.ver <- 0 temporalVgm <- fit.variogram(tmpEmpVgm, temporalVgm) spatialVgm$range[2]/temporalVgm$range[2] } # variograms estiAni.vgm <- function(empVgm, spatialVgm, interval) { spEmpVgm <- empVgm[empVgm$timelag == 0,] class(spEmpVgm) <- c("gstatVariogram","data.frame") spEmpVgm <- spEmpVgm[-1,1:3] spEmpVgm$dir.hor <- 0 spEmpVgm$dir.ver <- 0 spatialVgm <- fit.variogram(spEmpVgm, spatialVgm) optFun <- function(stAni) { sqrt(mean((variogramLine(spatialVgm, dist_vector = empVgm[empVgm$spacelag == 0,]$timelag*stAni)$gamma - empVgm[empVgm$spacelag == 0,]$gamma)^2, na.rm=TRUE)) } optimise(optFun, interval)$minimum } # metric variogram estiAni.metric <- function(empVgm, spatialVgm, interval) { fit.StVariogram(empVgm, vgmST("metric", joint=spatialVgm, stAni=mean(interval)))$stAni[[1]] } gstat/NEWS.md0000644000176200001440000000666714314525261012514 0ustar liggesusers# version 2.1-0 * import `sftime`; modify `krigeST()` variogram functions to accept `sftime` objects for `data` (as alternative to `STI` or `STIDF`), and `stars` or `sftime` objects for `newdata`; #108 with great help from @henningte * fix Gaussian cosimulation, probably introduced in 2016, #106 # version 2.0-7 * return `NA` as estimate when prediction/simulation fails; #80 # version 2.0-6 * fixes `object 'ret' not found` bug introduced by #63; #65 #66 #70 # version 2.0-5 * use multiple cores in `variogramST`, using pkg future; #63 by @sigmafelix * fix bug with conditional simulation using `stars` target grid and nsim=1, #58 # version 2.0-4 * fix CRAN warning issue # version 2.0-3 * fix bug in support for `sf` objects; #46 * fix `krigeTg` for the case when data or newdata are of class `sf` or `sfc`; #51 # version 2.0-1 * try to fix CRS issue found on OSX * check for temporal unit in krigeST opposed to covariance function and assign the temporal unit found in krigeST to the spatio-temporal variogram for consistency in case none has been provided by the model; add warning when ST variogram doesn't have a `temporal unit` attribute; #42 # version 2.0-0 * add plot.variogramModel; #40 * support `sf` and `stars` objects, for vector and raster data, respectively; #39 # version 1.1-6 * address warnings from Tomas Kalibera's static code checking # version 1.1-5 * fix auto-choosing of variogram parameters if only variogram model type is given, https://github.com/edzer/gstat/issues/17 # version 1.1-4 * Fix #17 * Fix #14 * Fix #12 * Fix great circle distance bug; see https://stat.ethz.ch/pipermail/r-sig-geo/2016-December/025251.html # version 1.1-3 * Merge pull request #4 from BenGraeler/master r-journal ms merge updates vignette "spatio-temporal-kriging" to revised paper * Merge pull request #3 from BenGraeler/master update st paper demos * demo/stkrige.R: - remove empty station * demo/00Index, demo/stkrige-crossvalidation.R, demo/stkrige-prediction.R, demo/stkrige.R, man/krigeST.Rd: - adds R scripts from vignette spatio-temporal kriging as demos * Merge pull request #2 from BenGraeler/master additions for space-time paper * NAMESPACE, R/krige0.R, man/krigeST.Rd: - adds trans Gaussian kriging for space and time # version 1.1-2 * fixed `memcpy` for overlapping regions error, found in valgrind checks by Brian Ripley * fixed a few more (small) memory leaks # version 1.1-1 * Further cleaned up C source code, got rid of lex and yacc files * Improve `fit.variogram` to choose initial values for range, sill and nugget before fitting, and fit over a range of model types * allow `NA` values in `vgm` * Fixed #1 # version 1.1-0 * remove meschach matrix library, rewrote interface, link to R's lapack * improve notification in case of singular matrices * remove all C code that was not used by R package gstat * add `Makevars`, remove `configure` * remove links to `ai-geostats.org` * wrap `fit.StVariogram` example in `dontrun` # version 1.0-26 * use ordered spatial index when selecting nearest strongest correlated neighbours in local kriging to avoid warning of spacetime * update spatio-temporal geostatitics vignettes; add R Journal draft as vignette (Spatio-Temporal Geostatistics using gstat) * add spatio-temporal PM10 interpolation [movie](http://gstat.r-forge.r-project.org/STpred.html) # version before 1.0-26 * see [ChangeLog](https://github.com/r-spatial/gstat/blob/master/inst/ChangeLog) gstat/MD50000644000176200001440000003264314413517710011717 0ustar liggesusersb930a1c993354b3d71cc449df073d4be *CHANGES ee04bde2af421cb941b45fc49afdf7ce *DESCRIPTION 3d8f0ef09f46d2ba801c2ffe1f264113 *NAMESPACE 46d44918366bbd545b01731ae0c65819 *NEWS.md 803f87a68be4ca054847ad578969b279 *R/circEmbed.R 02a9d4ea0f96e71d31a614d441396d5f *R/fit.lmc.R 77ad584fd5edfeb9b97c83dd20a97851 *R/fit.variogram.R 11df50040d29f897a44fbf7c5dcc5a66 *R/fit.variogram.gls.R b6fba7c709ffa4fbb952fa22fb4cd398 *R/fit.variogram.reml.R d3b1befeb3d012d19788a085c61cbc7e *R/get.contr.R 7adf4456be5ce6c97fe41363b1cbfba7 *R/gstat.R 90d1c48f89ef2dd31deac8d8021004df *R/gstat.cv.R 1843b43dc105951027eecd53732028de *R/gstat.debug.R 8d2764bd2a24771a470a8abae6adbb56 *R/gstat.formula.R cc78eaa9fe3d878621b6732cda4dc0fb *R/gstat.formula.predict.R 27f9fd5d4c00effac64ae18d25b121d8 *R/gstatOptions.R 12ad24366cb002879de3426371128796 *R/hscat.R edc9791ebe437b1901380d74972db2cc *R/image.data.frame.R 3bf39dc214ed564238d585fb1834480f *R/krige.R a86941154d557b47154d1f1e00ff40a0 *R/krige.cv.R 9d26d6cb15f8af5cbe89168a1ef60df8 *R/krige0.R f3cead51b48cb85f6362bc34bc723e2d *R/krigeST.R 6a8e3f331a9010d0167936ced6f831a2 *R/krigeTg.R 7ecb72625e1709c19958771d5258f4e5 *R/load.variogram.model.R 5e4ca298349e3841bcd67b74ec2b4b45 *R/map.to.lev.R 8abf80dfb1af614d77fa1f302ee6c264 *R/ossfim.R e09dcc7a79a2ea1106bf2f0681ae7fa1 *R/panel.pointPairs.R b337728e2f7ebb444b598cbec7e6daea *R/plot.gstatVariogram.R 0ec356599d0f8b2a46b862681167bbe5 *R/plot.pointPairs.R 6be9f49eb64aa34ba6106147d375d01d *R/plot.variogramCloud.R 0264130666acf7badcbda1df4859a46f *R/predict.gstat.R d9f74b4d9ef3b8912e23e083f66c1412 *R/print.gstat.R 95622401bfd68c096e6e800bcef90b0c *R/print.variogram.R ae4124c6ea80101b9eb6866f2ab71ac7 *R/print.variogramCloud.R 0da3bd288649131c94b444b927c3d057 *R/print.variogramModel.R 2d074ecf214c2dcab279eebc5b16170b *R/set.R 9b44096a0bd48a7008c357782cb0560c *R/show.vgms.R e6512625a896a3c6dc22f9c084f43115 *R/spplot.R 0ab4a2623faa69f8d4a46a31164f230a *R/stVariogramModels.R 69f173064b6699bea0256867d43f42cf *R/turningLayers.R 425833489f7d223b4ce8f478464e0d83 *R/variogram.default.R f8a60677ced80271a6ef35040ea746c9 *R/variogram.formula.R c490187888e9e7d36fc7b001b83e1848 *R/variogram.gstat.R 7ac1739a2450448bbc435e421954255d *R/variogramLine.R f6ef8abf93709cf07acf58248d5c6ee8 *R/variogramST.R 627d13473d2a3275f0cda066b5a45623 *R/vgm.R d07099f46a9c8618d8719bd422b96f9f *R/vgm.panel.R 216b232871afa74f72e25e0ba1610fda *R/xyz2img.R fcf925486eda62721c36865214ee21a4 *R/zzz.R 07a17bb75c731f9bc75dc27254f4c04a *build/vignette.rds 420b8870b1ee5885e49e1c6cf85fab8f *cleanup 6f19b11fc93cc4e4fc8598ff9b28cde4 *data/DE_RB_2005.rda 1947d465e7cef7e1671e0e55862b8423 *data/coalash.rda 590146bcd1fc4998dcb557d5c86bbab1 *data/fulmar.rda 30321b6c09f3734a1165f6086466e5f7 *data/jura.rda 6576aaa26c739a2540a46c681d6255ad *data/meuse.all.rda bd5dd38449bbda9706c5a4b037c2b2aa *data/meuse.alt.rda 21b892a82bd02610f761dda6abc6dbd3 *data/ncp.grid.rda a6c3d8e284e2f7a4e2eefacdb3d405f5 *data/oxford.rda 6fdb58069b5c028bbe936d55458bc2fe *data/pcb.rda 60af8fb792bdb9cb68e4d9d892e00841 *data/sic2004.rda 071ea81a69ef80c3b033df2ac7cf83f1 *data/sic97.rda 697ad9f5a37638ae87cb9b0ee9da27b7 *data/tull.rda 9d0a866c6424baabd37b5db3a919c010 *data/vv.rda 39e3f9d0d50e9fd45a1d55107430e88c *data/walker.rda a095f55388e5b64324b45d74e3522892 *data/wind.rda 26ff62a591b2b133a9bcf32d958a1d73 *demo/00Index 05081dee734ad48ddc1ad091f437a1e9 *demo/a2p.R 1586ae215a98a5e8a29dbb735bf8a058 *demo/a2pinST.R af173da614ae8cbd853a760f8dce2708 *demo/block.R 83964bc95a07cadc048763aa20d9e2bc *demo/blue.R e76d50bb750c18fdd0a6c11fa384a673 *demo/cc.R 2352f215418d1e242b5d93c4097b8e84 *demo/circEmbeddingMeuse.R 6cff1db47fc6d7e86ce99c0101506bbf *demo/cokriging.R 36401510d481ce47b6d4ad5b924b53ca *demo/comp_geoR.R 962abe21a4a8e97e707ed907d7b5a1ff *demo/cosimulation.R 04280e3a36b00d496e951e196edbd1f3 *demo/depend.R 92670e4c520943a1c1a0fe90c813dcc8 *demo/examples.R 78d4ea634a6c17727c50ab11b18f83eb *demo/fulmar.R 16710a6f62d47804ed6c7ba9f1e4a6ae *demo/grass.R 8e224d6de7dba44672104e226eb324fc *demo/gstat3D.R b6615db4e745f66e8cc8efa59e3c0cf1 *demo/ikr.R cf96a4ef3c82dcb079b394b429a27d69 *demo/krige.R 1b6836515e6152d8e314002f67c0033d *demo/lhs.R b9f170ba90986dc71bdcbfc7f7b9284d *demo/line.R f734df09e2c2bca844623513ec872c94 *demo/lnsim.R 3239742713164de7a1611c3be05c5cb6 *demo/localKrigeST.R db63e4d2290327fdda91ad4c96fd19f0 *demo/pcb.R 2ef5e7ba229731b758ca9f053ec6276a *demo/rep.R 362a987292c09dc4be10104598014be9 *demo/sftime.R ba8e22bc0379e0308101ead16bc8745b *demo/sic2004.R e6e0356f19038baeea945d98a962eb8d *demo/snow.R a4df89b8a19499356bf838ec397e0c67 *demo/stkrige-crossvalidation.R 02326c0c05e5a663342be1252e671c43 *demo/stkrige-prediction.R 237b3653834cdbfb4f858d473ecf5ebf *demo/stkrige.R 2a47bc53e3632d65db84504076d6549a *demo/ugsim.R 47d9686778ca770faed9516cdeee881d *demo/uisim.R 4d04a06586ba37b31a14554a53424b28 *demo/weight.R b163d21ad7fa0eee3d2906b9d9bce5af *demo/wind.R e8cc520e632cf37de0b517b047f45020 *demo/zonal.R 702b865ba56005835623824568b10beb *inst/CITATION 4fb7e4c519bf5bea3c4eb66238c55afa *inst/doc/gstat.R a32e6ad6ede836013c11173470ba4486 *inst/doc/gstat.Rnw ffc54227ac00dfa7df0e6e28683ebda8 *inst/doc/gstat.pdf 626f14d14182c6fb8b5d3dd6e855f387 *inst/doc/prs.R 4961b8e9071476d87816c5d9052380f0 *inst/doc/prs.Rnw d9a50bd6ba38139af791738fed88e344 *inst/doc/prs.pdf 1cf59eefc43986e06838c7586393c912 *inst/doc/spatio-temporal-kriging.Rnw d21947b646d617a250166e557c731e11 *inst/doc/spatio-temporal-kriging.bib b0211135feb1eb690c4a225ae7f86514 *inst/doc/spatio-temporal-kriging.pdf b059341de51755a03b51bfb18e488913 *inst/doc/st.R bde19f77aa7859b34f3dca51ab1cb93c *inst/doc/st.Rnw dc875846b9cea01b39d943cc17bbf433 *inst/doc/st.pdf af529f6f9ce9e52ed054e016fd386af5 *inst/external/cluster.txt bacec53ee233889d6419b0e394bde7a8 *inst/external/ncp.dbf 3692904f850276a958eaa4024e4a8ec7 *inst/external/ncp.shp d7dc006dda153c41d6d102787e3a76c3 *inst/external/ncp.shx 127a9609099cd1f344b51e7f1877c85e *inst/external/no2.csv 0ff201f5692334d490c18661c3052276 *inst/external/oxford.jpg 96c8ff6ea9e99398a1faf5bfa1d9b378 *man/DE_RB_2005.Rd a021fb462be9c7aa235dd384ca36e78f *man/coalash.Rd 6ba0d013bc23fd3cdac5a9489116b29a *man/estiStAni.Rd f5a11c0a4c9ba23bd51089810f1ec03c *man/extractPar.Rd 097f908bb113d72690e9cee7b05f2b60 *man/fit.StVariogram.Rd 308f2115a92bd0e02b43ba1bba2659f7 *man/fit.lmc.Rd 742b2c72b8e7b5ea26d5ce672cd60603 *man/fit.variogram.Rd cc6af46d512fec91a09884363602f11b *man/fit.variogram.gls.Rd 5639348c778a32774fc39d231626cb1c *man/fit.variogram.reml.Rd 05bfbe18ee524a457d28f330288dae4e *man/fulmar.Rd 8959ff48e738d7c0eb41abcfc5b4fe0c *man/get.contr.Rd ca84fba4fa23c468e614795fcddc898c *man/gstat-internal.Rd 4ffbe38c974d51d7deaa4f5259c33735 *man/gstat.Rd 23e1a861e8b980be42de5525c0f3eaa8 *man/hscat.Rd 7c6aa566ef9c873de1cf4263bd7a6e0f *man/image.Rd 241fb0b164a03500b21a4a5ea31235cb *man/jura.Rd add56f658c894c039fd9fdd4be3cc2f7 *man/krige.Rd 180a0ee9329a24092b869f003e2e3bd7 *man/krige.cv.Rd 13da3e784f87addd9b91813b8e8fb2b3 *man/krigeST.Rd 5f442e7128f579a38fb04c05a011495d *man/krigeSTSimTB.Rd 76113d04d375455608991f702fbb7e62 *man/krigeSimCE.Rd d5db55e48f030f218ebedebe06ca1c62 *man/krigeTg.Rd ef9f95b6ace5e25d9851b1978ec8a796 *man/map.to.lev.Rd b60064452cf42e22a5cc79a981f23a7a *man/meuse.all.Rd d558f21cc61e41cb1facf19de2c9dcfd *man/meuse.alt.Rd dbc2e0fef45b60c96b307de014b17e7c *man/ncp.grid.Rd c0fd21ba73c250320c57b5f28597e349 *man/ossfim.Rd a775ef616da51224620e7cc9a832de6f *man/oxford.Rd 08b8ca971cfb973cd3f2d5c3991f7744 *man/pcb.Rd d20215bcc91d229474b46b5ba1c67f3b *man/plot.gstatVariogram.Rd 57669f191cb4f5d820e868947d550bd5 *man/plot.pointPairs.Rd a184e23f6c4f261390e3bf475c933589 *man/plot.variogramCloud.Rd 2ac1d60a5d1fcf60625502ef4b60a863 *man/predict.gstat.Rd e3b9c69fea5e974be1491666dd9e7f2f *man/progress.Rd 2adbec7bd98ac8e9dd1285593335c92f *man/show.vgms.Rd feb2807425048be7c7e6c86daf70f697 *man/sic2004.Rd f34824e704e398015a0fd1a5b9a9421d *man/sic97.Rd 4856c6bd3604ced90ba111d984d83abc *man/spplot.vcov.Rd ed6845ea040e1eb85b0e357ce6d7ee38 *man/tull.Rd 85f1e0fbd5e7f436736a961ed50b7f54 *man/variogram.Rd 533d618caf8af5a60c14e4cd9d1055b8 *man/variogramLine.Rd b314cebf1affc3ab4a29a841eb010d34 *man/variogramST.Rd 4169384801c30bd594a70d3ef51bcbc6 *man/variogramSurface.Rd 1b53597edb9bf443342501fdf08d26dc *man/vgm.Rd 08d0b95c572f944aea7ada44180355e1 *man/vgm.panel.Rd bd8034339dacae22ef6d14b796517f90 *man/vgmArea.Rd 576f2984d904a947939985f1d26e046b *man/vgmAreaST.Rd 01a7a226446af1c5512d99448bfd5fd8 *man/vgmST.Rd c6589cc4b53810b4bf410a479058c0cd *man/vv.Rd 0a76cbcf4763ef6fb30e4ed54330baf6 *man/walker.Rd c801c75ca84363ce6792c28897080cb0 *man/wind.Rd 2a6f9e9e044a78154d3cfda5936d6f48 *src/Makevars cd356c0062dd113425dcea3326c25937 *src/block.c 50f7dca54d782da8fa90376f91379c1a *src/block.h fe6d706346108ff86d4a742d1f1c0851 *src/data.c 8328781e753b45df53635bbb1af114f8 *src/data.h 4ae249002fa3e4d20ca7eb8648865afc *src/debug.h 32676f133e79fe84fcf143ac7c80034f *src/defaults.h 16d84f0d9ca22a3477ca83e49f49d800 *src/defs.h b3af256c7df51a35a368c4d94daf5c0d *src/direct.c 8a8ecbc415ae2102acbf7bea4228f4db *src/direct.h 74cbd4b8851adf813dfb512ebcde091d *src/fit.c ba498786f7fe47bb4e57e63f9bd45164 *src/fit.h f30f0be85eb072459a9e53f444579700 *src/gcdist.c 221e6cadf8e43cff03c39605a02bfa5d *src/gcdist.h 6cdb4ba518990878e84e271f34a0bbda *src/getest.c 60238e9217e0be3e69bd5c8a591818e2 *src/getest.h 7cee9fdcf79499817d80b01db3b57b6a *src/gls.c 46dc3925fa670dd3f277101f52f0fcd7 *src/gls.h f0ee553ab46b93229e7092b34edd22a1 *src/glvars.c d0afd7915c15f4505403db9926ffed7d *src/glvars.h 94f1cbc41e449bde9e99e6c8ac2aeea6 *src/init.c 9e281c2ec38b7ac600690a795b4f6c3b *src/lm.c 88138ca5edceca83cdf4a8934cc42f4a *src/lm.h c8638e72358d70ae27da94274fc303ba *src/mapio.c 4ff06b1d5c8068b68628495867110a5b *src/mapio.h 27144d7f3e44b6807dbfd41f115723f7 *src/msim.c 6381e492f21372736bf7ff42e57d8e13 *src/msim.h 2bc348a41509efdeddd07c9b75cbf53d *src/mtrx.c fdbe09c20a4c7b49d85f8c3e6b4b9820 *src/mtrx.h a1d8427748290b035ff031a1ab6ac0bf *src/nsearch.c cb7c7884a7504da02bfdd19ed10dc665 *src/nsearch.h cd520f7adb1880aab8cc98b35cc60c0d *src/pqueue.c a0c57bd9852efe71fd1323a220816b0a *src/pqueue.h 8a23f9662162c6c1ff6fc028bfa9ef68 *src/reml.c dc58fae97b9abee9228ba2ae92c9a126 *src/reml.h 7eb69baac97c96a6da61e9f53559bc2f *src/s.c 3b75b902aa067dcbdcfe59c6e79cd943 *src/s.h 8ca1be20f6d08c72bff6928589a1444d *src/select.c f9f9efd4c025607820dd39928231d6e8 *src/select.h cb308ac96305994692d7740e0c3b5a34 *src/sem.c 28c8554fc50566818c33ecdbded5dd89 *src/sem.h 7a540429fb56542a4aca8fca494ad170 *src/sim.c 4481ac8fe298f827274c7f9bc5619990 *src/sim.h d347a7ef994ea2b581853f845831f7ef *src/userio.c 1ffb22ab294cb753fa1ff742a41bb4db *src/userio.h cf128f1b5ea70cdfc79c13ad1ac4ffa8 *src/utils.c 03f1efb0993257a26ac527a2cb4d6bb2 *src/utils.h d5839cef04149d18255f99f219974ac0 *src/vario.c 2a89ce5559e7ec536ef4cf4ea27d16c7 *src/vario.h c3b780933c64dafde485584d24cfafbd *src/vario_fn.c 0c7dab4655f331b80ec70570695dd027 *src/vario_fn.h 21cd4d99d24ac09825af86bd41e8ae37 *src/vario_io.c e4c7015f19601d136e2f4bb26b9ba043 *src/vario_io.h c03485b9f7b27533ec0b98d412583b44 *tests/allier.R 63851c34cc8de0b05d9562ef40ff835b *tests/allier.Rout.save 8a119ec5be1b0b9d2ac4281b28e4d303 *tests/blockkr.R 2f3bb7abc17e1ef8a3252133e1d0819f *tests/blockkr.Rout.save 5244b31f26f5fdc216b4069e6d247072 *tests/covtable.R 0f68261efb85437edcf1c0bbda9f07f2 *tests/covtable.Rout.save d4e6a035dbb2acdb54c7d1250726c6f5 *tests/cv.R 1322024fa15bac4f1fe46c75567d4d05 *tests/cv.Rout.save 6bb81fcd91cf3f5b22da90c3b67b0d3b *tests/cv3d.R 1b61213f5ae08f8cfb3e71dba83d2f5d *tests/cv3d.Rout.save 5b1577d870bc22def0f5b9f4c5b08310 *tests/fit.R 4b14ce151e5eb5ce9963d243340af6cf *tests/fit.Rout.save d9c6a69f63372a0a46b1805dc0600741 *tests/krige0.R 3b05508a8d930bc11e982c1c0c11c3fe *tests/krige0.Rout.save 4a35e9b8d5056270b522e3a8aacbc9af *tests/line.R 58808f9c817a044375a7dfea53dd3859 *tests/line.Rout.save 580757bef9267e0f1b06dd39a1c55efa *tests/merge.R de4ac5b3c0ae4b696c674e9fedfac06b *tests/merge.Rout.save 358b26b2b47408f4d330c7ae619e94fb *tests/na.action.R ab68a094793dc61446114fbe2f48255d *tests/na.action.Rout.save 7e40f0b04b2219fa329b4f0ede19d523 *tests/rings.R 7c115ab4f24d06b8628c4dbc95675838 *tests/rings.Rout.save 3872fee92178c9337d2bd31c3f9d4369 *tests/sim.R a2fd1af159d1d3d2cef3252fa828dc1c *tests/sim.Rout.save 22966eacb6452590a8a3dcf4e80169c0 *tests/stars.R fcdb2caf655dcd76821f38f4ad99dd08 *tests/stars.Rout.save c96f6c7717e54c5629a3a36f8ec3586e *tests/unproj.R 0c86d05336580ef7f47941cf19a8afdb *tests/unproj.Rout.save 0ce127ddb2b0c900c6634acef7c4cc9c *tests/variogram.R b7587d353040687e3dc23a7e0e1c9378 *tests/variogram.Rout.save b848707caaecfc3e0fb84925f4fede91 *tests/vdist.R 8f65569f810165f874308f4d0b35534f *tests/vdist.Rout.save fb9ad8991c1bc2ce89b660ebe94815c2 *tests/windst.R 652b91540c90841452427bb5400bb219 *tests/windst.Rout.save 20272ee0d92bfda02b0a63d4093c03fc *vignettes/figures/allVgmsDiffWireframe.png 624ded7c12218d06ee90abc27cc7dfdb *vignettes/figures/allVgmsWireframe.png 3873ad3a6d22a95d5597c5548addf558 *vignettes/figures/daily_means_PM10.png 4efaab181b2dc944551ad5c3dfaf0fb9 *vignettes/figures/diffs_daily_means_PM10.png 2728991212e9c87744362f607f3389bc *vignettes/figures/pred_daily_means_PM10.png 41d31a6115115468b11472ba102f84c7 *vignettes/figures/singleStationTimeSeries.png a39e5c29e6e0755bf2479ec93514f307 *vignettes/figures/vgmVsMetricDist.png a32e6ad6ede836013c11173470ba4486 *vignettes/gstat.Rnw 23a8ca706b284fdd73be5e1958601d75 *vignettes/ifgi-logo_int.pdf 4961b8e9071476d87816c5d9052380f0 *vignettes/prs.Rnw 1cf59eefc43986e06838c7586393c912 *vignettes/spatio-temporal-kriging.Rnw d21947b646d617a250166e557c731e11 *vignettes/spatio-temporal-kriging.bib bde19f77aa7859b34f3dca51ab1cb93c *vignettes/st.Rnw gstat/inst/0000755000176200001440000000000014413507477012365 5ustar liggesusersgstat/inst/doc/0000755000176200001440000000000014413507474013127 5ustar liggesusersgstat/inst/doc/gstat.pdf0000644000176200001440000117503614413507475014762 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4158 /Filter /FlateDecode /N 96 /First 799 >> stream x\[s۶~?oNDIv:_⺱]vb'{ KV\NRJl"8S̆L3i93L ,3!g!2b f1`_2 5~T ? m̄a"ܠQȤp?bR ܏4xNh$I&PSBB3%-2LivPatsGLKb5W0Cр5d%S#F#eY(D1H[a:WDsIS )dQb%^b*t Ystd3:[T0(!h ʀPaxBZX@ VQ ZbY "-(+B8(npI|T= O J*D1 AA`!Qc @!Ȅ &Z: e _dFCHZAN @5$X\/P=e+M4C! Po 15}tRCA,Z'(r/8Ɇa6dXc6IzOC‚]n׎ěn6g?;d0K{?K. !%?q/Ug;h nK=ll8J@b4O2p49#eEM*؝=N3]F_qOX`` lq2PB(r<&\ǜۄv*(R|Pa4!xWGNbNA9q%yXtF T oGu:/BdC. d+$␃"x:r%Qd 2A*:KNl 8=ʁ L]L8p:uJ }9t7^$/ˠSQ\E]`ۂ9|̪ 31lW,`%K[%Ыv4jKЄ/CH4C;XP -( {J\DRrԼS]9IbܽqC=ZF- `0&|^y>5tø5Ngy; p[0@di]tYs" A9G/Q.7dOoώE\h6N,Lop1pNٰt9 &iX۵ 6(Le0٘U cg䦨\JpLP3|Y>Q\$34h"(&i0& 43,x"Ȃ8KvA3)BrP_ͷ$ArssDU'Ȏћ- qX4FeGLVyTaopU-E{W'xR%EQKlO)2.+Wq&O1U%OU t%pм47Boh-DO2Ku^8`"z2Kko2 SÂ=M5Я/*]faE}0q(9o"NkQ 7~p~Bꌁ7[͓$ gUiZ-mt3C4HJikm fvr۹[(76X#VP%]5)5y1.ZwtFs5~  MnZVej nỳÏ}{G=#i%:w**KWEMQիMn7 (i^o(S \urRÊ~wzIiN Tz>dNUהU:8eCa'b\]4鉊 TMli+|v'vw>u:pNWuxVh"˥]?Vecp7b"]@o"R̳ qZ,pvX|3q_0d1j\'>NWtr&vfq2l⌖; G5Pߒ5GehEg+Ϝˈe\%Cl*Un 3a n)8huۙպio7el TUC]v K{Gy;c>_#Loqt 2m#Ovi|ZP5>?K4I#[-,3c*6,w]f\ qۂ4C̸ˀ>L7^ڲ6R}Z*Zz;~MBx'$]nU\n&խISz11./v?k2dhjg6u$-@fը cVϗH]ݷ|i-Be:޺<> +gT'6ڊYemsWnT7۳U&QB6w`nI7#u!%Nb TdA(߰D1 6zBvQUb`iGVϛO#BGز},(s^yOj{B(f ¯TV*qWtd4v TwB+;tDPN[ Ұ9i-ET@B9,ʔrJ$#SveI;-흙7;^ntƚMW\DB]_0^S:M}}RIn} 5^_+ +emYG!n5k3uϚ9׏?Z`YTF _pF'×QѪǰۀkUmxXׅ69Oo{Q4Z^ih-D9 )k͐7ؾ~_Z4jy)Xpf3(ԙ-l--AtfHv)Zp6+e0Mi>'62KCFf[szײ(Tƿmy6~{*і Mņ6P99:v&z igaރS}}"w"uʀZ׌y}͘W}2es}#ب:h\ huqT=Gp1c^w9wrzz \JVE{G{g tД|Oڸt,CEǶTEb{yc)I//.>.}ZE* 6x\[pm-qZ2J^o fk(yfƻ;޾ͅ}Af-USqE\ɪedQ_F+o\ u !DtkE_WMxW2}Ɯ"fQ '\ĚrKt&4]8ܬԶ>.OxxaRж>ܓ g`6 .l`B\p!7`@]*Ƙ'  tsJ![n\oKLy{M 1~ K(2?BsM~rdKi tJ%OLlkcu%o}+ dK/k2`bMf`Ccendstream endobj 98 0 obj << /Subtype /XML /Type /Metadata /Length 1387 >> stream GPL Ghostscript 9.55.0 2023-04-06T11:22:04+02:00 2023-04-06T11:22:04+02:00 LaTeX with hyperref endstream endobj 99 0 obj << /Filter /FlateDecode /Length 2554 >> stream xYے۸}op(57[JjSmđH{_Xc簾04rtIrпpK6w݄?ުt#lۧ6ۤ+'7ù$Ie+)Q=Ϩs8)kL*"Z<*'x*U*3+ʧ80RZX(sFΩ<${'rSrdy8€'`ebk0%XI|f9òN|IDqj{r6ˢi*++[[صNˏhF4kz;ߚ [>jqnǭa@>Rā"8_b -YgW})EFsN\ß~Tnŧj8ӈIA?tsP@Q3x|k)ácI*#X12 tCqJSD@4ȯk8[AX:o9VUB9c (Khk8CdYm]C9o;= >Va `ZGaPt45͜ʅgQ$e*:V 5hK!CھCrho8/cݧC̻h/BvmʊIEj(Ո.I(@sÙT9Nv`XR>?޽駸5fbJT9p!NȲ h rlsOZ, bA|! ңDݘ(,u<D`886suDhIyT%̂c׵|78t`D^mk-sh # ̳pL}B}G~#ySg t3,z< WࢮBg?baӾ2fSha }8 n=4VǪw_ 0sjRK'vOZC:B:l/L}r?襂Mݲ_-0)@ 9@c* 7ɳK/4,1(D2NH͉??16n!7 0QjLu0է z ']T< /):Jd a ]JG 7<*X3MӠgU\?ˎaO.qiӯo#T6e]&`쮞jQr6SԳP. zztv(47Jj}UXiVѻ\݀_i< kB܇"쓰i6$5^t3+ir]T(~c,҈ o_DUQ'շ4K`;>8/\xO,媢Џ[iq\kqф1:qtKLh ±O_VYZ"vL=#"m#P.&Sk]1] b|IEG\SP>㑠 P[hǮȷ=u%&_jVG%8tm,:uI$A~wg@ҿ"yk.)?y] Priz?OpDoX\>Єb0vo P\ɢ]usP&ST?vM9!W/DI)M`ZN]N$Iy;YL8g3FUYs8y̹YW*huuѴ3 l{}Uׯ՛ܺb!};Bwy)*Z!~Mہ6N+|c%[p4$𼇽ؕ2C5JUOC47E:a@T5^ I_aqX6S#P4&foUG7^㘳0$쮄W1ӖO;ߤsqN^ #vwrWVՠ /KL1XyC |W3E  VR3QYddu(DSVhiՌ{:[;24QÔs-4ZaW5,'XGcx%J2N< G{LiPu]g9Ưr55:N#$Q_endstream endobj 100 0 obj << /Filter /FlateDecode /Length 1998 >> stream xXKsWx0Y"FUIN6ۻ^R%5@ߞg")A_=%Ēӿ\~m!eg[.vg.rV"h:J\FBuaڇ^od D}V5mMoΎv--d_P,gM$j/q>N)-XVV+`n{U!&MIVۼ:.nYF1+*:D8\3IV;E~B/M,azbq.`=*Z V/Eo ;0;fNf.j\7kF($N @hx@֔7Ha'P\ĸ-׿\2AI'vF!kr5b0/E"ؼA(ipDIq؏k_P䛞s~,É٧ВN̾A(/cIwp%9hpb3տKdoJV^Civ_euBfD@'oޕ ~gdyp(BFB3F騈TyTQB*]bnЌPRB%ÖnHR {s SyGs} &sC' ^ hű axеUж48Ed"ėC 3͓G AGjRHZqF?lY&hQ4HݟN}*R!c! lp҇lӍU,R{|?i~H*͹Y/qYW#%'?LЯh.!U^ZMm&Ug& Kƶ>M Dzű] >>WՑh|hL-׋ᅥ+endstream endobj 101 0 obj << /Filter /FlateDecode /Length 1736 >> stream xXKs67`kx?ǡIfD=9mDb] )Nfک}H,÷+3 v3vb[z#|q7v9Zeʅ/kRVY.+4>qS\kMVu˶lɧL溉] 7N& UXM۲6č8qMA%ho|uK=Q9H OuO˺Kݓ:⡐ϢȑCr%MF-?jϲPІpiӨR=pǟ7.\(KBn@RkӚC0 t>( h,kNY>;fhHֶ7=ml~S-BY'IvXxR?f1}xʙ"͔J@oE;<G.^6/Ny.m(c{.L0d pz2P܍ ȑ.7U%Mn!݋T.a?1>D0E~ߏ>MZyĉ;+]?zƢG|V67b_,?:8_MԇKM'-?'R$ЪDzm3 Z4hCt/[yl2A` ធhendstream endobj 102 0 obj << /Filter /FlateDecode /Length 11171 >> stream x}M&ɍ޽~u6vcɇvMk4T==ɇd+g a"|##H=o6z:q>jc<{c>Oϟ<קO?syc={"M hIqm ` #koaw02\ ߞ-8zYٛy:y,Bo1aM)A>R:u$ Xwy1, fx56 X#෧]k+!` E2" tvms8ԶQ4XwGǓ#,r*kgpXPR*?b[c0Xwq-4@*ESe A&x01J:j92"Ⱥe.r#8ecM"=dB^rxb,jK =j8*$Վ=Oa^)zrq۞[e{ |aP)jIL-08 p9~1f 6u A31DHb_zS\fBHϮ3|  f H, *@*H 0Kaw \{Aܯ!a8<U$B0{yH{~_CMl #9SZ+If82wcjc!F ,&Pzk"#,BV(1@zGvc)a 0 H*;ث,5+1xh%b*32r^AUp l2Je䕱W0D_%~m"ftMRJ Gfrcac ZbGSe`M* Gj[$)@P'N55$F}?~^~rˆ JRdMpx|L_$yBA-HA-aC+ϔ{}qfJ$mQM&G{9~_+;E(7d>l+ֽɎ`ݱv9X՞x[ P-c64?vhob~/yS^"4 a$dB!8\@d`cd9[pXݦEPaln @?u /iݯ Sr%:*&^86w̡dA؋ 1ZZjG݋ӼZ /[zsVlp݊I-<땘sXR;1ܾם",&Um=~m*pű0uF9E5Y rH"0YUJ"`E%HA%j-8Ni`:Sk:< p wMFF}0daK i~4Ce`!߸Ĉc=gK8ϸ[C FhO46A&i5aFÃ.Oku=C <YZsg+'a.%93Ɂb+:G,d8EPPKrXXGǒyt,_8@  ɀI,[Iʯ/\Ãj H4;D GÃ۫9cD8hZ Lƒ,/](ζk sÛn)`)Bi`}j}do#/L-x0cY1/a1uyᲖQ'aXP;^lr'gaOƹ7,SC]=3`dcB> &#o9T 1ZZjG-t(5܋m^VƐmq͂k2¶ЂԒV;2|`,Š}CKz G 9X""H@`\ay;P1o^szRiF/"u\`umb=9vr SaspΰkAЛM^ADCBW,'F!q~dsX*H4rXE`jAӵ%EțJ8E(V+0ð@HR$*Fq ZTҜsˤwB@XE`#A>"W"(\Xa!G ;HU7QKWW"ؚkO ᘩ_reOs-HA-Ãgls{Muk*GK3!v gl$#e8>c8×/j yd@P/A=dR^pqIA a5A);ʅ~Ȏ)+Zx|I*  xDbԑ V+PUղ)li?N)bYaQ,ڍ4 1B gjW`tVf>ym׳d`1*\`@DHipԑ V+5 ~I=1l$Ȃe/i^q!+ 9Xނ.#9 _,(e8AiԛV;2ȖlF|$KC0$X245qW&t|p7MO g {7"BJ`=\qYP)&; &i43e8B*rbB$PjXD^0ǥ}\H a&z@ MT='î䔱{9 $Վu9/kH!=l48&.CvY_`],5veA=2 l"jy2@:AKg%!)#Vu¡5c51fYRX[Mr |'0SðR1XZZjGM/Twb,Ufp҇ 3сLuDv `;U UtFr8=c'F=McX7d̓0v~֓Ĝڠa0#)%9vX-۟ru #oͿ#WRa:91'F|9 ukĵ +I\tK6scwdG eVxkڜ5/(pAkDq'y>ܷH7S~P~P7X hCꩰEZQ/R)d?; M9|j* TTV#ӦôhgSIFt:L C,f 9XiajPT9VX-%oRct}=]2/WqBhA jIl %&Jcڸ%l$ɀOgQL0P%(FYEo{qwH7b]ƃ FvY)aa5A_ 9l2ޞ#T yOhA jXnLdz4۬,f_ W"N=pN? .L<*I|z7SѩWtEg AG8<gGe;士fwd n-'[vX5:GT]/KUpuܖ0[HpP*bD+|cUھuV Y ;ɁgdNp8Nk ߞR RPKrXXA10l/h?ҠAp6(0`{A] -`G=Ki}?~c(yԕ&#n%գ.yԕԒV;[PWۏz*oq>PS8[j~g9l2ʭfVΔy[ ~+9Eb0ۆ Zc=v/suH} שzYR\Z' !V0XMPE2Xll7ncty ̮-XW!pkJљC騴Ջ2kb09O5"`jʲ8+'m{,h78ȣP]w@e`1o}+e8̦EPPo`ڦPWrS SćPMsR ׂ62"0C!á^)`ȠڡnXEc2U4v\x̀E.fe?)%§&fQjrG4)_F8pU_M:&\~ڊW^azvM&5_'tLckr06eM-HA-aCmӔ:~B%{3l8<=`L,ٹg+ '1vʓ :ߩ"FxV Q41GYER}}$qo'SDvSZv?o I!rhЭB½@Z)đ;z@-QC/2xIjA jIɣVW;f  z kBlv/n~RMQ86AzNz ׂԒV;6͒ 'fYhl>7Yh‘ ׇp!#'BgfP;^n2i)Ȼ8ZC̚3“so M4ğO0䥂ZjpK镊qf ~˛~!982Jl ᷼'(79v/ .ܚ` 4L"%`A2%g@$Dx|]9^`pV%UtF,!W*1|'W$g5w9dD=`6ŪpKգ(~bMjұ߇,s~ZjA W #,K<5_*0x;gSJ'g(Qo{Wk6A̦proEs-HA-ÃKz <ĘH8B-/Z=&KWw|O_tA>o{2A_ U[~NM?0BoQd؝O'=XzK)7\߻_ZV%¼U>1^\::jdkMsbIw NP{zdZ2'Q86(F s@_N(a/؏BA-aCo~[l VBp ǟ%wMc1v~2W`;7 &,n-Z@_S̈Z$þ24vp l2J{C~9R%(YnUN }jz3n]CXdgovZrdzDZ"vK%.N-w%򻒽8R}^] 6%0Xĵ,H dZT +U5bvT+֏*Lbμ~QQ %'&2壎I}ڛEh~-06ڿvhjЭ5!;ysG<>T_[t_z!0Wz!Л(؇ЦݠNK+)vtF%wm.ߩ~~I5_WîC[g[|^6(!UD٠d^3 3Z)\IrXXj~OXR+ūmqǙߠ@dSZz?J0$Վ)\G$f'j㢩yuؼhr)x96oyєHI 򢩠ڱ4Ƿ/)ؒy?.aAm_(a4 1)FP кgG7b|KR rbrEnrZ?/kD=. iwb |/}Z/j||N=o;K zp l2ޞ fKCLQot={$LlU5qeIbGі)oJb(-xG/yA%@a$.$ qLk㵒\H3H\H~ٳs?~l֊9<|<| #@{_m/y#pov+Q#0ˇo:>_#.J#e{> 4UuAǏ .~ ?my]ZhC5.Czl۽|w~,/_!YgQ䡡'yVn>e$}"0_>?;N z>O?|緟3E | /_AY=ڛQd"f/ovH~@&D^O_:*6^~ӗF{To%*@&򾮗~.>~>{;^~[^@2=wOYēr?} ZsɃH''WQ~珟!OʞNI&?1>/HOW.Ô[ᛁ _~ϯ]/t2wzOLWBP9Qū$<ˍy1"K>:d?W=JlыEƯ0SY@W qƼA+Eya$Q*\E,N|sTSBs[O"*s9ck^ǬBAyEO" .oQYڶ"Ih.?F%.b%SqEr!W6YE؋,l9!I<>C;oԎ*{s_Ls⣹3f@,.K~\b|Lk^"Һ:gzxZendstream endobj 103 0 obj << /Filter /FlateDecode /Length 3625 >> stream xZˎ\I7(NX !66-gѪ.YsND[SȌG^-v?\hļ9cޗLMǝߑY׻߽My_L5vc&岿~-כpyPۧOEjY~O׻7hJ6?Cw?eyJ}nҡ RquGg\\bpMdU3mVdr +b)(veo&eJZ<pj3o:ppԁ-S6&.*! S+M)nCek\J:94(55_/8Uk?MJa1&2FLlzlVdr_#TdbzM#L̋Baieqm+r~I7f m\k\\\68fm\k\|☽CVəmk:Z&YM~RcCK$Ycك.&wb'}ܹF˶zAw\18cr::}ܭV . ? qk}ݧ5;>LBYӛPA{IW:b 綟}ݨP c\z!(61f+R{iƨHM4Ժ\Lr@V V\1'ǐ@nCiV ap+~CNHGYNmE="j*$ Ҥ7Xp VZup@p{~ H9U(c5R|x 8Co$&1JNG쏝4ԲɈ[,mJ*] ԡ4W +ǰrHC|KB"~cH4?90Y0Fom0ͅ+>$<`VT0.|q83DqA$TH+ %Fo~Y>hU :;Cdf85t+ +0qHtBI2I)  'k}p; U G-3AYёM.!4fCiV ap} s˃gy K8Lf#x&} 'G)čAVJM N|:aV ~=zA{+NY&z:}O^" Bt' d}aNr K/4 3Z ; ;IC-KV[9*aUW >$NwcK-6+\dlJ/22pZIhY`]IO`/m+C W$"7} q*-S2 {& h)o@4M +:bEant(MÊ1.J d~tΙק8d[o8UJ;z)bX18C¥([-hY Z ƲҀn-( 5o8Zd$N V\1PqOV ^CiV apq Q-\IM\$i9`rr5+6Dݡ q 1aOJgZuw "^ ,K3–Q椬#`'={,g'*"D8$lŌp֧ 9YWĚrf鹡 +ZS†\VWSyx\8RAٌ) c#Cr̆.kb1wǒĹ'NFp˩* ;9Vj+oc1')3BotV;:<ݽI@D e>@4EJ0  I2Q u;XgSd)OD`^9l}PT|{CAvJj N[9yՔ@w#q8Uqjh<=`L@^< ͰF<@awK|u}A Nӡ'uk1 ,LI #u#)*Q,.e"3uV(TCJ(}cRC^2F祋Жy}XRF#;])}2kqa$"{WL5"v([&.e|Y?lF=S엔DETќ!z`uR|렢\C'q0v0Rr!&%-8QPlQAL2b}{KBQ݈hKR2x@,PJnҼP–iXJNANeUE^b %z>/:n! J~$}jebd]U4^iu"~* rS!P6ݙ%i"JPLJ$ rYoQ.tfD7}%D g9]SIB#5ä2{AX!騾A)H`ɴHDAz$Ξ3)SP4^NKܨ^TO*q2Ca2AhrIkM1m RxFD8k(*6vWl^Bђ& Hf"(h |4혂/ݨ%&>L+}lJ) =R;O]C)!xFDtJB XEPGUB= $0oO ChҦeFL9dM(Y8%S:U ANHcN5#󬉠/e8!i ny>o?ܿ.ϯ?LԱC[^[n7۹t8LˇOӣ|]_8; n][^~x:H mhWq4}%-'F6,^Ώw$|{~yw1t:y_~<\1CC)]>#f/|_(- e.'rx(?!Zܸ Ԯkݥp^h|c5grt~x|?G9' YY|mᖇEalI4M]We ￶ _8 4Y]ٙϧo]ܶ1oGmovq;endstream endobj 104 0 obj << /Filter /FlateDecode /Length 14905 >> stream xKlGrWht,׮w AY4րjk&>k~D~!HWDFdZ+ax;Nӏiχvކm8<oto|o?}#s?xO#4߇O1c_np;@D?oXqmF]:>uo6jժ(QF9q>8=qV;/Q{oKQyNS+#8n׹jƫ=rS&o-`kKYDUVek!*57F>";~Cqk:}"y7R):9lGوZDmV9FAT0O9NB|^:FkS·X>޽)Jgʼ,LצD~HխA:AdO^Baz]~v3|0`q5trX_ o}kvMqW|9KTXXkut9!rB`=f.b5ӽ}1kzXEZwAkMezV~a) /,fwQ"}aiw1./g En/Յb}a9S\XŅE.l:.tm>S5r hϭԕMcԅ%ƬMȗ %L%&/1NѾX~.<1W鍨%/QC}aH8զnxiu!sJk@I<HAiM +p'ln(ဘӈZr)QbWC `(X`!3 D!B(IDAѽ& 5Q~x1UMJxlb,2(lGxS Ai.8mЊAA+I &q 8}8<W=!w.:=UX$ad"Dn S Y$aF;S iaw]HjM5jTݷkj2$QfW0 bks12 ^3*k12X <Ţ3bV A)mNP% JIҚA A%mq9dvN& !)9gL356RLP\C6BN3̊cb%% #,6 )8Hww@HjB_=O~8,j'92eWВ"MANp_,u\ǰG1<^ޯ(,BCFA9i!AZDB{9iqQHiSRDNZ赐5iEHK 6i7ФŵEZ H{<ùza6ٍiEi0:g65l&g6.2#)"(̦9lZFP01b6lH"3}#}J{#: 84}N]Q>4 DYTT* meR,2)I 1r.hR@ C@He L@H$ v ɬk[$CTQ& B#m#A]o?sC} 㷘sFϥ0[ӶR '`u f@PMZ T:fr䠕JBZhV %D(lePVzR (A|) y\FjI%l}=/@k8}Aù~rI d5G c& :#X$LYNIZNZ+2Erl3Lo+8?,Ne qH$S& 9#HZ'LkiGPh;b$`Lss\{w#Hj>՜3h\wL-ygP;v"yL!3(Ԝjj; 5%ޭ#Yr9EUPt*\L!ސt2I:BűϏoe[Jһ;sw* }gP;B߱pI:_kpwƄصOݎlԡv*@ -M H@  NhԲ &$;aW@PfW@L@ :ùJ"rʹuZ#GJ*rO,\J$.xqR ]㷬nyяy k?Y(/F A#Rԫַ̀(W;C HAlK`LP'[.oʹ H޲C{ y .z EB=[i7Bio[$oP&{ d'GQ[ { ^[hmyKCo+2<_بΰ+ې4V!)Q-fQ؁ R kT.5pdA YgdoAlv6M.6B%F$k2>WG3>mdPRd@Ar*A]>z/N.E|osS9^QIYHc (׏p NѨ~ /h^F0e&zNHr S4@/p nFHuX"q \#†ޝp n#xeӆ40/ i^Q_-?' O[_) FlU_~r?N/qPQb(09Lm63S(S 呩F[ a(P=6k.^Xv{nBg>a,P-0r^ TtG+f >mnAar;tn\q XFADn,߹_ӯ ̃[Kddl~\,2 SĂiV}(>Uk.@imP6$'AR|ɒ}s$q_ yPw,<5ihFlla)P6:J;d F^ Tܠwz8dK'\/[Ve,I $%'9-AnB M(n]"n Ɛ=Oie- HBlkSZv 9 ݻl8vliFlЉA 1rA Xֶ H{A%0qA 2iEЌؘQ?@im9P$?>%9P6;%sm9tmbm辜vfu_NA$s9@&bd9@Izwms@̡W9@Kusxo{9A@A"  ܇AP=v T=ז'0(loy'`&L+O |O Oo[Ŧ9 툵'`'(<1 O ݻlO ĵAPuܴ]oc }l{H"7nJ/zOk[$'%{sԅזIZ@}œ,oݗzߌ=A{jz#HzO#}o#HzD?m1}SDc|PԗĒzHʥ"7nJ/ROk[$'{s,ԅזmIZ@K}œҖ,oκO[ꛅlJ$C&K=b$rzJkG!?^3cDE!*%I} hzX *N/dVw;f#HN {ՍSVw\[$UwJkuknI=$uYݻ޼uҭB6i[!1RwI{w;c8>N! ́;{ѩ7UeSƴRo͙B wյzcRo^;ԛoHޘV(Sol)zw$wίKz Y7 fP7ԛ2InK9gƵ;^7F&h6S.MhSUK=CDmY"ژI 6,NwoEJ񆤢}mhSG,alDJh7 و6h#HMoцLmH{%6WD&z|ZCxS5;P\[ ?'ԛC&N\CZCXVR X)0iX #]4%FK4$(ӭOj8soj(ܺqnF Ks2SR 3a˰zr'BSNir">+\I Ird DRUn+TH.Q@f*ڌ$: 3nMnU\ Mk[o5.#(wmiƴ1 7(2$#HL[nQ%,#H mE8M?y=ӧC[OKz}zMoȗoDUZ48A48= @@1*<7:nV+ `&V6Jk.lI@ dT A5A|I$k>e#H2 |7C,ԅe+ mM[}9M/ [ h~"~JmGd@7P7ɛQ8 y3 d`77#,}:En* X8m4N%J\ͅ-ݕJ˩R7bBi7 &1!Tt1/٦ڈ FLh6#ɦ|\>YC5*!}#sEK=oGA{In=$jIC'oFl$vԒ Uuh͈FZ$U'UĪBNڊ]Xqm:SMVujVuI$Uɪe ĂdZqAPdmYv xt.b}Xljf'wU|m%#6z+ ꨤ =8(`dzp,MV\Iv or['ajyiIŰt@-%È!s;h8-Զ dlx6-esU>0:hmuu_ ;(ôᎣQ=zi>ֽy62:;-+f٨@[ּo-mCA:jfGGu|jbRa%"HH##Kxd#dU<AH#GBúF5RvCj`itFJk7DArC bHؽrCj7r2@l"}Gixד8A2;$&(ô2;$k`CPXZި<doT2酺]&`ޜȘ@2(,o[e1(Ap (}pqDI7IvǠ;!(쎚q;1r8%/c;^;ApKv!HvǠ;lBǙ$cP8$cp5%0\ cjVL6nͭb}Գw!FTbz!5$.⚘^ &WyT'q!6`r6J($$(Fd $J7YזQ"HFI {#}{ヘ(1kE'k{ 'dDP'fDArO*I/[T oa{HΩ0q#==< "A5yL"F*S4u HS52A:.:@ԁeSEST^fAy@i&Pni7 mi!j &th7 AnGMCz呧2R>ݐlէZ\44qNUA1]_;ԫ!IOCy}=`z?w8=.7*{'ƩsdT8Ʃ5NaM8Nq8I_Txcrjԗ35NaƩ5N5@qLw4:ێSdl.4Nu]S1N5@qAqq5N5@cbۑ7Ԏ+T8j8cx3V#2׌Ū^U3j5)+tbjSͨt[Tlj֓SA1N<]pecjS k?Fh㡎7tXFַgE=r\49 E5h jBF.#d*},#ȅ \M>raȅE]v3rzBF.i&']Z&d xadA@=z \Cd,CCC(Ի) t#ρl9ǎCad1}'n~ k!LxMj6;MS1(>{m3},.dvjNz`6ڏtYFn$4후$GjS&;`٥C3KoC"YJ?"S& >՗?gYT 2$ @< -m@P@I>;!*^Fdn@0+J/ . $ F$jS&I0b/oS3]a+` H%"bihH0- FTAR]*ɪKҞ-LiԄUIuK -dPEhqm m}RZ+VKy79 dP&$L dPH$&Ot,5{ӆTRGJ^;yw.-dP&'LMn2(A!T+9C79k&^&tHuMH%Qj7nܣyvZ\DQj`7٥A3&B\8U2YHmM% "H2H%Y)eAAIqc M&,5-%.VHk"^I #k"-M쾥݂`MeE$)" ib՟LDH$PE]Ԍ7~QdAL?Ni"f Bg041ކPkGZ #9GjY+}b>R}DIKttA6I =$aC A6IàI }0pz~34[!FZ @E5JoQCD A͖^[094UYO ԞՎ8Xnt,K Yu SN1&tAS쑄 ;FQpQ5AQ\C*!VԢ kbLB$]Xa *ZRB8i׼aVt%+ \Ӂ7ԥ F BY] uO7K]$!nP& b$$PId@4AMRpE?t|}y2x4sx4׸={PDDq=ˀg60}kF5*@%_*2ԪC]N߇?}_e/ }9*2Gk=(PPu=_&/ r:,J_~'ǟ~|_/k̦s^޾Rp@xѝ?= 僿Ϸx6y?~ ףC#~> gny89>F]02c,_ 88_x9_|뗟? |y>7?||ѷ9oyȿ|cȯ6{jxvJ?<-??~|~Eǟ۵$}yl]寿<>:C?uooUx)Z.?~ڛm7[/~)Ky^??7?|~-ڢ~oC~UKa|)qJo~/ ӕu9?Yc3퇟Gj>]on~)lGǬ_v y}ja$僘q⣼endstream endobj 105 0 obj << /Filter /FlateDecode /Length 58927 >> stream xkr9?Oq҄.Ek*@I4z`Ȳ W7Y̵rsW旱 _*"#22#7Ynӯ/_?//߿?Oy;/_==I_vd).~^OWh3m;URWuUd]½}gzx58u(7^AB:ʅ(X:[E)|>wΡ#ӷToU݊n7݊,krM^k^Vpu+r /!@1l1^SduY8N`3d= +.J]Ůvv>n(?'7 XQn"¥uHp ઺ ht(eG{fOb\u6^0mde[}Ĥt1)8}Y]x^ZߟOյZt7V}t߱hԮ60qξ86͎,tƼ|&K-ݭawr1u"/2yR蹹%jڄ?.2ui(R_/ŵ51x(X-6FP0)|;j3܎*OL]' G#ݹ<0\tkQ6 FER 'sy__0IOok_w-x-<{&E-Son0z3k,D- [;Vq7g,Rݢy>jr>jWGF^vN>sEG{CZ@vǐqa۴Dxkjj8Pb778L ELΔrzwzRM^nһAXw'=: f[aBm(`4 ~O|k $8y(M19 zZïg͗%fxyx'sljqyuƨy>j{|yU4C @OyH|:Pw>H^>/~^ ̓Eg8ydz 9$y< ܜgC=q`g쁁{M|+z{`5;hágBcrn45F<45=^}թF`=GG#h}7^IM]ݾ{WU⪣W?jkjǍ\ݥ/桞E#,>zv3;\}6x5Q5lMˣs7Sbf4R7o<݌qhu3H 4nMCinz~2OqOQس{|FşCa^nѨ5x9Ww8ꦮnM]CyPS2VnnQQͪSgoj\~u:zn/qjԘW}|5r955:NˉqYuuuwnEkS~=km^qy&51/.Uzr)98^|ՓRbԟhDֆCtKK,YNJ yՎG O`M*bK;_qyZmG8nsGGϑ|y>mPkS>n{4R/jܷN I'oNF-8GM˫9X5q¡-4~H]ޖ::6/jMꆎqWqǃu<Oiwжl&&:n'G hOʁxXO4-ijO'ӆCƚ Lhl| ;zÀťtˠɝU[o<'Ecs~J /F@S pֽ竇oW ߉fJ4 O4R@G׏bNxFW0k1 ׮@z窩U? )=zGhyLςqxD,v ^}Vl9\mcKF>/ˏ5v540Jsߞ_<ޞ{~WlRO@Y8M$Hx)1̓]B"Pbob`R$<czΠ:>fP(h)F+lQ/\aB}lic4Q(څs4 XdQ <m#+JtR2!4c4p<4#{8?y,4ƫJE(Yx^Y͖(gKʳ%aegIe>`=Q15pK@y>QPPxÇ"ڲq|qF桩hz>vyTs"84Fks[k24YeQ*iFNP>Hci접& E&^.<]t.b(pϚ.5]o9=frxj2̍yZ{Fda6V^&kpDa6j<9MM,G|6s'B|[oIaͧ˿6-{א B)MߒXh*iZ[h24sd;w980=;U=HSCt|XҸMl>c|oǿiFq~y{"\z<wYu ҏB \k2,MX&Zfvq$=kt*b1& J{㪚yj>BMrdr(!.5v=w2c(Xzao:Ìl+`K`ĒQAZ؋j"M!e6fe媑 7yFBfgxV޾؆/l!:L\L##s .K9Iw!f2Mz=Nځcn© ~~gUT Ƀk, NN6fW,E#aGl[66&zn&Znjͷ&i QNe|PfhFg}Jlœ$rt) qf)i`0j3)zGeDDx--oV 6ߩF`%/s&H|Wb>6tB'/LhYaѓ7@F [ڟ|cjXndRA ? eT@Mjc_}Oab5sb5%̕k'q]ب,(^.+w$B}'OQ5'n%nbB#!*Nڬ*'-na>h I[!V7Hwhɋ@5L#\uH| Kq̪-:D 3GBWi8|fU.!n+acf &GOa{/@kܩnn3XG 4QbmŽrx\&#u%Btb^q_GH@`50bVG ,&oA]ZIp^:ވt@G6BوflXFa1'D c G5s5&hkRۄM"Mg ijNg+{_wx^tY< Wq(XGC1%bT-q(qz(A)ߕDEebM @ 8F6 %*AT.8z`B!0u82c{BG=osݰkxvܖMA?bm)a1c`{6FU]#(G,*o]oD;7K΍|#bUS̪E^V٬*7U UD.UCzegc:qhb=_F/ա>DSU\u8r> #lϓc;lS™<ʚޠ\L0,hݓ˽Dwy{@? ^95x~='Ado`ճiXīP~TFGdk%| db6| fX ct&W\g4=s8>E,s=lawӈ6f05jF`kja "B9P=QAܠ3"y<n|fy _37H8g8 *ٱv܏up'96 p#>yŒ8pBuhj0s` '3lJ`Ak .d#P[-B`#n,T7n*đDr$x 8|Fd& Ge,@P: S?>A#qa6F&,x@Ozny(Jdr7446@|"CQ-ArK=тG$Dr A()T% m4rH)Ơ2i0F )dcF NIaa<1`9ܞ: DgH!ӂĜU8!@/)i{n-7g'ĵ2u0lʥ2maڔd \ΕzJ9YaIi Q><AH2B2/+ԷpBbK9AC4t 0geN< efgKO"2iWOp_` ,P2%N@@|̐.͐rb!|ˊ!dŐr=t8R!V 4PH@8 (Wd (B(R>1 22Qf1_qx㢔em :H$ZDx9F<ss;;hEs @,̝P99=##QUM#C!Drjc`TU`'+J )U!d^w֔"BTgL6 Fh$ٳ1vK/>Ap`.G"L"\S!#s1r(&%^81C!#Zi; \Vt_Szo,=DR= å|bjΗP֐^ I˕LJ~Bnz1XɨѓKhI OsǷ'bIjOq~OC[} m| 0^n+I ƱI'ԒOqxr@ȓpfh6ĥS\z\X ]F,k<5XK ih$3py չŪ Xh؄6Gz-55yGp+woz .ɀI<Ĥz"bR=G֙(AW5y;2)?xouUsxDیAD!6haAlĠtgFPZKc)(<ъ̿)59[@E6Md#fmr5*O5;3nI=$DB!pu- 3<گ_*f շ!a= 2wFA#\YӦm|wog07Ta4-k&{힂+lZ,=~NV`$PaRF/Ot(UE31sD/t 4j^MrFme_>60^C WhYA mrmL,\VB#q %KPF>{9?֕Qeh5k^@h$a ab9>K3Z^F)GhܩơrB쩇{z7 ԃo'1D%L] "#\5S W;2%BT=xU>󪞕UϪl1^Hv<ݟ^[_e9^jׄI""y<< J(H<ɤD1-'tg`R<12qT21 QLjc9WB`DCY=)Q.IA<^ߌ'F"& 1$qYqzbN/ǯQc.~.vϏkGA3%vfMz}k E!V``EルSi' h$RHY=y|4"%f!R⪃Byy"9;1`ˍt{P{HFѰQ|_x P>yI>dK 狥HAH)<@J`Rc}7xM}4F hӀ(_!WĴ(')ITmCsbg9%{U6HzXTۑyoxz (W^Md^/!%xu$%xM*݀II&QSh#cƝ=ߩ|wջd὚yh$3a1(שh$1t;|K0 =% 6^bI,v( 'k0ֺOu.-'5*G%Dn]z OG=_/|q@BXVy( *C9 \iiz ߗ@5eˀ8A:9>X IITD T ('KFy^cǒjaq0{]'.qs0 ;W LB5wiH/ה.YLťʹtFp"I5$fns遹<7Ts رrl0w&I IAm'M%D(kRtVE^yVQ>ܟ_CBtzmD#-D ~#}*0x}'4 /rBxChI$v]I hHtnfjwW4b>&$W fE/Gj}5#1HKhە&+ [ %F* ./죑ȏF?zg-AD}CǧIl?ѥyY`| 4jBlBV G#=ͼ3q-Kzt 0񿜎*9[-CI5N,p@e%H Zz5:^JB ެA9)<DybR iZ)Ж,gcՐK`}Qq nk5My7%)GjZ'/N5UZ$k⤭ok]ǒ؁u W\j)ZU%bV. Iŵ0Ep ~3Wڈ0y]Fc~[ϊHH&J6VH@&1FFK]wyL<I9T'I!߾%*-ڽ88xxkOuAy>At.yp%4M4,kp5q-k5h$)˘|6T6Lx" Y9?" I ^S@[!6j&+t z5 6MQ'q,Ps @a&P8 {l%SpMMh_ߪ'%qSO ,NGS=<ρsN1'}bY2f7^U$x,#?%%9$xvFh$iHH 9[•r\;r08a};RT{Ei1YZb,Iѵ#m$ݕ"]b|{YR҅ 0\8ݾ<hE:k/?AaI/FcNQ( (e|]3,4p\Z⃸D&4F,!蛮|+Ǎ#IbC'ŘgXVA8It]B1cJlgXyզ/%:Hkb:Қdd} |deuG֗$%:L,)E6}YO<7͸,:Vt@ybRg2+'ƗL0Յk%^;a'F{"[,SRdYBMQY-|,`n(ۤH|'IITLWme݆Fi9Dxo6&6shQ-DKw%xv5F^i]HmI Σ?))L+f ee~9iYCHCHA kTZ|hu 24B#idtݵI 1LHw"Wa +hV)`t8w-3XkE/ɆIJ% IvMs #mWߦ#ᒧ#] \^QH}ԦGaųz)a Wk,L IT ca''RON \&ynMJ2b|egpi4ZYğZbwZK,vCH)𘴷W/Cf>-7ēqN>zⷖ(Ssc;HϷ(cy}ܪ>HPйF>y=@|㯩B}yGF=.+%6qyz%Eh&Ů<Ċ؁nS<;rLHWZ]tǤ0ҏ@,===ȴ :X/r+ .: ~}wo'ɉv=Mdcg9H2RC4[i_i/2C,C jנ Wr2t}I7~3ߍYWـc t ttfZOcZf$-VC8FBN9g!V5evJH\"C3/|/ dfw,&!sҢ'im#Kc? >x->SCpuMX}|F<iģzZ|f=i;\>q%w4(G#鸼7i4O)Oj`Oos}&cyI48frw F2;iL)7ڲ yF3|اuUqVqDM8bq@8f?^?8$c08iI8CHc`Hi/Dfi!XzB(!`6y Y $gn::@R<^VP?F~@@yCI+iԣ:iGAKkh(ф}t.ƿnzF.x-TsW}.gp6xf0{rag/i̢jzj^M{/C׿?G^j`ԯ骡f.;6?~ϟ{JuB7[.?o7ߋ_oSr;?~$~S#}Fiq~1ОQfה={ЭMa_??Rxǯ|{"}IpWr}?/_t?_qAʝ/eSbWoΏ{{l~fϏnw/L^Xc-v޵">3.ѽTXxM*:^]hY,/S~y|ZNx{T3Ç\jRפ˺XzWVg\Ye [˺ޟ>E:~}k, t&$'w?ښ ćFC3NE>Z'1*}i"]yuޔ&3Cg{q\~+|t)qxjN[($N18Irxl>|ڐmT҃Sh;F; b5܊xq\]i\!j~lt]oܪnrtHaxS/ ɭUSgo 4VҾ;)u^IrphF#|[nzx&Lkԯ? 6{P] pUhQNG]FjW4RE].8.>`Oyuzg5~T3e k6P+CQˡ#zɵ+_ޡdty8|..ྫOoX] Fе ]Bk15iƇ&x~lnL\~{Տq>nL6f9֏t A*{U,uâ喣.>7ZmIv'0eIWΝ&jSRaǩW玽+ͼ)ݺ9qJvd5@kȴnR{tnKz 2WYsF=wF|ݝ?|"w嵋՚lld4efΎΜWQMy1%59=;SH߼NsTɷfݼŗz=?5{]nz'^NVפ4π,64ps},{s0WUˣQkyyڵ]OB[Sڛɋǝ蕔5,:9Ow3}&Q#'6sȴ[7r;Z(w7Ӻv7b $qz1fٵc Hx}o=-<1)8&5zWxZx5{=GOXQ;ڨš юߨɨ[/:~&|?,wo<7+&7Z]11u>&ϓWv\~A1նwyunr\59ڨɡzYRq|ޓ˷O߂qnFߝRBIC8ڟ8T] |7jQWiFv#WvST:ǭFKR=&_\I۟軖n7N[<{S/KG@C^⥉դtjr:jpnr!ݎã>qΏ&In< ^qn`}ndkr$5tI ]3/kIe$XjAy$=VeW?϶lXq<^)~}x|_0c5Q P%ԠcAA}jnb8pY 4j͏xG;-C|v޽{aE'voSݛTRըQqQ5*Q{ƻw{p'CFa[Shtp׽G2k=~4M!V5ԋ]6ekg̨5..g[;cέd̴ڶu-.֦Zդ`f?кkуY M54R/2=f>|a L=2L=2|h19 ~^QEf{fBGFmVdMqx{x?{>-.qF ^oEa9 _w>1mqU5<&&/&4PpdA_݉{</YS`q_ԏq-N 0tfk@d5yIjd4]hYjl<Ct5mԔ#i4jp/xn?hU4Ҩ|ou5_?8<~?[r8/xDFC`4i ͢EYӀ*E<ʓk7L|4hUiREivpi~1=bf9gyfy^N4/z=x{24ϫ<0j)<CU>y}?V~vn)b V ͙׷Gc|v\0VHA#34H?~=[>Gc'|5vڥgxgy9rtxm4H:+y!=س{z~wh8x<'" \ﭹ%$>aB Gh$aɎ@v}˰*kV;>FǕ89E[2pѓI!*߉epY \t{ .*aU-'mp drkG8xఆ8pakcޘU(K= =ieD4܊UɈ2`^vYbUc>{0 11q/Nܣ84HX`[01 p߰P/WnUeQLpU .BXWրIJpqb^Ć: G{7y4{a؂;ݎGEn߾,N@0.v kvQ"``L,S12T18qMsp6b13.A%HHD#1>+=_ !>Vά#i"dz ! 5jЕ5pYZ4G#!C- q-k*7 Fg ՈF p?Ⱦ=7N\|xaMm坈m|p,ȞPOaD!oHcz pU+ߙ(ƞ# VCo-H\R-8W\^$ex ' !8;10 %9vmOn4znA#aW^q,߉cddd0Eb"QPLD&nLDB#DH1H؃Fb>!Tަ5!!F_U*7*>ս=ʰUgC4^CXH6w]1,f|Q-9Dn?|͎xB9XuBw!1  ,x\z\X#Al51Fjc38xkX U| lU32ު{6D7DYR{k'(#~BG|W7TJw'z1/ 4Óy]م m `h$+.Irq<H50ʗīV#ק,!CG̣k>~tD:\VxC#! 2< j{T#C W =YO W=imZybX9 7)J/yRBenLU0|^0cV|V[2ayZWM\4ʡ<Wfz ZR+kh$x2h%ӋvO*(Dp&z <;pyRQ/VxYnO͌B3=1 U\*'e`UCXtHfV9@U.@EL*T,(ss"B  5x'ϣW056ʕ1~y|\{vLN/ou:砆Yi̎,܎F* 褪'"TK"V=U.{ҋё_ m;1p0YFꑘVt$&PgBoE(u#Z5㪞pUU@vAFu5[0c@!toxWybkc BtЁq)(X',ɄF?h$䠑0FLxL&t@/sJ/Qȡ.嚉.y>BNN?#D4XH`]GpY42hGѡo<`}2pƫ.= &f(䵟cRގQ!Է! *MZB,W$I{k!+,ંh$xQ&I$ .׮cc\c<+o7ǀZ6x"`r2聟Tc%0B SV*P-W=HA/Ԥg%l27d1x ikmT &n C3LpU42H((A('b~,n}y|b{h ze x\!#`F *I+5RFGƠB4Pp lpF"@|MO;i`6٨x6j|47AsBsלg6[ljß m1DL}b |23s>qּGzU !P ~ˋ `aPC`%(sS<CHzGG(<؂O'R? .+ЁG_G#wq.iG,;xAt\oOxRv@4)0闹$ToY=M&c(,lF3^uv`|;0Sʎ~=*Zc#ߺyGSPnP*q\VP)'+g._r'r;G̝&OBMw _[QܾÇ'ܶTKg^Z~)X4(*WR&!ĕ$حCxr=r5M:V!%KxHX!ZbCGFCpТb~ >B8}|ͤo߅Rp@#ϒ&8#B!&`ߙP4ԯZ H+aP%+, :)#v &Ik o8>$=<ġrzBA|)'gq84jĩ'+0e;e9#5r!ګSޫ 3h$`R߷`滇>v5N0(]N|D,pY6FWU(F>7L^a kR!ԀCK6 .+в/%J1I(s8zU>JaUc3VH$)IRV(IB$;%WK8f:FHZeEi41S?>>Gˣ`KSFkӎ7B5xM(~,)z<;Df=莓4F<aebByy7"98tzggz$O#==y,@HEo4-ش!]=,COt]UR7!z㲃1#r~\Ƕ}?ѿyF= d$ 4 "K=7#ۨRh$FO7:>BA$ѼJU.!p[4O4Np+F?KD`"xqK:śձ'رYeޫ-Y m ގ_.Kv]:gO.O啯V ĤfJ8sbG> K2 J3\v J,\}IDݶ ȢX`LﲅD-0 i-@1%OMUHDԶ .fn siY5ΰ yhPs繈S/]јU60 ٩ aV,(\=`d#ߍ.Hrahii"@#i0Z| oy09|ˤG- z(I(܁$.;~mirTSO|›=c5TN\ʉmj)/$R}gM9I[BSRq3Z5Eo [0VSK?8&~P&$بI(:ʁh$3|ʫ)MWS*;wi*.oOvpyɧ|TٞOùkz{x;/(Kb񻰕DDSIá9qyL<]Z$ۢ2[Rhq],pyɶQ#yv-g/-#-_k:}$YNNAAb/߾^|VK[< 0m.Ӣu) .xX8\H۱3FƔNρl‘nFQ-qiDzt9HK[Gl9RoV:;iV`ɚqNI3DI7ffI3b $HJ0a"dyFh$%y[[=0_2H/ޢz> |$F#(#rvt~vdIQihDZz]5K Òi5X:M0I$̢xeT:/8֐/K- /+a__W4XE%eF[E+<xw87}vJ AL2nE[4-.e- G Jť[X%;%⤥\Б[Zn9r׃jXåXMʑ\qOqvP2˅U/VsLr.NJE~q2~H$Ϸú;YE KQrd#.㢌|pI$ dOxP,9p#IGp JvwRi;pC64NǴfe3BHۑխH-U.-Ŷ1 ?EO|1mGahwZN/)%X-`JOw\mB8-w9nzI0m!TWh$)R ݷX҇Y,)(%c"ۙ"2rNJG[H.%-iH$#kǨ QVmHPx:Ygbb}?뫼},?`(8Y.|0KGz4śE\^J$:1|g/%<YFfyIm!9Q[޶)I.RhT~JX:You+Ic+.YQטi1ˑ1;5&3(]x& ]xV33^;&m:VWWhvjP-ڼ5%[T!K -0!I64:C# gΒ YSgdu6c`^ZO -'ɆEd˓dCOzyHyYyYyIHm H$Hw S~#醋JE`VNEײ lˋ,]QSgi;ueI0KbA+ 玸E2H|Y,D}DT2>`I:ؽC2m>n߽'qu/8I`bh$ g/ @K;.@-X8CI8 UqYk궍0ʑ0Dy:W˧`^ a̧'uO[?OLO(|2j㽙Tt#w~nbϕȉ̋=k%O5kxA\N+5^YΫ! u0E*M8I7βQCkygl~F-ZOmhA΍|Dj! jq\* s3ot͓hσg@"=m14gk2I,˒pia DE? EbNFNh$:a/T#{ULOĪzF%5;i\qǙfD1<!D1ȕr'X&XIXK[.)%㱳n5y?L@idN<`ğHYQ(TBQYRBT3pYOdpOHS`6:I e-\v~3o,%w%?lG0=wlU7!EB!E88'goV^㿱|D4dH<śl{LTJ& e0[ʡCЄ50gHh]wtqy3N6MpQW>)tX`l#:ҫl>B~UܟHiI: ybi/~A^}w78M8䡍FQ<7^>0I!ÇjjtOdʡ$sF#MrY/)ڌu5yšQQ6Ɣf1hf,hmW7oK)xG er| )CosL4vbxljk"ӹ _P{85 }x=V|HפhpZ|inc5GXY,Ms;KH@GMt4HG#=7ӿG&ŰӴFaLT=L=4˳44sG9T;>8t}'HѤ=~|b+tMم<Д]xMk") ^w'mFo1yFYPLgYRy95Rmȍ %A`Lp8o5iR'S:%L\΅.fkPJ4T\ğ|c bT<'Nw}vr7O3+fgt(5ilc+;R-5 8gnQA7eկ{??~\_xvȗӯ/_}G*?+w]Ώ/v}sSbW.ԯfgxy.z7z_ﶗ^xkC\||͛#wF.P㬮;Yh`4G{_xʪטvy\׮joۻ>J Fp^T,j߳(ޥ}@8t}8ƫKڕP ^KJ6>8qeVߋK3T.k-} /zSad"/"<~Knu]vmymxbF`4wNA] t6nKW(+]zzܙXglԮ֨~xvب]+2bưŞ;)ozX~N=rs uGQ4- ,k]ZLHDv'뇞o.t)s{oF['MƑ.- .n1.[1}^ZXٱvtq'Vo5W7ƻ]\ݝ}<}=4|t0n;.۾1 tEZmG#pu.nxt6p~C:N\j0`$ڷZ!\^cwW. z\}5Kuz5K\,7K995w/^?]`m5y|Xx&RMU9 ̳W3{Ճy֘HG[v 佸׶d_U톉yX E}xz|R&*qԛlrsEu@!RFj@QYqhd1qfiw٨ W}vqbғjrv/ tvgFSwΝW&iq|?݁Zsc D15;s4;PPq=<;EwkxY/#Fjy40ʡ#y#K= ' $y?.b4&L4OP!yh,&o 7^L<@#u<1ѻ\U gr>aGM8>q57m]ހU+?w>-kҧb#O).}FW{gˡԿ/gH= ܳzԦh֌LI5wgL0nz'nTKui)N NG @nx!@sNzxU;82{R3SLgtQT6jɉҫu4(棦UGoyvFMZrXrk|]]/7^^宙ߎ#O|l &56^FTol4Rc?'5ALڒ04> yf|Q4wIDAD[ȉk1gqG4x& %00i{Pf)S!ݶSo_v.z>^F=s]׮5^ҘxվP#1˴D CS1ލg%TŸyboG4(D#=LtD=)Oj>tyyҚ}|4a(!u8}/W;v|Wrݿ_/g~ýflϱ5e~cYU5Xz=,\ZZ+ Q$sۈxmvAcD*Ո„D$؏`l)\yщ 1St,:F6 Yᤅ|p(! ȔЭ ̗iv5Wy\SB8m0'bBXrD,Job^1g#1 r}3 R :Ġ$0^F" lF_> Q >49v|P,xz1 hlEpF]lt"팩F~^y?#.Gi'hNF u7XzCoaЇ }Z>\Z[%HKtE:ZZPK-I'a5.`ݫ0Ha9vhb᪫,A; CqDp*8C-aECibm1Rx>n/NH ɐC1̴A9/ :sX\6@[JJ cd$miAJ712؟70 S6l/ B`N0 74C&ug጖]Ml--Cp 011D6nl5_6^mS{|w$bT@LHKkB'fG^pD1: #[>Jb8HfCh0D@ꞩVԋwDDx"^<Q/}TLa7~] ٺg @C7a(%mAMhåETF.-(0?,2F5xMLOKTM%4 <_370))uj W0\3Jc:hH{i :г%gnXH]xy?t{̱hU`R+pYjaS./BP>cTeS W`;*G:]0ty:䱞"w6Q<Zh4}:oV8z x4D)s'Fx ЃK8`ࢫ'|P89D99聏L؃Fb¨tq#'_8q(Ve&C TjbhCM/:V|+ 7"P1D/h&EBYlG q-CJur9\ rK:Lq =Sh:[)o ;jFBY8Ya-Uf³ANZ| '-xˇ1Źh_7궑ˊohTFFb gQ w+ =^(6( H#xqb$z6" z40&6TMZրA#cDxM?|6rV!hK a *ؒ -fOBm0@y ci+fPmf =^|1h|s?ijn*Y/ hT6h#<` }l>PBf h$2DwdX8ɀy NJDDTc"fG<71#K kE]Y0ul$^HBM7<x<{ه ^O{k(G0_p% kpM&]Y.Ҭ4k0HVYxm'Cn)Dxi +h$4j PohU$|ph?ijWXd×Yy/J;e(1P \ -`@!]M\@$!x#BX8T0~:_F0CŘ!pr x6C[-V]geBy.x_['[$BHn !yc:#R >EZ?\ $hƃ7&d#>D36hQljf!h٣1ZOtD `+<í*O҅2@1@<@B ܏{]0ά`*݂pbT>PT")Y:xlG(\".\ hE$"Qk})9EAQE9E|2_N0zdE"\UA#!RwLn$j$ [@B ʯú^=yb79 |,@OxVd/k} ##߳Btl.Vh$(c:C4PX c`~PG .~9[O" Q &< Y rh%M:Ǿ a/'x%\/bHT4I_ fփJ>I=W?W(NJ; wmvґ̢h(s *'\ #,a>ނxY(|" ZVBD4m m@+mh+&zM8yC-4bHT$tP_H +v|.c3#Z@Yx^PP fe&}B*LYN!FfᏫ>6&B8@I@2 6IˊhOFM\U$@#c7IjC׭϶ JVm~jI@y} '3tʫXa~ 6/Ď;62 =WV AֳG<gpR0 a) 7єLt_c%C 7P 8TomH V5mHA#&|LxEBm(vpFO!FenPL01deg<;ԉo+* <,<_5Xp\OСj[ !A4C0xyPD37py$\=0C<`x *rAd\VA# E7"GBJְaX09y}_.|}70= V#{? $:4!8CN^ 0pqbS83)|BHW &J`?/5`F.zїDWRxα [mG0ҵmPB[-NNouѤpC8XsBOY qẅ;جΣ߄wn0g7]sΞyxu&W`Mz|\O?_z&>ш} I2JWU0IVh g#21"LF4D#C7epO|Pa"#5K4 4D!㉈YMc`Lcz~{z|ܚks6 z^UIF"-r:/X\Ot0`43TXL[=Zc&0J~=W?]/p9\.ưNlXFBp'1febt8o %DSL5qYa9|t_jܼe_j@ttιK ijυHL%(gbUWu@'ЃWzXJt J|8) L4qyKl=r{bƇC谂8Q0-*dG<}LsZN74O|=_p+ң{ich;]0=Z>|80F39ϯ d 'qBp)n f) sY2= Da\@l_ cTTF) _\>9<8}tu gb0Ñ6q])̍BZZRLEQ)LTh<N҆ӁAn׌RA0ҊN*+o*x6 X+a":dcqy1'j!|Lza10kApHЭ٣py kGS3ӡ 5i#Mp%Bp>zh؍ d$b.T|Dp4£av^˓IOFݧd\YG#}1U*q&|%};@(OcY(&mߩ\t̡;^fA:7~y1a<(q'0=޴n>}3=׉he"_OZRdsIJR2@)42 41|G%d%G$g|8G#k0G֟}L1 ! "#XOe@49Kj|">\'&ӣSz z*2lG2q[|ʧ#o,p>p( igyY+@Ro؍߰K /ˋlk$T!O"=@|h#Y"c{ ? gW7*!%J|F<ۢ7;*/Nz#r H,K \^$1•IYq""=Q,=H>tVD-519e%S _=бswy_Xo)aBF 2AY5#Sm:(AO%%PG"Jpu|R'N(18muJ`ҭeAHAШ,G`Zv#XwDCX5HZcJcJ9%=|%R+JXdZI>' LJb;pޠ;RMA>U` V^}F'ҤVrY8k% L%U`<(L@Aϖ@')UJ>L8 :,5K4 ܀̐zֻpRR2-kʚY*'ޤ"||dh-v= ɇ%gdW9+I„+rI=)J%5ŭ\pih,JbUHόeMǷ1"/KҝpiIQ_I5IJWA#0|(l1%l1p4*Sh}VUZ% 87.YXPSHDwZ($^]',N( p'COiኌ`OK =%˿`է= JVG`cԷ_KҨ:Qf \ɠTEѺ@6J!J`~:om'2+ڈJ'#UDm&ӻo_*ӢiMD6DD%‰!Sի4&eeDKe36%J%/Y:Q6RNd#`l>֒d,RHVeznEHe%XW 칔Jz,:NNVU roK.T^b.t]:z6ߗIcJ-<$[VxեHl}yX]%"mFqz NTyR_i-TV_g .ς˓C#ɸpEeuf#FFmgՖq-r$^0[ ^^(*C^*K>\Z/yr`/utw˿K7t<Se R%6҄^r^{ٔuRU#6/E\Tb/өj2*2d&:4?KLZuK%/1}TC2\%ן̄ jIZ_eXkE_O%..}IF֗+c}U_ffmՖFY_m%/Kwe.!T,T( N:6֗h$}kkK\ZR6Qdd[JbRE5"I "NիE)Ĭ9N Ḃ*:3;(L" L*>^ Igd`Zot&.-Y9(إH^Y)6jdTVdC#IydfFdݬxz?^A^,(Y*' tNViςla݃JCO &&Qu(CBi2LG2 B#,4B#i(- WmʦxP4YC)*\U$౫*B*{%V=.Ȩ82Zμ*ImĐ$&%4XzK C,BzqF}lQE>驲2M쁵4˯i1|H^;@#/K 0| =37J|bf՛} \'۟H¡N%WuI<pR*-pl ò%U uJ%^J8 ̣ R g#%V.i]UKUdHUe#cRuYThQAâҧ!.>@Za൉%0j"vt䐨p< \>KK,P(i OҝV4EXU}@# 4zW@#Ipk$!¹ZB"D<I%D8)xENdo, U>V 7Z%RY8_ӭ73W1Iu൉U NR8uS"2bIĢ'~<ٮ&Ghx G]*]*]}Z4jsv1 aZ22]VJ"*ok+f.QhvIVJ)q_:^I2 Jn Q&$%p VneWTXF.HJ<+6rI mc1%RPJ4JWgNGU#١MDa&$&ŕg=z6g}>~zS< efv k&eW[:C-~3>}?iK,4'/,`^".&Z>Hs TOLXH񀉉h 3 Sgq1$Fk vy뼴_xd8ij-S;N;$lu'j|Lus4ѨpѴF#Mk4҄&#c8a'tz=$ c40g M{e2OV<7Hcra幙+Ms.#rrF83iT#=[Q5M|<_}=eә{if.gÙWgpjx2/2zբ&¨57KqIHrPFgTbeTQGsy ^; uLfJ#?lBXF"i=hn'`*sO?\4@R%F7 мxmn %Kf൉U֮yF/`T x"3)&iFlI$%K%Ug :kR yΤڳ&Wk3W4OrѨ{^u6z^m>ڂ|S 垧O&T&'|=grG7OZӁţ[ s;`4&rrtA#ݏAu;/ ;2X G^Z&sFC[qҹ!Wէ4tZ'+5'k>j2trecN?ޯ+&v??:M;/vNvim??l\(R /цtWO{Ey~t6ti ,?MaN?rn}t񰿿淪_esط?}z퇟_OTA.?->/ZέNqEW~\6y]X^ ');uxqѱ*n<ބ8p0~Wn2/:B+VtxsVj赽> \T>J\@+@yuN|k:3 He3^*g="G$t0ꌠy\L2S)qupRksJZz(󕋧 Q"ΎLy>|tس{8:=q/6ގWYAGlMg{99: ϗ/vgg>w+><7<4:дr1aZ4]BTGzWxLN 󞏧|!7,_O2࢑(Ve}%QO:5Fm948p|<lb]|L\ra\@V?_/z,ӸGIr.Gq即ku'm`M>R>rVn¨ϊTO|Y0}Ш\}rIOo:dz?8 }W^^+`9/لK>.3E]J7 =ttOu:nb.9[|w/lߦsTumqQnp:.09"zjӧ]6s_IH72[/$-^`p|}NIꪑnZ]4XWl=.;'\ݺ֑cQ.`$^0Z\e&˖o`:n 9B._~ y)au)K]p序,|9! _ξMriw7/st$1k.|CjCjg  'fzUuq5GՕӥǾ,@W c5\%?܏v?*x4'/O^z)SXҸ\\C]kLZ:5;exԂ;Uo5gQu^*nvn% hu{^; ^;댞xs˺谼P6/bn OK8;iqD*36'!|=`мnv8r~tùޑZ^nyA2ut/c^I͎f+8}/]-'?6G$꾣'=Ew?^V{{FuEOxz3u˝y;C`{0{{{6hon4UG+O㪭[fmoc=eusWU|+/ߧXC .S7>SW?tl?I#_}; U泺fyh`eNࢭ܎2 0S }ԙyuzIؗp}-&Gآv:PT.kztR}kT5[kp+|]U _%y:X{We܎w'}^Q^J`4P丼n1.ߺ#Rc0;Ǘ=/0reFהN)k5R.~U7h0J>(-H|L]`\ *7[767tYa7M[K9FUDOwж增nR+m%ON2?.rwY\Tv UnB˞⹕Fޭr-9nuXr5q`N 6G#-KC.KSD<5H 40ѦZJu,Mgy3C֋):4*c-_\8gM;LG8Zs 4rc` }'qk}q~ߏv&Tɲyo22%/_2ꌵ2ٳ9P@2seJʐ@%eHL5~٨Lp4iig9.xee.hJ+kk> nu`x6ŔK=1վxh=qڧjxY P>jG=.D&<e(G#tO<;繟9x( 6K0eJAnNk= I9V^cE;sv|k PJ\-mȡ[V660F"Vj㌰Wa%]F_|%8*Xz"XcZt tbVtLt%&z6 N+FB#A gDN-ƃ@X_/\ZB# D'4l%:7`C*R&\A>aJ6r h,5l]u-`c-zner֚rXǙuO̔n))OR pJ1}ψGScnwxύ8cT0Rg@bj*PK5sMFs Xm*AeЦ6x;HԐE#15}\i:yaK FB(h$Z`J[Acp<̣`.}L̻x_?G:hOYׯm`8m%-b:̼J64o!"Y)"Y.!,$2 .إ)PaU.q h5 -th!ngxbUbL3҉]$I HDma%ojQy&Z<7\U$W'"l:zi_$-$Õ˷ͨAΧpaH' o),hFK^5`:3^M0q b,22X ,l~K X/EQRz< iXXam~8KD02FZ( VDD10{1*ˋQ0*%dFnufG«tg 1,DK C, hT@ca>BW>,0+idU .ôn 7I }B_</З}GAe!xuh!yɩr{ejb5HM\H,`Fbcjt&r拓`6R`>gHC#Q.zL㒗()azbc.H\{O.N]D'eDŽ'x}n)l} 2^,Xexe#q_ x/:FV$! =>/NQ_DKQ65Ǫ|9&2t~C (@l_8P%&HLL4M  j|>Ba8Hh$b& Gh=%bt Kj|eD4u T͗Г^0y6¨zj˶++T| t&lb"OGBsh%l,ZѮPddBF Dh$P;V fNxLDf̄5smCF X4ߕ#~U <~U8rP}s^ /-#d Y90!* +V: ej5_7|y??fYbZBY>I1-@GϠ SH֛xB`<Hk̊xt[0u:LQ3%s{xJ=xPگ#-45:kᵍUF/spȁ&UJ" (\^[_#P>"z@H((XF"J8i%|Qtfz6?crFN8'^C g1q1Dx8 %Ng0&a<+qp.*@ֻg0(ۻJ"\^$W EKTUQzW,¤p+ \U o.,B}5\8;36wHUxEB Vb.h$˯xor^I!_ ^“Ȭ<̣$\2[NIc:dIfh귯~Jh )ܤ;)Ex~'Um@N\ ԸBEh ZT|E-D0^ l9m7/Ջ:yˌDhSx9ݧ2Mwxy)Y8~ ,h>:6X< ר5>\ )dg|`2hS6dُӏFwAp@{CbBz't\N)[6TpG(6]Ԉ(hSH6p *l<#/7<$ $ z P?Jx*?O;>P8hV (*Гkqb"H:1s%I_bߡ?Kt A.`e pI+~+Ep!'BKh ]Ӝ<y@LxuR^KZ*L$l1 *?\U*YQy:n:|D tZXa'3&{ hfMx h>„x!DhC_21D7 Itr!4yҧ`ylD ?"WGZx~bbV ab- C%`ϵp+OA'^lw!䠑01C39-hT(m) 28pY]MYi}POݴ-M7,!x!ODĀC11+kiv$3~m(DؠJ4*VoȐÚ"N8>Laބy}e>'3 rš+c0RN.''S4Zx&G),g 8TQ!:В\IlB[Sтcf.3S/SCddI.D$>h$n2h$D{c!fēc X3v?⧁rMJ&dB"=D0BU_Y |0a*VШ`%hEe [TQCx !ઢK -ol}=KxXA#DLLaԠNVtL~[=O_6Pu\l:XPs9ő|(eIW+O04rp4 C nsePIbz6{ LEh)¤mt CAU e"4hUs(| pLh&T</C b=| NmƑI^th$Q Wk9 d D VzȁCڜh6AV Rm}!vxNVʭpnP +{ h x1[|rB^ !/ aE2Itԍnl?`e^nå06zm Ȉy^-K8)*gH#f1E=29JCcTYpORFWh$2QnDF߰ɭYQ'L+-|A#!%!%‰Qhjoh.4PG4("TW4}LGk&85t $XRĮ 0M9'f#U.ZplWa sF܊&*ZњTp'*I[M-hSSXЄ6pY)9m9>`n5mnn<"ÿyv_zmʅ˜48HEjlTRfc:)s quD!./ Gl|ې*Ѩ1s$[9TM 623J .h$Lt}ZHxDa|Iط8_Į hFfy!>o<J W%ĂCE,zULbZTOCh65\К%C Pbo49e }1:W1{U:Fod18] ¸Ǯz]~!Ɔ kDAzᯨ?Z6&LnDrg4H дF%i'Wm)gˬdi0#ПJp:t>:X"t,: < aشS1mn0z~Ip Y xm&b X+ϨtR?.ꭇ|:?/'''-%K W- T-jF@PUt./{"CȇOoNG2 }(- l1)>8~7͏wdSH&SLv.`z!4f]xkGA1-,MB_2:4PhL+(w 9&r, Y7 јP:U!7fU`=f5-*TϣI fPF XS0솛)C;kg0/16cVL-4r:0 V15\ۼ\>yDC*KߢBx*i#<>jU dyE-c<7sIQt(Kp" оx<7I[qHpPFUc+FyW)1c=x^*ⳃ"=x4=4qyQ0$O!z>Ogg'?@Z47x-{4SV G치F?$ z €voh\TEW,iwMc}8*{h =6UvE>G`Ϫ W%mkU,I,"ii){^UC`H5ӑ ˊ|( h$YMڪ":qzRHL;~Ge5$dxd-'q2ڨ"NRVҥYI.Y,=E.TIR,485hV,D I5 %yKdJ 'UdmL1* #AU`>h$FRTE<+FYfdgFZoP1g"4K.DkWE zOr+!gJY`/$\RcђOJ% tL Q:\.tA#4aHsh2hZ@äb II,_ |/~-YpdU:A)<=jRD*Id~AIhK*SZJNW풏'2V.,[)R,UhyK>0j0( /NHGVY|΁G b Ij\^$aH&=IZ&\^XF݊5q%R.PV1P3PE#IgSǾ/w3%~lZQ6VZdo_UA؟\|!@J$3#$r^ "[ FH"e%RkMẄ́K36Ě)_4Sk&*(}RM8\9;hIGHzZ}b1-,EY7dW\IT)fPDHe$mIN_Q#*5ϨRb`cEqWC+{N$G+m^Wl$6Uo%Jv~3ڪEHjQ$j*vZK)F l,2[:XZJ`3RH"QD[ >JE4D2*P멓7M?:tx6SPe}*AŬ.*橭K:#]{)^7+r*kSP%Y+eh&R8E^`ZUDW"Cl}$Su%"=]x3JZ<+B,wC'͐,]"ѕ-)ò:lbJȪmVCBbl)y6)ǒ/-в-ђ'4nYdˏx? pӠ^_Nx`3x'&aK峗lEW|tV|W#ŷ}1k`$q9.a?C#ɵ.J^ˇpǺɺ-\8l*b>U݆+IekmUuk۰ ɴkqeFK[ (06ء n}Lä%H $RK+0JȚ H+}pn^f!>eSZ߯2ZEY:) 5JlFڋlFLxcj煥t ?~R$5-+U:96OLx*I)J*W t@~/^UWeNaEHF%Re;UdcQE6P<CZU $(+&XQF*SVLɷZF}n(/ɵY8Y=z.?RˇT n%=mT!Bj/ʷKJ08W  t,)?Z/Ik?\hzIіY嫗 W&q UxZeuqxb\<ɽ xmtvMHn4-m^TyXtIǥ.^*aq:Vwsł/8ªگsmԞ4⬖nm/KBwx$!ޒ|'IHd`%T_D?ZJ/qtV}D¨/+Hz[f==29\Tz$IK{(UϡQs`zzT`t%$開% t,8SZnђwXwXV{Nv^j-Fr$r]Ä-uRZ˥\.C,öIeq"T(wଯ6]Rl?WNׅ .| átD\t"nF҆ SgbquJDϖwW2zN,1Ֆh$5NZ3%>"Me-T e Ujb{u'&%FRh$u9HY0.-19X#&iikGxS82LHR.å%20\Z $T+}{2IN?'~#>R =[,xVMF_h$EFRZꭺҍKR ZmwY`YZz [XE"+,**D:4EVt,07&ЊVQVvUj0U`VUqR\;+$X*k0\,#}-9h.7v: W9rpuµ3YFqNU(OpyI|$zeD%L4IꙅL t!2R7tnnQR7r%yfCXݤ #HMuC{iE%bId{WL05LW1%*fpii4vhTV~[P)ce@i50yj`F7V+b]{YtOʃ|^ A>{\^_)ZUOĒ=W@R KR+W&ka?vKLV'#C_in6]|X:X^D(ot5"se7ẅp`ÀeTV /(ĵ㒅hSIH\8pg ~ςt Dp$6/L`MRx{.Z.XY $恟醝'fN46~>?40HpDWB FB  C=3rhO4졏jn=B>Ia!"3L|81YI1a߲c9Qe xT`GE| -oσINLxnQ jp㡄Q%JlLp>_oߦLp/*gA.'/6~ NPtB>1a{XxI7_,d8d8c8 nZp"z[!U Y bCHTd@Amdn/_#*Ht./I^;oJhRzbt:  :сFE2"&E>^!EzL|HbPNBn9"#z|SlS*G2nd:YBwAx^k p4h0s?ic@kَk('Qi|c5iyNwOsҤ䴙Ҹ2K\ d\ZC8 Lu-N2gvZ[Sqy>|  ^ȳ\)47lSyRdq~5˴}zOo˷o*9?=R}~)|}>vx"yO)0?+~zB=Ms*ngʭ_c6Kfկq:v֗~w9;vl}/G_W׏t?vY/XewxyTx/e<·lq?z[r^-D!phuzq_TܔªuհdQZyŬN򶟭YZwtV鴛/ʿn[KV_Vcz,/+~.ʿ8/-<<6cr籽<<oiOǿF?]^F(t@OLw?tNiOiOô7n ï_[q<ϧ~<_wᗟ|S_1]r.}t?Na~܏4~i>OrYN޾_9'y/?˗r凟0o)wן.o}럿MFS_wǷ5<ן#u*<׹??\-v7:& Je90-LY~t%ݯ^_޾Gr돿o,zLBy~u_/Zm:<\7~k4ְJkx&ccK S?~ߞlHqn+:{s{Sݏ_8=~6~?ϢZNLdNcpwӕE2ϹIp<.-CjC_*m=m}?u?ߧOoy?/sWr_2yo1NgNx,z-k<>߯h)}m?)e>mgendstream endobj 106 0 obj << /Filter /FlateDecode /Length 12469 >> stream x}K^qe"ڷU#,B!7vI/8=(i[ϗQ 6w.VʦoMm,9l$}b_GZ zY0(Z4Jxvvfy& l#@lAX5=3m.gM"6P"rH˙:P%#z5܎Cc3T 2mۧ^k=a3wLx%# vR- =śɭKLbXgT}3^x\sX;]jx; 9dgQ6<ދ#z5܎cK%i~IȴғL>=V5Վ5 .[+.lq` x;C0ߎ˜3vr"V}/Mؤ=S ,m=nq]s8ӥH $/tiCi^Dep;FRV_.&g-|l33SilH.GVϽVVb#'ڈlE~iCi˨v[T*ySb8i({ 'j0 f l@i.Dbp;&lvR0)[UVuՊڮ9*YCJb"G`Жن(ɨf8 Ɓ[z )PP0YD+E9:hk4aiaݙ'SUKB(pKOI%z0ILHڦT04Lf!].p:}flb$y@oK^6Kfs$YKjZgsQ0Pq -Kw6j/SnCb0}Tc*iIb:%2dpƣrKHmÉAiS$8l$dBH(Z~f &А5 LkR_&n-kC&>4͆T@b*>R2pp+%큘%934O35e*Lޒ$ۀZ%9ۊg(R^y T{@ٹ+;S.d,J; _B!5D ز2SR C6-OuC]1Siivyr1^:J. 2Ӫ1Jl$"QM,PgGHCxeLHcYɫ 0|.K֭&qSq1,G_ ilu<6-l\S֭˶Mdނi@czPЕc}DK*sXP#TgYf b j=h45$\i+aȤ~D(-râ )6{3ݛwVe&j68j&]LSRÎݨovn3Rf6!m4XD,3Lf l!Hr}^=DB㮝%ҨaQ;rc6Sf!,ݎVP=( ÑFIDqq=TG-ngфh{w;#:yN'7RucuD՘jnjhu6+-fjqtn: N2Z&Ge:*s+Y(b'"n< >p{Zdªn 3 T?dt@`e80tS[?~tE=(w6s6 o"ڲqZfpwu\[~˦[O0e3`9rwwM9y5WX]-n&}XJ;fou15ڄi=$eЧ,:ruu_\s];v`\ε=;Ńevw?qlZnrEx˜ {xp3d%&O3Ǥ5xְɝFQC[>ڈ4Jgep;^MerA`{K/LySh&F-B@"6Pb#R5/M0}wڋByhMf;ӳ.YXz=Z`~r3ـWt!rDU ;.ON˙FG`Jk@@YC]ن(˨vMrAd В9h?nDO?AgYځk` G]L}*vF nǡѩ:*1>+lwwWPmϴ 9\QN DYA%lCi-z9v/ҟ˵hm#] OEdFOB9+QCK#l,Z Ob^nY!mF. ?q+xTCb^sR';p`gq[݀(]^ 4%]wrc?D5WqAzUX4"GWH p$s5lCi^xWp;:trAav@r)ePgQFY9H p[S*txًn5?`c^.Hji]nJs燧fkd^2o\*@@LT RGFC>F:_QlW{+";-J =.pU= l\;J:P|{o{麒#sDHqi7Za7 XrJgGL4w ҂ 2Dφa!URz `%{N~[gC<9H ]\I6<ދck6}LY)Ӗr7E9􈖝#`v ;6X‘A҆(˨vOt"g`tq"g`CΓB6`|9]y H.,]DQyHiK. $^/ЋRzMnfZ /ݦ Z{"C`8 '2Yr]"hM&zmʋ]2E ʇ >~ ^dݢ/E*"{*gUצDj.$~A"$VIdMx`N$×U,kwΒ#ه>x[NO7Ȑ'' K+-M wMۢAIWoLa\#99A!<L䎕n>ϤCy$k, W8ή}!a*eBM9I4jSRP AMHסjTMsoWO/C/c>,dȳߛ 7aW\Ȫe.rƫ>C:rAjمgCʐt!DjƇﻑqw!|݅lrMDnGje U1|܎h \ϋY|R>nU"Pd5 w8nw =@6*А<.2'N/+4A8pr!#qwJA4 2L̛3R5DZmȠkHCh(9Q8\o^فA&ZQܫ')Oy^HgqDKJ?ݝ]CfN?X`ҽz _κjp 3Mqju(t5t:[P֥ Q"z9Q zL2 /63lTAK4i's.=,/i^NҎY>˛^>Dbp3:;ނuLd0蔔_T YgY1h5DZm<ݝxg 6vq˨v"HYzSF:?sUo2853N:OK_K V,/L~iCiRck6xcQṡWDl9%dn&rgg2_][< Ӄa*y r М"ss Td0@Ʀ"㌁aoO"Vr9ĉ,"W,ΖV{`AENEWz9$dn.2gqX ,2pDjM781D&#O 0b8'53,[Yt"@+*!ttdλ9EGnMGg84t#w[|$![i9z0e q -+6Y|dy=j>rwd8Y7p|gH)57LD|d0|! <`( 6#W՚q{KȜZm|he\?| !"QA=լe46:R6U!Io<\Ϣ#,iU "|(|s270jT RYlj$,PRGЩdDV9zND\ZPG"kg0[Spk7Lh"DiYN}8VL.y@J{)qA;ђ9u!}35 *CHF֜/|dd022Ovw 3 Hv22("ũY'$wOFng-!OKGZT:286U}G3| D.<5D%sqk{w{󍷋{/.kw{NxDw?&[K9oߺKDchs@iy z1,6>wlb.gH~dWof?ݝm^Ttؽ\P\f6v^z3&d*WCnH9xmG&WY9Q8kn/'OI?u'I=+4T|xDd h$+ ;GtZ5|>'+~S\eq N8l# J̰3}9k` !|Y|lӤ*;:+i!#'* R"QHkW'ͯuɡsTQ|Ȏt>sE4_|z|zDW^+Y\dSWsIFr!Ps Y7_ #ԣa<\/1Rit+rӏù Yۏ,?Ӻ#a)q/n)D5z,"mYlLW3"C\nyAOz.2*M .WTT]z9e43ںSx;=CIo̐pXnKYބ%͖nd%.=hӎp̬"dMtIEE tHbAi|G gV1rZ!:-Ñ!|Jtx#֍kإ@6=NP uWK?YӒZ$2)+ˡ5G; E,W--wǭeIEů=VF!C! rG/p )ENlIcTqwkFh\sxӓHXt#k-m~hndRLXUI -͠}Yˀ9ug*|{NeIY/e^$&"F:{ n'UA|tLӯw1zֻt*;a#{pԧ Y4므ЅC9!;O;|el)+L9Y0I#7uݠ˄<-z--mҽ/*;1Muwb>^Zr7M ݇TA&tapwc6)M2yC`88VXClj y>S@d: y۔krOE-s%GIc骿@W o}BZOT4g"@zKSi NEM+3PtewB&$=0ݚ#zQ.3ФE;Jmh:ފJsǛ F,Mvw+P⻴?{%~_41"ө|<@q,+'tvݤʥ,q5ip]GYL_صUhW8tq_v*^n֤i5C8d[iWr+X{CO!"4.=ʥKedlwEl{KM.]ol0԰+b@Ng鷮mrOVa>ۡ\|w_F/|I~?k*!G~Ĺ?kdC8r{x-=X}gÛW%^oY3yzFMk4m03o^>ES =|K71x7jo޽I~ xk̇˸S}X4t7. f}o>W!Qo7o[r=ӧ?lt-V^llVo߼se+򫷶e=kRf]* 0K5^"'kٿP":}Y75=!&)_/7o?t?Qw-u;V16әoF7틥Ś .?|S3^8oUj6,r;o>k S{A`^{᪌uU@]d3 o=d摢ϴg?~;|c(Dz0>fĠZIup%oW\Msm 2K{ `n?Snu_~Hع7*yV>L|յM_FeI9Rrжw_a>ھl_75&l򕰶M"g<0ɼOo߿p/ۣɄ+i$5&>x[?||Tb9W6_ ||N|($ Il3|hkO;O+BȗdkHKc}~~iOɔΥASrd_*kOS޽y(ߜo/Ӷ8xFl5ৗ_iqS;(ݷ4߆hǑû*߼́ K㺾{>f#>º?|uvK(1Z >hÓK>w5 5wv"iyRV!.ͽ jfY+hUg_TA$[F*>hwˣ36.:`'9 ÷_m-:%8֍0x>Lmo?;SuJv߿7[1O![ỷ=mŇuB dV-o$%t^w~_vMJ??ΖH)ZRxl1wcn8]Cݭrvk?0WXcO7v Fmƭ+ힼf} sYugW+4v(s1]<0>TG p6L1qg_|;3w95{jOwK'v\?Sqj%&$wL&Z1%&dÿ闯/)~g]Y˻}zTc=xg!kj7/Cfm׿Ɋ1uGN&~mWC>qPu125@endstream endobj 107 0 obj << /Filter /FlateDecode /Length 5380 >> stream x]MƑ(責$$S݃Z`@r{pyՋu%ʈL2Ȉk Ðg"edU]㡩ݡK}uaM8cӟ7;<^4鏷\]w~8Mtzwqnjpz:^Ee9~к3ۋǾBbo/4u8i8<OpD'ںkK=)PjK=ɨz *?)PVzpwx:0# E;Aq@D=N9 abcӞ](T]}΍M?TALzqjC3O: ꢃq;e]ː,UGa^~)k(qoH4SFP8c#Xy|<@ @YEHP2BH.Y! DBgI D:Dց<\cehIvͬ[BڭC'xp.  :%l1Ș $fBÏ"@aH^vL'$i&/P\qf`4QX~j#^!B/0Wzj'M!Aež!BW$"$DL2f p?8H4Bڀ3J_*S%ka-B $y;q4-PfT E ]FvRAg)0UYdtC,2D,M E 5 n3fNd3),pW!18{uڳfdH瘉(# l܅c+vc8Ţ˔xGne8V27 Z4y֣~$zu\h5<)h4gڌf_nCrkb\c6&Q~ >fm4"LF!hxvdmp֯c$名fBFc:5d4b/])x~"F#a[e%FQdo-iQdM{O߯fE`w2 (h~rp {@M.#΢ONRh4ƞd5v5@`$02(YU|1ɘ\F h?{<. \C@甌B&a "(فA0g@{ߙLL@;فL ޠX?(Ȯ!Dd瑍Bhx0 82`D+m򝂕J~u_#~ۇ~㘽:FR6OHʭ /YJĆGֶAyKO']jWһ7O:_uzHr@`xuo|'<@M8jh3`vI"hSeĞ,V,DQbu0}II % #]h")Q bpgk%R$Kd,r50eS+a5VX6v%ZgUhD0 Z;@ x)>h">>+ȁ'ZړrŤpjWߜ5gaycNj^I4Y(2{P*jF<$$$|D셁8v\9AS)i@`ZDX^" H(׷*iӇV=/IvN(aؤ" B5 `W7wk_*a:1 M{(|v } g z4u'Dj 8c5q";Q@x5QL"&L77|FmSc䬆og?D *x/\HU| RY_ !M5Sv|dmהO@Xd/˸OJw~o*(|@~JOV4ƄJO)@'16CHRPdjN}_ғʃ5 Tz@ˆԊ(X h’P5us&B:ڡ=\]LJ.?t`9mn o=[ [q)>L˕4rTb䰺AVaukY^ ~9^_SW|u~tzy[sz/^n>A,|t|zH0T3`װE5ùuh^nu^/]lqyaehFoCtx5M;Vѝc%>ao,T#6/S0xb vo1R4Stsyy{8==`){X!cg7W}%h4{z>ƿv]}3 ^FQu_ӗc@z=~o272EA=}s%։W3_߽9zr8S ΢0[lޞ>ߟ4.?~T;c{hxXvgV jOB[ʍ{*i3ߔ8[q5^QSV;6ZιL&!I}VO6Xw" _Y~@NJr9r{"Hip3!iNnFkr{mbEHl\~UѦcf \[ZK֟!dykM z m5,ui{*ҌY*չ>=bz>=ޜ{' Fؒmv{ȡb(~eZ`G_uTͪht ұ&0)tnsgwWendstream endobj 108 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2502 >> stream xyPW{b&&n&ɮIRcL `Fd``.`0p( IT&&VWa*')7VuuU{,2p8ѩS^ZÒТb.d2gfS`,FV<=DZg/זJ%yeI%yel1 K9r SiE{_ŰMf,Kұ-l-{ [m^6b X"-1bc8&bc{-29r2jYy߃x^=gؼ{K'0,E9:r8,`bo? %h=BwנXf>,b:)'tOcg«p jZIW fJ,/.PÕ0~4FK#>/̤CƳ܁jt5eszK-"B+FA%Tb!i޶d>bHuHE¦[aHy6~iM#2TlON?A&n(#.N`hsg zsHj ieE>@x쟍 x~lU6&4J̯ni{v&n-h<}u z|&jЎۀD+LHMr(sT4l^?'QȨ(IY9Eca}>ݪ#)(>-b[)G':$͚ ˀ(,9Z_QG)k)-2u]ZʺUf/Z{PI ^꺱{&Y8KfX5N4<72Cha*MZ!f@,rK[R/i +x v^lRVmxIN7Q@ι;ƽZ+xM7^*$ a(}$3= #{g&3B( 6x[ll*a#f6PBy\p6C JP@ a 6 U8UgemR+Wߍ;|W>ZF2/kq6ufAq;IΖ>Rc1Bu kݬuvBFVFf VޝRnLMƿVzw_츨#ߝ@ZΟNMad|f. gsԃy9DT2>o&o&#Xy(8҃3NJ\APV1H&&3gg Ó`_TV 4spaP\DH 6 {_a԰WޗPwN}gj( fu\_&Q g8N=?(yf3(=v[̓3VkHQ KaKl1VcB?l9~-#Ķ = v @j*W{Vߤj/'f3eYf@xNMqfW LiT~d1akqWI T 4s Gh*"p"!2 Xt`-v>3[Sp/yAxg*PZn%op\>^E}wMX[]Z\2hAv+?g:q =zƃiIY{2\,CSbd(IA(gXczpj`{]n>|vB_[7N7%[i%@aգh̆lM N*e_ 7i ki CUxh@Uf;oUJX,a[φqh!}5 cv8͘Gh 7ք3endstream endobj 109 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 848 >> stream x]}hur[Wtݯ0VDT"uZ-?Jա-4k5wb4}.i.mzI6%\&,i9&:|  /rf C<~J(w6L{N@p)B!XȗCe)TeTCݷ;> stream xVyTSW~!ޕRX{:.tXUbEb.e{7 @ؓ@@*XVcq3=jutl{n8s:/c;{{Ĕ B L]"9aE//#BS&&P! B9+UYY riw -]Pfl+Zstђ7 G\b!brbH 41xxGGPDO}*oNI2,I&S ,XDL97Ň}. mQzUͯʁP)Y-6')ܡr(*[: 2TSQ*՗܆8!ڰ ZLmYsNW8tKsף=bu` S|hۿU8!Lje-TW)yNA,Ȓw{dHS}l8Г! ASDB\I6^lX`Uv)[b, uqCzփOr~B4 4C>6 &˺nccyLIvwѻe V[ 3HeA>8`vVԤPp.m\ !C6ekQy ~ X:6V2)JyHF22^hH[Q*`9WA>H Nԡ^vX!Rvܐ6j N!a8v6uWFE[h%r -|FK hyd qbaԳ+k$Pz߰۫k԰V;yTNQC^ssލI^Cg̩]+RƏ)|7R#֪V]ėqeoSi~9<{s=xW_AQOXO+k7#Knd3mvtf e,HKIYpG)8 K<~޵ޗ R"SfPzYN_y}LmAJ89 j)4MO![XF,ŨuJ^ů4f̎-6w)2}_0rqx iIo%SXT Rs{07ɻ]^/-tEL&ѓSB-TOl=(2S2m3IR~.<@ aOu2e%Jk~ZS;d&)]}YT@nSu ! &$Dj$sD{Y7ߦqT3>S4J&_"k|ěP]G+*08"0e1瀼ym~:[)R%2(qQviz:cK_^GO\Gތv|,4_WRu:#, 4?AvhޑTt(2RĉcOr8W0r;stos[{C _@읜 ;p}j^=wL!遑ԖC 5$@tv֔b5I粙ݥrI#g*VCxaDܿoFgx 0?cک4d^M32F9^pUf 1G»(hގ}VHM4A,*R ^ws=I8z Nsq^VuSfB/xdn߱> stream xmWy\SWھ!$Z-V"tnnmp(be @ vY!!,Q\qZ֥vqZuC=awfr},o/bZ8bn`ϛ/l5nd-a1֗+c!b1fdgeN\6qqzJظ%ASҗdeKbV c%ߑ!u7 7[o"B%0"@L'6D$D!RbxXA#bKxG#Ÿ/GD:q{y}ǮfCo72~r:yZ@FiG ߏ3eLԘ/.{qgulخǑ㔾}f!|~ = N7}F ѷ{kx&bmUW$};X5..}>FsӽST`XCƙӑ/-$9S!Ne\X )6#yhLѤ-;3x Lqf|T9B!ZJJn(03fSyd=K}/W‘x D&Z U j>!;=o\q$(J([I688d|5 ٽO)Z5l _S3#.3ଭn? fIvED 6HDb@ƀkuzP#o],?{塋'qKB^ ^.OMAD=jv q1ua5:0Üϵ6`/o?iS:\h&&ATR+!D\)Ϥ4\D .dLL_C7 >G߄3ݳyv@M$h4Z'B!++;:ƾGGsqȼLIvP?Dy6iZTS+a(7\)r%C~Ux$u=Cj߻&rZQQ<+=|ʬT˓Y*.n1(L 16XsKp?.KP m  jyYaB)x'xa;A)I;(xgwHf ,Z`C#{&yE1&uqH)5t[d J 5`ٻB QN|?p9?NÀju PU$ Y$MK >_%*:Od #$"^~HN۵v 4ܵ pKmKR 1/]`g LYRٛ7-_AJ8 kkSZ%ءZr xj#[wyL*sD5D)^^XѱMз ` 6RdZo؟wZptwnRcT2 b>cFelL X#l}Tt l<˭1VTCbC43< y ,&#PX7 sWvFgM%9JQm 6̃9}`/eLmݻlN-3>`R.8K0; <&t.D}o;Y0y| }kG[q,ܶ9dxq#cҊDQp7aqGj` ?HH^Vfq2HqӣJcA n&H"?4OD҇[߅A.U0&Rm)H50R[UsEX,ySIC~pmm>PsMt= /ԝQM8D+dő#Bći[e(zӵ]$SyU-?jܠ)d][;}Ƿ nɀ}\H5f(+2ZPR(Y)k-zy`ACijAB@|2JNDg:b;h1X&#k '&\G_U#Syo+V=GP"`ƝftuR.L4׎C1Wj +ZeSyZ3s9}hort7vho7M;Mj dFŝi)ڪg\b}x2Qw \( *9, \S ~ q8à<۞-8y:x,{W[>bBQJC`<'[]!b S]{/s SƟ:"'t;{[;:{[gqINȟYgǺy׏XnPX22R_R0WHw5KCs>:#S7V"4bIGRp7%;9zsW ۿ{htW;;#њfr͆\R_xr&aZ޷7xЎFM‹pϮ5UyNb忂&"/4aṛ ^堫>K}`A!ӱSlMLΐļS/'' Eͅ |*TV]=zk ,TTZ )gcI8T ̀RsˀZŹsRfRT5U[k.٩!<lD@(ܑrz"~=q ޯ{t\i]:͒MVH{)͙]o>\[72VHDӁ}铖' yak0:4$/6{^cȥ%72NKJ9G[1j y)H}j6bf4"&QA'A&sNMc}CNL>\YYi=BU`n)5Gܖ/?mG߆-^bN|h88āp릃iҏ)Ipz8m=KV^b.1Rӎ{??eSxqRl!kϦQhmth4J-JVȍ7/^_4hIP1׵8)/f3GeƦ3jJHiRZq6.Q|v8|f;}CYx͊c~/Łg~,,$qErJEђ5!I"Jٕk'1^#8 ghB צÀ'O po \`!HyR֩uh-&AJ䵚)vZV6px41M=endstream endobj 112 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8728 >> stream xyxWcPB($H !Ѝ7ۀmYeKrS/.KmbB IH$<{wolR|oIys=({7"**YK_7n󟡑A"1w4=4xױF8nQQ6#3#K"" YIOo1w`Y3ʙ;G4W_seOq삧{rply/UqKrp/6p`ZOx3xК!螝ա=w k}x៽0kDGſM{0\D56r&Rc VwqhuU zד]ĔT$a]X9yD_-] G/#{" zVMGo,Ao|m~QQn6m:~:ǁ0}R:^`독Ϳ7_coKɦZՓ3Mxp6}33F䵶/?瘵d3m4$A!wʒu`!XI@~5)QmnP lQ)bh jc r8IP| YRUB=qaonTLMMڴN5$I*sC}8\D |k[WvQfᴻ@+7l זBvGH'k[TBgee*R,pҡC(VpIԉA)Ua$ҟN1ʄIz\z]8LiSer3PUWoPɴd읁NR Iػ$Sޠgї8i2B3(b 4<ZH-dNEÙoKOIx(¬TG F֘$ua8(,Xg(su`Or' 9Ӫ.zokX\:x7S&CQtC|n 7?`3'ҝq#h\ qS Q 5o;N#JMKu. 8xXWeG畼^7pA̶ !UMaH33"4u9M2a|Ė`uuO?Q)|SLeq<;ϳBH`mBa`eUYC_:^=M(8\nz4埳UlE`q%'Ee5&̈iDdiaݗd h7TK, AX!ı/o\3<@js5fA$ *ʄ"mQzgF=Q]%E&9ҳKw ;l<)ժ ʊE+V,WҦ_4Wba+;&@P2l{ihM6JOdٿ\Pa5WYp=XYI߃5"I$c_31{l'kqQ*H"pY沩+-&7NZҬ&*em%VrZS0Vwyaѹt|0S=^,}RDY]챹Y"$|B^,wg?]j:T_=tОk6>"/)hBtƏ8v{Z̧yzuewR8.VO\# .5#j>aֆq1~vSVJ}%tIiIqtRȵ E"M|䙥|R^{ݪbd*tXm Y*\^,>Ys)q/gjTR1jFU, A5wU - GC[?bv 3{2`vXX5rbiH^ GF)c0=Ez 2 JNuD-}S11ϰ :Րz Q }4"Ah7{LͫuF'Vo(OًFP7ک*`2I#VJTjx ZU (V,0_jmf]oO5\mW|_mۉ'XSS(ie:9-=+cv'%(Z>Ͽ2C=xBQ~ ha06@dŅ ʪ 5xRyb܀4C1!\8z%D[v7f ήRd^N! ݇T >a7bvESw6cqRa%%h7bxEn3V9ⶋ=d -vQ)`b\ W"g^a~|M/uua?tdAY2FieY5+S`:U&YN]quj4k4zeXWbnNd "lݤFnp{}~PNV5*;K2%_LЖKaw!{x_pG=#pC/ }t<6sJIpU%5@@NF$TevFZl=]T\6@G6~`fp]dRݓRuiAJ?%Y[ߵ7:.2{#*,+J`_4FsJg! MG%/wKk!mPVMp#tlJ94'ܰFP^yp2Wsnc'I>z{s7uA|mwL Rm" lq 8H3}8$dAžYZv7%Zc>fe^j,hGJSX×+ raC? F_qS۬T!"ij7 YaƑǶ_<.^N쪂@meqf{b `{-?wl%%(|Ǽ7n .Y=yJ_V#CEr%ٚRV~l!Ƭ tc!g*:yyKMG.~@ 霯|7H!N8ߢ^'gO _wQ[}j=κ=hM1br5>4b^[կQ-_9F:ҋ\%MA"(ԅjza Ǿo0 vA~4.9x\4pή> {ڛo4 S+`7CW e<ԐMya4:RELb+7\[?P#FޟUiueNj3Rk!Ro /gr<&7$=:ZiTkx(X4:p;=6`ߞ;q+͍$7|jvliXΫTj^TӳrD9Ky}:"'y17DF{M!nֽ֫ Bu 1IIڭ2܊GgSl;X_n mTL3Hasp%mAdsYBv> w*^iqa -Os\2 %z)F0#|A+[([[.6 +޻sޚ'KY":#[!"9O0q]GᮦBvHĻ0O1B@5mrW;Tݧt3i%2!3()Lv ~arcA@$lM!r0rl#RѫX2wՐ5 `J؋Bj, :GcQVeqcij)uA݈ދx,UcӸXTk; O30dg+Lrp@fMZƨU K-I@\U2KYԬܮhI6ކb #: r~ʚY+2bѧLRq3%w]ҝ&flx"IjqX1x4c\(Ɣcػo.[WJZxbiO]X9}SgRQM'~ϾߺݶRӎi A%AY2(tnh8u- ۹~ދ<nU`z\I&h ̀0E^`*T6fut Y.e$S.yQFscPy\ ֬Z.a߇|;I(2> 3Mk0Var.*;+7/'gOMYoK`"Apa1BzAnQN`=H*OgYuf, uAOIn5uTf<ȧF/WJ)T 0?XpAVDd.낽Eϙ\?"pҬJCpƍzF4xGuNQŻ^H>[?~o rC0=s(<9&g dUY'ήԆ*+'7F%L= >A`z-^ŸOQOa X'hQ/DLC=x@8r\3Gh' %a!e<ZVXVX:}ӛlC1Y*RTϳjՠ`4[U~\Wӎv 7 "5; X1s=m0R]5͔cvr-s`wzڻ_?c+l^a߳lcZl͎#mȭC7f3x؅wS̜/^a`u@܉M5'[6 uo0s/#&F.}'3-5wHI:*5 j2sŅ9ZENʿ}qnAƿ9o~6df DS<ds&95^hua;]* ]DőiL}Ǿ "9X9!%CuaVRc_6zD7OG9wf~M?8v=]ɱoXc Jo}~//ӻN%dr3RkBev^' z2GbuT m}8BVBbbOJ-?"7s96c-ZOJUfW33d.e'bQLt[uzƩsfr7nCN;QGW,9C˓`V|<ciYoQcOuXu^ibZ'ڝGrq8qcL83[+-u|r醔@LµNqOԎқ'ys*y mX+rI/?g^# XOutlҜX yr0p Xt /;I?uWȀS +Tw1ɑ'L9ؒ0ȌLPQjhw:JVhפ3sUYYW,½ÕaYb5:9@01dp$E$Ʊoia"F=&>8E[Ɂ슼ͩlޠ2RCT1S ({=GæA@I᎟d[u5jE'AWh>bdz,?<؋3ZiCTendstream endobj 113 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7618 >> stream xyxT7El ")i ig2kz%$A E)2Q@({{'efo}}GE-hѣcƌ3&dx=6Ro)njJB/cD|s\74&!XW2 4F'ȱ78CxSd2XZ֊s| l. )DWD6n ,rpsx)KLTG ow=`Fd*Q+]pE9]S֒^IPd=nFh_APDCscYn-)bqP{._S2/HT7bjzk?tE\jw<+/%%JXWYhqu@Ėfv[,V)Ie"#ù~\y. |kO֭,Bga0p 'fSK̝[vъtw,Q[w9)D,Gxqչ2 <1l:G4Tb6ZMHhCU3bQ& ] mL*5V0n0Z<TFMF9K̵A ssK-I.@q^GWy[fmnN$ jqݟr鱀~UVKeE.? G,1Mp$"P/t;C7,_/J%-] kf.(_f< ~ACqW~ek=)ْUx&,5"v>*GE࿚"|T-IWE̋"'@b4XE,}E7$h]A҃(b;y۪hq}\4[gjwY==6/Z}epZEYٳdBHԩM̆P{ s}qOa|~Db4):D[0\YTY/Od!ٛT&W"fnz,3IG;[4=H&x-f<`F@J$֎,6Px=|J;8&{σ9hDi}r%̀In,7+:MAY w$6onr4(CG1>j8 K.SR{ RTV lp]x^x2\MH䆪(gum1{.gk aUj]uP[Z(Z"hO@"M%> ])cyȄ R*gk_uH&M*)̤:!V(yH&C*«4|hLLQ>u!庁PI2}@!}G >Ao5 Y̾)L3AҮP:u\ӞZR.Qk0}g Q/.dB0xU-,)$^vVsŅy}p/t;Q#Xe-s=qc0;Ԏ mM6* ao*%` bŢIG "!gjX^_*SiW.F d G쉸 a]Y'  )u ϋ6 ٷO &mW?q;klvHـA&6&_8IKTA,r$b[itϢY$fj.jxqqfUJO4q;h(I3k7|f6;;!uKmM)ݼKh?}$X;1*VC^FTmZ E-VQ6 !o`ӖnHŒָ6f(KNmL}A3%,r,ƢIvbQmʄuAғG^_ӅMTlI:ZT- :sR@Ԋ S+t%~tt,uB/Y1&&M{1"s@i֨q&ӏAу Yb@DL"BU&BrϺ!&q[s%=tJܧHNt^ᒱi:cBĎ[K ZZ2k/I&< n[Fh]R \|;Ps-k۶\QWuQH%Ahm?97-xO=Ĥ׭_] k(Gdx&DiE\|o~*`3W`YRUINi[sߊKgyNf+ cm)ޅN,YѼ& sy݇zp[F)HJW72x̓J*|bL$!>C™2RV_U^k_'s8`Z~ZBBU Դy3)ßkGa$:<*U$_FOwv|נ1Z7.4 |vqdƫgj'blFf v$݉bڮ 1`+UEji3cgܓ`ωeϸY wCt:/sFxHƜo)`׽B>>:u4)8d{;eF-HdZFTFNsSc]ikcƟ,ˇX.˩i$o]2CIH -;wڿS(-]7]% O9lm&ǹK5mTt>.$_j^,)/ٶonqc4>xS˜!̥BC`4 LaJBc-8 JLtjQaHDo8}bT42皈'V;%NX,`l4 {^.>V%Ft)'Cf4|t|9|.XL\75'9>t r%.h;* mo֠O2,@ZqO~]cmNDYp=H*V%ZNZ\x{tu=ɮ( #dˮfUߴՍl" 0('}UlWb1ÙiynA;uh^l9k{ e$ẲJMj]zu7^>xம7;2ƵғW.}1WHP?=Lw}}^и!ʺRNT.U֙M+-+p'X}ѻ8[n+ *"iV2whwA*vن&d*ZU-wy& N1hIJYhz6X:P_i͸W0l SOѝ,Ynh{ٺpfho`};1=oTύY\p왎r@]Xdҥ0t6ƱUk׸r-tG[d.Tfd,>>yW ٰ߾qEݟ|̾rNOVx7rL3c(F WCd Ƭ1xQ' 6=S$\;NǷ|/\'9I 2dNDb!QzY sܑGEI+ka}Vī ƪ:RM- mJ1cASfCN'[yּ +5IFs|w{>ʸk̵۲7l0SڐMz#uvn]>*i^4UsfjG; b) #>%- ;sd&;*r 'F%6񑭒_ VM ܊??4fBeƑLLlJ nSЀlNJq~᫔wf;gUD"9g?B"y֑ 1]w9@ %H"rH!@E*R{=fɉՅ.NӁMMvdJrD 07 }%ZT,^^7xJ\R'GgI ֈ¨'G{B0DE5Aa/!7ȅ,n^8\ )= R$vu:TF R@˶@X1uKuœ9$#K%QϹ:!nd9e\@ӈl2O?ǭ^2tdZST 2@OSp/_ snp;68U.zӁt0m:c0]59vYpn`nxw\ n6&gsK߅'T2idmIOЧr;WDSfe9S3}?/;7İ]Po4&Ms2I*}"rrP"ՊX OeN1XhqK ;G@Bݨ^J{:0 B$8 NL^3G\|qp%꫺-8&\ې)#]?5ه0qg*B+A*;TQFԅDu&LHUjp]]RAHvgK2X%e}n8qءw: |GR.:&lmJ$j/07E[ܭ1?lEƚڗ J TCA*vlf;ɤ1V-[lA掞UxL+JnizK/Xl]g*2LZ%A] Rԇ֎i^ tnd0XA?e#[$q~_:*cv< 'egճYU]^~k4jۛVk1-hNOГѬLTQ˯4:h<06ڿÁ7&1-BѼIVs'Ga9Ckk|iu=UP(EmM2EϤ3wM?}$;u=㈙dv~U-l\ZXz֯"9DNʚd0gR7kHV2kA9K|n9SiuOȊ9tyЇ9HzP_<Ub Rq/j*k&NFW4fڛ^ԅ}3?5Cm|4d}>/ R͒D]XR9~_Q/"5׻lN1n4Ρ]n zc_^3衆iu=ɍx[ho_}Q Iּl=szI&z ]3Ljꂒgz[DIjpZ\/MGL=&7M 7Ґ6iDˎVlTTD$"Ʃ.}GrHm@v=k'7mKe==( BϣOyk#5' Q^y쮒VX場`4{玮8)dfpx^ٮS'>z7#',}ng8%!ǎ0r K:鯇~4>?)T5%^n/ˬu[?8d;8{l.7 1\8;3 /w.-u_"tMАh67#(D78 wlh [a=Eg:V7<}ڪِY79|<|nZh3ڌt=(3Uȃ]p^(Ժ]f>a'u%ᄎ.2'p_<ݟkRXSi+,C:3|ʮPwX7pgfj2 S[nt^GGy62B.;?Mz`2ZkP3-T B^r(QR"eaІ y!y^v &PzT>z+Y{$]@FAܬSA%:rf^/քd6Z!0CP 6{0^x  ] Fp졿ijljO~fYq^h,t7/ KRX&(IZ mhw^8,ld ݖc%*7ZMuneCx@XmqU@P ?#Be.By{UXL_aˉ7vVj5U6MtИ}P%8DI@}C!! Oi+"Šײ (҇OȢ{NbܬDtJDo3Shpb}~} .endstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 196 >> stream xcd`ab`dd v 5400q~H3a#ewo_ 0012:)槤)& 2000v00t;gu`Í ʅ|(YQϡ;çg /xk76i?~뙱wh7{r\-< Fendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6814 >> stream xy tTU ! ) *DΡZPAEPeQ9J}z/wˇo/2XVGÑC[oݥhXhT2/{hAc}eok%M;D¿{eG G-襥m$ۥ+v\?3;{xJbxXC%TEb b4XHL#% b&xXN Gl%8x(&&Cr"hb1C$n#$F,HآCCuC?,с$k'1q'#͸{ԬыG}o6N*`g@1uʲ1e&;ۧ4bRͤwYz(L'}OQr\86]' :B2&W*8h.HB:,7g5H:@GRY#2 M"Z_J$jLqEPBo+H%pӽ&,˯6vr`z7Weq_a8ʻQG8=qߡqk/~ˌcsVMOUۋ|EtUd5BཙCWrEMT[z EbK4jaz{qN.=8Ҏs| 6ZMD]\S(Y H.< H#* {sD?۹6wdFZZT́FH23%Xf}/PXiToڰm5$V}}{V5CL6!:C[s2@TJhv$l=] \ә ɵyl!Sr1PfQ`L A Zjɖ!eKT3eք'P'7Xt F%3yk 2P/e/K}BI@fȡlԏ}ڏ\"[%)Rc!ǝP* %PE!IR&|+dLAӍ齆SrXM.Kyö)ŮkR"0sVI54d' UhQ) UG@=_2*R͚wvz:~usB0C#=j@OGÿ_!ѓ v'!<\iGƙy^#[niN7Sfբen$J76r9T5Ϫ5MuU~Dw8yDq@2Hh`zk9O&AnAۻH,H'znfT\IF)>8,%HGq  wy:4%3])?TyNu6}y\%٧[hVڵ#7 йß5o@~h ES eOOc˧\#t7wa%wb4oNvNI).nJmbT#qpM6x+\!}C}=C 0hfH+ P8 iҐ2Ew3XY C]JSSeE Q43Ur0Mj0z|UpNڞtfKMrh3B#X4V5Ɍb62.n~Pk/?n݇ǟ kr]6]i.H#J8&~Kt$LALߏ:He }^*;- 2@  ӨПj:%t3Bu:*ZYmXQI+}rBr/a `UY@z'$ӧ ˒ ޔ+%)v 3 6ڠtڐkOk7;CmXZ8S %!ek1?v%/((BbcK]lN (?ywkw`XRLh&,LR;ȝ?`cnlD؋@2XҠ"C v/ۿqZԛr, ((ydJ~ )MzeDKx3{ڻk?3xG$,2 O#j԰js`dWdDIWth_1 hch ؝dFCRJf6 dox+C 4=OO_/ʏ 6vEPs3qjf( 3dAĥK\^OR֫v@ڨk3+O/:XŸ0f"G~>Gj$",֫YD1G5;7eՆ/)&  {4H"Ȅ£1tV#FH=羥k cuMݕ-"fMjYp~3Ww&SCx4b#b_`ۀ=#7s($ $g ɤ8'pCrI_=:˃ZAbqR-ؗ"VqSI_Hy~'3y*s2LA:M\lcR1O+R d"lC=^+Nh|4t%$4ցkoA+%b1z}Ld)cJ/~y%,KR&h(͵ۥ `ɩШ<ԅ.CCKtVL?B*C+EEȌQU03nR*b ҁp,{+(Wձ;]7fFWf}/u1QkG,yu76\ւy/`Y@/ɡy=6wJsM`s֋,ϑz>ĩ u܏X$"ǀ 6R H" yô db!J[f]6K2L">#TkFH,f \_$KFv;u HڵI.í0X %1ڠANYPHO/q-'4~⨪ C t,¢+ t7)90h bѬQU%ml,a%fhbE7{OJ!hu<3rM jS$H=:fe`N_2Oc(f`$gj8NuN] 5pҗS,2(zFf(U:386@D\Ilzl7NWA$Cb34fidaV(TY$H3f۳vb/ S<}lm&bFr)9lT| 4=k7Vo1}/~ H19neS*JSELՍbUյ)s} :w'Bk#IZX']eZ}Kg.i5l(]VIUe:lOoJ5~ĖJ8HKn:pwR 'fp8Zd6ٚHƸˉaߍ0Œ#.FuizY$i{pZdߋ^Y9LR!f|H0^{,>:cY5Tv*8+1C~yw$CHuvzv;:ɣ  hvOBVSCAdlt'05 ̓\r6+p@]ӴeK>w6Ǘ90PeLA@wLwA^~ #YCN1Z/ 0~-Ot $P4?iq(Px~EǀG?/%Ѱ/ p"3,34[xeY,diPR8U8~Ү3Bl;IU- @C&1Sfk NQag0rIN;܍ؔ!Dw@S 7gũwnbz=ƞC;F;'m%FhR| g xpRhNwDlr.eu‹ 's5HLubZk䩔"̲Ch!tv;#[q_o|zQ:{˷ѐ b/pzʂ_ jȦ"ՖN^ ]] gg?86J/_]D;1,GZ)gnÜJR׫H43tۙR֩u.%?8/qr&5w.ma~1>6cԁe+_vU[%aゎp oj7џeܿ!FRSiqiUg)J|,ptggg^Œ;k5^Ta܊/R2#_@ynժY}ϊxVPSu"f$3ۭ&:W@ew8cqLδŵo}gG! /̨0ɾn4ڌ8L~yη'cQYfegU./|u߽QO53C<=Csh6.23 K)ջplq9^r0iuRb`DUYO7,~_]w>ƱCl<|(B)pM89I =-N`BΠ;N{RҠB 62ʈm3ɰ{#s<XVr aTZpjLpY<"]l-ySkjh潔q9hV;̔ۄh* 46?#3PAg.(wLxuXj\haTS6>3٧5_ IR.Ǵa-}q.mj˄7`]X٥_BUԩK2N0y~_cN,~7=t*5 z^̊QePj@yz˅7>{ VPt/@Iʡ"ZI;H CS B2ң͈5 hݪrEjL a!ݸЈ_`l++tɨCfgk|Ԛv1U=9Ь/'Δ!)=Cp9t 晚~E'ǀEfeGv{MѐW˰q:ڳ|_B}E~e;0@&T!iA3SbfEeQYUeÄ(s5vUkF <(X_77f!մ߉(S;J@nȠdW-z f1GӃG`d+ߎ#rF$ Rx+ݶi>47S#ŁF#䇸+endstream endobj 116 0 obj << /Filter /FlateDecode /Length 11905 >> stream x}]emߞw}2@d iV䫖"CKv_.EDz1 iH֮Vn˽}{,o^R{?o}xz;Zۇ_XXenb׏}w{xm})?}ַ?|û56w>>Y5辖g܏ѷۇLɯtwg븗};%r_?#Ly;@rOؤ`y_JqݲQnkǣZ}OA>aL"f6Cft[l}ez]ei_}/?EUlZ%-ߗiȊ*;\bly{_,oK⫇zf:⻇D|w}N(j?|{Yc̪"˽}Ne[]h՗ͻ[r5weKeG_<ԣnzy}r˽Z_)q j(oL#gO ~姯wu>Huź߾$K?^ߏօ2,._ bl~K`d/@4hlu;#?!1ϴw>9kee=6`_>ŻuDc6hmR;4m39׽J~V+f󍦂>=|ӗ6D%XKoŠW;]+qCM]Ns;.yc/VZKVz-*"cK~H۲HE޳ȸi~HkO}$lR?w} ҥןo??5?/i(BJJŻ_y巟 7}(?Lͧ×O?Fպƿw?}/޹sJicClGonj`5&b9ܷn+,] >27s 7?Bߊwfanej/}itK[nߠ/q7cZYfFݪ^Z㾕:v;!M(JamLQBVDZ)'?^/ke`dVǎ2徻퀧[ = BZ'>T!%0.WՁu鬽5ܽ#iYjq-(z 6LQ4"jNASJJ,M6A%Š+|۬_V5 hMm?V[m$Dk~'ik\ `.KWxv_6$,/}1~:goփ%[b? nf[IN^)Q734uDpl}iSD(ד+DZ)'?سƎJ qߺq.O X} lӄx7džBG흊V[OsvCæaeZ[}CELYk!h1SWۀP!C[O~[YlCն98qla}y;&Dc "-=$,VvK!h]ާ)4tB4 Ȉ#p=̆Vcy8hHǽ3,jFêH& y`SriB= Wl@ qIq .6-5iQ!QH4U%GMm4u!6 uç-'f;!Re$`cO>`K,/4>&@X|_͆VFQ5єEꐆx0%0H¢F9vKuFgKN}7ޱceSB#*Hk sMWqJg|fzR$4 {ůN1Emq>8DYKGk(c|p,VB*ƀ-#ОT~6> |5o1zX};7Go!r\O m-&Mbű@@O:DL+}kf(np#=Ih(m8 P 8.85F0!$@:ǂEkfǒcKQw=l[ҮwkOASJgBh}"$J!CDWw,8Wp`jԌ}}$_1 > ަ^u!%FfyTy1lDNj'XMB rkeT%b:V^BjIj$`sκ wX},OZ1MH>hab.|\YƗ5b!9=*ݸˇ@5h1^|"KXڄ ҾpvANuZ7l4>&Qk 6CG8Pݼצ $hpP8TCwZaw \oV8qlg!Z[ڽC.܉7kC6xҾ*+B" wZlۢ1ˆWzvKgu@T8kVe 1lQO^hwao"բ€;%i)̐NT@ /Hk*Ȗ Hk3Na`C6*ރQZIdvNҾ~* N 40iHj<6lٰ\} Ikƻo'FRT{ҾDS O}#O*Vab IE٫钯*"dİlLsECz&>hSuBT9@X{:HkmIBF 6BSEU1;]v*6`c:Ńuƒ]X_Ii_ʄ]vC,UhXzgH`WD[=^|$+Y^D1 j5A-W/CvI#tljdf# Tt6H:<ٰ/}]|)K/ 'a$@!<@]a|8ZtѮb ֤1VJ Bԁ1K|E6eV"RO~7ll4>jL(z ;7|a>b, +|TǜXP֑ ` puA-kO+ƌXex稅M;Hq@:, Hݫ0#vE+.8~Ǝ=_dtYzIi0.SmH͌heÞ1jp5W5դf^ {ıp r"XSio"$J!fk|h+C"MrΆԩaa'rIZ 4UDpl@DSiwFH mo'|; ]-z' 7%?-Jw?CiK&H"M“+dKA ^>?698J |L΁t+;gVH[O~7k8666ا+~3NC# !hpK)U Si+B" ;~(KljS<ҿΫY?%:gD:6˒5c(!+RBV&}#4~7qVЗ?:U^)BH:MüTF aEHp}C;klj#iHCz@Ngj, V L01pǺ݆:0"Ǥ  |yU?n#dXNQO^ga7~}$ژ럠I7~B'p?3n1}-(ttlf& QB&D-''X٬+c ~k< θS狍fո)њbyO P@שB )  Daq0;JyH]Wqya* 8X9> q w5MCVDXW?730cS}ܤՔh $!i%}IRGNiiEHp}+6V\ڈElq]ZЊ}u)۩x[VEpg['@GLO QB&D(''Xbc F>EQvgHE>hE>%jm `@1I T!J)!#î$@q=-9֖тdf0çD}$]4uDp4%@A%Š+{,*VݒSneU[AzG%б 4UxG'шvT|?z>pGZh穞]IF=ϲA6ؤ}cUb;c*)!yL2eФQ9$4ߎn2$/A%BQ8gO8!:dEJ݁p} R DÇFV!.:  $C" %8M$A6(~u5NF90,LHDY'kC kJ?8@m "%@Au.U'Y!t)|.P$Um-+qr@ЅP!dC p{a8qaibدq޶$Z r&N^2xB`as sEXL%^p$ ;{Aov1腷(E{%P}JyQb??)YІY}D}! m'[bAR"|),")hBpxm +b8qhm CXѱ&eMJ+'?s`m*A{)@' JڦQtN!qpI'('Փ?'Bc8uy(1:܊+ꇷmvj;e6g/' q{Id$-Um%dDJ.f +~p(unYgf߫2=H)@lʹ.T6@,'猇^]-ݧu>_RJ#KT,u EjwV~u#!dc\ࢹsۧm?16J nk^m@+Z퓥 !hWl1έӹIiDHpB_ ne}LBh Dc]*%0ZkR1*s]PIi߳pq<G҈73<+ȣvz]z=i\)r a86 %,jIia9J"<lor,\1U.Tpng'37UDISO{zs= }!F =[}۳3|P5wF?4b9NB;%$/BX OB"L  G1IClP-:0͉=JQJ&B!K@ 2uVVDX)'?kݮM1qçׅJV3,ֽM@4 =r ڛ/mgHg/3z_тqXA.Gʆg3Q8{ Hzם9$> 4aCJD(`ljxیhu邆`&M\ '"d&F r2rE=*b%[.{&SIAK O$'}2!v ɏ΍h:F9) B-Wu98Olj{ZU[ɇojUh?[E}A u 06 _=7D0vHi?#pu{h8Crlda4v+GH`^fr ]x1\X2~I/l|p⍻TzqBHzюHrpW"%(~2mNnA109GeA] +[oQܹ>'Mn8wG'"g „7c)]sGSHP+L?m(%f;!/!@{l8Ii_>YMNg&ۡkB&sarHd|TĩLLFLUh H 24@*$\(t^ @ґ 6ȏ:59a>p\"v23$eՍb_`SyQ#4{ӊ+}SP; }89y Ѹq=gtH4%0@T%A(.}HQO^9(o=N,gWۇ8uj&vɱ)2o׫<92ӛGdT!%dDJDzs|w~fp6ϐؖUrOʙ@CbxAR ǖ^~ *fSEmq?D('/Yr g 烡"~V^eȽa~wY>hW2xfey>4 (a 1Y^ Ch_uVZHqX%y'pw*HB6(~uqG ש'RBv.1)nz7^Y`4F4U8ApCIw.hਞjU'Nha8}Z9~HSQ 5Yp&#DW] bmqd Ѿ*@[Rƚ!M$0CBѯ8JS up'2~p]oP4jRJcFZ_-o#By788;'?R*H wşัs'hjTq;} ]6FT2W! !h@k%Bh_ d$J!`şh;VTI ?A ;X01B4JȈ#_??}p˳(b"? Yhg*~?Mz9|k"TI ?m gڨÞ+ -i[ 1գ THؿ{;]/MX*BB LTu' _L hǼDғ-Zf"zŒb`JhEiBJpuB[kK~OGW^sZm4E]X}IU9kC+s+$~{IR"@:/4\a4ɫ?h]Z3^-iԷ)-)@:LqJ`|a0T^)#B" e48q`0o 6.=]))!iz!H^H+Gfc2 >ٸj!5ll' O ɰ8i׊ދ Izhg=)¢88hzkkSN4]J|ls,_-\O H{(,B"L ^NO~ "^?b#67'k, 4Ux qZGn ]Ii!6 N~Hlr.Se3>VGm$2pq̿;Ń3_24O0% !& %z4q_LfՅ?|O"%֒~-NnT Mn8t:ZV3$³(yr+6&sq%aa̾7邆^w2 AtDpL :D{ъl[>і#U`~Cu*%XR6!|,9z7}VVDXW?29 Vz}%kj(7Wq}r 3DKˉ0ªs!%dEJB v6glW!Vg s erʮ SER5mDrB%Lc(u 9|yߪ7n ~ܼ7NB ݚۼςAer,Z65lBC" c e0Uw|q!ի 젡5+1zƺ\tF)!puBv?;+|0S n ~±%#`}M$L o yY=:8q$9}\KPӒ`&Ow!uVV &#ztrvpxUh|ҪǔO1^DӓG:D#%]VDX)'?]~v(F聮V6N4=\,)qj}"Mo/xsF0:F&~)!+G>ljStjh ov s!Z ΪhSe[*D{|E#RBF o~z3geR9>ۓ>inS@@T291t**z xB#7Aɱ=t=e.A]#c3%v_pN'gAO-'"%@W^HPȆG=.4%V?ݜASg i52~k>6|-8qľ>{2"푈0%!h`DIk;u%J!VHE7if5 {g;ǤϹtuI|'G7eKvAeZae>~^Xy>7n/>~s-tr߿,RUe{HH3>oPmK%S_;0_COǕ6͔\~ $],+Jk@ba]aQ!˳5o?<^^-y/X;Xv:w?4ഺ2+.>Nh> stream x]A EbnnqQӴ`X8Eo_@a'ox?#8ƒ-( gKA[ZgKx@ϣ\?KSKAҌk[{a2GvEB$gmYB$3L'-X X汄ۼI }V?endstream endobj 118 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 293 >> stream xcd`ab`dd v 1400qH3a~'k7s7+ ~*(e윟[PZZZRYZ^ AI/J,K+)6d```JPg`d9?}>0T9wE:ֶ,lX^u3f6?c#MR1Dzʅ>?+.L%]UU%}xymX޻nTvM83gj΅J9parq1Od`ݍxendstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2004 >> stream xVkTT>@  xgL|buQ #oefPM]AaD DPAFԁVm+ըN`L~Ǭ|}AJ0ȨŒ4}@)7]>Aha7茰;+x;:nk$BJy7raODɓ`+^]m`b/,v" 3rMy cAla|mޘ}JFyMyk Ǥgdfe$>šhGPZQ8JBH"Qt4"7 9ț )SƟia(KI-.6d؟8OO<x> M`NF{7h!nɢPW_?sU1"y@O~9FekbDU<(˴RJ*KLMfL$ gLA+ nĈ9> Gi0)TP0FC?n'\K\ /pu}Y4%糢Z"q1'NPw|"#—<{~CS} 4éz,oҴN[Dx/؊7H&^$; ^N/,IJ;$6 X c"*PSWB JZZ] Ggv6Wmnܟ?c!Z͇Nev[q~tzݸ^8l_V!ƒr?\u(L Z2AKMo|p1b!]g_7iY:\֡I'<$ xībR8C 3OoDp Z#g b% K|8 jeX0ha]uFd ܌Aי+K;Y?5;TYvY S^]W,Ga%2L=U^:I/gmX)ڄ4~hmq"'݈~rs4lڹfA=3mErazj}r׎c\l03_lPNɑ;486Dpm1uH FxSZLGHt@0x>  y+0c!\g7kj6ZH^m*mF!1ꞕ%Gx3ZD'l|=@k7Ws]+GXԾdy7UbU7zgZU.! Fu̗MDRg_r~@+qWNd=B=ş(\w \j+IM_жŽk:>Z9KĦ L훔!ܧ{jjo+ ;XLN Du_&61~hhgٛ`[O«ݝڸ+ /LO7b|H8P_n!+.ͭ?Y*\~b8}]i}6wyTDlӷ5o'>clvRC^t7,]W+܈srhb[q{fSnCdK044BMS@wg7(i3ݨDiZ>&Uz,%O=2Gu<~AGJgR!ol8Sa_2هQc 2]< WAC449?OU_= 6\=ۘ*ǭ;"Azq(Lw<~E`g\mF=[=GNrQTLDLk$ͼqwә+֋G`0碾Gg cq{ }CK4Mu%?ZoUN7b<ݽ@{N$MQ'#.e}H5IXlɔv TrZX |0Lj% ot+YC )IM.L^WɤŽ#jAɲW`8[ jg=emendstream endobj 120 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2648 >> stream xViTW骂 e" ADA@AT]@A A ,"Bĸu` jl\@$AlDAە:gI2?:}U޽" qIiy9)t# 3FKi2 CJL1l I:{l]>} [5Y)I9 N|Ż^)I +&/1mMfzbFN`Jz|nbY\FoRAXf\>>UABbRJZlG9s]YϜ> `"%aD8A,'AcWņ!v(&E2wC]xY8O]ưEv vI [O0^#-w!&(CM#>M0O0^<3LhEü>_gDgL.u:#lNt 6~ ́]^>?jTKl禢$m.9H?~ۿGƮ& .fk˔NKݐ ֚vj_9BuGn3:P=b L [kݰBpo_[!]AW԰_"|WmٵmGLƧp~S9܄$yv]˙jc{~M$K%oق 6H6-0At4V6??ӄA_`+КY9)iF!/Dc*~Qiުok^ &*\.}N)Ā HQs .DF7sܢٺsf ׀<}[{ N V{:ـN`dR9)L S[JmeKddZ>۝YDm)qEǾ8oMNFKW܎+N;TCt==QI%3Uqbz`"Țzw{ ntN7Z wh nKMark:a >D%7.R ;`b &< 8N# ϞrI"ȡm7Mtm.ִ%x1^k0B$"P55xQ7zc1[cNbDR)5E ivF\L3:bbim6> @U5L& -VWmϥj  _8WwF,Gi8;_M1bӜ`RA1MFIǀ(SwVS쫑t=gje99 [QQ_ŧ#wߙKƞO?[wu^?+ǿN', iʸ(yZK!İJ#XOzɋ8@HY3 ه9"-}!_]|1nz/8>fY/a%4=rH(@PiKFB4,Y3Ku -6H=jNO}]e˔AP[vKٸW<7O$jOJUh#bBB>O±܏}bS!mo!k526AK J}XMt/x1kCJR(o'ykl=I{gv=Y=&fr+S>D=5{)mE~ZB9uG`3J'O{{B{+hh, ৱu/ةIU#s$ӎ"uߗ y3ܣ剠KCJT=SZŬ@(_w35Cf6VXM53aҭC͵|]fm $r{r pqkHd9}_³v^bL9e,@܆B>Dvy(JzW> stream x]{pT&HCTvjk0@"1bMHa뻻g[M6`D-1PF##Nӡu-=ҳ3y^DwTn~|eŕm|crXrexX D?~@JһjkޮUM {z*Mvy'AJl'jD-:H!Wjb+TCHӢ eO*/Ts[l\C;Zw6H kXNTl8_urb0<.p"; OH]rWhY)lJ9<翺dćCoTu>L^A|4yd1 _ь]l7Hs⵽x<C . M]!B {'kk_C.#Ͽӎˮؕr6)CZ~-ٟ?CӆȏJnjo~Qڪ95OE%1nM^_˦ۚ]^71W.+n[X^s\Gڦᇮ.t6AeVim@ζPƗԕ#ҜZlgk6c%y^dxh#8֋9(0<()2A/"qѸtGx8~P$@aNKvo;UjP}0N"LkdCt<.K%RC .1(Q˫G*Q *rcÅ:v{M4ؚ9K<7`L`@Pf2NGe60Ƭ  K^: Ӑs-Hr\ - ev}*Ngc !Bу{UXx{w0 aʣӃcHrpg_pXEn|y[G-%mY[)uU\+uvٺ}dCQ#dHÙO}<`ܷZ̯~ҙPėaLH%(ʱ(͘h 4EN2CP_C ;=v*UMVW!/%Nׅ=5m2ETrjS?WP5So?͏o!ɒ3#%9aaPWJzюȰۆR& BabsNle}1O=Vf =ȱ`v/2Aiiܤj\=%~Chݰ5eE85BqJ굸,nkJ6y 33F^ߣԢ;ASR|a.z1W@Td=O@~bCPž(x_灚]o}r!*>D\!a0G J 7-oW֛/]̞"#GGԳ62B829g(Nd|vqaAaUP-`4Wph"$Cwyf_Ω7\0&e׾4C>#6BȽ_k~P iBׅb=uduZK+n]K3:z7m5%keafYcq # sZۦt{t=f^m9| go sm~Ix!RR̉|t<[8f3'X.Ur`nKhɊ={]w7{W&[^q3ʿ ͆1(9V4'?ԇ#$$ħͅJ9=U"_{\R!'7Mpdf!hm^gMunge go_j"mҘ!|` 1.);&o<[gnWKk3յ_u^zҴK +}M#qwi6+cbl ( rt-@`mmnd2oލ}E|#8ZCb$_;yoy% [V^endstream endobj 122 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1231 >> stream x%kLSgϱl.i"ѝe%c~20/,M:R^h)SʝiiKXt (^@dStqq1YļgvOiK$3KKK6,j[{[vr㥐%5i֕XI &MM[ӛ лtJF.KeZ1§\/(zzv5nhZ7t zSeQ^>m0jLiVj ztJu b`a&TPj*e: s]z FG XAz $iC`_判G;{ƸWba!".R/m+N /W3gp \K G}zU@gP#px;j_s/H6<^KY7+Vsbj j4`+;Um:NglPL!\7+5h1^k՞,?Rq0\F*.Fgoϧ;lgxeO,y)xz0-zfbϝ[sP}iLs5-&{N/{1{qa%jځD* 1,&ɨ=q:5w^.*nz>ũO#ds-da-] 3W$wއ_!Ep  :#7džhU@WcCJ41Vמ]¹Evp7ڏ58`$NQ>c'TT6/H\Š'3+&x>DTͻԟVUIl6!9es7n'  LbBiދVeG`D3c?O&uТW#d[X8K`bSi}YR,Mendstream endobj 123 0 obj << /Filter /FlateDecode /Length 592 >> stream xT@]\Xdz`Ճ]r@2Q pv$يVY^= g\0.y o`RC;@@XH( $b//T\2ڔ{kY J3Yv:],[F gU>Cس#=hָGی0`)kf#=] A[YGO ɚ)uwTWrU0GhB'~$S)O2#C۸H|T'+WQح=QO隡unbM+Hx@_:/MOO\=H5f{Ύ]eo) {zu]oT]wϮඵ_qu]9959Rje1\7:dY3\zOٓ|L;Ļ;USuI)#W P?* Py{@ǖ)}/" w;h8u254> /Filter /FlateDecode /Height 104 /Subtype /Image /Width 78 /Length 386 >> stream xI0pCvb~Bm Ȳ |T'VNfmӫtB]nf8=e9NrzR>'d!}Yn8gj4girpes8x-gw" Lb l2 |fTz Wb spmpG^[{18c:xpdp,ԁpy͚g?ε ?z=ﯕ2WԊ\UX X,k%~YrRӲ3j\p-L T26ǹ= t6w;XgO puS{n0aWh%|kŕ ֢.ǂv~mgendstream endobj 125 0 obj << /BitsPerComponent 8 /ColorSpace /DeviceRGB /DecodeParms << /Colors 3 /Columns 78 /Predictor 15 >> /Filter /FlateDecode /Height 104 /SMask 124 0 R /Subtype /Image /Width 78 /Length 1174 >> stream xݜ͙< ǕT&ɖRREΟRf7iHG29 !mqI'w\FluP?8 FN\s~J A{rTIiӥPgvT/Z ǓNΠP JSVToWAS.kJt{YQ pP;y mtgQً)N3G#z=hҩ5N:cHq)h4N `\uҐLR9qbT9JCQgKfk|}$Qgrտ!=փQwmݨܜSW3|JK؜z V@i›ˉQgd86 ,ˍJb(82FvUSV8#jj>K8z;ںʅvFڽ/hkOu:sO+xytjoP3+y*Aj'JupəNisRRTb-!ƚ,ߡI*./ 馅jirm %ΩCY:wVC=i==PL\m<bޞWà Ѩ6ͫaa(j3xw*O4Lq !%DiaHiǬ 8,)m'oir(*|ɵ58{UQ[-Y]5ٴ•8Q[ "l"Y(2ތ|=Nv$dƣ!z Tendstream endobj 126 0 obj << /Filter /FlateDecode /Length 14437 >> stream xKɕ+jYM3Zh1fc2Ѵ!YݐФ  ϸx߆t~|=<<^v_wϻxz7}?^>G~/|3NrO.6y}Y?}6_~8yxn 8K7a=pJ "h\qi\8G-[64RP\Qq~nr9L;#iՑ<<<4b:f^\|Jwh]XP8_/(KH$S- ޹vOv5nӢV GA#[;#֡mqhrc8^q0٦M%>l+K["VC[%xwl;v;1F5^nꭜ[ɢJ-\[ɶ(ᵗ[JHl%RKCm'ury@}Ikk}'Sm;h>F;ۺ2zI'ݲbUFu~H_d (f1#Y}3yh@sQLV!֡đS#r6\ˆ|0Q"7gl}Q3"BHv/CZviӟ=h@t6R#KCˆ|FgF3"Q6'9d3"Q錒gE:a>t9m=,EƉ>_k #D##JGFH-4n |moH(4H(4tYG7LGHasqn<hV [ɬOJ> t0]a9;[`y2)'9h|I#Np考4:ް>M>yh9^]Ca_^w9vyuaD>(9G:|қwq<V{q\d:@ vϕN*tR-i?<߆\mW0E̪;fW ڪbP"A9M\$(RHEҜϿ*l]$(Rt/l]$(RHIEN*rrӪHItԻ5U\Tr*WF%(*EQI + GĢ$E%'$U%߷ʊmPJbQT*)* cY$)sAMqՈ 4QݧREd""jYܱ+4* Ҩ~H 4ҨBH4*U( PjiKy/}ePk/j7Q.8p^["M"TpeٺC[Tcݷ#[\pa x}Pk n6^pM[גmUp Zn9bRⲹQRDJRR$[bV""\}(RkiB*jl˵4QV"T18bbP*DevŠ*EbP [U0x.+rYQ0".+F5*^Vko mUV(RYhc1oX-V5ִDٺP%ڪHC#R:\.lxDpIJdhEQWsQ\F](DV]ߒmڶB[UlUdluŢ+޷q3=sebeˆ\d[.FU1H8UԞV0U1v֕I+bDE?PCJE*9<"J_QzQ^pD1hb]<vFJ=[WڪPQ%ֺgJr%H"U\I(R%H"Uy%O]6 b.(7Д_T{0"ٖ mUa(RD kNpSah C* E**UTG(RHuD"TG(R,u`i1C\įb}xDh mŶQ\,⢕uq'..bQVU\,j!"FmUv,S[,St8x: )6ڄ6Qrk[KUmjNJM͵"&T4'&T(R96b\=bS4&4nAYȾZKZW*^X8X0"*ٖsmUM[TZmu mUtPVU"U1T(Rȵ"*bM?*;c1O48UU>WxEq.yP*ytU(W9]\h*on6W9]ۅN*lQZ9QZFjEeOXmx>WO*cvO'w>RPŲXEŒ+V,FŶmKkb)*Glߪe%2Y"2Y\杯.h[mEmfU*n߲ ]ty]Jニ*͕"U:]zY*{+E7K+JG'Uzs'7v-QJG*cg'K|snm>DfLTg VZ6 et_C4hP$Ѐ(9VABNf :-۰mŖ4[-([@}~vNA;KvNO,J;wsz|~hZǜQ9Xݹ9G"sn&sDe"hʜmjD3f 4kfh+.`FmR'8sl3pmŹ59s d .}mF5)u\ǥͰSzuiO)sz~n Z;K[k,,(2b2e:+ ٵe\"q2A`5eId,(H̢ 1Lm{o`ۀ/, , IJ(B6rڼҗIW"Kq Z߳׺֒N V%#uS4F(yյ#0(Fù̿n_0SRs;Bh!txmg[Kľp)h a]h[sҘh+mf;989!v\Ed4Ew|&=XɤoY)VQ@gاcP>ݫo쓭O-FkgG"aE>Y>9$HGOs2J/[2@UʁƀPX`F(5 hPxl#!S(#X9ИPhN9J`@+&;zGC3799GsI{4\; S&74_~~!7D ф~\3 фhB?e'L9cG΁ +pP-?d8ut@"G'[SEzQ#Гl 2ATf;8?vrQ#wo#2Q$HlGkNNf;:(Q$l?s4bIFAFdD(ה'"Dq98M'98j6GQp5qԈ$2i[s]~Jy"{xi0"Sik&ni1vyFzԍt[3lBݳUG}t /1нUg3)Uнfu t2ə"er ndU&H 3 L@2עO1B>ylD<G, yѾ:/VKV*H)XAоnVApϚ 9hE`1XPO,nXl={ůFx>&3$0SEiܿAy<@6lMf̈́lQ$dϖI~& dݿo͢@6lYfQPF+*dO?%l E4*nP&b0H,:Yb1fYNbq tmifq@B&]ڔD( LI(%Q$JҞ)?o2~#4?aDF&L (2geLt2$'#V4?V$@&jL $22QDM 5B&LjSEAIԈB[m̦4F&LedHDlTR-]?1?#'쟈I'O3QD'e6LV $2?QD"D' ~F$I{b~($dIN$jDI ʔD("QJHm~T H6 Hg*@vTY3MD %#4O}Q3a%AE{Z 7;`IV$PIHDIs duE zuO;Act&I_215БJeˆΦa+HJ"E"&̙^IN&9$nI"ENԈ(?0WAms9BKkv_ĥ(dIdȢHoCv6ޗv/!K,ݒ!N,: $2dQE ۽&.ٚ( &۽/[/EW'撓1۽6,]ژE0 YyzXD~ }IXF}η9 @#5AdI#&pLS/qG%|)i{a2 $ ܼd*f"0J&w/K/5oQmG%+J "ؼumѼˍ֬\8k*8elp 6NI#F8qJ4)lqJ>)E7*V2Nar)hL!p{) $p{)x_)i$Ni:)#D8%pJT[48܀K"Cw&SD҈2w#6३(zQ$E"voB0F[јqLNF0:$>0M $FQ5643QeO0"C~&CE< ybo}?(!.^SF餘($ГAON=: EۀmУ(@E= zQG@O"6tGQ5zwydk@ 0.#61Q$hjѝn@G}߆8ٚ(EFӈ2#6(ihtɌ&'3mM6QF"1Df4Ѩ FF&MdF(MT)?K%,,MI#KaV $:h)P cUHIм& Yд]g'C 'G:)+I@""!P@bD΅MU0k$j $r69]3$~F{9ܷ6FˈI#g/70 ' m,3Q=Y@TIu,t˷+fV1C" ,(R4gR̐i~M{?wW4m%:q9qIC"'"qPADNEt%*qHġ rt%*q:<ݵK Ąb&%<\F0 'GN )f"m^"\G0"'.sCqDuH "%@(RH D[\N u5m7 b' :)i`4d뤡 :iIIC"' "iPADNEt% *iHwm5J^wqTw6gC,#G(E\Ģ/p"]G4U("EA(R("EAB[E"uX{aHA[NvB"ES&"EA(Rh LÚH)u)hX4 k"hf܃c7Px}ӧR9p<K0"'>$rHw1~?Os09}>tqoƉ8P\Br E"9P(B6QԽ%:9\JTyvHu' EXQb5Z u|u߶ ]#P,# Eex1!hڜʻese8#e8bj(RᵇK*u¡H6uZs&Ԛ#TN8Ze)fp(R5:h";)HCEC[.KqGN8]{+pq} eݫ>uuOVه}Q;E}Ge).hgs@mh[xWX<T <"ȁ?#:Q@k/K8љ0"b@sH"e {(RҡHI"%t(R5ρCLGk+h/I}Ptण8Pya$r(R 5ZQjȩEɩH4E|6UEf$Z_DFm)κ'8WL$ mgh̝ȶ6: 4lkX0F8pEmsdFбmt,cQ"PcQ"wUAǶt6tRSYPg,5g,8CESf~(Uنlcєmu7x`j9sDDE<)@cEJ6)P0# D0C[ld,)H䔢99I)UJ)"R(RJ)"RG&tR0:V)}>RtKN)EJF)"T8V,(H䔢rJ(R 5J)ZeJ%8b:UDpD(#'Ge(RHQe(RHQ"Ee D*`#sHQF"GY.?]ûpHQF"Ge(RHQF"Ge(R9IQFN2rrzҫ;N/EzF"X(BMjX$r`9P2ҥS`VySm&:)ɩ"j(R(j Z#mqM[?Sޑ#{;w(Rޑy}λcEG+랈l(RHIH"'!(R9 ±叒l4[gdw18#HEFF"e$(XxD L90@UzF{5}8b7i9ByvEOO;b)""bIK*;o6E$r޲(E,ERhev;bYKUp[ZG,F"m,eQD,,eQDl{ ¶xr{eۈbP-)bY4E,^zg[vEES޲fXDĢHTeєTv}m!Eo;1E 뙨z褰U+k)QQk)Q(/{sD(RXQsh밦 :Q|FDd)QHF"߯tTXDִa*Ofnڮsʶ k9[ɍ ktIMNnEr&5Jqөs(b5q '7ezC*Va"LTeN kpZ氓l(RXHa"5rXHa"5 *?nXPr~FšDkZ)5(RXa"5'/dF{ִakHOdU$,VLdt=^LW8igE<&~xx_~d5*q~jrүR*$rH?CVym4A>(RH(RH\Y:QG6r|s:ȡOuH"~scڪ螭ہ7t;Nj@/rojhnvG /q<үp@p|Z(5 8ҷt$Ht : *PAoysWAvWANluyHLTڪ󀍬tF΃fE<+ ![w(RѽKc=VK6W,s4- ۩iaQ4- Դ4DSMKijZmi F{QjZѴ4l8=KC_|1, Zu_kP1,QN޳4ԯDmL _ih~,~o{WSnߓ{Ԍ0~|M ԀhկÙض"jjjjIM 9A歺=桭M M ԠHM ԠHMM 875(RSC"75tnjPEjjH>h|Ԡ075dEjjhԠp45d릆&覆VеԠILc3Q=IN |rrH"m ʁ">(Ru7mWZ[[r+"(R+@"+Vm H@p+@nPV6̭@s[ɶnhnIM е ֬$l``N0CQ`+.?Fu,dMd!,,YNYNBE(" I,$lȢF) YYؾuҮ:HT|keLjկ|(%qE,DREoE&ND)ɢHIEJ QJbh *%)R"QĚ.9HpbQg)UD+Pp" E NpB'99PpBN Z厒 FpB E '9Ppj&`Ws8Nd<[rH"EP8OÉ&8_(g:IDvaf&bVHDX ]^ɶb%J(+Q$Vgͮt[oa* E*x@E*xP!EDfzH%B"̩R"t.DH .1g4&>,3ˢ8$eQYřeQY̲(,E3ˢ8(ҙ9,ޅ,_s["m=(փܤ~>~(@|072ϯ/|/D0DZ!ܙ*ez؛KͫZ"JS}BǨ2Wvx.JPvUBs:ϗ\P]|*eq!HJPމs"sO>F<ߑsGnwx|i۽y0?=ot,?/55/6iXh1f?1k4?~zqnWv\}zӯᄒo_9>ӯ|Osl8?}iRv??|~O^}{ÐT__>|~Or-_˝wӻ_xLJWo9qo}~ǧ_އN~e\뿌RӇw懤2dzo~xӇuW2+0㻯?|8.8dT~}×Τu<'}yEF)]01>~{9/^bx&Bi}_ 4<÷O__>N|U3/9j?|~y?5qF(=sZm(ӍKZ~Ӈ?'dwfzӨiewJ|< ?od<,|.=nY6zvtxJ3^<>otӶ1%Kޖ0nßs?5I>]p޿}͐6r}~:Oi}/yħ߿:oiKGOn2e-!)D Kwendstream endobj 127 0 obj << /Filter /FlateDecode /Length 3579 >> stream xZKo$ϯhXmC#HZ@V쬬@#GuC~{Hvcy 'A[zԢ'i;-TNӟw_qnK&LveqKRf*,f(e營w/f`t#lNi>==>TlҲ%nfYGgrN%{ jq>`Nn~ dV(=iTNt>>euz8 ?܉ZW!gE6:ۯY:4R. ]3P5׻"G0Yd"|1=~2|lr(͢R,V3/_;\Y{'bh\FtqP=\4M]wKNw: i_ć;\Zpƴ!.ڐ+iċVdB܂T&.^H SCzlbST{d2}Ÿ8-x7xBX΄}^rYЭ%W Qbpƴ!WsƵ!WuFǵ"o2yG_vJ(oqP/|/PFʼn~ƵBcaZaꂡqmиhb0:ʈZGlർC塧7Hur a嵝t1-NTބp F!L3Uvyݽ\Q_9VqSuO<R6A\fD'Ipha6ҋ.v=cu]!kGѨRwL$ǎ%Ҹz62j9PLlWB6!Ӷ5&@h E!F+(n2Y*!y.3$euꐤهY;eH+C}Fq~*mW+:nQv@!y@kG D>55ˠKՔr.Ft-ٮ4>k;8۠r@m9b vXY˭k˪%RL8sQr"iۡѮvc ;Xܷ;\ѤhMʶèǡ~eBt@ɸ!AjCN XX͉KOEfGD*4 ^"&N@QёsIDd$[!Î3d&θ4"y0łl@k1lČ3&gGQN̄/)%<"@3%"8UOiC-ԎŔ(gz'"0$VC7YAT'}XrȒ'˘AX}{$9 ^|\A(SY 0}8z(3j'a0`~xS!G$.)MK.vLܤQfQYGJʐNGI4PBqUQ ;^Z%bAZﰐ0+b0~'QH wɆ^%U *Uh|azIW@%Reg> WaP֥iWK6Gaxɫ!^q͒PG|SP ']n5-BpB˔lʎP0>X@aY"$TH AAXk@1PF A?L6qC|IJ!H$K2m˜-y#<"OmAdL32薊6$$…Z:+#wS;s9" rejpZ1^VLej%uZI_Y m ԍ4-Dn|[e/jоM)neSyQxzs/JB7/|q7[_ڊ8+eǧc=۲(?MkkHD>lR/~ 7DCM8 poр"q[Wl)Їǻ>S/M/7+@RpT*罦%yuxy:G#.ۇ_Jb)_`H/^ƣ|A3wЄ}bsn_ t>M}g@> ;3 kE9W?:T"-oYdz+}t BՔI-.T|2ŔH_ 9Xzendstream endobj 128 0 obj << /Filter /FlateDecode /Length 58790 >> stream xK4KR;~7I{ !13hq@2VzDfK.3cq_?O.ߗxz>/~_oǯy<^o_﵏O~y]?yx>?׿/O__߽2R[<\oq~ez־?˯ҹwyEp__b?d, p>=_voS_ũnes|~it s@GS4Ds.\-qٻז>SXhpQHK^g4qaY+_^xi^tj]X.6A&'Z]Sjkk\b5 o݆_-zi?mqw k@kP3^f۽Io)j^߼Vֲbyqv8A>:**E'=&HE<%vyRwy=\JiT|2`awڵR'JqއD;ٶ֣Bxqq-Jp34 L"eM%9:? .>:+q;ߧiLu}X{vEs9\ EZ:x0ttQH'"Ʊ|t}P|hQ;jnH'nxmNu}_WszuAq_ [-B: =e:@C[T;(OC[ڒ4*lrڄ1톏ޒp5DkpAtA_ lIR9_ݲ&]ݲfPKkknSőM sp}d;!.}^< 48'* ZB WEv1WR= UjB!SR9EA! WUM#SL+p^q>F]M lh Z:CV1 _wvUUZ-c=BY:Va("YK6Ֆ>.*z*nϥX;>(Wvx5 $Qs}TȨLBlJF!mk..7-Mrfe\wNwN\zqkZ5>y,&yRW-Iq].?qr:l5(| <9*J+l$!w2"Ww3uրJ:m@5&pP:]xɥ9޺iNg&5 t`؇+mBޟXaIZc`ZwOԫCUѩѩ۫!n ^gX^D+HkR5PBRͯ>MC*zRqVڴfqpgENBuJ:ʻV*}` W5%EͰU/EU7եJ^i鍶UhLl>ӎ~>)Tl/)|ۋ>FPTnhԡ4{*T$E!,M+ܝ4CśC ᔍ~x~M%7\1W\VVKqJO{~<^'M5CNh1-1NQ3s^Ϝ}x{=t}ڔ]w5)7l4n t PH zP|>΋j/ J(Q@5j=s:h~@B.}R*6f@r\V]NKW9e˖\>Q!ή;|Yvw00E@h1>*E ~D+~7jFZAhKAPH͢:.f=Vj =Ut^R+̈́=U3hM&| nS IE>Eх;n%2ORQ5M˛Njݹty:#.sROntzi1 @(x=L}`|V @AW;NP~RÆ1zHq]:{V+:WtqW\n#u> jR<S_i%k@%Hu\w7(jj]( FjMM\j8ƮNǮFI!~&6P] xx!zJiմZ( *uxJP1h(Ooä PHM"kH븳y=,.P-@!ä@v hWZI탗Ax֌QeӪ$,nr v nسe7\9j8oqڄKbuO*rW[_qq:V֠dVZ|w<T(-:^^oΚ 5u*w؝^+Ux{ކ=;*<+|R|"K3UoB-ny[LiWݷ;kcPPPa5 e',Vf8[ӿ6n vB$뇻IԠvx'wPbPH]MEL&%u/WqVB㎃B ܀h n@l@>5Ƃx <凑s7RAxՒB!w t0hZ}'PHtϗ_ b5w[cPH)Tw-u HФc&v ʜ$g:Hk:PohmuPl<6EO$ӡP)NڔPoےd}mMv Hmk5-m lB|iaMQDnaޭ&j_lftT7U"!7nZE;8x択Q玕YA.Kٝ_;%GZzxfBm][{rޭWWK6[? Hǚ5$knl[CfpZn]2%oe--Y5Ƽ1z8nOPtzBjƨ<ڵ7ujG:u!uVǸSScZוM.niuruQE:oBͶ-틛mtn tEk~NjyD?~s=p<& kN(׻%Mt;.!u.CD+'J*>f5ćJB|!>dhGU (ؾ,Hm]o)P "c""mB@kڄqQ>FڔsC(q;,/#ۻNv3K^.րiX C4!G ^4,/N4$LRZMÚC!hMkMqp_nOD("6TD!r3!jt^A@U$\Ve҈7PHX&X+os/f٧"&JĕLq%[FDk!:j q*W!!WrЈq($Ѐ./u^xw5T"&6Ne-^D2TSh{M0PHB!|P -ZB!N+I5R.6/-pLK w 4+4 O5{DkpIVR[ioR֜j JĬ)3UNAVsJ`+ ibđƆXB\ڄG;ckjt 2\wdKG"ʡBxn&R$f"mXj5\H! Z$I9'.. R (:F(-yi 5{BiݞPҜ_nO|-319[3'RŘpYU\~}RTE‘c@ ($fcytddz̴ QY>f&̤ 33k3?_&efL#ʈ 4""j"6ERBMDJBbJ(y m($'7$}wq* o7ʠII>D$CdY ZڂGۻb(*#!B qq J|˚1ʅe?^&:h,bc(!*k,Gef2JY7롉+U:/b:T1b9JCUCnOP($ *(fPDIKoه wtT8WYa.X#/oBKG,6lP6`'4 v_~}jP d7؃pU!]F6^A.,Hl_RfsYޏFzXb?A,i@" by@E4\4Dm@ThhXc`(< W NfMzEsLZ? Jj(BycŐOY* |UGӰJ{nHdXcV aYPH"! ( s PHA!a3IG&ϬD 4]VVe A:gD'"DŒB($e*Ʉt5c<_J&XxF*5eHSL;dAR0ҞUiOŪQ曢5. [2V62*y**A"`+6 Y(ZTvw(pˆ"Ai|gɈBـ tbPڂxѦsFPxOwv]D 8%rpc TX_ 5".^вFP:8#4OX 'سx)ɸ,($`2  y  ZHAV5$PH@!AN!A^ 3$[q!MC"PÂÒG @{H#]ŀ2 ަA 65&DtL UX AQ>G:1"I:1J:/f ŌA!a%אּRΤ%`J>} +5b #&IyI ӠBLy͝t͝zoEܦ Z,{7@@`xHhQ$A llxf!vY~臘NAY_ \U@!Q> L("}RM ҈mskq$$oB,A d{{], KPHP3 *D5bA:j`/px#X^(| j$Bbٵ KfC4kpcضƀƀaq^@H0a-3h VBc 䬀άuܤț)&D (|;+~#ߨA2F^LFckC FF q!GH׿Y{msTJh `)PH@«\erj/jв16t V&jT@H@!1_w/{X"W(+ZělT *o@#&6\T$!!M 舀BbD[jQ$ӆG(鰄J)(#e!e񁔼W nax+oCIWhC;`0m;`@v:z0!Unw[Knfhť`(&>:Yi~~A줡DHc:&"?-*mBSELIE^a舰g_P[*c+T[Slp {i&UޑFtvtq[ydc Sbz?,߭4@ D22VB+)lӌr.L01v;OʈTdy 5Ts`RF-d=͆&G\'GeNS:SކE鄘E1[hEXwV5~5f0~ !ev./GgzPFA!Q&χ@3D,ZinJ9DwPᓣ-(VCGRiilXy"V6Q*C*C y)C!Hs.bSnbԏT>#" N"? )symR=HtL)Ek–9 Rd^";-*%a&e4 dĠlQ62^Dld"i$7yGJ;-"bx W NMٴ40e\*@y$mbX.Ӗ= IQ͜xZH$do GxͤvJ$.^=idB?PF8"!3ĝtԦP:j3)oCP+lk{A&ZwǠ+IFm|`yl]gXz 1H#ɘVvxu2_Ԣ2XjaϚ)I1gZ1 C>/>[:M^NNΫ6 꺡 鸬(J] &9F޼_EӮ 6cP?bs`|$Oc3Zc85/nMGH y_EZ^ #\#H,(ޔ]j+G@pEkݜ +j^Z[594G#ҢHB+]/5h@E!AM\Fx˻TQ4Y𝨴)Z>|h3V랊0lszpЊ鐍 b6QHF!A7'fm5RT^i&m Ϡijx5̭XXh7M#W.qQg2dw"c.QHx&[ ϸm@ΧIDUM䬫qDiSb0 ܢ-n5O(6[y -eմMGjiE:u|wnLD B +M9?Dd6!4,6P B($Т:6~LZJv ZDpE4hqU Z<ћ1.:"ꢐKcN518{1ʇkmDtCB6g#Cڔ 3 i4@!Mp*'4+? 'DB Gtj@@!%U{tz64ݥ W'y 5*VftJCaoy1I*  jTk@! (W8POFԌFTG8}$0=ȏB"?F)47 ʦ<Mi*=ѨkTj*@!Mf dOy\H҈KO9+o04@Ms~̓ i@!+ BМFmf6pچ ѐו" T߶üG4imhH|PsfpM!KeO=4 Q@kB=FM:ۤS7inRĿ|;=fѴ^n^)Д}A!M6(&/z6,r)ИC{c}~R=`k ԒOAZCnxlfSKO-a\ SV*K-dOLٜjN0x :=`k>bE~r-[ӼxρW֊g-TѮY笕 i"PEh.Bp\4I`.zg#P5>#f)y mqLp+i.J(5HmhXJXS>69MN'l"=9 *#Si4MMhC<}#U*}hm5NLy㩩'\^Sv==w#Ux*F+MQw''i i8B F7֚>jۦxx6-PHs G6mapÖ7JnP#6&M:tlD8nY(2Bp,;Sp=}}O=Et'@SO M=@5p~GpהxU=m\kfJKK5'kjkǯA'}4Ўz7 6y#Mݒb;0wLL wbyz؇|k5^zZig,HU\3iiG 5i+yjU7cj}4C洼s&4a4l8|lWOGdF!{ ׈Bm*dzٲV6-mJ[ݔr"=6yóN7fm|{C]v}P4MV }peoP=U8g~{+o'q@YkC\{/,g^~GA G6Mj& `3$\?(RȿEZW1,  2 -}p>AV#e5>Zf(ЦȺ?&I3뇶]i%@x׏)49YνHGSdڟ6Q&ɴ b$I{h,#.AJ#>$N fҏXڐ8Q 䏇WJҎy@p2pja=fHn\N=c7cDZDZDX{<$VyN$EuwA3 e4B4 Ӥ)fNJ}$}@8ѢmX )^9s{o|ۊ)~{ q0)i`5²61jSbբ'DzE p<7r?e45|"K.jd䩡v3\)Yg0RnxՈY &ϓ{v# $fdY=$+xdI χs} ]yGRԀZYqTT'4M'tEWɛPAiQ1IG{4}ҧѪ}F<?Tk:)m>[Dcl٦X,ptDKHBck_͢OjkyG47M# l#l98ϰWin[aϰpZKZ1KR'Kǯ7ʞJQHSh)CK`ZɴJ>Ϸ[:fK$[v,t=mk-r9 O k?ТI4=b'A켧_\^Jh|&k%?G6SpQM'ߪc}5ᛞx[]SoGMuzyavn fyCcny4bmM{| <іDKx;v 7f) aYm!M}؉Œ-O> `H[94&Zc<4adVfvS=ݕ1/mMwqPF yx+|Z=mjÐ4M4_Ir<ÇmyǫDfCPH*/"_t~y);gY| };26UϠ& Ԍ& Tq}&@y4CwS@SN>FIȢM~($7eE|jc?直_>2?oң^m!Z&Qݟdر'X`G/OB{%|'7Xk<˞3j4ktIsP: ׀2V=V5ŝ\UgCVwR͎?j(j%!JWa`i3 *9GLC4Paۂ]քWo"Ҟ?,>ed#RVWҦLrPJ3UJ RG,5T9QBUկ*T$+-r8MДcސimTܕ7uHq԰ˡ_9heCiCڤ=.L2jIG{#.7lOMSźMw.A kWSMQygQ/;^ sG TΖݼIݛܩAhW^ ֠)mQF5!ZFpƄIPI_{UէFC :oht\IOow/Il}v3 pzO܇Qq=sO6j٨Se[&im:`]i_!dA) CVWD!ulh=&3XR-5ebꐕ߻#|kḏR8(>Bjs뜤tKPkMMDkۣVZ q5xspAw4PQ7B\>ӛ"jn^FW&M f=?At!+L}otjqiuuvխ?}֭fZkD`^2 j3i#t);>ĚS u8z8,Ժ: .NCGv0Q˷N3]infnxQa/kqa {%Tب ?GA4*4<.mUoL6 PL5_-uRhn%P$|E3j) ^n/?T+\ՋBPQFuBEw2pZS-N h8c-VZ.Y! (JLێ*M(A,I۶SMCiCv@~y?\^)_~9աN-啍y__P8/: Xo+Mz{_Ro+]EXit-X_zy/ _~_oqy{?+t| _oo\<___oWD23wi*$ZB|(㼸~z?;}֦G/:ajū\O/WNO;=4 ThTJίV{^;zɶК$fO h%Η(M_KNߢ:z;Bs͖\]ݩvpu6HT?X ,t8s_ljS۵흠yxS2: 6\)LoI/auKlfcבD,BottY'P* ,ҠQO5Zܯ =!lf\cc94ۉFgVFZCvN&z=-w>7Zpկ-dA:w"Xi%U䐋&Ea"u!/r|]:{y98*pd "rqLV\'*L+%^x8U5eO]5u*VJ{$ @Ds0*Nh[Nk{bugTUנK\euz@2bZ42U]P1SĥI 3D+j]Ř˷,{4IFeL+7V!BR<_1ZV|[Պz12/jOZ.rVk|`fMN7Z+?{ABHNu\^J+_XzrC5R!f]RE#nBX'.r]\Oh#䯇Z̅LZ]-ߖrzi_q> whlBbGMGP<_U<"e᜶E^δ<t]P+eQBE@>).̯>H&h:\ pbw\ ZRaAR tqu.QaS*Lf#*P>\̭8ӎP!wiPc\.Y2ܠZ1L+]oRV3,>~VHt 7jn]u;TqRg#T|t]NK=J Pʃ+0h"F!JwقǼjhVx e@%B*Cܣ.&e GdG+̴*LHG/F <V&M0h jHu<&^+!z(v5z.'EQ¦V[q-Q!9RB/orŧ3e[g튇erzOƳŬZ'K Z>GMzt̵)ʜ чpFyyǵw>*D nWOb5hM _-nS-ckeSnrScAhU+E{y7V uܷpzerx9t&Z3ڵ5=f携P͖hM.u0j<+>םvIRk(ZPj-H:0u~1q7A*yyuabxpN{Dk0Vo=%z&Z;-0܋jԋ0xܘzVBփ>DuTcl݊2ƔNDT̍|ptxn鿂D+x|^I-ZC!uzxr|kj,zXmcjUSApkpkaf0jn,>˿[??ϘG]ZZarox }|x<# ]Z4ΊBj 4hj8:ABv{˱fxULIwC;&~-T<wE!lnkyrQ1luSjZ.Q[w\,g/lN-:km}=GBk0wsh횓XPe8/ !)`^%l'B"EkSw$Bj b`D#0'xA!a~ 7X ()63TIϟ.BNjWB \V;z{Z($ռ&Z|( sv(8798W݌.aB +՜: k}uSb_ڔGdpyN\y ?r+k ;'}>a"*x>,Jᖇ(Қ_k[dlNv6kZ6֚-ZeVdSwXAkR+hM2'ּm1߂+ #5"~B% (${UĽ-q @+:rdCwn(@~[Y4jĬz&nҭnKC5sjl.z8"d:Wx89G2C2'и4.QT:g-Q'#~®}P|ޭ:@ΉVNP\ N/LB&'Z/a#Y'v=d'Y52#s#3'– [/ӵK+j!2fbW=F,-bA9JeM\^,hl8=Fh?aFa>Jc:鯮щ֎H  ՕVٷa 6d΢BhJMfAG0-2aQsI&,hSρZ:&lLغlPtH T?QHD!1f'./Ls$:.g6,nJ,-oxZ*"Cv,Cx,z|>T,_N\i %P coVMĐJ2N}2QsCH @4)$./LgVCe>`)1oBxL*&򦘛dxϼMIҘ,o^Bcƺ_ci_/W->~d^c(i,/@DFyðIQY65ֱ6$ݠM31I$oVt_5BԼ9fA,AcoЬ׊=ӻ(xM 36H% 5.אȇ<̇'bas!Ga87L5$=cG4:PViԡ⺳ {+ڕ! P p¼ 0mB,X5eSl0vMٱB" v鬛v>ilFAS.)z.ȡ wVãO)MGr($ϻe ͼ/_Z!jxXi?RD-~GB:HF|#!Ҟ o@2fWr/L^tX~5dfe' ^(0,{M3ZTE ҡe5֪I7gieC7ڪӸ3yNuݮo9:@kN= #x2DW= pstb4CDKaѲlJ] BX6_f* ghK;)LCS&\ބxG;hơvV`U1<ȬXz'ͱ13򶄵t8 g<4i˯ۦ L+UVg) Cp XB E0rB!A 6C wuݱвXڰeťGy?#e7B.+줽5vpYalj\UءhJ w蒍PA?  KК\fFڊR(0RM`j _\v~𲄈Ғ腑+T@XfDT(vs  p#8mR锋XЉEB RQ ikl*X p#f9bdSk= Ei" U(JM#5um)chv?BUM88+qP4Ձ .L.6Ej:}tN :v蓍$"L"j)f .I舐vH" E9b$3pYa({L|B!C3gJ& 2ղ8d;.VBD4;"@c}CpQmQH=Q}ݦ3J}vwq_   (ƟN?ilnyh#0@ކHҹ2 ^ DXMtHt|k_Dt4? !0BWQ^8C 䩳VlA!؂ #|t}lێI]:PH.+tв1:hYPH@!utq<փqP-|ׯQܔiVрL,h@BnY؎ލ7ߔ9 ~*54d˘\5"P# 5P(ϑFzA}|9,"7Y@Y5B:m%"QpA``ma :FD:Ĉq쌸: [`܇2~f'?pP$ITe H͎2}dNț9&DL(CHaM/c^@$t$($h`@J>w*DnFVކI2X"I $G6fGs$OQ%o4pY<=O}/ĀߝZkGj;gP9g:^`梫OP)((:t~@i? A!q[ed6tuۡwNIoC1ug!8L: 4D"M:& W"̈́\ڃkfرeR;U^ .B RHe,BiEE 'HFhH,L$S6”Z01ǩS$3&X@!$#j4hqa"bQb/B 6,i BEڂH1>rKwW?ޜtf4;PHpX _bGXWIS]]BepK MyGΘi[ݻJؐ=E>RaZ ismɑ>.+v5=+##Jcm:ޖJ! >*usjBJ c MwPcmBxʚ|B xi -Z„0`C+sZ8OКjEʻ.hTZ5ToN3 TyfPPB!q\:S;҉1נJҠ{%PmTu;Oް>&Z;4PRM E+xIX$؀RPP0@=;. ??ga ?NC;}EJ, 'BrY3r P#QJA!&5&&oCIШɦФ)z, 8{v$ n_ %II$PEl;2RކD$dw$ 怆I >($x)yUÇ<7|PHA!!DHJKJ.˨$dp8B<4y31Chf&h* j4h ӄViLNI6N|B jDoYa,yL:p3'm fN:;P>VшγiOpˊ@f3)46)՜;"h[~^Z|_lP /vzCb(o(NV~o"DMPI?z`u!p&wPA$)xrN7 JtoU2Z~DWojT+xըVسF5hTkZ%7$4M+lL/@Vl]o*A6@,=^ K5Rɞ4 _b܎W-4ѬfKx[iI P# =FH:bBG&m(odN4?&f($~,~ѲFVz,ؓN)jJGdLaD"S>"a4k 1+mj>)xe4-0j߽~}buŏfƍe>c†/>)ݾYJD1@+ڰ(Z>?bϗX>$)Dw^pUNG9#X+<{#t&ɈU)|eOF^`t`+mAizʷ+U-̧>A˲fBhuDР{ \%LV#1PH9-PuR3)Tf*P|U#@%贂tDJG ZݛfXQ,mL#"+Z:VsOȆˊf($U>OW_*1J-.r3W+̈́=kcpVeV' 5P Qu\8CD/9xo}B"&&|ƅOX1zc:=/\5|C6!jojQr *ؤ*jlJglJ'͠Yc05hіa=; cߎ9"J+rhwOh HZ =k_x՝@ / py /RL74@ S*HKZHCB o,Y٘֙eaQ&/u+ PH"!)~3;J=ڸ%{WwI帼1pZvX E@D{Ē=?ʉ2py6˨'OCc5Ť)37 !Wk?2oCLG!>Bg" ygĴB!)WoiBإ?J[;ʽSL;"@#dvK r5}=_m1Vھ8SBkZd,= Jk| B5DVКi!DWʱaB -6]!åm51 ;Q3B%*1\EdhvV0Χ\4&? /K/ 5Ԧ2j1 6H ($ɔpgl){>Ee}=l; bJ+:1r)f2:M.#zM॓jzKF{ч~s5kIgDtМRd0EftHcZ4Ng8M1A(Yȉ1 BXJw蜮-݅/O_r3dy ks9iyC4 q7n4/2aXtm/h6_"kth·֐M 3 ̖\!GٟijD. c?fuvBZ1nq;퇰͛=eO# ʗ ڔ6ʳP: )c6)^FD+I>S!S /9hl ?~&-Ao:.O޼|7B0q6xAQq%Fvuo;1W-;(Z\崪QBw uWB3{i`[XBm(@i=Щ2˻lל+p@ 뿿^b?7grH# 5+kh7 0 +!FTBFz5sy8.)q E|44QHGn" eD{ ?z|v:!QP{/'l:Eb]m,ig37+}ýnOpPÝ,G*_/_^BKN3 J=-{a4n Zb&?R]S"Cz0ƋF؇Λ9/t~86<[xʼ>4/ߎtvF{.;ǑE¢xjCZ|h:=4LJptN#c:Ma~^$@y |Dk-:Ah@R$F)WB] 4yҏٌ *_֔'N{*(;ija\VSnb4h6HoFP >'@:kLєP=e}P5&P=}>Hn{9jxy\@!M (4T҇`.(P&C{>CZkw<1Yz0OLD- f <:(Ey-M+015ÄL`?Pc^MiNtĞ6pYMٽC Bm@ u!p% S\^c il@! ( !}DH>@kT dPi}TM(ab;xvh=sԧJ<;Ԡ{NK^_}/Є1Yz\ZC i !y5B&Ҁbk.> is5"?M@ނfʪgcFa X5B ~xJU5%@> O y_5)T;B0Lj}!dσFٞ'F8&Zi vÄF%O*2Yz;Lxh n_lyv v𡑥nOciLݞf .-e4˔#k׳Bnjnf@{.gMQ٦MJ J]󠔷AN% (f#_LfsR֧>4AnDnPSS>TMMݧ|4FU! 4$U݇iMM萆$LB&Nƭ? tX|}R CCPofiȪ;!+< \u'5pQ4pkB! \(!k%T@UF(ҴݠZSRy=%wORIK'$҄DWT%EٰPTOGySoXFIQ=d G؇M Iu({@(Ay254 Mv{ڀ4qpdk5xTsH.GV) TiGY56S'KщoS Ɉ}6սoRݤ%Hj3k7 ×I_pEBm" OKXېTn>؟6hwNiHI3bhmHi}!i4ӊ3jj搦ᩩy8Oy8ע*kѦ4Ps@nHLAд&]MvuS] n4.zjjh/mi04GK{+mǽRjah0n_&̓!氦Aap +ş8H2IFc_6ix#|WvZ_W?L&SiңdZ\h+>š@3hԏ?(/a*Vh}\c]Jiz ٍd42F2*5P?.dxMk . >: 6Ԍ#87\1|s?YOg= x+ GNz+')T{̗vG *w&473`9Mi4fM4<%_5G}*1fCXa\ Xi<}PY`YP%8r6k<;_'#mEy BD?KNi8qњ= Zʹ'Sʜr<;WB_fclyxDuA sf93K۫|Vw胆b!M'j)OXc#FFaO`x+%#YKe5/5i4ŧьʣY=Nן +~ 7h*ҨQnOfN iC\( 4^aě)EJ#7kBȏ}BϏ|VPH݈' ;<ѡ,#ѰPsJB-Kr|&=FMj@Ģ9#}p=t`m5GJt \FPSnMNO'tGs ԓ a#\GD䎡ozTh{*UGO6KwDg [A* N R(ԸMGK|t.;0s~2 3$^Y!+PHh@!QoY3@Cْ@ |\VX ު%POg]m?3 k țh ̻:= g={:gj;~Ҕ?ʇ֦_oݠ@n {w=5I8>&B:]uX;:wَ:x֐7X:fI:wċسvY ֠Ojר6h›MeH7zKٗ͹gmI87)1 g{ޞN=Bjequ5uRFN]L|̫6{[Mzz K=z;E!uNR89h% ':CxWC!PƂz!jMB E&ݲ?nSTפkSHJMCW,^Gag?x hBpPH:䓻^y Ѩ?4c! vԝWN[`91n䘺],t(FF+yT\W_̴LrϘ-{5CԂo6VGY _j-P1 NQ=jDֈXj}vՈj{􃜴vŅIzw,JGZ8s̹;ww@'E3+Mj5Z8j e{n %{n ]RQOm]v2 ~9W؉Ζ*\%\jq, k WZW6X!Ǯ:D!DpU ΐWWAնWeݸC6ъiC6YzWZŮ3grpBԤH~yJyx\?^n/_ɿ}߿7<_x\ +ۊ$׿V]z|X4I,~<%~~_oqy|oyjB?/_t?_Zw掏yY:?߂Um\o+׷iKвZ]&3WEq;S%h(&K?+*RQ=. -7GK&+oq.xk|_y(*i]b͖ Z=w':"^k;O/m!t|-\ Mh ":vwws[e/t|3~u%4Kk[A*ssHP¥LCp.g¦Nm[<0ʒU0ڝ1Uhʽ?qjwu)Z:5Eg5WwtQ[v֒~ݔ9>u*ҙ< 7=\JA)MPh *TsJZP 5]J@\Sʧ]N):u}.uz,3s}MvRf/Pj 53:pTRuTRB!U zʁwMbURe{/_[.F7Yz6V^)J+OBSô)$mZɡmj,Ř΅YN |\,! ݞD((9iy:zr,3IRp]?&r5)lɨHFF2cTfx]d몺[.pUЮlMWx7/;U!}:V 2ֱ̤Ziqf>EpR-{J%ň$i/*rHI/d$l$.j$.gf+.[S}]}߮ۢ*/6+Lmz_A[r@{H渃Q ;Qq@$r%P 'ʉt(o[FݦzFi`i]/g!_QbH3(1`8kOj $)溴[/`̀КADk . :T'LwQZ3`V,JZEώ*C&heBp*{\^eozj@h_kCM5tx 1ƸP+qɣ/Wy|1Uvv;\zUJ .h hZAh0qy=.>?.)UJ CwQ㪪i\5=. W᪮vRagz.yy;*}Ut BKw\^;jF^6jG UqMy).t*Uy[͓B|u  |jjEp9O{w]BZAhR降tGզQ!aιa'GSaC'B!CބCDkg MbRY~>*MTc^cI">yj#Wq3:&Qa.ɨVIFI2 r9.l]8g'-UФRW@ ZVAhR w}ЋETOxUզT 㪭Iu!UNJxx와(hMjsY(hD!!MѼ L>QH5Y d6L')lDZ9JUkyU]δ`ROjcw~.Z_xJcylXf+TХTJJ7V ޻a_\YGU$2UզWђ,82%U)ĵz[ ƏY+FJt[QYT :T JX j+$/.-QmP+9}u<'z|G].:|duAw5s?$|sP#z~vv5t]r<ڵ5>ҽπZ} .B)p>aS(]5mFP!!7 R(GFN*\QBx5I%oC]crvǫܖ^,cAatqo!Z2&r:Wujn6ej@&d .9PGt)I=G9UCnQICVeCjVnOYgԝH>lNYjM|,uƯx}Wuw\k7֠b(|+MRB\Z=N:"Btº WC͵)rzG]/@̲]=5r$|el*La9Rw~v/O7O/ԯYkjycܞy։Yumi5^Zi@֍Ysu>ZFՄyѰ[g[7Ɣvl5֚,kFO~`^uYRCe;YK5|G_qVA~Eջko+Kriﯸխw3 =4i{Q#RDiV zѿ}"NzDf(^Wט84zx;F2d\ZR; yiUհ)7l0jڵ^2sSGOPXs7|}) qTyn ?&FZͣC 4  PPDmHN~}gu;]O{q}v[:on;z#m46zE׆,B&$-^Ɇ# dl4@VZ GC\y*`v fXq \=70hfh$~eduA0aCի'QB `ox)V'zvyt % Mxm$ 6YDJ0j8[EɋyR,QLZ(al*n"?9[NtĹ7"ᇑ/A96#xnyz8S=Xqib=O_,oPc1Ռ 2"qf`D`r}򺼿k`8W9:yq9J h$J8Hr Qr!C[`UN`,ME`,2`ir FXʝ#\n舣.9#R0!!DK$g.\~e>pׄ,RӱZ?^k!+1!d5T{.A$/׾otQJ.p5"-هI/T(LCU [Fb| QdxB6`r )F:f5FqQҊQ"4To]x"}<6x:Q.Fk ]8j4Ba҄+8SєNhaE|BRv)CCP S鲊STU)1Uٕ%vg,v" WDE2E2h%ۘ? &"yt/8r1Fk Y޾sŜ2t8]Z:a:jD8VTC#laQŬF13|L ViьLY1pTF][ +&"piJ0e6<7;)[) [8UOZWD8D ^k)HBF! QV4 4ku2x<PF3IO]SCG:M51hMpG=CfS~~MM4; #* ~bI"^(配O$&Pc T5A#{b΅Ѓ]=̧amy0pxC/ Q[q&CYx$_Nyg>8NatLX-8NI0GLIX="!؂x3@C9+%efAMlH)Z8]F 0ؐr7 L|tj9O0PaMl2&Er0A6)Ȯ.EE6qĦE:h-aAп' ryS8V{@ꨍpHct `O'X #22¢L>Fe|DtPЦ1$]ƎG(i#D @Klr#]8 ,t(i- QOΰl ~N h \L|"X3 p:h!(q  DV$@# =% ͂t LJ8@#! xՏ, 0qOW aicbr} 6'uk`4z XNE_/&0Yso֝pO?B}n4PA!? !Cx B!ćlm͊|#])/zOQ).)Ê"XM-v@@>oj} 3˫AQTEPF <g|F|FCF -pX&=##=k LDXI# ) ) 0<(s43WPF٘Cn"`)PBC sc_`arq$5}4R:D:z>:Dw!xKOOhX7}4ROMUG#y؉;lELDMF=8|zn8aS>VLJT\SvT rnJGπ\ۼi?0fc¨rbZbFNITOJxX HOa $˦jᨂWzB+NѰkƦڛMٜ) 2] Tfr ;pEz:XsnLzbx'2eЦG_S5!tB1A& ~<%1c1y|`>˴sݟfb~i&fs2-.qW붑Wx琜92ڡV{ҳzLnY>X]mĻz ; xPOcpg6 >>g. r"||ԍF>-HNPF>m5u8Ʒ| ķbo)qO(XH|>vA_)R#߾߰DG_ {< "D467K)}h_ڦ9F;CsyPF ^a93Z[?]q#m0Bx:Jh+x[x>'iՓ3M?If Dgޠ Cz'"\>[qtx'\ HyzC'qM@\C#.m :ULKo<1m>qv~zvb4H0#-HCDf4Pҡ@ZDre= aBth6Y:8<43/ kM;Ɇ_H/H! BkZqLf-f܀dxoޜ ~x7c%Z,:.h 4B,5t#R)c嘆s~)Y]sG7HD#Q'pY_14 |t>B(#j!lg 1S iB(ڈh$P{e%&"PbD8@9t^ޟmpMk`u൹)W) h$x^DQ$ct'HH,H\xbYJF#e0+3jLGh,(fzR&hvV'aCaKڶmTL$%yİzl$\MN4939+crcb\8<Ώۜt ᯅo0)6nD^;DxmnNJȕiuDWGt-!1FOb6:Ftr^_fgfL bv:]ONTJ6Mw=gF7K'ŬVެ.Oq7ma#B,d= ӋH00ӻ0ϮYNd|*ƚC,sq~,)'>1k5W" fiZtFpqf94lc d#>/lvPz2sv23&x6hXwEO&kH\#:'&@Sҹ5,cFʰqHb}f :S]4;[@]6q!;j‡dLFKtPvH]X5x\} Q<I,pu%lf;nErt }X5, .:D9#H@G#ѿf21) jsJ VOF"~z8_T~yQXjbvK{8}qnA@FW G 6 '4Dv4h~@1lHF#c|;8aEl ^UQWl#ϼ6S-:tjmwÈĵ0"q&17r0*袑KFnzc*h,DZRnvmL*rNmcIBh`4f^3k'^C5NY{we6Ձ^r|u:Qg(iOF?n8_^^:u@zQ"7yқ4|Lzb=&&Nx_G" ra- 8XzA}:]f\_d3qQ/^thJJs`yQIvQ\Ezt$itX8D 1,O+a,),TKma:eY0J I $ZmЃMr6X9i0Rx3X%3rIKvbIG`AP`]K: *5J>[iV$4 d 4%]a+tʧ2x<2OmIB2^)ɐڜK(sɐX&|$AE)/H]cJA{3O~Gِ _f,wZ_HǠ2T/H0:BvSʹ &YiHN]Al~ht<<$0!B,K KdQ>BHtQyX vFHuQ^D% J#aK)D+eFD#4pZ:5RH%ʋbDU>d)>@%!s_>~Mexm$4+y_GB <SRߘ~.S׎>x glLnY3^8=|e`!Y>ŞxT/h$R.̥h@:gz3>T1xgP SHIՒ9m9l 7)=M%?uN%ߓMpDM|\64H)v͢Wp'CiBi&S$Mnz*)^&>e&\{O˟aH;7xHo=c'<0FRy0|,=x‡k>|4ї Շ;v}RYXʯXXZ)ᗮe`:DMK#!H+5!/WiI]VX%k65fQXTam^҉XPVPҎ,k I=RԔ,kS^Mb]!𒈃]tz; yoX7Q`! 4cy:֎}fYg$%,iIL'Ҵd=il$zZWRyI9HF Zpc-fm^դ+KXWȒh$YZgf,%6kmrjmFRYy|>Fm2+qx7>╆xE#ԅZYt%Oq&M(OqtS>zQ' l;]ǥK!Q!Gj1Fpd6B9Fb,x?;QwXRwXRwT29lgv7JcAhyFRr~ "y`qXϮKpe&4.!/ː-CJIY,w$P A&=F?$Jݡ:$J2B]h*$[B5 HTK"ՍIh'XCI!RORJ"W1U d3zGĔxmD NCEByA$%^['%بYb _@PGHzR pgg$7SYx/+0<*κ+QcW2E nz^zAP' z.uW/#KhV/YܭTyH0Ih"nz#Ihtk.tK0)ɐrR>ttꓗQd?j `4T<y8QPɼJBWNfJF[cxK( jw :luv&1 hЊ6) h$pYݱ:E6#qb$b>X>\ L4+<]+wtQ8?{7Ng-P[)V$qm(kA \ݼ~ HLq nyg7'ׇl^c>B#^z lWs-3pgdTC'ФѪ{LJ{4jXϝ?2#ݖ4%1zLb9xůs(4ԫ'P^lvg9t;V%.DKg.ec0d>rL0VN +B A <#yI,xſcUeb? E?J@ */xyy 98 5&BIv!Ġt|!(A䩮tGP:9#vz NQ~t:<ɊAšASk :W p umxe @BXD-JyHߟ`OH 3x!,!:,G^!> >#i ٤ FFAzzF_=&8>^iU7ZV?_%CRB dqj嵬[//8֍G2ЁgP陸S;Ѩu,վ9{CDܹa?΍#sggƍߛʇP󮞎qʭW;z˪?>3Y;Q^=ܼ;k37uCODRgOGRIv_^o$łtƅz$q^S8&/jHS IQ.QiAFi~:Tᇚ9x C徍Fj ށ׎*R{)\1 c $ou ֧÷66jŽꨃtq-ϽO}67҉t'<\+muBZ<˅4R7׋0suEQD#5j{*]=)5j{&6j`E]r={V[iznmVek hj3U;fk,ZCʩ! ryz3B#5AfTIoFFT׺S-U(jU$"-O= Ba}ߛZ=)5R*Ew=Εo[@/m݁l{uu 1Z2Cb4z]'lO ũC&P%n39߭+ԊPZ~'|51kQ;hF:Vd:V~Ա~j X:E)c^|}PV6ɛTyK!?4vC#mLv[e}bN˿}9yx;_ן?_/_LE_<Q8q=eyAİ_˔>?p~]OU}<<SɯӰ?}:}~O3V9YuėE]/{p=Y{rO^۱0Ix܆k~a+!pAjsp]rUI*ONj' ڡ) j5]h&Z>A8aQtr;p~U9́W?s`T;wttp6:g #>>_ =JǫJg36:^X`꘡&'cVzz,:]opN'x}~NɦHIXrip1hwܿƂ%19gSo2duthv:Z4!:Y0MqtN׾Mptqqux8 NVw?Y4xtWLG.@G:[tb:Չ/?JJpX]?>>7h立~׺zkM:xjJ}>55`aoCP^\!uXq:6,:|I~p7^?:>N:?j< FIŝ`Χ|6jgkB `Ot9!eo}6jXs%0a{9Hyhk4)FvhF(^:>FQ{Fr>=Zm> Z*mRB禃FУ&~|9(qurT0by>J*~I\7E(B71!eLe22eڸ>htTfKrik(_/o;J\zlW?hcF:`ϗxt\4"rX D&CLSQWt:DG;85b4d[kJǣ]F9:2GSSG<~Ԏ9[Nz~P;} ǟv|y|Ztt, !昷@iLd6zo A701CP/R/@~QI Q+^yy}eVc@Cp@ Սgȧ.18; tB Fs[  !<7 SN}9ltty(wu>ٌ}%&`Wdss !:1Χhr~Yʭ`൉>ڿHw>z.π~=N>x?:N}&Xj('^᝽t%FmR} ƹc}vu^ ^/ro>h FÍ 36:hF:g}_'eX^7t::XPG;Cub*w9c:Ǻ;O~~FgTӍN3%3,CU .:-Kxs.Yt/dzt桞:4dγUw?tRɈ*{Y]zjm^ɬOQdz>ET\me'rkhn'f;z` ]/8v3^;y==N׼FKlWb,5 tK9úڜA0ުs]OH fQ^47 XAȖfP.C:g(Op.|..ܼ0<\Wo Ch~+ J 3w+@ϰܤcHL#?` ` ;?L ʅR(67 (\ppY8\/T9$hƁF`VAXx5%QNȍW@#!P8:g{vb>]Cؐ6e^SF:`xZ~0t4o?#AXx 7r(w|!0ptI&]Z S4L;%V(v˴ߚQp q^4ڹXx\楞%S }G%aR/v0u"z:`NGQ:]8p)}(;;/oySM+? >={`34{j{kA*T«،sBO\T˪TˢMUK GW'~ġޅ#TnəIKU";F6jcdosշV$Z4ո ݢNnF@ f9awl r֋h:5v'*'Fޓ;هyJ'||K5D}ڄGz jrS+Mm>F;}F=ÞXFj$z~ ^٤ I+RhFť'~W^:V6=opa~aסQjSNǁt)~[ ̭jM5Z,5]mgتZ'Ƃ~"t3hIkVVe 6ZU\Yx2 =%ع2Ŧ 4`B lAeKV!lJ:hR%ĤC,TeG]{QE`vpPG:[=91||!nL0A+c"dPN['".ιzl`rZ n6N\ +M +M &61l4x0D`Zce4^cFJэb+dyZ“VN`CU#\lcEc8ig:s8YMM|""fzDLC!Hfϊ9W+7~hA0Orӆh'&%X֦+XTTL&SIJ3IqMC`ipeh00$=,cFC"8Ik؈$h'"N>?D7S1S bfffTbf>)LG̬Ҧss: kCZ(t}M;` v%ֲYL< 蹼.aևØDEa'̨D#^U1]UQʸDR21!&I _N31^[7df:JФ"N'y}|o繦Vlvp&xE39DυYKRJ4(HD#1^9=C 9 : ciCB1F"_aE;6(a86+y&=?3-Fch$rmQE1kӇ쟐38iQiXوb8QV_peOhT WV.hVFIDC#Q<]-;]cB 940vx30!~4҉sU302T;>13,F[pTኍGGbfd!Fzb4\"mDg% blԸF[iܪ<_nyk>*ٟЛ v.$1E3|8ꊕB_::H`N`COzy+4h:4jT=XˮiVz]:9vy.Êss8O]ԅ|BlS71ۋBV" Tb]9Bɳ _q  jΝV O&:D V鲈\8Uȅ R`'ʮ`"XQm (4c&eDIZI8MH*hJSp" L$z/2cL4Y(EA\L\թ^[w1 =W7 `Y0zyhD |zDY`UGઇh&SPCt10+m t!f0y_䰾'aFb~XzX>(F ` ;|uL bMEPyGI:(lJAqGL>3bQ=T%B FٹL|L+XN(4j0J4JRdFRJ8DÚD4lL"Vl|pX'_pG5b50bҋa`2x{̻c>=;9Js5ACi S&(N:QeE8 g0tEuy%;jS*J $\jH* g+] vхFRdd0mJ 'yY(ODʮ!|F_z̯\JzpT oD)ܶC :{츺j`R{[ձU-uG/J2ҫ(8Wєʆ2pw4E OIHHHD:&Qz&Qv lwbH;&# ED6D,4oaXR4<5᫸(i}GU$ʊZ`ch%6hj7(wqZ<󪲙f2quQN0CM4hDo;РO:SчoF|)nujo;7L kLBլDzF,#~` 88!x5!EGz " 6 .fݪS>!Q$"& Q޹ECz Ň&,!E>B#THSnϳad蠗ܡS))OxI3z(q<;hp9&h#p`%8pp.x` {!a"- T蒮邓]h(0e>c\ld\J`IOX3$с[f\G !𑞩C(!%AFfy.L 00yم14E>Q(ȠH(S2(lM@ dP^ p}t„xvNxkz;njQOR@U=ə`߁4DD|=|"B&"J(AW BF:[#S"~BF>!#?W1#Cm#` aga1X\X0$]BegCd|oz&\4Gq#۫N>"O='V'APBt#y/CDtuD$DB1'+aNNz͝|en֤wYND4^ي5lŚ6x7ǩ=wx O^pdYl1WvLh8X>YV>']#'ؓ!CDyD?~ g\JۄBWJеyJJgexQ5HJWݼJ1a?.oySs:pzPg^%1p3X#W06L:&%Ui V8TT TnU:A3|uyN=IM#t"Qz]ͦtn6ψٔ]&i7ns&q8a ^OiF >b <8Fb(k0coC4=_%N%,ڪ+ Q8FBTxPWȄFŎ( =/#xFXFT(_(_(C4J01<P:u(M#LD ng3NV[15zS41UZESm&Y-ImU[}~z#,&CDt ~$aE Kg.k#a^~zb y Ln2uR L 鉁D|tVf M[#0=W#0Xnn"anUZuL׺ yex'jInac'8E.0 V'VP dȊ`wx;:(`ם;Ƥ#qmfJny#E+i}, HhAw=CEC|/K|]OBt,3 p 0TJFĂA lh|kNʮ8FhP1,V<~e<eof{GV?Sj[@-h Q ov, Ol$X=u0;"GtHTIMLz\qaBT>1*_B+XW:YnUooj|>Xv*_NIVYoikj=[dS:F D l[E;`W70A /Z$  >Bu:QRN0$6Hd v)4݈B Et )DuڰCx"Oii豁SzMT UWM'40v0/g_Q v-r-ڈN$22|HAZp^/̠NKٓGA" NtJN O!K'H5VѤ'"RauSJ0<S|o豽㗮ᄙHh$&Nz !*OC<LK>pn՛Wχ¡&JK7H o'^qc]Q E5b> 8L!D@0D;`p8lx) p42IOn|,.]&dm`jlm21D| !0y;{XxwnOw_΁BkZqUV,X\,z.q K)x4ST-( PeY|!lNl 7BJEJ11^&w`28tWw`GqJFqJ2: =0sI Ҵr>q9}t ? (nzKM$ƣcH1<gL1ӜLp hxmְNwkxm&"vFb3fjA)H!9,#F㨍h#.P7 d!8]!S7;WSGhkweo$v LDa4 ͔q\NXƕ &1&-<7ac>-mBԃ7X W1[Ѧ@7l.l=_iY."ê7R(zI:N.]䦓hW캋8fkrfVڂ3hPEz u7PܐM gT=tt,\r16[rDrv/uvt.xEOUM״Ø80n]0u0s {qB0gCوH4:Dwqj\j8`\du6oMDnp h$dFB2,Gg2Y(1v;ˋkXmS{Ռ$u]?yGp+^<oyE.̗KemN2 cd (+i)>z'јM܌'.qËs hԸ-Z: zu'q^B6A_蟯@9A ]+TmKkzX+Вh$FR$WW]Y~L9"ri2vT@eKV(ǒVX[,"׎V,Hu.D,ШI ITO5 ^'/LJ =U)pJ e:_֨@etIËh$أ^/\r(֨^5K Z,)ZI+4 #y`-U0qu?(e.Pʀr2$eCK,H},L.:'-쓑I;d%ѣgx[ t.lxW*-F2ٮG>;zVOOH6ZSSҙJnp]CK2T%Cmj El<le)Q%a=}eQ1}L{rZ]׎^ϮWHswKP^'h$yFR#A:,P9Uh8+ĭQ0 ɒtKp ntKv e1[W6MN>Nz6;ЕMu!I#AS%AS57]ǀQa9I S)-SAD2aCR oT<Qp} $eIQtM)4M)EN-TO֖BTk+Q x‹8N Bꇌ,xH ~:VK=9A8)Xvp$ 4οlb{J(vR]f01 4XIWQү>)OV4jrHyu-Ej$C$Eh-?JIY#v;>9A xz<) (]ʩB*OJJNjgaF6 «'QDMy{YdCYCY C5%BT:'!XЮhCY )fHaU-wEPYTsJ9K#%Hr4/]Tn]AJ6BOzme7wD$p6Fh$)4yF2¦(!ˠ[~6AMƖڷ ćT9#I)r\~#UUNJ4ɩj)`qJ IK3FWWjFFƢĂcQURvm<ĖYJ];t=E6MNV?L)5E8E5T]BjEb*4Tq7u]UlE]V4W}G_[Bt!1U&-U`GRHVyYYU ]uyLLSm9LNO5WĞ2k`U<5P^?.&$Ԡ˻?Orwffx\٠HO]40zj!6jK~M)|~Aa3n(iR_/zJZ(?)5F*mTI)y<QRDQ&>Q>)U|ʩ~>1&)OI*.x;Zm?t7m\'z]d%ɆIIZjvoZIIQFxk9\y,3=V~|eC,JbT^Ry!FWyVyU^vw]./Bzl-*>ZK>X@H W5_r{Iճ,)@Z-=4+goyKeO>\]%8i?OnIH&MH>%*֣D$hկIѠuIQ"(1T6Ru0LSw 1RuK%w%]vXAm-IHѐsd#tm%DKfaL5ؠkTΗtl[rtVh]ZimP`X/addWub^ViZƢlSªLÊz,iJA *=^G+2jBSoͷ{MρSt`4Wtg8I>4^IKQ:y%+-u_v| һl 6ɾtr{Xbi<5y%j/;e+A`> iAX.1 ̒Z}I5 H]+E D<UҮ]-hjqN qX|赵괤*BBHVUay*~۵!:$ksġod,ɤp0cY/ґV_n %H;vDOK?e6GzҒPҒ .1fGgl-I[ҲRLjU1BŲg'H'Ck7Fl֠kH| ij?,1Y]aVk /MB.a DK3vęI*Tai=,oXޘ4+rbV$mKzղݏۈ(:gݶq?g9pʦBZ:5&wo0fmR4e9q Ke=ey0%)a wk ,3 4=QlV4@qTNX.:`ufr֜8d&̺+K֢R\%(1Y Ǔ,ųʤ"XTҊYTYyzgXt}K'&MI~Im*h&s:%)VZM~^P^YIv3zbL%$sj+jCϕJlCJZJjm*~ xvZXRh共B&gVՔZ:T[=[rr4Bi|"v]^\}ekaL'|@-V׀-`F҃`w] ʦJʆvMy7[:}ث>OP*/6Zxjij l_'aE%_KhGC*^SOYGvd0=s~]:*eTG GLJ,u:5ǐT¹J%EQEHH2a.(=z$pBddUQm]jԨǔ(G X0mxA^M bQ2p5|S<"'&UROLS=#eRQʄneg" 0jtU!'+T1 ŠEI'Qϊ*}w.gf# vRPɋ(XZ$ z#H&K:B37Lp& "L3x3CH(0 4jȮ 36`:)pؐFhz?ڨ~ ;j-婰d N %yNie}>FS҉ÃCPk5=}hOvBv:|-Cux_{(M]O]=99GGUQ_x^tGHMj2v PNPXH',60pPbv`l54v$fds4z7m0Nk#G^kkkPZ<5yGٻ<ˣˆ>vPc>uݷHmxjm>OQ:D71!5o4Rkp<]Z~7Or0NxxAS,SDgI.<77Қ֧JrW upSN騩:bW*daz\:c[0RcxH}H fpjujղT[xgO675iW %I&p7,ʝOG>xX9Tmkԩ^;6&x5HjG U[K-Ʒc^;TjҮq)-R)Cw(*Qy=w`-E=sQ1=ΕXymb3O^>ⵄǑukI̳Q;Kymng~45_t拵ogVWZ,y9F+3?iӽZWmm}'|gtЛikt^?i%Is\EIHssOFӿ^烢| I]o~/S'Zz_(;ͷ{}Lׄ˷_~A^z~pNy޿/FOz.yR?ϗv.Tku?%C}ZQգoyYT!VOwp:|NJ9oD_uzz9to?G+~j;vykOWSrilMDcj9~7ɢ۟7_oï??11s8=&|܄ow~' _~~?w?/ݷ_~4۟_7>ϿOr89_ǿ4&=.S?}ow9^?|kL7l晝]麨 _~ӾpV3]//?__ZM鯿*v6/ƏP~>o믿,"GmΊX_:x eǟÂ_ʞz?\$,}Oau&poy?8K?Clgendstream endobj 129 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 807 >> stream xM]LSw*Fɶ,)J1Q(2/+pmv(eo,ÖQؖ *rF.k$]Eه1t/V1&y>= 6UB1|%ſ%%_]_}=ë52jj^ uSOrYF+!8xyyy..;w$X7)**z.h,,Uzg۾֖[)1?Y14Ƙ\6nY0D"ӿY| Ia8_ϵwI ]ҧkhp$M A8qdf`A XzK13Tv[[f 8JY@Q?MES4m}ItA-> stream x}Ke׹Z򦭺:|ƀȂ3L"f2h-_<8]jf0 `D0|.Wrc1:wڵ/k}:_v\Zs\oJs^Jv>uLr~{:{~}8o+м#ZuJ]_n|:>ݼqj;^U<t-hWp׹6 ҁXG9:2SE J6wؑJH5l$4eLZ88)2eхȐ(`LLK:ODD9̷3ILx1v 4rܰhlG&֦`~ i`pFnKum_[84BS(˯#ۮ]ubrf OT/!ZL[z@ԇQø0 ZXqw6o0FwLGhYe`Ѣ;^^ 4N,T0$c5@; lƂQ:%I:GGZT`h|"ƠU{(=^ڡobU) t N,3cWL6.i=8ڶB+ih<(,}SPX S2jFa\Z 8xl|euiuQJꎡP{zu;XFu+J7FiKƀV#JLx@*$#+ԯg0k^>PÐp*h[2jFa\Z 8dl$YDYTnji{Or=+_sk†>@2r-S:[$q*@|@kTHQڦ1 ǩa+egn hZ˨=w ZXyD ZN)Pܠb;f#q(Sp)H<`e5 Z`UgtErhȠBJ?E!AxRXǖ|2u'Q$ pBY ,}!?h`2f\q-cKt2B+FP16 Il=)X o>m@;`}`:Y{ZF Ste p̤Ft*IjEl)F떶B&,7mxlCHÊ F-w3!b"M $ Sev<p|-<"yа ס*H—%%=BzaVӳtLz1bpUie+|Li4NUE-4HiͬO0s[NXƊd,ّɑxAsIU3@D?QߎU2L G8` fʱ@S>!=fp^D2&șCڹ^&йq#mQf$U! .^u\Xz A[OCB M2  `aA@>B= 7]UȲ;|E0"Zc$ N S* #/Bd\{V&49 hS%֨i l1Ҥ+vIwaS a3#ءmPd!vHZ_,fW0C^;oBMqEDS\Y),&$C[9$DSm7!oHfΰBgX^ylk-Hk $ Ȅ:Ŷ"7ބжaE;c,i,&xYnBhm@HsG~$y,(YGy˻ !iTVn,H$d&N3V}0+YM.־Ih!Pʊ0 -HmH:w3RhFq!γצ`e$C]XqfnݡHUq:;qHƮ.źwDúgKt"wrB*Ri;y<[);yGNޑ~[ɤ )djHbUcBH[ekLit2lޝ#g'2nV~H:=k"3RNe:VE[zUev i{+0Ov j[\"@P[Y+tB en7 RTk3RwB*$ſ\_ts0&N'G6uiy@_?}xǙ?xW9.jfV`9eG \WT=6dPXvTtTT0cG&lD[//~ڶ7jRDS:8uerFЗ9ީwSMqq㝪;TAީ&y2y'N]hrc_Yۜė5 㗁M1_b= \槎jЦ3E;тi)\e12j(qmT /@lCQ P6y)Lj•\ X;"ӧ~Aʨa<h-,ca6-ꉧ2! 92| 2n^m]Ze:2%, aZ `/7/޶e1pRe(u3WajjB eCʨa\qi-p M.>_:DG(3R'rϧw~r,}p C -x9GRF (::[mrmY7Y0Xͬ Q~!Lűj-2XAa-Wԇ16B):n<6\Tzv$qE };GYQcINjqu*BoP$-h,z>ƅQ: _ Lsv6Ol/R!mwSm-JL.@iqզ浌 0u2V22[4k|iW0:);5M-XYd2S2jJaLj x\p. ;2/Waxנ:UUekwWRUStu<o B@_fMb*7uI)Z~u"(DX]![`Q @JсAƠ^ÂhDGH\p,MZ.3m:WKyT06d #z~5nʽ$G8L!&^xũewٔ t5!pY XA>q xv!wı'#׺p$6`hdQ[5‘d-(*a}h5N\qت+ a YǪIzzck(Mne+("FhׄqAʨa,h-8M&F{8s7XÙ=ؽX͸bO'eU)Y՚h`&FdqD\KS'9 /-p7x5+:z(IFdKBP uvg`8ui0=s =p# B r3H€ك.,$2}U{}/kVYp;pܫAz-;L68 .=k6Z hQE8Bs߼ &v84. `Џ:"M%U j#C͟ !D9H,nR:(!04YljAdrxFI #hEAĴ!$00Is2chF?6vE7+ms$8$A<Y""@&PR.~=l(90fv3 kG; Ml Oa7α(c@.*"Ċ8 $IEpJGxȺh\hWX,: #I B<\%-&OPwp"ފNwYPދLF0oAP!@gŸ?WSճ $7tғV6pm"I˹%[!B2YJ @ `Hӥ Q)8T"^"A9k vU*Aؐ ,$(N,8Hoz #"^%Hl ZD3R94F2I]mYnoP$!#-N>I5Jd dMbiE9?LF.,zR $WtV c"d;OC O &O kDV^Ҝ ȪApqQD-}uU$H5!CB;- 0 T7@]|G0AH]&BaV!|6C&pۋ(q lր ]] .-\hKvi>H\i$t*$wf+d-Hw.¸ATh]Ќd 21$E|:SdG Wy - }htչƥC= \|h${K܊oFӡ<(q,]IgBZR`+V{fBeCB>IQ)#`(7ٮfBd*EIg-XYLhE`*B΃nL[u= K4hF$h9>&CNQ-XY8]M>ZȜ߻&D8~Lku: ]qE \/(TfGv̷JDz V>"A:@}8!eΉV.¸q܀md pl`Q"FSSbi+plH^ƙZė12q:XZlhaS(wʽB-Ir~-Kw _+s64ʗ+K-@8[[H}hr[X!IÎǔBaC`x#)s>WBmdvh$m=rѨne+(dZCGRlhe(Eka r(Fd`U$m#Lh+sO=t&Ue+(B-%BcI{2'D FYvЄhH I>thl nOLFYL`0E3-k>t)EkaÔFsI4eW#l0'DGx%XscevD-5YscԪDަX%KJto[x5%:6srJtbOB1K-xlXך]a=x-#xM^Xꖔ#%:oRM uu^ҢC$hpn=-:yA4 YV@I,2|rLg͈c~F=#x*ӯHf x7#M(g̈́4Ң5"w[49@ZLir/Hғ#q'!iw /:;i2^qY;i2tVGС:ҢYGZt\iywp\ nqnwwMAZ˗:AV[CmvEӎuڑ5ȋ^f*fDztА_.1dkftBP\ hfs3fA<~/='hGg@&*:2Qi"DՑJDɼSu'y={{R%TMީ&7y2?y'~Nhrw)ToO3Gw;]~!-"?ٕMf^$ZH`N+Qd^@3[Xd1he+rLOk׽:|jm?kV{]E$2!g@6j/K+s&5?+4(Qтӕ!IX@eݱ>̹Š.G 84 ![djEO'( h8ʜ-*"^[et5!WU΅Qt84Z.7 ^PY XE=WT3ǰI(֦t5 ỼBч9Z0 ZXY#I?A2^?1z$M$h7 "RG=-ч9Z5x0.uK-6 B|%{6p(s.5 WxuY ,}p E$bwɓsv .s-!$RG $m, K+sbŝ7y4et5ba92R3Qh&5dwij°8' 8T'S+"ODYQd9ơ_ǠQ|ueB1 s ~e;~ sP S VS1-g> |K qH>u'b%ڀ!oP[9 V[r/p6o\xo]C-ƙV_8jsSZ/*C4T$*ou`GoL!->)E&{ 4Z)g(ח H0Xs<9dcr@{Gݽ)`ƢBE䏪\f&HyARB7s~\o&;ZeS.\B'GR>] .¸qh*5W)&gBi|; 2xbw lp"3*݉aS̱Ui}:NҧPqQ%=Hm2(^O+ϴ$Qc!eNަ?`Νk˝oh ([4W:W:Mi=X-1xZL~0LpI6͉F q/Cay\$Z4$ <.~gTbGH -ib4K1lbI9i6Nle8h/'OˇV %TQ 06XNiC֭r#0M|-@&+}Ip,(=%t7µT5Νf2♥'M6`"WRH+<-xK8n,o+$j*J8__Z3*[sM*iNn}ip{OYP;ODp{OD@u!u XUumYU Ly+Li0![!m}jcA ^:&-3h. QyD]٨3"7/HZ[`q1I&xR_22P_.CP#uFziOF[;dVcȯ-ՓfΓDn-ߩ-@^)huWV;Z$~ ڂ[K& )%DybA"c6ugD^v_IMI t1ݦ96u3k;T~j_qnm"BlH/r-H]w5FdNk3#mf ,5*f šӌb'Rn['ybF䏒,Hmdɢ-HZ}!cBd o}%~F¶יg@lf$ܼ9}=O/w(}z:m/70X|~І* }:Tdzyw Λ7}7H-s ~??> 2L0-Ia3ƟEA8_n]_ϥ?<^ݳrшBCeR?\𥈲d5xyi!x˜O»7ꄘA? EʚOѽ2P#Ir Ϡ-֚_ixRov-昨qx:߁& Wcv.8Mݗ%("om9;X^T :tn&r #=Taj<+7KfAh{Թ_(uďr&i"6󯴋۠@vE.ux}1bїщֲn}mJ[5<ܺGo HKB*#ï_P#pH8@2՟:#d +BõtȃhG|5ewt8RԄ(WNXdL %sv ]t^~ä4d8ɇGۻ fp}~p~o?ˣouݜ?/OWorK51p_Mf'15/_(TG}K%;JY4 Zwn| 3)5M0)@ LjH3$Vr9rEBkX6HyW$ MŝI~eѲSRt_hNԻ,*l_7Ĥ@:EncF#uL&-YUuWvSD-V5OU_6x0l&8Sr8|0<a9ϟiGo/w ;9>RcդUw C`@j(q8-'.6aj3iL<ryH[{EIucH.u^ B?=|U:T=X.<WtJ}={u Ioш3)(h[n>GgXj"ػ}QB`.Gil}:Cz  2>„u9 13)ڤS8!jXL!ԹNywʌj2Ǻ^xpIJrX#"\dF%[AV\}{49p|ռhi&OUu$ߖ̷pD*s/d:D}!` naf%ʹ I >&k9Ϝoـx^觟O<^>ݟ37GX؍?<n,7(d5bJ{rH$2A.ޒA!}呦t{Ԥ$8o4$Dgl 2w3%=}Ò% KO }P1'j??^t[$Bo"Ix3&..m@5\OrqCȄ2] |?IM50݁ۮm|4;6FbuLmR@DxMᑾS |L4Uf+yKA s_QrYٽ._&n\eA@#ڏ <+eO Xn ߑB Q#Ky]-W;3Ty﷋W7b}[ʵUtk2IuL-49I:to6->Jo8qYKI}/bLk}{? Zeb 7_bmkge}x:ǵ^/|ёww7w^CzHz&ykk:GPGPMK5MQ$F ^92CU{r5Mc:#Վ70'&endstream endobj 131 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 555 >> stream x-=la{ kEHp»`!iTLpq^ `&B6j#Д䢩w4#yEz@is qF*J>Ъ@~-~<"x ΃BXH*J,rO9 >e6[|nW\ Xy EMSl Oll24B1IT&(^`, QXfeB8KEP0A*O7[w5DWżNK_UB[ދ/zX.:g4 <pxa!^n;JpA`.||X4^.;Z>7` ڤNh%*S$S )(}璄VHaAI]h޾m2 .\?+Y2=:7 U nKE.t+Ll/ZXA]HQP &VF#ih:djF]lkp~sT5~øvL !endstream endobj 132 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 362 >> stream x_CMR7',   ZWTmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR7.CMR7Computer Modern2p͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0wCna  7 ڛ %endstream endobj 133 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 335 >> stream xcd`ab`ddds4H3a!c_nn}=\19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMUNL:)槤1000300012Dqq'}?rD3[[oY++W.]E=omvm'.qpgcqF|jvd7_SN^0wT\wXpa`yendstream endobj 134 0 obj << /Filter /FlateDecode /Length 24386 >> stream xO'%xOS֢ts?h X,j 0:VkHꞙK=TT墀4FI{x-/ǿ_?/_?׾ϗOuܯ8/jr8_1^y_Y~?_}]ףy\wg8S)woǧ_/SVarz?' +_ei=}:gk}^aw]~)#U^O/n*?ſO$y~*1;|oJ}xc/5(%KϿ{G*?O_ծ6^/[x]~?/_K{gݿP ߣ󵍗rךy^׫?~efwf—hϿ/'+3+\z^L7|03jCcuv]ڋ<|9kc*ZEkh>Cjm }y~^Gr泌R uz fúεfc]^N&崏P1Uޝm}z41\c݁ M:s+Tz!RRU^^2,.GR/Gs2zt٥g㵯\y?\ך!)|lRsRfsK֗ܚ[__,o{ Bކנ/ia=׽j*^s_1^7gU( )sR{-BVO5} MX iiavom@J2Ƶ8%^W34:qnٸWMOy2 T\~8o{ 6(v@a>tf]7ey벮&DzeunK1}?5Cl^w=Ԇ fr{[k0jdkte+1M نՐfM --봶 V,<ǁھÞ -iΊZuƺ]Iy{kJ-65k^׮l%-|>VYӭud+4 -#tۋn YVW-KD^0KX/h9& [ ACx7"fv֝vYZ`M/]yӵ[ j}Z;aa\klG+{ǘfY;ȗ|^,݋Ig콾9ea!eSjVZݦl_ B%KYx㋯Mk6;}a5mKX ZQ.^;zpYQ2Zuu:u>|6(o0꺌VzcHY56{k0Rפ{%jnhjHSn,/Tj*^sj]养$͚{pWε_u_^{+q^c mX i ^&޶6 [ B%KYxcWY/9.GjD)oU[;_p X]2 lշ [ u%Ӱa>vCKX2%7"^AxX64~d6([ "Ja9 ~ۿe tr3ekJv\Y۰Ҭ6WmPEP/e9/<}JcM=kV׬R[D|L֧o,Įiaϯ`4k):잸+zW5Wbm֋uMvyն7{]4'=kU7Pgٳ)UfЮ˰.XR[դm f[뚁+ǻ4Y:LVj-w>J\Kkue?se[zL]?fw [?XwcSV/f܎5p;l똤]ni ں/4 {\s{&tv߰sǴ[bm- c㼊k7 lnךy:gfTUoUsT5+:tfn_uyk;uYqïu;\qٓo]-wBŞ\܌5~.?~ 1tz㈶ۀOz @ӬvrSWZO;n־ŝС<~q!ֻ0=p;Dc uZB}z8푳cq{\rUI|MZgf ˷^5e4+~bkMEz|I ?[+aM^q>_~w9v-L߅3MQ#^{] W^W{37NᖦGD^%.HbBF?L;Lk[έ~֦utnuc9 <2xnZC>t^ ,O޽^vxk[)?0 [+޵~]3psכ0%ׂ紦5MkڵˤC(,iSk=uo"?*4e:4 Y2[t}0Oh0K\Y36\]Wl d߷ofoaq:;޻>,+yӜ(_vyAѱ.Lu47޻茻5oYo4~`暆S-$PV7\Ɓ{4Cl+Lߗ9}a[l71^x\ssʅ|,Ž}4vuh&쬋4óWz#[ 5Bt*57>K>-ͤc4s;0߱]55;6FWii:vny.yKqPijix4'>!X3(GbM\n4> 4>!/,>KA(=V*v[)ۑ7%JQ(UV*֙[);^5Vn.}N{N:Q"6nt+̡ٜmmhp[Q[ { MGc4^:vygXAUk4B˪b:0,HFVjXhkh/AjQ q[=xQLiۖQu01%mk ٷm=N ! !5eZGj*^‡qج?f^xOHʮ{m | z~MVuɰoX2,~!`e1 ى+pPTU-,^!zB6(,HFV;;Aٯz%0ƵMߗl_/J'LG杢?וS.pfdlk5CKQ9wk4X4M76)qBϿCsBє6 [ B%KYxc[F 7vӸv畳mY?,{ [1 }a>h#ы(^80x S3ia+h?\l^8d87 ن7DKAjQ"M q`l/M3&8 cƖjy)fA2:-fylm@KD/i8|lv0Vo5:M?q@vcqn%,HF^H7?jP/TB8066McG$,}O C{PK%s]6 цՐf= їڀl5 P/e9m'8z48\K8WĚjK !W%-gN ~5 ^‡qyh~s_Jar֯{;JFW+a^O[iʇFu7'!U`*ZDHMu X ސrVjȂda5#+! hP/TB80G喝᪝'ϖjy9@6Qŝqh{K{$(y@lZnab c^34߰<8Hk_Cǯw-PX1Wg-h'|-ѨaMtixЂofΘg^Պ!;5UeHѼx5[/_-ѭ A[/dX O>+]qnb`i4xN~]ezMBĖ^XywScC4f!ȻlG+'h9Zp}: 8@O֫IʯGruB^נwqHx};54'"\os+;5X4tŲxBiќYXj7 цՐlօYlP/TB80qIY_f7`\^Fer]ת%,,HFVCl_ B%KYxc o/ ^z8k?{=qf B􁇆^@/z~Ja> MM3=`pM-!6VBS=?\тI`VǑ^6Ј]P uQ,ɍN`-Y -"Xp8WN$ !M[zMTz,<ǁ]XTء-o4m闎WQp yk^b=цא7|ilM`7,|Z89Jj,gM?q3ڲf Dbma7w@d4#õ;wlw4@ʣ;՟#ixUwlUZj +Dk'sT?Cݤyvu;PqaM:ŅE | t)o)܁4~.Ꚏhy~}GNZ_U>Ҹ3)mJK3}Wt[ *bvMj84P`wDZ̅}@s2bYopT.MǝDk;X3ra qqY byቻ{Ϝ?N+Sv*c|L߉cS`ٕ)4rۉCص9!ieFbQ71l[Ýv[[9ѶDoC c̜^y K@/MEK3}\ƍüYE.ƃ5 x4ޜKiկhV;*lް7s >ɮXv:t'Ր=ȤO938TTؘ{ hYO#4faY9suٻ2@E$z>b ˖Θ΋nF ^| =Ћ| 1Πav0 I4Gs !K3"|( Wmc%A|XbCossG '9KR. w3tin2;wh}2ti*`ֹ4 ^Xp93ն4AURRLnI'jJz= `4a0Z T>߂^ae¯a0cX93 2K\FP"d>ZFԪ 6\s3yҍɯo1*\/k0jUh|0z}I`ϛHތXXy;CW T(>:y0 j\T^"6$ mX i쯕i>d^D>6φr8MP:-DbhZB{òduh*Hsn з-!,<T^kK۳. ys/dd4`)]4P<\<[l5Pe9 bR"7WPm][j3UK% тW4& >‡QȮt lH8MahN !%, Hz%˰Ʀ dCj]nů}eO>oݲAD`_2D msU8`Kj,tlnۑ.j>Hawt1<O:أ6.v!Ja>0CAD<_:E/6:@֘|hgܼgaNO#Y=fÓ;cGbgmۡS<G\Erecڎ7U~̹jL'toZR8ᵜ åN8o>uq֩+Hع'gw,NPN 9+ͮBnj![Z7j:0]pb> n~>Yv]@9t}%h(X`y <\,*DZ5bXz|&nB{p7ɸ|mV( ou4v).xڥ)ư_c+jƗ%sGWvUqW% SXqv( { F&'_ h;m R%e='t AEY3p٠Nk \IKC*f\.`@V@ ^kXa^3B";(Ϸ8ve,C@(|>7a'1jRӹP\%p!l\s3IR!:q2>/Nly2TIyd"ۜUn57BN7쮄kQ}Vޖ^Bn]Fp"iLf|~&\)Вyˡ@m^eB;A^Q 7n#͠w61&(~ }eI3|H&·ã,ͼN|)-}aѱP"K8 ~K+? l4-'oCq"iiY_HKY%̈́fCqt4 lÅ0׉W*,hiCcinxH"- 5>׵ ?A'q7 &@+ ki 8.-O y%SX?C: U`MnKXՎPoaGڷMNa? l0V}LN߿ՅȮ%RVʦ`oYJ]Y T=fd)i?lgoQDVT6پ냸;-۹Zpf WqԃHl|ⅧxA)|caq +YX,tJ @6rP R؈=Ba+@H%'qmqZ&ظ8CI Q Il%Ix b'6FFlaWǏG8~'mqT $ó g61q m;X>G3PK fY]rQwX8m@N",^s;1k#2^=EfY=S[3,9P*ӂd\Ǝp\/ithd2EV0ȸelq5cvD a|P DY4i2H"cdĵ 2F^6('qPe9J{zR#R8K0-PfId\ADY-$2,<%+1ec2?r' -1olTw;t.` L2uj**㛇BAe@F`2`ɸ.I*j22FH^epWgLf[ 5'乻e왺 $Z)'ٍ݇4LsnsnU 2~+=Ŗ 2U8{e 2 Ne XЂgI *zЧ &cϞ%O-3o1K U0Cs2E *c[qHT8 1&pW$$50=y2Ibw`z$w=gȌkgNW#)l;q-y 2cBK2cOwOW-,$*v2cϰۣ $3v6 dƞs2 <עU{.XTf\pu{X$4T]tиHhɻ7ؓw0Ƨ&1kWH%DZ[td4$`R_ /v7gc#1A Fcܒ@Eb4k Å;9(]6JZ)JcO>>"Cq// (}5ƮIW|b/֫Ai\.$ɱ91]1wJc9)]9kQ8=4vM08kQ8]{ zu7 Aikjڑ@jNJc\$0xFw3(]דƞMiPfg4v 0WhRTkU"pk1{8Ih2>k2E*Fj1]ƮYS }_@_7 ZgEN 4Ah A ӝ3v g욍d/Fk;_|ƮAb3vŃθ&kNZCT3v yqT7b5|.tƮF5]\p3v 0Ig\K R5gJZ -g욁|Ʈ5] jR-@  AM>c׈k3vO|+&}h"4v$}ķ"0Ah슛ŀ*1MBc,4f# .]:3!38'>m|.NRǬ,4]s|Ʈ籝A;6IAh1;kȂ >ch]|Ʈ ]w>㇦ ^d%BfMPl]CZdp>4oA"Z%W`=ݟHgu?b0XO[>﷧3+•+7JJbR؁mx)C E&$bc}gֺG5.P?-EٟMkDdw&HwyF%H$<@m@ިz) qԿUݙsȹ`LGV^%$$ók{@9y: 1l;Yx _r3P5HN,0  $/K#X69i(!l~ rm~]{qX%%" s&jYKљP vRi}bT^y7ɞ5I7* I^2_X˴RƯj>s39q2>_ĶvG%B>r+M_!,o6 'oP/e9OZ6_`9:J́Wrrf 0h#9 6 'o~s;ozb7 xxI:%_x+,˴2?5-ߚm!P R9>Ӄ$+|Aj  ^0&ߥ|1x]+8&__aE:ߝ0̵߯N _܈Q%CEwX8p섿*%-,qLFϝ]8#oNAr߆79EnI#t4~ɦ^O6ǃ|qB_q w3 < 09P@+_n19)\q)Qw<%&8)_Y-8(_`9)Yu>S'rjY;qL_l$D>(ja _5VST.;qAs 'xbƉ,q rL"08ypc ׉)8݋SvC_߂( " ' N vO툜J.=a "~|숑Ļ u sWߥМ_W2Ö_אXKK>/7V ykpO_` -8]q휿( WB__K_%I]C],1]S u `$u ;_Hߥ8q54^LBs@_א`&U߂7}NTdu [uH}Ge{}pS!&nPXLWaFųU=`ຕdQda@bnO̭$5%'8t=r gR/$;E ]w +]zZdI{eBZM@v;B7ǢE7-+| sc "3RDD7Yx5@I]PHKn=I\O(y>W}u3ImAktV8⠿E ~ \@a$<'n>乞I[^[ U8۶﹁I\R*XU̹9jb*yw\w[bܹåS~e$y\]19V乞"U[fsm "sx \\MQ\݉s=}oWdvH1Ru6S:=mبRޮhsd@! ;əy5Is} \yiA%mҹ,^溆N^y 45l 魯#\W͘.v[ y-hsuy(hs]C*S溿w\9md_zPyTrY܃Ͷн'ɜ@ U95ds?ipYނ9W ÷`3X1fFs};A\s.rɓKrŜF܂o_ tl37EVGC\77#ě2FizEىsS约oĹ@ko ,Is]û,0kn&577Ě %kn!5i =Zw&knf&5׏A'k.r LVkkH $mkN67SEҾ6)Pн4"yE3tf\ -\dBY-\FC)`hB>Y뚆S4u oVT67nD֤ d IIآuI"ʰJ,q⯈67E,AaAbLn"cknv55u[䈓u#8МE܇fDx!$RHX$Ys3\͌Z7Sęj.܇|LCJ 7ͷA?0ٰPk;tⰿE;4\vpF)j,{)j,v ? g55eioF'rly9yM94_׼oҁ\ $bɉu%\$:ط`a\6('q`/s;}bʰq6!L2Ax3w7%EYx⁁l~.Fٲh0Ȗ\b [rUa ; +' QN8)[!dO,q%@ȃDA P$ 1k(#clISlt(# ]lk\hF/jBA@AH*d#l,d_ 豣 sP 8aD%eZ #qm `R A d ;Cۮ.aC # l_AJl d[MA"PpE [fѧ lǼAbQ!z Qk`|l3>LA%k<X8<pq`` b>8@vhYb `6KMD'%a2—ȖViU dlS, d_ dh{ m Ce@ ;3o-dp@88y4&dt"%4;QJ?Zk2qdp?FDdXN.ocX Q>}Ǧ l[ m46\P@g ; pYb Dᆀlxy .=l 4QLd Ȧ@ x6'Q<RZA8( c"):aTA{Kd;%b/AMs>@VJlA6 w @}A\REdӔii,do Ȧ4a]ldӜd R0Sa?l\eBH~ 45% i(ȶ>(Ȧ)8 /ѡ3xA Ԓ (&"Y(SqL"# 4Ȏl )yFPMC0e ]! A }C @A6M!.2«'E5wDA6M#.2P]ay`yo+y2,`] aw `C1t p|Wda'Vn'a?٦?#SY [0_Kڀ%P0̢ooLyPDH /FwfV j{1P Rx`(cw }Eqxv9J!9,LkjM pff/TB8v/Xjn'Ɣ7 (Ar(c C9JC𮅦:4SOd1 C9J(,HFDvZ8@%ۀ(D><( X1 H9J(9,HFJXVYX(͕m@ްz) q<ДزMelG~L r *BX1۠*G Rx*;8Py":']%, ) M',8 H6ߣa4euh< 0c%(sά~8Z6yS,<TvG[mnx?S cr \rX66@espm@ z) qv; SُR',pEyTLlWܾaHġHK4—\ eվ8!rNr//6+T B*Wb]Ydqr#!Xʵ+5Rʵ0Ӂ<ʦQLeSGRiʣ ʣDzqP&H!ZЀTqKHeƾ%cA*%\ATـ% K\e+Ֆ_U6`I3x30l<|KXejlBd*zDqv)X1*XU Vye2YٖD2&n5!+[l B<eHYٜ8-}UMde)} +-9EkDcŰޅ'BV6(%"+SG͂VY#IַOlOVy*iYʶD&Xe.q^x*ۊ6XW Iq{7 Xe9@Uy"-QUV6QmRCm ]Jtf*"2P xKXeW<#W4(Ug*3pH>olb8nH~*π4ii \eSWy-qÿ \eoFVUU6 0U0lL*3Si0Wٝ%!iuiK\t^ W9U6MeʅlUNWpU)\U@yK\tL W9UNǤ VJ`tC Y9ݐVN(h: Z9Vv#,Z9|VNxZ9]V+QoQA$H!іGr@b+3Pr>+r;+Nᱛq2"ʦ!qTBU \y-ѕ-DW"xte ʦ]؄xLp]pe'NA?}T p W6 X' ʛf ]4D&򮹸on te(ʻG$xlqN>x6 GwZ27 MWn.Hp+&7}Cx;>+?O l`6~t~[^R٥2Æ?[dAJVʀ/| ֢Ӂi(WbL!L/nFt_/axp41ҋw?`O/nԷVp faO ``#8KFb<,bc aSsu$&#L&3Wrg ɓ&- _!d P/e9=Ǹ9CrP]=rۉ42J( mdq#MX2 ʙc%oZ0=Ǹ[q3#rۉJ, 4 Mdq;qZhEm@,>s{q3V52!9.4.n0HM?=/f_:*odE(Vvq3 *Ůz ^f#5t0ؗeO/v X;^ȳbW{zq;k$"55Rh=tNhF97^z+)kBH D%fL/v \_fz~R(Ůa +]b f 51xiX`kL+en+bnkb f5 fnksس)ŮGŮS]<H-vdq÷BX2J-nCΤe~WI-v raFWqbEnkPIAoa30ոr[$CTˏzL,vMgqlSbװXgX%x1ġXw$0[b+ 8E62XoW|0i'&H,` cendstream endobj 135 0 obj << /Filter /FlateDecode /Length 31805 >> stream xˮ,Kv\_UJ% `A*Q\߈L7C6>Edpy_~?Np^Oϛ~\x~~?ax__WW㏥z^·[^^VWp;OTWU|ܾTze:·[^:Q}^Uǟ2n{{ןˏOr]~|t˰öO?p:_\8{ ;?vxxn?1^_ڠ?|]qM_~x;^ùcوvx'"z;o$v>$%2Q$8nb~Ez^_h}xaCS?vZ r3O<׼0y8/kmx%1 /+@ De2p:@z`ex<'B<=b/+@3"aoo9oÈp{NF|=ɋI "BV߭sjmqv;`r@TP"N'w@ !f'w(!HvWovܠ;bP#HW+eT ((( *au99N'S- sO'_XTagp~#ҠÈbD6vTFpsf z^E=lBQjZY@mnC@u:9<^5*#FF.cG006>7ֱ"#f)D@M(Q$q:anN1~w wuaUnQ;tR֤ (il6fEcEm*h=z=:Ҩ'txYQW+z5YfQcDfjY36p_uסsC@g QYlŒ0Aw[v)en;*:lq6m+fe%Z'h dXE2n@dPƽ>~18:s"qLGct%xI8>C~`mkp&x)o>HSD2ƚd5wT۰61M)j7VbE Q^RCE QNQwgx.7w Х/ъ8.΀v4CbM+hXuF7>pѥ] ]J3!xI5 LxVFiTq>Ŕ8pθS 5y!'}6q>qOS x=^]A\NFgsϯý v^٣,%M+KBFk鎘'Pv8P$@">${ž=Pv@@w }n@(Ύ(Gli_E >C^l(#Њl%92ZE [C${^V^G8>b@">%yE\;noqyC^+(lI>G3IWr6EZG^;b;'88r[ ]$C[ O.EZH|~x}r?L@H-42d3t:I9hLv:g?CNU^V9~&ӽ-D{a NleހӔSOG' m>qns6j?0fч|NkȞkXRSC4:~X>oMNƦ@˳jXЧR} >p>CbWPYp!C^'+D={%+P${MQ^ѭvf#CV.!]E2XQyEOh㈗m琥">G܄vu"T#g+ !%,{-%(4ЎWs++9Wːq8P$㠓qq+𲲇x7tboHHGb#< 3i؞aA^߂tH*4P&`N,ǫ 2,FtZN[t{gib4^L0!Pk<rrl 4(iboQX,v6Ao˚q: sods|-!g4pxhx)HK2 own|Fr aM'cQ$dLr|2& /^VҒhq[sO1nX111-HvW iFLƇd@4^iwʹbttњ"tg 1Gcq6E1F#-KJ}m{ۀQG/B>\Y7vI 4Jc" ,,D` V\)j (J ZP'^,щM^`s,wd#M(RQb!n 웥Ǻ&i6ɗ!f)L<ЙI]" ,9Jnz馭slj * `EEE q9ЬHxHDP!Mm"FAnƐWq{ {!VpebD LWHHH`b%{} o1~3q4٤C"If$IdQ$4)x)X8G0w"""ህ ǜF ( C,j 1Y (l E*]*_k_(^Y9P]E+^Qj,j16T 4hPKSX@+ TTx jkTz .Q$Q$Q$pH[ :C8p8R D>W$2(qP _9?b"E.Sˆ".Q$Q$Q$pH{;CLDL(B&P$@lE ,\6m"M!v 3ĹuvreP$3%'GL9zIk|,M`GeN?i!E9(Q$Q$aIEyz>?SFQc93qޜ# 6UnQ$)`6 66dm~b-)rl0]"""K-7M3i̝ MShrgD!P42 +JUT۴R# ^$ioą.iD.,q_#-9Q#a7;;r;Ѹi,wD~9~ܹ҇`5j;\SC#J|Fk\;}K"6_ͻOyʀ/yk|E5)7wcfnڌHH*8^IȌH>׾ɏ`ѢEv􃨀O ~Q*)gQ$Q$Q$(63mS G8gQ$Ʊ@1W$2(qUQ!2XQa s(ҍxCO8$ysƚΌ55D2qxgƩr3"1N'iJbDfEbj26Q!Q$~a6V1sToqL?Ex Zяq򞬀L?! ZWk3j^E*Ϊ=w-SZJiDL3^I4H4HHǹr9NZ3ڴ75((X+YS8YϘvG7 ^?b"E=/Y<3ˢ// _R×E _5|3̗ _S _5|Y|//5 <]Ս-| ߼tc,SYFX&Y1W(qʚ v>G`A8RqDp$qP.W(((qpf-pٌ#Un,9㈗yb/+6Id6Q$6Ռc|J{0,jH`h+5`XԀaQ&O=yZ-`X5,X԰  k3xS'AIˊ3$($(( TW $rH U*V(H(P~>ػo gi4ެI4x KVeOm&)/DXfƨt3k|+(*N ъ"JKt!7LnqN^S&tȢ"qA̷MT&4BD%@YT,*"ʼچh>E?`~C͊p 2(i[AM9a6((cХ]h%MV*ЀHLbbEbEjyt!=.e&R|ig[HWQڗaC`p1Æ"""aKފ|aHCZcHGi qna"a"aH5 C0 ;nK'kFuDq&Ls{2(yB=M*\2*&"d(=^VȨHGi)ͨBEBEBjt!Ce-yu2(yBL74hQ$Q$Q$Q$iu6͓+0Tj00N'Q$Q$&1LIt$-Cad4.)g H tfEbEbEb8fQnZS2(8F7Ǩ ߊ!ICjT҈MMGdF`\42̈+D̕aF\W!< IgcI#i.H}^U'vDXԐ.1׹[ [ N";dG#cs;6qn,vǢ`G!kjvD;} ܱ n\6c'PO{2qjM B>V+@L H&"}>ͅ+Bd$ H&@gaH=`rd|S( &W(i:\qO4) 2,]&"ME2P$w&Ѝ[@>J#Gi{S=HP<{y}T24!MX+{-$;^I& `2hI6P$@LE>n/soB}|s6V&&f#yXQ H&@"d+P$m66pI2&"d( ěcG7ǎHd@0(9B:*!(F(bbbIbti`Z!TFFFF4x%QL"S"Q-:/ UH(( hWVƛcZ0BִHҶP P P P (MkF7>JsLFFb(䳨΢7eo5y7(q:7ҐfQwPQӉb5Y(fQ8i3ҸTQs7pSyǡrE1$R((gUHt8M*⻛еJ7y!/+io77Mg0M~>lK &?V6WkHCиȵ*@lE*@l qetYO4`ȏ5,]6"mE"EE;A͙c&?sOԪ44p; $ i]UBq/ +*D,ͼv-M&44.3HuHsf.͌1VElUsf*Q$jEw^X0Ti 10G56MgQ$m6|qO`B%Y(}(pUHtb EŠD&)!+Ҥ*"+ưt1pt6p(p(c1܋j\ALCĊJQTHTIchUb!ED5^yu+.^50xk$oIXH^E25(`#s7X3L.I`bE 5|F 18SL _A¢U]ƂUeOV-"u9N.G~/p5(mnzI4K6Ԩ(RBvY5*Ԩiv\umV-LKr SZ5^5^UHJKrg#fYe[ ZV1tS/7ʜ nc_W7BwoRW&yho煩f(V+|2Q/1xK^Ɯ[^Q^|DaWw-|<>GK݇bs j|[L4|_y{kBaKahxN;j: `ou+u|%L~^&&՞^;Oд(Rv60jڼZu0pCqmý"6m{ExXz;6U5m\4ӢG;b@X< h. 0h =Fݭ5|dpn"@"<5FŽv{pF|ZQx@ FwųM^(h`ZH`H`PMfD3(-0P$0]6%$S]v>=^/Y-Ѥ;bU:GqU#++PJT(Kj(A_jP$Ⱥ՚jE\w}|G"-ŋ5a^1~~oWf]u2bs{w0x^vRw2nh9Ae 0 _lsn 'Pv ڂE= wֈTnۅLP,X;U|x =E/(`bEbE "X[[XRE’6XHXm,uQZj%2y̺Fj d1C wG,aD۽,X|.N7h}QSwQHC{|2(Zß="v*ɧwp`QH٦կ>TÜ,wQgU7v".ȍ T FMö;WpgTEz8q.#ѩ&W%ȫMtGML#CQ{U&B"ATúvvNH%mОrў]ў!ikM;xwxwa}oޖ%Y6@Èb5x%1-pt$1!aDPh <-Q$QhE p*LSf;x>TΉqu Uh F#*P$%*PFw=V+ U ؄ uU` 5j@!^"־ ,]Vw>8o<4F,e$Z74菘vt _9iFS2 aӠu4ͱA#? }_N𪲓|y|y~ų(=T`:縇R m/ {B֟It; (j [I.Dҽ'|Y ^`^s-{(Q=\OaI{&C^jy } 2(W[#.5VFF#[-0{gX疝Hv"9H|JQvK-;Iϻ$%=\_\.dHL#^MO Jo в- yHz{A7ޣeE=D=D=: tXj"WWKjlcb;m=.֠缝·8b>"w=[bWnNg0:M8'&&ۋ,{1XdW`À6{U/@F<7pᄒ Lܓ@ok6nTP'PD7h 4i0cl:–4–4–4¶w0"EP*at-L6Pan 87䠘!*(8P&Ye"q{BzwM;bF ;R>-H7L"DpyF\M#.ʮsһw} pPX ?mK`2ZˎB'wibwymW-xD\j]w,L8)=^xF K0ƹ1 qwgo%| :>a!9 tuQZӈu9տTO Ҷq,G( Ao=;bqR(#z$#tWp(p=:DwzEw;P uzzF=>*a6NLld &T1"1I*LBLsP,]`Z60nw{Coh Ub'`5g+k oAqXu(N"]x {>`b;7 &ͅtmtm7.5o6}+QDT#pn!F"#"QE5x Rw|QU *GFL?EU#Eό KݶzJh} *$P$`¢;b$3B՚܋ -,M0&vdɲ;bqq.g _Arп)Km`6PbF?q!F~ i,߄y6K|[}n.Qaɫ\t6F: Tgȝ"53+QO-U˂ZW:c y͂2yz<a1ߩo?~=?"2||7ddHZƟBq_s/pP|}^Nc✍輝 |hG!+Bn1p }8oYE-zGvl/n^NNtsƐN}ӽuc=YN[qX2q/o4bB=7:Fz(RoFw}||zZuDn6qBS'q9BsB=\n8bR5ڹ e#xG 9A8 Mg4P$P".=K9\~| 4Љ E 4$D3o# π-.DP!FEB'C5GtFV49x#kű.Q \^K4b^gQK1x冔e=44 2C+b߸.i~N*YHd#3mq] 6اˮӈ7wb>-}d)ѸHS&EE8"" bPi?SOaDHBԸx8a^)ЈHqTs\мsW4^:'Ë"oQY0%MI'Q#?N5q3" u^Ex^C7Mx|&J7x+ u#gQ$%XN{ 1o%V8 PiB>AS|ϫhU4HFry>^< ^, V9@s3Nyj-֜V Nn3|'\o7bJ'Ud(O9YA[K<8VCc{Ke)hFWk'j>p}TMEr 5E*0?8^\WP!͹W18h{@Vd+{{ u u*ܨw PMw|`F=nN.# #І,\z~Ogh8Qr;B\! %,B(W8mᘶ4,%^ǖ/֖B v8@{dqN">1?Plɧ̿WEȏ M~h t׺Zm /]Io l'M~>m .a6ڞW{?'}J,m| T]I E2sQ6xI6V>"- [qGmbbq6G/||l5q꠽2m/(H&oi2ZuQhyv&"e"ik9 XOADm"Dbd(qP%ʎBs?H70O!7@X0#b(c/ϲQXL$w+p!^XEQID򖒣;%GD,jVaGȡ",o jMrho됉U5(eiGA"m"x%(oHw}jߠm(;HwW!Cgm"qƢMq JCUن옣YV.w !>>[E|| ,D"q#Dw0y!v95k#6Bv,2 KYa6 fA]jqP?{`Yq̦"/]Α!琍bm#6bs;2l4L6 v ؓFԇ}b@hG{A\RxͲt}N6Vj+ P>B NR@V 6i~ HCRW~Q 44%-z(zt 4G>;i뀰IE\is W{i P=# 'OAM~h&Vlv7ioȧ0G""G6xS,Q$EMK2f M"a;~|64l!C&GyYs j<;C j>mqvxCU`T"roeoYE?Dqp.D(HHiGE0RƱڏ(YJ~8Pf);,%?Y .v36g}hh 0<Ent(:K28ld9! !1ݱt:K!`x xYaOmh1,tO?֓D>Dh ('HG`DyBn{BiOS) q=!yBpy=E6Wk7ݞ!OA]l.q,|FË"" 1+ki^@#J]G44 |BjDn1t2F4 ,DB(OTH !1m;DzqG,4=NE|ᒅ{YiB>%P}׽(]kǭ`ݱĭ`#nW+'`+|)TƁ&/+HQ$.@KCTMX;J/.xQs$2}(p3女 />7|(Ν4Sie1#))H,P$rh:"a ]v&&wV1 1F3}S񦛥m[[i28LGns4f(̰1bE\;8{3yWj nmQFz2gQܳPq@k50V i=K j`B,,oj`_M%xN>mj- |>/"̣P(J>1OD>éY:iqO.B^;ﵟ)^^)xu/38óPb೗w"4Mw980MNr`=x9z!G斻n'K)ӝL"wrNu'Sy0O'ink 5֩Q5LWmn}xq,DmKR[<9\~7TrU'{[NOnxI^lkwTwuaD>R";(Rѥy_!]%N4-qΥiαxK'8zŋ}u`W! DnpOs+P$P$P$pǷ>Oå>Y|9+y4_qУ҅T\@MS^kc%z+XXQ+ih(BDQ\DaqpXNo_6΍4”hjlQS/Vb!64tYSK6^+c3ϸ2+ *aEB8B8ݜ$sD$68>& ai񲂐D.^!5t}a|&L!<Ӎ)VbEbEE"VQDƁv M%shIL晢0^IH`jHW:bѢ6>S/SԦ,jE6ݑ9M-opc 8~Pd2j(FAFS;q嫓9qƧ nd Ue4QEMkn|p#q(#QYk>h:L~i+`鲅B\!>XD7q@Y'kokqks(E2=~*/ULͱуv8SnB96!\},M(4"yF iɫP! & (%'Wl3'`DZm(3H*g pI2n Ϗę68 Tf@A68f (GfAp}2[H6^P?΀E P$:e0 2Q`DA^!?q>hQ$Msk)rќc$IdQ$Ω&}ѧ4ь"ь 44h `YZrQjGRohLQ$2Q`f"&6((qa 8deM&DQ7@c|&)246VFT|tCyg_<[A.h_P|b"mq̠}!(k@L"V&W+s19lt4 x m탮mic%9<%u>;i~5`Qs~x?k'X>}=(,jocǒ}옣G(1po,E8##9F~r aǠBl,jO ;<_ ,=DhLjmq,#JAy8A[hmqf$g{Iw}GsKh>j%q(櫛TKP$[#>Ү)/jKt= eKB%xYq:(cP}v $K(_ƾ@P$_m(Ƅ~菛Vה`i?婬6ؔg)╄og|EE8e_HHbM"$HIdHEo%z ߸oi+^ix<ڙ޴ LU4Uxwo_xF=]4,i:B'tQyO!_i}N%Q44{4KvH#W#+m*\8ls҈s҈4Ч[j* =i=T:eXЧ9^4Ч;}zBM=}Ўyhi v\юwǜ189lu;sz27)δA|F73ǔhZs""ъ"g* 8рA*7(IP:I3 1>cH{a|~,s+|;Xq֝y=#gn`"""gʦ4(TeE-(j1q6S߭#w!l=s"qE"D)}$zP$zP$zP$z4?A䁁,Nq4d;,_ٍ&.~80Q a"a(BÄWL(LqПɊ7ǘa!,ZaGK+2?xYW+~0?q;UQRgQI3-+SiXqb1`qh&hV<O6]?8=^:2LTKߪ+v:K^Vݏhw+SP>Q}^NVW&.5V{eTu>9u< Ɵ2x4mO94+8;S.d25ߩ'2wj0W{$8>XጶK7%uxp(dƜxpU'^QPXkD i>Ub | e|(e9u|FtLF9V\eu|4Gm|_n 5"uQF@]ˊeoiGȉPUnt_e*7qƽ;b;^'cq}E"<^q50?Dx Xy8N#aD"` 7ѫs4W 02{/{8O}$"]C;7xsj_`ьf)_#:Spէ~U; fm9l=WvO c#F⭵`r|2 5-e;mΑ!f#w*O鎘5bQU]vѤ_dG鲑|()@YHffPdYP6 jm9G>9GJ\9G<#^FLy8~|j9Xw~cHwF`D9G^#-llEZL>Gs+הY;b5Pƻ)*"9J\텪]xkP$Q lB9J e/kZKz|9&CkP${I;;bO%>nN6|9[pdO;ಳ_* 7vo;ҼeO!2Mm2ZM#rmgQG3u43ǂr0eAvykm(((Qs>xwaC!B.CC`DyHgXJٗ{XmB=ÆaJ;^sl[?e(=($1{,nA-}"^"CƁ#QyE#W`!t'ڼ"_"^d=J;FwtK]rO 't1dϲ;PUY l5>j]⍶`2CP$Qy,l#=ﲍtsCh!Cp |#n9CIX9hJ-?@,;уd?ˮm'Cv"d!`DyC2Ezex|FmސW.QP,)N d%q7Hvm<+tG,hqgtcyF}={n]#:oC?xFK0ƹ1-:m>ׂm> FW_w:(k:&~ P@M\fg!|XhRPl@vŽj;Go8b*~ŞU+U9 !'kCS֛;{hwOVcU`ߛu$)y5bm<+..TWHtܱ@J7܀k|+@ )Z)ZaD yb23]1[q(yFz;Uk38*.`wG,nE>(;l/ޫ<0ϝ5M疶V˭6dñj7M_9W7o$|񘝕a .ë A-_ɾ( -%eL_}ݸՈ;7`]WuwL a]`6[Tˮp>,0g#+-6#79*RCI(y" ( %,=M XȦ{wm[-$SoI(d`{xg{ /P$RECw  X|i @#y颡;b.)h-P+(nǧܿo T>==J.m]sIulx&F=/s'u8tw6bmӭ' ]6hI ;e(&8(c{f++jVY߮iE$Cyp5i͍Ylɱ44^{[8u]' x )f Sasq"|UB0>]k'vxAm'bfqŹ&O~eM*^v徙NE8q3gYp`80z> '|*6Ի6^@SRݽvOsvz5xջɍWDZ 1-qH?\>Do?,q%I ?D۰&G|8ܦigti'ET^J<&ᵳWޚcdE|y^˜* ͷ\!}#מ$hmzd0\">BUmؽr]f?ӓ6&y X} 6gP\5]A16gaSESHO^@6mSddf k/6Ψ:|5N7QwV%(uQ-R(6 BpĄVyHl9mJ{l%r+璯`7:_Bo;ٽ{ ^^v&&_(|l/ie/YL m{صf`Gs4)l& P஝e0yAt,.Yp: Mvdwa^z%>{oœ\58b 281[C`oI]y^6aa@/ȵO`x;8מiyQ-Y9F]Ox/Kqauߎ,.1myu6^mDޖ@a,!&Ndn8QL G|#*OKc(>FͶb7oi{6awaa+Oݶauˑdl;Rrr<w6\'Jo?va(wyCYv& $Fیٙpd9X}+g7@Dv&%zccCg`Jé˙Y$S-w<=KCP5y \!mM{okhwl+yXohphh6y_%n&[Ђm,9 ޼,Ppd  /KfKϿ1wZBCWHF+[]<>}$ .U>B!׶ !-p4,n;F#_c'd3L`\e͢pķȡh(jQ8yp9Ȧu5ʗ%mZzv| .g(F"evݍRߗdgur+d'RO_4b Y#.ޅKAC]8`ջhlS(3նZ[";BE'g‘mwڧnQ&؛bvmTq&*.Pqq9jN(n%R~`6|r|r:; ue=iSq:7]ήsMPq|hmsmQ8ǪȪl[~%‘p]kVE涪8U6l*n Xm*]]*B6]*1uW6`G{۷bYAu*.mUq-*f/o8bPmWJW`}.f]jlLq٘pOlLyQr&J=WȝpqY)j 7ͩk *9apSL G~֍ɘ |=̉Qr.~7l- .ўfۿ8y.`\22${WKxdWlӟ˻v pڇ9n?_'/? zm'4r2\1V9D|v؞/ٞujC#s pN,7ۀtxm8byG@:{ ̴@l38b1m%ecv1}\5nEnp riv +J{/WyVߖJðVz#=2#֛Lɨ-Zg+0ěf78kNKg5}nxgMO2 L~WxUw GJddCIK6 X=lM7͔Ҁ ow.nq){-+>@\o=sVv&L)Gd( XN=/\bt 6q['g2i1>i\ G|!`@SGOzKW`p-^)hKhF}ܽ9j`.Û?ٜסOo?1u` kuX^C?a?'ip: .>sq+}\N-_q_/???ePtn̷oC_??~˿ K[q[_9]~k_ުmUo^Rú߾U~TPFo@e"j/|iN",@Uvrcq?W&>gU합q2Qݮ_DuvVWa1mg>m8w3|mDv"mBj$Xy ,; 7 |?\Ҧ |z<4p:#AzOyxsůWL/e wnp_lm e>oO9]-EobA8|_9:'*1L#k:]hr40n@xJv_'뼆#T;M#8^﯐?m򞛶Dд(Rt3`Դnsu0.u0;}s;u6۴mwcxsTDs|=΋/=%UwG@X>z[4t qQk4MO >@K2 8ȗ$7 Tiux qO~8XЈ&,~#O=5n (2ݹO=y'񃕋j"!"!C5x (J]6%T)Ѭov߇*\hdոꏘsaFtYhQU,^!۱dl*XOF,'#0뛃cGX/VƇyzW!C$??._zz<XUÈEDE8#3(u 9X80Ǵ8.PSE;q^0TFD{#w.EO F,F,> ȫsU9#Z6!OI(Ze0PHy d#(j]q ڲ6"9mErX"Eiߕs >stG,>Gw43Gs2 =,HwF?@!(?$K P$@\j tw H.@"O0Uuw*/ o?| vM5y 4i1Ѹm՚u΢byrC.r|;,m_6N?("^ś$Atw#B.DLu(8EEQ#J 7";|1M[kQ$Ӿ+{ߥt%00bFT+n %|# p؄D[hǹE;D;]RNŚiLw|q'Ӗ60/l=*@43FotG,|#&Bt/kv(yrQ&"e" e"(o.e"(j&#]&"FlH\;b(XL$onkҁv ; tG@#Am'xY9d(i;eӀe2tsApnd(jѭoatUF  >U]<1F^*ro\_xZۆ5 e! ٮbyʶeFVjà/H#xSGb[S^ⲊpW)hbE2)l 2YFO&" 2f/i 7F^gX`b{|Ȇ=-`n0`w$>NЬD=$^s*P$@G"Ç"F5xXF,C*؄ hST;RTȘa)1R/``D1|=&^%t^ܠpno7AJ#Om^_!%yн恥  ,P,] xrBB|D#>U&Twwj =b㝧;Ft|:k.:F: Tgȝ"53+QO-U˂ZWgs [kZHy#akP[{xxg>nq5xh4Zi'x>;XLOFsG%>3GfF\VFlTSY]=oM@|9j%>#6ؿ+Qg|xI$G 6sW\b#ٚތt3A0foύvvn6sK% &M.H6EMŢN7d?\|/M#)'-C5_~MGfa# dxVmmaF+hVGtpIK:\dA]b?؅}j5Wd `<t0ڝ!g)ml^,om;@frr̸麺3qNg ^:$u/8t*ҘP%"{^;|.U<% ^I$'H_AE_Wev 2o/8{7l%o]Q4Bbkm{F쒫y]b!݆MiW>a4WaN^ &+\e."0=>6\(DU0p^*]few8EJwJ<9Aƞ5mvTX/Awx0JÿTpμ/_NP9cIq8f HQ5dէ f:ӭgDuլX˦<~#ŵlbpendstream endobj 136 0 obj << /Type /XRef /Length 169 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 137 /ID [<99224ba5d6eab833e1c7e633748cc0a6>] >> stream xcb&F~0 $8J$6/R3B R/V-@ym"EA$*00rT뒓Lr R';"6H`6%lZ`ٙ` ,R"-7H>W>̍ QXe+<&W^Y_Xr endstream endobj startxref 325730 %%EOF gstat/inst/doc/spatio-temporal-kriging.bib0000644000176200001440000003163513777370515020373 0ustar liggesusers% Encoding: windows-1252 @Article{bakar2015, author = {Bakar, Khandoker Shuvo and Sahu, Sujit K}, title = {{spTimer}: Spatio-Temporal Bayesian Modelling Using {R}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {15}, pages = {1--32}, url = {http://dx.doi.org/10.18637/jss.v063.i15} } @Manual{Beygelzimer2013, Title = {{FNN}: Fast Nearest Neighbor Search Algorithms and Applications}, Author = {Alina Beygelzimer and Sham Kakadet and John Langford and Sunil Arya and David Mount and Shengqiao Li}, Note = {R package version 1.1}, Year = {2013}, Url = {https://CRAN.R-project.org/package=FNN} } @Article{Bilonick1988, Title = {Monthly hydrogen ion deposition maps for the northeastern {U.S.} from {J}uly 1982 to {S}eptember 1984}, Author = {Richard A. Bilonick}, Journal = {Atmospheric Environment (1967) }, Year = {1988}, Number = {9}, Pages = {1909 - 1924}, Volume = {22}, ISSN = {0004-6981}, Keywords = {\{NCA\} Precipitation Quality Network}, Url = {http://www.sciencedirect.com/science/article/pii/0004698188900807} } @Article{biondi, Title = {Space-time kriging extension of precipitation variability at 12 km spacing from tree-ring chronologies and its implications for drought analysis }, Author = {Biondi, F.}, Journal = {Hydrology and Earth System Sciences Discussussions}, Year = {2013}, Pages = {4301-4335}, Volume = { 10 }, Url = {http://dx.doi.org/10.5194/hessd-10-4301-2013} } @Book{Cressie2011, Title = {Statistics for spatio-temporal data}, Author = {Cressie, Noel and Wikle, Christopher K}, Publisher = {Wiley}, Year = {2011} } @Article{DeCesare2001, Title = {Estimating and modeling space-time correlation structures}, Author = {L. {De Cesare} and D.E Myers and D Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {9--14}, Volume = {51}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00131-0}, ISSN = {0167-7152}, Keywords = {Space–time correlation}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{DeIaco2001, Title = {Space-time analysis using a general product-sum model}, Author = {De Iaco, S. and D.E. Myers and D. Posa}, Journal = {Statistics \& Probability Letters}, Year = {2001}, Number = {1}, Pages = {21--28}, Volume = {52}, Url = {http://dx.doi.org/10.1016/S0167-7152(00)00200-5}, ISSN = {0167-7152}, Keywords = {Space–time random fields}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{finley2015, author = {Finley, Andrew O and Banerjee, Sudipto and Gelfand, Alan E}, title = {{spBayes} for Large Univariate and Multivariate Point-Referenced Spatio-Temporal Data Models}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {13}, url = {http://dx.doi.org/10.18637/jss.v063.i13} } @Article{Gasch2015, author = {Caley K. Gasch and Tomislav Hengl and Benedikt Gr{\"a}ler and Hanna Meyer and Troy S. Magney and David J. Brown}, title = {Spatio-temporal interpolation of soil water, temperature, and electrical conductivity in {3D} + {T}: The {C}ook Agronomy Farm data set}, journal = {Spatial Statistics}, year = {2015}, volume = {14, Part A}, pages = {70 - 90}, issn = {2211-6753}, keywords = {Digital soil mapping}, url = {http://www.sciencedirect.com/science/article/pii/S2211675315000251} } @Article{hu, Title = {Spatio-temporal Transmission and Environmental Determinants of Schistosomiasis Japonica in Anhui Province, China}, Author = {Yi Hu and Rui Li and Robert Bergquist and Henry Lynn and Fenghua Gao and Qizhi Wang and Shiqing Zhang and Liqian Sun and Zhijie Zhang and Qingwu Jiang}, Journal = {PLoS Neglected Tropical Diseases}, Year = {2015}, Number = {2}, Volume = {9}, Url = {http://dx.doi.org/10.1371/journal.pntd.0003470} } @Article{Kilibarda2014, Title = {Spatio-temporal interpolation of daily temperatures for global land areas at 1 km resolution}, Author = {Kilibarda, Milan and Hengl, Tomislav and Heuvelink, Gerard B. M. and Gr{\"a}ler, Benedikt and Pebesma, Edzer and Per\v{c}ec Tadi{\'c}, Melita and Bajat, Branislav}, Journal = {Journal of Geophysical Research: Atmospheres}, Year = {2014}, Number = {5}, Pages = {2294--2313}, Volume = {119}, ISSN = {2169-8996}, Keywords = {spatio-temporal kriging, spatio-temporal interpolation, daily air temperature, MODIS LST}, Url = {http://dx.doi.org/10.1002/2013JD020803} } @Article{kj99, Title = {Geostatistical Space-Time Models: A Review}, Author = {Kyriakidis, Phaedon C. and Journel, Andr\'{e} G.}, Journal = {Mathematical Geology}, Year = {1999}, Number = {6}, Pages = {651--684}, Volume = {31}, Url = {http://dx.doi.org/10.1023/A:1007528426688}, Publisher = {Kluwer Academic Publishers-Plenum Publishers} } @Article{lindgren2015, author = {Lindgren, Finn and Rue, H{\aa}vard}, title = {Bayesian spatial modelling with {R-INLA}}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {19}, publisher = {University of Bath}, url = {http://dx.doi.org/10.18637/jss.v063.i19} } @Article{marek, Title = {Using geovisual analytics in {G}oogle {E}arth to understand disease distribution: a case study of campylobacteriosis in the {C}zech {R}epublic (2008--2012)}, Author = {Luk\'{a}\u{s} Marek and Pavel Tu\u{c}ek and V\'{i}t P\'{a}szto}, Journal = {International Journal of Health Geographics}, Year = {2015}, Number = {7}, Pages = {1--13}, Volume = {14}, Url = {http://www.ij-healthgeographics.com/content/14/1/7} } @Article{Nash2014, Title = {On Best Practice Optimization Methods in {R}}, Author = {John C. Nash}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {2}, Pages = {1--14}, Volume = {60}, Url = {http://www.jstatsoft.org/v60/i02} } @Article{optim, Title = {Numerical Optimization in {R}: {B}eyond optim}, Author = {Ravi Varadhan}, Journal = {Journal of Statistical Software}, Year = {2014}, Month = {9}, Number = {1}, Pages = {1--3}, Volume = {60}, Url = {http://dx.doi.org/10.18637/jss.v060.i01} } @Article{pe1, Title = {Mapping Sea Bird Densities over the {N}orth {S}ea: Spatially Aggregated Estimates and Temporal Changes}, Author = { Edzer J. Pebesma and Richard N.M. Duin and Peter A. Burrough}, Journal = {Environmetrics}, Year = { 2005 }, Number = {6}, Pages = {573--587}, Volume = {16}, Url = {http://dx.doi.org/10.1002/env.723} } @InCollection{pe2, Title = {Spatio-temporal mapping of sea floor sediment pollution in the {N}orth {S}ea}, Author = {Edzer J. Pebesma and Richard N.M. Duin}, Booktitle = {Fifth European Conference on Geostatistics for Environmental Applications, GeoENV2004}, Publisher = {Springer}, Year = {2005}, Editor = { Philip Renard and Roland Froidevaux }, Pages = { 367--378 }, Url = {http://dx.doi.org/10.1007/3-540-26535-X_31} } @Article{Pebesma2004, Title = {Multivariable geostatistics in {S}: the gstat package}, Author = {Edzer J. Pebesma}, Journal = {Computers \& Geosciences}, Year = {2004}, Pages = {683--691}, Volume = {30}, Owner = {b_grae02}, Timestamp = {2013.04.17}, Url = {http://dx.doi.org/10.1016/j.cageo.2004.03.012} } @Article{Pebesma2012, Title = {{spacetime}: Spatio-Temporal Data in {R}}, Author = {Edzer Pebesma}, Journal = {Journal of Statistical Software}, Year = {2012}, Number = {7}, Pages = {1--30}, Volume = {51}, Url = {http://www.jstatsoft.org/v51/i07/} } @Manual{RCoreTeam2014, Title = {R: A Language and Environment for Statistical Computing}, Address = {Vienna, Austria}, Author = {{R Core Team}}, Organization = {R Foundation for Statistical Computing}, Year = {2014}, Url = {http://www.R-project.org/} } @Manual{RCoreTeam2015, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2015}, url = {https://www.R-project.org/} } @Article{Schlather2014, Title = {Analysis, Simulation and Prediction of Multivariate Random Fields with Package {RandomFields}}, Author = {Martin Schlather and Alexander Malinowski and Peter J. Menck and Marco Oesting and Kirstin Strokorb}, Journal = {Journal of Statistical Software}, Year = {2014}, Number = {8}, Pages = {1--25}, Volume = {63}, Url = {http://www.jstatsoft.org/v63/i08} } @Article{sigrist2015, author = {Fabio Sigrist and Hans R. K\"unsch and Werner A. Stahel}, title = {{spate}: An {R} Package for Spatio-Temporal Modeling with a Stochastic Advection-Diffusion Process}, journal = {Journal of Statistical Software}, year = {2015}, volume = {63}, number = {14}, pages = {1--23}, url = {http://www.jstatsoft.org/v63/i14/} } @Article{Snepvangers2003, Title = {Soil water content interpolation using spatio-temporal kriging with external drift}, Author = {J.J.J.C Snepvangers and G.B.M Heuvelink and J.A Huisman}, Journal = {Geoderma}, Year = {2003}, Number = {3 -- 4}, Pages = {253--271}, Volume = {112}, Url = {http://dx.doi.org/10.1016/S0016-7061(02)00310-5}, ISSN = {0016-7061}, Keywords = {Geostatistics}, Owner = {b_grae02}, Timestamp = {2013.04.17} } @Article{yoon, author = {Seo Youn Yoon and Srinath K. Ravulaparthy and Konstadinos G. Goulias}, title = {Dynamic diurnal social taxonomy of urban environments using data from a geocoded time use activity-travel diary and point-based business establishment inventory }, journal = {Transportation Research Part A: Policy and Practice }, year = {2014}, volume = {68}, number = {0}, pages = {3 - 17}, url = {http://dx.doi.org/10.1016/j.tra.2014.01.004}, issn = {0965-8564} } gstat/inst/doc/spatio-temporal-kriging.Rnw0000644000176200001440000015665013777370515020412 0ustar liggesusers\documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue,citecolor=blue]{hyperref} \usepackage{alltt} \usepackage{amsfonts} \usepackage{enumerate} \usepackage{graphicx} \usepackage{multirow} \usepackage{natbib} %% following the RJournal.sty \usepackage{geometry} \usepackage{booktabs} \usepackage{amsmath} \RequirePackage{fancyvrb} \RequirePackage{alltt} \DefineVerbatimEnvironment{example}{Verbatim}{} \renewenvironment{example*}{\begin{alltt}}{\end{alltt}} \RequirePackage[font=small,labelfont=bf]{caption} \geometry{a4paper, textwidth=14cm, top=1cm, bottom=1cm, includehead,includefoot,centering, footskip=1.5cm} \raggedbottom \RequirePackage{setspace} \renewcommand{\abstract}[1]{% \setstretch{1}% \noindent% \small% \textbf{Abstract} #1 } \newcommand{\address}[1]{\addvspace{\baselineskip}\noindent\emph{#1}} \date{\footnotesize Mar 25, 2016} \newcommand{\code}[1]{{\footnotesize\tt #1}} \newcommand{\samp}[1]{{\tt #1}} \newcommand{\pkg}[1]{{\bf #1}} \newcommand{\CRANpkg}[1]{{\href{https://cran.r-project.org/package=#1}{\bf #1}}} \newcommand{\email}[1]{{\href{mailto:#1}{#1}}} \newcommand{\dfn}[1]{{\normalfont\textsl{#1}}} \bibliographystyle{plainnat} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \title{Spatio-Temporal Interpolation using \pkg{gstat}} % \VignetteIndexEntry{Spatio-Temporal Geostatistics using gstat} \author{by Benedikt Gr{\"a}ler, Edzer Pebesma and Gerard Heuvelink} \graphicspath{{figures/}} \begin{document} \SweaveOpts{concordance=TRUE} \maketitle \abstract{ We present new spatio-temporal geostatistical modelling and interpolation capabilities of the R package \pkg{gstat}. Various spatio-temporal covariance models have been implemented, such as the separable, product-sum, metric and sum-metric models. In a real-world application we compare spatio-temporal interpolations using these models with a purely spatial kriging approach. The target variable of the application is the daily mean $\rm{PM}_{10}$ concentration measured at rural air quality monitoring stations across Germany in 2005. R code for variogram fitting and interpolation is presented in this paper to illustrate the workflow of spatio-temporal interpolation using \pkg{gstat}. We conclude that the system works properly and that the extension of \pkg{gstat} facilitates and eases spatio-temporal geostatistical modelling and prediction for R users. } %% main text \section{Introduction}\label{sec:intro} The collection and processing of spatio-temporal data is rapidly increasing due to technological advances and the societal need for analysis of variables that vary in space and time, such as weather and air quality variables, and crop yields. Analysis of spatial and temporal correlations is useful in itself to get insight into the character and causes of variability, but they are also important to predict values at points from neighbouring observations. Spatio-temporal interpolation can potentially provide more accurate predictions than spatial interpolation because observations taken at other times can be included. In addition, spatio-temporal interpolation allows predictions to be made at single locations or entire fields in between and beyond observation times. However, adding the temporal domain implies that variability in space and time must be modelled, which is more complicated than modelling purely spatial or purely temporal variability. The spatial, temporal and spatio-temporal dependence structures, for instance represented as variograms, do not necessarily coincide with each other in terms of their parameters nor in terms of their family. In the simplest case, a spatio-temporal anisotropy parameter might be enough to deal with the different dependence structures, but this poses strong assumptions on the process. Interpolation of spatial random fields is a common task in geostatistics. Simple approaches like inverse distance weighted predictions or the well known kriging procedures have routinely been applied for many years. Nowadays, modern sensors allow to monitor different variables at an increasing temporal resolution producing rich spatio-temporal data sets. This calls as well for theory and methods to deal with these data sets to gain a better understanding of the observed spatio-temporal processes. While the theoretical aspects of spatio-temporal geostatistics show good progress \citep{Cressie2011}, implementations lack behind. This hinders a wide application of spatio-temporal modelling, as typically extensive scripting and thorough understanding is necessary to build spatio-temporal models. Handling of spatio-temporal data in R is provided by the \CRANpkg{spacetime} package \citep{Pebesma2012}. In this paper, we present an extension of the \CRANpkg{gstat} package \citep{Pebesma2004} (version 1.1-3) that reuses the \pkg{spacetime} classes for the estimation of spatio-temporal covariance/variogram models and to perform spatio-temporal interpolation. Our implementation handles various types of spatio-temporal covariance structures and facilitates spatio-temporal interpolation. The notation of functions in \pkg{gstat} are extended in a way closely following the purely spatial design. This allows a researcher acquainted with \pkg{gstat} to readily use spatio-temporal tools. The use of the newly implemented functions is presented and illustrated by mapping spatio-temporal air-quality data. Another package that offers extensive spatio-temporal geostatistical functionality is \CRANpkg{RandomFields} \citep{Schlather2014}; further packages are mentioned in the SpatioTemporal CRAN task view\footnote{\url{https://cran.r-project.org/web/views/SpatioTemporal.html}}. The paper is organised as follows. The next section introduces the general interpolation routine and describes the different spatio-temporal covariance models, followed by a section introducing the German rural background data set for 2005 and performing the parameter estimation (i.e.\ covariance model fitting). Cross-validation results are presented and discussed in the section thereafter. Conclusions are drawn in the closing section. R scripts reproducing this study are available from within the \pkg{gstat} package as demos. \code{stkrige} re-estimates the variogram models, \code{stkrige-prediction} re-executes the prediction for a time series and a couple of stations, and \code{stkrige-crossvalidation} re-runs the entire leave-one-out cross-validation (note that the latter takes a few hours). \section{Spatio-temporal dependence modelling and kriging}\label{sec:theory} In the following, we will assume a Gaussian spatio-temporal random field $Z$ defined over a spatial domain $\mathcal{S}$ and temporal domain $\mathcal{T}$. Typically, a sample $\mathbf{z} = \left(z(s_1,t_1),\dots,z(s_n,t_n)\right)$ has been observed at a set of distinct spatio-temporal locations $(s_1, t_1), \dots, (s_n,t_n) \in \mathcal{S}\times \mathcal{T} \subseteq \mathbb{R}^2 \times \mathbb{R}$ that may include repeated measurements at the same location or simultaneous measurements at multiple spatial locations. Often, one is interested in modelling $Z$ from the sample $\mathbf{z}$ in order to predict at unobserved locations in space and time or simulate from the conditional distribution. Across our domain of interest $\mathcal{S} \times \mathcal{T}$, we assume the random field $Z$ to be stationary and spatially isotropic. Hence, the field can be characterised through a mean $\mu$ and a covariance function $C_{\rm st}$ where the spatio-temporal covariance only depends on the separating distances across space $h \in \mathbb{R}_{\geq 0}$ and time $u \in \mathbb{R}_{\geq 0}$. Note that extensions beyond this set-up can easily be derived as has been done for the pure spatial case using for instance universal kriging to overcome the stationarity of the mean. The general spatio-temporal covariance function is given by $C_{\rm st}(h,u) = {\rm Cov}\left(Z(s,t), Z(\tilde{s},\tilde{t})\right)$ for a separating spatial distance $h$ and temporal distance $u$ and any pair of points $(s,t), (\tilde{s},\tilde{t}) \in \mathcal{S}\times\mathcal{T}$ with $||s-\tilde{s}||=h$ and $|t-\tilde{t}|=u$. In general, this covariance function is hard to estimate but a couple of models using simplifying assumptions will be presented in the following together with their spatio-temporal variograms $\gamma_{\rm st}(h,u) = C_{\rm st}(0,0)-C_{\rm st}(h,u)$ and encoding in \pkg{gstat}. Given a valid covariance function, the covariance matrices used in the linear predictor are easily obtained and the same algebraic operations as in the well known spatial case yield predictions of the desired random field \citep{Cressie2011}. A major difference is, however, the computational complexity of the matrix inversion. Typically, observations are made at a rather high temporal frequency leading to a number of spatio-temporal locations that is too large for global kriging. Hence, interpolation based on a selected neighbourhood of a subset of all data points becomes beneficial. Additionally, this relaxes the assumption of stationarity, as smooth variations in the mean value across the domain can be respected. The related class of dynamic models also addresses the computational complexity resulting in a temporal Markov structure. Implementations can be found in \CRANpkg{spTimer} by \citet{bakar2015}, \CRANpkg{spBayes} by \citet{finley2015}, \CRANpkg{spate} by \citet{sigrist2015} or \pkg{INLA} by \citet{lindgren2015}. \subsection{Covariance models} The covariance models implemented in \pkg{gstat} and presented in this paper are introduced in the following. Besides further extensions we focus on the basic classes of the \emph{separable}, \emph{product-sum}, \emph{metric} and \emph{sum-metric} spatio-temporal covariance functions. The building blocks (in the following denoted as \code{spatialVgm}, \code{temporalVgm} or \code{jointVgm}) of the spatio-temporal covariance functions are any of the purely spatial variogram models already available in \pkg{gstat}. Each one of the building blocks is created by a call of the function \code{gstat::vgm()}. Remaining arguments such as \code{sill} (the joint sill), \code{nug} (the joint nugget component) or \code{stAni} (the spatio-temporal anisotropy used in the \code{jointVgm}) are scalars and refer to parameters of the entire spatio-temporal covariance function: \begin{enumerate}[a)] \item The \dfn{separable covariance model} assumes that the spatio-temporal covariance function can be represented as the product of a spatial and temporal term: $$C_{\rm sep}(h,u)=C_{\rm s}(h)C_t(u)$$ Its variogram is given by (see Appendix for details): $$\gamma_{\rm sep}(h,u) = {\rm sill} \cdot \left( \bar{\gamma}_s(h)+\bar{\gamma}_t(u)-\bar{\gamma}_s(h)\bar{\gamma}_t(u) \right)$$ where $\bar{\gamma}_s$ and $\bar{\gamma}_t$ are standardised spatial and temporal variograms with separate nugget effects and (joint) sill of 1. The overall sill parameter is denoted by "sill". The R package \pkg{gstat} encodes this model as: \code{vgmST("separable", space = spatialVgm, time = temporalVgm, sill = sill)} The separable model has a strong computational advantage in the setting where each spatial location has an observation at each temporal instance (a \code{"STFDF"} without \samp{NA}s, \cite{Pebesma2012}). In these cases, the covariance matrix (and its inverse) can be composed using the Kronecker-product of the purely spatial and purely temporal covariance matrices (respectively their inverse). \item The above model extends to the \dfn{product-sum covariance model} that we give here in a slightly different notation as \citet{DeCesare2001} and \citet{DeIaco2001} by $$C_{\rm ps}(h,u)=k C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)$$ with $k > 0$. The corresponding variogram can be written as $$\gamma_{\rm ps}(h,u) = \left(k \cdot {\rm sill}_{\rm t} + 1\right) \gamma_{\rm s}(h) + \left(k \cdot {\rm sill}_{\rm s} + 1\right) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u)$$ where ${\gamma}_{\rm s}$ and $\gamma_{\rm t}$ are spatial and temporal variograms (see Appendix for details). The parameter $k$ needs to be positive and the following identity defines the overall sill (${\rm sill}_{\rm st}$) of the model in terms of the model's spatial and temporal sills: $${\rm sill}_{\rm st} = k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t}$$ The above equation can also be used to estimate $k$ based on the three sill values. An alternative formulation of the product-sum variogram can be found in \citet{DeIaco2001}. The \pkg{gstat} definition of this model reads: \begin{example*} vgmST("productSum", space = spatialVgm, time = temporalVgm, k = k) \end{example*} \item Assuming identical spatial and temporal covariance functions except for spatio-temporal anisotropy, allows to use a spatio-temporal \dfn{metric covariance model} where, after matching space and time by an anisotropy correction $\kappa$ (\code{stAni}), the spatial, temporal and spatio-temporal distances are treated equally resulting in a single covariance model $C_{\rm joint}$: $$C_{\rm m}(h,u)=C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The variogram evaluates to $$ \gamma_{\rm m} (h,u) = \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right) $$ where $\gamma_{\rm joint}$ (\code{jointVgm}) is any known variogram that may include a nugget effect. The following line generates the model in \pkg{gstat}: \begin{example*} vgmST("metric", joint = jointVgm, stAni = stAni) \end{example*} The spatio-temporal anisotropy parameter $\kappa$ (\code{stAni}) is given as spatial unit per temporal unit. In many cases, this will be in m/second, as these are the base units in our implementation. All temporal distances are hence internally re-scaled to an equivalent spatial distance using \code{stAni} and treated as metric 3D-space. \item A combination of spatial, temporal and a metric model including an anisotropy parameter $\kappa$ is found in \citet{Bilonick1988} and revisited by \citet{Snepvangers2003} as the \dfn{sum-metric covariance model}: $$C_{\rm sm}(h,u)=C_{\rm s}(h)+C_{\rm t}(u)+C_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ This model allows for spatial, temporal and joint nugget effects. Thus, the variogram is given by $$ \gamma_{\rm sm}(h,u)= \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ where $\gamma_{\rm s}$, $\gamma_{\rm t}$ and $\gamma_{\rm joint}$ are spatial, temporal and joint variograms with separate nugget-effects. This model can be defined in \pkg{gstat} through: \begin{example*} vgmST("sumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, stAni = stAni) \end{example*} \item A simplified version of the above model is to restrict the spatial, temporal and joint variograms to nugget free models. Additionally, a single spatio-temporal nugget is introduced and the variogram takes the representation: $$\gamma_{\rm ssm}(h,u) = {\rm nug}\cdot {\bf1}_{h>0 \vee u>0} + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) + \gamma_{\rm joint}\left(\sqrt{h^2+(\kappa\cdot u)^2}\right)$$ The \dfn{simple sum-metric covariance model} can be obtained by: \begin{example*} vgmST("simpleSumMetric", space = spatialVgm, time = temporalVgm, joint = jointVgm, nugget = nug, stAni = stAni) \end{example*} \end{enumerate} \noindent Note that the above mentioned spatial, temporal and joint components of the spatio-temporal covariance and variogram models need not necessarily exhibit the same structure. Taking for instance the product-sum and sum-metric models that both contain single temporal and spatial variogram models: the best fits of the respective spatio-temporal models might suggest different variogram families and parameters for the pure spatial and temporal ones. This is due to the target of finding the best overall variogram surface resulting in (potentially) different marginal models. \subsection{Parameter estimation} Fitting routines for the above variogram models are implemented in \pkg{gstat} through the function \code{fit.StVariogram()}, which calls \code{optim()} from the R core package \pkg{stats}. Additional parameters to improve the numerical optimisation can be provided to \code{fit.StVariogram()} and will be passed on to \code{optim()} (using R's three-dots mechanism). As some of the parameters are limited to certain ranges (nuggets need to be non-negative, ranges must be positive), it is advised to use an optimisation routine that allows to impose limits on the search space (i.e.\ \code{L-BFGS-B}) and provide sensible limits via \code{lower} and \code{upper}. By default, the method \code{L-BFGS-B} is called and the smallest lower and largest upper bounds supported by the model are given. The estimation of the spatio-temporal variogram models relies on a sample variogram empirically derived from the data. In contrast to the spatial variogram line, the spatio-temporal variogram is represented by a surface for lag classes composed of a spatial and temporal separation distance. Different from the spatial case, a spatio-temporal sample variogram contains lag-classes of zero spatial separation describing pure temporal dependencies. Without duplicate observations, no estimates can be made for the lag-class with both zero spatial and zero temporal separation. The sample variogram is calculated through the function \code{variogram()} that dispatches the call for spatio-temporal data objects (of class \code{"STFDF"}, \code{"STSDF"}, or \code{"STIDF"}) from \pkg{spacetime}. For a visual judgement of the fit between sample and fitted variograms the \code{plot()} function can be called to show the variogram surfaces next to each other as coloured level plots. Alternatively, a wireframe plot is obtained by setting the parameter \code{wireframe = TRUE} (Figure~\ref{fig:allVgmsWireframe}). A further option is to plot the differences between the sample and model variogram surfaces by setting \code{diff = TRUE}, see Figure~\ref{fig:allVgmsDiffWireframe}. Additionally to visual comparison, \code{fit.StVariogram()} provides the output of \code{optim} as attribute \code{optim.out} of the returned S3-class \code{"StVariogram"}. This attribute includes valuable information to diagnose the success of the \code{optim} routine. It contains for instance the convergence code (\code{\$convergence}) or message (\code{\$message}) and the optimised value (\code{\$value}), which is the mean of the (weighted) squared deviations between sample and fitted variogram surface. Furthermore, it is advised to check the estimated parameters against the parameter boundaries and starting values. Additionally, starting values might also influence the success and result of the optimisation, as local optima may occur due to the interdependence of the parameters. Alternatively, the user might want to start a grid search in order to better asses the sensitivity of the estimates. The fitting approach is identical for all covariance models. However, with the flexibility of the model also the number of parameters increases, making a numerical estimation at times cumbersome. Starting values can in most cases be read from the sample variogram. Parameters of the spatial and temporal variograms can be assessed from the spatio-temporal surface fixing the counterpart at 0. The overall spatio-temporal sill including the nugget can be deducted from the plateau that a nicely behaving sample variogram reaches for 'large' spatial and temporal distances. An important issue is the potentially different orders of magnitude of the parameters. It is at times advisable to rescale spatial and temporal distances to ranges similar to the ones of sills and nuggets using the parameter \code{parscale}. \code{parscale} needs to be provided via \code{control = list(parscale=\dots)} and holds a vector of the same length as the number of parameters to be optimised (see the documentation of \code{optim} for further details). \begin{table} \center \caption{List of implemented weighting schemes for variogram optimisation. Methods 3, 4, and 5 are kept for compatibility reasons with the purely spatial \code{fit.variogram} function. The following notation is used: $N_j$ number of pairs, $h_j$ mean spatial distance and $u_j$ mean temporal distance for each bin $j$, $\gamma$ the actual proposed variogram model and \code{stAni} a spatio-temporal anisotropy scaling.}\label{tab:weighting} {\small \begin{tabular}{ll} \toprule \code{fit.method} & weights \\ \midrule 0 & no fitting\\ 1 and 3 & $N_j$ \\ 2 and 4 & $N_j/\gamma\left(h_j, u_j\right)^2$ \\ 5 & reserved for REML \\ 6 & 1, no weighting\\ 7 & $N_j/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 8 & $N_j/h_j^2$ \\ 9 & $N_j/u_j^2$ \\ 10 & $1/\gamma\left(h_j,u_j\right)^2$ \\ 11 & $1/\left(h_j^2 + {\rm stAni}^2\cdot u_j^2\right)$ \\ 12 & $1/h_j^2$ \\ 13 & $1/u_j^2$ \\ \bottomrule \end{tabular}} \end{table} Currently, the implemented fitting routines are based on the (weighted) mean squared difference between model and sample variogram surfaces. By default, all values are associated the same weight (\code{fit.method = 6}), but other options are available that allow for different weighting schemes based on the number of pairs, spatial, temporal and spatio-temporal distances or the variogram's value. Table~\ref{tab:weighting} lists all currently implemented options. Depending on the target neighbourhood size of the desired interpolation, it might be beneficial to narrow down the spatial and temporal distances and to introduce a cutoff. This ensures that the model is fitted to the differences over space and time actually used in the interpolation, and reduces the risk of overfitting the variogram model to large distances not used for prediction. Please note that methods 2 and 10 (Table~\ref{tab:weighting}) involve weights based on the fitted variogram that might lead to bad convergence properties of the parameter estimates. Furthermore, the scalar \code{stAni} in methods 7 and 11 will either be the actual fitted spatio-temporal anisotropy if it is included in the model or a fixed value that has to be passed as \code{stAni} by the user to \code{fit.StVariogram}. The latter is advised, as the former might lead to bad convergence properties as in the case of weights based on the fitted variogram mentioned above. As the estimation of an anisotropy scaling might be cumbersome on a visual basis, we provide the function \code{estiStAni} that provides estimates based on the empirical spatio-temporal variogram. Four heuristics are available based on (i) rescaling a linear model (\code{linear}), (ii) estimating equal ranges (\code{range}), (iii) rescaling a pure spatial variogram (\code{vgm}) or (iv) estimating a complete spatio-temporal metric variogram model and returning its spatio-temporal anisotropy parameter (\code{metric}). The choice of the weighting scheme will influence the selected model and different weightings might be further assessed in a cross-validation of the selected model. To increase numerical stability, it is advisable to use weights that do not change with the current model fit. \subsection{Kriging} Standard kriging (\code{krigeST}) and trans Gaussian kriging (\code{krigeSTTg}) have been implemented. As spatio-temporal kriging based on the complete data set might be too computationally expensive, local kriging is an attractive alternative. This poses the question of how to select the "nearest" neighbours from the spatio-temporal space $\mathcal{S}\times\mathcal{T}$. A natural choice would be to select the spatio-temporal locations exhibiting the strongest correlation to the unobserved location. Depending on the spatio-temporal covariance model, the relation between spatial and temporal distance in determining the strength of correlation will vary. As a proxy, we use a spatio-temporal anisotropy parameter that relates spatial and temporal distances in the same manner as in the metric covariance models. The k-nearest neighbours within this metric spatio-temporal space $\mathcal{S}\times\mathcal{T}$ are selected using the R package \CRANpkg{FNN} \citep{Beygelzimer2013}. The interpolation performs iteratively for each spatio-temporal prediction location with a local subset of the data set. Without neighbourhood selection, kriging uses all data. As the metric induced by the spatial and rescaled temporal distances are only proxies to the strength of correlation between locations (see Figure~\ref{fig:vgmVsDist}), we provide an option to search a larger metric neighbourhood. Within this larger neighbourhood, the covariance function is evaluated for all spatio-temporal locations and the neighbouring locations with the largest covariance values are then selected for prediction. However, this approach might still suffer from a clustering of locations and alternatives such as a staged search (find spatial neighbours first and select a set of temporal instances for each spatial neighbour) or an octant search (select neighbours per spatial quadrant from preceding and following time stamps separately) could be considered. However, these alternatives are not yet available in \pkg{gstat}. \begin{figure} \centering \includegraphics[width=0.9\textwidth]{vgmVsMetricDist.png} \caption{A contourplot showing how the spatio-temporal sum-metric variogram model (as estimated in the application below) and a metric distance relate to each other. Distances are rescaled by 1/5 for easy plotting.}\label{fig:vgmVsDist} \end{figure} \section{Application and illustration}\label{sec:data} The data set used is taken from AirBase\footnote{\href{http://www.eea.europa.eu/data-and-maps/data/airbase-the-european-air-quality-database-6}{AirBase - The European air quality database}}, the air quality data base for Europe provided by the European Environmental Agency (EEA). We focus on a single air quality indicator, particulate matter with a diameter less than 10~$\mu\rm m$, measured at rural background stations for 2005 (${\rm PM}_{10}$). The data base contains data for many years. Besides rural, also urban areas are monitored and not only at background locations (e.g.\ traffic stations). However, these processes are considered to be of a different nature and should be treated separately. As a use case, we therefore limit our data set to the rural background stations in Germany. Figure \ref{fig:dailyMeans} shows for 8 randomly chosen days daily mean values of ${\rm PM}_{10}$ concentrations for the entire monitoring network over Germany in 2005 with 69 rural background stations. \begin{figure} \centering \includegraphics[width=0.95\textwidth]{daily_means_PM10.png} \caption{Daily mean $\rm{PM}_{10}$ concentration $[\mu\rm{g/m}^3]$ at 8 randomly selected days in 2005.}\label{fig:dailyMeans} \end{figure} In order to fit a spatio-temporal model to the air quality data set, the empirical variogram surface is computed and used as input for the fitting routines of the different models. The empirical variogram is based on spatio-temporal bins that span regularly over space and time. Regular measurements over time (i.e.\ hourly, daily) motivate regular binning intervals of the same temporal resolution. Nevertheless, flexible binning boundaries can be passed for spatial and temporal dimensions. This allows for instance to use smaller bins at small distances and larger ones for large distances. Temporal boundaries, instead of lags, are required when the sampling of the data is non-regular. In cases where regular temporal observations can be assumed, this is utilised in the sample variogram calculations and any two temporal consecutive observations are assumed to have the same temporal distance. Figure~\ref{fig:allVgmsWireframe} shows the empirical variogram along with the proposed best fitting model of each spatio-temporal variogram family as perspective wireframe plots. In order to better identify structural shortcomings of the selected model, a difference plot (Figure~\ref{fig:allVgmsDiffWireframe}) is a helpful visual diagnostic plot. Beyond the selection of the spatio-temporal variogram family, each component of this model can be chosen from any implemented one-dimensional variogram. In Table~\ref{tab:vgmFits} a selection of fitted models in terms of their residuals compared to the sample variogram surface are shown. The best fitting spatio-temporal model of each family is given as: \begin{enumerate}[a)] \item separable model (weighted MSE: 6.82): \nopagebreak \begin{tabular}{l|rlrlrr} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & sp.-temp. sill \\ \midrule space & 0.86 & Exp & 558 & \hspace{-2\tabcolsep}~km & 0.14 & \multirow{2}{*}{124} \\ time & 1.00 & Sph & 5.6 & \hspace{-2\tabcolsep}~days & 0.00 & \\ \bottomrule \end{tabular} obtained via: \begin{example*} separableModel <- vgmST("separable", space = vgm(0.9, "Exp", 200, 0.1), time = vgm(0.9, "Sph", 3.5, 0.1), sill = 124) fit.StVariogram(empVgm, separableModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(100, 1, 10, 1, 100)), lower = c(10, 0, 0.1, 0, 0.1), upper = c(2000, 1, 12, 1, 200)) \end{example*} \item product-sum model (weighted MSE: 6.91) \nopagebreak \begin{tabular}{l|rlrlrc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & k\\ \midrule space & 6.8 & Exp & 542 & \hspace{-2\tabcolsep}~km & 1.2 & \multirow{2}{*}{1.61} \\ time & 8.7 & Sph & 5.5 & \hspace{-2\tabcolsep}~days & 0.0 & \\ \bottomrule \end{tabular} obtained via \begin{example*} prodSumModel <- vgmST("productSum", space = vgm(10, "Exp", 200, 1), time = vgm(10, "Sph", 2, 1), k=2) fit.StVariogram(empVgm, prodSumModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 0.1, 1, 10)), lower = rep(0.0001, 7)) \end{example*} \item metric model (weighted MSE: 10.05) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule joint & 123.4 & ${\rm Mat}_{\kappa=0.6}$ & 453 & \hspace{-2\tabcolsep}~km & 17.4 & 189 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} metricModel <- vgmST("metric", joint = vgm(60, "Mat", 150, 10, kappa = 0.6), stAni = 60) fit.StVariogram(empVgm, metricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(10, 20, 5, 10)), lower = c(80, 50, 5, 50), upper = c(200, 1500, 60, 300)) \end{example*} \item\label{bestfit} sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrrl} \toprule & partial sill & model & \multicolumn{2}{c}{range} & nugget & \multicolumn{2}{c}{anisotropy}\\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & 0 & & \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & 0 & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 7.3 & 185 & \hspace{-2\tabcolsep}~km/day \\ \bottomrule \end{tabular} obtained via \begin{example*} sumMetricModel <- vgmST("sumMetric", space = vgm(20, "Sph", 150, 1), time = vgm(10, "Exp", 2, 0.5), joint = vgm(80, "Sph", 1500, 2.5), stAni = 120) fit.StVariogram(empVgm, sumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 100, 1, 1, 0.5, 1, 1, 100, 1, 100), maxit=10000), lower = c(sill.s = 0, range.s = 10, nugget.s = 0, sill.t = 0, range.t = 0.1, nugget.t = 0, sill.st = 0, range.st = 10, nugget.st = 0, anis = 40), upper = c(sill.s = 200, range.s = 1000, nugget.s = 20, sill.t = 200, range.t = 75, nugget.t = 20, sill.st= 200, range.st = 5000, nugget.st = 20, anis = 500)) \end{example*} \item simple sum-metric model (weighted MSE: 3.31) \nopagebreak \begin{tabular}{l|rlrlrlc} \toprule & partial sill & model & \multicolumn{2}{c}{range} & \multicolumn{2}{c}{anisotropy} & sp.-temp. nugget \\ \midrule space & 16.4 & Sph & 67 & \hspace{-2\tabcolsep}~km & & & \multirow{3}{*}{$\Bigg\}$ 7.3} \\ time & 9.3 & Exp & 0.9 & \hspace{-2\tabcolsep}~days & & & \\ joint & 91.5 & Sph & 999 & \hspace{-2\tabcolsep}~km & 185 & \hspace{-2\tabcolsep}~km/day & \\ \bottomrule \end{tabular} obtained via \begin{example*} simpleSumMetricModel <- vgmST("simpleSumMetric", space=vgm(120, "Sph", 150), time =vgm(120, "Exp", 10), joint=vgm(120, "Sph", 150), nugget = 10, stAni = 150) fit.StVariogram(empVgm, simpleSumMetricModel, fit.method = 7, stAni = 117.3, method = "L-BFGS-B", control = list(parscale = c(1, 10, 1, 1, 1, 100, 1, 10)) lower = c(sill.s = 0, range.s = 10, sill.t = 0, range.t = 0.1, sill.st= 0, range.st= 10, nugget = 0, anis = 40), upper = c(sill.s = 200, range.s = 500, sill.t = 200, range.t = 20, sill.st= 200, range.st = 5000#, nugget = 100, anis = 1000)) \end{example*} \end{enumerate} The variogram parameters are numerically optimised using the function \code{fit.StVariogram} and the \code{L-BFGS-B} routine of \code{optim}. The parameter \code{fit.method} that controls the weighing of the residuals between empirical and model surface of \code{fit.StVariogram} is set to \code{7} (the spatio-temporal analog to the commonly used spatial weighting). A full list of all weighting schemes is presented in Table~\ref{tab:weighting}. In our application, the residuals are multiplied by the number of pairs in the corresponding spatio-temporal bin divided by the metric distance: $N_j/(h_j^2 + {\rm stAni}^2\cdot u_j^2)$. The spatio-temporal anisotropy is estimated beforehand and fixed at 118~km/day. This weighting scheme puts higher confidence in lags filled with many pairs of spatio-temporal locations, but respects to some degree the need of an accurate model for short distances, as these short distances are the main source of information in the prediction step. Note, that different weighting schemes will in general result in different model parameters generating different interpolation values. Our selection is based on the assumption that well filled bins provide more reliable empirical variogram estimates and the fact that short distances are the most important ones for a local interpolation. \begin{table}[t!] \centering \caption{Weighted MSE (\code{fit.method = 7, see Table~\ref{tab:weighting}}) for different spatio-temporal variogram families and different choices for the one-dimensional variogram components. Columns denote the spatial and temporal variogram choices. The metric model is only applicable if both domains use the same family.}\label{tab:vgmFits} \begin{tabular}{ll|rrrrr} \toprule model & joint & Exp+Exp & Exp+Sph & Sph+Exp & Sph+Sph & ${\rm Mat}_{\kappa=0.6}$ \\ \midrule {separable} & $~~\cdot$ & 9.87 & \bf{6.82} & 10.42 & 7.50 & $\cdot~~$ \\ {product-sum} & $~~\cdot$ & 10.09 & \bf{6.91} & 10.64 & 7.59 & $\cdot~~$ \\ {metric} & $~~\cdot$ & 10.25 & $\cdot~~$ & $\cdot~~$ & 10.59 & \bf{10.05} \\ \multirow{2}{*}{sum-metric} & Exp & 4.10 & 3.60 & 3.89 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.73 & \bf{3.31} & 3.36 & $\cdot~~$ \\ \multirow{2}{*}{simple sum-metric}& Exp & 4.10 & 3.60 & 3.94 & 3.32 & $\cdot~~$ \\ & Sph & 3.74 & 3.98 & \bf{3.31} & 3.56 & $\cdot~~$ \\ \bottomrule \end{tabular} \end{table} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsWireframe.png} \caption{Sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsWireframe} \end{figure} \begin{figure} \centering \includegraphics[width=0.95\textwidth]{allVgmsDiffWireframe.png} \caption{Differences between the sample and the best fitting spatio-temporal variogram of each family.}\label{fig:allVgmsDiffWireframe} \end{figure} \begin{figure}[b!] \centering \includegraphics[width=0.95\textwidth]{pred_daily_means_PM10.png} \caption{Spatio-temporal interpolation of daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest 50 neighbouring spatio-temporal locations. The crosses indicate sampling locations. The cell size of the grid in UTM projection is $10~\rm{km}\times10~\rm{km}$.}\label{fig:pred_daily} \end{figure} For comparison with classical approaches, we interpolate across Germany iteratively for each single day using all available data for variogram estimation. The purely spatial empirical variogram can directly be obtained from the empirical spatio-temporal variogram, by fixing the temporal lag at 0 separation. From the same set of variogram models as investigated for the spatio-temporal models, the exponential model (partial sill:~66.5, range:~224~km, nugget:~13.5) is the best suited based on the optimisation criterion. Alternatively, we could have fitted the spatial variogram for each day separately using observations from that day only. However, given the small number of observation stations, this produced unstable variograms for several days and we decided to use the single spatial variogram derived from all spatio-temporal locations treating time slices as uncorrelated copies of the spatial random field. Once the best fitting spatio-temporal variogram model is identified, the interpolation can be executed with the help of the function \code{krigeST}. We use the sum-metric model that obtained the smallest RMSE (compare Table~\ref{tab:vgmFits}) to produce a gridded prediction. The interpolation domain consists of daily values for a regular grid spanning over Germany in UTM projection. The cell size is $10~\rm{km}\times10~\rm{km}$. Figure~\ref{fig:pred_daily} shows the interpolated grid for the same days as Figure~\ref{fig:dailyMeans} alongside with all sampling locations. Additionally, maps depicting the differences from a leave-one-out cross-validation are presented in Figure~\ref{fig:diffs_daily}. A time series view is presented in Figure~\ref{fig:timeseries} showing the observed and predicted time series at a single location along with its 95~\% prediction intervals. An animation of the entire year of daily mean ${\rm PM}_{10}$ prediction maps can be viewed online.\footnote{\url{http://gstat.r-forge.r-project.org/STpred.html}}. The interpolated maps are generated for a set of time stamps \code{tIDs} and a grid over Germany \code{DE\_pred} by \begin{example*} krigeST(PM10~1, data = DE_RB_2005[ , tIDS], newdata = DE_pred, fitSumMetricModel, nmax = 50, stAni = fitMetricModel$stAni/24/3600) \end{example*} \begin{figure}[t!] \centering \includegraphics[width=0.95\textwidth]{diffs_daily_means_PM10.png} \caption{Differences of spatio-temporal predictions and observed daily mean $\rm{PM}_{10}$ concentrations using the sum-metric covariance model with the closest (approx. strongest correlated) 50 neighbouring spatio-temporal locations.}\label{fig:diffs_daily} \end{figure} \begin{figure}[h!] \centering \includegraphics[width=0.9\textwidth]{singleStationTimeSeries.png} \caption{Subset of the time series of observed and predicted ${\rm PM}_{10}$ at a single station in Lower Saxony along with its 95~\% prediction intervals.}\label{fig:timeseries} \end{figure} To further compare the different approaches, a leave-one-out cross-validation was carried out. The spatio-temporal interpolations are done for the closest 50 and 10 neighbours assessing the impact of the neighbourhood size. Inspection of the ranges of the variograms in the temporal domain, suggests that any station more than at most 6 days apart does not meaningfully contribute. Furthermore, the local estimation allows the spatio-temporal random field to have a varying mean value over space and time. The purely spatial interpolation can be considered as the extreme temporally local case, where only observations from the same time instance are considered. \begin{table} \caption{Leave-one-out cross-validation results. The column wMSE refers to the optimised value from the variogram estimation.}\label{tab:cv} \centering \begin{tabular}{lrr|rrrr} \toprule covariance model & wMSE & neigh. & RMSE & MAE & ME & COR \\ \midrule pure Spatial & & 10 & 6.15 & 4.09 & -0.01 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 10 & 6.08 & 4.04 & -0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 10 & 6.08& 4.04& -0.01 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 10 & 6.11 & 4.07 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.16 & 4.08 & -0.06 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 10 & 6.14 & 4.08 & -0.02 & 0.84 \\ \midrule pure Spatial & & 50 & 6.10 & 4.07 & 0.00 & 0.84 \\ separable &\hspace{-\tabcolsep}[6.82]& 50 & 6.05 & 4.04 & 0.01 & 0.84 \\ product-sum &\hspace{-\tabcolsep}[6.91]& 50 & 6.05 & 4.04 & 0.00 & 0.84 \\ metric &\hspace{-\tabcolsep}[10.05]& 50 & 6.07 & 4.08 & 0.03 & 0.84 \\ sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.09 & -0.01 & 0.84 \\ simple sum-metric &\hspace{-\tabcolsep}[3.31]& 50 & 6.14 & 4.08 & -0.02 & 0.84 \\ \bottomrule \end{tabular} \end{table} \section{Results and discussion}\label{sec:resultsDiscuss} In terms of added value of spatio-temporal kriging measured in cross-validation results, Table~\ref{tab:cv} shows hardly any benefit in the illustrative example. This effect can to a large degree already be explained from the spatio-temporal variograms: a temporal lag of one or a few days leads already to a large variability compared to spatial distances of few hundred kilometres, implying that the temporal correlation is too weak to considerably improve the overall prediction. Nevertheless, investigating a process with a higher temporal frequency will likely show a stronger correlation in the temporal domain. Looking into station-wise cross-validation statistics (not shown), the four stations with an RMSE of 10 and larger correspond to the locations with the largest annual mean concentrations ($>22~\mu{\rm g}/{\rm m}^3$). The added value of spatio-temporal kriging lies in the flexibility of the model. We are now in the position to not only interpolate at unobserved locations in space, but also at unobserved time instances. This makes spatio-temporal kriging a suitable tool to fill gaps in time series not only based on the time series solely, but also including some of its spatial neighbours. A very irregular sampled data set would as well largely benefit from a spatio-temporal approach, as spatially close but unobserved locations in one time slice are not of any help in a purely spatial approach, but the spatio-temporal model would benefit from the observed value nearby at another time instance. In a completely regular data set, the distance to a spatio-temporal neighbour is at least as large as the pure spatial distance and hence the correlation is weaker. Furthermore, being able to capture the covariance structure over space and time might foster a better understanding of the process under study. While we see spatio-temporal modelling being a powerful tool, the cross-validation results in Table~\ref{tab:cv} show that spatio-temporal kriging will not solve the problem of all poorly spatially captured phenomena. Further preprocessing steps might be necessary to improve the modelling of this $\rm{PM}_{10}$ data set such as for instance a temporal AR-model followed by spatio-temporal residual kriging or using further covariates in a preceding (linear) modelling step. Providing the best possible model of $\rm{PM}_{10}$ concentrations across Germany was beyond the scope of this paper. The selection of a spatio-temporal covariance model should not only be made based on the (weighted) mean squared difference between the empirical and model variogram surfaces (presented in Table~\ref{tab:vgmFits}), but also on conceptional choices and visual (Figure~\ref{fig:allVgmsWireframe}) judgement of the fits. Even though the function \code{fit.StVariogram} provides optimisation routines to fit different spatio-temporal variogram models, the numerical routines in the background may struggle to find the optimal parameters. Besides the lower and upper boundaries of the parameter space, the control parameter \code{parscale} of the \code{optim} function is a valuable option to improve the convergence of the optimisation. With passing \code{parscale} as entry of the list \code{control} a vector of scalars must be passed that controls the different levels of magnitude of the variogram parameters. In most applications, a change of 1 in the sills will have a stronger influence on the variogram surface than a change of 1 in the ranges. The problem becomes more difficult with an increasing number of parameters. In our application, using the simple sum-metric model as starting values for the full sum-metric model improved the convergence speed of the more complex model. In the presented application, the sum-metric models turns out to be the same as the simple sum-metric model. While this might at first sight be due to using the simpler model to generate starting values, different non simplified starting models converged to the same result. Generally, it is important to keep in mind the strong interaction of the model parameters. It is typically not easy to distinguish how much of the spatio-temporal nugget and sill is attributed to spatial, temporal or joint components. In this paper we considered a joint numerical approach, but step-wise approaches where the components are estimated separately could as well be considered. The interested reader is also referred to \cite{Nash2014}. However, all optimisation approaches follow the premise that the studied process can be approximated with the given model and available data. If this premise fails, no optimal model can be selected. An extension towards a restricted maximum likelihood method (REML) to fit the spatio-temporal variogram model would be desirable, as it overcomes some of the above mentioned drawbacks of the method of moments based approaches and would additionally provide standard errors for the parameter estimates. A REML approach would allow to take into account that sample variogram values are correlated. However, for large datasets (as in the spatio-temporal case), it is computationally more feasible to use a least squares fitting. To reduce the correlation of the variogram values, some randomisation could be implemented in large data sets, to calculate the sample variogram based on partially overlapping or even disjoint sets of observations. The selected anisotropy as proxy to the relation of spatial and temporal distance in determining the strongest correlated neighbours might show a distortion for some models when only few neighbours are used towards the true set of the most correlated locations. However, this effect vanishes as soon as the spatio-temporal range of the model is sufficiently represented through the set of nearest neighbours. As mentioned by \cite{kj99}, an alternative to space-time kriging might be co-kriging. However, this is only feasible if the number of time replicates is (very) small, as the number of cross variograms to be modelled equals the number of {\em pairs} of time replicates. Also, co-kriging can only interpolate for these time slices, and not inbetween or beyond them. It does however provide prediction error covariances, which can help assessing the significance of estimated {\em change} parameters \citep{pe1,pe2}. Several of the space-time variograms presented here may be approximated by sets of direct variograms and cross-variograms. Fitting variogram models to sample space-time variograms is in our implementation done by \code{stats::optim}. Our example script uses method \code{L-BFGS-B} and provides upper and lower parameter boundaries, e.g.\ to make sure sill parameters do not become negative. There has been a lot of research in optimization since the methods in \code{optim}, some of which has been reported in the special issue of the Journal of Statistical Software \citep{optim}, and we do see potential to improve the options in this respect. The approximate selection of the most correlated neighbours solves the lack of a natural notion of a joint distance across space and time. However, other sampling properties might introduce a bias in the prediction. The prediction at an unobserved location with a cluster of observations at one side will be biased towards this cluster and neglect the locations towards the other directions. Similar as the quadrant search in the pure spatial case an octant wise search strategy for the local neighbourhood would solve this limitation. A simpler stepwise approach to define an $n$-dimensional neighbourhood might already be sufficient in which at first $n_s$ spatial neighbours and then from each spatial neighbour $n_t$ time instances are selected, such that $n_s \cdot n_t \approx n$. The presented example considers stationary random fields that are isotropic in space. Further extensions towards more sophisticated variogram estimations allowing also for spatial geometric anisotropy are desirable. One could for instance plot variogram maps for spatial separation in North and South direction for each temporal lag. However, the current implementation does not allow to use the anisotropy parameter \code{anis} of the pure spatial variogram definition. Nevertheless, a preliminary rescaling of coordinates would be a possible workaround. This route has for instance been taken by \citet{Gasch2015} performing 3D+T kriging . The soil profiles in their study show a clear difference in horizontal and vertical variography. To correct for this, the depth dimension of the data has been rescaled to correspond with the dimensions of the horizontal distances before hand. In the subsequent study, these pseudo 3D coordinates have been used to fit the spatio-temporal variograms and perform kriging. The code in model definitions is meant to be kept both flexible and simple. This is based on i) re-producing the notion of the geostatistical models in the R code and in ii) reusing existing definitions and functions of the pure spatial cases that have been available for many years in \pkg{gstat}. The data handling benefits to a large degree from the implementations in the \pkg{spacetime} R package. \section{Conclusions}\label{sec:conclusions} The spatio-temporal extensions to \pkg{gstat} allow to model a set of spatio-temporal covariance functions. The implemented functionality eases estimation, visualisation and understanding of spatio-temporal covariance functions. The extension and reuse of already available function structures and nomenclature facilitates an easy translation of spatial workflows to handle spatio-temporal data. The numerical estimation of the variogram parameters might be tricky and needs a large degree of the users attention. It is advised to carefully check the outcome of the \code{optim} routine after optimisation. Spatio-temporal kriging predictions can be made in a global and a local neighbourhood set-up, while the latter will be the preferred solution for most spatio-temporal data sets and common computer hardware configurations. Spatio-temporal covariance structures carry valuable information, but a spatio-temporal model is not guaranteed to outperform pure spatial predictions. The benefit in terms of prediction quality of spatio-temporal kriging becomes only apparent if sufficiently strong correlated locations are added with the temporal dimension (i.e.\, if the model permits strong correlation across time). Nevertheless, the spatio-temporal covariance model might be of interest in itself. Besides some publications where the authors of this paper were involved in, such as \cite{Kilibarda2014}, the software presented here has proven useful in several independent publications, examples of which are \citep{marek, biondi, hu, yoon}. \section{Acknowledgements} This research has partly been funded by the German Research Foundation (DFG) under project number PE 1632/4-1. We thank two anonymous reviewers for their valuable comments. \bibliography{spatio-temporal-kriging} \pagebreak \address{Benedikt Gr{\"a}ler\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{ben.graeler@uni-muenster.de} \address{Edzer Pebesma\\ Institute for Geoinformatics, University of M{\"u}nster\\ Heisenbergstr. 2, 48149, M{\"u}nster\\ Germany}\\ \email{edzer.pebesma@uni-muenster.de} \address{Gerard Heuvelink\\ Department of Environmental Sciences, Wageningen University\\ PO Box 47, 6700AA, Wageningen\\ The Netherlands}\\ \email{gerard.heuvelink@wur.nl} \section{Appendix} \subsection{Derivation of the separable covariance and variogram identities}\label{sec:derivSep} The separable covariance and variogram identity is readily available through \begin{align*} C_{\rm sep}(h,u) &= C_{\rm s}(h)C_{\rm t}(u) = sill \cdot \bar{c}_s(h)\bar{c}_t(u) \\ \gamma_{\rm sep}(h,u) &= C_{\rm sep}(0,0) - C_{\rm sep}(h,u) \\ &= sill \left(1- \bar{c}_s(h) \cdot \bar{c}_t(u) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h)\right)\left(1-\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(1- \left(1-\bar{\gamma}_s(h) -\bar{\gamma}_t(u) + \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \right) \\ &= sill \left(\bar{\gamma}_s(h) + \bar{\gamma}_t(u) - \bar{\gamma}_s(h)\bar{\gamma}_t(u)\right) \end{align*} where $\bar{c}$ and $\bar{\gamma}$ are normalised correlation and correlogram functions respectively. \subsection{Derivation of the product-sum covariance and variogram identities}\label{sec:derivPs} The product-sum covariance and variogram identity is readily available through: \begin{align*} C_{\rm ps}(h,u) = & \ k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u) \\ \gamma_{\rm ps}(h,u) = & \ C_{\rm ps}(0,0) - C_{\rm ps}(h,u) \\ = & \ k \cdot C_{\rm s}(0)C_{\rm t}(0) + C_{\rm s}(0) + C_{\rm t}(0) \\ & - \left(k \cdot C_{\rm s}(h)C_{\rm t}(u) + C_{\rm s}(h) + C_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right)\left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right)\right] - \left({\rm sill}_{\rm s} - \gamma_{\rm s}(h)\right) - \left({\rm sill}_{\rm t} - \gamma_{\rm t}(u)\right) \\ = & \ k \cdot {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} + {\rm sill}_{\rm s} + {\rm sill}_{\rm t} \\ & - k \cdot \left[ {\rm sill}_{\rm s} \cdot {\rm sill}_{\rm t} - {\rm sill}_{\rm s} \cdot \gamma_{\rm t}(u) - {\rm sill}_{\rm t} \cdot \gamma_{\rm s}(h) + \gamma_{\rm s}(h) \gamma_{\rm t}(u) \right] \\ & - {\rm sill}_{\rm s} + \gamma_{\rm s}(h) - {\rm sill}_{\rm t} + \gamma_{\rm t}(u) \\ = & \ k \cdot {\rm sill}_{\rm t} \gamma_{\rm s}(h) + k \cdot {\rm sill}_{\rm s} \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) + \gamma_{\rm s}(h) + \gamma_{\rm t}(u) \\ = & \ (k \cdot {\rm sill}_{\rm t} + 1) \gamma_{\rm s}(h) + (k \cdot {\rm sill}_{\rm s} + 1) \gamma_{\rm t}(u) - k \gamma_{\rm s}(h) \gamma_{\rm t}(u) \end{align*} %%%%%%%%%% \end{document} gstat/inst/doc/prs.pdf0000644000176200001440000021201414413507475014427 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4260 /Filter /FlateDecode /N 77 /First 632 >> stream x[Ys8~_TD R#رc;yP$֎,et__Hhǻ% M@2i&-g)3ˌp14%, xlLHɄxPLXz%2&AeRJ3' *.aThĔITI1-`R3a%x313EYE9` +xq 5sZ4 \ʱX`Xzl:6,&8Z8d b &X0: bTaA:F!!cb'H9ISH 42% (Bc@V:!`=*&\$T{#Ң@"K(`DFcF` #  Px@>0Jo٢ [ :@VhN΢t}8;gr1M9?o񠳇_Rxz^ v+jfi1NRqͭ V5ϸ',Qezžwgoߦ<;MA xΎ٫|1F_,hrt/GqJ|{dFoF@Zlt;'o.{G G:&ƒ0h\xo:Y4 8N11遪=pwt9`$ū!d30#l:H`@xQs Fe( Q|yt(]}^L2#r}Q 9~8js !=: tQt6KTX"TA5Ej\;\vɪIa͋8Ocx2ZC2u$Hnk?ī;>z%v/9:tzxp@Wr2G[}Mv&н HP{Um \F[xDl菣ˍW?,(86F.Vl { 4 `X/Ո&N%QFw(G4͢yF~dP,`A휼 ݂ }Ӊ돬`4NJmߧ-8 v& 砂GˋEzhUV(]KӰONC 1G{&;{}qlxXe|zߟq2ddn: I39!-Ur:pKѫ(:D!rN@ (;h:_4ZVI,t$MSNb$qM$`-46҅tz͇~v9;NP.nRtp ?*[\WmW O *feBIRqcqQY/#fOn!PZߡE!re% z9-P99H 5$N?PIn5R4JCRh2,{}|tGs4thef7NHm: ?ГHBHGsQ[DhY6v~DGiM% "Hu.~u4MlR(IaE+Ã݃LKF`֜MtֽYhxWFsL@)YaRT%$wM]SjZlmrK@68xM!+ҏǓάCgLΘ몫む4^~tOt=/_cj;Wv2uM>zU6 t "88a:&:ZXoeXu>8|wv(SaW!%Ðwd0Lg]5kŲ,SZglim]rX"-E-W,ӓʡfw_ox$T+rO ٘ifhws{KuP<()kg1MSQ.ȝ^xwrr$jWبU|BK;5s}Yu ]F3y WNU|}j $M z` EP6UgWzQض-F- wwϳLG╋R/pQ')ĻCFk{2+X%ݿ:~u/ꖴpWn  :=6PRq~V/a3p42PeY< nj ޠ\G֐UǤjP&TlMFY[OCE*hѲRAʵB*; .E6@S»h Fcd9om3Cx wv֙{}{*!|Gp>?Ӆwr sGz]Lx~`~9`:K7>j 'x(DL֯Zx\z]wy n~klNh[jl[ ݢh}:ރ$fIx9ݽݝkCT Q$0;Օ&?Sf]WR95(9ϊ93|95 O {j:gR?=Ffc C1LJY:%DM_]EyIfHżƷ(fE̿>XSa8hv[Xi#4>'ϡxA4`X5m$wߜ]z!lhC6|vub'uj5Un֭7O6֥IΌجv[AR8F+DS}7t?4pGE٫_b[:}_2b\cϞL>sCP^_pWb&v=H%&) %4CjIAkq{ ^GtXv9,dЉ-k<\^+¼3^edV(sYY*fgchH^btїPE_[[v"eo(:W@729ޓX!T$#bՋ=J|DIᛜ:|5z <{γt5]ZSG[n/'"d+{4Z̀6{(X9?IRZڿ3f̸ful݌ l|"`]EQfﵣA`YT#w477_@endstream endobj 79 0 obj << /Subtype /XML /Type /Metadata /Length 1387 >> stream GPL Ghostscript 9.55.0 2023-04-06T11:22:05+02:00 2023-04-06T11:22:05+02:00 LaTeX with hyperref endstream endobj 80 0 obj << /Filter /FlateDecode /Length 3219 >> stream xZێ<Ư~ dE6ְ+F3]sYs8Z9?_ͩ&VcvUSKQp3^\~Z_m3 J)..fi(3V2r;]Tܲ|Kڲzg%p5w÷C?F zF Wsic%-lIB{)dci# Xc3{Gbi {s'G>RP}MVsYlfʒQf3}[fR)zK]މh=8ClÓ|~lwOmjрs.k-Tz5E5V_]fKk*k# ~r>tBKGa h@7> iZOBe2]w3VWC+\!oZMYwCAJ"*X{']@r3!P:i{@]j(tZJuVIDd+q_OL"FHN%hinzgbo+\2:Q*95a-P̓B榖.- [8Ltz}QGHOy:M4d-eyo wӾW nJ3 j5a=N%xSHIIbZY`-Oֱ@`7 ;۰xAf/Xv9 C4@*r?2q!LzDTb2JKR=HEqZ56m!)Q $U1s~|AUUadkVLS;i_/Rql+!+-Y EQP.1 ЂjW5 5h2l\(J D9t =[6Һu_c{Xͥ'M-w4)њ/fWm.3{1éo]/jRv:jV( AUI$T!x Ҍ^L(We_A,^/́} B\~UH*O/O/ϐ,dY>B"e%F#iֳ%k7]n naAfD44 B;&IWbBfSGelJ8\zc_-@b݃ @\@(l Du5 JM0 %\p>$m@) H{L2Ǩs K8y>#vE"*p (Bs[@ׇ1 jlڛb4ʝhmMz8Ca6ܦIQd, K +5?cw*WVASpXH9ޞFȃQ2#0wl?$|x%8ͪ^ vw+(2+P`9Mw/37@~yG6fc"^y[I29ݑ[ L 9$-[mZNnYϝOM:u[pSb9cSuMpY8gĠ]fmK4S{wS7vٍ \ WD]?A^Gau9_8Eg9jNj_3۸X¢L[#Qt2;ءjɎ.29 y鹽T8^(*-w0Ym" UߞjZRIttbA_#smJp>O<3J8*S|p?`!qmEtf| LǬO>%D0CcJ5mlﯖ~Ztn i5\v'dھu!nUa?:_r'H>Mgn *urj nHx擼36.2wɚ,~,=*]^],./ `3} 8|Ԕʢ(<z%3Dܻuϭ$w6 E9 99&--|ҽ Y{B<R/BiÒpCj]SANp ~qE?C'I4;HZF Om I:(pD]=$}9oCe}pU{ZALD^)Rҝu S~D)ˑ:aNϻ,6PmU_ߴmWJ ^N9ΌfpBH0A(0+h>Y'q`I @r\ a rr!r*VYQ7[L&zE͞(YX%տ@l۱닮COFTXNnG_IAVǭ> stream xXKo77[r-Z@EVYIvso }QZm L- g n*8L&&Nfb>JiJ;N \(:a90o&oOղ.HÅpY1qn:9I$vY3QDT$$>r`{0:/B(; ΤmZߴf+oywE@p e--q\-{ޯWgˤX푝۪)cx]!zPoW4 hfSn{`wLz}ZԷw h@[ɎvQn3h.W$AhG"eUgoCdYTZamyؑkkD ?#KV4y[t쾐m GmHZEu<f1?):_ R=eǼ ЯV%m/$ó;jY7i-J&VꔝN_rBH I! -#]pߧ$tNDj2N<$tNVp%<~1Ud#pCz, z~D200^N Qć1px@Jj=\alGA)GnBYs6rC=YOBXw{ Mң[8 aGse1i$tF*pזּC|Ǖ֎[oց5zJ|~@t W)*ܺ ?hOF망Ƽ@NBHDD$ed<$Y.u":%we PC8q¾u:,JTo4HbŎch]q/]e), zZW 9\ _r U`YeN%9HCu(:=,A̦>ԑLîr}L*S[q}2IǞ5*tm\JS3Č'q]a}ѣOYL)x $V{&_O||endstream endobj 82 0 obj << /Filter /FlateDecode /Length 1125 >> stream xVmo6ߐB1Tf|(͂)%B-RJH-Ò(s=w']vW']YY\rJ_4t{ZPG>ҍ 32/%mݤwUVwse;#d hoo `aJ B[m3__d&H#I 6$ {<b7lSCQd}2Xrj.xjhG^sZțoʵ7g{.pљASo_w Тނԅ?g APZeGsl `DyH!(Ϯ[H"ЛtK s'Z'ݻr[|w .BRݳ$Q~)JҎ*GTf>aA8h<Hh\#;4)!i9〹sbOޗy^05+0epQ*"w*`Or~/9-N/ ~/Tt3_04jMALJKg޻7 D.˸C_Ktqri.:y^^YjԢo><]^Ma@6jD[vI@@zz%'s2k+cA?GFS,$[&F?rKPvX*u̒X.'1gHâQgEui{atT'3+WPW]`! `b[(eX>IhV:@=bۺ@ |(2=Lw헇MUoy:$ <RY f s{92Qj_pA{%f1 NsE:iDu}'!j]Ά> stream x{PSosuks/kvvl:Sw} CUF <IbB <# "1]lӎk^geu3w=g~>W@$&`Nwjǒb!py3MI,b715o (TȋR3*UIS* [$b^EeUFYPT_SVN[mD6C;kćb#Al!P/.acY)qy$s2'! Mm5JA]bYx R%S'[āܬp?7]pNvuP9y%Ű')|6z Ɵ(aeH|XC>K<AF&u2Trgܞ=1Nq_;Զ:kal*7Rpg -O3x9/ 义rWĚiwf/S hG.C!AuZRT^ap*+۱3w 76AVuw)f3,&L=4u['2PrR5 硧kN䆙'}E5ǯHi7xrٚ\HK*E@m|O'Ni~5m8) ڔ[yEUm:Zpi05yO3tS/ʖqR$&tx[cZW@j@Keܻq"}_5i[c4A.g ܣ_IJ6tuUSJz8۝轔́[[ᮓ@2SU&-Slt`1XKP.LM^P 9eBh-[QFOq 3%;:MSީT4 ]fm&""48l'|C;;ǻ*F>5TBAeVIW*~} ]k3ʮWߨnu[pr!gπcrW)s\Fhl՛,"].RޖMµ#s㥏k Sێ.=?:= o70%hp宕 ujymy N  ǀj!EitnDeŴql?!`Ú~dr+fY ]ov@WZ,kq)G`caz3e"]XpVy,fyFڃ3<㢘ptgAb"u7=:T]=yuG} 4S=^O7}#L[:W(qP W7)}?y'>#Xc&4἟7GK1$El<~xck&QI-V!9_Q6P@&l)fdZpx l9?S^k[qѣg_ eendstream endobj 84 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1284 >> stream x={PTu ܫ^cݵ0- !N&!Xl XVֻ˲ZA4f7yOECAaAG1L83\]m~3w8s>CS26Bq.-@Hp*89f̏tvi%HcVF'L&c\e4d1&Zg2kEY &AgT,jk^γ,R)5K0E>CS:*Z@%QAT2: bX*ZCS4%|)%ʃ :i9]D?Ȣdu~&Yǜ`~f=b9pnW[hJtH/6>2{ya6vuF++O։j)<#Bn6HnHٜoj>KPJpi7i;;yPa6l[P*mNssY/ PyOsYSMPkwښ噰O'f}UhG#DwWk]quOx\s`#*; PȷЫ}R{JA?'i1W(ϔW^5\S}`Oܦ5X B>"T%ݎb(2?Y_qceXإk%7 }EV% ,E? C5R>RO8cf!$Z`l:ckHs[mC@W7qrH8ΞeWN}oHӃ>^ƋՄFgfee6^QKNHZӭkBUwY97k݃gOiV2C/^$ J۱>Uyses{Cim$ /K|cWd8u-x6 Q.-$e"kc6ջTU7y#+S2&]"#A;#}w#<E$V‹U( ʙ| 9z9/{ endstream endobj 85 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2929 >> stream xV{PT?˲k[IƠAWQ 򆀼 FJhAC 7 uYdՄ(16NY4mfڙvܻ߹~;YZ Dbzl|VrdKd13U?)`wVKc%=dsVvg,s9b-S$] v$ְ v$DԦ~zgH/ b4ґ;_ψS-4p0 *B% dHq5.!,q/`n_]RzbGtDJࠀ|M<=oڬDMOK<{BN&vf]—p瑓'{zK>crLO 8,&˸]nni,kMx~Mfso}q\Aΐ,^7EThp ,DT;|kH{~muu==%wMтEvv;'?xE DȨA|5&%7E ,3x߁Y; bQX]bCuN,?ar)94, tT+r MZ3Ң&ot TMd/x]gZ|F8۾;IhPڻ:-՝}on[m7iRV}x:F z3l R80 9 ehyPF&;kqxe1]uw4o>Q>eìEx5ސ`| ӧ_ţxhO_[gE?+W8Wb-*8}=,TӅ>:ϯ:h.d%)Pu vO j:crmSböP7x4%faҨux3>LH9&}dnx dzNaL0ndJQ=ʦa%A0f RC|p=@m\4bwxJKbf瘲Z n.kmkyXeJݙ-@$% 47\WC/Q`䄴*DFhz?xyA3u);aAnx^foޯ=TVZYRJ;θ<- U2m:{xݩ֪.܉:aҿr-3˨+u} 1e8wHԸŬOM4XcPl`!30XO^B((GTv~>iBÛY cR>7@;5=Jdy.mge~AF ~ ŗ'Qdz>|^V.Kq7P~Cļ:Oe\akayi}U{۱snK /M++fFf)o?sˢVn4yOּQk^r`uC"dAl@.\TcRZ~6ehW3*Nj-紧߼0*5T I2-2QAՒ#㉝O ]wJoFŋP?ٟnv2uD8tٶx`w-RMMpg ~wEr2 DcNl{W6qqM翺љ&vwoYm\':ÿ29I՘֖sag6ު_fGi>tK@E?18xjv7ac yF0BS1 KTZ3j)J~2Gfe$m=,`1}O07%_`@MI/| ؋ :J.~ԥ"7Ԧ[oIpvGɨ\8c>dTA>&tijj1O "*'H tt- B1At@AXR/2r- 0΃ղ[TJܨHyjHA-E[&W׈OnpmXUSlYR^[&{jOL RtdLr4FPBe+9Zbjy)*2}zn%`/K2qK=ɠo9rȆ.=5CgaN!ũv'q\kr5WR՘ԘܳCqG|8}Z%C#Pv LԌdFeUӿlۘCl̛a{3DI:p~mޮLB GR>ᑃNYo ^e@Wyj4<%<BM+y auu5-_S\:m %JM6qX 7'۸Z\Ю+uq`yOׁJkkkv@Ip'LWPA_8 {KaKh`% K[(i$Iybxżj`hzzz'endstream endobj 86 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1402 >> stream xmLSWo[X *]vdS͉bԸ7D͂ "h@+C޶ BG[RޔWS/[C_F4~Mq3䒸v%9Oy>lߔj%G jo&) PX{x̟7=x l*+,NJKdE{eo=!XػH4 ۉt"@"68"P@'8`W׼M[!ab{y8j r f>˺A_euI U(C!K9ݟEn7L^s6)RVj[ gg~u㖚2?~n罇U>+ƗsB.l5`UA3yu1MZQݡj**@RRtJ5hlOL?| z#pdpr/gXm %!8fŤa6pG)2j9T;F gW a>LNަفnWr01%#   x;"o))jHONOМJqGA:wbf+;K(mVl,\O~Q4edx˟Њee \x~.%>Cʿendstream endobj 87 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1271 >> stream x]RkLg}['"hsyP&ŒLUDJJK> DJ ^g! ^fDfg,okƺy9P.p8sғR63, pCgT30a|_9QG\gr0W$U-IKŲ-B'Eqkm\Rm4 # soqOs!CWg99=l~دJ0Ǔ}:벻썢+t¡h--#~9URbjJ{c"u@ ʤE6" $E5AiN"gLC{т@P:WDUz(=MS N(|Y70 ý-C 01%V/҇ $nc}iGx8NPe xǨ6gq'Nr_5?g F? r(pu~%L:U}~#X&wzhWTL />+ o٨N90LOMmfw(cIXIRmf3V^(Zu:fGqy E?KXG u]q6X ~fg"]A'ULv6P߹n Cc `e-n% SO{'kZ0/I #7B^%փa&j9=y>!nKeA@A/YJ ߗ0^7_ט?`T`Oq~}έLgKc?tVЙҚ~Q&֖ʊ eL,Ð Q= 9p¦듗͢e;w$e|sn5A)(N *Ķ&F<X_zgт<<)`%vWJqDg|שZ!thrH}ƫqT '˾ej-ЄZY@?E`#/zFJ-`9IkXd ܬ=~NT{~!tjV9yG5ʎh#Y۵)YY,[a]Qg7:x/`T>T#SJU݌V td`l./EչLxH@\endstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3144 >> stream xmV{Xwi%@Qg8`=֪n϶V*+ "%@"KDȍ""8 R-ֶc۳,_x~캿^$'33oQH$ZǶJp^'"F.ݫUArXPS"1 hf^nRWHFbRvFZW<7)=1)nR2?#3;g{n΂ݲĤ#R>*CP^* Q~j=ES@* S;W)?*zr$ (O1ThH q(o:>xS?h_o,̦/Y$qK.=t9e(L>tHJ' K_?1{ö=RY+#Y;^ Zr5b;}?Sj fbP :TJiqbx 9`۰)K9om#n.fXs}'}_<ѵCS{,Q(B)iaPOe{L)H&!? w`IUT!UⲎ% b O~NU ^hV f[{Dkǥ#(f ]*I~5nN1hRwpGG}&U aPtվI9G( %6ZѨ,!:m[xC-0>; ]T~z0](nOi.4-O㦰cs:: Ţ"_TወءFZ5P4e iV t>%}?_0K'r^ gXU׺{ۻ{.FZbC")㴰SNwnCWpUwɷsҾs9=ٚUQ;~S& 9#ݠ7Ay1keNJ+FšB]!bK'EQ1Nu8 e/*T ]T@lYMy]Cc &HER 6wAtrw:5{:&C--?.O?rXM&[Ɉ<:ޯ<_FC l.:~ MЃ,o>x_^nX::r$ubMܻII-#u'|u ZhuHɶ#%&P{_B]^+Dgm/Q*P>њ=BW{QPrd\v܃Ͱ׬\PLYU]ΕrVyI9pD.Er* DCĚ.nE1I}1'?_"#q MggTH%':|HW.f3RzZMmNrB1Rkԙ (ſ]6CfmDY`[T@Ѝ Eq|x|f0 f;VNW[]jYsT^PqY QyQ$̞k(kqDc ˙6~ObP%3&2\"zٍEG7Q(`K?LZ+,);N(}+7a99?Sl@P&k!n`>E⧻ %?`fЙkhv!ZNIZXA Iax]R F@|p=y>\oL[>4rz\Z/ ~L[3ql,\h.i7V7zF7æv[vZ?FiͬNBXU\|,'=E/Kմ#~G7~ [b FN_C&ZƘLeYHiiUMi:> k^7S74-׊Ɠ ;2&8:X<9\eB*L+~ûmň"ƌ:3zǩt~CAC%/x?xՐF?fN]SwЗʚkO" d_cEi螷PZU)[Ʃ*o~PE>@$+P;.ƫe^ijuF4U|."{:%ON6$.rW107$^ʗ0ꍯ+|ް=*UU*em3&۝1A?T8[7.^4ς^3L\:d )n>#🶏==Mc$*n ThQ6fKA[hP:YӪc=zK4cj;P_~kzVE'd'cG: Ps>SK^3߰ߋX3g,9ݩ/@ @}>y@ '@я] 9GW|6Fr s1sYnZ۔\R^PZk^opkO P34ҋRq6%O} endstream endobj 89 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7291 >> stream xy TS$8[\s :VTyT $ad"Ƅ)X:Ŋzk[;h'o~v}+,~y "AAAW/XtlDD!A!(C z^ݪ '}ڏ yIXI1"UI;%A&K"Z&^$Y,ݙkIFtfL+]:~MZĈOSN{{A#G3 ˉ7ěJb(XMM!ku;zbKl$M|b3 "Bb1XLL ]b)1XFB\UG'Db1DPDwH&}~A=ٸBI j [p7c'RXW{)7E#ȞM:{Zow}kǼ2_ئCܽ{+:o|j[  x|вAx%vM1o1Sx`?&#MҠz dUl †g9"`RXT%X t*5(FkBNH͓)t p:86̮y~8aSJ7<7I ?s4u H'pTfxM\^'bw=w? BoMeHO__z0N!x'TjL:#9?Ι<.*rhV d139L[uy$sY=yr>G%5+({U"`?c@&#Si܇5ùǠ&n]LP*Ɏ @P$lڐoP4 GfHqJ@Is2qZ-ՔŧG̢RfiP(}zDI]X`qX/6Cc9j[mRs@nFk ~:r(b($eSls0p& lF;S~TmL XԻ3bp:<#M+ >FA6fPH)ror G匌%4mົ2 ˬ /Dn< K4H 3@]9s*Սc4!$ŏd(&]és8Pk%*BIo wcP^`/0PO4cb)B/y;ej7,"^8(.y(LxFkw3MLfr s~2'P{l@#hmt]RP( wiI`gC[%\|F}=GǗ0I ӫ*2rr+)p_9 ]-!vwj{ͺy4wV6fg^?MKJqns<|t,Mdcîu.E9 ľU &- se9Z[+Z.L2g۲ٵSe+6(,r[EMx~%׽;l *cM9 $e&RvK-Qb\7NKzY|Uo׿u@e/sZU@mTiz*4ffɫԵjّ##%VUyY7xw5/ &nWx>QW3n7,yH4c gԤc}%X<(( iAf]Th4cD)UIK HmrsE!GV&ΣY-c1wcM=/mj>BA*+D9F,HTUU+;,wlZBC_6Q"_X}c(K1H@\^]W⩡m]J<*/^iY٬Tv5WɥScvn3k?H1Y9 (PԊMԊ+@C}}y<5A({,zu h0)]_@o8p9nKnveA 5o?9J|YM s؜^ٶu+#ڝzp{+b}z- b%$[@<7Ip;+*핀zf<r49ZU2%fp v[)n\^V: xjl&CBߠnxz95hRYiT)XТ훅nN>>Ln^?'*! IU*d co\lOPh6Vp#6Dp1ڊVkDqJII/ U^\ϯ|5`%@|(7ddlp 6PƖ`lVA'\ !3w}Nl8&y:8A??ɳ)p4:]TJEsboWf*x ='pGL;@ \B~g=? VŽged?t&1[\G}9l `أ'XGD;+ _x[e{5D{Vm` 5 ~u\zly)p)PSVWޥ(֖i*a}уDVWT5vƛ*&PY"WIؓ7.[B:ΈAp$:NwMD3"Z_A#T pQy }s{̹Kd<'yyEʨ]3RDELZVa?Bl`͐z5dsn3\S.&zl.N?D4Rntnh\U?F 3ڙ$a/$D>Wd2vr栭C_0e y:Ws7Όl(WX|gٮP?h왦,`b9*Qm{IЫA 0[aglʹkG]ƲJAu rLI53*(qEz8yЗZS]׊I4`Qt2q9R.mz_Ҏ%'Ŗi 2,úh_ԧNzzc%YOƹДDne5ʧS:v!D7D>0nmƭ=s.;*3g5{üIo I)mAۘOU4siL: kږo/v׋r[g9>*Gc> 2L Z)K1JsZqI*㤥SW_Lmi|1TƣSyHqyqCiu cBtfON (xA?k9R~9-lM̲/,vf.OT_o O$,$pg:eYxo'ަr\!0*6YGi,o[OԔo)>"BG<OةNܒ,fS)"*JvnbwqGv1σID?F0ϿaT7}Ƈ#8* |{ Fy+\Ҋf~}39D7. #c?*D*VaA*tJx"%ݖuy ;~r`Y-&\zF8x-Yw${c jڐǗfb'!?g|,.9@0|  V.2xfDOwP_پh+TDC<-WEp(!A!1aG~4X &LͷDeђ{ZvH+;<1|YCk3uHtiN}Ylg7w@V 9nPcz7 ku]}>ǶS'HpXO[< *`@o c $z5( pu5tזOIWT'r2&Viln˂<Әl&o#vEvfZAoUæOA'_< ySͧ>Է't֪E̪ˢV.Rt<8{yj݈ ĀXT`yg@n ".OkH`1Y;LC"BoFCrh?dsEVy`~VO>鏰3Y 6 PnwmMZEJrZz›O xbo2Sp=x5>#MpfPG:AZvV`.G5kMi)tTs =V+]p(npn`Խ;36Kd:yz! :<#<|Fm]h 9z.MIVU5Ei#J4V%g=+W g0&ԃW@^BSdBB ꉈ A(4 |f/;Q4WÆ#xAep gݼswN4z/ SZ:Se*uZ*&83gU-v+UE$T?+lڗ苁ă._ ܔJAچ;@}9`سs2r"?džć?<逇>5nnhbX'ϞgɳZuie9R ޣ&8m_*pbkMg~;:mwN3w;;}CTm/ zC?|e9 oL08|{IqiAvP>W/2)MgT[p]F>B-?}T!}J'%@{~pb=n`@[,gR@=+@CV|I`Kso\6(i@D*6WIkh Oo`/r'YG*ZYӲ +o6=j'=l-Ա *ĸ3Z40QO%aJ Qy@iR~h͎:]brxX̹AX/e.麅F Covx \LfZ F=zyn)Lv+̛o X4Eg"f֢'0Ɓ )BE`c+3 忣~JP/+77G]֪&NQ^p&`,ǡ- Ue0O"4C~uw_ yϱ3S9I)fsÉdGViT%/냒D&O.4Bx?s)xN]?_YF3SӪ+%{gdo"#^8 {:ν?~78Lj29r +,O`nU?8ٓs{F9endstream endobj 90 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1085 >> stream x%oLw(N,u.iR]/YTȘ^T`M֔BӖW* F[r^aGt2f eDgL7b!f/,{g~Wy7|qqvH(@~V{ P^y˨o'؁ο 4ZzmFWRި9D3lzjFIGC@SG4[W]t:L[G}e줍`3Q'-fj֙ w^FAlT`3wL&a%؛00ւUc2lbD+5zs-_N|GaI?ܷyxFM_>| Lt1CL&L`e*ML b''$AN_ g`*=TG4󁍻!ːWYQ?u'yBq תԘHI,uldiar[&Tb~Xendstream endobj 91 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 957 >> stream xMmL[uV`Po,Blˆ-s&WPP' bRQئ8Q7>l|`d"3s9yr<Ð0 a/0ޝv*3#Q-P_H C'wJb&D0յyKDŒ(Z(VVM[] #ﵹ\5))n;jMv8˟NH.X JzLv[풸-y95u.);$g5!K5ΌOxK' '@U4F" 34>5ER亱Ў1xVyyX\]ymA%ɕ:3adNg,i̭ɥ-|{7?n8Le?9ȆރׁSoCP 0XsEgCAK? *Ts氾\n6 Uo fZiyXRofLwVpc`t?hTи75(II+܄g ‡fwte+{MB77=1l *V ~ۛ#WsspJo`n+j>{Sʫ*ZVYx2 }q<|J҆pC Mun? [%~ަѴ;xo3>d) 0 ΃zs?\Ƙ>Xż /SM3B:donFl?p}cƣ)pՋE;O^jCnGtP h֛ƾӬ>U:zQ3ZOeQtZ% 8g8톆&N)}}bT 1%oXZ2F,m"RIȿ=endstream endobj 92 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1009 >> stream xkL[fSeY Uv]1H=؜c(@}R(ЖK[ x< Ȣn3W2L͈/~2m?矃"EѼ /gvD.HD _ݾzkjED(5:t"Gg+*ʋ*5*ZВ5 EQP;͇;:ZEuE/Pl6(4գŤYMo*Ci)B"JrN7Q*YkT*NR"ǑHA@_@˹"zL$զfթ:ca3V|mzqHՓ \aGMbQ+u< kv#okXCͅ6EV=aE׀;}>húcYգpԡt^m+ذ93ɹBW^%mOdŲ󺏿Mr@ lqNF)YxnB2]~C,gc?9!.CG F84ºIwQ_Xt>w]@o!~9 ڭ`@2}"fa>8p3ax!1spc3c@Уt_;wEwCoׁ _; ^yW%g/afa7?63͟h]zzRC#`mXrk GMS6v9eS=&~G9V,ncuzmmKO'ӸPe۶#xaI Qv<J_*j. k 1?=S3N=e!1a"~,Ogٿ0_\>&7H$7endstream endobj 93 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 429 >> stream xcd`ab`ddds4H3a!kc7s7ˊRBcG``fd+nr/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS%E )Ey  L,;~t<߰,?UDgvvOS]Ijv̞ݝutt7wwtwUGdn g-(7s/H:ݻ|ۖ7//!8A6C&#|o-Y^^*WQ2{+,lwbjd.> stream xM_HSqu6-u2O`9Ő^;wFnw]+ǴLwwܬ) ,, z|Q'~w6}ps>簌6aY6J{]m&%XeR p9ݝ5`ԾJ:h 0HD){m_oY tT;ݧDx^ )!09i3kH!ߗsԟ^]>fEcBhLW'oendstream endobj 95 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 510 >> stream x CMR7$,  c]VQmqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR7.CMR7Computer Modern12=Q͋oKL0bg͋§j~'eg #e'͋JiuP~>}L讧Ǻɋ !74/XWϡ=:4MFkgo0?ts~*~ssr)pt|(|trswCna  7 ڛ zendstream endobj 96 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 280 >> stream xcd`ab`dddw 441H3a!"nn'~%Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@s JKR|SRx##sWmf;OUsvϟ_]%g#[Uewy9|ŋ/d-=}3fn9.zͳyxv^endstream endobj 97 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7757 >> stream xy xUn@U(M N. lDE@d-!['k:}z%IY&lH,"3̠in1{}>'w~_aݻayyy=O]Çs-}4Ȋ3z>OGP=-/ɕUڵ3+Y˯@RV߈~o0l+TԚZPJZfY?wü,fϿK#^9jqOMK]6t؊0l6`sWDZ'ؓ)l!&[M–`װaRl 6`cӰױKel&6 0 {a`Xc4zcc؃X_l"{e #y _=x!XJjbϊ^{mghKL}pȃ޾/mFSz0o# 6"h5ZWqjC++D6gZ2_ڝ2@H."WOT,B WS&Qfe*zg< D*p+(F* Bp#'-1vw9N P [e{0ZH}`ڟ&ڄ =Ium7L/LW[vH q 3yW:%/[ O~x+{/1:.rLމ.#t+T|%Ƴ*HIGDC&,m/D)KU(ug)"e.ž qr}^!P^% %֯JƂ?WN.Ag2 ᦢKtMu9)a8%]p, vîÅrHP72k7,`2| ˰̽ \)twRkEK LK) Тk4 D$ZXim<!87WQ9[NDb(#"5l!\Si^1|}HEpB+}^$0S OAz m'R@5>Z0Av}fF;*D'*pZp e(lM e|% u?Tмd<Z;mnw#*BOlm jQ$ecFU>!3b5j˭T$$w2Z'wɊ먯ԗ=*OQPy^u w9h {§gvh@^Wo-?Bv.b*]=nz}k IU̲f{,\$X֪`k- G=O/Ë@D1NXjX!MiI$hӨ2G]d 7g3"<94 A1l OVH|s7Ϋ:AO[>&o5ཀྵ9M [l("ڰV]#e+i/#liU-]*?}Ey.lI9'OjZm5P#H׉E֘bvN'2t7GU$ Xцt3y/鯪;|NfWmj'*oY. za<ǚDv1'7 W:#L &aZЄT>BǿykDž8 =1ф >!eH0A|ғ-IGDsAzkhBZX4>ps-čtGS~J[!@K+hUJaRR[ךԀ, 7_8B+^g3]dD~yy!i`&Uj Z8^%2ٶ[5aơkZǴm}Ȯq+tJZD<5`sY9oEj*JAlo9#ΰ#Շ"lIC BUU|/V)C=dO=Bf w!w"wePٮl7d`2h%QA_e3j*[4r9XA8IVy*<Z QhPJ7|}'wJҙuur]0 ?d@m G[qR=SHC"XZ 7# oDE. W/Jm<fFܨZ!{z@$܈`"<DӵJ*'VtuÉGk/yPgd)Gս(X2x<E-S gO߂k.>"YG"AXdɚx?Z^KV,U@VĊOIGop 8}A!~}gkݛ9jg+]Z0ZAK\'T?kD CMtlO [B:BjH'VˤiMs=֕}֧T LՄ 6𴻢68 OlIAXݸmHDƛF9޼Y+*i U5R `XmZI"zhwaچw]\LE+IwvIP/፹]lw,:<:n G6l d)>L4/VכJ++)#ŰYY)ۦrRa8=R5 cL}@MͲ4CQbbq$ո5v d ^ɚqٰW!+0 x+jNvZ߲A7!%V?i{q}߂ b_MS3b!|snWമ)p" d\ 7D&(.7WsDž:F('L,gYJ~9AI繞}RD"5fE=:jiwoٴHn9aOp~އSeMp\Ζ`)QKSz:,GDV~>_\%DP6 sB>#+!3I Ú~ ?>:p_ԇm9DZ-B8%}˵ND+3<>Ia@&:)9q'qΰ8İ"9!,_݀d"@kQ͟GY/Tx\[\ JeY v_ сؗxGyGG96:J핖`7=[C&Ez# M;پپK!2q70T{B¥^^ B!ɴ६_^ߡ o|V6ffkZr^# jϹ;ӵ]^ٜ"ڐ@cgKۗd 8,},hd!{$i߹=[Q㿨q`zڙMH+aO!o䣤'CcVĻ9z(Ww1CÕx)|5̰l5Z(]W;Fȩ t;Pk݅8v>}`wd4v)zP3U dc<|fr,Pאu?Xr2ڷQvҡq]`9in O#p;۸ 3at$tNC!屼q* ՄUVDYV܂Y ֤PH@ QiÞG\ kde9#&w7me=]`}+ ߀_f'ϒ,)=u(W_]DR?hי'I }ސ׏8%`NeG;Y V0>0;IЍlcN tnz k^ݴfw?z|g3NLZ%PrN*& {!uPjen&>f>]np˂$rx/iBܥ:[+ވ'ugݘS˔jb&t1z^@FPDRy΅ R0wQ%z`6wr58O pRjC% >큰=bYKF`+/@w) qʣ&2'#Vf -ʍI~q.PPqA޿/B 1|;0yU cp*`ިH> QWQIpVnxySt t"*Im,u!a#8517PGa6|.Ke[WʻIL`mD%< #qif=YgR%&X/"vB^(7( tҀ"B[řD}=vG>8*e*VeHכ> stream xcd`ab`dd v 5070qH3aSeς 0012:)槤)& 200020t'glҏgOr2gV4}oIsޝ^Yҙי۝͑=}Qk+˻*9R'nq}z뤺ꚪzn?f}띹w\{帘p20)Tzendstream endobj 99 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2330 >> stream x]VipeICY qK!HRVi5k /P{[nŰE_ݍW߅II$K{@Zسb[gCcONJMJĒήJklji?A *WJb'"6eKfbQN,!RB#EGnuȷүяސ4NKnH~aHpe\/ 6VP>Qa/,CjTj,M=ԇi)R!~M}nv0u01 K;Y?*Y4xKaKKN=odyJu*Ŷ=ԬUv+6bӍV[X';R壀RF_ogmT2vC)1zH#CY&3d !ǠYXnY1 Q=?s _қ@؉S2Wjܡ){ը/)!. Mx(;6ɓ0=iYAG5 I~{Aa5҇2i{{oei }Z:8glyb'  SqH?r]-_>ßRP@Q'pwpjF2D#O=1A\Ԇ*͘)qU1\]U2G'^n59{Gj}zYyx!=vh~鴂\K-d)>@a ӜY[Tx*8<,w^x4`[mv]cs[Ph i8 c <x˟yZs8SQjAqk@ jڮQ= , oL\@v5?PJG\OEGJ6CCa}2]ȶkTķp0^e dQ>*2Z}nvP{7^s?z^4Uyվ9#X>ut8r6Rd)|Iwki?c^08{"482h_QTƮu)([:˽33WƮ 8 O&4=QiD: HG'x ZtvsBE(GN|zt*7~ɦ]p 2_ܜC̯HGA)d]vQStZӌQXlhS`7l|; A8gg&YfeiV]&O}FAwi5fO)ɐq&k볆* ap\x%\bAKiU)t{tպ=VhFg(?Y\ԓ?Ost3/Q:ͅr!Ej.}*5K1t%)n\ZP"]̐ S%x/U9#\q$FZɷ[dt!dz,=I+.u9TFj7#SA9'!R48,MMML=)(?#R'2dNM IVj{Iㆤ*@󄹊u3|~|yR,/1bLY4/fx _|:SeZxJ}QkGyFLf3_Љ,RmhG6)0v``r=DצqtbwWcr;lD,HY~/> stream xyy|Uobc.((.ø,*;NX$d_;W{};YDVqΈ/>&gI{1@{<d|yfBI>IG(S$ϓF$hwa(a,X B]JG%|y 'OM0h a ~dMVLz?:Gzwր?|:ӱ)pg@^'PPX"C!miʫԛ26>"cbSͦ e1, {TH3G0"Dec^z^Tt"Ef\()nR{v'1 kW9z{]{kG@9p"][-ٸM!!a;+?yst';y~oJ 4X 9T1X3c"$,ON%?e(k$ xp'S̒6I@n- m)š70IXt3N|8ʤŢi06EbL28slz`Sg&I]aw)e@HYF!3%pkb6I$Йv^LeSۓ ϳ w<1;\o L_Ubuz*P>yU#^ѝv%Ua A֓˻˳ڵO-)*Og='\q-/eԜK#yǬ!MGZ*?߆eݻOڶZ6`%x{niw>S4!ܦZ†hU@I+]Js1ΰ#SǵW4&<'pzǕqm,$8lXUwnEgڴ-xfϾ;- ݖRzT`+(D8oYQhn =IW 0x/`ɬ+ IIט'K9!*FFhڌ?IPyQm&.0<]EUdjB|hzo`9 DDR+@AOQa-,t.ƔRHQcnq~"\Y |lGag>`_ b9S*Gdb.B&("eLF"d?՞6Lj46}2136ӻѶMpDΦ~uWqA1/9|UA^҄RSTLL BC|r Uq?JsxM8-vC3cLŋ7zH$l>e;(E͘کqi\,IO $!LMg{+W?j}iuc$kŭMuM;޺*z/'Cdo{&ƎP} }k& Kj$aJp9.'<~wQZS6kkbBl5?o9;7ɞ%:*TP?}xZ32 ~Sƺ;A'gN yUl =G8bSj`kzɸI eQ&vg7az.DޑFmS=Չ-f7pΗLr,8 d8P3nJ:fU\Ep!01W ) ӔOg1,R4)dP&|Q3__I܈avfa9y?\=KL0 w݌^LٵgaN"}?R H6*BC w(|ޢ#s|io^dtAUB.@O,\W'$|ˆ.$"N^o1Ɍ<9dB%d/i&46Eh l;/!LE%,p<ʒ - \4NjbK%N Om"SΝH+5`bF!9?me_bK٫曆( ŷΜydϝ寓mY ^MÐ| @hrq3G_$~YwL?J:ԃD7_~%qAqiṹO6ʯ}kbRLQ+O 7P"4YM"Xjŗ= _$< wcp4AR*V]k 4,ٍY[͖V~MĭmH/ky:Ӟ4;>20ԧHa!D {L?)nr3W$Cf2>3 &NSob5w"%} < B^tc_v2-<_//tCMɫ,=hb1g^zL8: LL<4z])n%ڈBjSyku.jd"8CXޜ"ZJqϨ3N8ÿXzLxôfŽBB-tf3˄?/8T<;-hM6F⊈ yO}UMN8t K/V":,?>p ٯLUi$z˧Sy b?ޙ/>PPmTU&5Y7y!tf\3窗z|ѯwnu|H x^o5'Cnא >Κ) |S,Xfo 8UƻoxnسM=1Ujmn'(bʐ8&`;S(ދ_ |)ɴjE[5 $OasmXB.{|{={peY̓tabi i=V M++oD_]jqa' |esjRn`y$WPϷ9@""(Ҿ8Hm1mBo?FU<+04ךw" ]HI ~o͚O<7vAz_8i2/5OaGp| l7̨۵dŷ qng/1S f$Dn(ªwa7@>| GFCH-Nc~qLTͺ^Iީ=su ʒ>Yllp"@nFOτϸ.ӏ*'OH8gzg%zdʲ=}ȵϓ  8؏ zw㹡I'ւRƯfp9fB <.ck D5bFʢJ\CnمCMO~}-Fc4S@Gx:^#ƹ t/6x1< Y$h 96<(p,^YLk),8.\=3Ca}.-PX[?`>(H; qF7%u_]>g֤6U£՟lUGIe@$]xʐ<ބeAHj7.}OoN䝀ӵaYqG&f5[3Oh= NsAsw85ps ^I0zPj$3͛}ÍLr#Do]_oO\s9a v.{e@t:T]+n5՝/vHo?hUr[jzεHhxuݾGx#Bw'nAHRK6n>L/PK4Utf5 S9is;N1]T"`6^\<2V+ZBh2X&HtX:_iRTG^mZٴAi@;R aW(@7p;p䅈/s%P@\* =ܛϞA J%OK/mvx%iZ,}/י6m1s7`c Aj8X,i>;,#&B~qMXimx  zP jA 4BOS#̽( (,(%@, > <5͐;7 EaLZ9  0j'd2ÔБyC٩E !4*&J ש(he,yDz ٗku,jE}7ݩ+;!cTuN,Nsb2Dbℐ JtFvP܏pZYOv*toۋ$GI&4[ K4\Y6|kwPʇ%/C6 L{}6(jܸvZ`+FEg }jHd}y$? :׏Rנ_\dmS1~U6ʦR?#p EHrvy$zgXݕZh1g !<(fFșv]Ж_j|'k^WW[V TwG76%F&I]gJ~3zyU5OwN<>v M'{/Dl~nܲtp t!HP L@ddSH& Nc V1/.fP|otF@m u} qe@ G ?y09]n Xv (0sgKб HƧÂd}!en Մe7Z[Z@=)KxNnxMQImzzyt (}yYެ D* !Nd=rQƓ `!$CŹ8QGJCnjpendstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 244 >> stream xcd`ab`dd v 5030qH3aSe<ς 0012:)槤)& 200020tg\0?S7Mee?u˅/}(.;wNڳDΜn'v~f.#>mzgLnk +[iK~v-ܒ^Yendstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3399 >> stream xVyTSgڿs߫UFPTUǙN[i]*ZkZ(5 [I쐰'l !,"h]Pati:SgpΜ9YY~ϏCL #8cW^*eQpAXpȦL<υ3iǦDȈ%8K6Yys^:#z!^,<  A$ٜ/= ۖzpڑtp/xN ^"v$m"XA;b+KsH&y,b>ΗDg&lV3iǹ[X Iєvk5c3˞>S;O8#f? _L()Lr;y`TW2;]wXY!R)..K EU( f2P[ cK4nD ю6|+/ʾ}=-YbtE  F<nwE]! F"MH8Eh>vm I]q@@c| 0'ti7 MKqo@ ,2A*Ql9G]AT-1`6F*^ eڈldgCEf7{ȒhGIrgPzK["ΡRbwQoI?ni|ЌO}SiaQK]*~h5XvMYbKIeT\yQ#M9^ɟѲs))VcscrFW kULg#4PCʪ*Z6b79ecV)1:.zRMPhdyw,?OZ_3WUr2  bKg8Ag~]~g4CaxpJ8F^F58M[Vv/^i.5T)}.38Ơz6NZ=*?U=};fh5WaNP#?^SiUz%e 5fUSU|m;Sm`=u_L\$Z[{Ĥ6Z'(%%Q˔2 {)yTygl3zR*+)z(oh9/tx^,ya֕іV<ЕwwdžK [&x 4zGNXZ|WV{GQјcaP߀>iWOj3~ax [v4xph7n]=l4Ԫ땮Bgu5LA ,*HO}Rt {ScЬ.讯wUjms8JVfWb?VCGJ^<`=~ȠXh9 GϦ*DյgGO_]MҖ&|9 XiBJ((ZME%.YueuyGIG<'?eg9:CR35饊> H,P-H%%? p;/!u' "(čouUǙ]F{Nr_ayl?CCn6V` tDEj?u}9X鱸 (Ic)VMܰu1kɂ`zA3B["ڜ/NYW,y^ɛnd46LP29w]0ɛ}Jr\7(cB%_ʍFTT(BclS@ 1^?CDM3:z?]p0G7q\m3G^`UBXD} V_]S]+7lYLbMiG#yS黔{ ({4ۯs5y׿@+Z9켆7NK +V]]{C :sZK\UA%UXSRWrč#|Fj4*mj3E ~̦Ik`PU$zղL*s1Pab f ~U^U`XQrD{b˫~vٿkvέUQפk 59M؄h&uK'T)|eJpIZ0TʔQNE'?V-y'd*#lj1t-ߛ}:Ax["F$c=j LQIt?=Xsz(15r`8 > stream xT Pgw1*F1iƴ54PIHP 8ݽ`~~@8 (Cc z)Z4UNf̏N&9]2if2vfwgv{gy^Dwa⒄xzg}_MKҤt\\z I~UUYM+KOVʥOVW—oEIV(CeGVTf>3ىBv#C ,$yف H"AR !G"Qhbfb$i87ɣҰ%$|8/Df`F"t_x݋?uJl/[H _$W l m.=e e1.M-7*S5.`l4Q+\"|(DZݮ&4pE:u^%U hS> JU Z]b.kEp[ىc/f7q^Sl| .vҮŠkjk#_)(О3 ">rm䄥I}tlXK:#Y?d; Tg>mfHu08Q[e&php_ i0C L3Y⟣:"ԇb؀ݶ?%o}fܖ'9bjhsvþ>gƒ ͔ -%Ƴ D &vNa(Ĉ߱8vmPX K`rMRoshu!L6Me:Z:(aIq֯ngnQ5__!%"rqa:qi:vu^Y%gY\D7Iؽ$ d&vɢ=Q1)I<0-&b׸"&WbuzZӦku wFjOmiƦ$hTvk7L3%s@%L?-ՐQF)▟S=Zg'F)Mμe[AJc !x;D% TtQZ9Ϛ'JLdAʂbxѾ~8UWJWG0BD.քQ1sx1k20 2gVK j:I:ΎΡPh[ffgQω@hm8®5-fW%' fK?A.Ito] endstream endobj 104 0 obj << /Filter /FlateDecode /Length 2624 >> stream xYˎ\WeOїo2Kda{1h r<ٿs,wȑFO="*m7v_\O ns5'rۻӾ!Xķsn_ޞxʖM%鶛-D6WcnOw.7:`볩.oV\!ï7.o^`j ?~}S09=n::X iq p<,黓i7>YPLK1.YP.:,RƂ 6W,^xغ*6ߕs@%:gEa+J9TK9TYQds@R;:Odd2>aׄ K2G +{B^ǶG9;dD[ !e29 i9 _ bp?Ps*f,3pr&.0ʥ55s1!wC!n5}dWLvE>P#jI>PK+j&d$܉gU5šjMZ?Vwv{dۙQוS 6&Dg&gY@U)L\Y4 ZlPB9N4X/9<qIy貜)dJK9W7Ѧ4`Ȼ5O n6 18ڦS6MI C.1 ,ܣȄ~Q) p+}{0GK4ָ 2ʄ_4(lr,yҴiJt/b5 rȅehQzV .9UB`V( ,XMpSb@6Q{PhE"~^hv".7\[m2!gQ/q+"abʉVvh@<.6M Bj8bx ى\WN5;VV$$&n8*yF8CM|*8$^勅F30uqM .r[a^Q,=+k525MOQ8.LJ6 .`#i4.(b85l 6T&e`M5=L{; R,P@9p_.WU>0hJ1|E!ytB|Zrɑ8#ןRO8iũ =fSä$5[5Űh4mP/U1-`ЏSNqӷ-zTT}'c. % EP馚 8aӔb5ݗG.!=v)AWyϘ>,5=c ȩ 3 EK8]Xc˺t]9|(@b-)YFԁ` whؠDٓ_5ٳiӔ^ Drh8b31ׅSQ/hT( )??q(OA7+eQQçF3*ÿ.,*2ZJR/m(42}s4DBAfM5 &ܴhJP/U1T-X\oL|ΤS؇Sk _qlz""(/|x)οzrn}ݕ|DL?޿~s=߽{D)1'>b9LJ7?P 6~5Fl7ۿ|~Q0v_}?$D^=ݑlD/_֮#w.o?4lYϜk_w#/,ȇ61}{/fendstream endobj 105 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1923 >> stream xU{Tg!d2k%Q̤`](*BW[PyqX "TG?ʨvl9W*#\0l켜*ÿ r)uQ8m?=$uzM/߲492p6kSTclS~yHE`9Q0_xQLۗa^2łhLIw 8{mS)} 8wd>I6dT(J:sz,JJW}>ޣfbْ7oDDcnK/d-).SdՑRĮ(!j|$'QSӕ]/dǔNw"o\g(nS;~Q+|oGI;9Vcّ0*\ ϶b9+!R%0ߜT\-3yo-rI=Y<ֆ<}e{Dgvw%/70)]-ݩݿ6RpF.q$%b!bH|kUGI4Xy+v.W[[/52k s ׭S}=C)SFQ*T; *kLʼnƿnA=7ӸP5g/D /p5N9<0n&{)bbnMvsˆGe>|!<ex:v'43D{- yhgqyplX`҃}zƱje1uZ-0wċtETyNobj ho ~qi۵\-ċxS B_A|- uc@UJHr;"l{a L`Ƶ*([AЕiaOO["- {~$мn<(K!f(^0?w`{\@]4P^X.⠚GI2ͲԴHix갧V0Րֶ4c{'T']W{9 c;XflcYԡּe]]R(DWd}E==}@Dxendstream endobj 106 0 obj << /Filter /FlateDecode /Length 2439 >> stream xYK _H~ا*IJ9kjH☢vdS<V+w{O7js[V VM!VBsrVBpz!`[mv<~}k8w{׺ ÅJv}}8|MV }_|I '^Ⱦz PwƳϫ|ۨ=PlMYʎ&Mt'Rlw[mО]=IR c;<ŠvxhN jثc kOyez-ܵt` ,.ǝYePu<|N2)<(59x#_|۷ @Y<.}7ۡ nxSYPe; SB^:dIVBL:OB3,W:9x0Δ2@0 ޻ +(X`fYpCN / 'T| =@҇i w\'-,⃱$ v8N2Gd ̀KEBxB|W45V֨0B?xyзulacm?TAt @tkX üeOzB YP(* z-]0+guw8kY wNZ{&>F OdIJ O\a1e| M2MܯEb')_imgAqElDm}L7Y u𔝚&6P%IN&hY?7Y&ܶǼw@O|a@tQV,įjvА ޯUZ,mFtOh RbǑ%F9_ec`1|렁B.iT߭x5]z0!RK=cCR4ݑ@x V.t&L E^pW@ )ܮItS욥yJġL+ kKZ\Q$Wht \cxli|oҶ ;lU)c00@D6h|sZ.Aüm(x#F1>kcBߗC:D>c@䀥e3H1\ .Ç%ނF S3*լNNqO#5'#(Jd:Hl#ߥBt뉑uA~ʼnES+/6nM.iK53.Vrj|Dg=wgf1iũu d'…MWx̓[PMO688JsPwMYZ p3zn45Sۻ0N[ *nj9~u(U<}hc󏛛߿_kendstream endobj 107 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 196 >> stream xcd`ab`dd v 5400q~H3a#ewo_ 0012:)槤)& 2000v00t;gu`Í ʅ|(YQϡ;çg /xk76i?~뙱wh7{r\-< Fendstream endobj 108 0 obj << /Filter /FlateDecode /Length 1593 >> stream xXKFٿB7Fa=#U9lAQy!lZ[Vʖ@!tHZ+ T[$^,]Y6jsaO&Y,O*Xf(>YO1'HUK@)|³qrEʪ\iR| oSWܑ.:7bYWpSFH\= wT Xm?%1飬J:ƹMʋe}K"4V.x眙q39#fݑGר"g^uwf@1=(+71i\ޯqs̏yD"ZȨ" HΊIW-Rr굲*b9@YQ⊆q`ScɃM+{.ޢ<\Al` &A T\1N?߰EcDN` >`aˠSx3H*> 'I\(q,A qQ|R|d{ife!:iQK3f=ګHAZK砮1Sqifa[<9q}h*"|Ga}U{XXsd!#ɻTX(֑|z>Hxasx+Y@;*9MP0@["zMo]Űu5]%B KqM .0ok#yiοJ%OJ:і~5'A +6uBKLF :Eӑjek*|kWXd QdgA_`Kޒ5 3J9&+I To5[pWu0iYTl?;IǽBM[@Qαj/*z庪x3jSXw1xRL$b趵ja~:q u3hCgmvS]> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 110 /ID [<1e273cd15fb6e74c0d02115752871a83>] >> stream xcb&F~0 $8Jy? u/(NyHv!ɺDr<@$iv,VD^,XD2{ 9D2H`*2`?6DrwIFv \j {pb endstream endobj startxref 70257 %%EOF gstat/inst/doc/st.R0000644000176200001440000001667314413507474013715 0ustar liggesusers### R code from vignette source 'st.Rnw' ################################################### ### code chunk number 1: st.Rnw:89-93 ################################################### library(spacetime) rm(list = ls()) data(air) ls() ################################################### ### code chunk number 2: st.Rnw:102-108 ################################################### if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) ################################################### ### code chunk number 3: st.Rnw:112-114 ################################################### rn = row.names(r5to10@sp)[4:7] rn ################################################### ### code chunk number 4: st.Rnw:119-124 (eval = FALSE) ################################################### ## par(mfrow=c(2,2)) ## # select 4, 5, 6, 7 ## for(i in rn) ## acf(na.omit(r5to10[i,]), main = i) ## par(mfrow=c(1,1)) ################################################### ### code chunk number 5: st.Rnw:129-134 ################################################### par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) ################################################### ### code chunk number 6: st.Rnw:143-144 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 7: st.Rnw:149-150 ################################################### acf(na.omit(as(r5to10[rn,], "xts"))) ################################################### ### code chunk number 8: st.Rnw:174-175 (eval = FALSE) ################################################### ## acf(na.omit(as(r5to10[4:10,], "xts"))) ################################################### ### code chunk number 9: st.Rnw:180-182 ################################################### library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) ################################################### ### code chunk number 10: st.Rnw:189-190 ################################################### rs = sample(dim(r5to10)[2], 100) ################################################### ### code chunk number 11: st.Rnw:195-197 ################################################### lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) ################################################### ### code chunk number 12: st.Rnw:200-202 ################################################### library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) ################################################### ### code chunk number 13: st.Rnw:205-208 (eval = FALSE) ################################################### ## # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) ## vmod = fit.variogram(v, vgm(100, "Exp", 200)) ## plot(v, vmod) ################################################### ### code chunk number 14: st.Rnw:212-215 ################################################### # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) ################################################### ### code chunk number 15: st.Rnw:223-224 ################################################### vmod ################################################### ### code chunk number 16: st.Rnw:229-230 ################################################### dim(r5to10) ################################################### ### code chunk number 17: st.Rnw:235-236 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 18: st.Rnw:241-242 (eval = FALSE) ################################################### ## vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) ################################################### ### code chunk number 19: st.Rnw:248-249 ################################################### data(vv) ################################################### ### code chunk number 20: st.Rnw:252-253 ################################################### vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] ################################################### ### code chunk number 21: st.Rnw:258-260 (eval = FALSE) ################################################### ## plot(vv) ## plot(vv, map = FALSE) ################################################### ### code chunk number 22: st.Rnw:264-266 ################################################### print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) ################################################### ### code chunk number 23: st.Rnw:278-283 ################################################### metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) ################################################### ### code chunk number 24: st.Rnw:288-289 ################################################### attr(metricVgm, "optim")$value ################################################### ### code chunk number 25: st.Rnw:294-295 (eval = FALSE) ################################################### ## plot(vv, metricVgm) ################################################### ### code chunk number 26: st.Rnw:300-301 ################################################### print(plot(vv, metricVgm)) ################################################### ### code chunk number 27: st.Rnw:311-319 ################################################### sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) ################################################### ### code chunk number 28: st.Rnw:325-327 ################################################### attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) ################################################### ### code chunk number 29: st.Rnw:332-333 ################################################### print(plot(vv, list(sepVgm, metricVgm))) ################################################### ### code chunk number 30: st.Rnw:341-347 (eval = FALSE) ################################################### ## library(lattice) ## plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), ## zlab=NULL, ## xlab=list("distance (km)", rot=30), ## ylab=list("time lag (days)", rot=-35), ## scales=list(arrows=F, z = list(distance = 5))) ################################################### ### code chunk number 31: st.Rnw:358-364 ################################################### library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) ################################################### ### code chunk number 32: st.Rnw:385-386 (eval = FALSE) ################################################### ## demo(gstat3D) gstat/inst/doc/prs.R0000644000176200001440000000304314413507461014052 0ustar liggesusers### R code from vignette source 'prs.Rnw' ################################################### ### code chunk number 1: prs.Rnw:48-54 ################################################### library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y ################################################### ### code chunk number 2: prs.Rnw:59-61 ################################################### bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) ################################################### ### code chunk number 3: prs.Rnw:66-67 ################################################### variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) ################################################### ### code chunk number 4: prs.Rnw:71-75 ################################################### pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) ################################################### ### code chunk number 5: prs.Rnw:86-96 ################################################### z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 gstat/inst/doc/prs.Rnw0000644000176200001440000002004513777370515014432 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The pairwise relative semivariogram } \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \usepackage{alltt} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The pairwise relative semivariogram} \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma} } \date{\small Aug 29, 2011 } \begin{document} \maketitle \section{Introduction} The general relative variogram (Deutsch and Journel, 1997) is defined as $$ \gamma(h) = \frac{1}{2N_h} \sum_{i=1}^{N_h} \left(\frac{2(Z(s_i)-Z(s_i+h))}{Z(s_i)+Z(s_i+h)}\right)^2. $$ It is claimed to reveal spatial structure (correlation) better when data are skewed and/or clustered. The \code{cluster.dat} data set used in this vignette, from the GSLIB distribution\footnote{F77 source code for Linux, downloaded Aug 28, 2011 from \code{http://www.gslib.com/}}, seems to confirm this. From version 1.02 on, R package \code{gstat} provides computation of the {\em pairwise relative semivariogram}. The following code provides an example and verification of the computation using direct R code and using the GSLIB program \code{gamv}. The following code imports the \code{cluster.dat} data from GSLIB, which has been converted to have a single-line header containing column names, packaged with the R gstat package, and converts it into a \code{SpatialPointsDataFrame} object: <<>>= library(gstat) cluster = read.table(system.file("external/cluster.txt", package="gstat"), header = TRUE) summary(cluster) library(sp) coordinates(cluster) = ~X+Y @ The following commands specify a sequence of lag boundaries that correspond to the GSLIB conventions, and compute a regular variogram using these boundaries: <<>>= bnd = c(0,2.5,7.5,12.5,17.5,22.5,27.5,32.5,37.5,42.5,47.5,52.5) variogram(Primary~1, cluster, boundaries = bnd) @ To compute the relative pairwise variogram, the logical argument \code{PR} ({\em pairwise relative}) needs to be set to \code{TRUE}: <<>>= variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE) @ Figure \ref{fig:vgm} shows the two variograms, as plots, side by side \begin{figure} <>= pl1 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = FALSE)) pl2 = plot(variogram(Primary~1, cluster, boundaries=bnd, PR = TRUE)) print(pl1, split = c(1,1,2,1), more = TRUE) print(pl2, split = c(2,1,2,1), more = FALSE) @ \caption{Regular variogram (left) and pairwise relative variogram (right) for the GSLIB data set \code{cluster.dat}.} \label{fig:vgm} \end{figure} \section{Verification with plain R code} The following R code reproduces the relative pairwise semivariogram values for the first three lags, i.e. 0-2.5, 2.5-7.5 and 7.5-12.5. <<>>= z = cluster$Primary d = spDists(cluster) zd = outer(z, z, "-") zs = outer(z, z, "+") pr = (2 * zd / zs )^2 prv = as.vector(pr) dv = as.vector(d) mean(prv[dv > 0 & dv < 2.5])/2 mean(prv[dv > 2.5 & dv < 7.5])/2 mean(prv[dv > 7.5 & dv < 12.5])/2 @ \section{Verification with GSLIB} In a verification with the GSLIB (Deutsch and Journel, 1997) code of \code{gamv}, the following file was used: \begin{alltt} Parameters for GAMV ******************* START OF PARAMETERS: ../data/cluster.dat \\file with data 1 2 0 \\ columns for X, Y, Z coordinates 1 3 \\ number of varables,column numbers -1.0e21 1.0e21 \\ trimming limits gamv.out \\file for variogram output 10 \\number of lags 5.0 \\lag separation distance 2.5 \\lag tolerance 1 \\number of directions 0.0 90.0 50.0 0.0 90.0 50.0 \\azm,atol,bandh,dip,dtol,bandv 0 \\standardize sills? (0=no, 1=yes) 2 \\number of variograms 1 1 1 \\tail var., head var., variogram type 1 1 6 \\tail var., head var., variogram type \end{alltt} Running this program with these parameters gave the following output: \begin{alltt} Semivariogram tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 58.07709 298 8.62309 8.62309 3 5.473 54.09188 1248 5.41315 5.41315 4 10.151 48.85144 1978 4.42758 4.42758 5 15.112 40.08909 2498 4.25680 4.25680 6 20.033 42.45081 2296 3.74311 3.74311 7 25.020 48.60365 2734 4.09575 4.09575 8 29.996 46.88879 2622 4.15950 4.15950 9 34.907 44.36890 2170 3.77190 3.77190 10 39.876 47.34666 1808 4.54173 4.54173 11 44.717 38.72725 1222 5.15251 5.15251 12 49.387 30.67908 438 4.56539 4.56539 Pairwise Relative tail:Primary head:Primary direction 1 1 .000 .00000 280 4.35043 4.35043 2 1.528 .36084 298 8.62309 8.62309 3 5.473 .63071 1248 5.41315 5.41315 4 10.151 .83764 1978 4.42758 4.42758 5 15.112 .77691 2498 4.25680 4.25680 6 20.033 .87746 2296 3.74311 3.74311 7 25.020 .89610 2734 4.09575 4.09575 8 29.996 .90023 2622 4.15950 4.15950 9 34.907 .96043 2170 3.77190 3.77190 10 39.876 .90554 1808 4.54173 4.54173 11 44.717 .75545 1222 5.15251 5.15251 12 49.387 .82268 438 4.56539 4.56539 \end{alltt} As can be seen, the values in the third column (semivariogram for the first section, pairwise relative semivariogram for the second) correspond to the output generated by \code{variogram} of package \code{gstat}. Two differences with respect to the gstat output are: \begin{itemize} \item for the first lag with distance zero, GSLIB reports that the semivariance value is zero based on 280 point pairs; \item the number of point pairs in GSLIB is double the number reported by gstat. \end{itemize} The ground for these differences seems that the GSLIB \code{gamv} uses a single routine for computing variograms as well as cross variograms and cross covariances. For cross variograms or covariograms, considering two variables $Z_a$ and $Z_b$ each having $N$ observations, the $N^2$ point pairs $Z_a(s_i),Z_b(s_i+h)$ and $Z_a(s_i+h),Z_b(s_i)$ need to be evaluated, and all contribute information. For direct (non-cross) variograms or covariograms, $Z_a=Z_b$ and the $N^2$ pairs considered contain the $N$ trivial pairs $(Z(s_i)-Z(s_i))^2=0$, which contribute no information, as well as all duplicate pairs, i.e. in addition to $(Z(s_i)-Z(s_i+h))^2$, the identical pair $(Z(s_i+h)-Z(s_i))^2$ is also considered. This leads to correct variogram value estimates, but incorrect unique point pair numbers. (Data set \code{cluster} contains $N=140$ observations.) In contrast, \code{gstat} considers (and reports) only the number of unique pairs for each lag. \section*{References} \begin{itemize} \item Deutsch, C.V., A.G. Journel, 1997. GSLIB: Geostatistical Software Library and User's Guide, second edition. Oxford University Press. \end{itemize} \end{document} gstat/inst/doc/st.pdf0000644000176200001440000032562214413507477014265 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4922 /Filter /FlateDecode /N 93 /First 777 >> stream x\rƶ}_@C*庖Dz%Y<>$$鐔|]#)PҩSu@7v7vw"bT$ t$LQ6r2s. xĥWQL$DG q <*#H8sI}$7#)A\HjH1*R :Rn1i)Aa t|= aFFke bRE;N" :5x,A3E^(#0"1#ohP"љӁ6jth`72ʹuπkQp܋rGc`Хe ʒYe)0zm`&[<e;ƕ{p`q AᠠHhTʚe 'ז l$i@ـvDR7lk?n4DG7#̍ːb@<hX  v s81.([#rAZ .PvСeHCDApB4;{PvlgPp{ 6(9JWh5aQf5fOF8Q_(G2z$xz/~F"hF?=E0!b f1/U{Go[@{H/P*m,ͣ6r'f'Wj9^d_V|3ŷjRxlE鿣.RELg9wl~s"LXl6'SPlb8J'hoP)Cڗr:MRo}_~"|9兄Ys7'OCoJDX|enJ֣grfmr]Ŏ=twv3ңSԾX% _/ҋ Ɣg̤ _2*ke~zzhre,bLrL[8ܓXuDa# c#^T6}LΡJn9J;"ߤ򶹤Rr\H>> D@k1ږ|~ׅݗf4hO9;{t[.m6Oe|fOgˬbhA= 0*62el &(]>2G#1ާR3UatDi,- BУ<c1 !E]^` OArM'dL4L`׫td4Nf<,Ur9h\ .N*?4Wxt<?]B+1أlԃUz>"_cMa|x}r~wW_}z|:+h|:3mD=P-jMC5?K~!4 %gi<%Oe2M]j˘* sE[>n1 [ Jt]<~8tx^L=m!a&:Bn*R@(,Wv->0K-]A]Ш7BE|24E|$hec4B DStZQkx 9y! 6R Y (PRz7Bc7i0$w&YH2 o8O3x\d_q@܆] tYw]|M+Xie {akSo &ߒ??bp`Ia:Uxʖ ʶ `3̰^۰jZ*( P+nѸ!C=`6 -iEVAԥhnE7oE8&k8F7q^银M2UO3̉FuBZV`:ɐY[We1O?[{YL%W7Kl}l}h)GQ%P/&fL͘ ^WWۼ㎹q/UZ$֖(j Z[WtUo+5Xu VwLL d;8uwBYߗH8PfU:U:z8Ц#bf u?Xu537SS*պOr{J ;ۖ|evbeIyjUoNޝ.5/R=ҪꉎꉁYC!#yLt⌮H(t~BDoW %Qj q/Id7% P 9-d]]0R  b@y$=/Gs=0Ӓ l(ِ%[ [O0|?/`/ƏŔ K^HH'l2Z^%ttM0$`fl,VȦ*/-}'ߤKZDaJFاY>e?5-~OnyX^ -ömVÖլCȧOo[-.clUz@JY뷤vǶa<նM _-[Mpmo3b4+] *ʹylݿoFVj}w3%2Y,Yza۬f6ia"9fꑢh=!$ "Z*yaxꑼe; Wl9@Q1u:B5t }Ŝdc"|=(o>|,-q/b) bp",|c)s1b Kw:vN[q@njPDя }"ӑ(KGD@~(-TJL״&9`L0)MLN qG?wR@_w:f^%>/܁v+= n Ȭ)7[S=O߁};:л3~~Fy**Z1CԐ4?*%:FíK(gژIf[/aD\f_8>_. :i@Ќ~'W]P>u@@,p7jթe˟h_v';A N1(b%bJ|r1|뤸 5MƼ4ӏ2idfOlLa xx[x4x? PK<ϲtAL r|77mI..R9 ˁՖLj'r  iQdi1@jNs*L?dendstream endobj 95 0 obj << /Subtype /XML /Type /Metadata /Length 1387 >> stream GPL Ghostscript 9.55.0 2023-04-06T11:22:06+02:00 2023-04-06T11:22:06+02:00 LaTeX with hyperref endstream endobj 96 0 obj << /Filter /FlateDecode /Length 4196 >> stream xZKHrݷ!'=nXKE$jIjj{9IRj>"/Jr%w{|ß$ҟqo_ɪTҚC"WRRZrΔ*mϧeNc߭7ʕBW]cxQNV^ƸhK!KZ?JJL~I3*#m0^JgB޾^tUXW,Zɞ_/{|#tW +_3BڑjϼӚOoǠєdtT|Z5_"sz!"qK˕/v^/I92r$,S>="щ J塷?S6,N4W3Ŷ~,Qİ!ʒ[Bl$L׸j夔4)5 :绶4"<}3-pi󥬖#BX&שQDC9 NZ&\R)hݑG@ZHO#>$F]Xm@мx=LGǃw!n=q+}։шԴ^a)oĠɠen ֲ*\tSv&]p FS7$-ʤh8d zNd !R-9(CQ|@fr0p}ssg :X1Jx[c;OV{C˸X¾Ӌ)I< |L░C"Ժt<{^qc{lS;6 +X~IުRՍ° x[$z&t˛<%Wx=4}^$2>]Ov1"ѳ0+yoB͚ - ;B> 3C IZ{|i*엵J(%ݚu%+C"QJ#lb;5rϗ1~얚QJO_[쑟cdQwҩf}pi l%7LzeCP= z^'2{#<&RJ砏djHʳDUJ.]-]אy-="SZUTu]0S &҆ L#@iɺc'cˀ@&ҝPMd\$Dݷe%Ԫ[$<{( ;|KR(Isژߤ#\1%2hgy)bd xPxݾAD:[X;rMZ Sۜ(/mJKq'AoyUl !3^ BސaNRPN ]cBs;$}5\x>)] e1Ⱦ/6 m}lG {vɤH 5U"·w*SpΠp&eT /_>J2# cmtL1շ9F:9Hط=@8 FS^8#̨&ɮ$7i$#f Lt~~ə 4  n0s#Qmksͽ*7Ѿ:fhL2\j$LZɄ8f!#,= jI3&_ _-.)0y1y˲*9ud 2kvaq/͐<)Ud+kwy+94j%3(}rGZLv9rYs.@Ai*>Р k96`8eX-E@y'YEP?%:FW͒YAmwFK6+QE XSfn$4&8gwgf(&]+0tzEQ<>vV8___z tx a8euzHk%%j_KsHFfp1&3_vK12!e1&QBRڛr B8?Glv\@ڜ᐀ZS%m'o7H x  {)U 8Fq?҄],.X|:1,9^Z熂ȶC2K+]whN&n}Q[C,f!Y]Ԡv soLh)Yͽ^_!&(zJ;I컞Δdq|oRyp7X9SOL1.H8St9XqN\S]]|.)C{dP-u~ˠo )5c"f>>MMFHClSgmw3ʥV c咚AGuln]zn/)g%o"ؾFsh Hsܱ%b=8?GM.7>*LY9qډ}5qd~KK ^9D,a0Dük,(Y!PJ%d%Bk&uNi !A&Y>swPwsgBE p(9@'O&ԝ،=NE0MM';„CĮ8X\&m~Q`=gYI\~7fz"7:j*nDk skbsFX5 d" v[qu1B Yٸ,ZB~Qieqy˻Թ> FXT$ym q)(&C82q"Aq§V@͇XEN&0H:T C^Jrc7IA2KC˫cSU,kUʂ2CCF_.u>"J jI#XG z76tB)ojj!q덙TxH\|;hCKǿ+q= Qjy<> ʑxFX5PG{= "]uE S| <>)G1գ٥`U@*D^,>mQ(pRloƄ6qh[p9 &P(%xЇ!54xݝ[6,:6dh1+Fߎ#TvaUl~CLJoendstream endobj 97 0 obj << /Filter /FlateDecode /Length 2583 >> stream xXm۶QK @qgθINm>n2<'1LRs}wIɚ3GžBhk8Ð4G5 b>ޚ샍NlHØ8ӎ/+::Q/]ql clsp=k)#c8B/"_q]C e~QENKϺ,AwHvӳpH4p+*E3ͳK<%Ĥgп-[, e FZJJ>'Q^b]$La(q괠/ijcltf*\0AYI@mL#H ПFʑ3>:CY<+a0,2I-X! PG|9Ul~GO(hʫǍ@ˊ!>8hTUΐȰm6dHΑ sʍcYmm!F,,Ґ<ɨ޽!.GkiA!M_=40zeOTxfw,eP8HEkm" @PajW1[S#/f zM~tf`[؍XU (9YX[ʡJJ |'C.#rdIv~D?TZR, x-K Vl!Ӯ,"aHKe#/`ޞSm"<kth E6 D3%ɾ T`p&N(5؆#)&_ ^)iy/0w;E[Y^R5ÀwRJHpǮɆ;f<] 4Ķ"{>M*w{- 8.\0x T)k[S3|юԾ' s{d jUi==kLMVծhr6q̨32{Sʇ.>o\ x gL{zVKӍ7l7c7=*ؤ=wwI^·__9Cq G.6) > EʣʛS!$BN 腰 K_;r+Nƃ+Rفr+*`Gi! XwEiN+{=$; zX0 ǨIz;]`;{Z0&,>aXjvg/ sJN ,z| "š1{<0S.kvpwߣh4R^99[DtSNvlL OԎ7FVQce#yN66gh֐˾ޑAJou,܍O9&mayr~|t ٰ? h(`8aPWd 4կ2co7c@=)lTwEyFc ߒXV:ç"W\M-?wW]}7sDA4;|S,v"3B {ǟG6h}jhm3nEF__뚚SWQ?~LǶ3|ՌБ|k |r3~j/k A? Pr=  f͆x@>f>|ݹ:5Vެn"r/ Vm 9ٷmm&fPKzl=,>|Ɔ%c BkGz4W&\_Ex?XRO'#G0jU}sG.ZC 0~%^Vma `cnS9Aix/.gNYyATL3kp@|!.iylzY.)µ8l 7b(lqヘb41c%HDª1p%}_lK}P^@1W{*BtqIdc\ 5)߬?3 \endstream endobj 98 0 obj << /Filter /FlateDecode /Length 8433 >> stream xo$u/A0 . pb9!zw .&)KF=vsTϐ ;?Vw}>n۟v?_N4L۔N8Ntv!m7ӻoOoNDim2'm^NAFf<;A6!Q&&tg߿ɗ]WLSwP23) 5' Q4,Srl2^PV# ! ڡO[mNzv "./Jb얘LcidnmO]mFI}r)R_V+kdokub\A,{.giH2߇{9w'JbRSڑ<~`E>bZ_lЅS5q͗e7&o0LáM* >] ޕYZ)nL㲆jlP&i68E=:S$XsK"6^^` J;mo(Sl8(8)I+IڮLQoeHmvyY (IZ^P#1]LP96z(I\fG$1ɳq1"mJFwlzJddֶ+)hQsNy9K)^Q¬c$1YzUeyJ%bcus˸@Vg' $ׄXAށ\ WJq\/jf+YZsU Bc%{XGiCr̕Sn"s唛+\U R\kD*ȩ~:\}r۴w*蛈13WGwFKerKu8[B1-Zt疂I]t?i^ξmYij١<ذ>mn)StKAonW&hvh)Sd} #_pE'H;)j8PY(P~ٹ]I݈4 }z&W`Vg/lyM^FdKa!9۶+Izzt%c;8=4S$ Q k+PRQY $K6㡥LQj2 *2GشVU" ԗ)Rl7F𡥠njrc0psOcl1s0J~t5.*Q02.TQg&  ׄAލ\ WI0ɸaeyb/u9,9]F C"ȭCdSrC0JFiUI<'}jľe!{ GI2> OڤQdʭIa䥐GC"C,rEdȏX}6,8C0QPBm/ʬo4ٗeU mJJeiwl(z$ؾSZ9$(V J e&N6fv%nNoʍ dM~0z89'_oۦ]qpkA̋vv^kBYSB82%kd.[)S dyo%^ 40eJV$^GhݶM0%[D3DOe\ђ`ǡ0bƔ +SdYg2%ˠ-f!*iBQ2E+#U]LA91L>3\m˲kLaba;cBP0K2#TCHbM=q<Yc^kmqܖicQH?uyΏS~HT:1eJNNY'LɃg0,M)! `Q'H[ԉ)(XΉ(䜘g\+CEP_V*9'n֍P%Ĕ)YhD-Ĕ)FrNLa|bʔ܍9t=sb x%,Y@9SĚ*Ĵפ޻Ff91A2(1'SPt#SPđkz=v5>9C&0!(Ly/:U}/Z@5fĖ(xU"D:N)rZӪTuZ~&$r K҉)>饞Y҉)SX%Ĕ)9F| I'E* B%bWpsbsb ĕJ̉ W@-1LE >1n,Ą _aJΉ!(Q̳,vsb e9'^sb J 89U D)W&#b9'HA$rNLAuC&8,D+CSPmzS01)(La;d3>”wSPZՇjDŽ/%]BVb ~,9Df!x U3p%J)9DNiU6JH@b>_c$DI/ĂIrI^ LR-$*HGh˧2P\_z$uDrYN6,Ĕ:]l+QPf-K<1doH<1eJ&LAѤ RW%(d*T$CPddJ)(&,]<1EΪGDrC)(D,k0E5E"frEA;-K<1EbU"OLAErɂ1LAc '$&2ODU%<1J"ڐa L|zT0v(W؟t Qu0)(Ly:U/M뛞%lP%Px'P* Ů/y (#ea2g.Q҈9!F))HTʕΝrF,G9-, H>j)(?9+rGVՀ4hJB A B%RN+ Z-_ɩM! mժTZNrSn"U)XJUQ[-E`>{!v?cX#m9瘧Z'/zn@1so(*MQPM>; eFe UB1eJ[(SBYBUʕٟi z]A(-Qed= E8bxRd*1L碗<K#4&Du{ (lY+2Hn" Pca(ȨZǣ";֌d*~|a%K%%BCE]0QPC 6>PUH@(WrQn.0dPT ⓱ReB +D3+ Qp _`jA(ZЬk&mPM59D &49TVu!`,'̓6slDŽxSez .R]ӄ[rh햎Ж{oC.7Kqd- eHy"Y|C,U)(AD ((&." JWE#EJF9U7,Eᶥ204ȂPAxRW( #>A( xHQRo/y((F*PXBEJ3Y((bd{" J^+ŃPDA?b >(}BS z&~vL;TUț`ZVʕJGt( JB:R%ɢQ{=3Q¶ieq&MNqr@sU(NNwrӪFDn:<}r#=i<ǾhԓezxZYɋŐ3rj堎ў{^YH2*%t`2*UqR(\rPL27Y)S(H堘2%F<QP}怯/+L̿ĂPL˒PLMS% Ŕ)Q7O (T οr̘'|I(h;J)S c, A$Q0cLV$SĮ~=%2%p+˒PD HB1Ev6O4pSPd5Ȍ qRK4o+A(\!PLS$=Z4 '*z`ZS)WqBe Qp +up4*t/Fq'2a&JJCEYAAi(@< JKif)˔l˔Eu<,%}*xnhr=<?hT\nk :/ĕxx}v6J)cgkС!;?5:ľɦ:%Y_t&0ejQ([)Sxz%2Ec%CEAoR%/"J FD2E|,Ŕ)62(LQ q @1eJԋ)DQPm*)SԮ!4d!(LѲSPȞ=)!(-bLPWY!SBD2Em،gnSPM]b>SdZ%;b ,U2PLAֲ SȦ,IRbjnA|&k o^\! !q|UpVdy*E.嵗M!*" Nr\S"U)JU唻,ekD. C\֓g/lGLE#młJϲM7e K&'tv|, Չ]z6MC5 wM-PԕY:)S82=2!r$F2%Ƽ~\SHa2%a6BY†((Qڧ1%a \#J` ^#J )(Ҩx r0bL %@m{bȕ~oa7KGc !+hSd\A)Wn%rǔ+-GTU&d J{-VYMLLAo?Z:>TϴrڼNBFC+Dj+D5|g}iIm>|!\rx~!K.9Dv! U͒CdVu!`8!^M:U8VE8ҳ`4T& ?%Jd}?&=򌨃l' ԚPxjZ)S pKK>e4!TOL"ׅ|b]!ۇ0dJ ]2E/Dy0*劽/T >1eqc  vIH>1e'\ɞP@)(saD)(fJ)(sƍnD}"ʕ!ʍSP}b įJ.)SsSP?'hY_Y)(zߠ|b}SP?shYj(a2PU!s3)W*Uǿ|9 QNBԪF\Ǘ&d4%הfaޥJ1MkŮ TM69)MqiU#wN:9=PGY˶xAgmȻW|X!5d:]8;e^\/t :;O7?=Nby{{wwy}pu{s_7wWoo.ߜ wׯ?Xz(.a2efqAn𣜴z鮼y?AV/'ip2le~zny,Lk.HFKHrv䑚\*]zOr2&I=i7GN*&A_FvU[.k.kR,}m&1_8ć`9Cw|C g1b82;7ox@ս<=yQ6+ΛWi2$/?~ӎ77v 9/qY\(#*TFZ F=U6a ˖`2A% /2`N%=))Ň}+_ehsK}La6x ϥ٤%:|uM㵗}_4M'asw3ٟdtp3}kL45/6bm08*@^NXפo6wm߽9.| ~:x/7$>YJs&YuD#orІ'@AtžUB? Fwߔ߷W7xݙF 34d}/O_dqy'#E>3\8l)sYA臭.2KVfÏ:8.Ҵa) ntgX`Z+ur^/EòחZ2I<e3p7͏Nj{̡q_1aq$rRnTlceB4sF>i R =Z ; 2yeso2]}̛~y՛͕nEo-ZM2{uGȷ ?_|w/}9jTGUj+p)n^\_K[x}UiFRVܰo G%>|[T0ɎrL7:Ӳ\Vz/~s`Lpf2endstream endobj 99 0 obj << /Filter /FlateDecode /Length 1886 >> stream xXM6/,`4Xjc+AzY!Hd9m[KHtwߞ"igSЇ%VYfw3Noߦk5Rmj0[9W:y13rafvdžCʦgn`JmSW_ϸNMjW[p%Y$K9d,O,/sALMن+Ϛ[9$K}^/ʲDk%tl7X{Pq8s *>)1)`6-pOb܏Z+v(nw8}hZQw"ڲHKo/N"0kDtzR* G 6vu&Y2ZYwl;e\ VDdД_d\!c4*&`x)n܁}f==Yî' |8,[aU]dzEtPzTwqV0G=<gD6Nnݐpz\(HWVco[ #UeqA^G9Õ?0s溈|^ ]tʉ@(YN 6ʅ1BB݇r%9] 9iCyDGbja#~p~GOmK Spʐ +{UT`GHe{=r@,buV.qEÄSAm4ž*7)=1 N+{fB:6(mĤ'*"i%SQpWM"7XVaUP Ymvpe0N3y9T۲7Cb|5Iu0h K;PBHyS"10ꡯ6]s8j;V/Wq^]yI-]TLdݾsH uN>6@DF]AőĖ:·bAQ&N4e\6@*J𩣏f\]`sC\pz*%rnI|j).sD۾MϮK,i{Yչc&v9|#tr[IK lrȐi&V8oy ]z3/'g> h$@FnADݲO D*rt_O芠 A78\=cud)--/8>x2U[Τ zvCyb *ѷ걆Y+77Heo5dkV΅?\\E~%)y> stream xZK6==i 1ē@j'ƵI%Tr#a4L$Q!%;/؟HJaloÈ$t]Ŀ*7W?]I{vן^}BSh"2/uUBp}z%b)eY/KΊ>6(ԕ08;]t++ڎen(Kz:Yɝ>Gu-(*YxnJ>UxMZ fGzۑ0> P.+Z]7qV4ei ]9Jn<6ro&h+i^/TU }I%a'^ğ'{wm'fq'x_†MAM~qM=ktFe׀"X+If_ȦCQJfKJ4Pw\D\p%:HA"hANIrj KyE)d.O ~OLZi4Opb]b4&3JPF*}*C.q`LchzbmI-|Yqb5oߦ+>u&=!2x@t6Mbmp#.3;zWEԤs@ Fa%Yj'WB!TK!zQǮY/Yp1ubU Oc䅹Xxx li4҂xc7qa >!\"땫@#~2 @LEI(3 M J~H5(x|Mdֱ#!,(9ٳzsl`+Y4nQPLRZiv/RҦ%K ɕdIя KGsI.,<ۺ<*-<]Ƙ`f!\: DO|BO -vf͝6H[֔c(}jedM6euA8180H%jqi@?v{ );, 2 P=6ΌREc2v?cS׏~E9J'H,2 us BpȉBIL(ɣ1^$܌=K:H,wvCm`طǼuz J Uu.fs7t%68z[Rb :xί=;rBgBU;s%]= ߦܴmRv0<󹄇r%j+Qd uc)͔Ғyl#Dm^lc;H"aQ?vd_Sg30ybPp RضaXP B|=jhqH_zaeekZTs9Hj֟4Q҃ r0U䄃{كyXK;(7t{չVk#͆O1`qdп6$(D ir{&¤j퓨QJCJ%Р|Pq.u1|ef%9X9' $;)Ʒ ό d G*&>KKɃ&vc`AUڱ 2Ms.3֍ef.;㈜As(Krjkp]}C;$A v\qx fni\g8ϦS{fci'P==A}GR6ۇ584vdzToF⠔0i~p%EwZ۫o{S4kBBJ3{yfL1!tOÇFjFxND!Qdt!}Z<㱖 BdJn3LJU@/2CP5b~! o4ۼ-AvUn(p6! M$ >rN nOg&BNUTjh)C [̝z!.ynʆgP"!:m Hj3pSat0}=^'9 E~_$R ,0&[h"\*}S~FBzI S?}DP`L=JMYοrS ?.-_+Ñrt12<˩KSVd!C0%}z\kn8b9݃SّBJ(SW#LM"_VAn *v)J#endstream endobj 101 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2402 >> stream x{TW'rK%3C>{vZZZ+Vy,wByL;I! DHUQj[8G{ZWWas}9wgH}vs/D_ED!7S;0!6p%-{͞Go/֔UȪ+Rˋ+%IeMb&WTVR Uowff){Ұtl3ec9Sjl;{[R %X*ۄrgVMyb1|Glr?8JLd w~[(6;# 7aF?Y%zAn'R) TU(\{7m3Z@iy}Q]>i+{E"nʭɤ1'Vy$G ]@/4&b>EWx=C1߬F \]Bt.5ON ѕUQA̢6U%p9,i=S`䮂uy.ay@>*1B#^RQ/!ɠ3#q!E~ lTڕp (V,)b MFIfg&|1&.7C3m!6bw?CuwQuPV$Q}]M\܍Zc2[4x(Nۑ]K҈`N JUمOOY:Z uoM'pSZF 5xAL0zPRMB#,>T$~gy›[bkئ5PK(f%#<=zyz> jnkE6')m"} ,^D*iܫ!j:܋s} 2q"<䡅n 8Mi4mь%T!T1ba#F:~3uGH㻨 ~;Ox+t[=v,4 +b Ybr\87/=38#`vx@`CcXKᝒ6Cwk壙YI+d j:\vj| Bv7nؙ΂y"0g;O0vO/BL;NLtvk Y ٖL.yeà#x P1I^;U> щ)|XLҬEzd{`|,?Nu ·: V73`'3"/h/JxtV=z] X{R-aBoC 2PH䰹omcgޢ̤K0 /_e쌝jj nY܄8٦1{^rtM?p*"GeG"!˹.yBteh WKa9,jpl+ȃd؛N#[3ۈw S 4ʞNwU&Bҽ$;al& !q6s/mQ䕄j(h*Ωt) \ebo~bW&"]e=~yKo/_ڶ*3S>%:6h9kXa JP e6*##^Uj*F(JQRtr;1O89EX+k+$C:$\Պ< rD$Jƕ>پ@kVI_[3ъQt}t0th,l5#l{7G.2A[p8s Kn;FUa[09R! Kw/ />/o־': X^޲y_):) X.Oq#m6@ Z]g2UNO̬يvcy`#?'7g-^M쐢ov ^y:f8'x^_hex@*wYqJj6NԠTɸ";$&\93K8=k\cN9qH۠:EZyz(ȞlMuFW`FjQu:n3zF%VdUjV9y(22]Di9Ev@#TBY`έmikհ{s=0 n*epTطkvd=h Q(ُZ_du *ul ܞ51߼2! !Pxendstream endobj 102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1284 >> stream x={PTu ܫ^cݵ0- !N&!Xl XVֻ˲ZA4f7yOECAaAG1L83\]m~3w8s>CS26Bq.-@Hp*89f̏tvi%HcVF'L&c\e4d1&Zg2kEY &AgT,jk^γ,R)5K0E>CS:*Z@%QAT2: bX*ZCS4%|)%ʃ :i9]D?Ȣdu~&Yǜ`~f=b9pnW[hJtH/6>2{ya6vuF++O։j)<#Bn6HnHٜoj>KPJpi7i;;yPa6l[P*mNssY/ PyOsYSMPkwښ噰O'f}UhG#DwWk]quOx\s`#*; PȷЫ}R{JA?'i1W(ϔW^5\S}`Oܦ5X B>"T%ݎb(2?Y_qceXإk%7 }EV% ,E? C5R>RO8cf!$Z`l:ckHs[mC@W7qrH8ΞeWN}oHӃ>^ƋՄFgfee6^QKNHZӭkBUwY97k݃gOiV2C/^$ J۱>Uyses{Cim$ /K|cWd8u-x6 Q.-$e"kc6ջTU7y#+S2&]"#A;#}w#<E$V‹U( ʙ| 9z9/{ endstream endobj 103 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2929 >> stream xV{PT?˲k[IƠAWQ 򆀼 FJhAC 7 uYdՄ(16NY4mfڙvܻ߹~;YZ Dbzl|VrdKd13U?)`wVKc%=dsVvg,s9b-S$] v$ְ v$DԦ~zgH/ b4ґ;_ψS-4p0 *B% dHq5.!,q/`n_]RzbGtDJࠀ|M<=oڬDMOK<{BN&vf]—p瑓'{zK>crLO 8,&˸]nni,kMx~Mfso}q\Aΐ,^7EThp ,DT;|kH{~muu==%wMтEvv;'?xE DȨA|5&%7E ,3x߁Y; bQX]bCuN,?ar)94, tT+r MZ3Ң&ot TMd/x]gZ|F8۾;IhPڻ:-՝}on[m7iRV}x:F z3l R80 9 ehyPF&;kqxe1]uw4o>Q>eìEx5ސ`| ӧ_ţxhO_[gE?+W8Wb-*8}=,TӅ>:ϯ:h.d%)Pu vO j:crmSböP7x4%faҨux3>LH9&}dnx dzNaL0ndJQ=ʦa%A0f RC|p=@m\4bwxJKbf瘲Z n.kmkyXeJݙ-@$% 47\WC/Q`䄴*DFhz?xyA3u);aAnx^foޯ=TVZYRJ;θ<- U2m:{xݩ֪.܉:aҿr-3˨+u} 1e8wHԸŬOM4XcPl`!30XO^B((GTv~>iBÛY cR>7@;5=Jdy.mge~AF ~ ŗ'Qdz>|^V.Kq7P~Cļ:Oe\akayi}U{۱snK /M++fFf)o?sˢVn4yOּQk^r`uC"dAl@.\TcRZ~6ehW3*Nj-紧߼0*5T I2-2QAՒ#㉝O ]wJoFŋP?ٟnv2uD8tٶx`w-RMMpg ~wEr2 DcNl{W6qqM翺љ&vwoYm\':ÿ29I՘֖sag6ު_fGi>tK@E?18xjv7ac yF0BS1 KTZ3j)J~2Gfe$m=,`1}O07%_`@MI/| ؋ :J.~ԥ"7Ԧ[oIpvGɨ\8c>dTA>&tijj1O "*'H tt- B1At@AXR/2r- 0΃ղ[TJܨHyjHA-E[&W׈OnpmXUSlYR^[&{jOL RtdLr4FPBe+9Zbjy)*2}zn%`/K2qK=ɠo9rȆ.=5CgaN!ũv'q\kr5WR՘ԘܳCqG|8}Z%C#Pv LԌdFeUӿlۘCl̛a{3DI:p~mޮLB GR>ᑃNYo ^e@Wyj4<%<BM+y auu5-_S\:m %JM6qX 7'۸Z\Ю+uq`yOׁJkkkv@Ip'LWPA_8 {KaKh`% K[(i$Iybxżj`hzzz'endstream endobj 104 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2254 >> stream x{PSWosDi|{o]WmVt}9[ZEFT!<%! $LxCQ>PoRnW[:vNLܿ=s}#ƄQ`q1 B !p=B?qF+,LOf&LB_tlWr8Y/>R%._)_c]SR?GQYj#zS+m*j5zbX_(EA_ؒBc(<;_ʱEc?^z50cF aKpXZ~vkAstqT^h?\^!90:N0wDԜJ#7%A])Ly2K7n0+# sYTQoVڤ߭1iAˎ"I~&%gimrG'Tik *{ʎE > ֝%vZ%E=99g/d* W<,3bGFL?X,uڔ'>~×_oD m^af֬ߣ5iBePv,M+Xķ2M64Cmaf)d`T+T$Us!Jb GΤ-Kgy!(CU&CcP1l3ܨ a,sؠdlBZu>ᬺf/,l0O2k m|yHH\&l,Ynrw p>)Zs V6N֍ i~6 ^EgnW E޿q|9 2GsEg3XRDW3DJoދm7|37[Es}Aܭ[p?O Nw(# ()T52'8"~#fHOl LP|Fg}LA9qRظ Ht"$1^6ݑɎީ:>w|&^n{Ukne\S0RuiQ~-;ZW[T/U4;yi'K.M~UZ7T"DyHtreڕ[t[24=!PI ?fx>X*j|ےR/t1L$x18V<)5z$o%Iwgە-쓷k*JPRJ_<~ /iĤS#~2{܂Sbnq[z. ȅ\|n^QC V;e CWh ٞci:uyZnlPj,%/ 5Br:uX.v%3M??:A?v]@JO`n +v/w/I MPrKP+[p1ꍕ^>m ݂D/I]n+-+."'naU V \:jZJ۴6]nLLHdHw>6׉|}7+e ~9swhȿ!/Fʴv'2Bp9 %ܴDãL?j,wbџ~KRؽ7lډ!6>K yXu}N>zR;vlF}}8*Wql\MۓW xy2RrZe=>_ ^> stream x]{LSgii;slS7A)"N!۸n-(zZJKAE ]@aen|&L؟ߛ/yp̋8APп< >@ X:V`_ǫ_[S.Ud+cYJY`\!0 e$h1l%%bX ? !`VӸx] M/ׅro;0I=]b 1V-B~Kl172-_5 OzEd("I@AK`[NURU׼&)`r5`+j`PcQh, A35I\>xH }-n x[nb(YQUN9jӳS,i%:gJ"S iDBPSkS)T(M N<[0BC(M -MLSe0#'M@~yKO ,_whY8{#D2A."3M)GQ|MBL,qD+%z?ylZJcrK8"'g_jeP'q@rbB_x|xX$f j|MI&8IMJ\`;&4c3#F- 3d~Z'N1^ " SP?A6@!mk#b2T`b}1aS$5WPM ~9"Ԃqp<^}t}, to0SA*F#޶2.Z1T5"_o{λ{Nq󕉁+|Գ6)[qRt||EAJ/<PaL֕J2 `.N\3͑uN! ]g/pw.G#`~vz0.!0?~(̈]gF\FrFo-br&7К 5,9"\!wClB.S Y Nw]U,}R~yg2cnpNSXo377S|(]ӿ[g/rvmNg]^yKPq+E?ubVv6z@wUA2zj)p9[[wĠu(:ᮍ6[lFB^ 9qh#k pьԃ+/'uD!o?UmWËUS0E vE ZБv7 arZT#SJ\٩fdnh 6χ'hqQ2 |Kyc?Rendstream endobj 106 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3024 >> stream xmWy\goPYmV˥V(" (Br r !pB8"hV]kKۺ[eo܏uݣ_o}yg %Fn3cccL| Ɱ-Sǽk&@M\v_rb,=6uڪԤi 1cbbcO&'%˖Gmݶv{p/MQ j LBLʗ *ZJ-S )jAI;5BT2uO  \& *]'vMsӳB$G|fpaԙ3FpLXnIfK4Pzcͣμ7s"=E{Œz$THt;@Z;-:w~0K**;Ym)}Ll dDu܈y l@C90B0;dlrLeNFo;{30/qa'uilhWpL}&bӮMMKˍñ8&&5M;bsLh?a()nwٌDH ?kh#ݕd<ᯚ?VGp ھ nJb_t4Ӕbb@{bz2iԜc <`_[sι+9WB*x->0ma ;ѕ-m -֣UkW+Y"TFTmïգ<=);!nO>8;_qtziyrIQRWV<3obXUÖѕFc5'_+5NrG + ~GBܧ HuH]Rk)! vsq#Q,٨g #!;) mw2@9).y:ݸI[,coMMn9s37`qN(qqAA*7Iji(JWF(EWqpSRCvL¶G~b  N\CbG$a>ӡa Ou#YJ91 #2I> ?yrӡێǮE2t7"̊~\A7Y2j,bc VSTQ?"6eၰF,9qIfi vG 2*v6&,d4+ rCmU[lV6AS_ga'Rihj7cNސ5UgT0Ee+3V//E"].#":eCpS:{ 8w+rq\]uVm2Ii58(wS\薔x)C`mm-pqNA,|sZ8f^tܮ(ܬ4rڠ(S{~pβ5qjt+m{⺐Zھ]YE<vfBBNj@ai7 R4bCj@cݱ-є )@XuJtXrQ)ʱYW(`6;B21J*Z?Dfˉ­J ā O^vK 1+BiFoP)pVg,xزwז8}+qRx\ؔW;an?~o2tf6;_鶶!yi)" xan Z!-qǩoBӠ'9P&NO͏8659 &G1E׿Y@ǃ5v|]>f6okJXQZaTa57U5ZV1]{%7%nۖjEZ-?k⦼Yu:etAW uTi•K.Z|NUw7lW/BsBSvg߽_[;n~#48n6o]3{ݙ!]ߍ^!/F89%e١vF^t9vopi? hZNX.FT^dٺg>d&]Ԣ9/̚c6gUUOZJr_?fb?@'E)űC"I nN.ɷhzG,$^}O>+2lқ0#:װG̑o%k_CHtbѥtm(kiLWJGXѸnp;!L>&>y0,__vqۍ^!Z '@R"cEy1SF aJIkRJӃp.Uy45bff5d]5u^sJ1JL"1ilQШ`tVHR MmZ9ޙ(z#Bfl֛y(.5.LF.h쁏]2 ް^]t2K51ӻ0f+񋗩`LdHh)VhNnfGgDFICw_'οqγ|x~}Ifar-[^#|5#wx#%5H+yQh'S#\/3Xu)'+3]Vgv7 NDXB@b˾Í|y].g/ygՊukoXRi pCs18( ο8tr? xI%(dZT[ZGOS[GOrSdy·wz }S{Ǘb 9«i6q*F s0}K!#&RhL%գΒ&^ =mQҤ8 w >[Ή_oɘ.0m-I{6[:Z❄`-A%ԋ@-.tas&GǰǎLendstream endobj 107 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8721 >> stream xy TSA$XZ\phZVV3 a $a7D˜8S[[mk a"99{g?ϳ #z"'LL}󭑣^zya>73nP.A ċ2b$E ^"V/j"C!fk:b1XO%hb>XHL b%&K)3 M跨k gb랝s//|dx3jɃ/ <;tЖa9 G61^b?4k'4GžCGzX zM$R)ȸ~R03\,R]$s,zl} asl0Gyͫ+V Dh=Z _E3:8r= ,JuvE5Q G69`aӆ/<U{>|ps)"2uP^EC;i78e otUA?4:{?AKP!\ 9K m3pࣟaoO9ےK$,CZfVhfm[^ Mc:~w96h@1:sB~g? G챷}FoBc(ĝ!8"R1<gRI|knip'Vbs8 ƽ̺,9x2B3@eP2ePT5݃%7Cs(6b;_۝"23S)KY1S;hx|}PPoЅ8n|XguEeHe2 17tez|0QPй l ai?f+t |8Z <г,@ú/ȝMW+Wr>}tRe>j.Գ}Fc@jz ´ Jr4AJ˲bLޯo-f`p X,ĵ-)RջKW^% 0Lc0@OU\_?'ѱe#E{dYFeq 1te6#m"sPvZcP}ZL?P b(4ax5(t v`v֘qIpPulH1J7%=~ɻ[畸q?޽r{ѵ(&R'} =Bϖ:j x4Eq4 ;xajE9~AƊ: D߃C]y虑\r@)4ßp`>*'(fsa h%z;qu!՟0С` 5˴*'RTuq A~Ⱥ vݮ>p3j|NGi= D#3gK)ٗxs012hq^6AMQ(L*"_ǵ[oa9yzp4E|XsRZd:1JH9r6_4P${?\ d|pg6F]g/̍B[]8IܴviĞ6VK bo7QEf(%&K&{.erc4uZgw#<wCsH:It)!m{TW٫uzb  $DPɳdl+kz/({߆ M{,P]5eM=ٲv)|#|-dB,y.I%t`[ ,{ᨿwcɿa38Z\Q\deӽM j&=)pI߶!aN Y$HOٲLuZ8uhPqpM#`*ܠؼ l:AnÏ6+&J3A#e%{ xt^Y\]fw7F0NlP* =EeZ?sGJ iZfP5P:4f77;ݑ>7VFz+i֮PkZH9 ?˒s; _+΋]8᪜_tvq _#l@<ǻ? 'd$tj 9~"vpok%:"/J y`P^VIDɮx^ip>vr0k/0boOSiNINf[B Y3{Kkp\'e']RW(TTw9.1w0񷟻q'͍:{$7|jz|q-V}G JsZVn gI?OvƆ`\{~MN`367|_[R'!A,R,3]h@p>+1ɲvˬլമyG0<¬OL*,uAz]cl`.+oEI@#vRiT!#vH+ƨXd|)(tz E>N~KQXEB᯶7E<#+Jߐ%ӳ3T( cDݬ_67dF$@6̧*0x%RK,zz$yeZxVᏺ_`LwK Eɴ4(JJ%N*J'MF(i8UVk-\#(`VLZk_>u'0?X ۺotk__/E 29]3A,N IЪoinL꤬ey76U1`I0bӽyr&g>d.eвhob͍8wjv&'vw-w?CufEUCD90 04;cv]gG%D֫j?`yފq(6J)Rf5wv&~amέbԹÆWKNy<LLR'3 azP̢eEyJws*W` t1OpCANhћjicg,_H/_$fBB:. dͶru-V $aprT]mmm}_0c>Bcwm5Ԋjxpu!\0|/g`:8OڸS\R;[:Ҩ*fA1#֌MICLI`%XPq@5VU2-#| ?oxf_UsO|}lȫl *y<Clޙ}3}|+YxxnVYy'- GC+I`1Zz8zLFE/C#R1F5PSuAK ]c܉jC0 1G¼ب}qzz.2;+7/ŏ돰_wR0 jupIfã4X ܢ|MM ŋƤ1kأi(tTUbj5WcFOoLO*T 0)@=?L~{ &;pgAgoղq1%!Z%/*bP8.}S _d2H]PqZ6+|r++`꭛N#ַm:v+-\x]DK7Q.'f|H>iq829جg LSI9`~6Ku- v?xI ^E8^Yqq\+޲긠`aw;-ֽ'wm9WR[P]Ykv43>&G핧ZR/dJ)+vn٨u{VKԶ3;ntVkWMFUsf+/2p45`]`:5Q3'};sK& ہKTI;G]6ȱ3I5vx yeIqu{Ξ?䟐%g6a}EKm^B,[ŴAL@ܲEUi Ʈ3ԴV`жgzL*T_,ڽtC1'{!ߝezSIhMh@ ϢU%UgغYY>~HS| Mp!l.fni,j`ʴ.`yQ7˵4;ZEyCl7PRlU&_5K3ZKAQ0)] G[Mf,e~2R_G=?w즉\wVNPŅTXq:Xφǩ:,Ҫ4IMJE1RIxX56UlAp80?` b!zA^+nJO~uo3r9ls3 Id_Jn9O&f[Zhi=x 4*gTVJM6;fʅȥb} Ox9Q:*xfGAJRVZ`7Rш\H60J\7p[G|,?i:T." VEoT1ƾC%gPY +>{ނO&<qS?iL Z*\FFB3j{6qF<ZrM pZm /Lf{.3Q Fs~N$nF+U2+ {>2|J ]WWY]-%]R4jf!XT" 9#%cmBi) )S~"wzn]RV ԓٻ{đ||Ŭq߃I'v#:hsV?u}vò%yk]Kv*E Y_> stream xyxT7El{# ł(HH -!m}23̚{I#@h( *xXoCyRf[z}ߵs݈E}j?328iڴO.ӽG>C{+}薓S*QJoV +Z)şoJŸUNNT;Y4E,).b3V\5k5kJ[7|~=?ricxrɐK@b&1E8XH#!īPb1H '&O)TY5b1xN>[wx{#SSK ׽.[<ۃ2zv g@΀Z;(xp խٟ1z!yHGoS`u:H4if嶸 8Ko"C{gA 4X Ht4ndmnUx42 # lC-}#Zn.z7R/3JdAoٍ( 4ryos{ :O3sNStw6_ge8iU?\W  YbuNY뒥%sL!@.t']'a˥p-neJ9GO\dLptp9E=!/WO֣?q p2tXA{wɗxZ|It'+73,`͆%!h ܃F=׬tטXmќ"Hwu4 ~Kv FCfǺ1 XEI}D,TM73UѰ4:;>̧O!V3HuoW⍿_6m"+"{bYZ9+ _yR/ X0B{<5-XX.[w E1\D,-Iv@C-[]h45n˭bN" b{b(dT_({+8e H鼫]wu-Ɠ)bVK"<~\ b6O F .d.)mV&5U&hbfpq$B$4Zꠁ*ck=s.+?Mdrn FGK}g)43T}~,yQ 5VYfT:n\z߬hd2NYKpC֘6 d8}C ShKǜɳKߎo$.+l֐8[:΢ѠoVJQ!wQHE*H1ߑgz[QH;?3B#%,(Rܪh"ޙw&b|:v=: ˿ms0[. pYFz>cpjE^ dBzY*w(q9t<^'Ň)z] e2YS:J̭GOўtζ.x&7mx-ѸAd27FhČ@jT2_dӜ!c ^GIwD[ ߞXnʷq)[)kZ\)3=ǍsW#u;6NQ_Iz =ߓFJ" %@ܥU搉4Z@.).l 5ERָ& bm T0TQh'1t5JdTA jK%!-&]n+g3sWB1ǯQn],% 1R`X EJ5]菱6[xJA?pk@ ;8TtjVXEъ{Nۿmg8"o 'e e 2/RW؃\ S>k՛4ɤ)V<^9v83t-d :\UEX RP4 Q!:H73=eH>~;ӣp:c`nLBv0> J8 BЪkc ZGWR.Qk0g Q/nQɄ2PZ+ec9ñW+}p/tQ#X%-ŞҸ v@ހ8mT$TJvLdA1EL~/~M]D][,8Q$ s }x@U:ֻ ^qKE*nua~7 qR^„T,hB>C<L!0nK??cigJ0/\-ZؼYdS]1lmFaQfpa"yPVKD1CK?Cwo> uDiT`֡`{;xT0Z"C>42g+N'$ VXf\˖iho rSQDbȌNWⲥK$U*Xy8q4.I^1 OEeX@mjgF>?Jwy;MVe -"X) B~Jf$;:ޡ<$+H<&kdXW$}66[tm X/Ьidlflݡw;fwH$xО屵PH$ g@cm{ >HoLW(# WԔkKիUpkMڿ6nHC샻:1va~kk!UG.Xx>con7^k9GPӇBhk25׸6ܺ Rl)_ 06YƎe!'ҪɛyvDjI*MkŲqkx_`Ə=ͰP&( ofaѰ鼖.Ͽ}<4Pu, U_¢"Yh.'&/ULT|Fnd$ϓՑx<^@F}xBMG0eXD;i& []Σ>0[B>;{еnS `'"vBFutݥ{vӾ?Nث)WjȊn +"_gl聮m`jQx+OgJ4F纐+]֓PjB)|l? (?!EEQεRZGb;Vp:Qg F r.𮅫wXlwn|4{c?zYz[RƧt[@^@)gτk"juUcMcgj 6TȗH|bveŭToh]i]$g_z Վe#wL$h@($ުz󹋂 O>\ 3=qڗWN+]nd$\z?mHC~-'Մ6dHG !-|H3ldma̳hHg* ;4T+3u5j'\kAsRnx{";d*N8y>=COq9E\NeLڔH65^x`9o[!ueӫfeʪ(U=*S ]߱m'XTndy{U^FC2+ym,?5{ᒅuj$?,̤Uԧ Oj_2?оm-n)" K5š͕Q9C1DĞ$>Wڷ|sh(T9kF/38{wKL'YvMM-پ`,f p⎁i2"95$˙UIB*uz( dYܜ`6؃}t1FsB O T?|Iqz-a_Ti*X9E]`д=>7y/.rEMȚ3AYHF_W˄ȟG~u/Y {['ՙwC^܃AݱQꠖjT37= 9ho?|_G,|S:SLt:&Ըٓ^[|]-%iqĭ_9-s^'cMMQc$!m)k=G#Σ!D`5 f5z.Uk)k,n/ږFKyPȧ^C ǮOR@Ԅ0^tA+Jy?Jq<> stream x]Vyt$8qHtE@Ū-`֧BACp`Brlw9{el;rl D% kԃ>oN_,J7ͼy}+eddޙWiʕ+/KS2S;7~eY=,`0;_?efd,|lCc}Syɶ%$ueð[$REYš1l;+vb.lۏa_amX>6[ecg2VgɜZY֣G\VAV*eʞ|Rɦ&ElG.%.MNtF9eV6wq)%}Tœ;>~-tEFi0dEicmNŸ^He *6MiVJ PNF<qGzz(s.7Zg@H +At0d"3X+.U5bE.TzqPd0L'GC!a4tm!HLcz.SOZ-j9"e@ykkvw@9a:Z_ A%!tᰋ&6Y1`~!e!L;yU #WN|tŋx;ĭ!=gixOb3=ݝ6y~59 DЎٖ-Ceyzv:66!R(AA]/sg/m_ -Wa CBGim]>S8e{Rcx,5K))d+>{$c81;P :n3$XLdcvW6$t!=< PKK4w40' {5ZLvr-`mFdv4i.zRxHH@6zGji5K%ϕs  53WE8 F^ _eOiw49'!ڒ}&EV]khUfY%%14}n>d+ C,6~s^)li& Fп| !twg<=bzJUlD렴e X|,̹~6Ś|AkW|$N CFZ ٻ&]/G}lQ97ں[ z]u˸'=oY8IYL`BzaTe +ۼUЈ نmM=]U>X+=pk"i% Е-:\s<SgnsЕ/Ӓv0;d VK E&9HUx9Q~2-8 h45d%ƹz\bNV`o@V1endstream endobj 110 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 8573 >> stream xz tUwAbQC wT\eYeHHHH/}_N% ,*4*(03:ۼbn%oޛ99tRU-K7Dnz,`3#Gd0Pڽ0H qsV1]{4}}PDw|ٳ6ԉ TNP;xnD߬mXW]A K'nw޿w>?{|~x<ޞ_@K0dҗJO \2o DUiH?ꡞ>\3dmC5 #91L>u77bv[⾎_5br/ѫy;{g1z XKb,'z}v_ic$Jj""hJ{>^{6V{=mkT@T/\X\//7J-BRP)Au--${0#K#h4ﯨ-)D*|7(zlIu@ 9 $ ] cI{R&_HT4mxDqmTB/v=p΅tiu"HhSj6a UeFσlXc\WIԒw]8wHr3hq0-|RefʱFlt& @ЊYKp<^TM& J)@}3b+4R[&379p8҄h!WWS엽ͷz~%uyBO`k^x-HcL\0JZ1^^%)x -l$6hp8wr&ΣU9Wܟ#C-Uq%hPj%:MS̿ylV8+.cbF"t׎AC_zۆV>{cqqcVNZߜG}1|}ZcxG ӏu ԋ  zA#ӇY37x$m},n 3yt]w+) xpBEhРЉ)SsZz܎ʷU%h{m X~yg=(.ӿ=gѕuE`n4(r#֤h(f#DV]oA)kbL2ص{iLda7 yR1239c%1,L7`FJ%m`wOY:j<$_FeTt $ e|y夅Mv4uvGKEeJRܨSJ)-(SfLpLnk&|*ˣ>=І'i'j&4V]Cj9N?wo5dM= $FA^YZSj{$IƂdݒR42d]F GޠZ)DnÒ׹,҅yg4uӴ,c'G_T?#E$ŝgA:YSYsyW#`; )eX;L *ErKUmmm}z$a j jFQ/v4hv3!.dKytxh3iuP@ ciRiXC j>:*\92w 9ڹs{|dx!E'RVnwcp Tv`$Ņ[71iI$TdsjO,x#FrrK=$ao$=:@1ZЋu>1GAAK:EhŽOsL` (>u)/vӤГuݍpܯKtfh:ή%՛ V^>q0tNo )J]TSB) |WғIO2̽ ]´*ɭ9=nj݋6V5у|;wv7Y,YR,s_gϖ=+J4˶tY@ڸ2hRQcL&p om '36C҉ElB`?x;4RI:NK3r,ȸe&(%NXOﴺ|VSU1y$Lh$q-_O R IfB.ҬlYA"H[m\Iu a[]ڈA>bpXQh(QD43qm(b$*9UNf$+WwXpZl @'_Q;op`5JB FAY[ݞ_^ROϢAW7Z3FKזī2VHƯGT3}T)CsuV J@-v违/*+u%N5ZR; Y ~Z@A) "Οrj'RFN*DMM|m?_tftAqz3&lpc4*,:P: Jh5R*_Ŀ4ĿԷzaF7w_wiOrycIcMRRP 憕3 +E+uz&ρ3N-ZHNRV"jwM)>qî0%2E#/<<TZ"!o  W"x:qbiVID~zS*f2(Aԙ +v3Vf|bs{G-<م}aq:-U2ݘ^&ͯ]\7Z(ܓٵ) ,TbW131J5S|VXwvt- 9&As3Ս'˟wK#KR6h#guc5&&C^ZgA\2(l!2cv0/p[;}VXw:d$|MGqc.j1nAKTPO!%D=-Yk .iNK JkcP3-Ѿ,smiWUVWG~GͧxL d^<1$S>`ǐ~y4W YqU~)BZ-UU P4҆6ʳ$uL/i@&`t/!iڜhl9~Mj(uUhV *Q ҨqϨs>/Kw2+%]~Ea84b4Ľ$k4 "GX7Z z섪PI,} kW-x:ݣq`фwOB+Ny$} - _'cWs"PqHD2F'P/3 RX*4Jw`?p֤)N]V6;#q$ uLvHMz|mYHp5A"R?GN 4&QaAzA00=',_߶ a;no79H~_M#g|LHmؾ䑓C@[ZW%g$iƝJdP;\+]@&2+CtIUt@S(q q  115vhGWӺ)1 cX"aHUA9X4M)T;OX/PG:jJ$m)ܒ Ta3@p G3Ie&sNle:h$)7l̜aM?eWla$179KI1/\24Dґ/9>#gA$h$5 <(&X=N5uGʼnk>5B*Nۍ6nhǛWҝt&_XoVkQʮ*Q1QR+.`.d0cN~ƒ6ՔȠ;P{@pℛI.)oJMtx~H`";SV,v;3y4UѯJ"a;"rsݶ*R #gZ%^uje_h>jfTaX+ĝ3/$Lq[ |zÓt\=HwZ &hn{Js,t+Ԛj̵|l+V7a3;ctH{Үv~g{40C;ݧ[i Ȱ(( R k,GeFĦQqDG_fi6&/s fBg&8.VHf {'@#^9v!bЙ&e$w%2Dzg^5q* Tq.u݀R-X\ ;aRa8o*@&Ӌ%1 ю\}YKVް3L,°g~O H#y"0%XdĻlFw6|ffJr=G毮hԻja%ܤ-"3Q:QBf(fRA&&A*߮CÙgdE3Ccz$ jfa&^:}s=ީLx >;sHEɤQ=TVLY I# 5| JZ TV%T`Lۚ8uLr=VfwE]Q%aWBfQzG6)U#V^gJcv:]i?uqӆWSU d]J٘KrN ,a~]d{^LaRUt9WMR{֐Ґ: ?8U>k33^^\K=z?9#/L9IB[U?qEtQU/ X Uqo*R[r l[$|n[LW ް-@ e1yHDjo#"_4'c\BVd{c1 uͷF.?u C@ԉ1t](w<1#JL:7ԭ_>we˗ $Ԏ<0,FNFpNP[ x[b$)`^|W 4%5-Mi´+}OkDԖD$Xh䳯<]1%+4T OSt?@>_rvF]T( oޕ 6` ^ i@V历 ;k^m 3YKg^ӏՌӏg,qj'r|۲M{[pr7US2-pY\fVꚫr"Fo57=3-e5v= 9FOO8NÏh&DRg>e̼Ğ.*&.Ocp_p`_`7nw'Ov,%zaqu0eyNez39!|ty(;Q=6RCfNMo;N'Ћ<©0+&O%~w7l.[: Nz'<Gcpԅ j,σ΃U@U* ]3 hU庵6&,5 s&ߊ͞ ]H|1 bz8Fv9SMb_8Þ;x+egIyX%1*&J[a$fiEc$׮Ga%ɮ8`ӣv@ q(oXīlmy]ms|AL'?D6W(8J`4cMKX> stream xuVyTwDԒN^Ukm]jZ"*@@9I1B HxUzn_ϝ}o3y_7 cXQ1Ο72;i56~>c0Ư1?I6bQs²3s ye'%eM^49PE &deĤԝQom"(l&m6a ,cO:l=qW l,6$X!/x* wDqMh&WxOGqto`z`Yrn`Zw;-h&b8 Fps$ Fc([ћ~M}VqUk%W+wRw?J((yc ^-'!۝/~fۘ-@{F4 RB"/ EdZK~;e]p7n"'ʒs[hf9}7!aw/ ~y`Kx 9@T{ \ d*9Q \)xc̟)X3씊ڴ`҅ 0laz J2N :(܍Gj!RKՊRV j,%HNurKi-Pi4 5FZK;KԤnt">фNgn WUQ2>}e5.z$ƪR@U L6wRS67ɇVAQLj%!k܏)T:Ot(D9{yf)O.[E>xB-h:9ꡧ(b*`!/H8RDrt9|]xJ(-+z'HO&zD-ԥ.r6Wv*HGPgQ̹݈99nw9)ꊭa}$%>D֮?yW[+`!R \ ʒ #֕_aaJlM ݨ\싎ѣ00YkAhAܶf O0Mݜ޿ËA\!ȁ. QE~Nji5B/VIҥARIɎ0HRy U/;;LcPTZBh6^4 8ަܕ"ЌF|43VIZP [Douy +lyeV1 z[; OѲƛ!G(,*MT4য়МZD .=1#7GT hK M7Xu6Yݤ!mu!{ܹ-<\Qń=5u [rO쒬"uZb$3+$Mɓޟ*xcޝy<}YHYXUVHA)|R=k&=J=I%S"Wͱ_QW8b8{ͫ%Zk=(f01`aњ;T 36QY}g<Up9SrS'&;ӎPxWV":ЕzCЕ{ Gp$&L+[`%K{ݲJnM+?y@*wW % /U)e<:*jOcF(,2z0tEG뀽,AٕY\[ZMvG!DJϷV^JW- 6x(TXJ*\N sjB 48cf>s5 ~s;}BCËbZ3C_zv%гwNi9CK5񈭍'>Mu͌373r܈3qOFI??7==<2B‰v p@幐hG^=Q$ .cAq4ߞqh+5UG.b1-bHFopYXMslДN*-Z'M ٤:s0>!°ۣ[2FG;]Ilff(K5'>n%> stream xYYoXBdY Gsh?{r鍁·ۄH(MwJHs,@BBm5Y˙ ɀI4 ~,W`^8NWP%+XR[PmM ] G;U5ׅӒ4S /\VAr[nD̐Ф7Nڮzz,,ipWmVܢ KZ/I+7lp^ܲaR 7ֶZe mϢo>ihz]قTW3bu.5t9њF=͓߿{O> Kʸ$I%pӥ)~r X4(ÌLzFKZ)]U FMSn-a%<\e|m=Ĥv+8+e 71DsҔa!2!!CTȉQwB;O{,q<=414/#>0V(+00 mhW)<ė AI.7F/ io7_gB5D~Fz<$͛;+:$BG׫LAZln.Ⱦ]]_u NWDDCɫgU^EϺ36h; LJK=7Mݶ<7lI׻W@|`/ԑe r J `?ALRE bM!0ȓ &yP>+1/C0GÁ؄9DLj^YNz4ˀoMq&#@ts^gPycqM64)s\{Z`"!iTV'P'aM3 Qڕbv۔|p(n嘄bcbFI׻&lN,U\VQbK\"}yYX;d!xvIb&y 5GU IiP4 ] BdǻL|(b!]t f8r8m .HBf7жtɘfF劼NCynrs[rrx S"6^r#)7c2<3ƽUF;|t`Q›4cubV H*R\"rdX"܌t&^&}$FzU|ٕB{ :Ԙ߀'j/sҀzC*ʨM3m6͊.T_^fh"G\ 󄯟g"vK8tJ@B/%3ɠʩ -AF A *+Q?Q%Gn0t:-^? +c_ #A\l'n+kyQ$h:PE蠛 9d ޝJBt}Guπ۝4<' UFg)e>zIb@?y&sZ/eO1+(; ¾+Ri: WU3ϴ2Pa90ʆV\x4UhyӤ 4Γ_G}{ crz8.X<4++z.'gwT^#~HC\WMwK)o& UӠ4\y(u_Bۭo)b;FФwXվP۞tm\<ўdlRK%Q;8Q0-smOIݘ繚S,\(Y*fFwq5i xm8E1ru@ ( m_p1i+L馨xDx[0 V}>p}BsVj[4FmY?;HBo1?Zߡ1^?~I;^7QK o_ MF)_:$a;g:y.ԓH1e~ paZF*Copsq6\iklG!=]ƺCD~(z*5^-,: ~Ū]0(6:m9Psz\3:$!ޮe X45rϖ6M3L<Ə&y(^˭5-Eendstream endobj 113 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 212 >> stream xcd`ab`dd v 1400q~H3a~'k7s7aB_?``bdr-(-I-ROI-S,H-/000030dg&,\{cO$ZUUY!|gWwOq{ڦnOe~{Є={vO\X9q).k/4{NKQ-endstream endobj 114 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 196 >> stream xcd`ab`dd v 5400q~H3a#ewo_ 0012:)槤)& 2000v00t;gu`Í ʅ|(YQϡ;çg /xk76i?~뙱wh7{r\-< Fendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1140 >> stream xm{LSw掠Dܲ&Ɉᣛ&( mʅJ[-ܶ Qqa,Gʲ%eK\0ˮ._sHBE$m(--\<]# Y*P>^*U_X^ŵe$MluY,X@o޺h=naVzqY5v536SӇF ö7sۦMn{cqUW\v[X3}id\͌㰳C\o`p؜M,K&ewAd+YqND P_Ed֚9rU\k?A"Q wtD'SbGR1Q^\K3|t0=Zkiz{rϿ4O?'A#HZWj $Ό `\}Ͱ >Jh1Z-BI7&gzB1\I :>A ApSOi[ʔ}y=A.=_JF+8]\i~P'}pjF#pC(~?jPUʣC^ifȖ? fU 9GMЄ:I:U%vutnny 5EJng1̰ԕ8δl_5>]K&Z<)y}0Ώ0?v3`YƱ46UFLA~fA=3)e-~r9 _ꂐ {T[G-}㣑^+Ͻ ^'k ;t<$Nz.efy [Yt.ltbPJQ#J^^!}Yi(=2 h2i+g񀾋 z u9aAK[G+k3\POOH\"pj]0 7< :wZz7kbXox1O*!ᆵWvžLWHzONep c~<)Ϊ֦FQ!{:1!])]hSfW u m$l4JM2;s .sss _w cendstream endobj 116 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 572 >> stream x1CMMI7$]  ]XTnsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMMI7.CMMI7Computer ModernAB"#>TAb hUkqP~w #~g:{P}uҏ{Q3xx}>fۺŧ@Ri>z~v|<J! ׋>x~u}|,He:0/hlhMQ(&5 wCp`  7 endstream endobj 117 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 557 >> stream xM]HSa߳ j{oI:""\,ևV]-wrvLsG&Ml溈M}y]H]T׋"t<<8b4@h9A?SRc"nÈoXj'9.$ScHTn}=gR:6NPXJ wPr8&cu2*˩}};9CRFJߕ"4LB8.om $QYJP2"c0!JڈHLMb$AR% ŎWGw{b_e!)䲠(Xv?5{ypn}&vC?CT_aVˀq-h} j~{u]r\gIƃYkf,_/47/P~MrB31/[v-vu2I9?W(-|]а> stream x]1 EwN@:D,钡QL@ }i÷dv.:o.aMay8U*]U|"f@ޙu4&'$mZIЛqqθ$8ɪFsr0ה ^ -XRwV5endstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 355 >> stream xcd`ab`dddw 441UH3a!;nn߯ }=M1es~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWqr-(-I-ROI-KMWXdŰ&G3~맥ݽ}Zgwֶ CyR}gN9{f{?3T^%:gnU6UUv#WB7smbK<yYendstream endobj 120 0 obj << /Filter /FlateDecode /Length 3355 >> stream xr rRSc9JlVLQ"\$!p}wgz@X(Fs?j҃n7zVsu7|yy|Cڸ))3D'pv8:c(R`~& eM xo'GeYDͲLk<+> NM+ޛ)SìwP3+^gLk9+^A?i ,VrSD%xA ( ^\gumgZRr %EW{PdEIRvVp EVtt#ʊ ּQ9ҍ)wz^~RSPZ]NnL݇`B<BZ8BV&SF:(bA{1XJ;DSlfC]#Qh P5"AZ_Mh\DSt/6Lu~)8ZIKnX=+qYG"}أG-JJzWs Lfєep(䘲{0u~uM5oh P)BGcF52 TS,+hy$8C'=Q QEHfWE%gE+!VYӳxƺUIr+[!ՔѨb"(FUQ5Z"(FUEP#th!1>nhIJ t1%{1>]9(yRRlUU9:8Tm@~|8YoSȼZ8e )RrKHEIeH8R%TS^+Hq}) &>"ERB+s]@BE蘒Ւ)H.e& Vf(v7IB]]f$EJeb)g HKUJ}pQUId+*{JK>NXI4JˀDH& J^NR$rԟ2p(]6=ĬjΉB$FCX+˹RHnXbER} O."me8h4]ܩ)7~㪕vY~{fnؘ_W۟,WnG(/hHYg7kfonppu;ެ!K*8x&@kz|%e[i( [hV|oۯg8O/qDN=ex1%J<~zX\߃nsv}G+b߅Fu}ezܶwe,lpM零O%TpB\l uw ;j)WUoJ`US՗ GbX,.&t-cAnND']rDϥ!*t,kaFܹ=Âk4wmO},jZSp2'+s[e5/O|z$zZe^VfL ڃxVJ  C?endstream endobj 121 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2505 >> stream xViTW骒 eE(+ݖUA FDeb5aq-FQPj ȨIGT&zW}^sf̜sԩW}w߽MYZP4M[h 4)I#с-DG :.SThM!k pA-lc) M4%f򩮮n9iJ /er'M^FN9\hs]~x6yMri.PE9-$%j22^3g)L6u:y&QQR=*S~?5@* T(FSS(zQ4eOQVʙ0FYR"-%%ihmyJ.n~#53QL. g?aqj.aŨq6&wT +u-l+iJ5i2-/^ǀ5Jm:T*.y^j>vuӭb`.끋,־)rnQj~ƴ*K좯HL."t^h*ɊX挰UZnEy =V1+9vc:6",q]w@ `fXhT]U^3X'Q:&q4xCL  @K2SøG,6ᛠ(Tx8.Rjw~ey;6:Ġ̕P]q@W].sv巋nl2HDh#l=M: u{1j/(@c>K//?-U'n=M/\r>&U\:Y]N  нCz I0+wR~m"ĥm[G6 ކL:S̾X)K5 `-O>ۊ NGp5i򼜍ϖs=̞# ٱ5պ­Wg%`έ9溊 c@_};+px2 ({sQn~FV_֜yҸ_sɡݕh"T |"nNDäm?|Mwu 7`X"'2UY˄7j!Ll)At!A>cyx%4k>50 2NUt8q*ů {Ⱦqc=}UF T҄E(B*.aq+8 .]M\$Y6x|-^q+pra%2t$J%P"~SZ%kaBn;z"F G1_6:g{^?כQc^}s˿A3P\͆ȮxC\GcoGi NuB6;]`׆o> stream xTkPW%ͪ1 JRKUTfB(G*j+ZAQAAPa,ZvZ-v9oEswsNM1iiӲӳ2RZtD*nfBR=rfgAi:$zn߄Dd[e2[4N4N4i&cƇed4eZLf}NfAJffPD#g-8!hbgPqT(%\(SJʕ)7JBIC(1GuR@KNNN{D lQxX+naP'ay@rp3x*).ۇ44tZZGwBfirGgW8 Z,!Zo̚!,!U \o\1'6mt5fߊ oЊn+ZŎgXLƳb1'Z?< Q>C ~9sQ,4UF.rX ZWCa'O@k7c\ k_ m}F9=e#2QfPa;+{jTB;bт - e1bF st32B10t-h 4"SѬՁv9t29pFZ.P )=Q o~yа߼g C &o\b,CU>ئ)kqm H|ޑ{b$'d D O,%H_0VCeMOHNklo6^R+^l'^iIѺ֫׬, vn`$H@8!TC$(ySfN I{Κft{٥фE17,Wm(ڰw}ᶝ[vm xHܲcݱi0m9yOk[@0K3ܾKuxc 䖰j'~>kK:V?k0^d bJV0b(S,D:,endstream endobj 123 0 obj << /Filter /FlateDecode /Length 4057 >> stream xZM$qoС%p)`6`ȰE `363+"2VKJvUdDddagf38ߘݻny/w7_~5FG؝ua.Iuuwwvmtq6Owwo~ݿX;7wݨ\݀f5T|?XMo#4d N~şi|w\}={Qaz9]HkR_>>ůnR zm uI9ɟ[[Xv>YjfS0[~=nW?d3?^珇em>Io/f29cN~kD9_1R3Z"A%',D屍EÂ[Rw08c\}gW7]#oVl.;o>ўԹip|Mt>~KJJ[˿2~?>w_,Ŏv R.DۻTgv?8[2cZQ+08>5h4`ޒRuhud &nUkA>_SbrXhFh5d +ltR@Q!V4!uiZhUGl ǏJ Pg 6ϖ6)+ yjV*s[1gghuēDWXsAN/UiAFVVG^ւ Zdq䨰iH6@6o}I`FKƄ (,O6P+$IpɍO<,DPǐ}`ۥ, ,{ [k,; ۤ, =U-"G'pP '}έ6h"a 3 [ILWsP#:j`*heMnq2G(F[D7.CF:e-ϥ(ax,j0"W[5M,tY\p@R"PH.-EXB&)CJ,&G9/`AveiNaЈE2X: A(6V !0Շѣb>/`q3߂%CZFrRʨYj< p](94ۤ&?`ێ`:hz}:"RО dVXiCsΜՂD3 +;bp=<29tUWiP@ej#̞r,.TCWXnygѓwIg>G 5Li @;nޭIap2F[NB&q⼎j r =nj& y7X4X-tY}pDG@l "BDbLccݰQXGier!uN3st<.Yp@Gp,Gjt2zP#z]-l'!5pky #I< JJ+neu P"i|1A}ƭ.L-EG-lf іf/Ґ`R8K+<+uŮCd9# QS[?xP#Z] l BˬWcQw,qN\u9T[gAASWDg}VyXk> #Yy7W*ق^ Q MzEaYc8l"ٱl<pt`\lކ FD՛$6<}R R\CݕDJ(`H#`;2)`ApbmH@x/vȬrQWv4'bQ2 8wCz2a5 \^E@FK}6$9ݳ%H8\Q32sp t3+kE[!PLD4&&=Hv<(Vh _" =GSG3( Gh>iSJb RmK KBӪd"@9R W 8YʕV3EPմ^)R8 K]& Nk7KUAX\tC2ݩe'f9Pk5m#Vr>vp%H;pְӚ((P0) tExA"nؾH(/H pZ m"Q73NDޓ EzZo|DDG&k=27!j &"Q=Aߒr <;|%մ'KεNދ YܓDd{xU@GUT/mF " .tU^似RYZqA͖6!RE8yR5<*`H5R2dɥ;VE, UC9<;GE;7N.NU;<-r7YƓƂleWK mF4 WU"Ԥ/N6[-):MW {AMEH~TlqC `oͺ*5 k8ؤ4Iߚ}fYVf. ?O.֝߼O;f66)v_oce$ϰz<:B)Y?ICƺ鰗?r_SXûG10]hgCxUzx~O?6)L:2y zffΗ-B6-~lӉ*([mt}|}0LsVa|K zOp:O!&NvLc-^h<]b,.|/}|ܗ_NYr"dU|8=vNϗ> stream x[o$u @Zɨky0`08+?lHhwsewk9scU.,q?p׋Xb_ZߕnKz^jտw}j+uuKܸ-%թnUKV\ݪ֭jU-[ruZZVnUWx]Rv%bS&Ni"v\m\cm05(`e>]|+Le`֗|S(aV-eHDy.7[enBzg^Ғv6z9GaueآF5[^\OaY)G/o=Ag\0i,t#\lE&kљ4Qi#-pPyn3qdE@j>HB83R!_F0+ J2 2>[n"vT BDl݄ɤ㌰nSՙJEHpJJEMN4֙4TX;2tI!NZPǧzTCS>3otTKάq\\̄rV*hG3 ۜQNG]jEL+T4r%1:3TF:SpIns{:k3n.0'%"FHU@|(l6 =-^L]K]kheӴbYY+'mmrK^[&-OZ2i&liqˤw N[$G ҉c#GZjtv ol[赩N" ϯ"056z˶\FnwY#L5aPB5N1+;%mZ ?^KZV΀0xᱮגũ܈c1JWZa^W-^iDҢ-^qꔸ)ϳxg+q˗w0ϻq`5 dwTЖkR&[\ˤΥ711%kqZ\*NK[LKJŴiq8-m1/8*Җ a-Gx]aIϽsps2VLJZ᪓46EÕ&ihaˡaU(ICKR4\E蜇<xsJг-'o-@j_ Oʷ  ;L*N eC`6p}0$^X! .b ##W8ڲ"xvZ VD!M_?G_ $*,h!)(Ne(^#= d4S%LP%U[;L)8s9ZHKC B1XF LA?|Uŧu#@ 6_ 2+H#m!(nSC0"S4 Ab`F` 8Ր܋ѳm˘1`ưPYXQ;[b`n[abGf.2@iIcglJ`iBR IQ<̝)!`viH:87ܢ2;x RrDÂ[a&4P0Y B R<3@QׂGa{ +-$gSs7\mYQJ V\MA4$E0wb"K= nT nƲ#A`S,sG`j$ vI*H`D œ`~i,;T Mdǁ!9v]=v ;$EIOH; 딙Å= ١jHaĂ̻gWzGSj,;T f= 2p4ׂC]Z5 璢ϝ' Rޏ>n88Lؐoqdž|k86rlcؐ;1pJφ5z6qrY}<-m:B86l}&ND4$4">s *'-uPƬ(J )J(P>p-x@4ƩLY09 |\́|`-~ׁ#,D>x q|p-TNb5Bj,zf-rsm>nI**#ΧΊ *.L46i:찾v.8Pxp4ԃ#A6qY \eǃ!Y~ȸ;F^`÷xD6T =u "EP7!jMCRs'<BR+?є.,V#=[[D64 =20jǃ٘$4F!y $h6&5ϐP CBp yDNS>cpDEeD(aD(}oIpOp=k-b >">%i  ML!v;10nx'WDG (^T86\&IY $()(VH%zѠ{sP5$?~ҧ?Q!}ڒk8c"EzP((]-9ph 8{t"=t p998$áh)aŷ!RdCӐ,܏ #,eX­{}k4vch0)auod!)6><AP'"{8 C 2ppFͅ ٱjH`CCQޏ9[.is` Cp ydH'C7 P82.nxZ8ޭp ۨ#CP!y.ZdoX7Ǩ-s{hXh 8p zOkȃ xȐdO'T  4$Ep܉@i:6L [1>L*YvAd@(5&+V${P R<@1=@1v6eHE` Ts)ńdք\T] cOL |pWmY6PT@u 2pe=8L/}O3IM'>Lp_d?e3b,:^Ⱆ:)Q!ѡ|"k#[sQXa)(NLx$+>ߎys+#DrirwD3 r=9@p|} >6z6Pu+rP>fSkɿcCO ;ϕQNYAsf6φ늓=Ȳ$ٳ!?#*RdžK7<P4$Ep܉ *Չ qsh;c٣h)'C|s0u_]>L\9#D-ŲB`Ss)qba&kGǒ[T'*)tG}LA6/tDAOL!<[v|P4$Gq0bwY N08Xt| @/_YF?cqb4DQ܋}>bqYķeG!'D2ĘeЙsIQNx%xF[ aZ !.'"φk'Li44IP]ِVφxAƨ F94m${6 !? 2lSa) xbT~Ʋ R<`!nzrpHCc"RGh;ǖmg9>e IQ<̝VZ:֌YrLhe-m5 1i+b *{T֐,OS* ?GzxBYb7mV#" <"xxFl _???=_.@xlׁ7s*tF[lJ-&iJ2kWjUh_v_m.S:Dz 0k]%dzEE)q i),Th!-E}VLu1H ͂54Kpԏ/"B(|i-u%j|Ӯ4KeQn ZKGad!'ˁ>ǯԊB Zx#S} X>579fZ`6? RE(OK54Epԉs<~Z`w$ ~[b\{NeWஈ7ŴDECDu@|mDݨz*5{{q{c[miVr%R4A_䱖0Cau*]?ECdGX:,i~ _/#g_*CwB+д P˶;<]^öo4?K^b~WExt"CL#$yk!η!0R?߁#lq#W*.*?%̓\,6%XEgȶm7~K[t܍ 9}@ã~cK?=<]#]=k)TQ/r!7 _V-/nJ]_,ׂI堋_0Ȱ.jAmW2._޿+˫^ۻ_=zfܿ}=pW6,+%>rHyG縢>O1OEe2 \ lVa{Z(o~w__RS ݳo1@ ]nxOO?e mWq2ԺTV.q+` zz>z.G)'zǩnk2)ɾo.ߋHGK( >޽%jI(ĭ,G7S[7/%ezw-3&ŒkZ1xM*pwqZ>$p5籬i> P [%`&U37WP==y!08VmŚf[@NĩAݹDKjϹꮉyo^^Vy†>(GJھs s&(*O/Sc^w}׺*x\ u-‡endstream endobj 125 0 obj << /Filter /FlateDecode /Length 6152 >> stream x\Mqݿߐ] gJ\,Vy!{L=)tx%dʿh(JLRr4w4i4\ڿonkO1]b)k ߿\tᛋuW)^ZS񗿠oո?.p٦krۃsW˻,/fy%V %PH9$[L?L+xLf~bxBTdXx2AC{ܹWWg+WGcF:/sqW6LW kNvMN3oJ8]n*,wHUnS3"w?MJg(pBUhbθ;]f0Si8iv{Q:wsoS sXfF8NܵMPnhH-\Kw*E$sQ䜑[`nYXP&wDYbS2C]a&;[!DYs ACs&([00=@.I-ּgEz7Xc$3 A~Cܦ1fW6V13QȞh]!0f]$YօkvLk,Kɖ f3hsfd!NyG> VT>7fC}"~N #;#r3]?w֘@l0W# ; 6]|S&,Bw ZN/k*3KbL#;-z2YG"a3zȡ/ݦڂ_:LAlZLRҖDAW5E. ͬԍq.6X%C۶A\1öFpFtcJPle`6`mu (V4p<[@lVA;5͛%Xs&ehu;Ҕc`Sc;&V/N\b%\uP{5g!9u25#)Y(ח-gV(@pPm%a20 i] KoVr&Ҕc7ox (.~,/*R;' 55xiɵ%d+SKmemn3*T2TlOzoJke6Ì Xߖ^C܇auBU53Kz*b& ߂Il&e}}gc:qġ5UJ)U˴HY q>icQKƾ-\ 5JJ"Ek [#^F S̎ i.s`RBϛwB/pxC cڋ(O=<{kyEmu1_`=G_?|"1^-pi1tS&cɀz?JvaA}%X=AlK=H<X k} Qî:]~מBQb9p_,d AcX,TR4' _]bQ70\ 8y2"_3LB]#9ty`,?m/]Og ;nV|5qDDMc'wk3/(1J`GɴZQ]db">Q! Z+#cO-N>3Gr-oykP 49,M+.fUIdRXpX}]Gı x_߰ -L o?||ϏvS7v7 q7vy"̠o?\=ο}~r_0_^jWL:݁$S)m9=hWO`6 ltA-i̛CzX|<O^k7CD 1A] B!J#>|Zb;?e̺1o2)[659V ݉ a_2J2ϑ$P8t5$`<16fˎ%da%"('l$6@MEQ%XΐQKq.z#֜Ga*D 9(q:v$kv}UcaQ@R`.CcӖ) "(85{ҷo}'t8>*PD06(KNfTUq@gbEbpR@;&č $$vgDN)mmbACxNO_ni'Axnxӱ!;p Ls`X=;l=I8 /$N =3x[hCb'F(mXJJt$P=IGF,EfZqg+\}kiƙņ*'$V`Zppc8Sne?OM_ 0 mZqFoKY̞cnz nIfw Msz'v5W\=3=+bqJmTk4$8j|dX8R؞juʖ2TIPJ@5Y#937֕~#[ȠGܯ?gzz=x[Nu<BgO<~sF61>7`5fޒ+F. Y8-^} Byf}Q PWn ;b 3A#A`kD@*]| rif$Y#p&f|򩴻>#LEu1VDY 'X65gpR|%7(Iۄ̖Nٓp>d߰~L8׳D0}gaalj$)Yob7 lhH\h@2>֥Zث&;+Ra4k,L b8T Y9 ?uLh(Oȭ)-Zr5i9*$3tgՈҷJ2+VΖޅHYpaV5lWn$+6CO䃊l= 3l J[1 T#r'rV\:7K1[c=0lYfǤNPX g~g@w٢$Gn֧F2&k_SU_gV&ΙJmjk5Y [5dzŕǷoDz_ FEy_y=/¾<|Oo NZ lN ? s»AuPе>,uׂ)!c9{Ew|?wMG)R/('h'=] Օ8k1WMZZY]O:|h 1[D4Hy/j-<)3Oyp̳tbÕEb Rfn$Pf+3tz~9|r)XD ʍU9|otz( "c%_D\TZehYo[VۤCS54OC*{K)' (gcKd&^Z0%ԳQo䣬 s0Fx?pd~GlVWF8߿I{+\:e!dyHgVd~ 9Kز[,/xH2[ڻeB{済Q3Q rњ[g1Fvؓāln.2Cof\pULX"Uړ-"Jܞ,oKB'[9[-ͻ[ۓ-sV{IE.ڞ|Vs< Q2iaY>_k3 yD ;6!ثcW|ݸ?} #jO~m |C3=kn÷?OoJy|dv\}Ly|0-4}~!ۇ89|h˝nendstream endobj 126 0 obj << /Filter /FlateDecode /Length 4394 >> stream x\ێ9}7̃0OV:y'3];*kGuI7IFSLEJ$3NrQЋamнk5kFމijX#8ӏۇoV~v}skD;@7|=o?lng-z8sw9<=8mdS/gpfJtޭ?Cɿ7zm}X? ]WoVR;3m[JRF^$;DazBd%K6z2T( @i4 57Ũ@yL$ id aB 214]'&ymR&=d*' 0QЄ" Gala3, fB.ԃo胷6[1c;`N AI4 =q[ W-(o PbyK0byKG iz +^^ lUOW6$<7[ :f1@{{x>|>mFvi61a<;.o7hQn>.}h`J_V:wܪVO1O޴)`(o|g2Khl@yx-xr|pPpǁC71 Cf1Y&T>@{pxBeKR09*Y l)PV+ s0S%˯}qzV)[8̤M_Ip><&Y8*% Ce GY@1)i([+_b Up~Z|Z@'{|q@ kEK<8J]PM7|2+J4c{$DߐdѮc3E\(5N"WNCR<y@p'x=nߧ+yR7Q J$6f34U1gU j*֋9/a.G\ _'~ɡoI3yxN Uݐ&ߙ ԠxU(R i b SJ~٩13jTHqrvL(hT]|㦶fLfjҙ@m>3hBb45Q T!Jxl bmtGZ 񚽚&P j.jјAM Ԣ@ mqA [ rFB,XBGA i,߱dWjӘAM Ԣ14E#Zb銵j \soسkz )~_wQ$i rQI3jywd{)~g-m|bV3^O _޶z`˙xW5$ޕ+;ȏ]C *T)ŕd]{i(3!fpnwQqaj+٦ܪK]&$hj{SgK?:۔O,sr!,gb=YJ+jqBdrH,I&vRmv"% }߆j'&'L$<6D:5”|/+tu3]/RfZ:kr⫐Kd91T2e\/rRDZ—X*|Bt//RgZxjl⩐KbQ>CJW|o9%k~U}>w=||Tz }t{˿=s-c+v,*1~傟 7[)9 @[zW}7RaG{zwhtO| v;X\n^'?p"So&>;y\F nA<1oOCV`npsw3|Hɸ;_ď zb;YM۷DžWw?W8<^ѥJ|`u{z۝.U_XXY|ޏ k-rjTFV)~(:8sbw:=}>3 ⑃לHϟrtl(׭"?>Lq[U]Ƈ=xOJC]ӂGqu<}e0"'15毮B:.;S!x|؟#}ltϹf-VYXQB<`NEҼ,Ef>ƪfLqe_ƍBӇyt{ kX*S6hWBp;\7ѺK )OO7Ow;HJ &!dcJl d,/ppݽcQ"6ZqܨC]w ?%Xh+48Vk}崻DN1,P])XSAӖvC,kny[>SUU"z̾171ś#eiPخı ]\S]o@xN8qBd&n6w[h1'y8AiF]\tm&'^uWO[\Mpraܟ120| OSj)Ktx_w]7, *Ncs(w2o?;rK;endstream endobj 127 0 obj << /Type /XRef /Length 147 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 128 /ID [<04a65fd86ab2bea08be3e27bcedfa1f0><49da0a0df3cc4353d95d5c586f34d0fb>] >> stream xcb&F~0 $8J l{AiFp-JV c9հƃH3 SDMhH)Dr$ ,؄Nɤ"L`/`l_*X ؖ@) "AD% 0 endstream endobj startxref 109036 %%EOF gstat/inst/doc/gstat.Rnw0000644000176200001440000003154014207202535014733 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. % \VignetteIndexEntry{ The meuse data set: a tutorial for the gstat R package } \documentclass[a4paper]{article} \usepackage{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{The meuse data set: a brief tutorial\\ for the {\tt gstat} R package } \author{\href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}} \date{\today} \begin{document} \maketitle \section{Introduction} The \code{meuse} data set provided by package \code{sp} is a data set comprising of four heavy metals measured in the top soil in a flood plain along the river Meuse, along with a handful of covariates. The process governing heavy metal distribution seems that polluted sediment is carried by the river, and mostly deposited close to the river bank, and areas with low elevation. This document shows a geostatistical analysis of this data set. The data set was introduced by Burrough and McDonnell, 1998. This tutorial introduced the functionality of the R package \code{gstat}, used in conjunction with package \code{sp}. Package \code{gstat} provides a wide range of univariable and multivariable geostatistical modelling, prediction and simulation functions, where package \code{sp} provides general purpose classes and methods for defining, importing/exporting and visualizing spatial data. \section{R geostatistics packages} Package \code{gstat} (Pebesma, 2004) is an R package that provides basic functionality for univariable and multivariable geostatistical analysis, including \begin{itemize} \item variogram modelling, residual variogram modelling, and cross variogram modelling using fitting of parametric models to sample variograms \item geometric anisotropy specfied for each partial variogram model \item restricted maximum likelihood fitting of partial sills \item variogram and cross variogram maps \item simple, ordinary, universal and external drift (co)kriging \item (sequential) Gaussian (co)simulation equivalents for each of the kriging varieties \item indicator (co)kriging and sequential indicator (co)simulation \item kriging in a local or global neighbourhood \item block (co)kriging or simulation for each of the varieties, for rectangular or irregular blocks \end{itemize} Other geostatistical packages for R usually lack part of these options (e.g. block kriging, local kriging, or cokriging) but provide others: e.g. package \code{geoR} and \code{geoRglm} (by Paulo Ribeiro and Ole Christensen) provide the model-based geostatistics framework described in Diggle et al. (1998), package \code{fields} (Doug Nychka and others) provides thin plate spline interpolation, covariance functions for spherical coordinates (unprojected data), and routines for spatial sampling design optimization. \section{Spatial data frames} As an example, we will look at the meuse data set, which is a regular data frame that comes with package \code{gstat} (remove the 88 from the colour strings to make a plot without alpha transparency on windows or X11): <>= library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") @ % the following is needed because lattice plots (bubble wraps xyplot) do not % show without an explicit print; in order not to confuse users, we hide this: <>= print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) @ and note the following: \begin{enumerate} \item the function \code{coordinates}, when assigned (i.e. on the left-hand side of an \verb|=| or \verb|<-| sign), promotes the \code{data.frame} meuse into a \code{SpatialPointsDataFrame}, which knows about its spatial coordinates; coordinates may be specified by a formula, a character vector, or a numeric matrix or data frame with the actual coordinates \item the function \code{coordinates}, when not assigned, {\em retrieves} the spatial coordinates from a \code{SpatialPointsDataFrame}. \item the two plotting functions used, \code{plot} and \code{bubble} assume that the $x$- and $y$-axis are the spatial coordinates. \end{enumerate} \section{Spatial data on a regular grid} <>= data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") @ <>= print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) @ If you compare the bubble plot of zinc measurements with the map with distances to the river, it becomes evident that the larger concentrations are measured at locations close to the river. This relationship can be linearized by log-transforming the zinc concentrations, and taking the square root of distance to the river: <>= plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) @ \section{Variograms } Variograms are calculated using the function \code{variogram}, which takes a formula as its first argument: \verb|log(zinc)~1| means that we assume a constant trend for the variable log(zinc). <>= lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) @ <>= print(plot(lzn.vgm, lzn.fit)) @ Instead of the constant mean, denoted by \verb|~1|, we can specify a mean function, e.g. using \verb|~sqrt(dist)| as a predictor variable: <>= lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) @ <>= print(plot(lznr.vgm, lznr.fit)) @ In this case, the variogram of residuals with respect to a fitted mean function are shown. Residuals were calculated using ordinary least squares. \section{Kriging} <>= lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) @ <>= print(spplot(lzn.kriged["var1.pred"])) @ \section{Conditional simulation} <>= lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") @ <>= print(spplot(lzn.condsim, main = "four conditional simulations")) @ For UK/residuals: <>= lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") @ <>= print(spplot(lzn.condsim2, main = "four UK conditional simulations")) @ \section{Directional variograms} The following command calculates a directional sample variogram, where directions are binned by direction angle alone. For two point pairs, $Z(s)$ and $Z(s+h)$, the separation vector is $h$, and it has a direction. Here, we will classify directions into four direction intervals: <>= lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) @ <>= print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) @ Looking at directions between 180 and 360 degrees will repeat the image shown above, because the variogram is a symmetric measure: $(Z(s)-Z(s+h))^2=(Z(s+h)-Z(s))^2$. The first plot gives the variogram in the zero direction, which is North; 90 degrees is East. By default, point pairs are assigned to the directional variorgram panel with their nearest direction, so North contains everything between -22.5 and 22.5 degrees (North-West to North-East). After classifying by direction, point pairs are binned by separation distance class, as is done in the usual omnidirectional case. In the figure, the partial sill, nugget and model type of the model are equal to those of the omnidirectional model fitted above; the range is that in the direction with the largest range (45$^o$), and the anisotropy ratio, the range in the 135 direction and the range in the 45 direction, estimated ``by eye'' by comparing the 45 and 135 degrees sample variograms. Gstat does not fit anisotropy parameters automatically. We do not claim that the model fitted here is ``best'' in some way; in order to get to a better model we may want to look at more directions, other directions (e.g. try {\tt alpha = c(22, 67, 112, 157) }), and to variogram maps (see below). More elaborate approaches may use directions in three dimensions, and want to further control the direction tolerance (which may be set such that direction intervals overlap). For the residual variogram from the linear regression model using \code{sqrt(dist)} as covariate, the directional dependence is much less obvious; the fitted model here is the fitted isotropic model (equal in all directions). <>= lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) @ <>= print(plot(lznr.dir, lznr.fit, as.table = TRUE)) @ \section{Variogram maps} Another means of looking at directional dependence in semivariograms is obtained by looking at variogram maps. Instead of classifying point pairs $Z(s)$ and $Z(s+h)$ by direction and distance class {\em separately}, we can classify them {\em jointly}. If $h=\{x,y\}$ be the two-dimentional coordinates of the separation vector, in the variogram map the semivariance contribution of each point pair $(Z(s)-Z(s+h))^2$ is attributed to the grid cell in which $h$ lies. The map is centered around $(0,0)$, as $h$ is geographical distance rather than geographical location. Cutoff and width correspond to some extent to map extent and cell size; the semivariance map is point symmetric around $(0,0)$, as $\gamma(h)=\gamma(-h)$. <>= vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) @ <>= print(plot(vgm.map, threshold = 5)) @ The threshold assures that only semivariogram map values based on at least 5 point pairs are shown, removing too noisy estimation. % The plot is plagued by one or two extreme values, corresponding to cells % with very small number of point pairs, which should be removed. \section{Cross variography} Fitting a linear model of coregionalization. <>= g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") @ <>= print(plot(v, g.fit)) @ <>= print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) @ \section*{References} \begin{itemize} % \item Abrahamsen, P., F. Espen Benth, 2001. Kriging with inequality % constraints. Mathematical Geology 33 (6), 719--744. % \item Bivand, R.S., 2003. Approaches to classes for spatial data in R. % In: K.~Hornik \& F.~Leisch (Eds.), Proceedings of the 3rd International % Workshop on Distributed Statistical Computing (DSC 2003) March 20--22, % Vienna, Austria. ISSN 1609-395X; available from [1]. \item Burrough, P.A., R.A. McDonnell, 1998. Principles of Geographical Information Systems, 2nd Edition. Oxford University Press. \item Diggle, P.J., J.A. Tawn, R.A. Moyeed, 1998. Model-based geostatistics. Applied Statistics 47(3), pp 299-350. % \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for % geostatistical modelling, prediction and simulation. Computers \& % Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://dx.doi.org/10.1016/j.cageo.2004.03.012}{30: 683-691}. % \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial % Prediction. Mathematical Geology, 25 (2), pp. 219--240. \item Wackernagel, H., 1998. Multivariate Geostatistics; an introduction with applications, $2^{\mbox{nd}}$ edn., Springer, Berlin, 291 pp. \end{itemize} \end{document} # g = gstat(NULL, "log.zinc", log(zinc)~1, meuse) # g = gstat(g, "log.zinc.res", log(zinc)~sqrt(dist), meuse) # lplot(vgm.map[["map"]], c("log.zinc", "log.zinc.res")) % vim:syntax=tex gstat/inst/doc/st.Rnw0000644000176200001440000003643513777370515014266 0ustar liggesusers%% Document started, Sat Jul 3 19:30:52 CEST 2004, my 37th birthday, %% while being stuck for 24 hours at Philadelphia airport, on my way %% back from the joint TIES/Accuracy 2004 symposium in Portland, ME. %% Continued, Oct 28, during the Apmosphere mid-term review. Oh, shame. \documentclass[a4paper]{article} \usepackage[colorlinks=true,urlcolor=blue]{hyperref} \newcommand{\code}[1]{{\tt #1}} \SweaveOpts{echo=TRUE} \title{Introduction to Spatio-Temporal Variography } % \VignetteIndexEntry{ Introduction to Spatio-Temporal Variography } \author{ \includegraphics[width=.4\columnwidth]{ifgi-logo_int}\\ \href{mailto:edzer.pebesma@uni-muenster.de}{Edzer Pebesma}, \href{mailto:ben.graeler@uni-muenster.de}{Benedikt Gr\"{a}ler} } \date{\small \today } \begin{document} \setkeys{Gin}{width=0.9\textwidth} \maketitle \section{Introduction} Since \code{gstat} package version 1.0-0, a dependency of gstat on the R package \code{spacetime} was introduced, allowing the code in \code{gstat} to exploit spatio-temporal data structures from that package. This vignette describes the possibilities and limitations of the package for spatio-temporal geostatistics. To understand some of the possibilities and limitations, some knowledge of the history of the software is needed. The original \code{gstat} software (Pebesma and Wesseling, 1998) was a standalone computer {\em program} written in around 25,000 lines of C code, and would do geostatistical modelling, prediction and simulation. The \code{gstat} R package (Pebesma, 2004) consisted mostly of an R interface to this C code, together with convenience functions to use R's modelling interface (formula's, see \code{?lm}) and graphic capabilities (trellis graphics in package \code{lattice} to show cross variogram as matrix plots; interaction with variogram clouds using base plots). Starting 2003, a group of programmers developed a set of classes and methods for dealing with spatial data in R (points, lines, polygons, grids), which was supported by the publications of the well-known ASDAR book (Bivand et al. 2008; see also \url{http://www.asdar-book.org/}) and helped convergence in the user community, with in 2011 over 2000 subscribers on the {\tt r-sig-geo} mailing list. Package \code{gstat} was one of the first packages that adopted and benefited from these classes. To realize a particular idea, writing code in C typically takes about 10-20 times as long as writing it in R. C code can be more efficient, gives more control over memory usage, but is also more error prone--mistakes in C code make an R session crash, something that is hard to do when writing R code. The original C code of \code{gstat} (Pebesma and Wesseling, 1998) provides all kriging varieties (universal, ordinary, simple; univariable, or multivariable as in cokriging) for two- or three-dimensional data. When the spatial domain is constrained to two dimensions (and this might cover over 99\% of the use cases!), the third dimension might be used to represent time. As such, the {\em metric} variogram model, which allows for geometric anisotropy definition in three dimensions, can be used for spatio-temporal kriging. When defining the three-dimensional variogram as the sum of 2 or more nested variogram (summed) models, one can choose anisotropy coefficients for a single model such that this model is {\em effectively} zero in some directions, e.g. in space {\em or} in time; this allows one to approximate the so-called space-time sum model. It should be noted that at the C code there is no knowledge whether a third dimension represents space, or time. As such, particular characteristics of time cannot be taken care of. Since the second half of 2010, the development of an R package \code{spacetime} started. It provides methods and classes for spatio-temporal data, and builds on the spatial data classes in \code{sp} and time series classes in \code{xts}. This document will explain how data in this form, and methods provided by this package, can be used for spatio-temporal geostatistics. We will work with a data set with air quality (PM10) measurements over germany, taken from rural background stations available in the data sets provided by the European Environmental Agency. <<>>= library(spacetime) rm(list = ls()) data(air) ls() @ \section{Variography} \subsection{Temporal autocorrelation and cross correlation} We will look into a subset of the data, ranging from 2005 to 2010, and remove stations that have only missing values in this period: <<>>= if (!exists("rural")) rural = STFDF(stations, dates, data.frame(PM10 = as.vector(air))) rr = rural[,"2005::2010"] unsel = which(apply(as(rr, "xts"), 2, function(x) all(is.na(x)))) r5to10 = rr[-unsel,] summary(r5to10) @ Next, we will (rather arbitrarily) select four stations, which have the following labels: <<>>= rn = row.names(r5to10@sp)[4:7] rn @ In the following, autocorrelation functions are computed and plotted. The resulting plot is shown in Figure~\ref{fig:acf}. <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 for(i in rn) acf(na.omit(r5to10[i,]), main = i) par(mfrow=c(1,1)) @ \begin{figure}[hbt] \begin{center} <>= par(mfrow=c(2,2)) # select 4, 5, 6, 7 rn = row.names(r5to10@sp)[4:7] for(i in rn) acf(na.omit(r5to10[i,]), main = i) @ \end{center} \caption{Autocorrelations for PM10; time lag unit in days.} \label{fig:acf} \end{figure} Auto- and cross correlations can be computed when a multivariate time series object is passed to {\tt acf}: <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ The resulting plot is shown in Figure~\ref{fig:ccf}. \begin{figure}[hbt] \begin{center} <>= acf(na.omit(as(r5to10[rn,], "xts"))) @ \end{center} \caption{autocorrelations (diagonal) and cross correlations (off-diagonal) for the four stations selected; time lag unit in days. } \label{fig:ccf} \end{figure} From these graphs one should be able to observe the following \begin{itemize} \item autocorrelations for lag 0 are always 1 \item cross correlations for lag 0 are not always 1 \item cross correlations can be asymmetric, meaning that when $\rho_{AB}(h)$ is the correlation between $Z(s_A,t)$ and $Z(s_B,t+h)$, $$\rho_{AB}(h) = \rho_{BA}(-h) \ne \rho_{AB}(-h)$$ with $s_A$ and $s_B$ the two stations between which a cross correlation is computed, and $h$ the (directional!) lag between the series. \end{itemize} The plot further more shows that for these four stations the asymmetry is not very strong, but that cross correlations are fairly strong and of a similar form of autocorrelations. This kind of plot does not work very well in layouts of e.g. 10 x 10 sub-plots; {\tt acf} automatically chooses 4 x 4 as the maximum a single plot. To try this out, do a 7 x 7 plot <>= acf(na.omit(as(r5to10[4:10,], "xts"))) @ and note that here we see in the last figure (DESH \& DESN04) a pair of plots with nearly no cross correlation. This might have to do with the spatial distance between these two stations: <<>>= library(sp) print(spDists(r5to10[4:10,]@sp), digits=3) @ (What is the spatial distance between stations DESH and DESN04?) \subsection{Spatial correlation, variograms} In the next steps, we will sample 100 time instances randomly, <<>>= rs = sample(dim(r5to10)[2], 100) @ we select these instances as a {\tt SpatialPointsDataFrame} and add a time index to them. After this we bind them together in a single {\tt SpatialPointsDataFrame} which has a time index {\tt ti}: <<>>= lst = lapply(rs, function(i) { x = r5to10[,i]; x$ti = i; rownames(x@coords) = NULL; x} ) pts = do.call(rbind, lst) @ Then, we can compute the pooled variogram <<>>= library(gstat) v = variogram(PM10~ti, pts[!is.na(pts$PM10),], dX=0) @ and plot it (Figure~\ref{fig:vgm}): <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) plot(v, vmod) @ \begin{figure}[hbt] \begin{center} <>= # plot(v, fit.variogram(v, vgm(1, "Exp", 200, 1))) vmod = fit.variogram(v, vgm(100, "Exp", 200)) print(plot(v, vmod)) @ \end{center} \caption{sample spatial variogram, averaged over 100 randomly chosen time steps} \label{fig:vgm} \end{figure} The fitted model is this: <<>>= vmod @ One should note that the fit is rather poor, and not forget that we only have 53 stations selected. The time resolution is rich (1862 days) but the number of stations is small: <<>>= dim(r5to10) @ We can fit a spatio-temporal variogram the usual way, by passing an object of class {\tt STFDF} (Pebesma, 2012): <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ Alternatively, if this takes too long, a temporal subset can be taken, e.g. using the first 200 days: <>= vv = variogram(PM10~1, r5to10, width=20, cutoff = 200, tlags=0:5) @ taking random days from the full period will lead to the a wrong assumption that every time index increment reflect a constant lag increase. As an alternative, we will here load the precomputed S/T variogram: <<>>= data(vv) @ % remove the model column to keep text and figures in line. <>= vv <- vv[c("np", "dist", "gamma", "id", "timelag", "spacelag")] @ Plotting this object can be done in several ways, two 2D-plots are shown in Figure~\ref{fig:map} and a 3D wireplot is shown in Figure~\ref{fig:wire}: <>= plot(vv) plot(vv, map = FALSE) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv), split = c(1,1,1,2), more = TRUE) print(plot(vv, map = FALSE), split = c(1,2,1,2)) @ \end{center} \caption{Spatio-temporal sample variogram map (top) and sample variograms for each time lag (bottom); both figures depict the information of object {\tt vv}.} \label{fig:map} \end{figure} \subsection{Fitting a spatio-temporal variogram model} At first, we try to fit a metric model with spatio-temporal anisotropy: <<>>== metricVgm <- vgmST("metric", joint=vgm(50,"Exp",100,0), stAni=50) metricVgm <- fit.StVariogram(vv, metricVgm) @ As numerical criterion to judge the goodness of fit of model and sample variogram, the root-mean-squared-difference between the surfaces can be obtained by: <<>>= attr(metricVgm, "optim")$value @ The final model can be plotted with the sample variogram (Figure~\ref{fig:mm}): <>= plot(vv, metricVgm) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, metricVgm)) @ \end{center} \caption{Sample variogram map (left) and fitted metric model (right).} \label{fig:mm} \end{figure} \pagebreak Now, let us try to fit and plot a separable model (Figure~\ref{fig:sm}): <<>>== sepVgm <- vgmST("separable", space=vgm(0.9,"Exp", 123, 0.1), time =vgm(0.9,"Exp", 2.9, 0.1), sill=100) sepVgm <- fit.StVariogram(vv, sepVgm, method = "L-BFGS-B", lower = c(10,0,0.01,0,1), upper = c(500,1,20,1,200)) @ To compare this model with the previous one, we look at the optimized root-mean-squared-differences between the two surfaces and plot sample and both models: <<>>= attr(sepVgm, "optim")$value plot(vv, list(sepVgm, metricVgm)) @ \begin{figure}[hbt] \begin{center} <>= print(plot(vv, list(sepVgm, metricVgm))) @ \end{center} \caption{Sample variogram map (left), fitted separable model (middle) and fittted metric model (right).} \label{fig:sm} \end{figure} A wireframe (3D) plot of sample variogram and fitted variogram models can be obtained e.g. by <>= library(lattice) plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5))) @ which is shown in Figure~\ref{fig:wire}. Further spatio-temporal model definitions can be found in the help pages of {\tt fit.StVariogram} and {\tt variogramSurface}. The demo {\tt stkrige} presents further examples and illustrates an interactive 3D-plot of sample variogram and the fitted variogram model. An interactive variogram exploration web-tool is avaialble at \url{http://giv-graeler.uni-muenster.de:3838/spacetime/}. \begin{figure}[hbt] \begin{center} <>= library(lattice) print(plot(vv, list(sepVgm, metricVgm), all=T, wireframe=T, zlim=c(0,120), zlab=NULL, xlab=list("distance (km)", rot=30), ylab=list("time lag (days)", rot=-35), scales=list(arrows=F, z = list(distance = 5)))) @ \end{center} \caption{Wireframe plots of sample and fitted space-time variograms.} \label{fig:wire} \end{figure} \clearpage \section{Spatio-temporal prediction} The vignette in package \code{spacetime} gives an example of using the gstat function \code{krigeST} for spatio-temporal kriging of the Irish wind data. The \code{krigeST} function uses global kriging, but only needs to invert the purely spatial and purely time covariance matrices in the separable case. For more generic spatio-temporal kriging where space is two-dimensional, one could use \code{krige}, defining the observations and prediction locations as three-dimensional data sets, see for an example <>= demo(gstat3D) @ It needs to be pointed out that in that case, the time (typically the third dimension) needs to be numeric, and three-dimensional anisotropy needs to be defined properly (see \code{?vgm}). In case the data set is too large for global kriging, one could try to use local kriging, and select data within some distance, or by specifying \code{nmax} (the nearest $n$ observations). In both cases, it is advisable to transform time such that one can use an {\em isotropic} variogram model in the three dimensions, as only in that case the nearest $n$ observations correspond to the $n$ most correlated observations. \code{krigeST} provides a solution where a \code{bufferNmax}-times larger neighbourhood is evaluated within the covariance model and the strongest correlated \code{nmax} neighbours are selected. An additional consideration is that in space-time, observations may not be regularly spaced. In some cases, the nearest $n$ observations may come from a single measurement location, which may lead to sharp jumps/boundaries in the interpolated values. This might be solved by using larger neighbourhoods, or by setting the \code{omax} in \code{krige} or \code{gstat} calls to the neighbourhood size to select {\em per octant} (this should be combined with specifying \code{maxdist}). %\section{Spatio-temporal simulation} \section*{References} \begin{itemize} \item Bivand, R., E. Pebesma and V. Gomez-Rubio, 2008. Applied Spatial Data Analysis with R. Springer. \item Cressie, N.A.C., 1993. Statistics for Spatial Data. Wiley. \item Cressie, N. and C. Wikle, 2011. Statistics for Spatio-temporal Data. Wiley. \item Pebesma, E., 2012. spacetime: Spatio-Temporal Data in R. Journal of Statistical Software, volume 51, issue 7; \href{http://www.jstatsoft.org/v51/i07/}{1-30}. \item Pebesma, E.J., Wesseling, C.G., 1998. Gstat, a program for geostatistical modelling, prediction and simulation. Computers \& Geosciences, 24 (1), pp. 17--31. \item Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package. Computers \& Geosciences \href{http://www.sciencedirect.com/science/journal/00983004}{30: 683-691} \item Ver Hoef, J.M., Cressie, N.A.C, 1993. Multivariable Spatial Prediction. Mathematical Geology, 25 (2), pp. 219--240. \end{itemize} \end{document} gstat/inst/doc/spatio-temporal-kriging.pdf0000644000176200001440000106261314413507476020405 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4899 /Filter /FlateDecode /N 84 /First 707 >> stream x\YsƖ~_TJ}KeReˑMq$``SBP^;7PdtgnȌg*.ә<3.x2|B&? -=n2L 32Aat@%)O6Rsi~Ȍp&hQ{ x.efPuM渶@1s%ptv<^ȼ>Sj4. ̝R@]pa z&%kq!̔ÅE@:,E褦.sIK\HTtdipftC@F@@VotM(@Vځ ,dY93t$ cT ku@P* ((1@qdh⠿d+AHtVXApzD`+q sE4 ^d_p& .@@ %8{y@0."(T(qƅ= sƞ_L /(c_NհYqn(3i/h%㲘TbRfw$T\s F8W[yRx7p8R2`6gӜmsn ޡi,s1WY7gӜmh8)h\6[UqoTLNDtyGB-Ge=z C;.'Ğ?@/@y",j\E5Dc5ۼy'e߼B%d(T6 Cj_82}G#_~>)ON8s[r4♥kJmhtQ%\TR_T3Lit/PӉ:A NPtb8&u$&uɤ.5`jRlM]q&(6A MPl8>aW~#+2xŏ^sT~FjxWflcb\OhREyНz@.j)Y> bт5St\X*8<5%ә+ծS ghOGa^6.LJU*vc56~ JŐÅ?@Ǫfu]ʜ+jƛ!z󭥻TkSLZ@g ?>d $D!y#Q+Ed&N?mg:DbZQn)d2.5J>:;ψvʈegTcZwq#EQ*H-nG##G^<8>_LKa$ߐm=cݟWI+;wySy7$ U*B4>]HHcZ~'jH1%ˆw&7e0-)-JSALVae͕ڙS׫;eӗx?~^N3ڃq74Mys޵׳gzݚ| Pu-7VXWYЫ%u)50sG xO} X'wI5"e+vID!.!.Y')~7ZGېS+SBZ)q$_ ұ-J; q1)`MJ@ vj6[ F\"^"&Bΐr6{#ynL49m&|'9(赣CN[m8 ;*`*줠hP%{,-NW1j| Z9i@[`2 %^[6kP.q\#ړDGO!픡 kE k]3ևmRVj;sY֧5H >fyڛݰּCFKCIQV9Oܪf%tiǡufgY/r7, NF;EN紻t}POI=:I'YvJJg ~{-%ŽRY@ HJ[#|{WF8M\lEQBSh{9+o՞|VQq v hGwˤA*r'ji-!L?P". 콕 R!hZH3N;nAL;n<(ݬVk+p^{"0:c_ay^D62NsmP+>%a3o 'P@ z+]E "4Uav.:H]Hs.g6iuW''b P&2' :nֵǵԔ NS{ fFVx5lil6]CKꅅd~-}]6/;BMǯ&Vc蟝p 躢7}> 5YȚ,Fendstream endobj 86 0 obj << /Subtype /XML /Type /Metadata /Length 1387 >> stream GPL Ghostscript 9.55.0 2023-04-06T11:22:05+02:00 2023-04-06T11:22:05+02:00 LaTeX with hyperref endstream endobj 87 0 obj << /Type /ObjStm /Length 4609 /Filter /FlateDecode /N 84 /First 775 >> stream x\UN8]{}];_ֻr!(#$ )B1BDH(BAH(UwL̮{/yW^zm"9q#"Ly=n"E^Fމȫ ##鱉6?GHp|$rg,"H2טTAATsTDDJ,)')ouiΑYQ58"ڠ.#mT;ɹ Cp-Hj(Ke|d`d'GSBWDPU  @H\ZE7t; 9AO$3JRo3 #B$ dEB$1.c)A$qXň|*Gܡ@HD/u~Z)jĥ;y(dµ8=-QmO]Eݮ@*&?zcIF_xP1D/IX3Riz^և6,,ڰBs 歷d}5h>w?IŠ,x^Ǥ]xfo"UOFi6MԆ}wstdTܼ%'~0v3$[D Q+$^1 fy1ՙ,Nh簗fAB@0)J=ڌod$.8 'Wn]ݸ}ags{"~z0Fp`s8O6F0}%}q:NFd{U dI'xMI`j)I`$w:Io$Y2y4uf9Eds; ,+\;5,A9$Re8[!k0l5!L`I+.ȩ4jl_ f&[9UŔi3uw/ll's#T^E_R;76o@[[̂v+)`J[JEd7%0o9[_%:6~1i*HJ<> E ə쎲$%o${~rdL'!)hW[BCT}Kn5nlpp;\Y] ƶfٖfQ%55a{^ep햔][-)t3,{o{]tư55)a˗[%$W3z98.LG^'d`w0ßvQ-MmMhv;ߢ|E))²EV~wf~1pMpO՛¾vZڪ^X,hWH͔?8nrH^Sj׉BF)%ІVzUKʄ቞^:˦tKj^>}[ߣfWUPRJ8&V͞xǵr+ f+x$p@UJt˪lh;#kjMp#LzI?IA%y Wѷe0K8^awyP`2wݓ'GM8&X6p+QRڥ)ᒒ+Z勝]R~;ho:gSeϷRZė4g,{#V$[a^S¥:ѳ+ݒu{yN]enĒR;DRœ -o:U66dxs«ΫjW{XWl^YwVFlT5i!DDUƽ"b :'{{Tp< *ELˆXY#cet}aMQ+"I3ǙXqУ,Al1jAq98 hs{b,vEӞظ7a4͎=,L{)L͝M&Vμ&-V5MTi7̀¯jkbf$IcIj; QFTDmJoYq:p:15n#Q7*u'E]DW0uyx۾.o^;DX R ' ׉Jt61JX:emm(q1%4}LZ0aB|5GKz~aT /-R |ƥCg dLXAQ!cc2ZT fo!h~;[:J>vtelFԥA;KzmV Go=R7 =q= ݘ-\8ތƮ%27H G5R$=,֌$34 j#bbNdb(<6qj!SR:>W#Ȑm~6vAZ|aNL[%"fL"/Ib(+yfpTuT1S$ Ѥ8tX6BVGUQU-uu|Κ2‚?ΊQõAq6 4LF\CX׈yF6kٮ{5ҫF>Ias\ owjOj/jojkk5)qw`|-/ePSp\ %U~>UT/\̄6o:_+G?^˧qDD@iGx3~-,Y|cZN.~o-~gbz^.\ٸKS(oG_*є!Dg-ϟϟF_; / XY'E(7Xp^b`٧/l6 Tۤ1H m* 4?9oq͒ [J!UVyHgȹF㶥[NKw7<ؼ}v"kOd;N/au+'þp;X[P&g'k[I/4f+)Yi-Ū4%5&@Sͻ{W. hxXʼn gzj:w˱!q._&gX~/w!EPQ }-Y6ڱ [Tƭ쐆خnT;tE qb(eexqI6j( Hَݧ.Y rhȬs%ڼvfh H@k:X!kLd]<FKŖb.[(i z_]#f#kԴ RƏƁnFF~xÏd1AU$2<=L$|tCk[a4)VqP'2RvKLβg}=EߤʾɴӔ(yR%=" ր TA*M3!{2rLC߼j׃$U9e1@MV{47x3 G=P@J<]l O_~5]JTJ5oUo3"\ۮ[yCBX rC_ 4洧 5UhM@kJ 8uS}[ Sn t]߭놝`=+jZS GDŽn{sr`U6Ys OqY f6Fp(~G(^h3 ;vZU/(),"* ىaJm03t4II; Ip’ YR~Q\8{eꥯ9?^ n>`> stream x[rS2{>hLmJ\P u&@5h6{3'y< .WٵE;I'Q{bBTїГ(D50[$ o-y 77 p [g]AndW|˄]ql֓?F:vVܢ ݸ%CmhɝKqZ|SS?=0y\S+ IBW*ZSi̺38CuMzRT8,+QckZ×O'W'wCZ\SOoU'iߠO=zi?N fiFQܓi`9VﷱiM5 n1;n4JZS[=r\W,8]}gA% d#l^᯲ȗTA@Jէ T=j:u=ъ6k=(&t/V\[sjt٩;U)۬7U"2. YN.nŦˆpqxkE>l2=@,ӫ[?iO? Ik Jd ` ^~b,XN.Wż898/.f./F!x*b|ƒ.2r@R _ ,K$X ¬ tm)"( Jl40鸊?NJDըcg?p7vA)QVRJu~h0k.(]V_-z޿}w}}fpw}USϮSkxz5ug/aڤ7V,瀖D/+k9dC})UB@s yYQZѻ"<ꔖHUjS:CXJ) tH)6PJy5X u]RJt6 U4R'$!Mm}GafC9pY^:$hǺBPaCk@i`dhKFeIcЋ:RKWJWVɲ4VEՐxu]ʖ!JU&Fv0j(1cQD@*P7U !-,G_2Q9+W":v}0H%!ZQ4 J)@ ՁRqA#-ҨRqJJHW^b`Ii>QMFjFt"z:DF)fJl*i(Ы\ "qP#sgjfWzjжkΉl _E#w2];i/+6K\i' h_$TXn#rj"8crq 3Gy&$kX:ϸS:jFDI#]}0,YPڏP}xE]:ߦXq9 8X3D# K{^ipzLA0IH4KL60d X#2qBR&0 =AjRf:KX]wII P֛S8a6Fa ZiAYvQI0 LjϽ`#-ڠ8Jtp!m>@jF`;_IH GICL !Lf˟v ADF%"X{U%<_ ^T IqyKHREDJy0D7KDt-o7AB ߰fQw琶9[N%ߴB InwHW4NYwa^,Uw(kvV۶>^aieqʪ^h=TXZe]_qxqg`菟.$P;>bZx*߿^g-\=$X# ʍY<[bBFendstream endobj 257 0 obj << /Filter /FlateDecode /Length 5883 >> stream x\IsFv/8nF9Th >iciŰ-X4@(Hْ [ddO7pӍ?nt{.7LErSj:6ǛwvUy2[x0PeqˎL^&۲LequZ:yt cunm UmwF.iK L̀q.jka :q! |L-](v[}{n\1TMӖ'3@g<8Ghh^znK$Oaxfk?5'"e 4 $4P$cX ]tQwGi7gO4{'`<t-r p'^9(ii?K" 8`TiCW/Wp=3*MKtEJ | {^i286^(3(\N)Qipwo#7UáAc/fIq?a7RmDjyF7}l8i XC[2 U2ͣ@3eAߦ% ^/2oy";!Ep?a@;n3{qb2a֎0cpAu84Peߠd3sЦjR TJL:Wdi%W2 ES-ȕ {SJ@ԙ+3ѧ-& q XfjCuC Xpb<`O"`CZC>BI:86GDa}aa|qp*6a $A>bKzEW<' >v87 B^}WEPY /~kh@wF052hu ^T;\zZmOa'K 6b~^i°", sF◘[W=`jj|FAeP\+`5ݹnh&z t+ E%GoHM3 !~qG?/l+2­\{s+R &hj 8m`QEZf5;Ht, e} R蒤kt"NQ3 Sc YJ-(lƠP"0"Q7/|"[EZ Ҕv3  [hEow]#GW0Cܑ0.ߠ1HíE(6gmu> Z& ǶF /Z {F0qvI~S/RU6xR@Ihm/w6:xMQ\Q ;-KT؆EEoΐDc 5y$jg`PV 7@GD*|BڡG+0#,{ sKp6>*(,:`v6s;XxaJ:3-Z|4A[-ċDsS V:%T[,3\ህil:B1/\V[h=<1 2ɀX)Ͳ'B9->:|F,mD68[b4c/ؿ!G@G ac\vC ^؇đ0E08SᛙH\^ѝB^MѨh4ug?~?E×Eć\1T{B 8w3Ұo@?уp+v l@&gtDp9 Am&a (1Fd?^3] Ѳ#fAQ؊P73>Ktf.D=1#o$L𞚟gi2,a2dR͊|< h`; p>Q{f@T"lE^MaE/ry yjO{^f<9PĘ!iٽ ` y Ws >G5Ifg Wa /- 3Q%:`N(iأ2.-#ua3aj'2$r6$veMGd,R?0.CS+D"chsp}w]^y}GAMg?,1BD\"vab (O To)ƙQ^eP*{ VW,C8U. 8( DV,kGv"O3 ZVIaPR-^%{g0j%}iI a3c+ [%?+ّOCRצ'F1 4{"Q[:KBa [n|.E ([hs37m>KI;7zĪ7(+y) Q"+OJ5aEF~!?_E)gWDU_4&/CZH#,sFY0}:?{oobKQo!Yl'sj+J:@ akXh:aR;g0% _55-t^K-tϹJ =:5W%N4`fvF&K`-r9@S%0,i@Iaq{*\ʧAd^+벹AژǶsN0$CDpvc`ߪ9,w*ji$C<R1Sz H2/⨛ rB9$ N 2QIA)Th'.DC] Q!``TΕFt(zh)*kWqF\i绢ECSTL+Qt('5nEuﴶikB: &Dhs_z3l+}ןHvEIojX%IUhiv؅' ؙb_-i()/OQe;i&X<]B&W&PWv-U/KvQN=,|\č 5?H* p0RnQzO9o)1yR8xwz.A=tgEB9K߀1VjubGmk#쨋"-Y>u4%_{fQ0dk )0$u"W@^sY-mOyQ E_-K^iV+ }1e *),*-LKs\'1rqGWGCvu\oS/Rt8N)È}^sLCؤL&ox<5dϡeQɌLYn08bcDD;X1qLyQiVe~ɑ]AeM*zWW)I0+=^USQ|7|n"/f@򱸶-)D"8>%0jT82wFb0D_O*iBRd*<: F‡ >N۳;Ÿ&+3" 8l V.u#+3!iXOI )} I%W[, Q|识~w> stream x=Msu{LU|,DDJ 9qbTEv$}o 8$)j1@~}ϪRU_w}U]+Ao?W[|gW8 B3gmD8ܾxn > QVRjU4?\ fѴ*V0Uq))bzu.CY %L/ Eݧ]nkwo]%pLgKL?Zj%KU9?,0ʆw#D]> ]%.{xޕ@ 7gK0 -KcȋۮYC-{dUZ.LlOHP+ TV07վ `5ut[MצaE[ǏR/!="(lqpE;HZ Dij&Jw紵@ ~/ &@0ih:D5W0,hK ZWqЛl xgj3]|8;LRi+TRk^]3.*$;^)5mxA8 p| :) R[xy`VY^׻ 1kqcB)(#,a7v2uWx"!Uy-]^'L6^!E2A  LGtd/͆xme+QJ9Ȼpz ҋ QhǬM9l9,!=-=ٝ悔n 70'm PcsqiGӰ=ҋ,CFxݠ^ ʪΎgYɓ,cI|_Of./W?h b'E/f#R"2Ϭ"pN7#6(C85nv=q`uȥA+_+ta%&(-h$}(]V0:_VU7tk, UQak3gCep*>zJqquܱtif)kR@%іy ?KI "%GCbaQh5XP eAp7 ) Q$vGxnb$8 4*vGDH~5u?H36)Pw}m 9^oKfTnf1&R"Sms{zHmYAaodgp͗{5itH@,!VA(N9v,}3x:zO135ܬ'#kӆ׮1k_@O8Q"S G#9Ԩ\mlr mj?xtxp;S׾c JV bۺǹӌ g΁Q#Vmc*)ܣzfDkj h=}e%oSuF <~qMק ЉA% }_/@tv\ѣlAI0*v!PFIKQpnv 3i=c1$}4Em xh Ar. LP' ݓ/prW%SIem?3P9v2Meﳪɴ1>V7_#ؼ% "#Q4 +'N8sԸ,gy$&HPe!vb x=q<^@j._YczēxF  b4T0tPO 2uAf\[=ULFδjբغԦ1mF;'x;P#N%hH=i^># O ]z nV"vhbҾ<:NxĀ 0_茚z $It3Wt3LXj1_j!DH{Aj(2_sJ0IFPGױqwxrgc3|3cvڄ?55^%$\zITJI* 's}>dAٹܙ639)uQ)JI*cawF/|:7u?%RqH!e*t*&q'd (ebGJSH&YNښ)hhvq^M{u_BoݗsoE->3{vߥ4,!m>ƢFv 52uC! fBRS4ХKhqhJٞSj)|ͮ\4mGE{$ [N^J';Įy99:?*R/diH+BvD8#Q`s0f ELf{UeGqU0M@yvQ('[P@ix,\k8d8M3 B: G6:.7sΦK*I V: 0C=&2X^8.GQ8;ߐИ iwMݥn&:ɼc\țCx*Mq!6px1ؕMWsJ\Lj>^boJv3F`3> QVַQ=+Eҩ뮥Y|?$)Mp}5q"q>м7k-gfPA԰7?amƯ@F +3(yϼ%oc=\0H)gx _<ɘD63G–vȽ x? iaBs x>m @f %ONݐktmgoo_ENx حS;*zrsU"GBWSr.9"YCSR9aΘ_ :,XU슊ܹv܂*Iwg=89RL]N`țK3kxݽK`!]%s<)3}&4J&qѬK1IK}j!R*|HH}jMai*^ooa[c s`gS\;C%^oRԛWdT!9lYZp5Ha)ؙH=Yo('戙*PXׇ:f܇xP0:ɦcӇ] $Vў}94S/

c ~w{4hS%g,hw]u>X&VCFLziy)b"s4p" JeʈY[aSlR__65%x>inWoQ١ŢAO_@{H,lzRh,&ߓ:`OMCbb18!-R;M ÿ[rwTw\]Sr7$e3b.VsO쒫U>D, Xp ,AzG{nA|꡵,٘cԖ$K@mPkUd `wfH;DsKH@8ԥ9A"*'#uz >sqx2ª͗ۂ 9>9IIAOGmT0>` Ҋ4F~DZ}\R!}zHPk>JԨG# %1v6wu@|<1Ŕ.|(CcAtS g=fC-x@I>%w_.9B@,[؀1 o/r(̌CiLpcP<#5񇒷 ^lgCr)E")~?Wɓ<W2Kҝ&lKFz'A -ߛ!'a-v.Y^z͢GZ%4張3 l"-{dեHWi<쑵׃;S5-o}^@SVD(L [ַt ']̠\j}Cmhl"O{6<|."M3ddVOWǎMfḇy8FW(Vǡb21ua`qq=!N?盬*U}s{NIVI97 ;ӻV@]#5q*Cpf@ e, ,!LvNt/`1?c.yp]<8@E>SF3ۋ=.~r#Jp- dC3|l71Bo|&y9J^˷8kE~ B->"LIY7x:f >oyцd^o)K!MMq@2pуhVx- CWeH|d fAAkp&U tM^.*'q!@ n#N.!3") q|4p?eHihz}o$ b)åz~DP[Cdv* oɸRs]nj5R#?[-qlqYtŽZ_u^L*辡Ǡy)d l^4%o&)?w}|^k'(A?\2 \]cU,mO,y*#4@’9e6F8<0 .T@ܘr>kQQ\~iEqUFvSm1 /wРe/*N&wpX]zN|Rȣ1KSn:L AUz K]VA5W|"@Iz ¾V"9Vpm(Fa_RLDzb?9*51pׂ. XY|gNML aX#~HO[ P-+DZhVR,4tׇA՞%F&Q*2իZF)(8寂tLC]LR6i)2\m]8Rz1Вԓ/G8:t RKҬ&&N/T><#\ͳHeNSuF pR}(]\a^ cB'|o{Z _>ĕ(e<+uRSb2_G`?QY†k)>lA3#'a<<^£/GDQOD zqXN+z|чWEN]o| xHOvbE9gt `XTV8>g&ɼ5*nbQ^Ď%oO"9z\MmmJ8Urrt ?-fs:#а_+^m5Ha`*$oF ;i'.òv5yJ=9p(Yr s LORt~&}Zv,xR>?aR1x?'›n#J/ew/'+Kh\{77qlތ/HШ W: z|A^w_Ia><-tQ^ a/dGWp#i&endstream endobj 259 0 obj << /Filter /FlateDecode /Length 5471 >> stream x[Msrݦ^df߾znnYY@$L" '䗽dECNwDr"ݺ 0it>=z(ܿhw?ӳ'=Q`}~ <6Q$AO*L ĆAFp.7)(˒X0wyU9!qjH'krDox8TN DQIy{pٲj'(̂0TSe&&q( ,V˂%aնhՕ{Oku1+aUYnys?.8CrsnYUL*u1 Dr$q3U5)޸u:W_N@'n4W$O׎Զ'i՗rֱ4)Іg2jG[I I<7ޗO4-2 62R/u*= V%GS@Z>K,&9/p;VQzOx?-a 6-['f'|bzoy})$A!D?]o YJ84/an\tz/SuZ,e(Q;Aʐv{Vd2Dnɴ]IrU7ʋbEoU'e[)EԦj^Vf~r(h}40N4:A9 C>7ِL6g,i/hj65Ud՟`.b 1_^CƇĞ+OceMr.C;ك_r7C}vHO3T%22Aem*14Ħ_ZS1~i[ؠ1 w\:qrGIbpRe 2Y.{/0/ks,yZM5c%yJz/adg0y#HSQX[n "sSL3nF`rv"26#"A؀PAqmpn]e`/q|B؀ju)`§ [QaxsSÜ$L">'*_NO?Yk/yNzޖD36ދ߿YUn:kW 6H{v,mUda  q,GJwpqk$͖00_SyE: ŅgCRuT rV[6/]q@c[ܤ[VKp0oF|}1jriPf(cNR,r2XpbdŧX~SoOj1@&hE=Y]ߋl%rḨFU? f5=L}DbҞ=q𦉋U[}Pdw׀L!H U2,Ͳa{h)F^I[ hDD+E@EWl׶?IUy1 ȕ(>l"YIE{}D08"ŏ5ǗF* bG˲m.kµ~^ 'IiH w}cY{ ȃ4qZ?PFU wճWՍXxlc3NvH.W`D>[&o]uni)10cj꟭`+8Hȯ<2߫Uy ? ͒EycK#hŝ,2P>+ۂh|BSҔ&byPF xr,?cO s慧 ZT29en ;FsY4 mfY lK K2:>6v^Q\_AVGr먠t0mF# |AW@6:z$@\FB Iقa!eI:M5ҍG.ӲMMKcxnh&X"|W$9X jW OHZB;?sܺ]'$%LjbͿ ِ7@n;d4U |;p3+T{K"{۸{E BQJ%ΥfuT9փkTc||3 I4L/v5sM|ubW@#;pxW~h2-΄"/.b`\G Dܧ@ױw\$y'ɭ.W6NR.j|$iɌNwjKisR~m2i{3*W10kQi(a9WC"ˏUpͽTIES]9ݓifVywG1'ȸҽ uӦ\6l`F5mZ:]Q0g_kBMnԤ#N3b΃]IBX"`P^{aMc6;e\GBT,0zH>-v~/0:-y>M_ve\ ~kx6暷=+ȥm்zU´d Lzduծ $)rXkYbHQsc?WRvu8+;3nXƕ3i76/^ Ǽ/ f#VmU^7>-N!tO^PqSS q:^eʍSdLںZ_pדV4+Ub4Q~2O8Rb즜u 2l vxVo(W*uؒ+FLrAkK?ѥrMpwƕBCiB^YngW~V nѬ@a Cڲ;^AQ!{]%gJ IpPĥp=ƻ)פ<Q@ԁɫV;Y:q'qzkE:ض^} oɮ~*Qw bR65bGyZ6;8?phlܜ6/dқkc]1Lx a(6 2er%n2W\ #$^V_&',{ "S -oQT eLuMiz\5Ѱ0dE;J@:=fj#:CA=mˍ:g&$jIu|:Fa.7@Y fC[!FN"T 4zʶ8[Kz!m||7NCH>h +sM;Ԗ{Sw e{^pޅ{'·|qޚZ$?WH+ENyOT8pD_M7Cw).&Pyt$9E̩3oxOLwcZ܍߃Cz^TP$ri ~=萎s;]$RjJ'eZ^P?(G¹ lsPe\U L l\{ [̫ 4 ONt婁wTf~^p9{O/tM`^T%y,+*n(\SP/MP[ F)C:PaBˇbi5r"NLbڑ $Y.{Hg^Cmsj)܄w҃FٺLwۣm-Zl[۟y\lt:PkPR衱TaF*RIP39`?yN)>*_NfAVdihzCof᝺+!{՘n}\圃7t<< Tjq+1yFA^|bT~7UYƫÝ-J29y)ll[SQJ5N} )TRsG$SZ\G02˳BUNb0ɢWh`y[ 2< ]*?y McE"q"dH>ss!j3_4u$MbH%%3IJiPAáP&8ᦲӢ0Q߫nޅ˜LaԚ@=.qFG ړnThn!#\S9&d=mӝh6 ~7bv@bѩİA{sZv.Ģ^'Z_Sbmt56M3ߤ\ MOIȮ('_ՎԔ(\,J(vh" R#Ǎ.3f|lS cмWD(ܨՎVL!׉՞(gYrOS{*{BL:6tˆN1mߒ ]쎎|7< +l\//\29Bω3^;vzH,׷PoW$UJ6(fԻf]QHck[28#ҡ6|>Fi%P$o(r;łb JbB0K+Oȑ=SlaFt4E\D0l " endstream endobj 260 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4011 >> stream xuW TSgھruWDP(ڪKǥ.u+}5V [/a,%j]F֮cgڎ7wΙs{}sQ=mZv6qghMrizOSFspoIg F8X(jΦ1mq~{݃B<DD.]|Uߤ(7j5zOyRA*B-6jERQD ʙr\)7r 49[Zy'G+F,]\.uN2uȬ@ѱþ`]b:LŰ-Sq:Z͵ -4ZP< ?푘 y B~q-nu';>hbf ,vjjMxTsiW|ǯJ 9m։;湑cUFdD,aP;{ZJ))V_FWXp^^xd?t4O EJ#>(X&'V2T (eq>B/Z3mD#հx2鵫>w1>ov[q:mEA *;ѷeyY&9DxEjWN@JгzU\Lb dz /=Fke$!|.EfT)4m;#+3t<*]4^?H>5`0}N.WEĭGv[邽x vۇ7e6Lsfg*(AEg}PM#tR+y(s1iZcR36G{ky3^%}M "X,lCL L+ ļfi>/:όL=tUJǑjeW C!%]-(_0S/d3^r}9#ߠStT_#8)f6d,&gx*$ͬ4|'`*O紕Pot6Y<}Z*5!!ƜQބƢ2M b}h?Wtk>TF,L+GH{8 3m3pKG6x3b| fUg_[6 5l.d".3@ J>鰣NTX4 [X'٧w*Ixm5,Vw<h?ړtDRdՇ\1Y=(eX':;T_m~\DJQ+nl1S $%8,SWzba삹b!wE͕ŝ-z SR\4*.͝Rq%H0jbke߆LObX ĕGp=K4s`.ve[܍ᖰ=[B7gщ :X%byģ6dQW`zYٌK##LcF^kYM ѣ/>{[/?BekJ_nz敫 `W2~g;[e!yo<$$@|AiI#˔)CC!02IʕEK꒣sMAUqpЂo{ HN>~A.#΁0 ͙> stream xz\TWEkW&#;&ޣ1U56]RNc^hCg`+ b15h6 {vg@]ͷo E᜹m<%݋n_>Ѿ|F"_ʻr@@пwͳ.BAL:fҌ((A⨵]ݻݻv6/q>˂ ,N]T*ڵ,=by+VEYgm캸x6MO3g4Wnjb_oͳGnžݴ A] 3IVJSY5*y/Nga9V}>.9d**t#'>Lu`8E1T]x`6@WBArdjk[Rs yLɪW>;3> ]/OŮKXvyGA1iOMHƽ\;TVL, 7.نqh0'YGޭnsqQ|OOC6U4NB$Q ,7$g5"mHfzU95Ky55Td2N")ݢ<% ۻoۺ@R0pnU@5}B>$r7,).gJUVjɆr}CK#Mg)EI>L `_jG乌4KM-\eT]@2dIUֈ=+6aXͺVQ%;WTez Th֖&;SǖnVlk3z,urAٲۼҺ:V2oZEpQa]*9O?#7Rq`K7%wٖk~e XMz+ PV]- %Ei:M)~{R꘱On[dS`p###vȼl@K5r.bSc| iC sX xz̄zacmwJ?oKX'm-ʅNx9qLd'};o:L9yU"PNvVe&$IRDaG^ernmg 2AR#%5kSDފ*GV4`8x.vZn$)i+]+  Ex>s|7`1q۰%2)w$bbᐛ\Vn,Ńjrtc* k >ȦQ#Rw,]h {>ƞFcb=Y7U .e0VWa?̉WƋszM7Gt%ȲPs XQ $nAf(L2wEAՕ@x^ZgbaM'Vp bRvU*}DnP56 z9Kn 5֋6,8?)* F}_jRߌ SӖ6 j;X}ˌk0\S_A@HL6piv&+W 2hV4U[T\kKU+&7< oqs%ws .~2á 4ZcCUȯan_AB&Ū#R1;VntW@j̝' L.Y2p#[GDXqўm`#=Hz >W{G+2XSZ- ,n;@Z.Uiї'jWrT}eMA U:ҙ9rGqa}bq2f <5O&j4j IRҊ-4R[(uӣ#jSߤöR:=<p0Gwmcfe/8|ΣN\{k.LVƥq=6ܻ\|.wLS@W\zWn'$'>u?[]Ҷ0SW`1xQ_#wCXmifHa`^@Ҭ"9֫vUn؜&J22i`+R6;.;sJR;;_7w|H1Xq-Iˆ*pk??oLc$@oGVXʗ2JR|hФIT ;R6Jv+(p \99@ˠx*פma"Y-Τ^Y/*LUsE i ޠ8#jbT)ўTg NTMf:HZfŴ^񉩕J#Gz-44hmw5jtUi'b2ƯweL<7л8)i4UEtk)Oc6}%珏@X|[^uӿrE@&aF ̠(l9,r{Yloax֔bqiNitgNlk*8~O4aʦ)R,x-3|DB|D VSX0G@oI>0`;P0PM KG8xRnQ`z iu*.^caypOr8qeLr>n_4o5x#cal,* P+-BK5CZk4T,Σ9?_8 sXzO *A8"Uz%Pd![hf4@Reᆢ.T iˋT+HY Հve]慿d?BX,KsiFY!5;\tq5cS^eEKի@(X{ ֛Cǖx*@6_cJ7gMEAMw :嘳M)e~rXb0֘ ‘ΎgrnR& 2(?qۜ9Ƥ-m$ˀ\9u㯅9^g >:r@QjQč7^쎋@UFq4I4ݰ/GgҚ1#=<I } uMcY&Zuckpꋦ ͺ _[2NQ&uX:8Λ[L+抽#>Y[- Bz͉+4`uZr&]u!54אfmϸ#"j[v˃_`%S;$r -q|#6wp0v෾Z݋ re/,_p׬U+X."IK 2Q%(g=w©/7}E)< =aqޚJOuzuZ tj&d5 `kb1/awt@K+9d01+u8@5j.,2KZN;rۗW'W݅ oϻ&۳'ƾ<͕hɆBfUGw+?uc\#_5noj%/2+_!yznMdfgͺxvJvkL~}q ;ꀆ(p'9< ,w=56NFkc{) 9Oly/{1]8y{R7Q|DAsuJ $@QOIy٬Ƞ$)\03?Go0eu~ejQURR7Ya_~C 1A\[֌Xnj.[Kڃ JM*2B)7l;T*jTJJn`O6=_,he1tP% v{c ՟XT) |bH3= ԋ˓heRq]]Ұ-VA1p폟100Ұ0 Z6zuG$35?,p~8P?VRo`zN>uz;Wq( Sxlz-PhLI 3shޤKދCd;s 3B؍|8*Տo֓`fE)Ih f1`5%..+ە^Oſayp e9CL9ݘhDM^vP0 zER-䏟J8ϵps :NEH7_XaIIWU-j10jF u.oIS&N:CFo z=|WC`I-[jTV4n-< dW$ )\'(4[}3جfpj]5TnOz!N)5},y! B9-eee1ey:%$P gA9|m%e.ڤ9Y.q1o-킲@ C_~ 8Ӗz fY94i8"=0{qr\a$46R(ZΟ6P< /:_{_g##<_]lČTS}xr4gO>7 =1LVr=+,#,1Re¢2(duʌP yyCp?gD!QߚƳ3B$>>.1>IB`z8喖e@!Q/9.9;G.-EkD߬-ebѕT.R_p&pd1;la+pi%/Z5PiU]{ (7Jԯѓ89 V04Qf%Z#w5.X ~ \П ]Keɪa`o NauXt}5p3ےcɗeJ0Yq)% EcKh%$Z(Cނ"KF0@N՘oڪ4ɘT/YR& 匜46̵C טkvƅ)l8.@/i:7{/uA?:7psw/ؿg{*<luE7wx!ZOPμ=ֺF+KEgF)'.G{| }\o>zb}{)eM7'3 ȍ"/'-yWs{^^#)4U#AVVyLi^y0E+L:4(aԥ7kWG7#w>M 07qGӎ?dvLPn:7 b˜i0dLr4ԋ:.VQT092dAʐ~ _ !8/r8{9PA+.w(@8?OL{A0u<6;==ĠbZWf!ŧ;UiUP)̸H+0ZOn)6nlJ8xrhw7s0G`3t4b4z "D݁LLFBOd=̦VxOQN%?*dY K\G6UY= ڂdz9saF_(Potն*=AJ%) ӞQ tDOփ%"?,^׃%k[{ڦjYmeinUym{ͪUhZgvO*Ƨ$W8iVSgi^^)hE HLRYe@ao~ LT7R?=ҏصcbIendstream endobj 262 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2774 >> stream xV{TW1j:d8GO+ZEjQԢ(JE! HyWL%7"X@RAY-nhumuk[Hm{'^ֳn[ݳ{NΜ$$Iq^%9S b˱G8ڵqL8g$cUC QH#ldʕ+I/]R+UDDŽ*d<,*\qH:R[dIrrghLH*TQmjo894m!q[ud-@-md#i4=KAEQMp;=8BS-P %x 1.\8f5 2c^([E?Ji2X%D膽7ޒaFQLQ/ڌʙ[8ڣ p*taA,4N-h++v'[!uBѵvS˨%yY\ >։+U5s dmq[(͜;c?@H1rdP+G7 [Vu0tGE5 "={Cv*-rxS7 1m 84ށ8GrBIF&\;&~o}#[~z2 XϢLJ4|7_e斚ȶ~/@UĿj-deڜ|$+\]ߠddy95Sji9!-,TWtbT*GŅEeFc>hl:қܤl`>TV0}[D{%,AWBq-?yEUG`Y[Mu#TV-VȄ F `.N֖`9uPvM`Iyb Vprt8W v\MA/!C /*s&;NH˜YSXRXm os"p]taLC# ݹfYa ro9^}pz_( :˴O JSBB ^bW!&&DC t1Y/2+ٓԚ\5U) ե4Rg:P"ZV+=U-m:z^F? \N(Q}X آ&8ƪ z0 m5lU]SU3waB }؛9uC95T]m uNrrDČ/se{` -\*W?5?j3XiMl)bc,%u񵅭(C1 OaD6^k f}tYQ?. >3G cV&K6Q-[c8zi<Z<̜\zr6D853/A&2D\?{aw[MVA~ wHj +;T#|X x vLCn Tm3ۨ9#ۑ_vNܻ0zz ~է޼ZG4ϘLA6oAo.mN\Y&[';G ^h&b:CO`=^IEh<2aG7<=.tL~hSS~bbp=OPwn?z [3s::{ df!j >5KKLI&Z+=־hWNoĻU*޴8v +9l{G` B_1PoRB:;0] ʤ:`xSeS} dτɐ4A`zY67q[)RdYMf"'nJr֣.MM 0Am%"!?{ 7ԑ/ =ÀQS_pm hI+ڊf H b2P04-!p;bca$v G >NERCY|~T߲ДH9{~ΟASy'Ii|kPlYISibuSEՎ/?endstream endobj 263 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1717 >> stream xT}Pevq5݋ #fXh(b0 pqwp ǗBAT X42(NEMHFo%.Nhg:ywv7GϸԸ|lckҭG(y̮pиz N1⿍^;C%~Enj_M,pAEj_vp^ĭ,|{)U@Cni4ӌ4ZW& Rn)C 5d'O}/uĹ^|%-=6Hv%A,9!-)fp?}UE\8ՏoY8/f-ċsA&ju^ucH愡v,,!!lb$_)? yBEZ-ۮ 3p$@)S(^,S>lԺW,VEͅSU BsGVf{v:t4fmako}̭UBEAS5@u+[n8FWN93U<;I0"YQ]ƥϐFv=͉O8vkrzr| xH狻1ގώ6#i1o:-l J/%q'ːės#kia{c˾x=g=}0\p>'>Gi|figSfSRڍgv#;x5;l[Y5pj>Zs$:a^ƭqm4>=ݦlmsywn `c%#BǠki4dc2 g=Z%ruwml&[0==C̯* tD]cǬrF  Z x UVq*# <ak6yA:_Z{<0 \y}=oF芋a -|zˎ;~r a࿸E\5xV} :Ɇ26t*t1d]gϸy.F[k}wGv73}gr˫3:bN߱ ʩkG>,k'fBYm74t{?$ZRnkΛUã ]ec;:7aWv'd'/nq~yM V6ɨK-ӍHb }o43;`"Ma1@ff3g#I._* _!ZoWZN9#աQղS ݟsuw: }Fendstream endobj 264 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3911 >> stream xmW tڞ4B :- QT.,JI7j%]4뗦Y} Mڔ)K)KAQT"bA+"r7܏{'sg9gyGxz<+"lU⠠E]<\O{h M}d:Nqƒc^),H ؐ*;#) 9+)9<$"୬µʼn%ͻ"\ҒApb "(b 1!V["#Vk%:"XOl !| !1O~?C AR/уxY/x]pL!2^yM<sS^R6erjN2i7eY?o:mż}#" HY*kj6Z ⦡ֲVLP.WV4(JKexC(.Te T!r`( | ܢiaX>I^vmI)nu_B%aIPH i? rj%CxBkZOr<-tvH+VTEEgͩѴOs5Nsttq+ۃV8>?5Pߏ.8b]1*)ٜRQRs#wP|;O͸) Fc^˶5rU<o~ć \!lA0gWRZx!>w,ږ!zjF ^Pr D)r: g7 "7#wt\kv]Ab q' ?/13H̘I,e 3QTZdL*n.їte^\ )%W?؍^UdVZ39ߩrT \}(*XMfd4&!^) "}LLJ7$'ɠ__]$ʬlKxOvї^*ו#)-*e)φ!< ? ukj iؓsAu}?н+FsɂZ5T\ z;YbK)|gїͺ=Q wX~q+˃η !u؇㹁]ƛs =uvU#GFO8N0%oj fLFۘWr]\$H"Z@5mFKb|߱ lĉ#$_嵻v#΀Na'+uJ)F|TM&$%3 2|ҿ#H@G L `f ͦo};ptWZJْt!wx7N9<khwYl]3t)b oKޑ1s{xWԩ:k(wwUٱ(%_}AkE-I/ c<;WRu>́B!L @lDEJw#sP͉0:8]]іjCU2\)C(;odX{ma̶3Znw i1d}⁙d1y?f”UV ^}a?e [*31ʪHS;0f)2 ^X>Ro446>:{]Bmkm!^/MD_sjѻ(A#1GَD[bCW2!ΌhU&rvk!S«à ϧfK?ͺSo/r҃9CUU\ aqщ>B U̦]t&5C՘V+Xb"=fʬ1WrFKUrcDSK&2-5mVs xm;;Q,J&+5rPva{\Xn(")uN2.L'k47TZ*8$*7nz*$˒Ci+^ cC#Lc<xjiZ )kTj /+/]ZA9x Ww-Yt]m,ϸ8dlؽ@,,o /_+/O|\'Dc]\zzl՛JJ76ySDF\DUtkeA2ةے(3#\8hA -$ yv>xwm$UF)7󑼨bs8{'U>h o &xpbSv; qG$ud 7-=(q!7:}x Ƴ»(<5%TGejFڤ6hHaDWEbHfZzjRj-76?dy}{Coc cp0N\FԂTGG @@,x~+iuO[٫;24(ttwr`Ͳeik_Eq׎c ONf?;g 6GnJ(et:ϝPX(n[ XY\,{9OO^e``4GFPqmrgLBlJ ⎅tj{eS|ض#j5dtg0/%ףuRQv?w?]F|\^gk qccS#[endstream endobj 265 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5570 >> stream xX t՚RU옲 z.( *ʢ c Ȟ^N:}{=I !CE$Sm83s;yͼ3 ]~W6x1$U<9eJ{SR38ۋY`x&>q|l>6ؠ܇痗V[XZe+[~ aS=W^y BbViK[n+ܾrG^ѪKVN1?3ɏ<1 #v[MUDel50 {=-^b El:6[ĖaX6r,Ɔ`CHl6MCXƪ/t%sAY#4OP|Cf cĄ##͌w.wκ-S/X޻5 hld)Ӓl>͋|)YR\(W U!*i09rǩ ȍHv5F9EpLs&o0 i[;izXMmJ?Sv~}љ[HThweƝ+pwm8>/:rxD,Y_E~; U ȣnb,<hT^!=o4Q"+N4B:x88Q{zvIuZr"w%"\F < W'?KP@?ϻ&('h?K@= MM'iЛw9I4t\ߞLsRbO?p-p$!UZ~@!_ɟBUR&nO;r &7p1etΩ7]~jA k[NOf_ni Bk %a(M4=Fw.|΅9_'s#0"$$KB**`MJ3_ƃG빜{ԷPk&qW}0/͈~Juy(6k+5&=sX DY:wҟnKl2Ze5^EjCoքv2p^o D1 $+= Vkr.r#b'.NfO†9T{@{8Ŵ7I.w3nuTQv ѨjJO7rƃ%Ӹg/G0K'Ա_ .*ML݊h nU'd>蹜'bꉨ1.q 7+TԍrsY}x!\W?9+6ػҵƹɪ6k$ Ej(V܄X-ppKVF?'(q6R&Ry|RT1S翺u}r UQU**eTuv2@,^ęUJs3>[dNV,і$Nf|̯R< y7~ϵ'f41@^ţAg 2WyJq\G78P@M[*xy4 1}dA:h VBq9)9Ɇ6-*XQ" Z\n2 F})'Ȅ+=C <2Iu%wU-p[l*+}2ՓBW;~<~#pT`&TDM"]=.HGp84g7ji {_k鳶=qJD^M1PE}wQD`.pk{kr0_>t4ShWmQ@Pe9sjߐQK$V@[-S =zykl o0 %Hk' H |HRxz=gpqY=;ۛ^/]7czųO>Iħ'<fWz"~Ė֢T{ 5` Kp P#HNA9X ݌:t _^:yv,m>Gd"P ޢb5YSHD)er\k5`]VfPDGqF3y+E_A?w%[Ұ9tFỵh?d&-xuk7n̯c x>زOƭ,K"6b|{ݿ_Ċ& pc/R~թ?*䜲yHVsO]평OاhD8jl x"U0|Xp:"]l$JK{%$%q{r O׉Y=-s(U2W?N65Ս5ڨzqB.]qYUtջ6Yh#v'G;`&Sћ(EP:P#VifLJ&) ,&+he+x[t gxC DBHt,e"}#GO>'q C?e?"yxz@/`}cXa<4 Z4GU"TֵqXW"fO>:3z}n]IH>'-}/zb^MP^%:q<6ps0?K2s'>)#"!sqEd"\ zGk;:;c [[ljl'6̛͊U3]=р+X]za{,87CLG??U A\ X2S%{<-f#(EJ6oC\i9c~J¿$b9cUnФ} ~RD/Y[#Ry l>:\%~Ù70bl3VuxB12{Y2cfSݧ3. U*|7{}r'0kpd+a5$̍h3ڑu #5,\2- c/.ƕqw׊b &pևke8M*QKp7"6}áK߃#?i185\apeZS#F&[Qe~|HTy'\\mZ[BsB-")Q˃B"<{zTBDBP |1yl~DB2޵I{J=tz<8Ua1/~rWҏ4 &WYJiIauʬQk@I*o8L$dƛLȃ_\ߟ8 \hWz4se6_ԾepӸ;(z2?]Acɟry89,F Ҷ3=E//xzU0:PK#opҏxbڇHFrw?MqKZhJ(N[F+⤇< gpq S`\ T䖩)YIXD~]0d}5v3uu7O}PXLjz,,+-m9JRlG,GGLu"" 8g蟑ƈ7AJmX6PZhhwkcvڋ:b=n yM5Aj@6TW&d΢{[icOiV:ӿߢ*,c 31L(OqY)ya0eWu6PVКRێ/p{8HS$xug5:BWF dzGs}qi^.#Vk,;wwſxk֚K֧۴8Ș: TKt60n÷]LMm OYTu܈snYE8.p#ҹt@@70.8u sȠ#3z)v#(HZyGQ Q+{ɕZ4VA#ia{{ahWyԙ:Ǹ!,lBɇS2a,fKe:AGQy&'o#h{ʽv0 b5̂&mUH4܍pH*УYW?jp@LT2d~i /D}sHd- wߖ~dؠcUZ3iݤT3Dѻtإp|߶~GeoI 0&QR|f]uWU٥I5z(0$DģG)O@7X)Efs `bjUї8-<k:rs:J+z$8:@r(e"‘K|@x"@u5ª2n>0a,Rsw7`'YR .k\O8{GN*Fe}Y!61x6gV{h{[=16T-zS@nᠠ6gHĂ"h`o Tjv}dH\WbjłP)~uZ4+(ŜW%zZ~Sh=p,P\f#.6]Jf0m@Ql‚TPXA7Plc˚6֒<Gz/r٦{Xn]ƳM7Le䜆QB⇓^7FTCq ҘDB 9US ,PUgʚnȄPd@b@ʃWHDgĀNAM5Id&UO6c1~,DMCχ'\tJ{9/PQ/-X80(Dفbn>r]8o\/Lxޜ= ׸M16uسb1 L\Y p|tPAOy[d9tȅX)F,0.P |~WxqX*:N+Hٌ> stream xXgtSWΥB)s/!МPBT&`m-E.Y]:l[,ٲ $!!$19yGɚ̼5ouG8T\4!$\[D*>=Cgы"8^)I-4#}>(jtQT1wSR\r-[n[*Lyqow&8z E SԋejZAVQ j55EfST 5GSoR 8j,5S)EESd5KFSRj 8"؈w#ǡȷ#}< ~s=k{ҫk}&L3ߋN#=;`*˷xPD)8,!M# )VC2NK@A7Uv@ivZ-f',4ʡIaQ/veդ@)JqQi"^jMe^[F}$>ZܡsklEPuRl~7OZ'KGk4yEE9⭚4" Pt Ek$i$Pg8t!%4S ,n2_;3Ė6-ھw*M2y;yY,ո9g_By"\n-w_oQ%l@& ܌GrPc۲,4z}ɔE@Gq o(jMFd[:B&-ݤ%PA55"~fw]rӸhRYdUE$$)Y&xD}OICcf8-/qbtUJ4/l*nhߧcⷄkŬhVllR4FAѠlE:t` @ tG>m6(EaX=⬻Za0WE"kQUu 5, z`q U|y5!h40#?MU\*iD+!j%S3ziVրv,to+U[PeTjKx\&_.7J{ ;mN7LNjL;[ SIm3hx"nw!soSNu&a]|nl}㶙4z"?P :DAB XTz1/@ZAnIME]eEy%[^Y^tN[/>#͎hj $"F6@>5:Zye꾭R)ˣ  mv|?S孯 ګ+uZG QZV~ZY(% e֝VznS7H5A6,Ts&V`oڻ']sB|?" F`W%f'oe"䏡@F1}svZ4 -儵 +''/p QxdTUD9WY@hto@MVE8%2H `Yo(w #8kC3w^6Ȯ )jFI8 ]{.ZEh + \g+Bܶ~iz ='xXCRWe0?%dAyG=cX+mOsC}_($jG Q<1-{w}4T2v#NS#>_zt\\ZLjr^,ύcf c[p9(:y [|@nC2Qd׈zt/QO_n<_)nꚃ:?kD! و\y)?& Pm oа)"_WC2I|5@<ߠVxh<\''KԘ4PC]sCC=(`[DwD@N]VfNnڋ7&G=K,>,5p]T^W3Z]gl6bJѪhiEJN diKf6 C-?JU^Z@}a#WSSR Ty|L FpJq|p tS`;_NojYnuz!+ʪ5kk_\'KH&-D}@ZAl'4Hg;w=IrLzK֭ t:-T¬"MzB/5sgw("ˡtA`#HݖnIU42rb=S/ ϡP"A}Eh37yDgdUo>~D%cD|%&_Pg-_ytT[!Ѕ/{:qx׳_T Hoz@]$EW<芌J>S+ J`g |.-q:K]vGǁYt*K,&xvK4?{t!$7/A#+ wg4 -:)CA<=>H@Ff̦DA>e4ߡׇǦQD&w#ofzqIQEeendstream endobj 268 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2754 >> stream x{pSeOHu (t⊀,[A (PTдi.M6vNM .^.euGWwV\wWN"qz`?`W[$47ljf~YL4*KE&ewnMn>_ n d&ּhlN8R[/L0*Fƨ= ={ӳ}d5^_O:,6'QyBn Ey9p{HZ .o\vtXBLٺYWDrh.kz"f3%$*2g&N"z".oofIWsLI RF}ҎТ4yhC6ujzkwkRgOfOf>8DvExcSQi;\TGOC"bp.ZXE4L Q)|փF:o3IXh֝uMഷތ' k ҭc>>ƞkWjیz3a5`:,;wT2<99 ,$~j9]TK85xӦiira%sN[p{8H|( h@7v}NӪE:t.K sgH~/v@7téϔ<,=[0[NH]:G*k%:xY?}$ᰭ5t  ?sN p)D?k(Aa7Y JZU*ЅNu ŕev)P0y n7Ġv7WKʚ[}@K!ѶLSV1"z1fC(]l5|ɦMs EdG v,>rBk5 pJ(svծ'S0r1Ƥӥ#IAH!dW2ι\aV:qH;b".ҥA].O(F[] "l4ٖ_9A_A`~&e7Qɡ" N -8q0mjfUvֈ.; ߗ^/ĂXH/{MDk75VTEm?5xLkL)6IUlWWnQn+_mVS  pGC=?4'I28|`! 2̬FPW3A6D=傟1MڛHʆy&+*MțYRA0U7+ `wI: 9<mn*ꪎ]W9&Yߺ ˓ {.8w}\'z#=l85~$O^y${{+8z]˰6 ſMͺCsٽ "7x,5l,7^ޙQ.M~׵}_2>lia*E|H .Xf }HU1մ?󅂣K]v a\,"W_54de^6AƓn}sƥ|*:6D fr8 VYFP0Mم]1?Џbw^S ,eIa͛^v ylxiMk N)nMt~?KrΠy7Њ=cVaPl\i5Hަ! &)wOHNB.=z>/a;۰; "pqc"|jO,8o_?N9:]}^VBXEjË4 wObbsIrԤIoE* endstream endobj 269 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1075 >> stream xSmL[U- CɌ a %Ӎmj" 9pA_6b)ziG)0'U" ˜@BH%PF'}$ںջ"/O3d@&b|D|"I VceNTWWgʪ3Z֨nQ:%jp05Y#5mgxb(E͵1YkbUc^SjYfV59UQ4nӬ԰V8#{]v&#@d(,/ 0<%"r L2YLE;/#2|:IӨ3-F9 _8gn"FEZYRJ?o`)A2YX}vhwv[&oLM+B,ýЛF)~:O>h^_w| ^r C_|̌My&l[SQwfH9zB!v8NP7 gn%/%UFfwݽ8k tp|x2 #etsI3t B"9>Jܔ4g enlXbqy۾Uę\<ètzz ܌;NB\^u>u`jd Bah<8}'ϣR. %T!<x6zcf.s´@m!2q_7:붸 hjj{ÕW>*H9G衘oDxi=݆O[ ?%W촨K񷯾QLC 9v*7gwީQ>"P*^7+)|+TYU˗S @HSB"CHQI !P._*]Q}> stream xzytTegȭ*%w)ɾ/d%!R}߫[T$ & Ktcc3E_77̙3gsrsH n{~&GpANN+欜?iLOޛޤjm7e}:9 ܅^w &L~xVmu]E% 5͗Vm-^F7g7i+4_PQPYHUtɖe˷XYjuiL_z}wON}J x@D0ET`!ÂG+ V <.X#xBV````MSO  <+xKyB E/ LbdD'G/ n"ZpRp7;3q7a'Mx?򦪉o煗7//θ5{v鼣g<{tc2vXuwr#3My}uO*?u_DsLY90G>藏GsSgMe{N3}ߎ =Ff'eVʥɢlҊE;WFjd.@-)R%00=IR`n5-%YW3 U%GN_փ ,z=-&p -j*gBnQ  j=Bw"Ďg' ^>l.`Oه9-rQg6G]fyJe;imhP3;LyM6UFڝ& Ly*fC/=I_$C F*T&]@uPGn/ٞ?&I0EcmQh۱8J~gJ)iϯ0|`}[ ߄Q7(8_#L:Fj}D*RNMcp )3mA"E3~w>M>QtmtTZ1Z@\ s7=>jR "vzz̗ f5p0sN|ʲ J7\Y3AewӒƀJ&kO*Kgb;ku֩E\0 PZ h1ܥnoVJL+$wp.2[Ջܛ3IFZ˜?!'/ tzvFmm]xdazsEzP/#$}%ıOOFH %!SS뭍@ۅnpc=ݞ~ XRt6l(6˞[b6ҢZ.hI2C E!OIIz>|J?D:%累cƧVUu7V-[\ Dz Aw>|lC޷Dߠ(m 1w$RP# &)ZS12~s ²L̴]BE)iS=ɮ+J5n"P# ҩ7pmڃ)zC&.9\fy!N/:_|ȴB–4j^Sio ]{yڋIgt D? :3NZ |I{Rr7{G#&F B^3um!6S^PӢAcOUhkq*Ʊ4q1Cw<M6=-jr0acQ&lzA3~#H$}Clwq/K81^"Ʋ=N4MƼqw i+\rR.jhzwDcwWr4M<+NR͚RYQ;b{|^@8K7DC p(T*-U;VfАom>F} <Ikd+W1V_>\l #y?ub#BAkS ~Eԕ[*jT5w4 oaL(@bF1πw?b4D͍ 2ڡ%a0ڵ!m :C T5?4:fh=REnSpĵrm| egw}~nGo$bP(ĸGdCL0W|~TnhSH|8x^/z2lRn$ý.0> /f)kLR+5k\!Orf*[hwT=:^rjrjqⴓfÏɡ ܈|?aӔ)[ir2XDm;Rx:s jMa "Tіqzn֤]r@^#an B\,ߵFٽ@iW3yMDSęai펿p~ac#eD#u7?CJYqI7a(u5JA 1(|Mب-_߯#iGi{F zc5z*4h 19i mCff}ĸ\M0~t@6==دe .,$Q91ݙLwJh*Tl}x{_v~ڟ`=ɟKB`(%>']и. Ti)[&DmG+i! CtCӭ&B:.4JSsS DBu0^+P'ӓEgrP|P1`יGGOxR.UuOiT@5QW\k4"Vb}0CۍfK/0A2ap5Kn4V:*ꅶ꒥@Tا%޾|'7jƫl碗q^U]a+RS o)C(opNZ ϙ &FSb 5dόKjfynaRVJ Դna¢Uua.,n^p&j:K P\uV^fY \c=CmyH2ޖhM2u0yLpHO-fd Rdؚ׭?ٞ&RNS?ηr{YO9D(^S0oI~{[&EƢA{QnS+b+š4nICܷ*QVTXEMj{Vl^[N݌p]tj޹o}ɪFsXR|SƧ"=qTa.2f-gI>k2bfM^J>JC=®Mbl _ t7yԢRim5{Ej4W5nQ+: B;B;c;vU[`qYyu3k/ڈT5CUJs^׭U8z vnC2w_0K&Ǽ6y2gJ>NThfBQ_ά9zОD(N.kuXYJHH/\Ak&=-n%7i*]IBEABUU|Oz; w\D$!0&~q)+!Il2cбáX'jPs%/tUZiq\X@oh[=\`8z$l ڥ婥kIB}BJZl O)wh$4;!JyDBlv !Z ؔ$x>x[-GqcCc}C3}sɈ3&NC$D7~ޱѳ-GAĪnLakde2^>=e` wDwy|0y K _lc8·lbӞcp;jv9qSObZK8:wܾi}t@fvh{Éͬ$K)%Ռ!$a||yT^nqSz&F{ nPF.^aއdW_<_6oǵK 6RGXV.0(~7qkpMxΓxb΋ .78{\īge 66& > 0 3kؘͰɱd ce<&XF4/s_J,5j'ak&7EHX&n@wIlq;tQju'D^6!l| xߐCUD<ÓEW) CKCO܋?:b=n7H9j4Y;y9@.ozoXX=CӢKWDW {["n?yL&{b@nS==蘁e%w'YX>+avbÕDrGh5:t$(GV! ѫ#+[)}SwW9"?V#8Nyք͢ ?=`d?E,@uYy|Ě.?ڮqe!OQ<8Cmd3ژZYW_08/OQ=zR6w2-w _9Dw̘02JRRRwttulj+R񒎲IRޜ?[v4vnIuuNUg;1dATьgnvDÉ'*F&& yQhC==|bl];]Ժل=H8y)vsŭ&>l0vDM2N_43VԿRREWmnr!@ |~}>]9 r`}X KY&.j]z'\ P-q8ۿ3x(W b]!5aLVZ)e$7Uֹ۟~xG[W7 vð˗5[zUuƒ~:~D=qjkWdNϜE/\nU3[-NSՎgSԂ is eF&]Ƃ{:k3j?`_#Hih-,Lt6Bbm-۳һũ_sgP:|,Վwc W ll% q6M+$dopfq]*ekg[^ӬsYX[IC #*jsX-[Xmj9Hp@ >"u£m@U+_JdB`mkMVh!w >CbS.&R״tuP-}t0Q>ӕ'[{ZqYEb.i_Pחj[3,. X)G5O`sXg p6̧7~3gZ55 5xZn&rBUGː I矘?Z EBW6 0nIFVm" :zϸ]}YZ՘kM>kٝz`po1 ˨Z^ڠ~ .2v ToۛBT߱=?F";:^Jg~2>ݝm:]%~gbOjA.u05KT``Ե]ݯ ,{?sw)Ļ'a )TVKc%ܹ_"2,IVi픡X=KҲ- hi[-*&WPT=]Õm܄UUQ@KƤSw__hQHmQ5x|$N3>T ?Տ٘6J{Tt1wI.7\D^D/wgnjѢ P4Xnk'Ę) 'įU+`BPfRth φs\'g!D/ PUPV,F}Eƛ5+hw1ܹwi17i_g\kəM=D]-߇Gc\.wd͓ӔUm\#PP>FF0 ^N]}3I7$S@X0Iޫw9[l,5Kgp$GA(=i]v9B~kNtOvX⾤'sdhVxs 8p,^K_ 6ZkeQ(ӓ*ȅɢ14SFz#3 ’B{BU|賽覽)Sj[\S7661frÆp*9z-^xz1v度 JN~;.@S֩"Eݽm+mg0GܴIE5VUI-XGq׍q*C8c2SL8 aHżIdanҙ?pn?, Ob_.H'=&Ԓ+d۲+ QSsJ욂&mvh#?Zմ U]3h45JJŎrsi"n@oh‡["=@f7ر`od7O6gs?ݿeU@Iݾ#88 ZvLn)Yp6) 5X ŕX xqX"7Q"yȢȜ%4KDwZ3(s߻c!yo霟'"chǙ[}iNvt/m~Y'Zϧ%?X܄[[7ZD'bsϾ"CS~e}^5 ;52\,#-sW]Yaw6$me>X#ilVA/v'/: E-˺Py& F+QLnv5:"nz#/mTՙjwhL[ 擈-YI%[Ipա#K? ɀuW8TCjÆ}I>EFió76h*\Bwo'|~  }r@_6 B[r'# 1N5PEַ*۶u PH\e,NՍҡlk|Fӈ~6GomϽ:/[&>sMdP'kWmtM  )Lp;۪SJJgS`k?654EjX M_bɒg_vNt:@wۀΎw>JAZA@[-{[ֲTCR0Yi718 ׬+6W:Wڭf5KM8I:.p5a݃,D|C/pN Į-@6TfZv{heN)郹YUXkStFn57#V,P;{w@=^_T25[O.‡dP؎|#?z#>,88Y.p9~wsQ;~ɓ;^7or^qq*5Å6iZCݩh|v[/:$x?{u K֧OC.@?wBI:g CQ2crڜ83)pucZ"dW18D}_g~k@+H\m]jhU`- h8wW9jMٔli|Zow?bڭqB5&9_R))DWC5To^+71)C0Gk/٭b,^}c.-i(B)}D! W->lzБƀ-L82Xw JgAq&a: ;Y@9+ Y$x @-on ϼf >endstream endobj 271 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7689 >> stream xy xUvB%EC*"Qd-lY;{'>wz߻v6& E3n#:=ݬsO:2ԣۊZ׻9yžJlܟ/\c=?C{/>^҂ҕs7Xn=a忭疋Lv9 F@:(M3)eqqavUAd&:ý00Q*x&IS;\.7<%Srh@p}!lj3f%_  c:Jvh^Ѩ a!|s <Ǽs:YGEg`b> K4ۄV 2.6PWp"R&S dT18H7o\l$ tK.U,$+ 8Y_ Hº8ImdMS5g̮z'p6t8mNoһ= cDNÒX $gEn<%ra \!SxFʥ<{-lf[h  H-Ҋk_-}AoV)EZ&m3ODR)W ./].~*sSTMZ8I3Po-f x\,8GRm\3ChV 킨>ܸ)@/-NXQ-ejU;9 ؝/_ BdkԐ2.xW!fgqqC:-i?Ws =, qe8rGNLG&.7?=o}Ld v])vq6:}n;cvbBG?â_3 VF|)XQcm"2xˁ?RK(j28ɋ++["o}~y [Lw8/SQ#8(>LPRqX.'Jw0pd`Yp*;aW^GGK<(&ۿTw \JWvt-B9&JB( J4Mzb22x?iBf,}j<%h%}/S4dfɰ'L fRx;g{~>@^?>s U-'-"tY$۸D@uZmUv f_W,}A@ף{3*:LRU:s[aI W1C2pW`;9"9spHDijo\҈Au9/8,Cpد,\d2Y]i@d쉴B2\K+Rtv2g8W%&|3OpXUPS@FM!"[9͎o{$b.L7zYM5V{~f4E$uo*I7xrQÇL1o+֯saH"UH\D/Q8[!۝ӠՈ2xԖ_/[>+<<< .k+Uoo%"9r:C:.$8$xؒ&6@m *NI)q~d1uP@SH'Jwig3Emx jB0p*a4Z\JWu{C[}x=!Ĝ2;,e*"i͈]j^:;HFRqu@Ԏ k㙫}I@ю|W_}& |qDQҊ%ލцfpNz ~SAYF82$s_;{tL[Lu՚UUKྒHbqm+Sws6Pwv' Ymq@$8;G>>{ƴVhD+S FSWBX >~.@yrmRlie+3qWe峢G|;;!OHI@9p,FST '>5THH("FOYHPj0C6 ~V=7 $ڄBǵa%zp Oܑӻ>}?ofb-9XLG)@$]/c4Hyi!`tHs&*qkʪqh~73[fFfum`;wFOODOTͪ9fLYܰbPWSP ttA HfUEbV 9PBL{_A@2fg*Txn ,:k4h]_S}-_##H}M(Tcqs@8!~CGفMBow$L־qxL1Cp*bBWtfifnB>d 5%"O- &DA;E,sdK>(}B<Ϳ+8RdRG2n;5UV!Z&ǵ],'9v"8 rT!]9~SH~j¨>vr%Jv)a8lp;ζ b̝ 9x<n8 ۫kWnړl\)Ę.Fk 4EUxG _}a)D\c*H_{>ng\g <$ۈ!Lr)+k@'D+@VRO&Xf_6t{Ӭ,sw-n;S/gRjY-~,%Y \sK֟}t)_t8= z@qVjI4ٚUahvW0oҧU3҄6"Hƣ6ƈ ^hJ4"OqPi}:WwCyZT{ӄHB5zt=5"r8h;?|?aҋF{٠I-;4owЮ5K]Xb%IԽ/"~7S-21q_낓P_ȎB :tvҊez4JsJ\ۈ%_z[myjQ*@RD^akU;I3vio ٩@]$r,?F4fKZSuXE6^ϖ˭@q/ORjp'(h$ 2+&XFfR!>2  -IamK" aJZMS3`DžBw|6f^v nw=shmd3e qˏyfMH % uEY0bRGdV~$g=gd@׷@"?CBWśҼcXɹln@rf)1W4}\vVaT (y t=1'vڍ˄ d9b!ٱ&C c**@}r>zS 'r|ANbꀈY£Q"70_*9|f ㉈dDPCovb;ڧNzz>xG(I]P5k4_`cNג_^7yM\X3kzf #hc>[!b#Zhqn}@k\{:WSY+7FHnj֯ y6PI A>DmЦ=QE*0[zÊw;;|O\Y~-x-(P-A;޺ћ/mtķQ^l׍J Xm˾S_Wֹ_&Ąq˧|QM#m`G --8Bfi,_`|oyqFPM|DXϣ=CBt=)T >AM@/YU?})XORZYXm pxU]Ul߼i/IM*²Ւro9KM@p|d %2gLQK'bf DV,Oc IyE Oۼ1Bၳ/IP==TɂT0C "nI&`ʈ۩xz/.< ' gk+2؍I?7M2~m)ѳo]~(}y;LJENˬ8%cgzgN"A;igF wr)Eo'uCM)'ȮMtۃ F }x\Ҫp\2+ [ o묍~5PALb![CPC1EyL1;@$~Py4G׃`əYK ȩcqր"4|m׏rM& #5:δp}G ]Wl$l5o[eWK&o!x4$nkt_\$sVdh+'RbNO+1HtV gp:FQlw;8 @o|瀟7endstream endobj 272 0 obj << /Filter /FlateDecode /Length 6950 >> stream x\ݓ6r׿p-Miy`ωSW)$V.HOʺ8 Iݿ|Syx Coo7/}Y߄*w07M[c47o/~c;הyQ4y; u6⯢6`)cw׵~8u{%SgS;/ z3w'$ c{H;bBɦ!c`2 ԷE`$hV9ϷwH`x]xoeYi;?kr2'TX.7dD1!nTx2nSS[&3Lm!\ Ej}}z4k!,Ք=iG+q0H讄MrsF_:H55lieJ>< *ZߴńwF<|ؑ%@Ƭp~ktNi8)hKJ]BXk|jFma(eCۣA(ƩOOۄLnY輗d+KL.:vp[BO؇8iILjZz4ܤ%l`pmSɱ?G?rJ0,*. u8}ecџWU )N]iS7-}T KTr *Zt,vMz@u"@;B:EItI`oXzȖR0Ph`U\CX\(RiZym1DͶRsXTP #+w qvn 뷧E;bjlI'J@W{Dd&~l4 \seN:.hFEH1hsz rSM=7Mepm^6+n#l]{F"DW=wiPB#\:_10*r j>#nk'Bd̯xǭ1=uxypܵD@ B *nY}" S&{1=jc\/!:8^n߱lX_s0P0w+--|w[fN^2v oh)۟(Mˉ^a*AVK5Jk8Zr0- cL4^_d,^oRW ˫HD{H̲e.уYWmzNd_i,(\F ,"\QV p`w>8D\3-?uޯ/.P&7zt;>>dݕQYx ̂)JhQ'Lrͤ%jݬCd+<- 襮^o>M^v6CDJ?B&a@ "@k_02PJ:]t7CZ+Ǵ RȾ J2.~:'%ꆊlVw˘˥JI 6v'EDDY2kT&.)ʼZ{(نcQ*dc0?NoCT.!-"gSRCKfDbC(0bP7څ,U2-2KWxQ; Y& jVb)R c L^D*{0;⪢)r}y10P6P a~GJ5A@>#݆:**wv3 .Qb6S,?|݈)^:;=͋I>|_WY\hxC^lC1Z/UN(G! aTF )r6Ri| 4tmE"ijr*dX } q/KDaCT {*V* NkKLj-h9Ti.M!_ x494$;D͂L[޸ +0k)56X' X+^ "[De˂]ӫ͈J'F ;aR=:oVY)y6F&)]l"n>\Y#6uy,3,j>K` 5y EZ]8`iw8YɄʗù}w}5, 3nۇ0uy۱[r&"k,a-y}Ų7Fx­\sULk[ Z;N䮯*dRșN?tKgJHesGf8`;!+E^7x8x:lX̦zf`y~o2 ;/>*#&64ΝoA2 AoL{)B%x{$ q6Z!U:փ,+ +S:oтK^E5:ݞ!"os;1{s 9K^| H(>8~tRt^4-BhPAcUCuAaP4fʢ"<@ NA83fѰ=ߠsص7~( h_x/M0+:YH* N ^ @sdƜH:q HB q׋p*s&k:oqfRK;pYB=vȄaC &wǣij~*uZ&\RubRW ?E&MwUMHH*Ke]2LK"Ux_@Euv$DaXL|6}0 aU)褘8p#yLy*nл$Ԣn;$VEQPx1'TtR (#K,2̺ŒYc*=Z2Wr `w'qŒK};)*z]xpRi=KVRr]4+>nG S\nի Ta /89#QŹpY&Zpmj5N˝RNIuX=a b~8E 7O͕+[չ:Wb݂X(υ 0D8CO>9EC՟Dpq ^kO“:Ϛuha],dKp״Һnp} QT+@*N\|ձxfN|M3E"" )\I5ձ~'#j\ a!iԃ2wv)Hn70C[Esa hrN h=Y?{zN N]K{i UwRh!]] L᠝R)E o)Qy[m%62Ed-źk[@uq5N3}T R\m0N"`.HުVPc?ԫ)vʚT 7q Թ#8{7?6IfI7_gN # V"PjOɟ>WyU99.YuP Gي0n4y.Iy{upR/fuG$WǑ 8N^ tFחif0z9w :0^FW7EQJ))+ QV|W H[rd gou/liPU. #+}xݬt+aI*:,ыINa rU4 @a>. ]Enp\R4kQt%閊 L(&$zI"l$EB )L~1vv+VҠtzRՖ4ե U1^eBDxg7v'uCSYYhd#R˽N""!1 UxLEs1d7UjqꘜqSxq'; Cbdyc0: q E(_?G6ۨchObeP\ϟ/؇b܏*ːWq_?L Vq6Gg*i6~}Z {&endstream endobj 273 0 obj << /Filter /FlateDecode /Length 5799 >> stream x\IsFv}edG\e7apKHz`Xt Cz%K5H6n*|-<.aſ*dsfuus3(2%Ur:\,(,_W򓕌δ V__()7;YwP5k+|Qnvi) Nƕu0*l-q lyCݕ}}lqoKܵpJlqO Ο+Y0@J=066K-Ėxus)-Gw аx7pxbs< 6ti/>--meݩ# XB0\(_z\qSԫ Nrpsj6V!An^41L2s#3,(^9tg0_{ ZK8u6ɦ+&rzup<ەzGc3,V|ѤOM|F%tX'*jί Fa-g+{tPt[$Lb0n-/NsJb:+ )-lAfSxQ6%ea@_&>R}np*t[>bu$*8Pa?-KkT/B\aPtx:G^:%2 B*lLp~o[\̥zaIgA (gӟ JZܵǻ(Xԑ!C*82v[ף4̊T@_79Q> ,Q}E)݂n಩c'#{Hy)`{2ş.^(P |J].WғOUu`GKVhdRQF_H=x's!L)O|F9宰sB4h`U'{滋YHH*M4?`0ya>^\:%ɓb oFjdAOAܠ3+3#M̄ O/nf./p./8,i O(2.y]1FpNI9H+(K2w(L K6S,;jG[uU{d Z c<9-~|wȍKWI|T>|Bڄ 8gj̳K 'H.lPe:\gDZgحA Hz%Ž ZR_ >o `>5 J Ot[3sR}13'C M YyLs:HHiv"L}|>, $k GwqHr[JS.MCWݘļ.9]D# qL2n͐E~L$Na퐠}ʰ0a(:8̮WNm t5b \|cXqGDYq>#*CЙM[Q+Ҧ4<i#po*)xi1 4|t)e[ȧY Ȱ~`ȝkO{B<-fG@hS|nܔ,&1K8iǼK.(y0aiHa8b^Sb]1v.^@J!R˚zܐ|1ó;tYjfH(`rP:@`8)з Y_w6z8bq>mN>;1Α%԰<MƄK8X2UGV.7O})؉c: j~h ^-}\_dw2GF(M͊QnkQ g7BǺ+܃mJzn|d- ߍvU"~&OnHD-8CzZw`G ~pM ^Ohc-Kn 7 mO4?R ,s^.&&:I^'r9Ez)Gp_+Om$7k+E y#s~ rAQgLwEd)Wܐ.t඾^$mOb@ϴC{VPb/|jC.wJvi\b&}U%5JޞTK)Mp.ŇyM+8 qFd(LxDդ ҅Ӟc ^{P7*Ue^5;$B>4(tx<@%LCfQ0ڇa_ݸrH(ĈbKd(=q:8BiL_/F҇IlOGHcr.q"3]fZ m>Z Utag4UKGW@=,[/iB ] et)qC#:/Q%=yC^Í4m%BC9D3QL3gj0;";XP 8<Ꮹ[3Ϥ> cRsL6*ۮ۔8ؾYYj,k+&DQUXp))*g PKi^;>r{*3~9гs0˹ t94#qŐY a3X/#MW{sl]|;@Xek.Nڷqs7+|`\][mMNN]F/E4B_9V 5&2o.)N] gxD#8).6?h=7΀b6.l1G& 8M 0f ;sv@ %RS/X(E cbٞ6,ZnM0>ZMPF=Xs: J18w^fKxV/(}?967bUEyY1 U/]3]<xOĤ\!&d$'@ ǡ&&8⏴V LI\Xx1o &ÃDfi#,4r0EcHK梐kb0W'#n,/v#s^$] ZMw6ejjʑ1J6j8ű@3(?z"Zʋ$jT 加W2rD ڞb>HVm;r9f.7<.'u0dG/Q$x9wO8~ndUl;b`A QV|Ą b|Vn\*K/R(R[sco`¤un4Y0Ͼ1E&H0;N<)5e8\NR{ӏ>{>&V6M˽?۶L0ž4PK8]Uٝ;P>^$nD}`S=g?8ƥ6H2[*XG08ņkrS`j"NgnD].aq9lN\Rl a>ͼq1+v~0P4*FƁWܻFّ˧j FR- :bUkF(8,E!xzW[TM38,^/ e^s|qg,IeILk$ MzJI19u~Oǖfځ5Fm-կ,x,/wT,=b1$o$Gk0r+15զ8ěޗ4 n]ǧ&H^}<]i!_Nit_džj{ YMj6oś7?{{#²bs@εOBϖ+FYxfe8_z-*M #7'L.C dS[  C9~1⇵Ȭx8j-ui`! 3.[_v%Ȋ2;>(|@7%۵S0~&#IQhw j(rΥ 5#ϥ!F|?:3zl?;A$p\#& PC &E:'˧dgK ك5(ͧEMP6S!fmЩ[ ²2 )=eJ~}NMeDSrĖ3UZ:q}{&gI0ީߨ|\2 .)qb9F\5y+l9-y6Ŏ50,F']#|ѝ.\`{mx#I5\zgفOi' Cm*l00f+=\+xq ΄,E=eW! FnBOG'@MRD|lߤCGɵ]d?lq2RFȩmO(B:m&mR$P|\-}n\ů ؉B1]g?t#wزhn/'`l4)(zɆ́do6flFh0 zɰK=`׾,V g@g0c5N7 F{9{?OPAX&Bsh8*j >% N.+8Ƙbendstream endobj 274 0 obj << /Filter /FlateDecode /Length 2642 >> stream xXKKV`1wH`Hb9xsH 3%ztFFͮqSrS_?}ha郲Rmde* ?Ro~+7ǻw8mҿi{ v?ޱPRō-}Cs vK[J _C~X#n_۝r!"F-s55nOg\KiyUw(R?iׇD8TMPj[R)%~\\(Ylweڈw"ztmK<#K'%.Y I ~s}~߃: b*6i 6;8m۝QYFFp/ݩfO{` * >mCQ M"3SҋC2Gxi j}kRh(y;ATjxa\lw.BwG&eCVS}͒e \Z7ǧY'p + d"m$wo Z\M={ ! "e, 6ZJP̈ *B:{F/s4RڣC1Փɕc@9ՙLU ")c3@HGaP سf%*d!CkՔ '(k0M AsF›U5~WŪcP9jQ%iFѦ@LJ_@ n6Քp )`lkJkS6ˀ[dYO ?8 V-SL8/86Jj/-o"&`R ]) `7gAuFl/.9kH3f] k&C?; 6S P/ YҹxKtz>< Fi8(7|nNd 'Ox A!=U+V1(di AcĮz_O^1^P&F xZ*M^F*v:j XS3mDW~Z91UhX/T8y Wڡ5ny՟mtqX~E'tz3p3U74~ {!\u!IXr[yAӄ*yX D\3_CER%;kgá2h~ՊI]S: .i$WsߟØ6/e\N7$LDy!-3'$Ci{lj*@TrTLOXKj1{ږ7wTicܶ䪃7sLJV=pөcsHBEJ: ms@L*jHiYןz #,q+Ʃ9 :8 43ʻ{crJ[X+)E 0@cj2$ĮY$ ^lt :z`0nvCöoC<b \yriH|{F>,3MKYlՐs5Ɵ!,~}M'LyfJ#;V574/?{ɂsŽ##mblrĩDX;u^P0>>SZ=ߜ`jVWCߩkZCxd.)P.Bw'jW;K+nލtS<~4jwS:OۥhbHR@#fJF6izE`'A4|YxE/5ِR܋< $SCPjǾ~#Ѐo7pٹzv,zMo/x6qƞ%q'#m̝bÏw`)T?/IcJ=f9Ͱz>^ Ob2'-SW~6/S K:RwD/ c0ydvy{doӻl] CZV'}ۏH\P@fB@ ݖHzMc#>mX&mϛxaǙU,\ sfiΗ}@Oqt.,&L!*q ȳ f̜Wͨ cfgBa,εabendstream endobj 275 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 557 >> stream xcd`ab`dd v 5030q~H3a.>kc7s7˲ 3 ~'(ꜟ[PZZZ&lhd != &0gJпnŅ7|N4@I{pޝ]ҙәݝ!\]x>l{;X7wwusħMX/8IuM5r~-[zXwS?0Nt+Ous\zC>82(<4;۪ilyqmm]l.].^:xWw[o\޿3\h5s .(:SY7},.Ώ+7<;'ݹ=-:9 O#fƾ$-^ɱxqvJe^ߦr{3ؽq=}l¡U3 q8R~o7-!kqU /[R> stream xcd`ab`dddsuT~H3a!cOnnM?؅ ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SR @NbXmnf\ßGѩ{p,V۝uۤK|g{ou]ݍųb=5I"x7 ߏ{~4>{w> ?EvO˫ni R.(϶`9Vb{G\[:(W?GNg;}wNn9.<|\endstream endobj 277 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1438 >> stream x}kLSgϱ M62n!(RJ)Kii9P+"yT9ɲ,>m/Guٗ'ϛy{xnIYهo-v8n 3) 8Ժ?_AH xc㸴h-;qn gQB;v:_&T6Z졙N"Rv7iT*۷wttlm){;$F~MPɤJ'IݶZ"k+E ~^6 r!a+m/C3+x*܁.x)2+k6;]~L24ẕekDЪlR+J7!C4硶[]gLZKIan5)L210QC, Ed70N?%1o"pn85x!uJ].w5&-h♧WP^GS簨ͤpHEq^dʁYײsjy|wz/a>P-]CsRAmHΆ/ڰIP6i%w4@54bqGJ`B#c"⺨IuȌ@qyTPRdH:pѫWDV;/? N@o`|mwڂ&Esj@=L HFb'W06t  B[}:yK{Cm]ę@= .=6Ud֪pȳwf)]v{V+Yeou+s )_0k~LB ^cG?a&/0LB PvU88z qX-tY6KϥGFRbc~{޷BmK9(ZAFᰝ36XCK -ZwX R 3>雙OLۭh-DKJ%#=C߭WG'ktx7`l̓% lљy8]Cx.#.[KJnb`?4#endstream endobj 278 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 502 >> stream xcd`ab`ddd v541H3a!3#kc7s7ˊB``fd/r/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS ӃP9E A L@00ֽucź>c9lߵ~L^2FrR}_nrlsguϝ:W>mr-S#z|gx2%[euweռG&Ddlk j讪=W2Is'} }wn=eKӻnn ߡkEt9`koߢ9~>':yn)?zٻv/k񝍭Dɕ3{VY3vgW>> stream xcd`ab`ddds 4TH3a!;͟A<<, }/^=G1os~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWvt-(-I-ROI-K/JMR KsrA100030v1v3032do+w ~ gyٓw_5#ں;9jk&6i?olnnﮖ^?{tlEg/^F/[Mawa|?-qhEgvvOY?U?s~/1uZ۴nIUm--߷98aBnMWߊs޿yendstream endobj 280 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 907 >> stream xUPmL[}v*&5=G@֍%БiJ3jmy+9((Y߻})б F0#&j0+dn%:l ?t eWKNn=9氌aYܫ{Tj|;ٹ5`2x| ~Zexi #!K6:Vؾm]h!NK9%}^Q`֭6/l > stream xWyTw}jnVm[zuEQk)V( K&!dAKhG[.:jSRεw9m{NG| pQ6sni*`Q|CNww55uUv-po4 rcخݔ"MO. IT-mq1M/;'ߙb CUʥ+c | qd*RgՆ Ʀ*DBQ˘|>pJ~̆;7GU.U\ipg.̡n h^wÍ8L)3e Ւ!ΞU'N&RtE,wW~@O:H2=WHҕ B-LOƤv+j 6E'j}t$lpJqd XePF<^j R-m`1[uBMfsn5^ܬ98mHߌ8^#~3F^]=pBRThT41Yă `fZV_ b ܜk"p2lh(> _Oh}tF_"N.[ik鹓"li ajs}MLk-2/e ݘVy8,66]4, sMObFũMLٺ A}A rċjenA'R(1ʪwvVt[k3I۠ *ꬍ[{j5EZVǀJircBeqxY\InXƿ?o].["\i6{L HSt:C?+鳦ӦBM> Qnr2:׸ۨs@{Qm nGv~f]K-mΞze}]pfuu"çj*28UL3BP_/1_{2nf5h.ZJǺלyԚ&ThKSR`%xMB SPX9GBu& vbhoGOG-d.8 7㭧X.<} ^$x,gBᭁċ׃b!_韽_ ̽p\LC ߹ק*c/_G6\S-[Ik’.9 :wWB@C>zq\ҩ~pWuOX'z@*X@TFAYIzcR媟n-8c1^vtt{%?ySSWEBYȴ wB6 r?wg^a1qLBGvCY)FEͶ8l` 8P_][]>j[mPwf|6͝7Mj5{UUswp\NpHa7BWy60mÀ3#EKGPBendstream endobj 282 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2185 >> stream xV{PSg!j-UYQsV-SŊFQUE!@B#M{so+@ ITD.تmwvj3~q3 L;g:O~3߹xiYYSW>ssv6Ǜ`̈;}Z"LgH'YVR\./PΗ(r\#2KQRT5 "V$نd!;ld'IC!t$#[$ "C>+6ALOx[<-eZSN#4[1hEo 4kWXV`wGj,r  D80e"5*:zҍaFϕ[iG6pʮ#q^l'1Z0ZT =#tkY]QhuQe˻"E!8rFwٹ:v:+l0 ΃?3bgWM kBm}faֿxx)o|vpS8I|:[t+)^4m/FLYQXQ Fl\!pdh%v/ Hp{x`RYW 9BF!W?*L3 (BΰdHo\gC5@5h; =5P^)߹wma5C(}z/qWollᱽ`Ras x#pR.Ff0c&6Jrt8:\2#0S4r+XA 3~&\(S^0:YVSE*$00Vh=˝n*+x}"gJTZvMi)e[=Y㌬5e$XaM顚jtxE^")vqH٢1qr6۹b6VnQtǵ9.}ąѡ% M9:誥X0\jUuHN0L{ d fJO-H&j/~4M̱?єɑx7xӽoHTm LODH%J7PQGGF6?gS˴)`N&P:./E7"[E`. %^hnGǛv ܡh욥ep[P{վN A a%uuiLm~w3C!̥AhmJ:CC޺ [ؗĄY2k1wsN[­;;L_ AW/ZwI0Mbjv}i4BCQ)eoz>}~,.I ~$IlZ[<\Wb,`򴃱Ӏ![6gkHFaCvޕt?# [yRb*h{<g٬,ΊG7.9]n&L,+Cf,qk/\ݤt`P?ۀ_pPqXkڵM Ԅڪ m 0,V`3q.q U8zʍ3znt-^^Mhj%D{uFx=0otw!p#R Ƅ=6ĸolåZ ϠTď{:+!]<2yȕ>E;`nc Pvv^m: R! ݽv%SZF{ yE1<"9o+MxY#?z]ap #HabF Ed#0G 0}۷E~ϻUp==  b> stream x\Kq}#| ]])b$9tppHL7v%̬*&!G=22 ?MM OwNwoa&6wZ;8:7MVw޽*Sy?βl~]^0k=*>s NdX؆ʟr 6k6sY0\T>oceݼֻUe04fj{MLy5 βO4}cIrܖ=&j a/۬^VO8l3a g5<)dʊ)~Mat$3hErhEfM3k v!]]1蹦&/w~* s K'Fh+.c_ٟ{)tV϶uQ!ka\8e.MFk&A3i(X ZKzRʩzq:ّu@|-y3 Nš\G/ak42eZ8mfjnu4&6NX&&Sfp2X(|ɂSUo34ҌP gEzg9l|+tVEU HLwd{ʭ)ZcO 1kP@"pX(ܲ}r -)B/ -G+ v_mo! [@喹]5#k,ힽpF|N]wќr |)T5Oh7&pLƵ;.ln`C|rkP7=t0bmP8^C zX>^ >z(SQ"GgJqMRڣ%w´B‹ޣ`1LVi!fsfz3Pvu!wj5k1W"mכɍU/nu S#d;V8-!D[eT B|weM@}% i<&uV4' c>[7s6 O^,H14M 9ٺ3e]t?]Q, tn/lN|&62\]J;fEoVW`$mOfba dv5!~c̚T'W3nsUTCNVuTFs[-"=t,CQWofd7{QW4OOC7aoЀ6$;d+f4ͳ\%XJ)u32\ HJrl xp.x?xƊ<`6!FVج]WuSBh5 _a;6o'^iշ!3^,g}a&Y0 2N}ºi!NLdʨKƌiA? ~Xk!#?ؑf3TV7՘kP4(lkc4{o#Hi쫙_T`AAS(- AKEJAf)*Q/ѴrnلwU9]` ,7D$<,'G6K|:_i^G̝1 -D%8lF}5e0t`_v8z/ȸfr[.ҎW| ƾ:4dg ?xO*x)>LIKON0'/ @pAYĤM`Ќc!Eޓ_kl7O$6:g)a(DnB%x^KD "ꩌ̙Lp (^z*F- T~<zJ`ԁN6&3dtsiVeۛId'3: SLv l!֒e45:0Դ/]bj Tkm:[06Gtc#'GIO6{+e0DzBV PZ71r!r%KWI"#@&iHp>; i==JY LBy|jF 4mZϗE/xocr:+zJPcTTO1ӂo-uyXX,[h~,e(U f!E\ PT@}* P{2 疆qk( uUB9O0ݣl8Ғ*y/э+A}^B)H'D*I9=Ȝ[w [l;)f-GWlJ3~ѐuF0LR$n]5Qi %bSD^#ms^mSZx6pSV <^&.W)Ăǟ|W2JK%1$Fvbo֋Wq0/؀}ӄ|δ{ ]@|ϞJ027xR!ܖz>[x٨)i"iS?*C߄@4TmhYG8T~SeOc}MBrxJ󬽣{02 ?Oh DXҋk€f孿U똠QA̸*RI^0dїE LfwJh.fVcWlOW5ɺAN%:Hiwc;";K9vI:;4U_{"ze ֞r F;io r7|pD|&X Ѷڸq3r_U:d|~Bc#BݖS#W(%iA/=m1qQ?bDZ]:@%<sG6> ũwBlwJCQMG7v\I'C ª,}K;+$K|3:)~puL3im ZR[IB5b-K>o-6<{$I=yvB@C `Q:+ p3L\=r?.$=BSCb;8њG\ ]\1:5g3/|.adſ M(;d[r {\P_ +aX&܅7-?/[¯Y^ nPHj4c1Uwg-t 1ӰT)0D}>-?Yny̪6~B?Q85F>47Ь8A]IOٜwmT1vVZ(IlO"}nUTFL G{k,-Ə"bf]a_Fsendstream endobj 284 0 obj << /Filter /FlateDecode /Length 461 >> stream x=o0 wvH VD}3cv[..s[ߗ(x!ޖ'.m)rdm:"Ӹ[x?n( 1{vIS-7Cw`.{ە4[xKmmYDPӐohULsF ;2hH*jq^j@!VcPÄGf!<57&yi ْ0bl RיYL,ȋS{DY }x;+ƴxlåsentWpFt7̖ Iķl[n X*ds> stream xZMs/$b L0f0`\[TU"! 1@ppy=wcN`a>z{_UUBo۫w* PcrIlUr-Gջ+ȖċZԮeY_)j\v,I4T{6~8zcD Rnvz)gѶۯiJu4vtUi4F(d:KN)Ee/9nu_B9֬ﻞjeR(7Hm"B]ꦎبąhzacFVjgsՆgd>TcͅS cpd϶ӵ;h9<oY$lیpmEFc݇ }=v_F9csr!]ɧKNg]G۪oqMez 9iRQ'gQҦ( iPQ((;)??QR" ܋3FƊF]#3%g5eCC#,Iㆈsc65",b$i`z w4Mxqb=ԀsH4 hʵ\pKB4ZoxmGF;QN;2EiCÝjسǾ0$#x*l3΋׏jANOl)Ўee oO؛i7}Þ֣C=ȅwPX%|͟+Y⢻3߈c9z?lDTǦst%O`I1 @KX0mtQ#pq"Hֻ@̎P(1(>.KQj븊7W#FH8."#@Lku&nqqTCj.B7vcUU5U/"4)pQ( ?Pe[ $&#(]s$d/,n? vSji__&OlPE MQDo5Ch1K*-:4o1Tb:XA /nlA rj (hHd (1ͣbjR6–Sq,H(O #0thiWLAqc?I1[PiYnPY1](|= $'at1xdэd|D䡊%]CIQsU'T5~t )xoWa"AMx{zA,^ǜ{>NE  }a NY}xjDžQw7LH 7𵰑S*=M)Q":jGy(q2ZjW)gMH`.W\<ib=O-ڇ0䙈S:?xl(Pm~ǜ*!^9RXJA,jVj˗-9Acǹ2[> KL ,(ܬRLf_ߠEλD_ui6h2ӣt}ɶ84.ɖJg}'v IVHG{ZxUɥd*{~=TBҔ%aW( HDI9z0cm]pʙAjcFBNE}rҕi3w?N1zz8J $|w(A@r'Cx 'X* 9e*BxkZy-;M ;u~ɥ`O˅KqJ=LSk*y'Ǣ?Rzy=MmGzj?^^G\gϋV@F!m2|(ߪ?}= eWDg:‰LA~PY\;JBik]*\K)-6ە?g"̠=UԹ#ן \}|3ڲzBj|{@kܙի*-<F7WiؠQR[@yD#3ˋS)PڂxX8c;~_j]Gԗ{WlLJjC$Q-Kc)b`)~ H3d4eײTg>yc {b^pv6q˳F /2yQdm=\%\ X c)PfLc6~JO; %.X9, <~!D7́hͨ S藍#@ق!~(!t(ϗIF^:NI$h(ݍeD=eXh Ʉ w􄞵RƏWxо^M^]B'gٻű0bʕ)>~If%E}!`" x"|#9oT `DU)ʦ#Dendstream endobj 286 0 obj << /Filter /FlateDecode /Length 3609 >> stream xZ͏ܶG{soa-i=M!m>x g]93}fWvMZaޏqUrU_;^$=]۫h Etά/x\X(ʻXr=^}+oDP7V>Z;R3*Ƙ{XupEYj'f|}b덱hJg8WQ<+ N&} űnZ bӿTVGH52KĖFҟmNvoGbV2B/;q 8k mŠž}էbjhP PAhꐱ5:D5uW ~ _o4iP;LhܡbVsmvbVԼ&/S77 %bEb ]; $N3pԥ>[{=i!J଍^va;+$T1bEjotd%a-,(b:z$ֺġRJyV$# IɂE#nwn6nqK< /ϿÛ&|hvlL&EmDjZ'jN4鶟3>|FՑFu:ʋbEk/XXiW^)S:^|[ +)772YȤf+#Ђ"Ypl/[:+hX7;:? eNnK |0 }6~SZi䡎R9&UYݙ '%8n0?,,ye(g) = e@82ȼR@7 !\La"#A"S,]{<<#KYzD\6*|)bz`Etc## ̺ #&{Xh0j^[Jym,ό+!eF+Ya5n(tZ–A)! I.hTq`DB8-:w#8nذ62mUk.<¡`3.R\b7׷Pc3%m!ݗsV釕rPv( 1~C:d$G@y$hqjy$o2\آ `0e pp /x4iYi5 5۠բ}t v M>EꜨ` !и3>ꁌXRɿ=61l١eĩvtLimZOӊ lֹ dive3)>h}#m5c+jYi7 `~]u19}PKV()7t\'08]WT4Z4o:?H# +k.?(Hr6X$p nv8퓠8dК ISg5P:S׬9Ň4:$G+ :h.=/N`Z5tU# 6N_6uuhJ҆K츝 ϕhibHFe8B]ק˳ìW Ji0!Mt~lٙb?@Hݸ×}\)0";9']C l׹_@F|Qw*u s} "sŧ}$۾Kٕfanr4yIikg'ċd!lW82>N?;{U[|h)|#י%X攧E~Yyz{|Bv_w 2qݱ)ӛSLb>F4(fQC<5ǗN^)#_1N9S ؼY؞_Sq!]aJ>&,cSh\/|;R>}ki9ɟMXŽ[Z4D}df}[9>yWi1*G =ЏK +E.nn8JuO$-Y9JWvCS?brV ̏+=$#1^> stream x\Wz (컢 F#M=#Rh% 1b") /(a$"ErHq%r3#ٓwg?w:%gF]{{yroUUUQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQќj}IQKc: ;Ѣ4ޠX,AHW!IoDn/0=GEEm%pN~,FL]h(X P[NoMo_CcV^^y1+5DSA4YW+R^~ž}g}]+v{Gʿ=$K^?;@"p< K 7X> l?#.N7(''[۳|=zGo+QD7/2'pcCm,#ڶ3pD=3%ֈG$9i> Uf`}VDMRvr(DY$:|.; $)]"$QHaU̙K8"ߘwo+5_o@*N7c*[DY muFd3AI]a G1ւ> 1|%oc(t30wRdHDU>^YIMшqYh)+EGC7r)p-ѓʷ!W+ ?cQ̙KE7icQm/6~@ {ӿ>Ko# [ߠ1Ϡ4 0ec:M~zxB?}E|zhȍW~γ=#c'h<ݾmv@ "jx =NM#{?6_~9.O>I)}m}!*'wO՟Me9eO:v nOmc?h!!>0 `O ٺfWU7OHcÓ$$TUE)pBzIa>ef id ?sT,U]U/RA*,h꼪-*2ܿmL_p[{ jTN; 7 ' }W߉L޿ߨ`ntu vR)ywag>j~NOׅJTrۑ4ѽUǽu 8um;Ch9Z?z'iOBhʔU|nu=ڿ'm"BP>g<@U7Qܸ0=~jjvʃ>r F@M秶F#fۄbFFC%GOz.Y"]NͨuFoq)X?<8nY"KF9;qF{[qBgO9֥ Ri}'8_gH*FDQu lFpk=;Z+>1-QrPA&>"Σzv]熨>BO`gO%AFQqݷ=g-uyQYd 8(F#~ԯ8Č2Sp|#'j *H.Fun3CO5F9w7n "'8"FkL}!Zw @@ 2ft@:t1 8hNNsD3F pɨΏuFI | =FwW(i_(pja RTʮ^gpBnbg5wqP^r 5Pe lFn5Ժ:ƣ}w>yKQ`o<: D {0[z⟯(dS2Gro70`՚*%5KNUFgP]}G ʟb-Y"gUCM=NFMp* u G{=?x"q)2z/(s_{$Q2 /<"yc.KFi wק~FAFe9 p]~|]XR(#1 7cFuŨ>k>Y]G]&Vs4^1@w0ʺy'=َ&V1Gcj8DXuҗ<頻z7h8 },H/崯m(!UK/kFDs~?P!¨_wP7n({HK~]~}1Ĉ6G~G5as}Lo( ҥKkl GN7D`QR}tQ1.o^ٿ1~7>Q|(;5 քя!;# fe=.]~yS]zR_KQLD;dW/yeCuؿ_<ڿ#/ :7Qg~θ뗡)\ k(!2D51<]yDRT]}m3 ڬ^0@@C$;@>=1p挓6Z;=5`tXq]1[dTB]=?ؾ1';e5%SF2V]D Qm(fg撎Ʋolӟ! fWq^cpT9_5Oew77죮> (3ϵY {6":)`FdyIvOsFZ5)c%)պh)s#26 QuϼoI r&`?CD5F Q)= 7Eu6OSQsPɨիL/8ps؞{OfK׈pT @%mr=m=ݾuYG8>)FA, lI% (^; F<rD]]=czႪ19JYA0BE A_ѴblDT1ʖ F5b(#uzB9 !zC19PQ-sM1j>jbplFњQvZW/׈q@k3dwP:pט2 Z]$nڌN>G0Sw41}?h%?hz 2F^ j@]u@A=/k عCgPC}0zN (G?145kD9MD ]4z8u$g;KIwLKszVcC]VgL%hWUQ՟?ͅQeB=nT|CFW(]4(=>5 &Ovw 23%'G G1*$tÕՃ;[59'O4zY D*F/1 QGke? D/,"G~Ic?q7F1=uQV‡.Yɓ'Y_Wo[pz(8Ŀ=RzSSŚQ͟ĨOc|1uG~QmF^vݓ} FW|8Fլ]`M5r14FqW/kƨSB1fLpT92Fy_U9'N5ƌѷaw >b0&&cLͽ剨#3F SQлz8zhgo)uW2`(eRA?G!_M65U(o De*!UŨ^cf70C"Z(y(Q1)MMQߌ颙FWbh;H1FGpw?B DM 0ZW?fd (믿.[1 w5>*|pbt%R3;cP7}_#y15@$1zV$F)D0D;LF-F =Qe}OEC15@btCU-PQaފQ)_>k#GPY/?;fWџQc2Iȼ u(g}O"Q,VaYc-@1 Ac51tŨľ?F>kDI 3^T`&i1zrv^G)S㜰L\oGb?c(%S&Jf&jܹojȾ+Fn:5fBtwC§y͘a@ͪ#FeWH5msIl-T+gbԮs8w0b{σ;bwŨ!&_W׬^&_vӃ>m(_rƨ8;F[({uf{&QcT 1c8Z%n(q>pF&dVҞf~ )MFEMQP!(tD_%cT_xa5cz7Q;g^35]F1ZwGE]}ˈQ@-G;xGȿ/FE9’Qnj? yc԰1qZ"FlMy]=9F_Z 6ZKx#kl.YQz`f_QcԲQx5Ĩ/ j4]9F/Fahi Uc o`~IGڛ}wڷbMkNITr}WcX7:IFzzOښdvk:;};FEb+Fm²1a_Qmő^5x r}"1<;$cS$5І+FE_z ،i\31Z&֠oXH:vII.btm 1 G(pоP'Qgң؈'1a wCM -qN?ڇn61F^62j *c{ 1!^c3FgjxM̌-,kDM-FfbF;ݻpsG?2kl̘oܣ X.BF2D7/c`ެ(`ߎQs?rӿiF2x9gbvWF[ŷn({'1ʡ)ܕ}o7BY"#Fe 1Ϙ`b͌Qq`N9B@1jĨwsjcqz1o'ic,MT̾bߘ}wv5cDfsz&ݺ'm(<7F2MFnEO1D/ӷb'f:] 쫛 O9dxjˡg1j7c4GLǿѭj#:FA!yFkDrȨqt}H>FԶo6~ѕFϮcI#Fz9J~>jфcgjp2D5ks@zs@CIh Ia?"Oc Ǵ^>D8FzF@gFq^1$EIw&{01DƩ>o+EUmO<Nz4USKQgvvH KD5(.;5x&X?ğ=[D'FZU:8F~HҥFC;g|Iˡ+@DkG&a39 *^dhӫMsCc`r3Qc"6, j^ 6ޚѦ#jhVa_L{!qV;\;~ĒU}yS9 ;ZM?,> u8Q#`0 DAk~#hrY2 ~=q1y@o4K/ em`ce.2}2M0}#͕~ƢޝךXp!?hb?ODC:F;*:vڪ?uѽ'<1\Mℵ'|1)xN.CB r"5hvF ;K1302L0"#Do07oLk#0GS(8XdC }WƖW!DWU59h:FϩsǛ02b(Pd{7ί0 /s(bɊf_ ":ՑbvM`@?eDv{vщ~ggf6|\s})d_dƨo}Qr dF,>D[ɉUoEzL:-ۓ!!H~04H]]{òUس]du )-=1=9 @;~ÓP0 B5ڨMrf4Mobe? D75Վt5 m| fL}AP}5^U99o_ѫ:!f? Dkb=m3K;EL/f̡8=CM,g `j>mR7kp#rXrӀ:La~Vsnm?D+6j?ѕmn/y[lD.qۧk? Dϙ:$s2"Z=!%oz2F\nJ~b]{OUsAmp7.w9E֘MFˎʶK证qM,>~Q?`}|yoski'dk\m-Ccmߙygzd!J@z粙ŭk2F.{1ZoTv-il[=7h"wC4/=kj6e3%-Xޥ;W8&kL_$v6C +RM,Ѿ<1D j]x'$ulǵ0Yo-R2as#㺿 { گ`w}*~{~X}H~f M庞%hÕts!q%X@K"#%Yv70>}~n&8vAj?n*]⼹; gMl mKu@}SD.LBͧzJz?2kx嶖#W=@Ϛ̹~~O@ 6=Dʳp1 7Xo7h_K)OnfT*FmWR;qDac mT[|î-OUtAX8IC޳ȿx#eĆTWrDآ=`St{M:"6Y@ V:VџUv|-ժ۝-[FAKv'=-vdțf2icUNMi) GbR!qw`:?Wk6m]1"e5 Ʒ})OjgQDT;zW#26qŐ9d1mVdbRCv4&S}؏"9]o@j][Lc'],Go]|>2P^aec?ﲷIXR(\4Fg߅ :wOGh5;%=l w-Y+Sfzu kVXF? qN["67r6'?,ei'h9Ӟ%ښ5=ЮjfxR!AɧdC+C*y# [tAz 2jGDR ̈5`'Ԙu_@QTx%YunDW؀aj vb7Yz =wT/=i*#DsQ5]rElzEFA)2v2+j[~k5{sh5XKI׻Pٕ/3MD+G\aNGj˧Ծ@􄩬݆[_g8wh, d,Λfl>- Z*ehQ*ehQm Z E Z EK zTA(D2WA(sMѢ e_DUA(sD2 чߚҎӈ:u/g!}=}兡0F@?T*.!J\qzLD}|}?MǓ>yDt_]m@Z+OgsWֈt|W[p*F?!?ϠD$9=F Ge^6Ά?D1mz.{>KS`Mo|}T0zxݽ "Vԓd47K(Vb]`'xxȂi.} rf{iʹlh&Ycxs˛zΪ_SwOlo>mgBHѣQ}DSYg=I%Ad%G|I0!7lNh=(qH]YW^ZOTRsF=3U= 36za 4~GDoF`/^lׁ9~3йgl1u^3E=P|ӦpHh:I hѢ }nhQ1U-DѢU-\Ѣ%=l Z E Z EK zTA(D2Wuv'HםQ]hMwRTFLTm/`U]> Z^QDP-..JQDw+e,Z43 D_6,VeF_4#m'EEmT-\ѢU-\їLD2QA(sD2WA(s DLs>5?לVy׾?'h<5؟oDq%:x;;Yd>/}T6OIc3r Q?_*FgRGoh8W?e?cD}|r:Z/p(uYghw3r/ ~zD(bl|SF44=Qژѡnj[tܽ{7)w@OPQO~Z3#QNgޓ QTYJl;@RU{,FU~% @ٿnj6ܾh\5h'p&<eS&|!:{ɳHwkFyBf_NjQzzaT^b_ }SSF~=Sd9TuF | 4%AJ (F꘣ OGqaPҞb.76z_Q GR/qBm\(سz"]}캊W/ USM4eNp.]Q9$l^Z, UPuUIgO]efmhQq *t /(.kFYv(\^1zMz;"}g#׿d_) \g]*ٿk؇>hpԭdDgj@DBZϰ?ݸqs׌KxxN"r }u7 }7fW[OAv&E-vj5L_oe~$bT(R,1b;}%ld I=;T&ط~ͨ-Qþ6/2/}Vi)qD;Xpp"bTΘ3 ΓQ~=m Fk87:Y=9V]ru90˾l@nǕ(z'c?`3zJQm"D]5neވڽK uI "p|6?qLFtpi_4b_kb>^8;{C#:j**ܿIJNbΜ9[]̾6G f2*. T3 ƌIԘTY_B;al3 ĿӾ n_}Q`϶(U߈&)QkA+nzWK_J\Z'⫶YUcr~D^CML_?k)QO/}T:u,ť>I$\pf.=Z=}*F]f吨m_*iO>kl1(FgZ%'>@b]n3X]}=\ (Gh~B%M9˼VW#)6+fEXMN&F (φ@ )F(g8ax቗4aT(zܪU]TcQG)a?C b`A%sQB2*=hb󍨿 P~ᔨzMPg{V|)N'lb>\4fL fe?QwW/yA?aSd0znJ'Cݪ?C~@Ps/)3"FMluu<@/z&,uMbΨfYF<haUsڿ1ڮ储[FWT(E=ĉje;CG9D+|˨u.k /hM̲/ VXވfQ v]c;ISJz!z2OOQS; QvW85&!Y(1Sig\-JhȈĬ;[ʮ^`G~fqhO꯱!F臎c;?=w¨ƃQNyׯ1gikrGb=  Ua:sY7tc3z}-܀4r1pnyQl"/7=p~v\Sdxm+FǎXI&5bptpTgt8D&FQtQ@ـ㮾l> TU]=;AC01hueP͸{tHˡIQ}ezeX}wL僨8qQI4afO(5ٸ1 GeUob2FѤ%ŦcKD`}A֘X1 2(j\'m1k'ĸ}+FAM@w51Gl_Dus1r^uۗ2juG5.p #GDpMX5cTqMbT Pv8F而'FEgo6.G#fؔW1*:{yct̾hD458='1J%ׅ F@-`(qq#5hJQf_5~V.N:FpB1.FۿxpjĨ\x"UE;FC3u8jl KZw7CgtVnWv^;c∾eWZԩD =V3 g\~.G쮾!"#:2jm0_ƨþQ Ql܀g቗ɎQ}T;XK;$ ;bT1:jPWXQþ?F}W7(E)Lvu("dx#uZUj\e9ˇ4FpGeiwZ}1 /ΨEghrGQPE0F56ݯoܕVQ۸;F%fTMLa̾H5:+DWrtbTQFh5k)ʨ 1˨z%/}w71N˾+F}w7k5oG#Qc^ʮf!\cb1 k1s(5nVq7`%yR"@Sb^z qPk_;z0|dfz1[@a *b%h4F_VRFUc5&w q^1^F;R ,Fy( Chо&Ʈ.uz;d! c_05!jQ8p(0)?dQCg T~V&DQ}8:B1DTwmC538AA?gƷLR%Ep0jXRU4s9c?Ρ,ш}p7ml.MQ9JLs?Zqu=nшPþZ;D!9FaQk8:$/cT+Yb!l_㦦6N1zd$ Fլ!J!k=(obkk/wWn&QZW߿y=fk!TR_ibgy#b^? }8FuƬZ8FᘞC5v0:61PM :gӃp@U]}hXQsh'OUv[̾sBXkc* Dc9.pv}yuCyi56ctptkȾ;F'l#SD(3:|CuQEܾ%x&e}rQxcDi~z};FAHE4.WWxH9X>X} luw%Q}TMo(d uwf o=M{f>Z*+F?t搜rL>3F- }CfOO~UX7cY3;z _aĨ>jƈ/Nx|3@=t=ʆF3ȡk -1굿g"jJ9}4Z(<=.gEhjj%Sg hd7i/Nxg5=F!~rA4"={&Q{>υkO(39YN7EǨf5ዝ4Qm0ew!xϛd/c,$b._ nG1wTzbhƈ)q(U3Uj 5h~׃0[&fڷF* =wvrM`R1ZϘ'J`hfc쩪Mo=_&[KX-Fʰ}I;FFh#1:il)zVlzK!DOb49fe۵b4mֱ&}Q/abzc4^Ұ{QU bF톄{c|эj'fdždwU O)gIKx񾢚Xl]7ǃM,a D)kd+-*~)^(QY NUC 8}#&\CM, 0'<9(}ڕ+hNGM{61J) ;@:y5n};/h-2orZhbM,m[ Sn/]c;+*/$8&|[kl<1{6, js_WM,kb?ѭmEYf`_vpXmpEik%(jM/禐Cڋ`xk!mFkǽ1L "&tqDۡ:mwOkF6آȒa xICZ3?3)Et-9oIѧ>V6RQ/cL=*lbE/Fc0&:j18S(Ĕ6M~HVzjި)2%^{q*fEafjo5(F{E>Խ[gÛ`X\SO Eѝ%ަ/ ;ZW&mj|~53ݺB;(Dw(OWuD]{k}[v+ŪIBCnS)دUB3 ٶ@.\1:x6G} :^-tj{lw>ެһml}\u*h?a0 փ,/WCTƨwVE B ծ$Xƨo] 6/ s@އAw`ͩԏ+]aa*;KA=Fw̐]^LӍ0D+3Q*6~0-'B}?15Վt5 ѧٽD= Z8^U.5i]G]`@gw^I=6w3`,[IitƮ)PcT? ,gvl>T|֬ED\/l2DF,k>L~&Vl:IhBXI_XJ̡QoM,ejj% ʦ ko7.yJh^X}[~ ok2 ;Sw2-;ZڥQE>Xn?#Dw%{چ$*}ZW[PX+׵EčA^G Q8$4nzC,_{D{j}kEK{Ǐz`'4ضznbkRq9A3y!JZ1Z¿ҏЃ]z#l}b߄{id!{~J_obG}1T9;#SAZ1^C(ްqwaNxb)9H 㺿p/p _-FmbI}bx,~f M0c~@j칔A|VE %_5>$ Lsn:ا?{㵴%{ )/z/?J`87ƖYl_Hmi?GDxF2xFrzJz?2kx嶖=IKY9ׯog_%G 'Q2m6[5Y⾖"s}>R|Ľ*0]jg?CDG&ݮ5#zfݗHY!EZ"r)&6گs~o/Yєaʚz !hF=~R[F'=-vxțx =d)41 DY#Z"5$T{Ķ^bBk@o ~o OTg#JW/ȼ`B2y;jL փC3C(FӇ/|t1 (Wkr} p妷wlnc?lX>~ƈ%^fu7j=#xFw&4S=]{|]9]"pޒ2/@jV/EZY~Ѕi -{V-^˳O2VsGtwȜiKumοuhW53-)vF9A4gT۶^>MlTVn-:N] 3;4csh2uM3?}U-\ѿc Z E Z EK MD2QA(sD2WA(sD2@o*e8=|:vAѢ":hQ*>O^\TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTԿ?•endstream endobj 288 0 obj << /BitsPerComponent 8 /ColorSpace 132 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 15868 >> stream x%z3 Îdee K!QvEJvDs}Cs&6pazyzꥻzO}eo^O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$%!NJj+ӕMD Ѥ!6N￧}6pMپ: с#-9Hw{U#B-$P~K?|.=%"J^ { K;$ӧ-@_Oy_yI>|[^>=_!!N8WW|oC^?'n E=+^_ŗ^$5"Ddu <{~OH,-MwOĐf9|d8Gd4}{3iZ!h7D1z$uS$!{'|J_˦; O</o?yEJABW)!aQ(u5 *4whHE pBȢLYtʲ(XlQqZbs`%77Lx ٛeDHUt_sۯ15!##/u \?wmnd_*g .(~++~GA~WuN:NXf`]KGFB}l "걿3H}QR$#MALw}H FQnU sZץkHD(<82ُ .p+8]Ћ@g=5$Zb@#9π0ړZGA}6 bi/^o'ُ! Ufݗ~.ިT;f@tcHk`A גz* }Wln ā`_瘰zwF]G(-VL.T^+I?(Nz!ԻXcmrDPz.;겕+s=3o߈^ϲYv%-%Mlv~ 6̮׳5r@B -.QZ: Sx*>jo-l9nЂaGhf@T[#!W74ǀ(L,j)ji4P %Ds GGe,BV֧f#^QM@AiH\=59Ð|eF]J +h˂m0B.}}zzjXP/ʿhyY}CԐF<-]ѯxGǪ C Z-$YCQ{^J-w-tDpi4FQBlĶ[vY$VDMiZ`|fmy~C4SzK(e%i1l9#Zy?`DԙƁ Jz0ھQ ~qDI刞*9٦"ݧ~OOal~\.^V ѯ8$~4g4( wluM /TȇZ(7eLr%#9(Eԩ95?{@QeDBy%-i)%FH܇ڡitG-#*14:it2yr9@#5t?iv9{yJ[7ٮ^z` z JsFo3jç\BI(ϣ;v[x (m@1 >vA(Q[3ͥ"Z2_ӊdc(?QRaԩg#O @C3Qh(VmwAToA%82$3~%BK|ʈ~o2 =H}#t!9WJo (LXM! QG }R =܋#iUm ik|hQ%K(zZyl;.Q  Gu=My2jH=(*=K n { h?! _~%)K;c-&D4" QF%FEni8ouŀяik{tLۿ[@ Dre56,A榄F8F#D(фQcxUJh%Fw1D}(2*%MoJ ' _4(lȌ6 /CӨiQѓP5.=8p6#QxIISWJ G"y2}O&э m!'Eh !:ݏT}葖Dッp5$4z@[+r?Q7qj(Ѷ$OgS4*#"z# FTj"ZxUQyQ:1D(9 z$RF?;,hQ;P J́{}0 Dô[!DQb9r hQdTATM.(<<5ӛRA$E4h xEO!!z$BMSЀPCk¹E(h%Oz"-@cFC ȨCQ^(IT;8)CH(3DYQs'TV7m(>{KQJ:S=QžYjz@3*!{$Kc9haUAaFO%DAjJy5rEZQqsطDˈJAKIoUɤ@2 3ZNG D4*!Jx"#YxoRhyEO0á|j֨,ˑD4Fy-?$$6qZWewyԀlߞF{ʌұQ!'F+]Q >1 J5a(5ܽ*`DXAnߚF쑸$"E3_m!AJ(>0s ?zK9jB<$!)7EQ~Jror,:aQ细-DޙUL-riUWsDY"OY1"q~IQ_@[#GT„(+Ř!!VFDhپܘ=`z_@)fD(e3^DKGԗ}Ǘ +;Lg919_үY5! GeDcCZ5q/˽vDӨ//A]|J`MzTkeqQmJK-+Ҩ{d̈>5ej5پ!.R OPhѵQ}ݔ'?Ie_ˢn Dw>W JMQFS!T-h@$iT ,*E) Hfciԫ@kk|>Ct-Q_maQӃ1{Ylm^~eO=0Fmgogҏ/C3<{[=_wu\tk QԜ~CevҾ0D)3, )6?R!ō^ݻwYyzGf!\btD76/J1"`ûM֘Ly o6u]6|h%3ZZf.KC ѻE~n:6"~F Cٿe%m#ne8t@t [͵K+'7{i*.5H'Qݾe!DKΨWG-@ySMFoy/;7b"VaZʈrFo&+ٳ8s}#)ICwU>/YqUhݤiTOK])ChkhOnv-yN/Oxˉ볩f F%л}1-Pc eFkW-_ڀhi8Y2kq?[Yw]p.5=nco`?98g3:.Dk|i]+{⟴S4HV؏QqR__`7omAaٗ$q,Nظ2QzK]Fsu{ٙ}㊘F o3ըY ibLQkfQ Ҫ,$ _S ؗ@fT_yx.Ui kk䯜fy#\|5Zd()(yrnDA4cKXK+=kp}D;Ua^(_FeI7!5l=o*O*au ۦMsRK*#ʃ̓%yi7Sمucn RQ&J3q" W"·/ y,M>׈h%ϝϻKZ6H~};[*} XW68DAeV FD#Hk{#[U+Ŗ%^ml!#n-i}VEYy`ΥW'J PmCr謘eRN}쇄qk:% vyL]˴4TbQZ n:wD5j}/ӟ;] PnEnH ?ZWkpPg>7fhEg-g>~a|؏Qhwz#<"(M%KjJh$?c@al)V0QSқ w)Ð\FUu'.3oU]\cӼnȂ!zM/2c}r B~S ُQjdDhU㣑ɧ Pч.~~u uSUJ帎ѷK׿@5zPݥE;~qﱥ* dTҡt,|[~+&Υ_E\Z#A4&=tmZAs|7GOHf\KAKmdrfu]xuͰ~iqSP~հ~nNƘvyeW5C=W<̚؏ћ|Kr[h,6ℴluH63E gҮ]հa nyд yg~O1' Ev#Ck,\" i6rL3:@glg8ůn}|c~^e wz{u1^gkӆ5=ˀٻqrWab 0~-Lj(L݅JQMUԔxW`54'm~͕>c UڧLAs~~VQѷ#@Gڵ,M{"-6ԄhfT2=D~7YEw}?5 Ӌ/T".)R8g>S)R]gs.#D,~u&: lfWƦ4@M8t` *mE) FkY6[l饍fjnfH_#=bNJhFRQ;q`uΎUxgŸd4VL]To1G(^~QX6ۥa:-O+186!sl,jzP} GS .l\&c((1lJM1Qj; :7]usi8g8DFpxdI؏QԺaMx~q? /AbP⹑ptqAs`?vDDLkq(9)j0}05D_;9<־xV:h@}wkNR3}'3ïgnk%!|ΌGf Dv}r0ѷO ї<5,4ȿ%"I;/oav!Ȼ'o}BjD_z _{XttKĀ=|I2zLb^Ojx]|YTi13)~DYQ'D/3{Fg$Y#0|rw1hZ_@QRc1هW^."Qv_5=>C9Gt٤Ȣėoa?_a[{|fs Sd@)œ|LV|Y3DU3 % '<"ʖQՊ(s>Q9e#@a?fhXIIX :PEϽj-szPHUDǖ-]>vDim ӷht_݇Gc=y˴]Ӈv H,,XK їf?cPhh%D;*4ICg(C]iJsRTJ&EhRJ&EhRJ&E.IQ)!I+!I+!hRTJ&EhRJ&EhRS] ѤM\ ѤȕM\ ѤȕM\wu%DR H&uUw.!iUC݋HZqDw-ú-σC5ݥE⻭^[DO{GcI@+ZA AB 76n1 (hr`@˾1oD{nfyZWa~~ W.EonI&~{ߨb? E@F[I6 #]" nFjNɐeuXs5I!'D}y0 >weQkK|tayօf\n`Fz6;1-f KG=(` t\o?ݮ*""Q]{=ybkIEN57X)v$ 3QHoEEߺ\ͮzG~Rב${"o97]ӟ*ٷރUAy} ?F14&U'DiV bWR%n<:9qߊ(1uGm?x9fܾ_ŏhرH*=]}"x4e1 M65,ˉuNFd}T n%^*Q {߿ODLMVbA#T G! 4K+Th%*n`qDWZU]ŞuZ1VS&Pno^[^U z}ߣg1A/O"L¾~v ȀhV]meYMyۍ91>He3zD=FR QR39)}b4 #* K *9=e!>sѣ'QnQ*'̷fY9jɱ82L =ȷO(F2]*y]-(|ۇFS > _8JKEENYMOFHMjS|+v.(QfX:'tk@ `N4#?m;^ '=-=drFY' TԢJD=oTk̝rD!V#3bk{UD?b0DA } RBFm(~QFE92iQ4GaQzzBej !*L Q8|$6$RO; >H4 Q6ǯx|%%^!0FDݖ!mPATO=) e)0#,iDAGnj!zDc|Ȓ(I]QDOeD}>Ҁ%F} Fshv%D=  TUDDlĒ(gT/w%QeIMET2"tM0SD'Qƨ_ rc((gUfEI3*n46T2c|*?4DX.G027!*dPQa ݾ>k/O,TF4g>'/F*xirPb,MrE)GqrC)E NσPFm2"-77邿+DbLlyt R 7(haU 3ڬ+D"Ƨ'13Q(b>X iXDe*4BS+?*RD͈uD0JxsS"d; =2F}QZ W\eL@TPDj C(q)FOԌ<n¸(]Mb ytDw A6^D<6D'JEix+Aha Q}Гh +L'D}oBF 1Y z DO"ʭ:oc GT?ø}+&r"Fl1OQI* ڄ~ c^? 75{*f.мo]gEI舒>fDA;ky!hDۢ(1@(nk@b)#ZaOJcN ykΤJUM*zs'rSTBt"b̃,]Rƨr_QfQ6$Q Ң'M*qDIt%=u:1OI,Z.U-(^Ȣ{QK"e*+z6nCS(ITblQMzlS*N Q96#3jndHD`8Zusl͈$GT+>!]`bC4!J{:w*Nēw77M !.|5#*W 7+5cE]#ǜ\ z>80IH);~hw$F؏]q!.5CԐiUPqܿ[mqz?*j!JeU⫿.]B}\4~LzۖPo_AQB@1 Ͳ3lҥmEk&~޴(9oﱟt%Ț}sDsW])Fk]~U[|z"4iwo":; Mrپ%: ]KG1{? JZ.HN33cř :cp}T HT#7\e_/g}3y_; f bS!];7ze-ֺ*.,%=|%zq!z. vīϑDjqf]PMt BʍqEy2^ǩǾhUŇ\z}u"y+'ЈařBtfLB}LaX˴,q]M NEHj+唖j\VO]&{EKqv~ gGhn Qh=@6 (R CZ)*R)t5eAVW.ֱ~l^Hr?$M/C5"5zbp\PC"=k}eoΑ`m_@HzObM)ޮx[tXDRԼYTvW VH}y-gttv58t8Mm/qXjN.g髖kv@ @$ u42nt?G62_qsB i !OҚ+ FUts9Ƥ==74t|>S,vEdp?9A  ƣ-!.sy/ P o3Z7(܂=j]l-Y53\/0//=bq+DIWiJtj(C א-׳qrc"ٕ 5X4 9Os,7W bHw;Y np%{ مI ʵP:熹mZ^J 0o >3Ha@Wzok~v%A^@u Z 1{wm|[uO>m]ӳ Hٻ: [\0>u܊ Q9zi4)1+O`rҐ,>=` z^Ņ(aSIM[.Zl1_ng-6L&+*D%S[E>js.KaR1)udÖd***Dqn}@hr/^!D^V x؞V{+.DQ|FKk~8fk-Uuq kS,N546WHGiCvk:g}*HBfex6BE(NޥZ` I=s/O+ү9lRl,~g%%ڧ(ѱ=qq|JWCs=i|EM%lGK%-,4; : ]usi8x"]c+yHEF6}Yq+~;jT'_,˃Š|ŭHptqxEŋHi\ cq?t#iL;ťM wB9rcRWʎt:ގ 8T;kOD-ҡzݱ2Qf@xQћz+@W3N**z#8ko6pFt~I /%S[tNW9mt~I ZtLm:~f& Eh6r>SizgS}71ȯaNEޢ/| t u7$iyFVD1v%iub:WM:yFqƗ9c77l$;I+ZD*Wbj .*b2ie@Av{ɢ ѤU^GL}Ұrɢ4MNI 4tI+!I+!#?(׃endstream endobj 289 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 651 >> stream xCMR10$?  `YTnsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR10.CMR10Computer ModerntaMUB.J'o8A$##Lr9m )uҧrTAmefHzk1繡[7ԤmcașrSQrj\gdY[9F\Imz]d2fXELm@irW_:rm͋8',Ci^Zbµ9( )t=l؍gp\$l #$~ g>slϋ΋ #s>=qyouCnb  7 П Gendstream endobj 290 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 471 >> stream x3CMMI7$M  @c^ZnsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMMI7.CMMI7Computer Modernkappa:%wmpjrpmgu0ؒпs}{qHGXbV=Qpr}wxz}. uݤ>{Dk,~}xdq@XpDlwCp`  7 endstream endobj 291 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 571 >> stream xoHaǟMVA=/\ԛ&h$Xnn^5?_՘gja1XDY0ٻѻxn= |~_}>_Y-a R.>ƬYJ/KM`gn13I_ Iw!aWnRtXU7C-Mۊ;â Ԡԭ1HcF57kŠG;RGTDyH RD]BXe3O9x)}R@#!{T +_ü0k-6k&*/ .FuyAt1V]T\t=Ҋ@#|N(,O<<.ώp:3~ZVF=1i&~sPL>t0?bD[C bIJٔ1$ܴ{OBZ7ZvBI^ّWsKSδ8*@7 (d0ĶHN,2+%-/\r ]qyRr4T]J]YIC O1 U;-*sn/w 2`endstream endobj 292 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 274 >> stream xcd`ab`dddw 441H3a!=ann;'~%Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@s JKR|SRf`(b`bddQ}ȯ2'xq^^qq^+/^!WB7smbK<y.\(endstream endobj 293 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1438 >> stream x] LWǿRQ]ٌ/90@D8B+OyBKmKKO[y (DWP8u5d[Le9ɽ${ `0ÂxXauz0Anm}2amݴ3pBϖa6 >$@vX(EYPX) wa6o0'`oboa.stubw)6\+LmnKM&7?gK%gIׅ3{qcU|0c2|`b_ :;%Faxש FԇA*5H9*}wrrO& #%Ohhlbt"8"bu$vBEuEիXIH0[oq\4m ^R_*uJ($ b6Z"M6FFgNSVYV2V@1ɍсήsn[JJ!B0ZOxmDz=c綷WC*Ijb]!*o' ŞZ Ը^fV|%JԚ8-mb8-).=="/:A^5p!DU*z3?>srĠ\;6PDAS,nNYt|-8_D[P:Z 9?5~Gԝ/;-|vZ;&qC"b 䆷hZԭpCww2SV^Z D\Pk$$vÞz^eP鎀JU^os[雁`_a_Ц8vf׌zXWJ^^^l`(BGrǷA"ъHz(=^)u\ښשSsƢ>B׸ZZ)wHA{kzn<}> stream x<˒Frkt ioZՆƻ;#0$IPxhBCPw&*ߪUwǛ|uۍ+1oۻޡVUJW+WV\n7oufCXo+o3o\h{CS5lϋZ{YN47(v}7 kx*[dc۝dRY aAn []w\SU滦d/ *c{lf UcM XM  dnEYE,,#Yݷ}_' $bۛ8fnes&;k67-/͏O3\K-^+g[SADi0Hʎ3 xyzJ͞!K(erRUzϧ(U,)x<^9bY/rX; L9,o^aUl}蝧>g?kcU:S\SlsrMX}>@Z UnU*=rUͼ X>ˁ,ʫ }ߢP,Cs{EY 4>'p )yn֧/@ u_Pg_Fݹᯔnܬq{kSl@Vh'J}{D2ZR ?c3n)3B4K]'͕9Gľ4xJ-hsTJ=!>)qqZ5o|K>@)r -%DqJC{<V TUzpZe-pƛl(XǘDbx6>}ɓkF,b[n4y/MV}O[ FP;`K|. X?7gͧ }qM4@>9ֹ&xdf' ,U*eJd!"?dWU)uL'1b$=2ӟoۦt_Jhژ _e+@Id(VvӁ swn̅U֜FlH+fc) MY+BiƉY@Ӑ;Dg,ɑsz|A3Pi17\]'fߟB:j$rlxZS7ӡi(=b ?A`yW H-c =&.l2m!E-W/LzxeXzǬ%4'$yd҆4 lԘ>+|~h6z(}B):h HG5TQwWklTzc7xΒbtR)b=[q(V `a9,ݖ ؃Kf*3*Tzǩ\%>4AɎtN0wc8Ogw020 R(})Ӿ.,U"ĻCn iBHY8?K]e%}hfsb nqh U%Ҫ4XمlvNT B-A n:pX g-Pz|HaS_̸۵/oa#ϔUh+ 2a>[ I." ?Qm$(|swKLkӵ A1Ndwh&vBK1(1!,!C":&A]V+Ubc|,jgݱ9XN"*xo+u\ qx 59l5Acp&& 8YЗFgǰb# z'c4d7*+}EvH+HAJmG GL9Ł7,bqxg!-xW0T^*#,J/ac<`nՆF%a.hv-u kCea1=5y]^b2RӲ]+DVR. Md01.Á͛+~ sq mɒiFJ46кܑj4 Ovc3,| ;(ר7fEM) 50'a@3!ا{&H޷lĂxI=3d}jM@9Do$\F=TT`^FA}RrL"=3Q}w)JؓP&(dAV8WX- 7R&~SDoO:Ư|ˮ;,|c#KP\eK8\VKsM>[82n59] AK{-dqR ǘAэ N'I|PgG 1=DʛQO|D_LbjliR p3ᷩF/ sr_LJQ"rD;֜+3+Efbn~p*/+G6 SaqDp+0p<7c5dA;!u ca J0Ktbc%P7qaG0];n'>0SEsf!cA{N >5+@ɖPUnU!:!fHi]F*<׍/rR*1m:5PlIPb$IiS`tl21YFBʻz{؈:uHO>U+&"StƤ@v#=]9ͱ~1nKB@O0{¹$DItӊl:3 ?^b !QOYY(αd\7h4j5co$U[]梧CU):*9 Gq?fF &\ca%9]w$A [ڷ@|b(EBг]R g'Ijc"ғajM¸bѷEDb}dW 6UZϐ<-u=W:?Ne詫;u?1&b.RR$2w 3PUK 2^0rGp\}i 2! +Jl=.py")0bU`M[ 0ߟU LEQP-"Q[|djSNjˠ1jHo߅+f8G$bbaIia|*< B/s*J!>઴'w>$OkBk! >kL;dM9Qٱ4(Z*1;=6!YҮƦaN^IV[Wr8ӶP;^P\e2qdЛl_$ vNQˉOF)2-_.4 gJ6 ƱُԯE\^4aa-m+԰ktMg e5L~0\I鮺cI*sA 0vXZ?-桕a}ءΣ9{9 *yD0D/4S?`2\mJ 0[$BAsDO{D]kS\i"p O#(l-}=>Sca8cl%Rm] 9]O*cXch̀@F.}6z ïG/X%F}ˏ]@8OC2)]ãNlP7%d}ˍP"ҭ21uطŌ9[pIǽq`qkrb]/;nMcO@Ll},6VO*V!I`ؗmz @h1 pr\ CJ@ O(C5dl74D?1 nH8"GM\C4D.{g< bu\V<)‹c`h[.ҁ!:)DJfۛf6҉]2[k+K™q2Cendstream endobj 295 0 obj << /BitsPerComponent 8 /ColorSpace 154 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 13318 >> stream xk4E3;TaHM dJɺetWeٲ(Z7m[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖ZQJ$d8H+ShKlq$:gH޹v~}x>onr׼7(q2~;@@% ȄD?v]GnW_t;ܭ@*^O~6 DݗG>̑գjz{~ǣ44 3(H~ŗ5(2 4DQ7{L߇H$ь6#D@H%W5o#Q+ s$h~҄y]{ެ">|)O$D@ݏ{@{Q@U2j(^@H&,j{3 d!<)oBjL\FպȜ{lLI$i ^X>gD,ьrƫba#_%rLtdM"{mts3IS(߳F ¾( 38bx=b@)M"^8hIt- ZKtٲXug IDlIt- ΦRk?kbg3Hjumq6)P^.38hIMJ>@zu|/@@G(rZ@#fh$ AOݫX*DhDBݹdX@ [ne$Z@H,@qޚ 1j#QmQ$\Ob>2h D $.s1L#Qc^z6V<y@HT=\"4볟h+اAy$7wFA ܒD$D DEn@{~Dϫ]={m畏 4^Tm&eSxf: 4DPmVݿ d=*t&@ȜB$j5\C[)f^L]d&늎t]Q $D [d Nˏ_YH .7+z-3<"CEO8'+)vz\7otavRqб K"Qßx^Nq%h`IUCz3 xh~C(QHKNTQqVY*J@HD$M~!%2k6OK)K)4 ࡴ"D@J5 PO|!?RqTɍU@t8(& &| PCɮ (ySbQ%Hfٌ?<ڻ Dx s' J_rPa%J*ZK> i~yD_3:mt Vmg29b=) qQc 2 g+2pPDѻ $eGuH"QejK$@mlNUуX3S;LjX9 צpB/)'ySQ[zMUGX [=)L',a@@J?f+QJ Mzs=fT,F@#K0#0hŇ@ RQO 4Rxf*E&JrL &FM!&[& W~!hgDi^]h:OkNyܚ;ijϝMp[ySYUپ];%:H%=݁DˁB.l!Qu b8 Cvx$Q$Nšn `3+gr(@B^Ҍ (SI,)eԆ t3@$h%qBH>Do0*AQ.}z Ns7(gSAYo/QOz\Ǘso!@ t/ @xQ/@x Rɨ, P*K$Ef,6 [ .@x@Ğ!M֢]2dJRV(R @xMM7|U |9P[& $ U&~0E I@{+ R%@$ _\Oȡ-N>O.fRP(@ӥ@% _c/{q .9bz; :3: (5%@WuxĆ(0U~G# e!eTCހGM$DuW=]6 䕨rUHJp8|,7Y r^dH4 H_x;Cʛ -Eet'_](jo p~io Ph{؜5PL7T( jDDJmS4Q(3g]?5m~ 4Q 4DvRDՐhURDKkU *ԛ 'R!RAI*l0*tn }lD ҳ%2f>d d@F%zMϘʛl=Bv{fPyΙrG`0R4Q$yDx@\tr7ް`. nI|&Hy(''}OFM%gW5(HH]h( B&Hx@W|DI& +=uԴ k Nǁ7yPj- 6N'Man>7U[,FAwGOEZ;U J|UPc*Ьxq{K[;$ytL^+~@Рj;P蘪AfmǰZK4L!2|{9sMLF&%_AyAO%z@( {T2 ϧRRej,QxJbop\N(K!9r9$(B:d޷n dhᡶ ɇ@ F7JTѡc{ HG 8^$† 7_lMzhWyqhmuTzѓ@QXdtT9%pH i;Jޣ:0 sl w е'x p w9~2R@Yj?)+f>TGN{ik%/ z@O:v*vd8/}{=1>[asHt?oׅaw^ulXڳ@$B@ĒCMZKoVIՏ+ _ݯt +bh p9P?:2iJH J'%a"zzЦK t$@'=Ozh>&"W"d4sy@:xI)rt(}_~ERGG8,?+;ԭ4@*)KD@2XрqSuauc.q`3Tԥ@ >OqS@-c+QpYy] HaIѪIIgFJD1֚ Hu´va@#z`-"3(e@$H"j@PR@IT} j#o TЖ|( 1\O((lb4PאI l}j4c^JT|C>->; ).`q?ʳ[2]8@EK[):,kDK)FUhD6%X@\\&h )@pp>XT6$&м-k18;>펉'@ܸ*yz[ٝn )^hD)dFSdG.]mDd(a:/NxH4o-]/t-*{H4: @;tNC&EshfKĬ@ߣ/1~[*|-./@U~T~m3oJӧF[%421 }Jjt>hlg[lM|G!҃".#jѴ(v3@CI\l#jDKNHd;Z]6ݍEp-(?(*b> 9%P=jKs!XoD|1D&I``>PohDr5 ">?2P(7_[\e9حxxz@SLݗO6>@ E?:ANb <KT虗DUߎlXoݗ P3!Q%#* @K=Q4JHٶo~LG~ٲFIԞ%zgqh[[@nG/|@DO (H}u܆GZQ?` 4@_f=7$M5k=+ (# md>q*iZOK9>~{WWݥǑ׌BB G>~{m1  3hՏ&pw & QuV} 3xE-L}WLOn pITt߿wuD} [&<@jFH~҇mfE#Fb~ Ì՘ 3ݽOECܛzt~ pD?hP2:ݑf4 H1a2s&^/_4'=T2 nQ-gmF'B  ||Z^iV:N#6Eݯ&@63 xh|@KcmqZ˖M=[@M $:gKmq6DeJ3Вglk\$)hNblq$ۥg , khf,=¤=-4hzA(DzXN]@ (l6dɒ4\J "h2 AdO 4zDmIQO$79zwˢb-EZVqvmx: Iz IsZg{st=zmdۯ[I&hg'b<04uuG []{. @F5$t*ѷO< ݈dvx ګ,&/QWsr8u ` h(5샙zP9$OEMFp=T4D1 r=(,E{G y o @//4Lk;㼲pxMy\F= @//@3yߚB'ufEAbW(?͘D@//@3'G@T#їF `K$Q Dձ@>8ЀD$zPydk?D7 cb(b 5P@@5}(Ȯtpy|,jM"QϢM>&V٪hD^$!uM}q< :1P]U5D v3N+*5@FѸo̾Uڈv,hzhʯJg7G.]?$_:DœTC9@xD]=4Fʟ@> Fmhή?J>:*8@ !Ib'J4P?By2zB*:?(ʁB> D#KTɶ7J@_ow$rCWF A@DJT.#@6/T@z a%jgaM 9tb_0PE80hTp" M!Q0. >ȔʁNIЃIGSWbA~wBwD$sD (TPd@zI*ў@B $3hS*@ت(qo05uh*6n8 $5U~*B|bQa4P2$D9.J0|_ P:T\h* Ut —ȀhH5U.~,$^,o>CسMC _ a($Nm73^U (hIy(v Wl*z+댿5:/ڪu@%?6û4EmdNޱDDUd,PGɯɢ&U#Y@+o޶"0W֟B;yq(%ZWmgVkDјX@1/D*l-_-?"]׆M޶9xpϨK9^("&XxNކ%ce!^d+4]G4K(*z@Y ]d,PB*=)S@g[,l I-Z//p&ނuS@[ $7GqEXjrX/ (uɀ\ylrXfp >!@DGu_GdK痕hu]@XPL_?P2}y-ƀ} 3>m|vI.-sGI@o dG}Ś@H$qەd(hIvaZ4> S SuD# |#8HX@~Pc$3a[V!#"P 4ή ㈻K_UA4BE@JDTP"bF =7v _&PCc*{>; 'Q]XN1&6ENYʀBL硊@[S.(<%L0}T#O=W =2*?H=7a}k𲠸 C0#w:<=C5}$ʙ:_A%$$y<:MYfv V6M.LP( ZYK<Pm#d! e 2J0dpD- 'lz <'PS"E8-| yמm^vtm |< '怆բv]+QQ !PTO ԺMEK[ހDS*8~@ߙ@"hD .nzRmH_ 9 OohD7_ +Us]@n׮@@ | 4R.&Ǖ!tEO|ȋ$˹E1D_NL4$ꮼ^%Ž?DӉjQ1~KdH2- @H4#*࿤;t. 5PPV%jK_TZ^Nn;h݂kiAL&ez!"`c%*(ڄNm~ZT Z/Z"Za6PR@brF X } LBD3-GkA49]Bf^ U΅#@ퟚITvq-yGz>d" pq@N#_KGՋgo7K?<2PU*Ԥ夓F omu&kA@,Q"Kc:!߷$k֣5)$sH-_2)NښǞJ{j"ʀi f@\Sbz2q&=q(@%.\U PN(<D8Ҕg@ 'b *1@-jTd$.\lě,$ GM=DD7EϜEZjc 0/@|@*H!fIt4bA_>tIT u'=[U) C7G0!D"KZ r@B ].ST#åT D.@jָR&$IM4^/p߾*ӂ h}Q'L&^mϕ@:bn aq_%cA x+s`S=H3P=8qXb q4<8PS(zy}wu+&v}68 {Jū#X@ @% 5&8G guj= 0wsTJ@PP&aN}]vkpOa<@u=Kԋ ˲:6߂UCt֪P֫B>,Up@ !|uH޵ϬZ "pZ¥6c&Pn5(tFwU!͊$O`e̷p_`2? Pn5(oޔu8WR?Ĉ)ύ"MM+-=+Q)б'H6PDHлDAVԷOK;B64(s@B@o  #s@yEz VS@GpN0;5*xva^TG#\.I:#y]Fz?[΄B:񸷓E$ 1_7_l?Ϥގ0DH:OTÀT' _"Ǣge(l3ɡ]"m 7+dNPS?/&˶釒3%8ж[VGɟ3TK;UJkm;g~l,@D1_ гlQRT@l%Z3zN~,I35~X@we׾#>4=Sh[A» TA+ $3 #CėE!@5 hD;kEx HI $zH-@Q[92zL@^ 5B۫({&""AE@[e=,@#4+m^ qmxuU:j&e˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲeSendstream endobj 296 0 obj << /BitsPerComponent 8 /ColorSpace 155 0 R /Filter /FlateDecode /Height 298 /Subtype /Image /Width 670 /Length 6996 >> stream xr:@_tJT(xm}NeI4<mO=oh*}/?-!b+0W𾔨J/NB~ꤢ+ ޵P'S3w1 65˾(=MlD82KIa{SA<.ā{ؗQT7$!#yS2E oEkSYq?&*f[?Ƥ(4" R'TT[&n`,Nešgi:s*uJW] T獩2Mujyu *u- uұN:IH[S͖Ǒ> JwtAexH$k~aSIc P ;Hp s=㕊(G:?N"۝YKu DK=Y(nyH76wN:M!Rkb+nSx)aʳ\Kq7>9nBwf |}'Թ%ۢwf UvK)w/JG|^gB 9QW3ٞ_V(ֲg~~ )rZ}΁=[0zǍv~ر0tlͩ:_f4~zs5OrT0ڱ:g:W1Y,l,[o9 |jqf?lr%_"4h~<#;a3L6.I .䗶7>IŚ|j!ͥ:-|2unXy=/ӓ:W\#se]Z:Q.dܿZ uf*OCSQ.ꤾ[LݰߌdKFNŝ-\r=.uɷ{R'ЎP'/R\\wf _d'6lrd`ѝ˔._5K.swfQWz ׍zJؠιyu- w[Ke]>dT*]Dהɡ;!weJtLA,ϫ_a ? v~v}wUSQr [$*Ʒ˔_756m??٤\DwḦ́\fw/_1)qur^?}_E(b_h Պz"BTew݈`idK/Sd?׍V/m蹋O˴O"|KBE="/ww2o\w>ŵ!u]ݟ,b:|"#p8-#Rĝ`t|\ xv޲_!G".^||iW߹[ }_nIw_-Ssn>;^vi)o(NyxiWC_F)6*~U'Aveĝ\ FZqrcS#Jͨ?g]ffI\xЋ?t9iOe5K mwvޛ(T{{JИ:7ٰp{>_ 3@/Re.hwV-w.NYWYSxty=uf:̪9@ 3ٲϭxhi,p xu68#|5q 1Z`- ШLig[ O>@6;Pg;ꜵl.aYМ7\^k2啘,i}Ŀc|'1ںCJI}4mĝ.`iQ}ޟ{ĝMStp *MbeJJu.h;M'\rIlZ&xD}{IgiwîSFYSRb_S\ ǗJUNH^;L#.xq fh'-eNm_ĥlG̐̊RbIϳeN\GJ%exu6ٙ^T%@(ujpӂԇH݂<wfb~c.zjec}SzH~<?|g %Lw ֘%IY!.~E\{nѤGTy(#siT-w¾S?3@׳/{ OL|N-"djdd|/U@|۹3xdV )Dͱ'*TRm5 ɌM Lu\h_Lƥcߓg^9]pP<a.f)=`:d#h~3|{צiV*(MzNl>)>'soL8}zjH#g42)&5'cLKϭ׆N_4~vZ&a 'WdT c8t]ehsp}dvEԅT+{Nl>tGs('<'.NFOMx:^'9n*`9ui91$將d~=9 q][+M:]cZ &ٷ;ŖͅuA9ZM:bs ,TMNʞ-^wNxuYRþSnURY9 9$9=OamVIw{w*X˰#rd׌ٖ36ϐec>C.= |&g|RRA%"7$U_%܊&NUIe􎥑PeĈ6Y`ƫNINꜚݷE;EŤ;SVu /x$oVb!3MSU;]hF@;.Jѥh`M.SavF|*s'bgh"Au]EvIsnLz(7ϐtF w:E־OѓDTA&ivv;me|9}*)7]s:4gXϪs7axB8Y's9hNPgme80U`Y#Qy kg._ss:p¾3^*7ƚdRe XvǤC,bV$56܌Df&}HBݢH*fIZMNѢ%ne9b*٧̣CJѓڳulnw,ꎝΔcMVy;j۶ ,fB,',XRV:Pڡ178%jQOmy@Lњ-RɚE[R Ote`qpn.@twVXb|Y7ѥ!u2ڙ ;ɾ1=uF م|zR *jN0WwXuר8'7kB dhK J*]T:i.]ӞP3اa8OWP$I8 Z$d$k!.P!hL^yƮ8,ٻZ}-Զ5Ŷ3rMfgk9tqpXt9+źiȮRI8r !֏Z _3uUnJ8`n&v6" G(fE+hֵ[[n.IortSؤCܨ8bhf1De{ `iYdQKzp4Vl-T`JM3u. v'gk炿2^NzǡkE%8 Cr3i,p1RJ(NSv'3ZG,̵0so?coکir9\;Yoȹû`7Ӣ' {9䕗~-x&NcY4,SkLKFo}u ʦ r hK3Ӯ Vpg\5Q4viYsa(`rЄKݳ5{R=uȨ#7]̚?:~>VvR9Bidn?aZ!W^C\wPب5V/-˩CiiN0{o>W2“FrZ̴B:u+ sEAUYK^.V ;>N9 :| S25ݢHT!6r龉^JX7? wKQ*/? oS2׳M{xǤS^v(:B2Io5눭f;x8ހRyq.woyd7$;/F YNO2;^n_DH3}v]($,Z+: k.&PUrgzvRb !PR`5%Zh]$Jz@<` -z8]p\t)1i=i zɇt8v}P ->֑E!@u5ƞߵVg2?tzte3{ ^t/d:ČX=hTMEl n񠁘 D =8h` EZByJ99V~WׁdW+Yi:IPcD~ S\]۲dRzx wIއ|i]rlR;7sȖ1o3To&ی%5!J߇-4t6 K^WҞ땝J1^9RJ&Ot&3HTcҳ&L*G^]:R<Icg TlWu 3Ay^OfV8_.Ʌ~l#s~2:NC&:!^pOz-9EwZflkO(ekB.K_wT5h[*R?Et?O322ٲ4e112?ǪmMZ<?-yٌ7-325{1k#se|eM,\NN!j^_u|QyT٫?MF{E<5 4E0o}!-4Hw[x)9_-t,QY˨SMI@:h\,Y_}ec,[uΰl I@@O,|PgP瓀: :Y%+F>w_ph/%dr/~vK{b^;R]biR֥yOxӳ9_ ٬>BV癩~pYa5:/ER~Ǫb|+^΁g/ԙ-N)K=~ԥy` [OMsF6\٬?BBygO&nβ.;sv5ḣ^8CZՎ)mTQt'_(%_.Tb/㤙&/5=FymF% oc>ff3l ӥ29-ʅtL[珁XGnGOxj'%d3p Yvvz'^s1?4ybcy>;MZj4ױo$:;/4f&J KyqhТ] 7Y|3!jRXv17 ^Je}cn<QڽLj|A%F̀c~7z}֥9V& US^5SJsj6a4/>-}u& T[vtSƥG"sB r(h1}coN?%wڽD9ّ\S@iR'cqW>hAɝDɺ7R驳4ɥ ;uލ3dώ ?) {; T'TG,/u?TO~](M^j9*2QMSOsz6(1u'G;|Rcq=b" 5>Μ3UH[So(.ױ/z#Bsŝ4iD@yOf4-x0dSgy{[BO@~aV>hGزٲhb@(cxOSfҔ얧IDW|lFӜ́vQ:+ Ҭ ?mNendstream endobj 297 0 obj << /Filter /FlateDecode /Length 6530 >> stream x\Yq?ph7clD,Y G8H>`1Т%GyRL6P/onO7oyc|~_cY71ƛ,ě/w6EMv<#B#,o׍2w?k7Bp.xJxʬ9td5 c|L%Qf+#Ѣ%1m3zC%nV,gA/BGXL#絵]y/oX՘v,G \sϐ~J 2p4 is/VwӣNM{7u{m0tQd{ <$Hv0wn-I ʢxekPub֢C-jۂTat#B's=4lB vZ9ME pbPOkSnjvmN;H~h73>vmHI0N+yoi0`O8S:l N| #++bl#|bcin$XUi{9` όmZ֥k703;( a>.N}Rs܆ږu^֯Ler3^ē/L/[Ϊ@<_Atڥ60Wy]lAf/FkPgM5b OVB~"O%B 0 W +j IyGڵCO5s'}k/ڜH- N @ׂױ]<<>ZcVItm7gFs0S2' nw>,]?s&"|&m/=QZx;6A"ޔt` e7~}U-1;4ә2 ѯ+>"pTs o4Cأ.s =T2!)xGΈrK4U74O"LM{r LJtgqaO lkDž1\6/119pg]6ڪ |ߑ , qlH:qƺ&mLی@`Un3 Oѓ$ jv)w``&lAl8s9W1qyaYӓqp8M5.LYVK"Wu2(2Zܱȭ53 Hk2S"$ؗ"Wd ;1]A/2XqSU˵JA,~ h@gmNuR(UT0laq,:KߺKϐݛE /8|HxaCxida͠uj9KTZ T 0ndS,VU2,A*~׌9LKB> E|{Q女//3Ѭƴ"^om+MfʏA6z/a EJ$ytD^/Ǯ_X~۾Th#waq:[`.6rfp_ŀSv?kAӢK:{8]M^Mj@@/G@VnOTU6zϘƱ S*_"S,0/X\r˔=VfuY8tfBBbằ8He0aߖ3ǬL!e ʹJ:7W֝m'w\B:E@' PU9%׈rd1ܮcŶC@Lo+Ly_b5x3(,Wk]##xydEnKgHW,K{Xz]=_ꪊ2]Z2^R]/דy15g\#I*S51\׵,aw 7 m$=K@\1&Z/KCUy߉I|тBb#4t %ٝ:^Mhʔ r}$qhNg%bLyF>.Aׯ{WTJJ(8Xc[#ga+gP;OXA<ʲj/i7~$(T,(;"a뤹dgT+H5Ŕu-;mw,S'U=] 0M xak[TflaT$v18( <Ut}&x"1͗ 5ih}dž K{ZڷXEMp9 Ț僾em8:5VcPZE9rS0 QA>6i9P 8l9a;PΗ\1([C./mCu.Ǒ ثuǫ&[Pm${75F+\5`t ?$enQhV/G!pW.=UP2}l=pR:YMU۹b2zCJ%t'W{5"/lKrͪ'|\H/+J5nf3;p:6xc)E+\tzLyjNt"'IIk2H =KQI0M. 1-+ⵋ >POvaAYްUKٴæ|Pn*$%i=eܪѰO>H@^R_"I&l?<錚=H=qх8s5ع \@U?Ef4il_0iG$-):jGECp~h`y3Owf.e 8*%B\fbZe`;L` ڏ؃Tcp5"Ec/Z {iŭQB,br4\ŷuJ $0oȅ*5`\/YA:l8ATLb$cTpe;0NW v X":3np閵ŭ>@}%֞qFaVOQRrGgm$oF%R3ƣu hG#O? ֡K?IAv{-VLT8H(b{u\{URq@]vD>?4*Hg8NKw\k_(fiE+u|\144R~̎rF*n٤Lp؟/>IRcU$0t,mMiG}P)9"-*N馵k0Nl:4_+㒶z<펄ª{ ஠a ҭJ/:MàM9IZp1RwʃRv gXFa*sc'p_ރk80Hi] RVV十SNF?C>2.PSԪeJz_ڋqvw>K3)8wE;X\73mi-<&Ehab_桊e}I+Vĭ/GWpyY޻9>r&x}r Ʀ`j#ץ9tA< OWI'/^p F2k{au^wg=#%Iu*+ܽ5 Gz,un1߻:uO"6 .  (.-ժszے5rg`0 %ooendstream endobj 298 0 obj << /Filter /FlateDecode /Length 3145 >> stream x\IsN>fl"/q3$,vT9pHHb %[9@"0 7lL_nD7G;Nߍ__~W6pZ(q76ZyÉdL6smUM_]z]naySdBCL[dC02 3 _΋ p\'|gEۻpH2f2B88'_*ݐ͗ayx c  &"p\G|̯L?0"_4ի/RP.l.|ufs ls lc0:M͢Ep d(AQ|C,gHW!Ř@HkwV.p"1g`>P!ՊAQQ2H =qM!W)@UpC~TN|h >0(s*';ϔ ERt\#Y9<fC*LP'j*frҐyH8(myv. 0\\#0pp pҦL'ѤZ<g|pԾ, W(1Y7w etr\"xngQ$#kgZnEʴ(\ dAi#4nv# P^?8'mr2Np8W¯Y3\=MږH6V@8ұx֭o,Pq춾+6{ߴNpRA?.qm{*n6ǧM(llMzI4? zÒÓf:2=iL'd" eqj[tձy]S}W=]u zr)/:H®:慎9^_/F3b vcP6)<3Xژ~3w#B9t,WbÞ4Hֈ.YvI,;9Psܶ5@ϐ`Z` _|6%Bey ˹qTShY./;5/|A;tJqtr a].U-#*+ .BOXWK UlJ/?e!3.x1^tU"5K(Jc .3n:_7 I-ޮJ61J{蟧GD2Gz7p-uܸt+ֱwJB^%.]iW a]^j#).6V%VKc5|p|ˣCN?yF^xWݒ`0e<9i|;oGendstream endobj 299 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2016 >> stream xU{PT=G]s/ѴӤch1y9ZA0f .{,VDE#F[m$i1V{&eΝwg~xDd''+C#B+͜OB1|[[c8i8WX%HewHbYAX+&D"RT"H'^!6Vbb-H$\_ ^.BDv %*Ȧ({g!)Xߞ/&Zl ~/m@ΐJɱW+]L7vQ H R*\אrZn?Ǔv)̿-zʛ;KԗU4Hhʫ/ l1]"!0Ay׾WAcoy6Զ2TR;2<eݬ:Tg*6z}uCaXuԜI?`F0*tda#@pZ{T)#qw_KݥR)3חz(4.;'i@^0: fL}9n0"#c83Og}1nO q~FpGKҺd?+(}korbFj52ֺm5n /NT-(Bo.*>{RK*,c!= ^^{[9ՌHnպwϰsDQa]e*gnO}Ej;ڴH*'_ R8֕~ROK7P~ -;^GO6?&ѹp'ʧ*qZ06F%)o}M]+how!7>^1?3]=]jƀ {XKNKbYJ''8<67r!fꨏ|CWw`:~uW8WM` bye"TkIDv5MAi;}`A7)b9M(<vtrM+Tt&(hдq*k4&1S8%/@b ̬S0:n7\1ſB 9wFћo51FC΢cl9aa0ꌔ2+SPWٚ[4r4OĜO1pt#lֶR?ku޷bLqao?v!쥟ڴc;W\0pω2'<#@"crT0xbSbȚCjP 0Mr(.dȐ{7q*W,]$飼Z\%܏`10[ZI6D^HEo, j!endstream endobj 300 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 893 >> stream x]_L[e-pdžW-hf64 sѠN!-ѭPVzK  JKFVu@ČDfyȗ$I9빪F-eCґFI*CE8BFp6QUڦrVM˧ZF_HD~@45D-Q498yMvk<#7Ʉ@8&oSIFJR!R)~ZNW}$=lEKٛ>:i:Bu:{PvOػ[*܎eQ^mB!g5p "`xWJѨD{@0|'|1[:&*ĥ2f?QحTPO3wH{t4zㇰ+JBuz4@,bͤ%7e*8wKk1VARXTL$"'*,I=2Y=7;:3~! 7g-/b^gh;G иbi,>anqXK+ҋ+M5)0H?߅=#࿢ґ8}w)mqÔ<԰R}˘2X87HӄhL3EXew?'"p:z\g 6wЙ@}Ny>1'?ctW+/b >#tZ[Fp}(;f-Pe˟yضF՗LJ439x1w]EkNU۽p鯂..D/p\ "X [u4?GIjsV%/ endstream endobj 301 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2705 >> stream xV{PwO%Mbwuӫ}y](hH 䙐/!$@B Oy#ԞB-a}V;=m:u~qo׹ٿv}|/"8άcVZ"pKD!1{w܏ AshNp9axx#wA׉%yi⧢DibS1Ÿ=$b0r8wS${JMۖ!rAl%&ۉijD,G$"uD<@l 6+-DM L @H9/qƂ N<a0{f] <0Cƭ܇Agpr0q#FjvLHc(!aƛDnF1PE>'s 4Ԧo-&ؓQ<[(Ujxoy>>4 S_ -_[4J  %SsQ'itbd3Q-J\o3C^'Ч[OmU 瘯x!iGu;Nfg ~.9B 5G~ѐ7`)JXU~](.<]> nn7VѪٯ+i;!,ZgVydnAEoԥk%!ʁr7UY! qXD0r}N>bV 2!;r)\ozҢM z%>PJ D, +*P*I_E5:NgWF\jQzsY9E$ k? \Cy7p5_t^=O+@C30j(!JgV*TJYFe>*#Ҷ/\t:֠)xC/) J+Ż[e4[h(ZT%J X@H}lgZ8#7NqSm⎔ZFk2-}1!G t,@%"*@F/OفN!(:M mTWj֘U4֬,W4(I%W-[ѝo1O3-{\@s5*:.4} gS lQҰ{g$nk>"^+/ϙ|Q1\9wu1j@PWc&S؃ްYK+3]8OLq:kuYR*cm `\`on4u[ fdbn,!`u*ͨXڍTq9[kMN;N-wiL"@A}vђa4Nw֍Vc&'Bi,7)]tZ~R׈/Z%l>N]:Q]i+{iMe";#SsNmsAB) Oڼ>mW_>vFٍvŠ;&;whsx:{z~՘`;[rh=u0=`j~ ڇG_r?J4\RWqOpOKbؗhOBhKZV'Ѿߣ(0fz[}b-G/> stream x}W TSW>rQ)* 9Tp{[|aE B7!$<# !A6‰3)|sgkS^DL~vYO( ZD |LN#tIh.[²J8 m-I-*\,:H0Ie1jUPr5+u0x4-`PMFd|[ۦT1Vas(Y;y\"u;869 MG*4FpG*w|Lp A#dKc H m<Сkɴ'u&,6eoƅ=BTN*zhE-͹qSrB\4+ jSGXUL\儖ajg犻k]W ,w?dV3G{2%E2"GW*} 7.]"?K )i<:Tǡ] ۩ҫU3ݵ#owiuGgY ~3ДAY//gcJa)w,u]ߺr>],-voLtbNGxL[sH^ %LՈ iɲQXE*Ţ/}6h-:`'֩3䕗d*6]:Ӂ,vF9* 8)`_4+;,8y 2?Z^fa6[bspNYY\Xٜ^LhfL_ɠ4@(-<(gkrz)Yek-!XyeBGHxaߗ Ҥ{>s*N[ bȶ0.Vi'lDY~$7>l|C͕R"WC?iHq Q1X&Zs\gl7鋡wcKEqd@J!O] Lu;tک`4c+A|fE-]<vZBNOl[o}C >pw"ѨVtk;í5eF g6DT^`1]b빜RW$3<8XhfSq٬C0!~7ߟeEqA&.7Kڻ#1 nĞn菊. ^.6C+l>2`DNn"'='\TFFuFArW?^&ulkap3\%IڬC} +NCMf!&A4='$vb}Iđ+:2&#wD8(1 xV|5\.{}莭 ۠ҵt #ҕ@Ɓ#ZȠixn (:[ɆP< iu]3F$cgf|艃Ά ȄNAP.˕ees[_>G)9.̽9okV-c| f29NZ{TuxfB8:Fyz| 84o~jNĖRgmKwò& Mc ^:}Ĉ HgڐV/&޾hr\<԰/cy *UV-szz]2@gR)!34y骸Xu,  d:"7A1kj;Yu'flY"y `lLx4 Gh^5UͰ5F$IY |)fc=^x53x ve3Gψf!'-Js9L!&:oб3& N QÍ<^.ȼ){}^%S7J%TYW&x6WT78|0r.mT)ġ5&f2ԒC T(ZZ\Yi Ӊg'q˗yNUendstream endobj 303 0 obj << /Filter /FlateDecode /Length 1825 >> stream xXˎFk̚fJ[2E810I XY0"3%YR㿟SWͶY}uS|2u={Ik$ e2 2-, &mf<(Zڟu\BH-5^(#:dz}_nE.,#&9ǃZ_lbLBk\n]Y?B] hiVoPD$Yy}u GT^TQR[kbd7ܫF2 !O^&&^8bkuZpE&Ҝ`M*+ m8m'좘u'$̄]@j~sGv\.lpEjs)l YhO9O"#_e0Dky mCh“;ͱZ ~n7Ȧ\'Ok=VZs1.mti9.Y.eATqpЅj`S?wВVWAj꿧VVg1>[8[ Vv9qzO6xh7`HBy6{u-n;c[BZ-eW'N~}l]p bN·M O}_RWxcI&6Ce_Σv.r=8aKXڳml % w'+fFjDV. LXС^4;E~ \qZnÌd&UY=Nԭg7P@TT:ƛB8+(|/ )@"QjMr}bj߀btG.U(6BEv21}G]ĆF%!'cDaGXyif1קnS,Z =ڔ6f҈Hm[ _Nx0@u[ѴzdAnhܕD_S:#!Z0 !yug?Mb@L}*<ĊE%ǏѝXXn5N}!Z}|phdNƻKc }8sz3:٣Es9€Pjƹi!endstream endobj 304 0 obj << /BitsPerComponent 8 /ColorSpace 215 0 R /Filter /FlateDecode /Height 300 /Subtype /Image /Width 675 /Length 5837 >> stream x}:4Bjî)+mUBe[ '~Kx~ja <؎_;b-g(G\Ly>B|1gG fRs{Q:=GŬXBHKQ&,狕0S0Yϭk;oH!!ljR׃VVwzC-bG ʻD K0DljM`S$ʵ56ׇi~ZD A, %][Xђx\ ^4Bf)f\Gdž|M9-'H2IuFBHԧ$OqI !Q>2B>}e$)D}N %(HH$Nr?['A<.WSߢ8"&ZNr&7!֮D;$Av 7vDҫ;7U$46?l,џ%ߦQ~MDӗz5gՏU?E|U y]9+>̔Fμ?*Nj:TOyQk궪O I2)eGMaJQ!>iGUиi//eFG)Q]"SyG5̹u?JѼ/L<FBy|{,;GCf_doUt{JNAymwDQ2iK?Nvt`ʭ YA T*,%JEjH%*ސ"Տۓz3_g UVT$)?TߪIQTXh~~ҵ/Q7n$ZcWbWelk85:R;,_?R)e\'\ܙWi[4EMEbUE_zI5c$WMM 2: Ik5%֢#$zTEoqʡ ggrftew=/EWO%P~#_s﵏Db[pV6M%rIߙRPEm=M)Z+)SL@dmC;*E-^]?՘jtOQE kDؑAm>]!tzǜ&i8nǥ&ߐ@IV:L.Ui U[:y-v(cft87vaȕ f8%_fl{DH W}"l9?@H`5WՓ"qubՅ _$_ƧWf!1GZ)y17~*[ݶi^sYٵ\I2!"Xk6W;>g訸V3˕ĬH9+r3 Z@cn84 0J]F.S'J|"/舱빊Z \ԗ=Z`䰤OV!)6e( 7JYӟD Q te$J/ ;D`bOFTI'l #`l QB7b1 %J!ftjoI 4gӹ4t_+->%H]q]t9vVXJ":*l?QdFNJ? YO7-!BƽTmѩz5koarL[ ׷Z [=RW;[=7l0>z(OɊH z-]ʟFrw2Y6 [=+H8!$PHދrSH [=mJe+Ao!:-^ʆ֪k\b, iܢ6 3MX/ 9(I[=zGiH\Ԧc}Dj?=}׽-aR҄.U5$oZR9- AJΐrөK';r=Jt:l~x>p[f;)? oq8菏[1S3ڈÍNn&&r#̶ SO3al wpttQh=ՕئA随N=g=]) ZNk%؝N=ZDz}{A3iih"+Z^8D]t4D+fU494(:~ijS?ju5At9o<8rѣiXI6ju '&ea:(΍|t2^keO'хxLu):c^M+|^)^92ӝ(6򀟺E\t*SD[Y [+f6^>U-+Oy.nía/.[Y|:^d#7˒T@Nu~ӭFjXXFhpgm8GDnf:eyTƑLvlo~B;=N%IgGЃoۢii$PlE`0u[7RXŞF&qhJHZɤDo%:b^$;N@\&QNutӮFrwjZ'IR?~~}L{.66X {]Ku5yHD٫-i)kW]`Aף-:ob&F0GK]~%s%Y烼Cw+!݄[amt#>ĜF}̈́0D2z4AGMO̵KMe`-Ԕ[_Mۛ̓[D7W&l'~zf=">e1ݩo!޼JEGWK:{(ȽnCKq*α񼤇Vd.c9 kmrE@'.L1IlmSm&]FR!pVӀ/@u|Z3\ ʷv)q; N> /5jQtԲ9mٔvizuuٙIjt Fgnve+-pOHWDH<:4c`F(HBbbT$)KBu`1jX؄RNmofEK>-ڥi68Jc<ڷo\5MN@5]TZC :tpi@c51F}?0*h$&%ؑ[7!Visv4Vck G&3s*h<}J5^#ݑ^q`({'ɜzRHQ"D=#J>?qot;myjnv̷:Yxz k>2eLa@=-?Z4bvs,ֱW]3X3e1f+"R-: ?jէ!?LGhٜpY=*W=YQv!H$НI!7U!F@>E5g?] 4͢>*RGpjӷRԪecRB XN짽YufRe|ҎPu]Lz>NuMs1z_J4Bc7[(8Hrww1F~ģ Q{.;^2OĢz(RA߽-ӨC@uVN 1blL /9"SA"Sr e_HZ% ]aJPGT_stvӎ1zJTc)WO#Oksy DǐV.D>y'ARި.#uN:oښ T!&W8} 6rGSSiZ0o1-uaeyyyc 1IA&'!IIsq5HZW Ĥ/WZ.6)CRm/*ugnuJ#Lb(Ez?2f]VHr_jJCiSJA/UIյuݥLFa" Alt7 e0e^|l.Ϝao*maXCzYh,o0.Wp28(HH$Nܮ$ !dG$OqI !Q>2B>}e$)D}HR#i^.vJN}$y)k Ô^3i߈ͤl?bFU(ǂ`bK??-VRdGqp(VЕ!r; T="mB #ڭ2ĊzNm S,}wYY?5,V(WڄmE(r^6 4?m`(Ȼ,t~\"6VJo6KYNpiGYQjC< 4 |{>o3@:B_R8C?fksh_K!XUM49|i*Be$FϤCZC {!hisrY~U$*&Jɓ@ BJRU=.rRYȊ{35Z'JUI[aQKV?'eBx>DA$taiwDAIT\P<endstream endobj 305 0 obj << /BitsPerComponent 8 /ColorSpace 219 0 R /Filter /FlateDecode /Height 450 /Subtype /Image /Width 675 /Length 18995 >> stream x4/ k9,B.\`!$i2Cå O[:n~%zJl' {[lI%b-b-b-b-b-b-b-b-b-b-x~_Ϻ/;KlE4DkKclE$n/ol*bb&u'WK=XYhThb7EX.zWK" EҳtoаRr`_vߩz6'B@?yJ6f|#}۾<,\.[V,~ނ@iEUxP7O~[2K7*Q@؅ QA= wߓ~9~_b@sK2' 5+v^r th~ Wt߇SAHϼ\pBqE1} i~c EorpICe]UԾ +}sXTU|~98K$% ZL#;wV7BW¼:KE)OQv-8]HTMEy@R7K2֣'bE} K NrJ_x@ V9i[|~y/_ -yH,Z,') ^rY:\3~Vy~]Ł dN*a<(zSae]zY*W6*zf'EؗΟ Do\hv4y@kQPW̕$ rW3@~[,lhZT˥񒗿nqIK ;;49@ڤ"fmM-VbZ:ԋmM-V[ 2ڣ#KSXhSĦh*^NE%0Y-­ iyYot[0tnԈnˏY腓T]AA /J[0P{3U)Ǭ@uhR93vH: vN+fZ\Q6xMrqZ'PS3+zfWt6ӀE; $͏ۢQy*ttĎ @B{] U w9hu/!@}~r׬mh=@s3h0Y9hv~/9B*CA>\ )EǴOQʀ>7V hqEQV% ' QэR;H) 芀Y@+j~DvJCJ!,@P&;3? ihƒ?U)9ʈHO?fW4,++ E6#)Duu@y@+P4?5^w@Sw~m@ ^E?~ z'׳g"M'O 輾Wh1Erp1q&'N'ݻwO::Z(N>ICGGzjS˔ @8:\OZ9н!*:}Z:z8,իъ@+PKyW9 Lf=b{m~Z9:*4UhU(z ô(Ar[5 hg J@9R@ήb>*uS¶)jzsy92tp*P^#Ϣ@P92[H`(:p\Nt;;Г'O ݉4 e(tEH٬ %xK+:$F%_\zrTw"-!)GuI@}G9jj߆߮_ى8$zB9j:N trٜG9j֑W}$r4QHFhO"ɞhE@ ELX6CQ.ovU+b(UQ^)Uw9>}:::'Cs"(zy8EDUzݗaOh߿9J7 z*#1(GS".(at?JN`(zsMo(qv1œ=~l6eZ ɾcηU=|hqU=9@6Nu{ٔS:f41=k@ (ʁq6EߡVT?vopyLVTa$Ϟq8j_ye aÂ}ɋ -5A[t>|Up14d(j@[C(F E kC; mgqGi@+ ~L+ߝ k)E]XEꫤ@.~hyEePW2*L9?$ m\E= c(MЪzC#@B1tiY;g8 K$ EE@NCQ&@Mt߽~ޡkz@S!Yqr(w"@CK~{Gl$gB;ޡ~{HW@~;8RWC(Pa0yHw?%u'wfh2ed'@VO[Q YWg-$/؇%%f}(ޙ_WD(Ͼgu+OE.PQf&.c@ ;wV[Q/Wd͙WdɳE|Rt)+;k{CtՁН;Ѳ|7@S8@dPTx44,,E:aRTo( E( i(y\{ i(!_N v6-T;y){>1c'%:1{7?*ɜs"v S-@ׯ'40 h[ŀ@؞V yvPh>P 48nyG֠(ӺuVw F !)kt룢fMw; tPGSC[CD3PAd %(ʎRtHT$NtVT?` d@|1(J@y.$P[Њ<ݠ2]@ehyhES@SG'{'Rђe?t 5٤O'K!2 !{PpB2t@N2UBCX ȌөȌF^ .\ݜ:uJ:/-;l*A-4*.Gq4{x;E9GME8R"M.Vw` dtؙ#ڴ#@R~[%YÆ5uDra0;XЅ OH-7D:%:}֔"ŏ6.&;MzwkR3T ?G Pf(vc'oWʜ.E7Ȝ.elHW. dNͨ(XdvXCL v@CWT 3 ܭ h(Q+*3pV5È@D"v钊:˅w܉QURQ`_M?:glQ̪@)K(Z G9O DFZ@Д_X=6TT[Zh8j⫦ѣvƨޏF> gfYE ϳiͶP"i%!Ϩh$1WmDȿ #b@]FOL(С3ha ]O&m܊ZDQF96%v:>0$Ѿzr&f@xrxC5hjަ،Ѝ8A1+soݻٛK$n'9 {E htkZ@P֜jAEohݻ GϜp~ (E.Q*{SdR49p] Q&g9~"UTT{#ݻ GϜrl sn{CAbZlKǕ @ٖPQ!ghGtÇ7J) U޻箺L:Q4W11R?~G$*:)DÇ':s Q{f@Np QR )D~}DG3YMQPahz(C[W"u )) 7E) fMwJ4ECG X?hsFe YL+c5+(x_7jW1.X2f[㌆FbxkS ::2B}FC q 22>uT?'>,HEըBE;-;*HEʖw(nqhà-JQ!N_@qGj(> 9E$*hBUIP/s0pEU B [$"VIu5.Ec5b23`- ^%=3Q PbeQ _j]yGeaCqE޿? Wѓ''a Kn&E~̤hzvXL6ڬV~ d'ONwOr MR chhAE;Q2 "h4_ V)~8@꧕V4܈dž3"L}QJ!} _oV$" ᲀ>CKS򀀡'Պ0 (Ugz\Yiy@POI+4| e=4stEyYCYT!}"v6;U@-Y+2ȭI@/:;&EÄ6OeQt"Kfi!4J˗h PDq{B/U/;,+@$0Խ0Կ X&jV+< PnC6y66kqb/c*PX\@X(EO 5u6l"a<xS؏ 9իzw1v__ewvJ@SEd[tRWH_ $pF[STЫaի4ZHw׽.tQnϚ)VK>Se`N%\$gltpM<2u41pȎ$@:&-YQl:z h H2 uƧ%rԝVTv6+͂ӥTO+)Ov+ ZNP?Q٧%hE[;TFQd M%iE[;}CTFQĮ}*ޏAsh8#ԧK4P/ih4`p{{ƨ c( HY w<Pȑ#9ő#ǝƨ +dS4s1w4$dE6E#; 4431wH lbF %[~TTԹvV!jj?(r H,#Ť&AT&3NhCp`H*PQ^;Wtyniw"6S)e*J lR TT @Y?;ZTQE?9[ҒC*uP7:["ŇT,< P?uDE'?YHCy@$]u>EM0/R dž )j8u@éF(֞4`6p;4\;}1EmI M_Q(oh0quԟ?oh럮{b(}C?!uU+Z74Hɩu/umu.)%=w6ԫ:`o1 t ׅ J@< EBC>І@7n9ԆznRȌ Oڦ.QtﺺlU&Lr:GN-ke} %,8x*tvt S7脀U$LӚ* (gXӼP3Zd<`OA@nu)j_ *eD$y }z"F IEoD1hc@m5*` {%j* [g n)p@IK&U~RtL_ {d uzV1 9XnNtoa1R<6MD@*=rY:1&MÖ2kT(GY@[KEOȞc@UbW@ZQ.ߙI~#zOdTQ9.ЯҥjX/LCox.@HOl Π 7n A ][,CѯL$@@\C5f/ |־Gj :2ԴԽ-Q2\@Cޖɶ( d%@,}@ Q[cT @ < \S)l4>'hY6}WPL@ {=3ڏVV.Ey7"}!!I 0Q:Nm4$-[ t+hUN G %m48S8@)E[hem POUm{jW&Pzy:R}}U?M<{,u)Ph(r4gc eM=ެPXǁTMre1ua s. cO:;sࡌX"fXҽ>cR[xwI,(v^5ARO+ZrLP$xV@TxTj@-V#dxp+ݗq+lVqrfZV~a})ީJ. @ENd-Ph24nÒ'.Hnu@r>g?HEwKk%W+ͫJ&K$c??=ѿy$cr%(Y](dVuv Yu%"r(N?[٬YPxRJFKR1߈1ݧ 9jUN79q:$ƛnYx or we09?oTo偼-hÏ9v*2kr5 j+tiLx^RT>>l _Ѭ =zT+1.hiZ9'%LB 9phL)D~5":#]V(?&zsx4M؎|C@A:@|y (ZDE5R4]3EK)GkE[V Y wq^$iCgm4%݁t~EdQ8Gs1sppEo fEpFQaN>ФoHE=r*K'xWs,nY@n\RO^+1,K(?[2E'18)ZBq4O⊤+K}cϟ/WzˏpG'Ęl-y0+o/rMWE/w0s?Ÿ_1/P(!.߿Y1.?ߵP d)O>3d}ރlO޳ I@^sEBt׏%ڢ!h1Ͽ۵uf 6y@¾hPʸuJHW~- | Rted^m_KL9Geż=ѷ >U؟~QmS #(^i2o):`ӼŶB5TԌc FOzEa%[&Qy14e/2ğO`R߿^;l#j.էLC%h`~VʁFoߴP4H97EQyc<,13j749]:'>P S{41L[Y֢, Յr 䠍\@QeϒmyN/bL~r2oe6ݥ-V[OZ>8mc~s D*ulEY_Z>}]E.~.V]tR"3ڶE;2EfsG=R }-HQhFgzgM(GVB(, J(QїGF=fHCRwg2 ) b="(:PF@ ?fW4B9V6 ~@+Q4 ]UZ2佪*reZȲXH;G?@GS@Y ! /i= JErGG9@S/&jɿBjd>{S+ÇGGEt*Я@( @RE|KmS (ZhjE ELrb](tC ]0&*uSmۢz,X~}xӀt|@r|P$;z}vPgPm'OX|~ԩ,uF ̙̮-h￧ɓMҷ@ l3HݘΜ*Qs-4w4Anow4HcѳT@U >Й35N1܏+Gc)* C2BFg=@v2*?G=@]Bi陀V*E.D3&lTP\#/ \B?9hE8Sm?C2'P(wd8  x'+}rJ2\獣.0TtDdUUԻLk6e?hGa¼=>CC@JQ+Cˁ:272$s4(CdyZ5Ӏ_ (M24VTСCDxBЊ}ݺu+Lt(: z҆}?~(hh@ w!(D!HhNE$HPΚC\d] $4@4#CI66@N q54 $1-T;*l05m Ne 1E۹M*k^hjBa%LZM4}8Hm'Jstrt2ڢRYV6z :Ӏe?Z*ZW_uQkdܻC~}sڗՋeJˡ @*ZhhL_|W"3EBC{GE0cI6Pq"? @EM%SU-d@ǻ2* SfUA! /QBŅh+E "E[+i=2w㧟~R)jPP"SN!@YY3ȭEf`@WtptѣDnv~2:iN4N2X44a$&H~ zCEtǀp Luя)6|(pKc?Ge߰@|NĀ.Eei  ͣ8C=h H[w9N ҷů\qmHHWE-E''M:[SQ ݹHN.DDbF3g32!yghPaƎXCt@Ѡ|M~hzІ@A!ڇ U]g)JN'WDE!`mQ(:P@dFE%xyF6| fཬ腯(dE/|E_k Y S!IC ~*EQ y9^!J^tj !Y`h0(Hx kI{cw64GO?%r”]7EgzTT '"0-g8Ǐ6` ܄+:3Лo)fy. K.|){fR a|:pF δ_"7GAnR3 7FLܩ W Z#>򣉢H& /R\YQ&{STbNՀ-8M\~le؝l4-E-PjW h4m Vh44=bflߺ;lx~];u۷@)EAÇU^ @)E7hR;kq)0Mk^WF!w}{|eZÇ]G_}+0 Q ?N7&:1 Qw`};EaFUtum^zr(F>:QprS$ohG3%VQ )< $GTBSto/h(_BS1}] Xb2fg*zΏ6RST9* :Vx-?) - ?8\)J>q %/f}B *!kv(5+i -D#w[ 6-D#VpB4h&PKE>D>vDLQXjlmh *SI@ǀbjbuKQ*QGdN:^9R@P(f@$<;( Tb\x*"/U"Y*o P4Bev-*,FnݲY/)x ME1(ڷ@rODT`s)ڹ .1xWf0 :8Z ο@l\CGˁ spTt $D=`\6:PDI1C] &HRD4]㖃Ȧ޵i 3LGy<Լy6d8lN6^ \SԩL zJQ7r' }ZQ 3Ju4^/i@N}jvJ(L(;%t|N"ց޿o{BQ PSE֧<$RZ?1혓 .)kY@׮Q~SmiM@C1G hmx4# HY@S1|c(,Siܹcօ(f}cǎu!Z!uô v ;Ph HeSP0 Qظ'vcny3h,Db3~w鄁tptW8ݝ euJd8To*:ݓ=Sjh2'!Aai~!i }1.HK0Hmh"#ݵ+smZbT4%TN䨻HSHѮO49hEqǯʽj['hE@nX26 D+ro?pZ8ŋ9;L)*._N5Ω ]1K$СCB4"@ǎ% g]ED![#UV,r"Xn T޽{FuA`7|)*"7Dv!zhUԙE@.luf?SRA@f@Ng/pEI @Q"PY \Q H @zt3;#ohEӝLumjj| h6i# |SK +:GmE_46[RT]h"Wu^m"r?3s +ZF1k0 jCQT'f2W[3H̙_tUK @WVQ<=&n.y+3ePݤb@#. :}fu抩2v"^ƶh /Cc[4j(Qde:DheKTFH=  s(kٯL,,57 (g ^ N䔢rǒ_%c͖sD) N!FE v[V+h| ʼN/b806(L:CEa$ؑY$~~ ׼ 92rF =1#FnIK@05IOg}qytt֊W|p(#=~tj1 tvj1Zqyj1I):- _#_^dB`b$kiEbM|*gy}ezrF ѥK)-DR4Z5w?M6r)9mhR4sW/h$g(] &kq œ8[4Rj?ϋnEEȂ=/*3]gfRx%8-PjOd/<23/ݷ.߀5˔-sl::6jsv@(ȹꀪ%Z`LUT17\7 xӏ*z8NQt78)ڱ: of6@K($2(o6˲mV͞RjNjJIw@YuI@r] <' ;K/\<o(?i~;0|!9pzQ9PDZo((2 W5R4]3EK)t 2rd(;2&ʎ (ݴ3M1 Cq ]u)fQ9rf\" z5/IGGsř33D'_"|4<Qk#7ř3>2 8+ye ]$&S-G1Mޤ VeHgA+:nK! SGhh0mh ȣCAZ@OAkvvvMһK.-Z7|L.ah)3d"5%#;; 7i8FtWMYt&_Fѝ䴢4&|+:E aԝ$FW*EŁK_vB'b̓C0rt1 h*Կhj {D1P:U ? sD1{E1[,[<6EX{LjnEÔ3-b-b-b-b-b-b-b-b-b-؂tWQendstream endobj 306 0 obj << /Filter /FlateDecode /Length 4723 >> stream xZKƑqyFg  EHnvX3<>ݘnHݍ6c (`0#/T2_Wޮۻ~tʥzup3J( ɵIqx,5?J(Z݈,- h-'l: ƷkpcE*"E$}ݿQ</thUmul>!fVqL<*Yİ .]ՇE!cxW:O3+T[Rt`1֢_6]k]*Mtu^ntlK6tA Sݍ{/'I6||0YP `Ie?Ӗf_A"#;L}pfZɓ7"ݯ4UPD p+7Zg@%LXmWɑΤI މ"Vɻ5~(Iz_Q}@׷}DJ2ww׫<{Y+!VI :^iÛ:Lbei.aVO%bDݖ .[rFTrdl i4 "a#Q2h g,\-o\$: dULa> װGQh7?kx,oGfr F%:Q(%L+KaDEBhAB#АBI ͛Ov Me gH@u!Feo/$)qvO1_`rHyD^FIK~NYfB^gS$|tuA +RxDGSH}H Ƣ>^ukK`9wLj,zL@$d} M .{E \2O7~ͷkN"→|4J*lT g_ș1'w4 FD Hg'j˖gB9ٜTF0_mE>8"K\1nIޮ &f j;DKvP o+p@Bgu㰮>!urus{ 3u&p(@Eb5_X=[ X(/O[bh!$YھbqL|@[2j\z3ܱI@J P 5B--L$3Ed8WCٹa~_~P36AO>lWHPE,IMd0R0ATuR<x$v+pH Ldˠ T DYEI&7WX߂QAݥ}'L/>mk;xF.ufi55 X >OSšpFPbcma2 jh %&4csH7Ú-vi)9v J:W>xݯѻ  BwzA z1Ae|ap;Ǭh*Km}uQO:" nYf <>q6[;` PB}_XAh-WP@DJ X#i)!XZ)$NKTEg!4NT ;uZҌ9D kLLN Csr OTr\B|1wW>f6ȑUp4Z?TXvZnc7M ꟹ4-{zm' Eam7L.!?N/`~חM;-,V2 ş Zflc!(7%t&|k'dU&V%2tΫy+%!p8VfB8E93Wx#qFƽʅM³?G[ ⥖r ̷= ? /5\tbZ][Q$ \؇_އXPf2?l+9˨q_e_N"ڔ;qGLi#eJw{( !9~=DTQC!|)YȌZ!Y>M[홉?PxXG._8\ rsCze4׾O(<ҢfΗPAC)K0b[N ܑ֧hKhp`YwuOJsEE1.x"DғKY3L҇6IŦԗHoedݷծ³ i?qoR?<=ͥ炏"_xtrIoڞ1ml1G.S:!38AN3@GU&$4Oo?ˡsTL_`G:qz4˧v@7~*ta2ݦhKյP40`۪EJu'ֆy}GF~f=(W}ׯ  tia2ACp.Dg\sm~[݂Qރb/(@L OP>6p|SqT N:Tq&:}Nޔ\Gc!Te] ,L<2JRhHq]xLjv}m5N/K!j*XjT R>G+ֆSLˇZO;yxh~=hEam*^2,^)&ڜ(@>OyO>8oaE@g1"i=wH)!@ TAs'le|"8gF!"jE7~܋,X {˅.!EuoʂT'XE^|t`7'((EzFMTyR(+ϗ6+S$cb7/UAK>[g"]jR oC61ld,$D1j>g=5֬99n\Ғ*auTl.s-^ 3 lg=a҆zDU-h2*g<5\]#-./WөCL"b؜ qL#"Qx`Ƹ[s܊\}L_R۱!vq(Z U*!W5>JHAil/&Brٞl.Mg0PP}б9y&TJuƷ>i߰v/eH4c8=oX(c\l!6L${J"T@n@BU ^M*X^= >Q}}yՋU}(\3 [N>b9!- tQ] ijiez2$b2ߚ'Kno$>J|YOC,jA,}pe'^ ѮW P`^_b2wtMps[ۻ"J)+h+ddJz.oYB͸=X,ӳ7ZGܼXoW_O*8e%WLsל? f$;> stream x콉w$qhI2  I8A8~ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<Ȼ)Fhtߊ<ȃwԎ>UmO'у<ȘI?ߴY7 vAwH/Wʌ3cҏ(9@߿3u!GRI@o~ln޺͏yya4}L]?$k#?u7Lϧ;OLYZa#s¤SI}t]Q>aqw?eq%:oGAVga}1^sWn>';}D1yCT:oGӏTdxٛsO#oGgaꘫ~$}.1A؟~h:x0Ao"g ?cg>&SR#VG5SVgk&>ܼ|_#;!R9"xяEs֩cu0ufO07|0~o_GR1"yY:x F:o6UuFֳrC1累;0W˔!2G3k~D”BCy@D: hw;Pk^YԩcJAhm~<|WOoDD~sG~B="}zbRr:k3c~8\$SwCb5Rb0t-?|^#߂'ZG>nt$rOޑ<3 3Ό]! 2/SP K#`{S֍QSVJXM-2꘿QnfQc8uK#z QTP:UB_ QTPDͥx Q7P>XL8cE;BT@qh:u jAGDi~i*cls&T FXdruz *8L@a>'F)Cte?)5ȅc:9DE:2i3%꤈NkfQ`m= d #*SݵyE]gDaRêӶ SV#, VQ8i"4^P'BsdF]7(eu*?~VLpu6s#B l+^M(DY3>:!ሮH1:1c sx2s Hi£E]1jz$4:ZI (Y<ǼsM5v5 Q#D&S>'Z<QcP8::"jPط,rR RvKs}}STiicpZB#u|X VM?A $oX7ڰv3CJ{~~M)_>u_dۼ3dd%uKzssnץo?#u%F꟟f:(a VVVOv"l3'F{ju؄ZRs{A!e@NufQ; *\Hm6]fa4FBQ(fNJÎ iY0+b8ux'@':[Q(hV 1= \I9Dy ^Л?xy{[* qڣ)Fz(ZtRD'q:oYQQxp6rnhQ D'+1ˊ/9=>.js!'/u̧ӧZιΧN0e#x;mЉ>ml(;Y8tg'm6'$m9%D/ h¶BT]P*Q!i lNs?D!Z4&C!ʈMz:8 N^-h:W"ȐJ.sl:TΎpx"Dy7\^GV93#bL#,jxMO(NVVV*sMv#At:؈K<>sDCm}#*&DxJet~;B , dJ͵rIon /PghR^iJ4tW5 Vg}}'7"Hԁ5O:9D4' `)ۣse1%;ԹoDCmF!+{v!S1Hцm<:CF__D4t:D(/PCtmS/Z}+)hB{eԁv!JabDԍR At"uU=^QDۅ '*I2:]~\ ! 3'n_ RFT]4;@M.4QTc`}˩{ӥC($6%^#@󦔘p\Y)$R `&_qY؉v N1#JQAP0$~o@4TQRl$*D.\_?&, _3&w[wH@hTGF!e>WYt&ٌ Ćfub4@{:;=8::99;kNNQ@U_ 呙+( z Jű`cuחG4PD P [Q %uʈgiJnD%uʈչoD8Zw~Ɋ <Dيf-7VčWX//Iӧ)^Ip>WWã6%9n)i؆Z+db+݄m._,񱁴4ɩs/Zsӵ <{FTmhNi^DYkE%%F-(dݬ@όH-  /Ѓ '9-..xߞa/:!fECD:4-u:Q1!zO$oPV:E14ZRGsmbe e2h#98gVRmS{{t$"o0w(i-qPB(:¨G(N yu+N(cQi!Jվ̤PgEcD/r *>ꐙOLWBt{:[" u*_*D%'!ByDi!::<>Ff-DT&XhOu(x%yQ@^"dWMlYA~6@4UB?Hu(Uc#j"'ӧ}Y0+>TE/I)eDor4ͅab2D5급uSl@랎(PʼC-(1hD֡E.ʙQΆBNbDQbQ[qJ{/Mh$Ӊ'< (Q7[@w @ǧه:7VHkqy_ŋW(_~ l(~qteaSNdFC+70Bרl7<4އK{,|l: ;RQ,J%( B` _V'E< J){KIlb^hcQeGV+qӯFѧ:(-!jepQ><$!7ЋD^2XQ4NrNχ JMrN[*YQ.VfZB(oGVt]->/Z(Y\H;G_;.9g{-vH [3#׉zx*!KC()!Ջڔ(ϾBaޞ:-M1vm7iY:#D t@a׭\'Z=8/Oo-wv!M}Ԩ IJ#zj&BD)R3At!V#z݁(Q)(ZP'Et nЮ!Qn?y XԹET&@{ri%Q]fwS.kQ7j2piC 7_~ ?N @5ʪ % % @r')6sć5QRk 9B_?D-rj;uQrDؼ9F.Q&/&Hq5C x# dE!D|jbUgDلĈ2 'O/ Jjf"DiND7k%( %E+! 2p0e >CqE+ 2Г:(pQPg|D IzKڑwˊnJ" RE7Bj?ѧ?Lh$`Ws"]JTydTRNҾ(upl \u zRJo޼s0F5Eip? q=;iK '&iK92#քv@G4#ZM1LŦֶK W -Ek9u:_}Z= D)]:Q؏%DhܢA2Zг]@$?_D;|2BMZDeL r?Imgmt>2AKdDήyϵ9D ('sn}D3 17P菾~/_>( :7 O.+ jWgQz=0;]]MHYQfϪ!aK*>Qק?Dv(cz5F)LG!݈ktnu ^DhÔ0јP[?K+&0HD?l y,Tt:h HBD9ohl14Z.ELX?Q%K2 lP!Q ΰ}:YD-xK|/-&J(YJ 8-RUBH? Dw¥P^N = :ڋK4Ph:%:8"nՇhO}.:CD@5G4Qwt#Jz+zۈ.U.\Qh-!SDN ѩH$OR9;JL&Hk ~@RN&W}^q֒[qN}9ڶ;W ٿcOfRy?&ᒗ 6ͩD,Y\FQ*2@Z#ڷ*e?!OS@]MNh݈ڕծ@Nϲ"Ó˧ a>%Ft7z^.Zh#J0Hȩ:+Q).3RS'ﲦyP<#+"  WK:؈6X5b C,8ٍړq6Q!ߺߡkoh~|D%vt # ~zԝ&M1D>+jĦ2(-sN5Vsiu2 pәf,AڏnUՑN=w+j^#]"\8ˍQ@ J :Q0YDeQ" OEFrR;%,B֍h| R3ʔFD79OEq"EBDaMDkDeE[QwQVNZDwDdQ< ZaEU:YDCc:Њ* M'#imIh}" pz8yS,DCшΨNlĿSP#>0F "m+h_'O{ڰlҊje>8*|_] [['/w`M0 ]; zVTM M#DVtoLDNؖ +JBѧuBъlZЖ.(leU! f`*=Ѓ(,eaLdjpLёl7 qi3ꁷy<$Sg ʛ~0qn찢 =ڄnYPPmq xER@~J! ! ! " OyQ`D1fHxQbtDbB"*]mD(1XBcE3˜VфP]ZQy?":++pO-0ڃhcD]7 a@>X& HM{DCHu(U:ec=b)X{RF+< _٥d'F) yc[T#~=ѝXTCڨA#A@0:6q i-Ƚ z SA4k12ԥqlBS:ňQ%V&Gte&#N(Ysn wt2t[I D:_Diul9e4]Jq uel}}_FrV:Q-K >0]%wO޺4Bܤ(„*KB)@9eGP@t`p" gQ( z-E4cBWi1݈BQ>QoB ԙDbhs欨4 M,p"J9UƷ,=^B4w!jVQĊ.LhE *"W(h !Ѯs.;LJ <[%LR(=ZS"/T5.Oh?ʯᾂ4(Kxg u/;K6zD\}RէGI=X8Hl'9 ? [HkNwhS(DR()#2!j\,P5Er0C (!jQrv \%ETEgfw(Hd'DvwQ߷Mױrvt𸘁feebEjMyDΨF@eξ'jDyGYDi"1Ԕ8XOQkIGQ[Z#!_WcDixS&@Aq~'!EܪC(e:"E4W d-GCBSgMC}hRhjE-RC 9?4h3!\Z}ȴ.u aG#ҁ[)#[FcЈ0s = A; 0g!JG*A*S  Hz 'n;cˤ\J=:#WvUa孩H/m~[>I87"y@jKîDtQ^4"ͭ!W(p鬹5Dc)!JDtJ:4{BBf Z+z7ZѣDźGYwQېVWVkݦcDɿY^6qW0SPMuGaU QQp:Du*&'>t{}zov=mWDHiQLo&|CWB4Kܼ@ZDџ&JOS:UD="J4^Dฺlԁ Ћzi:ѯ6;.m骚>iƢf[#e K%@Yhkzxs7"U.#J t/#}(PZI}Јڊ :(i%[IJȡ.$GŁr)!:G| U">Ň3% :Qۮ3V([Ȗp OmX 3TDesZB#B~MQv N[Di_At+F+؈JL# ފ\y~1Fl ]! !JB$/Z@VzDw"+ v1= Cf4AD/#D "&Q+Z@|jD9DtPZ@|Ր 7W:͎" @SuA߷H?OA<ؓ7AG$ړƗ:&p5R Y_x^)nXdo ]ƄJ 2Ma7[AJѝhuCZe%Ê%XI' >|@ Q(xDT]LJ˛DF(Y7hCB QཌI;1l %D=/юMheD]+¦ZDZIDiìmʊjw(-n,#jG@\hъF3]VԫS(>+@@թDf/"M@T}N>r5) `# Y}oP *D$Tf]~rKJ4 T2iI'q_ oT]1ZC7GB͠Y i'~WA֥&bISf!sׇ!s@@'ʈ&;m<PBщ5U]DSQt  l!T" PB:}PhQQ겢a4ii n7L.dlxY#D nƵ)4Ү&V/^ PyD=YQB\464g^o.s~_s:."FyxPmhnP ʍ6DjBP@?)#J'@nER@6XǍ24Qۄks%uz)" ް&AQRH"0'6$˞.BFt"uX>Odڈ]JD%Tj4FqZ/?Zi=?~I~֏:R˄~h(Hb MĊ&]T#?5QdoPa $WQu$@4YQjoIfD i!@M Qf4@.X&(HK=U"ʌf#`:&) JUMhBtќ6" MnD.D]@J0+A47ӽv椈fY:9DL% mEh TGmj[j7t0%6Q%lW/eDZp9y zqA K%_L3Z5,@*1="AՉc<Ń:vS69?::e^Cf.6MӓA?q!Oy+2ш.O{G# 1!Ph4[ pDKꄈrrV! L6q# ~r?! ކoQfT'"D9G4\B+utVt^!N_(Ʀ-VдrK҆׈WШN3pdTi}rۖ^֓8D`)E=7Qq꾠ϋ>hPb/0 O,kG):7E쪴XaIgLA>eCu"Q;5\$֍(D"z#Z#:( B?4G߉h2TVG# qdNAN6(|'͂yDgwz}(}V4 z! lE8Da=A/Z@yЈ²SHzʚ8D^<>DeChB(ۧugmR7^Mr D =݁mŽ,ut ƐXjJM'H;.Gd*09J{(N'iAdEVuDJ:z`6"(C{DO߉ZT&!N'KkȎhmNRoEec[hKDHf]"oೃ l,PrAup%F-C(5ы:uxC-E(-4]O#(X4@RsXՈ4ʝ K17&FxzʮTvU IZuQ%>XɭC;:!x"z\H҉Ue)jD<2c{YeKpy\"Lw 8DRb;iRK,GL~p:(wh-qOňQbt'3Bl~A49F*Op^ŚZS<;Љی %uh֝=cZ "Ad&[-TȫDZ'#4 zvi\D) 3+V!V hdWQ*|B{nw *DيV#ڵ "z-؆?Zń1m΁\Ȕz@- `1.DMKr[+|0gw}Ix֦QOD"K!urdu<RQ Uj\Օ.o⏂5a2*Bӧԑ"AAUIbuф@u|ɇt4JO bm[-;o7pl䥵܁뮌(@QJ\CD"4$u@(#7Mաe1eD(YUrgA5괶hs8I3pzyQ >UGRQ+ZjIA\`5i? I*Y"/@R W!E # W#JաdV*E i~GP7YGtV:H3. )#XUV"a2,)~4)]_DLFQhsI."t7Lt]5fEݞkBp'Z02=Wot,eϋ+*ʑ'@y5ՊnHWmDM==br 9Bju3]H!w#sޏOq'B$~o*ёić!"~u_8v8@VTESo4\!tlݺucCjz_c#5sO ezՉӠކbjU[` 2S\"z栟҆@"=څ(&j3I#ZBjVCBxDmChQf#mubM:pѕ?$S6DZh`QD~FG.i=ښ6bWl h0ЧNb*#VrnkVs^-iJf+B;EW*DaJֺ/|c}mhJ#L*umhNˊ 5:Gvcc)h^|;΀&՟T*D~kWHփ `DqI6yqh75cr}\'Xu3#:2;_Fh=<6XUW>{~CO>ӛd07߭mnѺb @d|Dk 폓V-ٷpژmJ WW/onQ7,LT w+#JZggf?:xw_!F%uH(,/.p/I\)^]ZUyBDda7qWVshoV}7jRYABD>c(GGӋ(Ek]jD+u^!p!g\9^D7]pC]Vgy"o< j6 t2y:qܹh dw-tb@~ ~N62hcDqok(Ac)ty ED#oa*apG1eSh)<+ZdS ΀r%7Xׅk:eD{V|Ə= %x 7p\bىBj rBFVnIc7Eh!ap\L:tҖ3ټ d54ڊ2yN  - Cs h7qE@s)fZ,KQ؈ wz) D)gpzPGWSpۘVG6vb'RAdiϾTa3vuuN[#J0</:أg!8~ǍE67O,5":L2M~ǎ7s@h, A>= AvN29mD%F_E=#DrQTgў5rQdT%/vnɔ :WDqAC%!z"zt4 >+J4P)O͊:%DMD j~ D{zLEI^#08AtsњN5=4t]_ON%+jV9h4d4RrIC6M7 _O 7:%NI ˓~ ]g9-D2zD@DaLDh^ D:!Mme: 3__G9^K*QFBDiIKS ;"43/.J0|LC~1Zb>2$:\t't0V"IJz)#?~Da48ԁv ُ((\PQۉu h*7bʊAA?oD=5VTnuhD`V^>׊xV9[D*c0DikѶ L]dzrC9pQo0JHĔV#;\mj%fA3zH/cVvt:X٥fa/s=|n-1{EA>pH7xGS*)DwnQGT5D4RNͷhN'5Gp1Y ݾ4I e 9D?گNa>kTo /"uzu6jW \%^ i^IBUAT??Cߐ؈\ YDon4SCthԏ^hh@_qmOX'uv>d* j MhDF(܇gƘ'd$<)Daڤ~;@}'쌣vL5_8O4詡\:tw>JvgfAO;: DurC6 UU"ZQ`E#u:Ek[Qa,D]~:whe+B2OLQ>..paՆq yeI}XHP_iE59ϯ,cM~o%)QvasBtN-cL2tG[(ot\ @t>&C_e ҏh Cvp3~E}P|_t:2%+m>A0X]`@U!zXgt +ZDՒ#ZxƊ;S^%R8 jAqB5Q90aG3'xBK} Q(M\ޖ ~2˗.u|W89Rз$y ?}^z\_Wg{c":C4oQnvC"5km0]M'eӗ4b=TXQhXʵcv. lFnRw ہ|^}"畊$EjuZuQ D+J5o~=" ܍sۮB"b+sAimW:a&)pud-={Oh!>1GGROўLY@G7½>/O2Mj*LY"ACnGn4/:- u8ݏ~ڈR_7o??ܨ?e@k{puOư3N2MǏϜGk+*b{C|9?ܰbMeBiz4e:w]gQTGO{;o'_8 5M~̏z?oʹzg1Sz *&W`n.6: Qxs+7;B,NX_:aN I<6ԉPٮI-uޒ:'5R(~m K%clx>!dA!eu:lo:};1則5ata + ̔}>1jq 䈒6-L7::}/D5f4EtsP~rPǼ7KQL)*ufQ/LЧe:Px@ StrFXRwlCBT{A{!_~9૸ 3җN@u"Pu80QQXzN(Z1]Z*Y+(_R_~eWy^ hNGGBh2mr"ˍ<[:A<|]v*hCVSATt@oW_DÐ8 dE at:>^z {{:jIONѨlgPURV:a4O{:dDB1}?DoGMcM9DъZї/^X'aB }CT%u`I!h6-H QԊʹZLEC:sp5%BtD:էm$eIJ(# _C&~K(BL`D Q'"D-OVNG ݗ p?ەqi'PDE؄8Oo8\jChaoU#zAQ|g HoyT(<[8wpɩtEh/ispZ$M/Zu:S@Fu D`5( i CfkM"ׁd=&RV g|w:h'*-3c yQAzShk׳4P[hi7NNkP8/6QVD4 k? J|4j'HD_*+::o2|zH5Չ]Q~mhQJԉ %L"gAC'4RGwԙD݂"i#o:\7/yhdb+}<: e4CdzDXT3:)=Hd;$oo;6 gD0/?VROULN~@L=¡ZQYčtdsPwQGĺ߼QB!u V.& DdtչD9E+)~=-DIS&-D6 "}:^06 Ets8̀]O)fIЄi!jATf7"DXD! kiQmK! D+G֪cN}%`AtъաŚC2tMd2&y3|__o4bO Q"ty^Rguի3I#7Kԑ"R@Fк&gGT!kv]U|z_ E&5sLj8wJZ(! _+Dj!NQ\19OK k3(#j&:T-e u(\wѶ#4~k_oo?XOz#qu%ܘ8:+џpWB6Իi:dDT,2 螭y uҹ#Jp z5>1O5D4ؗuX鱟HyբN:?jDWCG_!B9Q@ԪG#sV'7ЃF2QN^1$QCosc" bE3:uDHF ,w{1BE(DŽ DBF%ՉHG4"2qt"D(_|m(xD/Z(@@/$؇&8z{@4~?/_b~8_+KCݽQee)=)#LfԣN@Co_QJ6M{id'[{MduUtz(-O'|Q^9D(JNC(NDJ(Zr(Ӊ#hկH&BDɤBt"~DlDz" <ʧK "NKC΁D9#R?/lQ9 [q2/Tj&@HDORDOZ3#~>MQM-Fe_3W,RLCD u)kg`Dqs'#K?2ܤGt]j8JQ(!b/2ft kB3dbƉy\&E0Y^D1{GԿ F<[>AYB9pQ@D!%2eΟФ&adHI @^C}dj)yu\~#~ l@:}/zv W =pLzȪ )U)QyW#Q݄$(>Q! ݚdjvY͌:w(P>74$"5!J3r 1FؖT8 F# F(,ÊBt%j(H)w (QĽXѱ(2殱+Jꌋ#ny65Mޒv36@V d,CJh82.֊:ֆ0R Btz*o\%3~Lz+/J:j/i:@ħfTع!V+wA#V I xO_*X\$<_ C>r(5m ] o+Y" 6#e N6f;DlQ5!YdT'("f##TB:f&)Bj]\/Qt#MNKN &l~5 Qo!@/ }ƕ77s#Di|,^%DzQPH +پ[Jl)Fh̛QYJ-I(Ծ4 8q I^#𫳈z<"P8aڊ! DqӖ j]U/ @4Q vPZ(ETU8r?~C̨Q%mJ',2RW rhZmEQLBk* C9gEy$S s?JNÆ7 2؇"0kOӟ&8cD{-ӔRƐbqv4hYDԉvv=NزitF)b4aܗ%b^_#iEE+?QBJ-DqsJDRQtўlD#7“ E m DhQRYRBD|S QԆMDU<}%=CH߰ s){Is_4ͳg}$꘩QP~Gu;m $Hi0M@4:c&77oZ\hBe7D$ӭ`2EDs~D[Q!*{ǟm Qm>KJ^fn8y{N23!VTt"zatQ>J$Du&ATdtQQ -DD?/K}w˗r/%oKEgW:Bh݌фh}xԡNwGQO|\I T}%X2O[g&/B-DE4]A [hSmJ/9?ƧwV.DMFam|D!PKЇhb{DuI<н|/xS~ u:h.OVﮃ\IX}á\ ѰvYDk]rDNLDڜDK- ڎn'2eO«8]tt7wj';|bY΂MND7l[5%dISZ2n͔;2k<ԯ ꌓԎ1/>@Vw ћ<`P*F3'DQ짋h:ٓGэd儈B(@7776b"ZQ<ao၈x> QFVt.D.Q`nDabD(0?#RjRqPi&6u R/`@NW执}T'B4F| DS+"JsŅܹs-lu'Q 66`KRB!u|/E D9 .YvHBhƢї !UӋ! #"95mr-D&&A0ꦗʈRiwfѮ\n^_NtI'n=Ɗ:DsDh| &.x޸ose6Kiz͇EgZkkZt2opG#f#!A݈h SI{m# 5"1AA[Q5:֪ ƈFbE}tzD3.%gEIhAGWS+D9'mD&3 ;.v"*:DPI& %FQ@يVdQXQtQ_Q !@TIb.D!Etݵi(Q]"?ܣ +ZV,p5ɈEѧO557/_7o=p4y>ݢbO[Ɵ%D1%7O@'is~Qhf/"ZX]+ %+:`up/~:DaI.uXp\v'`0O'gc+IsvVsQ^SD{ %޲[bBN:-e$$R"bD!giQ[[aO,5yFz؍uQQ̏h<' DwSCED!}fGR5$ƈB֊Rfm(6ϤD%赢"{ A\P!EIv5<" D (CpZ+hu4}v4B@pg8.Lpyw T'b̽+OZQ=l(I4QR!z~э3D|s  OAQN@2QsQMHaf27^.Duu}i{ND3V$NCJD Ј zD?n5ňQ# -# Q@ڿ>E@ D1 ԁhpj, 5nYH HNwpnQ e:==A9;3ҡhzKǦ8OΕ,OXQTZlw54M#j!1DQNt4]#L?R5.#*i!k9NN@#w;ˎE(}$sI<e9NďFrl @ 25,BiP[DD+Q;śhDѥ&3F3 zq|CQ?L@KT5V&ЋKݏh2B/NvzNEAQ /-Н]m\ã#!S+SO~bk,L%57t=2A!*=#j{B_>75"ҔکzGpWrbWw!a#*UxJD&(P9I(>Y_y=J+ڍhEgCD~3ATkMQUG`5!y؏v>@Vt8v&,\m"{mM^Y(()A}QŨF@(XC:Dg(TJl7 Qp~oH{,CH QPQːG;,s# @'18$Dx;S.M$s8SGtsE#!Q;'@ FQqb4+3N,uȎ(-׹nF=-ݬ)dpȰ.C [vur0/#D2LZCO<|zD!2 ~zNՈˠѕnD%1I: QSf7֎F}4%QE)O:@H4.w 4(d5mdDEA8;^SjE+X @!>pc+_4@d/pjFqMF#i95~~{ z*y'Bp:RUnK10D?xDi' .hDw(`>`E}F$HOCDd|9E%ސs=bL~B xJ~DDi\6j~ي{HETz)X UsyDDOQRj"SGϊ*D Qs!J?Q o*J:52Q=[DIDDx PEdGv-#Ѱ= z#-kPyVA$Qesz-' R+@G&R@{|Gk.iq ~ra{7N5vMȢ\FTBF(GFޟ&8Flh@-">thQH'+jDiB,!xꍦeC51K|Wc~aNuyəxǣd8`?,OI "zA4FA4fDg\*LRܵVрϕ+ DNԠ~rf`2! <䓊'FBD:+)BTEAR3Da5^Ҹ)PhEt%BMFc#0 FmbDSF´Ue5B("5n}l#ځMXҜ%!Dh i|X:ŌPDIQx܋(# 7!JY^DQ&t87~;r)SoFݺψN1ZZ7*ҩ<R+j{7 *X6*ԁQ2/(@zף=>U:Ɣ(f,e V72m+.id̏)hܙug sD3 .E%@#D=*de)lJRDT #J#* r1ɶ[Pe >b ^Dكm)~߹*haϩ;:eD<QU#@75Fhv eD!$NcDAӊfj+ .J7V4( X65)h9U@66ʈ7LuDхJDcFcjQMlR%{gWn+`U!m H\dZusDF![ƂO#DNʄ0Q̨ͼPLWR36G].Y/L(@GN@T3 {o|gh/!1b9ʤ[*B&sQN#6G9$NuQ_#2 ǥѺ:Qڮ@ԸOQ Ԉb'Q*ЮtUAvH#&15ѦU# ʊDm#Q:MBm#i{D(پS˲ˬ(м gE!G.JCԐ0{QT)r+C!Gt-X%G PC1Oދ`6\ 9BMrͻ :"two pO>N|}(gƒ}1A41&8^`E 0 l0.}[(l2 Q#FT'AuD<\qKΔl) FxPp蘿eÐ5p[GTvQq"کN( ` Q 7RBSc a UK )<(&gY2FTo҆exĈR'B:h-DAzhX>KDU #8RnDi JSDOz@tnШQ4KuoV ]5Wm?Y|X|w҇ɫhmg%9)ӌſ_VxkO8u'J:<̿4% юTFq4f@TxIULNIөj>1GS&Q_D" 1"mgMEurD_Q͞!9DE:a(DZV "zkQM7١ 0kًCc9eEClEu XN[QhFVz7GãGu(Rf$$5CZEQ赢Fc i'{h|by.0fὨJKs1 \G'oM*:Mm3ދ7j/S@B4;vcvPTh [Ϊ7رGX6JPgDtH|jS QgsI'کÈҐ{D]2}9vO!z ԁnEd# E$h 'ILDŽqQZc5PSEx N&D!$eJK(>*1jDnK {ztdJ ;z2U} *\]"?;Ɉ1ǻ>3D#RB"4F;F/OUV48ND=9s:U=QxS>h_c,QKݓ(`bD) }nߊ)5 ֆ~3@%jfrSLx+D(5!+zumfT2 š nPQ5qF:3 *zHU~;X~|&݃ߗ&t@ZmvՑζBi8fzDZ5fy SjI:hG\1dgĸ>:S3ÈN_kCDpԚQ'O3uhԯ+i~4A/2~ΐG/:sDhF:/A# D #JOR4b],E&O-" L(I GDeGSˈZ,?~4~H)e;;Kws&V`E]sׯɯ/ Z QAWxMAu rH9ܬ:>Y&tr;N6:͵ Yru`o] =E"D|~DؿWc%D!GDyMuD!G.YQC=i DB Q! cNH(OF8_~xΟP+Q!A(C3`ZN''qFYhnnR _tg(DO^ EﶙЈ>۷By3W> DM!g ܆N#Zk$NP@hnAm~;z!l%"]mF2ij?.Dѥ볢nDڋ:]bEĈ|xDt툶ЈxDaVΖQ ֐53ww>}9K?=R@WeJO:؏ 8\ܼ L݃>ޗC!C\% ',ɸGmB/x8)GhW+(|+71Mȏue(fxFjE[GJw*uZQC:DtZDюI|V'GDErbf,^hry׈..tO&]!iZZSڭ`.+܉3 #xVU'åڻ9VYR)funzCJ|SJz%oLjr^O8!(1ڑ=Dk5:!DFۻ 7eZD8@]Q iG3uCg?CZFT@4G'Ձ~!zX ^^yI=W8QiڥE 4ʻoMT}7[9|)D^/x!Byㇿ?=+ B67@4Qy&v} :uhzQ7+1 OߍK3cYdp?Te)'%D}ni@H:9YE>}y/z[܋򁥗N+F{fr#a7Hjw8}VF;E\Ag/$ z+V2훀vy<'e>m B".D_Uk2D݉Deyp7w9BTDCzUv iHƻ4m l>EDQ"tDۊ~D=B7EDUuu}N(ۋXQJB~ (3c+Oh/j;:(?:2w@PLRB1oKЮ)ΘR)(0pZu{&(pjg&#(G'ԧ?Hbl ;ψu3( o"o# A w)ENї9Ҥ08YD1#Rڭ˂:H5 y0w [F?OϧR371AKD"J-s6^D!v6mDnD"C:蓳Ћ(auN/:Kvӏh@{+:/MA1#6 y}H:!U}|N` ^(vs櫓+uX:TI/?,T$7 7֜jIv5u~ˤ[>y~-" xȝ_wvДV?sQ좬J+fT. )De+I!:jB"er4EMj2:7EU DDCj'f>QB&{NK"QW)0hUXBmʊNf2RoCMU|~sqF 7<,mDeJWP?h&@e2`ms$?>ډ#N2B1DsfEiLњTWg UD=A|)uv(V7xRj ʡD֙puVf p r1KU":ј^Ep$Y1_aDGCxFQRc1DÈCdEtQpNDa uvtagg(6 J FRH[\htƨw 1TǷ~. Qm@SQސ叐:ñŻ4;yM 5E j? )?-0;qA45!=|ӈN]X^ + |]!j/9?5\Q[GW*3n\h3 VV!JrDZЎc5)DˈoԾh:(cѳ38?צ|&${~D C!|{{er.1ET! + FQ^DaV SW-ה^"ھa:Y RV1H;5蝰/˺WXjD˧нѡ{N I8tcCX6wN0=>PPzEV1F"m$Y4 :QĈ:ok1ڲ De2˖,OZ~_Έe={Yf٘{-,2,2,2,2,2,2,2,2,2,2!vendstream endobj 308 0 obj << /Type /XRef /Length 246 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 309 /ID [] >> stream xcb&F~0 $8J ?@6^Px8FA;c-0Ggؗ]"VH6" A$X|X,dbl< >P)" @G9s@$S;"~H ؄ w?|"E3H {Al i7 lX؝SA$c| ;Fp:<e2{7`[`i , 2abe.U endstream endobj startxref 287618 %%EOF gstat/inst/doc/gstat.R0000644000176200001440000001466314413507461014402 0ustar liggesusers### R code from vignette source 'gstat.Rnw' ################################################### ### code chunk number 1: gstat.Rnw:73-83 ################################################### library(sp) data(meuse) class(meuse) names(meuse) coordinates(meuse) = ~x+y class(meuse) summary(meuse) coordinates(meuse)[1:5,] bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ################################################### ### code chunk number 2: gstat.Rnw:88-91 ################################################### print(bubble(meuse, "zinc", col=c("#00ff0088", "#00ff0088"), main = "zinc concentrations (ppm)") ) ################################################### ### code chunk number 3: gstat.Rnw:110-123 ################################################### data(meuse.grid) summary(meuse.grid) class(meuse.grid) coordinates(meuse.grid) = ~x+y class(meuse.grid) gridded(meuse.grid) = TRUE class(meuse.grid) image(meuse.grid["dist"]) title("distance to river (red = 0)") library(gstat) zinc.idw = idw(zinc~1, meuse, meuse.grid) class(zinc.idw) spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations") ################################################### ### code chunk number 4: gstat.Rnw:126-127 ################################################### print(spplot(zinc.idw["var1.pred"], main = "zinc inverse distance weighted interpolations")) ################################################### ### code chunk number 5: gstat.Rnw:136-138 ################################################### plot(log(zinc)~sqrt(dist), meuse) abline(lm(log(zinc)~sqrt(dist), meuse)) ################################################### ### code chunk number 6: gstat.Rnw:147-152 ################################################### lzn.vgm = variogram(log(zinc)~1, meuse) lzn.vgm lzn.fit = fit.variogram(lzn.vgm, model = vgm(1, "Sph", 900, 1)) lzn.fit plot(lzn.vgm, lzn.fit) ################################################### ### code chunk number 7: gstat.Rnw:155-156 ################################################### print(plot(lzn.vgm, lzn.fit)) ################################################### ### code chunk number 8: gstat.Rnw:162-166 ################################################### lznr.vgm = variogram(log(zinc)~sqrt(dist), meuse) lznr.fit = fit.variogram(lznr.vgm, model = vgm(1, "Exp", 300, 1)) lznr.fit plot(lznr.vgm, lznr.fit) ################################################### ### code chunk number 9: gstat.Rnw:169-170 ################################################### print(plot(lznr.vgm, lznr.fit)) ################################################### ### code chunk number 10: gstat.Rnw:179-181 ################################################### lzn.kriged = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit) spplot(lzn.kriged["var1.pred"]) ################################################### ### code chunk number 11: gstat.Rnw:184-185 ################################################### print(spplot(lzn.kriged["var1.pred"])) ################################################### ### code chunk number 12: gstat.Rnw:189-192 ################################################### lzn.condsim = krige(log(zinc)~1, meuse, meuse.grid, model = lzn.fit, nmax = 30, nsim = 4) spplot(lzn.condsim, main = "four conditional simulations") ################################################### ### code chunk number 13: gstat.Rnw:195-196 ################################################### print(spplot(lzn.condsim, main = "four conditional simulations")) ################################################### ### code chunk number 14: gstat.Rnw:201-204 ################################################### lzn.condsim2 = krige(log(zinc)~sqrt(dist), meuse, meuse.grid, model = lznr.fit, nmax = 30, nsim = 4) spplot(lzn.condsim2, main = "four UK conditional simulations") ################################################### ### code chunk number 15: gstat.Rnw:207-208 ################################################### print(spplot(lzn.condsim2, main = "four UK conditional simulations")) ################################################### ### code chunk number 16: gstat.Rnw:217-220 ################################################### lzn.dir = variogram(log(zinc)~1, meuse, alpha = c(0, 45, 90, 135)) lzndir.fit = vgm(.59, "Sph", 1200, .05, anis = c(45, .4)) plot(lzn.dir, lzndir.fit, as.table = TRUE) ################################################### ### code chunk number 17: gstat.Rnw:223-224 ################################################### print(plot(lzn.dir, lzndir.fit, as.table = TRUE)) ################################################### ### code chunk number 18: gstat.Rnw:257-259 ################################################### lznr.dir = variogram(log(zinc)~sqrt(dist), meuse, alpha = c(0, 45, 90, 135)) plot(lznr.dir, lznr.fit, as.table = TRUE) ################################################### ### code chunk number 19: gstat.Rnw:262-263 ################################################### print(plot(lznr.dir, lznr.fit, as.table = TRUE)) ################################################### ### code chunk number 20: gstat.Rnw:280-283 ################################################### vgm.map = variogram(log(zinc)~sqrt(dist), meuse, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5) ################################################### ### code chunk number 21: gstat.Rnw:286-287 ################################################### print(plot(vgm.map, threshold = 5)) ################################################### ### code chunk number 22: gstat.Rnw:300-311 ################################################### g = gstat(NULL, "log(zn)", log(zinc)~sqrt(dist), meuse) g = gstat(g, "log(cd)", log(cadmium)~sqrt(dist), meuse) g = gstat(g, "log(pb)", log(lead)~sqrt(dist), meuse) g = gstat(g, "log(cu)", log(copper)~sqrt(dist), meuse) v = variogram(g) g = gstat(g, model = vgm(1, "Exp", 300, 1), fill.all = TRUE) g.fit = fit.lmc(v, g) g.fit plot(v, g.fit) vgm.map = variogram(g, cutoff = 1500, width = 100, map = TRUE) plot(vgm.map, threshold = 5, col.regions = bpy.colors(), xlab = "", ylab = "") ################################################### ### code chunk number 23: gstat.Rnw:314-315 ################################################### print(plot(v, g.fit)) ################################################### ### code chunk number 24: gstat.Rnw:318-319 ################################################### print(plot(vgm.map, threshold = 5, col.regions = bpy.colors(), ylab = "", xlab = "")) gstat/inst/CITATION0000644000176200001440000000157314413506220013511 0ustar liggesuserscitHeader("To cite package gstat in publications use:") bibentry(bibtype="Article", title = "Multivariable geostatistics in {S}: the gstat package", author = "Edzer J. Pebesma", journal = "Computers & Geosciences", year = 2004, volume = 30, pages = "683-691", textVersion = paste("Pebesma, E.J., 2004. Multivariable geostatistics in S: the gstat package.", "Computers & Geosciences, 30: 683-691.") ) bibentry(bibtype="Article", title = "Spatio-Temporal Interpolation using gstat", author = "Benedikt Gräler and Edzer Pebesma and Gerard Heuvelink", year = 2016, journal = "The R Journal", volume = 8, issue = 1, pages = "204-218", url = "https://journal.r-project.org/archive/2016/RJ-2016-014/index.html", textVersion = paste("Benedikt Gräler, Edzer Pebesma and Gerard Heuvelink, 2016.", "Spatio-Temporal Interpolation using gstat. The R Journal 8(1), 204-218") ) gstat/inst/external/0000755000176200001440000000000014053224431014171 5ustar liggesusersgstat/inst/external/ncp.dbf0000644000176200001440000000457013777370515015455 0ustar liggesusersdrWAREAN PERIMETERN WSVGEB_N WSVGEB_IDN WSVGEBIEDC(WSVNUMNWSV_ENGELSC 31647227904 805264.750 2 1Centrale Noordzee 60Central North Sea 23836518400 991292.438 3 2Zuidelijke Noordzee 59Southern Bight 2996116992 608006.813 4 3Kustzone 58Coastal Zone 21310684.000 25581.318 5 4 0 529338496 176858.797 6 5Eems-Dollard 39 809406144 237455.656 7 6Waddenzee oost 63 2482308.000 8782.396 8 7 0 8828493.000 12204.778 9 8 0 37539448.000 36667.668 10 9 0 58258608.000 52365.965 11 10 0 92012928.000 71875.711 12 11 0 1566943488 222147.938 13 12Waddenzee West 62Wadden Sea 37442780.000 43513.047 14 14 0 160017344 60477.840 15 15 0 890277632 192198.391 16 16Voordelta 57Delta 116148648 69161.266 17 17Grevelingenmeer 56 371725664 182730.094 18 18Oosterschelde 55 455953504 212864.031 19 19Westerschelde 47 25196141.700 47435.919 0 0 0 gstat/inst/external/no2.csv0000644000176200001440000003022514053224431015406 0ustar liggesusersstation_european_code,station_local_code,country_iso_code,country_name,station_name,station_start_date,station_end_date,type_of_station,station_ozone_classification,station_type_of_area,station_subcat_rural_back,street_type,station_longitude_deg,station_latitude_deg,station_altitude,station_city,lau_level1_code,lau_level2_code,lau_level2_name,EMEP_station,NO2 DENI063,DENI063,DE,Germany,Altes Land,1999-02-11,,Background,rural,rural,unknown,,9.685031,53.524181,3,,,3359028,Jork,no,13.10280590444669 DEBY109,DEBY109,DE,Germany,Andechs/Rothenfeld,2003-04-17,,Background,rural,rural,regional,,11.220172,47.968754,700,,,9188117,Andechs,no,7.135128196791652 DEBE056,DEBE056,DE,Germany,B Friedrichshagen,1994-02-01,,Background,rural,rural,near city,,13.64705,52.447697,35,,,11000000,"Berlin, Stadt",no,12.7990107440876 DEBE062,DEBE062,DE,Germany,"B Frohnau, Funkturm (3.5 m)",1996-02-01,,Background,rural,rural,near city,,13.296081,52.653269,50,BERLIN,,11000000,"Berlin, Stadt",no,11.830893889864175 DEBE032,DEBE032,DE,Germany,B Grunewald (3.5 m),1986-10-01,,Background,rural,rural,near city,,13.225144,52.473192,50,BERLIN,,11000000,"Berlin, Stadt",no,11.980110277555427 DEHE046,DEHE046,DE,Germany,Bad Arolsen,1999-05-11,,Background,rural,rural,unknown,,8.928172,51.430901,343,BAD AROLSEN/KOHLGRUND,,6635002,"Bad Arolsen, Stadt",no,8.935610662702798 DEBY122,DEBY122,DE,Germany,Bad Hindelang/Oberjoch,2010-06-21,,Background,rural,rural,regional,,10.404233,47.518013,1169,,,9780123,"Bad Hindelang, M",no,7.020689619637259 DESL019,DESL019,DE,Germany,Biringen,2003-02-01,,Background,rural,rural,regional,,6.552036,49.416885,339,,,10044114,Rehlingen-Siersburg,no,9.226796157053245 DENW081,DENW081,DE,Germany,Borken-Gemen,1998-09-11,,Background,rural,rural,near city,,6.874553,51.862,45,BORKEN,,5554012,"Borken, Stadt",no,18.70002344794623 DESH008,DESH008,DE,Germany,Bornhöved,1988-11-08,,Background,rural,rural,regional,,10.240596,54.09323,45,,10575785,,Ruhwinkel,no,9.159836327480242 DESN093,DESN093,DE,Germany,Brockau,2011-01-01,,Background,rural,rural,regional,,12.211111,50.608135,430,,145235120,,"Netzschkau, Stadt",no,8.54799427254379 DEST039,DEST039,DE,Germany,Brocken,1993-01-28,,Background,rural background,rural,remote,,10.618275,51.798626,1142,SCHIERKE,,,,no,3.5893264081276546 DEHE039,DEHE039,DE,Germany,Burg Herzberg (Grebenau),1983-05-01,,Background,rural,rural,unknown,,9.459403,50.770382,491,HERZBERG,,6632004,Breitenbach a. Herzberg,no,8.400254268233276 DEBY124,DEBY124,DE,Germany,Burgbernheim/Am Hessinggraben,2012-01-01,,Background,rural,rural,regional,,10.316582,49.444516,384,,,,,no,12.012725102002506 DESN076,DESN076,DE,Germany,Collmberg,1998-10-01,,Background,rural background,rural,remote,,13.009405,51.303772,313,COLLM,,14730330,Wermsdorf,no,8.636825016306878 DEST104,DEST104,DE,Germany,Domäne Bobbe,2009-12-17,,Background,rural,rural,unknown,,11.891525,51.83728,71,,,15082256,Osternienburger Land,no,9.354437456798943 DETH026,DETH026,DE,Germany,Dreißigacker,1991-07-01,,Background,rural,rural,regional,,10.3753,50.561752,450,DREIßIGACKER,160665050,,"Meiningen, Stadt",no,8.995248039863394 DEBW004,DEBW004,DE,Germany,Eggenstein,1976-09-01,,Background,rural,rural,near city,Unknown,8.40666,49.07655,109,,,8215102,Eggenstein-Leopoldshafen,no,20.493843279960355 DENI059,DENI059,DE,Germany,Elbmündung,1998-03-20,,Background,rural,rural,unknown,,8.80122,53.83017,3,,,3352011,"Cuxhaven, Stadt",no,11.104789649054135 DEUB046,DEUB046,DE,Germany,Forellenbach,2000-01-01,,Background,rural background,rural,remote,,13.420573,48.947611,858,,92729444,,Gdefr. Geb. (Lkr Freyung-Grafenau),no,4.333945989382777 DEHE028,DEHE028,DE,Germany,Fürth/Odenwald,1986-10-01,,Background,rural,rural,unknown,,8.81725,49.653465,484,FÜRTH/ODENWALD,,6431007,Fürth,no,8.120225166556141 DEMV026,DEMV026,DE,Germany,Garz,2013-01-01,,Background,rural,rural,unknown,,13.342138,54.323514,17,,,,,no,4.383776623560161 DETH040,DETH040,DE,Germany,Großer Eisenberg,1994-12-04,,Background,rural background,rural,remote,Wide street: L/H > 1.5,10.787137,50.619179,907,EISENACH,160705008,,Schmiedefeld am Rennsteig,no,4.390458645846876 DEMV017,DEMV017,DE,Germany,Göhlen,1998-02-01,,Background,rural,rural,unknown,,11.362965,53.302353,25,GÖHLEN,130545416,,Göhlen,no,6.004551736946301 DEMV004,DEMV004,DE,Germany,Gülzow,1992-01-01,,Background,rural,rural,unknown,,12.064709,53.817772,17,,130535313,,Gülzow-Prüzen,no,6.843800975142158 DEBB053,DEBB053,DE,Germany,Hasenholz,2000-11-21,,Background,rural,rural,regional,,14.015253,52.563835,88,BUCKOW,120645408,,"Buckow (Märkische Schweiz), Stadt",no,9.110279139763184 DETH061,DETH061,DE,Germany,Hummelshain,1999-10-07,,Background,rural background,rural,remote,,11.661233,50.791618,357,,160745007,,Trockenborn-Wolfersdorf,no,5.704372785485123 DERP014,DERP014,DE,Germany,Hunsrück-Leisel,1984-01-01,,Background,rural,rural,unknown,,7.193486,49.741035,650,LEISEL,71345002,,Siesbach,no,5.223882314791547 DENI031,DENI031,DE,Germany,Jadebusen,1984-06-01,,Background,rural,rural,unknown,,8.09059,53.59617,2,,,3405000,"Wilhelmshaven, Stadt",no,10.450504669281006 DEHE060,DEHE060,DE,Germany,Kellerwald,2005-10-09,,Background,rural,rural,regional,,9.031753,51.154842,483,,,6635009,Edertal,no,6.500547300478271 DEHE052,DEHE052,DE,Germany,Kleiner Feldberg,1992-03-12,,Background,rural,rural,unknown,,8.446078,50.221943,811,,,6434003,Glashütten,no,6.913817430801052 DEBY004,DEBY004,DE,Germany,Kleinwallstadt/Hofstetter Straße,1978-08-01,,Background,suburban,rural,near city,,9.171545,49.869419,124,KLEINWALLSTADT,96765630,,"Kleinwallstadt, M",no,17.107523426602675 DEMV024,DEMV024,DE,Germany,Leizen,2010-06-16,,Background,rural,rural,unknown,,12.463929,53.396348,116,,130565621,,Leizen,no,6.520525826751615 DEHE042,DEHE042,DE,Germany,Linden/Leihgestern,1995-04-05,,Background,rural,rural,unknown,,8.684398,50.532963,172,,,6531012,"Linden, Stadt",no,17.19400233075487 DEMV012,DEMV012,DE,Germany,Löcknitz,1994-01-15,,Background,rural,rural,unknown,,14.257408,53.520458,17,MEWEGEN,130625212,,Rothenklempenow,no,6.572471710102648 DEBB065,DEBB065,DE,Germany,Lütte (Belzig),2003-02-14,,Background,rural,rural,regional,,12.561389,52.194225,111,,,,,no,6.5688081305907895 DEBY013,DEBY013,DE,Germany,Mehring/Sportplatz,1977-03-01,,Background,rural,rural,regional,,12.781385,48.182835,415,MEHRING,91715101,,Mehring,no,14.525675711369342 DENW065,DENW065,DE,Germany,Netphen (Rothaargebirge),1985-12-01,,Background,rural,rural,regional,,8.191934,50.930328,635,,,5970032,"Netphen, Stadt",no,5.5828906369949856 DENW066,DENW066,DE,Germany,Nettetal-Kaldenkirchen,1987-12-01,,Background,rural,rural,near city,,6.195867,51.326939,49,NETTETAL,,5166016,"Nettetal, Stadt",no,19.60067672326852 DEUB030,DEUB030,DE,Germany,Neuglobsow,1991-11-01,,Background,rural,rural,regional,,13.031661,53.141304,65,NEUGLOBSOW,120655502,,Stechlin,yes,4.248033122879065 DETH027,DETH027,DE,Germany,Neuhaus,1991-08-12,,Background,rural background,rural,remote,Unknown,11.134591,50.499954,840,,160725051,,"Neuhaus am Rennweg, Stadt",no,5.4560661043846945 DEBY049,DEBY049,DE,Germany,Neustadt a.d. Donau/Eining,1977-03-01,,Background,rural,rural,regional,,11.777817,48.85321,359,NEUSTADT A.D.DONAU,,9273152,"Neustadt a.d.Donau, St",no,11.463016348388106 DESN079,DESN079,DE,Germany,Niesky,2003-05-05,,Background,rural,rural,regional,,14.749731,51.285355,148,,146265502,,Quitzdorf am See,no,8.341097323821916 DENI058,DENI058,DE,Germany,Ostfries. Inseln,1996-02-01,,Background,rural,rural,unknown,,7.21398,53.715302,5,,,3452020,"Norderney, Stadt",no,8.455727814497608 DERP017,DERP017,DE,Germany,Pfälzerwald-Hortenkopf,1986-01-01,,Background,rural,rural,unknown,,7.826522,49.270264,606,HORTENKOPF,73405004,,Merzalben,no,4.996870112175138 DETH042,DETH042,DE,Germany,Possen,1996-01-12,,Background,rural background,rural,remote,,10.867189,51.33308,420,POSSEN,,16065067,"Sondershausen, Stadt",no,5.731506017470791 DESN051,DESN051,DE,Germany,Radebeul-Wahnsdorf,1967-12-01,,Background,rural,rural,near city,Unknown,13.675006,51.119511,246,RADEBEUL,,14627210,"Radebeul, Stadt",no,12.431592385265933 DEHE043,DEHE043,DE,Germany,Riedstadt,1996-03-20,,Background,rural,rural,near city,,8.516797,49.825165,87,RIEDSTADT,,6433011,"Riedstadt, Stadt",no,16.680100143239645 DEUB004,DEUB004,DE,Germany,Schauinsland,1968-01-01,,Background,rural,rural,regional,,7.908036,47.913254,1205,OBERRIED-HOFSGRUND,83155003,,Oberried,yes,2.069317908430549 DEUB029,DEUB029,DE,Germany,Schmücke,1991-06-01,,Background,rural,rural,unknown,,10.769533,50.654068,937,GEHLBERG,,,,yes,4.390458645846876 DESN074,DESN074,DE,Germany,Schwartenberg,1998-02-06,,Background,rural,rural,regional,,13.465077,50.6591,785,NEUHAUSEN,,14522400,Neuhausen/Erzgeb.,no,7.68523284266574 DEBW031,DEBW031,DE,Germany,Schwarzwald-Süd,1984-01-01,,Background,rural,rural,regional,,7.764528,47.809892,904,,83155012,,"Sulzburg, Stadt",no,3.4389926002665256 DEBW087,DEBW087,DE,Germany,Schwäbische_Alb,1994-04-27,,Background,rural,rural,regional,,9.207639,48.345778,798,ERPFINGEN,,8415091,Sonnenbühl,no,6.540338979727645 DENW064,DENW064,DE,Germany,Simmerath (Eifel),1983-09-01,,Background,rural,rural,regional,,6.28107,50.653236,572,SIMMERATH,,5334028,Simmerath,no,5.509009866414982 DENW068,DENW068,DE,Germany,Soest-Ost,1989-03-01,,Background,rural,rural,near city,,8.148061,51.57066,110,SOEST,,5974040,"Soest, Stadt",no,12.670414585555143 DENI077,DENI077,DE,Germany,Solling-Süd,2010-01-01,,Background,rural,rural,unknown,,9.55462,51.708839,295,,31559501,,"Solling (Landkreis Northeim), gemfr. Geb.",no,8.40113799392387 DEHE026,DEHE026,DE,Germany,Spessart,1986-01-01,,Background,rural,rural,regional,,9.399442,50.164433,502,SPESSART,,6435016,Jossgrund,no,7.538232128849274 DEBB066,DEBB066,DE,Germany,Spreewald,2003-04-17,,Background,rural,rural,regional,,14.057064,51.897598,52,,120615113,,Neu Zauche,no,6.242489303806773 DEBY072,DEBY072,DE,Germany,Tiefenbach/Altenschneeberg,1983-10-01,,Background,rural,rural,regional,,12.54887,49.438465,755,TIEFENBACH,93725308,,Tiefenbach,no,6.55314033706656 DEST098,DEST098,DE,Germany,Unterharz / Friedrichsbrunn,2003-06-24,,Background,rural,rural,regional,,11.043384,51.662453,410,,,,,no,4.3249722250585805 DEUB005,DEUB005,DE,Germany,Waldhof,1970-01-01,,Background,rural,rural,unknown,,10.756733,52.800774,74,ZELLA-MEHLIS,33605402,,Lüder,yes,6.637390724799518 DEHE051,DEHE051,DE,Germany,Wasserkuppe,2000-07-05,,Background,rural,rural,unknown,,9.935862,50.497711,931,WASSERKUPPE,,6631010,"Gersfeld (Rhön), Stadt",no,5.258516400704886 DENI060,DENI060,DE,Germany,Wendland,1998-04-01,,Background,rural,rural,unknown,,11.16705,52.95702,16,,33545407,,"Lüchow (Wendland), Stadt",no,9.88399812585395 DERP015,DERP015,DE,Germany,Westeifel Wascheid,1984-01-01,,Background,rural,rural,unknown,,6.3781,50.2665,680,WASCHEID,72325006,,Gondenbrett,no,5.270283853346025 DEUB001,DEUB001,DE,Germany,Westerland,1968-01-01,,Background,rural,rural,unknown,,8.308208,54.924969,12,WESTERLAND,,1054168,Sylt,yes,5.123743401705111 DERP016,DERP016,DE,Germany,Westerwald-Herdorf,1984-01-01,,Background,rural,rural,unknown,,7.9735,50.76675,480,HERDORF,,7132050,"Herdorf, Stadt",no,7.5608887467047445 DERP028,DERP028,DE,Germany,Westerwald-Neuhäusel,1994-01-01,,Background,rural,rural,unknown,,7.7299,50.4243,546,NEUSTADT,71435004,,"Montabaur, Stadt",no,8.176328171592356 DERP013,DERP013,DE,Germany,Westpfalz-Waldmohr,1984-01-01,,Background,rural,rural,unknown,,7.293522,49.423138,455,DUNZWEILER,73365006,,Dunzweiler,no,7.241496239470168 DEHE024,DEHE024,DE,Germany,Witzenhausen/Wald,1983-05-01,,Background,rural,rural,unknown,,9.774589,51.291759,610,WITZENHAUSEN/WALD,66369200,,"Gutsbezirk Kaufunger Wald, gemfr. Gebiet",no,6.34763255724478 DENI051,DENI051,DE,Germany,Wurmberg,1991-06-06,,Background,rural,rural,unknown,,10.612481,51.758163,939,,,3153003,"Braunlage, Stadt",no,5.652281144348398 DEST089,DEST089,DE,Germany,Zartau/Waldstation,1997-12-01,,Background,rural,rural,regional,,11.17235,52.59317,95,BITTERFELD,,,,no,6.349581619662699 DEHE050,DEHE050,DE,Germany,Zierenberg,2000-05-01,,Background,rural,rural,unknown,,9.271233,51.360752,489,ZIERENBERG,,6633029,"Zierenberg, Stadt",no,8.549351783351376 DEUB028,DEUB028,DE,Germany,Zingst,1991-09-01,,Background,rural,rural,unknown,,12.721938,54.436989,1,ZINGST,,13057096,Zingst,yes,5.197794008346108 DESN052,DESN052,DE,Germany,Zinnwald,1978-05-01,,Background,rural,rural,regional,,13.75145,50.731476,877,ZINNWALD,146285201,,"Altenberg, Stadt",no,6.719808983782324 gstat/inst/external/oxford.jpg0000644000176200001440000017505113777370515016226 0ustar liggesusersJFIFC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((('" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((cVr5)Vh촻:c l&7'?)]7J ?(/)d6׭rUJ!fTe)\0İW|R:}S[kMr݈S#eH I9+y〹'XƯkx?zI s<ʁ@Rp=:+iʱ]4,B@Hx6Wg* #!RGU=b~#h-GƞoZYOt9H.cpq joe]~ѻ>Am6zPE|cJ&Y^!ti6gKXò#,Y6 ƽ;ǚ{vʶ22DCnB2hQ^uwށD3[B~e'8Va߇.O; ,ѩ\Up @+[N x?`o6JAֺ(_Y<׳~nڑWn|G_e;g}?n۴[d}޼^kwⵯ]Wje"Ou$h}`^~WXK_5 yz̍mC:+H *4ƯAm Z2"+TF$fÎ/q}ou+`I ȿ#A x |bOgWnnol/EzMM%e#Rqx/Z>:n^^Ep8!BoF9#:o#> g_Yյ=ե~dɈ.Ðp:kxþv滇OCʮK+-Z+4ͦ:VKCe@%@`7劁(((((((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((+|ATkVi"'c"b]`=]yW/7)tx?U񞕶;{"IG61 s&| ih%#H'ses7QA>O|2^L&Ucc["ez|t_WM6Oytb vǵFު4rvjR麄^u%+7XdFA< ;Xml hQc(*F0@ ? W ?~v_ɻnFq#>s/ cB?" lb8)'D2Ǥw".ӌX'|46.WKᏆSC&;*[ I \ ?(;w 5音Eυ/|}Fm|2Jy޼<?O%momLуIkŖAf.H!9.4$28w1NUv<=xW>kֿdԭ61dۺy~e$oi ~c=ם![ۏ94:u?a>F=1>fO ؓLWq\I#<N:`q^z? MKhO ʌ>~ߜm"E;nCGZ񝆑Y]}˔ݘ@8r 7 . T_ K^@,5/?J i\_IZ6o1,qme6_F@T[e Z5hhbKI8W6X<R麄^u%+7XdFA< Yo!{i)P2H0U _~|K:c-S7yѧn0-o‚xWWR(jDA]w4]NKΎ\bA1Ux_vo~{.%GG.c1Dg]Ĭ} uf~]JIW8C^Uyk^'>ScF (_0r8_Pi:YZ|u)qJ2#3_:B>x{6Z'4 v䐔Q$lIr(fWZNkiVzneg [#E $p( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (((((((+g]7J ꨢ(((((((((((((+Iƶ㏂^#F}z6P;2@$sp_vC@VYG%UؚW,?M+?@ g??lUxsGW,-4CFM-&x+khSIrĂܨ$`$O g??dUxsGW)>?Ю5]C #|ȧkOß? ?&K<9A#cß?6?*D9@ #k>9vsKhV,-#"Ԋ3xsGGWSL~Zj)?AV FX32k~'ΝZv+Ay v88tQg"=H?, 5ҿc^ X_-.9@ g?dUxsGGWzU2Hti!8u^{idGtJ$h.3dDnP%TY^K:@.{Xdi$kϾ9ڋ }4h#{pqf>ß?2?*K<9A##?G"~q4YG%UUt*~!.몠((((((]7J ꫕g((((((((((((((/_)O~NƠ( Z֛]C0&Q p@"KCx=WBTJٛ.Qx$j3/-<[he@qFDR`!*xx\/ `7<e߳v߾͌nn]X9|)+l#u ^k[#i%ib4p su]#ִ.t\L#8SPWz~];b0k1+|~xK%쭰w%I#S5h'x[tKj!W{Ñk 3qKpF&=1+z@=o_ZO,O)wː9bOEkƋj 0-GXm会͝IaF#;&{uR# q@hd:F-|\8w f#ܞ®[h15\ c*@RRgP\;x3%: ?»rS'M1dT8.<܀33qPtEP گto?1*/EUYpԓ]PEP\-oxxImun]}pJ;Lp6@cQ@Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE~NƯt v?F5tQEQE޹o-. eLdJ렢2th8?ٺu .1k_)((v0NJ)T  +9${(5b!'~:Z1cSY9 ` {(Wks(((( U-mV/??/Zڠ((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((!WW۫?\.]J) n+Q׊z9_6W:+v$tPx*\0Z=/TS0\pOx/?%|Z\_Մп$;H8=r>]O#1 ?U{|c"d~lN}x%Z=T)>HHp(SO#p:/X.e> K mBn,g֠;)Sզ]"+D-8bPH9#qצQEQEe\փylC7!U@$<9'գ('uscs/1@ SKkuU[zs ʡF@`FpO>/KvJ{Gm ĥHPp>€.QEǥˬ_# WBsJG gnu9kͤe *|ypCYe̷\nFF}*ZǕXYn38Yj{eNA+$ AÉq46I#DR"!<ug5vVuv}d0F$I?yk\Axqԫd~jQ@k'Ώxc@|KLw# mld.̪ $$>\ j/eǙqsa>,I} ( ]SΏcN#>%[,w,;0,sJ ji5iyi_"ۼsw;@xCA3BJgK[TQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Cym1ME"7FV#jrCm$unt*~!.((((((((((((((+m־p|?]ZV%id2D/ lqS袊(WX_zɲL " cQ@@5]J[K#QHV!|#Ok6f%p2zmnp3Wg߉-ZKJûv%fx>`t}nUuI}qrwwۮLȦXBa_j?Hukom'/$+!9-yĿ'$7qcNwM z$@(x]d09R$~kWY !`:9^ŋ^ mB ^P>a$g4EGY{->im77aI[ )Je3ZC4Ȼr =JTyleGr W|dvx㕅_n(` ]Ƨ J:o}Ccïu4]F_AkSͼ" ۏ'$fBԼ!ZXNFKoqր=.DF<}l&:fnŖXPFnX5Q^+wm w&IԬ0:*pܳ8D"Cj(+uO6tiuuu7l1 ~V#Ҷ[;n"HvZ.M;ĺ\~mJn*7!=<}xs[!%HaV#Vxt*~!.몠((((((]7J ꫕g((((((((((((((?MmZ 6zi7܊9*'5}?x7zvha1W9jֺ4cէi.eb^,A+ ҺKlU澝((W i]\ 8by $ӠV) ~ۛ?1ba2X0<\H9+_&_T@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Z,PKs$hΰT< R.OA_lXo3[$DL;Wy]f+mѺW6~#.,xnu5O evPYF*v`\m|whZM?-<٤vB͓-zPEP+Ow.}:V{{^WF|=myVK o.< Pn#8'Ҩ׾_ƞGsWdPĀE|]ǃ*Xu UV -u|g^E/ŬMw)WI3e_*F@v 9$-|kC BE#7VUF2{upq ɮ-tGFF)vU3kh.F`FxmR 'c@x~fm,A'x2{9F%# ,bk=*[wݵ (g+D?b?((((((+g]7J ꨢ(((((((((((((+3$G9뵮+m֊((((((jKotd؋{A-A,3+ӮylV`?Z'Z؆"g|~\&:$@C,ݧ,iVO,{~teNs\;2{{ZoUeeߕ[깮@o2'm@f5`d1c׊iG<|Q|=h V/8[apBF 94Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEz|PMn2cs#6SفEvm:q-F1G,4g+$)ǡ^,xs:*jڎyg>/.\T+O-00@>(ZkoQ/m$,ܹX␌?#nwciж3%MZ7 uJ؂;T#ڦ=RS[wm,7M y2fdQl0BzקEPQZ\yk ՜Om2,KIC)A\?ڷot^[XjX^O3EFOU mFs xw~˻˛hI?(dIewTQEyCc226q |=o[[HUXDb5ŏ@>BsyKτZ!ȃvo1@~x%ğ t]R'y7C1Tcy r4Ko ilY™rHv븏Nճ'/M  h~+hoXsl66bybG'5K,6(I5gPxV#:]'YGn׈x'}_JOXıibE3V%RȲ`TE4Lҩkj|! !}RQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE._ AoBZXY-Wz=y[3VZxN`A|..QY^-𮳬>e5ߓgmqc85o)]WI%ޛ%˗ܷ10zyrkɣIf$hK3닸zBFF@{g,/IZ$0GR1_?|ottY%ICer?vmb|xWU"rd YV{+~Iu_M=\ fi xo&OCQ6(mf =}cIgs@ku\JE,͒#R(JzQX>d]ZWVr)6<HIH<ޠ*UY^BIC)8#4nE6I4gf8ׂ|ii3oemb>p71P&?,LBPG?{'&rDž9jn]vXA8'54>O.&W;QA,p9<Ҁ,V[jĕT~-SV> z޻Gm%gF*>퍦:Vje-/ >X<)tu;+ƹ(z*݊}~a]>rrzJ_ԑ܅_6 D{O(Sh*kgqa̻%ۮw#yqF'u U(+OFȱ3]˷h CI;~fͻ-5?K,o,Aw7&_TXLҩkj ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( ? jfG;˫qF.*ੌ`;`s|F[ hڢe$ @~# xf'M2+x0GqnjWIYi}١~=+> )el&lva[nh$wvy2|2ӯ#5#g q6F"`-Զ0l}<:TZ@V=t~FX@O#qSw~0xN[#XN=}s_Li x}귈7kVByG<<'?_ͥ>|f[ OopP|=IUMKdErG{4DNFv8X{UGL2}dA7$)U'$qpy-дem/\%%|p|a˿YCI,w7IrLCUPTFW/߀k{;mB8gbSG!FI'~8WǤi;:ul,R?:^YX_|q@U׈QW@X/-45Mn0R63Khx+Y"Xj;8(/ cb}1H=i(~|M׍tH5_4K> 2TmrB1aEcCHAΝ]_}K8"nAh']לd PRm-&/>U*WX],vr:qCMFIu3$g\.e xR6DnwBr:qI#̳D5mŁ;W+NK{ԑԩ9N}H-_7Co졤m.2+2҅f,~PT>Y"+ NB9I+ppx+B ( Ꮘ?Ye,6VEޥ<^Xt}1 ௖97? 0ҩkj*O׮!=v ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( 6o,L[ĀFn=0;uX<>w7K)20YO>j|B ÷eU$Km-t=q>ޕIxJ-“ d~"m4Z4FP cӐhVAVܠ^X#-/aXrGʸ\-o*$$rc4)ij5LF#WG"ɿнZap #|]*dgSvr0y$ ͧ#e 7Wq2 5+FvHXܳ9%ę$k((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((pgM>-2+Ky%EfGR :q*'h[i$FE $`2r:=A~x#KΟkq}q--M*4 | ~ff: zy>fg)OHN*Ɖ/ 夬V'!6 >JTZ:TlI)kn,6Fڲ-Nր.\P;to ]2}.rg<7n9‰u]*;z]iC,E%AFTtii藺do F$nHdt R+k^"uIḖݧ{;!1ȉ/ ro[msmYtXr")cey9O5Jg;U2U@$jWY@ I'$}M%ڏGqU>~קPI将Yn%2H=9曤GXCuP\ L5t[]v-Y^ Em->VY$~n8Myf/_kV֗UDw,7V;F0u_]? ?kڎ W2& ۶PTF#{lnsmnd]2%Ip@ z1i,c/DŽ`(8"sqM|g:wc>L1ѴQ`O.Ce?(09 u 'IQ^&2 j{֚epaہ:Iqax4m* #{B>(Hg%E(YOPA+?@tٽmxC+.}@=O_=n(btD)s߭w(jw:1^܌K2.Q@ 5'Au*8>h;h<#Ǟ޵k-U\ vmqJ1$oEׂ/dzb6GMw[ Wӿe!mb1H{ JA9mO^b]ʝ"}ns<}3EPY7w#"Wm$΍~kU uk(g녑 >Y$nœ3@ nd}<繕-q!8'Z,Ċꪨ]K[QEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEW E;iҾ"'/ wiDUH"=# E IU0պ[.0uyPci13\dr;]6Q(ڪz֓D{֛}i^Ŭ9qX#sq#,bFABGy`z^o$^:{tI=a&I@reOcZT{ibqQ92>yh:m!qb3f_u}P\1]#Z"!Rf}*qԜ ހ:߇^0-kCgʸ\Qz"zo=G>#[=I)?, m=W?]\÷BѮ<.xWA^c]ğxZR٬< ;Ƃ hIc򗏝rxCA3BJgK[TQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWoIF<ڸ_Mtm'4+So{[#jd1=J7 b#3 i2]h(-S;y#(2x~::W\0[;ƦiGCT'$,p<E@٣E:yi8V>]Yf2*;o,4咋f}sn7qZol0*lr}>fQdֶ<jw1W޺Q =AkCW ᮟ5k{F*̬~VN1_z}\K$G$x ܎ۍ44kR?b7D9'#bf.nK+ԍzAr4a#a={aWh`G+asGJPOHNGzY?\[ mR| ̓ۨ*Dtak;[4n(i*y>)?^>a?11FjZBHol% $9+ĺ=ׇ.F4$n, AԓԜk)9N})4&toQk61h`3Os_2ڷdfo*FRr cA^+."%'Fw マ(׍|_۹-(HekWio,(l/ͼ9kK8.aϕ2,#"I;H%Vd]ʈ~R3 H!̈8ڻJ;|^d~ d[,bfR~2r>vĘWZ#gK1!P9* `$&:WaG|kmK/ċo趶Xn䗍KF F+#>ן |R|]i%ὟPX82m!@\`|' Ck40&lilsN 99g!Mh+HcYfEv| gK[U9_tkj ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( 6zk3$G9fV$NBdSa[ɩ3mZU (Ys@=sV[86ఆ'ʜINm~ͣ^jpn[KUٵL<o9PA\]?kJ.&ah3)=+9>O|[sC[YQOy7(TF A$&;YbJ0ʰ#Jgg~)i$%`ul%t Rpsqc_U? Λqj4btK8>KTʡA\x=CI}W{R0[o*A'1#5R4-cJӵ;h˖A('V ZKD rxRc"kIK 0E p_'r/$/5OGrHħ6o\{mwZƧ$5!#VOpnsniVGw> ⊡Gaւϭ< t0(eQ@ L\4(˨1M6zϱSc>ԚF'tIx٤yXH&\' =[,tmX7mkwdV<*{Wk¾*v%ZwGٓlu I=ܵ]6> "5'`7r:g?:D>o٤6*&FFGK$%ӵhD`pאA-MխcXm- q>o"J$.U0 |&㏅-m$$T# Ā|MLj5&4VsHʘ9ل] 98#׾yudԡ,#U!>P{'u%y$iYrerIc9޻zȫ}]LPEPEPEPEPEPEPEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEP^#1B6x}I} +Mn%XD857v^Zky SLJDaH ם a7R4mFd9.Do '5^W:,z[۬Awnv Ny%ev0 ^WT.V RyoskX20)z%xcY"C`FA5mBHү5-B_&MFY$,& \q2GA4^[V\y1,#*@7߈zoP#?&EQ$qLC1`ezVV~7V;wm8zd֭ 4g|5'v C*D: ' xK>^%݌A^GPU @ހ!tx^_ZE@&bHUU<2k;i>, w BO)Z+@,0,H$R{Z[kel$X I8#>DҴW6Yۤ(@Ppϰ)EmX`;o}sp+Nk>4|/sxqX(Z[me$r3F895洙=j-AчAߩquD2>a3Eׁm89NWJO]~y)Yn\QEQEyݕfʣ-!y3RAb9k|.ďp"GדU>-iUᆖGl2p2A>uȯ_v mzgO:V/ҙkk]-QEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskX.M[B;tL[ʟ7t.s[tia5[$t N7ݍ6_c:T#Gg) ,ɴ9%pqEPo0x76LgUVOG(G Nxp+fi~,>54+2Kku7?L$cڇjH:0or;$ %("r2+>]x}2|CH]b5gPX6U10q9CW!աWEbF `Gs{#d(?kPlR% cǧ|89ǥu_ه[^^[eԣWyfg*CG6Bt dyT!'.BBU={v;J)t<((+7_ӎYUyP6 :qByHFsI3^26چ->JXmfr}C|e:/)jy-Ͼ= ixOA/ e7$ [gnv" rGYaZMS=Y:JB1xP_EXJd_*_WS%tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsaw:Zq(FF9dE =|GK4wE-?mӮ@B$cV O}EHH`DyY@$ MsrcTc>9G5=7Vv; YclcrmA6%e@8pH8ܬ`8"3Wsiwڟ!v^ie9>\+Y<h}7 V&jV4oui,)$S38D2N޸yU(ι3Ӽ Ǫj]l[TV` `1sQO:sEignaFXnXVGZ'kiuɿdy¨ 6%ݿr2pb:NeJHW̍W Hz[/I }߆n}kԸy&nHS,CxPJz˃kSt5 2;)trrwA".?Rk6sA!g"w1s ;# |C~FkZT{+ykHʝnNPe;ᐤP֖zS mb2,0z/?]9G5|Ba,h6ks\"6,V'ub= Fy}'EXJd_*_WS-tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Q@ud7g3i뎼V!l{%V%'Ye\=p: k/GբAq52;]H= J̽4=V 6Un0p,PkIM|SFj i{wl!p]X49(2;>O|6nz07Hq} |"$ J(}#ƚ5զo wrF+h0ۆ#8P$qO ;5Yuff'@:Ljg߽Yj\23[*#?J;ko |sg\F5;"ψ0>br+~*v8O>crePxX_'r0Gͷ (]WNld,lǙBX |Qo>ZNE#89Gaѱ`qUmFQKmsC,dÏPM|k(R@h_!\ſ7 .u[Qi`<7ŭZ"FNJ24Ɲ(@yyކ^h]mUoܿ(U@eGkו,$uC7cIX %)⒑'_EXJe_*_WS-tQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\W&?@Q@fbRcԕdcH1Gb9ɭ:G\O j1Js"<Ń {d@#q_7|)ԿjvIl`r$EU '׾&~K=JQq'0#6ך|,3 jhLgFycp 0?I(oRզ<9Hu z^iAS,#>ra)ۛR\_j>K |6?< Y=Oyػf,S(f%X{YiI{kwq?ڶyw*;7`?63@QEQEWx'Pnzx2W;[9<({vdc.*2A eX|I `Y~ h.5جmY t<(+xFLv;ѕrm*OM1r3ھ)4[᷍d5XZ(c;L޼kV4Vb0trp%{@)iq źM$Oʺo֤uCi}$ڶQSOCrzbLdp @tAmI~wCɎ<ǡ*}+Ev^DѠ،矠4&yDLYFrAER:V/ҙ+k]-QEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEgx_F>;AB}G fvI7ڤP$c7}y_"zugnR̬B*@\玔}ŏ ,Z7$'1\~n1}xgB*96Zf ]*z:|tpZ?oq Њ(W}׉|{%NҼkRsǵ@|.$/q?5wPEP^k>E˽Ou$([!~fP@l t5TP? ۏ/?ɺE%w?|v;U^ sw%G2C2(m/###k7B;خ7-k? 22O1#6z}kwsk(sBdzT&_Ɩ fFo9 ~#پX9M2)Fe?OxM5ݘI2)%cV,qNOVE)o CUQ@/_vZGS۬fYo)+0J[>EuUJku"_w2K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@x_S1+"э@gjz'fY!vZ4Plmɦ\dBzq}yWA|{~m,wD&r qr+2k0`7㶍[+ci>[4R3݆J1TGhkl=Xīmy< b2{zywVRޘM:. W?Ko'G4~[DKmcn9@]_=x32L1[UXY*ST$&W2!PQEQEQEQExŖ Xm-REj컲9eg$ wx/ @9~]nR[cn-vcݲ}?/iӴV1E#tEܿGC_V~'tRaZC\$6Yۤn% Y]#wƥyok,kK*x0yҍoomf'( s?NQ ij0@> (:_*_WS-t|:V/ҙ+((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((}s:%mYuicB e#; Q'ÓM-c "O3'''qsQETwmo,20DF dOޤyOme6ٽ Fq"j.S2[Γ݌88ϧ,iРao`1H>{CGß@?jotlg;Wo%Ŵ)hY=G8}h/ZEh|22D.NA^UO=z/kKODT"`v_R[Aw?gy4z% ch@I8$0:ҽ+:j$ r)#(9^9{^ <_]ƐJ˼H6` Zg}kI?EwHc %+~>GfNMxvƚfjekqh?%̼umq 6݃ ( naH @@,=Z^6k(-94{vɮ%8l >Plo $UJku"_w2WK@Q@_5n OZfB[moy!B?6J0ak|gĚΑe4qjvvo"WfӼoe_ ^kqcy[KK-qm[BW3|6s6i$GhPby$I&:Z+K_oJ{K[;d-%˃!qpx)xZlu3R< IMneR6Sx=W|5{jq, +#+svKd )pk [P4KPɲ'imc 8h>'3x h|9sHMdl6udW=ᑂ6pB]x'߉Vz/lh~\q ml̸sTWu[!ON=6h|+i'9G݁&;JM١H~u'4T '&-QEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWE;iҼ/?)OQEQE*T]xʒ21X'ghM|~Xžq֨7ٚ{~qMI- g1%Zo2BfgxcR~" (ج w\"n19eg]PFN.9(=?¿' m+Y)W 4oiGCz›y?}y߻sc>sz'kH"ߩ?a"5ݔӽvK5dyC̱ ) 9=u֊^v((ȫ}]L5EXJd (8_u4kw66(Юk9/ "vM .>` srΝω'Տ|.QMG.#bnbC|T2@5O ^F9bۄ˰OJ$:HC=˧KmefXpn|*/R2kh+D|7麾♮u)n jDd嘅 aA`pJ=kM"olkyd Aq]p);OkZν}RݵB/ʮTj>4cX'ټ2ͭhͥ>]̐Dm@;?3ƺƉ|][hx| \4L.UHpB]Gk:o:$Iq,f9ːŀ8|O^2k}yN"|bvs]>yω߆w.3 X``,kfW9I ( )_Z ]GE/=_˞Ly1ֺ(UBxkMMb_A~pJ,ѡ ` u*QXFk𽎱c%v{2;}P ƭ2ۓic^Ex~k~[*éJ&TH P3 T;dEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE5;-/ZY.cvdlGJSx\M]U%1ġy0rǩ'E}úBou(1L~/=Բ[oGBLH zɮxxOH UZA1?N8+X,mbHEI|chCp/TuGvc5-B9oH<Һ +KYnd0Hpdjv))z^* Hiw+c8ʁy;uRoI=*O.@H=xx[z4wʹgqkR ޥnt~auhi#3c$9=1=_o~k&]12r{V󲲟ݩd}}Py]?sqF9z þ&|E }&9UZH:dwbNQp,NGjP_OnX;pay(*+M l}J y͌b<pkؼ7Ŷq,M^Jg;tOxIw[Y%o&\@‚z)b5i0jzDhw&MX=A+B ( +G5mB;-{R-ԑ <_(IT*}:.3xIF]Qm/T[MD2A!kh(OɽJI >e ьb9O:ƻ/zlj6vzPn>fr]@d؜(HƽxR¿Ϫ粝˷r(((((((g]7J ((((((WM>t*~!.((((((((((((((%]7ELfJGEݜ/:kM;=hQTXT_X\LXGqDO 0 ߚ𯅬5Ks'6N65EݠA]B }}I `)~:`~;* kJOih 02qU1ZvKK)'7L vV2eܤ2qDŽ0}VBI[9OWdOoJ±i~9񧆈F,e\COSu|-cCOә9'Xpr0k*3Ck·6Q]hw @axp? D[ö6Zo;{t |U 7Ŗ+lpQyynFz{ mB;d@E~mbGUa([iWhflNr翥V]xSUI|aA ~sJ j=y<< lJ-jkxŔum##'Vuoè[,0>,R|>?O}wd-[kO(_;Tr:-y ?\ 9 k."ya3ѐrsQ@ïb)Zȫ}]LEPEPEq_2Ѽ{oK5fH$p큸?8=>(WW-| ).ollmw.Ȇpyp&ΗW]Z,./9cRjƙÞ0}DJt-፤xE"4?Ն\1~e18O]ѴmT-Rf(tT#oUTg[?><"u9lWɺY]W|k^59[iVw_mtl`7qP"+nTȌ(Q{-QEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQEqoU|soF-EEQ@Q@hGTh?;N:hċL 3bcԓF~=,ae<'+kWo+Mdv'i< f-p7[F/|?"YΟk?r}bv>"qcv08Eex%`+ldC_t[qi_3ivIb4\@1КZ)U\t, u3 k?B2e=~cGŸ쯥{oĺM#(뜌ƽ& f)` nH#^%hz;nlJnA.|O[obV) v{>׺}ϷZ[:5}댎+|Wn[px88:hmu6%!vRNtд+]:;r} p:((u"_w2K\ïb)Z(((:YZ|u)qJ2#3@++B?Ft?o+T۝d=2kޥ}mu6WڟiVXl78mgENKOKuY9GRMLY] AC JtM+K4;.HN1SZV {@5{4- XY@"$ggօQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQED0dnm"P?2{䞽8WWqmy?>Nkh|(,UY\/'1;MCJ9"pvQ[ּ .,[˙ nam9x##8/i:lJFDʱG\/ xnqEcqw,s0b8`dd LaQj̄JG8T'U~hbfN[}R46|9$0O@+ƣ[\\xP6p"69ҺSNfV C#:~9.cZs#.o3OBB,``''`죁$隺=& ium.܀O$h+:a QNT==~l"MK WS ꥣXGX4G*3n|g gdc= = -~:S¾#F7^<~y(UA$g1޽Ħ.$ӼAk[ˆC 09Y7VVR%ŴI KbTr IʖKGϭMh+|)X/5tf-"G2X<⽖x ܎D4]3)YuxmĉJpqֻ/.3WYc\y0xڽs@EXJe_*_WS%tQEQEO{i?q"Y"T9>*cγH}[QSw]N~ltZ((񟇵MGíft(#Ie(8|4\[m7^u7:IT.k=kM"olkyd Aq]PEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEP\W&?]q_hG=vg?JZ(|en5,gUwgxfkݶ Qo2) H$WдP͖> @~Li^Ffu |BwuGӟ- IpJdg+3H@9z`&Sc":kg"J1@Wzo 6sG'/ X~zd+fwK`lLia!8$nٸp;k=cQҬxJ$6n] $, >~#hVva.Up 89q_ ? 61n^tZ{57uaF+퍣k;]д~kv˞0NܹX@a2q@)j7mR?*x\UuX:x ɼWxXt!Y=9Gxþ6{lgtCt~Ps3UgN29qݛ方-+le0pu>$$jp`rh3uYL.h20@R8#KRMW-)4؜9Gs=1޹xn[+gx;w?hYXBO .u*'CT'{ZB:_*_WS%t|:V/ҙk((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((?MmZO:){2K$B]drb=PEQEEwsWE(K,#E,MKEr qBtWo gqFO7' U@Q@sT񦷜1Hb1L c#9:wk[ZNO2i<(rI$I$ "~k^-ݏoKn +Y\rYe c8uTTqP(I*@'񞣞#(#xN/oRX}l/냁<@-!8moⷃ&uo*Zi:~BF{Mx|PEFkFMF6J }9zW=xWN+.H đBo,rxkƭZw(4\C%*<˞ymWƅaXZ0?g9!uϾ${_RYE_6ΊW9 Yv |kk2mgA%`kܼG/B״M"t7%$) \* )>e(|El0@s"a@8>+-uK+V8 68SKխJ"WsgR3jV͐#6?!?p&𥾢OfKnF?zMkxV6Hr ws+ 0:'$X\*y+x4; h),2&ul\.[ΒF "t7et9 Ę O\PW!q뾠((((Jf[X.}IB IrsPX}/5HR;ۛ1\)%hYx0s@(((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((((((S*24lbpC) :^Q> ZlCFw \ybZrx5|moEV~k5ޕ$Xݧ4qCw! Ќ  ZP+_'ۿ>ݞDٻof7Lu((ȫ}]LW5EXJd ( ( ( (8[X׈NԒXp.-ud]V27c`j՗ZBIM%bHOʥI8#@O֤Yrp>\@=޺ :Xi7v%2[B"N7}A's sH]gMx>hNvWr[94#۹ :[L?L)HǧJfzu;s7`qǚxlE<(0\O.elF=5sc-nj YHYNhOS֝ǽR׃#xZxq;d.mzb,(>fA9t{=7|.dnXI :ʃ+5{ vH4#Q~4:V/ҙ+k]-QEQEQEQEyW)l 8d#(u'"+#` Yf'lZ#sd21|IăCx{▮~k{MH'SH۠$+AHڞ+$ּ1s6"^[,Q,g̍!8(((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((puOWڵVֲ}=Grm MfV+m֊(|o>k~Cq%?16)0wLV⿳~[L:^O4Zg>o&z㎙w5ryvc;Ic$mV^޵)qsdՇzZqoE1>P jY-om 8j٢(?xY?vֆY6QsgzPJ1ڜi$ڊ(Y.}>o-"r60sG'^swK[{LA33tpx>F~~&{.go1v|c_}9ָ'?tz%v4 ( ( ( jFyj6Vpm-4Rp'ZWǟ_V>͋X}6(b[~_r9gO?gr N/+T\_ٻ$</3>x_Zױo/|$p3$__EpS wPo6(~vZΓ͋-#u,<'((((((g]7J ((((((WM>t*~!.((((((((((((((/mҸ?Mm;Z( <ފ |WF o_ιu[0FgGJK1aZ@"7S?hIN{ԟQ=f '8ATn-}:qM +QL((2VdS[y#cyse %?Q~5S._zM EyF(7qQ@Š(((A$Kz%v5| y?((( [.qY\y>2]Yw^izb}÷ A"ahJ|k{ycJ G7rr}E|׈|-3JѲ.nbV9IoGzwOZ^F񏁾ͥ\ZOI Y<6bamP d €I((((((t*~!.몮WM>((((((+g]7J ꨢ(((((((((((((+3$G9뵯?eVռIr{Y!<`K$ r( (O[~ C զ#1I帘=F:P4|~WIRcs ѥmcT9eZR955?xkNXE.uwو N⣜կiiݼ9b۰ {֚:(AEcx BwEmYO-Tkz4kp̦if9\FprÌhRjx #>k5 #Z52d+ n7/lv^s svclK1WdݛV^Cyc-"s+RW (?I$0[nqh<=?ޟG]qF>|ԐQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE2:`P4Y Ie_xy+3$G9((_"k[E *pr cp3]XW3v .M+=&T8~ 5[u yЬ(*qzNLע)QEQEf]JB@#9"[!JLLd(#d=3Pk0=Γy y;t LW.Jp3#׌>S4!'-ȶ6ؙH+xX7|rg~\u5i3\Y!^H9#jq| $~e q'8)QE}I>J+E$L~%v$Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q_hG=v|moEQEQE⿵65`֡%+"dc߂xO{WS۰FG~+3E%gQPfe<w`z~}ua+> yϧ (4UQEQEQEC0D>t.In^{ꅀ;;1csT5Ya4Qx@l}9KеE" R)Q@Pz3|WI>JjH ( ( ( ( ( ( ( ( ( ( ( (9]7J ꫕g ( ( ( ( ( ( t*~!.몮WM>:( ( ( ( ( ( ( ( ( ( ( ( ( ( Ya{V񎣩[\[koni_3! 9p gqc3$G9(j^n"igymqo$.lnkh9 VHɻ/_6Sm4A,AI }QM]♮wyon6wJZix 6:wwv#_?hϴK5P*3\K2RAx=NÖտsoշF~^rRٷ>#g3")' ct[LZhQE1s?4 hYIr%L@VQ@ҧ|7g4o4;4d9vaPzT፧;OH*Gמ!f8m_*Hdԑtr{w40`c=n_Zr`}i!!hc _z[{EYk;oqz=/+;/|ԐQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskEPEPEP_X[I%ik= ߡƟ91eěn6yGc?+}͖&VIhavB,d#Nõ{x _ӡ.0[)1xCR[^2&Ӏd<_AGOxOj>/ߗ[Yd!YsБ^xp1N3OlRYk0f̅((((((+g]7J ꨢ(((((((((((((+'s)$ycQ1kelq]N5qKrQ!f A8 qzW~vojzΣauk fXiZhn T"(`qvF8QEQY^+Mb_ 1xe֤[+R|m 90]Fd)WxFtb)R;Gj7|cT|gXqtni&L̊8-OZ+'>1i4a] yx.y\"+#0Îgcր>||Yg|-kϱ=?_^[i/!B7Lx'<;۸+K;ls^;⿄>*Ls%c1ۀpHqSv:ئXHG2!{~Fqa5oiZC%D`YQn1}*xNtB>a$|d*.;%Lc~@`&fD7#1܊QkmJqQՀ;p;xPxSKqE@1<<-xrX|d!7 E}-+_MSEnX0H]Fm0BN}8=FGJ3 ,n4B;/$" %N@w4׎,z7.xp?>A<;f|+dde`@ppxAǰs"d_<=* =8L+:_j6YpoA@ =?;}l''eCGP}*}U'g9Wc\/'g+HQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEWgImsk\Bimi$-FG8(ϋ>6~ Պ%Hֱc dd.2 :ƃL'Čq9qšυ}Rx9olt\Y1ۚծh:.4 {{=.(,;f?d<}5|shPxY_x;TlFi&,1oI B1PEQEUu ]_JԴ|+R 6e8 Gf,637Ž.)5].ڤHLmX8 `g1}u^QMhͪ,966qBunr1Ą瞝9 ~![-Fܦ˘ʩ#UPo XiqCk#rju+ݳ,Q[FP71s (z6VF+` R֫j7zeu sjHgܐˀʪci 7N3eYH}NF9s=jΡٱK+˖?4B9T`8$0 ¨+'Zi<0H`pg}rk^vMOұg{d%T BWk*\g;Y_8V0^`_@70!%BX3\g8=ko<){x/s,z:.Vمo_L@\9$s|8efG<]q 4>j;:Y0X$($}vQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEֳ-ErQRKe 8 3:׆~?/lrY 8gp++3$G9(iO|mƐ&hV&\D]LL3ƪghC}E}ovvg.>C/kKuO%Ûot03+1S O@xkC}kѴ:4yfpD;x\}!Ul-f%y-%c,c&v TQEr1}/~G=ȁcrȠ:cv9$,1EO> }=sk=eTnwfl֊+ ? CVx~C/b;z뫀 }m٥݌5 "ToVk~[R[ )utnbJ 7ӎ?*`^CBkME&\/",E*c.~nX;d`X@,eR6w_ %Bc{PF0 ĜWM\I՘`n$ ]EQEQEQEQEQEQEQEQEQEQEQEQEro?LW+St]UQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEQEQEQEQEQEQEQEQE|mogImskEPEPEPEPEP^EQr|+|_Gl@I Iy_0>6‰M{tG*StoK͘7sslq^.Ɯm,E&r炱c}k-cIuhC>Z($^8#K_W7czҙ+((((((((((((WM>t*~!.몠((((((]7J ꫕g((((((((((((((_oLw\={\q\>dqڽ'h[i$FE $`2r:=A0{?5o:#<؃c$=Rj{65c=]ڢ fv^rWqdNfm\H΄0ʜ4%}+ŚdW6]Mhx;y⹷{iRh%PWR2#RVh:i$ڽv˱&eW'eP€pi+(y_QFlKq;B4?}9@?I2G~t-\JOB4?}9@fa4Eo!yzjs#Do^Ft*~!.몠((((((]7J ꫕g((((((((((((((?\мc6,Q-㻖(ː/'3+p7/o&l5M?N(.57{% I.lnu/#*K?$&pX AZ~0 M&+]du8`rȇv]lh+oޛ}isgZ5n7FIM#TpcbBں_㽿LԴIF YhhAEqMܥZܶP^ɦЎ,wȬ  ˶MͩwZU[Ic;W3ʰ+p$HQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%O??}uUTC`]3GU@Q@Q@Q@Q@Q@Q@ro?LW+St@UQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@uz#ӥG{#v"yq<eUMC"W5m.=l޵kKnEUNϽR'$L2toG$&ݾ[gg9ҼMK@@Z}2GpRi]W 1ouE6NVhffkI3[I#DblS|(Ǯ|Moym֝7yl9jx C -+Wյ}yI^;|HO9|I|6}$߶&mwkɤ@&}.S@˻I>zE{>[IZ-\gʒ22g\ԓo@i_x@iZ|:d%R8vXbŘū.ˤG=ܒIdĚ}]ִ$ho8UukplϾڶvyuu8:zGq+5\#ewD+&MxB5oxW+icSȦqt2, <5+xN{&iu=zPI' 1JH<1-XhPx#RҾ+wKh.NF(FWCHphܳxQԞk]^It[m''ˈL . 9ڹuPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP+St]Uro?LPEPEPEPEPEPEP\%O??}uUTC`]3GUEPEPEPEPEPEPEPEPEPEPEPEPEPEPEUM{u[gh>WؤDOyvlce*x$?{.?kIuhFr#Yo,$(,${q|7?L >%k^E}E$_1 #c? 9xU+Л &op4_O ~!>ii  ϒ7.щb6NyKT?|I_W7+ǁM h? "{m?Pm"iH. zmagmce|{h($P$ITQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+St]Uro?LQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETC`]3GU\%O??}uTQEQEQEQEQEQEW+h:%WZ΃鶟j5ԼάnjA(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag(>8!(?ag( |9z뚝孵$i X9>讖((((gstat/inst/external/ncp.shp0000644000176200001440000020355413777370515015517 0ustar liggesusers' VA@ıUA&(AFWAPAVAAg%AFWAZ P"A߯VA@"A#VA"A`LVA 4"A`jVAc"AVA`}:"AuVA("A RVA L"AҩVA!A෨VAl!AVA!A@צVA1!A`2VA!A@VA@B!AdVA!AdVA`!AʠVAC!AVA!AJVA2!AVA.T!AWVA Q!AVA9!A@ӦVA@Q&!AtVA !A`VA A ,VAP A|VA` A۞VAh A4VAmC AYVA3 AVAAVA?A`eVA ]A1VAAnVAAjVApxA@QVAWA@_VAAnVAPAVAAWAAFWA!A@eWA)#A@AWA*3#AWA;%A@VAAg%A@VA`\%A@VA`:X%A@VVA`^%AVA u]%A@VAS%A VAC%A@cVA sD%ABVA`D%A@HVA 6%AVA`P#%ANVA4 %A@!VA`$AVA-$AVA$A@VAc$A@VA$AhVA`$AVA`$AbVA`$AMVA"$AXVA $A$VA`U|$AVAIK$A0VA`%$AVA$AVA#AIVA#A2VA#AVA#ATVA`#AVA`#A@ȷVA #AVA%#AVA#AiVAލ#A@8VAw#A@'VAee#AVA`O#A@VA`5#AfVA`#AZVA`k#AVA` #AVA"A~VA P"A߯VAVAUAZ&A@VAAg%A@VAy%AVA%A@VA%AVA @%AVA%AVA%A^VA`>3&AVAZ&A9VAL&A@VA<@&A VA[1&AVA I&AVAj&A!VA &AVA &AzVA&A@&VA@=&AVAF &A`ҰVA &AVA &AVA j&A VA (%AVA%AyVA%AsVA`%A rVAo%AqVA >%AoVA%AhVA%AaVA%ANVA@%AVA %AVAU%A@VA%AeVA%A VA {%A@ٮVA%AVA w%A@GVA %AVA%AVA`d%AVVA@&%AVA%AVA%AMVA%AVA%AVAG%A`*VA@%A@êVA)%AVVA N%AکVAi%A`VA%AVA%A¨VA+%AVA@'%A\VA`F%A`(VAl%A VA~%A VAz%AVA`zv%A`|VAVr%A iVA*n%A@YVAj%AHVAe%A0VAa%AVA]%A`VA Y%AѦVAU%A@VAR%AhVA|N%AVA J%AҥVA@eG%AVA C%AXVA ?%A+VA;%A`VA7%A VA t3%AƤVAV/%A@VA@/+%AVA'%A VA@"%AVA`%A sVA%A`gVAX%A@\VA,%APVA %ADVA %A 9VA%A-VA %A VAV$A@VA,$A VA $AVA`$A`ףVA`$AVA$AVA@$AVA ]$A`VA0$A`ãVA$AңVA$AݣVA $AVA}$AVAP$A@VA$$AVA`$AVAʺ$AVA$A` VA@o$AVA A$A@VA@$A@VA@$A`VAϡ$AۣVA $AӣVAt$A`ԣVAC$A@ףVA$A@֣VA@$ẠVA$A`VA$A`VA`\$A VA+|$A@VAw$AVAs$AVAo$AඣVAqk$AணVA@Lg$AVA +c$AVA _$AnVA@Z$A`WVA V$AAVAR$A -VA@~N$AVAYJ$AVA 6F$A VA@B$A`עVA=$A VA9$AVA5$AVA1$A hVA-$A`CVA)$AVA%$A@VA !$AมVA` $AVA F$A`IVA`$AVA $AVA $A`rVA; $A%VA$AݟVA$A@VAH$AaVA |#A(VA #A`VA#A VA@#AVA G#AFVA`#AVA@#AÝVA`#A`yVA@'#A*VA`#A؜VA`#AVA 6#A`3VA`#AVA@#AVA`t#A 5VA >#AޚVA#AVA#A8VAB#A`VA#AVA #AdVAZ#A&VA`#AVAɬ#A@VA #AyVA4#A@VA@\#A VA{#AؗVA`#AगVAΕ#AmVA`#A5VA9#A@VA {#A@VĂ#AVA2#A;VA#A VA@|#AVAx#AeVAu#A VAq#AєVA n#AVAj#A;VABg#AVAc#AVA``#AHVA<]#A VAY#AஒVA 'V#AlVA@kR#A0VA@N#AVAJ#A ÑVAF#A@VA C#A XVA`B?#AVA;#AVA 8#AVA4#ADVA1#AVAk.#AVA*#A`IVA ,'#A VA`J##A@ԎVA#AVA#A 6VA<#A`͍VA@#A[VA#AVA#A@oVA #AVA#A@tVA4#A`VA! #A`VA@ #AVA`#AVA#A`YVA #A VA`"AVA@ "A6VAW"AЇVA "A@jVA@"A`VAH"AVA`"A3VA "AʅVAy"A aVA"A@VA}"A@VA`"AVA"AVAs"A=VA`/"A͂VA`"A\VA@"AVAn"AyVA&"A VA"AVA`"A*VA7"A`VA"AJVA`"A@~VAG"A`k~VA@"A }VA"A}VA~"A`}VAJ"A|VA"A@5|VA@"A@{VA@Ӵ"AN{VA࿲"AzVA"AdzVAͮ"AyVA "AuyVA9"A xVA@"AxVA`"AxVA"AwVA`"A wVA"A@vVA!"AvVAk"A uVA N"AuVA6"A~tVA "A@sVA@"A |sVAښ"A`rVA@"A`{rVA`P"A`qVA"A@~qVA@l"AqVA@"A pVA@"A@pVA+"AoVA "AoVA"AnVA@"AnVA%"A~mVA@L"AlVA@f"AxlVA@e"A@kVA:"AvkVA"AjVAՅ"AjVA@"AjVA`R"AiVA"A iVA "AhVA7"A`hVAs~"AgVA}"AfVAS}"AyfVA|"AeVA |"A`oeVA|"AdVA|"AcdVA|"A`cVA@|"A WcVA}"AbVA`}"AJbVA}"AaVA}"A _VA`}"A '_VA6}"A^VAU}"A@^VAL}"A]VA|"A ]VA{"A \VA`zz"A\VAy"A [VAcy"A [VAy"AZVA`x"AYVAx"A`tYVAx"A`XVAUx"AhXVA`2x"AWVAx"A\WVAw"AVVAw"A QVVAw"A`UVA`Bw"AEUVAv"ATVAv"A :TVA`dv"ASVAv"A /SVAu"ARVA`u"A$RVA`t"AQVAJt"A@QVAs"A`PVA`$s"A` PVAAr"A`OVA@q"A OVAfo"ANVA-m"A#NVAj"AMVA g"AOMVA2e"A`LVAb"AxLVA _`"A LVA`^"A@KVA`["A+KVAuY"A`JVA_W"A`FJVAlU"AIVA@S"AWIVA`Q"AHVAO"A kHVAiM"AGVAJ"AGVA nH"A`"GVAE"AFVA LC"A NFVA@@"A EVA>"A`lEVA`<"ADVA ;"A}DVA9"ADVA7"ACVA@ 5"ACVAJ3"ABVA1"A'BVA/"AAVA -"A`=AVA`*"A@VA'"A|@VA%"A`@VA 6#"A?VA!"A@!?VA "A`>VA`"A1>VA`"A`=VAg"A N=VA'"AVA}&A8VA }&A 5VAvy&AVA x&A@ݧVA`x&A VA5]&AVA` ]&A8VAFW&AnVA@P&A}VAI&A`VAjA&A ڧVA5:&AʧVA'7&A`ȦVA@6&AVA`%A`VA /%AVA%AVA@%AĢVA%AVAO%AVA@i%A@VA`n%AVVA`%A?VA@<%AVAʾ%AVA@\%A@VAt%A3VA%A@-VA@T%AVA`T%AǠVA@ %A@VAgf%AVAIA%AuVAB>%A@VA2%AVA+%AVA%%A}VA@%A@`VA.%A@(VA%AVA$AƜVA$AVA$AOVA$A,VAB$A VA@$A@ VA$AnVA$AМVAf$AVA@֔$AVA$AmVA$AGVA't$A VA1r$A@ VAn$AVAf$AVA@*`$AךVA@Y$AzVA@ZQ$A%VA@5G$AVA>$AVA/$AVA@$AЗVA% $A@іVAE#A&VA#A}VAR#A@VA@#A@VA`8#AVA@R#A@VA#A@VA¶#A@~VA`f#AђVA #A9VAJ#A@VA@k#A=VA@#AאVA@#AVAq#A`%VAm#AVAf#AVA@(`#AVAV#A5VAM#AVA@H#A(VAiB#ApVA=#A@ЅVA<:#A@"VAI8#AVA`5#AVA?1#AVA@L+#AZVA@v$#AVA#AρVA#AVA`#A@VA #AɀVA #A@gVAc"A{VA"AzVA"AxVA"A}vVA"A7tVA@"ArrVA@R"A@9qVA"AoVA"AnVA"AlVA"A]kVAT"AxjVA@G"AoiVA5"A@hVAk"A@gVA"AgVA "A`KbVA "A8bVA"A bVA@9"AaVAN"An_VA"A]VA`O"A@\VA"AG[VAv"AYVA`]"AgXVAԻ"A:VVAB"A@1TVAR"A@RVAd"AKQVA@"A@APVA|"A2OVA "A*NVAk"AMVA@"A@KVA"ABJVA"AHVA@"AFVA@"ADVAF"A6DVA"ACVA@("A CVA"AAVA"A AVA"A@>VA"A;VA"A@9VA"A@+8VAN"A@6VA@"A5VA@"A 5VA>"A3VA@0"A2VA"A1VA"A@y1VA"A0VA_"A@Z0VA@"A/VA"A@1/VAW"As.VA"A.VA"Ax.VA}"A}.VA`"A.VA"A.VA"A/VA@"A/VAp"A.VA@"A.VAo"A.VA2"Af.VA"A@I.VA"A#.VA]"A@.VA`"A-VA@"Ae-VA@2"AF-VA "A-VA@܊"A@c-VA@ҍ"A@ -VA` "A@-VAd"A@M-VA"AY-VA`)"A-VA7"A[-VA@Ђ"A,VAA"A@B,VA"A+VA"A*VA@|"A:)VAMv"A&VA s"A%VAl"A#VA`Ud"A!VA@]"AVAqZ"AVAU"AqVA@M"A/VAD"AVA ="AVA@Q6"A.VAM1"AVA@,"A@ VA`("AVA!"A@`VA@"A@ VA@"A VA@ "Ah VAd"A@ VA@:!AVA`'!A@VA@ !AVA!A%VA`'!AVA`!AVA.!AVAy!AAVA!AmVAo!AVA!AVA !A@?VAy!AIUA[!ATUA`J!AUA@!!A@,UAѧ!A&UA`ע!A$UAo!A@UAF!AKUA!A UA!AUA !A "UAt!A*UA f!AUA@{g!A6UAj!A`UAn!A@UA_r!A UAu!A LVAx!A VA`{!AVA`~!A\VA݁!AVA@!A!VAQ!AVA`!AVA!A`oVAF!A@VA੎!AhVA!AVAn!A eVA !AVAڔ!AYVA`!AVAV!A@MVA`!AVA ܛ!A`@VA !AVAI!A4 VA@Ġ!A VA`0!A0 VA`!A VAb!A' VA)!A@ VAƨ!A VA !A VA!A VA!A@ VA!A$VA_!A VA!A-VA@!A`VA !A@7VA`!A VA@F!A`@VA!AVA !AHVA]!AVA!APVA!AVA`!AUVA@&!AVA`!AYVA!A@VAݶ!AeVA!AVAB!ArVAZ!AVA+!AkVA!A@VAʽ!A]VA u!AVA !A`SVA!AVA!AGVAH!AVA!A<VA !AVAK!A@2VA!A@VA (!A .VAC!A VA!!A 2VA!AVA!A7 VA !A VA`'!A@:!VAK!A@!VA@z!A;"VA!A"VA!A@;#VA v!A#VAI!A3$VA!A$VA@y!A)%VA!A%VA X!A6&VA!A &VA!A`6'VA!A'VA!A#(VA!A(VA@!A@)VA!A@)VA`W!A*VA !A*VA !A`+VA+!A+VA@!A@,VA"!A@,VA!A-VA!A-VAE!A'.VA!A.VA!A2/VA!A/VA0!A;0VA@!A@0VAa!AD1VA!A1VAv!AO2VA !A2VA@y!A Z3VA`!A`3VA!Ad4VA`H!A4VA!Aj5VA@!A@5VA`|!Ah6VAm!A6VA~!AV7VA`"A7VA@"A68VA`1"A 8VA/"A 9VA "A`9VA "A:VA "A:VA0"A;VA "A;VA"A@;VA"AkVA "A`>VA!"A@!?VA 6#"A?VA%"A`@VA'"A|@VA`*"A@VA -"A`=AVA/"AAVA1"A'BVAJ3"ABVA@ 5"ACVA7"ACVA9"ADVA ;"A}DVA`<"ADVA>"A`lEVA@@"A EVA LC"A NFVAE"AFVA nH"A`"GVAJ"AGVAiM"AGVAO"A kHVA`Q"AHVA@S"AWIVAlU"AIVA_W"A`FJVAuY"A`JVA`["A+KVA`^"A@KVA _`"A LVAb"AxLVA2e"A`LVA g"AOMVAj"AMVA-m"A#NVAfo"ANVA@q"A OVAAr"A`OVA`$s"A` PVAs"A`PVAJt"A@QVA`t"AQVA`u"A$RVAu"ARVAv"A /SVA`dv"ASVAv"A :TVAv"ATVA`Bw"AEUVAw"A`UVAw"A QVVAw"AVVAx"A\WVA`2x"AWVAUx"AhXVAx"A`XVAx"A`tYVA`x"AYVAy"AZVAcy"A [VAy"A [VA`zz"A\VA{"A \VA|"A ]VAL}"A]VAU}"A@^VA6}"A^VA`}"A '_VA}"A _VA}"AaVA`}"AJbVA}"AbVA@|"A WcVA|"A`cVA|"AcdVA|"AdVA |"A`oeVA|"AeVAS}"AyfVA}"AfVAs~"AgVA7"A`hVA "AhVA"A iVA`R"AiVA@"AjVAՅ"AjVA"AjVA:"AvkVA@e"A@kVA@f"AxlVA@L"AlVA%"A~mVA@"AnVA"AnVA "AoVA+"AoVA@"A@pVA@"A pVA@l"AqVA"A@~qVA`P"A`qVA@"A`{rVAښ"A`rVA@"A |sVA "A@sVA6"A~tVA N"AuVAk"A uVA!"AvVA"A@vVA`"A wVA"AwVA`"AxVA@"AxVA9"A xVA "AuyVAͮ"AyVA"AdzVA࿲"AzVA@Ӵ"AN{VA@"A@{VA"A@5|VAJ"A|VA~"A`}VA"A}VA@"A }VAG"A`k~VA`"A@~VA"AJVA7"A`VA`"A*VA"AVA&"A VAn"AyVA@"AVA`"A\VA`/"A͂VAs"A=VA"AVA`"AVA}"A@VA"A@VAy"A aVA "AʅVA`"A3VAH"AVA@"A`VA "A@jVAW"AЇVA@ "A6VA`"AVA #A VA#A`YVA`#AVA@ #AVA! #A`VA4#A`VA#A@tVA #AVA#A@oVA#AVA@#A[VA<#A`͍VA#A 6VA#AVA`J##A@ԎVA ,'#A VA*#A`IVAk.#AVA1#AVA4#ADVA 8#AVA;#AVA`B?#AVA C#A XVAF#A@VAJ#A ÑVA@N#AVA@kR#A0VA 'V#AlVAY#AஒVA<]#A VA``#AHVAc#AVABg#AVAj#A;VA n#AVAq#AєVAu#A VAx#AeVA@|#AVA#A VA2#A;VĂ#AVA {#A@VA9#A@VA`#A5VAΕ#AmVA`#AगVA{#AؗVA@\#A VA4#A@VA #AyVAɬ#A@VA`#AVAZ#A&VA #AdVA#AVAB#A`VA#A8VA#AVA >#AޚVA`t#A 5VA@#AVA`#AVA 6#A`3VA`#AVA`#A؜VA@'#A*VA`#A`yVA@#AÝVA`#AVA G#AFVA@#AVA#A VA #A`VA |#A(VAH$AaVA$A@VA$AݟVA; $A%VA $A`rVA $AVA`$AVA F$A`IVA` $AVA !$AมVA%$A@VA)$AVA-$A`CVA1$A hVA5$AVA9$AVA=$A VA@B$A`עVA 6F$A VAYJ$AVA@~N$AVAR$A -VA V$AAVA@Z$A`WVA _$AnVA +c$AVA@Lg$AVAqk$AணVAo$AඣVAs$AVAw$AVA+|$A@VA`\$A VA$A`VA$A`VA@$ẠVA$A@֣VAC$A@ףVAt$A`ԣVA $AӣVAϡ$AۣVA@$A`VA@$A@VA A$A@VA@o$AVA$A` VAʺ$AVA`$AVA$$AVAP$A@VA}$AVA $AVA$AݣVA$AңVA0$A`ãVA ]$A`VA@$AVA$AVA`$AVA`$A`ףVA $AVA,$A VAV$A@VA %A VA%A-VA %A 9VA %ADVA,%APVAX%A@\VA%A`gVA`%A sVA@"%AVA'%A VA@/+%AVAV/%A@VA t3%AƤVA7%A VA;%A`VA ?%A+VA C%AXVA@eG%AVA J%AҥVA|N%AVAR%AhVAU%A@VA Y%AѦVA]%A`VAa%AVAe%A0VAj%AHVA*n%A@YVAVr%A iVA`zv%A`|VAz%AVA~%A VAl%A VA`F%A`(VA@'%A\VA+%AVA%A¨VA%AVAi%A`VA N%AکVA)%AVVA@%A@êVAG%A`*VA%AVA%AVA%AMVA%AVA@&%AVA`d%AVVA%AVA %AVA w%A@GVA%AVA {%A@ٮVA%A VA%AeVAU%A@VA %AVA@%AVA%ANVA%AaVA%AhVA >%AoVAo%AqVA`%A rVA%AsVA%AyVA (%AVA j&A VA &AVA &AVAF &A`ҰVA@=&AVA&A@&VA &AzVA &AVAj&A!VA I&AVA[1&AVA<@&A VAL&A@VAZ&A9VA`&A VAU&A@VA 3&A֬VA&A@VA@&ArVAL&A@VA&A@VAa&A@VAU&A VAv&A VA3&A֬VA_&AVA&(A@VA3&A֬VAv&A VAU&A VAa&A@VA&A@VA&AVAA'AVA}'A¥VAj'A VAe'AVA@i'ARVAu'AVA(AXVA&(A@dVA(A@VA@ 'A`_VA'AMVAW'AVA 'AVA 'A@VAV'AVA@'AVA`v'AVA'AVA۾'A'VA'ARVAh'AiVA`'A@1VAڵ'A]VA`'AVA@'AVA'AVA ʦ'AĉVAԣ'A҉VA'A؉VA'AىVA@'AVA@O'A/VAt'AVA`D'AVA@'AVA,'A:VA@'AVA'AtVA`'AVAא'A`VA'AdVA+'A֍VAb'A+VA@ 'AVA1'AVA@k'AVA'A؎VAՓ'AVA'A@VA@Õ'APVA@'A`VA@t'AVAѕ'AΏVA@'AVA`/'AVAB'AVA@D'A>VA 'A)VA`/'A@VA'A VAچ'A VA4'AVA 'A@VA<'AVA4}'AVAz'A@!VA`{v'A$VAt'A,VA@s'A@"VAr'A@VA\'A@]VAa\'AVAX'A`VAeT'A@VAzK'AZVA`H'AVA@HI'A‘VA~E'A@VAQD'A@VA@'AVA@@'A.VA>'AVA:'AҒVA7'AVA4'AcVA.'A֓VA.'AVA-'AVA`-'AkVA@,'A@הVA+'AtVA@+'AVA*'AVAf)'AjVA('AЖVA]('A4VA''AVA('A@VA''A@4VA1%'ANVA%'AVA@&'AȘVA`!'A@VAK 'AVA@%'AVA'A)VA'A vVA@'AVAr'A&VA@ 'AVA@!'ADVA'A@ȝVA@'AVA 'AVA@;'A VA@B 'AVA@Z 'AVA'AVA'A@VA@&AVA@z&A@gVA@'AlVA'AVA@'A͞VA@T'A@=VA &A@VA&AVA@&AVAj&A`'VA&A`VAϝ&A`˨VA_&A cVA3&A֬VA x7$AVA@&A cVAl_&A cVAϝ&A`˨VA&A`VAj&A`'VA@&AVA&AԞVA&A>VA'&AVAQ&A`џVA6&A@VA@7&AVA&AVA&AŸVA/&AVA`&AZVA@|&AFVAӷ&A`VA&AVA^&A`VAi&AVA&AxVA@&AIVAW&AVA@h&AVA`7&AiVA&A VA̓&A@VA3&AVA&A@pVA?&AAVA&AVA`Ä&AVA.&AVA~&AVAZ}&AVA`s&AiVA`4o&A9VA2n&A@1VA`m&A`-VAc&AVAY&AƚVAO&AVAJ&AVA@D&A0VA@=&AVA9&AVA@7&AٙVA6&AVA4&AVAu/&AVA@7+&A@oVA='&A@cVAc#&AvVA@k&A_VA>&AԘVA` &AUVA@&AVA&A@NVA`%AVA%AQVA ]%A-VA%A@VA%AVA@&%AVAW%AVA`%A@VA%AVAV%AVA%AVA%AݗVA%A`VA,%A VA`%A;VA@ܴ%A`VA1%A@ܖVA`s%A@VA@k%A5VA%A8VAx%AwVA`W%A8VA%AVA%A@3VA3%A@fVA`z%A@5VA@}%A@YVA@3z%A5VAn%AVAm%AVA@Wg%AіVARc%A@ɖVAu[%AVAR%A@VAL%AVA@K%AVA`J%AVA@I%AؕVAcG%AÕVAE%A`VAlD%AVAi>%AXVA.1%A@VAU/%A VA@+%AVA(%AVAo&%AVA@$%AVA'"%A@VAI!%AVA%AVA%AVA%A@VA@ %A@GVAK %AHVA`Z %A`VA%AVA%AVA%AVA@$AwVA$A VA@|$A@VA$A@]VA`$AMVA$AVA$A@ȐVAv$AVA@$A@VA$AfVA4$A>VA$A@$VA@e$AVA$A_VA@$AۍVA$AVA`~$AƍVA@$A@sVA@o$AHVA@$AOVA:$A@#VA@$AVA@>$AVAϲ$AVA$A@mVAe$A8VA@e$AVA$AVAB$AVA$AVA`p$AVA@$AVA_$AVAה$AVA7$A`MVAl9$AOVA`=$AYVAlB$A@VAD$AŕVAD$AVAmC$AQVAA$AgVA@A=$AVA:$A@̖VA8$AVA:$AVA@<$AVA?$AVAA$AVAD$A@VAF$AVA@E$A@ӖVAD$AVAuB$AiVA!C$AVAE$A1VAH$A@VAL$A@ VAXO$AFVA4R$AVA@U$AVA@ Y$A?VA;[$A@UVA/]$A@FVA@*`$AFVA@Bf$AVA@hj$AVAk$AVAhk$AOVA1m$AVA`Go$AVA-r$AVA`r$A˙VAr$AVA@t$A1VAw$A@KVA@y$AKVAz$AZVA@z$AVA@ x$A@VAv$AVA't$A VA$AGVA@\$A@VA@o$A@VA`$AVA$AVA($A@VA|$A@VAl$AVA$AVA`4$A@VA`$A@jVA_$A@3VA$A)VA9$ACVAH$A9VA@$A-VA$A@HVA$A?VAw$A9VAc$AEVA@$A\VAx$A@VA$AVA@$AVA$AҘVA)$A@VA$AVA@$A@7VA>$A@sVA`$A@ƙVA@$A@VA@p$A0VAy$A@BVAr$AJVA?$A?VA$A@FVA$A4VA5$AVA$A!VA$A'VA+$A@VA$AVA$AVA$AVA$A@VA$AVA.$AVA[$AVA9$AVA`$A#VA@$ANVA-%A|VAS%AVA%AҚVA@%AVA5%A@_VAy%AVA%A@VA@!%AVA"%AVAC&%A#VA@)%A[VA.%AFVA@15%A@KVA`f7%AnVA>%A@VVAB%A@VAE%A@VAF%A@VAD%A@KVAIA%AuVAgf%AVA@ %A@VA`T%AǠVA%%AVA@L%A@VA6%A@KVA"%AVA%AVA@1%A?VAۗ%A@jVA%AVA@d%AVA%AVA%A@VAy%A@)VA %AVAA%AlVAK%AVAU%A@VAu%AvVAN%AVA@,%AVA>%AVA@8%A+VAС%AdVA@=%AVA@%AÝVA@Ѩ%A@8VA%A@gVA%AgVA`%AkVA;%AVA%AVA%AVA%AΞVA@%A@ɞVA@ %AڞVA@.%A VA@%A@IVA%AVA_%A@!VA@%A@VA`%AVA~%AɠVA`%A@ VA%A@eVA%AyVA@)%AVA[%AVA&A,VA2&A@XVA&AVA /%AVA`%A`VA@6&AVA@i;&AYVA?&AޥVABE&A \VAM&A EVA@;R&AVAW&A@VA`]&A@VA5]&AVA`x&A VA_x&AVA@y&AfVA`z&ArVAT|&A@nVA~&AKVAz&AVA~&AVA@y|&AVA|&AVA}&AVA`;&AVA&A˦VA`&A ĦVAQ&AVA&AVA &AVA~&AVAE&A@VA@1&A@VA&A9VAQ&ArVA@n&AVA\&AߧVAЊ&A@VA&A@0VA`&AHVA&A@fVA`<&AlVA&AeVA_&A cVA@_x&AVA&AlVA%&AeVA`<&AlVA&A@fVA`&AHVA&A@0VAЊ&A@VA\&AߧVA@n&AVAQ&ArVA&A9VA@1&A@VAE&A@VA~&AVA &AVA&AVAQ&AVA`&A ĦVA&A˦VA`;&AVA}&AVA|&AVA@y|&AVA~&AVAz&AVA~&AKVAT|&A@nVA`z&ArVA@y&AfVA_x&AVA`x&A VA x&A@ݧVAvy&AVA }&A 5VA}&A8VAM~&A>VA#&AdVA&AeVA@6&A EVA`]&A ڧVA'7&A`ȦVA5:&AʧVAjA&A ڧVAI&A`VA@P&A}VAFW&AnVA` ]&A8VA5]&AVA`]&A@VAW&A@VA@;R&AVAM&A EVABE&A \VA?&AޥVA@i;&AYVA@6&AVA'7&A`ȦVA  %AVA2&AĢVAA /%AVA&AVA2&A@XVA&A,VA[%AVA@)%AVA%AyVA%A@eVA`%A@ VA~%AɠVA`%AVA@%A@VA_%A@!VA%AVA@%A@IVA@.%A VA@ %AڞVA@%A@ɞVA%AΞVA%AVA%AVA;%AVA`%AkVA%AgVA%A@gVA@Ѩ%A@8VA@%AÝVA@=%AVAС%AdVA@8%A+VA>%AVA@,%AVAN%AVAu%AvVAU%A@VAK%AVAA%AlVA %AVAy%A@)VA%A@VA%AVA@d%AVA%AVAۗ%A@jVA@1%A?VA%AVA"%AVA6%A@KVA@L%A@VA%%AVA`T%AǠVA@T%AVA%A@-VAt%A3VA@\%A@VAʾ%AVA@<%AVA`%A?VA`n%AVVA@i%A@VAO%AVA%AVA@%AĢVA%AVA /%AVA @o$A)VAF%AVAZIA%AuVAD%A@KVAF%A@VAE%A@VAB%A@VA>%A@VVA`f7%AnVA@15%A@KVA.%AFVA@)%A[VAC&%A#VA"%AVA@!%AVA%A@VAy%AVA5%A@_VA@%AVA%AҚVAS%AVA-%A|VA@$ANVA`$A#VA9$AVA[$AVA.$AVA$AVA$A@VA$AVA$AVA$AVA+$A@VA$A'VA$A!VA5$AVA$A4VA$A@FVA?$A?VAr$AJVAy$A@BVA@p$A0VA@$A@VA`$A@ƙVA>$A@sVA@$A@7VA$AVA)$A@VA$AҘVA@$AVA$AVAx$A@VA@$A\VAc$AEVAw$A9VA$A?VA$A@HVA@$A-VAH$A9VA9$ACVA$A)VA_$A@3VA`$A@jVA`4$A@VA$AVAl$AVA|$A@VA($A@VA$AVA`$AVA@o$A@VA@\$A@VA$AGVA$AmVA@֔$AVAf$AVA$AМVA$AnVA@$A@ VAB$A VA$A,VA$AOVA$AVA$AƜVA%AVA.%A@(VA@%A@`VA%%A}VA+%AVA2%AVAB>%A@VAIA%AuVA (@#A4VA@z$AVA7$A`MVA`4$AJVA@.$A@AVAR*$A@HVA&$AbVA"$AXVA$A VA$AVAC$AVAG$AaVA@$AVA $A@VA@B$A@!VA$AVA3$AVA@0$AVA3#AVA@l#AqVA#A9VA_#A/VA@#AcVA#A@VA#A@}VA#A@aVA#A$VA`4#A0VA@#A@)VAf#AǑVA#AVA`#A@VA#AVA#AVA@R#A@VA#AVA@#AVA#AVA|#AVA#AhVA#A VA#A@VA#A"VA`n#AȏVA@#AVA@G#AVA`#AVA-#A@VA`'#AfVA`#A@VA@#A@/VA`^#AVA@+#A@^VA#A4VA@#AHVAש#AVA@#AߎVA>#AVA@#A@VA@#AVA@#AאVA@k#A=VAJ#A@VA #A9VA`f#AђVA¶#A@~VA#A@VA@R#A@VA`8#AVA@#A@VAR#A@VA#A}VAE#A&VA% $A@іVA@$AЗVA/$AVA>$AVA@5G$AVA@ZQ$A%VA@Y$AzVA@*`$AךVAf$AVAn$AVA1r$A@ VA't$A VAv$AVA@ x$A@VA@z$AVAz$AZVA@y$AKVAw$A@KVA@t$A1VAr$AVA`r$A˙VA-r$AVA`Go$AVA1m$AVAhk$AOVAk$AVA@hj$AVA@Bf$AVA@*`$AFVA/]$A@FVA;[$A@UVA@ Y$A?VA@U$AVA4R$AVAXO$AFVAL$A@ VAH$A@VAE$A1VA!C$AVAuB$AiVAD$AVA@E$A@ӖVAF$AVAD$A@VAA$AVA?$AVA@<$AVA:$AVA8$AVA:$A@̖VA@A=$AVAA$AgVAmC$AQVAD$AVAD$AŕVAlB$A@VA`=$AYVAl9$AOVA7$A`MVA "Aj\VAה$AbVAT#A4VA@+#A@^VA`^#AVA@#A@/VA`#A@VA`'#AfVA-#A@VA`#AVA@G#AVA@#AVA`n#AȏVA#A"VA#A@VA#A VA#AhVA|#AVA#AVA@#AVA#AVA@R#A@VA#AVA#AVA`#A@VA#AVAf#AǑVA@#A@)VA`4#A0VA#A$VA#A@aVA#A@}VA#A@VA@#AcVA_#A/VA#A9VA@l#AqVA3#AVA@0$AVA3$AVA$AVA@B$A@!VA $A@VA@$AVAG$AaVAC$AVA$AVA$A VA"$AXVA&$AbVAR*$A@HVA@.$A@AVA`4$AJVA7$A`MVAה$AVA$ÅVA$A@VAq$A$VA~$AvVAy$A@ˈVAv$AVAq$AVA@Hn$AVA@ui$A@VAh$A VA6f$AVA`d$A`eVA|b$A@JVAa$A@3VA`G]$AԄVA@[[$AVA>W$A>VA@kV$AVA@R$AكVAP$A@VA:L$A%VAXK$A҂VAKF$A6VA`gB$AVA`@$AyVAp?$AHVA@?=$AVAq:$A1VA ::$AVA:$AVA@7$A~VA`5$A$~VA@4$A}VA`2$A@}VA@@1$Ad}VA@)1$A@}VAD4$A}VA@ 4$A@|VAS/$A|VAl.$A@|VA`$,$A.|VA@-$A|VAM.$A|VA0$A@{VA1$A{VA@u1$A@.{VA/$AzVA`/$AzVA@.$A@wVAt-$AIwVA (-$A wVA@,$A@vVAh)$AvVA$$A@uVA@$A@!uVA@!$AtVAC!$A@ptVA $A@/tVA` $AsVA$A@2sVA$A@rVA$AqVA$AqVA9 $AqVA@ $A@qVAj $A@WqVA>$A@-qVA@$AHqVA3#ApVA`f#AnVAh#A}kVA`Ȳ#A*iVAv#AZbVA@_u#A5bVA`u#AaVAq#AaVAp#A@aVAn#AbVAqm#A bVAj#AaVA@Rj#AaVAh#AaVA@c#AaVA@b#AaVA^#AaVAK]#AaVA@V#AaaVAR#AaaVA`#M#ABaVA[J#A`VA@G#A`VA3G#A`VA8E#A_VAA#A^VA@I?#A^VA`7=#A-^VA;#A^VA8#A@]VA6#A ]VA@O4#A@]VA2#Ar]VA/#AF]VA,#A]VA+)#A\VA"#A\VA"#Av\VA#Aj\VA@"A^VA;"A`VA"AaVA@v"A@vbVA"A`cVA`R"AcVA"A@ dVA"A0dVA"A^dVA"ASdVAy"AcVA"AcVA"A@cVA"A@cVA@"AcVA"A cVA@"AbVA"AcVA`"A@QdVA&"AndVA"A@dVA"AdVAF"A}dVA3"AsdVA@"AedVA6"A@MdVA@"ADdVA"AdVA"AcVA"AcVA "A`KbVA"AgVA@"AFgVA\"AfVA"AfVA"AJgVAL"AbgVA"AHgVA"A>gVA4"A@kgVA1"AgVA"A@hVA0"A+hVA@W"A hVA"A@gVA"AhVAW"A\hVA@"A@hVA@"AhVA"AhVAI"AiVA@u"A-iVA`D"AUiVA"AoiVA`s"ASiVA"A%iVA@V"AiVA/"AhVA"A@hVA}"A@hVA@C"AhVA"AiVA"AiVA"A@vVA$#AvVA%#AvVA@&#AvVA'#AwVA@'#ABwVA@%#AwVA`b #AxVA#A@yVA#AyVA#AyVA#A@yVA#A!zVA#AzVA#A&{VA3#A{VA}#A{VA@ #A@O|VA #An|VA@ #A|VA@#AA|VA.#A{VAc"A{VA #A@gVA@< #A5VA#AVA@#A@VAI#AVA@#A2VA#AVA2"#AVA@ (#AVA(#AVA`)#A@VA[,#AVA/#AaVA[2#A@VA^4#AVA27#AVA9#A@VA=#A@`VA@A#A@VA@F#A@VA`K#AKVA=M#A~VAL#AVAiL#A@VA K#AVA@I#A VA@vG#AVA@F#A@VAL#A@VA_Q#AVAV#AaVA`s\#AƆVA@_#A҆VA g#A@VAol#AVAr#AVA@v#AVAz#A@VAm~#AVA#AVA@#AVA#A%VA`#AVA@ŋ#AԉVA$#AVA`#A@>VA#AXVAT#AiVA!{#AxVAdu#A[VAxs#A7VAq#A`%VA@#AVA@#A@VA>#AVA@#AߎVAש#AVA@#AHVA#A4VA P #AVA`#AxVAGq#A`%VAxs#A7VAdu#A[VA!{#AxVAT#AiVA#AXVA`#A@>VA$#AVA@ŋ#AԉVA`#AVA#A%VA@#AVA#AVAm~#AVAz#A@VA@v#AVAr#AVAol#AVA g#A@VA@_#A҆VA`s\#AƆVAV#AaVA_Q#AVAL#A@VA@F#A@VA@vG#AVA@I#A VA K#AVAiL#A@VAL#AVA=M#A~VA`K#AKVA@F#A@VA@A#A@VA=#A@`VA9#A@VA27#AVA^4#AVA[2#A@VA/#AaVA[,#AVA`)#A@VA(#AVA@ (#AVA2"#AVA#AVA@#A2VAI#AVA@#A@VA#AVA@< #A5VA #A@gVA #AɀVA`#A@VA#AVA#AρVA@v$#AVA@L+#AZVA?1#AVA`5#AVAI8#AVA<:#A@"VA=#A@ЅVAiB#ApVA@H#A(VAM#AVAV#A5VA@(`#AVAf#AVAm#AVAq#A`%VA`T"AfVA'#A|VAi #An|VA@ #A@O|VA}#A{VA3#A{VA#A&{VA#AzVA#A!zVA#A@yVA#AyVA#AyVA#A@yVA`b #AxVA@%#AwVA@'#ABwVA'#AwVA@&#AvVA%#AvVA$#AvVA##A>vVA##A@%uVA##A tVAE$#AsVA`i##A+sVA-##A@rVA##AZrVA@"#ArVA@"#AqVA##AqVA##AqVA@##AgVA"AHgVAL"AbgVA"AJgVA"AfVA\"AfVA@"AFgVA"AgVAk"A@gVA5"A@hVA@G"AoiVAT"AxjVA"A]kVA"AlVA"AnVA"AoVA@R"A@9qVA@"ArrVA"A7tVA"A}vVA"AxVA"AzVAc"A{VA.#A{VA@#AA|VA@ #A|VA #An|VA A;UA !AUA5t!A*UA !A "UA?!A UA'!A@UA-l!A>UA#g!AUA`Ge!A@UAc!AmUAFa!AUA`Q_!AUA_!A@=UAb!AUAEe!AUA@f!ARUA@g!AuUAi!A@UA`l!A@UA5k!AZUAj!AUAl!A@UA`o!AKUAp!AdUAMp!AUA@]q!AUA8s!A8UA\z!AzUAx!A@+UA@u!AUA`t!A7UAs!AUA`p!AlUA@6m!A@UAk!A@fUAk!A@UA l!AUAo!A@UA@UA`?u!AsUAs!AfUAn!AKUAIl!AUA@?i!A@UA@e!AUAe!AkUA@c!AUA``!AjUA\!A@ UAW!AUAZV!AUA@%T!AUA@LQ!A@TUA@ O!AyUA@M!AUA1L!AUA`F!AUA?!AUA9!AUA`6!A{UA`w2!AQUA@\.!A5UA`+!AqUA'!AUA&!AUA@Uv!AUAy!AUA`A!A?UA&!AcUA@!AUA`΅!A@UA!AaUA!AJUA`!A/UA@!A9UAס!A UA/!A>UA@c!AUA!AUA@!AUAT!AUA!A!A$!AUA!AUA`.!AUAZ!AUA`!A1UA!AKUA!A@lUA !AqUA!AUAl!AUA!A@UA` AUA AUA AWUA A@UAi AUAs AUA A@UA A@xUA2 AUA AsUA AUA A@UAM A`UA' A@UA@ʵ AUA@ AUAP A@UA/ AUA@ܷ AUA) AUA. AUAĹ AUA@ AUA[ AUA- AUA@ A@UA A UA` AUA A@UA A UA`7 A@AUA AUA AUA@ AUAƾ AzUA@Ⱦ AMUA@ A/UA@> A@/UA6 ALUA" A@sUA A@UA AUA! AUA] AUA@ AUA A@UA`^ AUA AUAb A@UA AUA AUA AUA A@IUA AdUA AUA AUA& AUA AUA@ A@UA`v A@UA A@8UA@ AZUA$ AzUA@ A UA A@UA AUA A``UA AkUA AUA AUA( AUA AUA ANUA A@UA* AUA`X AlUA@i AUA@ AUA A@UA AUA`P AUA A@UA5 AMUA AUA A@VUA] AUA AjUA ALUA@ AzUA@o A\UA0 A@!UA` AUA!AUA!AUAk!A@UA@$ !APUA`!AcUA!AUA!ARUA`!AUAk!AOUA@ !AUA8!!AWUAg"!A@UA@#!A@UA@&!AUA`2!A.UA5!A=UA8:!AAUA@!AUA@>!A_UAC!AUA@E!AsUAJ!AUA`N!AUAP!AUA@xQ!A@UA@tR!AUAS!AUA@U!A@UAW!A@UApZ!A UA@\!A UAsa!A@UA@e!A_UA@i!AUA`un!AUApr!A+UA@{w!AgUA`z!AUA`}!AhUA!AzUA!A@UA!AAUA`!AxUAx!A@UA!AUA`E!AUA!AUA`̑!A@UA@!AUA!AUA`!AUA@p!A@FUA`!AUAo!AUA[!A AUA@B A:UA@oE AUAG AUA@uK AUAM AgUA)P AUAQ AUA@S AUA@̳ A@UA AxUA A@UA`@ ALUA A1UA AUA@+ A@UA` AtUA@ AUA@ AֺUAU AUA A\UAC AFUAL A@UA` A@UA A@UA@!AҷUA\!AUA !A5UAm!A@hUA!A_UA!AUA@M!AUA!AUAD !AUA#%!AUA)!AUA+!AUA@j/!AUA@u1!A@UAE3!AJUA@4!A@UA9!A@]UA7!AUA:!AUAE>!AUA@I@!A־UA`ZB!A@UAoD!A@9UA G!A@jUA)J!AUA@M!AUA`O!AUAS!AUAWX!AUA\!AUA_`!A~UA@e!A@UA`i!AͽUA(m!AUAp!AUA`$u!AdUAav!A"UAJx!AUAp{!AǼUA`{!AaUA`p|!AUA0~!A@UA`!A@}UA!A UA͈!A@UAڊ!AUAߏ!AUA@!AHUA@!AUA@!A׹UA!AUA!!A@KUA!A@(UAO!A@(UA@0!ACUA!AhUA!AUAb!AUA!AUAn!AyUA}!AUA)!A+UA`!AUA@U!AUA@!ADUA!A@UA!A˺UAO!AUA!AqUA@ !A'UA!ANUA!AUAi!AʷUA!A{UA AL_UA E A43UA_Tg AM0QvUA5B AutUA9u AdUAe A6FTUAMj Am!UAW A-(UA6Hh AlUA"5 AlUA${ A.LUA[oaq AIJZ*UA ' A`UA[ AZ6 UAPcM AUAl> A}aUA:^7 ACǙٍUAy] A UAW AsoKUAԸ`h A aUAa,5 AFdcШUA;ht AoUAИ A$EUA5(ꜽ A 9UAX I A@qUAV AsB0YUAjz A0>X|UAeq A;UA