apcluster/0000755000176200001440000000000014612715763012270 5ustar liggesusersapcluster/NAMESPACE0000644000176200001440000000172414170236442013502 0ustar liggesusersuseDynLib(apcluster) import("methods") importFrom("graphics", "plot", "axis", "frame", "layout", "legend", "lines", "pairs", "par", "points", "segments", "title") importFrom("grDevices", "dev.flush", "dev.hold", "rainbow", "heat.colors") importFrom("stats", "cutree", "heatmap", "as.hclust", "as.dendrogram", "cor", "median", "order.dendrogram", "quantile", "rnorm", "runif") importFrom("Rcpp", "evalCpp") import("Matrix") export("apclusterDemo", "negDistMat", "expSimMat", "corSimMat", "linSimMat", "linKernel") exportClasses("APResult", "AggExResult", "ExClust") exportMethods("show", "plot", "heatmap", "labels", "cutree", "[", "[[", "similarity", "as.hclust", "as.dendrogram", "length", "apcluster", "apclusterL", "apclusterK", "aggExCluster", "preferenceRange", "as.SparseSimilarityMatrix", "as.DenseSimilarityMatrix") S3method("sort", "ExClust") apcluster/README.md0000644000176200001440000000554314611413320013535 0ustar liggesusers# APCluster - An R Package for Affinity Propagation Clustering In order to make Affinity Propagation Clustering introduced by Frey and Dueck (2007; [DOI:10.1126/science.1136800](http://doi.org/10.1126/science.1136800)) accessible to a wider audience, we ported the Matlab code published by the authors to R. The algorithms are largely analogous to the Matlab code published by Frey and Dueck. The package further provides leveraged affinity propagation and an algorithm for exemplar-based agglomerative clustering that can also be used to join clusters obtained from affinity propagation. Various plotting functions are available for analyzing clustering results. The package is maintained by Ulrich Bodenhofer. The package itself has grown over the years in which multiple students have contributed significant parts: Johannes Palme, Chrats Melkonian, Andreas Kothmeier, and Nikola Kostic ## Installation The package can be installed from [CRAN](https://CRAN.R-project.org/package=apcluster). Therefore, the the simplest way to install the package is to enter ``` install.packages("apcluster") ``` into your R session. If, for what reason ever, you prefer to install the package manually, follow the instructions in the [user manual](https://cran.r-project.org/package=apcluster/vignettes/apcluster.pdf). ## Webinar "Introduction to apcluster" On June 13, 2013, the maintainer of the package, Ulrich Bodenhofer, gave a webinar on the apcluster package. The webinar was hosted by the Orange County R User Group and moderated by its president, Ray DiGiacomo, Jr. The demo uses Version 1.3.2 of the package (released June 11, 2013). Link to recorded video of webinar: [YouTube Video](https://youtu.be/tvXLxhQItDw?si=YNl99Hk7pKlT9ybD)(length: 59:17) ## User support If you encounter any issues or if you have any question that might be of interest also for other users, before writing a private message to the package developers/maintainers, please create an issue in this repository and also consider posting to the [R-help Mailing List](https://stat.ethz.ch/mailman/listinfo/r-help) or on [StackOverflow](https://stackoverflow.com/). For other matters regarding the package, please contact the package author. ## Citing this package If you use this package for research that is published later, you are kindly asked to cite it as follows: - U. Bodenhofer, A. Kothmeier, and S. Hochreiter (2011). APCluster: an R package for affinity propagation clustering. *Bioinformatics* **27**:2463-2464. DOI: [10.1093/bioinformatics/btr406](http://doi.org/10.1093/bioinformatics/btr406) Moreover, we insist that, any time you use/cite the package, you also cite the original paper in which affinity propagation has been introduced: - B. J. Frey and D. Dueck (2007). Clustering by passing messages between data points. *Science* **315**:972-976. DOI: [10.1126/science.1136800](http://doi.org/10.1126/science.1136800) apcluster/man/0000755000176200001440000000000014245401072013026 5ustar liggesusersapcluster/man/ExClust-class.Rd0000644000176200001440000001071214612700003016002 0ustar liggesusers\name{ExClust-class} \docType{class} \alias{ExClust-class} \alias{ExClust} \alias{exclust} \alias{[,ExClust,index,missing,missing-method} \alias{[[,ExClust,index,missing-method} \alias{length,ExClust-method} \alias{similarity,ExClust-method} \title{Class "ExClust"} \description{S4 class for storing exemplar-based clusterings} \section{Objects}{ Objects of this class can be created by calling \code{\link{cutree}} to cut out a clustering level from a cluster hierarchy of class \code{\linkS4class{AggExResult}}. Moreover, \code{\link{cutree}} can also be used to convert an object of class \code{\linkS4class{APResult}} to class \code{ExClust}. } \section{Slots}{ The following slots are defined for \link{ExClust} objects: \describe{ \item{\code{l}:}{number of samples in the data set} \item{\code{sel}:}{subset of samples used for leveraged clustering} \item{\code{exemplars}:}{vector containing indices of exemplars} \item{\code{clusters}:}{list containing the clusters; the i-th component is a vector of indices of data points belonging to the i-th exemplar (including the exemplar itself)} \item{\code{idx}:}{vector of length \code{l} realizing a sample-to-exemplar mapping; the i-th entry contains the index of the exemplar the i-th sample belongs to} \item{\code{sim}:}{similarity matrix; only available if the preceding clustering method was called with \code{includeSim=TRUE}.} \item{\code{call}:}{method call of the preceding clustering method} } } \section{Methods}{ \describe{ \item{plot}{\code{signature(x="ExClust")}: see \code{\link{plot-methods}}} \item{plot}{\code{signature(x="ExClust", y="matrix")}: see \code{\link{plot-methods}}} \item{heatmap}{\code{signature(x="ExClust")}: see \code{\link{heatmap-methods}}} \item{heatmap}{\code{signature(x="ExClust", y="matrix")}: see \code{\link{heatmap-methods}}} \item{show}{\code{signature(object="ExClust")}: see \code{\link{show-methods}}} \item{labels}{\code{signature(object="ExClust")}: see \code{\link{labels-methods}}} \item{cutree}{\code{signature(object="ExClust", k="ANY", h="ANY")}: see \code{\link{cutree-methods}}} \item{length}{\code{signature(x="ExClust")}: gives the number of clusters.} \item{sort}{\code{signature(x="ExClust")}: see \code{\link{sort-methods}}} \item{as.hclust}{\code{signature(x="ExClust")}: see \code{\link{coerce-methods}}} \item{as.dendrogram}{\code{signature(object="ExClust")}: see \code{\link{coerce-methods}}} } } \section{Accessors}{ In the following code snippets, \code{x} is an \code{ExClust} object. \describe{ \item{[[}{\code{signature(x="ExClust", i="index", j="missing")}: \code{x[[i]]} returns the i-th cluster as a list of indices of samples belonging to the i-th cluster. } \item{[}{\code{signature(x="ExClust", i="index", j="missing", drop="missing")}: \code{x[i]} returns a list of integer vectors with the indices of samples belonging to this cluster. The list has as many components as the argument \code{i} has elements. A list is returned even if \code{i} is a single integer. } \item{similarity}{\code{signature(x="ExClust")}: gives the similarity matrix. } } } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\link{aggExCluster}}, \code{\link{show-methods}}, \code{\link{plot-methods}}, \code{\link{labels-methods}}, \code{\link{cutree-methods}}, \code{\linkS4class{AggExResult}}, \code{\linkS4class{APResult}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(20, 0.2, 0.05), rnorm(20, 0.8, 0.06)) cl2 <- cbind(rnorm(25, 0.7, 0.08), rnorm(25, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute similarity matrix (negative squared Euclidean) sim <- negDistMat(x, r=2) ## run affinity propagation aggres <- aggExCluster(sim) ## extract level with two clusters excl <- cutree(aggres, k=2) ## show details of clustering results show(excl) ## plot information about clustering run plot(excl, x) } \keyword{classes} apcluster/man/apcluster-package.Rd0000644000176200001440000000525414612677555016741 0ustar liggesusers\name{apcluster-package} \alias{apcluster-package} \docType{package} \title{APCluster Package} \description{ The apcluster package implements affinity propagation according to Frey and Dueck and a method for exemplar-based agglomerative clustering. It further offers various functions for plotting clustering results. } \details{The central function is \code{\link{apcluster}}. It runs affinity propagation on a given similarity matrix or it creates a similarity matrix for a given data set and similarity measure and runs affinity propagation on this matrix. The function returns an \code{\linkS4class{APResult}} object from which the clustering itself and information about the affinity propagation run can be obtained. Leveraged affinity propagation clustering \code{\link{apclusterL}} allows efficient clustering of large datasets by using only a subset of the similarities. The package further implements an exemplar-based agglomerative clustering method \code{\link{aggExCluster}} that can be used for computing a complete cluster hierarchy, but also for joining fine-grained clusters previously obtained by affinity propagation clustering. Further functions are implemented to visualize the results and to create distance matrices. } \author{Ulrich Bodenhofer, Andreas Kothmeier, Johannes Palme, Chrats Melkonian, and Nikola Kostic} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. } \keyword{package} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06)) cl2 <- cbind(rnorm(100, 0.7, 0.08), rnorm(100, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute similarity matrix (negative squared Euclidean) sim <- negDistMat(x, r=2) ## run affinity propagation apres <- apcluster(sim, details=TRUE) ## show details of clustering results show(apres) ## plot information about clustering run plot(apres) ## plot clustering result plot(apres, x) ## employ agglomerative clustering to join clusters aggres <- aggExCluster(sim, apres) ## show information show(aggres) show(cutree(aggres, 2)) ## plot dendrogram plot(aggres) ## plot clustering result for k=2 clusters plot(aggres, x, k=2) ## plot heatmap heatmap(apres, sim) ## leveraged apcluster apresL <- apclusterL(s=negDistMat(r=2), x=x, frac=0.2, sweeps=3) ## show details of clustering results show(apresL) ## plot clustering result plot(apresL, x) } apcluster/man/aggExCluster-methods.Rd0000644000176200001440000001566214612677244017403 0ustar liggesusers\name{aggExCluster} \docType{methods} \alias{aggExCluster} \alias{aggexcluster} \alias{aggExCluster-methods} \alias{aggExCluster,matrix,missing-method} \alias{aggExCluster,matrix,ExClust-method} \alias{aggExCluster,Matrix,missing-method} \alias{aggExCluster,Matrix,ExClust-method} \alias{aggExCluster,missing,ExClust-method} \alias{aggExCluster,function,ANY-method} \alias{aggExCluster,character,ANY-method} \title{Exemplar-based Agglomerative Clustering} \description{ Runs exemplar-based agglomerative clustering } \usage{ \S4method{aggExCluster}{matrix,missing}(s, x, includeSim=FALSE) \S4method{aggExCluster}{matrix,ExClust}(s, x, includeSim=FALSE) \S4method{aggExCluster}{Matrix,missing}(s, x, includeSim=FALSE) \S4method{aggExCluster}{Matrix,ExClust}(s, x, includeSim=FALSE) \S4method{aggExCluster}{missing,ExClust}(s, x, includeSim=TRUE) \S4method{aggExCluster}{function,ANY}(s, x, includeSim=TRUE, ...) \S4method{aggExCluster}{character,ANY}(s, x, includeSim=TRUE, ...) } \arguments{ \item{s}{an \eqn{l\times l}{lxl} similarity matrix or a similarity function either specified as the name of a package-provided similarity function as character string or a user provided function object} \item{x}{either a prior clustering of class \code{\linkS4class{ExClust}} (or \code{\linkS4class{APResult}}) or, if called with \code{s} being a function or function name, input data to be clustered (see \code{\link{apcluster}} for a detailed specification)} \item{includeSim}{if \code{TRUE}, the similarity matrix (either computed internally or passed via the \code{s} argument) is stored to the slot \code{sim} of the returned \code{\linkS4class{AggExResult}} object. The default is \code{FALSE} if \code{aggExCluster} has been called for a similarity matrix, otherwise the default is \code{TRUE}.} \item{...}{all other arguments are passed to the selected similarity function as they are.} } \details{\code{aggExCluster} performs agglomerative clustering. Unlike other methods, e.g., the ones implemented in \code{\link{hclust}}, \code{aggExCluster} is computing exemplars for each cluster and its merging objective is geared towards the identification of meaningful exemplars, too. For each pair of clusters, the merging objective is computed as follows: \enumerate{ \item{An intermediate cluster is created as the union of the two clusters.} \item{The potential exemplar is selected from the intermediate cluster as the sample that has the largest average similarity to all other samples in the intermediate cluster.} \item{Then the average similarity of the exemplar with all samples in the first cluster and the average similarity with all samples in the second cluster is computed. These two values measure how well the joint exemplar describes the samples in the two clusters.} \item{The merging objective is finally computed as the average of the two measures above. Hence, we can consider the merging objective as some kind of \dQuote{balanced average similarity to the joint exemplar}.} } In each step, all pairs of clusters are considered and the pair with the largest merging objective is actually merged. The joint exemplar is then chosen as the exemplar of the merged cluster. \code{aggExCluster} can be used in two ways, either by performing agglomerative clustering of an entire data set or by performing agglomerative clustering of data previously clustered by affinity propagation or another clustering algorithm. \enumerate{ \item{Agglomerative clustering of an entire data set can be accomplished either by calling \code{aggExCluster} on a quadratic similarity matrix without further argument or by calling \code{aggExCluster} for a function or function name along with data to be clustered (as argument \code{x}). A full agglomeration run is performed that starts from \code{l} clusters (all samples in separate one-element clusters) and ends with one cluster (all samples in one single cluster).} \item{Agglomerative clustering starting from a given clustering result can be accomplished by calling \code{aggExCluster} for an \code{\linkS4class{APResult}} or \code{\linkS4class{ExClust}} object passed as parameter \code{x}. The similarity matrix can either be passed as argument \code{s} or, if missing, \code{aggExCluster} looks if the similarity matrix is included in the clustering object \code{x}. A cluster hierarchy with numbers of clusters ranging from the number of clusters in \code{x} down to 1 is created.} } The result is stored in an \code{\linkS4class{AggExResult}} object. The slot \code{height} is filled with the merging objective of each of the \code{maxNoClusters-1} merges. The slot \code{order} contains a permutation of the samples/clusters for dendrogram plotting. The algorithm for computing this permutation is the same as the one used in \code{\link{hclust}}. If \code{aggExCluster} was called for an entire data set, the slot \code{label} contains the names of the objects to be clustered (if available, otherwise the indices are used). If \code{aggExCluster} was called for a prior clustering, then labels are set to \sQuote{Cluster 1}, \sQuote{Cluster 2}, etc. } \note{Similarity matrices can be supplied in dense or sparse format. Note, however, that sparse matrices are converted to full dense matrices before clustering which may lead to memory and/or performance bottlenecks for larger data sets.} \value{ Upon successful completion, the function returns an \code{\linkS4class{AggExResult}} object. } \author{Ulrich Bodenhofer, Johannes Palme, and Nikola Kostic} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{AggExResult}}, \code{\link{apcluster-methods}}, \code{\link{plot-methods}}, \code{\link{heatmap-methods}}, \code{\link{cutree-methods}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(50, 0.2, 0.05), rnorm(50, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute agglomerative clustering from scratch aggres1 <- aggExCluster(negDistMat(r=2), x) ## show results show(aggres1) ## plot dendrogram plot(aggres1) ## plot heatmap along with dendrogram heatmap(aggres1) ## plot level with two clusters plot(aggres1, x, k=2) ## run affinity propagation apres <- apcluster(negDistMat(r=2), x, q=0.7) ## create hierarchy of clusters determined by affinity propagation aggres2 <- aggExCluster(x=apres) ## show results show(aggres2) ## plot dendrogram plot(aggres2) plot(aggres2, showSamples=TRUE) ## plot heatmap heatmap(aggres2) ## plot level with two clusters plot(aggres2, x, k=2) } \keyword{cluster} \keyword{methods} apcluster/man/coerce-methods.Rd0000644000176200001440000001321014612677675016241 0ustar liggesusers\name{coerce-methods} \docType{methods} \alias{as.hclust} \alias{as.dendrogram} \alias{as.hclust,AggExResult-method} \alias{as.hclust,ExClust-method} \alias{as.dendrogram,AggExResult-method} \alias{as.dendrogram,ExClust-method} \title{Coercion of cluster hierarchies} \description{ Functions for coercing clustering object to hclust and dendrogram objects } \usage{ \S4method{as.hclust}{AggExResult}(x, base=0.05) \S4method{as.hclust}{ExClust}(x, base=0.05, ...) \S4method{as.dendrogram}{AggExResult}(object, base=0.05, useNames=TRUE) \S4method{as.dendrogram}{ExClust}(object, base=0.05, useNames=TRUE, ...) } \arguments{ \item{x}{a clustering result object of class \code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, or \code{\linkS4class{AggExResult}}} \item{object}{a clustering result object of class \code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, or \code{\linkS4class{AggExResult}}} \item{base}{fraction of height used for the very first join; defaults to 0.05, i.e. the first join appears at 5\% of the total height of the dendrogram (see details below).} \item{useNames}{if \code{TRUE} (default), the labels of the dendrogram are the sample/cluster names (if available); otherwise, the labels are indices.} \item{...}{all other arguments are passed on to \code{\link{aggExCluster}} (see details below).} } \details{ If called for an \code{\linkS4class{AggExResult}} object, \code{as.hclust} creates an \code{\link[stats:hclust]{hclust}} object. The heights are transformed to the interval from \code{base} (height of lowest join) to 1 (height of highest join). If called for an \code{\linkS4class{ExClust}} or \code{\linkS4class{APResult}} object, \code{\link{aggExCluster}} is called internally to create a cluster hierarchy first. This is only possible if the pairwise similarities are included in the \code{sim} slot of \code{x} (see \code{\link{aggExCluster}} on how to ensure this). If \code{x} is an \code{\linkS4class{AggExResult}} object obtained by clustering an entire data set, \code{as.hclust} produces a complete hierarchy. If, however, \code{x} is an \code{\linkS4class{ExClust}} (or \code{\linkS4class{APResult}}) object or an \code{\linkS4class{AggExResult}} obtained by running \code{\link{aggExCluster}} on an \code{\linkS4class{ExClust}} or \code{\linkS4class{APResult}} object, then \code{as.hclust} produces a hierarchy of clusters, not of samples. If called for an \code{\linkS4class{AggExResult}} object, \code{as.dendrogram} creates an \code{\link[stats:dendrogram]{dendrogram}} object. Analogously to \code{as.hclust}, the heights are transformed to the interval ranging from \code{base} (height of lowest join) to 1 (height of highest join). So, any information about heights of merges is lost. If the original join heights are relevant, call \code{\link[apcluster:plot]{plot}} on the original \code{\linkS4class{AggExResult}} object directly without coercing it to a \code{\link[stats:dendrogram]{dendrogram}} object first. If called for an \code{\linkS4class{ExClust}} or \code{\linkS4class{APResult}} object, \code{\link{aggExCluster}} is called first to create a cluster hierarchy. Again this is only possible if the pairwise similarities are included in the \code{sim} slot of \code{object}. If \code{object} is an \code{\linkS4class{AggExResult}} object obtained by clustering an entire data set, \code{as.dendrogram} produces a complete dendrogram. If \code{object} is an \code{\linkS4class{ExClust}} (or \code{\linkS4class{APResult}}) object or an \code{\linkS4class{AggExResult}} obtained by previously running \code{\link{aggExCluster}} on an \code{\linkS4class{ExClust}} or \code{\linkS4class{APResult}} object, then \code{as.dendrogram} produces a complete dendrogram of all samples, too, but with the difference that entire clusters of the previous \code{\linkS4class{ExClust}} or \code{\linkS4class{APResult}} object are not further split up hierarchically. Consequently, if \code{x} is not a complete cluster hierarchy, but a hierarchy of clusters, \code{as.dendrogram(as.hclust(x))} produces a dendrogram of clusters, whereas \code{as.dendrogram(x)} in any case produces a dendrogram of samples (with the special property mentioned above). } \value{ see details above } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{APResult}}, \code{\linkS4class{AggExResult}}, \code{\linkS4class{ExClust}}, \code{\link{heatmap-methods}}, \code{\link{apcluster}}, \code{\link{apclusterL}}, \code{\link{aggExCluster}}, \code{\link{cutree-methods}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(20, 0.2, 0.05), rnorm(20, 0.8, 0.06)) cl2 <- cbind(rnorm(20, 0.7, 0.08), rnorm(20, 0.3, 0.05)) x <- rbind(cl1, cl2) ## run affinity propagation apres <- apcluster(negDistMat(r=2), x, q=0.7, details=TRUE) ## perform agglomerative clustering of affinity propagation clusters aggres1 <- aggExCluster(x=apres) ## compute and plot dendrogram dend1 <- as.dendrogram(aggres1) dend1 plot(dend1) ## compute and show dendrogram computed from hclust object dend2 <- as.dendrogram(as.hclust(aggres1)) dend2 plot(dend2) ## perform agglomerative clustering of whole data set aggres2 <- aggExCluster(negDistMat(r=2), x) ## compute and plot dendrogram dend3 <- as.dendrogram(aggres2) dend3 plot(dend3) } \keyword{cluster} \keyword{methods} apcluster/man/apclusterK-methods.Rd0000644000176200001440000001575014612677410017114 0ustar liggesusers\name{apclusterK} \docType{methods} \alias{apclusterK} \alias{apclusterK-methods} \alias{apclusterK,matrix,missing-method} \alias{apclusterK,Matrix,missing-method} \alias{apclusterK,dgTMatrix,missing-method} \alias{apclusterK,sparseMatrix,missing-method} \alias{apclusterK,character,ANY-method} \alias{apclusterK,function,ANY-method} \title{Affinity Propagation for Pre-defined Number of Clusters} \description{ Runs affinity propagation clustering for a given similarity matrix adjusting input preferences iteratively in order to achieve a desired number of clusters } \usage{ \S4method{apclusterK}{matrix,missing}(s, x, K, prc=10, bimaxit=20, exact=FALSE, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA, verbose=TRUE) \S4method{apclusterK}{Matrix,missing}(s, x, K, ...) \S4method{apclusterK}{dgTMatrix,missing}(s, x, K, prc=10, bimaxit=20, exact=FALSE, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA, verbose=TRUE) \S4method{apclusterK}{sparseMatrix,missing}(s, x, K, ...) \S4method{apclusterK}{function,ANY}(s, x, K, prc=10, bimaxit=20, exact=FALSE, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, details=FALSE, nonoise=FALSE, seed=NA, verbose=TRUE, ...) \S4method{apclusterK}{character,ANY}(s, x, K, prc=10, bimaxit=20, exact=FALSE, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, details=FALSE, nonoise=FALSE, seed=NA, verbose=TRUE, ...) } \arguments{ \item{s}{an \eqn{l\times l}{lxl} similarity matrix in sparse or dense format or a similarity function either specified as the name of a package-provided similarity function as character string or a user provided function object.} \item{x}{input data to be clustered; if \code{x} is a matrix or data frame, rows are interpreted as samples and columns are interpreted as features; apart from matrices or data frames, \code{x} may be any other structured data type that contains multiple data items - provided that an appropriate \code{\link[base:length]{length}} function is available that returns the number of items} \item{K}{desired number of clusters} \item{prc}{the algorithm stops if the number of clusters does not deviate more than prc percent from desired value K; set to 0 if you want to have exactly K clusters} \item{bimaxit}{maximum number of bisection steps to perform; note that no warning is issued if the number of clusters is still not in the desired range} \item{exact}{flag indicating whether or not to compute the initial preference range exactly (see \code{\link{preferenceRange}})} \item{maxits}{maximal number of iterations that \code{\link{apcluster}} should execute} \item{convits}{\code{\link{apcluster}} terminates if the examplars have not changed for \code{convits} iterations} \item{lam}{damping factor for \code{\link{apcluster}}; should be a value in the range [0.5, 1); higher values correspond to heavy damping which may be needed if oscillations occur} \item{includeSim}{if \code{TRUE}, the similarity matrix (either computed internally or passed via the \code{s} argument) is stored to the slot \code{sim} of the returned \code{\linkS4class{APResult}} object. The default is \code{FALSE} if \code{apclusterK} has been called for a similarity matrix, otherwise the default is \code{TRUE}.} \item{details}{if \code{TRUE}, more detailed information about the algorithm's progress is stored in the output object (see \code{\linkS4class{APResult}})} \item{nonoise}{\code{\link{apcluster}} adds a small amount of noise to \code{s} to prevent degenerate cases; if \code{TRUE}, this is disabled} \item{seed}{for reproducibility, the seed of the random number generator can be set to a fixed value, if \code{NA}, the seed remains unchanged} \item{verbose}{flag indicating whether status information should be displayed during bisection} \item{...}{for the methods with signatures \code{character,ANY} and \code{function,ANY}, all other arguments are passed to the selected similarity function as they are; for the methods with signatures \code{Matrix,missing} and \code{sparseMatrix,missing}, further arguments are passed on to the \code{apclusterK} methods with signatures \code{Matrix,missing} and \code{dgTMatrix,missing}, respectively.} } \details{ \code{apclusterK} first runs \code{\link{preferenceRange}} to determine the range of meaningful choices of the input preference \code{p}. Then it decreases \code{p} exponentially for a few iterations to obtain a good initial guess for \code{p}. If the number of clusters is still too far from the desired goal, bisection is applied. When called with a similarity matrix as input, the function performs the procedure described above. When called with the name of a package-provided similarity function or a user-provided similarity function object and input data, the function first computes the similarity matrix before running \code{apclusterK} on this similarity matrix. The similarity matrix is returned for later use as part of the APResult object depending on whether \code{includeSim} was set to \code{TRUE} (see argument description above). Apart from minor adaptations and optimizations, the implementation is largely analogous to Frey's and Dueck's Matlab code (see \url{https://psi.toronto.edu/research/affinity-propagation-clustering-by-message-passing/}). } \value{ Upon successful completion, the function returns a \code{\linkS4class{APResult}} object. } \author{Ulrich Bodenhofer and Andreas Kothmeier} \references{\url{https://github.com/UBod/apcluster} Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\link{apcluster}}, \code{\link{preferenceRange}}, \code{\linkS4class{APResult}}} \examples{ ## create three Gaussian clouds cl1 <- cbind(rnorm(70, 0.2, 0.05), rnorm(70, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) cl3 <- cbind(rnorm(60, 0.8, 0.04), rnorm(60, 0.8, 0.05)) x <- rbind(cl1, cl2, cl3) ## run affinity propagation such that 3 clusters are obtained apres <- apclusterK(negDistMat(r=2), x, K=3) ## show details of clustering results show(apres) ## plot clustering result plot(apres, x) ## create sparse similarity matrix cl1 <- cbind(rnorm(20, 0.2, 0.05), rnorm(20, 0.8, 0.06)) cl2 <- cbind(rnorm(20, 0.7, 0.08), rnorm(20, 0.3, 0.05)) x <- rbind(cl1, cl2) sim <- negDistMat(x, r=2) ssim <- as.SparseSimilarityMatrix(sim, lower=-0.2) ## run apcluster() on the sparse similarity matrix apres <- apclusterK(ssim, K=2) apres } \keyword{cluster} apcluster/man/apcluster-methods.Rd0000644000176200001440000002005614612677516017003 0ustar liggesusers\name{apcluster} \docType{methods} \alias{apcluster} \alias{apcluster-methods} \alias{apcluster,matrix,missing-method} \alias{apcluster,dgTMatrix,missing-method} \alias{apcluster,sparseMatrix,missing-method} \alias{apcluster,Matrix,missing-method} \alias{apcluster,character,ANY-method} \alias{apcluster,function,ANY-method} \title{Affinity Propagation} \description{ Runs affinity propagation clustering } \usage{ \S4method{apcluster}{matrix,missing}(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA) \S4method{apcluster}{dgTMatrix,missing}(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA) \S4method{apcluster}{sparseMatrix,missing}(s, x, ...) \S4method{apcluster}{Matrix,missing}(s, x, ...) \S4method{apcluster}{character,ANY}(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, details=FALSE, nonoise=FALSE, seed=NA, ...) \S4method{apcluster}{function,ANY}(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, details=FALSE, nonoise=FALSE, seed=NA, ...) } \arguments{ \item{s}{an \eqn{l\times l}{l x l} similarity matrix or a similarity function either specified as the name of a package-provided similarity function as character string or a user provided function object. \code{s} may also be a sparse matrix according to the \pkg{Matrix} package. Internally, \code{apcluster} uses the \code{\linkS4class{dgTMatrix}} class; all other sparse matrices are cast to this class (if possible, otherwise the function quits with an error). If \code{s} is any other object of class \code{\linkS4class{Matrix}}, \code{s} is cast to a regular matrix internally (if possible, otherwise the function quits with an error).} \item{x}{input data to be clustered; if \code{x} is a matrix or data frame, rows are interpreted as samples and columns are interpreted as features; apart from matrices or data frames, \code{x} may be any other structured data type that contains multiple data items - provided that an appropriate \code{\link[base:length]{length}} function is available that returns the number of items} \item{p}{input preference; can be a vector that specifies individual preferences for each data point. If scalar, the same value is used for all data points. If \code{NA}, exemplar preferences are initialized according to the distribution of non-Inf values in \code{s}. How this is done is controlled by the parameter \code{q}.} \item{q}{if \code{p=NA}, exemplar preferences are initialized according to the distribution of non-Inf values in \code{s}. If \code{q=NA}, exemplar preferences are set to the median of non-Inf values in \code{s}. If \code{q} is a value between 0 and 1, the sample quantile with threshold \code{q} is used, whereas \code{q=0.5} again results in the median.} \item{maxits}{maximal number of iterations that should be executed} \item{convits}{the algorithm terminates if the examplars have not changed for \code{convits} iterations} \item{lam}{damping factor; should be a value in the range [0.5, 1); higher values correspond to heavy damping which may be needed if oscillations occur} \item{includeSim}{if \code{TRUE}, the similarity matrix (either computed internally or passed via the \code{s} argument) is stored to the slot \code{sim} of the returned \code{\linkS4class{APResult}} object. The default is \code{FALSE} if \code{apcluster} has been called for a similarity matrix, otherwise the default is \code{TRUE}.} \item{details}{if \code{TRUE}, more detailed information about the algorithm's progress is stored in the output object (see \code{\linkS4class{APResult}})} \item{nonoise}{\code{apcluster} adds a small amount of noise to \code{s} to prevent degenerate cases; if \code{TRUE}, this is disabled} \item{seed}{for reproducibility, the seed of the random number generator can be set to a fixed value before adding noise (see above), if \code{NA}, the seed remains unchanged} \item{...}{for the methods with signatures \code{character,ANY} and \code{function,ANY}, all other arguments are passed to the selected similarity function as they are; for the methods with signatures \code{Matrix,missing} and \code{sparseMatrix,missing}, further arguments are passed on to the \code{apcluster} methods with signatures \code{Matrix,missing} and \code{dgTMatrix,missing}, respectively.} } \details{Affinity Propagation clusters data using a set of real-valued pairwise data point similarities as input. Each cluster is represented by a cluster center data point (the so-called exemplar). The method is iterative and searches for clusters maximizing an objective function called net similarity. When called with a similarity matrix as input (which may also be a sparse matrix according to the \pkg{Matrix} package), the function performs AP clustering. When called with the name of a package-provided similarity function or a user-provided similarity function object and input data, the function first computes the similarity matrix before performing AP clustering. The similarity matrix is returned for later use as part of the \code{\linkS4class{APResult}} object depending on whether \code{includeSim} was set to \code{TRUE} (see argument description above). Apart from minor adaptations and optimizations, the AP clustering functionality of the function \code{apcluster} is largely analogous to Frey's and Dueck's Matlab code (see \url{https://psi.toronto.edu/research/affinity-propagation-clustering-by-message-passing/}). The new argument \code{q} allows for better controlling the number of clusters without knowing the distribution of similarity values. A meaningful range for the parameter \code{p} can be determined using the function \code{\link{preferenceRange}}. Alternatively, a certain fixed number of clusters may be desirable. For this purpose, the function \code{\link{apclusterK}} is available. } \value{ Upon successful completion, the function returns an \code{\linkS4class{APResult}} object. } \author{Ulrich Bodenhofer, Andreas Kothmeier, Johannes Palme, and Chrats Melkonian} \references{\url{https://github.com/UBod/apcluster} Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\link{APResult}}, \code{\link{show-methods}}, \code{\link{plot-methods}}, \code{\link{labels-methods}}, \code{\link{preferenceRange}}, \code{\link{apclusterL-methods}}, \code{\link{apclusterK}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute similarity matrix and run affinity propagation ## (p defaults to median of similarity) apres <- apcluster(negDistMat(r=2), x, details=TRUE) ## show details of clustering results show(apres) ## plot clustering result plot(apres, x) ## plot heatmap heatmap(apres) ## run affinity propagation with default preference of 10% quantile ## of similarities; this should lead to a smaller number of clusters ## reuse similarity matrix from previous run apres <- apcluster(s=apres@sim, q=0.1) show(apres) plot(apres, x) ## now try the same with RBF kernel sim <- expSimMat(x, r=2) apres <- apcluster(s=sim, q=0.2) show(apres) plot(apres, x) ## create sparse similarity matrix cl1 <- cbind(rnorm(20, 0.2, 0.05), rnorm(20, 0.8, 0.06)) cl2 <- cbind(rnorm(20, 0.7, 0.08), rnorm(20, 0.3, 0.05)) x <- rbind(cl1, cl2) sim <- negDistMat(x, r=2) ssim <- as.SparseSimilarityMatrix(sim, lower=-0.2) ## run apcluster() on the sparse similarity matrix apres <- apcluster(ssim, q=0) apres } \keyword{cluster} \keyword{methods}apcluster/man/sort-methods.Rd0000644000176200001440000000714414612700220015746 0ustar liggesusers\name{sort-methods} \docType{methods} \alias{sort} \alias{sort-methods} \alias{sort,APResult-method} \alias{sort,ExClust-method} \title{Sort clusters} \description{ Rearrange clusters according to sort criterion } \usage{ \S4method{sort}{ExClust}(x, decreasing=FALSE, sortBy=c("aggExCluster", "size", "nameExemplar", "noExemplar"), ...) } \arguments{ \item{x}{object of class \code{\linkS4class{APResult}} or \code{\linkS4class{ExClust}}} \item{decreasing}{logical indicating if sorting should be done in decreasing order, see details below} \item{sortBy}{sort criterion, see details below} \item{...}{further arguments are ignored; only defined for S3 method consistency} } \details{ The function \code{sort} takes an \code{\linkS4class{APResult}} or \code{\linkS4class{ExClust}} clustering object \code{x} and creates a new clustering object of the same class, but with clusters arranged according to the sort criterion passed as argument \code{sortBy}: \describe{ \item{\dQuote{aggExCluster}}{(default) order clusters as they would appear in the dendrogram produced by \code{\link{aggExCluster}}. This is also the same ordering in which the clusters are arranged by \code{\link{heatmap}}. Note that this only works if the similarity matrix is included in the input object \code{x}, otherwise an error message is produced.} \item{\dQuote{size}}{sorts clusters according to their size (from small to large).} \item{\dQuote{nameExemplar}}{sorts clusters according to the names of the examplars (if available, otherwise an error is produced).} \item{\dQuote{noExemplar}}{sorts clusters according to the indices of the examplars.} } If \code{decreasing} is \code{TRUE}, the order is reversed and, for example, \code{sortBy="size"} sorts clusters with such that the larger clusters come first. Note that the cluster numbers of \code{x} are not preserved by \code{sort}, i.e. the cluster no. 1 of the object returned by \code{sort} is the one that has been ranked first by \code{sort}, which may not necessarily coincide with cluster no. 1 of the original clustering object \code{x}. Note that this is an S3 method (whereas all other methods in this package are S4 methods). This inconsistency has been introduced in order to avoid interoperability problems with the \pkg{BiocGenerics} package which may overwrite the definition of the \code{sort} generic if it is loaded after the \pkg{apcluster} package. } \value{ returns a copy of \code{x}, but with slots \code{exemplars} and \code{clusters} (see \code{\linkS4class{APResult}} or \code{\linkS4class{ExClust}}) reordered. } \author{Ulrich Bodenhofer} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(50,0.2,0.05),rnorm(50,0.8,0.06)) cl2 <- cbind(rnorm(50,0.7,0.08),rnorm(50,0.3,0.05)) x <- rbind(cl1,cl2) ## run affinity propagation apres <- apcluster(negDistMat(r=2), x, q=0.7) show(apres) ## show dendrogram plot(aggExCluster(x=apres)) ## default sort order: like in heatmap or dendrogram show(sort(apres)) ## show dendrogram (note the different cluster numbers!) plot(aggExCluster(x=sort(apres))) ## sort by size show(sort(apres, decreasing=TRUE, sortBy="size")) } \keyword{cluster} \keyword{methods} apcluster/man/apclusterL-methods.Rd0000644000176200001440000001766114612677452017126 0ustar liggesusers\name{apclusterL} \docType{methods} \alias{apclusterL} \alias{apclusterL-methods} \alias{apclusterL,matrix,missing-method} \alias{apclusterL,character,ANY-method} \alias{apclusterL,function,ANY-method} \title{Leveraged Affinity Propagation} \description{ Runs leveraged affinity propagation clustering} \usage{ \S4method{apclusterL}{matrix,missing}(s, x, sel, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, nonoise=FALSE, seed=NA) \S4method{apclusterL}{character,ANY}(s, x, frac, sweeps, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, nonoise=FALSE, seed=NA, ...) \S4method{apclusterL}{function,ANY}(s, x, frac, sweeps, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, nonoise=FALSE, seed=NA, ...) } \arguments{ \item{s}{an \eqn{l \times length(sel)}{l x length(sel)} similarity matrix or a similarity function either specified as the name of a package provided similarity function as character string or a user provided function object for similarity calculation. If \code{s} is supplied as a similarity matrix, the columns must correspond to the same sub-selection of samples as specified in the \code{sel} argument and must be in the same increasing order. For a package- or user-defined similarity function, additional parameters can be specified as appropriate for the chosen method and are passed on to the similarity function via the \code{...} argument (see below). See the package vignette for a non-trivial example or supplying a user-defined similarity measure.} \item{x}{input data to be clustered; if \code{x} is a matrix or data frame, rows are interpreted as samples and columns are interpreted as features; apart from matrices or data frames, \code{x} may be any other structured data type that contains multiple data items - provided that an appropriate \code{\link[base:length]{length}} function is available that returns the number of items} \item{frac}{fraction of samples that should be used for leveraged clustering. The similarity matrix will be generated for all samples against a random fraction of the samples as specified by this parameter.} \item{sweeps}{number of sweeps of leveraged clustering performed with changing randomly selected subset of samples.} \item{sel}{selected sample indices; a vector containing the sample indices of the sample subset used for leveraged AP clustering in increasing order.} \item{p}{input preference; can be a vector that specifies individual preferences for each data point. If scalar, the same value is used for all data points. If \code{NA}, exemplar preferences are initialized according to the distribution of non-Inf values in \code{s}. How this is done is controlled by the parameter \code{q}. See also \code{\link{apcluster}}.} \item{q}{if \code{p=NA}, exemplar preferences are initialized according to the distribution of non-Inf values in \code{s}. If \code{q=NA}, exemplar preferences are set to the median of non-Inf values in \code{s}. If \code{q} is a value between 0 and 1, the sample quantile with threshold \code{q} is used, whereas \code{q=0.5} again results in the median. See also \code{\link{apcluster}}.} \item{maxits}{maximal number of iterations that should be executed} \item{convits}{the algorithm terminates if the examplars have not changed for \code{convits} iterations} \item{lam}{damping factor; should be a value in the range [0.5, 1); higher values correspond to heavy damping which may be needed if oscillations occur} \item{includeSim}{if \code{TRUE}, the similarity matrix (either computed internally or passed via the \code{s} argument) is stored to the slot \code{sim} of the returned \code{\linkS4class{APResult}} object. The default is \code{FALSE} if \code{apclusterL} has been called for a similarity matrix, otherwise the default is \code{TRUE}.} \item{nonoise}{\code{apcluster} adds a small amount of noise to \code{s} to prevent degenerate cases; if \code{TRUE}, this is disabled} \item{seed}{for reproducibility, the seed of the random number generator can be set to a fixed value before adding noise (see above), if \code{NA}, the seed remains unchanged} \item{...}{all other arguments are passed to the selected similarity function as they are; note that possible name conflicts between arguments of \code{apcluster} and arguments of the similarity function may occur; therefore, we recommend to write user-defined similarity functions without additional parameters or to use closures to fix parameters (such as, in the example below);} } \details{Affinity Propagation clusters data using a set of real-valued pairwise similarities as input. Each cluster is represented by a representative cluster center (the so-called exemplar). The method is iterative and searches for clusters maximizing an objective function called net similarity. Leveraged Affinity Propagation reduces dynamic and static load for large datasets. Only a subset of the samples are considered in the clustering process assuming that they provide already enough information about the cluster structure. When called with input data and the name of a package provided or a user provided similarity function the function selects a random sample subset according to the \code{frac} parameter, calculates a rectangular similarity matrix of all samples against this subset and repeats affinity propagation \code{sweep} times. A new sample subset is used for each repetition. The clustering result of the sweep with the highest net similarity is returned. Any parameters specific to the chosen method of similarity calculation can be passed to \code{apcluster} in addition to the parameters described above. The similarity matrix for the best trial is also returned in the result object when requested by the user (argument \code{includeSim}). When called with a rectangular similarity matrix (which represents a column subset of the full similarity matrix) the function performs AP clustering on this similarity matrix. The information about the selected samples is passed to clustering with the parameter \code{sel}. This function is only needed when the user needs full control of distance calculation or sample subset selection. Apart from minor adaptations and optimizations, the implementation of the function \code{apclusterL} is largely analogous to Frey's and Dueck's Matlab code (see \url{https://psi.toronto.edu/research/affinity-propagation-clustering-by-message-passing/}).} \value{ Upon successful completion, both functions returns an \code{\linkS4class{APResult}} object. } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{APResult}}, \code{\link{show-methods}}, \code{\link{plot-methods}}, \code{\link{labels-methods}}, \code{\link{preferenceRange}}, \code{\link{apcluster-methods}}, \code{\link{apclusterK}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(150, 0.2, 0.05), rnorm(150, 0.8, 0.06)) cl2 <- cbind(rnorm(100, 0.7, 0.08), rnorm(100, 0.3, 0.05)) x <- rbind(cl1, cl2) ## leveraged apcluster apres <- apclusterL(negDistMat(r=2), x, frac=0.2, sweeps=3, p=-0.2) ## show details of leveraged clustering results show(apres) ## plot leveraged clustering result plot(apres, x) ## plot heatmap of clustering result heatmap(apres) ## show net similarities of single sweeps apres@netsimLev ## show samples on which best sweep was based apres@sel } \keyword{cluster} apcluster/man/similarities.Rd0000644000176200001440000001763414612700200016017 0ustar liggesusers\name{similarities} \alias{similarities} \alias{negDistMat} \alias{expSimMat} \alias{linSimMat} \alias{corSimMat} \alias{linKernel} \title{Methods for Computing Similarity Matrices} \description{ Compute similarity matrices from data set } \usage{ negDistMat(x, sel=NA, r=1, method="euclidean", p=2) expSimMat(x, sel=NA, r=2, w=1, method="euclidean", p=2) linSimMat(x, sel=NA, w=1, method="euclidean", p=2) corSimMat(x, sel=NA, r=1, signed=TRUE, method="pearson") linKernel(x, sel=NA, normalize=FALSE) } \arguments{ \item{x}{input data to be clustered; if \code{x} is a vector, it is interpreted as a list of scalar values that are to be clustered; if \code{x} is a matrix or data frame, rows are interpreted as samples and columns are interpreted as features; in the case that \code{x} is a data frame, only numerical columns/features are taken into account, whereas categorical features are neglected. If \code{x} is missing, all functions return a function that can be used as similarity measure, in particular, as \code{s} argument for \code{\link{apclusterL}}.} \item{sel}{selected samples subset; vector of row indices for x in increasing order (see details below)} \item{r}{exponent (see details below)} \item{w}{radius (see details below)} \item{signed}{take sign of correlation into account (see details below)} \item{normalize}{see details below} \item{method}{type of distance measure to be used; for \code{negDistMat}, \code{expSimMat} and \code{linSimMat}, this argument is analogous to the \code{method} argument of \code{\link[stats:dist]{dist}}. For \code{corSimMat}, this argument is analogous to the \code{method} argument of \code{\link[stats:cor]{cor}}.} \item{p}{exponent for Minkowski distance; only used for \code{method="minkowski"}, otherwise ignored. See \code{\link[stats:dist]{dist}}.} } \details{\code{negDistMat} creates a square matrix of mutual pairwise similarities of data vectors as negative distances. The argument \code{r} (default is 1) is used to transform the resulting distances by computing the r-th power (use \code{r=2} to obtain negative squared distances as in Frey's and Dueck's demos), i.e., given a distance d, the resulting similarity is computed as \eqn{s=-d^r}. With the parameter \code{sel} a subset of samples can be specified for distance calculation. In this case not the full distance matrix is computed but a rectangular similarity matrix of all samples (rows) against the subset (cols) as needed for leveraged clustering. Internally, the computation of distances is done using an internal method derived from \code{\link[stats:dist]{dist}}. All options of this function except \code{diag} and \code{upper} can be used, especially \code{method} which allows for selecting different distance measures. Note that, since version 1.4.4. of the package, there is an additional method \code{"discrepancy"} that implements Weyl's discrepancy measure. \code{expSimMat} computes similarities in a way similar to \code{negDistMat}, but the transformation of distances to similarities is done in the following way: \deqn{s=\exp\left(-\left(\frac{d}{w}\right)^r\right)}{s=exp(-(d/w)^r)} The parameter \code{sel} allows the creation of a rectangular similarity matrix. As above, r is an exponent. The parameter w controls the speed of descent. \code{r=2} in conjunction with Euclidean distances corresponds to the well-known Gaussian/RBF kernel, whereas \code{r=1} corresponds to the Laplace kernel. Note that these similarity measures can also be understood as fuzzy equality relations. \code{linSimMat} provides another way of transforming distances into similarities by applying the following transformation to a distance d: \deqn{s=\max\left(0,1-\frac{d}{w}\right)}{s=max(0,1-d/w)} Thw parameter \code{sel} is used again for creation of a rectangular similarity matrix. Here \code{w} corresponds to a maximal radius of interest. Note that this is a fuzzy equality relation with respect to the Lukasiewicz t-norm. Unlike the above three functions, \code{linKernel} computes pairwise similarities as scalar products of data vectors, i.e. it corresponds, as the name suggests, to the \dQuote{linear kernel}. Use parameter \code{sel} to compute only a submatrix of the full kernel matrix as described above. If \code{normalize=TRUE}, the values are scaled to the unit sphere in the following way (for two samples \code{x} and \code{y}: \deqn{s=\frac{\vec{x}^T\vec{y}}{\|\vec{x}\| \|\vec{y}\|}}{s=(x^T y)/(|x| |y|)} The function \code{corSimMat} computes pairwise similarities as correlations. It uses \code{link[stats:cor]{cor}} internally. The \code{method} argument is passed on to \code{link[stats:cor]{cor}}. The argument \code{r} serves as an exponent with which the correlations can be transformed. If \code{signed=TRUE} (default), negative correlations are taken into account, i.e. two samples are maximally dissimilar if they are negatively correlated. If \code{signed=FALSE}, similarities are computed as absolute values of correlations, i.e. two samples are maximally similar if they are positively or negatively correlated and the two samples are maximally dissimilar if they are uncorrelated. Note that the naming of the argument \code{p} has been chosen for consistency with \code{\link[stats:dist]{dist}} and previous versions of the package. When using leveraged AP in conjunction with the Minkowski distance, this leads to conflicts with the input preference parameter \code{p} of \code{\link{apclusterL}}. In order to avoid that, use the above functions without \code{x} argument to create a custom similarity measure with fixed parameter \code{p} (see example below). } \value{ All functions listed above return square or rectangular matrices of similarities. } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Micchelli, C. A. (1986) Interpolation of scattered data: distance matrices and conditionally positive definite functions. \emph{Constr. Approx.} \bold{2}, 11-20. De Baets, B. and Mesiar, R. (1997) Pseudo-metrics and T-equivalences. \emph{J. Fuzzy Math.} \bold{5}, 471-481. Bauer, P., Bodenhofer, U., and Klement, E. P. (1996) A fuzzy algorithm for pixel classification based on the discrepancy norm. In \emph{Proc. 5th IEEE Int. Conf. on Fuzzy Systems}, volume III, pages 2007--2012, New Orleans, LA. DOI: \doi{10.1109/FUZZY.1996.552744}. } \seealso{\code{\link[stats:dist]{dist}}, \code{\link{apcluster}}, \code{\link{apclusterL}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06)) cl2 <- cbind(rnorm(100, 0.7, 0.08), rnorm(100, 0.3, 0.05)) x <- rbind(cl1, cl2) ## create negative distance matrix (default Euclidean) sim1 <- negDistMat(x) ## compute similarities as squared negative distances ## (in accordance with Frey's and Dueck's demos) sim2 <- negDistMat(x, r=2) ## compute RBF kernel sim3 <- expSimMat(x, r=2) ## compute similarities as squared negative distances ## all samples versus a randomly chosen subset ## of 50 samples (for leveraged AP clustering) sel <- sort(sample(1:nrow(x), nrow(x)*0.25)) sim4 <- negDistMat(x, sel, r=2) ## example of leveraged AP using Minkowski distance with non-default ## parameter p cl1 <- cbind(rnorm(150, 0.2, 0.05), rnorm(150, 0.8, 0.06)) cl2 <- cbind(rnorm(100, 0.7, 0.08), rnorm(100, 0.3, 0.05)) x <- rbind(cl1, cl2) apres <- apclusterL(s=negDistMat(method="minkowski", p=2.5, r=2), x, frac=0.2, sweeps=3, p=-0.2) show(apres) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{cluster} apcluster/man/apclusterDemo.Rd0000644000176200001440000000472114612677353016147 0ustar liggesusers\name{apclusterDemo} \alias{apclusterDemo} \title{Affinity Propagation Demo} \description{ Runs affinity propagation demo for randomly generated data set according to Frey and Dueck } \usage{ apclusterDemo(l=100, d=2, seed=NA, ...) } \arguments{ \item{l}{number of data points to be generated} \item{d}{dimension of data to be created} \item{seed}{for reproducibility, the seed of the random number generator can be set to a fixed value; if \code{NA}, the seed remains unchanged} \item{...}{all other arguments are passed on to \code{\link{apcluster}}} } \details{\code{apclusterDemo} creates \code{l} \code{d}-dimensional data points that are uniformly distributed in \eqn{[0,1]^d}. Affinity propagation is executed for this data set with default parameters. Alternative settings can be passed to \code{\link{apcluster}} with additional arguments. After completion of affinity propagation, the results are shown and the performance measures are plotted. This function corresponds to the demo function in the original Matlab code of Frey and Dueck. We warn the user, however, that uniformly distributed data are not necessarily ideal for demonstrating clustering, as there can never be real clusters in uniformly distributed data - all clusters found must be random artefacts. } \value{ Upon successful completion, the function returns an invisible list with three components. The first is the data set that has been created, the second is the similarity matrix, and the third is an \code{\linkS4class{APResult}} object with the clustering results (see examples below). } \author{Ulrich Bodenhofer, Johannes Palme, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{APResult}}, \code{\link{plot-methods}}, \code{\link{apcluster}}, \code{\link{apclusterL}}} \examples{ ## create random data set and run affinity propagation apd <- apclusterDemo() ## plot clustering result along with data set plot(apd[[3]], apd[[1]]) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{cluster} apcluster/man/AggExResult-class.Rd0000644000176200001440000001321314612677316016630 0ustar liggesusers\name{AggExResult-class} \docType{class} \alias{AggExResult-class} \alias{AggExResult} \alias{aggexresult} \alias{[,AggExResult,index,missing,missing-method} \alias{[[,AggExResult,index,missing-method} \alias{length,AggExResult-method} \alias{similarity,AggExResult-method} \title{Class "AggExResult"} \description{S4 class for storing results of exemplar-based agglomerative clustering} \section{Objects}{ Objects of this class can be created by calling \code{\link{aggExCluster}} for a given similarity matrix. } \section{Slots}{ The following slots are defined for \link{AggExResult} objects: \describe{ \item{\code{l}:}{number of samples in the data set} \item{\code{sel}:}{subset of samples used for leveraged clustering (empty for normal clustering)} \item{\code{maxNoClusters}:}{maximum number of clusters in the cluster hierarchy, i.e. it contains clusterings with 1 - \code{maxNoClusters} clusters.} \item{\code{exemplars}:}{list of length \code{maxNoClusters}; the \code{i}-th component of the list is a vector of \code{i} exemplars (corresponding to the level with \code{i} clusters).} \item{\code{clusters}:}{list of length \code{maxNoClusters}; the \code{i}-th component of \code{clusters} is a list of \code{i} clusters, each of which is a vector of sample indices.} \item{\code{merge}:}{a \code{maxNoClusters-1} by 2 matrix that contains the merging hierarchy; fully analogous to the slot \code{merge} in the class \code{\link{hclust}}.} \item{\code{height}:}{a vector of length \code{maxNoClusters-1} that contains the merging objective of each merge; largely analogous to the slot \code{height} in the class \code{\link{hclust}} except that the slot \code{height} in \code{AggExResult} objects is supposed to be non-increasing, since \code{\link{aggExCluster}} is based on similarities, whereas \code{\link{hclust}} uses dissimilarities.} \item{\code{order}:}{a vector containing a permutation of indices that can be used for plotting proper dendrograms without crossing branches; fully analogous to the slot \code{order} in the class \code{\link{hclust}}.} \item{\code{labels}:}{a character vector containing labels of clustered objects used for plotting dendrograms.} \item{\code{sim}:}{similarity matrix; only available if \code{\link{aggExCluster}} was called with similarity function and \code{includeSim=TRUE}.} \item{\code{call}:}{method call used to produce this clustering result} } } \section{Methods}{ \describe{ \item{plot}{\code{signature(x="AggExResult")}: see \code{\link{plot-methods}}} \item{plot}{\code{signature(x="AggExResult", y="matrix")}: see \code{\link{plot-methods}}} \item{heatmap}{\code{signature(x="AggExResult")}: see \code{\link{heatmap-methods}}} \item{heatmap}{\code{signature(x="AggExResult", y="matrix")}: see \code{\link{heatmap-methods}}} \item{show}{\code{signature(object="AggExResult")}: see \code{\link{show-methods}}} \item{cutree}{\code{signature(object="AggExResult", k="ANY", h="ANY")}: see \code{\link{cutree-methods}}} \item{length}{\code{signature(x="AggExResult")}: gives the number of clustering levels in the clustering result.} \item{as.hclust}{\code{signature(x="AggExResult")}: see \code{\link{coerce-methods}}} \item{as.dendrogram}{\code{signature(object="AggExResult")}: see \code{\link{coerce-methods}}} } } \section{Accessors}{ In the following code snippets, \code{x} is an \code{AggExResult} object. \describe{ \item{[[}{\code{signature(x="AggExResult", i="index", j="missing")}: \code{x[[i]]} returns an object of class \code{\linkS4class{ExClust}} corresponding to the clustering level with \code{i} clusters; synonymous to \code{\link{cutree}(x, i)}. } \item{[}{\code{signature(x="AggExResult", i="index", j="missing", drop="missing")}: \code{x[i]} returns a list of \code{\linkS4class{ExClust}} objects with all clustering levels specified in vector \code{i}. So, the list has as many components as the argument \code{i} has elements. A list is returned even if \code{i} is a single level. } \item{similarity}{\code{signature(x="AggExResult")}: gives the similarity matrix. } } } \author{Ulrich Bodenhofer, Johannes Palme, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\link{aggExCluster}}, \code{\link{show-methods}}, \code{\link{plot-methods}}, \code{\link{cutree-methods}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(50, 0.2, 0.05), rnorm(50, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute similarity matrix (negative squared Euclidean) sim <- negDistMat(x, r=2) ## compute agglomerative clustering from scratch aggres1 <- aggExCluster(sim) ## show results show(aggres1) ## plot dendrogram plot(aggres1) ## plot heatmap along with dendrogram heatmap(aggres1, sim) ## plot level with two clusters plot(aggres1, x, k=2) ## run affinity propagation apres <- apcluster(sim, q=0.7) ## create hierarchy of clusters determined by affinity propagation aggres2 <- aggExCluster(sim, apres) ## show results show(aggres2) ## plot dendrogram plot(aggres2) ## plot heatmap heatmap(aggres2, sim) ## plot level with two clusters plot(aggres2, x, k=2) } \keyword{classes} apcluster/man/cutree-methods.Rd0000644000176200001440000000460414612677756016277 0ustar liggesusers\name{cutree-methods} \docType{methods} \alias{cutree} \alias{cutree-methods} \alias{cutree,AggExResult-method} \alias{cutree,APResult-method} \title{Cut Out Clustering Level from Cluster Hierarchy} \description{ Cut out a clustering level from a cluster hierarchy } \usage{ \S4method{cutree}{AggExResult}(tree, k, h) \S4method{cutree}{APResult}(tree, k, h) } \arguments{ \item{tree}{an object of class \code{\linkS4class{AggExResult}} containing a cluster hierarchy; may also be an object of class \code{\linkS4class{APResult}}} \item{k}{the level (i.e. the number of clusters) to be selected} \item{h}{alternatively, the level can be selected by specifying a cut-off for the merging objective} } \details{ The function \code{cutree} extracts a clustering level from a cluster hierarchy stored in an \code{\linkS4class{AggExResult}} object. Which level is selected can be determined by one of the two arguments \code{k} and \code{h} (see above). If both \code{k} and \code{h} are specified, \code{k} overrides \code{h}. This is done largely analogous to the standard function \code{\link[stats:cutree]{cutree}}. The differences are (1) that only one level can be extracted at a time and (2) that an \code{\linkS4class{ExClust}} is returned instead of an index list. The function \code{cutree} may further be used to convert an \code{\linkS4class{APResult}} object into an \code{\linkS4class{ExClust}} object. In this case, the arguments \code{k} and \code{h} are ignored. } \value{ returns an object of class \code{\linkS4class{ExClust}} } \author{Ulrich Bodenhofer and Andreas Kothmeier} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{AggExResult}}, \code{\linkS4class{ExClust}}} \examples{ ## create two simple clusters x <- c(1, 2, 3, 7, 8, 9) names(x) <- c("a", "b", "c", "d", "e", "f") ## compute similarity matrix (negative squared distance) sim <- negDistMat(x, r=2) ## run affinity propagation aggres <- aggExCluster(sim) ## show details of clustering results show(aggres) ## retrieve clustering with 2 clusters cutree(aggres, 2) ## retrieve clustering with cut-off h=-1 cutree(aggres, h=-1) } \keyword{cluster} \keyword{methods} apcluster/man/labels-methods.Rd0000644000176200001440000000501614612700054016222 0ustar liggesusers\name{labels-methods} \docType{methods} \alias{labels} \alias{labels-methods} \alias{labels,APResult-method} \alias{labels,ExClust-method} \title{Generate label vector from clustering result} \description{ Generate a label vector from an clustering result } \usage{ \S4method{labels}{ExClust}(object, type="names") } \arguments{ \item{object}{object of class \code{\linkS4class{APResult}} or \code{\linkS4class{ExClust}}} \item{type}{specifies which kind of label vector should be created, see details below} } \details{ The function \code{labels} creates a label vector from a clustering result. Which kind of labels are produced is controlled by the argument \code{type}: \describe{ \item{\dQuote{names}}{(default) returns the name of the exemplar to which each data sample belongs to; if no names are available, the function stops with an error;} \item{\dQuote{enum}}{returns the index of the cluster to which each data sample belongs to, where clusters are enumerated consecutively from 1 to the number of clusters (analogous to other clustering methods like \code{\link{kmeans}});} \item{\dQuote{exemplars}}{returns the index of the exemplar to which each data sample belongs to, where indices of exemplars are within the original data, which is nothing else but the slot \code{object@idx} with attributes removed.}} } \value{ returns a label vector as long as the number of samples in the original data set } \author{Ulrich Bodenhofer and Andreas Kothmeier} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, \code{\link{cutree}}} \examples{ ## create two simple clusters x <- c(1, 2, 3, 7, 8, 9) names(x) <- c("a", "b", "c", "d", "e", "f") ## compute similarity matrix (negative squared distance) sim <- negDistMat(x, r=2) ## run affinity propagation apres <- apcluster(sim) ## show details of clustering results show(apres) ## label vector (names of exemplars) labels(apres) ## label vector (consecutive index of exemplars) labels(apres, type="enum") ## label vector (index of exemplars within original data set) labels(apres, type="exemplars") ## now with agglomerative clustering aggres <- aggExCluster(sim) ## label (names of exemplars) labels(cutree(aggres, 2)) } \keyword{cluster} \keyword{methods} apcluster/man/show-methods.Rd0000644000176200001440000000536114612700152015742 0ustar liggesusers\name{show-methods} \docType{methods} \alias{show} \alias{show-methods} \alias{show,APResult-method} \alias{show,ExClust-method} \alias{show,AggExResult-method} \title{Display Clustering Result Objects} \description{ Display methods for S4 classes \code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, and \code{\linkS4class{AggExResult}} } \usage{ \S4method{show}{APResult}(object) \S4method{show}{ExClust}(object) \S4method{show}{AggExResult}(object) } \arguments{ \item{object}{an object of class \code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, or \code{\linkS4class{AggExResult}} } } \details{ \code{show} displays the most important information stored in \code{object}. For \code{\linkS4class{APResult}} objects, the number of data samples, the number of clusters, the number of iterations, the input preference, the final objective function values, the vector of exemplars, the list of clusters and for leveraged clustering the selected sample subset are printed. For \code{\linkS4class{ExClust}} objects, the number of data samples, the number of clusters, the vector of exemplars, and list of clusters are printed. For \code{\linkS4class{AggExResult}} objects, only the number of data samples and the maximum number of clusters are printed. For retrieving a particular clustering level, use the function \code{\link{cutree}}. For accessing more detailed information, it is necessary to access the slots of \code{object} directly. Use \code{\link{str}} to get a compact overview of all slots of an object. } \value{ \code{show} returns an invisible \code{NULL} } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, \code{\linkS4class{AggExResult}}, \code{\link{cutree-methods}} } \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute similarity matrix (negative squared Euclidean) sim <- negDistMat(x, r=2) ## run affinity propagation apres <- apcluster(sim) ## show details of clustering results show(apres) ## apply agglomerative clustering to apres aggres <- aggExCluster(sim, apres) ## display overview of result show(aggres) ## show clustering level with two clusters show(cutree(aggres, 2)) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{cluster} \keyword{methods} apcluster/man/heatmap-methods.Rd0000644000176200001440000002227214612700032016376 0ustar liggesusers\name{heatmap} \docType{methods} \alias{heatmap} \alias{heatmap-methods} \alias{heatmap,ExClust,missing-method} \alias{heatmap,ExClust,matrix-method} \alias{heatmap,ExClust,Matrix-method} \alias{heatmap,ExClust,sparseMatrix-method} \alias{heatmap,AggExResult,missing-method} \alias{heatmap,AggExResult,matrix-method} \alias{heatmap,missing,matrix-method} \alias{heatmap,matrix,missing-method} \title{Plot Heatmap} \description{ Functions for Plotting of Heatmap } \usage{ \S4method{heatmap}{ExClust,missing}(x, y, ...) \S4method{heatmap}{ExClust,matrix}(x, y, ...) \S4method{heatmap}{ExClust,Matrix}(x, y, ...) \S4method{heatmap}{ExClust,sparseMatrix}(x, y, ...) \S4method{heatmap}{AggExResult,missing}(x, y, ...) \S4method{heatmap}{AggExResult,matrix}(x, y, Rowv=TRUE, Colv=TRUE, sideColors=NULL, col=heat.colors(12), base=0.05, add.expr, margins=c(5, 5, 2), cexRow=max(min(35 / nrow(y), 1), 0.1), cexCol=max(min(35 / ncol(y), 1), 0.1), main=NULL, dendScale=1, barScale=1, legend=c("none", "col"), ...) \S4method{heatmap}{matrix,missing}(x, y, ...) \S4method{heatmap}{missing,matrix}(x, y, ...) } \arguments{ \item{x}{a clustering result object of class \code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, or \code{\linkS4class{AggExResult}}; for compatibility, \code{x} may also be a similarity matrix (see details below).} \item{y}{a similarity matrix} \item{sideColors}{character vector of colors to be used for plotting color bars that visualize clusters of the finest clustering level in \code{x}. This is done in a fashion similar to using \code{RowSideColors} or \code{ColSideColors} in the standard \code{\link[stats:heatmap]{heatmap}} function. However, color bars are plotted either on both sides or not at all. The \code{sideColors} argument determines the coloring of both horizontal and vertical bars. If \code{sideColors} is shorter than the number of clusters in the finest clustering level, \code{sideColors} is recycled. In any case, a minimum number of two colors (two elements of sideColors) is required. If \code{NA}, no color bars are plotted. If \code{NULL} (default), color bars are only plotted if the finest cluster level does not only consist of single samples. In this case, the \code{\link{rainbow}} function is used to compute the vector of colors which is shuffled such that dissimilar colors are placed next to each other in the color bar.} \item{col}{color ramp used for the heatmap image; see \code{\link[graphics:image]{image}}} \item{Rowv}{determines whether or not a row dendrogram should be plotted. If \code{FALSE} or \code{NA}, no row dendrogram is plotted. In any other case, a row dendrogram is plotted unless the number of clusters in the finest clustering level is less than 2. Note that, in the latter case, the actual values in \code{Rowv} are ignored, so this argument cannot be used to supply a previously computed dendrogram or re-ordering of elements as in the standard \code{\link[stats:heatmap]{heatmap}} function.} \item{Colv}{determines whether or not a column dendrogram should be plotted. Fully analogous to \code{Rowv}, except that column dendrograms are never plotted if the similarity matrix \code{y} is non-quadratic.} \item{base}{fraction of height used for the very first join in dendrograms; see \code{\link[apcluster:coerce-methods]{coerce-methods}}.} \item{add.expr,margins,cexRow,cexCol,main}{largely analogous to the standard \code{\link[stats:heatmap]{heatmap}} function; to omit row/column labeling, set \code{cexRow}/\code{cexCol} to \code{0}. The default for \code{margins} is a vector of length 3, where the third element is the right-hand side margin for the color legend (see \code{legend} argument). It remains unused (and can also be omitted) if no color legend is plotted.} \item{dendScale}{factor scaling the width of vertical and height of horizontal dendrograms; values have to be larger than 0 and no larger than 2. The default is 1 which corresponds to the same size as the dendrograms plot by the standard \code{\link[stats:heatmap]{heatmap}} function} \item{barScale}{factor scaling the width of color bars; values have to be larger than 0 and no larger than 4. The default is 1 which corresponds to half the width of the color bars plot by the standard \code{\link[stats:heatmap]{heatmap}} function} \item{legend}{if \code{"col"}, then a color legend similar to \code{\link[graphics:filled.contour]{filled.contour}} is added on the right-hand side of the heatmap plot; if \code{"none"} (default), no such legend is added.} \item{...}{see details below} } \details{ The \code{heatmap} functions provide plotting of heatmaps from several different types of input object. The implementation is similar to the standard graphics function \code{\link[stats:heatmap]{heatmap}}. Plotting heatmaps via the \code{\link{plot}} command as available in previous versions of this package is still available for backward compatibility. If \code{heatmap} is called for objects of classes \code{\linkS4class{APResult}} or \code{\linkS4class{ExClust}}, a heatmap of the similarity matrix in slot \code{sim} of the parameter \code{x} is created with clusters grouped together and highlighted in different colors. The order of clusters is determined by running \code{\link{aggExCluster}} on the clustering result \code{x}. This variant of \code{heatmap} returns an invisible \code{\linkS4class{AggExResult}} object. If \code{heatmap} is called for an \code{\linkS4class{AggExResult}} object that contains all levels of clustering, the heatmap is displayed with the corresponding clustering dendrogram. If the \code{\linkS4class{AggExResult}} object is the result of running \code{\link{aggExCluster}} on a prior clustering result, the same heatmap plot is produced as if \code{heatmap} had been called on this prior clustering result, however, returning the cluster hierarchy's \code{\link{dendrogram}}. In the latter case, color bars are plotted to visualize the prior clustering result (see description of argument \code{sideColors} above). All variants described above only work if the input object \code{x} contains a slot \code{sim} with the similarity matrix (which is only the case if the preceding clustering method has been called with \code{includeSim=TRUE}). In case the slot \code{sim} of \code{x} does not contain the similarity matrix, the similarity matrix must be supplied as second argument \code{y}. All variants described above internally use \code{heatmap} with signature \code{AggExResult,matrix}, so all arguments list above can be used for all variants, as they are passed through using the \code{...} argument. All other arguments, analogously to the standard \code{\link[stats:heatmap]{heatmap}} function, are passed on to the standard function \code{\link[graphics:image]{image}}. This is particularly useful for using alternative color schemes via the \code{col} argument. The two variants with one of the two arguments being a matrix and one being missing are just wrappers around the standard \code{\link[stats:heatmap]{heatmap}} function with the aim to provide compatibility with this standard case. } \note{Similarity matrices can be supplied in dense or sparse format. Note, however, that sparse matrices are converted to full dense matrices before plotting heatmaps which may lead to memory and/or performance bottlenecks for larger data sets.} \value{ see details above } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}.} \seealso{\code{\linkS4class{APResult}}, \code{\linkS4class{AggExResult}}, \code{\linkS4class{ExClust}}, \code{\link{apcluster}}, \code{\link{apclusterL}}, \code{\link{aggExCluster}}, \code{\link{cutree-methods}}, \code{\link{plot-methods}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(50, 0.2, 0.05), rnorm(50, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## run affinity propagation using negative squared Euclidean apres <- apcluster(negDistMat(r=2), x, p=-0.1) ## plot heatmap clustering run heatmap(apres) ## rerun affinity propagation ## reuse similarity matrix from previous run apres2 <- apcluster(s=apres@sim, q=0.6) ## plot heatmap of second run heatmap(apres2, apres@sim) ## with alternate heatmap coloring, alternating color bars, and no dendrograms heatmap(apres2, apres@sim, Rowv=NA, Colv=NA, sideColors=c("darkgreen", "yellowgreen"), col=terrain.colors(12)) ## perform agglomerative clustering of affinity propagation clusters aggres1 <- aggExCluster(apres@sim, apres2) ## plot heatmap heatmap(cutree(aggres1, 2), apres@sim) ## perform agglomerative clustering of whole data set aggres2 <- aggExCluster(negDistMat(r=2), x) ## show heatmap along with dendrogram heatmap(aggres2) } \keyword{cluster} \keyword{methods} apcluster/man/plot-methods.Rd0000644000176200001440000002110114612700102015721 0ustar liggesusers\name{plot} \docType{methods} \alias{plot} \alias{plot-methods} \alias{plot,APResult,missing-method} \alias{plot,ExClust,missing-method} \alias{plot,ExClust,matrix-method} \alias{plot,ExClust,data.frame-method} \alias{plot,AggExResult,missing-method} \alias{plot,AggExResult,matrix-method} \alias{plot,AggExResult,data.frame-method} \title{Plot Clustering Results} \description{ Functions for Visualizing Clustering Results } \usage{ \S4method{plot}{APResult,missing}(x, y, type=c("netsim", "dpsim", "expref"), xlab="# Iterations", ylab="Similarity", ...) \S4method{plot}{ExClust,matrix}(x, y, connect=TRUE, xlab="", ylab="", labels=NA, limitNo=15, ...) \S4method{plot}{ExClust,data.frame}(x, y, connect=TRUE, xlab="", ylab="", labels=NA, limitNo=15, ...) \S4method{plot}{AggExResult,missing}(x, y, main="Cluster dendrogram", xlab="", ylab="", ticks=4, digits=2, base=0.05, showSamples=FALSE, horiz=FALSE, ...) \S4method{plot}{AggExResult,matrix}(x, y, k=NA, h=NA, ...) \S4method{plot}{AggExResult,data.frame}(x, y, k=NA, h=NA, ...) } \arguments{ \item{x}{a clustering result object of class \code{\linkS4class{APResult}}, \code{\linkS4class{ExClust}}, or \code{\linkS4class{AggExResult}}} \item{y}{a matrix or data frame (see details below)} \item{type}{a string or array of strings indicating which performance measures should be plotted; valid values are \code{"netsim"}, \code{"dpsim"}, and \code{"expref"} which can be used in any combination or order; all other strings are ignored (for the meaning see \code{\linkS4class{APResult}})} \item{xlab, ylab}{labels for axes of 2D plots; ignored if \code{y} has more than two columns} \item{labels}{names used for variables in scatter plot matrix (displayed if \code{y} has more than two columns). If \code{NA} (default), column names are used. If no column names are available, labels such as \code{x[, 2]} are displayed.} \item{limitNo}{if the number of columns/features in \code{y} is too large, problems may occur when attempting to plot a scatter plot matrix. To avoid problems, the \code{plot} method throws an error if the number of columns exceeds \code{limitNo}. For special applications, users can increase the value (15 by default). If \code{limitNo} is set to \code{NA} or any other non-numeric value, the limit is ignored entirely. Please note that attempting to plot scatter plot matrices with too many features may corrupt the graphics device. So users are making changes at their own risk. If plotting of many features is necessary, make sure that the graphics device is large enough to accommodate the plot (e.g. by using a sufficiently large graphics file device).} \item{connect}{used only if clustering is plotted on original data, ignored otherwise. If \code{connect} is \code{TRUE}, lines are drawn connecting exemplars with their cluster members.} \item{main}{title of plot} \item{ticks}{number of ticks used for the axis on the left side of the plot (applies to dendrogram plots only, see below)} \item{digits}{number of digits used for the axis tickmarks on the left side of the plot (applies to dendrogram plots only, see below)} \item{base}{fraction of height used for the very first join; defaults to 0.05, i.e. the first join appears at 5\% of the total height of the dendrogram.} \item{showSamples}{if \code{TRUE}, a complete cluster hierarchy is shown, otherwise, in case that \code{x} is a hierarchy of clusters, the dendrogram of clusters is shown. For backward compatibility, the default is \code{FALSE}.} \item{horiz}{if \code{TRUE}, the dendrogram is plotted horizontally (analogous to \code{\link[stats:plot.dendrogram]{plot.dendrogram}}). The default is \code{FALSE}.} \item{k}{level to be selected when plotting a single clustering level of cluster hierarchy (i.e. the number of clusters; see \code{\link{cutree-methods}})} \item{h}{cut-off to be used when plotting a single clustering level of cluster hierarchy (see \code{\link{cutree-methods}})} \item{...}{all other arguments are passed to the plotting command that are used internally, \code{\link[graphics:plot]{plot}} or \code{\link[stats:heatmap]{heatmap}}.} } \details{ If \code{plot} is called for an \code{\linkS4class{APResult}} object without specifying the second argument \code{y}, a plot is created that displays graphs of performance measures over execution time of the affinity propagation run. This only works if \code{\link{apcluster}} was called with \code{details=TRUE}. If \code{plot} is called for an \code{\linkS4class{APResult}} object along with a matrix or data frame as argument \code{y}, then the dimensions of the matrix determine the behavior of \code{plot}: \enumerate{ \item{If the matrix \code{y} has two columns, \code{y} is interpreted as the original data set. Then a plot of the clustering result superimposed on the original data set is created. Each cluster is displayed in a different color. The exemplar of each cluster is highlighted by a black square. If \code{connect} is \code{TRUE}, lines connecting the cluster members to their exemplars are drawn. This variant of \code{plot} does not return any value.} \item{If \code{y} has more than two columns, clustering results are superimposed in a sort of scatter plot matrix. The variant that \code{y} is interpreted as similarity matrix if it is quadratic has been removed in version 1.3.2. Use \code{\link{heatmap}} instead.} \item{If \code{y} has only one column, an error is displayed.} } If \code{plot} is called for an \code{\linkS4class{ExClust}} object along with a matrix or data frame as argument \code{y}, then \code{plot} behaves exactly the same as described in the previous paragraph. If \code{plot} is called for an \code{\linkS4class{AggExResult}} object without specifying the second argument \code{y}, then a dendrogram plot is drawn. This variant returns an invisible \code{\link{dendrogram}} object. The \code{showSamples} argument determines whether a complete dendrogram or a dendrogram of clusters is plotted (see above). If the option \code{horiz=TRUE} is used, the dendrogram is rotated. Note that, in this case, the margin to the right of the plot may not be wide enough to accommodate long cluster/sample labels. In such a case, the figure margins have to be widened before \code{plot} is called. If \code{plot} is called for an \code{\linkS4class{AggExResult}} object along with a matrix or data frame \code{y}, \code{y} is again interpreted as original data set. If one of the two arguments \code{k} or \code{h} is present, a clustering is cut out from the cluster hierarchy using \code{\link{cutree}} and this clustering is displayed with the original data set as described above. This variant of \code{plot} returns an invisible \code{\linkS4class{ExClust}} object containing the extracted clustering. } \value{ see details above } \author{Ulrich Bodenhofer, Andreas Kothmeier, and Johannes Palme} \references{\url{https://github.com/UBod/apcluster} Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}.} \seealso{\code{\linkS4class{APResult}}, \code{\linkS4class{AggExResult}}, \code{\linkS4class{ExClust}}, \code{\link{heatmap-methods}}, \code{\link{apcluster}}, \code{\link{apclusterL}}, \code{\link{aggExCluster}}, \code{\link{cutree-methods}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(50, 0.2, 0.05), rnorm(50, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## run affinity propagation apres <- apcluster(negDistMat(r=2), x, q=0.7, details=TRUE) ## plot information about clustering run plot(apres) ## plot clustering result plot(apres, x) ## perform agglomerative clustering of affinity propagation clusters aggres1 <- aggExCluster(x=apres) ## show dendrograms plot(aggres1) plot(aggres1, showSamples=TRUE) ## show clustering result for 4 clusters plot(aggres1, x, k=4) ## perform agglomerative clustering of whole data set aggres2 <- aggExCluster(negDistMat(r=2), x) ## show dendrogram plot(aggres2) ## show heatmap along with dendrogram heatmap(aggres2) ## show clustering result for 2 clusters plot(aggres2, x, k=2) ## cluster iris data set data(iris) apIris <- apcluster(negDistMat(r=2), iris, q=0) plot(apIris, iris) } \keyword{cluster} \keyword{methods} apcluster/man/preferenceRange-methods.Rd0000644000176200001440000000563114612700124020054 0ustar liggesusers\name{preferenceRange} \alias{preferenceRange} \alias{preferenceRange-methods} \alias{preferenceRange,matrix-method} \alias{preferenceRange,Matrix-method} \alias{preferenceRange,dgTMatrix-method} \alias{preferenceRange,sparseMatrix-method} \title{Determine Meaningful Ranges for Input Preferences} \description{ Determines meaningful ranges for affinity propagation input preference } \usage{ \S4method{preferenceRange}{matrix}(s, exact=FALSE) \S4method{preferenceRange}{Matrix}(s, exact=FALSE) \S4method{preferenceRange}{dgTMatrix}(s, exact=FALSE) \S4method{preferenceRange}{sparseMatrix}(s, exact=FALSE) } \arguments{ \item{s}{an \eqn{l\times l}{lxl} similarity matrix in sparse or dense format} \item{exact}{flag indicating whether exact ranges should be computed, which is relatively slow; if bounds are sufficient, supply \code{FALSE} (default)} } \details{Affinity Propagation clustering relies on an appropriate choice of input preferences. This function helps in finding a good choice by determining meaningful lower and upper bounds. If the similarity matrix \code{s} is sparse or if it contains \code{-Inf} similarities, only the similarities are taken into account that are specified in \code{s} and larger than \code{-Inf}. In such cases, the lower bound returned by \code{preferenceRange} need not correspond to one or two clusters. Moreover, it may also happen in degenerate cases that the lower bound exceeds the upper bound. In such a case, no warning or error is issued, so it is the user's responsibility to ensure a proper interpretation of the results. The method \code{\link{apclusterK}} makes use of this function internally and checks the plausibility of the result returned by \code{preferenceRange}. } \value{ returns a vector with two entries, the first of which is the minimal input preference (which would lead to 1 or 2 clusters) and the second of which is the maximal input prefence (which would lead to as many clusters as data samples). } \author{Ulrich Bodenhofer and Andreas Kothmeier} \references{\url{https://github.com/UBod/apcluster} Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \seealso{\code{\link{apcluster}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## create similarity matrix sim <- negDistMat(x, r=2) ## determine bounds preferenceRange(sim) ## determine exact range preferenceRange(sim, exact=TRUE) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{cluster} apcluster/man/APResult-class.Rd0000644000176200001440000001340114612677637016142 0ustar liggesusers\name{APResult-class} \docType{class} \alias{APResult-class} \alias{APResult} \alias{apresult} \alias{similarity} \alias{[,APResult,index,missing,missing-method} \alias{[[,APResult,index,missing-method} \alias{length,APResult-method} \alias{similarity,APResult-method} \title{Class "APResult"} \description{S4 class for storing results of affinity propagation clustering. It extends the class \code{\linkS4class{ExClust}}.} \section{Objects}{ Objects of this class can be created by calling \code{\link{apcluster}} or \code{\link{apclusterL}} for a given similarity matrix or calling one of these procedures with a data set and a similarity measure. } \section{Slots}{ The following slots are defined for \link{APResult} objects. Most names are taken from Frey's and Dueck's original Matlab package: \describe{ \item{\code{sweeps}:}{number of times leveraged clustering ran with different subsets of samples} \item{\code{it}:}{number of iterations the algorithm ran} \item{\code{p}:}{input preference (either set by user or computed by \code{\link{apcluster}} or \code{\link{apclusterL}})} \item{\code{netsim}:}{final total net similarity, defined as the sum of \code{expref} and \code{dpsim} (see below)} \item{\code{dpsim}:}{final sum of similarities of data points to exemplars} \item{\code{expref}:}{final sum of preferences of the identified exemplars} \item{\code{netsimLev}:}{total net similarity of the individual sweeps for leveraged clustering; only available for leveraged clustering} \item{\code{netsimAll}:}{vector containing the total net similarity for each iteration; only available if \code{\link{apcluster}} was called with \code{details=TRUE}} \item{\code{exprefAll}:}{vector containing the sum of preferences of the identified exemplars for each iteration; only available if \code{\link{apcluster}} was called with \code{details=TRUE}} \item{\code{dpsimAll}:}{vector containing the sum of similarities of data points to exemplars for each iteration; only available if \code{\link{apcluster}} was called with \code{details=TRUE}} \item{\code{idxAll}:}{matrix with sample-to-exemplar indices for each iteration; only available if \code{\link{apcluster}} was called with \code{details=TRUE}} } } \section{Extends}{ Class \code{"ExClust"}, directly. } \section{Methods}{ \describe{ \item{plot}{\code{signature(x="APResult")}: see \code{\link{plot-methods}}} \item{plot}{\code{signature(x="ExClust", y="matrix")}: see \code{\link{plot-methods}}} \item{heatmap}{\code{signature(x="ExClust")}: see \code{\link{heatmap-methods}}} \item{heatmap}{\code{signature(x="ExClust", y="matrix")}: see \code{\link{heatmap-methods}}} \item{show}{\code{signature(object="APResult")}: see \code{\link{show-methods}}} \item{labels}{\code{signature(object="APResult")}: see \code{\link{labels-methods}}} \item{cutree}{\code{signature(object="APResult")}: see \code{\link{cutree-methods}}} \item{length}{\code{signature(x="APResult")}: gives the number of clusters.} \item{sort}{\code{signature(x="ExClust")}: see \code{\link{sort-methods}}} \item{as.hclust}{\code{signature(x="ExClust")}: see \code{\link{coerce-methods}}} \item{as.dendrogram}{\code{signature(object="ExClust")}: see \code{\link{coerce-methods}}} } } \section{Accessors}{ In the following code snippets, \code{x} is an \code{APResult} object. \describe{ \item{[[}{\code{signature(x="APResult", i="index", j="missing")}: \code{x[[i]]} returns the i-th cluster as a list of indices of samples belonging to the i-th cluster. } \item{[}{\code{signature(x="APResult", i="index", j="missing", drop="missing")}: \code{x[i]} returns a list of integer vectors with the indices of samples belonging to this cluster. The list has as many components as the argument \code{i} has elements. A list is returned even if \code{i} is a single integer. } \item{similarity}{\code{signature(x="APResult")}: gives the similarity matrix. } } } \author{Ulrich Bodenhofer, Andreas Kothmeier, Johannes Palme} \references{\url{https://github.com/UBod/apcluster} APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. } \seealso{\code{\link{apcluster}}, \code{\link{apclusterL}}, \code{\link{show-methods}}, \code{\link{plot-methods}}, \code{\link{labels-methods}}, \code{\link{cutree-methods}}} \examples{ ## create two Gaussian clouds cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06)) cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05)) x <- rbind(cl1, cl2) ## compute similarity matrix (negative squared Euclidean) sim <- negDistMat(x, r=2) ## run affinity propagation apres <- apcluster(sim, details=TRUE) ## show details of clustering results show(apres) ## plot information about clustering run plot(apres) ## plot clustering result plot(apres, x) ## plot heatmap heatmap(apres, sim) } \keyword{classes} apcluster/man/conversions.Rd0000644000176200001440000001054314612677727015714 0ustar liggesusers\name{conversions} \alias{conversions} \alias{as.SparseSimilarityMatrix} \alias{as.DenseSimilarityMatrix} \alias{as.SparseSimilarityMatrix-methods} \alias{as.DenseSimilarityMatrix-method} \alias{as.SparseSimilarityMatrix,matrix-method} \alias{as.DenseSimilarityMatrix,matrix-method} \alias{as.SparseSimilarityMatrix,sparseMatrix-method} \alias{as.DenseSimilarityMatrix,sparseMatrix-method} \alias{as.SparseSimilarityMatrix,Matrix-method} \alias{as.DenseSimilarityMatrix,Matrix-method} \title{Conversions Between Dense and Sparse Similarity Matrices} \description{ Converts a dense similarity matrix into a sparse one or vice versa } \usage{ \S4method{as.SparseSimilarityMatrix}{matrix}(s, lower=-Inf) \S4method{as.SparseSimilarityMatrix}{Matrix}(s, lower=-Inf) \S4method{as.SparseSimilarityMatrix}{sparseMatrix}(s, lower=-Inf) \S4method{as.DenseSimilarityMatrix}{matrix}(s, fill=-Inf) \S4method{as.DenseSimilarityMatrix}{Matrix}(s, fill=-Inf) \S4method{as.DenseSimilarityMatrix}{sparseMatrix}(s, fill=-Inf) } \arguments{ \item{s}{a similarity matrix in sparse or dense format (see details below)} \item{lower}{cut-off threshold to apply when converting similarity matrices into sparse format. All similarities lower than or equal to \code{lower} will be omitted from the result. The default is \code{-Inf}), i.e. only \code{-Inf} values are removed.} \item{fill}{value to fill in for entries that are missing from sparse similarity matrix 's' (defaults to \code{-Inf}).} } \details{ The function \code{as.SparseSimilarityMatrix} takes a matrix argument, removes all diagonal elements and all values that are lower than or equal to the cut-off threshold \code{lower} and returns a sparse matrix of class \code{\linkS4class{dgTMatrix}}. If the function \code{as.DenseSimilarityMatrix} is called for a sparse matrix (class \code{\linkS4class{sparseMatrix}} or any class derived from this class), a dense matrix is returned, where all values that were missing in the sparse matrix are replaced with \code{fill}. \code{as.DenseSimilarityMatrix} can also be called for dense \code{\link{matrix}} and \code{\linkS4class{Matrix}} objects. In this case, \code{as.DenseSimilarityMatrix} assumes that the matrices have three columns that encode for a sparse matrix in the same way as the Matlab implementation of Frey's and Dueck's sparse affinity propagation accepts it: the first column contains 1-based row indices, the second column contains 1-based column indices, and the third column contains the similarity values. The same format is also accepted by \code{as.SparseSimilarityMatrix} to convert a sparse similarity matrix of this format into a \code{\linkS4class{dgTMatrix}} object. Note that, for matrices of this format, \code{as.DenseSimilarityMatrix} replaces the deprectated function \code{sparseToFull} that was used in older versions of the package. Note that \code{as.SparseSimilarityMatrix} and \code{as.DenseSimilarityMatrix} are no S4 coercion methods. There are no classes named \code{SparseSimilarityMatrix} or \code{DenseSimilarityMatrix}. } \value{returns a square similarity matrix in sparse format (class \code{\linkS4class{dgTMatrix}} or in dense format (standard class \code{\link{matrix}}).} \author{Ulrich Bodenhofer} \references{\url{https://github.com/UBod/apcluster} Frey, B. J. and Dueck, D. (2007) Clustering by passing messages between data points. \emph{Science} \bold{315}, 972-976. DOI: \doi{10.1126/science.1136800}. Bodenhofer, U., Kothmeier, A., and Hochreiter, S. (2011) APCluster: an R package for affinity propagation clustering. \emph{Bioinformatics} \bold{27}, 2463-2464. DOI: \doi{10.1093/bioinformatics/btr406}. } \examples{ ## create similarity matrix in sparse format according to Frey and Dueck sp <- matrix(c(1, 2, 0.5, 3, 1, 0.2, 5, 4, -0.2, 3, 4, 1.2), 4, 3, byrow=TRUE) sp ## perform conversions as.DenseSimilarityMatrix(sp, fill=0) as.SparseSimilarityMatrix(sp) ## create dense similarity matrix cl1 <- cbind(rnorm(20, 0.2, 0.05), rnorm(20, 0.8, 0.06)) cl2 <- cbind(rnorm(20, 0.7, 0.08), rnorm(20, 0.3, 0.05)) x <- rbind(cl1, cl2) sim <- negDistMat(x, r=2) ssim <- as.SparseSimilarityMatrix(sim, lower=-0.2) ## run apcluster() on the sparse similarity matrix apres <- apcluster(ssim, q=0) apres } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{cluster} apcluster/TODO0000644000176200001440000000025214170223535012745 0ustar liggesusers- adapt aggExCluster() to sparse matrices - shift refinement of exemplars to C++ side (for dense similarity matrices) - predict() function - include similarity-based VAT apcluster/DESCRIPTION0000644000176200001440000000304614612715762014000 0ustar liggesusersPackage: apcluster Type: Package Title: Affinity Propagation Clustering Version: 1.4.13 Date: 2024-04-26 Depends: R (>= 3.3.0) Imports: Rcpp (>= 0.11.1), methods, Matrix, stats, graphics, grDevices Suggests: knitr Author: Ulrich Bodenhofer [aut, cre], Johannes Palme [ctb], Chrats Melkonian [ctb], Andreas Kothmeier [aut], Nikola Kostic [ctb] Maintainer: Ulrich Bodenhofer Description: Implements Affinity Propagation clustering introduced by Frey and Dueck (2007) . The algorithms are largely analogous to the 'Matlab' code published by Frey and Dueck. The package further provides leveraged affinity propagation and an algorithm for exemplar-based agglomerative clustering that can also be used to join clusters obtained from affinity propagation. Various plotting functions are available for analyzing clustering results. License: GPL (>= 2) Collate: AllClasses.R AllGenerics.R access-methods.R coerce-methods.R show-methods.R labels-methods.R length-methods.R revDend.R heatmap-methods.R plot-methods.R cutree-methods.R sort-methods.R aggExCluster-methods.R apcluster-methods.R apclusterL-methods.R apclusterK-methods.R apclusterDemo.R preferenceRange-methods.R similarity.R simpleDist.R conversions.R URL: https://github.com/UBod/apcluster VignetteBuilder: knitr LinkingTo: Rcpp LazyLoad: yes Repository: CRAN NeedsCompilation: yes Packaged: 2024-04-26 10:24:50 UTC; ulrich Date/Publication: 2024-04-26 12:20:02 UTC apcluster/build/0000755000176200001440000000000014612700362013354 5ustar liggesusersapcluster/build/vignette.rds0000644000176200001440000000040514612700362015712 0ustar liggesusersuQj0 vw}?A+^z a]Ebfml۞|$AO> c9tCnFJ0Ζt%Ya|QOP֋Rh[5F7wep %|(%ltpLwnq'Sg"^:i;f=?EQ^[GSlQ]=Ia"O޶ٸú/r7:e!^tUB<apcluster/build/partial.rdb0000644000176200001440000000007414612700313015476 0ustar liggesusersb```b`a 00 FN ͚Z d@$$7apcluster/src/0000755000176200001440000000000014612700362013044 5ustar liggesusersapcluster/src/R_init_apcluster.cpp0000644000176200001440000000164014170223535017060 0ustar liggesusers#include "apclusterCppHeaders.h" extern "C" { #include "distanceL.h" #include "aggExClusterC.h" } #include #include #include static const R_CallMethodDef callMethods[] = { {"aggExClusterC", (DL_FUNC) &aggExClusterC, 13}, {"apclusterC", (DL_FUNC) &apclusterC, 5}, {"apclusterLeveragedC", (DL_FUNC) &apclusterLeveragedC, 5}, {"apclusterSparseC", (DL_FUNC) &apclusterSparseC, 8}, {"preferenceRangeC", (DL_FUNC) &preferenceRangeC, 2}, {"preferenceRangeSparseC", (DL_FUNC) &preferenceRangeSparseC, 5}, {"CdistR", (DL_FUNC) &CdistR, 4}, {NULL, NULL, 0} }; extern "C" { void attribute_visible R_init_apcluster(DllInfo *info) { /* Register routines, allocate resources. */ R_registerRoutines(info, NULL, callMethods, NULL, NULL); R_useDynamicSymbols(info, FALSE); } void R_unload_apcluster(DllInfo *info) { /* Release resources. */ } } apcluster/src/preferenceRangeC.cpp0000644000176200001440000000376114170223535016756 0ustar liggesusers#include #include #include #include "apclusterCppHeaders.h" using namespace Rcpp; RcppExport SEXP preferenceRangeC(SEXP sR, SEXP exactR) { NumericMatrix s(sR); bool exact = as(exactR); int N = s.nrow(); double dpsim1 = R_NegInf, pmin = R_NegInf, pmax = R_NegInf; NumericVector colS(N); for (int j = 0; j < N; j++) { double sumOfCol = R_NegInf; for (int i = 0; i < N; i++) { if (s(i, j) > R_NegInf) { if (sumOfCol == R_NegInf) sumOfCol = s(i, j); else sumOfCol += s(i, j); if (s(i, j) > pmax && i != j) pmax = s(i, j); } } if (sumOfCol > dpsim1) dpsim1 = sumOfCol; } if (dpsim1 == R_NegInf) pmin = R_NaN; else if (exact) { double dpsim2 = R_NegInf; for (int j21 = 0; j21 < N - 1; j21++) { for (int j22 = j21 + 1; j22 < N; j22++) { double tmpSum = R_NegInf; for (int k = 0; k < N; k++) { double maxi = R_NegInf; if (s(k, j21) > s(k, j22)) maxi = s(k, j21); else if (s(k, j22) > R_NegInf) maxi = s(k, j22); if (maxi > R_NegInf) { if (tmpSum == R_NegInf) tmpSum = maxi; else tmpSum += maxi; } } if (tmpSum > dpsim2) dpsim2 = tmpSum; } } pmin = dpsim1 - dpsim2; } else { double sumM = R_NegInf, sm1 = R_PosInf, sm2 = R_PosInf; for (int i = 0; i < N; i++) { colS[i] = R_NegInf; for (int j = 0; j < i; j++) if (s(i, j) > colS[i]) colS[i] = s(i, j); for (int j = i + 1; j < N; j++) if (s(i, j) > colS[i]) colS[i] = s(i, j); if (colS[i] > R_NegInf) { if (sumM == R_NegInf) sumM = colS[i]; else sumM += colS[i]; if (colS[i] < sm1) { sm2 = sm1; sm1 = colS[i]; } else if (colS[i] < sm2) sm2 = colS[i]; } } if (sm2 == R_PosInf || sumM == R_NegInf) pmin = R_NegInf; else pmin = dpsim1 - sumM + sm1 + sm2; } return NumericVector::create(pmin, pmax); } apcluster/src/apclusterC.cpp0000644000176200001440000001300214170223535015652 0ustar liggesusers#include #include #include #include "apclusterCppHeaders.h" using namespace Rcpp; RcppExport SEXP apclusterC(SEXP sR, SEXP maxitsR, SEXP convitsR, SEXP lamR, SEXP detailsR) { NumericMatrix s(sR); int maxits = as(maxitsR); int convits = as(convitsR); double lam = as(lamR); bool details = as(detailsR); int N = s.nrow(); IntegerMatrix e(N, convits); IntegerVector E(N); IntegerVector I(N); IntegerVector se(N); NumericMatrix A(N, N); NumericMatrix R(N, N); NumericVector tmpidx(N); NumericVector netsimAll; NumericVector dpsimAll; NumericVector exprefAll; NumericMatrix idxAll; if (details) { netsimAll = NumericVector(maxits); dpsimAll = NumericVector(maxits); exprefAll = NumericVector(maxits); idxAll = NumericMatrix(N, maxits); } bool dn = false, unconverged = false; int i = 0, j, ii, K; while (!dn) { // first, compute responsibilities for (ii = 0; ii < N; ii++) { double max1 = -DBL_MAX, max2 = -DBL_MAX, avsim; int yMax; for (j = 0; j < N; j++) // determine second-largest element of AS { avsim = A(ii, j) + s(ii, j); if (avsim > max1) { max2 = max1; max1 = avsim; yMax = j; } else if (avsim > max2) max2 = avsim; } for (j = 0; j < N; j++) // perform update { double oldVal = R(ii, j); double newVal = (1 - lam) * (s(ii, j) - (j == yMax ? max2 : max1)) + lam * oldVal; R(ii, j) = (newVal > DBL_MAX ? DBL_MAX : newVal); } } // secondly, compute availabilities for (ii = 0; ii < N; ii++) { NumericVector Rp(N); double auxsum = 0; for (j = 0; j < N; j++) { if (R(j, ii) < 0 && j != ii) Rp[j] = 0; else Rp[j] = R(j, ii); auxsum += Rp[j]; } for (j = 0; j < N; j++) { double oldVal = A(j, ii); double newVal = auxsum - Rp[j]; if (newVal > 0 && j != ii) newVal = 0; A(j, ii) = (1 - lam) * newVal + lam * oldVal; } } // determine clusters and check for convergence unconverged = false; K = 0; for (ii = 0; ii < N; ii++) { int ex = (A(ii, ii) + R(ii, ii) > 0 ? 1 : 0); se[ii] = se[ii] - e(ii, i % convits) + ex; if (se[ii] > 0 && se[ii] < convits) unconverged = true; E[ii] = ex; e(ii, i % convits) = ex; K += ex; } if (i >= (convits - 1) || i >= (maxits - 1)) dn = ((!unconverged && K > 0) || (i >= (maxits - 1))); if (K == 0) { if (details) { netsimAll[i] = R_NaN; dpsimAll[i] = R_NaN; exprefAll[i] = R_NaN; for (ii = 0; ii < N; ii++) idxAll(ii, i) = R_NaN; } } else { int cluster = 0; for (ii = 0; ii < N; ii++) { if (E[ii]) { I[cluster] = ii; cluster++; } } for (ii = 0; ii < N; ii++) { if (E[ii]) tmpidx[ii] = (double)ii; else { double maxSim = s(ii, I[0]); tmpidx[ii] = (double)I[0]; for (j = 1; j < K; j++) { if (s(ii, I[j]) > maxSim) { maxSim = s(ii, I[j]); tmpidx[ii] = (double)I[j]; } } } } if (details) { double sumPref = 0; for (j = 0; j < K; j++) sumPref += s(I[j], I[j]); double sumSim = 0; for (ii = 0; ii < N; ii++) { if (!E[ii]) sumSim += s(ii, (int)tmpidx[ii]); } netsimAll[i] = sumSim + sumPref; dpsimAll[i] = sumSim; exprefAll[i] = sumPref; NumericMatrix::Column idxLocal = idxAll(_, i); idxLocal = tmpidx; } } i++; } List ret; ret["I"] = I; ret["K"] = K; ret["it"] = IntegerVector::create(i - 1); ret["unconv"] = LogicalVector::create(unconverged); if (details) { ret["netsimAll"] = netsimAll; ret["dpsimAll"] = dpsimAll; ret["exprefAll"] = exprefAll; ret["idxAll"] = idxAll; } return(ret); } apcluster/src/preferenceRangeSparseC.cpp0000644000176200001440000000737314170223535020137 0ustar liggesusers#include #include #include #include "apclusterCppHeaders.h" using namespace Rcpp; RcppExport SEXP preferenceRangeSparseC(SEXP iR, SEXP jR, SEXP valuesR, SEXP nR, SEXP exactR) { IntegerVector s_i(iR), s_j(jR); NumericVector s_values(valuesR); int N = as(nR), M = s_i.length(); bool exact = as(exactR); IntegerVector ind1(M), ind1s(N), ind1e(N); IntegerVector ind2(M), ind2s(N), ind2e(N); int i, j, ii, K, temp1, temp2, length; // build ind1e for (i = 0; i < M; i++) { ind1e[s_i[i]]++; // count ind. occurance. ind2e[s_j[i]]++; } temp1 = 0; temp2 = 0; for (i = 0; i < N; i++) // cumsum { temp1 += ind1e[i]; ind1e[i] = temp1 - 1; temp2 += ind2e[i]; ind2e[i] = temp2 - 1; } //build ind1s ind1s[0] = 0; ind2s[0] = 0; for (i = 1; i < N; i++) { ind1s[i] = ind1e[i - 1] + 1; ind2s[i] = ind2e[i - 1] + 1; } temp1 = 0; temp2 = 0; //build ind1 for(i = 0; i < M; i++) { temp1 = s_i[i]; ind1[ind1s[temp1]] = i; ind1s[temp1] += 1; temp2 = s_j[i]; ind2[ind2s[temp2]] = i; ind2s[temp2] += 1; } //rebuild ind1s changed when build ind1 ind1s[0] = 0; ind2s[0] = 0; for(i = 1; i < N; i++) { ind1s[i] = ind1e[i - 1] + 1; ind2s[i] = ind2e[i - 1] + 1; } double dpsim1 = R_NegInf, pmin = R_NegInf, pmax = R_NegInf; NumericVector colS(N); for (int j = 0; j < N; j++) { double sumOfCol = R_NegInf; for (int i = ind2s[j]; i <= ind2e[j]; i++) { if (sumOfCol == R_NegInf) sumOfCol = s_values[ind2[i]]; else sumOfCol += s_values[ind2[i]]; if (s_values[ind2[i]] > pmax) pmax = s_values[ind2[i]]; } if (sumOfCol > dpsim1) dpsim1 = sumOfCol; } if (dpsim1 == R_NegInf) pmin = R_NaN; else if (exact) { double dpsim2 = R_NegInf; IntegerVector Index(N, -1); for (int j21 = 0; j21 < N - 1; j21++) { double j21sum = R_NegInf; for (int k = ind2s[j21]; k <= ind2e[j21]; k++) { Index[s_i[ind2[k]]] = ind2[k]; if (j21sum == R_NegInf) j21sum = s_values[ind2[k]]; else j21sum += s_values[ind2[k]]; } for (int j22 = j21 + 1; j22 < N; j22++) { double tmpSum = j21sum; for (int k22 = ind2s[j22]; k22 <= ind2e[j22]; k22++) { if (Index[s_i[ind2[k22]]] >= 0) { if (s_values[ind2[k22]] > s_values[Index[s_i[ind2[k22]]]]) tmpSum += (s_values[ind2[k22]] - s_values[Index[s_i[ind2[k22]]]]); } else { double maxi; if (s_i[ind2[k22]] == j21) { if (s_values[ind2[k22]] > 0) maxi = s_values[ind2[k22]]; else maxi = 0; } else maxi = s_values[ind2[k22]]; if (tmpSum == R_NegInf) tmpSum = maxi; else tmpSum += maxi; } } if (Index[j22] >= 0 && tmpSum > R_NegInf && s_values[Index[j22]] < 0) tmpSum -= s_values[Index[j22]]; if (tmpSum > dpsim2) dpsim2 = tmpSum; } for (int k = ind2s[j21]; k <= ind2e[j21]; k++) Index[s_i[ind2[k]]] = -1; } pmin = dpsim1 - dpsim2; } else { double sumM = R_NegInf, sm1 = R_PosInf, sm2 = R_PosInf; for (int i = 0; i < N; i++) { colS[i] = R_NegInf; for (int j = ind1s[i]; j <= ind1e[i]; j++) if (s_values[ind1[j]] > colS[i]) colS[i] = s_values[ind1[j]]; if (colS[i] > R_NegInf) { if (sumM == R_NegInf) sumM = colS[i]; else sumM += colS[i]; if (colS[i] < sm1) { sm2 = sm1; sm1 = colS[i]; } else if (colS[i] < sm2) sm2 = colS[i]; } } if (sm2 == R_PosInf || sumM == R_NegInf) pmin = R_NegInf; else pmin = dpsim1 - sumM + sm1 + sm2; } return NumericVector::create(pmin, pmax); } apcluster/src/aggExClusterC.cpp0000644000176200001440000002003014170223535016244 0ustar liggesusers#include #include "aggExClusterC.h" using namespace Rcpp; IntegerVector concat(IntegerVector x, IntegerVector y) { IntegerVector res(x.size() + y.size()); std::copy(x.begin(), x.end(), res.begin()); std::copy(y.begin(), y.end(), res.begin() + x.size()); return res; } NumericMatrix subsetMatrix(NumericMatrix x, IntegerVector col, IntegerVector row) { NumericMatrix res(col.length(), row.length()); for (int i = 0; i < col.length(); i++) { for (int j = 0; j < row.length(); j++) { res(i,j) = x(col[i] - 1, row[j] - 1); } } return res; } NumericVector subsetMatrixToVec(NumericMatrix x, int col, IntegerVector row) { NumericVector res(row.length()); for (int i = 0; i < row.length(); i++) { res[i] = x(col - 1, row[i] - 1); } return res; } NumericVector colMeans(NumericMatrix x) { NumericVector res(x.ncol()); for (int i = 0; i < x.ncol(); i++) { res[i] = mean(x(_, i)); } return res; } int which_max_NoNA(NumericVector x) { int index; double max = R_NegInf; for (int i = 0; i < x.size(); i++) { double value = x[i]; if(R_IsNA(value)) { continue; } if(value > max) { max = value; index = i; } } return index; } RcppExport SEXP aggExClusterC(SEXP sR, SEXP KR, SEXP actClustR, SEXP actExemR, SEXP objMatR, SEXP exeMatR, SEXP actLabelsR, SEXP selR, SEXP clustersR, SEXP exemplarsR, SEXP mergeR, SEXP heightR, SEXP preserveNamesR) { NumericMatrix s(sR); int K = as(KR); List actClust(actClustR); IntegerVector actExem(actExemR); NumericMatrix objMat(objMatR); IntegerMatrix exeMat(exeMatR); IntegerVector actLabels(actLabelsR); IntegerVector sel(selR); List clusters(clustersR); List exemplars(exemplarsR); IntegerMatrix merge(mergeR); NumericVector height(heightR); bool preserveNames(preserveNamesR); IntegerVector colInd(s.nrow()); if (sel.length() > 0) { for (int i = 0; i < sel.length(); i++) { colInd[sel[i] - 1] = i + 1; } } List ret; // compute complete matrices before starting joining for (int i = 0; i < K - 1; i++) { for (int j = i + 1; j < K; j++) { IntegerVector joint = concat(actClust[i], actClust[j]); if(sel.length() > 0) { IntegerVector inters = intersect(sel, joint); IntegerVector ci = colInd[inters - 1]; if(ci.length() > 0) { NumericVector cM = colMeans(subsetMatrix(s, joint, ci)); int ex = inters[which_max(cM)]; exeMat(i, j) = ex; objMat(i, j) = (mean(subsetMatrixToVec(s, ex, colInd[ intersect(sel, IntegerVector(actClust[i])) - 1])) + mean(subsetMatrixToVec(s, ex, colInd[intersect(sel, IntegerVector(actClust[j])) - 1]))) / 2; } else { // joining not possible - no similarities available ret["error"] = 1; return(ret); } } else { NumericVector cM = colMeans(subsetMatrix(s, joint, joint)); int ex = joint[which_max(cM)]; exeMat(i, j) = ex; objMat(i, j) = (mean(subsetMatrixToVec(s, ex, IntegerVector( actClust[i]))) + mean(subsetMatrixToVec(s, ex, IntegerVector( actClust[j])))) / 2; } } } // agglomeration loop for (int k = K - 1; k > 0; k--) { int tojoin = which_max_NoNA(objMat); int I = tojoin % K; int J = std::floor(tojoin / K); IntegerVector newClust = concat(actClust[I], actClust[J]); IntegerVector newClustNM = MAYBE_REFERENCED(newClust) ? clone(newClust) : newClust; newClust.names() = CharacterVector(newClustNM); LogicalVector rem(actClust.length(), true); rem[I] = false; rem[J] = false; actClust = actClust[rem]; if (actClust.length() < (k - 1)) { actClust[k - 1] = newClust; } else { actClust.insert(k - 1, newClust); } actExem = actExem[(actExem != actExem[I]) & (actExem != actExem[J])]; actExem.push_back(exeMat(I, J)); clusters[k - 1] = actClust; merge((K - k - 1), 0) = actLabels[I]; merge((K - k - 1), 1) = actLabels[J]; actLabels = actLabels[(actLabels != actLabels[I]) & (actLabels != actLabels[J])]; actLabels.push_back(K - k); height[K - k - 1] = objMat(I, J); exemplars[k - 1] = actExem; if (preserveNames && !Rf_isNull(colnames(s)) && (Rf_length(colnames(s)) > 0)) { IntegerVector(exemplars[k-1]).names() = ifelse( actExem <= as(colnames(s)).length(), CharacterVector(actExem), NA_STRING); } if (k == 1) { break; } // rearrange matrices objMat and exeMat // put values for unchanged clusters in the first k-1 rows/columns IntegerVector indexVec = seq_len(k + 1); indexVec = indexVec[(indexVec != indexVec[I]) & (indexVec != indexVec[J])]; for (int i = 0; i < k - 1; i++) { for (int j = 0; j < k - 1; j++) { exeMat(i,j) = exeMat(indexVec[i] - 1, indexVec[j] - 1); objMat(i,j) = objMat(indexVec[i] - 1, indexVec[j] - 1); } } // wipe out k+1-st column for (int i = 0; i < exeMat.nrow(); i++) { exeMat(i, k) = NA_INTEGER; objMat(i, k) = NA_REAL; } // update k-th column with objective values and joint exemplars of // unchanged clusters and the newly joined cluster for (int i = 1; i < k; i++) { IntegerVector joint = concat(actClust[i-1], actClust[k-1]); if(sel.length() > 0) { IntegerVector inters = intersect(sel, joint); IntegerVector ci = colInd[inters - 1]; if(ci.length() > 0) { NumericVector cM = colMeans(subsetMatrix(s, joint, ci)); int ex = inters[which_max(cM)]; exeMat(i - 1, k - 1) = ex; objMat(i - 1, k - 1) = (mean(subsetMatrixToVec(s, ex, colInd[ intersect(sel, IntegerVector(actClust[i - 1])) - 1])) + mean(subsetMatrixToVec(s, ex, colInd[intersect(sel, IntegerVector(actClust[k - 1])) - 1]))) / 2; } else { // joining not possible - no similarities available ret["error"] = 2; return(ret); } } else { NumericVector cM = colMeans(subsetMatrix(s, joint, joint)); int ex = joint[which_max(cM)]; exeMat(i - 1, k - 1) = ex; objMat(i - 1, k - 1) = (mean(subsetMatrixToVec(s, ex, IntegerVector(actClust[i - 1]))) + mean(subsetMatrixToVec(s, ex, IntegerVector(actClust[k - 1])))) / 2; } } } ret["exeMat"] = exeMat; ret["objMat"] = objMat; ret["merge"] = merge; ret["height"] = height; ret["clusters"] = clusters; if(sel.length() > 0) ret["colInd"] = colInd; return(ret); } apcluster/src/distanceL.h0000644000176200001440000000021414170223535015121 0ustar liggesusers#ifndef __DISTANCE_L_HEADERS__ #define __DISTANCE_L_HEADERS__ SEXP CdistR(SEXP x, SEXP sel, SEXP smethod, SEXP p); #endif apcluster/src/apclusterSparseC.cpp0000644000176200001440000003031014170223535017031 0ustar liggesusers#include #include #include #include "apclusterCppHeaders.h" using namespace Rcpp; RcppExport SEXP apclusterSparseC(SEXP iR, SEXP jR, SEXP valuesR, SEXP maxitsR, SEXP convitsR, SEXP lamR, SEXP nR, SEXP detailsR) { IntegerVector s_i(iR), s_j(jR); NumericVector s_values(valuesR); int maxits = as(maxitsR); int convits = as(convitsR); double lam = as(lamR); int N = as(nR), M = s_i.length(); bool details = as(detailsR); IntegerVector ind1(M), ind1s(N), ind1e(N); IntegerVector ind2(M), ind2s(N), ind2e(N); NumericVector A(M); NumericVector R(M); IntegerVector se(N); IntegerMatrix e(N, convits); IntegerVector E(N); IntegerVector I(N); NumericVector netsimAll; NumericVector dpsimAll; NumericVector exprefAll; IntegerMatrix idxAll; double tmpnetsim, tmpdpsim, tmpexpref; IntegerVector tmpidx(N); bool dn = false, unconverged = false; int i, j, ii, K, temp1, temp2, length; if (details) { netsimAll = NumericVector(maxits + 1); dpsimAll = NumericVector(maxits + 1); exprefAll = NumericVector(maxits + 1); idxAll = IntegerMatrix(N, maxits + 1); } // build ind1e for (i = 0; i < M; i++) { ind1e[s_i[i]]++; // count ind. occurance. ind2e[s_j[i]]++; } temp1 = 0; temp2 = 0; for (i = 0; i < N; i++) // cumsum { temp1 += ind1e[i]; ind1e[i] = temp1 - 1; temp2 += ind2e[i]; ind2e[i] = temp2 - 1; } //build ind1s ind1s[0] = 0; ind2s[0] = 0; for (i = 1; i < N; i++) { ind1s[i] = ind1e[i - 1] + 1; ind2s[i] = ind2e[i - 1] + 1; } temp1 = 0; temp2 = 0; //build ind1 for(i = 0; i < M; i++) { temp1 = s_i[i]; ind1[ind1s[temp1]] = i; ind1s[temp1] += 1; temp2 = s_j[i]; ind2[ind2s[temp2]] = i; ind2s[temp2] += 1; } //rebuild ind1s changed when build ind1 ind1s[0] = 0; ind2s[0] = 0; for(i = 1; i < N; i++) { ind1s[i] = ind1e[i - 1] + 1; ind2s[i] = ind2e[i - 1] + 1; } temp1 = 0; temp2 = 0; int count_loop = 0; while (!dn) { // first, compute responsibilities for (ii = 0; ii < N; ii++) { double max1 = -DBL_MAX, max2 = -DBL_MAX, avsim; int yMax = 0; for (j = ind1s[ii]; j <= ind1e[ii]; j++) { temp1 = ind1[j]; avsim = A[temp1] + s_values[temp1]; if (avsim > max1) // determine second-largest element of AS { max2 = max1; max1 = avsim; yMax = j; } else if (avsim > max2) max2 = avsim; } for (j = ind1s[ii]; j <= ind1e[ii]; j++) { temp1 = ind1[j]; double oldVal = R(temp1); double newVal = (1 - lam) * (s_values[temp1] - (j == yMax ? max2 : max1)) + lam * oldVal; R(temp1) = newVal; } } // secondly, compute availabilities NumericVector rp(M); for (ii = 0; ii < N; ii++) { double auxsum = 0; temp2 = ind2e[ii]; for(j = ind2s[ii]; j <= ind2e[ii]; j++) { temp1 = ind2[j]; if (R(temp1) < 0 && j != temp2) rp[j] = 0; else rp[j] = R[temp1]; auxsum += rp[j]; } for (j = ind2s[ii]; j <= ind2e[ii]; j++) { temp1 = ind2[j]; double oldVal = A(temp1); double newVal = auxsum - rp[j]; if (newVal > 0 && j != temp2) newVal = 0; A(temp1) = (1 - lam) * newVal + lam * oldVal; } } // find exemplars temp2 = 0; unconverged = false; K = 0; for (j = (M - N); j < M; j++) //loop through the diagonal { int ex = (A(j) + R(j) > 0 ? 1 : 0); se[temp2] = se[temp2] - e(temp2, count_loop % convits) + ex; if (se[temp2] > 0 && se[temp2] < convits) unconverged = true; E[temp2] = ex; e(temp2, count_loop % convits) = ex; K += ex; temp2++; } if (count_loop >= (convits - 1) || count_loop >= (maxits - 1)) dn = ((!unconverged && K > 0) || (count_loop >= (maxits - 1))); // ******storage of details********** if (details) { if (K == 0) { tmpnetsim = R_NaN; tmpdpsim = R_NaN; tmpexpref = R_NaN; for (ii = 0; ii < N; ii++) tmpidx(ii) = R_NaInt; } else { length = 0; tmpnetsim = 0; tmpdpsim = 0; tmpexpref = 0; double maxSim = 0; int discon = 0; IntegerVector I_temp(N); for (ii = 0; ii < N; ii++) { if (E[ii]) // if it is exemplar { tmpidx[ii] = ii; I_temp[length] = ii; // I = find(E) length++; } else // non-exemplar points { tmpidx[ii] = R_NaInt; temp1 = 0; temp2 = 0; length = 0; IntegerVector ee(N); NumericVector temp_ss(N); NumericVector temp_j(N); for(j = ind1s[ii]; j <= ind1e[ii]; j++) { temp1 = ind1[j]; temp_ss[temp2]= s_values[temp1]; temp_j[temp2]= s_j[temp1]; if (E[temp_j[temp2]]) { ee[length] = temp2; // I = find(E(temp_j)) length++; } temp2++; } if (length == 0) discon = 1; else { maxSim = temp_ss[ee[0]]; tmpidx[ii] = temp_j(ee[0]); for (int jj = 1; jj < length; jj++) { temp1 = ee[jj]; if (temp_ss(temp1) > maxSim) { maxSim = temp_ss[temp1]; tmpidx[ii] = temp_j(temp1); } } tmpdpsim = tmpdpsim+maxSim; } } } I=I_temp; // preference sum if (discon == 1) { tmpnetsim = R_NaN; tmpdpsim = R_NaN; tmpexpref = R_NaN; for (int jj = 0; jj < N; jj++) tmpidx[jj] = R_NaInt; } else { temp1 = 0; for (ii = (M - N); ii < M; ii++) { for(j = 0; j < K; j++) if (temp1 == I_temp[j]) tmpexpref += s_values(ii); temp1++; } tmpnetsim = tmpdpsim + tmpexpref; } } } if (details) { exprefAll[count_loop] = tmpexpref; dpsimAll[count_loop] = tmpdpsim; netsimAll[count_loop] = tmpnetsim; for (ii = 0; ii < N; ii++) idxAll(ii, count_loop) = tmpidx[ii]; } count_loop++; } // end of AP main loop // final refinement temp2 = 0; K = 0; for (j = (M - N); j < M; j++) // I think is not needed (exists in matlab) { int ex = (A(j) + R(j) > 0 ? 1 : 0); E[temp2] = ex; K += ex; temp2++; } if (K > 0) { tmpnetsim = 0; tmpdpsim = 0; tmpexpref = 0; double maxSim = 0; // first loop finds the tmpidx if the user ask for details we can // skip this step and take the last tmpidx which already is computed for (ii = 0; ii < N; ii++) { if (E[ii]) { tmpidx[ii] = ii; } else { tmpidx[ii] = R_NaInt; NumericVector temp_ss(N); NumericVector temp_j(N); IntegerVector ee(N); temp1 = 0; // store the idx through loop temp2 = 0; // just counter length = 0; for(j = ind1s[ii]; j <= ind1e[ii]; j++) { temp1 = ind1[j]; temp_ss[temp2] = s_values[temp1]; temp_j[temp2] = s_j[temp1]; if (E[temp_j[temp2]]) { ee[length] = temp2; // I = find(E(temp_j)) length++; } temp2++; } maxSim = temp_ss[ee[0]]; tmpidx[ii]=temp_j(ee[0]); for (int jj = 1; jj < length; jj++) { temp1 = ee[jj]; if (temp_ss(temp1) > maxSim) { maxSim = temp_ss[temp1]; tmpidx[ii] = temp_j(temp1); } } } } IntegerVector E_new(N); //********************* for (ii = 0; ii < N; ii++) { if (E[ii]) { IntegerVector temp_II(N); length = 0; for (int jj = 0; jj < N; jj++) { if (tmpidx[jj] == ii) { temp_II[length] = jj; // I = find(E) length++; } } NumericVector ns(N); NumericVector msk(N); for (int jj = 0; jj < length; jj++) // loop only over exemplars { temp1 = 0; temp2 = 0; NumericVector temp_j(N); NumericVector temp_ss(N); for (j = ind1s[temp_II[jj]]; j <= ind1e[temp_II[jj]]; j++) { temp1 = ind1[j]; temp_ss[temp2] = s_values[temp1]; temp_j[temp2] = s_j[temp1]; msk[temp_j[temp2]] += 1; ns[temp_j[temp2]] += temp_ss[temp2]; temp2++; } } IntegerVector II(length); IntegerVector III(length); int newcounter = 0, minuslength = 0; for (int jj = 0; jj < length; jj++) { if (msk[temp_II[jj]] == length) { II[newcounter] = jj; III[newcounter] = temp_II[II[newcounter]]; newcounter++; } else minuslength++; } maxSim = ns[III[0]]; int index_max = 0; for (int jj = 1; jj < length - minuslength; jj++) { temp1 = III[jj]; if (ns(temp1) > maxSim) { maxSim = ns[temp1]; index_max = jj; } } E_new[III[index_max]] = 1; } } // ************************************** E = E_new; length = 0; int lengthI = 0; tmpnetsim = 0; tmpdpsim = 0; tmpexpref = 0; maxSim = 0; IntegerVector I_tempfinal(N); for (ii = 0; ii < N; ii++) { if (E[ii]) { tmpidx[ii] = ii; I_tempfinal[lengthI] = ii; // I = find(E) final lengthI++; } else { tmpidx[ii] = R_NaInt; NumericVector temp_ss(N); NumericVector temp_j(N); IntegerVector ee(N); temp1 = 0; temp2 = 0; length = 0; for(j = ind1s[ii]; j <= ind1e[ii]; j++) { temp1 = ind1[j]; temp_ss[temp2] = s_values[temp1]; temp_j[temp2] = s_j[temp1]; if (E[temp_j[temp2]]) { ee[length] = temp2;// I = find(E(temp_j)) length++; } temp2++; } //find max and update idx maxSim = temp_ss[ee[0]]; tmpidx[ii] = temp_j(ee[0]); for (int jj = 1; jj < length; jj++) { temp1 = ee[jj]; if (temp_ss(temp1) > maxSim) { maxSim = temp_ss[temp1]; tmpidx[ii] = temp_j(temp1); } } tmpdpsim = tmpdpsim+maxSim; } } // preference sum temp1 = 0; for (ii = (M - N); ii < M; ii++) { for(j = 0; j < K; j++) if(temp1 == I_tempfinal[j]) tmpexpref += s_values(ii); temp1++; } I = I_tempfinal; tmpnetsim = tmpdpsim + tmpexpref; } else { tmpnetsim = R_NaN; tmpdpsim = R_NaN; tmpexpref = R_NaN; for (ii = 0; ii < N; ii++) tmpidx(ii) = R_NaInt; } if (details) { exprefAll[count_loop] = tmpexpref; dpsimAll[count_loop] = tmpdpsim; netsimAll[count_loop] = tmpnetsim; for (ii = 0; ii < N; ii++) idxAll(ii, count_loop) = tmpidx[ii]; } List ret; ret["I"] = I; ret["E"] = E; ret["tmpidx"] = tmpidx; ret["tmpnetsim"] = tmpnetsim; ret["tmpdpsim"] = tmpdpsim; ret["tmpexpref"] = tmpexpref; ret["K"] = K; ret["it"] = IntegerVector::create(count_loop - 1); ret["unconv"] = unconverged; if (details) { ret["netsimAll"] = netsimAll; ret["dpsimAll"] = dpsimAll; ret["exprefAll"] = exprefAll; ret["idxAll"] = idxAll; } return(ret); } apcluster/src/aggExClusterC.h0000644000176200001440000000125014170223535015714 0ustar liggesusers#ifndef __AGG_EX_CLUSTER_C_HEADERS__ #include #define __AGG_EX_CLUSTER_C_HEADERS__ RcppExport SEXP aggExClusterC(SEXP sR, SEXP KR, SEXP actClustR, SEXP actExemR, SEXP objMatR, SEXP exeMatR, SEXP actLabelsR, SEXP selR, SEXP clustersR, SEXP exemplarsR, SEXP mergeR, SEXP heightR, SEXP preserveNamesR); #endif apcluster/src/apclusterCppHeaders.h0000644000176200001440000000235014170223535017157 0ustar liggesusers#ifndef __APCLUSTER_CPP_HEADERS__ #include #define __APCLUSTER_CPP_HEADERS__ /* * note : RcppExport is an alias to `extern "C"` defined by Rcpp. * * It gives C calling convention to the rcpp_hello_world function so that * it can be called from .Call in R. Otherwise, the C++ compiler mangles the * name of the function and .Call can't find it. * * It is only useful to use RcppExport when the function is intended to be called * by .Call. See the thread http://thread.gmane.org/gmane.comp.lang.r.rcpp/649/focus=672 * on Rcpp-devel for a misuse of RcppExport */ RcppExport SEXP apclusterC(SEXP sR, SEXP maxitsR, SEXP convitsR, SEXP lamR, SEXP detailsR); RcppExport SEXP apclusterLeveragedC(SEXP sR, SEXP selR, SEXP maxitsR, SEXP convitsR, SEXP lamR); RcppExport SEXP apclusterSparseC(SEXP iR, SEXP jR, SEXP valuesR, SEXP maxitsR, SEXP convitsR, SEXP lamR, SEXP nR, SEXP detailsR); RcppExport SEXP preferenceRangeC(SEXP sR, SEXP exactR); RcppExport SEXP preferenceRangeSparseC(SEXP iR, SEXP jR, SEXP valuesR, SEXP nR, SEXP exactR); #endif apcluster/src/distanceL.c0000644000176200001440000002355614170223535015132 0ustar liggesusers/* * R : A Computer Language for Statistical Data Analysis * Copyright (C) 1995, 1996 Robert Gentleman and Ross Ihaka * Copyright (C) 1998-2016 The R Core Team * Copyright (C) 2002, 2004 The R Foundation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, a copy is available at * https://www.R-project.org/Licenses/ */ #ifdef HAVE_CONFIG_H # include #endif /* do this first to get the right options for math.h */ #include #include #include #include //#include "stats.h" #ifdef _OPENMP # include #endif #define both_FINITE(a,b) (R_FINITE(a) && R_FINITE(b)) #ifdef R_160_and_older #define both_non_NA both_FINITE #else #define both_non_NA(a,b) (!ISNAN(a) && !ISNAN(b)) #endif static double R_euclidean(double *x, int nr, int nc, int i1, int i2) { double dev, dist; int count, j; count= 0; dist = 0; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { dev = (x[i1] - x[i2]); if(!ISNAN(dev)) { dist += dev * dev; count++; } } i1 += nr; i2 += nr; } if(count == 0) return NA_REAL; if(count != nc) dist /= ((double)count/nc); return sqrt(dist); } static double R_maximum(double *x, int nr, int nc, int i1, int i2) { double dev, dist; int count, j; count = 0; dist = -DBL_MAX; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { dev = fabs(x[i1] - x[i2]); if(!ISNAN(dev)) { if(dev > dist) dist = dev; count++; } } i1 += nr; i2 += nr; } if(count == 0) return NA_REAL; return dist; } static double R_manhattan(double *x, int nr, int nc, int i1, int i2) { double dev, dist; int count, j; count = 0; dist = 0; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { dev = fabs(x[i1] - x[i2]); if(!ISNAN(dev)) { dist += dev; count++; } } i1 += nr; i2 += nr; } if(count == 0) return NA_REAL; if(count != nc) dist /= ((double)count/nc); return dist; } static double R_canberra(double *x, int nr, int nc, int i1, int i2) { double dev, dist, sum, diff; int count, j; count = 0; dist = 0; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { sum = fabs(x[i1] + x[i2]); diff = fabs(x[i1] - x[i2]); if (sum > DBL_MIN || diff > DBL_MIN) { dev = diff/sum; if(!ISNAN(dev) || (!R_FINITE(diff) && diff == sum && /* use Inf = lim x -> oo */ (dev = 1.))) { dist += dev; count++; } } } i1 += nr; i2 += nr; } if(count == 0) return NA_REAL; if(count != nc) dist /= ((double)count/nc); return dist; } static double R_dist_binary(double *x, int nr, int nc, int i1, int i2) { int total, count, dist; int j; total = 0; count = 0; dist = 0; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { if(!both_FINITE(x[i1], x[i2])) { //warning(_("treating non-finite values as NA")); Rprintf("Warning: treating non-finite values as NA"); } else { if(x[i1] || x[i2]) { count++; if( ! (x[i1] && x[i2]) ) dist++; } total++; } } i1 += nr; i2 += nr; } if(total == 0) return NA_REAL; if(count == 0) return 0; return (double) dist / count; } static double R_minkowski(double *x, int nr, int nc, int i1, int i2, double p) { double dev, dist; int count, j; count= 0; dist = 0; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { dev = (x[i1] - x[i2]); if(!ISNAN(dev)) { dist += R_pow(fabs(dev), p); count++; } } i1 += nr; i2 += nr; } if(count == 0) return NA_REAL; if(count != nc) dist /= ((double)count/nc); return R_pow(dist, 1.0/p); } static double R_discrepancy(double *x, int nr, int nc, int i1, int i2) { double dev, dist, psum, mini, maxi; int count, j; count = 0; psum = 0; maxi = -DBL_MAX; mini = DBL_MAX; for(j = 0 ; j < nc ; j++) { if(both_non_NA(x[i1], x[i2])) { dev = x[i1] - x[i2]; if(!ISNAN(dev)) { psum += dev; if (psum > maxi) maxi = psum; else if (psum < mini) mini = psum; count++; } } i1 += nr; i2 += nr; } if(count == 0) return NA_REAL; dist = maxi - mini; if(count != nc) dist /= ((double)count/nc); return dist; } enum { EUCLIDEAN=1, MAXIMUM, MANHATTAN, CANBERRA, BINARY, MINKOWSKI, DISCREPANCY }; /* == 1,2,..., defined by order in the R function dist */ void R_distance(double x[], int sel[], int *nr, int *nc, int *nsel, double *d, int *diag, int *method, double *p) { int dc, i, j; size_t ij; /* can exceed 2^31 - 1 */ double (*distfun)(double*, int, int, int, int) = NULL; #ifdef _OPENMP int nthreads; #endif switch(*method) { case EUCLIDEAN: distfun = R_euclidean; break; case MAXIMUM: distfun = R_maximum; break; case MANHATTAN: distfun = R_manhattan; break; case CANBERRA: distfun = R_canberra; break; case BINARY: distfun = R_dist_binary; break; case MINKOWSKI: if(!R_FINITE(*p) || *p <= 0) error("distance(): invalid p"); break; case DISCREPANCY: distfun = R_discrepancy; break; default: error("distance(): invalid distance"); } dc = (*diag) ? 0 : 1; /* diag=1: we do the diagonal */ #ifdef _OPENMP if (R_num_math_threads > 0) nthreads = R_num_math_threads; else nthreads = 1; /* for now */ if (nthreads == 1) { /* do the nthreads == 1 case without any OMP overhead to see if it matters on some platforms */ ij = 0; for(j = 0 ; j < *nr ; j++) for(i = j+dc ; i < *nr ; i++) d[ij++] = (*method != MINKOWSKI) ? distfun(x, *nr, *nc, i, j) : R_minkowski(x, *nr, *nc, i, j, *p); } else /* This produces uneven thread workloads since the outer loop is over the subdiagonal portions of columns. An alternative would be to use a loop on ij and to compute the i and j values from ij. */ #pragma omp parallel for num_threads(nthreads) default(none) \ private(i, j, ij) \ firstprivate(nr, dc, d, method, distfun, nc, x, p) for(j = 0 ; j < *nr ; j++) { ij = j * (*nr - dc) + j - ((1 + j) * j) / 2; for(i = j+dc ; i < *nr ; i++) d[ij++] = (*method != MINKOWSKI) ? distfun(x, *nr, *nc, i, j) : R_minkowski(x, *nr, *nc, i, j, *p); } #else if (*nsel==NA_INTEGER) { ij = 0; for(j = 0 ; j < *nr ; j++) for(i = j+dc ; i < *nr ; i++) d[ij++] = (*method != MINKOWSKI) ? distfun(x, *nr, *nc, i, j) : R_minkowski(x, *nr, *nc, i, j, *p); } else { int s1 = 0; int imap[*nr]; for (i=0; i<*nr; i++) imap[i] = (s1<*nsel && i==sel[s1]) ? s1++ : -1; for (j = 0 ; j < *nr ; j++) { for (i = j ; i < *nr ; i++) { if (imap[j] != -1) { d[i+*nr*imap[j]] = (*method != MINKOWSKI) ? distfun(x, *nr, *nc, i, j) : R_minkowski(x, *nr, *nc, i, j, *p); if (imap[i] != -1) { d[j+*nr*imap[i]] = d[i+*nr*imap[j]]; } } else { if (imap[i] != -1) { d[j+*nr*imap[i]] = (*method != MINKOWSKI) ? distfun(x, *nr, *nc, i, j) : R_minkowski(x, *nr, *nc, i, j, *p); } } } } } #endif } #include #include "distanceL.h" /* all attribute handling has been removed */ SEXP CdistR(SEXP x, SEXP sel, SEXP smethod, SEXP p) { SEXP ans; int nr = nrows(x), nc = ncols(x), method = asInteger(smethod); int nsel; int N, diag = 0; double rp = asReal(p); int seli = asInteger(sel); if (seli==NA_INTEGER) { nsel = NA_INTEGER; // allocate space for lower diag part without diagonal N = (double)nr * (nr-1)/2; /* avoid overflow for N ~ 50,000 */ } else { nsel = length(sel); // allocate space for full rectangular matrix N = (double)nr * nsel; } PROTECT(ans = allocVector(REALSXP, N)); R_distance(REAL(x), INTEGER(sel), &nr, &nc, &nsel, REAL(ans), &diag, &method, &rp); UNPROTECT(1); return ans; } apcluster/src/apclusterLeveragedC.cpp0000644000176200001440000000722114170223535017477 0ustar liggesusers#include #include #include #include #include "apclusterCppHeaders.h" using namespace Rcpp; RcppExport SEXP apclusterLeveragedC(SEXP sR, SEXP selR, SEXP maxitsR, SEXP convitsR, SEXP lamR) { NumericMatrix s(sR); IntegerVector sel(selR); int maxits = as(maxitsR); int convits = as(convitsR); double lam = as(lamR); int M = s.ncol(); int N = s.nrow(); IntegerMatrix e(N, convits); IntegerVector I(N); IntegerVector se(N); NumericMatrix A(M, N); NumericMatrix R(M, N); NumericVector auxsum(M - 1); bool dn = false, unconverged = false; int i = 0, j, ii, K; while (!dn) { // first, compute responsibilities for (ii = 0; ii < N; ii++) { double max1 = -DBL_MAX, max2 = -DBL_MAX; double avsim; int yMax; // determine largest and second largest element of A + S for (j = 0; j < M; j++) { if (j < M - 1 && sel[j] == ii) continue; avsim = A(j, ii) + s(ii, j); if (avsim > max1) { max2 = max1; max1 = avsim; yMax = j; } else if (avsim > max2) max2 = avsim; } for (j = 0; j < M; j++) // R update including self responsibilities { if (j < M - 1 && sel[j] == ii) continue; double newVal = (1 - lam) * (s(ii, j) - (j == yMax ? max2 : max1)) + lam * R(j, ii); R(j, ii) = (newVal > DBL_MAX ? DBL_MAX : newVal); if (R(j, ii) > 0 && j < M - 1) auxsum[j] = auxsum[j] + R(j, ii); } } // correct auxsum with diag elements for (ii = 0; ii < M - 1; ii++) auxsum[ii] = auxsum[ii] + R(M - 1, sel[ii]); // secondly, compute availabilities for (ii = 0; ii < M - 1; ii++) { for (j = 0; j < N; j++) { double newVal = auxsum[ii]; if (R(ii, j) > 0) newVal -= R(ii, j); if (sel[ii] == j) { // update diagonal element back in last col A(M - 1, j) = (1 - lam) * (newVal - R(M - 1, j)) + lam * A(M-1, j); newVal = 0; // set real diag elmenent to 0 - oldval is 0 } else { if (newVal > 0) newVal = 0; } A(ii, j) = (1 - lam) * newVal + lam * A(ii, j); } auxsum[ii] = 0; } // determine clusters and check for convergence unconverged = false; K = 0; for (j = 0; j < N; j++) { int ex = (A(M - 1, j) + R(M - 1, j) > 0 ? 1 : 0); se[j] = se[j] - e(j, i % convits) + ex; if (se[j] > 0 && se[j] < convits) unconverged = true; e(j, i % convits) = ex; if (ex) I[K] = j; K += ex; } if (i >= (convits - 1) || i >= (maxits - 1)) dn = ((!unconverged && K > 0) || (i >= (maxits - 1))); i++; } List ret; ret["I"] = I; ret["K"] = K; ret["it"] = IntegerVector::create(i - 1); ret["unconv"] = LogicalVector::create(unconverged); return(ret); } apcluster/vignettes/0000755000176200001440000000000014612700362014265 5ustar liggesusersapcluster/vignettes/apcluster.Rnw0000644000176200001440000016511714611423410016765 0ustar liggesusers\documentclass{ubmanual} \usepackage{amsmath,amssymb} \usepackage{hyperref} \hypersetup{colorlinks=false, pdfborder=0 0 0, pdftitle={APCluster - An R Package for Affinity Propagation Clustering}, pdfauthor={Ulrich Bodenhofer}} \title{{\Huge APCluster}\\[5mm] An R Package for Affinity Propagation Clustering} \author{Ulrich Bodenhofer\affilmark{1,2}, Johannes Palme\affilmark{2}, Chrats Melkonian\affilmark{2}, and Andreas Kothmeier\affilmark{2}} \affiliation{\affilmark{1} School of Informatics, Communication and Media\\ University of Applied Sciences Upper Austria\\ Softwarepark 11, 4232 Hagenberg, Austria\\[2mm] {\grey\affilmark{2} previously with: Institute of Bioinformatics, Johannes Kepler University\\Altenberger Str.\ 69, 4040 Linz, Austria}} \newcommand{\APCluster}{\texttt{apcluster}} \newcommand{\KeBABS}{\texttt{kebabs}} \newcommand{\R}{R} \newcommand{\Real}{\mathbb{R}} \renewcommand{\vec}[1]{\mathbf{#1}} %\VignetteIndexEntry{An R Package for Affinity Propagation Clustering} %\VignetteDepends{methods, stats, graphics, utils} %\VignetteEngine{knitr::knitr} \begin{document} <>= options(width=72) knitr::opts_knit$set(width=72) set.seed(0) library(apcluster, quietly=TRUE) apclusterVersion <- packageDescription("apcluster")$Version apclusterDateRaw <- packageDescription("apcluster")$Date apclusterDateYear <- as.numeric(substr(apclusterDateRaw, 1, 4)) apclusterDateMonth <- as.numeric(substr(apclusterDateRaw, 6, 7)) apclusterDateDay <- as.numeric(substr(apclusterDateRaw, 9, 10)) apclusterDate <- paste(month.name[apclusterDateMonth], " ", apclusterDateDay, ", ", apclusterDateYear, sep="") @ \newcommand{\APClusterVer}{\Sexpr{apclusterVersion}} \newcommand{\APClusterDate}{\Sexpr{apclusterDate}} \manualtitlepage{Version \APClusterVer, \APClusterDate}{https://github.com/UBod/apcluster} \section*{Scope and Purpose of this Document} This document is a user manual for the \R\ package \APCluster\ \cite{BodenhoferKothmeierHochreiter11}. It is only meant as a gentle introduction into how to use the basic functions implemented in this package. Not all features of the \R\ package are described in full detail. Such details can be obtained from the documentation enclosed in the \R\ package. Further note the following: (1) this is neither an introduction to affinity propagation nor to clustering in general; (2) this is not an introduction to \R. If you lack the background for understanding this manual, you first have to read introductory literature on these subjects. \newpage \vspace{1cm} \newlength{\auxparskip} \setlength{\auxparskip}{\parskip} \setlength{\parskip}{0pt} \tableofcontents \clearpage \setlength{\parskip}{\auxparskip} \newlength{\Nboxwidth} \setlength{\Nboxwidth}{\textwidth} \addtolength{\Nboxwidth}{-2\fboxrule} \addtolength{\Nboxwidth}{-2\fboxsep} \newcommand{\notebox}[1]{% \begin{center} \fbox{\begin{minipage}{\Nboxwidth} \noindent{\sffamily\bfseries Note:} #1 \end{minipage}} \end{center}} \section{Introduction} Affinity propagation (AP) is a relatively new clustering algorithm that has been introduced by Brendan J.\ Frey and Delbert Dueck \cite{FreyDueck07}.\footnotemark[1]\footnotetext[1]{% \url{https://psi.toronto.edu/research/affinity-propagation-clustering-by-message-passing/}}\stepcounter{footnote} The authors themselves describe affinity propagation as follows: \begin{quote} ``{\em An algorithm that identifies exemplars among data points and forms clusters of data points around these exemplars. It operates by simultaneously considering all data point as potential exemplars and exchanging messages between data points until a good set of exemplars and clusters emerges.}'' \end{quote} AP has been applied in various fields recently, among which bioinformatics is becoming increasingly important. Frey and Dueck have made their algorithm available as Matlab code.\footnotemark[1] Matlab, however, is relatively uncommon in bioinformatics. Instead, the statistical computing platform \R\ has become a widely accepted standard in this field. In order to leverage affinity propagation for bioinformatics applications, we have implemented affinity propagation as an \R\ package. Note, however, that the given package is in no way restricted to bioinformatics applications. It is as generally applicable as Frey's and Dueck's original Matlab code.\footnotemark[1] Starting with Version 1.1.0, the \APCluster\ package also features {\em exemplar-based agglomerative clustering} which can be used as a clustering method on its own or for creating a hierarchy of clusters that have been computed previously by affinity propagation. {\em Leveraged Affinity Propagation}, a variant of AP especially geared to applications involving large data sets, has first been included in Version 1.3.0. \section{Installation} \subsection{Installation via CRAN} The \R\ package \APCluster\ (current version: \APClusterVer) is part of the {\em Comprehensive R Archive Network (CRAN)}% \footnote{\url{http://cran.r-project.org/}}. The simplest way to install the package, therefore, is to enter the following command into your \R\ session: <>= install.packages("apcluster") @ If you use R on Windows or Mac OS, you can also conveniently use the package installation menu of your R GUI. \subsection{Manual installation from source} Under special circumstances, e.g. if you want to compile the C++ code included in the package with some custom options, you may prefer to install the package manually from source. To this end, open the package's page at CRAN% \footnote{\url{https://CRAN.R-project.org/package=apcluster}} and then proceed as follows: \begin{enumerate} \item Download \texttt{apcluster\_\APClusterVer.tar.gz} and save it to your harddisk. \item Open a shell/terminal/command prompt window and change to the directory where you put {\ttfamily apcluster\_\APClusterVer.tar.gz}. Enter \begin{quote} \ttfamily R CMD INSTALL apcluster\_\APClusterVer.tar.gz \end{quote} to install the package. \end{enumerate} Note that this might require additional software on some platforms. Windows requires Rtools\footnote{\url{http://cran.r-project.org/bin/windows/Rtools/}} to be installed and to be available in the default search path (environment variable \verb+PATH+). Mac OS X requires Xcode developer tools% \footnote{\url{https://developer.apple.com/technologies/tools/}} (make sure that you have the command line tools installed with Xcode). \subsection{Compatibility issues} All versions downloadable from CRAN have been built using the latest version, \R\ \Sexpr{R.version$major}.\Sexpr{R.version$minor}. However, the package should work without severe problems on \R\ versions $\geq$3.0.0. \section{Getting Started} To load the package, enter the following in your \R\ session: <>= library(apcluster) @ If this command terminates without any error message or warning, you can be sure that the package has been installed successfully. If so, the package is ready for use now and you can start clustering your data with affinity propagation. The package includes both a user manual (this document) and a reference manual (help pages for each function). To view the user manual, enter <>= vignette("apcluster") @ Help pages can be viewed using the \verb+help+ command. It is recommended to start with <>= help(apcluster) @ Affinity propagation does not require the data samples to be of any specific kind or structure. AP only requires a {\em similarity matrix}, i.e., given $l$ data samples, this is an $l\times l$ real-valued matrix $\mathbf{S}$, in which an entry $S_{ij}$ corresponds to a value measuring how similar sample $i$ is to sample $j$. AP does not require these values to be in a specific range. Values can be positive or negative. AP does not even require the similarity matrix to be symmetric (although, in most applications, it will be symmetric anyway). A value of $-\infty$ is interpreted as ``absolute dissimilarity''. The higher a value, the more similar two samples are considered. To get a first impression, let us create a random data set in $\Real^2$ as the union of two ``Gaussian clouds'': \begin{center} <>= cl1 <- cbind(rnorm(30, 0.3, 0.05), rnorm(30, 0.7, 0.04)) cl2 <- cbind(rnorm(30, 0.7, 0.04), rnorm(30, 0.4, .05)) x1 <- rbind(cl1, cl2) plot(x1, xlab="", ylab="", pch=19, cex=0.8) @ \end{center} The package \APCluster\ offers several different ways for clustering data. The simplest way is the following: <>= apres1a <- apcluster(negDistMat(r=2), x1) @ In this example, the function \verb+apcluster()+ first computes a similarity matrix for the input data \verb+x1+ using the {\em similarity function} passed as first argument. The choice \verb+negDistMat(r=2)+ is the standard similarity measure used in the papers of Frey and Dueck --- negative squared distances. Alternatively, one can compute the similarity matrix beforehand and call \verb+apcluster()+ for the similarity matrix (for a more detailed description of the differences, see \ref{ssec:memeff}): <>= s1 <- negDistMat(x1, r=2) apres1b <- apcluster(s1) @ The function \verb+apcluster()+ creates an object belonging to the S4 class \verb+APResult+ which is defined by the present package. To get detailed information on which data are stored in such objects, enter <>= help(APResult) @ The simplest thing we can do is to enter the name of the object (which implicitly calls \verb+show()+) to get a summary of the clustering result: <>= apres1a @ The \APCluster\ package allows for plotting the original data set along with a clustering result: \begin{center} <>= plot(apres1a, x1) @ \end{center} In this plot, each color corresponds to one cluster. The exemplar of each cluster is marked by a box and all cluster members are connected to their exemplars with lines. A heatmap is plotted with \verb+heatmap()+: \begin{center} <>= heatmap(apres1a) @ \end{center} In the heatmap, the samples are grouped according to clusters. The above heatmap confirms again that there are two main clusters in the data. A heatmap can be plotted for the object \verb+apres1a+ because \verb+apcluster()+, if called for data and a similarity function, by default includes the similarity matrix in the output object (unless it was called with the switch \verb+includeSim=FALSE+). If the similarity matrix is not included (which is the default if \verb+apcluster()+ has been called on a similarity matrix directly), \verb+heatmap()+ must be called with the similarity matrix as second argument: \begin{center} <>= heatmap(apres1b, s1) @ \end{center} Suppose we want to have better insight into what the algorithm did in each iteration. For this purpose, we can supply the option \verb+details=TRUE+ to \verb+apcluster()+: <>= apres1c <- apcluster(s1, details=TRUE) @ This option tells the algorithm to keep a detailed log about its progress. For example, this allows for plotting the three performance measures that AP uses internally for each iteration: \begin{center} <>= plot(apres1c) @ \end{center} These performance measures are: \begin{enumerate} \item Sum of exemplar preferences \item Sum of similarities of exemplars to their cluster members \item Net fitness: sum of the two former \end{enumerate} For details, the user is referred to the original affinity propagation paper \cite{FreyDueck07} and the supplementary material published on the affinity propagation Web page.\footnotemark[1] We see from the above plot that the algorithm has not made any change for the last 100 iterations. AP, through its parameter \verb+convits+, allows to control for how long AP waits for a change until it terminates (the default is \verb+convits=100+). If the user has the feeling that AP will probably converge quicker on his/her data set, a lower value can be used: <>= apres1c <- apcluster(s1, convits=15, details=TRUE) apres1c @ \section{Adjusting Input Preferences}\label{sec:ipref} Apart from the similarity matrix itself, the most important input parameter of AP is the so-called {\em input preference} which can be interpreted as the tendency of a data sample to become an exemplar (see \cite{FreyDueck07} and supplementary material on the AP homepage\footnotemark[1] for a more detailed explanation). This input preference can either be chosen individually for each data sample or it can be a single value shared among all data samples. Input preferences largely determine the number of clusters, in other words, how fine- or coarse-grained the clustering result will be. The input preferences one can specify for AP are roughly in the same range as the similarity values, but they do not have a straightforward interpretation. Frey and Dueck have introduced the following rule of thumb: ``{\it The shared value could be the median of the input similarities (resulting in a moderate number of clusters) or their minimum (resulting in a small number of clusters).}'' \cite{FreyDueck07} Our AP implementation uses the median rule by default if the user does not supply a custom value for the input preferences. In order to provide the user with a knob that is --- at least to some extent --- interpretable, the function \verb+apcluster()+ provides an argument \verb+q+ that allows to set the input preference to a certain quantile of the input similarities: resulting in the median for \verb+q=0.5+ and in the minimum for \verb+q=0+. As an example, let us add two more ``clouds'' to the data set from above: \begin{center} <>= cl3 <- cbind(rnorm(20, 0.50, 0.03), rnorm(20, 0.72, 0.03)) cl4 <- cbind(rnorm(25, 0.50, 0.03), rnorm(25, 0.42, 0.04)) x2 <- rbind(x1, cl3, cl4) plot(x2, xlab="", ylab="", pch=19, cex=0.8) @ \end{center} For the default setting, we obtain the following result: \begin{center} <>= apres2a <- apcluster(negDistMat(r=2), x2) plot(apres2a, x2) @ \end{center} For the minimum of input similarities, we obtain the following result: \begin{center} <>= apres2b <- apcluster(negDistMat(r=2), x2, q=0) plot(apres2b, x2) @ \end{center} So we see that AP is quite robust against a reduction of input preferences in this example which may be caused by the clear separation of the four clusters. If we increase input preferences, however, we can force AP to split the four clusters into smaller sub-clusters: \begin{center} <>= apres2c <- apcluster(negDistMat(r=2), x2, q=0.8) plot(apres2c, x2) @ \end{center} Note that the input preference used by AP can be recovered from the output object (no matter which method to adjust input preferences has been used). On the one hand, the value is printed if the object is displayed (by \verb+show+ or by entering the output object's name). On the other hand, the value can be accessed directly via the slot \verb+p+: <>= apres2c@p @ As noted above already, we can produce a heatmap by calling \verb+heatmap()+ for an \verb+APResult+ object: \begin{center} <>= heatmap(apres2c) @ \end{center} The order in which the clusters are arranged in the heatmap is determined by means of joining the cluster agglomeratively (see Section \ref{sec:agglo} below). Although the affinity propagation result contains \Sexpr{length(apres2c@exemplars)} clusters, the heatmap indicates that there are actually four clusters which can be seen as very brightly colored squares along the diagonal. We also see that there seem to be two pairs of adjacent clusters, which can be seen from the fact that there are two relatively light-colored blocks along the diagonal encompassing two of the four clusters in each case. If we look back at how the data have been created (see also plots above), this is exactly what is to be expected. The above example with \verb+q=0+ demonstrates that setting input preferences to the minimum of input similarities does not necessarily result in a very small number of clusters (like one or two). This is due to the fact that input preferences need not necessarily be exactly in the range of the similarities. To determine a meaningful range, an auxiliary function is available which, in line with Frey's and Dueck's Matlab code,\footnotemark[1] allows to compute a minimum value (for which one or at most two clusters would be obtained) and a maximum value (for which as many clusters as data samples would be obtained): <>= preferenceRange(apres2b@sim) @ The function returns a two-element vector with the minimum value as first and the maximum value as second entry. The computations are done approximately by default. If one is interested in exact bounds, supply \verb+exact=TRUE+ (resulting in longer computation times). Many clustering algorithms need to know a pre-defined number of clusters. This is often a major nuisance, since the exact number of clusters is hard to know for non-trivial (in particular, high-dimensional) data sets. AP avoids this problem. If, however, one still wants to require a fixed number of clusters, this has to be accomplished by a search algorithm that adjusts input preferences in order to produce the desired number of clusters in the end. For convenience, this search algorithm is available as a function \verb+apclusterK()+ (analogous to Frey's and Dueck's Matlab implementation\footnotemark[1]). We can use this function to force AP to produce only two clusters (merging the two pairs of adjacent clouds into one cluster each). Analogously to \verb+apcluster()+, \verb+apclusterK()+ supports two variants --- it can either be called for a similarity measure and data or on a similarity matrix directly. \begin{center} <>= apres2d <- apclusterK(negDistMat(r=2), x2, K=2, verbose=TRUE) plot(apres2d, x2) @ \end{center} Now let us quickly consider a simple data set with more than two features. The notorious example is Fisher's iris data set: <>= data(iris) apIris1 <- apcluster(negDistMat(r=2), iris) apIris1 @ AP has identified \Sexpr{length(apIris1)} clusters. Since Version 1.3.2, the package also allows for superimposing clustering results in scatter plot matrices: \begin{center} <>= plot(apIris1, iris) @ \end{center} The heatmap looks as follows: \begin{center} <>= heatmap(apIris1) @ \end{center} Now let us try to obtain fewer clusters by using the minimum of off-diagonal similarities: <>= data(iris) apIris2 <- apcluster(negDistMat(r=2), iris, q=0) apIris2 @ AP has identified \Sexpr{length(apIris2)} clusters. If we again superimpose them in the scatter plot matrix, we obtain the following: \begin{center} <>= plot(apIris2, iris) @ \end{center} Finally, the heatmap looks as follows: \begin{center} <>= heatmap(apIris2) @ \end{center} So, looking at the heatmap, the \Sexpr{length(apIris2)} clusters seem quite reasonable, at least in the light of the fact that there are three species in the data set, {\em Iris setosa}, {\em Iris versicolor}, and {\em Iris virginica}, where {\em Iris setosa} is very clearly separated from each other (first cluster in the heatmap) and the two others are partly overlapping. \section{Exemplar-based Agglomerative Clustering}\label{sec:agglo} The function \verb+aggExCluster()+ realizes what can best be described as ``exemplar-based agglomerative clustering'', i.e.\ agglomerative clustering whose merging objective is geared towards the identification of meaningful exemplars. Analogously to \verb+apcluster()+, \verb+aggExCluster()+ supports two variants --- it can either be called for a similarity measure and data or on matrix of pairwise similarities. \subsection{Getting started} Let us start with a simple example: <>= aggres1a <- aggExCluster(negDistMat(r=2), x1) aggres1a @ The output object \verb+aggres1a+ contains the complete cluster hierarchy. As obvious from the above example, the \verb+show()+ method only displays the most basic information. Calling \verb+plot()+ on an object that was the result of \verb+aggExCluster()+ (an object of class \verb+AggExResult+), a dendrogram is plotted: \begin{center} <>= plot(aggres1a) @ \end{center} The heights of the merges in the dendrogram correspond to the merging objective: the higher the vertical bar of a merge, the less similar the two clusters have been. The dendrogram, therefore, clearly indicates two clusters. Heatmaps can be produced analogously as for \verb+APResult+ objects with the additional property that dendrograms are displayed on the top and on the left: \begin{center} <>= heatmap(aggres1a, s1) @ \end{center} Once we have confirmed the number of clusters, which is clearly 2 according to the dendrogram and the heatmap above, we can extract the level with two clusters from the cluster hierarchy. In concordance with standard \R\ terminology, the function for doing this is called \verb+cutree()+: \begin{center} <>= cl1a <- cutree(aggres1a, k=2) cl1a plot(cl1a, x1) @ \end{center} \subsection{Merging clusters obtained from affinity propagation} The most important application of \verb+aggExCluster()+ (and the reason why it is part of the \APCluster\ package) is that it can be used for creating a hierarchy of clusters starting from a set of clusters previously computed by affinity propagation. The examples in Section \ref{sec:ipref} indicate that it may sometimes be tricky to define the right input preference. Exemplar-based agglomerative clustering on affinity propagation results provides an additional tool for finding the right number of clusters. Let us revisit the four-cluster example from Section \ref{sec:ipref}. We can apply \verb+aggExCluster()+ to an affinity propagation result if we run it on the affinity propagation result supplied as second argument \verb+x+: <>= aggres2a <- aggExCluster(x=apres2c) aggres2a @ The result \verb+apres2c+ had \Sexpr{length(apres2c)} clusters. \verb+aggExCluster()+ successively joins these clusters until only one cluster is left. The dendrogram of this cluster hierarchy is given as follows: \begin{center} <>= plot(aggres2a) @ \end{center} If one wants to see the original samples in the dendrogram of the cluster hierarchy, the \verb+showSamples=TRUE+ option can be used. In this case, it is recommended to reduce the font size of the labels via the \verb+nodePar+ parameter (see \verb+?plot.dendrogram+ and the examples therein): \begin{center} <>= plot(aggres2a, showSamples=TRUE, nodePar=list(pch=NA, lab.cex=0.4)) @ \end{center} The following heatmap coincides with the one shown in Section \ref{sec:ipref} above. This is not surprising, since the heatmap plot for an affinity propagation result uses \verb+aggExCluster()+ internally to arrange the clusters: \begin{center} <>= heatmap(aggres2a) @ \end{center} Once we are more or less sure about the number of clusters, we extract the right clustering level from the hierarchy. For demonstation purposes, we do this for $k=5,\dots,2$ in the following plots: \begin{center} <>= par(mfrow=c(2,2)) for (k in 5:2) plot(aggres2a, x2, k=k, main=paste(k, "clusters")) @ \end{center} There is one obvious, but important, condition: applying \verb+aggExCluster()+ to an affinity propagation result only makes sense if the number of clusters to start from is at least as large as the number of true clusters in the data set. Clearly, if the number of clusters is already too small, then merging will make the situation only worse. \subsection{Details on the merging objective} Like any other agglomerative clustering method (see, e.g., \cite{JainMurtyFlynn99,MichalskiStepp92,Ward63}), \verb+aggExCluster()+ merges clusters until only one cluster containing all samples is obtained. In each step, two clusters are merged into one, i.e.\ the number of clusters is reduced by one. The only aspect in which \verb+aggExCluster()+ differs from other methods is the merging objective. Suppose we consider two clusters for possible merging, each of which is given by an index set: \[ I = \{i_1,\dots,i_{n_I}\} \text{ and } J = \{j_1,\dots,j_{n_J}\} \] Then we first determine the potential {\em joint exemplar} $\mathop{\mathrm{ex}}(I,J)$ as the sample that maximizes the average similarity to all samples in the joint cluster $I\cup J$: \[ \mathop{\mathrm{ex}}(I,J) =\mathop{\mathrm{argmax}}\limits_{i\in I\cup J} \frac{1}{n_I + n_J}\cdot \sum\limits_{j\in I\cup J} S_{ij} \] Recall that $\mathbf{S}$ denotes the similarity matrix and $S_{ij}$ corresponds to the similarity of the $i$-th and the $j$-th sample. Then the merging objective is computed as \[ \mathop{\mathrm{obj}}(I,J)=\frac{1}{2}\cdot\Big(\frac{1}{n_I}\cdot \sum\limits_{j\in I} S_{\mathop{\mathrm{ex}}(I,J)j}+\frac{1}{n_J}\cdot \sum\limits_{k\in J} S_{\mathop{\mathrm{ex}}(I,J)k}\Big), \] which can be best described as ``{\em balanced average similarity to the joint exemplar}''. In each step, \verb+aggExCluster()+ considers all pairs of clusters in the current cluster set and joins that pair of clusters whose merging objective is maximal. The rationale behind the merging objective is that those two clusters should be joined that are best described by a joint exemplar. \section{Leveraged Affinity Propagation}\label{sec:lever} Leveraged affinity propagation is based on the idea that, for large data sets with many samples, the cluster structure is already visible on a subset of the samples. Instead of evaluating the similarity matrix for all sample pairs, the similarities of all samples to a subset of samples are computed --- resulting in a non-square similarity matrix. Clustering is performed on this reduced similarity matrix allowing for clustering large data sets more efficiently. In this form of clustering, several rounds of affinity propagation are executed with different sample subsets --- iteratively improving the clustering result. The implementation is based on the Matlab code of Frey and Dueck provided on the AP Web page\footnotemark[1]. Apart from dynamic improvements through reduced amount of distance calculations and faster clustering, the memory consumption is also reduced not only in terms of the memory used for storing the similarity matrix, but also in terms of memory used by the clustering algorithm internally. The two main parameters controlling leveraged AP clustering are the fraction of data points that should be selected for clustering (parameter \verb+frac+) and the number of sweeps or repetitions of individual clustering runs (parameter \verb+sweeps+). Initially, a sample subset is selected randomly. For the subsequent repetitions, the exemplars of the previous run are kept in the sample subset and the other samples in the subset are chosen randomly again. The best result of all sweeps with the highest net similarity is kept as final clustering result. When called with a similarity measure and a dataset the function \verb+apclusterL()+ performs both the calculation of similarities and leveraged affinity propagation. In the example below, we use 10\% of the samples and run 5 repetitions. The function implementing the similarity measure can either be passed as a function or as a function name (which must of course be resolvable in the current environment). Additional parameters for the distance calculation can be passed to \verb+apclusterL()+ which passes them on to the function implementing the similarity measure via the \verb+...+ argument list. In any case, this function must be implemented such that it expects the data in its first argument \verb+x+ (a subsettable data structure, such as, a vector, matrix, data frame, or list) and that it takes the selection of ``column objects'' as a second argument \verb+sel+ which must be a set of column indices. The functions \verb+negDistMat()+, \verb+expSimMat()+, \verb+linSimMat()+, \verb+corSimMat()+, and \verb+linKernel()+ provided by the \APCluster\ package also support the easy creation of parameter-free similarity measures (in R terminology called ``closures''). We recommend this variant, as it is safer in terms of possible name conflicts between arguments of \verb+apclusterL()+ and arguments of the similarity function. Here is an example that makes use of a closure for defining the similarity measure: \begin{center} <>= cl5 <- cbind(rnorm(100, 0.3, 0.05), rnorm(100, 0.7, 0.04)) cl6 <- cbind(rnorm(100, 0.70, 0.04), rnorm(100, 0.4, 0.05)) x3 <- rbind(cl5, cl6) apres3 <- apclusterL(s=negDistMat(r=2), x=x3, frac=0.1, sweeps=5, p=-0.2) apres3 plot(apres3, x3) @ \end{center} The function \verb+apclusterL()+ creates a result object of S4 class \verb+APResult+ that contains the same information as for standard AP. Additionally, the selected sample subset, the associated rectangular similarity matrix for the best sweep (provided that \verb+includeSim=TRUE+) and the net similarities of all sweeps are returned in this object. <>= dim(apres3@sim) apres3@sel apres3@netsimLev @ The result returned by leveraged affinity propagation can be used for further processing in the same way as a result object returned from \verb+apcluster()+, e.g., merging of clusters with agglomerative clustering can be performed. For heatmap plotting either the parameter \verb+includeSim=TRUE+ must be set in \verb+apcluster()+ or \verb+apclusterL()+ to make the similarity matrix available in the result object or the similarity matrix must be passed as second parameter to \verb+heatmap()+ explicitly. The heatmap for leveraged AP looks slightly different compared to the heatmap for affinity propagation because the number of samples is different in both dimensions. \begin{center} <>= heatmap(apres3) @ \end{center} Often selected samples will be chosen as exemplars because, only for them, the full similarity information is available. This means that the fraction of samples should be selected in a way such that a considerable number of samples is available for each expected cluster. Please also note that a data set of the size used in this example can easily be clustered with regular affinity propagation. The data set was kept small to keep the package build time short and the amount of data output in the manual reasonable. For users requiring a higher degree of flexibility, e.g., for a customized selection of the sample subset, \verb+apclusterL()+ called with a rectangular similiarity matrix performs affinity propagation on a rectangular similarity matrix. See the source code of \verb+apclusterL()+ with signature \verb+s=function+ and \verb+x=ANY+ for an example how to embed \verb+apclusterL()+ into a complete loop performing leveraged AP. The package-provided functions for distance calculation support the generation of rectangular similarity matrices (see Chapter \ref{sec:DistMat}). \section{Sparse Affinity Propagation}\label{sec:sparse} Starting with Version 1.4.0 of the \APCluster\ package, the functions \verb+apcluster()+, \verb+apclusterK()+, and \verb+preferenceRange()+ can also handle similarity matrices as defined by the \verb+Matrix+ package. While all dense matrix formats are converted to standard R matrices, sparse matrices are converted internally to \verb+dgTMatrix+ objects. For these sparse matrices, special implementations of the \verb+apcluster()+, \verb+apclusterK()+, and \verb+preferenceRange()+ are available that fully exploit the sparseness of the matrices and may require much less operations if the matrix is sufficiently sparse. In order to demonstrate that, consider the following example: <>= dsim <- negDistMat(x2, r=2) ssim <- as.SparseSimilarityMatrix(dsim, lower=-0.2) str(ssim) @ The function \verb+as.SparseSimilarityMatrix()+ converts the dense similarity matrix \verb+dsim+ into a sparse similarity matrix by removing all pairwise similarities that are -0.2 or lower. Note that this is only for demonstration purposes. If the size of data permits that, it is advisable to use the entire dense similarity matrix. Anyway, let us run sparse AP on this similarity matrix: \begin{center} <>= sapres <- apcluster(ssim, q=0) plot(sapres, x2) @ \end{center} The functions \verb+preferenceRange()+ and \verb+apclusterK()+ work in the same way as for dense similarity matrices: <>= preferenceRange(ssim) apclusterK(ssim, K=2) @ The functions \verb+aggExCluster()+ and \verb+heatmap()+ have been extended to be able to handle sparse matrices. Note, however, that these functions are not yet exploiting sparsity properly. Instead, they convert all inputs to dense matrices before processing them, which may lead to memory and/or performance issues for large data sets. \begin{center} <>= heatmap(sapres, ssim) @ \end{center} The above heatmap illustrates that values that are not stored in the sparse similarity matrix are filled up with low values (see the red areas between some pairs of samples that belong to different clusters). Actually, each missing value is replaced with \[ \min(s)-(\max(s)-\min(s))=2\cdot\min(s)-\max(s), \] where $\min(s)$ and $\max(s)$ denote the smallest and the largest similarity value specified in the sparse similarity matrix $s$, respectively. The same replacement takes place when \verb+aggExCluster()+ converts sparse similarity matrices to dense ones. \section{Processing Biological Sequences}\label{sec:bioseq} As noted in the introduction above, one of the goals of this package is to leverage affinity propagation in bioinformatics applications. Previous versions of this document showed a toy example of using affinity propagation on a set of biological sequences that computed a similarity matrix using the simple {\em spectrum kernel} \cite{LeslieEskinNoble02} as implemented in the \KeBABS\ package \cite{PalmeHochreiterBodenhofer15}. This example has been removed in version 1.4.9 in order to avoid dependencies to a non-CRAN package. Instead, readers are now refered to the vignette of the \KeBABS\ package \cite{PalmeHochreiterBodenhofer15}, which also includes an example how to use affinity propagation clustering on a set of biological sequences. \section{Similarity Matrices}\label{sec:DistMat} Apart from the obvious monotonicity ``the higher the value, the more similar two samples'', affinity propagation does not make any specific assumption about the similarity measure. Negative squared distances must be used if one wants to minimize squared errors \cite{FreyDueck07}. Apart from that, the choice and implementation of the similarity measure is left to the user. Our package offers a few more methods to obtain similarity matrices. The choice of the right one (and, consequently, the objective function the algorithm optimizes) still has to be made by the user. All functions described in this section assume the input data matrix to be organized such that each row corresponds to one sample and each column corresponds to one feature (in line with the standard function \verb+dist+). If a vector is supplied instead of a matrix, each single entry is interpreted as a (one-dimensional) sample. \subsection{The function \texttt{negDistMat()}} The function \verb+negDistMat()+, in line with Frey and Dueck, allows for computing negative distances for a given set of real-valued data samples. If called with the first argument \verb+x+, a similarity matrix with pairwise negative distances is returned: <>= s <- negDistMat(x2) @ The function \texttt{negDistMat()} provides the same set of distance measures and parameters as the standard function \verb+dist()+ (except for \verb+method="binary"+ which makes little sense for real-valued data). Presently, \verb+negDistMat()+ provides the following variants of computing the distance $d(\vec{x},\vec{y})$ of two data samples $\vec{x}=(x_1,\dots,x_n)$ and $\vec{y}=(y_1,\dots,y_n)$: \begin{description} \item[Euclidean:] \[ d(\vec{x},\vec{y})=\sqrt{\sum\limits_{i=1}^n (x_i-y_i)^2} \] use \verb+method="euclidean"+ or do not specify argument \verb+method+ (since this is the default); \item[Maximum:] \[ d(\vec{x},\vec{y})=\max\limits_{i=1}^n |x_i-y_i| \] use \verb+method="maximum"+; \item[Sum of absolute distances / Manhattan:] \[ d(\vec{x},\vec{y})=\sum\limits_{i=1}^n |x_i-y_i| \] use \verb+method="manhattan"+; \item[Canberra:] \[ d(\vec{x},\vec{y})=\sum\limits_{i=1}^n \frac{|x_i-y_i|}{|x_i+y_i|} \] summands with zero denominators are not taken into account; use \verb+method="canberra"+; \item[Minkowski:] \[ d(\vec{x},\vec{y})=\left(\sum\limits_{i=1}^n (x_i-y_i)^p\right)^{\frac{1}{p}} \] use \verb+method="minkowski"+ and specify $p$ using the additional argument $\verb+p+$ (default is \verb+p=2+, resulting in the standard Euclidean distance); \item[Discrepancy:] \[ d(\vec{x},\vec{y})=\max\limits_{1\leq\alpha\leq\beta\leq n}\left|\sum\limits_{i=\alpha}^{\beta} (y_i-x_i)\right| \] use \verb+method="discrepancy"+ \cite{Weyl16}. \end{description} The function \verb+negDistMat()+ then takes the distances computed with one of the variants listed above and returns $-1$ times the $r$-th power of it, i.e., \begin{equation}\label{eq:negDistMat} s(\vec{x},\vec{y})=-d(\vec{x},\vec{y})^r. \end{equation} The exponent $r$ can be adjusted with the argument \verb+r+. The default is \verb+r=1+, hence, one has to supply \verb+r=2+ to obtain negative squared distances as in the examples in previous sections. Here are some examples: <>= ex <- matrix(c(0, 0.5, 0.8, 1, 0, 0.2, 0.5, 0.7, 0.1, 0, 1, 0.3, 1, 0.8, 0.2), 5, 3, byrow=TRUE) ex @ Standard Euclidean distance: <>= negDistMat(ex) @ Squared Euclidean distance: <>= negDistMat(ex, r=2) @ Maximum norm-based distance: <>= negDistMat(ex, method="maximum") @ Sum of absolute distances (aka Manhattan distance): <>= negDistMat(ex, method="manhattan") @ Canberra distance: <>= negDistMat(ex, method="canberra") @ Minkowski distance for $p=3$ ($3$-norm): <>= negDistMat(ex, method="minkowski", p=3) @ If called without the data argument \verb+x+, a function object is returned that can be supplied to clustering functions --- as in the majority of the above examples: <>= sim <- negDistMat(r=2) is.function(sim) apcluster(sim, x1) @ Depending on the application, it might be advisable to center and/or scale the data in order to equalize the influence of all features/columns. This makes sense for standard vector space distances like the Euclidean distance and can easily be accomplished by the \verb+scale()+ method. The discrepancy distance, in contrast, is strongly dependent on the order to feature/columns and is rather aimed at comparing signals. For this measure, therefore, row-wise centering can be advisable \cite{BauerBodenhoferKlement96c}. This is easily done with the \verb+sweep()+ function: <>= ex2 <- matrix(c(0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1), 3, 8, byrow=TRUE) matplot(t(ex2), ylab="") matlines(t(ex2), type="s") negDistMat(ex2, method="discrepancy") ex2Scaled <- sweep(ex2, 1, rowMeans(ex2)) ex2Scaled matplot(t(ex2Scaled), ylab="") matlines(t(ex2Scaled), type="s") negDistMat(ex2Scaled, method="discrepancy") @ \subsection{Other similarity measures} The package \APCluster\ offers four more functions for creating similarity matrices for real-valued data: \begin{description} \item[Exponential transformation of distances:] the function \verb+expSimMat()+ works in the same way as the function \verb+negDistMat()+. The difference is that, instead of the transformation \eqref{eq:negDistMat}, it uses the following transformation: \[ s(\vec{x},\vec{y})=\exp\left(-\left(\frac{d(\vec{x},\vec{y})}{w}\right)^r\right) \] Here the default is \verb+r=2+. It is clear that \verb+r=2+ in conjunction with \verb+method="euclidean"+ results in the well-known {\em Gaussian kernel / RBF kernel} \cite{FitzGeraldMicchelliPinkus95,Micchelli86,SchoelkopfSmola02}, whereas \verb+r=1+ in conjunction with \verb+method="euclidean"+ results in the similarity measure that is sometimes called {\em Laplace kernel} \cite{FitzGeraldMicchelliPinkus95,Micchelli86}. Both variants (for non-Euclidean distances as well) can also be interpreted as {\em fuzzy equality/similarity relations} \cite{DeBaetsMesiar02}. \item[Linear scaling of distances with truncation:] the function \verb+linSimMat()+ uses the transformation \[ s(\vec{x},\vec{y})=\max\left(1-\frac{d(\vec{x},\vec{y})}{w},0\right) \] which is also often interpreted as a {\em fuzzy equality/similarity relation} \cite{DeBaetsMesiar02}. \item[Correlation:] the function \verb+corSimMat()+ interprets the rows of its argument \verb+x+ (matrix or data frame) as multivariate observations and computes similarities as pairwise correlations. The function \verb+corSimMat()+ is actually a wrapper around the standard function \verb+cor()+. Consequently, the \verb+method+ argument allows for selecting the type of correlation to compute (Pearson, Spearman, or Kendall). \item[Linear kernel:] scalar products can also be interpreted as similarity measures, a view that is often adopted by kernel methods in machine learning. In order to provide the user with this option as well, the function \verb+linKernel()+ is available. For two data samples $\vec{x}=(x_1,\dots,x_n)$ and $\vec{y}=(y_1,\dots,y_n)$, it computes the similarity as \[ s(\vec{x},\vec{y})=\sum\limits_{i=1}^n x_i\cdot y_i. \] The function has one additional argument, \verb+normalize+ (default: \verb+FALSE+). If \verb+normalize+ is set to \verb+TRUE+, values are normalized to the range $[-1,+1]$ in the following way: \[ s(\vec{x},\vec{y})=\frac{\sum_{i=1}^n x_i\cdot y_i}% {\sqrt{\big(\sum_{i=1}^n x_i^2\big)\cdot% \big(\sum_{i=1}^n y_i^2\big)}} \] Entries for which at least one of the two factors in the denominator is zero are set to zero (however, the user should be aware that this should be avoided anyway). \end{description} For the same example data as above, we obtain the following for the RBF kernel: <>= expSimMat(ex) @ Laplace kernel: <>= expSimMat(ex, r=1) @ Pearson correlation coefficient: <>= corSimMat(ex, method="pearson") @ Spearman rank correlation coefficient: <>= corSimMat(ex, method="spearman") @ Linear scaling of distances with truncation: <>= linSimMat(ex, w=1.2) @ Linear kernel: <>= linKernel(ex[2:5,]) @ Normalized linear kernel: <>= linKernel(ex[2:5,], normalize=TRUE) @ All of these functions work in the same way as \verb+negDistMat()+: if called with argument \verb+x+, a similarity matrix is returned, otherwise a function is returned. \subsection{Rectangular similarity matrices} With the introduction of leveraged affinity propagation, distance calculations are entirely performed within the \APCluster\ package. The code is based on a customized version of the \verb+dist()+ function from the \verb+stats+ package. In the following example, a rectangular similarity matrix of all samples against a subset of the samples is computed: <>= sel <- sort(sample(1:nrow(x1), ceiling(0.08 * nrow(x1)))) sel s1r <- negDistMat(x1, sel, r=2) dim(s1r) s1r[1:7,] @ The rows correspond to all samples, the columns to the sample subset. The \verb+sel+ parameter specifies the sample indices of the selected samples in increasing order. Rectangular similarity calculation is provided in all distance functions of the package. If the parameter \verb+sel+ is not specified, the quadratic similarity matrix of all sample pairs is computed. \subsection{Defining a custom similarity measure for leveraged affinity propagation}\label{ssec:leverSim} As mentioned in Section \ref{sec:lever} above, leveraged affinity propagation requires the definition of a similarity measure that is supplied as a function or function name to \verb+apclusterL()+. For vectorial data, the similarity measures supplied with the package (see above) may be sufficient. If other similarity measures are necessary or if the data are not vectorial, the user must supply his/her own similarity measure. The user can supply any function as argument \verb+s+ to \verb+apcluster()+, \verb+apclusterK()+, or \verb+apclusterL()+, but the following rules must be obeyed in order to avoid errors and to ensure meaningful results: \begin{enumerate} \item The data must be supplied as first argument, which must be named \verb+x+. \item The second argument must be named \verb+sel+ and must be interpreted as a vector of indices that select a subset of data items in \verb+x+. \item The function must return a numeric matrix with similarities. If \verb+sel=NA+, the format of the matrix must be \verb+length(x)+$\times$\verb+length(x)+. If \verb+sel+ is not \verb+NA+, but contains indices selecting a subset, the format of the returned similarity matrix must be \verb+length(x)+$\times$\verb+length(sel)+. \item Although this is not a must, it is recommended to properly set row and column names in the returned similarity matrix. \end{enumerate} \subsection{Defining a custom similarity measure that creates a sparse similarity matrix} Since Version 1.4.0, similarity matrices may also be sparse (cf.~Section~\ref{sec:sparse}). Correspondingly, the similarity measures passed to \verb+apcluster()+ and \verb+apclusterK()+ may also return sparse similarity matrices: <>= sparseSim <- function(x) { as.SparseSimilarityMatrix(negDistMat(x, r=2), lower=-0.2) } sapres2 <- apcluster(sparseSim, x2, q=0) sapres2 str(similarity(sapres2)) @ Note that similarity measures passed to \verb+apclusterL()+ may not return sparse matrices. Instead, they must accept a \verb+sel+ argument and return a rectangular dense matrix (see Subsection~\ref{ssec:leverSim} above). \section{Miscellaneous} \subsection{Convenience vs.\ efficiency}\label{ssec:memeff} In most of the above examples, we called a clustering method by supplying it with a similarity function and the data to be clustered. This is undoubtedly a convenient approach. Since the resulting output objects (unless the option \verb+includeSim=FALSE+ is supplied) even includes the similarity matrix, we can plot heatmaps and produce a cluster hierarchy on the basis of the clustering result without the need to supply the similarity matrix explicitly. For large data sets, however, this convenient approach has some disadvantages: \begin{itemize} \item If the clustering algorithm is run several times on the same data set (e.g., for different parameters), the similarity matrix is recomputed every time. \item Every clustering result (depending on the option \verb+includeSim+) usually includes a copy of the similarity matrix. \end{itemize} For these reasons, depending on the actual application scenario, users should consider computing the similarity matrix beforehand. This strategy, however, requires some extra effort for subsequent processing, i.e.\ the similarity must be supplied as an extra argument in subsequent processing. \subsection{Clustering named objects}\label{ssec:names} The function \verb+apcluster()+ and all functions for computing distance matrices are implemented to recognize names of data objects and to correctly pass them through computations. The mechanism is best described with a simple example: <>= x3 <- c(1, 2, 3, 7, 8, 9) names(x3) <- c("a", "b", "c", "d", "e", "f") s3 <- negDistMat(x3, r=2) @ So we see that the \verb+names+ attribute must be used if a vector of named one-dimensional samples is to be clustered. If the data are not one-dimensional (a matrix or data frame), object names must be stored in the row names of the data matrix. All functions for computing similarity matrices recognize the object names. The resulting similarity matrix has the list of names both as row and column names. <>= s3 colnames(s3) @ The function \verb+apcluster()+ and all related functions use column names of similarity matrices as object names. If object names are available, clustering results are by default shown by names. <>= apres3a <-apcluster(s3) apres3a apres3a@exemplars apres3a@clusters @ \subsection{Computing a label vector from a clustering result} \label{ssec:labels} For later classification or comparisons with other clustering methods, it may be useful to compute a label vector from a clustering result. Our package provides an instance of the generic function \verb+labels()+ for this task. As obvious from the following example, the argument \verb+type+ can be used to determine how to compute the label vector. <>= apres3a@exemplars labels(apres3a, type="names") labels(apres3a, type="exemplars") labels(apres3a, type="enum") @ The first choice, \verb+"names"+ (default), uses names of exemplars as labels (if names are available, otherwise an error message is displayed). The second choice, \verb+"exemplars"+, uses indices of exemplars (enumerated as in the original data set). The third choice, \verb+"enum"+, uses indices of clusters (consecutively numbered as stored in the slot \verb+clusters+ --- analogous to the standard implementation of \verb+cutree()+ or the \verb+clusters+ field of the list returned by the standard function \verb+kmeans()+). \subsection{Customizing heatmaps} With Version 1.3.1, the implementation of heatmap plotting has changed significantly. The method now allows for many more customizations than before. Apart from changes in the argument list (see \verb+?heatmap+), the behavior of the method has changed as follows: \begin{itemize} \item Dendrograms are always plotted if possible. To switch off plotting of dendrograms, set \verb+Rowv+ and \verb+Colv+ to \verb+FALSE+ or \verb+NA+. If a dendrogram should only appear to the left of the heatmap, set \verb+Colv+ to \verb+FALSE+ or \verb+NA+. Analogously, set \verb+Rowv+ to \verb+FALSE+ or \verb+NA+ if a dendrogram should only be plotted on top of the plot (not possible if the similarity matrix is non-quadratic). \item Previously, \verb+rainbow()+ was used internally to determine how the bars illustrating the clusters are colored. Now users can determine the coloring of the color bars using the \verb+sideColors+ argument. For \verb+sideColors=NULL+, a meaningful color coding is determined automatically which still uses \verb+rainbow()+, but ensures that no similar colors are placed next to each other in the bar. \item The default font sizes for displaying row/column labels have been changed to make sure that they do not overlap. This can result in quite small labels if the number of samples is larger. In any case, the user can override the sizes by making custom settings of the parameters \verb+cexRow+ and \verb+cexCol+. Row and column labels can even be switched off entirely by setting \verb+cexRow+ and \verb+cexCol+ to 0, respectively. \end{itemize} Moreover, with Version~1.4.3, the possibility to add a color legend has been integrated. Here is an example with the vertical dendrogram switched off, an alternate color scheme, custom margins, and a color legend: \begin{center} <>= heatmap(apres2c, sideColors=c("darkgreen", "yellowgreen"), col=terrain.colors(12), Rowv=FALSE, dendScale=0.5, margins=c(3, 3, 2), legend="col") @ \end{center} The following example reverts to the default behavior prior to Version 1.3.1: consecutive rainbow colors, no dendrograms, and traditional sizing of row/column labels: \begin{center} <>= heatmap(apres2c, sideColors=rainbow(length(apres2c)), Rowv=FALSE, Colv=FALSE, cexRow=(0.2 + 1 / log10(nrow(apres2c@sim))), cexCol=(0.2 + 1 / log10(nrow(apres2c@sim)))) @ \end{center} \subsection{Adding a legend to plots of clustering results} As shown above, \verb+plot()+ called for an \verb+APResult+ object as first and a matrix or data frame as second argument plots the clustering result superimposed on a scatter plot (or a scatter plot matrix if the number of columns in the second argument exceeds 2). The clusters are shown in different colors, but it may not be clear which cluster is shown in which color. Therefore, it may be useful to show a legend along with the plot. The current implementation of \verb+plot()+ does not show a legend, since it is hard to determine where to actually place the legend such that no important cluster information gets occluded by the legend. Therefore, the user has to add legends manually. Actually, colors are always chosen according to a simple rule: \verb+plot()+ uses \verb+rainbow()+ to create a vector of colors that is exactly as long as the number of clusters in the \verb+APResult+ object. The following example shows how to plot a legend manually (with the clusters enumerated in the same way as in the \verb+APResult+ object): \begin{center} <>= plot(apres2a, x2) legend("bottomleft", legend=paste("Cluster", 1:length(apres2a)), col=rainbow(length(apres2a)), pch=19) @ \end{center} Note that this method is only meaningful for plotting clustering results superimposed on a 2D data set. For scatter plot matrices, this does not work in a meaningful way. In such a case, the user is rather recommended to create a legend separately (in a separate graphics device/file) and to display it along with the scatter plot matrix. To create only the legend, code like the following could be used: \begin{center} <>= plot.new() par(oma=rep(0, 4), mar=rep(0, 4)) legend("center", legend=paste("Cluster", 1:length(apres2c)), col=rainbow(length(apres2c)), pch=19) @ \end{center} It still may be necessary to strip off white margins for further usage of the legend. \subsection{Implementation and performance issues}\label{ssec:perf} Prior to Version 1.2.0, \verb+apcluster()+ was implemented in R. Starting with version 1.2.0, the main iteration loop of \verb+apcluster()+ has been implemented in C++ using the Rcpp package \cite{EddelbuettelFrancois11}, which has led to a speedup in the range of a factor or 9--10. Note that \verb+details=TRUE+ requires quite an amount of additional memory. If possible, avoid this for larger data sets. The asymptotic computational complexity of \verb+aggExCluster()+ is $\mathcal{O}(l^3)$ (where $l$ is the number of samples or clusters from which the clustering starts). This may result in excessively long computation times if \verb+aggExCluster()+ is used for larger data sets without using affinity propagation first. For real-world data sets, in particular, if they are large, we recommend to use affinity propagation first and then, if necessary, to use \verb+aggExCluster()+ to create a cluster hierarchy. \section{Special Notes for Users Upgrading from Previous Versions} \subsection{Upgrading from a version older than 1.3.0} Version 1.3.0 has brought several fundamental changes to the architecture of the package. We tried to ensure backward compatibility with previous versions where possible. However, there are still some caveats the users should take into account: \begin{itemize} \item The functions \verb+apcluster()+, \verb+apclusterK()+, and \verb+aggExCluster()+ have been re-im\-ple\-ment\-ed as S4 generics, therefore, they do not have a fixed list of arguments anymore. For this reason, users are recommended to name all optional parameters. \item Heatmap plotting has been shifted to the function \verb+heatmap()+ which has now been defined as an S4 generic method. Previous methods for plotting heatmaps using \verb+plot()+ have been partly available in Versions 1.3.0 and 1.3.1. Since Version 1.3.2, they are no longer available. \end{itemize} \subsection{Upgrading to Version 1.3.3 or newer} Users who upgrade to Version 1.3.3 (or newer) from an older version should be aware that the package now requires a newer version of Rcpp. This issue can simply be solved by re-installing Rcpp from CRAN using \verb+install.packages("Rcpp")+. \subsection{Upgrading to Version 1.4.0} The function \verb+sparseToFull()+ has been deprecated. A fully compatible function \verb+as.DenseSimilarityMatrix()+ is available that replaces and extends \verb+sparseToFull()+. \subsection{Upgrading to Version 1.4.9} The function \verb+sparseToFull()+ that has been deprecated since version 1.4.0 has finally been removed completely. From now on, you really must use the function \verb+as.DenseSimilarityMatrix()+ that replaces and extends \verb+sparseToFull()+. Since the dependency to the \KeBABS\ package has been removed, the example file \verb+inst/examples/ch22Promoters.fasta+ has been removed, too. \section{How to Cite This Package} If you use this package for research that is published later, you are kindly asked to cite it as follows: \begin{quotation} \noindent U.\ Bodenhofer, A.\ Kothmeier, and S.\ Hochreiter (2011). APCluster: an R package for affinity propagation clustering. {\em Bioinformatics} {\bf 27}(17):2463--2464. DOI: \href{http://dx.doi.org/10.1093/bioinformatics/btr406}{10.1093/bioinformatics/btr406}. \end{quotation} Moreover, we insist that, any time you cite the package, you also cite the original paper in which affinity propagation has been introduced \cite{FreyDueck07}. To obtain Bib\TeX\ entries of the two references, you can enter the following into your R session: <>= toBibtex(citation("apcluster")) @ \bibliographystyle{plain} \bibliography{apcluster} \end{document} apcluster/vignettes/apcluster.bib0000644000176200001440000001036014170223535016746 0ustar liggesusers@inproceedings{BauerBodenhoferKlement96c, author = {P. Bauer and U. Bodenhofer and E. P. Klement}, title = {A fuzzy algorithm for pixel classification based on the discrepancy norm}, booktitle = {Proc. 5th IEEE Int. Conf. on Fuzzy Systems}, volume = {{III}}, address = {New Orleans, LA}, pages = {2007--2012}, month = {September}, year = 1996, doi = {10.1109/FUZZY.1996.552744} } @article{BodenhoferKothmeierHochreiter11, author = {U. Bodenhofer and A. Kothmeier and S. Hochreiter}, title = {{APCluster:} an {R} package for affinity propagation clustering}, journal = {Bioinformatics}, volume = 27, number = 17, pages = {2463--2464}, year = 2011, doi = {10.1093/bioinformatics/btr406} } @article{DeBaetsMesiar02, author = {B. {De Baets} and R. Mesiar}, title = {Metrics and {$T$}-equalities}, journal = {J. Math. Anal. Appl.}, year = 2002, volume = 267, pages = {531--547} } @article{EddelbuettelFrancois11, author = {D. Eddelbuettel and R. Fran\c{c}ois}, title = {Rcpp: seamless {R} and {C++} integration}, journal = {J. Stat. Softw.}, volume = 40, number = 8, pages = {1--18}, year = 2011 } @article{FitzGeraldMicchelliPinkus95, author = {C. H. FitzGerald and C. A. Micchelli and A. Pinkus}, title = {Functions that preserve families of positive semidefinite matrices}, journal = {Linear Alg. Appl.}, year = 1995, volume = 221, pages = {83--102} } @article{FreyDueck07, author = {B. J. Frey and D. Dueck}, title = {Clustering by passing messages between data points}, journal = {Science}, volume = 315, number = 5814, pages = {972--976}, year = 2007 } @article{JainMurtyFlynn99, author = {A. K. Jain and M. N. Murty and P. J. Flynn}, title = {Data clustering: a review}, journal = {ACM Comput. Surv.}, year = 1999, volume = 31, number = 3, pages = {264--323} } @article{KaratzoglouSmolaHornikZeileis04, title = {kernlab -- An {S4} Package for Kernel Methods in {R}}, author = {A. Karatzoglou and A. Smola and K. Hornik and A. Zeileis}, journal = {J. Stat. Softw.}, year = 2004, volume = 11, number = 9, pages = {1--20} } @incollection{LeslieEskinNoble02, author = {C. Leslie and E. Eskin and W. S. Noble}, title = {The spectrum kernel: a string kernel for {SVM} protein classification}, editor = {R. B. Altman and A. K. Dunker and L. Hunter and K. Lauderdale and T. E. D. Klein}, booktitle = {Pacific Symposium on Biocomputing 2002}, pages = {566--575}, publisher = {World Scientific}, year = 2002 } @article{Micchelli86, author = {C. A. Micchelli}, title = {Interpolation of scattered data: Distance matrices and conditionally positive definite functions}, journal = {Constr. Approx.}, year = 1986, volume = 2, pages = {11--22} } @incollection{MichalskiStepp92, author = {R. S. Michalski and R. E. Stepp}, title = {Clustering}, editor = {S. C. Shapiro}, booktitle = {Encyclopedia of artificial intelligence}, publisher = {John Wiley \& Sons}, address = {Chichester}, year = 1992, pages = {168--176} } @article{PalmeHochreiterBodenhofer15, author = {J. Palme and S. Hochreiter and U. Bodenhofer}, title = {{KeBABS}: an {R} package for kernel-based analysis of biological sequences}, journal = {Bioinformatics}, year = 2015, volume = 31, number = 15, pages = {2574--2576}, doi = {10.1093/bioinformatics/btv176} } @book{SchoelkopfSmola02, author = {B. Sch\"olkopf and A. J. Smola}, title = {Learning with Kernels}, year = 2002, publisher = {MIT Press}, series = {Adaptive Computation and Machine Learning}, address = {Cambridge, MA} } @article{Ward63, author = {J. H. {Ward Jr.}}, title = {Hierarchical grouping to optimize an objective function}, journal = {J. Amer. Statist. Assoc.}, volume = 58, pages = {236--244}, year = 1963 } @article{Weyl16, author = {H. Weyl}, title = {{\"U}ber die {G}leichverteilung von {Z}ahlen mod. {E}ins}, journal = {Math. Ann.}, volume = 77, pages = {313--352}, year = 1916 } apcluster/vignettes/ubmanual.cls0000755000176200001440000001363414610450357016612 0ustar liggesusers% % % UBMANUAL document class % % last revision 2024-04-19 by Ulrich Bodenhofer % % \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{ubmanual}[2024/04/19] % % load document class article (always with options a4paper and titlepage) % \LoadClass[a4paper,11pt,twoside]{article} \typeout{=============================================================}% \typeout{UBMANUAL document class loaded}% \typeout{=============================================================}% % % font customizations % \renewcommand{\encodingdefault}{T1} \renewcommand{\rmdefault}{ptm} \renewcommand{\sfdefault}{phv} \renewcommand{\ttdefault}{cmtt} \fontencoding{T1}\selectfont % % customization of item marks % \renewcommand{\labelitemi}{\rule[0.2ex]{0.8ex}{0.8ex}} \renewcommand{\labelitemii}{$\m@th\bullet$} % % include of additional packages % \RequirePackage{color} \RequirePackage{graphicx} \RequirePackage{ifthen} % % setup of page format % \setlength{\evensidemargin}{-1in} \setlength{\oddsidemargin}{-1in} \setlength{\topmargin}{-1in} \addtolength\evensidemargin{30mm} \addtolength\oddsidemargin{30mm} \addtolength\topmargin{28mm} \setlength{\textwidth}{150mm} \setlength{\headheight}{12pt} \setlength{\headsep}{8mm} \setlength{\textheight}{222mm} \ifx\pdfoutput\undefined \relax \else \setlength{\pdfpagewidth}{21cm} \setlength{\pdfpageheight}{29.7cm} \fi % % setup of customized headings style and listings % \def\ps@headings{% \let\@oddfoot\@empty\let\@evenfoot\@empty \def\@evenhead{\underline{\makebox[\textwidth][l]{% \sffamily\thepage\hfill\leftmark}}}% \def\@oddhead{\underline{\makebox[\textwidth][l]{% \sffamily\rightmark\hfill\thepage}}}% \let\@mkboth\markboth \def\sectionmark##1{% \markboth { \ifnum \c@secnumdepth >\z@ \thesection\quad \fi ##1}{ \ifnum \c@secnumdepth >\z@ \thesection\quad \fi ##1}}% \def\subsectionmark##1{}} \renewenvironment{abstract}{\section*{\abstractname}% \@mkboth{\abstractname}{\abstractname}}{} \newenvironment{acknowledgments}{\section*{Acknowledgments}% \@mkboth{Acknowledgments}{Acknowledgments}}{} \renewcommand\tableofcontents{% \section*{\contentsname \@mkboth{\contentsname}{\contentsname}}% \@starttoc{toc}% } \renewcommand\listoffigures{% \section*{\listfigurename}% \@mkboth{\listfigurename}% {\listfigurename}% \@starttoc{lof}% } \renewcommand\listoftables{% \section*{\listtablename}% \@mkboth{\listtablename}% {\listtablename}% \@starttoc{lot}% } \renewenvironment{thebibliography}[1] {\section*{\refname}% \@mkboth{\refname}{\refname}% \list{\@biblabel{\@arabic\c@enumiv}}% {\settowidth\labelwidth{\@biblabel{#1}}% \leftmargin\labelwidth \advance\leftmargin\labelsep \@openbib@code \usecounter{enumiv}% \let\p@enumiv\@empty \renewcommand\theenumiv{\@arabic\c@enumiv}}% \sloppy \clubpenalty4000 \@clubpenalty \clubpenalty \widowpenalty4000% \sfcode`\.\@m} {\def\@noitemerr {\@latex@warning{Empty `thebibliography' environment}}% \endlist} % % set page style % \pagestyle{headings} % % adjust parskip % \setlength{\parskip}{5pt plus 2pt minus 1pt} % % define colors and color commands % \definecolor{ubwh}{rgb}{1.00,1.00,1.00} \definecolor{ubbl}{rgb}{0.00,0.00,0.00} \definecolor{ubdg}{rgb}{0.30,0.30,0.30} \definecolor{ubgr}{rgb}{0.55,0.55,0.55} \definecolor{ublg}{rgb}{0.80,0.80,0.80} \newcommand{\lightgrey}{\color{ublg}} \newcommand{\darkgrey}{\color{ubdg}} \newcommand{\grey}{\color{ubgr}} % % define UBMANUAL title page commands % \newcommand{\customtitlepage}[3]{% \thispagestyle{empty} #2 \vfill \noindent\makebox[0pt][l]{% \setlength{\unitlength}{1cm} \begin{picture}(0,0)(2,2.4) \put(0,25.5){\makebox(0,0)[lb]{\color{ublg}\rule{19cm}{2.2cm}}} \put(0.3,26.5){\makebox(0,0)[l]{\fontfamily{phv}\bfseries\Huge #1}} \put(0,1.6){\makebox(0,0)[lb]{\color{ublg}\rule{19cm}{1mm}}} \put(0,0){\makebox(0,0)[lb]{\fontfamily{phv}\normalsize\begin{tabular}[b]{l} #3 \end{tabular}}} \end{picture}}\newpage} \def\ubmanual@number{} \def\ubmanual@keywords{} \def\ubmanual@abstract{} \def\ubmanual@citation{} \def\ubmanual@affiliation{} \newcommand{\affiliation}[1]{\def\ubmanual@affiliation{#1}} \newcommand{\affilmark}[1]{\textsuperscript{\scriptsize #1}} \newcommand{\doi}[1]{% \ifx\href\undefined doi:#1 \else \href{http://doi.org/#1}{doi:#1} \fi} \newcommand{\email}[1]{\ifx\href\undefined {\em #1} \else \href{mailto:#1}{{\em #1}} \fi} \newcommand{\manualtitlepage}[2]{\customtitlepage{User Manual / Package Vignette}{% \mbox{ } \vfill \begin{center} \sffamily\bfseries\LARGE\@title \end{center} \ifthenelse{\equal{\@author}{}}{}{\begin{center} {\sffamily\bfseries\large\@author}\\[2mm] \ifx\@empty\ubmanual@affiliation \relax \else {\sffamily\normalsize\ubmanual@affiliation} \end{center} \fi} \vspace{1cm} \begin{center} {\Large\sffamily\bfseries #1} \end{center} \vfill \mbox{ }}{% Link to package on GitHub: \href{#2}{#2} \\ \mbox{ } \\ \mbox{ } }} \newcommand{\copyrightpage}[1][]{% \clearpage \mbox{ } \vfill \vfill \noindent{\large \textcircled{c} \ifthenelse{\equal{#1}{}}{% \@author}{% #1}}\\[7mm] \noindent \UBMANUALCopyrightNotice\thispagestyle{empty} \vfill \mbox{ } \clearpage} \newcommand{\UBMANUALCopyrightNotice}{This material, no matter whether in printed or electronic form, may be used for personal and educational use only. Any reproduction of this manuscript, no matter whether as a whole or in parts, no matter whether in printed or in electronic form, requires explicit prior acceptance of the author.} \endinput % % end of ubmanual.cls % apcluster/R/0000755000176200001440000000000014502301101012440 5ustar liggesusersapcluster/R/AllGenerics.R0000644000176200001440000000166614170223535015003 0ustar liggesuserssetGeneric(name="apcluster", def=function(s, x, ...) standardGeneric("apcluster")) setGeneric(name="apclusterL", def=function(s, x, ...) standardGeneric("apclusterL")) setGeneric(name="apclusterK", def=function(s, x, ...) standardGeneric("apclusterK")) setGeneric(name="aggExCluster", def=function(s, x, ...) standardGeneric("aggExCluster")) setGeneric(name="heatmap", def=function(x, y, ...) standardGeneric("heatmap")) setGeneric(name="similarity", def=function(x, ...) standardGeneric("similarity")) setGeneric(name="preferenceRange", def=function(s, ...) standardGeneric("preferenceRange")) setGeneric(name="as.SparseSimilarityMatrix", def=function(s, ...) standardGeneric("as.SparseSimilarityMatrix")) setGeneric(name="as.DenseSimilarityMatrix", def=function(s, ...) standardGeneric("as.DenseSimilarityMatrix")) apcluster/R/revDend.R0000644000176200001440000000222614170223535014173 0ustar liggesusersmidDend.local <- function (x) if (is.null(mp <- attr(x, "midpoint"))) 0 else mp memberDend.local <- function (x) if (is.null(r <- attr(x, "members"))) 1 else r isLeaf.local <- function (x) (is.logical(L <- attr(x, "leaf"))) && L midCacheDend.local <- function (x) { stopifnot(inherits(x, "dendrogram")) setmid <- function(d) { if (isLeaf.local(d)) return(d) k <- length(d) if (k < 1) stop("dendrogram node with non-positive #{branches}") r <- d midS <- 0 for (j in 1:k) { r[[j]] <- unclass(setmid(d[[j]])) midS <- midS + midDend.local(r[[j]]) } if (k == 2) attr(r, "midpoint") <- (memberDend.local(d[[1]]) + midS) / 2 else attr(r, "midpoint") <- midDend.local(d) r } setmid(x) } revDend.local <- function (x) { if (isLeaf.local(x)) return(x) k <- length(x) if (k < 1) stop("dendrogram non-leaf node with non-positive #{branches}") r <- x for (j in 1:k) r[[j]] <- revDend.local(x[[k + 1 - j]]) midCacheDend.local(r) } apcluster/R/AllClasses.R0000644000176200001440000000522714502301101014617 0ustar liggesusers# auxiliary class that allows for classical matrices and matrices from the # 'Matrix' package; note that, previously the class 'mMatrix' was used setClassUnion("AnyMatrix", members = c("matrix", "Matrix")) # S4 class definition for exemplar-based clustering setClass("ExClust", representation = representation ( l = "numeric", sel = "numeric", exemplars = "numeric", clusters = "list", idx = "numeric", sim = "AnyMatrix", call = "character" ), prototype = prototype ( l = 0, sel = numeric(0), exemplars = numeric(0), clusters = list(), idx = numeric(0), sim = matrix(nrow=0, ncol=0), call = character(0) ) ) # S4 class definition for the result object of affinity propagation clustering setClass("APResult", representation = representation ( sweeps = "numeric", it = "numeric", p = "numeric", netsim = "numeric", dpsim = "numeric", expref = "numeric", netsimLev = "numeric", netsimAll = "numeric", dpsimAll = "numeric", exprefAll = "numeric", idxAll = "matrix" ), prototype = prototype ( sweeps = 0, it = 0, p = 0, netsim = NaN, dpsim = NaN, expref = NaN, netsimLev = numeric(0), netsimAll = NaN, dpsimAll = NaN, exprefAll = NaN, idxAll = matrix(nrow=0, ncol=0) ), contains = "ExClust" ) # S4 class definition for the result object of the aggExCluster algorithm setClass("AggExResult", representation = representation ( l = "numeric", sel = "numeric", maxNoClusters = "numeric", clusters = "list", exemplars = "list", merge = "matrix", height = "numeric", order = "numeric", labels = "character", sim = "matrix", call = "character" ), prototype = prototype ( l = 0, sel = numeric(0), maxNoClusters = 0, clusters = list(), exemplars = list(), merge = matrix(NA, 1, 1), height = numeric(0), order = numeric(0), labels = c(), sim = matrix(NA, 1, 1), call = character(0) ) ) apcluster/R/conversions.R0000644000176200001440000000764514245406305015167 0ustar liggesusersas.SparseSimilarityMatrix.matrix <- function(s, lower=-Inf) { if (!is(s, "matrix")) { s <- try(as(s, "matrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'matrix'") } if (nrow(s) != ncol(s) && ncol(s) != 3) stop("matrix 's' must be quadratic or have 3 columns") if (nrow(s) == ncol(s)) { sel <- which(s > lower, arr.ind=TRUE) remElem <- which(sel[, 1] == sel[, 2]) if (length(remElem) > 0) sel <- sel[-remElem, , drop=FALSE] if (nrow(sel) == 0) S <- new("dgTMatrix", Dim=dim(s)) else S <- new("dgTMatrix", Dim=dim(s), i=as.integer(sel[, 1] - 1), j=as.integer(sel[, 2] - 1), x=s[sel]) } else { if (min(s[, 1:2]) <= 0) stop("indices in 's' must be >= 1") if (any(s[, 1:2] != floor(s[, 1:2]))) stop("indices in 's' must be natural numbers") remElem <- which(s[, 1] == s[, 2] | s[, 3] <= lower) if (length(remElem) > 0) s <- s[-remElem, , drop=FALSE] if (nrow(s) == 0) S <- new("dgTMatrix", Dim=as.integer(c(0, 0))) else { N <- max(s[, 1:2]) S <- new("dgTMatrix", Dim=as.integer(c(N, N)), i=as.integer(s[, 1] - 1), j=as.integer(s[, 2] - 1), x=s[, 3]) } } S } setMethod("as.SparseSimilarityMatrix", signature(s="matrix"), as.SparseSimilarityMatrix.matrix) setMethod("as.SparseSimilarityMatrix", signature(s="Matrix"), as.SparseSimilarityMatrix.matrix) as.SparseSimilarityMatrix.sparseMatrix <- function(s, lower=-Inf) { if (nrow(s) != ncol(s)) stop("argument 's' must be quadratic similarity matrix") if (!is(s, "dgTMatrix")) { s <- try(as(as(s, "TsparseMatrix"), "dgTMatrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'dgTMatrix'") } remElem <- which(s@i == s@j | s@x <= lower) if (length(remElem) > 0) { s@i <- s@i[-remElem] s@j <- s@j[-remElem] s@x <- s@x[-remElem] } s } setMethod("as.SparseSimilarityMatrix", signature(s="sparseMatrix"), as.SparseSimilarityMatrix.sparseMatrix) as.DenseSimilarityMatrix.matrix <- function(s, fill=-Inf) { if (!is(s, "matrix")) { s <- try(as(s, "matrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'matrix'") } if (ncol(s) != 3) stop("'s' must be a matrix with 3 columns") if (min(s[, 1:2]) <= 0) stop("indices in 's' must be >= 1") if (any(s[, 1:2] != floor(s[, 1:2]))) stop("indices in 's' must be natural numbers") N <- max(s[, 1:2]) S <- matrix(fill, N, N) S[s[, 1] + N * (s[, 2] - 1)] <- s[, 3] S } setMethod("as.DenseSimilarityMatrix", signature(s="matrix"), as.DenseSimilarityMatrix.matrix) setMethod("as.DenseSimilarityMatrix", signature(s="Matrix"), as.DenseSimilarityMatrix.matrix) as.DenseSimilarityMatrix.sparseMatrix <- function(s, fill=-Inf) { if (nrow(s) != ncol(s)) stop("argument 's' must be quadratic similarity matrix") if (!is(s, "dgTMatrix")) { s <- try(as(as(s, "TsparseMatrix"), "dgTMatrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'dgTMatrix'") } N <- nrow(s) S <- matrix(fill, N, N) S[(s@i + 1) + N * s@j] <- s@x S } setMethod("as.DenseSimilarityMatrix", signature(s="sparseMatrix"), as.DenseSimilarityMatrix.sparseMatrix) apcluster/R/apclusterL-methods.R0000644000176200001440000002337314170223535016371 0ustar liggesusersapclusterL.matrix <- function(s, x, sel, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, nonoise=FALSE, seed=NA) { M <- ncol(s) N <- nrow(s) if (!is.na(seed)) set.seed(seed) if (!is.na(p[1]) && (!is.numeric(p) || !is.vector(p))) stop("'p' must be a number or vector") if (length(p) > 1) { if (length(p) < N) stop("vector 'p' is shorter than number of samples") else if (length(p) > N) p <- p[1:N] # truncate unnecessarily long p } if (any(is.na(p)) && !is.na(q) && !is.numeric(q)) stop("'q' must be a number") if (lam > 0.9) warning("large damping factor in use; the algorithm\n", "will change decisions slowly, so consider using\n", "a larger value of 'convits'.") # If argument p is not given, p is set to median of s if (any(is.na(p))) { ## workaround for overloaded accessor in 'kebabs' package if (is(s, "KernelMatrix")) { if (is.na(q)) p <- median(as.vector(s)[setdiff(which(s > -Inf), (1:M - 1) * N + sel)]) else p <- quantile(as.vector(s)[setdiff(which(s > -Inf), (1:M - 1) * N + sel)], q) } else { if (is.na(q)) p <- median(s[setdiff(which(s > -Inf), (1:M - 1) * N + sel)]) else p <- quantile(s[setdiff(which(s > -Inf), (1:M - 1) * N + sel)], q) } } attributes(p) <- NULL apresultObj <- new("APResult") # create the result object to be returned # store p into result object for future reference apresultObj@p <- p if (length(p) == 1) p <- rep(p, N) apresultObj@l <- N apresultObj@sel <- sel # In case user did not remove degeneracies from the input similarities, # avoid degenerate solutions by adding a small amount of noise to the # input similarities if (!nonoise) { randomMat <- matrix(rnorm(N * M), N, M) s <- s + (.Machine$double.eps * s + .Machine$double.xmin * 100) * randomMat } # Append preferences as additional column to s s <- cbind(s, p) # replace -Inf (for numerical stability) and NA with -realmax infelem <- which(s < -.Machine$double.xmax | is.na(s)) if (length(infelem) > 0) s[infelem] <- -.Machine$double.xmax infelem <- which(s > .Machine$double.xmax) if (length(infelem) > 0) stop("+Inf similarities detected: change to a large positive value,", " but smaller than ", .Machine$double.xmax) res <- .Call("apclusterLeveragedC", s, as.integer(sel - 1), as.integer(maxits), as.integer(convits), as.double(lam)) K <- res$K # convert cluster center indices to R i <- res$it if (K > 0) { i <- i + 1 I <- res$I[1:K] + 1 I <- I[I %in% sel] ee <- which(sel %in% I) K <- length(ee) if (K < 1) stop("internal error: no exemplars in selected samples") c <- rep(NA, N) c[I] <- 1:K nonI <- setdiff(1:N, I) c[nonI] <- sapply(nonI, function(ii) which.max(s[ii, ee])) c[is.na(c)] <- 0 # R inserts NAs by default, so replace them with 0s # to get the same result as the Matlab code # Refine the final set of exemplars and clusters and return results for (k in 1:K) { jj <- which(c == k) ii <- which(sel %in% jj) ns <- s[jj, M + 1] ind <- match(sel[ii], jj) ns[ind] <- colSums(s[jj, ii, drop=FALSE]) + s[sel[ii], M + 1] - diag(s[sel[ii], ii, drop=FALSE]) I[k] <- jj[ind[which.max(ns[ind])]] } I <- sort(I) if (length(rownames(s)) > 0) names(I) <- rownames(s)[I] nonI <- setdiff(1:N, I) ee <- which(sel %in% I) c <- rep(NA, N) c[I] <- 1:K nonI <- setdiff(1:N, I) c[nonI] <- sapply(nonI, function(ii) which.max(s[ii, ee])) c[is.na(c)] <- 0 # R inserts NAs by default, so replace them with 0s # to get the same result as the Matlab code tmpidx <- I[c] # Self similarities not relevant tmpdpsim <- sum(s[sub2ind(N, nonI, match(tmpidx[nonI], sel))]) tmpexpref <- sum(s[I, M + 1]) tmpnetsim <- tmpdpsim + tmpexpref apresultObj@exemplars <- I apresultObj@clusters <- list() for (c in 1:length(apresultObj@exemplars)) apresultObj@clusters[[c]] <- which(tmpidx == apresultObj@exemplars[c]) if (length(rownames(s)) == N) { names(apresultObj@exemplars) <- rownames(s)[apresultObj@exemplars] for (c in 1:length(apresultObj@exemplars)) names(apresultObj@clusters[[c]]) <- rownames(s)[apresultObj@clusters[[c]]] } } else { tmpidx <- rep(NaN, N) tmpnetsim <- NaN tmpdpsim <- NaN tmpexpref <- NaN apresultObj@exemplars <- numeric(0) apresultObj@clusters <- list() } apresultObj@netsim <- tmpnetsim apresultObj@dpsim <- tmpdpsim apresultObj@expref <- tmpexpref apresultObj@idx <- tmpidx apresultObj@it <- i if (res$unconv) warning("algorithm did not converge; turn on details\n", "and call plot() to monitor net similarity. Consider\n", "increasing 'maxits' and 'convits', and, ", "if oscillations occur,\n", "also increasing damping factor 'lam'.") apresultObj } setMethod("apclusterL", signature(s="matrix", x="missing"), function(s, x, sel, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, nonoise=FALSE, seed=NA) { M <- ncol(s) N <- nrow(s) if (M > N) stop("no. of columns of 's' may not be larger than ", "number of rows") if (!is.vector(sel) || !is.numeric(sel) || any(round(sel) != sel)) stop("'sel' must be a numeric vector of whole numbers") if (length(sel) != M) stop("vector 'sel' is shorter or longer than number of ", "selected samples") if (max(sel) > N || min(sel) < 1) stop("sample index in 'sel' must be between one and ", "number of samples") if (length(unique(sel)) != length(sel) || is.unsorted(sel)) stop("'sel' must be in strictly increasing order") apresultObj <- apclusterL.matrix(s=s, sel=sel, p=p, q=q, maxits=1000, convits=convits, lam=lam, nonoise=nonoise, seed=seed) apresultObj@call <- deparse(sys.call(-1)) if (includeSim) apresultObj@sim <- s apresultObj }) apclusterL.function <- function(s, x, frac, sweeps, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, nonoise=FALSE, seed=NA, ...) { if (frac <= 0 || frac > 1) stop("invalid fraction of samples specified") if (!is.na(seed)) set.seed(seed) if (is.data.frame(x)) x <- as.matrix(x[, sapply(x, is.numeric)]) if (is.matrix(x)) N <- nrow(x) else N <- length(x) if (N < 2) stop("cannot cluster less than 2 samples") nsel <- max(ceiling(N * frac), 2) sel <- sort(sample(1:N, nsel)) if (!is.function(s)) { if (!is.character(s) || !exists(s, mode="function")) stop("invalid distance function") s <- match.fun(s) } apresultObj <- new("APResult") # create the result object to be returned apresultObj@netsim <- -Inf netsimL <- rep(-Inf, sweeps) for (i in 1:sweeps) { sim <- s(x=x, sel=sel, ...) if (!is.matrix(sim) || nrow(sim) != N || ncol(sim) != length(sel)) stop("computation of similarity matrix failed") apres <- apclusterL.matrix(s=sim, sel=sel, p=p, q=q, maxits=maxits, convits=convits, lam=lam, nonoise=nonoise) netsimL[i] <- apres@netsim if (apres@netsim > apresultObj@netsim || apresultObj@netsim == -Inf) { apresultObj <- apres if (includeSim) apresultObj@sim <- sim else apresultObj@sim <- matrix(nrow=0, ncol=0) } sel <- sort(unique(apresultObj@idx)) ## CHECK!!! if (nsel - length(sel) > 0) ## CHECK!!! { otherSamples <- setdiff(1:N, sel) sel <- sort(c(sel, sample(otherSamples, nsel - length(sel)))) if (length(rownames(sim)) > 0) names(sel) <- rownames(sim)[sel] } else break } apresultObj@call <- deparse(sys.call(-1)) apresultObj@sweeps <- sweeps apresultObj@netsimLev <- netsimL apresultObj } setMethod("apclusterL", signature(s="function" , x="ANY"), apclusterL.function) setMethod("apclusterL", signature(s="character", x="ANY"), apclusterL.function) apcluster/R/preferenceRange-methods.R0000644000176200001440000000342314245406363017345 0ustar liggesuserspreferenceRange.matrix <- function(s, exact=FALSE) { if (ncol(s) != nrow(s)) stop("'s' must be a square matrix") diag(s) <- 0 if (length(which(s == -Inf)) > 0) warning("similarity matrix 's' contains -Inf similarities; ", "lower bound may not correspond to 1 or 2 clusters") .Call("preferenceRangeC", s, as.logical(exact)[1], PACKAGE="apcluster") } setMethod("preferenceRange", signature(s="matrix"), preferenceRange.matrix) preferenceRange.dgTMatrix <- function(s, exact=FALSE) { if (ncol(s) != nrow(s)) stop("'s' must be a square matrix") ## remove diagonal elements and -Inf from s remElem <- which(s@i == s@j | s@x == -Inf) if (length(remElem) > 0) { s@i <- s@i[-remElem] s@j <- s@j[-remElem] s@x <- s@x[-remElem] } .Call("preferenceRangeSparseC", s@i, s@j, s@x, nrow(s), as.logical(exact)[1], PACKAGE="apcluster") } setMethod("preferenceRange", signature(s="dgTMatrix"), preferenceRange.dgTMatrix) preferenceRange.otherSparse <- function(s, exact=FALSE) { s <- try(as(as(s, "TsparseMatrix"), "dgTMatrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'dgTMatrix'") preferenceRange.dgTMatrix(s=s, exact=exact) } setMethod("preferenceRange", signature(s="sparseMatrix"), preferenceRange.otherSparse) preferenceRange.otherDense <- function(s, exact=FALSE) { s <- try(as(s, "matrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'matrix'") preferenceRange.matrix(s=s, exact=exact) } setMethod("preferenceRange", signature(s="Matrix"), preferenceRange.otherDense) apcluster/R/plot-methods.R0000644000176200001440000002145114170223535015224 0ustar liggesusers# Plot graph(s) with objective values (works only if details were switched on) setMethod("plot", signature(x="APResult", y="missing"), function(x, y, type=c("netsim", "dpsim", "expref"), xlab="# Iterations", ylab="Similarity", ...) { if (length(x@netsimAll) <= 1) stop("no valid data was found for plotting; call apcluster() ", "with 'details=TRUE' in order to compute convergence details") plotnetsim <- FALSE plotexpref <- FALSE plotdpsim <- FALSE legtxt <- c() legcol <- c() ymin <- .Machine$double.xmax ymax <- -.Machine$double.xmax if (is.element("netsim", type)) { tmp <- x@netsimAll[which(!is.nan(x@netsimAll))] if (length(tmp) > 0) { ymin <- min(tmp, ymin, na.rm=TRUE) if (ymin == -Inf) ymin <- -.Machine$double.xmax ymax <- max(tmp, ymax, na.rm=TRUE) if (ymax == Inf) ymax <- .Machine$double.xmax plotnetsim <- TRUE legtxt <- c(legtxt, "Fitness (overall net similarity)") legcol <- c(legcol, "red") } } if (is.element("expref", type)) { tmp <- x@exprefAll[which(!is.nan(x@exprefAll))] if (length(tmp) > 0) { ymin <- min(tmp, ymin, na.rm=TRUE) if (ymin == -Inf) ymin <- -.Machine$double.xmax ymax <- max(tmp, ymax, na.rm=TRUE) if (ymax == Inf) ymax <- .Machine$double.xmax plotexpref <- TRUE legtxt <- c(legtxt, "Sum of exemplar preferences") legcol <- c(legcol, "green") } } if (is.element("dpsim", type)) { tmp <- x@dpsimAll[which(!is.nan(x@dpsimAll))] if (length(tmp) > 0) { ymin <- min(tmp, ymin, na.rm=TRUE) if (ymin == -Inf) ymin <- -.Machine$double.xmax ymax <- max(tmp, ymax, na.rm=TRUE) if (ymax == Inf) ymax <- .Machine$double.xmax plotdpsim <- TRUE legtxt <- c(legtxt, "Sum of similarities to exemplars") legcol <- c(legcol, "blue") } } if (length(legtxt) > 0) { plot(x=NULL, y=NULL, xlim=c(0, x@it + 1), ylim=c(ymin, ymax), xlab=xlab, ylab=ylab, ...) if (plotnetsim) lines(x@netsimAll, col="red") if (plotexpref) lines(x@exprefAll, col="green") if (plotdpsim) lines(x@dpsimAll, col="blue") legend(x="bottomright", legend=legtxt, col=legcol, lwd=1) } else stop("no valid data was found for plotting; call apcluster() ", "with 'details=TRUE' in order to compute convergence details") } ) setMethod("plot", signature(x="ExClust", y="matrix"), function(x, y, connect=TRUE, xlab="", ylab="", labels=NA, limitNo=15, ...) { if (x@l != nrow(y)) stop("size of clustering result does not fit to size of data set") if (ncol(y) < 2) stop("cannot plot 1D data set") if (ncol(y) == 2) { xlim <- c(min(y[,1]), max(y[,1])) ylim <- c(min(y[,2]), max(y[,2])) plot(x=NULL, y=NULL, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, ...) num <- length(x@exemplars) if (num <= 0) { warning("no exemplars defined in clustering result; plotting ", "data set as it is.") points(y, col="black", pch=19, cex=0.8) } else { cols <- rainbow(num)[labels(x, type="enum")] points(y, col=cols, pch=19, cex=0.8) if (connect) segments(x0=y[, 1], y0=y[, 2], x1=y[x@idx, 1, drop=FALSE], y1=y[x@idx, 2, drop=FALSE], col=cols) points(y[x@exemplars, , drop=FALSE], col="black", type="p", pch=22, cex=1.5) } } else { if (is.numeric(limitNo) && ncol(y) > limitNo) stop("cannot plot more than ", limitNo, " features at once") res <- x num <- length(res@exemplars) if (num <= 0) { warning("no exemplars defined in clustering result; plotting ", "data set as it is.") clustCol <- "black" connect <- FALSE } else clustCol <- rainbow(length(res@exemplars))[labels(x, type="enum")] clustPanel <- function(x, y, ...) { points(x, y, col=clustCol, pch=19, cex=0.8) if (connect) segments(x0=x, y0=y, x1=x[res@idx], y1=y[res@idx], col=clustCol) if (num > 0) points(x[res@exemplars], y[res@exemplars], col="black", type="p", pch=22, cex=1.5) } if (any(is.na(labels))) { yname <- deparse(substitute(y, env = parent.frame())) if (length(colnames(y)) > 0) labels <- colnames(y) else labels <- paste(yname, "[, ", 1:ncol(y), "]", sep="") } pairs(y, labels, lower.panel=clustPanel, upper.panel=clustPanel, ...) } } ) # Plot clustering result along with data set setMethod("plot", signature(x="ExClust", y="data.frame"), function(x, y, connect=TRUE, xlab="", ylab="", labels=NA, limitNo=15, ...) { sel <- which(sapply(y, is.numeric)) if (length(sel) < 2) stop("cannot plot 1D data set") if (any(is.na(labels))) { yname <- deparse(substitute(y, env = parent.frame())) if (length(colnames(y)) > 0) labels <- colnames(y)[sel] else labels <- paste(yname, "[, ", sel, "]", sep="") } plot(x, as.matrix(y[, sel, drop=FALSE]), connect, xlab, ylab, labels, limitNo=limitNo, ...) } ) # Plot clustering result setMethod("plot", signature(x="AggExResult", y="missing"), function(x, y, main="Cluster dendrogram", xlab="", ylab="", ticks=4, digits=2, base=0.05, showSamples=FALSE, horiz=FALSE, ...) { if (x@maxNoClusters < 2) stop("cannot plot dendrogram with less than 2 clusters") if (showSamples) dend <- as.dendrogram(x, base=base) else dend <- as.dendrogram(as.hclust(x, base=base)) plot(dend, axes=FALSE, xlab=xlab, ylab=ylab, main=main, horiz=horiz, ...) if (horiz) suppressWarnings( axis(side=1, at=seq(base, 1, length=ticks), tick=TRUE, labels=as.character(format(seq(max(x@height), min(x@height), length=ticks), digits=digits)), ...)) else suppressWarnings( axis(side=2, at=seq(base, 1, length=ticks), tick=TRUE, labels=as.character(format(seq(max(x@height), min(x@height), length=ticks), digits=digits)), ...)) return(invisible(dend)) } ) # Plot clustering result along with data set setMethod("plot", signature(x="AggExResult", y="matrix"), function(x, y, k=NA, h=NA, ...) { if (x@l != nrow(y)) stop("size of clustering result does not fit to size of data set") if (is.na(k) || !is.numeric(k) || k > x@maxNoClusters) k <- x@maxNoClusters if (k< 1) k <- 1 excl <- cutree(x, k, h) plot(excl, y, ...) return(invisible(excl)) } ) # Plot clustering result along with data set setMethod("plot", signature(x="AggExResult", y="data.frame"), function(x, y, k=NA, h=NA, ...) { y <- as.matrix(y[, sapply(y, is.numeric)]) plot(x, y, k=k, h=h, ...) } ) apcluster/R/coerce-methods.R0000644000176200001440000001404714170223535015511 0ustar liggesuserssetMethod("as.hclust", signature("AggExResult"), function(x, base=0.05) { if (x@maxNoClusters < 2) stop("cannot create 'hclust' object with less than 2 objects") if (base < 0 || base >= 1) stop("'base' must be at least 0 and smaller than 1") mini <- min(x@height) maxi <- max(x@height) auxH <- x@height <- base + (1 - base) * (-x@height + maxi) / (maxi - mini) to <- list(merge=x@merge, height=auxH, labels=x@labels, order=x@order) class(to) <- "hclust" to }) setMethod("as.hclust", signature("ExClust"), function(x, base=0.05, ...) { if (all(dim(x@sim) <= 1)) stop("similarity matrix not included in object") as.hclust(aggExCluster(x@sim, x, ...)) }) setMethod("as.dendrogram", signature("AggExResult"), function(object, base=0.05, useNames=TRUE) { if (object@maxNoClusters < 2) stop("cannot create 'dendrogram' object with less than 2 objects") if (base < 0 || base >= 1) stop("'base' must be at least 0 and smaller than 1") obj <- as.hclust(object, base=base) z <- list() oHgt <- obj$height hMax <- oHgt[object@maxNoClusters] topLevel <- object@clusters[[object@maxNoClusters]] if (length(names(object@exemplars[[object@maxNoClusters]])) == 0 || !useNames) topLevel <- lapply(object@clusters[[object@maxNoClusters]], as.character) else topLevel <- lapply(object@clusters[[object@maxNoClusters]], names) for (k in 1:length(obj$height)) { x <- obj$merge[k, ] if (x[1] < 0) { if (length(topLevel[[-x[1]]]) == 1) { leftDend <- topLevel[[-x[1]]] attr(leftDend, "label") <- topLevel[[-x[1]]] attr(leftDend, "members") <- 1 attr(leftDend, "midpoint") <- 0 attr(leftDend, "height") <- 0 attr(leftDend, "leaf") <- TRUE } else { leftDend <- lapply(topLevel[[-x[1]]], function(elem) { attr(elem, "label") <- elem attr(elem, "members") <- 1 attr(elem, "height") <- 0 attr(elem, "leaf") <- TRUE elem }) attr(leftDend, "members") <- length(topLevel[[-x[1]]]) attr(leftDend, "height") <- base / 2 attr(leftDend, "midpoint") <- (length(topLevel[[-x[1]]]) - 1) / 2 } } else leftDend <- z[[as.character(x[1])]] if (x[2] < 0) { if (length(topLevel[[-x[2]]]) == 1) { rightDend <- topLevel[[-x[2]]] attr(rightDend, "label") <- topLevel[[-x[2]]] attr(rightDend, "members") <- 1 attr(rightDend, "midpoint") <- 0 attr(rightDend, "height") <- 0 attr(rightDend, "leaf") <- TRUE } else { rightDend <- lapply(topLevel[[-x[2]]], function(elem) { attr(elem, "label") <- elem attr(elem, "members") <- 1 attr(elem, "height") <- 0 attr(elem, "leaf") <- TRUE elem }) attr(rightDend, "members") <- length(topLevel[[-x[2]]]) attr(rightDend, "height") <- base / 2 attr(rightDend, "midpoint") <- (length(topLevel[[-x[2]]]) - 1) / 2 } } else rightDend <- z[[as.character(x[2])]] zk <- list(leftDend, rightDend) attr(zk, "height") <- obj$height[k] attr(zk, "members") <- attr(leftDend, "members") + attr(rightDend, "members") attr(zk, "midpoint") <- (attr(leftDend, "members") + attr(leftDend, "midpoint") + attr(rightDend, "midpoint")) / 2 z[[as.character(k)]] <- zk } z <- z[[as.character(k)]] class(z) <- "dendrogram" z }) setMethod("as.dendrogram", signature("ExClust"), function(object, base=0.05, useNames=TRUE, ...) { if (all(dim(object@sim) <= 1)) stop("similarity matrix not included in object") as.dendrogram(aggExCluster(object@sim, object, ...), base=base, useNames=useNames) }) apcluster/R/aggExCluster-methods.R0000644000176200001440000001417014170223535016643 0ustar liggesusersaggExCluster.matrix <- function(s, x, includeSim=FALSE) { noPriorClustering <- (missing(x) || is.null(x)) if (length(dim(s)) != 2 || (ncol(s) != nrow(s) && noPriorClustering)) stop("'s' must be a square matrix") AggResultObj <- new("AggExResult") K <- nrow(s) AggResultObj@l <- K preserveNames <- (length(rownames(s)) == nrow(s)) if (noPriorClustering) ## no prior clustering { AggResultObj@maxNoClusters <- K AggResultObj@clusters[[K]] <- as.list(1:K) AggResultObj@exemplars[[K]] <- 1:K if (preserveNames) { AggResultObj@labels <- rownames(s) names(AggResultObj@exemplars[[K]]) <- rownames(s) for (i in 1:K) names(AggResultObj@clusters[[K]][[i]]) <- rownames(s)[i] } else AggResultObj@labels <- as.character(1:K) } else ## prior clustering { if (x@l != nrow(s)) stop("data set sizes of 's' and 'x' do not match") AggResultObj@sel <- x@sel K <- length(x@exemplars) if (K < 1) stop("'x' empty or corrupted") AggResultObj@maxNoClusters <- K AggResultObj@clusters[[K]] <- x@clusters AggResultObj@exemplars[[K]] <- x@exemplars AggResultObj@labels <- paste("Cluster", 1:K) } if (K < 2) { warning("there is nothing to cluster") return(invisible(AggResultObj)) } objMat <- matrix(NA, K, K) ## matrix of objective values for pairs exeMat <- matrix(NA, K, K) ## matrix of joint exemplars ## note: only the upper triangle of these matrices is non-NA actClust <- AggResultObj@clusters[[K]] actExem <- AggResultObj@exemplars[[K]] actLabels <- -(1:K) AggResultObj@merge <- matrix(NA, K - 1, 2) AggResultObj@height <- rep(0, K - 1) res <- .Call("aggExClusterC", s, K, actClust, actExem, objMat, exeMat, actLabels, AggResultObj@sel, AggResultObj@clusters, AggResultObj@exemplars, AggResultObj@merge, AggResultObj@height, as.logical(preserveNames)[1]) if (is.element("error", names(res))) { if (res$error == 1) { stop("clusters cannot be joined because of missing ", "similarity values;\n maybe increasing the ", "cluster size through decreasing\n", " the self similarity 'p' helps.") } else if (res$error == 2) { stop("clusters cannot be joined because of missing ", "similarity values") } } exeMat <- res$exeMat objMat <- res$objMat AggResultObj@merge <- res$merge AggResultObj@height <- res$height AggResultObj@clusters <- res$clusters if (length(AggResultObj@sel) > 0) { colInd <- res$colInd } ## finally, determine reordering for dendrogram plotting AggResultObj@order <- determineOrder(AggResultObj@merge, AggResultObj@height, K - 1) AggResultObj@call <- deparse(sys.call(-1)) if (includeSim) AggResultObj@sim <- s AggResultObj } setMethod("aggExCluster", signature("matrix", "missing" ), aggExCluster.matrix) setMethod("aggExCluster", signature("matrix", "ExClust" ), aggExCluster.matrix) aggExCluster.Matrix <- function(s, x, includeSim=FALSE) { if (is(s, "sparseMatrix")) { s <- as.SparseSimilarityMatrix(s) rng <- range(s@x) fill <- 2 * rng[1] - rng[2] s <- as.DenseSimilarityMatrix(s, fill=fill) } else s <- as.DenseSimilarityMatrix(s) if (missing(x)) res <- aggExCluster(s, includeSim=includeSim) else res <- aggExCluster(s, x, includeSim=includeSim) res } setMethod("aggExCluster", signature("Matrix", "missing" ), aggExCluster.Matrix) setMethod("aggExCluster", signature("Matrix", "ExClust" ), aggExCluster.Matrix) aggExCluster.Clust <- function(s, x, includeSim=TRUE) { if (all(dim(x@sim) <= 1)) stop("similarity matrix not included in object") AggResultObj <- aggExCluster(x@sim, x) AggResultObj@call <- deparse(sys.call(-1)) if (includeSim) AggResultObj@sim <- x@sim AggResultObj } setMethod("aggExCluster", signature("missing" , "ExClust" ), aggExCluster.Clust) aggExCluster.function <- function(s, x, includeSim=TRUE, ...) { if (is.data.frame(x)) x <- as.matrix(x[, sapply(x, is.numeric)]) if (is.matrix(x)) N <- nrow(x) else N <- length(x) if (N < 2) stop("cannot cluster less than 2 samples") if (!is.function(s)) { if (!is.character(s) || !exists(s, mode="function")) stop("invalid distance function") s <- match.fun(s) } sim <- s(x=x, ...) if (!is.matrix(sim) || (nrow(sim) != N) || ncol(sim) != N) stop("computation of similarity matrix failed") AggResultObj <- aggExCluster(sim) AggResultObj@call <- deparse(sys.call(-1)) if (includeSim) AggResultObj@sim <- sim AggResultObj } setMethod("aggExCluster", signature("function" , "ANY"), aggExCluster.function) setMethod("aggExCluster", signature("character", "ANY"), aggExCluster.function) ## auxiliary function for determining the order for dendrogram plotting ## fills up order recursively starting from the last merge determineOrder <- function(merge, height, k) { I <- merge[k, 1] ## I and J are the clusters merged in the k-th step J <- merge[k, 2] if (I < 0 && J < 0) ## if both are singletons, list I first return(c(-I, -J)) else if (I < 0) ## if I is a singleton and J is not, list it first return(c(-I, determineOrder(merge, height, J))) else if (J < 0) ## if J is a singleton and I is not, list it first return(c(-J, determineOrder(merge, height, I))) else ## if both are non-singleton clusters, list the "tighter" cluster { ## on the left-hand side (see ?hclust) if (height[I] > height[J]) return(c(determineOrder(merge, height, I), determineOrder(merge, height, J))) else return(c(determineOrder(merge, height, J), determineOrder(merge, height, I))) } } apcluster/R/labels-methods.R0000644000176200001440000000137714170223535015515 0ustar liggesusers# convert clustering result to label vector setMethod("labels", signature(object="ExClust"), function(object, type="names") { if (type == "names") { if (length(names(object@idx)) == 0) stop("no names available, use other type") else out <- names(object@idx) } else if (type == "exemplars") out <- object@idx else if (type == "enum") { out <- array(dim=object@l) for (i in 1:length(object@exemplars)) out[which(object@idx == object@exemplars[i])] <- i } else stop("type '", type, "' unknown") attributes(out) <- NULL out } ) apcluster/R/show-methods.R0000644000176200001440000001037514170223535015231 0ustar liggesusers# Display clustering results setMethod("show", signature(object="APResult"), function(object) { cat("\nAPResult object\n") if (!is.finite(object@l) || !is.finite(object@it)) stop("object is not result of an affinity propagation run; ", "it is pointless to create 'APResult' objects yourself.") cat("\nNumber of samples = ", object@l, "\n") if (length(object@sel) > 0) { cat("Number of sel samples = ", length(object@sel), paste(" (", round(100*length(object@sel)/object@l,1), "%)\n", sep="")) cat("Number of sweeps = ", object@sweeps, "\n") } cat("Number of iterations = ", object@it, "\n") cat("Input preference = ", object@p, "\n") cat("Sum of similarities = ", object@dpsim, "\n") cat("Sum of preferences = ", object@expref, "\n") cat("Net similarity = ", object@netsim, "\n") cat("Number of clusters = ", length(object@exemplars), "\n\n") if (length(object@exemplars) > 0) { if (length(names(object@exemplars)) == 0) { cat("Exemplars:\n") cat(object@exemplars, fill=TRUE, labels=" ") cat("Clusters:\n") for (i in 1:length(object@exemplars)) { cat(" Cluster ", i, ", exemplar ", object@exemplars[i], ":\n", sep="") cat(object@clusters[[i]], fill=TRUE, labels=" ") } } else { cat("Exemplars:\n") cat(names(object@exemplars), fill=TRUE, labels=" ") cat("Clusters:\n") for (i in 1:length(object@exemplars)) { cat(" Cluster ", i, ", exemplar ", names(object@exemplars[i]), ":\n", sep="") cat(names(object@clusters[[i]]), fill=TRUE, labels=" ") } } } else { cat("No clusters identified.\n") } } ) setMethod("show", signature(object="ExClust"), function(object) { cat("\nExClust object\n") if (!is.finite(object@l)) stop("object is not result of an exemplar-based clustering; ", "it is pointless to create 'ExClust' objects yourself.") cat("\nNumber of samples = ", object@l, "\n") cat("Number of clusters = ", length(object@exemplars), "\n\n") if (length(object@exemplars) > 0) { if (length(names(object@exemplars)) == 0) { cat("Exemplars:\n") cat(object@exemplars, fill=TRUE, labels=" ") cat("Clusters:\n") for (i in 1:length(object@exemplars)) { cat(" Cluster ", i, ", exemplar ", object@exemplars[i], ":\n", sep="") cat(object@clusters[[i]], fill=TRUE, labels=" ") } } else { cat("Exemplars:\n") cat(names(object@exemplars), fill=TRUE, labels=" ") cat("Clusters:\n") for (i in 1:length(object@exemplars)) { cat(" Cluster ", i, ", exemplar ", names(object@exemplars[i]), ":\n", sep="") cat(names(object@clusters[[i]]), fill=TRUE, labels=" ") } } } else { cat("No clusters identified.\n") } } ) setMethod("show", signature(object="AggExResult"), function(object) { cat("\nAggExResult object\n") if (!is.finite(object@l) || !is.finite(object@maxNoClusters)) stop("object is not result of agglomerative clustering; ", "it is pointless to create 'AggExResult' objects yourself.") cat("\nNumber of samples = ", object@l, "\n") cat("Maximum number of clusters = ", object@maxNoClusters, "\n") } ) apcluster/R/apcluster-methods.R0000644000176200001440000003136714502301101016240 0ustar liggesusersapcluster.matrix <- function(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA) { if (!is.na(seed)) set.seed(seed) apresultObj <- new("APResult") # create the result object to be returned apresultObj@call <- deparse(sys.call(-1)) # # check input data # if (!is.na(p[1]) && (!is.numeric(p) || !is.vector(p))) stop("'p' must be a number or vector") if (length(dim(s)) != 2 || ncol(s) != nrow(s)) stop("'s' must be a square matrix") N <- nrow(s) if (length(p) > 1) { if (length(p) < N) stop("vector 'p' is shorter than number of samples") else if (length(p) > N) p <- p[1:N] # truncate unnecessarily long p } if (any(is.na(p)) && !is.na(q) && !is.numeric(q)) stop("'q' must be a number") if (lam > 0.9) warning("large damping factor in use; turn on details\n", "and call plot() to monitor net similarity. The\n", "algorithm will change decisions slowly, so consider using\n", "a larger value of 'convits'.") # If argument p is not given, p is set to median of s if (any(is.na(p))) { if (is(s, "KernelMatrix")) { if (is.na(q)) p <- median(as.vector(s)[setdiff(which(s > -Inf), 0:(N - 1) * N + 1:N)]) else p <- quantile(as.vector(s)[setdiff(which(s > -Inf), 0:(N - 1) * N + 1:N)], q) } else { if (is.na(q)) p <- median(s[setdiff(which(s > -Inf), 0:(N - 1) * N + 1:N)]) else p <- quantile(s[setdiff(which(s > -Inf), 0:(N - 1) * N + 1:N)], q) } } apresultObj@l <- N # In case user did not remove degeneracies from the input similarities, # avoid degenerate solutions by adding a small amount of noise to the # input similarities if (!nonoise) { randomMat <- matrix(rnorm(N * N),N) s <- s + (.Machine$double.eps * s + .Machine$double.xmin * 100) * randomMat } attributes(p) <- NULL # Place preferences on the diagonal of s (recycled if p is scalar) diag(s) <- p # store p into result object for future reference apresultObj@p <- p # replace -Inf (for numerical stability) and NA with -realmax infelem <- which(s < -.Machine$double.xmax | is.na(s)) if (length(infelem) > 0) s[infelem] <- -.Machine$double.xmax infelem <- which(s > .Machine$double.xmax) if (length(infelem) > 0) stop("+Inf similarities detected: change to a large positive value,", " but smaller than ", .Machine$double.xmax) res <- .Call("apclusterC", s, as.integer(maxits), as.integer(convits), as.double(lam), as.logical(details), PACKAGE="apcluster") K <- res$K I <- res$I[1:K] + 1 i <- res$it if (details) { apresultObj@idxAll <- res$idxAll[,1:i] + 1 apresultObj@netsimAll <- res$netsimAll[1:i] apresultObj@dpsimAll <- res$dpsimAll[1:i] apresultObj@exprefAll <- res$exprefAll[1:i] } if (K > 0) { i <- i + 1 c <- max.col(s[, I], ties.method="first") c[I] <- 1:K # Identify clusters c[is.na(c)] <- 0 # R inserts NAs by default, so replace them with 0s # to get the same result as the Matlab code # Refine the final set of exemplars and clusters and return results for (k in 1:K) { ii <- which(c == k) I[k] <- ii[which.max(colSums(s[ii, ii, drop=FALSE]))] } names(I) <- colnames(s)[I] notI <- matrix(sort(setdiff(1:N, I)), ncol=1) c <- max.col(s[, I], ties.method="first") c[I] <- 1:K tmpidx <- I[c] tmpdpsim <- sum(s[sub2ind(N, notI, tmpidx[notI])]) tmpexpref <- sum(diag(s)[I]) tmpnetsim <- tmpdpsim + tmpexpref apresultObj@exemplars <- as.numeric(levels(factor(tmpidx))) apresultObj@clusters <- list() for (c in 1:length(apresultObj@exemplars)) apresultObj@clusters[[c]] <- which(tmpidx == apresultObj@exemplars[c]) if (length(colnames(s)) == N) { names(apresultObj@exemplars) <- colnames(s)[apresultObj@exemplars] for (c in 1:length(apresultObj@exemplars)) names(apresultObj@clusters[[c]]) <- colnames(s)[apresultObj@clusters[[c]]] } } else { tmpidx <- rep(NaN, N) tmpnetsim <- NaN tmpdpsim <- NaN tmpexpref <- NaN apresultObj@exemplars <- numeric(0) apresultObj@clusters <- list() } apresultObj@netsim <- tmpnetsim apresultObj@dpsim <- tmpdpsim apresultObj@expref <- tmpexpref apresultObj@idx <- tmpidx apresultObj@it <- i if (details) { apresultObj@netsimAll <- c(apresultObj@netsimAll, tmpnetsim) apresultObj@dpsimAll <- c(apresultObj@dpsimAll, tmpdpsim) apresultObj@exprefAll <- c(apresultObj@exprefAll, tmpexpref) apresultObj@idxAll <- cbind(apresultObj@idxAll, tmpidx) } if (res$unconv) warning("algorithm did not converge; turn on details\n", "and call plot() to monitor net similarity. Consider\n", "increasing 'maxits' and 'convits', and, ", "if oscillations occur\n", "also increasing damping factor 'lam'.") if (includeSim) apresultObj@sim <- s apresultObj } setMethod("apcluster", signature(s="matrix", x="missing"), apcluster.matrix) apcluster.function <- function(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, details=FALSE, nonoise=FALSE, seed=NA, ...) { if (!is.na(seed)) set.seed(seed) if (is.data.frame(x)) x <- as.matrix(x[, sapply(x, is.numeric)]) if (is.matrix(x)) N <- nrow(x) else N <- length(x) if (N < 2) stop("cannot cluster less than 2 samples") if (!is.function(s)) { if (!is.character(s) || !exists(s, mode="function")) stop("invalid distance function") s <- match.fun(s) } sim <- s(x=x, ...) if (!is(sim, "AnyMatrix") || (nrow(sim) != N) || ncol(sim) != N) stop("computation of similarity matrix failed") apres <- apcluster(s=sim, p=p, q=q, maxits=maxits, convits=convits, lam=lam, details=details, nonoise=nonoise) apres@call <- deparse(sys.call(-1)) if (includeSim) apres@sim <- sim apres } setMethod("apcluster", signature(s="function", x="ANY"), apcluster.function) setMethod("apcluster", signature(s="character", x="ANY"), apcluster.function) apcluster.dgTMatrix <- function(s, x, p=NA, q=NA, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA) { if (!is.na(seed)) set.seed(seed) apresultObj <- new("APResult") # create the result object to be returned apresultObj@call <- deparse(sys.call(-1)) # check input data if (!is.na(p[1]) && (!is.numeric(p) || !is.vector(p))) stop("'p' must be a number or vector") if (length(dim(s)) != 2 || ncol(s) != nrow(s)) stop("'s' must be a square matrix") N <- nrow(s) if (length(p) > 1) { if (length(p) < N) stop("vector 'p' is shorter than number of samples") else if (length(p) > N) p <- p[1:N] # truncate unnecessarily long p } if (any(is.na(p)) && !is.na(q) && !is.numeric(q)) stop("'q' must be a number") if (lam > 0.9) warning("large damping factor in use; turn on details\n", "and call plot() to monitor net similarity. The\n", "algorithm will change decisions slowly, so consider using\n", "a larger value of 'convits'.") ## remove diagonal elements and -Inf from s remElem <- which(s@i == s@j | s@x == -Inf) if (length(remElem) > 0) { s@i <- s@i[-remElem] s@j <- s@j[-remElem] s@x <- s@x[-remElem] } # if argument p is not given, p is set to median of s if (any(is.na(p))) { if (is.na(q)) p <- median(s@x) else p <- quantile(s@x, q) } apresultObj@l <- N apresultObj@p <- p infelem <- which(s@x < -.Machine$double.xmax | is.na(s@x)) if (length(infelem) > 0) s@x[infelem] <- -.Machine$double.xmax infelem <- which(s@x > .Machine$double.xmax) if (length(infelem) > 0) stop("+Inf similarities detected: change to a large positive value,", " but smaller than ", .Machine$double.xmax) if (!nonoise) ## noise added to the vector with similarity { randomVec <- rnorm(length(s@x)) s@x <- s@x + (.Machine$double.eps * s@x + .Machine$double.xmin * 100) * randomVec } if (length(p) == 1) p <- rep(p, N) ## add preferences as diagonal elements si <- c(s@i, 0:(N - 1)) sj <- c(s@j, 0:(N - 1)) sx <- c(s@x, p) res <- .Call("apclusterSparseC", as.integer(si), as.integer(sj), as.double(sx), as.integer(maxits), as.integer(convits), as.double(lam), as.integer(N), as.logical(details)) K <- res$K I <- res$I[1:K] + 1 i <- res$it + 2 if (details) { apresultObj@idxAll <- res$idxAll[,1:i] + 1 apresultObj@netsimAll <- res$netsimAll[1:i] apresultObj@dpsimAll <- res$dpsimAll[1:i] apresultObj@exprefAll <- res$exprefAll[1:i] } if (K > 0) { tmpidx <- res$tmpidx + 1 tmpdpsim <- res$tmpdpsim tmpexpref <- res$tmpexpref tmpnetsim <- res$tmpnetsim apresultObj@exemplars <- I apresultObj@clusters <- list() names(I) <- colnames(s)[I] for (c in 1:length(apresultObj@exemplars)) apresultObj@clusters[[c]] <- which(tmpidx == apresultObj@exemplars[c]) if (length(colnames(s)) == N) { names(apresultObj@exemplars) <- colnames(s)[apresultObj@exemplars] for (c in 1:length(apresultObj@exemplars)) names(apresultObj@clusters[[c]]) <- colnames(s)[apresultObj@clusters[[c]]] } } else { tmpidx <- rep(NaN, N) tmpnetsim <- NaN tmpdpsim <- NaN tmpexpref <- NaN apresultObj@exemplars <- numeric(0) apresultObj@clusters <- list() } apresultObj@netsim <- tmpnetsim apresultObj@dpsim <- tmpdpsim apresultObj@expref <- tmpexpref apresultObj@idx <- tmpidx apresultObj@it <- i if (res$unconv) warning("algorithm did not converge; turn on details\n", "and call plot() to monitor net similarity. Consider\n", "increasing 'maxits' and 'convits', and, ", "if oscillations occur\n", "also increasing damping factor 'lam'.") if (includeSim) apresultObj@sim <- s apresultObj } setMethod("apcluster", signature(s="dgTMatrix", x="missing"), apcluster.dgTMatrix) apcluster.otherSparse <- function(s, x, ...) { s <- try(as(as(s, "TsparseMatrix"), "dgTMatrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'dgTMatrix'") apcluster.dgTMatrix(s=s, ...) } setMethod("apcluster", signature(s="sparseMatrix", x="missing"), apcluster.otherSparse) apcluster.otherDense <- function(s, x, ...) { s <- try(as(s, "matrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'matrix'") apcluster.matrix(s=s, ...) } setMethod("apcluster", signature(s="Matrix", x="missing"), apcluster.otherDense) # Linear index from multiple subscripts. # sub2ind is used to determine the equivalent single index # corresponding to a given set of subscript values. sub2ind <- function(N, I, J) (I + (N * (J - 1))) apcluster/R/length-methods.R0000644000176200001440000000035214170223535015524 0ustar liggesuserssetMethod("length", signature(x="APResult"), function(x) length(x@exemplars)) setMethod("length", signature(x="AggExResult"), function(x) x@maxNoClusters) setMethod("length", signature(x="ExClust"), function(x) length(x@exemplars)) apcluster/R/cutree-methods.R0000644000176200001440000000401314170223535015530 0ustar liggesuserssetMethod("cutree", signature(tree="AggExResult", k="ANY", h="ANY"), function(tree, k, h) { outObj <- new("ExClust") if (!missing(k)) { if (!is.finite(k) || floor(k) != ceiling(k)) stop("'k' is not an integer number") else if (k < 1) stop("'k' smaller than 1 does not make sense") else if (k > tree@maxNoClusters) stop("'k' exceeds maximum number of clusters") } else if (!missing(h)) { if (!is.finite(h)) stop("'h' must be numeric") else if (h < min(tree@height) || h > max(tree@height)) stop("'h' exceeds range of values in 'AggExResult' object", "\nthe range is from ", max(tree@height), " (=> 1 cluster) to ", min(tree@height), " (=> ", tree@maxNoClusters, "clusters)") else k <- max(which(tree@height >= h)) } else if (missing(k)) stop("provide either 'k' or 'h'") outObj@l <- tree@l outObj@exemplars <- tree@exemplars[[k]] outObj@clusters <- tree@clusters[[k]] outObj@idx <- rep(0, outObj@l) for (i in 1:length(outObj@clusters)) { outObj@idx[outObj@clusters[[i]]] <- outObj@exemplars[i] if (length(names(outObj@clusters[[i]])) > 0) names(outObj@idx)[outObj@clusters[[i]]] <- names(outObj@exemplars)[i] } outObj@sim <- tree@sim outObj@call <- tree@call outObj } ) setMethod("cutree", signature(tree="APResult", k="ANY", h="ANY"), function(tree, k, h) { outObj <- new("ExClust") outObj@l <- tree@l outObj@exemplars <- tree@exemplars outObj@clusters <- tree@clusters outObj@idx <- tree@idx outObj@sim <- tree@sim outObj@call <- tree@call outObj } ) apcluster/R/apclusterK-methods.R0000644000176200001440000001353014502301101016343 0ustar liggesusersapclusterK.matrixOrDgT <- function(s, x, K, prc=10, bimaxit=20, exact=FALSE, maxits=1000, convits=100, lam=0.9, includeSim=FALSE, details=FALSE, nonoise=FALSE, seed=NA, verbose=TRUE) { if (!is.na(seed)) set.seed(seed) # # check input data # if (length(dim(s)) != 2 || ncol(s) != nrow(s)) stop("'s' must be a square matrix") N <- nrow(s) if (K < 2 || K >= N) stop("number of data samples is ", N, ".\n", "\tmeaningful range for K: 2 to ", N - 1) pminmax <- preferenceRange(s, exact) lopref <- pminmax[1] hipref <- pminmax[2] lok <- 1 hik <- N if (is.na(lopref) || is.nan(lopref) || is.infinite(lopref)) stop("could not determine lower bound for preference") else if (lopref >= hipref) stop("preferenceRange() yielded invalid result: lower bound larger ", "than upper bound") # In case user did not remove degeneracies from the input similarities, # avoid degenerate solutions by adding a small amount of noise to the # input similarities; we do this here before running apcluster() in order # to have deterministic behavior during bisection if (!nonoise) { if (is(s, "matrix")) s <- s + ((.Machine$double.eps * s + .Machine$double.xmin * 100) * matrix(rnorm(N * N), N, N)) else if (is(s, "dgTMatrix")) s@x <- s@x + ((.Machine$double.eps * s@x + .Machine$double.xmin * 100) * rnorm(length(s@x))) } # try to guess better lower bound before starting with bisection ex <- -3 dn <- FALSE while (!dn) { tmppref <- hipref - 10^ex * (hipref - lopref) if (verbose) cat("Trying p =", tmppref, "\n") apresultObj <- apcluster(s, p=tmppref, nonoise=TRUE) tmpk <- length(apresultObj) if (verbose) cat(" Number of clusters:", tmpk, "\n"); if (tmpk < K && tmpk > 0) { lok <- tmpk lopref <- tmppref dn <- TRUE } else if (ex == -1) dn <- TRUE else ex <- ex + 1 } # now do bisection (if still necessary) ntries <- 0 while ((abs(tmpk - K) * 100 / K) > prc && ntries < bimaxit) { ntries <- ntries + 1 tmppref <- (lopref + hipref) / 2 if (verbose) cat("Trying p =", tmppref, "(bisection step no.", ntries, ")\n") apresultObj <- apcluster(s, p=tmppref, nonoise=TRUE, maxits=maxits, convits=convits, lam=lam, details=details) tmpk <- length(apresultObj@exemplars) if (verbose) cat(" Number of clusters:", tmpk, "\n"); if (K > tmpk) { lopref <- tmppref lok <- tmpk } else { hipref <- tmppref hik <- tmpk } } if (verbose) cat("\nNumber of clusters:", tmpk, "for p =", tmppref, "\n") if ((abs(tmpk - K) * 100 / K) > prc) warning("number of clusters not in desired range; Increase 'bimaxit'", " to improve accuracy of bisection.") apresultObj@call <- deparse(sys.call(-1)) if (includeSim) apresultObj@sim <- s apresultObj } setMethod("apclusterK", signature(s="matrix", x="missing"), apclusterK.matrixOrDgT) setMethod("apclusterK", signature(s="dgTMatrix", x="missing"), apclusterK.matrixOrDgT) apclusterK.otherSparse <- function(s, x, K, ...) { s <- try(as(as(s, "TsparseMatrix"), "dgTMatrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'dgTMatrix'") apclusterK.matrixOrDgT(s=s, K=K, ...) } setMethod("apclusterK", signature(s="sparseMatrix", x="missing"), apclusterK.otherSparse) apclusterK.otherDense <- function(s, x, K, ...) { s <- try(as(s, "matrix")) if (is(s, "try-error")) stop("cannot cast 's' (class '", class(s), "') to class 'matrix'") apclusterK.matrixOrDgT(s=s, K=K, ...) } setMethod("apclusterK", signature(s="Matrix", x="missing"), apclusterK.otherDense) apclusterK.function <- function(s, x, K, prc=10, bimaxit=20, exact=FALSE, maxits=1000, convits=100, lam=0.9, includeSim=TRUE, details=FALSE, nonoise=FALSE, seed=NA, verbose=TRUE, ...) { if (!is.na(seed)) set.seed(seed) if (is.data.frame(x)) x <- as.matrix(x[, sapply(x, is.numeric)]) if (is.matrix(x)) N <- nrow(x) else N <- length(x) if (N < 2) stop("cannot cluster less than 2 samples") if (!is.function(s)) { if (!is.character(s) || !exists(s, mode="function")) stop("invalid distance function") s <- match.fun(s) } sim <- s(x=x, ...) if (!is(sim, "AnyMatrix") || (nrow(sim) != N) || ncol(sim) != N) stop("computation of similarity matrix failed") apres <- apclusterK(s=sim, K=K, prc=prc, bimaxit=bimaxit, exact=exact, maxits=maxits, convits=convits, lam=lam, includeSim=FALSE, details=details, nonoise=nonoise, verbose=verbose) apres@call <- deparse(sys.call(-1)) if (includeSim) apres@sim <- sim apres } setMethod("apclusterK", signature(s="function" , x="ANY"), apclusterK.function) setMethod("apclusterK", signature(s="character", x="ANY"), apclusterK.function) apcluster/R/sort-methods.R0000644000176200001440000000200414170223535015226 0ustar liggesuserssort.ExClust <- function(x, decreasing=FALSE, sortBy=c("aggExCluster", "size", "nameExemplar", "noExemplar"), ...) { sortBy <- match.arg(sortBy) if (sortBy == "aggExCluster") { if (all(dim(x@sim) <= 1)) stop("cannot sort by agglomerative clustering\n", "because similarity matrix not included in object") else perm <- aggExCluster(x=x)@order } else if (sortBy == "size") perm <- order(sapply(x@clusters, length)) else if (sortBy == "nameExemplar") { if (length(names(x@exemplars)) > 0) perm <- order(x@exemplars) else stop("no names available for exemplars") } else if (sortBy == "noExemplar") perm <- order(x@exemplars) if (decreasing) perm <- rev(perm) x@exemplars <- x@exemplars[perm] x@clusters <- x@clusters[perm] x } #setMethod("sort", signature("ExClust"), sort.ExClust, sealed=TRUE) apcluster/R/access-methods.R0000644000176200001440000000210514170223535015502 0ustar liggesuserssetMethod("[", signature(x="APResult", i="index", j="missing", drop="missing"), function(x, i, j, drop=FALSE) { x@clusters[i] }) setMethod("[[", signature(x="APResult", i="index", j="missing"), function(x, i, j) { x@clusters[[i]] }) setMethod("[", signature(x="ExClust", i="index", j="missing", drop="missing"), function(x, i, j, drop=FALSE) { x@clusters[i] }) setMethod("[[", signature(x="ExClust", i="index", j="missing"), function(x, i, j) { x@clusters[[i]] }) setMethod("[", signature(x="AggExResult", i="index", j="missing", drop="missing"), function(x, i, j, drop=FALSE) { lapply(i, function(index) cutree(x, k=index)) }) setMethod("[[", signature(x="AggExResult", i="index", j="missing"), function(x, i, j) { cutree(x, k=i) }) setMethod("similarity", signature(x="APResult"), function(x) x@sim) setMethod("similarity", signature(x="AggExResult"), function(x) x@sim) setMethod("similarity", signature(x="ExClust"), function(x) x@sim) apcluster/R/apclusterDemo.R0000644000176200001440000000110414170223535015405 0ustar liggesusersapclusterDemo <- function(l=100, d=2, seed=NA, ...) { if (!is.na(seed)) set.seed(seed) if (round(l) != l || l < 2) stop("'l' must be an integer at least as large as 2") else if (round(d) != d || d < 1) stop("'d' must be an integer at least as large as 1") x <- matrix(runif(l * d), c(l, d)) s <- negDistMat(x, r=2) # Call function apcluster(), turn on details for later plotting apresultObj <- apcluster(s, details=TRUE, ...) show(apresultObj) plot(apresultObj) invisible(list(x, s, apresultObj)) } apcluster/R/similarity.R0000644000176200001440000000764414170223535015003 0ustar liggesusersnegDistMat <- function(x, sel=NA, r=1, method="euclidean", p=2) { if (r <= 0) stop("'r' must be positive") if (missing(x)) return(function(x, sel=NA) negDistMat(x, sel, r=r, method=method, p=p)) if (is.data.frame(x)) dm <- as.matrix(simpleDist(x[, sapply(x, is.numeric)], sel, method=method, p=p)) else dm <- as.matrix(simpleDist(x, sel, method=method, p=p)) if (r != 1) -dm^r else -dm } expSimMat <- function(x, sel=NA, r=2, w=1, method="euclidean", p=2) { if (r <= 0) stop("'r' must be positive") if (missing(x)) return(function(x, sel=NA) expSimMat(x, sel, r=r, w=w, method=method, p=p)) if (is.data.frame(x)) dm <- as.matrix(simpleDist(x[,sapply(x, is.numeric)], sel, method=method, p=p)) else dm <- as.matrix(simpleDist(x, sel, method=method, p=p)) exp(-(dm / w)^r) } linSimMat <- function(x, sel=NA, w=1, method="euclidean", p=2) { if (w <= 0) stop("'w' must be positive") if (missing(x)) return(function(x, sel=NA) linSimMat(x, sel, w=w, method=method, p=p)) if (is.data.frame(x)) dm <- as.matrix(simpleDist(x[,sapply(x,is.numeric)], sel, method=method, p=p)) else dm <- as.matrix(simpleDist(x, sel, method=method, p=p)) pmax(1 - dm / w, 0) } corSimMat <- function(x, sel=NA, r=1, signed=TRUE, method="pearson") { if (missing(x)) return(function(x, sel=NA) corSimMat(x, sel, r=r, signed=signed, method=method)) if (is.vector(x) || (is.list(x) && !is.data.frame(x))) stop("no correlation for vector or list") if (is.data.frame(x)) x <- as.matrix(x[, sapply(x, is.numeric)]) else x <- as.matrix(x) N <- nrow(x) # if rownames available they are assigned by cor if (length(sel) == 1 && is.na(sel)) { mat <- cor(x=t(x), method=method) if (length(rownames(x)) == 0) dimnames(mat) <- list(seq_len(N), seq_len(N)) } else if (is.numeric(sel) && length(sel) > 0) { mat <- cor(x=t(x), y=t(x[sel, ]), method=method) if (length(rownames(x)) == 0) dimnames(mat) <- list(seq_len(N), sel) } else stop("invalid 'sel' argument") if (signed) { if (r != 1) mat <- sign(mat) * abs(mat)^r } else { if (r == 1) mat <- abs(mat) else mat <- abs(mat)^r } mat } linKernel <- function(x, sel=NA, normalize=FALSE) { if (missing(x)) return(function(x, sel=NA) linKernel(x, sel, normalize=normalize)) if (is.data.frame(x)) x <- as.matrix(x[, sapply(x, is.numeric)]) else x <- as.matrix(x) N <- nrow(x) if (!is.double(x)) storage.mode(x) <- "double" if (length(sel) == 1 && is.na(sel)) { mat <- tcrossprod(x) if (normalize) { di <- 1 / sqrt(diag(mat)) di[which(is.infinite(di))] <- 0 mat <- mat * (di %o% di) } if (length(rownames(x)) > 0) dimnames(mat) <- list(rownames(x), rownames(x)) else dimnames(mat) <- list(seq_len(N), seq_len(N)) } else if (is.numeric(sel) && length(sel) > 0) { mat <- tcrossprod(x, x[sel, , drop=FALSE]) if (normalize) { di <- 1 / sqrt(sapply(1:nrow(x), function(i) x[i,] %*% x[i,])) di[which(is.infinite(di))] <- 0 mat <- mat * (di %o% di[sel]) } if (length(rownames(x)) > 0) dimnames(mat) <- list(rownames(x), rownames(x)[sel]) else dimnames(mat) <- list(seq_len(N), sel) } else stop("invalid 'sel' argument") mat } apcluster/R/simpleDist.R0000644000176200001440000000331514170223535014721 0ustar liggesusers# This is a modification of # File src/library/stats/R/dist.R # Part of the R package, http://www.R-project.org # Changes: # added possibility to make sub-selection of columns (argument sel) # removed all functionality not necessary for package apcluster # This program is free software; you can redistribute it and/or modify simpleDist <- function(x, sel, method="euclidean", p=2) { ## account for possible spellings of euclid?an if(!is.na(pmatch(method, "euclidian"))) method <- "euclidean" METHODS <- c("euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski", "discrepancy") method <- pmatch(method, METHODS) if(is.na(method)) stop("invalid distance method") if(method == -1) stop("ambiguous distance method") x <- as.matrix(x) N <- nrow(x) if (!is.double(x)) storage.mode(x) <- "double" if (length(sel) == 1 && is.na(sel)) { d <- .Call("CdistR", x, as.integer(NA), method, p) dm <- matrix(0, N, N) dm[row(dm) > col(dm)] <- d dm <- dm + t(dm) if (length(rownames(x)) > 0) dimnames(dm) <- list(rownames(x), rownames(x)) else dimnames(dm) <- list(seq_len(N), seq_len(N)) } else if (is.numeric(sel) && length(sel) > 0) { if (max(sel) > N || min(sel) < 1) stop("'sel' is no subset of '1:nrow(x)'") d <- .Call("CdistR", x, as.integer(sel - 1), method, p) dm <- matrix(d, N, length(sel)) if (length(rownames(x)) > 0) dimnames(dm) <- list(rownames(x), rownames(x)[sel]) else dimnames(dm) <- list(seq_len(N), sel) } else stop("invalid 'sel' argument") dm } apcluster/R/heatmap-methods.R0000644000176200001440000002201414245406335015665 0ustar liggesusersheatmap.ExClust <- function(x, y, ...) { if (!all(dim(x@sim) <= 1)) return(invisible(heatmap(x, x@sim, ...))) else stop("similarity matrix is missing for heatmap plotting") } setMethod("heatmap", signature(x="ExClust", y="missing"), heatmap.ExClust) heatmap.ExClust.matrix <- function(x, y, ...) { if (all(dim(y) <= 1)) stop("'y' must be a non-empty similarity matrix") else if (x@l != nrow(y)) stop("size of clustering result does not fit to size of data set") else if (nrow(y) != ncol(y) && length(x@sel) == 0) stop("similarity matrix must be quadratic") if (any(y == -Inf)) { rng <- range(y[which(y > -Inf)]) fill <- 2 * rng[1] - rng[2] y[which(y == -Inf)] <- fill } aggres <- aggExCluster(y, x) heatmap(aggres, y, ...) return(invisible(aggres)) } setMethod("heatmap", signature(x="ExClust", y="matrix"), heatmap.ExClust.matrix) heatmap.ExClust.sparseMatrix <- function(x, y, ...) { if (all(dim(y) <= 1)) stop("'y' must be a non-empty similarity matrix") else if (x@l != nrow(y)) stop("size of clustering result does not fit to size of data set") else if (nrow(y) != ncol(y)) stop("similarity matrix must be quadratic") aggres <- aggExCluster(y, x, includeSim=TRUE) heatmap(aggres, aggres@sim, ...) aggres@sim <- matrix(ncol=0, nrow=0) return(invisible(aggres)) } setMethod("heatmap", signature(x="ExClust", y="sparseMatrix"), heatmap.ExClust.sparseMatrix) heatmap.ExClust.Matrix <- function(x, y, ...) { y <- try(as(y, "matrix")) if (is(y, "try-error")) stop("cannot cast 'y' (class '", class(y), "') to class 'matrix'") return(invisible(heatmap(x, y, ...))) } setMethod("heatmap", signature(x="ExClust", y="Matrix"), heatmap.ExClust.Matrix) heatmap.AggExResult <- function(x, y, ...) { if (!all(dim(x@sim) <= 1)) heatmap(x, x@sim, ...) else stop("similarity matrix is missing for heatmap plotting") } setMethod("heatmap", signature(x="AggExResult", y="missing"), heatmap.AggExResult) heatmap.AggExResult.matrix <- function(x, y, Rowv=TRUE, Colv=TRUE, sideColors=NULL, col=heat.colors(12), base=0.05, add.expr, margins=c(5, 5, 2), cexRow=max(min(35 / nrow(y), 1), 0.1), cexCol=max(min(35 / ncol(y), 1), 0.1), main=NULL, dendScale=1, barScale=1, legend=c("none", "col"), ...) { if (all(dim(y) <= 1)) stop("'y' must be a non-empty matrix") else if (x@l != nrow(y)) stop("size of clustering result does not fit to size of data set") else if (length(x@sel) == 0 && ncol(y) != nrow(y)) stop("'y' must be quadratic") else if (length(x@sel) > 0 && ncol(y) != length(x@sel)) stop("no. of columns in 'y' and no. of selected samples in 'x' ", "do not match") legend <- match.arg(legend) rowInd <- unlist(x@clusters[[x@maxNoClusters]][x@order]) doRdend <- TRUE doCdend <- TRUE dend <- NULL if (is.na(Rowv) || identical(Rowv, FALSE) || x@maxNoClusters < 3) doRdend <- FALSE else { dend <- as.dendrogram(x, base=base, useNames=FALSE) rowInd <- as.numeric(order.dendrogram(dend)) } colInd <- rowInd if (length(x@sel) > 0) { colInd <- rank(intersect(rowInd, x@sel)) doCdend <- FALSE } else if (is.na(Colv) || identical(Colv, FALSE) || x@maxNoClusters < 3) doCdend <- FALSE else if (!is.na(Colv) && !doRdend) { dend <- as.dendrogram(x, base=base, useNames=FALSE) rowInd <- as.numeric(order.dendrogram(dend)) colInd <- rowInd } if ((doRdend || doCdend) && (!is.numeric(dendScale) || length(dendScale) != 1 || dendScale <= 0 || dendScale > 2)) stop("'dendScale' must be a single positive value not larger than 2") if (is.null(sideColors)) { if (length(x) != nrow(y)) { lx <- length(x) lx2 <- lx + if (lx %% 2) 1 else 0 ind <- as.vector(t(matrix(1:lx2, lx2 / 2)))[1:lx] sideColors <- rainbow(lx)[ind] } } else if (any(is.na(sideColors))) sideColors <- NULL else if (!is.character(sideColors)) stop("'sideColors' must be vector of colors, NA or NULL") else { if (length(sideColors) < 2) stop("use at least two different colors in 'sideColors' argument") if (length(sideColors) < length(x)) sideColors <- rep(sideColors, length.out=length(x)) else sideColors <- sideColors[1:length(x)] } if (length(rownames(y)) == 0) { labRow <- as.character(rowInd) if (length(x@sel) > 0) labCol <- as.character(intersect(rowInd, x@sel)) } else { labRow <- rownames(y)[rowInd] if (length(x@sel) > 0) labCol <- rownames(y)[intersect(rowInd, x@sel)] } if (length(colnames(y)) == 0) labCol <- as.character(colInd) else labCol <- colnames(y)[colInd] lmat <- rbind(c(NA, 3), 2:1) lwid <- c(if (doRdend) dendScale else 0.05, 4) lhei <- c((if (doCdend) dendScale else 0.05) + if (!is.null(main)) 0.2 else 0, 4) if (length(sideColors) > 0) { if (!is.numeric(barScale) || length(barScale) != 1 || barScale <= 0 || barScale > 4) stop("'barScale' must be a single positive value not larger than 4") invIndex <- rep(0, nrow(y)) for (i in 1:x@maxNoClusters) invIndex[x@clusters[[x@maxNoClusters]][[i]]] <- i srtIndex <- unique(invIndex[rowInd]) rowColors <- rep(sideColors, sapply(x@clusters[[x@maxNoClusters]][srtIndex], length)) if (length(x@sel) > 0) colColors <- rep(sideColors, sapply(x@clusters[[x@maxNoClusters]][srtIndex], function(cl) length(intersect(cl, x@sel)))) else colColors <- rowColors lmat <- rbind(lmat[1, ] + 1, c(NA, 1), lmat[2, ] + 1) lhei <- c(lhei[1L], 0.1 * barScale, lhei[2L]) lmat <- cbind(lmat[, 1] + 1, c(rep(NA, nrow(lmat) - 1), 1), lmat[, 2] + 1) lwid <- c(lwid[1L], 0.1 * barScale, lwid[2L]) } lmat[is.na(lmat)] <- 0 if (legend != "none") { lmat <- cbind(lmat, c(rep(0, nrow(lmat) - 1), max(lmat) + 1)) lwid <- c(lwid, 0.25) } dev.hold() on.exit(dev.flush()) op <- par(no.readonly=TRUE) on.exit(par(op), add=TRUE) layout(lmat, widths=lwid, heights=lhei, respect=TRUE) if (length(sideColors) > 0) { par(mar=c(margins[1], 0, 0, 0.5)) image(rbind(1:nrow(y)), col=rev(rowColors), axes=FALSE) par(mar=c(0.5, 0, 0, margins[2])) image(cbind(1:ncol(y)), col=colColors, axes=FALSE) } par(mar=c(margins[1], 0, 0, margins[2])) image(1:ncol(y), 1:nrow(y), t(y[rev(rowInd), colInd]), xlim=(0.5 + c(0, ncol(y))), ylim=(0.5 + c(0, nrow(y))), axes=FALSE, xlab="", ylab="", col=col, ...) if (cexCol > 0) axis(1, 1:ncol(y), labels=labCol, las=2, line=-0.5, tick=0, cex.axis=cexCol) if (cexRow > 0) axis(4, 1:nrow(y), labels=rev(labRow), las=2, line=-0.5, tick=0, cex.axis=cexRow) if (!missing(add.expr)) eval.parent(substitute(add.expr)) par(mar=c(margins[1], 0, 0, 0)) if (doRdend) plot(revDend.local(dend), horiz=TRUE, axes=FALSE, yaxs="i", leaflab="none") else frame() par(mar=c(0, 0, if (!is.null(main)) 1 else 0, margins[2])) if (doCdend) plot(dend, axes=FALSE, xaxs="i", leaflab="none") else frame() if (!is.null(main)) { par(xpd=NA) title(main, cex.main=(1.5 * op[["cex.main"]])) } if (legend != "none") { par(mar=c(margins[1], 0, 0, margins[3])) rng <- range(y) colvals <- seq(rng[1], rng[2], length.out=length(col)) image(y=colvals, z=rbind(colvals), col=col, axes=FALSE, xlab="", ylab="") axis(4) } return(invisible(dend)) } setMethod("heatmap", signature(x="AggExResult", y="matrix"), heatmap.AggExResult.matrix) setMethod("heatmap", signature(x="matrix", y="missing"), function(x, y, ...) stats::heatmap(x=x, ...)) setMethod("heatmap", signature(x="missing", y="matrix"), function(x, y, ...) stats::heatmap(x=y, ...)) apcluster/MD50000644000176200001440000000677414612715763012616 0ustar liggesusersfd179570cba0d2d986e3d77a1be23855 *DESCRIPTION 001440a057780cd5709d6567c4631912 *NAMESPACE 35758c2646d35ebdd0ea5f12bb47af7c *R/AllClasses.R 9368032ea24b762d440ea7e2dd4904fb *R/AllGenerics.R 79fcb30e6202da02176b775ed1a66b4b *R/access-methods.R 3130bcd2998cc2e895ccc20037e9e082 *R/aggExCluster-methods.R 3ea28cebd58c0bcc09ae46c25a7edd5a *R/apcluster-methods.R 9ac279fc9332af5bf366d2c68c742628 *R/apclusterDemo.R 34fbd2b6591882c883b1369e3e7e639b *R/apclusterK-methods.R 83ec9aecb36933ef7689593c74869db7 *R/apclusterL-methods.R 34bf6cb9c85dd238c83d1739f1eadcc9 *R/coerce-methods.R fdcffcbfec8862030e37b80e743b3e3f *R/conversions.R 1abcdec975db5aaa2d63ffe7768c3406 *R/cutree-methods.R 46bfd7508c571fd1acce400deb355fff *R/heatmap-methods.R b542abbc42500368b45f26b98c064abe *R/labels-methods.R a33e8f5c04f5862182e08f97abf29875 *R/length-methods.R 24d9e15ff4844e4748336a6f3c2373c7 *R/plot-methods.R 405ed0aef43c4b3cdd9255b0d2fd5307 *R/preferenceRange-methods.R 5015d224d2ba1090c39ae2385d6d40d4 *R/revDend.R adde0ebd660c4c8bfa73c70b833c688b *R/show-methods.R 644a0a66aa2dbee14aa41cc1008ed659 *R/similarity.R 95f1e04b6d448b91abb309ee25977cf2 *R/simpleDist.R 4bf4b98618b2bfe598cc640c35bae301 *R/sort-methods.R 103d7c5707737125c4e3518227095761 *README.md cb4d5a34aae637c875659f4d449f61b3 *TODO f61db891eb928123aba4412ca322f508 *build/partial.rdb aa65779c660b4b99eeacfa75b8edaff7 *build/vignette.rds 762f8d8f344398f6bc884614f30f634f *inst/CITATION 199b737b3945550d6e9ef53245cf1701 *inst/COPYRIGHT 3f2bb07b553600fec249bbdea7039f38 *inst/NEWS d421ca457ae311dec6f09f2327f178e4 *inst/doc/apcluster.R 7bb62b7bbcda790f51e1263f86295b3b *inst/doc/apcluster.Rnw aca2bd70a50f6b6282bc9c612ec1ff08 *inst/doc/apcluster.pdf cde3d51d250b8d2239e6e5cff4c2ff35 *man/APResult-class.Rd 681bc2d505cd0d6623c2f8647d78a851 *man/AggExResult-class.Rd 1cf2b6f6b7d58a690b8882bd30ec1f12 *man/ExClust-class.Rd 9864965143e2ce02deb666ee207ef9e1 *man/aggExCluster-methods.Rd 433f37227eca381e3a045ef04e597a5a *man/apcluster-methods.Rd 878093170903c0306bc7eec3999665df *man/apcluster-package.Rd 9fa81a9a55712ea642ead9671a0662cb *man/apclusterDemo.Rd 19e0f1bad44c5dcbd6fd8268923500cb *man/apclusterK-methods.Rd 297f85456175172fe04d8c3d5115d3ce *man/apclusterL-methods.Rd 83840da602e0a16101c6e3bba04fcd81 *man/coerce-methods.Rd d534109b83ee39e342931b01e47697a2 *man/conversions.Rd e13d705e18a24c118f017e1b6b0d152c *man/cutree-methods.Rd 5cb269f37525d6394923c6b8eb244b27 *man/heatmap-methods.Rd 36306e97ee325d0309bc710ed45f5766 *man/labels-methods.Rd 86cc240ed7e18d533b45a0f6394aacd7 *man/plot-methods.Rd 59c86205235d403cdc8b69ececbe05bc *man/preferenceRange-methods.Rd 992768391c65029f2799a4aa29ed2bc1 *man/show-methods.Rd 18515c504158a7a422e6402511e005ea *man/similarities.Rd 8edda402a641200765e1237ff1fbdc16 *man/sort-methods.Rd 86402d466a35d3f3e63192b68e8fd60b *src/R_init_apcluster.cpp 732ed3fe7a453aafc654d42945439a2b *src/aggExClusterC.cpp c76bcf1a5d8da0af578bc874b618f30f *src/aggExClusterC.h 69d0991cc0d6d6eadcb155791ad37f1e *src/apclusterC.cpp d61a3a076cec2b8fa06ec04a87765bae *src/apclusterCppHeaders.h 5ae6f01abaa7f4c73761a645294154d3 *src/apclusterLeveragedC.cpp f496d348b00efe0c4d2bff4b7c1ce98a *src/apclusterSparseC.cpp fd4e674b808035893f83978576394df6 *src/distanceL.c 2fd55b6e14bd27888af7edc1694233bc *src/distanceL.h 7cbf1c2e2a8a86822374af2c57d5d10c *src/preferenceRangeC.cpp 0b207f0cd197c40182fb856e13f4ee42 *src/preferenceRangeSparseC.cpp 7bb62b7bbcda790f51e1263f86295b3b *vignettes/apcluster.Rnw e844d32c372914997a1c569bae4a23ba *vignettes/apcluster.bib 0a5a7cb02ced0783bc644e601b48c8f6 *vignettes/ubmanual.cls apcluster/inst/0000755000176200001440000000000014612700362013232 5ustar liggesusersapcluster/inst/doc/0000755000176200001440000000000014612700362013777 5ustar liggesusersapcluster/inst/doc/apcluster.Rnw0000644000176200001440000016511714611423410016477 0ustar liggesusers\documentclass{ubmanual} \usepackage{amsmath,amssymb} \usepackage{hyperref} \hypersetup{colorlinks=false, pdfborder=0 0 0, pdftitle={APCluster - An R Package for Affinity Propagation Clustering}, pdfauthor={Ulrich Bodenhofer}} \title{{\Huge APCluster}\\[5mm] An R Package for Affinity Propagation Clustering} \author{Ulrich Bodenhofer\affilmark{1,2}, Johannes Palme\affilmark{2}, Chrats Melkonian\affilmark{2}, and Andreas Kothmeier\affilmark{2}} \affiliation{\affilmark{1} School of Informatics, Communication and Media\\ University of Applied Sciences Upper Austria\\ Softwarepark 11, 4232 Hagenberg, Austria\\[2mm] {\grey\affilmark{2} previously with: Institute of Bioinformatics, Johannes Kepler University\\Altenberger Str.\ 69, 4040 Linz, Austria}} \newcommand{\APCluster}{\texttt{apcluster}} \newcommand{\KeBABS}{\texttt{kebabs}} \newcommand{\R}{R} \newcommand{\Real}{\mathbb{R}} \renewcommand{\vec}[1]{\mathbf{#1}} %\VignetteIndexEntry{An R Package for Affinity Propagation Clustering} %\VignetteDepends{methods, stats, graphics, utils} %\VignetteEngine{knitr::knitr} \begin{document} <>= options(width=72) knitr::opts_knit$set(width=72) set.seed(0) library(apcluster, quietly=TRUE) apclusterVersion <- packageDescription("apcluster")$Version apclusterDateRaw <- packageDescription("apcluster")$Date apclusterDateYear <- as.numeric(substr(apclusterDateRaw, 1, 4)) apclusterDateMonth <- as.numeric(substr(apclusterDateRaw, 6, 7)) apclusterDateDay <- as.numeric(substr(apclusterDateRaw, 9, 10)) apclusterDate <- paste(month.name[apclusterDateMonth], " ", apclusterDateDay, ", ", apclusterDateYear, sep="") @ \newcommand{\APClusterVer}{\Sexpr{apclusterVersion}} \newcommand{\APClusterDate}{\Sexpr{apclusterDate}} \manualtitlepage{Version \APClusterVer, \APClusterDate}{https://github.com/UBod/apcluster} \section*{Scope and Purpose of this Document} This document is a user manual for the \R\ package \APCluster\ \cite{BodenhoferKothmeierHochreiter11}. It is only meant as a gentle introduction into how to use the basic functions implemented in this package. Not all features of the \R\ package are described in full detail. Such details can be obtained from the documentation enclosed in the \R\ package. Further note the following: (1) this is neither an introduction to affinity propagation nor to clustering in general; (2) this is not an introduction to \R. If you lack the background for understanding this manual, you first have to read introductory literature on these subjects. \newpage \vspace{1cm} \newlength{\auxparskip} \setlength{\auxparskip}{\parskip} \setlength{\parskip}{0pt} \tableofcontents \clearpage \setlength{\parskip}{\auxparskip} \newlength{\Nboxwidth} \setlength{\Nboxwidth}{\textwidth} \addtolength{\Nboxwidth}{-2\fboxrule} \addtolength{\Nboxwidth}{-2\fboxsep} \newcommand{\notebox}[1]{% \begin{center} \fbox{\begin{minipage}{\Nboxwidth} \noindent{\sffamily\bfseries Note:} #1 \end{minipage}} \end{center}} \section{Introduction} Affinity propagation (AP) is a relatively new clustering algorithm that has been introduced by Brendan J.\ Frey and Delbert Dueck \cite{FreyDueck07}.\footnotemark[1]\footnotetext[1]{% \url{https://psi.toronto.edu/research/affinity-propagation-clustering-by-message-passing/}}\stepcounter{footnote} The authors themselves describe affinity propagation as follows: \begin{quote} ``{\em An algorithm that identifies exemplars among data points and forms clusters of data points around these exemplars. It operates by simultaneously considering all data point as potential exemplars and exchanging messages between data points until a good set of exemplars and clusters emerges.}'' \end{quote} AP has been applied in various fields recently, among which bioinformatics is becoming increasingly important. Frey and Dueck have made their algorithm available as Matlab code.\footnotemark[1] Matlab, however, is relatively uncommon in bioinformatics. Instead, the statistical computing platform \R\ has become a widely accepted standard in this field. In order to leverage affinity propagation for bioinformatics applications, we have implemented affinity propagation as an \R\ package. Note, however, that the given package is in no way restricted to bioinformatics applications. It is as generally applicable as Frey's and Dueck's original Matlab code.\footnotemark[1] Starting with Version 1.1.0, the \APCluster\ package also features {\em exemplar-based agglomerative clustering} which can be used as a clustering method on its own or for creating a hierarchy of clusters that have been computed previously by affinity propagation. {\em Leveraged Affinity Propagation}, a variant of AP especially geared to applications involving large data sets, has first been included in Version 1.3.0. \section{Installation} \subsection{Installation via CRAN} The \R\ package \APCluster\ (current version: \APClusterVer) is part of the {\em Comprehensive R Archive Network (CRAN)}% \footnote{\url{http://cran.r-project.org/}}. The simplest way to install the package, therefore, is to enter the following command into your \R\ session: <>= install.packages("apcluster") @ If you use R on Windows or Mac OS, you can also conveniently use the package installation menu of your R GUI. \subsection{Manual installation from source} Under special circumstances, e.g. if you want to compile the C++ code included in the package with some custom options, you may prefer to install the package manually from source. To this end, open the package's page at CRAN% \footnote{\url{https://CRAN.R-project.org/package=apcluster}} and then proceed as follows: \begin{enumerate} \item Download \texttt{apcluster\_\APClusterVer.tar.gz} and save it to your harddisk. \item Open a shell/terminal/command prompt window and change to the directory where you put {\ttfamily apcluster\_\APClusterVer.tar.gz}. Enter \begin{quote} \ttfamily R CMD INSTALL apcluster\_\APClusterVer.tar.gz \end{quote} to install the package. \end{enumerate} Note that this might require additional software on some platforms. Windows requires Rtools\footnote{\url{http://cran.r-project.org/bin/windows/Rtools/}} to be installed and to be available in the default search path (environment variable \verb+PATH+). Mac OS X requires Xcode developer tools% \footnote{\url{https://developer.apple.com/technologies/tools/}} (make sure that you have the command line tools installed with Xcode). \subsection{Compatibility issues} All versions downloadable from CRAN have been built using the latest version, \R\ \Sexpr{R.version$major}.\Sexpr{R.version$minor}. However, the package should work without severe problems on \R\ versions $\geq$3.0.0. \section{Getting Started} To load the package, enter the following in your \R\ session: <>= library(apcluster) @ If this command terminates without any error message or warning, you can be sure that the package has been installed successfully. If so, the package is ready for use now and you can start clustering your data with affinity propagation. The package includes both a user manual (this document) and a reference manual (help pages for each function). To view the user manual, enter <>= vignette("apcluster") @ Help pages can be viewed using the \verb+help+ command. It is recommended to start with <>= help(apcluster) @ Affinity propagation does not require the data samples to be of any specific kind or structure. AP only requires a {\em similarity matrix}, i.e., given $l$ data samples, this is an $l\times l$ real-valued matrix $\mathbf{S}$, in which an entry $S_{ij}$ corresponds to a value measuring how similar sample $i$ is to sample $j$. AP does not require these values to be in a specific range. Values can be positive or negative. AP does not even require the similarity matrix to be symmetric (although, in most applications, it will be symmetric anyway). A value of $-\infty$ is interpreted as ``absolute dissimilarity''. The higher a value, the more similar two samples are considered. To get a first impression, let us create a random data set in $\Real^2$ as the union of two ``Gaussian clouds'': \begin{center} <>= cl1 <- cbind(rnorm(30, 0.3, 0.05), rnorm(30, 0.7, 0.04)) cl2 <- cbind(rnorm(30, 0.7, 0.04), rnorm(30, 0.4, .05)) x1 <- rbind(cl1, cl2) plot(x1, xlab="", ylab="", pch=19, cex=0.8) @ \end{center} The package \APCluster\ offers several different ways for clustering data. The simplest way is the following: <>= apres1a <- apcluster(negDistMat(r=2), x1) @ In this example, the function \verb+apcluster()+ first computes a similarity matrix for the input data \verb+x1+ using the {\em similarity function} passed as first argument. The choice \verb+negDistMat(r=2)+ is the standard similarity measure used in the papers of Frey and Dueck --- negative squared distances. Alternatively, one can compute the similarity matrix beforehand and call \verb+apcluster()+ for the similarity matrix (for a more detailed description of the differences, see \ref{ssec:memeff}): <>= s1 <- negDistMat(x1, r=2) apres1b <- apcluster(s1) @ The function \verb+apcluster()+ creates an object belonging to the S4 class \verb+APResult+ which is defined by the present package. To get detailed information on which data are stored in such objects, enter <>= help(APResult) @ The simplest thing we can do is to enter the name of the object (which implicitly calls \verb+show()+) to get a summary of the clustering result: <>= apres1a @ The \APCluster\ package allows for plotting the original data set along with a clustering result: \begin{center} <>= plot(apres1a, x1) @ \end{center} In this plot, each color corresponds to one cluster. The exemplar of each cluster is marked by a box and all cluster members are connected to their exemplars with lines. A heatmap is plotted with \verb+heatmap()+: \begin{center} <>= heatmap(apres1a) @ \end{center} In the heatmap, the samples are grouped according to clusters. The above heatmap confirms again that there are two main clusters in the data. A heatmap can be plotted for the object \verb+apres1a+ because \verb+apcluster()+, if called for data and a similarity function, by default includes the similarity matrix in the output object (unless it was called with the switch \verb+includeSim=FALSE+). If the similarity matrix is not included (which is the default if \verb+apcluster()+ has been called on a similarity matrix directly), \verb+heatmap()+ must be called with the similarity matrix as second argument: \begin{center} <>= heatmap(apres1b, s1) @ \end{center} Suppose we want to have better insight into what the algorithm did in each iteration. For this purpose, we can supply the option \verb+details=TRUE+ to \verb+apcluster()+: <>= apres1c <- apcluster(s1, details=TRUE) @ This option tells the algorithm to keep a detailed log about its progress. For example, this allows for plotting the three performance measures that AP uses internally for each iteration: \begin{center} <>= plot(apres1c) @ \end{center} These performance measures are: \begin{enumerate} \item Sum of exemplar preferences \item Sum of similarities of exemplars to their cluster members \item Net fitness: sum of the two former \end{enumerate} For details, the user is referred to the original affinity propagation paper \cite{FreyDueck07} and the supplementary material published on the affinity propagation Web page.\footnotemark[1] We see from the above plot that the algorithm has not made any change for the last 100 iterations. AP, through its parameter \verb+convits+, allows to control for how long AP waits for a change until it terminates (the default is \verb+convits=100+). If the user has the feeling that AP will probably converge quicker on his/her data set, a lower value can be used: <>= apres1c <- apcluster(s1, convits=15, details=TRUE) apres1c @ \section{Adjusting Input Preferences}\label{sec:ipref} Apart from the similarity matrix itself, the most important input parameter of AP is the so-called {\em input preference} which can be interpreted as the tendency of a data sample to become an exemplar (see \cite{FreyDueck07} and supplementary material on the AP homepage\footnotemark[1] for a more detailed explanation). This input preference can either be chosen individually for each data sample or it can be a single value shared among all data samples. Input preferences largely determine the number of clusters, in other words, how fine- or coarse-grained the clustering result will be. The input preferences one can specify for AP are roughly in the same range as the similarity values, but they do not have a straightforward interpretation. Frey and Dueck have introduced the following rule of thumb: ``{\it The shared value could be the median of the input similarities (resulting in a moderate number of clusters) or their minimum (resulting in a small number of clusters).}'' \cite{FreyDueck07} Our AP implementation uses the median rule by default if the user does not supply a custom value for the input preferences. In order to provide the user with a knob that is --- at least to some extent --- interpretable, the function \verb+apcluster()+ provides an argument \verb+q+ that allows to set the input preference to a certain quantile of the input similarities: resulting in the median for \verb+q=0.5+ and in the minimum for \verb+q=0+. As an example, let us add two more ``clouds'' to the data set from above: \begin{center} <>= cl3 <- cbind(rnorm(20, 0.50, 0.03), rnorm(20, 0.72, 0.03)) cl4 <- cbind(rnorm(25, 0.50, 0.03), rnorm(25, 0.42, 0.04)) x2 <- rbind(x1, cl3, cl4) plot(x2, xlab="", ylab="", pch=19, cex=0.8) @ \end{center} For the default setting, we obtain the following result: \begin{center} <>= apres2a <- apcluster(negDistMat(r=2), x2) plot(apres2a, x2) @ \end{center} For the minimum of input similarities, we obtain the following result: \begin{center} <>= apres2b <- apcluster(negDistMat(r=2), x2, q=0) plot(apres2b, x2) @ \end{center} So we see that AP is quite robust against a reduction of input preferences in this example which may be caused by the clear separation of the four clusters. If we increase input preferences, however, we can force AP to split the four clusters into smaller sub-clusters: \begin{center} <>= apres2c <- apcluster(negDistMat(r=2), x2, q=0.8) plot(apres2c, x2) @ \end{center} Note that the input preference used by AP can be recovered from the output object (no matter which method to adjust input preferences has been used). On the one hand, the value is printed if the object is displayed (by \verb+show+ or by entering the output object's name). On the other hand, the value can be accessed directly via the slot \verb+p+: <>= apres2c@p @ As noted above already, we can produce a heatmap by calling \verb+heatmap()+ for an \verb+APResult+ object: \begin{center} <>= heatmap(apres2c) @ \end{center} The order in which the clusters are arranged in the heatmap is determined by means of joining the cluster agglomeratively (see Section \ref{sec:agglo} below). Although the affinity propagation result contains \Sexpr{length(apres2c@exemplars)} clusters, the heatmap indicates that there are actually four clusters which can be seen as very brightly colored squares along the diagonal. We also see that there seem to be two pairs of adjacent clusters, which can be seen from the fact that there are two relatively light-colored blocks along the diagonal encompassing two of the four clusters in each case. If we look back at how the data have been created (see also plots above), this is exactly what is to be expected. The above example with \verb+q=0+ demonstrates that setting input preferences to the minimum of input similarities does not necessarily result in a very small number of clusters (like one or two). This is due to the fact that input preferences need not necessarily be exactly in the range of the similarities. To determine a meaningful range, an auxiliary function is available which, in line with Frey's and Dueck's Matlab code,\footnotemark[1] allows to compute a minimum value (for which one or at most two clusters would be obtained) and a maximum value (for which as many clusters as data samples would be obtained): <>= preferenceRange(apres2b@sim) @ The function returns a two-element vector with the minimum value as first and the maximum value as second entry. The computations are done approximately by default. If one is interested in exact bounds, supply \verb+exact=TRUE+ (resulting in longer computation times). Many clustering algorithms need to know a pre-defined number of clusters. This is often a major nuisance, since the exact number of clusters is hard to know for non-trivial (in particular, high-dimensional) data sets. AP avoids this problem. If, however, one still wants to require a fixed number of clusters, this has to be accomplished by a search algorithm that adjusts input preferences in order to produce the desired number of clusters in the end. For convenience, this search algorithm is available as a function \verb+apclusterK()+ (analogous to Frey's and Dueck's Matlab implementation\footnotemark[1]). We can use this function to force AP to produce only two clusters (merging the two pairs of adjacent clouds into one cluster each). Analogously to \verb+apcluster()+, \verb+apclusterK()+ supports two variants --- it can either be called for a similarity measure and data or on a similarity matrix directly. \begin{center} <>= apres2d <- apclusterK(negDistMat(r=2), x2, K=2, verbose=TRUE) plot(apres2d, x2) @ \end{center} Now let us quickly consider a simple data set with more than two features. The notorious example is Fisher's iris data set: <>= data(iris) apIris1 <- apcluster(negDistMat(r=2), iris) apIris1 @ AP has identified \Sexpr{length(apIris1)} clusters. Since Version 1.3.2, the package also allows for superimposing clustering results in scatter plot matrices: \begin{center} <>= plot(apIris1, iris) @ \end{center} The heatmap looks as follows: \begin{center} <>= heatmap(apIris1) @ \end{center} Now let us try to obtain fewer clusters by using the minimum of off-diagonal similarities: <>= data(iris) apIris2 <- apcluster(negDistMat(r=2), iris, q=0) apIris2 @ AP has identified \Sexpr{length(apIris2)} clusters. If we again superimpose them in the scatter plot matrix, we obtain the following: \begin{center} <>= plot(apIris2, iris) @ \end{center} Finally, the heatmap looks as follows: \begin{center} <>= heatmap(apIris2) @ \end{center} So, looking at the heatmap, the \Sexpr{length(apIris2)} clusters seem quite reasonable, at least in the light of the fact that there are three species in the data set, {\em Iris setosa}, {\em Iris versicolor}, and {\em Iris virginica}, where {\em Iris setosa} is very clearly separated from each other (first cluster in the heatmap) and the two others are partly overlapping. \section{Exemplar-based Agglomerative Clustering}\label{sec:agglo} The function \verb+aggExCluster()+ realizes what can best be described as ``exemplar-based agglomerative clustering'', i.e.\ agglomerative clustering whose merging objective is geared towards the identification of meaningful exemplars. Analogously to \verb+apcluster()+, \verb+aggExCluster()+ supports two variants --- it can either be called for a similarity measure and data or on matrix of pairwise similarities. \subsection{Getting started} Let us start with a simple example: <>= aggres1a <- aggExCluster(negDistMat(r=2), x1) aggres1a @ The output object \verb+aggres1a+ contains the complete cluster hierarchy. As obvious from the above example, the \verb+show()+ method only displays the most basic information. Calling \verb+plot()+ on an object that was the result of \verb+aggExCluster()+ (an object of class \verb+AggExResult+), a dendrogram is plotted: \begin{center} <>= plot(aggres1a) @ \end{center} The heights of the merges in the dendrogram correspond to the merging objective: the higher the vertical bar of a merge, the less similar the two clusters have been. The dendrogram, therefore, clearly indicates two clusters. Heatmaps can be produced analogously as for \verb+APResult+ objects with the additional property that dendrograms are displayed on the top and on the left: \begin{center} <>= heatmap(aggres1a, s1) @ \end{center} Once we have confirmed the number of clusters, which is clearly 2 according to the dendrogram and the heatmap above, we can extract the level with two clusters from the cluster hierarchy. In concordance with standard \R\ terminology, the function for doing this is called \verb+cutree()+: \begin{center} <>= cl1a <- cutree(aggres1a, k=2) cl1a plot(cl1a, x1) @ \end{center} \subsection{Merging clusters obtained from affinity propagation} The most important application of \verb+aggExCluster()+ (and the reason why it is part of the \APCluster\ package) is that it can be used for creating a hierarchy of clusters starting from a set of clusters previously computed by affinity propagation. The examples in Section \ref{sec:ipref} indicate that it may sometimes be tricky to define the right input preference. Exemplar-based agglomerative clustering on affinity propagation results provides an additional tool for finding the right number of clusters. Let us revisit the four-cluster example from Section \ref{sec:ipref}. We can apply \verb+aggExCluster()+ to an affinity propagation result if we run it on the affinity propagation result supplied as second argument \verb+x+: <>= aggres2a <- aggExCluster(x=apres2c) aggres2a @ The result \verb+apres2c+ had \Sexpr{length(apres2c)} clusters. \verb+aggExCluster()+ successively joins these clusters until only one cluster is left. The dendrogram of this cluster hierarchy is given as follows: \begin{center} <>= plot(aggres2a) @ \end{center} If one wants to see the original samples in the dendrogram of the cluster hierarchy, the \verb+showSamples=TRUE+ option can be used. In this case, it is recommended to reduce the font size of the labels via the \verb+nodePar+ parameter (see \verb+?plot.dendrogram+ and the examples therein): \begin{center} <>= plot(aggres2a, showSamples=TRUE, nodePar=list(pch=NA, lab.cex=0.4)) @ \end{center} The following heatmap coincides with the one shown in Section \ref{sec:ipref} above. This is not surprising, since the heatmap plot for an affinity propagation result uses \verb+aggExCluster()+ internally to arrange the clusters: \begin{center} <>= heatmap(aggres2a) @ \end{center} Once we are more or less sure about the number of clusters, we extract the right clustering level from the hierarchy. For demonstation purposes, we do this for $k=5,\dots,2$ in the following plots: \begin{center} <>= par(mfrow=c(2,2)) for (k in 5:2) plot(aggres2a, x2, k=k, main=paste(k, "clusters")) @ \end{center} There is one obvious, but important, condition: applying \verb+aggExCluster()+ to an affinity propagation result only makes sense if the number of clusters to start from is at least as large as the number of true clusters in the data set. Clearly, if the number of clusters is already too small, then merging will make the situation only worse. \subsection{Details on the merging objective} Like any other agglomerative clustering method (see, e.g., \cite{JainMurtyFlynn99,MichalskiStepp92,Ward63}), \verb+aggExCluster()+ merges clusters until only one cluster containing all samples is obtained. In each step, two clusters are merged into one, i.e.\ the number of clusters is reduced by one. The only aspect in which \verb+aggExCluster()+ differs from other methods is the merging objective. Suppose we consider two clusters for possible merging, each of which is given by an index set: \[ I = \{i_1,\dots,i_{n_I}\} \text{ and } J = \{j_1,\dots,j_{n_J}\} \] Then we first determine the potential {\em joint exemplar} $\mathop{\mathrm{ex}}(I,J)$ as the sample that maximizes the average similarity to all samples in the joint cluster $I\cup J$: \[ \mathop{\mathrm{ex}}(I,J) =\mathop{\mathrm{argmax}}\limits_{i\in I\cup J} \frac{1}{n_I + n_J}\cdot \sum\limits_{j\in I\cup J} S_{ij} \] Recall that $\mathbf{S}$ denotes the similarity matrix and $S_{ij}$ corresponds to the similarity of the $i$-th and the $j$-th sample. Then the merging objective is computed as \[ \mathop{\mathrm{obj}}(I,J)=\frac{1}{2}\cdot\Big(\frac{1}{n_I}\cdot \sum\limits_{j\in I} S_{\mathop{\mathrm{ex}}(I,J)j}+\frac{1}{n_J}\cdot \sum\limits_{k\in J} S_{\mathop{\mathrm{ex}}(I,J)k}\Big), \] which can be best described as ``{\em balanced average similarity to the joint exemplar}''. In each step, \verb+aggExCluster()+ considers all pairs of clusters in the current cluster set and joins that pair of clusters whose merging objective is maximal. The rationale behind the merging objective is that those two clusters should be joined that are best described by a joint exemplar. \section{Leveraged Affinity Propagation}\label{sec:lever} Leveraged affinity propagation is based on the idea that, for large data sets with many samples, the cluster structure is already visible on a subset of the samples. Instead of evaluating the similarity matrix for all sample pairs, the similarities of all samples to a subset of samples are computed --- resulting in a non-square similarity matrix. Clustering is performed on this reduced similarity matrix allowing for clustering large data sets more efficiently. In this form of clustering, several rounds of affinity propagation are executed with different sample subsets --- iteratively improving the clustering result. The implementation is based on the Matlab code of Frey and Dueck provided on the AP Web page\footnotemark[1]. Apart from dynamic improvements through reduced amount of distance calculations and faster clustering, the memory consumption is also reduced not only in terms of the memory used for storing the similarity matrix, but also in terms of memory used by the clustering algorithm internally. The two main parameters controlling leveraged AP clustering are the fraction of data points that should be selected for clustering (parameter \verb+frac+) and the number of sweeps or repetitions of individual clustering runs (parameter \verb+sweeps+). Initially, a sample subset is selected randomly. For the subsequent repetitions, the exemplars of the previous run are kept in the sample subset and the other samples in the subset are chosen randomly again. The best result of all sweeps with the highest net similarity is kept as final clustering result. When called with a similarity measure and a dataset the function \verb+apclusterL()+ performs both the calculation of similarities and leveraged affinity propagation. In the example below, we use 10\% of the samples and run 5 repetitions. The function implementing the similarity measure can either be passed as a function or as a function name (which must of course be resolvable in the current environment). Additional parameters for the distance calculation can be passed to \verb+apclusterL()+ which passes them on to the function implementing the similarity measure via the \verb+...+ argument list. In any case, this function must be implemented such that it expects the data in its first argument \verb+x+ (a subsettable data structure, such as, a vector, matrix, data frame, or list) and that it takes the selection of ``column objects'' as a second argument \verb+sel+ which must be a set of column indices. The functions \verb+negDistMat()+, \verb+expSimMat()+, \verb+linSimMat()+, \verb+corSimMat()+, and \verb+linKernel()+ provided by the \APCluster\ package also support the easy creation of parameter-free similarity measures (in R terminology called ``closures''). We recommend this variant, as it is safer in terms of possible name conflicts between arguments of \verb+apclusterL()+ and arguments of the similarity function. Here is an example that makes use of a closure for defining the similarity measure: \begin{center} <>= cl5 <- cbind(rnorm(100, 0.3, 0.05), rnorm(100, 0.7, 0.04)) cl6 <- cbind(rnorm(100, 0.70, 0.04), rnorm(100, 0.4, 0.05)) x3 <- rbind(cl5, cl6) apres3 <- apclusterL(s=negDistMat(r=2), x=x3, frac=0.1, sweeps=5, p=-0.2) apres3 plot(apres3, x3) @ \end{center} The function \verb+apclusterL()+ creates a result object of S4 class \verb+APResult+ that contains the same information as for standard AP. Additionally, the selected sample subset, the associated rectangular similarity matrix for the best sweep (provided that \verb+includeSim=TRUE+) and the net similarities of all sweeps are returned in this object. <>= dim(apres3@sim) apres3@sel apres3@netsimLev @ The result returned by leveraged affinity propagation can be used for further processing in the same way as a result object returned from \verb+apcluster()+, e.g., merging of clusters with agglomerative clustering can be performed. For heatmap plotting either the parameter \verb+includeSim=TRUE+ must be set in \verb+apcluster()+ or \verb+apclusterL()+ to make the similarity matrix available in the result object or the similarity matrix must be passed as second parameter to \verb+heatmap()+ explicitly. The heatmap for leveraged AP looks slightly different compared to the heatmap for affinity propagation because the number of samples is different in both dimensions. \begin{center} <>= heatmap(apres3) @ \end{center} Often selected samples will be chosen as exemplars because, only for them, the full similarity information is available. This means that the fraction of samples should be selected in a way such that a considerable number of samples is available for each expected cluster. Please also note that a data set of the size used in this example can easily be clustered with regular affinity propagation. The data set was kept small to keep the package build time short and the amount of data output in the manual reasonable. For users requiring a higher degree of flexibility, e.g., for a customized selection of the sample subset, \verb+apclusterL()+ called with a rectangular similiarity matrix performs affinity propagation on a rectangular similarity matrix. See the source code of \verb+apclusterL()+ with signature \verb+s=function+ and \verb+x=ANY+ for an example how to embed \verb+apclusterL()+ into a complete loop performing leveraged AP. The package-provided functions for distance calculation support the generation of rectangular similarity matrices (see Chapter \ref{sec:DistMat}). \section{Sparse Affinity Propagation}\label{sec:sparse} Starting with Version 1.4.0 of the \APCluster\ package, the functions \verb+apcluster()+, \verb+apclusterK()+, and \verb+preferenceRange()+ can also handle similarity matrices as defined by the \verb+Matrix+ package. While all dense matrix formats are converted to standard R matrices, sparse matrices are converted internally to \verb+dgTMatrix+ objects. For these sparse matrices, special implementations of the \verb+apcluster()+, \verb+apclusterK()+, and \verb+preferenceRange()+ are available that fully exploit the sparseness of the matrices and may require much less operations if the matrix is sufficiently sparse. In order to demonstrate that, consider the following example: <>= dsim <- negDistMat(x2, r=2) ssim <- as.SparseSimilarityMatrix(dsim, lower=-0.2) str(ssim) @ The function \verb+as.SparseSimilarityMatrix()+ converts the dense similarity matrix \verb+dsim+ into a sparse similarity matrix by removing all pairwise similarities that are -0.2 or lower. Note that this is only for demonstration purposes. If the size of data permits that, it is advisable to use the entire dense similarity matrix. Anyway, let us run sparse AP on this similarity matrix: \begin{center} <>= sapres <- apcluster(ssim, q=0) plot(sapres, x2) @ \end{center} The functions \verb+preferenceRange()+ and \verb+apclusterK()+ work in the same way as for dense similarity matrices: <>= preferenceRange(ssim) apclusterK(ssim, K=2) @ The functions \verb+aggExCluster()+ and \verb+heatmap()+ have been extended to be able to handle sparse matrices. Note, however, that these functions are not yet exploiting sparsity properly. Instead, they convert all inputs to dense matrices before processing them, which may lead to memory and/or performance issues for large data sets. \begin{center} <>= heatmap(sapres, ssim) @ \end{center} The above heatmap illustrates that values that are not stored in the sparse similarity matrix are filled up with low values (see the red areas between some pairs of samples that belong to different clusters). Actually, each missing value is replaced with \[ \min(s)-(\max(s)-\min(s))=2\cdot\min(s)-\max(s), \] where $\min(s)$ and $\max(s)$ denote the smallest and the largest similarity value specified in the sparse similarity matrix $s$, respectively. The same replacement takes place when \verb+aggExCluster()+ converts sparse similarity matrices to dense ones. \section{Processing Biological Sequences}\label{sec:bioseq} As noted in the introduction above, one of the goals of this package is to leverage affinity propagation in bioinformatics applications. Previous versions of this document showed a toy example of using affinity propagation on a set of biological sequences that computed a similarity matrix using the simple {\em spectrum kernel} \cite{LeslieEskinNoble02} as implemented in the \KeBABS\ package \cite{PalmeHochreiterBodenhofer15}. This example has been removed in version 1.4.9 in order to avoid dependencies to a non-CRAN package. Instead, readers are now refered to the vignette of the \KeBABS\ package \cite{PalmeHochreiterBodenhofer15}, which also includes an example how to use affinity propagation clustering on a set of biological sequences. \section{Similarity Matrices}\label{sec:DistMat} Apart from the obvious monotonicity ``the higher the value, the more similar two samples'', affinity propagation does not make any specific assumption about the similarity measure. Negative squared distances must be used if one wants to minimize squared errors \cite{FreyDueck07}. Apart from that, the choice and implementation of the similarity measure is left to the user. Our package offers a few more methods to obtain similarity matrices. The choice of the right one (and, consequently, the objective function the algorithm optimizes) still has to be made by the user. All functions described in this section assume the input data matrix to be organized such that each row corresponds to one sample and each column corresponds to one feature (in line with the standard function \verb+dist+). If a vector is supplied instead of a matrix, each single entry is interpreted as a (one-dimensional) sample. \subsection{The function \texttt{negDistMat()}} The function \verb+negDistMat()+, in line with Frey and Dueck, allows for computing negative distances for a given set of real-valued data samples. If called with the first argument \verb+x+, a similarity matrix with pairwise negative distances is returned: <>= s <- negDistMat(x2) @ The function \texttt{negDistMat()} provides the same set of distance measures and parameters as the standard function \verb+dist()+ (except for \verb+method="binary"+ which makes little sense for real-valued data). Presently, \verb+negDistMat()+ provides the following variants of computing the distance $d(\vec{x},\vec{y})$ of two data samples $\vec{x}=(x_1,\dots,x_n)$ and $\vec{y}=(y_1,\dots,y_n)$: \begin{description} \item[Euclidean:] \[ d(\vec{x},\vec{y})=\sqrt{\sum\limits_{i=1}^n (x_i-y_i)^2} \] use \verb+method="euclidean"+ or do not specify argument \verb+method+ (since this is the default); \item[Maximum:] \[ d(\vec{x},\vec{y})=\max\limits_{i=1}^n |x_i-y_i| \] use \verb+method="maximum"+; \item[Sum of absolute distances / Manhattan:] \[ d(\vec{x},\vec{y})=\sum\limits_{i=1}^n |x_i-y_i| \] use \verb+method="manhattan"+; \item[Canberra:] \[ d(\vec{x},\vec{y})=\sum\limits_{i=1}^n \frac{|x_i-y_i|}{|x_i+y_i|} \] summands with zero denominators are not taken into account; use \verb+method="canberra"+; \item[Minkowski:] \[ d(\vec{x},\vec{y})=\left(\sum\limits_{i=1}^n (x_i-y_i)^p\right)^{\frac{1}{p}} \] use \verb+method="minkowski"+ and specify $p$ using the additional argument $\verb+p+$ (default is \verb+p=2+, resulting in the standard Euclidean distance); \item[Discrepancy:] \[ d(\vec{x},\vec{y})=\max\limits_{1\leq\alpha\leq\beta\leq n}\left|\sum\limits_{i=\alpha}^{\beta} (y_i-x_i)\right| \] use \verb+method="discrepancy"+ \cite{Weyl16}. \end{description} The function \verb+negDistMat()+ then takes the distances computed with one of the variants listed above and returns $-1$ times the $r$-th power of it, i.e., \begin{equation}\label{eq:negDistMat} s(\vec{x},\vec{y})=-d(\vec{x},\vec{y})^r. \end{equation} The exponent $r$ can be adjusted with the argument \verb+r+. The default is \verb+r=1+, hence, one has to supply \verb+r=2+ to obtain negative squared distances as in the examples in previous sections. Here are some examples: <>= ex <- matrix(c(0, 0.5, 0.8, 1, 0, 0.2, 0.5, 0.7, 0.1, 0, 1, 0.3, 1, 0.8, 0.2), 5, 3, byrow=TRUE) ex @ Standard Euclidean distance: <>= negDistMat(ex) @ Squared Euclidean distance: <>= negDistMat(ex, r=2) @ Maximum norm-based distance: <>= negDistMat(ex, method="maximum") @ Sum of absolute distances (aka Manhattan distance): <>= negDistMat(ex, method="manhattan") @ Canberra distance: <>= negDistMat(ex, method="canberra") @ Minkowski distance for $p=3$ ($3$-norm): <>= negDistMat(ex, method="minkowski", p=3) @ If called without the data argument \verb+x+, a function object is returned that can be supplied to clustering functions --- as in the majority of the above examples: <>= sim <- negDistMat(r=2) is.function(sim) apcluster(sim, x1) @ Depending on the application, it might be advisable to center and/or scale the data in order to equalize the influence of all features/columns. This makes sense for standard vector space distances like the Euclidean distance and can easily be accomplished by the \verb+scale()+ method. The discrepancy distance, in contrast, is strongly dependent on the order to feature/columns and is rather aimed at comparing signals. For this measure, therefore, row-wise centering can be advisable \cite{BauerBodenhoferKlement96c}. This is easily done with the \verb+sweep()+ function: <>= ex2 <- matrix(c(0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1), 3, 8, byrow=TRUE) matplot(t(ex2), ylab="") matlines(t(ex2), type="s") negDistMat(ex2, method="discrepancy") ex2Scaled <- sweep(ex2, 1, rowMeans(ex2)) ex2Scaled matplot(t(ex2Scaled), ylab="") matlines(t(ex2Scaled), type="s") negDistMat(ex2Scaled, method="discrepancy") @ \subsection{Other similarity measures} The package \APCluster\ offers four more functions for creating similarity matrices for real-valued data: \begin{description} \item[Exponential transformation of distances:] the function \verb+expSimMat()+ works in the same way as the function \verb+negDistMat()+. The difference is that, instead of the transformation \eqref{eq:negDistMat}, it uses the following transformation: \[ s(\vec{x},\vec{y})=\exp\left(-\left(\frac{d(\vec{x},\vec{y})}{w}\right)^r\right) \] Here the default is \verb+r=2+. It is clear that \verb+r=2+ in conjunction with \verb+method="euclidean"+ results in the well-known {\em Gaussian kernel / RBF kernel} \cite{FitzGeraldMicchelliPinkus95,Micchelli86,SchoelkopfSmola02}, whereas \verb+r=1+ in conjunction with \verb+method="euclidean"+ results in the similarity measure that is sometimes called {\em Laplace kernel} \cite{FitzGeraldMicchelliPinkus95,Micchelli86}. Both variants (for non-Euclidean distances as well) can also be interpreted as {\em fuzzy equality/similarity relations} \cite{DeBaetsMesiar02}. \item[Linear scaling of distances with truncation:] the function \verb+linSimMat()+ uses the transformation \[ s(\vec{x},\vec{y})=\max\left(1-\frac{d(\vec{x},\vec{y})}{w},0\right) \] which is also often interpreted as a {\em fuzzy equality/similarity relation} \cite{DeBaetsMesiar02}. \item[Correlation:] the function \verb+corSimMat()+ interprets the rows of its argument \verb+x+ (matrix or data frame) as multivariate observations and computes similarities as pairwise correlations. The function \verb+corSimMat()+ is actually a wrapper around the standard function \verb+cor()+. Consequently, the \verb+method+ argument allows for selecting the type of correlation to compute (Pearson, Spearman, or Kendall). \item[Linear kernel:] scalar products can also be interpreted as similarity measures, a view that is often adopted by kernel methods in machine learning. In order to provide the user with this option as well, the function \verb+linKernel()+ is available. For two data samples $\vec{x}=(x_1,\dots,x_n)$ and $\vec{y}=(y_1,\dots,y_n)$, it computes the similarity as \[ s(\vec{x},\vec{y})=\sum\limits_{i=1}^n x_i\cdot y_i. \] The function has one additional argument, \verb+normalize+ (default: \verb+FALSE+). If \verb+normalize+ is set to \verb+TRUE+, values are normalized to the range $[-1,+1]$ in the following way: \[ s(\vec{x},\vec{y})=\frac{\sum_{i=1}^n x_i\cdot y_i}% {\sqrt{\big(\sum_{i=1}^n x_i^2\big)\cdot% \big(\sum_{i=1}^n y_i^2\big)}} \] Entries for which at least one of the two factors in the denominator is zero are set to zero (however, the user should be aware that this should be avoided anyway). \end{description} For the same example data as above, we obtain the following for the RBF kernel: <>= expSimMat(ex) @ Laplace kernel: <>= expSimMat(ex, r=1) @ Pearson correlation coefficient: <>= corSimMat(ex, method="pearson") @ Spearman rank correlation coefficient: <>= corSimMat(ex, method="spearman") @ Linear scaling of distances with truncation: <>= linSimMat(ex, w=1.2) @ Linear kernel: <>= linKernel(ex[2:5,]) @ Normalized linear kernel: <>= linKernel(ex[2:5,], normalize=TRUE) @ All of these functions work in the same way as \verb+negDistMat()+: if called with argument \verb+x+, a similarity matrix is returned, otherwise a function is returned. \subsection{Rectangular similarity matrices} With the introduction of leveraged affinity propagation, distance calculations are entirely performed within the \APCluster\ package. The code is based on a customized version of the \verb+dist()+ function from the \verb+stats+ package. In the following example, a rectangular similarity matrix of all samples against a subset of the samples is computed: <>= sel <- sort(sample(1:nrow(x1), ceiling(0.08 * nrow(x1)))) sel s1r <- negDistMat(x1, sel, r=2) dim(s1r) s1r[1:7,] @ The rows correspond to all samples, the columns to the sample subset. The \verb+sel+ parameter specifies the sample indices of the selected samples in increasing order. Rectangular similarity calculation is provided in all distance functions of the package. If the parameter \verb+sel+ is not specified, the quadratic similarity matrix of all sample pairs is computed. \subsection{Defining a custom similarity measure for leveraged affinity propagation}\label{ssec:leverSim} As mentioned in Section \ref{sec:lever} above, leveraged affinity propagation requires the definition of a similarity measure that is supplied as a function or function name to \verb+apclusterL()+. For vectorial data, the similarity measures supplied with the package (see above) may be sufficient. If other similarity measures are necessary or if the data are not vectorial, the user must supply his/her own similarity measure. The user can supply any function as argument \verb+s+ to \verb+apcluster()+, \verb+apclusterK()+, or \verb+apclusterL()+, but the following rules must be obeyed in order to avoid errors and to ensure meaningful results: \begin{enumerate} \item The data must be supplied as first argument, which must be named \verb+x+. \item The second argument must be named \verb+sel+ and must be interpreted as a vector of indices that select a subset of data items in \verb+x+. \item The function must return a numeric matrix with similarities. If \verb+sel=NA+, the format of the matrix must be \verb+length(x)+$\times$\verb+length(x)+. If \verb+sel+ is not \verb+NA+, but contains indices selecting a subset, the format of the returned similarity matrix must be \verb+length(x)+$\times$\verb+length(sel)+. \item Although this is not a must, it is recommended to properly set row and column names in the returned similarity matrix. \end{enumerate} \subsection{Defining a custom similarity measure that creates a sparse similarity matrix} Since Version 1.4.0, similarity matrices may also be sparse (cf.~Section~\ref{sec:sparse}). Correspondingly, the similarity measures passed to \verb+apcluster()+ and \verb+apclusterK()+ may also return sparse similarity matrices: <>= sparseSim <- function(x) { as.SparseSimilarityMatrix(negDistMat(x, r=2), lower=-0.2) } sapres2 <- apcluster(sparseSim, x2, q=0) sapres2 str(similarity(sapres2)) @ Note that similarity measures passed to \verb+apclusterL()+ may not return sparse matrices. Instead, they must accept a \verb+sel+ argument and return a rectangular dense matrix (see Subsection~\ref{ssec:leverSim} above). \section{Miscellaneous} \subsection{Convenience vs.\ efficiency}\label{ssec:memeff} In most of the above examples, we called a clustering method by supplying it with a similarity function and the data to be clustered. This is undoubtedly a convenient approach. Since the resulting output objects (unless the option \verb+includeSim=FALSE+ is supplied) even includes the similarity matrix, we can plot heatmaps and produce a cluster hierarchy on the basis of the clustering result without the need to supply the similarity matrix explicitly. For large data sets, however, this convenient approach has some disadvantages: \begin{itemize} \item If the clustering algorithm is run several times on the same data set (e.g., for different parameters), the similarity matrix is recomputed every time. \item Every clustering result (depending on the option \verb+includeSim+) usually includes a copy of the similarity matrix. \end{itemize} For these reasons, depending on the actual application scenario, users should consider computing the similarity matrix beforehand. This strategy, however, requires some extra effort for subsequent processing, i.e.\ the similarity must be supplied as an extra argument in subsequent processing. \subsection{Clustering named objects}\label{ssec:names} The function \verb+apcluster()+ and all functions for computing distance matrices are implemented to recognize names of data objects and to correctly pass them through computations. The mechanism is best described with a simple example: <>= x3 <- c(1, 2, 3, 7, 8, 9) names(x3) <- c("a", "b", "c", "d", "e", "f") s3 <- negDistMat(x3, r=2) @ So we see that the \verb+names+ attribute must be used if a vector of named one-dimensional samples is to be clustered. If the data are not one-dimensional (a matrix or data frame), object names must be stored in the row names of the data matrix. All functions for computing similarity matrices recognize the object names. The resulting similarity matrix has the list of names both as row and column names. <>= s3 colnames(s3) @ The function \verb+apcluster()+ and all related functions use column names of similarity matrices as object names. If object names are available, clustering results are by default shown by names. <>= apres3a <-apcluster(s3) apres3a apres3a@exemplars apres3a@clusters @ \subsection{Computing a label vector from a clustering result} \label{ssec:labels} For later classification or comparisons with other clustering methods, it may be useful to compute a label vector from a clustering result. Our package provides an instance of the generic function \verb+labels()+ for this task. As obvious from the following example, the argument \verb+type+ can be used to determine how to compute the label vector. <>= apres3a@exemplars labels(apres3a, type="names") labels(apres3a, type="exemplars") labels(apres3a, type="enum") @ The first choice, \verb+"names"+ (default), uses names of exemplars as labels (if names are available, otherwise an error message is displayed). The second choice, \verb+"exemplars"+, uses indices of exemplars (enumerated as in the original data set). The third choice, \verb+"enum"+, uses indices of clusters (consecutively numbered as stored in the slot \verb+clusters+ --- analogous to the standard implementation of \verb+cutree()+ or the \verb+clusters+ field of the list returned by the standard function \verb+kmeans()+). \subsection{Customizing heatmaps} With Version 1.3.1, the implementation of heatmap plotting has changed significantly. The method now allows for many more customizations than before. Apart from changes in the argument list (see \verb+?heatmap+), the behavior of the method has changed as follows: \begin{itemize} \item Dendrograms are always plotted if possible. To switch off plotting of dendrograms, set \verb+Rowv+ and \verb+Colv+ to \verb+FALSE+ or \verb+NA+. If a dendrogram should only appear to the left of the heatmap, set \verb+Colv+ to \verb+FALSE+ or \verb+NA+. Analogously, set \verb+Rowv+ to \verb+FALSE+ or \verb+NA+ if a dendrogram should only be plotted on top of the plot (not possible if the similarity matrix is non-quadratic). \item Previously, \verb+rainbow()+ was used internally to determine how the bars illustrating the clusters are colored. Now users can determine the coloring of the color bars using the \verb+sideColors+ argument. For \verb+sideColors=NULL+, a meaningful color coding is determined automatically which still uses \verb+rainbow()+, but ensures that no similar colors are placed next to each other in the bar. \item The default font sizes for displaying row/column labels have been changed to make sure that they do not overlap. This can result in quite small labels if the number of samples is larger. In any case, the user can override the sizes by making custom settings of the parameters \verb+cexRow+ and \verb+cexCol+. Row and column labels can even be switched off entirely by setting \verb+cexRow+ and \verb+cexCol+ to 0, respectively. \end{itemize} Moreover, with Version~1.4.3, the possibility to add a color legend has been integrated. Here is an example with the vertical dendrogram switched off, an alternate color scheme, custom margins, and a color legend: \begin{center} <>= heatmap(apres2c, sideColors=c("darkgreen", "yellowgreen"), col=terrain.colors(12), Rowv=FALSE, dendScale=0.5, margins=c(3, 3, 2), legend="col") @ \end{center} The following example reverts to the default behavior prior to Version 1.3.1: consecutive rainbow colors, no dendrograms, and traditional sizing of row/column labels: \begin{center} <>= heatmap(apres2c, sideColors=rainbow(length(apres2c)), Rowv=FALSE, Colv=FALSE, cexRow=(0.2 + 1 / log10(nrow(apres2c@sim))), cexCol=(0.2 + 1 / log10(nrow(apres2c@sim)))) @ \end{center} \subsection{Adding a legend to plots of clustering results} As shown above, \verb+plot()+ called for an \verb+APResult+ object as first and a matrix or data frame as second argument plots the clustering result superimposed on a scatter plot (or a scatter plot matrix if the number of columns in the second argument exceeds 2). The clusters are shown in different colors, but it may not be clear which cluster is shown in which color. Therefore, it may be useful to show a legend along with the plot. The current implementation of \verb+plot()+ does not show a legend, since it is hard to determine where to actually place the legend such that no important cluster information gets occluded by the legend. Therefore, the user has to add legends manually. Actually, colors are always chosen according to a simple rule: \verb+plot()+ uses \verb+rainbow()+ to create a vector of colors that is exactly as long as the number of clusters in the \verb+APResult+ object. The following example shows how to plot a legend manually (with the clusters enumerated in the same way as in the \verb+APResult+ object): \begin{center} <>= plot(apres2a, x2) legend("bottomleft", legend=paste("Cluster", 1:length(apres2a)), col=rainbow(length(apres2a)), pch=19) @ \end{center} Note that this method is only meaningful for plotting clustering results superimposed on a 2D data set. For scatter plot matrices, this does not work in a meaningful way. In such a case, the user is rather recommended to create a legend separately (in a separate graphics device/file) and to display it along with the scatter plot matrix. To create only the legend, code like the following could be used: \begin{center} <>= plot.new() par(oma=rep(0, 4), mar=rep(0, 4)) legend("center", legend=paste("Cluster", 1:length(apres2c)), col=rainbow(length(apres2c)), pch=19) @ \end{center} It still may be necessary to strip off white margins for further usage of the legend. \subsection{Implementation and performance issues}\label{ssec:perf} Prior to Version 1.2.0, \verb+apcluster()+ was implemented in R. Starting with version 1.2.0, the main iteration loop of \verb+apcluster()+ has been implemented in C++ using the Rcpp package \cite{EddelbuettelFrancois11}, which has led to a speedup in the range of a factor or 9--10. Note that \verb+details=TRUE+ requires quite an amount of additional memory. If possible, avoid this for larger data sets. The asymptotic computational complexity of \verb+aggExCluster()+ is $\mathcal{O}(l^3)$ (where $l$ is the number of samples or clusters from which the clustering starts). This may result in excessively long computation times if \verb+aggExCluster()+ is used for larger data sets without using affinity propagation first. For real-world data sets, in particular, if they are large, we recommend to use affinity propagation first and then, if necessary, to use \verb+aggExCluster()+ to create a cluster hierarchy. \section{Special Notes for Users Upgrading from Previous Versions} \subsection{Upgrading from a version older than 1.3.0} Version 1.3.0 has brought several fundamental changes to the architecture of the package. We tried to ensure backward compatibility with previous versions where possible. However, there are still some caveats the users should take into account: \begin{itemize} \item The functions \verb+apcluster()+, \verb+apclusterK()+, and \verb+aggExCluster()+ have been re-im\-ple\-ment\-ed as S4 generics, therefore, they do not have a fixed list of arguments anymore. For this reason, users are recommended to name all optional parameters. \item Heatmap plotting has been shifted to the function \verb+heatmap()+ which has now been defined as an S4 generic method. Previous methods for plotting heatmaps using \verb+plot()+ have been partly available in Versions 1.3.0 and 1.3.1. Since Version 1.3.2, they are no longer available. \end{itemize} \subsection{Upgrading to Version 1.3.3 or newer} Users who upgrade to Version 1.3.3 (or newer) from an older version should be aware that the package now requires a newer version of Rcpp. This issue can simply be solved by re-installing Rcpp from CRAN using \verb+install.packages("Rcpp")+. \subsection{Upgrading to Version 1.4.0} The function \verb+sparseToFull()+ has been deprecated. A fully compatible function \verb+as.DenseSimilarityMatrix()+ is available that replaces and extends \verb+sparseToFull()+. \subsection{Upgrading to Version 1.4.9} The function \verb+sparseToFull()+ that has been deprecated since version 1.4.0 has finally been removed completely. From now on, you really must use the function \verb+as.DenseSimilarityMatrix()+ that replaces and extends \verb+sparseToFull()+. Since the dependency to the \KeBABS\ package has been removed, the example file \verb+inst/examples/ch22Promoters.fasta+ has been removed, too. \section{How to Cite This Package} If you use this package for research that is published later, you are kindly asked to cite it as follows: \begin{quotation} \noindent U.\ Bodenhofer, A.\ Kothmeier, and S.\ Hochreiter (2011). APCluster: an R package for affinity propagation clustering. {\em Bioinformatics} {\bf 27}(17):2463--2464. DOI: \href{http://dx.doi.org/10.1093/bioinformatics/btr406}{10.1093/bioinformatics/btr406}. \end{quotation} Moreover, we insist that, any time you cite the package, you also cite the original paper in which affinity propagation has been introduced \cite{FreyDueck07}. To obtain Bib\TeX\ entries of the two references, you can enter the following into your R session: <>= toBibtex(citation("apcluster")) @ \bibliographystyle{plain} \bibliography{apcluster} \end{document} apcluster/inst/doc/apcluster.R0000644000176200001440000002504714612700356016137 0ustar liggesusers## ----Init,echo=FALSE,message=FALSE,results='hide'--------------------- options(width=72) knitr::opts_knit$set(width=72) set.seed(0) library(apcluster, quietly=TRUE) apclusterVersion <- packageDescription("apcluster")$Version apclusterDateRaw <- packageDescription("apcluster")$Date apclusterDateYear <- as.numeric(substr(apclusterDateRaw, 1, 4)) apclusterDateMonth <- as.numeric(substr(apclusterDateRaw, 6, 7)) apclusterDateDay <- as.numeric(substr(apclusterDateRaw, 9, 10)) apclusterDate <- paste(month.name[apclusterDateMonth], " ", apclusterDateDay, ", ", apclusterDateYear, sep="") ## ----InstallAPCluster,eval=FALSE-------------------------------------- # install.packages("apcluster") ## ----LoadAPCluster,eval=FALSE----------------------------------------- # library(apcluster) ## ----OpenVignette,eval=FALSE------------------------------------------ # vignette("apcluster") ## ----ShowHelp,eval=FALSE---------------------------------------------- # help(apcluster) ## ----CreateDataSet1,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- cl1 <- cbind(rnorm(30, 0.3, 0.05), rnorm(30, 0.7, 0.04)) cl2 <- cbind(rnorm(30, 0.7, 0.04), rnorm(30, 0.4, .05)) x1 <- rbind(cl1, cl2) plot(x1, xlab="", ylab="", pch=19, cex=0.8) ## ----APClusterDataSet1------------------------------------------------ apres1a <- apcluster(negDistMat(r=2), x1) ## ----APClusterDataSet1b----------------------------------------------- s1 <- negDistMat(x1, r=2) apres1b <- apcluster(s1) ## ----ShowHelpAPResult,eval=FALSE-------------------------------------- # help(APResult) ## ----ShowResultAPClusterDataSet1-------------------------------------- apres1a ## ----PlotResultAPClusterDataSet1,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- plot(apres1a, x1) ## ----HeatmapResultAPClusterDataSet1,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apres1a) ## ----HeatmapResultAPClusterDataSet1b,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apres1b, s1) ## ----APClusterDataSet1Details----------------------------------------- apres1c <- apcluster(s1, details=TRUE) ## ----PlotAPClusterDataSet1Details,fig.width=6,fig.height=4,out.width='0.5\\textwidth'---- plot(apres1c) ## ----APClusterDataSet1convits15--------------------------------------- apres1c <- apcluster(s1, convits=15, details=TRUE) apres1c ## ----CreateDataSet2,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- cl3 <- cbind(rnorm(20, 0.50, 0.03), rnorm(20, 0.72, 0.03)) cl4 <- cbind(rnorm(25, 0.50, 0.03), rnorm(25, 0.42, 0.04)) x2 <- rbind(x1, cl3, cl4) plot(x2, xlab="", ylab="", pch=19, cex=0.8) ## ----APClusterDataSet2,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- apres2a <- apcluster(negDistMat(r=2), x2) plot(apres2a, x2) ## ----APClusterDataSet2q0,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- apres2b <- apcluster(negDistMat(r=2), x2, q=0) plot(apres2b, x2) ## ----PlotAPClusterDataSet2q08,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- apres2c <- apcluster(negDistMat(r=2), x2, q=0.8) plot(apres2c, x2) ## ----APClusterDataSet2q08showp---------------------------------------- apres2c@p ## ----HeatmapResultAPClusterDataSet2q08,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apres2c) ## ----PreferenceRangeDataSet2------------------------------------------ preferenceRange(apres2b@sim) ## ----APClusterKDataSet2,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- apres2d <- apclusterK(negDistMat(r=2), x2, K=2, verbose=TRUE) plot(apres2d, x2) ## ----IrisData1-------------------------------------------------------- data(iris) apIris1 <- apcluster(negDistMat(r=2), iris) apIris1 ## ----IrisDataPlot1,fig.width=10,fig.height=10,out.width='\\textwidth'---- plot(apIris1, iris) ## ----IrisDataHeatmap1,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apIris1) ## ----IrisData2-------------------------------------------------------- data(iris) apIris2 <- apcluster(negDistMat(r=2), iris, q=0) apIris2 ## ----IrisDataPlot,fig.width=10,fig.height=10,out.width='\\textwidth'---- plot(apIris2, iris) ## ----IrisDataHeatmap2,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apIris2) ## ----AggExClusterDataSet1--------------------------------------------- aggres1a <- aggExCluster(negDistMat(r=2), x1) aggres1a ## ----DendrogramAggExClusterDataSet1,fig.width=5,fig.height=5,out.width='0.5\\textwidth'---- plot(aggres1a) ## ----HeatmapAggExClusterDataSet1,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(aggres1a, s1) ## ----ExtractAggExClustersDataSet1,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- cl1a <- cutree(aggres1a, k=2) cl1a plot(cl1a, x1) ## ----AggExClusterAPDataSet2q08---------------------------------------- aggres2a <- aggExCluster(x=apres2c) aggres2a ## ----DendrogramAggExAPDataSet2,fig.width=5,fig.height=5,out.width='0.5\\textwidth'---- plot(aggres2a) ## ----DendrogramAggExAPDataSet2b,fig.width=5,fig.height=5,out.width='0.5\\textwidth'---- plot(aggres2a, showSamples=TRUE, nodePar=list(pch=NA, lab.cex=0.4)) ## ----HeatmapAggExAPDataSet2,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(aggres2a) ## ----PlotAggExAPDataSet2k25,fig.width=8,fig.height=8,out.width='\\textwidth'---- par(mfrow=c(2,2)) for (k in 5:2) plot(aggres2a, x2, k=k, main=paste(k, "clusters")) ## ----APClusterLevDataSet3,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- cl5 <- cbind(rnorm(100, 0.3, 0.05), rnorm(100, 0.7, 0.04)) cl6 <- cbind(rnorm(100, 0.70, 0.04), rnorm(100, 0.4, 0.05)) x3 <- rbind(cl5, cl6) apres3 <- apclusterL(s=negDistMat(r=2), x=x3, frac=0.1, sweeps=5, p=-0.2) apres3 plot(apres3, x3) ## ----APClusterLevResultDataSet3--------------------------------------- dim(apres3@sim) apres3@sel apres3@netsimLev ## ----APClusterLevDataSet3Heat,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apres3) ## ----SparseEx1-------------------------------------------------------- dsim <- negDistMat(x2, r=2) ssim <- as.SparseSimilarityMatrix(dsim, lower=-0.2) str(ssim) ## ----SparseEx1Run,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- sapres <- apcluster(ssim, q=0) plot(sapres, x2) ## ----SparseEx1Run2---------------------------------------------------- preferenceRange(ssim) apclusterK(ssim, K=2) ## ----SparseEx1RunHeatmap,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(sapres, ssim) ## ----NegDistMatDataSet2----------------------------------------------- s <- negDistMat(x2) ## ----CreateToyData---------------------------------------------------- ex <- matrix(c(0, 0.5, 0.8, 1, 0, 0.2, 0.5, 0.7, 0.1, 0, 1, 0.3, 1, 0.8, 0.2), 5, 3, byrow=TRUE) ex ## ----NegEuclDistMatToyData-------------------------------------------- negDistMat(ex) ## ----NegSqEuclDistMatToyData------------------------------------------ negDistMat(ex, r=2) ## ----NegMaxDistToyData------------------------------------------------ negDistMat(ex, method="maximum") ## ----NegManhattanDistToyData------------------------------------------ negDistMat(ex, method="manhattan") ## ----NegCanberraDistToyData------------------------------------------- negDistMat(ex, method="canberra") ## ----NegMinkowskiDistToyData------------------------------------------ negDistMat(ex, method="minkowski", p=3) ## ----GetFunction------------------------------------------------------ sim <- negDistMat(r=2) is.function(sim) apcluster(sim, x1) ## ----DiscrepancyDistToyData,fig.width=6,fig.height=4.5,out.width='0.6\\textwidth'---- ex2 <- matrix(c(0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1), 3, 8, byrow=TRUE) matplot(t(ex2), ylab="") matlines(t(ex2), type="s") negDistMat(ex2, method="discrepancy") ex2Scaled <- sweep(ex2, 1, rowMeans(ex2)) ex2Scaled matplot(t(ex2Scaled), ylab="") matlines(t(ex2Scaled), type="s") negDistMat(ex2Scaled, method="discrepancy") ## ----RBFKernelToyData------------------------------------------------- expSimMat(ex) ## ----LaplaceKernelToyData--------------------------------------------- expSimMat(ex, r=1) ## ----PearsonToyData--------------------------------------------------- corSimMat(ex, method="pearson") ## ----SpearmanToyData-------------------------------------------------- corSimMat(ex, method="spearman") ## ----TruncDistToyData------------------------------------------------- linSimMat(ex, w=1.2) ## ----LinKernelToyData------------------------------------------------- linKernel(ex[2:5,]) ## ----NormLinKernelToyData--------------------------------------------- linKernel(ex[2:5,], normalize=TRUE) ## ----RectangularNegDistMatDataSet1------------------------------------ sel <- sort(sample(1:nrow(x1), ceiling(0.08 * nrow(x1)))) sel s1r <- negDistMat(x1, sel, r=2) dim(s1r) s1r[1:7,] ## ----CustomSimSparse-------------------------------------------------- sparseSim <- function(x) { as.SparseSimilarityMatrix(negDistMat(x, r=2), lower=-0.2) } sapres2 <- apcluster(sparseSim, x2, q=0) sapres2 str(similarity(sapres2)) ## ----CreateLabeledToyData--------------------------------------------- x3 <- c(1, 2, 3, 7, 8, 9) names(x3) <- c("a", "b", "c", "d", "e", "f") s3 <- negDistMat(x3, r=2) ## ----ShowToyDataLabels------------------------------------------------ s3 colnames(s3) ## ----ClusterLabeledToyData-------------------------------------------- apres3a <-apcluster(s3) apres3a apres3a@exemplars apres3a@clusters ## ----ExtractLabelsFromClusterToyData---------------------------------- apres3a@exemplars labels(apres3a, type="names") labels(apres3a, type="exemplars") labels(apres3a, type="enum") ## ----HeatmapResultAPClusterDataSetq08b,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apres2c, sideColors=c("darkgreen", "yellowgreen"), col=terrain.colors(12), Rowv=FALSE, dendScale=0.5, margins=c(3, 3, 2), legend="col") ## ----HeatmapResultAPClusterDataSet2q08c,fig.width=7,fig.height=7,out.width='0.6\\textwidth'---- heatmap(apres2c, sideColors=rainbow(length(apres2c)), Rowv=FALSE, Colv=FALSE, cexRow=(0.2 + 1 / log10(nrow(apres2c@sim))), cexCol=(0.2 + 1 / log10(nrow(apres2c@sim)))) ## ----PlotAddLegend,fig.width=5,fig.height=5.5,out.width='0.5\\textwidth'---- plot(apres2a, x2) legend("bottomleft", legend=paste("Cluster", 1:length(apres2a)), col=rainbow(length(apres2a)), pch=19) ## ----PlotOnlyLegend,fig.width=5,fig.height=2.5,out.width='0.5\\textwidth'---- plot.new() par(oma=rep(0, 4), mar=rep(0, 4)) legend("center", legend=paste("Cluster", 1:length(apres2c)), col=rainbow(length(apres2c)), pch=19) ## ----GetBibTeX,eval=FALSE--------------------------------------------- # toBibtex(citation("apcluster")) apcluster/inst/doc/apcluster.pdf0000644000176200001440000433457414612700362016520 0ustar liggesusers%PDF-1.5 % 138 0 obj << /Length 820 /Filter /FlateDecode >> stream xڥUMo8Wh1oJ%sdȔV[~"ۉ؋HQΛސՈ3j5[Q1u)Zmk#syVku/c՘Q)BĂ )Qh&M!.[0?&d^V#2d^g xu>\n!9뿧~Ű6m0YWXϊ8).d#N+%Zm-ڵqvոdH9y܃^-t0H9"&nKpL3g h.BeSOMQ9o-d S'?t$[B,CX@X䧏~3,(XrI?)MR j۶M j{ R6_nlw:2cfm˱fU| v5)e5֤]n+k\5y^S$*iveo24"gq7}},3DG_'+f;G&*.1SOE|Q7W&QloޛSlk_>f:k&z Eue#_S-P%7UL AO~HOuBMWA욄:Rmx4$S>zlTZckN1z; $Z -9E,Kcs怵7h3+7tx,nlabfe½ 䳭ϺpApN &):^cQ}j=Ʊ*'&Zn<^-5~viYv*~(?7] endstream endobj 147 0 obj << /Length 723 /Filter /FlateDecode >> stream xmTKs0W(#ɖpcL{`ͭAqĠH:r}/a{e|)YְmGj!d,%#.M&onE")y|fd;²"/KqQhŴjNȽմܗJ9 C^55m[gs3ȫI8 hnAF b Id>| K(={Rez..=:Ęk{'!Ta\Vy(>: AϾ: wq.y3P~u32F&?+09*8|C>`^!(U*rIu wH"[CnxEap?A9,*@ji# G?w endstream endobj 189 0 obj << /Length 1291 /Filter /FlateDecode >> stream xYv6+$b$㸩s4n,` QzXdX^؄AbܹsgF^!lϑ0 ؛- /(fs?NU]|!\&_'搇G, ̼|FPhO#<"q]O~},,"Q(Hp_97%,LyS/ p> s&|6ͬaܚ'㢶E!,wwhļ)!F| riS0rtbMYf f6hĂv%^.ͨ&U4)>s^K6/o Scvt:ߘV X6ߨ˫ yɦSsyDibn _vZG-V1e[T,d؟VD<˲.U~0 O!Pm`: Htp]+3~FDSUv2kW&'H5F2 o%1@굂sV;r 1~sNx}&4&d-O NlZuA&Sk.kGǾ%kwH2)2Iu%&7Lz7s,\ Q0JV^mozm +vKNNU[E$ıIoM+[~,lFFg*wbT z]m?}ٛYDb)RȲcwm6kmVfM[ sO8"=pDM%;nit'AMU`*oS]^ ّ+ACOT YGV.nC3PKS}[?9aa[nXz V%K *pN_?u+ێB*[*S2'M@& 8? !0c,w8\k_LCxq|9Cʆ]W۬Sԝ ~L\!\"e,Tn{t,Ui^1χ#="Y:xTiwӇtc;~gb´f'̇g.S-SGОtv5X[gKvs]]! uZe-l\ S Ŧ { OsUPGCSN0߁'&^j'X֟7q<;fw9 =o}ͺl/Z\ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 839 /Length 2392 /Filter /FlateDecode >> stream xZr7}W~/)Udy6NTʮILdRˋbCpnEֺJ4Nnƙa3,0L*DŽfc*h&<360)z$%sx" sed`: )ZFgi#2XS㏣'w3*VT,SqAŚI|;ogO;},178c_D9wx o8p-fxe΢qkp_ǙA˔O:*).4RMN!n[}W7|2%vkR|d`+z\=6r.Zc%l{Hcyr;C{q#G#kLu{lr:`/XՐt:sR?=X[D;i~UxE:WL:vվ<4u;YvE,]!;VMۚ?=[~oUٮ%%9suTޥVwUsԾS]κp[lh׸=wvN&܊l-]"N*^!k=Y[~]6aE&z!eޝ&"=Yŷ^F:IIJg62i4C!h5оa_n Q~2jI(S,ŤXG3{Sv0ty-2G&o~[\Abtg~|tTϏKݛWz]Wc6=_z*OBi/(qҪH6[ܜw65M˼wi03#r^'d-*R軨 構䬀` ->Mv ڴy$mZVVfGdE2}7AccP1_Wןix9\/ \Tk &ݙiEҙ}6 4_qtР?6 =t ྶUWu-jQղUUWl%Vl%Vl%U\%U\%U\%U\%U\%W|%W|%W|%ǹ(o39llς-OIdK0eX.Z9=WfΎ9u1zQPZsYmR̂fke]abQ!y\j.RetLF  3rfڻ2EjUWOFGȶGGax`q7=`-2wQmĐgCċBy6NX/2J2HlkƲ_X !󀤃˸н~b+:#*3ۋUa[`~(e,4%WzQ >9XċsSpU0 ͷRsl;$) vm$XOeƢ8L,Z؅̂tE{%X$}@J= ꘆq6f`n 0)2gI'8~E endstream endobj 201 0 obj << /Length 2609 /Filter /FlateDecode >> stream xڵYKsWOWu.bǑ$btO@ /Lϫ_we dⷛߓ ;BX$[(+4X<ឦlW5[^^oۮv{b֮ne*̮yRFĬ:۬ X(|'{ V͚mb]*T:ɩԈ(#8_p&΃ɴk:{[!kikۗ]ukSm{'K)ᛶ[Qo\Th\a-峻E" H<ޤS%jqZfw?[P`2y}3PЂy 3} LC6N(L$~g=Y0ohԄiXEcc_3l¶'55F^0EZ].3ht4 \npO҂Y޶-* E`j8wI(04LKfR,9ʵ& vڵd[5L]p*.Я~SthΜ5:[B@/\tƌa3o+#Z/mɋW~Q\;ět.ಳESѪ4X\?Xi `Ft@E Ebmi xĩKPU]ּiT. +dؙؐ`c;H(喧8<="]@CW^<'! MTQʟ}0O ׄ&o-ٽ*Yp;ln@A#4'AgFF\Di(:1ÎZ^)AO%hg˾3'tǓ;ilNtRQ-6ʥl 1c:5 м-zgua 9dn` whkR Y*iC,\ 孎=EGr)ԝ@[sy V Ο 5 poh 0[3ӳKL#驇Kiv* -s`$!YWT¹= ŒD{4810'rՃ<7Wۨx3J N:}t L: _̚k-+F o+:~XDe jD0 gC sGg=C(wŤ7i&#X[F(Y P0BzDـvKyOWD36i廒_}xTAIy͕ %\ KԈaXjh9^bڟ" =JڙM2Aع(`NF?5xBt7+7D8tPRuvF:(\yԉs'z^/(1&h{RHa1c"t- _0Rlg}߉v>=U8IuL:1nCUR=vԺ[O*wq09 ɯyJ5,T#r@\G/A 6<~?cf 5tcyB3O1,Qjp,1 uܙg<?s|DF$y\;~?{O~;{G*ƿνu9GƱԸ 1 qjǃ}%5~.籙{ ʚ #x>R>͆so5v.x"Bƅ ,o|ϠA4T5QJ`lkX,'hlPp|sn1-wx~xͤ4z'+@ $$T)n v{u9^bdyS| s|1zTI͛l:,XU뷩0\m ŲRiez uXȽooߪ4ԭ` sAi}.K'BR(9 ɀ5T*L/$qAXm!:P:fev.uHF|';e? áyuu+1] *[UTX\.AT 9WCBX!+ny{Z"7Fa?ɌteW4-v=IʹLAU$ʑXOfb Q6 endstream endobj 214 0 obj << /Length 2391 /Filter /FlateDecode >> stream xYݏ6߿B 4)~I}K{M6mw KF\I޽Jm<}GFFfwEf,EiJN"-)JFe.5ߘ~Ntv4M ,Mh,W{o7 &RI("-Q,*7~Q ]FGxD" 4ԫ?nhNer*kU"Yxwk լ?UFӑ##?չMoFa+s%gR0کCҸWA,sCޖ_ fh$D& ΐ,.񇓩a0`j8:6Es9vMUV  UO>xd _yM$96La3JR8ttan $h3O985׮)f 9w @pn`֧rX=7 V>z |?I5w|\mL(7s?.P煯hZ0SSJKŨlMg- ]0Z\#fhxXZM"Ш|ɒqJ燖 rx /x$D,9J5-P'.tBTU(Ac1 (nXtcl:V8];5'T,.U 0D`s5]%?*[c*#t=dfRK/,qiZ_?rpii 5>Oٽ/3bԒ(ǽAFR{ӗMLj-Ki'Mlm46 _$X5$CG߁y `p%@sӛP7U+Dw endstream endobj 228 0 obj << /Length 1851 /Filter /FlateDecode >> stream xZK6W=@Mh)-PM@K\ZYrhv}y-SSxk{E 93gpJpv% g$N@e )"ae)/8}kWU*}ߛv8m1ُWO3 pBq$I8) F'\' D2*y?mweT␌D ҂DzmëDw#g98v+xF]~Ddk xVA$MiF suoMkzLGJYvM5JuY$ 彺"ޔƙɂh`H,߮Iun؊w&~1MebF-gϔ{j,J+ۇ-b;(]+נXnS;5O@ӡ ϼifgE]co7)`'f.0()IJ' e"jBJ&*% `+{: ߚm`;Qp :]^5C9= #E]%;߽ yK>,--_9g9ri,h&'\DM>H- gX1~gSJ™- #/X~o^'O½S{;sh~Ь.=4'Oo/7s9l (UzƦjS/+]ƜRz(:휤Yr%=9ɨ@8ׁn&:Tݳtߜڏ@$-ۋU=SC;WlʔHW )v8.viM췝|H^Ld(HL|@4+YD>&ԗ`H\m]/jluӆ7dHrz\ sJN(…|(!c1"MU5N\jTiĹϪ7)jg#!Ͷ11'~vr].ӟ*o' Y9;40cOK>6@˺tZ\ {Wq B* dBۘ^Q Ś"o֛Q&o+~Bmy!D(k! 0vtHbq861|M9,Nn+vEwT9)i%Ǒu Fz(xnUŘHM;':] k0\d h"5vIY=ٴFIֽ@St j`GWgeM7S_k^=l/o8p ׃ ͏Ъ=j:{4vd]Nv_.zU'Uws)R5M&v)%SF%,ljWv ez8mU* 5;JQFoRfHi=uVv:fagj]ޖ>ԃvk]| 6eza!=WJCQ*͐U̐jwWO +zv*_ ?ߖ?E!os8GT-AP."!0 aoi^, }A8#?{; UH2[XoeQVH02:[{H 4[3(DX*-wd5Pv'JzM; U>[K] @oy endstream endobj 224 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/CreateDataSet1-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 232 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 233 0 R>> /ExtGState << >>/ColorSpace << /sRGB 234 0 R >>>> /Length 4028 /Filter /FlateDecode >> stream x[K.N|VvJ s$UBY:+ݭ3|8㫼~~׸vy\Ug;F}׿?>KD0$앆`݆ow7Ǡ9!1ΣvbѯG}<@a;ZSr#?w~YZ<KFpz -`A60/ 9}aNI;z _~Yllnk?Y$iǴ-h~L[0 2y?\"؎֔^<zEw<]^,"A=||ږlg;j{x_&OVj{ 4ސpDJg+6f&})KW~*R097yU4e7}ei>QS1V} cgBaW1j]]Tupn^8M|W I?NM vӉXGa=\"؎֔c{s>5~gpfHIU]fysp a'ÏUmŵ5.ہu-="wROk-ϳCTjp<|y:| R?|$zpcivzE77y.[vwlXfgx=61/_.*y*R`g)ٻ`<>{} gB,׳Tw1<OVxlSVjI- kƨ lM찴`#cƨ{I1"&:w$Fa& `n '޸kH0|x:N'ALԵRR})Z|pRC4$(慥nM`Fݑ*`ؑoϺѹRkyH)A Mq[}oUčOݼwɅPi7?ruY BQ$5(%O&ct'%!T6Pfߡ_7Q=Z$!%5/ ;BV4q!9)JSZx#듻" Z3wrqEb׳ͳ )/%hMI%\KcH+~ӎX^ثצC ءNM)S{,Tʹ 3]3rSK7i{qe~&31NQ#$n| u ZPg_+O.(J}z\= )F >"s޲p`[W7sOyOہ |ᗸߊS8[%8B= \!a R,%-KFD+XGF5M= 8-&U:J:I֣:%h=u%w ہu-}Ց a6uɠ<" a*c7q"h\v~#%sh_fm+RH5/ .lGkJ0=07o 5 !lCn`\E4)(YkY_o_~yŻ{ ͬ1͈/ `q(@(A],mDZz_yV&hwg>^qѠ°GPUݐ-IAқjpiᔴ8FDs/KH\"؎֔qG)zx/rwYw4)A 5#Dk}1-%Zj#@FE[zEw< 7#sO |7 b }w_8>%j?)D˰A@њ}SO\#%4B .E[$H\U$n6~y)z>8/E2jX%kˁ4vJ C:%ђ-myw[KB/.ؙ=y.LD1U)+V1BC8>(|~oB(XwI3,J|CwIAu?7^¤q+a;PK]y_QI7eNky 2%7vWKjB^lKQI)Ʌ(lG/rwlURҼ.Vb'XwUű IQOűT_~?k 琢 )8q.<+%)QzAUjBqbtzK:$b^Nہty҇_~o~vYIZ6^ny,!V\IJFeg/rwq˔_UK|r;֗ V `j \J$޳xϲڕOj6_~v))>< [ ׎J\S%I,(+ qnY0W҇_~kYMV?{'7K;,uQ<X\+jyt yۮS޻$wrXPfXl箸#m̂7oe3v}+IjKpA)*+}+ySR==Yeȫ~?dYWfF.Tֱ)[zr~4/V I":\n;2H[zu2ƵQQ c.qtK (- ϙCI0?o!8S/o 1+ #6#ʪ1k|w@}-,B%pHT GFIe U0}o[o9QpG_1 K ϭۑv z/~+ICzI.A\W\HafGW%zOHK(Z˯~[ςdNOAwkz7QjbXK# 9 x}TV^Oj6_}jG}'Ո6#@ JJDhrj>s*7oǸ7E<|z"/X ˍxgo`ވV|RԆ7mj*WM`H!`Å+%RJd=S/|-T>OE:sb|^FL5Siz/~oA9+>]2{hlB wM}ũ+zB4%{'vӯ~[{5Fސ4t o;> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 240 0 obj << /Length 1025 /Filter /FlateDecode >> stream xWM6 Wp&y&V vҝiv}KsPlV+[$&ymϮ>8 uJ<ђw#hCݍ~~=8BiQ%NMC hr<1>ObN,5:w# ZJ]1S&qj}՜ޑ;Ci^<8ATxA&Ia[U̓kZ/nK3KXTx/(CDrj_/]us;DCz&)] 03]tEEmVE$V|hQf5 ʖǮfyFD&_[/NO31ד*g+A&WYU_UĞ8zR!vU?P9f=h5J0v6Ѳx‹Mfծ%=Z7!10+.<}\:7Mi@ݗXjǥ/ Ԏ|KF W)ޫW!sqʒtGRu,vE8֟+6u/(tK7mx$c4:E]?N`21XH1vuYMٕ}܀1s {)Ӊ?3)mY tU =U ʊi߼@Oap>1;F; pb ^;ʸ!0}5,لW)Ÿ @`Arş/#r:IDM̘T`mԗjڗ:8? ((|a+xVO$%p+xV<,w,N̸!#Č3N81 o=6AcZ&1T|ٷ:KEMY=6 ^ OU=5IݔrW]γ64X^z,y8Wei谿ƏZvP^5]H endstream endobj 246 0 obj << /Length 792 /Filter /FlateDecode >> stream xڵUr +XHtNLK]qVGR{y&3" #{ᘒ D`ۛ"@ɷYrS*(QT14[JZ(T JhDwJRpfR/4ceo'=x2av%O (b[>.dh&w-a D/" T & =z7q)V)J.uS1//}aEH=rwz]vJ<*i 9F/>~E? fr y̐ }:L jn=U (t2k;ee:j{p+m޿ź[NΖZ0`:qCK]:L`x5ugFJcJ}S7~P{ ۵#ʘ vK=_  ) q~o'!cNpiN*2q^0J`VA+/T9H>YT`( *o7"590Ncހ10I:^Y BR{̃[|켁9ۣy by؎tfGe s Ly,c#7aG2iqSvp{J󡍋>}=ztq%XX}uñ<Qo,mpF)^6[y+oe~ =-U΢)< /&2  endstream endobj 237 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/PlotResultAPClusterDataSet1-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 248 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 249 0 R>> /ExtGState << >>/ColorSpace << /sRGB 250 0 R >>>> /Length 4500 /Filter /FlateDecode >> stream x[M-mxr髤ڎ0y@W`xya>؋I%QE??Οw?}۾O#Yǿοm;϶F<-A+[WKO k:_ @ Vȥ8 ތ¯?9dF~>VʣǷ溿Z1^@yvt.v/@K/.t;>z>TsjNw Q8f-9ɵA? 9mрڠȥVZѪ:_S6_c7_s6"_8;fxɓh ,0E(Os~D{zrio1o}XPk;Tf_s6?d-Mw.Wu&5!8.,)׍́vy^BkM9"vlWۙqZ<<~2 0(WA=;-4\|A11=,<p) #6/vaAA7Z}kfڭo)>iTiyZJАVbS2.lXgyߔ.bW-iFw[)16խLo%uk{rE.Ԛ'Ԉ|9hTs]I#Z)vy(NxS )n1fcu(͜swƨa I0F1x&ĨQQ tTAx. \1˵2ykAs5?9u϶g#ܟC-Fkrv ;ӀZoic6p1W#<~69p1(o=!o K*kIg7vq[rEj7%'bK{8Ն)lXr1 vNAț-rj휼5;<7vE^-c݉Eƌqyڬ s> |9vbI*q ՛1],   c7l-ĘYκ+ʓynm1f܄Z&2xpRZjkĨX saLo;,XX 3Xdu1,Mvqf;J4(TyO_’rhMf`(54QZ]7崋na 5 !$UT+(^ƒ{$ ;~Zoi/vs_n\lZvL\S/@xܱ)8O‰3Vp~n8 OHi^l^}aP X"3a:Kl݇8Y 1|-I]'H )nU+kaNN1 v~ɇrhMΎza}KN]oA=-.\+?6a64on'dq6#}BSXRCۼ#ݠ}KN]z6< Zf {`ɬև['yFXRE*8٫2PSh;)]Įv[zFlΟ++8cP_JPg$& Nu n}SN]ּ$}_my9)Р4vM΋c{{p< s;iFߔ'͋cW5/~Hu7}gWo欚6uHaW$Ċrh N9[}TrEݚ*{qrPyU틗ElqK免W2%ϾMЅMpr"lAa^w1vb78\f g ̋ws]Kf R`EHqZXK^Z[rEj7kc)V,^N'QɖI^}TV g=e{WwEaN+թ9ϺB%uQo(ϸ}slPI%VvzdC7( Nصj[R}+' q`'f&I>%|+\wH C7(E=[r%j-io׼s`^T;n-'Q*"A ,y N[0]yaߔ.bW/k8V#|6'T՚']3HEPbryyan4޷s.Ǿo1T?'$TIV<(8v]vj!]`InXKG J-9v{33 v+Mͽ Q{VXRj-ieq:Gߔ.bW1=1*ؽi#QV-jNkk ?X 5]eU.wwϕ¼I9<]A:\tRi}KN]v_V|\KSJC*S_VQyڵS-*(yC.}[.zȂMC +F7 焋5`EUA(ʵw{1YR엫ϕ``{69nBϗ<+*.؃, lGoe/v+I9(8]5S;8_yR%O4$sV؏. 7 -^U;LdT0 Ua1"8҈'c3MNl%%nMI-RXCbeMmTbЪmd)g;-JNk*Ijc*7崋nlG cɋODPzؚDp +ZcR[5êi #60_g=ea#|x6#U\vbtWx;evXD)9w]aE+D:ao ݠ"KN}[߆1"7F^p_Xl7# *c %t+/(|cU`ץ'O^\mr>^uE~ozw-x$-m=&zċw-Ojo?/Fjī&z>Z/Xzwo>ǯM UQxu?7|y7PBxZtofz{&J'>hgxq/V~O7K:[ޮzvx{cyKʻ&|q[mN^KKGnN7(wM:ZTeG^ E/bE&`Z0`ӻ{ae"ԩn[R}?(pvS1euőBPͳ|o/Is K!|%ҳw&o ^zG*? O$%%~/iΕK endstream endobj 252 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 243 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/HeatmapResultAPClusterDataSet1-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 253 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 254 0 R>> /ExtGState << >>/ColorSpace << /sRGB 255 0 R >>>> /Length 15270 /Filter /FlateDecode >> stream xˎܙ]S8qT݀gj XZ4ڬOo[V3E8=ߧ>㏿]OO_z~z|>]/7?_OcK?/ z>m%k@oW>/}/}<tzy}| tK__#{x|Jz~~$yzەٰ[dʳ3m {w%~{kϯ_?.8^Wu~{{)珏g?_yy=rz{59˶=ҞyَEiϼyy{e;=q{%툔vDJ{u;=ҞyݎHx\>x>xݎHi=}vu;"};zչms_N95tqcO =/Q,~Kp?|ۏd Va+m v=HXu?E}d퇲DY,яnz;v ;$iwۉ<﫷SyY}NyN|~=-ۉ>ƷzޏoNy?~|;vz$4ۉ>Ǘb?~|;/ ?ǷS~ޏo'Ny?~|;=v{co[=ye)u_NHΩ?C9s~;=_??=׌vfp^kח>[7q|x~8>S?G_ެ_̍rQr|woدo1 xUrLM8& Ǡm1ixG5xx~%&L< ǼM8׿1xUYrHr??E9f$7p I<$~cNbAǤww1+qXiǸc^10SxLqX:ܟVV*vߍe_XW{uc]E}\W۪mֲQUd_e]EwC]E=쫬*[" ?쫬ǾʺܻCWY}P|}}GA?@?@?@?8U#hGbGp?dl [vf*QLhBc4S1|4)4)6)ŗR*6f*4)E30A?@?@?@?mp#hGz`?\sbgX?cQM`ECuWlJ))E4KؔtP|*)tM4ҔtP֥c_))E30З-//A[:@_:@_:@_:ttttmpR#hKKKGЖЗЗĖ`tv֬tѬta+]c4+]c4+]c4+]9~3.f YRt4+](Jb YB 6̷`҅h} lִP5-fMKJҬi4kZR%P:C} T:C} 30ЗP:C 30P:C}I9P:C} 30ЗP:CP&t9 ȖΰuܟX$cY:'1֥~u鸟c]:5֥~Jms8FY}ucuұ.?vץcN_:H?&*nº&Ƚ?T}uWYW}P|}} **HVWW""""A[E@_E@_E@_E8+[9;c((A[P@_P@_PT<udi[Puc]PG#eA)1~uAq]Pn~((Y?suAWYPP_{((*낲?/(ຠV7[]^凮r * 뮲*쫬ʾʺ4] JvwU@UmW}W}W}W ڮ]iwзm%o%o%AJ@J@JjJźO񭴳f]mf] XWYWYWYW(ƨPu5f]MJҬ4jRu5f] %2)źo%ຊ&PEnP9feYR̡4+s(ʜF 40J@JC+0J@JC+ 40JC+}+ 40J@JsZ40J@JC+ 40Jo%ಕO&6Qlt@xN4<MhX僆=Qlll"lwfNJqwʺ_`'6;9͚&)V;˾mD[4 Em;bNN(*h(D+ sr;gYIu{4KsTN$h$h$Q_IPICS%AC%JJJ   $+ * * *IWgPIPIPID}%AC%AC%i|%6twPIJ$F*iF* QJ©* $9M%T*I$pB%AJT:QuRQ6ESNUT8UQi **4E  J4TTPTD}QACQACQACQE?44/*h(*h(*Q_TPTPT_TUQ;p*vE+]QRjWڕFjWʢ+q©jIEjIE5+* E 44VqJqJ©*i* qR% M44U4TTI;44U4TTICS%AC% M44UTIPICS% M44U4TҜS% M44U4TTICS%AC% M44UM* o/.*iຒFYWҷJ(4ߟ$*PIv˪o֕$:J+wJ]VWו* |,+oE$hDd7iRWκ[}u%YWJ   $+ *ih$h$Q_IPIPID}%AC%AC%AC%J,* * *IW4T4T$h$h$5$Tn'KwT׊ߦ| J}*(H)J9ͷiTpoU|{Ub9urB;A{r9ͷȩ \/hu8N+rX9Zq;9NY8D}gACg M %; : :Kw4t4t4t,h,h,h,QYt@,h,h,QYYYTED5뾛af7J`')͚(WTkvTkv(ӝP5;jZӬ4xxwAQ(F\(͔kTSQ)JDQ'"TOD y"NDr'"TS.P_j%y"N,h5gY8ճpgiY8ճpgi: 't4t4t,h謡D}gACgACg΂΂΂   %;  %; : :Kw4t4twh3zw(Քkjʅu;wZ! \Ŏ Z='anEj'hu NS].]NN8D};AC; M $  IԷ444o'hh'hh'hh'QNC;AC;AC;vvv  $\C; mZCiVFmZZCiVFmǩVpk4(vv9͵8ժN*ժf'jonON(ժNu;NufZS8͗iXN/hvkh/hkhkh/hT_CS} M 54T_P_CS} ME+6k`5zJQ/R=a (F&W8pɕ 8pB}6+ 84+==_ח}˾N/hY 8<@Nh'h)6 ʿp'"/*h'y"Si p E E E% jh**h(*Q_TPTPTD}QACQACQACQ  J44/*h(*h(*/**ۡ=U8hRRuJYT3Q(Ug45J7©: \ɱ%ZN(*Q[TU;ᬟj%INFAvk'97%˩ **j}ONST8Ռ bp E E E% jh**hbԝ㯣Z7D}}AC}AC}AC}EVt7JMԗ44/5h(5h(5u/5f9a5Z7PJn8Jd4w4wJiVGS&4wo2hnSi q;puCPjjpnPrAuCjZ7Ӭ4ɩ 4M  L744d0S.h,h,QYYYYD}gqnS.hrAC;vvv  $jv0~TI;=$hkwB!⠡$ sQ?ǁMgP{nMg, 냆3Pf`Q==3?WtqVL:CY='ܶt^[mygl˹His:᮳E[n[Cm:᾵ylp7=--5 CÝo/ |wVs:EŭQ8>~[ny'O5.NjNV[%I庿J* +i`JJ* * *IW4T4T$h$h$h$Q_IPIPICS%JJJJ  $oq֕؈oFu%  Ӈ?}/~or=_gCKS ew?|O.m||nxX}eV80z$PIO8$mJ[xj_ɿNNi`hvi`h'oD};AC;AC;vvvv  44o'hh'hh'hh'QNNN̈́ 0h5K+ Z͒}ĩfIrYN5K©fIrYκ묋ʿ[(*h(*h5K $f%n䷭0T&j$0 0^ 3US%0UPIֆJaJ*iJ* *ihJ*ih$hJi$hJ* *iḧ́ 0T&u;m Oi\n[; N8IN3w©N8a$̝pN5w©NrB% M4;Jkw8U$jS͒,{YN5K̒pR Ffj$顷}C =40CC ==4044!h!h!QCCCC= = = =${zzHTS#05VS#9~j 3T!9|]6ߊjSMpI88uw74o^~g8}f>8g8~۪NhqVT39Mg`hqqg`hoqqqD}@C@CƁƁƁ  345ohhhhhhQ888ƁV9q1U8v̗Lwpʘ߶jS]eS]eS]e-4]wIз,N2]}/~os"j#V3uʲVT=@衁zh`衁= = =${zzzH44CD}ACAC63p6tS|VW MpIfSMp+4W T!j>S͇V!X͒pYN5Kl't$!9, '%iY?ivi`hN;LNC;0NCS;AC; M444NCS; M 44N; 44NCS;AC; M44jq20KvihNS8];T4NNtS8];S͒pYNCS; $ѪU8]%fIU8]T=4Nꡡꔪpiﱇz{h`衁zzzH44!h!h!h!QCCCCS= = =$ڬTkk8ښCpn ZEӬTh8*f ZEé*9||*N(f3]S]}/U4|4h8|UHU49EO!ЗЗ-///A[>P>|D}Ԗ/Q_>#Gԗ/#砶|D}sP[>|D}i&Ar|6ñ#LpIft8$HN3 Li&ArZ4S#9ZLtlFrN]}/$ڴ4pvKNC; 40NC;}; L  $  IԷ444o'hh'hhD};AC;AC;AC;vvvm j'ir Z8ՄINUTr© **9MQ4&9UQTE%o'ѪpB%6Y$f$y,C;V$$PIЪT/M%ɩ*O3US%0UPI;LTI;L40Tc% M44U4TTICS%AC% M44UTIPICS% MXIPICS% M44U4TTICS%A59ښYEraNS4O%:eٟz*um[YErgiUt8ڬi}83uVlk$yF$T5v8v]l=nG5:nNC; 40NC;}; L  $  IԷ444o'hh'hhD};AC;AC;AC;vvvm&L8Մ 04W+o'hh, Zp4W+iV:j%9, %T$9, gNhaYIN5a©&Lrd߃&9U;)l Z͝4ŕMӴ)NC;}; 40N@NS;AC;AC;vvv   $  ihj'QNNNNDv©N8&hUIr|%AC% * $9M%TSUf $pJ+ * ZUNUIrJWUNUI8U%i* $juNNSI8U%^JSUJJav*iv*i`J*ih$hJJ*ihJ*iJ*ih$hJ.+tu%}?60}?6SY~߶TT;VPT4kv8뢲j(6s8v?On'mvn'Dm%LW{n=dz_{o[↓zh躇VT+nrvCC ==40CC} L= = =${zzH444!h!h衡D}ACACACmV©z'LHNjrB V©V̒pYN5KӬTW+TW+TW+= =V =$L8US#$$9J$jmMN35 KR4S#9M%m]8TPIC%}% 40TPI@_IS%AC%AC%JJJ   $+ * *ih$Q_IPIPIPIDNUI8|H_[qUN5̇pkqk4S#jjSUNUIr|%AC%AN$m, %T$9JnS͒4$PIjzifIrJQJ*i`$J* +i`$h$h$Q_IPIPID}%AC%AC% M$+ * * *IW4T4ThsNu6N$躒}^%-ݳp֕dߋI8Փp*h]r(4E".= =mDN!eٟz2N#!|4O =muIrpvzhaaꡁv{hhꡡzzhhꡡzhhꡝzhhꡡzZ8]S͆S$hꡝviTi˩zhjm '""""[N衡VWd8Ue8U8UrcU8UrǗr뮽V4hrvS졁zh`衁= = =${zzzH44CD}ACAC.zϤ8/'̇I[};6조?}/~!塇De~+=bC8J꺇{ȿD!<4:ݟוdJ۶$:J{mUIaK!躇Vz(mECNzzh`!z{h`!h!h!QCCCD}ACAC M=${zzzH44h3©C8|!h衡|iC8|'̇DN5©C8|H!h!h5 =$CӪN5©Crc|iC8|S>oKꡁzh`衁= = =${zzzH44CD}ACAC.{gCߎ~8a>]ߊP>P>Cq,\8߶uYз8]8]r|ACA=߿C}wogau%-USTS+oۺCzjuʲVt=qazhvzha졡zhh!h衡zzhhꡡv{zhhꡡzhh!hso>NuNꡡ$HNso>NvwTiǩ:é:ܛSݛSuSu&'TTIC{qR%AԈ3]55©ǩ—!;ǩ—܅zhhu:LNCc====$h{zH=${蠶D}=tPCD}AC!QCj{Her29zV!h^&Y/;4ergN&YEӬiV!fMҙ!9*fp=d*fp{HY/;:X/;_[졁zh`衁= = =${zzzH44CD}ACACO%{HNY9SǗy*N5ӬNT"9|HN3:DriCr6O%zHgCri?t8C͓xҐP>fe(bt8U|ޚT>;LT>C0S0P>;34T>P>CS M 34T>CS@C M34Nc@C M34T>P>CS Mm&A8$|Vf>Cg Y7.NqBr֍㷭yҐICr' i4t8qP>P>||||D}@C@C M#Gԗ44h3i\#}8||VH˩;rk4Hi>i9tFZNs6H #Z\#3]sjS|,{ȾC5rIf|HR\9}8M%moJ*i`$J* +i`$h$h$Q_IPIPID}%AC%AC% M$+ * * *IW4T4Th3©C8ՕB8HzjmvTifI8, %i©©©  Z]?JtYT'*©*©*,**©*Lp„ Z]Ui*Ӵ|vi`h'ov i`j'hh'hh'QNNND};AC;AC; M$   IԷ44hqי39aSu&'T"殳i*©*©*Su&LNuUNuU_IPI39E h:+Vܡ&Cpd߃59j\ ܡv4Ms]>Ovivajvajvihjv ihjvvihjvvihjv Z8v~N+*f]_m,qi[é[é[S8]Q8]QᄢjhWTㄹ貝OP8];ӵNNt4NN8U;ihN4M3wc/OOU_ǟΈϧqO?_xing/qs;~5/,ż>lng۶ ~~173Wa};5?6?}b~>nnU /[3E-i+W=tڂ}|_ڎHϟ{tnǔ;=괝?_1}|:mĮ_i~ o_b>]b>ݹ~}|:_yy;r߯[$|ܹW~h>_ׯ}z<___/}(;^߯Gc~?^j}wa{)1~uy9c/Wccrz?^B{-zjKcYwe˱c1~uy|~z>_]bڲ{-1د>>~1r?ƾ~z?ƾ>_]6;ƾ>_]6~=ֽ>_]/cukcukcz}/r}G}8~XlB>9듘}-/qnB=lɿǷt__۩t^lVyK t,+wGrYWuKdr_.NbKwKrSuq^[.ba~lE,Qp/ۡ}+w;/"tw垯:^1]kSX!c^S}?TyY|[:+UXu~\tW狎}1 UX?X-1cVMX?Z~r'ck~m+w2~ȷr./+EX?\:aҌcϳ~xtuk3~XrOWc~O:ƶuK3>c{#lS]`}uV?txm۫uݢLVݚc;|F/zޞߟ8헵\sEx_̷ ^o8OTP endstream endobj 257 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 262 0 obj << /Length 1247 /Filter /FlateDecode >> stream xWKs6WHX@ѩ4$Ck4HD|gAzrzX,vŷK77\"J$e&"F8C}BژȢ;"%9pdH?/?-g_f DQ0I$)ǜu=>"ӄQFi0 ~c;8s>n<'1 F1խ`ta~o9cL~%Qc j<1ЛwDrje]V/߲̓k֦l+7]yv7sJ"c 8L% -hY*õ2}ScPvgqv^Ƿk*= n-ܟ.Ө8!0¥ݕ_`ӻsrM6^ؙچY;I9} 8?\gQ98^Gxrl(ׅ_ۙiܬc)\) +wtuGmF喦iKeJF!չxB+Sg Ny6p\gixxG$P>ݐgǫ2z6^͢֍a!>1=HJQrʼHP8ܢ T2@(NŽ y=^r%/!)a,;)6`~ry*h?WAQ]fG B\a!(ϰ)JĒI`_ftƅ3|Ss w(Ad4/TȔAJS]׵2q3ӺPshSywt 0a6*QC *ɶ(j IchC-R/x%XF8я?G /u.3a8³i ?86N endstream endobj 258 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/HeatmapResultAPClusterDataSet1b-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 264 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 265 0 R>> /ExtGState << >>/ColorSpace << /sRGB 266 0 R >>>> /Length 15270 /Filter /FlateDecode >> stream xˎܙ]S8qT݀gj XZ4ڬOo[V3E8=ߧ>㏿]OO_z~z|>]/7?_OcK?/ z>m%k@oW>/}/}<tzy}| tK__#{x|Jz~~$yzەٰ[dʳ3m {w%~{kϯ_?.8^Wu~{{)珏g?_yy=rz{59˶=ҞyَEiϼyy{e;=q{%툔vDJ{u;=ҞyݎHx\>x>xݎHi=}vu;"};zչms_N95tqcO =/Q,~Kp?|ۏd Va+m v=HXu?E}d퇲DY,яnz;v ;$iwۉ<﫷SyY}NyN|~=-ۉ>ƷzޏoNy?~|;vz$4ۉ>Ǘb?~|;/ ?ǷS~ޏo'Ny?~|;=v{co[=ye)u_NHΩ?C9s~;=_??=׌vfp^kח>[7q|x~8>S?G_ެ_̍rQr|woدo1 xUrLM8& Ǡm1ixG5xx~%&L< ǼM8׿1xUYrHr??E9f$7p I<$~cNbAǤww1+qXiǸc^10SxLqX:ܟVV*vߍe_XW{uc]E}\W۪mֲQUd_e]EwC]E=쫬*[" ?쫬ǾʺܻCWY}P|}}GA?@?@?@?8U#hGbGp?dl [vf*QLhBc4S1|4)4)6)ŗR*6f*4)E30A?@?@?@?mp#hGz`?\sbgX?cQM`ECuWlJ))E4KؔtP|*)tM4ҔtP֥c_))E30З-//A[:@_:@_:@_:ttttmpR#hKKKGЖЗЗĖ`tv֬tѬta+]c4+]c4+]c4+]9~3.f YRt4+](Jb YB 6̷`҅h} lִP5-fMKJҬi4kZR%P:C} T:C} 30ЗP:C 30P:C}I9P:C} 30ЗP:CP&t9 ȖΰuܟX$cY:'1֥~u鸟c]:5֥~Jms8FY}ucuұ.?vץcN_:H?&*nº&Ƚ?T}uWYW}P|}} **HVWW""""A[E@_E@_E@_E8+[9;c((A[P@_P@_PT<udi[Puc]PG#eA)1~uAq]Pn~((Y?suAWYPP_{((*낲?/(ຠV7[]^凮r * 뮲*쫬ʾʺ4] JvwU@UmW}W}W}W ڮ]iwзm%o%o%AJ@J@JjJźO񭴳f]mf] XWYWYWYW(ƨPu5f]MJҬ4jRu5f] %2)źo%ຊ&PEnP9feYR̡4+s(ʜF 40J@JC+0J@JC+ 40JC+}+ 40J@JsZ40J@JC+ 40Jo%ಕO&6Qlt@xN4<MhX僆=Qlll"lwfNJqwʺ_`'6;9͚&)V;˾mD[4 Em;bNN(*h(D+ sr;gYIu{4KsTN$h$h$Q_IPICS%AC%JJJ   $+ * * *IWgPIPIPID}%AC%AC%i|%6twPIJ$F*iF* QJ©* $9M%T*I$pB%AJT:QuRQ6ESNUT8UQi **4E  J4TTPTD}QACQACQACQE?44/*h(*h(*Q_TPTPT_TUQ;p*vE+]QRjWڕFjWʢ+q©jIEjIE5+* E 44VqJqJ©*i* qR% M44U4TTI;44U4TTICS%AC% M44UTIPICS% M44U4TҜS% M44U4TTICS%AC% M44UM* o/.*iຒFYWҷJ(4ߟ$*PIv˪o֕$:J+wJ]VWו* |,+oE$hDd7iRWκ[}u%YWJ   $+ *ih$h$Q_IPIPID}%AC%AC%AC%J,* * *IW4T4T$h$h$5$Tn'KwT׊ߦ| J}*(H)J9ͷiTpoU|{Ub9urB;A{r9ͷȩ \/hu8N+rX9Zq;9NY8D}gACg M %; : :Kw4t4t4t,h,h,h,QYt@,h,h,QYYYTED5뾛af7J`')͚(WTkvTkv(ӝP5;jZӬ4xxwAQ(F\(͔kTSQ)JDQ'"TOD y"NDr'"TS.P_j%y"N,h5gY8ճpgiY8ճpgi: 't4t4t,h謡D}gACgACg΂΂΂   %;  %; : :Kw4t4twh3zw(Քkjʅu;wZ! \Ŏ Z='anEj'hu NS].]NN8D};AC; M $  IԷ444o'hh'hh'hh'QNC;AC;AC;vvv  $\C; mZCiVFmZZCiVFmǩVpk4(vv9͵8ժN*ժf'jonON(ժNu;NufZS8͗iXN/hvkh/hkhkh/hT_CS} M 54T_P_CS} ME+6k`5zJQ/R=a (F&W8pɕ 8pB}6+ 84+==_ח}˾N/hY 8<@Nh'h)6 ʿp'"/*h'y"Si p E E E% jh**h(*Q_TPTPTD}QACQACQACQ  J44/*h(*h(*/**ۡ=U8hRRuJYT3Q(Ug45J7©: \ɱ%ZN(*Q[TU;ᬟj%INFAvk'97%˩ **j}ONST8Ռ bp E E E% jh**hbԝ㯣Z7D}}AC}AC}AC}EVt7JMԗ44/5h(5h(5u/5f9a5Z7PJn8Jd4w4wJiVGS&4wo2hnSi q;puCPjjpnPrAuCjZ7Ӭ4ɩ 4M  L744d0S.h,h,QYYYYD}gqnS.hrAC;vvv  $jv0~TI;=$hkwB!⠡$ sQ?ǁMgP{nMg, 냆3Pf`Q==3?WtqVL:CY='ܶt^[mygl˹His:᮳E[n[Cm:᾵ylp7=--5 CÝo/ |wVs:EŭQ8>~[ny'O5.NjNV[%I庿J* +i`JJ* * *IW4T4T$h$h$h$Q_IPIPICS%JJJJ  $oq֕؈oFu%  Ӈ?}/~or=_gCKS ew?|O.m||nxX}eV80z$PIO8$mJ[xj_ɿNNi`hvi`h'oD};AC;AC;vvvv  44o'hh'hh'hh'QNNN̈́ 0h5K+ Z͒}ĩfIrYN5K©fIrYκ묋ʿ[(*h(*h5K $f%n䷭0T&j$0 0^ 3US%0UPIֆJaJ*iJ* *ihJ*ih$hJi$hJ* *iḧ́ 0T&u;m Oi\n[; N8IN3w©N8a$̝pN5w©NrB% M4;Jkw8U$jS͒,{YN5K̒pR Ffj$顷}C =40CC ==4044!h!h!QCCCC= = = =${zzHTS#05VS#9~j 3T!9|]6ߊjSMpI88uw74o^~g8}f>8g8~۪NhqVT39Mg`hqqg`hoqqqD}@C@CƁƁƁ  345ohhhhhhQ888ƁV9q1U8v̗Lwpʘ߶jS]eS]eS]e-4]wIз,N2]}/~os"j#V3uʲVT=@衁zh`衁= = =${zzzH44CD}ACAC63p6tS|VW MpIfSMp+4W T!j>S͇V!X͒pYN5Kl't$!9, '%iY?ivi`hN;LNC;0NCS;AC; M444NCS; M 44N; 44NCS;AC; M44jq20KvihNS8];T4NNtS8];S͒pYNCS; $ѪU8]%fIU8]T=4Nꡡꔪpiﱇz{h`衁zzzH44!h!h!h!QCCCCS= = =$ڬTkk8ښCpn ZEӬTh8*f ZEé*9||*N(f3]S]}/U4|4h8|UHU49EO!ЗЗ-///A[>P>|D}Ԗ/Q_>#Gԗ/#砶|D}sP[>|D}i&Ar|6ñ#LpIft8$HN3 Li&ArZ4S#9ZLtlFrN]}/$ڴ4pvKNC; 40NC;}; L  $  IԷ444o'hh'hhD};AC;AC;AC;vvvm j'ir Z8ՄINUTr© **9MQ4&9UQTE%o'ѪpB%6Y$f$y,C;V$$PIЪT/M%ɩ*O3US%0UPI;LTI;L40Tc% M44U4TTICS%AC% M44UTIPICS% MXIPICS% M44U4TTICS%A59ښYEraNS4O%:eٟz*um[YErgiUt8ڬi}83uVlk$yF$T5v8v]l=nG5:nNC; 40NC;}; L  $  IԷ444o'hh'hhD};AC;AC;AC;vvvm&L8Մ 04W+o'hh, Zp4W+iV:j%9, %T$9, gNhaYIN5a©&Lrd߃&9U;)l Z͝4ŕMӴ)NC;}; 40N@NS;AC;AC;vvv   $  ihj'QNNNNDv©N8&hUIr|%AC% * $9M%TSUf $pJ+ * ZUNUIrJWUNUI8U%i* $juNNSI8U%^JSUJJav*iv*i`J*ih$hJJ*ihJ*iJ*ih$hJ.+tu%}?60}?6SY~߶TT;VPT4kv8뢲j(6s8v?On'mvn'Dm%LW{n=dz_{o[↓zh躇VT+nrvCC ==40CC} L= = =${zzH444!h!h衡D}ACACACmV©z'LHNjrB V©V̒pYN5KӬTW+TW+TW+= =V =$L8US#$$9J$jmMN35 KR4S#9M%m]8TPIC%}% 40TPI@_IS%AC%AC%JJJ   $+ * *ih$Q_IPIPIPIDNUI8|H_[qUN5̇pkqk4S#jjSUNUIr|%AC%AN$m, %T$9JnS͒4$PIjzifIrJQJ*i`$J* +i`$h$h$Q_IPIPID}%AC%AC% M$+ * * *IW4T4ThsNu6N$躒}^%-ݳp֕dߋI8Փp*h]r(4E".= =mDN!eٟz2N#!|4O =muIrpvzhaaꡁv{hhꡡzzhhꡡzhhꡝzhhꡡzZ8]S͆S$hꡝviTi˩zhjm '""""[N衡VWd8Ue8U8UrcU8UrǗr뮽V4hrvS졁zh`衁= = =${zzzH44CD}ACAC.zϤ8/'̇I[};6조?}/~!塇De~+=bC8J꺇{ȿD!<4:ݟוdJ۶$:J{mUIaK!躇Vz(mECNzzh`!z{h`!h!h!QCCCD}ACAC M=${zzzH44h3©C8|!h衡|iC8|'̇DN5©C8|H!h!h5 =$CӪN5©Crc|iC8|S>oKꡁzh`衁= = =${zzzH44CD}ACAC.{gCߎ~8a>]ߊP>P>Cq,\8߶uYз8]8]r|ACA=߿C}wogau%-USTS+oۺCzjuʲVt=qazhvzha졡zhh!h衡zzhhꡡv{zhhꡡzhh!hso>NuNꡡ$HNso>NvwTiǩ:é:ܛSݛSuSu&'TTIC{qR%AԈ3]55©ǩ—!;ǩ—܅zhhu:LNCc====$h{zH=${蠶D}=tPCD}AC!QCj{Her29zV!h^&Y/;4ergN&YEӬiV!fMҙ!9*fp=d*fp{HY/;:X/;_[졁zh`衁= = =${zzzH44CD}ACACO%{HNY9SǗy*N5ӬNT"9|HN3:DriCr6O%zHgCri?t8C͓xҐP>fe(bt8U|ޚT>;LT>C0S0P>;34T>P>CS M 34T>CS@C M34Nc@C M34T>P>CS Mm&A8$|Vf>Cg Y7.NqBr֍㷭yҐICr' i4t8qP>P>||||D}@C@C M#Gԗ44h3i\#}8||VH˩;rk4Hi>i9tFZNs6H #Z\#3]sjS|,{ȾC5rIf|HR\9}8M%moJ*i`$J* +i`$h$h$Q_IPIPID}%AC%AC% M$+ * * *IW4T4Th3©C8ՕB8HzjmvTifI8, %i©©©  Z]?JtYT'*©*©*,**©*Lp„ Z]Ui*Ӵ|vi`h'ov i`j'hh'hh'QNNND};AC;AC; M$   IԷ44hqי39aSu&'T"殳i*©*©*Su&LNuUNuU_IPI39E h:+Vܡ&Cpd߃59j\ ܡv4Ms]>Ovivajvajvihjv ihjvvihjvvihjv Z8v~N+*f]_m,qi[é[é[S8]Q8]QᄢjhWTㄹ貝OP8];ӵNNt4NN8U;ihN4M3wc/OOU_ǟΈϧqO?_xing/qs;~5/,ż>lng۶ ~~173Wa};5?6?}b~>nnU /[3E-i+W=tڂ}|_ڎHϟ{tnǔ;=괝?_1}|:mĮ_i~ o_b>]b>ݹ~}|:_yy;r߯[$|ܹW~h>_ׯ}z<___/}(;^߯Gc~?^j}wa{)1~uy9c/Wccrz?^B{-zjKcYwe˱c1~uy|~z>_]bڲ{-1د>>~1r?ƾ~z?ƾ>_]6;ƾ>_]6~=ֽ>_]/cukcukcz}/r}G}8~XlB>9듘}-/qnB=lɿǷt__۩t^lVyK t,+wGrYWuKdr_.NbKwKrSuq^[.ba~lE,Qp/ۡ}+w;/"tw垯:^1]kSX!c^S}?TyY|[:+UXu~\tW狎}1 UX?X-1cVMX?Z~r'ck~m+w2~ȷr./+EX?\:aҌcϳ~xtuk3~XrOWc~O:ƶuK3>c{#lS]`}uV?txm۫uݢLVݚc;|F/zޞߟ8헵\sEx_̷ ^o8OTP endstream endobj 268 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 259 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/PlotAPClusterDataSet1Details-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 269 0 R /BBox [0 0 432 288] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 270 0 R>> /ExtGState << >>/ColorSpace << /sRGB 271 0 R >>>> /Length 1709 /Filter /FlateDecode >> stream xKoF>HOO. Z WAXvjoY̬UC++r4+'5zvfiŏsvl޾wy+ian;X&yI@_zyi7(3E7 ϰTـi7( Ih7G%i6x~xy|d7g/Go/oR!M.͐8s6^Pc]N\|;Nr . 0G}f&#eN6g{r O^FGW<<:e_+]4*B7-y.unqv8n{.^ſPڻw~uox^%o$^\w"> o@p}O&Yv>+q- ~!@xL5`:W28´XgH-8y3xoK] N0g@^<,:A`\ : v&z?[Gȃx]a1q5zrj-s[ ` NP:uPvuWn+]0 oVccSq`f(+x;y0Lv q qąu7NDkN5KRgy0wZWx~.u88|`n'??;I3GgO~.fyp?Gw@?o ֧= endstream endobj 273 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 279 0 obj << /Length 1880 /Filter /FlateDecode >> stream xXIGWe,YP8Pr88vY̘>]~38StwMW[oU,Y',y5y>y2βU4 %|/@YΓE3y%K[2%606:U:y;c.9yUD;XItkU7BBcͰA02}.\ ɲ 'dSnNښ4i; C~ѵ3nUrBF*25]םeZA0w6ȋ 3ІmgG a|׎Hm-M4- %|W9dFvs33, L"+XL|goemU{3޺F4P7tPm~tMvn79/vÓM$.hpnT;>teC}u D!U?_@FV)a1A&,UC}f@CR%(Hwdȴa2x΄#ÎIuDҚ*tw&X^R E[2u<pTQB/t?Yzȋ/!ņOc BnŜ1L_bW!NlHR8"]s$8* p8qB '4NpB`OK]XE.Z%rb#1$R[Q:8W.U2z"IIJr$(r"W~ HV >D߉`s4yP)9O|0܀ endstream endobj 288 0 obj << /Length 1764 /Filter /FlateDecode >> stream xn8$Ek1=tЦh3=mkђ=>ґ;pXssO8< 3/a wN{,N0/:e\kE$q3Nᖉ)Kktk[,0x$Ͱ\={|dziiUTo3WhŴ5tS\OhR,t/¯dGk9MqzWae0c=0҆*>F9$ !dalDMu?sĥJEO*2WvcCu`t\ڡh4uѯ[-vjhd#O ijopӃw03CK Fwud^*",6b3M!/mܤkm:ZnL?8`8Ğ"Kr؋M1DʶpIv ͤ^ѾS(q¹4|JxdSv9u_`%0<:QPE%֎J@bx&{d<7| }FY-uk֒ s"d;9K<}15 wD95|) #= 5ύt1r6[RV6CBǵ28uD_vSDDYDs eW_)8v08.5. 1mAq(|p@+hهgbˀ2@􎬔{ZPw`\A`h9n6/ ePL> /ExtGState << >>/ColorSpace << /sRGB 292 0 R >>>> /Length 6718 /Filter /FlateDecode >> stream x\K-=N_0`SyU ?btV}pe#Y+q]^*߾~ׯ߿>j_:W}ճG}ǿ?׿z}>/77w{zQ^Gzꊚߥ/GYxS_(}|{Vt8}]vy?A\v W,>Ō} v={ޯ,Q}bc40)(a挰e않A@T/6(42{h]ZަbݯG~xŹcÞ;urOGݖRaw-߇/9Ζ4M.[Ae3'|ˣG\v ۭo)K^O~9}-h\mP_91-`EA7KSzǻnP,%]v[V{Վ>-fw=_?הlG{:(#"Z#3 [ gZQ&G\gD"(a+͟rͳInZ_}jDT4{ ]K9(*>GR+Uv[Nh>}r.5C(9B5>jrnjyY1 (fBvs5LY9cͦ PM|(+~bEA7KSg{<ݠXZuK.ַ*ɐ%1ֳ5rB}IѓjbEUO1]mƸubimv[RKtk)ÜTj w,}.HIXQw9,uͺ%]vk\$'c:cnv5N L+F* jEQ1֚}ZID^5a$uJ*kmMuk,rJ3a`R9+^-X*j%A(=~1n|xg.B_p 3X| L{%P0 !j)A e ݾ7Rj䯅g&T1S⢑8ЊbZ6mI!nՋč9\ځĒgRD1X,CI(R0NPb\ubiM"n9n B 5 */rk!8ЊƜ!8)*EQƸ'vC\~Lď!m͔Z XQ҉]!R{tr슺%]v˱vnڻ00g=hjӄ\ ؔNMhEQ1L[L PTuRڽ; n&jXU|3`F#\j"iY=COHlI,L Pkal+ (qJ:.F>J`EAN;yOݤ iSX[sF A}Җ/_v `ݤXu[^d~AlX|;<"n(jm70-?Vԙss1PJ=[r%nbGiC1rLSv1-1,-Z3G).-vcFkD@D9=ېC_VЮxX-G$Ld ]QMYK_ni1Fض5_<(Lь8۬57RY܇Z +f{cd,fg&֐B ':aZ۸#$k=tv[=Ñ 4pqAѱ.wG>'Vt8CbGmv3H.u'ULJSnII6djKneD_NdTXLDSin OXgXQ'9hc6Knekpя;粛R7/8XRB\dr+2INp21nPԭ%]v_Kq9^ ݒeRn;l~zhEb-yq~&#Ω؏F-}kծk$-]b k Yvs MlgTr% T9g:2 qZ&udK/IM$cMº-{A&l^aQ|Ѝ:vP_*[cSTkj4nKHF&Eݬr%nWyUH*Sb>9,;cEU IA/+݇X} .aw1sbr*2N}rL>I^ylRi2v~nRcQ79isnKG?lwNuf^g'2+59bĊ; ەnRzQ[>~dpP_<;ߵg4ZbE Kr:Vv\v 1s T@ UyruSc>#)lR1v+.ls ʽI[߲||`f>jıhJW)G2.ɉJlw&(궜v۽Q skM<)XQ'=Sݽκ%]v'cFB~3&r36 H#KUD\QqNIip2~-=9%gqB¶#ؒ$VԒ9+(3 qn0wݖ.cw=NV[|8% #x]bhgZ% =7DZ_L3nuJ<{䬈wTk1̊˺sV\8H= -vYәm]=\;bqr oEٷ=or 1FGSOWe",j8UC {Ȯpݒ.aw=k;E(`gln,=cNGz'q3Zs}r6[32qAS XVsaK Q˸*yT/36`+CeJnmvoNW18݋o'}@\p͔]S^kj>.Z+36.M*x䲋yq+upr$8N;ETzǖ=[I(vߘTb+MK$W%vMةFGrJ3/'N_(k2H&}#9 _vdݒ.aw5_ {X-A\Y&E/r8ĊnW)u?dr%n"02JY!Rd "0$F7Ŷ K}^=MH\nQ,S^|en}Khqę1V?꛼dyMEaIQ7K3˖nR,ͺ%~ح16Ʌk3…'\`1[)O(_q(5,-N(cs;eݒ.b?S6wLM֋9#1ub}S>:cD Xι'-[|7[:o1-(O͠XdxuJ7̑]~mgt?'l8?;H>x HXQ-ݤu>pͺ%]v[@aboqn1}:f@ԝf$+m6Į&ŹϺ%~xJpgE]1LaErHն8GE\ޝh1grDjA"ݤl0cO]36niqZ TmnA([q2~9G>IƊ*МoJ[=u:|ޏ\v ~iҿwN1R-KIGKyf햞_u8ԅ)tbiԝuZ',y\ͼ2g0Z)GXzHTFT|unI~ld8'}e?֧)|7~m?~LHӏne^+2Y܎?9 rZR+|0`l=eUKnˍ. wNzL傉 KQycE<3Bg,~= uyuSneafz/&Ny'8\=#qPx*9~ @ؤ_$a#R7)x'n0|(/1RU|7O^Vԙ֙3 -]/ESd>K/vU\cIhr1#<{V|r`Oby˺s}YϵC2?GD!Np } .e9Ċ+9|)l[n2u[.~rH|uJe]x+ˏb02Vu(K6-nR)8|,vcl`4{0Y1 qy"΍"E&UJm^bEA7KS,2cp-vc1ؿr8 bqX׹#q3oGĪSRZ#fR9qt꾎8 4%~g2=9VĒnΡ߉ԖtJ,vn&un':nOpSԗvo)59f, YKnk`J͹9̈́zMyԦ9e$NlINgݒ.΍ir~{L$a$WF{^0,h[aM]W~8uN"n 5E^h>5HRN)ȱN?5bP-hb.+9[r%nst_kqv3jtDwgrb1+b)ppLlJa\v&EwO&#'[a[l c]~ٙp>zbMuT޸"mݤ%]~r㖌9N&H)s LIᘱcMpgmp؎_ nRv aח/*.&Lv}LD51e1ΑXS'bǘGne`lu dt k64o->啿f oiq(pnY-"g} .{ sukx22L<y[榠ۛCe[ͺ_e݅ߪv?~<x|@*ؔm'J34ՑtoG[r%nw|˯_&^D^o^3^qVˮh4 t>U t$UiVW?W_+ڕGuč|d3?94/G׈q@Ax@_FY~D?Ԫ@> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 298 0 obj << /Length 809 /Filter /FlateDecode >> stream xV[O0~ϯ#`'SO4 FiRO\V;Qh{/>W|$Gdo}۹Gls;>QJ")Ќ$($䂣bA%叮iuy _5_jZje=x4Dw EYKm{`XC*XƻțTљ e,$0KE[[Np|Q$׻ `8;;'^ FBp㪆xq۵B Q]`aBi[#+ں_Ertުʏ84VM= #ƒ+" (24rӐ& E "x1ކCB/ 1[f-vĘfG2ۀ >? A7UHwɄRݟqlL79Lşۄ~0/r뀺j6Nsl)6ז*34NC;gxlw3'3exmh& 96=0_Eʁn @Gf_ endstream endobj 285 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/APClusterDataSet2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 300 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 301 0 R>> /ExtGState << >>/ColorSpace << /sRGB 302 0 R >>>> /Length 7605 /Filter /FlateDecode >> stream x]K-;N_0`uQUi 1:4BH>pe[08kvp)Q>~;Omm>&??VϿ8?^kx{{z Tḫ նU*Ojzh?}o:(%_竵~_l?_?f.xz}|ڮuq1izm_emN5gr{t.@p)P, p-p. ߰,V/#ܥ??f?F|k"??f?h? b?\Zn G1n4~KʩԯN}[?}mʳY%ͺ! έ1/ʄ }G#,G8n^Ă=oީuҪ[t%U~=_;{lZuqB!40cBŌCNe U-R|hB%7m=W&䞎M]4~sl|H@ݍ<5@>P6sbګ-Nـo2M膠4(s%}j^A'1[~ 46]zw;ّxZb0%Z0c- Ӭvg&}ɗ ۥrܼ3"]zw[ƣcUvsι{`1;LTbY*ٙSTGUW?UȈmNr؛}[kF3I3M7K%STiCU״}Gh1GF(\&*,.پk͘f{fgku"jEB[/Q{8u?b\ps7"4E u f-1H,xZRVu Ԣt~LdcLW"bUO=|-RI!ߪ R?bbNչT <`z0%oYl@,I^}[ƨ`D 5݌JG0Ӏ\L@5HEQc)*EQ|O 8ԕ>10wK]9xËݚ!{&Hebimz Uo |:͋0g $ 2`b;Q v +m1;1o{n]Kޞ/ђ+#<#1 ٤Ƙ7|0 fiaКɻec7مE^]P+bLA6D7*OJ+hWB TƦ# D";9-Knѥxֺ~}C)ecGΩg_bMG~K b?uFYLwF?%]{/1wGȲ 46]zw՛}Om jw=s( }Gڙ~b1f[hyeb$KnѥxW-΅n>\1M:AB}'|(ӧAy azmt~$enѥxW/wKqqf mBn;Ek{b%/] aqZRui4y>J "'wR6! چJ/F]ַG y{-n{$"ڒFHcpmp^MYKġwke"E!pLX6+ڎ%^Onَeݛ0=pVV|LLEtjOOC'wW7dbmwȾlBcQ71ƳUoKG?6}(ĵ!Th:I{v+yAv΀tAlBzQ˼l!}E*)ŐW>ђW~ILgۊ%E^]m6r<% U;s1AP&cmqVQ70xַL:6Ek1Q>o]f+FC#p wLpGMȫQm:2WnWz%56k> y?ϛm+p%1;`ϰ¸ewȳnѥxWmט#W##H{Cbm$%XԂvیأf>[j:E6[t)so)1>slAQ/lQK 2fe$oCܲ[]˼Vv->sA0'5h><x:3ߵ+ZnJ-a?.Gj#EeV*"F߁8[Z^c:#'6koZ>x.^C͖71Ӽ,eoiy]臭(xWo$0D'Ő=v>`Ti !xgJ' لAFݦK f.eohVrGE0bk8ʉv y*k~9tA6ː|ߒnM׉]O"(,+[qe>`J`b 'lSI}@+@m:6DC<]df<`OUv88oHunIGn93sܰS8n:KWн}2f3' qbiM"D S>9 S?Q@48GFLѮ9#j [RZ\F|ѵ{B rYH>/w }wWShŻ%{ˮpݢK/z{?rw y W ~(8\g9i>=7885ȷsfPjOSTj#EWwňhz$0"1;\R%s0"2RdENE:91ΛU욮&zMgn{2wbѽj+V] -eJtE7myۈpr8NFEPZǖi=[I^Am1$XV-w"\]wyx!&vuI V B, "eN&%ML^yILJ)#YKޚ[]bV lfxDTAЮ&8yA6K )tͲ7m覆eD>o#Tܩ,nm;i&fذD/e biԝkz[™tl&@&Z|;{6 Co09 Hlf]/[ڲ 4ݚMo.\Ƙ1'b0 qlj!}\{I^CtV!߲)]zMo1Eyc5xp#ub}Γaj۽%v`Șp9y.K&5otfhTb>1*.^A/Ay -(nvTCH RcV,a$ٙB$" nżyZ٬[t%Uo}0 ?$4;6IkLJʼ(oqlB[tkJ7=O 9#<_L}خܼ 8(cυE yv􈅦ã{cn4rÖYXɯlH^CKIGނU.M^},`CbpA3~m~ 9l<6+kbQIޝ_.ٻW֬[t%Uoϗ87ǘ'7#5vUry6okm[t%UoIDNQq>4a㠞7K(/&1J&Ҭti*Uo˱qcx!hWS0d_>ʄ6zwP0NhLEqUӐe;n'WPl+Ȩ)KH/s9Udo:Zm7/^Ao #O]:іlA,޸Nw")gcaLaV=ozg ej1Ny >вK&n`R/m;3vL`Ðqa;vt˶SSv vLɩiTKwϱ 5z?-=q4Ty](t+0v`ޞKnѥxW݇Rhr?WLZ!1s`.7!ǼjaQ4/^FH[&qnҭyt'޷ Sq7ԉ3-~8f iE3MvLb6$Z7t-er<QE`R/m5㖟:Ɯ8y L]#ww"|DS :R;cvzOwy^{K4$8nc\p#AriOWq5覆؎-֎+QҊ>q!j7):+YZyyuѲ_GݢK/z[z;: {(.:82ML|4Idv䓱ԖXuJmķaOUaC Q؉TPRMJ(qW֓ -KSz #3n(+>1c{@hQ94*軌voIk~wRvwV|-覆IK0tQ^] ːSm 0n*Ch;y;R/-;Оu.87 {3 ÇbELh[:T%7'{ (+֋oz_p]*b7_F'14Jrs j܉1:loA[v\Ktazapww{e`b E 8n Jn]zPW<-s-I-Hg֮T_ No=y vTfr"Bnل';JUXBɗ0JK!l"p|,.S!JA=9z=*(S|ݑhĖ)E{0=ƞJ=->ŧWE տO.ͧ~cF|Vc_+zgx >TܑzCE ߉yGOcSWM/t|y8xl[=#No"Qge=xOOu}>p_Ar^~XėyYJp~,kּT$o_g)[ _tZ}UD"/]Cz|nK1嫦{C}QC !O%|_˞)^Kދz-WGdߝ-F.ٷHY(xt9e?o|UiK!N[?™'j =|Z:Oe2qAu*f8 騏9YEɯ=sUS(ot)Ҭ⋶zn]%/1kn=UT&<2X.Y)N:~ Ex &T<",K]OpI,?: c7c> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 295 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/APClusterDataSet2q0-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 305 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 306 0 R>> /ExtGState << >>/ColorSpace << /sRGB 307 0 R >>>> /Length 7605 /Filter /FlateDecode >> stream x]K-;N_0`uQUi 1:4BH>pe[08kvp)Q>~;Omm>&??VϿ8?^kx{{z Tḫ նU*Ojzh?}o:(%_竵~_l?_?f.xz}|ڮuq1izm_emN5gr{t.@p)P, p-p. ߰,V/#ܥ??f?F|k"??f?h? b?\Zn G1n4~KʩԯN}[?}mʳY%ͺ! έ1/ʄ }G#,G8n^Ă=oީuҪ[t%U~=_;{lZuqB!40cBŌCNe U-R|hB%7m=W&䞎M]4~sl|H@ݍ<5@>P6sbګ-Nـo2M膠4(s%}j^A'1[~ 46]zw;ّxZb0%Z0c- Ӭvg&}ɗ ۥrܼ3"]zw[ƣcUvsι{`1;LTbY*ٙSTGUW?UȈmNr؛}[kF3I3M7K%STiCU״}Gh1GF(\&*,.پk͘f{fgku"jEB[/Q{8u?b\ps7"4E u f-1H,xZRVu Ԣt~LdcLW"bUO=|-RI!ߪ R?bbNչT <`z0%oYl@,I^}[ƨ`D 5݌JG0Ӏ\L@5HEQc)*EQ|O 8ԕ>10wK]9xËݚ!{&Hebimz Uo |:͋0g $ 2`b;Q v +m1;1o{n]Kޞ/ђ+#<#1 ٤Ƙ7|0 fiaКɻec7مE^]P+bLA6D7*OJ+hWB TƦ# D";9-Knѥxֺ~}C)ecGΩg_bMG~K b?uFYLwF?%]{/1wGȲ 46]zw՛}Om jw=s( }Gڙ~b1f[hyeb$KnѥxW-΅n>\1M:AB}'|(ӧAy azmt~$enѥxW/wKqqf mBn;Ek{b%/] aqZRui4y>J "'wR6! چJ/F]ַG y{-n{$"ڒFHcpmp^MYKġwke"E!pLX6+ڎ%^Onَeݛ0=pVV|LLEtjOOC'wW7dbmwȾlBcQ71ƳUoKG?6}(ĵ!Th:I{v+yAv΀tAlBzQ˼l!}E*)ŐW>ђW~ILgۊ%E^]m6r<% U;s1AP&cmqVQ70xַL:6Ek1Q>o]f+FC#p wLpGMȫQm:2WnWz%56k> y?ϛm+p%1;`ϰ¸ewȳnѥxWmט#W##H{Cbm$%XԂvیأf>[j:E6[t)so)1>slAQ/lQK 2fe$oCܲ[]˼Vv->sA0'5h><x:3ߵ+ZnJ-a?.Gj#EeV*"F߁8[Z^c:#'6koZ>x.^C͖71Ӽ,eoiy]臭(xWo$0D'Ő=v>`Ti !xgJ' لAFݦK f.eohVrGE0bk8ʉv y*k~9tA6ː|ߒnM׉]O"(,+[qe>`J`b 'lSI}@+@m:6DC<]df<`OUv88oHunIGn93sܰS8n:KWн}2f3' qbiM"D S>9 S?Q@48GFLѮ9#j [RZ\F|ѵ{B rYH>/w }wWShŻ%{ˮpݢK/z{?rw y W ~(8\g9i>=7885ȷsfPjOSTj#EWwňhz$0"1;\R%s0"2RdENE:91ΛU욮&zMgn{2wbѽj+V] -eJtE7myۈpr8NFEPZǖi=[I^Am1$XV-w"\]wyx!&vuI V B, "eN&%ML^yILJ)#YKޚ[]bV lfxDTAЮ&8yA6K )tͲ7m覆eD>o#Tܩ,nm;i&fذD/e biԝkz[™tl&@&Z|;{6 Co09 Hlf]/[ڲ 4ݚMo.\Ƙ1'b0 qlj!}\{I^CtV!߲)]zMo1Eyc5xp#ub}Γaj۽%v`Șp9y.K&5otfhTb>1*.^A/Ay -(nvTCH RcV,a$ٙB$" nżyZ٬[t%Uo}0 ?$4;6IkLJʼ(oqlB[tkJ7=O 9#<_L}خܼ 8(cυE yv􈅦ã{cn4rÖYXɯlH^CKIGނU.M^},`CbpA3~m~ 9l<6+kbQIޝ_.ٻW֬[t%Uoϗ87ǘ'7#5vUry6okm[t%UoIDNQq>4a㠞7K(/&1J&Ҭti*Uo˱qcx!hWS0d_>ʄ6zwP0NhLEqUӐe;n'WPl+Ȩ)KH/s9Udo:Zm7/^Ao #O]:іlA,޸Nw")gcaLaV=ozg ej1Ny >вK&n`R/m;3vL`Ðqa;vt˶SSv vLɩiTKwϱ 5z?-=q4Ty](t+0v`ޞKnѥxW݇Rhr?WLZ!1s`.7!ǼjaQ4/^FH[&qnҭyt'޷ Sq7ԉ3-~8f iE3MvLb6$Z7t-er<QE`R/m5㖟:Ɯ8y L]#ww"|DS :R;cvzOwy^{K4$8nc\p#AriOWq5覆؎-֎+QҊ>q!j7):+YZyyuѲ_GݢK/z[z;: {(.:82ML|4Idv䓱ԖXuJmķaOUaC Q؉TPRMJ(qW֓ -KSz #3n(+>1c{@hQ94*軌voIk~wRvwV|-覆IK0tQ^] ːSm 0n*Ch;y;R/-;Оu.87 {3 ÇbELh[:T%7'{ (+֋oz_p]*b7_F'14Jrs j܉1:loA[v\Ktazapww{e`b E 8n Jn]zPW<-s-I-Hg֮T_ No=y vTfr"Bnل';JUXBɗ0JK!l"p|,.S!JA=9z=*(S|ݑhĖ)E{0=ƞJ=->ŧWE տO.ͧ~cF|Vc_+zgx >TܑzCE ߉yGOcSWM/t|y8xl[=#No"Qge=xOOu}>p_Ar^~XėyYJp~,kּT$o_g)[ _tZ}UD"/]Cz|nK1嫦{C}QC !O%|_˞)^Kދz-WGdߝ-F.ٷHY(xt9e?o|UiK!N[?™'j =|Z:Oe2qAu*f8 騏9YEɯ=sUS(ot)Ҭ⋶zn]%/1kn=UT&<2X.Y)N:~ Ex &T<",K]OpI,?: c7c> stream xZ[o~ׯs. xz ݭm62T6%'%t$M 39Cd*,]#Qᚘ՚(WłfD\ KQ24&Fǔj'N0 ~%s=10-i%_Xң0AadO%ϴid!!f$ f @k1#pQX%X(Ìied;BG,~&zK0+-)H#YIH\1jj/GF8H1b#qh1-e6:J19%iVbN&ڑ61꜅sƨb$$PKI7yb7Ώs[C#7d8p>Z ԁa|rP;D\װ&&Mb YpPNChbVI $`Ht1Z1Zţ#[t'W4 7S`vLhMRgXƉ%K#S"3yNe,QdJF'EA:>|JCEH8-87ײz7?͸h$S8:S8-!6}sK)a"7$N&0Kf☽hg-uŕzv(KCyV"taG^^u]B*CN2HE v˱6C-e> {6%Љmߟfm!ZuICT^>R-h7Y_f%ˍJTn}ɏNKM,c6]Xxo =ˤ \DQ 5)pђf_T/*T`h0bhm :&iP~@Dmzi[m@g QI2 ZG)/C@ÊGk0rHM6BAU v&,^.JYVVvu=iwVa-j\/&hx6N 7+몞Weъ)Q XK:Z4bRAΡ{EZֆ9:#QnP;?CS9W@N-ANe0;j9κ8AKmEj+ޖON/M6.6릳nw<ˋ"[U޲;Fj$~nFfmѻS,&̳KcI&i gQ1ڛ23 ?(ê-??>.// XL~Ƭ7e5kY3ߤ$Z1?*5qd 峮y䳛IAtd\,G5(.=MKe+8|3.."c'ʚ$u3ע)v)ZA]:WV W:G쀓u!x5$Kr[mYwR.hsWzuCy]jZ&>&5\ջ3i+-Ag}~ECk@4h&4s?_xE --\ln蕡 ^&/94.}Mߖ^`4y߁& ܏Do*V 45te R>Q{Kos 1A׎5IJ0JF. 8}D }%wP/Ig qzA4ezXݸAԌ%kvyq+o.C@ѹ+}Bfwo K\nx#&ݝIlzxpK)w\^F7Ǹ֏i`Ź endstream endobj 309 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 315 0 obj << /Length 1094 /Filter /FlateDecode >> stream xXo6_A7a[oY]Ȓ#Z3 -@9& J!9&!- J]'"(!$\|uK3mj2$Kkӛ‰QKLAZ((*7,B^p t~:#hhl)4%gIaHySL@`j-Z:ϰ}A9n}PS+_$eү 7YITd<2LZaiEnUx/:.ذڲIL>m9:@o?22\7)o A= DI6_54E ϓ܃{]X[sN3.h򾎚v[/.ɇE 3.m{\zA}@4 ہXw۪x JJs( W0^ijA&(մA0`jJ6N|dېv~B`m]l8mB T3 \ëO10pv\d)o /tgZc&5UwSN í9UMhL3k!1.'-.vi~J`Hvԑ"jmxLH8C\m,v% ¿-M /.ærP0m0#|@0t3KI —Wlf> /ExtGState << >>/ColorSpace << /sRGB 320 0 R >>>> /Length 8051 /Filter /FlateDecode >> stream x]MqcrH[(HH/CA`x >|;>VbI$ǔoo~?Y˲柿Ϳmחr/%vnzno^遺 zlU9=_W??~[w y֎Vo|n_1v^@zyt]?}0z;K۽,㛓Z먚ywS-*r~oz@}9q?20ZQk?2~.*A1|?h?qi? _ 67ZCѴj4?~GwcWk?_n%]v|s|W΍-cGϛxv]Ggxֳ3U2%^CNjXJeq>6mo[BYoŷU-kq{.,)†g&e[.KfķW91_*4#_2,@H]=TVIr/l AŢle.×Q7u:,C1|os>꡴:zhel+;}?/({=.qMŧUK}}v/.{YnR0NzcX;…ahu3c4S8ЊG}ճGI*"eles}NGcZo %Q('Z}@ZAQI!n ]OǓCkt!ç(\|BWMQ}ja$J* }?.ўze4ݗǯuuv:ŗ@J_bEA7GH0nt*[r%lc>vYgD[`t2\ao`p|Con%F?nR|e[.~k;jN_j Wse5(6fjSEN({Xc,ugɲ%]v3ht`d __{ab_\ҎQ1FL72%yͶXeq4cD#JƄu3lƙV$cpZI@+˔T7cpwMABf=7ZSsQ3nCebQ4H\V։oRfmGG7863XL%F1Db)A VÊb =3bcI:MǤ8ЊGhQƭQֺzqf[\/'ŶǬcpciцKk@b0*XpZ][7(>)]>[a1!TeÄd-E6NQ6yiGQƸpW9gĐ|gH8:EDj3Z/y!'OFWIAK7(#PK׫8r 4 53Z|cC_Me#=CiTq"1EKykGU&3Ͷʱ`ö=]z_Fc-&ؒX-\46 _4Ǒ9%r K:YcP.(3i=W/92v"N9%b*5*3' ~rt+KXS10vCjۺ.[rEoL,"o>Q]a"H8_1 Oj!seݤ4˶:tvv N?HsD Ru.6vdCw|<[XQ{`-snrْ.agǣ>fsdž:}裖Ɗn>-j)K6S([r%ll)9gNAY\)+kAb"ڱYĊZҳӑ2v̠nR|eK.}Ws{6zFS#cFj1D XyfeR*k{n+ cL5QDxEŐf+%=P‰ΙZ4nZg\&VG̥2 6z1Lݔ=y\_bEA7gaAl;u-]v˰WjX[zKG7f:񘨯xrTabEu^ru4vCѺIimvzo7ug.Qs9KL8:]f+&F_&bX9ŧUK>6[sxBx9\'o`7׷ N,b];lɋw=lKtS#:eQ_cb.5X k 49!ص#"ݤ-)]>.c9zp |ܘۊT]x!Zj@ Iu/&t4M-\0,{$jIZoN܌-4㔵6.SRZ#dU 1ԍm+KNrݮ`+p1MNũ\sFXzbW,Yo.rel;lGff11E3H­{91䉈3_} G0j-w(qTFwF^v/9ًeN13oՋ^|`.,:snle̜wz5G+sW${F+ m16{5zJNcȺ\G`gߨVn=rFNc@3)( #8\v-šgQ&w^Zrq~Ep`i:43%qXS5]xܖ%嶋AhNw $)d Ě*9hKц4JJm܃oZ C +3Yi +C8jjneG%-b6ݮ WeSn}[~rݞ.sDBv&D]h/9$V57gc.ls"k?LiM"7F\ |Pe}q@G*S3A5t+8$ŋ.SRZ#d9v3WV׎5Ta~lQ~Xܒ|TJ,Vo^U,NH%*%eK.~3ȕp11:;!\vs`cm>8?=;5t))nhYNj` OE!ݽ`}E$>.% u>$r\itלlmv#;+.?AN!XՔ"1Tq8DnR9l\v`e㘂M#9+]c+Vd?ǂkʇ_KbEQgt+8AlEɺI}լ *Ragg˹ڌpbdd09p%&?L<;wo,iS T>Tm,|g eK.b~8s {4εGv f oR0BGbEA7[j6leZ>  +qq=Ff,H5SΛAcm,(Q8Bݢ4Ny"`gh,WZcs}eM΍܉/,)tm²VfْRb~.?f΁AvI»lؾl|ĩ[I)4l5v19^Mlev*{^|;KL"{by)ۜNqԜe/buKe*[Gwx)8 PL\Vtͻzi,V_uJϻ#}1gcKt{'EѸT[LU]+Z.X)YKn1ue>&^Ŭ\| H%t,Eݶngܖk&E²%>OY2xfO8[Usb1n ֶ'@yatt6{-0XK.5S?zhFQmFc;S>^5ȰG?\岋_\ &3H7̽E$,w{u8jHq{sԐeK.v?ܸ29){,:l/Ԇ֏]K'p+5fĞ9]ӈbalúYKwal~ca?[s)z\XaIQ7>|{bMOle!GN/Wr[E uS+%s0q0XP:*-vQߕҏ<Bwg% P''IXQyќqFѺ<-]vS+ʳ6SJ<*vŶÔ{/y+= ,CإR7)#ye񁳫S$]q@qܯq4V;t[F)_;N}Xc Glܗ-َ[)Gkm~PknO5"7cXw. G˟'L筛?K~2fJ˟[u"ʖ\v ;}rrGqHjo)CcXqS0cEW~E杌m?9Li-va80Wp]';8#1sV: Jwpݿ;.وNjS?h{{dI-[ T,ؼ&ldM9JdI}۱'/ 45fΫ,v,3DSRvϳxr^΃Š:s6F6Gbꫢ\r%lB8},&j"#R~u&eRW,?XQwwm.%]}e;`9kYi89lޔ$ʶE'Pݎ)%bݠzQKna9+4i;3BC*cM]9{>{3H"7|͹3ȱFR`9VL9Hh+j96Xw˦vm^vvk6F^X?WSr7 +jwV)9=ly,[kz~;8O͡so}،nx+*aW^"k޲-]vQߣ\Yqƛ-<>5ƨ¼FCNT$+Y/;/B +ݤʣ_ ;-_5 ropES`ŽI|URs{H'$Vtiq ʖ\v ;wiўlL QpEM =~&%ܦ+=M9S#ʔ7aX޵Qv%.YǬDeʮ]r҉%E;N;[MjJ\ ;ΰqT'Ē}ǁ .,A)5u]i 󃩻X-vKJ^"sxj$6T9Myjvs"I=^jjA_HlÖzn^ʲ%]Gv;+r3cwo9^uVXS"瑺Ae~v`ǢcR<ς`v2PI)/95wh#غK%]v]vXsca)^vMhNȒT^ughļt/9qْˮ¤l;Su9Ŕ`5zR} Ek*ĜVY7)'rlevfO>ŜSP[ KH~>.cM-#Θ@.[bnnR9uv `;aSoDHfDgb䥙r$KbM^xN1ԝdfْ.ag=30N)5\$ƤJӡ[}%<Ɍ)D]EYvƅA1>vxʭ4oOLΆ[a+# xymI9IbE5Ov2,{ZWْ.agߍo:[^dj w>Af-o#oxkyau5ޅ6.ּSFS?Fy_̋}1oJ~_^5_K<0OT^]K{QOɛGЂye]ɛ;I_ľő0>!O^B zo}M^ ~R_ ߞZx -_"Sz=ktf=}W*~<Ē=ک LoOmI)Ͻ"|y=:a 6-7̫tx7|v#5ם)G Wx_YewfeLq|GWQRo!yo{x++eoWe}; }}jg^h>f&>}J5 2 %>B/cպyM}Vy 2_.(^8:u? ={5)3J< G' ^Eݹߜ;_y5m>F٭}]Mg΍nNWWn}c%Ro./-J@/|x~׾UwJ|g,ixّ-WWv '@rR\ȩt$ոvS侖_곖v{c<;[pϿZnX։?R̹xB^sϠ\.*?K!›yŐc\{݂֜BR|(zU8*Q)2yڿZSyg%.qN#ŏ s 0N.6&34J'S÷|\G Ix{-$Y7^|23=,<{!lu9h2Rr>cy"A|/\~ endstream endobj 322 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 326 0 obj << /Length 2072 /Filter /FlateDecode >> stream xڵَF_! +cJIsELċ}C*ۚTn_^e˽^a0.dX$U,P~y ?]}S^*UYt< u1&IUJ h3 ?Veɚ3guMwyx욞 Tp$\}(K+hhUxl]g35$ ZYhg&25ZyO뙒񲳭mOGMZBs2T7?l,4WɃvbxi 6kEb R 1L]7{3ّiLl`/㹳i8y=`z݉4\/r;<߻nhΣn 4bZGE1Gכ6c7X>:bFWgP;A:^wBֱ y6 P gނsb !$D: cP }aか0NpE{o.FԮuQF/+!mlQk[!~Tq(OVk(nF E)OIsٙ@[a86sɬ%6  ~D_[79ò05ctjïY[)`f ]$ΣJp2JHטntaڝ[A<5 %A:Ih(Q,;%\7"QQŞiT}#G3T__yy[ECM7wiucs-c5yw[8u.@qMs4咿X|Qݎb!ye\s)i|VzFy0\J薢Gekֳe l/@,S[Da8HىEZ4a <"v^K7C2b;ɵFWB0Ea!{a4mc_r{_H6$y!WrCkvDZD@Fzܹ b4mƓg5JI_'2w5?" ů0/"ʤ"4v 6O΂rS:43,_΍qċPݤbܢ*yv`o1lRxQ>Wj~uUq{ 1qjF%U/_dC&_||`D$qcƁ#p"Q`2WC4r| mѓ'e^rQO‘c{IT?ϷDyN9_ Y8$l&5> /ExtGState << >>/ColorSpace << /sRGB 330 0 R >>>> /Length 45876 /Filter /FlateDecode >> stream xݻrk]i"usTDyU@QePt?Bm`Gݩi'[&Oo?_?~Ƿ?׷vOz߿?>Ooo~})3ok|i1#}گG#GQ}KϿ=߿o?siƛ߾/G>׷_?UaͿokon?;w?n~|{q}?*ϫ_?=~Ⱦ7۷y|._'8S>DϿOO>~|~c}'}?-kWo?k/?N7Oڿw?No~ڷǻ?"ۏg~o~7~j~9|o_X_ϟS*o?\ooɗ?|۷ }_O>ۇ}nof.ϟ^wǷ_~׏f.~o W3}ӏ`~?oǷ~~ӏG_3_ϟi~޾y[c7C?W~?AF{DVjqwX "u{Tv׉wh}o_RT;Fj~v7m>w?GN =|/|gU_o??raGKw꽿ŵgqWwO1\?}Co!?o~|'Z???N_N__\`>|?_߿9~|~%?ۇ? o,>p;շտ귷_wz{~mzO/n O@O~>nW՛?v]o?ŇO ?owhu?[kW>_ݙğϟŸ]:Zީ#~ϟ7x?nwټ}4 o?O/|G;z^jq϶|~>n~wǟ϶/]f)0S'-VOȎڗ?Ou'O!'p#8=C}_\gs(?;urɳΙЮrjW}=r'O!yS!8嫞 O~ Rs:zV?v_ǹ mecqrh/ZbsXLrx޼oG3yd,rLiĜSj*<}樲s}|9's=x:'ش|?.p*_ _Oy<,r*=?1ZwGS\'Wuk5G]'^Vs:ݔ\y@jNt<}/Lju^Z9r W*ZZ͉VWC[ש?-5ZZ!VuLk5Z9ZYߧoe^ZY9՜?_p9L~^yF&jS8[ITfXnD66ڙO"'>}As0ONO>(Sl[{QO?zꩻϢlkf6UTkf6g[}/?>|rj Ϧq9q[4.Mr6gӸ|6˳\>S_plSwONkOݭ=u6UT=uW]TQSw?SϻgkSSwkOݭ}DSwO~(Z??nx~SMSwOݵNOݵ>u:U>u]T]SwSESwOݵNOݵ>u:U>u]T]SwSESwOݵNEW촞IsdzΙT&fҘnD1111ę&NL5LL:UgR:QMՉ3T}M43٭Ml^ӜIوbT6UMm^F=uW5l4FLm^̦:MslDթ_TfW5Uקp|:_~`m{ډGUճϪ:jd砪SMTQ5S'w>9 Yٜ? z;kkvf󂵟Y;լMSi:;?Wb1kSo`,^x]tZgSi Oi{OSfxkS\;\NS֦j:TMUSb#>~/S<;fmX*־Z*֦ST6Uj֦bT6UMkbmX;լMkSکfmX*N5kSTvY*֦SK™4'LwDMlN4'ؙT'Ll&EIsIud69Τ;nb6'lSgZ`fMu=FճUMUOmΪg*~ygj ܊4glSo]ScS>4wg>fHHy.婻"婻RRKZ`Ϧ9ͮjjN۳ii{6#.,*O]>8d|6ͻrf:U>u]멦֧Z֧Zk*Zk}uh}֧֩Z֧Zk*Zk}uh}֧֩Z[/+?){51'>֟rMNZjLvwi=q:S$.'_>yqy?|}*p<NS_U]S'O?|".c' x+ē]]j.˩ԓ3vr}|'˩Tq9uw9??דsr|NLSwkOT*SMTQ5UTjNl*Ui g#֞zgIKynb*s*vM*lDTUUT-UDjh"T-UDKѦh"Z6DKRE&Z*M5RETm*hSMT-UDz3,~-{פsn&s3{M̹s3{M:f"M+hOϜX9s+f"νb\6\87՜KR+fcΥssFNǓYteS987s.ʹlĹ\8*M8Ml̹\8*M˦r.N6Ǔf<~~1RETo*~SMT/UM_6~1RETo*~SMT/Uj~NlDTUUT/Uj~T/UK~_7KRE_*M5RETo*~SMT/UZ~Y Mܧ_M2iDI%Z&Gٝ(%%6DDKEK<;~؝hgv.Zv.کhوh^̹JiNng;Zv6hgZv6hg*v.Zj% Φ-]:uTΝM4٘sڼSf;wN}Þ*&xnbje&*Ν;w\8wܩ/ǟ+S~̉&&Zx6&N5OMAU5UTjGUժjsgT?GQ9,Ϊ~V ן>UuI_ZUjS>jvX{T/Ue֦'UGЩMk㨵kOUSwUSl^xTMU}|bOkSکz_e«?sy*.V.F\>UN}+H~~"S;óSWUST1|*ST1 OSfx*O5ST1|jgwع;gRi=9׾AILki=J뙈֯hZOIkbZOIu2~Mʓq6bx>U 4쩻fxju2Φ}6و쩕dϦ=}j'{6وSMJlD):[sΦ~6vST~j}6T޿6و1Sw0TgصjumUs s\ʵT;9>UU>UO栗}x?ռOS}x*O5ST~y*ާST>UjާT>UO吏$o_&_SN39{w&G{?QOd?>|\z60õ'a9_G Lݯ Pif @̦ 0*ULmf @Solﳩ?]:ui?tޟوޟ˞*~uh}"𩻵 و *;?T.g#. |jsϦrl慿8gk}T]SwSESwOݵNOݵ>u:U>u]T]SwSESwOݵNOݵ>u:U>u]T]SwSOwډ3iN4g"'6LLy&<M<]뉝3iN4tSElvO]N5S4lو<qJlD੝Tg#O5SwOݭ}Fl*g m8UNvgS M%kS ڼ?8UN"p<NSE&pڼ8UNVΦ: *֞zgj'e6"eH*eH*RN5)SETrI*RSMT2UjR"T2UL)"eH9դL)SEʩ&eH*RNε7)_r&չv&r}E3qbeLkҝ`gxZS0'&&Vgפ3q&rVXU_򬚍*MNRlLͮ_8w*gʩݙ2JlDhTe#M5REJ٘hFl*fӉhhS;ѲD˦)EFDKΔ1RETm>5lLT/Uj~~g#~SMMel*Vtlg6s6وꫪj:TMUSEթj*N5USETQu*SMTQ5UTjTS5UTMUj:_?Ϫ~ {1U(&&+L&g??x?ʮD3x~}w=DTMlO?z}S]i2kOݭMUO=z3USESwUOUM=l7ͮyʻ?~skSSwkOݭM=^>'gk8bz]w=N8[[^tk6ϏM]>uw9U\>uw]TSwkSW[ϦK`iNو֧.*.|.pX{nꩻRV&n⩻SSwOMLOM(S$''6gK?1~6bxsMs/l9rV|6/x:K\>uwJ9>W8G6f#֞[{nmX{nb֦V֞Mc4f#֞[{nmX{nb6fSY{6/`y]TSwk֞[*֞[{nmX{nb֦֞[*֞[{nmX{nb֦֞[ZU绺c=u&L;3;֙4wgY;LDTw3]N6vY[{::ͭ6洛X{]? 6UZ݅>{6iw6il.t6fmX*N5kSTvY*֦SSwUOL^3>5UϢ+iBgc.˩͝l;gY>qyju2>:U~U:UN֩uh=մNSE멦uh*ZO5SETzi*ZSMT:UjZ֩T:UNvZ}Rع<cR<פsy&3_Q\NlOIxbq&r2~RlDTx *VϦz4wϦy868y}9Nl*iZiMr6g#S;ٳ5gS>=Ȟ.hyg]`S]`S]6U6rZ]ȦKkkYjuui^>ڝﳑ+TjgT9ՅT;ʙ=bMu~*W U* @WիT @v*Wr ծP*UU\UT @T jWr*WR*UP*@]U\HT @WT¤~ Is'4nxh}ˏ[4wn(. Z>4wg>Sو*~y.eHyn⩻~ߩsΥrl^8qzb⩻`@L~~sTe#M5RŹTqUչTq.UjΥsTs.UK禚s\87՜KRŹ\8*M5RŹTqn9*ΥsS͹Tq.UZ?l+VƤ/8Dqnb~gTz3if"ν97qw.:Ͻ&vؼx&FJ]bWj~gl̮و]S0Ѯ0Va6Nو]S6]akٕzx3MvK킠VJͦ;^v]b4NϦw:و]]1RŮTkٕ*v]SͮT+Ujv];1RETm«S:fcT-:ͦs.ʹlvKz6bbjb*&N5ST1q*&ST11ULj&bT31ULLbb8LLSĩfb*&NmLN3)~gR.&'wIϤ33YϏMfϏMqtMJfڜ?6ωB;QWk?j4l ?6Tl.G]]˧.叺|G]]˧.叺|jscQwگh nG] g) Mcf5u5QW?ju5QW?ju5QW?ju5QW?ju5˝3 IekbO Iek>1|bekbO'V&fX*O5S٘bxjel:óS+gMex6bǦ23<*VϦ3W/?M_%9מŮߩsUDKѦ}ۮ J}ܼ]ϟ+,gh4yD8/qDZ5+UJ]bW5JRŮfWؕ*vMT(5ՔJ]G<"O*ϩ1u䣮nLTUϜߓ}TNsIyRE&Oȓ}=>~rqch"T-u[]dM5RŹTqn9*Υ&~&O~f~'~E]ww&~~~OX>'rz(}ݹSwROr-ϔqDS33gxlQ_>=K}zFlDSwNKN;u/U;u]T]SwRESwNKN;u/U;u]T]SwRw>ܩsS$t.کhوh6M#Z6"کhhR,u~:u?K<˓*s6}NLWTRETQj+J}v~FK5yREԃ<%y>|&OA,Lv6/珫(~ĩfbju˦:??~|#~N<\4~fr|/3U%Ov&rK~ω%ܧOy_s:=S]S_y積T~9奞_˻۠KďͮjjNVij6/U~pxgym{+~8gǦŏMW٘6N5lSw?OL?Ou=Ud?u?מ*g{Eϟ99Vg_WTd?O4'gפ:gҜ3_ (O_QM(ZOlM+ݴf#gT:UNm٘bxjel:óSwޚMs>~~lF j6'> O:oS"p~6:MsV=:ij ZY;6UMkbmX;լMkSکfmX*N5kSTvY*֦ST6Uj֦blTUKkFYMem6bTyo$cglT6v6TfSY;l*kkbmjs9~و˩T9[o>UY?^f+VfҼ\eQk3D9/Ok_Ѭ(Nk_z4L*֦SJFNT6UMm^+ͦzll~󩕵xjulg#N5US{ȧS_M6WoN"TySWPY5ULI*RSMT2UjR"T2UL)"eH9դL)SEʩ&eH*RN5)SETrj'e6"eHv^/oI{j_64S+fc~~{zOʽS{=LTQ*UNSD*jsr;ݘT1v6u]TymSƦkcRHHy.婻"婻RRK*RKy.eHy.婻"婻RRK*RKy.ej%gS3N;/]SwRESwNKN;/Ji;FlDSwNKNm~?4lvNKNm;Fl:~unbuN̤o&~7o&~7Q(7QX~E~I_6_7KRE_j_6]OѦveӜf?vveSٕMwTGx6\87UΉvP+fcvNyfW5JmΉgӜgΥss1RŹTqn9*ΥsS͹Tq.UjΥsTs.UK禚s\87՜KRŹ\8*MFK^t.ݒg[2wz6ͽӳͻ%Ϧy(6gZ9l*?Mnɳi-y6bT6u?iڜ4FMk{VM߳I;?ggd:ѤXI9JĤ(RN)_qɛMʉ"Jפ22UjR}l>"T2UL)vRfSIH92Jl7Ny_7;eskNyTRƤLLTrIZIM%kR1)SETrI*RSMT2UjR"T2UL)"eH9դL)SEʩ&eH*RNw*&6CgSJSlD*'To*'T9N5RENVS+R唗*L5yRS^6rʛɓȓ*L5yRS^6)o6;+xgTxVϟ/JLwVDJlYILĮݮݮrKܕJ|w_'%>=AݮTݮSvI;_OTOML=xgӼfӼx6"婻R")?|HqDSoRKZ"y6g9ɳU=Q5Q]SwUSESwUOUMUOU=uW5UT=uW]TQ]SwUSESwUOUMUOU=uW5UT=uW]TQ]ST{穻6Rf#RϺ_z~/??GS_8=~^9=~~;MO>L˧'SwS/Mݭ=u6u^ |6ٜTMW< ʗIm&&Dx&Dx~NxF9yo=ON*֦>>8UNﳦ9ԣg;=v~fsF0UU%UTm+9ZGTjWT\OU?oLۮj*N}E+TyIOVTMUSEթj*N5USETQu*SMTQ5UTjTS5UTMUj:TMUSEWUUSEJ٘Ts?O)Sg*&Nl*~_~L5RŹg6lT1q?O˦o6LWΟ3~t97q7jbu|ML"D_sbM^ΔL9:S&2q.UΔSMT-:SƜKZg9S;? y918MuNFDjh"ͭ9'fSgcvRETmjwN̦:'fS_򜘍Z6-UDKѦh"Z6DKRE&Z*M5RETm*hSMT-UDjh"T-UDK^UEKRWS_yӿ=sb6Ts.W??831ULLΉ̦2~~W^e8㈵ST6UΔSL*~SSWS+|+r7I%e&RNܥ|| 918W&&/ gډՙ2L~hgSwkOݭMݭ}LS3eX{nT֞Msk9ڜFj~T/UK~_7LWIL*^obL*^o7Q{Eo751&~+^RlDTo*ynR+Ѳ_#Lw*JRS;F)Mӳio1Fsbݨgs+ލz6ͻQ1RoR/u#L̦21F~_jlLT/Uj~T/UK~_7KRE_*M5RETo*~SMT/U{U/UKM_6T;sk&ZZ6Nl*ѲsM_6T/UK~_7KREwz]nM<;>~DK<>~%W|~&>?.D2q2q9|;,hw>OM91~|H9դL)SEʩomKyj≫~~'Νv*ډhh'w_du.LVN\EKDج}USw>*G]E;9~lf]QWNsչSw>G];uw}չSw>mʣΝ;QoG];uw}չTq}Dx6͉c:QWN>6ؼ``룾`g]EsNďjש]u9lv>G-ΉgӜ?6׏MqlL)ΔgӜ)?6u3:S~lV??jq<ϏZ)?6řlv??G]6T3uRj&})~g;QW>jq;RŮW~+8ٕZ>6]_J}ݿ*'³1RETmo??Wsn9Z>6l̹,̹\8*McgW4&hEW4&hfDkfծtgREW,~و]bT+UJvgl_6"T-UDKѦhhوhSMT-UDjh"T-*M5Ro*M5RETUUT-:ͦ;e#gTkٕZ~1RW>ԩy.u8U>u]T9=ZQwUSESwUOUMm^O4֞nmX{nb֦VkOݭMkOSwkSSwkOݭj֞[{jszf*ڜϦ9fӼc[{nmje4֞Mcm6b6f#֞[{jcm6gZQc6rz8xj'p6ߎzl婝El.bL*g".bL*g".3<9ES+zLoonω ~;kOm1m6_˚:|𩻵b6F=uTSwUSESUϦQ5JճYU:𩻔RvRݿ\;L(&N_L(&N_QΟDM~3{M:fҜ?3iΟ3Q)SETrI*RT9?O禚s\87՜KFjΥsTs.UK禚sݹTqn9z;}͹Tqn9*ΥsΥsI3y6/8sS͹fӼ7yoŚ87\^q }\s\T-UDKכ*=9=Msz̦:=M%Z61f#h'Sa)OO&Oȓ*L5yREԣ<~~ |TT'u*=z~aykٕڼl0c]J]bW5;&&Dm*f"MlU&fD1qfęT&&3D9:*ΥsS͹Tq.UjΥVlV?bR?VoϦR5Qu*SMTQ5UTjvUSEթjmW5UTMUjjZ:NlSꜘMuNMwNFΉMuN̦:'fq6=L98UNΔΔTZgSi=Nl*MwFNmΦ{6"{>dOSE&{Ȟ*O5SEm6&{Ȟz=p{g#O5SSi6թt6ݩ4^٬??]U\HW{;ze6L*LD @ܯr\`\Ȥ d @ܯ$UUU\__UU4Wd|.{j%4.{~."VOeOODSwSESwOej~j#{6gӜf>U?9/Ms^F˧6ٽOgӜϦ9/g#Sy9U>u*SϦ8Ji>Flyz6{Omm6c#Zk}uh}و֧ZN;wOݭMkOmNgӜwAڨz6):U~وS;UTFTjTS5UTMU]TQuzUMUSEթj**Tl:UTFTjVfS:WB~ }:S5Jl*Ugc/YT6;˟?W,~'׫sy6fS_M'p6"pg]=,TTziC>uj"T8UN *TvYڼ{6"T88JT"T8UNVulWS&"p.pb#L*3NX .p.D88FTg <>u]T]SwSESϦ8Ji>]Ji>]T]SwSESwONO *z[>u]T]Sw+_=u6U=h߱f󂵟7r=uW]JճiT=Fl^ym/|.TM#ټ +'O4.gsv*.v.;׏@\~~֩?_(Ȟ~."g˞*~6Tݾ^yFL=n{Z\b(W +פb\1H+Wd"W Abu 5d"W UPA]1\1H+A666r bbF\1Tb@+TbjW Umb@+TbjW rŀ*W W rŀZ]1Ȧ:Msf?j͙l3{6ՙlU.vWTWTW3A6vŀ*W l+l+l3{6rf?66Muf?6@m)+̞*gS*Uʙ~>dOS+gc"T==}ɞZv.+uퟯMUZJ ^ C-?Y 3Hf2Fpܝ#g$e^fً5u^ߏ3uGkX30&Aϟ#A瀖?G9" Xt ѵkk:oVzCwf,/W~s(_<)XuOz?)cY2`AɪEEUUU%]jJV-̶jQdբ`բ`ՍUU:Vzowfvg:(Y<8cW_>~j3<=3ؕ!/y ȪEg+c=c=3{:VY:oV'6VJF?zBhʢ{!u۝꠳:㬶NkA \ \y2d``AE'Nm2d3_ 22ᓒ:oόqe`yҺ2l=(<=3eEgg(SBOZ|*hy`޵еQ6 ҵQڀ2pm (] (ҵQڀ2pm wm@ڀ2u]Ի XwC7H|? T*z@pPEo*~LUFf }@,^D///J^. ^. ^\B];(յE- ~`CҔgҟkAVZZ:(Yq\{ED.Z^>f9Of?]o3|+PU2eg%:|P2{ѩٯ̞>83{Zyu^q9ldE:/ n?ɬO~~xW>-?e&)}?yD2{Q0Fsw>󝖇f/:5˵ًN&hAf_#iE/:urk`9AE_#~P}щ?C=)\ 㓂o@f/X`mk> :`mk[m= غ`m낵$[OZzEֶ֓uQ'm]l=imIk[[Oo.l}se֓~`Z'm=im`Irej/mֶ֓Z^3SփRm=i][O:[=3:.vmQpS~QdfN:uSÜwڪ7:|2}̀?'92NVꤎU+32SsR˔3rf>?3SsڟƟd9ԟT9ԟ˿ ܟuN:ztσg*5u |se{3c2єވ癩kբsW+-:}eLW \tjZ߈6:2S/ל<5'/P% <2 vWWa9ϗC/Z:FK[oqn4;^jw8Ǻ  ~@  ~@  ((~P}Q}QAEE:3S.Jf/Z>(9hdʀ~fgƺ *2lp w@*2pQ WD)S_((~P}Q 虱|?2;ʒB <(EK[ߨ!/u_mdʐËB \ԲxLP2+3peEo\{ͬLu4 <2T\[pk+-:X|-E-/X^!/փRm]2pe,gX xP2pQ <2W < `m \6`  \6p .Xx@2𤵁' \ zEֶ֓Աue֓Ute˓^ԙuwfj/OZ{57=38sӕg*㙩+Iʀ'ugrQknzfj/OMW*IkO207=swf]vRg{fjNcόso2<83cW v^0{Qv7M 8OJk>wzݬ뙙:<,>(9(8GOO=wxX?_5c=3PEJf/XiOHO ^*D-/] 債 ^\r ^.X{y@rk/^.X{`˓^rQ򤵗'\iIkOԩ+cU3̶&ue\(~xҺIjwRǵ\;3kgvmQpkgqmeskk''ujXڵ: vڵ:ڙ];iڢkgq8ڙ];iA=LIz20DsӓsEɵE'OHxdcI'BYZ^7ZM[KWjQFcյ!u*ؙ:wzɵE]#huh{KZwL'rȔ)NMJ2sS37z(9tysS3zp#SnL9 r@0ɔ)SnL9 r@0ɔ)SnL9 r@0єEE)))%SSSJ, , LY2ee,Sgʀ))%SSSJ,Ԧ, LYtm!dʢ`AɔEE5MY˔jՑjʀ??%Y˟#C,j2?Gge,VȐ???%Y˟#C,j2?GYԪ`+cU#㹶2ڢڍXrmQ˵깶2ڢkGf$z--jvdȵE2V];2墖+^\re,/X^ xyPrQ˕<2o ^.X{`k/< x`債/\債 ^qr eՙ:imA=L=/<ʀ?'u93?Zڟ: Ԫ֦1eeO=gXԟ˱:3UU'u:3U+cYufLmբ`IΌcxVYudU7HV: XudU7HV: XudU7V- V- VZZ:(Y(X(XuPjQjQdբU+cYudy\_[4./r0N 7:5otn:ѩXFK{O=7pX ^a9' |Sy7^/gnWx7:5z^gz!o < x@0o < x@0o < x@0EE%J. .  \2pe%J.3ꣷeOޖ5.^^t+cٺ2`덢Q*rQrQ墖+cT3C^.ZzFKOZFKިQ ((sڟ7 ,jrd1t2ƝΙZ˪):ʀ?L2V]{ˀUZV;GRrme׭6kZZԨkgƩkoevfjh-My?-cT3TLSJ,ZFK'N}S6H7 od~6H7 od~6H7 oh``A~E~E~% J+jٯ2`A~E~E~%](ԟRYt}䮢V92*c2`ъZgergy* J+j<{X_Q[x*wfma[ƲȐUUU%5ʽergҢU+U{T-c<;3μ-V- UF7 ,j ՟E[A[XԘ2eQV[Ҕ7Z:qR_QcqP_Q~72*c2AɉE[Ƙ˟:t? )z k];`OV/\債 ^iIkOZ;(8|ҥtË']f[8|~8:}7ßS;|Pr8^ZU'm=im`IZuf[Wl=i]NZתEVU'uZꤵU'Z:i]NԪjՙ)z?Z8gQ˔3Srڔz2U+3?6ǵ3SܵN:uoJ'ZuXUo2[2^^. ^t7z{yJ' \ J! J>* >* >ڙ|AрG$ >|AрG$ >j R-5 8f@p1E1E1ccc% J) ) jPKj! J6)ZStSy 2[3̶QQѠ䣢࣢࣍ZuxuWe{n3s UU2ȐъZ3f(GƳ_e,UƲȐZ3#C3E~E-WU깢P sW~#PVWQr دt*e~E;q3NԺ73`ʢө!-GƛUUƪFrgVe\;(UUƪFƫ*3}R>_y(xK:Z)[ ֶ.Xz@uk[.Xۺ`mk[m= غ`m낵$[OZzEֶ֓uQ'm]l=imIk[[O<:3uWl=imIk[[Ozfj[m}~+c}f6f6{Qәqކ*@P y2{33 *̗c993λkI7'g:oCΌ&e־|?iI!+}QmșqކmXxLIokAW:xR$u攙*W:oNV$uޜ\ۜ2I'u攙E:ϨΌeegTgyrfꊻ(}R-˙q޲u$o|? ~@o|? ~@o|? ~@EE%J/ / |_}e%z' uXtm!dλ^Rr3U|UoeIPO:uËN;>-g|̐ֳEEK>#29ny3޵ekX"3602pm@ Լ :hkkZе֛3D7=+CDI7=+CWDW.bUz-**@Ut@ysfw:+c93ӫ65ˡku?i=_׺17H|? ~7H|? ~7H|? ~AEE%J/ZOW|_鞏WUQ WUѥx5{evCWDf}e,Wjb^jGƳueEփZe![/O +c2G \ \ <(e|`c/Oj2kGsme,Vrx (vk+wQ{FRƪ+3}Zn+3}[,] \ \2ȐQz=W <(eXuxuxe:2PJ- - r\ k]; `ڂk][vڂk ֮\[vmڵk'];iڢIkNZ(vڵ֮- vkk'uj뙩kIzڪE:s3S5>3QόX^e'\8^˃'<3^k.}fm]l=3?>3xe֓:3S;(̏ȌLjOW\fj[ȌW>i=?>S/Wƪg/jyyf/όX3S{yRg~|d<[LmI[WjI/L]g'u+S|-˓:^y3̚ό@ }@0o> }@\Wīp@p@p@p@Ue*@P WD*@P Z֓z1{e, ̰O̶rxQg2+c2 x33̰x̼f?okI*@P : 0RfZ?]kIkw0ן`V? 쓖WO\kpm@ԩ+36@8ȬO:)3:˜_GJ ZA&#CW DW ʿ ^1:bP#]1^1jIڀ0]'kIKOJf/:mËًN;ަX33̄ }P2{ѺËzZ0[ol= z@[ol= z@7Hu`DJ. .  \ \ <(((xP2pQJ. .  \Ԫ+^ԫ+8e,m^A=[WƲue(E/j#J-jUܕ*!*|13z9^u^uʐBu^K/J-:KOϫG']mZ|2~\ xW[Ҫ7ZsR (r1rESu@|&XwezweE{dȟEEg)3ןz^[LkrXϩ xyPrQ⮌UqWqW~\R0d``A-h; .Xx@0pk.X`mk < `m$OZxE6pQ0𤵁' \ )f>?^/ϖ}[ g{}=kriޖ6yٞGgockތVrĸgN{adow6~Ycvݳ:odGƶq 7cxO=kNj;ڏ-{7[h? k?_6쿟_w;~l^ώ-t~}~JϏ9y>?ߞG)e_o_:/K>?n\ϭݲsx=σX/˗Q~6~~~&τ4W=k|Ke؃Lxaj"gciBg#L/} =qsiryPa#OW6ߋw{>^3Gk[mzG>^[]~߇}6_o=??.؏w^cY]^5{[υ0{>kުwy}*Q۽'_{1{/_^{5ʏ:ݫEO_=j<]|;5]czb^?-u[}{o{\|x鮌~5.u77y~g!FuW\]XuU6!j|)b|??_,Wu|v宻QnK{s;>zR5EoYg}}FbggzB=`|\mY}}'COY_#,{%4Fy͢o[ڜfo.nT,W4^&ǶW|yfeFp6Y+P[O',vLLm:_fW>fWivYi͘+LM+[{o}Em}[_ɛeכ+lW.GIv|jNz_!f!|ez 4 GP"Rm>vW\fPp]f܇ 4{_,{k7WpEmm^p%o>\WgrT.egR2)ﳡJ<.iDԲްp]f. ׳WY}6vKֳ ӲcG{M7[Ϧf_MTMy|^f{i;p=[j} twɵ[fm=-nkSo=n[›f_-eumYl}yy[ϲeoٝ}ѭecZ%nLb-Rٻk޲:ۍM;{e徶6mZBղ}m^.]}ޮ^uNzn~K_vo?.?^g2=xKRܥVo?O\ڠeN|WzqϿ~cϯ{;Zx_7G#._϶z˺chp2po7p4sbNO<#W˻C+u#Cr^v?>hp4d%;8Mj#n >>!<ְO,4v=h v1=/ݷxĭ!gܧG 7 Gq׳yѐ^c5lw{ݶ9%/: #S,eСsGh Gy4dxo [|cy->ӟuh-9@auh-uRYס#;#\aE-áE-kG8u6uYp-aF-P}SqwkwvZ6Ba:}sa:ZnqmsqqǏ}Cu:D˶sa?mcx[OZOq0}Y';D6¹8B׍ZN!(ZN?e<E6BсFsBuh-xmsq-uT7BkG8uF8xCײp0lj@ea9ea.!(ZuTס#;n:hy0Ԓ#;F Z}8V6¡Cg)k렖y[aZ:tcn';DK^Taa-8消xԱClsaxnѱCl#:tcm.ҵ8s,ӍZNPmsq6E#:#<שoea.PuZ6Ba6ղp0jG8wGyѲp0p[u#}Sq:Ŧ#: #|_CZ6eavFh-07Znnֲp0w;>;˸G6BaN:}sa:1Zqmsq۸G>©8B'ۍZNg_w笽Cw&NTchiGa! u-]".eծ%TUuFޯu-::tcnjqea7c6±q|hٿͱi%Zr̡Fg+uZ>¹C?kٵl#; m8ea1Hղp0~Q]ֲPtFh:}smr[p U6¹8B܍ZN3Z>©0k msr[#ZN>t-AMs:m0^ZȻeܡ5Ѳp0}iea8=яeaawhG8uGx#:69Z ]ֲp0Оuh-qmsqL}:Ue.n_q^1"EL bNzcMh>M wD}Ew.(dpG零.=: 츠i>:ZN;-vM{{nuM.큆(:ik:ti6i[X{I<ҞdԏrlڻLG5~ce6zCW?J״wrԏrlڻLGi;G96]f,G(]e:ʲQM{(& Q~] GY/tM.v;9l]QnMvlڻLGikG96]WG96]f7m n״wԏrlڻLGiuG96]f7t܆Mشw9mB?^a] GyttM.QڻMn״w9~(qkڻLGiG96]f<#}lڻLG9e:t.Q̰vM{(U(Ǧt=8ʱir㱮kڻLGu]e:y'.QڻkoڻLGiG96]?~ڻpOi2e}0J״w9V2~]CÇGY/tM.Qͭѻoڻtq=8ʱi2E:rlڻFutM{(7]#fߴw_i2%Dشw}e6zаtM{(xqce:'vشw9Z?菻}e:t.Q^#f״wroOF.Q (Ǧt=8ʱi2ei^tkڻLGiO+G96]ffkڻLGbQM{(ziȯe=> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 336 0 obj << /Length 1427 /Filter /FlateDecode >> stream xX_6 ϧЇ)KXug+WNۏI.ilH")D1 <4<),LYlN$d bҊ FӀ3Mחb8w׭O%5un: 8ً֔fዌpɔđ5'j=#^FR[+"P!OcW/66:V;F{\Hfumi ܵyai,;Xf76Y[s=5|Iբi~Y856 F U:,&i t h*bnbO\NaEq0`a5];`1֟|o"#SN\wF~DKIDݔSF 5)PP4+2mv8y_ b@c+ ⾳|v'(0%:E-`UkJQ1/7&0c+:tueVWa3k0U~A70J$ Fb0_R4cҔTtsH[pԦͽ׎d16սy;0vQ ^A .6bAY4# V]gU]İXY9j^5Ku57d9dV:@q?ξfZm\R {ݧ@<.xP!mŽFDj \zeV;vD ;^ٻv xUR6o<3sMW q!xen.SZd752VhG*dlpyڃV"h.7@2soo%'Is䊓!x!=!ׇ9:K:"f#`@| ǯMp5D(x]EKg?nBVm_PTRjKyst|Yte"=ٯ.z@ߴT+C“4LTPpLi+1Z0>_qN.(d> 2<i?1MHCK)TVw|U72:J65PM) TH[qiմ^_'m1`07Yl)1ϗ^n->a$D+>e[Wnߍ<_(C}tj\A0 & endstream endobj 333 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/APClusterKDataSet2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 338 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 339 0 R>> /ExtGState << >>/ColorSpace << /sRGB 340 0 R >>>> /Length 7542 /Filter /FlateDecode >> stream x]Kmޟ_1vѩu-o@m"h߯\hdqIu()_=w/cy.2?W~(w}ncoG=X ܶgu=k= Ta; x-dz-gWRK_VM+?lQS>gk?~O=s9w+{˹k;ƽc7\c_emN5g.Rl^ ۳KZgYीv7\[,wi^4Z7#[Roۈofl|^ˈfp|Ͼ^?1{X>~68z[bhhgqS_8B7 NmQڬ+jcrgù_5E/r$},-lJl@,E^7̦ bq]HGXˣ#L 3&P̘5t0TvO XՒ*wU_mPd1 Т[hv= Ƴ'x%D,-̎9*HلQTW-߇/]1+y:[pg#O Ю7t͜laS6 ,-Uo}K6mcsm[x6L ab?,-Ly]§HـXZu.{՛2(,JD}ֹL1%2]vsu͑TW# 3( Dc#_=FD(4ڈMW? ,g܈)>:4xپhrOs[@QI!UW٨ &-@6j>,Q# ,QF N:sLYҐ|Wu5LQ9eΦo{:AT 9{X,-LynnvҪ[t%ޫmXE4bTD?z6sbtCo9z%5)%ƶyg1nلXu.{[RKtk)ØTj s€Lyg; kL. L}дYKW5{8@uawp1m\17cZԁVJEQ!暽o;=:EzJr5\Z1͕uÕy ƋoX*HeJ]uMjy]sma,riJ2:aՌ -;LxX)X0٨VT*$= w#>[.@_F1C%!WK"U]}A2(_ ӏsɏXa@-##6/(*D~0_~f:I6Eѷݼr@b#e)0T,Xà$ 3Lm0 U7֋ozgR8a;P05٘ (aY@>8'ER(4ژ N;u qAe6fh'} O^A´;]vdu.{[sӞ=>{Añ1Wîmd&uD8| E3'{wKY]uդmJoԈ}䜋#MMx#/S7>Ŭ '$$/L+7=*V.P”3Fun ]  ;}*:+uܙ$ؙMȖo'zV>,~dzE ٖ!mz LO&g׼+ˆUsݢK/mr!^L+wPjҽK7N 71uŻ"`لXu^dam&C=C8 p!݊o}xm=7f>1Rv]z|GiC1;HkiB61M?0+YZf.jX yvnѥxz{hp1g'+!^*VcI^AKZ a"^MYKozk]uA۔#TB"~AsD_g FþRs:I6{UkaŌc.dztg/G5DlP0m%$K]tJ]u G,,<4Åi\VZu!6Ð㱟?yA6K p9$o?eM^`{F\ϱ 6uMn;Agq觤 Wp%X6!fݦK/^fS0Ġbb uC_(A;w,5lS6Ldbi-Uo}˾r[_Wneq0ƄPiPd^CGXb:yD٪[t%ޫ_x0y84!ecdS=1\.Yޫl(J_b辮kݔ7wsM:7W,+Fx A6K.5m[_&}%]zMoˀn>QH8-:A$e $V;)uWmC.oz[-e`Ĺ<]5FC7\=B}lI TI^C#G186o8/k&D٬t%ޫċW`e"XE!pLX6+ڎ%^O.؎e݋0UsL8gr1\ND<}oB!,2}Iل<ƢnbRgTW-bbǂӛ$ 'V a;@+Lلlnөyz߲a6}۳C^"*bFK^A%1m+vv]z9VncliNej]tUݐX7!;'o3ݔ ȽIeֱ/Z+)y#xиZC\1z&,ML{;zlB^nөyz_ʭy?Jq&BSsm^!~Wym$fVy-Uod5'bƐa p` `o+>6#֨|ϖNQ.J£7NĔq̶-pD9 (I%y-C3]2!xn-teޫVv->uA0='5h><x:3_Zs -7Ӱx-EˬUgw+&gE 'xX􆗓bo-;gŎ޽)E^moxoiyL> kE9x 5[XO.uݢo}zP ɼ~;8,AN;yv˶ ;+TW&d26]zN;>w)kC>*[kQNaȻV^#=ؼsc 9tE7mvzI,GalV`a^ْ0+sDk5TWݬV8I&`+J 78\}]1{7.oӱu z$+W4x {b𭒷~:@tE7LrCoilGlfvq\1+9voطKnҭy gY[j2,Y$?"4bdv$мQ|֒Z|:E6z]ֳ+Qz@X;z Mpg7zv0Z Z -UoG^ o ?/Ekn1'G`?V JuJmw]1"ɜ:H̊E`6p )l>TVѫSY"NR[!mt%+I^}btݙ;hVe 5y D vߖ ]O"޶ mD]eyi8w9 '#a"I(cK$ ʶB*y+MKWErrix0SHb`Jl*fix WmN)s2)lbQ̛PwHb*6/VʮNɺE^ꭹU+hfOdI ,naWd0L/O,<|sݦK/^QQ`8BuB8vA߰m2/ RWLƆ%t)[KB%JNf dGg0Lò/!fia-Knѭ)yujh#Q(fskq¬ҧϵ5,-LGjyR-nѥyS\;AwSk-C ɫͺE^o=}9㚄F?v4ì\iPWe[m]7[MsunM~‘Aa"GbCƋQ"/Y8\͛2 H-\X$g>vXh:?ok(wi[j%Sc]ҋoz{=l_W `3hOb 6m4{eM "*ɻ%{ʚu.{ee|u,1:1fk(tM]yc-^ip[Z[vu,]zXy|c"p(^8G0qP~p%^B҇Hޘ%ebim4Uoñqcx!hVS0d_vN:'y g1#[Beg6]מ%KҸfW\*}y c6\|0; m:2UoKC8YR1!U1J##>vCe;d^A%-பx#lB^K/^v4Ez+ȩ"{Sђ[oG?}9 Z|TyՉd biԝuZWO,"?Joq)TyawW{Z&S4-dj&޶c+1iDŽh6w۱> َmI?nc[l18e[mǔvLu.{O+"j~Z{i28W . QXʛWva=˻!VݢK/^vHiu~]1kI#KOzCjy<3fh^`Lpݤ[/5p94NVoo፩;gZDqӊěP,HoDZ&x^}/k-?uq;xsC6G`#D@8郉vƬY틡/y^k9KWAiHpq:1ܘ 6mE!Ӧ8J5y¬yyOE^婷@l|#<*0o r}5} l{c,楙l@[t%ޫpK`#_WLm;vH<@nE|5tZdc%/Zr"=֋ozc֚4`F<+rlĻz1XS be4-VcV^&zz)L9.&UGgX 'YI_y'^Aw>˄1 fݢ_Uo1 .2C8%\iKXX8,WPzcR6^얷]KW8γd 3 T=x~Y+ϑ ^+^ lalGc2I6!zg1bjab@hsO-E k-a l d^^]l@QKW-=~p\[xf{IKR&&>[$2X;QjKK:E6aOUmaC Q؉TPRIJ(qG֝ ]TIm3t̸u0m#uBeGҨ/ޒ>1́3/6[t%ޫv'/ҽwcTlzzw0^CNaL,qG mg]H@{-xf*7m_W@0| 2 Ek 2mkhSܜL^S6t>[/~upӋ|a:-b x(I2N:+s'UMl%_qݢK/^l|o gP$c("]M('waTt]ҫ0zۮc[2زtbTxVNJғPjgLe&x+"M[t%7=_6|{dhS`db `B nj5dpZYxͲ ֮t%7lbb g"&Bэu7d%HDK>K}^6/v);*ʺE^ovV9%fEp;l+&boy.^x KaLqK5q]ҋoz n0)+u[lō5ݤWށcn98y nYvMptF;M(1+nI/_Pjl})IL^Aݎ{bCd_UKWӄ"Zi;[Z$_+0ByC>x[į»"~ޕw|ysUO"~e~$Sg/ vWodևx(E|*c_ u>>s9z"~ͅoKC&|R_*g7Ƚ.z͂jO smG m>p^'[wE >8"O;_zޱ- 㼺~/YJd-i^+yVq(,QJMviR>5o}E`ܕ0xc?t?Z|d߇͜OEڧ~͐7fh.lߌ\&FH8}F%y3'7gCe" @2iT9Eۊ/"JCdB"[<{u4W?:Ƭd_d}*!QM<fWWY)̏DϾIg0^c3au_$gs Ejop%Ed<򾈂k }1y,8̴|\2zXϽ.Ͼm67E{WWapT?'soC; endstream endobj 342 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 346 0 obj << /Length 1276 /Filter /FlateDecode >> stream xXK6WE"çh6 vwKb~Uw$(^Ϡ$oo8R&[Q3\o_D/_G^XHϢ̤Bki6;Nz"~M|._-כ}tMUJEU,'E=~z~Уwmj!,Foߋh^#?l븈4)xnH//(j5^sKLHjJoZ]+HH; h֑>kFWoC]-Sr$©3Ӽɻ-FUY#Tj+tynwBcT%\Sr1cy(c2[TCЀBe[Y7wBm|=w!35MNjˁO|af0ٓ'-]hu}s[ԛ&V>'G,>`qjjluXq=O&!̎KJ;ySue܆3hтqvDᎤILj1JwŎrQlV`*Np"/P 뾀)jy4Z);N4TeF.!?GS`8LU}uc# 8 ,= o@cu cQUheWrKٖQ$Íin\yVF IP@X@`@h@p]R$dW&Ru>+F>W7WciD`CYUX x N1+v{ԡQ.ýMmc=_5i7UȫCwg/ 3쐇_A?qT,J7c0{S7k> endstream endobj 351 0 obj << /Length 379 /Filter /FlateDecode >> stream xڵSMs0WMB譝f=0 j oA8xYݼ}A*| ر&l|LL%"wCb J!(jZ"JBCDy}Np>5G@')*LRhe4%o9f:"0$EU V9Y,֦45Bs,]+@ֽkKh3i=cڳM-olPh،GMS +qYV\:؟3YkZ}rvdDU_NQ}`2,C> /ExtGState << >>/ColorSpace << /sRGB 355 0 R >>>> /Length 83821 /Filter /FlateDecode >> stream xK$[n;_CiYf0w . 44hdnЪj@Itd ko~ܯ^??eڽwӗu^?뿼iWe2Mko]뿽N}_a/?v_N5|9|-hz9+'߄Tp?(_zO/@},./O^7_Ox۟.0.U-dBghEK ~yƗk ~>Jdxl?8_s *Д|r;OQ/+|Z֫Vv-8qppr rX#"[[efmXJƧ_M|]z^ތ+bM#q˗eT*"OI&p]zXIcM2~:tEDFk :te>'"R&cm|vvv"J'ToຮRQRq ͘ίr]nHM%qjTi6n%S?UH)!ẮRe_coC~W Dd4}9S H5~ c|J~ԚSݻNg0M6xW%c2}eAD5/CUKO#Tɘ.E"՝{4?_FCCAmߌݗzF8_/ FFwIwCo "U~˲3nS?UbXmt4uX]ܷ rrE_,5j1{CꔸitZDky"M5]<Gz2r35~}M'Lb"m2Ǽi=-f l2w\eϷnvZ;*'*֯ř.c<4vvS-JVޖK/cޟœjǥ:AjGKI,TZa5 NF3Nv7UQbFhCHQ "D~qS/pM6n:BnXQjFF. f73b2./ FMmO %1rJ¥ o ʶ0C6pHl Dzq )3#+Lt]a#=)tʊ:WƅT)s(VFMK"(8\N"ZA g"RmfkeThmSXv8:-Ca9H|>p+dAT8(##Ai7p]OSw-mS)&ٽFINRr. O04I֩<%EẮ[kOZN*e[ IQP$(}34~Ⱦo|W_R)bPLLB%IDa(G<%EẮh=]z_s+>RnpISo9q唩>R*/2`/QY׌0,.MXx{QN-]hD?M wLSHS~hSAj^bidgD?M<'.N5)yJ \uk4#@ڡFZi aj r}&F8$eUhMױ%'6_mPۦrB厶ƙυI{!z?^Ayp-f;6,)FD-R. "a.RbHFk|1a7Ȟj`ڂ(ҰҌTˆ/qRWR]2KH 3juN8]?6Evuwm5Y. g-sc9rڜ7{[o{m9:|mHC/-W)YMʛ̉Fif*vYѨ2k`KLSC`jD*UՈkDrSv #N>یxeb7_('O먱'O.ΪEN8?J\Wy %`rl<4*N,Ty`Ń'r~ur03##[CQ#U@Zd8`ZqʵØkYp຺Oali691_z˨Ro)[N-Bd5M]vhݻ]1FyDy3vC3ڂMc9kv l1-u>Yiv#ZnBnk5tq$ QR4e"2(u@Ed.,Dm,*jqS[E؍X&隋[2K26YrijlRvq͑j\X].F^`p+[I3% V Kk456͉ VLڭwlaAhL Q>+i ?,>*i%/Mv7bs4c37orr UFBqb\ތv#OMvWƊ3ArJxxkcir76)1sNUrƜ7rt۫micSVD.{X⌲Kv~[šxcpHo+<ō7&Kr\B5o,9Q"捑74]g,WͯN:f.' ꜇zri{w "D3zr{Z8ӌK%dAd8ӌ(q"`T3<%EẮB=:r6G{.zw9K)YJ6GH}7y[^`ޛ 5!]ڵy"UDŘxNRm.ԛv[]mj]\NYL⪽v.NU&57U}s-uv˼خ/9TG'Ggyq>l@X.X\Any.:\DμFâ?j 0+(̯63 .پf(6"նu.C蒖.wx̱iY}IQ_84̈&o\8N5KKSuKerS/%qKMrl-gi,T[jJN,5RKe{yjخan`LX6fD3v13 Ռ]8`1fIv7+5L#Yì1NZd19q19bs4Cd5!mvRd%͙uຮOT8vk:G]m9͵BG iqFW3ViW7uSvj}EnM5m\m͛0 T_6GzM[i5o%d}{u2<9q{ܒ>y{yť>@c|xLL;gޒf(l{ZᤐQ"0Oa  NSF 2bz=->` h92qXaG[u<2G&Xny#^nޮg8!sewg[J>XXCfmeןi`OW8Z(X+k %ڶedt!SFS`oV{T:zs0בcM*38X`qHgvq>_{SMstMYGBC]yykcMstMBi[r%Fo^ w5&F˥P6G!kcvvޒ[/a7z?" NZ(9wƪO:9zzowZ};E%rh.zH*/ze `ȁ[7u^a{¥}AuRu辄|ވH8.i:$o/,\K[n*8EZ:\?4[Ճ#]u輑خ7u8ޘ\ ]eOuO%!_3SJᩐvT9zzS6ߝns_srI͵|5ur~~Zb͑'ʘʜмX 5 U^9Dˋu ly;/]}nxcj.g2vۋmi,u6qR٤M[liMjޜ>FlcIi&nv1mvTNَ!''ژm6WN6f;oɭif#ΓjP廍H圖 l䄝i*l@NS5]XSv)|zSg"y+y}r Uq8fIn쫈홁zoᧈROe"VĮۥ rn gv)slRiI.q l|/]6.⣴ޮd}\˂7 ݼv'.v9 ¯)ɻm7um77^A>תcV3n1 K[Mv+2,/dw:mu~fQ̻ k*WRe'=-L]77LݮnwەE~w _:ѡ:wx;:m%.ͮڼٳyb~rXл.&OotԞ/ ֛tնS:VU'QW~r[c^<-\,ruM+#<4@n=&2dQ% }yۭqfUP7LRV=k>{kV@\CVo3@A\u0.2=;(X u`}Q|u(|ֹa,k?y6fO}Lo/_q angnδNxb_<: $Stz;#'36 mgY}U%G"u1]cNS znV|r+gLss>ֵܛz0{g[·J!Dxyx ɝ˻\-y}v-fڷ~-z۝ZyO8nhc|wJ==6|/ǷFⵟL;}/>x}w&e;F#`ụ^4D]Ď?%[e' } =%XktëzU4w{7߽W{-*g=ʗ_/~[4Oϗ/?am^eȷr?hz<#?O)/WB`~૤vxwKK<9 8 csS=zmwyo{z IBQz(SK3Oa,pkENU)yamѵ_ 5 #Bei\hD5dF Cƣ "ʗqJq_Rw aUU9 iΌVmM5܍BAwT]PR:p8)H>yamѕikn[cid qXcD?տԲ3 ىmnԯoFqʨFST 'caȣT'ToຮRl.1k]\vnl_؀12:3oe AD4SآIo(vp]}3ճ7:%uV1w"C])]̉Mj\hr~ /}L2-Nc(RA4)d js a-RppI@Ds İz-lnuʫIWe 验e\hЙfQ#Ofȓ!U ,9XẮ˂84,eA=DYꇍ`ӂ8%5u]7s'+KQ)&TBpsNnS=p]OSu/Bu/\mg[իN{OAd-Ǭ蜤Z]YzbßW%A9eq)8xjX=ۀpƓ0~>nug޲ah'u-9/i -jҴ vn|EǸbaw9sUt *vřT㒚u6k8K,{5} e7r\[׼X~d%gf_钴jƚ*̱b<ʴ_;oɭ7TݸۖePic1[eTvѸ-%T5c׈hRuxpS^.:H_fVbVHUDJp]'ͯksRf4J 0IywXCUTXϴүyj:6z ݐMYO\c,TuSsӮn꼑^vXç9GmçcJyՔX>h=ه]z3]g-?Q EtUGѢHK4؏gn Nu4h#\nWm)Z\03o);r9#e7MNtv<5 l*&:]:i`~U-fT 87q_`2P8 Z)upK^TeF5=ukNyKRYi bLzX*R]~*DMO_ʵ[-ñ_ʵ[Dc j:Hk\XS|=gAWtvP__^+C؍ޏP.hmBrf=צapp \rm2*Ms4+i-^vO:sN#Q{Rљ>"딫IMjRq58om8:s^1֡_oYb9 V}{L ~',"VHQH󎮙]•\za,y=&t4qebRq1{iүخ85Ќ0(n~TFT-C2j! ]l%E!ẺOal\'is)pUX[JE#rilRR1.3yypKWN/v'@`\PUo'櫓7Ҫ2##aa7y KcX0r `RiW%' $CtriX9[IQH%.4nɈD{e e<Q272wIDTL[Sa7z?ch  ͒<4vDP`e" amy(n(o˥]履%QjcG8ܢV\Ol.66)GQXEvE7r,8mؿ8bsZ8\,ƜЏDZY٩%U#MV7͵-%|M8&muIK,1U}خ(w%J- yx7*qRؘ27y#G/]<.9r's[71'\ě`B;r74]'{m댹_frRK7CnGm\~k8".؃^%C%㼑zoj6{,AxlmwoZڴ]jBEڽq++QZ^`^Pzwhaw;ai_.rP{}S^9zz?~q?z8ha'=RcyA_Cn5)+ eDsM-iF^`ObϪFh]j',8 (1!"\T3<%EẮOTxa-qNrx: +2հ[AX/I.2vi}Nvy^ZGKnӮ?ܻ!k]X[NK]]y#G/]'xO9zjvFnN@NvjS՞XHۿ>$́]iү7rgIaQLfR0 [ήPeRA;2vyjg}}?I9hm~?rDھGXSvhͅ['%yKnYK˰Zxk#JtεtQ}-r iYT؃VIӗ>v>Nڹ fM[w[pY Uhؽky#G/]J/\LqCsԗgaӈ>屶BU?4G}X3]y#G/]gL8?|j89pqz?^_y*tߟ8oX7X6vNJ&oKӁMwys]w-KWcsFr9ɭƊ|h,J.N #41آfM:;_Ki&#oK؍Ϟ5hUq6|^UՂNl"۵U՜njB$UTuu#ԃJ~3m:9K=7'R9WCd6*ޫ͌d <#t<Ɛ7X ` P; `;oɭi7xzXkA}9sX6asddj GS]͎s>yL j@9;6is*}X3]y#G/]aݷ6в Pc6Xš9 BۺW} `cF/]7](b徠hJEܗBUEU4iWyKnLtSA2BΎf]ZlKuDlLXS:hѮ"ui/-^vs<ߟGr1ҟ2< Z1fnN~#9K5vi/;y#G/]_r?|TVEUQd6&Q*b9#mQLKiWTyVvެc>ɜ9r'BU}:K}v9 cly;Uhf,oc㍅  X"ncy#G/)+VcBXr9^D,Ǔxs:(hP-HXd]Q4-v8MUcłDY r",`vN 091|hm]|ʝ+Walg.kEb{bpϣVʾ>W4r,TH23j➱s8㢶+nr,Yq;++yOU}{%9Xާ4ly]UeMvmes׍gbxN rY@B^1?iOC0*@/oj[3-*i9CRiy.o# :.o^t}t.EײY9 w;;_9~k+)Xɛ?nWeszg/x]6f}bw FIF}zNYE ^{Q]%8}#f,n7)wJL/:ۢxef|w gn0~z7/9;λ ;ObjOotd ^{ZoҿU"/8V}%Oon|ͱ.?ꞝ }WFW'3?^yQ;}~ĝuxxힷύn^9ͦq扡>R\Dh?kx{q8R{'t;U~/axᆪ}7P;?Oת8i؏{2/|S\հiĞ+_ GeeDhD58C)=1~ ."S?>TI~hyϟ%v^ewc8hƣUis CC{ tߪwe.U3UϓLM"`Zmc)e Y\k h|EzmA}]GN:jZOnӾ dQ`CG~[7dAߏ˚vȲXXmM[E {M֦fcMda QG/r\_~Q^F9Fme|.;c<›eEeK^yK2 LǴݾS}&c16 cR'=nN@p k`'5}lgl3]ފ缑خ?or.W3ȏY?z%T!?>;rMeVB{3u E[X"-mîg#ƈ? p/\=,n93w39Փovp]'.6U\hr{lKљuk.ؤۍƺ)Vm2JTf֭Rmb?5FmfYٙ7r޼9?8x>EPؤc-ݙ!u lW1f..z`nKë6b[Řt_Tt_2A]gh\ ۪9WڢW\XjP`DV7rFSz?^ 6\dW䱙 KZz{ !̈)ݸN5))u6[o0~9`37E8$ 8j--p4AſyFRUR1 L;M:KԧrT`i,Si)؍ޏ7On6WJLc%N 8# aU$]5MΖO_MusNTgر9ɶp)Tw}BMl 0 $!dEd@BT3Ⱥ**$[IQH37ljꀩZa^l5qjbQMZtU9zz?pXɊ[QU(F-zLʣD@5HpadT >1M @5Cn?v'\z UXqb ,Cnr4 `WW3Mptltj5}l.`V?WޖoTҭiSMC њvUaʇg* H8u}&9zs`hvnX.Sg;`ӮK؍$暫`H"*gάʜL,J*g|v²+zur.rC鵸W&CiAUڽW@N^F\1nP)C!m?: ̙CccI= z9zzo=D"u غV}Φ욒v]:lCvf#WWEҖfsQ)#n)#n!27r޼12^wlwazbg^UO5yګzoR*$#V?tЍU-Nujy3I7uW9OwCki=cJ[w.<Дcz?cj~f+lU3f¯+4k,T3[g`mFl-M5nIF28S& j!DdŘEetU? EIj3:pYŘ/TJJ_9"KVa>ǚyׇ9קͱXXTͱh4VsӮ9y#G/]1fRAq31 &gDŘqנfzagkI{6兝8n#r)e,9W1'vRڒ&Ɩخ벍Ol3fd 2>i[aXHOlQ6VQN;>i[^`O1A 9gKPcr5X/9|9 gz}خ֩kk{^}CڟjBڡ9K{okN{y|kiͷñ. To'nk-!ق+J JrnlR~+ `K?iүvxޤZ|qQ⠙ۛnZq5%OBU{4GmX7]y#G/]立RQlUH-B#զWpRv թ 4՛筮OT1׺9j(P%ڻ)ijX樫n贫:oS,w#ݽT}niw;oD}/L3)̑YLㄳM=FMelnM3L sdd fR7r%F履Eэfkm[fCΕ[`NE!r4nh9rGKn1{ٻ~9@LfN`R2Ǎj5&gviϾ!FN7z?㞩=6ۅ]C_95K5i~c,TKFשּCs41F111r lP5 i|輑خ3&fggMtgz\k]\hlR6͑ӝiOȭC=6oQ{T{ GWP3ڔjoNڣ4؍6\V8K}r7sp:3V鴫7t>5uGP_#!7Y)cӦ>m‰fEIlp]Gf)Tj{'y)K rZcEO6G=X,ny#n~Wsi`ժ-b삣]r%όMjF}fL#]䜷K؍D71f*Rb;h,I5Us0V]v p |6v@Z C~Ia`pə=쀜٧ mtlgx'eqO-)#Nj;} (˦~(v/0T{({Onr9yC1ㅹިM `*zX9A]C<5voFݗ7k+%xңh_ٜ}G KKn?W#_e|ۈpPa1وpbu#0u|9Lr t(}1EImp6چ 8lLj˹u[?4G} ߏ~o!+~XNϜvC<5vo^Kb7NO}k7+kXuIڭyj: 9h BO_~V͑~(Vخ[zl9{ t5KrNڭ^yj:|첯Zhr,BU?4Uvv['uV޿]mu6KrY!BU-|*,Vwyjخ/җYsE.As rK̓=71N1yF7JkN+7onRw⛉-켕QUn+*V~)84=\+4ߵmB#~mY<9ׇ?M]텀k뙑w㡍߉Vy;LBq}"Wo&t ։-{Zoҿy?6aQb6!f-"]o:pMUhaj|:+#_h䭵gHm룭W9iW5o|iBɇU&~њp_ӏ#Nn{? N<0x3- nߖtm')᏷>@tn߉5_s<\Oồfv}t{NF452E'3ީanw@EAPv\ow1v!ʑX}׋B+?ٰjQ\qWFHњHע/o/)~_g'?o>Nu~w*~)$ßzy蝁RlT^|Xoo;z_4>ٖy-vEӇnV•.y3z=>ަ6?ї5/kwrw=pV꣞wxs0֜K4wI/K\9"z:e761|'=t5w:һVoq2uyNw<&y/~[%4Ǐ_uzX[|٪e<hz9v?I~t_ ~ma땟>OQ^ݵ@\NcEd^~(կRcYWOˬS/QHyM1V]W/_􇗿)Ҿ ? ^d|K伺k+=M|?̿_Ҍ2wCyw;wk⛜X2߭#hc5~-w"P;]'gy vP5y#G/]o%:O-f32 T7ޟJ~;c^NX}{:F^`|sNcRiǐ>d*[6q;>_8ˍ=*>yj:-;mmY'A0:{-)w-?=.Mj[̉N4i>y#G/]o}~#jcɹY~?OXKkZޏ@Q9$}9}ƮjT:mQvd^g㸲S+{exP5Ʋu~v(XS؍{ivޒ[/a7z ^m8lC>_6m]w9$6)1sNUrƜK؍o6h'NOmU>KWc%'ډjCNژFn1y}XL:'R1ɔݘR{E u}Q-ZtAvX_XX"5N U9#k~q li8<RC<ﯶ:[ ;oLn =65tPXN 5yo}ӻAmn~cԷ#}lGHW-Cco)T6 v<5o~qo%CNoNOT˥Pv4d ib9zz_ 0gyM8Ž'(~n-?Ck8.9m=myjخ72Nm|Ή(:ulY{܈LE~G5-5iəw(vP_$FFOh|"_l?NW7m:] ͇z|XjcX!]my#OM~KKrlUX˥PY/ɉMl{y#G/]\Y%9G;4_?x>rͅBeINFȴdޒ[/a7zomV/l#(wV/!iSӦʆlU;v~e/sާo'ľ_/ -hlR78a%$6L;9zz;'}3GcKS;XbKԼP5XS{kF^`ޟض,ҜM߈Jl*˱B_i|Cۥm_i9zzBSɉÆ9is'rFμjɩ0e'm4͕E;a I͕m9z {;WVk%+!g҃ڬ#SZSPef`!8{[ENl{1%8غiN&|(SN^6q!a3Rm#o lFeAhzĠ.9AhڛL;S^neվm9%[߂]572ƀyl;ɴb9z {.ア:3uf1 i7tY0Ӟ}_vR34l-|8laY.;ؤ#?XUN.vá-7el9ڥqem1BsK~[9M⒳F8i}W\vu |[+NN7k֊=]ʵY+2iZq<5 l{3,BsCz8>q!)9"vCI5vR윴h D%Ve(RڙeD&-?j U2sa+iWy#G/]' .x[heJvphؿXH[NΚ9Ҟk$oSvO'וujDVS~:Ws\c;)Z>sdMqvNtV+uk>sdŮ#f%F']~ c?hGhÇC iwnbL{3oDe_4[\Z%vvڿ&J6vYu ipq)qW~Mޒ[/a7z?SS/cD)k(e'Xe"c">VMq*ɜvP}vor;V~*EN4>cgbcg=9zz?[@Oa'+~'+_T,`,TX d4]ǵ^ɉ:[cM*u$Vvk9gyQ{=oeϫk U{g%V{vQvKӁD;׸LǸYseCA1O63GOjڱPͧ6G~1X|fn>5y[`zl\?5?XWMʱVs/56Hb9zzo6~<Ry;tݱS6AbŅ-OM޶ϲicW QY6d,TN;EI[Tocخz)١٨a]/)wPegءFue:ot~ӾZQ͑߀_|T U>9Gu lv׻X9Ԓvkq)?ʲ U KXYNbyjخ7mb[(X .:q˶A\r֝Sk҉|sg!棐h Ll*zfRLsb}SL9Ex)a8F~̏f5o)ι(*[} 岓M*NZ]#[7r~:Y〓+MSzԶl~ 8N5 nkvlqlӨ̱YfPg7qcwvflf`7#OMz9ZSei\{Xs Vnm9zz5k|,NY4"rlIahNZS6e5>:ojh]|3s_yUOx\k`7+\>둧{L}ߐЕu-!g,TmM]I} y#OM߯JIoZikY Uk%HJ7r~~1]A_90?#gks9̎Ӯ3=9zzo{`tunK~u?~&n.xBԸ;nY.[XHrkg]Lᠦˠ-g2]+im׫#f.vށvQ󸫶qڮ]h 뽍ɷ}9/Y6CzFSzrIMۘ<{]7r~;mxyտr}톺yj9+N[TnSFξٟ{wٱjCT5,4i䝳x~ǵsM=oz+QZ>i,T47&6Sȴ}r~beݺQb͛k-.ǚ9r\qFlXݜv7t:\:W8}ęA./y?q>PW0B~M l٣ϋsng4^\S>Ù(abp:%jK5;oEķ O|a= wREyO9W`VvIpޒ[/a7zYu|so(o9k`j{[^u|}#G/]']+([FgxoE ր3}m_v7yj:W+oKOu]Ō3k{ra㫕n_ yj:3Ɣpjrv}Yd98,qbҹǙB3 2oy#OM7![FWb[q<߉43 aN9oi`OsO?; ]Ε˹:;s̺9:l,gI&o8K[ 9 m9)*NN] 9zz?᫱wosGwHe_b[\{]PX_]y#OM -I73)ndJYcϲXT+ sa~ƳǕ5v棚x,>(ϵ\^cG-N` H|T<5 l{{gE[/xq joyJ39;&6L;9z 鱪E.1|Ey?;S_2UkQفų#Zr l{k#~}\ڝYm@~uh,6i1خ[?4G} g^o~0:y}X3]y#G/]cmQq#zZ:26ã2v9zzo [NqUYN >_ï} U77%6ʹ|y#G/]_r?|p?"6 yoWyhϩy+ě99z?c/l93)O9|OjUcj1GsX]F^`ϯ5;^5vs,kpY nMt( X7t:{'=nڧv|ɡy<'VTk樭>\6&.}^Leɽ׎ jovػmu*s%G-6H lgܷt\wpf;Qڙ.LA}*`ڙ.8N-ng9zz?,ؕ§OHL'5A%^e':)9qj=ќtwBnm9zqh{{ާR8{'6bxp0OnZ bx3Vߥإ+]_y ˳[_^9-|}K^mW.C|D灮ď8Ռ~팶+z)}un`^t',kOL6<]6|NF~N\uw0_.; ӥ Yr'n뒏x]-zdCН {Lg ν˻}?}${s#ޙ|(rz:zat |Xy~r}}^2Mޛx|ɭfmBDmk?5~=_㻱u =|cޫqKJʟ-3bn'ɑ9 ?ϑj@O:갇M5mL_ 5&ҕ2۩<ݡۍ(_+Y./S)ƐFs.ۓD;_:=R)/mk&'Y7,ƌ[uyp.ZYRؗr}:_@-1n?Dw%s >y@9P] SymEzDzuCٽ TpжknF5Eh>޳)Fo>~]5z!)M_h1p} x>Bnn6ƇޱXnԂ'}d~o|W"L>x^1tHoMzR#}Td;><sJ[9a\0^bf܏Ǿ57.qc y%eX|!kako)4/߽g5?_:\.~on4ϗ/?e4eʷQEq,V'үBկX^ןUQek:죺W/o?O]y|,_,_MM,@pWHƫ_aIy e[Wj6r̗er  #n͛@/kg@KP{&̵yso2\>Jl&mB&Cao1Iּ{+1w?^֖ y_o}JebѫU-Bb1du =%<>lKcOaN3'Xo.k'bw z.{__{v۴?יN@O__O#~?zgIcq&P~cm1|owi/7|Yo侙/zo_{nPKaCǵK%7r=woΨh= ~9o uo/^jsl1rhakk޽1DډP@]Jur&{?Fպ[x]qxcyGt*^Cs`$4S RЮ-БK;w{a s}0=hc $A'#]^^~Ӷ.Sֺ[LPLg^(yڦB9<%y/g co;,cWvw%_ ٔ7g2 t+^` =%7raYc4\e9k١.x>j=hޙWseלuБ .~ iu|ץH]ky..We.uБ .+oWx:SBZ)k@!I5̛y~{BngoVuCG.x/T1w2'AlsEh^K)~}' ,cZ枝ta(CBĽ* ͫi8Jzd5KFkskPunĻ9ep^m:GFG@QV)t%s 0'u;4ůt~9;P"+> ]*>OPy֛:U|,@}h:r~a c4l?(~3=^K^f_cA&λLG.xwrZb}.&cWkˮuCG.x/7)3fAWT 6]2oBnAYMv\v_,h<1ۖHWkTL:2oBOrl::V|LP?2}vg%zٓ,~uO'MKoIc&S']1=:[.'-Blv1=ثbmv {]ӵ68-`=.fPGo`ƚ\KjƱy +?.?놎\vw/mwQ7Z7`~e=Zނcf.n%nW]Wu,IAb$GPLd^(U$KOu%e.Jٶn cм_^HBe+y/]1VQ8A׏'I1ҏ5ϰ rZ?zm{/#x{`9Y%o%ݓ(n1m,Kґ .ث5/aj6,-j6,PxQ)ٰS]WlE/Sj}-ʚ}1z-髟^&^/n6=% .7cucw>ѫUt/yF}qg^(D5&R7P--ǘU޶m /Pkϼs(%w޿k:r-_wI"ebrc:b)_dÅl@IvP=0kZ.;nKx%}^{km1F[qR̠'4/Pc^ɺuͮ_S薋.O0"`ENx*[b%[uCG.xf?fDCΕȹ:6oB>6ݲ}^ˡsJ o*h sI>_J:v1 _ȼ)9n5Wϩ'mm4?hk|"korsj{˗3gn'{leG1ގ(e'7!G0)xo v˼]_m`8SE7e~۝ǢOj籉3UxgoXꆞ[>N j{w犉M^c67 .^X\g Z,tJ&Xc`޹Kມ#ң*,vjIuj:t|5Tg蜴;t%ޝ{?/n֖h._ʶRjm<"+eP7t䂷z{dg%9NE;R^CQv_qw#zJ:-7r{*Lq9휏sc7<3ۣMiS첹\7t䚻l?]>bԖY t^V|ۀ6ſ$GN#v.yl:0nbޓernoodCWWw(ym/Y0P ,7#y{3D{3HM'nC&/P2 &+T9M:rk۾_~oMmӾ_ZR;[]@G.xܷkx<|W#vvhN1S: m:rMkSX6kSd^\v\7t䂷Jk/s2%Y:͢D+A}Κ9i^9D]4 ){qN{Լ].m~say39o3s蜧k1u5]C6\^{}x(#n_}^([fvxдeقkm2ovLFpo}h'J+|5 s_7\zM(7x7u\vw9+_ۘ͗0s_]_]u˩W~k]~m ĻWJq5 s)(b׽OtvR1K=8S]uihv_Xk#4}ߚ>l~ms*1MËߚ_MG.xܿq6ߢ^ ߕZr?>2/P*?Z9>2o{'l{͙\͟g1]{LbN:R44}}r$p r'vQ?sfOj6F}/I٭t䂷\UHߠ'EѦгKtuutut*hhexܯػkݟ[?MO^ocgҟ[?-֯U7t%ޝf͟f|b_FO; i'f^\v\7 Eljٻ>v\ٻ94/e#ձ+]Ǧ^ztyܯbf?]}T>|U d͸0tآ){ߋz;+rmٟ][%cQ_箉SVxj>ϋeڷܳ}_܏NNsN˹es?^[Fr)>ъ2F1Q[nOe_A2m^COUåx38|誝zJzȽ˳5?^aVΗv)Η=ͼQwpQkY1*9aaM:k-wBkm7Fm̧m۶\}%4/PVkˮu^^rl5Ę3Dr߹å{ TkHa]j%#dv} mwΛʗIݟtIN|@^Oޭoi<wzh^z ~ "%g?_5R=90jf}YgJ}uG!OJ KE,nCPqw'!!Ѯqx'¾HL] wkoM~Ƀ8.~5Qk$*Jr̫BK~38k{c|OxUO|x'PO #x=1.0~BT|< ^g_>ϴދ>#z|V|EⳃPNxJOnW{?an>%ɤ~~i{ߟUE*N~,yPO^ǾWc^r1P}!t^5з=^ X#VjKgۘt}kߩQo8!ĘZuƧ/8ٻ>ǟ<&M73l>MZG']^6g/(Ǔ??ޗfL'k`tЧuO"?vj2Sj Obd<ӑHyRc]t|cItn{;v~-VnrRuxe˜]􈪖>~G޿}]g6PhWӵ#02OUȟշ?_Ot ??mNߖ5tI_'nwNƩd6xz=3U+pR:Tfjm>%>&*ikFi!1H!$05wO@ox_RS| u9.C"-89Ύ?Q8 9$5. 1-wz=)jEJٙ1.;+`4( 3uB^8VZTI_u'~ V'=NUQS\[8XwMMqι%ou)G$Rb\]qUd>Mq r$ucik42""#4cj d `g9gwRJ=e&<[5Yyy@c-awOC՛E6ͣ:J_dB - -mh75 B> JCP% |M/!ta%Nft+3O@}s32]j}*ik"RsUVO`]k[@ZZ.uBxFC [ScCb>i4h A# ڮ@&Jj_g9J|MgAH $ ijHc&'_Xq%ʆM]-Pex ORkR'T7-{Ynik%q}jNy D@abj\ 1)qpBw /*P'TI_K1'e^4#^ 1-w;c-SoZVݟI?9 ?tS7,/mhDl= qY˖x|rhDlAE Udq w/hF<'#rN>e44߈K-:J_c^0B)xhӶM]Il>5uA}uirK̦J_diQiMD\Vmgj_c(Uj_u*!|M֯8L 8#5w6xLa>L B$;RON&M|KwxM+Dnrং*|ĈiIcw~5ꄺ4Ku8OD>g`*cyiϧ⼴Sd}fJ;N+ gTζXhRdNK;~ӟ,窯BJzj5@zue3Ud}i>Ǐw̪e:gp6Lx2(i^yg6RQ7tNݤzb0[>0-zBzby#+aE-w'HGdg۵%1і-m+5Kބ0GUen%y/<%3f.1ۘ@>jfWòJ^K&96欻]v}$Ǯ:r~9mhlt*ּR&=҂&oBo0'en%y/mOdk즫]6F}f^ˮvБ .n٘S>]b%>-jKGcuHބk_=el)=\}ġ:r~9MC\2&~]GJ%s Kz?@LTcT_Z)f0v_~\c4H恩8>pPK^hWeu}~] c-n0(`#y `} pe0 rw'7n>p;] LlWC[Hz Mj65;_NWlohWmҒM+ V xYI(4m2oƨ;Sw{g+(PUg/W^SEVPK%]W:[Vc4F4Ihӥ T8j6욭:r~vvcm-un0כLIg[LֽYZ&ܮQvQ2Y'oOJqSjH1"֮jlV[x R+L}鰶C-1N9JuvaFL4yl4Mȝ Τ !\;<ϤF |Hp5]gkZ*L$WiQ]vMuSJVezr9+9Ҕ˷_:~x 3Ź1#7asL놎\ܿr_foxi0%7c:ނ<0GeRvm2o{4D{ׇK1w<3>h·׌"9yxweO놎\vwQUA7 4|Yԛa̢'t`n ccޏcV[w%7ږ u~nZvmqs{.y~9F/6%~1]ݼ@S&l/4!tه|6uCOIF7j݀MvmUk74`٨aQ6̀e};_1` 6n)݀OI_wﺳ3:&൉Ew6j65 .4f8 qg8Awqg@uLX;k3ΨzJ] lv﫯Gk`XAeuZ}]K;_~PDIv[O"iyu$unĻ{"[7N~ʣ: _мG^&~1Fּ.usBNӫn4 P֥ܭ0X 5Wdy ^{n?uCG.x^Skm1FCVv-Pc^겫-:r'cq`XdAaA5 u>u,(SQv[:r~^. Mc8W>]?>4]Ҽ@L.1q&>\lj9m7BPA)`l:Eꀚ 6x;#rw'j +N"1$r5\7t䂷\VNmw G\Z讻cmP g tځ9Eh+4W Zu\v_ߴKdc0G4y kZ#5e5dǭGPRP_C[.~鴎zsu:z#7k=1/Z9E_#]5v1V\vn)4J9IV6F]jLtx UU\vuCG.xܟon7"1a#p;vzz]:J]6rk\Ҝ 'nj"@'L^ hVW萗 zH*ޝo+}.G0)t #::^6јFm&!L^̼@u0u~˞2놞_)S<1b5wJ^΀Puʸ_G80β:t:}z0d˼l`XefP7tn__u ex7;kIɛдWn^.|m:rhj6qp.yj<f)jzJ]t O7z`X md0]y6Rv[;t$^˴5`[aՃm tٳ/km:K;_7ٷc}6lccdߚW.uCG.x?5tUk1?M}>v5L?wߌ6vGb^.eW]7t䂷5mCkٚh.Yj}.t.@5\2geCӑ .M@aw$B›Q yd+uCG.xܿb,1=X|&Yj>0LgB3qБ ..WZrH; = *; 1$y]v6I??L0[ swng2#&4τ9Wi6"}fӼ@e##;ϼ]vو:rޏ6\<y2gkܽռ@K 3UN(ȨzJ:oSyZ}yhy5\vC r|>1gQ2=j+!=xESvUSHSkϷ5F9e;miN-t.^M]cu^>rmY}es? Q?xcʤ ' %ϚwkϠm2?.}*ߔ}%y3?_x~((bgEg~_3`~{WHx2կVB{|y6NL#w8ޛz/r\=0_~ߴf8OMz][qܻxߴ+U{,SO Yt]= Tk ×!??S~F2 5};+_q cıcc>V 6̱)KwlOԞϛDw>3zH#<\GO*=?5ɷ*'N/{;f?;hԘ>0"4IE/kꗗ}_S&%-_Rh|`{ܗg=jl7j{fy/|ƌ\ork46I/<?K5ig DG}Lbb+8 g;OfױC3~O6:zFA!S/%</ *Z} }΂l!iҧ h/rzqwba\Gz#UDH*qyЯQR?ޖqH8Ni_wolS?|Ovxo__۷)o{Q[SYue-- Eu#萼f&fMi׮:rw'7F-:;]X2NY JCͯe/>(ͺ#_}GGrqC.Ƙ놎\ɽ/mx11ǘƼjc cL!ncMG%_u/K$BW!~wԉetbtocr8k۵o /P[_JٵnȕkSɽoK`*s[/yLjs ^6eOБ .۲^/`q@S#QN^ø&fx.--us!)3Y_-Ƥv ` hma-%1aXAOIn4:3?Nܟa15Ot$/P_9 ymDlA ɨt䂷,FzovѨ}u/7f]'4R}$4% m aN ʾ4[Ouo{?/Qlw]G槠>M6/P%N޸e)4Ƚ3F[=-鲃 Tz"JOc:r/Fc Dǐ>d.Ѽ@m%& !ncϗ/=c~˕|~C_\7t>-t)̰NO[bEK{/`EAٵqݢ[.ޏ/`gw/'k  -|wnBБ .7mxnj"LѼ{җ?. TXaM/e7{MOI}c'}%N}lپk:v0@m_ !66FlF\'_}pDƜ#u9EXל3ut@L$aL܂ Ny)놎\volj1vdڂB[Q;& ^7ʮkޏ5F~Tdw{Wv5 T>„w^X]v`]7B_wxGǜ܇܆i3;xw~s]7tN/,ɑg/MJc8w$Tv?Pݦ#]~clf'1=;t&4s/cnoWv??65??v9yoLꃗe7??uCG.x_p_I\v0߮}}Szy:2>䂷ڋons_mmg7]y7F׼.놎\vY}u2ԫcM'3Ơk ?u2 /:Nnȕ i߿k^+d@?k6fX+/~)J謎vZlϏ[W֢ĜGVHEy ~k` KzFmҷu4/ɯ&fYQwaYv@5uCG.xã蜦Puc~qL@/Ó[Mhr#INYv@ I rӖ 2?;fǫRYF#g̮i\p%/P_SN#`5˞\.놎\v?j"kLSjwxǫ:b7!x}Z]eݕuCG.xܯغƃgnb.Q ?m5 v$1<܎ɛisҒwYdY7t䂷GvV8ep̼jg̻:(ϊf7΂<+κ!6LKG)w.5]ҼTvץz\C ]H o9;/`hĄ?8cnWqHR,E?/P2\5e/#놎\v_~hy͛9^x;5' e9;#9g頯A_G@}m2^({6F/%/+e[#]WtU܂ZGzb\1#)q^ i+j2ɛЁdLLie*4놎\v_Xxt].M`Eӌ{wc 4񉙶>]e}^Nۍc1N1S׏fr]NJj1k(n4,?e jt˕'%}f#; i {R"OcI^a sxSvٰ;=H~݆m{TcĎdءF5/PQ kӺ rGO?^%?:x /0\\v]7tf.kd2ng)Wh[v#d*z$oB>0[,Z]:rv[z[s>\g.q(][⁺`ބ-`REVnmnom}:خ샰m>I𰋽OJnݬ}'n_)9t1 15u)] ogft1 p٥S\7t䂷˽;m1o밊3]ϼ@<Ϻr޷|LGSgMk^JR(zJ](`|v ǹ6^;.мs="i~%N_s*Da[}1j>F)P +xѼ]> rJA][3ј3-SI -pduM[t_u`#LgTMykjk0G>/춿no3(?Nͦ\ :gV7Pi6r6U{h+C%c9o`8ycuc0Xx<T%༕XvK,t䂷yʮ;Y]?t7ԏ`ExEnriK͌1f: T{L-.Sv\w\#43AY18oY~vVg%oz:+qБ . q:fKƏ'FQA9Ж!tho#5/PƏ'&7Ϻ#]n]l6v0{Emb7AǦqPؤ6vzJ:7r1x4};qжKʼ/I NMݦ#xwrookw;Ks{o]kзn0/k7eMOIJc;]M#qLC/qi@i/ (v̲ yU%lA6]r͜B0ΑGcjvt/5'^&eKݦ#xwrӖqb)f_ޮ㐥 z@W›㔍.߼SvБ .r;om5n ~oq1tUsu61F8 1535pƻ,.[/H26=% . k'~ksc2]'Ul1ZiͫeWl놎\v?j̺- h c(sLd rw5O_ΘUl~93 _0÷f^\v\74xܯaF *GW4n]dH}Ikr tt,Ǥϲ5uCG.x/ 3txk]FH& oBp" /']umȕ%I1PBa1jWq$݊~oBI0Fqթˮ r-ŏL<uw?hK/YL2o TwgnˮӮ:r~'뼡0>OPWG;0"n0W*s : ^;0FeRvno;/v56v<~~m4ŎfS7tr}ay(TL_˼@5a.<6:r~*M$}St̛d?''/gr;.䂷M^ ơ{ϑ{qCtOv!I2vM(e%&2%oEe2vuCG.xܿyٻavHC]b_lőA7 nm:~a\7hz3A}^(^C5ü\Rv7;O6Gu]Uv~bVo}RvEJ;a/]w\74xܯ/q~lTUٚ? ]ϫA_z|*cRLu/e7]EБ .a|--nC^2u /1e8N{.?NW~1F;r[Zvb=2B?,4/Pb?żŸno{\`_\N%;5j:,Zw\v;]7p{w6/Z?P[/tj#^Rv/HБ .>Oљct^蘧:OtLKSlљ Rv;Onӑ .j_s#qéSXoyr'}iP0EgPvL4f|峉.LO7vluwۼ&l6Iro-CıOyt:{nC(jl>Ur̫x(_ʉe}3|}^Oܲ̇'/ #õALOJ~M6>?F8?mzqT?~>̻nȝ8#~<26טtq?~)Y|yMPj^t'1Ņ'r0VXý7ywq{ Ok|OfH2>*7HǓ r? nS'r?2 zl</3~ O6>[|( #}x<3\AU¯\,>|⣵g !'VnJ\"|z;F~KUH[>t^׈i39/놎\ɽ{w$L-[c%w}z[#+.>nÜ#re m1=%=7r^C~la_gЖ/-_Oz@s݊YY_I\r^_)GXU˼]}[L.MP_] td.w滠nȕ~ ص効\-r}z[LMh:2RXL;KYY7t䂷˽[}oa0F mx E}_1)8,"}St#gI`8gE<Β0d$a|$^n;KRݦK.vGNe=ړ=ϛ7CyZ#]/xD : q|}9Bw7/P%P~TvnS|#\_|99;#|bҫ6nQPkK/2:;#|LSUZ[NӍ_|=Mۿ$=H؟_jSkP_ e uCG~#{n|yɛ=ϛ|}_g^\v\7t䂷ϒ~K}wAj1TúIq*+eRf[r}0_}m}ԷRJ{CMϘ.Jo_/K_ߒ~oIOj~K0_euCG.~63i?g_v~^QOz@9ј2ƛˮM?y7׾vm<ƬzJ]{9s4}92-9n+g_>54e.3cWQA.[PMG.f9{`9Lo>4W I?M_"!y 11:eM\~A?LLx~^6aN^\v])iv}k˱Ec,96tx[ĈKރ OC;:r~e Lꛡ(~t]t=) "n蹒]uh}>e :tz K4/P0].7tˆhcXLl}plcL^?=y?pٵpݢ[.~ݞlz&äO+}tً*VEoQvkmzJzo~Eq)ư.>vk1LX0 d0eͥ&So,[煹ͭ']ϒ Y#lރNnoel6Nb4}DƂWe7l.Dw :e5,H*ޝ/l> 6עG $=^H0O/>>'-sUe #la,ۢe{$=Mdc5(ɮ{}o}Ÿ9&*(16e.?yUz>Uwґ.?}O3:Ǿ I!;tXMh*+ŗAAБ+C%7ma]elcnRڪnW]'n|ړ@͞L̰+e]'[t{!0Lw*{4mMphM u=ƤgK d(:1t9hWce1F݌1Yr~T?Vo E01e~nSr 0?#;ؙm~C|CKY\v۫Q7tQOⱏsT _|1b^CkslL4h?b\ؽn1f#uc5?|V}W;i~ KӼ@5FN'꺡#]ne|0ȳġeñ5ęLʳKVnmnom*Om^It^[/N$}U7W{.nnӑ .o09Sn7`iq 3LOjg9kXe37I>3ٹOd}&{OtͫSO?E#9hLLG̷L͎2F{ $͎bOb+*;B=ZDeGn-xwrb7s0ۧsۺ_tj:u!19Esc)%뾡`gOo]]x?)uCG.x>]Cѕ7]J<0/PLSJWҥNnCUvn0VewUMr#+g_gI8F[ۅSeVIGRxܯ!>_OQ%co}{h#5Vx2y>~Db xg켏uCOIKZ[<1Ĝ&e-M/L`^O#ixsj OΊ[%ITV2Fit[Ȥ~ü@e+#{^l!nu\vݖ ;FkȴQލxX|YW3u0IRv[gU{_w|9xxۛ~1qv>&ތ牲w>Qwґ.kVP;- X]X ʮ놎\v_)S^`.3+M0L<3/P0xt u.j1s7?:lSϫ]z8g9EĽ;Yv޹Ϻ#]n! <1&0oR 78鍓>'&|,;YK;_ץ-60c3bw-6}htyrl1o6+6uCG.xܯذX#1F:dܾ/EoGu3x)2L^?`!_(6]rJ+27!~oabez#n+kބrÚ/ e#W N?7U/.jEMv'&dOhWκ#]_78D){|s|I .>Q:#q7H\6t䂷+w._7tf4@ 6.z):r? pUg[Go2;L"|ϥ}0P-3 }u*3l<=kL.FS^Z%ϳq^X5^Zv%U)iv_/M7~cF?[=>7 5Q?W}䲫]7K{~mZf>7ߕk7!1\v놎\v,}ǀܓm۳tC{rݠ,@m&{,;,Y7t䂷[U+\;n-l͉OZ}P{-*eW놎\j:Y:}t4t".г)h6=%=7r>[xaF7ߜpňgOx r16b]vňn藖/ޟ⾍Qi?O~9 Uܷ12̻|u#]nq5lٗӲWY]vMUݎMz,NWX`賣]ПWEC5Vj}rVRvoꆾ8?x809\ima.Agkb1/R[Y\9KD/?^k !GBb, s6r9xSu? : y>QDQo)_)Ov3V2r\yۭ Ơ7} ΏΗ0LC|i`u#%5[>lWZɻ]R.e}6]ky30ؖIe7#]אއ`C֯n}ktio%~8FٽU))9 Jv:_RN̮ϟ KcŹ?o##YEe/ Rdy7Z1ȹʕ5O1=Yu? e'g=x2Vw>ӟ=#Oj3Yx I}`0,O',﷽?? .=^VҟL/˧rx|4f;(zMw~5ND1oW֏?'hv^Y ×L?;UqWѩq>\s˚dfa{$*5U?9FDw8{''@ͱ9-=mD?o>MhwO"E{\;݉tuw;c%i]h24=d4,/㧃ÙRsb<ɧ5A}IX'?WYfK1YFnXc^r<.!t^q?^| ka?~)ϹƏ1/x^p~'1# V=K*Ϛ܏A4؝<&i4}|qj$O3mX{g F5[~DYBQx{!ח~dLۙO>G5XQ1€!qQ'>ܿru?0}߰<֘'VApsDLÎ)R<omz6Em/7\Ӽ^a~~I:N'ߦ3Oȶ|?|ϫ{_ݿ?_?_KuGT{y,A+ ̏ve3>1.Axy9R]?/ড়9s('Ź|󺥺~<~fŹ~sv>9Lq~'#0^C߷װU!ƃWjp"` 5Tt @ oYz@:JuYwyG@\_?8}MsޙzzPH1&*ikޅoȯxT}puY40E~k_Nǭ}'|.3<|; D* }}S% |M֯1xE͇B׍.:L= w4@ !J{:g|h͞~< 44Ot3) "pQ*ieSX6@)""K;'[P@ !JmN&ŏK]9F 4Ouu'Sz4i+ UV] _ugq6AH Y(۰/԰)'O> H%>uBxd"F̠?5ͧWM|^Peg >TM|ijHc&~7+)Fi_cF7|R|-[e l5lAJ~_gsawj˖"T}_eK0ԶlN&4)B|xz?H:4/[|s l_:EEuYw<#\y,3tu.fm|&_g10 w˓K S% |MVgW[~}E,'RM9gWOߗRS'TI_kXB+DNkQQQ!!`mЦlR걫QX1S֯]_aܫO(٧O8O~򳻩~O]NĈ˚>{dj<9Vq7G>T}p_Iwt-t&97+d352 Rv2'I{dz*ikd!KN2Jɦ=52Kk(L6jE|?'O[׾1OiϾwz~@#uM}Eu`n$~==(WM'=O^([s{$#]Wa<ʾaM>6u?vAcɛP]a<뱩UݦK%+J5[97'7tIU>3eWnoG:i98,ϖsw.5]Ҽ cݼt䂷œc!FQV=d?H@!smbDJwfV-@MM1F'l`rM>0u?p5Lׄ4/P`|20) \ꆎ\9K:::/`" @pU-W$2ɜ8+eມ#xwr3aަ׵OUZ:Hp4v~>b_ _ߟdiKڝN&)VVX$lc`P>?#ŴlqFL6[,>uYTVЏgf02Pvi[tKUElaØLfx ^Č'ҝ^tlYs<]gz}Y+eGNu-Y{t+>jg s/PZgaŠ׭N묺#Ur#<φQ}9R@gҟ].Un?{֨M-50aΨ---N~m2^-+5YkBqƅ,\]o3l~SGU :z1Ò:+DCɽ1q1bR}i@ߓ9ij+=V!^AV=rm]ou6.ݮ ^)O{ѥSfQCt!g}̾x0>gWꆎ\ɽɐmֳZi;J?t{$xJ0 ^_iPٹ#U\f-іBD[#= Vye uCG.xw> +}UCVo@ч!Ґ[,}H:X= }V`0.czՅDw0W;Sa^v(,P7^0rrO5vrvj޿DTxJ4 ]]ꆎ\ U"}9 CN,ΔZm/P0%KI%¤nKQ7{Ik@'E([eg[5\cv-^^Ia3Բo\_qi[/Pc`gTvc r;Ia|K+$ &=$^\zIL[>/\zQCRr?iqcVw'Fcȩct]Rxr N>&UvY }6*㤴[썏1"Vǯxۥݪ:r[߃+0#ls4G_L棊>[P*^_p^.u\ᛤ{ނgf/~sԔP/DwAxVv_q/wwV5ώ`)0 sJW:Ζ}1O@+ xR+no[mY˜b܇iS9jJGaNGuC_\˽%󪏎Nr͗>r辔/^> 7/-:[ֶhֱC'MsCulcG@q`)yv=uF =$ w&C7Ϫd6X+ǸCcItg8l{",۠:EIݏ껃w JK8Kߠ MSvݩM[.Ӧ_0aly7pZE ??0~ǫUopNmc`LosWqGOI8ǂ9+SE١QSɽߖ-alt{WL=mx-ѶGՖH/nEw[Vv?¸ iFo wU ߖuMI]R GuCIʽ}i;Ϸjnmum؜wױ;09 [?wzݢ#)U*-$Q_xvdKegUH o{In{-g{l_I:xιIuCG>r571| ܠQ}߃e uCG.xʧy~`=xs5iJa ^i.6uCG.*||k &S=qiC[6C01yF%Fnm&lsdGnl#w%ZxHHtMv*;7no{ޫL'r"J΄ܕ/PLx='3g#Unt4[00g&Lk2Ś UnjIyz ccpos6Mٰ o@S_Q⼊_xݢ\;N[&oT㛳>)3'r0QMMe&7 {*q0a/۰'%ވH@%^"6q Gs|sI#gOxe11-(^#n!0]jo}VwgH_}D0 "yڶ}6 s Ġ&"k]|Dꆎ\V}/1-!R?}n/P4{(^*;m O~C^4){jND Tr&<)DzH:/Vy {=)kpDxr^9yu/-:r[8lG`b,--Z/'}/lާI ]Cd2q2SOqZ+㌵2Y:.@e4-9(Cꆎ\VVs=KĠg{ Trx /1(e׭=^[ϑuLՎ[ug}/P‹RvYn!)ku[\}`܎Ws;_}9D9B@ŗ;iWrQv+jS.xܗZMMqm?#?;obU#~I@ȟAU$Ý*xZqK3YŇ%|G3~;M޺-O/?8p5#|

o|\Vagm|w8y8RySc <|' Oo~~*ﷳXw5\kFjl¦\T~r5:'joMU5= Kb}?}Ke|FqmF;>W>#:'kx;>#q|=ROОsBu{pm>Jm@'K? nx4m~@nx:J5>0s9{'w*z3>빦8Yhko7Vl˾ ?h#?rn-ц۝w/v@ݓ ~Wz!6r߱b|]zex m P|2y/>4ɭEM''{VW=Xt|^n&ֲ׽դA%XqiGlQ퟿EF;XuėR5Β\Ramm nR[Z߽v.3߿?;{'i'?F}߆?}~{/_ҋg,GQcK'p_36Oovd̟F9*?Y pI'^[~WmkaylwR[۵mR'jn{=s,:jZ-r'me}.?qI۱88tloC?~rdkjO~!RKWv4ss}z>szrHbOSҸ};ufv#uNml[V3OT?'imN-_j~tjoguƔ"x8-h؜( 5uCG.xܜb3NmjL均xme/Т]'/cg:#U-.-Uʶ,sEtU@yX0|]xWyuCI};.ls[oɱ:pіm ^Q'ǢnoB|fS::;ؽeAB硣Cm:CǼPQoBǠ#UnrVs}܉,YݹlvpOvc1gT^AVZm ^3eeS7t䂷ʭE't):?:AUd0ϪU3cώu \;vm9Ry?-sEtUvmÒ/ mrӖ" sв1-&早 /P_0GAe~nK.}a|m|2w/P}a|Ƕα#U24-(u1tڠnއxh$3伿0_ !^}ca~FV= T!uLzٵ-^7tX/նP!9T"zHcmB:j[gReWN:$^R?,CUDwC^vձ3fw|z^!0]~ľ߽ܻ(fy^AVv7+wl/zH:NrSb1aܪ2kgX ?Dt 0Oc->8oK10蘗'<JK̘.tQ7t.~~yy1T ǟ/>~3" ^;e~nocd/m뻛[ZXtw T[wW/\}W+C-¸<.gEmxe[qy]#.mnё *w/C'nQ1nS@' /!n&,b);NFБ *r/a^',EtCRcx8Wt T t^eBN\}[nq#rbgwFd h-=BoG<<"uCG.xܯ+ _"JkmOU?B?@&^:`/^c}[8cNe45puk|Qx׮-sovm=p! VuL⩓9CE;1:& kLZuC\9%閠Xb娎[:/PlskBI6r}kvW5KdPA߂h[y/vp 魼UWDwKa1õb}q0ElY-}6 t1wml r{MUſӹn=K/D34&5 gU 5?ΟIٵ-gWpr%X3E}նʮm96?GuCG.xϿyx :FTwllԎ}jZUOWEwEБ *q(=f+\_u ݄7 x WSݵDWuCG.xkŁ^}}k-z4&/PL3<⵵(;֊n!V5f"`-~:gZ :Mh4;ګ!OC;$^ /~- =UB-:[~~̮985!#"Wե=߶ŗ࠯x2!#^Tv2T7t䂷ʽg9&?'~ fYEwf<X PݠB=6ޒ垙K35~'^[r <׼u rI}7*~': /P}¸&eS~t:r[awn׊qk6=97A$x2ߴ3@Mŋ S{ʣno{\X|O-xߧC3lj\V̳/~>_#3/^ +!T|ё *~ot hvz%A.GБ *nZW^{r/o>G8T[tOYٵ'6ц6!V۵߉i}m?=Mo@oaU7t䂷ʽ߮=ʲm=Ȳ=GY :v ^Ęt^ Sv٣Lݢ[7 &P]8T&=./Ъ;ӥ'ʞu'wݥ[1iI-&%>onwބCϣnEU{ -¸$~lT[f¢J(og=oQݸȅ^=u7`˩L&Mu96c,*RngOEs|15 bjr%fA_x|2#r:d.15:[&8->G3‰8D6W8!'K/Pa`*;0ꆾ 9r_K51~}P̵*~^)* QvZUwDEQ:ՖڝS+3%߁/p?3Y?]["o߁?ɠ\Vi baq?V}X :zdBYYE~҇50gF|L9bԈ{ 1j`C2^< ʎ5ꆎ\V?!aHOsCC»*D?]~G~.h n!8]ȭ9eZb؋UcA7o&^sꆎ\|*w#m ̖+mۊ]- J٥- rwsp|yI>uIi^>1e8EIʽǦ˸Z1[AŦ ^AiS.͈6;{tUY-{Y_l =q/PLd e:r[֌^_enUFwצXnnUHܞVˍpι]uCIB.1."1YY$1J`BlVZàS(Uo9VĘ| >7={ZuC_:e_8_ƧyײW dl&= YbƢc{T7t.藟}UZ0'_"JҌn% /P>%GٹV#{hr[޿VR î 7G'^.1h&^A\,^լsꆎ\c]P_Gws{,{ ?hCssْ{ِk@dx)-:[2 uMTn};tيtnbn/a ^WCs=$ wb XVhKsKɶuA5 de 3Cpޙ"l^.xc[Wn(ݜYJݝkȚx 7׈Peݥny;ij>Ĵrx>4ǮeoLvA}x/^UvSVБ *rj>W ?&q,uh f\wGTCUEIʽ#$H۟KZE^R2A^@6Fٱ7ꆎ\Vw7Y:q#ʡ:fE1)de1+/ crNv1WP3ly7]ܨ嵐t.ˢ*㧏?}P/DwA@ ggkʲ o{J@w3$^\ƛ$M첎/Srw_k|#(י,캄n@$(Eeg|t!7}xAY}w0g˹jwtphC<+ /Iox)-zHjU6GĴk8[~sAe7!Ca|,Ǚq#vr{يQ;t|wMhClx=);ꎙbK{||?+a _`wA?ĭEw?^@qD Kso[1V(y\'$t :lKbTvC r;=T_{iE{e7րjDtO7q_c]'ꆎ\V3hP'aI쬽#39״D@q[V`HK:#U=.k%̩onP*.V_8c5KGex#Uol/IJ|\s0Ǟz ¸‹SvsIr_V%Tb<:4%04~_^X'US\lrrba>g=1t%;w /1eg.Fu=ŝ%}Ēu "$12ul9X\=S\n>x]>ƝxX d$3eܙBK3TCaω~s9ou?߭' k^>DOxz0z!eD.NtX­f^!.(ab5]e8TЇ:;qX" 6b/jȦݱ)@Ŧf(#>wWt=$ whLv%Y#%w!xcMFWBGRx~ tqO!G֌^]&2' Ɗrf\DUoŒvk/7Rٖ-~¶{??V灮D1q?U4݆?1=qVOx^ExC.r>TJoޫRz\R鋞|`룇BO{E(^X~=Vk>6z2?W=="ɡ>w&v,r܀dc hOoR?]g[!pK̆ a Z_đY[g@˔1jݗҦ%w q1:w<Ṥ'HR'\g5hqkx;Ԧg ҏϷQ#}>kF,?՟ZڣI6޹IkD?RMnM[pn{נ;]y[v[泸)'nkK8 -U~8wM+of_cI_?|u[ا O/BK?ƎN/vnԨmy~v7fQ|+5*xF"WSӕtgtJx: N逃okc|rh|/w10p%s}E[rSFm"--s.<xUͷ=aduo˽-I\GoQ;dL>2}ӃY[nQpg,6 '{-Iޞ bc{ VdV:{hMg_bcb/8-7[3m-thQ izGaiՆ2 m.~;Aɟ}>//ohe˗^g;*? ^ےr}~I.Dז&W7#޶]нv0[v{[kAl7{vi{*~Q7t䂷ݽܻLV{mK۝rdρj[DwY iͺ`)xΕxEt.^( g]V K |2 pNK%*wߖ9t/?˒w: hB`f ;w}>gS7t䂷ݷ0kN`6$:N;T"*^Yt f8%TǢC-BeF3]4 {ց>c)b/^Ac.;yȽll[t䂷ݽr4ou7)/_ֹf 3.z4J:0E8yJ=h\ r:Vڒ&*m]"#^Ueg[T7t䂷}aɳ]\A-csק`-yGXeqۅܴwT;& hhGNbqg, *v ^e;FN\}aNmT헣Yn}S=sŋղ;;ٖ$ٱͮ۴1t$ㅾ*>0!AaC*>L`q^(^van)i~WyUǶax?C0UuH@GO ̡M3<טU7t䂷9 ،ܻݜʼ/4`αo(ۡ2o})kXL~t|xR,&SXKeg,5r\[&x=TwSPm.xږbI}.67%. r`[^id  ~Ɵ(h: /Paq?^|.> uV_0kXz_+h7Ŭ :B(i6valtf(0u*{3U7t䂷cbv}|x/t6 _!fxKOБ *P/92'`_ikl[ĩMkc17 1"d!xG TˣnK.uٱ1O~^3acCEǂ:$^ +3Bg _p{1T|~a}ɧY}~/P3ONOIo' ü^Niގ0UNQPiKM:s6%!V_& cizr!?rXu}jSětL1t弝ܽoYs}`בS"GN)9]9h>atno& ve|Ƕx&'fK&Scx)"[Wwze+o5+(E] ru䒷sK_2o~NO yKa<(^K[no{kvcy]o.MA (x]Tvo[ڕ}-Œ?;k[51 m<"+eP.x}[2 SAoُqֶE ٯqb(;bШ:r ? k ̦wϏ8? LnW/eS|5?.?/ܻo]F_{ion|C@Eo@{Hj#lj\Vbk߭;1A\>> g4N%x]*;ۭWkreoo]د99epvp 9$0k=9"ʎ9$ꆎ\k=!ύY^=a>vӕ?d~Z/C/c3*{Q7t䂷ʽ%10__Q'xbc[u\ƨzH:nr>t|+}^w O ^12f뻂TCgNЁv̡敮?gx r讛0gs݂`g},7urʽUbGx">,! SnCa{l-G[CEo@-'̨'ӍEٹ[NuCG.xܻol7E>q'I[qK^le[EέOוA[y|+fЉAAuCG.xܿص'Zc*9SdlSn/PɁe.e眬EGAܻb f8{M{N3x8fQ7t䂷ʽzd, ]YeEu`6ygVнl o;H꼝ܻoݭ9a0>_:&};}J!1Ôgo =$5*wߖj'nov:7Sux]uC_;v6_ 'j!w=jA+(%1C<"N٥_[t.cK#}̱%?:>*@93n;9̉ yMnEN~2f$:=GRMތupje쒳c{:8cϠ#Uަ`AO:$^Oy/Le?1uorWWJ^i`:Ǣjj['Ww{֠k {qs*;֩no{ uf*/j+_WN; s0>1םU#1o{՗1μ՗Wk \btWQ!Vfmubwj& Ȫnv!^{{k߶ݣ1^eYC%sA/ivYx]EI}9\E潮OQbV7mY!eŬk,5xl뼊{{AGRx;evg^7lQu0gs|PvVw7U<cg5y{y_>?(L{ Cv>ʎQ7xܻ_"i=1d?iP,//PÞRe? ur2+7Oޯt@7T0nCÇ,H o><ػ;5VKL)t+5V;) \xR&[XLeg#U6ek+6E fuǞ6s^AiS`fuG^.{ك}$L{su#y01m,uU#?=(!Ar}`ܼ|m?S/_oT7t䂷ʽ'6v _]aؗ''=w (EDK.ޟ,`a<Jwo,\0zzƢ#U޿gة9fsRw)cv+ΛƬ0>reUN\>Cg;},Ȯð]K8o@aw`;ŮRv Cg> =N{}5 t^IW|zT!016ș0.g88qXOԜo[9OK"r)0x2fzL3f%傷ʽabZ?/GSDXL~>TБ */w<ϭijxL;0 辏M@ 1x=^UϪno{ONb+5!ku֭qt6xNLjmΪ5}-n]M>OLM.=qrs,i0[\eq rR-ݖ+oJgWPΗmΝ)==x;ߪX[3cxj#[/P0g❻5o ra\2VJ[Ks&@a\*;ۢ/z#r;^DK[qydK]ֵΖr` ;wv:ۢ#vrˉ^Wivú΋kc}$τǙx a>+zAGRx[u}0ͳu{DuzQ1xnb)xneu}ކo&t D_'K  %wKU7trNoٗ-:^;% ^?[Op'8~r'˺=^ Oޫ聟'O"mߚ[^5e;_W7ޟ<`pO;!U;}wݏ|r>".g*9OZt@exUGGmJW/|<h>z`׳G&עc>tOoO3] Wkı-1ʅ^5Ǽ뭉Y'Z̬O|?.pZqg|[w_J{O]=Q3#} tv[h?cOQ^ic\It{?0B}r"]vYE|xu=`3I0^oO wdokqG.:>mr>1Ly8FW|XS{u=Oy :+rM+ۣF] WkDgGor}o^ 7j57i.y:Fx:Z\|oW̪v~o4M "Vz{AU}e7-or4 Cq[νz>-ԝ0RaΗMO+蝲)v}?a$Qa}w5j:.ڳ:[a; D˽w~<Зw7ܟ9)Z'?U^]N$h3AۚxA]~V=v%zx!nש{ϷuZb涒7??6Ʒɟ}>Z__ǷO_Ʒߞ˗_|=+߱(x^׶~Ma9sgjr?ƶz d`'ȟ8;8\2sd?q72Rvoriz߾wCme|8-M׷ᄒo?~gE?{JOxys5i>f]۝\O=<ͻ(GktgfGh<o%Q{Si": tx|׶dk۬euCG.x}[c_r҇%ekG/ue/] -6G[ rީ5.)MLPq1i:6g%N ϷZěf+MŻؕ* /#Une,k=!~i[|@/i^;e~nڧܿ7~o{mD/5-S ! {ٵ_ny;_WǦ-'tmYZAі՞Q[ YLvw~iix[/uayt񀎕Aw/P/1GX/S};׵nop$td2c6bs=y;/31Dk5utso<? r_9Ƕyy/m.cEG.x}[,*`՗~q:+(da*;d r1ߒ[Җ[.xo) !]|Kꆎ\V/RX;x2^: Et~au~Z.l_9n~jO!/˰',azl:TC_DGҭʶK NcvWkW&v(xx]Tv>טl٥X_:PhQ/$/IGbL/* Ca\}Uc?ۢtmmIIdM1z$rn,+Wj+/SzJ6r.JWW͔XmuN%Pc2:9#x_!//.1>>~x#o) m~ioWU}jS+(}Ka?*;}Kt弝ܽoY}a!t|Gxe/cvox_~-tIx/O~?\2\ndV^% j!A? dLa 5.SБ *.E4EYmEX~2jn/e 3eW۴e俦nokK۳:IΘv sIg*m ?8"ހSmx6 [HQAgrI6]PdPs _ǸP': /Ц <Rkj[ &tLnUMq|B4,_QCF\V?=_{L{E|G'c<:>N4tZ*m'[(ۡߢ\rk?p]_{LEɮ--wvm,t, ήh9g-eQSБ *'o`1?]3:[O-~jWP`1?*xNJ#vrPz:ٕB閍X11< :*^El5 ox /qy;ɋ<9_ Fb(}؄٠ Ҋ]eN ,06MQv`Q7t䂷MCzlWdt>}u ܪeW}Snetl>At_+|wis^hNϑg=$Պ~YXh tr"z,40e-x0ʞbǡꆎ\V9<(7<*ϱ*~3fx/V7nKs/OM9gsho.}Z>0Mx|Mkdeɻڬ *kAIR_f< +:-8]kB+(" ]BЏw8viw^Vwd\KζtYY0.ke rpc>`#ZMcS{NW|a|@|aC|? C4rNY#E)dN HO 3唢9EБ *E<󳏯KTX0Szo >F8ހGa\SU.xܟX(kJz+IY%~NlUʺ[SV.=וHVw%K$״gS$(״LACm*%i?eJݗKP,H 뤙rܗ5sl$^\cIӶ^k!gV{m :fE[BǠUE[ceG[noe~nZ ׻VNG/;Tcq :߂sd][lj,.zH:r_?s+> 7lq``E;Q!4]uCG.x-q0{/q9p}|E} q{bx{θ\egܮB=ǜshYo_i_ dAn^ +[ӞhbOEwDCRr++p8wk{b#ʾfP],de5y[{ڪe;T,E\ɭ6-M$bQ jщ?cdI}m)eOȋןWٓDБ *ro-S2N8TQt7Mj);Q3{QX5PU1e0l$OC5?(A5*)0cTvT7t䂷ʽݘ!OrY}L+h՝LYakxg=N{Nv21*[W*Ƿltor| cT>~Uvot弝;y\aBgt|!;NdB[8؂Ǝ?+T.nB(VbcKuCIʽæ浕q(%?{q8< uOWPCa|,Ǚq#vr_9Gnc)6ҿ8Lᛗ݇e cI>TvCս1//Cf_=&~Cx-:]0cḤPEIBn,ޯ->i?:7Wu#t ^ /ca fD(ۡ#vrGTm0nmX-gYc :{#J[*wlX-kYc :r[os\0v}ƴ'K٫O 7q{%?'y:r9o''+-κ{6FxN];6ν:r[;U¸nl[{ *1ވmN[[޽wbO^xwބ>VU%XLtn0wb0~tr4ƨ|cs|7\V{䵅ܴb^[+&μbf+(xnZVٙVN\-e08a5 yaOkofG6=cGlUn^{ 㹫1V~b#t?*gy/a9#/P0gҟ]EG.x{r[%b+lWUfЉJqńndSB'sN|\oaџJ  ^KSoiߪGܗ(ƾ0y;qQ(vIwGCRrؤ2w {W&jmm&D`, 쫕sZv~sJKi~Ty~Ĵ)Rk ~* =$ ]g'1)=h:k0Áeu\V/m1UY_+jOQgewp/qx=*âqIK*{8̵ a|}!vcEk98(&5-k:r[~o0q"IY8StAKF>[3?V:[u,]坟b&tw8rnOLsι]uCIwsμ{!pΖ˕9_n49$0Cl5GPv!SMe3#븁ۮ+~{+ep~R=q)/W@wq֝~ȧW-ŋW%T$Ľ ?>u{OO4`#Vꁡ: JFco7׳qR!E` o^ qʏe-v=x},Ck BO&'Zjͭ~˵C(UPヤ.&c;}\(5Ɲ~3'rP> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 360 0 obj << /Length 990 /Filter /FlateDecode >> stream xWMo8WE*O=tHm[ۃYH2ɑko޼cK={y& ?7?kS2yK`%+teɬ6S ,kY5~Ez~j[$O]W}M^͓#gsLn]5ɧ/-[䧤a†)s(-Wc!G7SSV657",.2<;k@a'ذ&vP걚!/aJ\x|3:zi\'.}&8n.^҅W+̂ki)&c⤩umqm-zVMں]6_U?1Dxgd ηͥ#ofBkUH,$l|J!^JxW}Ywc%9G}G:ԳLbCɰSD軾{;ziV\C~AށV j!$68TG}}e*0Omb|q6 > /ExtGState << >>/ColorSpace << /sRGB 364 0 R >>>> /Length 87259 /Filter /FlateDecode >> stream xݽnkeg\ž3IWy hHZ}"9VT5tK=jܬ>ׯ^~_o??~}?_ۯ?>Ϸ_}ןok߿^_~nןOk^˟_^zw{޳?߿=k^_}}zקg￾=n秽ח__}y}}yחO|}ח_v?׏_o2|}{׷_/n¯o_~ z/ݿ_?ϯo}>^~s~?叏_2oe޾W:׫o|~/S}{t_?_~/ݾ}}n_ݾ } ɯ໾}on?ڿn~ݾ~7n ?e|[~Mݾ~؛W߿^M}}+v;۷B|}+ԯɷ۷ݾwVʷo*/MO&nk}n}?_ݾ-_}[M~(W}So ?M}k)߾ }+?۷—Go }o/2o + ҿR__oo޾A7{Aooo +ÿRo _{}+WS~}+|tV/˿&o kC߾_ }+|?۷w}Ao~V_}oݾַW}n ݾu}+۷O}>??[@|Mݾ~;r ~~;M?Dݾ?𷿿ovݾ?W㧿/w~ ӾV6y}z_/wۇVq}<|޾k~[,hi]zyJ,替zS'LO_;;3߾~^O_>޾W+Ew}oK~^]_hw7'o5;y[o5Uݾk~x;|߾?WO'5?7Wu7NݱI|;eVWo-k}?}1{*Y+of'wO]q~/b/g}?_UݳW>q~* Z+/[h'ɏ|sw/[g}']K?_ ēJ- UK/ {#IΎ$诸~uOJ(\/U/!GMKȭSQ(y) z9:O^ofJ^B7#TKUh.N(VQpUpU~O^>n+f{9%W)"'fݫ噽inϴ^gVs}ǚϱ\٫7\{b+?uf߷/cj޺W[UD8圽i}_ٜSx rS}9>N.ʏs+?iFrߧׁ_Ys׽',_q*w4~E?m|9PuoؽƜ!v1׉*rO{gsSh_1Z?M.x:v'Ydqk\GRuFٽ\Wwz= *r_iƜ]io6oy4ICzlmn=USuOԯcj>^ZOͧT>Su:OSNSu: PoIn@^GZ+P9z݁jA~&s zjATO95P +uN>}M.TA0 &5ZV s'qN3iHICLvOHICLv'}z Bĝĉ 3IL*gҐ8ę4$IELgҐ83H|6 Ϧ!$NH|6 f' Ϧ!q6BSwԝĩBSMCIq*(Mi|6 frji|6 fr@ʧ6P>TP>ʧ$>Mlv7 ~Ϧ#~~o= 4=SMܳٙ*=ug;s?o0ԝ6=g07g0lTa sϦa T=glfSlvzoy ~fo=uo=uT;~O{Sw ~O{Sw ~O{Sw ~O{Sw7U{Sw7U{Sw7U{SwSwSwS+Sw&G~&~˧d}EoD+D:ku&?N~~hLLN5LV̦d6&ga2l<b6;]tl̦bc6;O݁*0cԝg %S+6f#l*l||gL_a2l &9bgl|z6%lKTF9ՈZ311S;1Om.1S1ىyԎTl̦bc6;?`ț"f61g3Tf'fw0Za2 &&STTd`2U0*|Ud`2U0*LLN5L &SɩTd`2U090*LL &SS Td`ra2U0*LLN5L &STTd`2U0*jLL &SS &硴ɉW09::+vԙTԙ<'V8:Q8:L+&GgRqt&щ5n3:3nI li64NnsS+fSLniLSܩԊTͦbl:fSLnT$FnS;fS7fL4UZLnHMElĩOKjjuIFZw6 TlZ^RKjjuIͦbn6ܩԊTF;՘*M.%u17UZ17꒚MuIMGl*gS8NKjjl*fS1w6sMlKlKj6 TF;*M ~~ST*~STow7U*MN5 ~SߩTo7U*jM ~SS Tow7U*M ~~STTo7U*jM;sM;Q~gR]RgRw&W; 3iDnh(Xw&߉~_3; IߙTIߙT}MJfS7 ~vFZ7 TMwΦg#PN(O5(VPΦr6;S;gS8T$FH<#q6Hx8UHZ8ij#¦ylmϦr6 S+(ƠZA9 _gS]T|F S+>g#WTOHMEl*gS]g]Mlv>vPΦr6<S+(gSA9Tr@9U*PjPN( SʯPN( SʩTr@9U<ՠ*PN( SʩTr@yA9U*PN(O5( SʩTr@9U*PjPN( SS ʩTr@yA9;w(O('6Lgx8qo;ag&M~?do߉'_=-ĝ;]w&xgyS:xSwb^g T;O=x @;O=}Sw3#}U]G;uݩ;RrAŻywW!{|Sw/UxwλSwޝCrSMCɖ*8;a_xl83>lv3, kpzu6;R\:uש;R\:uש;NuSwp+UuSwp+UuSwp+UuSwp\Swp\Swp\Swp\Jp\Jp\Jp\&7pMpbṳLf<ΰV+3i4LvM% &6Ll{L{e&ͽ2^9^Is̤Wf+g+Ϧbc6ͽlgRb*Lmg#LLNng f'橂ɩy6 llL`2U0\F096Msm鮣sSh6sN5 sSܩTan07UTan07U*̝jM sSSTan0w17U*M ssSTaTcn07U*̝jM sSܩTan07U;՘*M ssS}ީz+f7(M7L;~}0wbLf073ILf0w&>f0lv07a;hOm~lvО5Uzj gUsOݙ{j g*C6կ2SwОz'DN;~l_p86`S=c6;sOݙ{ԊglvHM1gԆ]Om~l͎ԩ?Bçx3glv ]Omz6 ]fkԝ6t=BSwlMCl*MC׳iz6;]S6t=i%i~lӳ9q*ОSОMڳA*=u;hOA*=u;hOA;@{SwОSwОSwОSwОMОMОMО=um=um=um ?ցv&;h>07L*D@ډډډh_gf̝X1w&܉W;3;IܙT̝IܙT}MJfS17anjTܳig{657BԝħM56ܳig7cn6n{6lvVw۳ٙ{6l:f#MmgmMlT$FH<#q6V$8u'~jw=6ڳ0w17bn6sN> oSSԊTͦbl:fS17ssS+fS17gmfg;hS;f#tMMElSBTku5U*tM5U*tM ]]SBTTk5U*tjtM ]SBשFԏBTTk5U*tjtM ]SBשFTk5U:*tM ]]SG@-tM+vWי4Of<Ɏԧ&t}(Ǐ3hwۉډCKh'6-ɤz6 Lv&V}M:ΤL*Τk=d6hAsS;f#ڳ@MhSTTmjl*f _U*|N> SSϩTsy9U*|N>O5> SϩTTs9U*|j|N> SSϩTs9U<*|N> SϩTTsϟn|(|~#T&G>9$3+|}NP./K0(O(O<@x@ϷLϟ&'>>>i_\>3zs{?6>c|N> SSϩG> N|nshϩ#?H09yQ}mgT#zFUQ}gTsDQ}; թGTW.z_v|g> G_?y3j6CVTYa S+gS<Onҟ?a=U*7TayX ?T?Q;`~ l*gsdgesdg9c7TIO=S&zDPz:UP*NTO5T SթWUT SթTATCu:UP*jNT SS թTAu:UP=P*NT SթTATCu:UP*NTO5T SթꩆTAu:UP=Pܤ߾_wTOnҙ47LTgz:qs39=8E>3sbsgdsE9ʙPNI=lvО܃ϦMs$plg;~S6ing7M-g<"e6ElvVi.g\foԆg3JM=u=lv ]Oݑzjs>p|6cOfstjѳi8z6 GϦT;GOyjCl*bNSwb3UyN?|6;uͯMk0Ts6͎ͯSw>I|7uojl'F<{6ߩ3g<{6;OmH ~_o6~MlS ToTaTmv6m6hЦ hvͦm6T:z6ul*f7i~l_A9WP93T'Ml*f#jM ~SS T}mTo7U;*M ~~STTo7U*MN5 ~SߩTo7U;*M ~SS Tow7U*MN5VyG'D+vIߙT;Dn;Q@ډډhgRv&W@; 3N@tIڙTIפm6h@vjl*fnMtͦm6rMTCjjuͦf#w۩6nMuͦf#w۩6 RS;nݳn鐚Ml_W9numS+f#HM1Vwl*f#t}ՒTtͦk6]N56MssSTaTcnjl*f#MN혛MlܩsMllo6Ս7ƛMuMwFns0w17U*MN5 sSw枺v5U*tM ]]SBTTk5U*tjtM ]SBשFTk5U:*tM*tjtM ]SBשFTk5U:*tM ]]S+u;H:+C[Lht(tXu&]g"t}Ŏ3]?ӓ@tIڙTIפm6h@vjl*f#M@MhOz 5U:ՐZ!5 RvHͦBj6R ujl:6m6hgӁ6 Tͦm6ک hS+@Z6 h_m6h@MlS h@v6U@30N5=m6/M)tͦo6Ӳg#$j2Vͦo6~g7 =ugnjlh@v6U@*MN5Ц hSWUЦ hSTTm6U@*jMЦ hSS Tm6U@;@*MЦ hhSTTm6U@*MN5Ц hSکTm6U@;@zrS@v6k& ]3:Q蚸5qkYgvzֵ|fgLv&txky]3隸#up4qgNl,oJƳxk NX@L19>}Z>ΎTa;O=x @39|aف*@D~ˋ/|_K7'$<9|?!ɉğ'X`~Dm$.xWnw~k/ks q8ilO7qf*7өF/ ?gpr8g(_G5qOsD$}uWqU}uWSʩ38W՟LgsDS.\P=ծruM=\]?+g>s镗`#N׫TO5TVΦBu6?~~rqB*NjO5j S@ϟOkTϟ_O5 ϯo߅ T_{.{`g>!sϫs6Ts9U<*|N> _U*|N> SSϩTsy9U*|N>O5> SϩTTs9U*|j|N> SSϩTs9{Ts9U*|j|N> SSϩy JIs%dDsĝĉ;~' ~w&6Lv&̝X]~3i.MA;QṲ!f&;1' 1wb&Ll9!fL19d& &3i0Iə~|<4̤L:xMϳyjlοn8q͎SwVH=} *f#H=uG RϦAj6RfG;RO="ӏّZqlSfSqlvsԝGϦ=M8z6 Gf GsgsjϳyjC̳ig3Uyjɳi~lvb &Ox@0*ym6hAq-G;U{jlhg#}|Wq*f#}㏮G$/dS8!T#qjEl*g#$j$NV$FHuojls0w17U*MN5 sSWU sSTaTcn07U*̝jM sSSTan07U;՘*M ssSTaTcn07U*MN5 sSܩTan07U;՘Z]hީdG'VIߙ~_;Q;Q;kR=xbum' ~_ΤL*Τkw&~gRw&~_nMlnZmg7 ~S+fSw6To7U;Z7 ~vͦo6~wjl 7o6~g7 Tͦo6ߩ ~S+ƮrM@Ukn6rMTtF:Z56aS=d6 ]]S]NTAG8ptq4h6G~S6;GS;xfS3-?NlR u!5U*HMN5 RSWU RSTATCj 5U*HjHM RSS TAj 5U:Ր*HM RRSTATCj 5U*HMN5 RSԩTAj 5U:ՐZ!3R'VHIԙR_ѐ:Q:Q:Bk!u&ԉRg"H(H}3: 3tHIԙTHIפDj6RVHMl*fS=\<\*I.F*HMN5VHͦBj6ԩCCG8ptjlԊ8p4h6Ggq4Tͦz#l*f#HM:CjjTtF%]i= TF@;@Z6mjtF@*MN5Ц hS+fS6Tmjl*f#Z4dq65:TFruځ6mjl*f#jMЦ hSS TmUTm6U@;@*MЦ hhSTTm6U@*MN5Ц hSکTm6kTm6U@*MN5Ц hSکTm6U@;@ڀ}mN׉4HdGDAj RgR!5 R3ّ#ubLf 53&Mᙸsbɳi0y6;&Om0`ԝ6@<@Lx6ͯHSw6 O=}ӧg<}Mɳ1yS_8ӧg<}z6;&?N gclLx6 f f`jEi(x6;Om(PԆgPlv N(x6 Ϧ4<ix6;OmؘMƳxSw6 OxSw S0U(xjCi(x6;S;K~l'JϦyl'J9Nmw6 fG_};uG_};uGTCߩ;NwꎾSw NwꎾSw NwꎾSw NwꎾSw/UwꎾSw/UwꎾSw/UwꎾSw}Sw}Sw}S'Jjo({L3M&g"|E[d@(@qP0Q7y4LX=Q(yS0BkR]&3i.4LLgGϦd6ͳg3L3c4`shlmѩy6lvVژM4ͳing#HZ68#|ATAy6m3TtͦmMh hOztFҳ蚍U'JϦyl'JϦk6;]SVͦylv GOx ˰L*D;qDmN@; 3;+tͦk6]NMP=k6]g5]SS]蚍ujGl*fS5]vtͦk6]N5 ]S+fSu6]MEl*f#tjtMVtͦl]蚍UKfS5TtF:Z5=}1 sSSs07U;cn6s svͦbn6s;Tͦbn65w6sVͦbn6ܩTan07U;՘*MݙϊS SĩBT!T#q8UH*$j$N SSĩBT!q8UH?~!CJ'(O{`H&C2nǯIw;IETԞIu;~Muͳt'a#NPMtΦBu6Pz:z y zI6էV|FCK|>z< S+(g#Vɦ{g>O5>Iij=ϏCu6{F={BPMl*TϦCu6Q}S+(gSA9Tr@9U*PjPN(=8UM ~SߩTo7U;*M ~~STow7U*MN5 ~SߩTo7U*jM ~SS Tow7 mW;<s˧d}EcDaDaD]~'wbu u kLkL;Qh܉1gRs&r}Mlkn6bfϺʃHՃHȳBMuF0*jL0MlϺ3y5UuMؘCW6&.TlB;L0b&gsOeŦVlF8\51y6n;#fjuU˻m66nMlSG#GR#TŦ-6u'|m6Gmmv̦"f61ىqo6G9r39r3gq4T7lSHC#RWlS TAj u!5U*HM"5U*HM RRSTATCj 5U*HjHM RSԩTAj 5U:Ր*HM RRSTAj u!5U*HMN5 RSԩoۂO5Bj& R3inHX=Nק }(;s' sw&6ͤy +f\h3i.4ڙTL>g9B;gӠlT͎B{6ͅl_+9ڧ6l>uG;Sէ6>g:4ڳi.gPlvjV>է|>ur@ԝħ6W׳iMuu=z6l>Tlv(ڐ8! ϦŞNϦ!4$>g8UH|jCiH|6;Sħ$>u' Ԇg3ԝsϦa4=T=g\]ϦfS1lSwЦVW׳A{jsu=g6U@{SwО6U@{SwОv=u;hS=u;hS=u;hS=u;hOA*=u;hOA*=u;hOA*=u;hOA{T;hOA{T;hOA{Th5NоbڙTIsuD@ĝ;Rh(Xqt&;GdtIsdhbפL*xΤL*x&%i"M;s˫ s?MJfk3$l̽r֏S7owjl*f#M*ĩ;OMtF*M=klSsl侚*wzO>O>Ol~d&/dI&/d"(~M2eI(Lk]gRQ{&Ey&E5~lr6BM.T2aS=ʄP;zI6(<ʄ38QFvP;OnLWQ;UZݙjO=S̟鑍<l_A9xSwjv8aS=M6GT]C3ﯼ{ Auj&SwTZ=U_69ϧ6lr6(O5(VPΦr6Trj $g9eBGP+f4@Ml*(gSA9ʩBS+fS=ʄM(l{p6Gsgg#8I.sS0w17U*MN5 sSWU sSTaTcn07U*̝jM sSSTan07U;՘*M ssSTaTcn07U*MN5 sSܩTan07U;՘Z\~3 hϤI3޾&gR<{&g8q+sO,g)L3Y{bLОI3)@{&h3n)S~lV~J^4=).ue;h?j8Ǧ(l4MtǦxcSc+MǦxcBԝuG-^M 叺͊Sw~ԕxcS܎fgG-ncS܎?6cScԝ Ǧ f%;?J⏺IQWԂu s?6s?6s?6=l{Ǧ ǦxDca(M0ǦxllVa(MAJSwԕu%G]I|N⏺$+Su%G]IQWԕħ$+?J⏺ԝu%G]IQW$+?J⏺ԝu%G]IQW$+?JSwԕu%G]IQW$+?JSwԕu%G]I|NZG#D!+$>LD;~O\{ ht(tXu&B׉+];ΤBL̤x 'VHI񀓙8aR"5'͊ԏZϦs6Mt|Φs63߳騝P;xcSQ;TvP;U*ԞjNj SگNj SکBFT7U<*|N> SϩTsy9U*|N>O5> S*PjT!q8UH*$j$N SSĩBTO5~{`i$($~E#93{X(WDa)3NbOIT-&܉+sO\A{JiُMp6iٳّQ1" ؏3U9_3UnSYhL-OMF*L=3xNmO~l#HmGSW~#Z>NijفZle};N=^Ml39^i(x6;SySk_rW<]6»Sޝ͑wUwũΦ4;rgC.U wSwȝ@. rgCrKȝCr;u\@ru%Gq*8;u٩G}Bq tT8;#9q戳ǩpv6;N=⬼gg,UpvꎳSw,UpvꎳSwlg8;u٩;Rg8;u٩;Rg8;u٩;Rg8;u٩;Nq*8;u٩;Nq*8;u٩;Nq*8;u٩;NqvꎳT٩;NqvꎳT٩;NqvꎳT٩(^2MbT8I^ELV=-֗`(_#L*Ϥ"Lįhʉr(̝X151N|߿r+Ls&hgRv&h_3@; 3@l*fS6lf# 1Ц hSW>6k4ϘZ]R..Ϙ?>cjufkcli6C5f#3WQ=Tc6SWО5ЦV7lSg̦bn6:cnjuIͦbn6W-07yl*f#̝jMMlS+s_]RSSԊTͦbl:fS17ssS+f5w6h@MlS hTtOfS]sTtl57ssSTaTcn07U*}Uen07U*MN5 sSܩTan07U;՘*M sSSTan0w17U*MN5 sSTaTcn07U*̝jM sSS5&X64dLo&͍7;Q7f7ΤfҐ8ę4$IELgҐ83.gӐlNԊgӐlVݳiHԝħSo0{6lVZxϦy6lgsϦlnju={6lo<{Sk4l*MC9H8͍lv(s6$>ħ6wlħ6w۳i|6;vw۳ﶧ6w۳iH|6;Sħ6$>g8UH|NSNT!;OmH|6 Ϧ!q6Ϧ!4$>ĩBSMs=ħVܳig\sϦyb7 gglv ~O{Sw ~O{SwN5=uo=uo=uo=u;~S=u;~S=u;~S=u;~O*=u;~O*=u;~O*=7GD+=oO&?`o}E&wn(H}ECDA' G'V}M~rV=q"kb~z}1gb~(?ee,ɶKpTdrNJȧ1?bSSol,o`lL;S!T`P0U(*jLP\Pjz` x7V}@njܧV}jL* j Km}ۘiS OM5V}`'bTcMjZB.J*dbfVTɌPeQ%Bv;dF2ը*TIGLLpUR*+d11/~;~d:J?gG\R{Tک%Zj'ŧ R+>„"3„ LxxN|NFt~_[GIff*U޿+ּ^`ʅ@ \zCT *U5*JD RQԊE up:v_[_>s:?x*KM{{_c6 v _cg5vLs*1txq4U8*9_?4N>ѐ:"O4xNIdI-?0C;R_/l]?E;27 h~+sS>S>c>L9˹vr.~.G17U;v.}kr`#PjPNGL]83yO SĩBFT!q8UHf|N|~o YCDA O4TO\zFd;r64wgdTOT?qYzF%OQ+O\zFV~F ՙTP=3TAu ՙT 8Uvǩ;NO5vǙYA93+(όA9U*PN( SʩTTr@9U*PjPN( SʩTr@9U<ՠ*PN( rfVPj3#Pڡmw|jϜT33#PjPN(3#;驝ğZ+ffܙ3bnfV͌0w17U*MN5 sS+fF;u̬anꊹ3cM]173senꊹY173sgfsS+̎ sSSs3#M]1wfv̊Y173+̎V**~߯bG\Ig.&PN(OA93+(gf̬<3;(gFrfVPr戔 ;' ;;;' ?@w[F:?@_ߟҏS!v'nS8F>@S>@S8z%#WF6GddwlNS?*էvTڏ^9{f:SlߗMU|Ts:SMڏiiˉo'vtY*,?S;SvY~jgyS;O,?Wq5r:N-x5طw72 MnMnddu #gdyMf&uu 3v*76@6MMfV7Y`FnM~/[o [SMf&UnMMH7?~kTaj7 rÀ*7 rÀZo66g\n.dn.PUn.P©˛ 3 ԛ +tn.0Lp_y݈ʍFDfv7"Y݈`fu#ՍfFD݈ʍFDֻ݈`fu#ՍfFD݈ʍ܈ʍTATAވx3oF399oFD{~}>r}/'+D_nO+${MnZ0si!ӟgz=ѯBNZoDܯߞ*ST=AO9L'O_3?Я|EM fM 뭌9[\oe\}G}zѯB^:uuӂr[c2}ݞnO矯v{"QnOh'7|edWFVƉv+#(O9$DܞHgFD3=z{bb1qun9ddu!#[Yr8#[̬n90So99agfzؙgr#*7"R刟r!n#P6U%ʳvkᩁ3Un P@ʭʭT{>*PT~p?U*~lTzj?j,O SO]<3yizfVXό< j,Oݼvf6̌Xyi,3rl~l3vf>o fgfٙYa=3+Ya=3+gF>հ*XO ֧S멂S̬굳3zjS̬fVO 0#O PWO kggf,3g g vj?$h:u?3Oj?3TAu:U2gF+(gfݟ3#v?3Hv?3O]m3n3#gfό8UH*$j$NݜH#TOWg39 Y|ק^Fekqn>#s3;7f6όlS73cT S?~yl^F;3TayX*Tx*O STTx3Y<3Tx*OnNޟ+ fs:??us>3r3#|Nݜ=t9yf6'ό@9U<ՠ*PN(nNgfuSʩgI ʩTri39Mf64}fVό9uslNgful^0;3+o{~3gfsS73:MfϩTTsf4sbDsbsbsbDsF8qsB~FV'39!}NPNlgd}H>'sf<#sF6| g}lǵ7̬gf}>3ϧ}*$>uslNT!񩛗e3:!f:O>ԎTAէvTQ*>ԎS;SէvTQ}jGթS7LAxS;Oۀl6gf?3S7f~f:SW3ـS7O?u?3 l3ڀ~0 3ugfu0lvgfC3ө*>SNS;Sڧvjک}_D13%Vlgf>3vfV[3jS,_X~f}f63s=lFzLa3sv؟z{(?Tu $n6Yma_>gO¾\UagzT\[?*fjM.N߯~T|uؿ_pk_ MaFꭁ 4laDn.o.\/aψrHr\ WCr qundDn$ zÀo L7&VXajVS7[VԾ>Ùo`XOO5bb SW ps:?U*O STTxoOTO5T Sթg>C+ffS7̊ϙ>ONgOH<3_jY9L?*gOn93_ff}>3+gFHS<3w(sr+l6ՙCy;ir /ǿ+rmW>ky;1> S+Oק^_~z~Tsj߀*PNByڀl6gfj~fʩʟZI|j}fkou_>u>3Wl3ofVTan0wlO ͶeDCDjODm=}NLNL>09Q09Q09Q09Ӓxqqĉĉĉ' ?RS}|p.Ux*[T\@nA.U *KM5ȥEEvt I3ա|@.U 7 *KȥVȽ EgFЗ*KM5 R}}? E1 ~~_1ëChL|N̿\u OTTdjV6~q1U*@L@<նM OM5 R+>ΰO2SiP=3\ Φv_-UȖZD?I.q)2U7@Z1UP*(IʯR%B+;TAa *BTJ*ϝ+UOFoTSrjGɧ ?RZTٜM5&V&|j?bj*GΣ QWOq^pމyyyy'% % % h(,IADAwpO>0Q0quDF>&aT~s%$2cTI UR?~0a&h(U*JMBu_Ve*K¥\I}5RK¥K?厨o`J}ZӦRWZ0#\Joo\Jk¥_Υ+_"*3TAT *U5*JD RQTATCT *U*JDM5D RQTATQ܃e您'/Q:rmB7Zz\8j8K R+N5V}+UTW+U*JpM5p R\z;.A \_\JzTWp}O/ Z¥ƥTRp)ri?9U*Uh*jJZ RVSVBTUj*u)?:;& ;;;& ;;;& ;$#*#jlJ$oJd`'c'oJdmJN훒S;JN(9UqjǩMɩ)9oJN훒S;R v&ڙpjgBjSrf63ٔ΄S$U6%voj*O7sy/df>pD8oj缩yS7ۏ39ofἩQQ}1uq31njǸv M7cԎqTv1*7cԎqS;MG1njǸ㨂qS;Ml4fFl6go4NF]m4Lhz6+`lTئv`ځ*6u83ݦvvK>.?rFtS;MDG=mߠMO2#SS;MpGw"vډn{ԿDwS;MpGZGl?Nu&STTd`2U0*jLL &SS Td`2U090*LL &&SΙlv2윙f&S+&߯ 11#Lp̊bN5b 1SB̩FԾ9U0*|pN;STT᜺`f+ ΌQ0U(*L N5 SBgfGSBF3#L N]pL*L Ծ9Ux**;SԾ9pRaEp6Qp & & & Ξh8(;°yp&gp&gph;Ù(;yQePep&牺IN"Uv8S TCpR S „T RT'3NfV;RS TAKfV]Ό U@*r~T<˙ٜvɌ{RWQW1ΣnNi3#wΣ QyyTj|jGΣ QR~.S Q7g`2:sf6g` ̙L5 QRe7 TTA U@* j H RS +_6 O4Lwh]ቆ'& & & & hx(x(x(xxaaaቊTC!U0*xH< RS TCa!U*xH U/Ր*G QR |TA> _!UB>fVȗ̬gFvy;cF vyQyTK<U*DwU*DG ѥQBtT!T#:U*DjDG;`U0ڸnٸU-Հ*F` ~On53lT6[U*F`K5` Qبll?dll'%]l% hh(h(h(hvYYYYىffff'% % % hF4 QR ͨfTA3U,Ќ*hF4 QͨfTAԎfO< aOe cF ,˫Q^ ݯЌڸn㎙ l|Ne_>BtϱM>`unj]s`wQWp;j&3|.A> U*ȗjG QR |TA> _!U*G Q|TATC> u|T䛺cfjgA1cfL Q|^f  H RTA u`nf „ʄ_O;gFH*HRH13ʕM>fV|ThNJR%v#U 4RTF@#BWlw#3TAId$uU.ĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎĎS;JN(9$UPrjGɩ%vQ*(9ԎS;JR%vQrjGIjof6|3䛙7&U6M%nPJLڷ?<<ԎS7x83ǀUٟ$3əSaYq)3}גj0J0T!Pj%Щ;~G̬!Sʌ(U*JM5 R@BFT!P(U4*J R@S@BT!Ph(U@_D$3ʙlUΌ(U4 ٔ)9U4U6%Mɩšͦ$3v2#I<6%MɩTLflJN훒S%+LG믉R%U*TڔL&U9 I3ٟl'YOLߟ*JM]83SgF`*0JM]˩}rjߵbXk9ZNTCI %ICDA %7',29a 0007o-ٌv& v& v& vhؙ(ؙ(ؙ(yag`g`g`牊TN`'U3հ*I vR;S ;TN`ga'U*ILp2#J~ пŒh}'UX3X*ILeNci3#;~TTG#U*j~ͻgFH%)2#HR )RSBT!Eb"UH*HRL5R )RBT!T#E"UH*jHR~ ſYL$۟df??8<3BJfsgfkɌ@cA#U*HT#Ej?wq!UTC!U*xH _!U*G䣮/3;cF*GK5䣮PfF*j(SWnj U*ȗjG QR |TA> _!u|1#vK#v#v#vK#v#v#vK#v#v#v#vK#v#v#vK#v#v#vK4ڑojG|S;M7#Ԏ|TAvڑ*7#Ԏ|S;QW73}nj߁فytڑojG> Ԏ|S;MG]!lof:M7#Uoj߁9oj߁ Mp7u73Rw73vΛ9ojdusƥ=<3=n1ΣnΛy3#w Q||TA> U/Ր*G Q|TA> _!U*GK5 Q7;{3#ȗ:%of63#ȗC>f!SWnjp^!3S~FTT?fof^23M< RSWy3"Ef+Ř"UH*HRL5R )RB)ffG)RBF)2#HRL5RwOxx)RSWCffٜꜽټ>df6Cz?'& & & h0(0(0(0zhhhh'& & & 0J RFS FTQ(U`4`*0J RFTTQ(U`QfFSw0 FټTdfd06BKEff(3TQ FM-El)R;+̌a'u̬SɌ`'U*IL5 vR;TN`'U3հ*I vR;S ;TN`ga'UNf;Sw ;Ya'3̌`'u󢐙/ *ؙjk2SY V/a"Pf@BN$Uv"šTaMfDRS*+̌Q%UZ멀zkR5škffǚkR7CY>dfلS@BFT!P@zkI]KZRWk2#{Tˤ^feRW?& ?h(((xcccƏ'?& ?& ?& ?h(((x#U*H~L5~ ?RTTG#U*jH~ ?RSw839pf*+dF2U1*8Se/n/AIeRW?2#H~^&3Lf*+̌Q%uE̬STɌP%U*TIL5 UR*BFTJP%U2ը*TI UR*S*BTJPeQ%UJf6g)2{$# U2^&UP*(j(IUI]Acf +hdF*xB#U*Hh 4'YO2#(I]df %J2#(CIf%TAI %3Qw %Ydfv(Ɍ$UP*(j(IPJ2#(j(I JRW(J2#(I JJR7($d$$$d$$$d$$$$d$$$d$$$dԎS;JN(IQrjGɩ%v JN(9ԎTAɩ%vQ*;SNS783șDf'rfN$Uv"v~ى J2Bə(9 JLGIDN;S;4N'7Rnpf:pf:Nx8ԎTév<*x8ԎS;RvQwf>Q }s{ ~@UR? }}_kzK fF(*L SBTT`P0U(*jL SBFT`P0U(8(*LPƞ˃  cvmw}˵ ~Ey|ꅂ{u I@j@L Sec4(*TA_琢TA_/UЗ*j~T\lRlJM-Pjesg8_,U@J-T R+^i3p R\TW+U@Sm *JD RW[!j ꉆ'&hpilh0(0([BB'v([(['U& U&hl[T )Re 4*xH<(U0ն@J-P _!U*GK-PlR+=uʌ]n (3GGSlpuj33Nfd*G]mv2#yTy$*pGGS;rmMfVۚȶKcF*DG ѥQBtT!T#:U*DjDG QBtFtT!:U.Ո*DG]mk2#ۚmMfV̬ۚ5Kmk2dfɌlkRR 㨂qT8j[33Ftն&3wTSwT;U.*pG ܥQwTT;OR+]*QWugfP73]KfVQ?IK|pfBTT?U*jG QR+FB'% % % h(((w____߉FBBB'% % % G QRBT?U/*G QBTT?U菺?fRẘY3BFT?Y_fv̇?>/bBf S „TaB0a Y1!3+&dF%2#LH& R S „TaB0a1!U*LH&L5& R „TaTcB0!U*LjLH&a2bBfVL̇ߟz&uńR S „TaB 3cLH]1!3„TaS „TaB0!U0՘*LH&L믉"UH*{PFR+R̎Y"3+Rdfvfvo3#H~ ??2#H~ ??Rգޙ=͌P%U*TjTIPi}q SeP%S%S%SeP%S%S%SeP%S%S%S%SeP%S%S%SeP%S%S%SeQNS;UNTIکrjʩ*v UNT9SNTʩ*vک*T9SNS7T93*+ Ŭ*gS%Urjʩ U2ʙPlrf6T93*BS;UNT9S%U:_23uÏ31uǏ3qjǩv~ ?N8ΏTǩv~*8ΏS;?NH~qjǩS;?Nt~qf683%3S>"uE3IqgNT!ũvR!EfnHqf:)Nj8NS;)NHRIqj'ũ}*S;NL83!uń3AݖtR!EfV83R )̆YtRIqj'EgfC3Iqj'ũBS;)N8uC̬Hqf:)N8"UHqh#D!O4RLRLRLRӨOuAt s*9H1;_?G09B̿|3U*EoEo`HM k5 ߠ}uj{*HMݜ~?9s*CTyh~3U*Ĝ*/?9djO*  kJ~ӑ9m:QDDDDO4NNmDADAm6Qae6QaO4LNLNmDن=Qa K6l.Ux*KmX@nmRe*۰TaTcX0,U* j۰Tن6,u ˌlæaz6,3TWj6lfv۰3; RWReÕ*JݼaUaYm2#z\p R\TW+U5*Jp R\TWk+U*JpM5p RW۰6ln6,3gF5u#ˌRW;Ȏ,UvdSmG*;Tّvd3cJ]2#;Tّ=Uwd#K UR*SmGZQc?R+?^t*}ZfTGjG63YfV;̬vdYff#ˌ&U*jI/*TIW콦?RJ]ffʌRe*{J]~ax(xxaaaቆ'& & & & hx(x(x(xxaaaቊTC!U0*xH< RS TCa!L%SCI}?B=IN76_J2BPAI$uJv/033`2Lf0O]&3TL&U3*I ``R0TTL&U*IL5 `R0TL 0lO|a|a?>G6F͌&S*=˾kR5ÙjIep>s>p9TQh7 CTpR?p5'U*JD53;DeFv8¥1. RKSKD~|/0p R\ٙV˾}s>{?˾s6d?d;-J+NdKd;J+;Nd;J+;Nd;JN+,ȇ#^SHק|:R1s*?ÑlOlG _7G ˑ\E詝Z9ZyjV6~jeV ~jZZxjV}jݧVȝgZqgZvjgاVp}jէVZQZF`'S+:=3KS;>"j+3Si~\vp}jקVp}j {~gJ|NܧVȝ!rZ!:޿_Gt s>S;?S+>λO O<ϯλSo_?/ܷȆ ʷ}rrʻO{Ut}jݧVޝ!rZ!lv}j٧^ΆBO:~o{v7Ϲ@} rs:>BS+N :ɟWs]wZyrv{wz٧ 7 ƻvwܿ% 7Q DDDD rrrrO4MMMMkE>#_Μ}& &~8Gu}׷⌬8#+ >#K fSR}ԊO; Z!l*8j8K RgS gTY,Up6p*8K ΦRgTTY,Up*8KM5 RgTY,Up%2#8K],3+eFp6pg׸YfgS gTY g3YfV8 g ΦRg+efߏ;efΦRgTTY,UpYfgSw8 gp63gW#[fl+=3J2SgffGRlBFT![-U6Ȗ*dK]-3B+پ03;efE̬ȖffGRlB;eJl *\fV\VffǻRW̊w3cK]?5M=x7Qx7Qx7QxDDDDwwwweODMMM=mO72 +Q*\J. RK¥TRpiq)U*\J.M5. RK¥ƥTRp)U*\j\J. RKSK¥TRpiq)U*\J. RK¥TTRp)U*\zpSF`/Lb"0j0J3`}TQ(_ѧV}|l ;;߯Satj'Ч~5v|f&UX*IL5֤ kR5W|aΚO5WPvwc;+`0V*UR+U>UP*ʏS;4>UH*H?If cMu_}Rb?$3BT!Ph(uC~Z"J(JJJ(JJJ(JJJJ(JJJ(JJJh:NS;R@v tj'Щ@BS;N:(Utj'Щ@v N:NS;R@v tj'PNS;NJ tj'Щ@v N:NT!Щ@v 4uG3 t@gfC37%S793윙 v2Ι9cԎTΩ;n'g RFvљ(3+ Fg(U`tjѩFv N0: FYl`tf60:3eF`tFg; LѩFv`tf60:3Fn`ѩFΩ}*9cԎS;vN`'3+윙S;vNI]at윺Ι`'3+윙 v;gc8xv;gf̬sf:vN9c'Us ; D ;;;;O4LLL<Ѱ3Q3Q3Q3QDDDD ;;;;OT vR;TN`'U*ؙjI vR;S ;TN`ga'U*I vvR;TTN`'U*ؙjI vR;TN`'U3հ*I vjO֤~`Ϳk2#jI<>3g?N UR*r2}9Ya'3}sf&UXy|f>}aTTL&k~y+vR;W|=73rSS/(9WVCIa^O?O{|%5" JPe?n>UO4RTTF@#r.V~^Y=B>3,|x{{s 0r%%7˧ ?RSؿ7˧^~'ܡ_A#z*eYOWa(I]?n(((yddd䉆'J& J& J& J& Jh(((((((yddd䉊TAI$UP2P*(I JR%S %TAId$UP*(IL5 JR%TATCI$UP*(j(I JR%S %TAI$UP2P*(I JJR%TAS%J2BIf%S %+dfJJR%Jff̬PJ2#(IL5 JRW( %3CIfV(Ɍ$*:UޯLf0SwɌ&ULf0S{19/sf;+?*vʌ(U2Oe/^@L?rpϹpR7gv2cJZ RVSVBJODndf'Uv8Ù TNu/\935g溗 F;ef\2s6p2ӹ2RW0& h0(0(0(0zhhh'& & & h0(0(0(0z(U`*0JM5 RFTTQ(U`*0j0J RFS FTQ(U`4`*0J RFTTQ(U`*0JM5 RFTQ(U`T.e`:3+DeF5z`̬Xuf*9ay=n2zTW+up;33{̬ngFvCSm7*J۩p;U*\JݼHhfKSw3zREBܹ_1vfK׍z1J]=ucTB6FW.W{. Re4*J R@@;P`43ۙ_E3ym3͌+U*ۥGޙY*3]JD ngfp;3]J]qifV-ATQ⎨* Q+DA'& & & h(((z!j j j j ꉆ'& & & JD RQS QTAT *U5*JD RQTATCT *U*JDM5D RQTAT *U5*JD RQS QTAT j!*U*JD=UK]J](3+eF`4`QfVۥvimRe*ۥvif5šk2bMf*k?g~V}j9uǚ̬Xk2#jI֤6FyFT!P(uE\|S13=RfV{l޻>3+.͌=JO]2#0J=S{̬H=R(UOšTaMj33;gFz}QFQ(UvCBn43Pfd7*T M&3H3#ef̬HnΌhj)3+FT93հοNbDNbNbNbDNbNbNbDNbNbNbNbDNbNbNbDNbNbNbDΩ;vڱ*9cԎS;vNIڱsjΩ;S;vN9c'UsjΩ;vڱ*9cԎS;vR;vڱsjN`ԎS;vN9c'UsjΩ;v vN9cԎS;vN`lsf:vR;n vLN`ԎS;vN`'3S;vN`mM 0gWLN ;gfv֤ kN9okNۚTʩ*vʙP%3+ Ŭ*gfCUNPtک2uG3ʙT9SNTʩ*vJf*nrf:UNP%3BS;UNT9S U2ʙT9SNULʩ U2ʙPlrf:UNP%3BS+U>eN#3+~ΏS;?NH~1QDDDDO4~L~L~L~Lh>#%FBB'U& U& U& UTI UR*S*BTJP%U2ը*TI UUR*BTTJP%U*TIL5 UR*BFTJP%U2ը*TI UR*S*BTJPeQ%U*TI3TL&?nN5 UR+U>UP*(*OS7rfvfrf63#(j(I JR%S %TAI3y?:3gf`lޏ>33c(IΙ^,,zEz37L|jf cM&UXyk:3ό&UX*jI]~j(yfffƚššš'k& k& k& k&V剶U(T(T(TyQePePePJTJP%U2ը*TI UR*S*BTJPeQ%U*TIL5 UR*BTTJP%U*TjTI UR*S*BTJP%U2ը*TI UUR*BTSTɌP%uE̬v-LTy^;df``R0TTL&ukL5 vRW ;3NfV ;L5 vR;TN`'uL?/cMfV̊5YZffulNќNl`f)3#K*6h2:EsfF~&ն5TNj?EjI֤ kR5+̎5֤o`R7g`2dF쨒U2s? 22gfs^\YffCS+`ޯX*Y vDv& vhؙ(ؙ(ؙ(yag`g`g`牆3̈hhbu.^_GTZJ^?FpV_A.U *Kȥ R+rw?CTC_/UЗ*jK R}TA_/U7З*K R}TA_o/UЗ*KM5 R}.їA_Y̬SMT}_wM5ޥ Rw3cK~@vY»_/ؿ |}(3#jL SSBT`j;+W'M]f掾*vRWgF7\ Wf}Wko;1 R}S }TA_o/UЗ*K{_/ ϙ;_^f53Wf$@ܿ1U8@ܯ9+ n+k36^_ԯvd61q111q111q1111&ʎ,S0S0&ʎ,,&ڎԾ#;Ծ#KZiujթVvZ N;SΥTҩKv.ڹ*\:sΥS;N\J.ڹtjҩK¥S;N\:s)UtjҩKv.ڹ*\:sΥS;RKv.ڹtjT;ytjѩmؙlLQlNTѩFv9yѩFnagf ;3,1:tfQjvf6:3NT!Щ@v *:NS7۰3 ;YsfyDfkuf:`Nݼ=3S7[3yGGԎS;JN(IQrjGɩ%S;JNݼ}f~ ̬Sgf>|%vYgԎS;JRWЙO8#u:3ԙOݜЙOݼ}f6sgFq )D O4hLhLhLh<Ѡ1Q1Q1Q1q~*#ԌS2OeDDN`'U*ؙjI vR;TN`'U3հ*I vvR;TN`ga'U*IL5 vR;TN`'U*ؙjI vR;S ;TN`穻ЙnvCgf:3BF2 !T#P(UvR;ҩ}sjS%gf8?3;df̬TL&U*jI `R7;39C3yf6fߓQfsfF;lN4Rpiq)U*\JݜhDәZ R7'2cJp-ЩBͣhfl6;YmvΌ *usl `fuLl WDәٜhʌh:h:Udf93Ծ9?O5D?2DMD=5Q5Q5QDCDADADA QQQQe[DLMMmm[3Q5e[3QDL&U*jI `R0TL&U3*I ``R0TLf&U*IL5 `R0TL&U*jI `R0S 0TL橺I5Ymk2#TjTI]Q%3mMf*S;Ub1S~5TN`'ujfgfvRW Q3CTfV QDM5D RQTAT *uʌl(U@J]mffu̬vCvCόRW̬vCnN4efuRFGj{TN`'UHS5š)3ifvj)3=H)u)3šT#in)3šifv{kRW{̬H3cJ]~`(zhhhFBBB'& & & & h(((zhhhJT!P(U4*J R@S@BT!Ph(U*JM5 R@BT!T#P(U*jJ R@S@BT!P(U4*J R@BT!S;Te`ɥ̬TRKYmv2Sv QY!*3TAT QY!*3]jۥTQ FYhfv0 FY(3TQj7\zTAT *uvNY2#J]kfv \p(RW \p53;peF*JpM5p R\TW \p53;pef̬ffR\HY2yRaSw ̊a63;eFbXfV cXa?aaaaaaaaaaaaaaaaaaaaaaaavvjgX0ΰS;N ;3,Uvjgةav N ;3ΰTaةavvjgX0ΰS;N Kvjgةa°S;N ;3ΰTaةav* ;3ΰS;æ&Ծ:uC3ՙJZV&MT<4??4??4?usn(3S;Nv6Fg K~n(S?;>c'UsjΩ} tj `N9 `Q?阹f;k\`'3(+k֜ZYCš%IS;`NSTٿA7z}_ΚS;kNI֜Ysj<~j̩d*OTԊS;?>Bw[sVgf7tfTٿP#*Wx\0Yt JN]~`(((yddd䉆'J& J& J& J& Jh(((((((yddd䉊TAI$UP2P*(I JR%S %TAId$UP*(IL5 JR%TATCI$UP*(j(I JR%S %TAI$UP2P*(I JJR%TASw3 `2Lf0S 0Йf7nlvCgf:3}7jJnnԾ:u:3PfV3 nRK¥TTRp)URf'Uw8X33ƚͶkR7ۚmͩm͙lkΌ`'U3U70 `RWYkR5šƚTaMf[sf;+j[sf6ۚ3֜Ͷ&3m͙ۚSԾI(3(3ԾI]ef/sf^kffǚkR7{3d"o(zhhhFBBB'& & & & h(((zhhhJT!P(U4*J R@S@BT!Ph(U*JM5 R@BT!T#P(U*jJ R@S@BT!P(U4*J R@BT!SL%Ч+fF3հNfVɌlkڶ&U5IL5 JR+&U1ՠ*H]A#3+hYA#3+hdF1ՠ*Hh 44R+ff#fVqټhfVC3bMf5yG3bMfd[Zb#sV+ZefE*3+ZefERVBTTU*Uhdf{fv3z䝙#̬h53J]!*3QWnzAxfVjchmRec*0J]mff1ʌp)Uz}{|FCT *U*J]mffx<3TAT jnߓUxfVgfj7 O1p7OPj743PfQTATCT QGdDA QQQQO4DMDMDMD=5Q5Q5Q5"tZ& & hX:^Y^?F!Z!v/;z*i7 U9ll@ppˇ%@V÷$'c|Ű`df3'З*K R}S }TA_o/UЗ*KM5 R}TATC_/UЗ*jK R}S }TA_/U7З*K R}TAUˌR0f݇[!jK.3TfwSm?*T![d{z=<_G^j{TYglf23YfgS gTYl,Up*8K2#oO3y -ތO݂R_Jݾ-/*BhZo~kưTaXh?53{o1,U*[TWwo Kffϰs߸/_g!:TّS8㭙m2#8KWq?u>{Yh53 Wfg7?K@b r-& {%K!7Q C.\br={%N 7##e\brr,ߜ%9[תp 2#Zת=VjTת=VjTת=VjTת=VjU{p VjU{p VjU{p VjU{pڃ+UjU{pڃ+UjU{pڃk \kת}ښkJp:ךkJpڃk\N\kf5Ӄk\U{p:ך+3mؚkLfzp VjU{p VjU'Z3 03:@LN4P3 g:ٚqg3c8[u53ٚqjJת=V\kZת=R{p°Uת=V+3LZuB53UfFZ3=VʭI jf°53llݎNJVwd [u°̌fzVwdBUGvu& xMIZMZMZ]h5Qh5Qh5QhuEDDDDrpipipƥ¥¥¥+*RK'R@BT!Ph(U*JM5 R@BFT!P(U*jJ R@S@BT!Ph(U*J R@BT!T#P(U*@hfF0D5#0j0J(3 Ԍh(U`*0J<9y@U''jfrfF'RKqiff\̈Kq)3¥ƥTRp)U4ո*\J.NNP303:y@LNP3R\ Rjijf˥m3V RF fF ԪTQ(urBfF'QjB Ԍ`'urB jfrBNNP30cI}xb'urBfF'N`'U3հ:Ώag`犆o5% v& vhؙ(ؙ(ؙ(عag`g`g`g`犆+v& v& v& vI vR;S ;TN`'U3հ*I vvR;TTN`'U*IL5 vR;TN`'U3հ*I vR;S ;TN`ga'U*I\UI}00L5>8Lf0S 0TL03f{f댰fgmvR*OP{*3Ty:Pi򨂒TAIjϨ2woIn33dfDoA:oŌ*n7;[U2#TI~X[}u ;;@U `Re3ը*TITW3dF*Ipg6kRWOQ%3#dfaQw-oڿi|ooâX33=kU}|ooa'uߗ@D ;;?U`犆+v& v& v& v& vhؙ(ؙ(ؙ(عag`g`g`犊TN`'U3հ*I vR;S ;TN`ga'U*IL5 vR;TTN`'U*ؙjI vR;S ;TN`'U3հ*I vvR;TU;Ѷ&3#dF3հ:dfv>f& U3f6;Ia'3NfFmv2#\Jmv23lf'3NfQS Q-o{R[DJD RG[̌@33UfFh hfl :UfVp 2#J-Pl(U`*0JmfƸr'gJmfh*JZ(u2#JDhl Rh hff̈V*3Bhfl *[Q:̶@D(U@S F (DQbFo?Q`(QbF={%0(0Ja(DQbF=&VajU{ VajU{(U`jU{(U`jU{(U`jU{hFU{hFU{hFU{hF0JhF0JhF0:{{L^3њ jJD: LToVaj U@Z%УUNlvVdf&̌6;kfY3fg%fY@k̪-`k>lQLJOƚ݊=`יl2#Yu f0; `f7Tov7P:BU{R;U{֬R0Y̪=`Vl2L `V[iXnf~ jJSeSSeoiG] UV@-6@6@lXӾlVms+5IYs̰eؙ(عag`g`g`犗{8KLL\Ѱ3Q3Q3Q3QsEDDD ;;;;WT vR;TN`'U*ؙjI vR;S ;TN`ga'U*I vvR;TTN`'U*ؙjI vR;TN`'U3հ*I vj[U-Ъ#df``RG0L5 `R0TL&U*jI`ff̌'v-NkI&3#d7_|f扽ב̪š~/0ewcM:ϰٰ~'Xu5ִ[aI\)<}[֔ۨI2{Tˬ*(In2g;;l 0^FcM&UX*Iݲj2 k?cM&ˤLf/Ӿ^݊=v?vYusvNnw{v+d/jYˬ`^}YU**{UGTqaU& UhT(T(T(TQekOL\Ѩ2Q2Q2Q2QrEDDD****WT UR*BFTJP%U*TjTI UR*S*BTJPeQ%U*TI UUR*BTTJP%U*TjTI UR*BFTJP%U2ը*TI U:df̈5&3šƚk23bMf5S5šTaMf&UX*I֤ kkR5#dfĚ&3#dF2f#dFv-k:۵dFP*(Iqf@lגѮ%3]KfF1v- J:ܵdfkɌ$UP*(j(I JR@Ƞgc(I>g(I JR%]v- JR%SG֬AI(p[1dfɌ$ |80 JR%,ԏ d)JJRG(u %%W4LLL\P2QP2DA %%%%%W4LLL\P2QP2QP2QPrEEI$UP*(j(I JR%TAI$UP2P*(I JJR%TAId$UP*(IL5 JR%TAI$UP*(j(I JR%S %TAI䪺?IIA#3423FfS TF@cA#U*Hh 44R#hdfA#3#hdf?ɌclJ2#(ILHjˏ`pfFS{#Re1*pGpWU>`U0*jGa埣a\`܊qqqq+% % % ƭh(*V4KKK[0.Q0.Q0.Q0nE8`U0*jG Q㨂qqT8`U0.0*G ƥQ㨂qT8`\aU0*GK5 Q㨂qcHCU*jF` QR بlT6;TA3hǐю!3llю!3CfR 㨂qT8`\aU0*G ƥQ㨂qT 3AfFpnj  2#{T!T 23;fRGR3bA>j|U7(3#G[u*53z23BԖr+Zߊ _ÿ|!EC[I񨂇TCamR „TaBX1!3!H?jA,r^eGK#cF8*GK9oo3pfFR3-봤B?RG}'k(cccƏ+?& ?& ?&~DW4~L~L~L~\Q*H~ ??RTGc#U*H~L5~ ?RƏTG#U*jH~ ?RSTGc#U*H~ ??RTTG#U*#U*;{T٣ ))Reg*;{TaTcB0!U*LjLH& R „ƄTaB0!U0vG3B3cfĎvL1#;{T٣T٣U8:ˌ!unj UoU٣U*;{TK=QبQ[`Ɣݨf0*G QG;{a3=fF;{̌v23cFvyT3#cF:zc.37fG>荹1. UvS z#(G1cǸD8bq=% {#G1b\`8bq={#hWǸ=U1*WǸ=U1jqT=U1jqT=U1jqT=U1jqU{ U1jqU{ U1jqU{ U1jqU{cU0jqU{cU0jqU{:ymffopW=QpW=QpW=QpW=U*pW=U*pW=m LqLqU{Ɲ8L}539S_pWã U]DW%gpWur9{xqg=ڃ` UwW߭ U9jyU{Ϋ<ξW3n]~j[Gݺ=U٭jnOv;ݪuU:nξgvnN㘑V٭f_n3r(DWuDto4FtBt+% % % ѭhD(D(D(D]]]]݊?VEV4KKK[Q*DG ѥQBtT!:]U*DGK5 QBtFtT!:U*DjDG QRBtT!:]U*DG ѥQBtT!T#:U˥ھ\Ua753ynѥQ'o׭ukF8/8*GΣ QyTf&{JRG(Ɍ$L}$H͌PAI%dfd#U:GdP:GJdL&U*I#23Lf0T6akR' R3afyX3ÚN6kfyȌlV7UGؙaRê!X:be\ƚš+k& k& k& kh(((ffffƚo=$% k& kh(((&UX*IL5֤ kR5šTaTcM&UX*jI֤ kR5S5šTaM&UX3X*I֤ kkR5šTaTcM&UX*IL5֤ kR5šƚTaM&UX3ƚTaM5&3šƚk23bMf5S5šTaMf&UX*I֤ kkR5#dfĚ&3#deͣ>"[1cMfFLªN6`R'g,k2#3䌅5L:Oy:9a`R0Wݰf&g7L539!3֌&eͿ܊ 1&UX*TL&U:9!37T׌&U*jTJl`R7(i=J?JiQr;mMlk΄X33!L539"33!֌&U:9!3ƚk~_k& kh(((fffƚšššš+k& k&iDa5555WT֤ kR5šƚTaM&UX*jI֤ kR5S5šTaMf&UX*I֤ kkR5šTaTcM&UX*jI֤ kR5šƚTaM&UX3X*I֤ kI֤Xk2#jI&3#dFX3X*I֤ kkR5šTaMf&UX:bMfFk23bMf5joߦ۷OZ?U2#TI]K%bFP2UΥX?bUyK6uD1RnI?3BoԦnIBgc#U*ۏff R „|Rff|l31yl}CI$U:GfFȌDR؉|8f'nDRe'*;)ffF)RjxHŃ> =& {<$xH0Q!Cb={<$x(xH!DCb=&VjU{< VjU{f&vVa.mؙ(عag`g`g`犆+v& v& v& v& vhؙ(ؙ(ؙ(ع?>DD;TN`ga'U*I vvR;TTN`'U*ؙjI vR[?M t0J RFTF?מK?9CT *U5*JD RQGdf65#J?Ҧj6UQS QGT?Ҧh(U`*0JM5 RFTTQ(ѣZU>Ҧj6U'窬'XFfaבɪsU֌fojFXOV&3?Yߟ*(Idfd䜒5#Hߒ:;dL)Y3[ 4RMIkj%w`HSG#w0:$3FTJP%U:̨U23JfFTU2#TI UΨU2ě?)Lf#xjf<53fffɌ&o`R %#= %%W4LLL\P2QP2QP2QPrECDADADADA %%%%W4L|Q2QP2QPrEEI$UP*(j(I JR%TAI$UP2P*(I JJR%T ?&U*HhL5h 4R3hdf4RTF@#U1ՠ*Hhq F@#U*ИjHh 4RS TF@cA#U*Hh 44RTTF@#ǔ133hdɇ#T42#HhN>gfS TFjT#ERN>;;3H"3Ol4> F@c%l)RjLH&ʖ"USBT?uy̌>Nf1VX?#UXU*DGK}vL>fd*GKa3#csՖݪg\WJN>f&q͌un_;[ۊnnnn+% % % h((((춢[[[ۊnn=% Fv QRݨnTa7U-؍*Fv QݨnTaTc7U؍*FvK5v QݨnnTa7U-L7>SҨBiTT4PU(*jFJ QϫcT4̌̌[U؍*FvK5v QݨnTaTc7ugfFo|̴p#o|;]QGo|ffrŚy33C33z;431<͌!UW}DL͌͌#R „83GH:9#3TFfѾg3TAI$UP:9#3}Df%9|̌X3šTaMf|539cL>Nf;92#s:z43N339#3s?֌p)U6yjJc*J bK[('Њ-Vl bKĞ@+Z%Њ-Vl hŖ@+Z%PbO[hůBGm -%Ъ=%УzԖ@h՞@Q[=jKU{=jKGm -V -%УzԖ@?jfvcң\zԖK\zԖKrQ[.:R _d6T?U:8bRnj uA,(RXAj U{;j|Gm9糖s7 QR |߽upÚ3s3s3s䜇nj"UHڒb99!E"UH1H*HRMX3s3ԖBcU#E/"#D!W4RLRLRLR\H1QH1QH1QH1QHqE#D!D!D!WTR )RBFT!E"UH*jHR )RSBT!Eb"UH*HR633dF*H~L5~ ?R[~=J6!3mBf5šTaTcM&UX*jI֤ \uMȌ(U MHL5֤6!U BFTJP%U2ը*TI UR*S*BT&6amRe:"EfFۄm24>|F@clFh& ))RB'Hy}GRHU U/Ր*G}NAE>h/3>f@-. U*pGK 2#pG ܥQwTL]@`U0*jGak(a\`\`\`܊qqqq+% % % % ƭh(((a\`\`\`܊qT8`U0.0*G QR 㨂qT8`\aU0*GK5 Q㨂qTK>U*jF`~URm*}T0@U , *F Q¨GZU[T-Up+p*Eܢ nnQ[TT-Up*EJ5ܢ nQ[[T-}پ3}9fX=cw0ۗcf/njVUp*Ee娣72#EZUq*Eܢ nQR [T-h-3m7f¨aT߁UJ23vcfhۍѶ[ffnQͨfm7fFnQͨffTA3u햙ٶ3lT6[ulFcF-Q6bll؈={`K`#F쁍D6bl؈=% {`#F-рjlU{`UjlU{`[بlU{`[بlU{`[بlU{`[تF`[تF`[[L6ؘmdfz]wU{]wU{:`'>S7#_WG> _WG> _WG> _WG=QWG=QWu|53`cfV3 jO[lU'l5oU푏*WG=UχGΫ:Ἒ9|x1:9^L·W3=Vjfr>f-:lUjU{<]՞ LXgª}9fFr5ӟj>UvW缪1#ë:فW<Ӏ3=U娲/W缪syUk(___ߊFBBB+% % % % h(((___ߊJT?U/*G QRBT?_U*GK5 QBTT?U*jGuU:Uw QBtFtT!:U.Ո*DGwunTa7y539w^ѥQ'ΫɹjF8/8*GΣ QyT Uvj;{T٣0ڲQ[`? vK1ӲQبO;0`Kae0^QG;{Q m3u[1lg3Btۀ1 QwwT;Q訣v=Qeg/v-?6[Q[J;jfQU(-uhguF1#G2cDG#D!V4KKK[ш.Q.Q.Q.QnE#D!D!D!VT QBtFtT!:U*DjDG QRBtT!:]U*DG ѥQBtT!T#:U*DjDG QBtFtT!:U.Ո*DG È*DG13cF8/8:cfnj_U*GK5 QBTT?uh/3>fF}̌H!~3>fd*И:cFB; 3-?ڟr١}gPaEɿ|'3ц 3TUn2#I]@>[CI %OTAIjm4 `R0:1dF*ILmo6T`mw v>vR;Swi|`~'Amf@Sgb|=% {#G/Q#G>b|={#ȗ(G쑏#GDC=U푯j|TA=U푯j|U{ U푯j|U{ U푯j|U{ U푯j|UŪ=QewjwU{UjwUŪ"UvUŪbͨfU{4ڣYͨfU{4.VwS ªV=U!*V=U!*V=U!*V=U!jaT=UdǐA=U LfTy+rU'oE߁|Fp՞ǪoE|fZף7( 5ԯ39 3qU'W3=UwSgof L Xuf暙`3#̂U =QتV=QتV=U3#`تV6[تVuľX335c\B53y3sL5_՞Go@r W4LLL\@0Q@0Q@0Q@pEDDDD W4LLL\QA* H RTA` U@* HL5 RTA U@* j H RS TA` U@* H RTTA U@* U@* H RTTA U@* j H RTAjWߌQ#cF/Ր*G!3#ˌ!U*G!3# !3#cf|1䣎A> ߪCcf|Qݺ~3cfEW3yY1 Q7o7o U@* HN>T2# H >f „ 23AfF Ȍ u1@23@A U@0UvV4KKK[/Q/Q/QoEDDDDV4KKK[Q*G QBT?_U*GK5 QBFT?U*jG QRBT?_U*G QBTT?U*U:9aLcX3„Ƅy kfrÚRL5R )RBFT!E"UH*jHRv fftÚǰfFTɌPe<539aoڿ::a`R'1y kk/U[ʣo:9 3ƏkF*j GR )RSU:9/ 3ƄTaB伀5#=cB0!U:9/ 3֌0!u)S~S3s֌"UH*::`L!X3sLK:ۀFmUWykF*LH&L5&r(cDa    W4&L&L&L&\ј0Q0Q0Q0QpEcDaDaDa    WT& R „ƄTaB0!U*LjLH& R S „TaB0a1!U*LH& R „TaTcB0!U*LjLH& R „ƄTaB0!U0՘*LH& LH&2#LjLH1!3#&dF0՘*LH& R „TaB0a1!U*Tjf&5R3B)fH*H"3B3RdFH*HRH133RdFH:"EfF)2#HR )H)23"EfFȌb"UH*HbffȌ"UH*jH F=)& ){R$HI1QHؓ"'EbOBĞ=){R$(HIؓ"'D!EbOĞ=)&)VIjOU{R )VIjOU{Rړ"UHjOU{Rړ"UHjOU{Rړ"UHjOU{Rړb՞BU{Rړb՞BU{Rړb՞BU{Rړb՞HRړb՞HRړb՞jX'ŪR )LOT!ŪR )LOT!Ū=)VIjOT!Ū-)6=46U{~ ?VdKf&[̌f&TY3~K:RɖbTYRkGɪ-ŚPeTISe՞*Nʪ[<1AʹT `b-Uq$r 0I=Ǫc%g7 ?Vjvê=4R{h *Gq^fF{5#G do`R Q'5#GKo{挅33י 23uZ~iQruvb_g+`& `& `& `h(((ffff+`& `& `& `I `R0S 0TL&U3*I ``R0TTL&U*IL5 `R0TL&U3*I `R0S 0TLf&U*I\U*I&3#dF3*I ``R0TTL&U*IL5 `R03df̌`ff߶\uA,5#3dF6ۖN>fd0v H< RGxȌ!ON#[1~dfȌl?RSgo/fF:hdfh13FfF̴(3zrf 0#dF*ۏ&3T~c %$3JfP*(I JJR%TAIh133dFP*(IL5PhFcL53z33Gf%3df̌m?ffȌ&UfMYUR'TywJbOBĞ*=U{L$TI쩒SeP%JbOĞ*=U& U{$TI2QS%JbOFU{Se՞*BU{Se՞*TISe՞*TISe՞*TISe՞*TYJPe՞*TYJPe՞*TYJPe՞*TYʪ=UR*TYʪ=UR*TYʪ=UUV*kfB5S%U*kfB5S%UjOU{S%UjOU{Se՞*BU{:ʚP%3# Udf3!RGTY3*TIQeTYuB53~~:BɚdUMI@c 4LU[h~)Yu5CcɦdL6%dRc\Tƪ=4VjTƪ=4VjU'ۏ̌fzhCcU7IWIdh:h~jU{q#}Qr''׌ORG̴T[!ILINd#U*H~L5~ ?R-?nM6% JR%S %)I~ ?P͌*HhL-)U$M7IF#U6GQGp} % ܭhp(p(p(p]]]݊wwwww+% % % ܭhp(p(p(pU*pGK5 QwTT;U*pjpG QR wT;U.*pG ܥQwTT;U*pGK5 QwwT;UnU;uw̌T;3wwT;U.*pG QR w1313;fRgp ܥ;2#pjpG Q'ŒmRGDnjU WUwT QR بlT6Q1v Q[v>R{FtT!:lR' )D=qU8*:ȕ|J͌L|:BFT?ǔ>Ff „TaTcB /{&L&$LH왐3a0!gBbτĞ  ={&$LH0Q3!gBbτ„Ğ ={&L4&3a՞ LH&3a՞ LXgB0a՞ LXgB0a՞ LXgB0a՞ LXgª=R LXgª=R LXgª=R LXgª=V홐*LXgª=V홐*LXgª=V0՘jτU'LX3& „U'LX3& „U{&3a՞ „U{&3a՞ LH&3a ̄ 1aLf7W阙̄ kgª=RGLX3=V0aLfz& V홰jτU'LȌ0a LτU{&L5&3a՞ LXgB0a՞ LXu„LVwLH1aLXgª=V0!37L˄z53Cf'xX3=VjkVA* X=V 3# XA`]@@0Q@pEDDD W4LLLL\@0Q@0Q@0Q@pEDDDTA` U@* H RTTA U@* j H RTA U@0@* H RTA` U@* HL5 R*R#dfRG L5 RTA U@* j H@ff̌@`{23Af3dF@:AfF L ^fFR3QuFИFh 4=| ׌$UP*(:ٞݰ 0#̌9VNkm"W `R0#hϱf=Ǫo:G#U1uƏ̌bJR[ J\jfQ.53bXaM&UX3XڲoNw/k]3Pׯ?____ב2r{:2}w}~^ F/&^Gߟ}y<~ F.q~\~ F/n^G}s[mŽIof׏ߦ7;Y3r;;K^꽙ܧ/ToofVfvpy0x}ܯ~O Wߗof?ofVo/nf_ 7__ɗu=F^gW?'_Qܯ^.p3;_|8:_}}?NW_]Woøܯ?.q3;_}]n}~߯o߯.^q{|{~uq/~ߞ_]tgbw?W/?'ߞ_],qEʿno?Hlz;yVvxBowÓ~߷Ã^ny|y\>'??'? e~>?'w?._?._˅nfkyr~{;ϻ!?O_U]^G{3 Jw{gm~/Y\^3ק/.7C^˾7'_wNZyGˁھ~ŌˋÃe:q=_/*8^zfͮa67zfs~a6"vu?zf]/l|6.yͮa6q~7^lF 0zk]/wRʋ?eٌ~\^xgJ?Aۍ]yntOG7~W]ivˆz|ogc7glg.vvmg׻w=>f_^z;^v?ܷezšb7@] p~CdBٯz!j7^uqή]6^/lo;yWڸJqK=XnߎGvE*o׋. ]6^rv1ՃW=dzeZvxyh;^tټ>Zgؼ2~krzWEzevxyw;q9~ep>9vp>9vmp>9~,pjzZ{kv*un}r ku3ɱ7woξ.k/u1}?悚~ȧ/vz]pLi'q{1}Χuju1}ΧTw;.8t_s6 j1O]~c!O\c!O u1樂Inr.|^ vcOkvz]pLi>b.|~=s;.84~vz]pLizvz]pLizN s%5\%#<\|9wGX\p.a]r=NGrq+NpwuW8ama]r=G:=rW8QK#4Ws8_~ p::e%#<^twwuW?㻽B.9xN\r=G8=rW8%#<\tgow\r 'o wGX\p֮%#<\|ӣ0\p8GxHa]r=Gx?Nz+y٘;ºz+. #|+W8PKGx\r=GSa]r= zwuq #3]a]r=NGX]a]r=NG:?p\r #sW8y}wuW8}wuW8wGxkp>8\p>Źz+}ξ;ºz+rϻ;-+$I#KGxWz+. #}z(W8P%#<\| %#<\|%#<\tu+W8am%a]r=Gx;=sW8P%#<\|Xa]r=B> NGX'ºz+NqwuW8a/]a]r=K#<^|C1\p/#a]r=G,a]r=NGx_'B.9x֎%#<\|xwuW8PKGxՋ'\r=ί]a]rok0w\x'. * PK#<^|Cq. #_. #|].|kr/?Ozﴹ8r,;ºz&.|#|s+<PKG8_|6Gx.{wGX\p9,.|#ʻ#KG8_*Xy{\RGhp>願KGxb. #|]v. #<W8岧~wuW8a-_a]r=G<=sW8P%#<\t'/w\r #]v. #|\. #|_. ywuq #><>VwW8_ +KGx~_oK#<^|˲%#<\|ywuW8PKGxϷW8PKGxoUKGx#KGxߗ#KGxN;%\r #sW8PKGx_. #|>pq+z3p>iׄKGx}. #<==W8PKGxo. #|Oz+}Ap: Gxo\r= ˫$oɬOެVV/vXv0/r]rSB/:r9sd1q>=d__wG뱶q/t/t*??79>O(w]=Ԭ^t(r{*ۣ|OҺ;E׫r]t(r{*ۣr{*ۣ r{*^u{Wu} Qn/^e{2wGzQ>U߾%m(F⟇!4X]նeK'!U%<+[ Qq$%Vۅ#)r/TIwyHJԋ~ XY{] *ыkPq$%V~w#HJ +kCőX{ *٫nPq$%UqI5@RbZ8+wbőTW{Xza*QXq$%V *S9 Pq$%V^E#)rR2TI z룅.XY +ۜDRb3HJܽ GRR{Xz*QXq$%V9|") 4TI /~].爤u z7΍Hދ9_ѫr6TIIRai )U<+%V9FTIIR3@RbeIHUlbhVuk")ߟOCI}zV9s2g#X鷓főX+˖Pq$%U˖}ܺ@RbeL8+k6I5]NJ#)\|q$%V^ل#)r&TI#)r}_HJy$%V:tNJ#)r;VIIӿf XY{*G@Rb| )ra> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 370 0 obj << /Length 756 /Filter /FlateDecode >> stream xVKO#1 ϯ; 7n;--CIb;??u`zxsP~qG#DTk @ɓm@y>LUτ/7y{jƕY5aNB/1V[x*0y& 6(?gz gCO⦀1, h TMZ18U'uiԸ|8C웢qNjC&ӧg=2Pգvve \#ώWb9߯k^'2Nd8q"DƉ5˻fI0Ž0Rf{v lUAT,G)#2MY[$_j^r:X '{n<"_Jp!^a $B/ZP̡@ٲ 䣠%(n5BxQNVnYd%Qw+4CsvN8yNv3zmP=kt1_CS>يTfr`Ql4ݹCy9ڗ&> /ExtGState << >>/ColorSpace << /sRGB 375 0 R >>>> /Length 81545 /Filter /FlateDecode >> stream xM$Kn_Kiq#b I0@8jMOq}q$-OFdehRZSI2^3}/_߿u9e??q˯,/{^/ey/:~w_N^z;}=l`z\;' ERt?(?_am¯?їqvz(bC ]>h5t?$䪐PO^]AzMcD$! % cQV:p], e8e,=NIq2,ʖSR+Fp]ס~ߢ>_ruL$24|mVXo>岫˹n˥]z_ryX\s#w{u:s SLϽsnגcXSp,E9z~}c7i QݠntK}>e82$LNx䉍/Ψ0F^Nz}+i)"YS\9ES!1"]bkYsʹNISuuextzi[i]LF$LIlR;7mLh=MYvP5u#G/]y-=KqnK+YXO\ѬIY̑>JW]⺑خ7rPTzPKj:Xۈlr+ϱP9a$',bcRȲsȺخwZTMQqt 19DEF,oDZ̛ۭK "}KF>.}Yrbz=u=hƲ ;gv쵆u#OM:⧖/96.w⒋"ZpQj˗ihRh#\׵O>n똳 b@dixHAD?8n'nZN\G):'A2Yfz2Sk*#XE9. ׍|Ӭ7ϲ>5}9SP1//|w_]lKJyl`JlRpdNt6,6ngk#UP-ZHNx`(E ԍ<5 l{N gi:r]C5@J erbOq,G/]̈tYQ%șV*RZAdɌhE"R3:%EẮBO'0Rڳ#}e(lϲ擇<eZ[,L?ˁ9,Xz’얡Z[4 l׻lS)5R;2kcƃ̈)惘TjTI϶~7Aӄf5>#s>gq=_Q3kP5gsznSu[=&Pqkzߵ ,T3Y`ѕ۳Pi`) WS @5MkcI;:mz9}{6Iu]0#h_ݿuvKZrpF UC8ckni`ӺL_=MKoX%oIXԐA[s+gUv_U)[ fy-.SɉqN[!.w gEg6΃fy\4떼4I$氻_f;e\8`q|2smw9FNl{^n9rXƝ`'[f0G.X nu#^Nz{hmca-%Sjݴcj]rVBuZ$ɬS쾎-OM~e W 7 >WvwIm%O׶en%Swn'Twl [oFɹ-**W90ؤ24CxЇ[hD l{?i2h]mw1Hdo\^]qFX]mgsu-z ;=?KKݚ+呚E˥P5GWcuٕuݒ[/a' v?wsd8M]?x>)o'7M9}I> +| ޅ~$Wmp9yqL I'̺a]pNVR[ftY8%Gk #rZc#Xr.fA-vsEy$BJrp*Ov♲syE^`o(hQs$*$ITD+*4(i.9zzQa?[GV D,* + DBQϖK/[3}lqƸc1HX.&Iy̚qgƤˮ1뺑خg[h{ɉ@|;k91p84 Ք!uыwaOڝ9RRX8zϋm#nqnu*>eZؤT7.6n=۔muJg٪͵|!'+&\k6ͳ.6׺nɭ+炃$>6yzWcgz/Y#{f1oy;\s˙s!Y4c*n tdfy خ<?E>ӜLs^L+b䀺vt?r 9G&#|@ǵJvΧ?{<6֊oK|?W=4)$y oUhIoF*_Ǯ dSۖ-%]|ݦ>͆o ?-ԧiwL~ME?+r.qSUry_nw6pϼ;~| >wߪxL_]rWʯeuVy׆_}%}ݡywd`%ԜY, 谑5^uO||'d{'V+r/ U@f5ǩ;߬ ]͟F[r y~!u~Q;@mqoGUe<W)zҥ>ry0v{6'i#>8<vpm><5~s?Om'[a7ߛ/O why1GA֟xG̓.Uo?rF;]qǽwC$z ~X{ߡEuRbߍ{9oݢ}cߟ~%%tZQZh)-o_2:av?/?ͯ_~s9|yY^`fݗIo_i\C|?$ݏ#%cu$EWX-K|%<]ȡKU`p&T~ ce,/=T?e,z2?ՇqOZ=KT-AX} M۟ ޺̺/mB@n|-}S6bT/[5b~Xc<wOS9?Np]a=[cF}~p}V"*ILDSG*b:Ű6tC nrw0P}bATI=Tj<i.n*~`K.2S"?= %a4pgRRg0M&]SoF;O;O;™/ފ<Ѿ<<(vܤy}؝'z;O}wCNgD}3Dvɾ#),uoϴD~9Hk}}0q(R[$M:0Ԋ}/vZ/8j}jE _ߐx̺C77#0 =R}AIAf ) ܤkp[cemk "#vX aD?q˩fAOs )uԯo,HcUT'! $cX,,JOHSJ=Wy[cN0wcWĨQaRi0Hԁ[b.zuJ6u]J{N-+^9QB-)-Mj+O|<o<ԍv@NNH.`@e)< 991.Րu5]=٤E!M[Em[$SަKM_unҵ*2FқkR=) ş Jma>;M nnhaV/psg)֏wZ7{jhz9zm5|#x%n>uLRB4G&sj]7|պvH;b(K3<<=1#U,. 78qa]NIFH5 8tU*@f96l9D<݆u#OMb/탲̮M-_T~87֘qZs.5/E6u]'i˛s̈oe.q/%B* DޙS%-nġ-/̡NruRP{s{)!nԘt*޶nI<5*sm+cOK}jw;ۺ6%g-%&7۴S LBg1c5Ź]خtx7k[^mLu[rPel͑4Veu l׻<.*nnOK@1&FB-s.<6," VHQHt뷙s˻sPp rM;Ź5feүUخ6#1# EVMjoF7'< Cp鋸ZIQHq7t3p_"q.ZMjnVp+l\\eNdӢnnb38fq뛛\к[R.+c,Ts{QvͨyFr8ϙ܌=c8ϙ<9TɉIИ]pNVR;φQ͆#Nvri^xXPm6Lyv2>+9o9!rk*<3g;Y>j,T &g;gCm2=ߗ"\LGlf]*^ksa;8~C\zBʜzvtM5!D$̇̚q3qp]iNQ7aU_*-wȪPQu$@*%qvȪ#̯w!7ٵ͢ຮZxZsenLkG+“P`j8cX-,ZxrSJWiJ$SyJ8W g/,T%H}Z\N&!O%]y3,zQg$)L%LZKJLmf)̈u$ۇXb(-@xU P"RY7({SY!E!Ẻsre8eu4"Fa9r1L 8e:uzbl> yꞡCJ9n2P[ ^]z8˩d(e{kpIl{9vM>%fhÊ5mm"™by |']j?}HS8[e\՞s&ƹNT: DaF{3;`aHRvx B}Grt1L.{N9PCucj虣slUv =׍vym< [[|2xSOJmw z eW);޲lQF^`'gئhs4b1[mƬYJ8X `]SF6ٳʬug:ףY Ȳk*nkqAZE\){]qYKIop.^]4^&+Z5Yc&{'/=iO9uS[Ml3~k`{}4[) P~k`=(o]7r~WCLh,agذ6^(Jbjdƙˮq躑خ]89z<|/9,q 8.__Tԧ8qF2P'kZj1K~Mݒ;Yn>j8vukR՟rj,29`5R ~0,W}gܚ ;>n͑ajVrC#;Pe͑3Ve}t l|pվ͜ةC(:z`Z}N\jzN-g4u[^Nz?q/mc19ϦF>W{Dž F%[͉m.$ɣjJ}- 'ԆiT'z#t"D}k߻F9LfHFZu[^`sTؒ} ?"+rs"gXJDJJnɭ]QqTk5{̀9,Yj9  {)خaq/0{iC-P`ZKj9zz?@ےpHk&Wݒxݖ k(Qk]I\{-ɋNHv_4lǂ2I+iXB8 U&s-2V$]&-vқgٔhm&s)-LҭT/䥄5UKZ4LӭT\zY=/j?9װ׸x+ߏ9M1XS_- v[t lUÏ'RL}e!KT¾r,ڥmY,IeWuַv;6>}c-7޷9zg`yKfm&0=Gͦ#n6?rBM]͠fS9ziQ$LSڅ˵ی4ALE`$Qve\KIɕ+$!'*O͛2Xet;q ly-6oWz?؋]VYP1;䬄d,{FCJ'є}¸nz{ơ9Ķmơ8ӌqh)Z9lqrpRqhM|SqIr %!Xa.8׍<5]Wzf~uцV،jX۬jZI36gl0Vq\vmqSv_|ODކ=ٔ%͸E-M}AgsQv[FK9ᓜYqQ}=v_^!׾cWi˷Vn,Te-]UCs[ 9zz1P-*vUj!K.^Q=fq]j@@`>c]9ܕT98c5Vsˮ9u#OM+il=5) rE;Kj7rn,!T;Ke+,g)z֧JoxJӼ4.=om?|u[?Xt.}} n5[?]ݯSt[?:d]=|u 7~7Y{9wLq}w=-}A ;_E:QO7Tn}WIHc pۺ=3^~_ɻ%V?xWw{7?-Ygk;]K,7%ksYFZ}0T!ߪ072HI~_ӌo;U񵞺j8FެwR$?棪ז7 w~Pȣ!Vzz+{e2e5ʣvsTP:7o{l>*p>䂚=اuͣ_蒗G '1zt^cVֶA`ļo8}~-ُVzlM?{泑Aä:m?xGq>{ߍSMC5"eυi›?q+G-1G&>eGmOXuz6Nw3L}sSG>ExyV9l+?ߩVxh럨#^{[:JO^XG#mEFwhop_wڇ-J㟾/_~)J~,qVB_^oqp~wcYh|3W;/ {@%i^^ <5=Gߘ4xXxG"Y~ ;"STKױaF񗷛`Ǣ[ ъp>^o2i~`PO}{6↨sYE{n)ѺtJ>yqドmw?uI&j[5|Gi@!`wj څVki_L:*%5ެ^fMvvVoddAe0;5VSdA_ki hk3MpʑE'Fc]VH+SW_D zq!o>zE\,nHsћWy+TdA_IyKo"4^4baKWG86ddqM2&=n4ZN>C]AN_zG:=_)WBW@_go R[ q\ޏ+}6=sds0;5(FKS]Ia~k+HSdd#~2$K|ZOmQdA_y^ jGjc"d1lch/0юmL]y?rfѲE,0hcadU^ K2 Lӯk\:ްJћW +T; ^oLy^A]Ia~X)va~Q .iݦKc~!9McOW0Ok|>3طmil6NDv3MwЗfUj׉TڀkNw hFLg\٣y,LM\cid^>1q1۹Ԝ ]'R:˗;ݢ ,߼o 3\#_?o|}7wխ߯k/sWT`iΖ08G;uZtQǛy[]F_KEӮ[]\0PYCrRשnSW dgL-'MmE_UPdAȦߏ0x8mȋRyniFjGZ9h#1Fʫ$NqүY7[ cY~Cw10]e;5?RL:Q5]?\O # RRx~W$`wW(p2.ɤ0Mj.ۉ'nP|Y|.OHptqڠhŗ?Cԛϋ{rlYy0 #ifQmK2 LGU?NzdY,ö-£㿽&oShm o31ަd0i˰\5Wgaюc[__6Ƣ%(<%tcn;Pq0tw㲪.4 Gڰυ'r,Wzn5vGٷsp? άqTU_3gb{|ߺ?wqnW_d?\WC[(=7u[.Nz?qIy qs .5TQ1a8}0vrzպSR:h_[qu&=OW~'QR~5`znW랧kn˥]iDD{0^V)ww\7hFgRn=ݚ7Ӷqy8{F4Uؤsw Sk麑خw1V#n14DіFl+:i#~+qKYS3:JQru^cO2ʮ>庑WһیlFLJ1*צc-=bDftj\mvw#'dwM[($ 8F="pt垪"t[o6MTt3[a*̨t3R.lQ6p0`1,u#G/޾(^pՋHF.9%| qFª)5[jWJO7w՜%;=C cisdjα\P].Ib !woш,CwCb!/=6GT'Bp]6Qp: yiXzEUkz9zzOoF{1Gh,h5iRF:m+G:V\jJ!p]ig\0EoP)A]n)WB /N 2UtT3])KNKq`Rq[^]Ur6c㘊 TvTS8=u+HVmEnU }%A7SMo@ZISÁ钗%s H+%Dyrs`M]2y8.$z ;=O54G]7?Ct^vRE]C yәom$v-Q@HF >>gؤr0ә*FW 6}z/? N4ǥ;XC~Ȝ5165?]云خt1~c (i3PƧ{yko ?LeW;d^J M҄3L;m'6'c?Mp\O5n%ۓcm:.TM,Tsllq9~M݇9vg'MRwpNY~lgϠP~UNΤ'?cqn׌yCzR=ɺk'/ks5kTJ \䄇X;oQtwfKSJ龕C0Q! ;*R%WA3T8y;ZuJ-YY| f(]EQ^Q!) / XVFdzÃ6ǚy9ͱx_ӹcZs=V*cR`rKU.R9zz}LcЁim`4.  GRu+Uj:Uh#ܤg{uz`mܮ9yLS_^-״ilR^`uʫ3r{aoMѸNm-6aSldC?caq_Pmv?K_4+$3bVqQ^QGVCR"'#3b>1.K͙uJ6u]?_63?ӏorm՟; )t֓i`ZO{B٭'Q7r]̝0%Jm(gnyLemj37X eg+]=őf!ѦIl̅4+[qe+CLdY唸7󗗬STo9ͺ~nA':'jN_Cw38K)cy݃9 X}eΣ 'W=2% PT\-96*+[&ŠOخ3;J#Jovj5ѝPY;,מ@c)K8kaR,Xn=u0s^u0B:9[x׹\)G}w^c+ޥ>Xm|lb(UؤEsd@nh~_n l>[3G/Y܇t}c{Gb~bˮ>溑خm -Ri}3آ[*{CMx 2_ō ѥf6uJfkC ZCi޴P51VCes lrL=9a%۫okpsa겷WN9zmo!jӹ9evtt!, JBtndLהݦsFnM"6WYm:6[AuhLTv7\r)[T7)خ sXd =/r7̑`l ~GtGE6nSJzjwSkb,TwsrP|29zz?2n} 7n?XQ?O(GMP?~r^cwW3ARƝ]e  nKr(s^};F.WzP~A | %{,YqT!>2\9%/M+g-s4`amY c:sa5/욷\7˨).U߽n!B36) {KnKIWR}?9>VOUr\NzWܡ;u}s9]Όt]7tC{J4tC3 jMvk.$PBQ}*Pt\!"ECẺOeFG/Rm%H"5 ר5VT{ds4ev6S7rk*?~˅qh/V[rU+3ypTRvr9zzQa{\h]j:"nDݢuz ;LeFy:87f5 .X&eK l{^nb[,.ԕF)js1韲YZ06XbgUqa jdƙˮq%^Nz*ε3bY%5ΌMj32VˮY[r%7ϲTFlruT&jk2(+a2.29zz,$3 .HRMs{zC~KO``~:LMs; 2h *­H8qQ& Dm!(9 pX `ܦXNjKIgi"}-kfNs}.8Mx|TMX |.8M`N[ ۼ_|F>쿜3FYI`i&I Ke؇sbơ9KR3b6,Wf,T,+qknrxffVy}k5oV,JP֡GOnޯaLɓsXi+ӌ%g`je9r=ke9zz ږs㾿6 BnpSv{/ԍ<5]/2 'מke_-|  UcVLme6k[zam+ч/>Fry BU+z),+V*yjخ3\npNVѠqqbO%8/1]b|p p\j[ ?-OrJ';եmwWڟ[y\ U0G5򵏻}YQx7𻪽7H߱]6 וwǥȺ z֬r{om?[VZ/p zː${To6{kMy¼N38gՓ~OumU~=`-F5Q|P/|ľQ)dT⃁͇-nַ3{nx{zʣ֧|pYӣH`;;7s3|xgm)ߕKFx(=(kڼ~xdo8GA;cesO.JgT$ʢ|FSMC}OoO|~Eo? }`mH̵(O8.Wf|W Zx7IGO w'+zzyn~Fops{n?I.ƶ{bCƍ-nG}cQ-9??jőz?;r$yk%￵G};f'?nLߍ~z9_ZG< OТQ[c_0qL|?^?[]^-mٗ_/ z|yY^aݗYo_XrkH6,o/7/ou~rs:@.c~~2W궟'Z?ѪcWᗟ%֞_gӷ8|]qų$t]q綾OUwvl_D w;ZKN#n[t>@ޖXM, zY&v.Jn뭥öC'/%'VPXG00NɥX0%ɍՓ죗nͳ\@6VueA]buÈUSQ:g%kjB3oʺ;g9͜1Fz'm3NADc1?I-<91+YY7rֳ5zXPWKmLq@zo?5Js8)?X7 '26S?EתrY6>|uNl8Akز}(XSQJdevݒ[/a'cכ>Z}8mCQ_oSDM}cՇ\v1-v{~cɉ~ԇ\_1ct5*Xr>䲫nKIo%1}vTNAnӖFB}[r[tAԍvg;s4G`K?5m~Y.;e,T/h0Vˮu#G/]o۱ˈ@7Gwnu@}[;T}s4~v5]7r~5^ ˆh>T/3B-8.~Pؗ4IW>L=9~tQb?9> Xz,à+egnSJYa?1nqy;uf}X.]m86.[T lכ2k{9 cay,"=AiwkeXO(_Y/粯nSvyMz+<9~P#c>Fd*;kFweK([Nz(llϲMnNzBbq4<1sOvr>}l=mBU+'ƪcyjخ,^mދ\ %9Ѷvϲd l{+k$t+g5^Yv[r%ôb?vh?e2]0jw]u#G/]9qnj8űMj'Ćegu#G/]oh1sdwN]P6bͅo捅*;flS>zkF^`ޟطҜOD܈J|*BU\ibCV\i9zz$ɉR9^ksIrFμjq`b);d l{~/YA ^ڳ^ݍj'g۳PKIϛmv̜|^N9Pv&B+R seǜE.WzBf9k/ɉ>AhrJ~SWbr$Gюv\v9zzY:gxylJ BM+AfٙG̺خFl s!͕")j4NXBns%u[^NzseƹrR|V} Mj؇$EUnj-)XrzN\>AY+ },9DC`z֒خ\_!WO<>'ׇ\XC,y|ny~F^`ޯ|z b?< ~F G 0pȥ%B-C/)MQ/m웃x<{kO^~vy_cY6R8瓲;u[LE}dU-ؤ8؟gQeүU=6^Q.2m`WcsbSv׍X}z>r}h-Sgm?Lrq1jcͷKS*dX"7na9zu_#/#T֑3kd>֑҃i-։iI_mf`!8{l2+خ9%8O&|(SOަfǨr?mA\1}bPZ\XS?x ,;S^Nz ѷs۲ >cy.E0n],;ܖϼc|[GI|3ru b۔GX(ŶqBM:*̲W_u#G/]'7~X3?|8bC|;Z.ؤ;Xk.9׍vU#=W ̜0p~ҿsXo֒_ZcRl&6Nsfg_u#G/]YZqrbX V>)] kō7xbc-8εyjخ4l㖞kCzejsHcH(m[(wNK֩r4Y9c-^v۵FO^BUE*jvٕs l{ڇKu:GV{C|PWC>BEurB]e7({-Bݖz,cL|=n!WTԧ׸gut5cM9ʖlˮ5-vқgYm>98bJ'deP.5U>9SQvrv{)޺zd=DxrSBE=޺Klne|i֍vy.YLN\s8b=^4iq%PQ~ gGdA-v{Kc54ZCSTkl eџʂطvuO}Պ{Zqbϳ,)~icZ,kZLlZ̲_u#G/]ie[/z/x瀯(4*~,^+eCzhخ<{INƟ]㳿_5M* ,NP7rjk/9r`jk,j/ˮyi:ޓۖs\E9XaPXe3XN%0XE.0nɭ.!>VOvfQƊ5e4Ehޢˮ>溑خks9C1js%y,Ypce]v͕9z ;=bm~1G%1/xKLbc5_\7rX_=;>8r_O,W2/(K|B-~nl|*mB1F blRU|)Eٕr l{+X %|γX,滔\X%')aknSvȻ^"?)jψr7cʂ=(+K٢zv_̑w(|7C#Pg_7s廹nr}9DEЖ˿6"s}+eW\云خc\n(wS[8+N1, ,T݊3flc5cʻni`sv3ݒOj]M+elR횣'7V[]]׍v?|Xš7GB=C2=Kj"h},ȭsК1#{d)ZbN U{h!u:7u#G/]yV{/m3Eߺ\bX[`%^Nz?OZ1  9Z[QXK8,1e-GS]O7"e{#Bc@NlQ뜟yۼE/Ӝwg)ε|#*= }M*NzRZ v,9zzϾzՂ%#_=-rB7r`oSvS7r~6Bjڮ9OsK,g_gm>+t9{־{Xb@[bOo`,T}+mQv[n lWv8_ג/Vv̾r8a3'%W"c^+\q9ml5l7+.]E UqQqfsQdޯ֋ڳ,}lЕ5, g=,T{m])= u#OM+_U.ߜ[V|!g,T!c6mQv]7rvv4h Y;c|:c` 3.n|4{}>d|p:㴝eie$cGu3NZr΁~خ+[Z}יܩV] g,9꛶wmK)خ߶Źn6utοBzMؤ9~Fc3e^H׍vg9ǩ,[ƽObt5VԹ݂5llebyj_Ma^{ /~AIKάPsr;j9̮`y)5>Ů36Ey\muቑpb$kr3c>Oq*q]zTخvQ~Kݖb9k`MU>8#dM.Qyj\_=lv%KMyM,w%8&4e_S7rZtXk; e}Vs -KV>nEF=ř}8>S}\C÷0(lckuKn~ZhMs:l9k`j=z U^C`"G/]m}̑DdkT"bPm19kǤxeWຑOw}_*tY劃%*j~sr'7'8 yj^ʦg>ymӠ:4;sVu6gYbnYה9BIYN}9YvɺS=KrBJ>= ڔG.7Pu8˩ckF}4{<%a"rV%,>g*:h˹Cn9zq.}yq.-Fnrv~̝_|cE(r9zz?os4FٓeZi\݌]TX_]u#OM+Ο܋C2)b?r/C㣲TT˽IOa~6^5v|iFΒfyZ|P'XeW|躑zOŇɓ^8V攧-k*D؈n%Ӷ$5k,ux_4K_1Uk0%ZZq l?gw^[;;-7K߇^:C`)|w׍vwơ9Kk9'_9ydB^}ccX3]u#G/]9pmh{\nlRiz/geeN6P7rK#K|бA"Vg U7T7%6{e/$׍v_ݵÏ'm})._>tG~KOuz9zh }$~k9~}b6/;ZX̑m7Ok^p l{6G~דC{=ݴzr֓B ;i>F.WzO|[_3^[[_W7屏7Z4G} ~oZ~?gɹm3m6koI٦C ,1n3F^`Ϝᮁv~g`1cpr@ aXvPv;?C lK3c[s3GfiMyZssPrrj͜p55nknm9zq^{kSS>yҗuV+s8'j7q-? U+s+w O#+h?sRQZ{!]k{ٛ?]?%M:O@|"~E3C[1K\4>vKy-oğ撧_]*+"_c 2uɋo=/}]5>u1ݺQ)~} qq'Z~{PQy= ~ ?PJ'=C]ޭ{&{Jq{4`1u'ގ`2"]F\Ѐ݀&S-zX#q"KUYc]>I7~//x'U ם"VE8Ar(KH]~}%o ]}TCxOwȾ͘%+T]=/QP9Tw;c3)K֘KwKoh1a wt nO|1R[7xɾcd"m fGCCL'C?[[{IO-wz{N]o[RC|{'@)ޣqHGTy<&s"z|@ޛlq}4}<}nbx'ܳ4x?]}cx3z;}؞<߹~~ Mnh\z==l'zT]i5pG#ʹfK~4Ϻ=wxFχOO^T{8X{߷E dw{? Ԁ׫ H=+=CQ8ILn|5ҿvz??1~˺sٗ_/(˨?,/e}Y̿2M`zl_.D1^z/ a[܆ S|7RPZ:ibyHq%8Qkmyj.Vk#}f]y[Ky%8kh[җt]^=8C<}!`j-Sr0ϸ{n'͠N.]Fݒ.#(屋(Pk~՜EvevvZKNn'>) }qkªc򵍵YoR82k'ey{nYJz,0 B'YޱHb9jaJ e練nxiDfmu+vN(~x&ws{a{n}𞳬9zz,#׼Nc߱c[[?3[K~^uuj웣 MmS%ÔuGQ~壀5~rrMlYvYKIo'8I8ɹ.>hQ [cʕ)06)w[R7r~,5^9Kz`Y_]BK0ggϸ_nqb8(m8iicQcEWT1qh'zRƔ7rpn.vQ,.,] '6.T%c'5"QLt9}H߯ ]aq?]|.> yK.t+ne Kl\ov6jl|CCn.EBel<9-.o.qSX̝Lcr+yrxpB*9{ m>qĘG9=t+[KF 6ֆEo.T=ߝƾ^GlXpqjn]s ]^3n,k+;Z׋*WcpR/o5!\W Y/-y 5݊[Ԏ8m_;g DWT_!Φل>!5nTޫf*kmEA?{rv^Z<8-yU.5]Fwʍ\~6g4`Mֈ@mmA -iyGy#/gOx>SCBYU9H۩?J[qwwnvSK~Ch)sle !}A]%θm*otpߕ%8ޗ3Px]K-q?K~*oBǐbKt;_m)!]bK`Ku[Ӗ*oBM^ۖv f7ʶxPFɽH7(,l=@mPS笼 ݊߇X8 H``/%J*KrHR$uW00Of/?76z&6m7n'#vJ{oFwб6~].\,ܦ k✶BSz23Gܗ+;̒3L{:%m-y m~uw/9~u~7|KrOIj{!u-ݨ9η$7eaR+aX{X;$WvBx G-M+< ]O,U?8/r6Pp8nW6WiMVnݗe䴤I*mS,;VjYS, ݊_c9&=ikŇg[Cx-ŇJ}[PÈ3ʜm1{ӇQcy6t+~|29.N 18U}@7)z)d"鎶1TiS..pvԋ8m%|wlMln "[ ch+1f:scq}fqoGoN *}q|얮J;}\V} <[嗹wm7mPe-ϭoGLh9񌸡;t;x9F+H hx.c!i%_ kwjl 9+z x;ېtRl@KJ;c9.u YdحkyuJ{D/]UK93k Vqmb}t*|lv.]=߾F#9ioyoun}7V渟6l׊%g,D7_+f얟'#3F~j#mB6LyަBn-ti}i󲽞sm6F[˾`'|ö`nƞxKe:N}gR!: ](KԡmZ8RRHۨR!3I%%|9st_ ]8.~݊{aνRZOW]knP9NḓI̽[@jw9Ūn>E摴/M<ɩ܃/҅kƱEWtI{1R]Y쭴,uL0|@5;t+|ˆ%Fj%Hտ0xt=3֢k*/e,e0%P@WT΃3~qQ܌}fldkpQic97 -5Y}#nPjcph'҆K/k_pXnz޺/Vޙ ][Bw։cz־y 7־fmغ)mhC|lcB6W-)g|Lng-9%bk*HrS Jtj#FNW{͵/q|Jq[_R\7׾ENLuEڗ8~az+$.p:/,6 Ls{DY"s tJY]v) y# sZX寻[gm>9UJ䌅-_W[Pkɫq}N&9C{cx4]{,Ep&E1|>FF҇{fɯ48P*>m/OBYqv. ioz7rp[q?z ̃X's jFꩦЅksZ+:|<%y).]Cw{"ڥ5khڌUliV.]lӐ۞ЅJ(ά }%Ng]͡~jVu6Pgo;Um rlIݞ6)׃M9>l CW'[5\&ǢfS)۝{.eۑc j8qMJT*s ݊0mUp(oE–J%rI*lUC-VE8>Yd3z\710Ǧr7 ]ꓴPVG9ΌYiM9Pt _.%wد86SveJ[E[tVo~EcJ;c9\z=sdܐ~L>n(9{TW8ޗ;&K;^V!]~C7_q<~.]._\V/|s ōmЅzǿ-|P=os9q#!=9%G0߱#]9q#zLIigIy#ƺ~ {73hcE?oktMMΝ/&?~N]76Ćrve*)|9lr4?IKP0\_%'/z\HgRQ?̗T# Үpoևf-L/9dM|}ױuywo>%sN,䯾odh?o߆6߿}k K?|6xD7E[8zgeD_.C[*%`~Ǘ=my#6~ /(Y ̔K}znNFHͬkvXX!9IjKJsb[4zSY2,s* +X-> tSR?RD‡1k &|+pUΖ 7wYN3ER۴"='> `=Dh+X _ x9@/_Y/5=TD:fjf_(M7LQ!yA5[<.ڻ<]pkT~3ʺ)p-VoaNerIm\z"t3S`Gʨa;ЃQ7m\@Ts%Og᥂5!6AnyuJj+8 4xK*NOW ;CQ #gi4> $ՄO/'Kׅ)c^H-Pw"n0,bz9I5.y"ql5e#͹[E9clUw삗6Kω>.mz2ѠWD<늱>t]uvӫ1 Mo3%Cӥϖ ni?ysc'ﺶ,xɢ69-9'q!3DLŰIl:Tc<: Vڑ4&R{atq9i<{9N Q4'RG^m' MB7(ir{ޒ;.VO?;G<7$ٺ?U𻠊;rB S|,+0Uy#wwMc䜇 TZ~`: Juz@:"R-nݗԋ8mIN~^#c.T֋8m]ig(oBq8m+56 !!t:zj7EHw7*oB>!suһ1~P\Ѕ ؽ {vC'wpr4`bm1 Lo$K Bn;B*8H HigSȇ8;ݛ@uܥϜ-GrLr\`s^\MY i&7i=z2l`ɱ6L&I9K0b(UkдEg5'6 ݠd`Qڒv-nMY|Lq~ҭVo =PY)J.ݓ.9#MVtKO[;=@,=+jBeO[t'()9Э_Ђɩ+ 8k 6m!ǽ\m^ęm1 2  v|,txźӱj"ʎctke\A0b`R>,+-tRâG'R)\vB?*gñ]WyBdW$J'JWT>0]Piy #=҅su>xonN6r*]q|/t(ob}sG3vP 9mݤ_ѥ?v/-n}W/S[=en9,ݷ[mхaqFLíxFy# ~3g-`V1<;P3g"⌑T.?݊gjaEdb)eF^XQeWGR{*nb&:\;.]|wv֡^G҅bc 3<gJ2p}} !O4B#(vpn/K&G%ݤǣHHvpnŨ5JOls֋om z ݠT/w]t^/jG{=r ؽTϤ Us֔eljkByOJ;v-9Э-n96Nb ©9[(Ѕ S7jCPu uw?}?Ц諴7riutJ{7.푼%)֪Z*7}ʥyw)_ok0ae<ĶKv_NPe#2 E~~<|r5~VqM3x*F3fvWYY,.1O=*]wqU*w7rp[qڶlU)8?7jk~'^cJkA]r+oB~59[8ޗdwuv9v]x_Z ݊n[nJ1wdc6/mbCζ5t/q|t}c΍_9ЭucڍY%]ۀCl]b \V<$vq||wl3W=u*pѶحslWޒ^ǜ(_Y_HΙ뛬Vr j7Y#P9 /n}dVO4 ԓu)ڝ_9ԉxt9-_OyB[98>/ژϙ6V`m 9k_B*9cnbΤsNqo-3q<F[cl-36Jx U3 0ǔvϔ0;WG?{{(t]C.#y#W}:yw+>87񩨓sQg{}J*}.qoTJ;}.\V}-PKG?##c.T_.8Cn:)y ;}Yj 1'OO1'ϯǽFUPi3)v97@:w^1'?SN}KZc\5[Zt/Pٷ!];J;F.t+^JVg:qzLuuh*W%K%FKޒ^J >v1|@?.T{zRƔٍ#Һ{qn&7C~.?TzxXo}~/ 0c|b+-ߎ81z_گuC?C鵲ǥE-WTև5 WwAꍗMWT~Kчku_?jz>YL8[w~E]|leޟ]ą7LoE~[=N?r#ujُ켗csYD̻?~ݟ\6z8ýDU*Օ|p"jeڽgۋ.D~]C~u9EsYw\tOPݘ8 O'o?nW?a;L*:De'0'ۊB(}U(a/"pF`'=( }hVڏGXWI 8ӻ?(hZU;]P[/v)?=x6;L~~y#2Ƹ޼C  ]WzҚ'w=5ܦ 5hiXr݅i;} g&%"NXXƀRAYJY3Hfv,";<nelqmÙ Qf;(on]#v{BYk8CKw:Ew%26 sm0j;]hs){<^|khB)O[a _>yKHMa־l۠ܮ5:U޷ ei׾еّQKHw';&"|Ulc,]c-)vLy#w_b.VډwjC6;JX;A6Dڥ7@jw_Jv㏕zBzC]ig(o:M/RlG0KrwV~_^S>ڗ'(_@s].\X8|[g}wo^HmHP^m廓vF.t+nr9ꏉ_j[di'fC>x.Tci>[]1r6Icwfvq=9\>buh e$ & c8;$Xs۞vBkcg9-DqY6[GNB7m:mtژQ]yÅnb̛K/sn6sKyBeto+9Э_p-6N#Xɴ1ކ25Mq!v\aUhA~55/k\+QHl_3JfH9#ի eFǢ톺]ku3?j/0B}_ͩ i[ UF]H(5y#/Xm4#眛QI6.( uPvfܦɡԨgj7B>FmwXnD}Lӭm8_njnui,7#ye-[{ʗ ](K glJ;"oB~o_!玅sjsU.uಧ|nɄnPc5-.F.t+nUܦy[{p7u :WQ ݠf)8[)t׶=^uR\V*V[/L_)kދ.T8GڱVy#[q,?p6Ҷz {vn.SՖJRNyՖԢ TC E,ܜiveZzO41|PyhkZ9Эezb)^)Vt,_&{l8 +/x,.kDLxii5fI4jCWTČcqеNiG8F.pHc~2BX|FCy5[϶J MuJiϥ%v)˲o;&[|ӭDzʿ4|@BYqvINhO=:9ЭUsνCci׻h:m3X)҅Xynfе"mX)9Эl6y!_CvӨj% eiw6yh_3tmTg ݊[}N:P|6^ي6KLQ򹹮@űnm"AEnŭ6fm7S~`s Hrʿ]Hr.t,mp*]ZQkvy"m;&%9{azݠT/w ݊[25s]U[omC˺,Kkek_S׵p)t}/ν[@jwW/۰ڥTփyփySu' z0#D!iϺ^1٦Bc^mKcFθnRjcPҷI}F.~ŭz9 X)ik b+[+*Jq܂K-αRy7\aw7VEFA6ǻmL*q|J;\Vܔ9va 2a~/Tstv E~qgJNbE-v ƪڍCƪ;XUP&lGigJy#ݸs1qO12bl.s1n)ۦ~. ]͵<:'LتnufTy!7&]QvyQYt'ʒSI.\MܲyqFm{fln|k#DB8KđwS)t̸΋ |2/W8BHt>H;E;<ÅnϽKM1%ݘ?#gn%gRGlq7<6|n,Yިsbm~L-܇nPC'خF.t+ne6o%8CK3]Yaj,ݠ,p邕KY9Э|֜Ka>\%< m>xe.>WϚs 0l}qۛjoO)?kպ)PP}It3I-9H]|a\-9k.7Tcfe%2t+g{mvɊ36Sv6Q 6A}uW$S eig>[0S7ffSk[r%݊>^v͍ݧ4X;RiN+ui].yKRpS|B&g<:){!{>C7(gYν9Э,ͭnکBQݬq ;܆dZE`N D-J۩ iyKHM~>^8KkHFrH*㣧t}TڹPy#6\܇ς{iw4sN[ϒn? ](K[6ޖLBמ_7rp[qģĉֿ/MѳJ,KTƣbJxxFHM,hle_tw]p$:fIPgLB-.8s{q6t9#m Xnŭ}LNq>fZ!?8i}TޱgbU0qk}l'y7<0V:>Nv{`upq|-[Ҭs\y#ʲkk$-v-3itr=X_E^.-aӭ0 뷚n/o7_A* ei|Ay#[q?sU>&8R#}i uϳ4I>6NnvG\VmvG,mYnnTqIul)n޶txtm_Nv"ot+nlǮ,ps &ܕ!d# ,ixXv) yS@jeukn63;z;PeNOiufF.t+g׃)ka];UBDqltܡs9Э;O~jߣb/}dmOeع8"2vΕ7rp[q_V=U/]py`z"zun08X#{(2?$ot+nu=Z+?u~[=sKNLJ;9\LpXG}ϴUrߣ\ǽD麗y fW3\quuqq8@_}%՗Ѕuqq|m[Zuq\VOCEz~͉دuݤ>-]|s.;y#{ǜj?C?DžJ?$n$ǔ P3. ݊9C}<@S5$ǔԨX .kQݭUYޱVeЭUn'ܨ[sv 9Q]g56ksݠ֚؍Ak/.FCmPnݯuOٴn(qCb{O9u)p5\W~][r[q?o˸ vOU Zr־\WT m.pU9 u{>vpOVvZ>}lfH*|s:J;(ot+\Tؔ%M!.TgčS {M'˜絔v)\VO^m8% fg7sTmDo^mOvʸH2=Vg]ܨsbnf!߬gI*cx|BPPn2(i:y0[s߹yFHw6V‚1gtוC.,$1LP.,8g.w]v ݊{xfGkjgknڇ7E嚛8n.kj][rp[qkB[h;yR8 ^~lЎԲ쭖S>AeYcv]liM+ll1j|~UNUNS!]f[r[qR}kcm%﮵^ƨEӥI oZbAָcY]#> )b|{EeJ<4tcQn/wm*7Unl}k[[.TkQ1tv޵ ݊7&VK/&{>.TewˌLJ*u w_r]tg\]M_~?Oxҽ+l.OTUһJS7ۮ O].H5}ռ?J^VOUa~y.jzOv/2elu1\lxMJb y"OfDrx7d]ݹsE +=ۜ|];}uNq{ە~':H­DDםb͈[D~9{'[(e=H>\nh}%J>Ttaq*򽯾UF}.V[/'zܡ>nR3y>h.ۖss򘫟P GS " ?H>⢑\OP^fN_ԄlǦDm}'0':X~U3z*tRV`(GNw-io8оnW.E#?u1dqc3{?/= ͯ}YlwЏr][`ͬ9~3\xexվq~}rRpki[En#OۉKD=.ESVzHEՒ׻&O5-]Zcja@}b"T?]sؕ?' n>/  w|y[*:~w~xs?}T{P?o߆6߿}-Cqla >HYh2QW/oенJ8GJ6,*T[ae99&5tҵK5uioڅy#vGBxqBxv#?jY]Q gB P,aݽ.ZkJM^Qm/B}/^h ]A&xx5Kwcok}ű],zIMo~J(cg]t,I-Z m딴sF.t+|3sijCNBWԬ3;վTmcízf"&ҶmhƖxIj7YW׽A>H)-9ЭzY'x,sO[27)lQs&5ڸiڧy#vRʒ,{b6]m^r jH{-7@:w_Ўͮer+v=^օeܱJ)Oe;5tto/BղHRt+殿6,l/su jL4d.K!o6 K0?XIe ,mgҔŶBI*˒iײxޒRӭU;m6YN}qn~0skf& yK.t+;bhƺno6.mmZQշ}GBYշuH&^r"oBZ8a+ce) c%rJtJYݥKY9Эzcep)Bvu=`AX ]B.c%y#W>f'KR~9yu^9P9Lp.Fyvy"m-[;iPزK|=ځSI~n=ttmlVK[{pSsK$u|X/W#{"yzP_7Anp;/[}Ku%hz&U| Sov[@j 7縟#יq9;r5tXsW>C~8UqT+`i'{.T`GU_b`W;.V}YjN%cWbAVtJtήy#W= 5?teq#;T-UACWvt~LݱڊGy#wOs j?ӡ4]}芲k߿q-~[NTq>bu- A?Z$?H遥)#u-9Zr][@:Lw_p|yfDTܟ!?R f%JF<W\gNS/ar,9?aT/̧3B7a..F$~_b}x97<%ǜ]rK*c}xNSSnkIU‰8ߝvPcN$6acp"&c%7m}8_6ҿ5*JhnHҷiWڍ1X/xQqIK[R/- P%n #TT_-18<~sZo%Ѕ()z{Sf8PWo ur;DR.^ ?O-]Rn\v--nKۀg;h&Ac?vlB-y WNvm#oB~eg{%9n9?Zy5zkBX89501FHM^ݵLx=Ƹ /˹!WuC7(" 6=WF[nݽޕ%8}AXԲx_ʲ~*'.XIkŕ,ؤCc [jcDC–"z cHpl_R> fLnݽ ܜ}/mPrI_Ù|co!)^MSn܇K6 զsڼ 5]k_}7@j7ew{qۭF?*g[d)h(ٚK Q֛]Ww(3u}Gv~Mޒu;jcmGm1oZP] (lJWԠ aA]I{q^C.؜Oq̷x8ϙЅV S|Ji|KyKHM^BoNc^W|x6˸w Jqc-#t-mnD.t+&׾'oxn7kw*\BM}.}K'oߏq<~O,3&lWI*˒tβ(oCn⇊:5Gn"~s)]Cq_Rg*C˅u;ܽS8{ߖ}_H*~rZEMڥtpw/nE{:_ۋڡ U8/Ae|!onKc9})vՎ } JvLEd;; ݊F:iscͤ:Eeܟϣ ξbJPe9H]íz9=~]ާ" Xq{m!+*p?ܚT|W+w7VKrP?O|<Bnca8>]K;/{RB^mY79m{ic%tmLo'6i6yV_a>>6yݒ.ݠƌen.F.JF_'n{E ~MC0= /0ict}\W9+QS[~ܯ~2ƻ3}\qv28 =:VebAj~rLmGmM5C{.ݒmIŽpMIۛ.푼i[k7A>Z~tЅ:LO1Qڥ[@j1:C_עዕZ2*08vK7@:w2?*gkwK0mԱj~ UޒZxGRCwkiU!vdTbUx6Ih(_ƪn>J[0MP'DXXF.t+nen=+ ̶$v^WB#B 6m>i)\SެR[XK˾HCj%{,%Fqp)tz5f<}V}̸af̹#s>ϕGk| 37$f\Č%i6#~qy1ϐ ҅JHoX)o v־zܫ-?m Ul}p^-gz־RƉZjo6]m,Em 9m ]q.](E[? wZ8nXNZktҎ%gSN;v3qmK?קWږt?uk\Vܯč:D~%n`-׽CgHQ]Fk ;/7A^Jhk9BmaO{Mr;Xiױ9Hѭ֋J;8İxzQ^tXjٴGv7rpE~^{}7rpn^` m?8)v/タrN- BrZE'2.t+jKř{"6jKTɏ@E-MNu[Ӗ*oԎJTzr.w- \Z~bQP^÷r<&Z/seY]p O闲7w3狍stAEY gBױ*,Nx:}YVOؔsPKIB? j?:uUGvC; E^/gsAs{]\^:}yB±CN~,ln|1C,]=q]| .yK.t+ne-GN䷷q=ʓqUE帕V$tH[-ZƉ3v{L|U6le=&+V@91^$׍=$v9Hѭ9wCͬ7fgcTutY'')oBa)]/`3+ŦЗ$~&])p b3HqI~~]lpk{}f8uh9ul|KPqN68v5tld#oBVY kX.ׂX/W|r_uEE78 ]F덼].\~>=9QIņ=8I7(Yg{RvYUnz0_l8nډCjSZ3#҅J.6M!ot+gwXq!8s({.˪Kl;}.y#W)۶gY9^.ٓ,na]+W厼 ݊WwZߜuRgVGRBb`%>?c/rp[q]pҿҿ3^.TK!.P.RF.t+nu[1{7:-">J[qC[AWӮ*nm0.ohp?y=ޞV8C,НU/{XrcY]KCˍ(Ja%[q?:LNRoE7)ա8^:RYQlvbݔzIN˖ߝPF{LIA^o+]J;Ey#ʲ=yHpl.Ѩ3Ox㚾qYx'za w]'XwO`찼5q\蹂7O^(^Q]5qU/C ~iKH_tO q*&.;,<`VWCVxRU_u/sō;9a~''|>{?~DS3}':G;|'|:tUKx]}\p9vu]tEtO{܈ .2҅] _=sm+_Hi\u<~eqE1W?C)aۺl5-lt5ąӍ ˦%aFU8}QY~䢅~\ŧz шVqk~#'w8HoOGq*qIrM>ĝi}dFT?Th.Fm*ڇc6{?Nhىx-ɯ {{7e|lO|3'Ghmt6Ɵpv|''חFω#דj9/Fpx,6|}Iy h<.yq^ -WT( ::myNi(Ş~i<0XYZim<~pGkDi<ΈFyhE4Dh\bֽ |gi]Q B7H0zT |A`|;X-3<ؖJI7;R# ,a[_Ej~}Dh+X_tVΈ.xKJ2]`Hjs߈u`ʽĸJK5-EkLW~+=䁒瞪+?{?{I qskD&kz$=#Ѿ>%P_p W}snilCuv޸Or(.I Kl)6#{[Π=O ^>)Yiq|*fDl5S.y"<+X_$s8·w7dzod8C~9tE`-Nܺa>+7rpn[ /UQRm`7+!ٲ)l`O YҵYΒLA$;U{ 芲p K>/y#MízHݸiQ9<ġoR[.E(K[3IQn Xi%my\\ݏ/1|x@8ۺ ︸SuЗuBYuG;.+m/9ЭvXK5[; ]B];5C;Ĭi Tr vic| w_mjlmGuB#yt Tʍݒm8vzv)7y]t?]Ǜ9z!XRfڝ~1zЅk8㘺`WFɪXVį4v7J1ڬr잿}La9*1J>C1"otXp,uR)ag3Bv!aW)k[$]PR3{ҥRv|ht=R3 ݊gD{p9B;eAzt;A'a'oB~~apXY#Y@AE΢g]!,bj~u= Ovu=\Yڦ C]] wbe3)bX$tʬx+i+fr_rti'V w6%_a<40:iÃvF_$KNMRb"HWKTH%jnKQbW8- 53bDZι)EDH-LS7t䂷}Ӗ``P[!Ϣ4Ȟ``F=X6CQ7t䂷Bq󕎌T9Džr_TmoX(# Kz$3RUCRN_́ m/yh&l_lx0gLLe;dnёy;~sml )(IC5݃\ (۠\V~_sxWT xAn[v "xxWTcZW<6MБ *wm]vƗY-}uߪ߱\vƗj*;T7trNn:[-;vn; iv/xayJj}e;-EG.xޖY?\etAcHX2_@c1#б:r[~>^(,d)$aDxr!1m)@LsAuCIĘrY\q[]3NC? $^3v/JrvX" ۂ :-v&^2aLeU rӖv4]9n 'D-p/P0;/s7eEG R>iZכΜ'4:Tk}>/v+#)Un[% !W6tH=γ&D_̋/P¸ ^-Tv:r[V[2 ?׹p[G@O>x_POnk'z}cSl+}eݪ+/ ס`B%ˮuV9bajil:x[@Ew;/P +|xl',{y8!iUeW;eJۂXlIt3Ysh6ڡ!V{;0|an+e–Dw;K?ڠ  iRv i[Xܗp+A0_xۖy _80~#Uo[mաc1=iP]x:#Av^AcsU5CǢnn 網ǰ8}o@1>Ze׭w^.x׃]a|\hcuSǔ6@I[/P)e1Ce瘢[~}b9ͷ;ju>풢VʜKױ09P {?zݢ#)Ul>-ㅵ+Ɠhw7JP;0&x]*;ۭEGRxwomslrV-g{ly^m˖gFuCG.r?o5ۘcn56*ۯxJ 90xɏQvɟQ7t䂷ʭXs5CWŲqo} ^bY..uCG.b*3yڮSCr5%gzVvݴa [Z#e#WĬ)ws*ϑacy񋼑k=6~ 㛷TvnRБ *ws* a eEGRxZIY_HL[#@gY?@P/a{tx9 r@r?W\2_8 %a*t6+K8 /!^.W0)c,%ox⛳>)3'r0IJef) SJL%E51v_b*}/PT;IegLFKLρmȏJo ̟%13 =$_-S?;̶\`w\vn_mYVTr`"_^ӧsQ7t䂷v\QGa|cac*#>(Ĵ1N>U7t<=}M1>}xJ10'"e#uCI܊}5K08d1GE9V@Ec:/:Fe͒w|*>\1 ^|..yvcoGu)W+y L[K2c~eSUpyG2T?G>jї+׿S{g}U>(ziɻLt1K~Q3?RG (J>,濯_e AEaع0Nqfըkp:Gvޫ1/T̻?ѩF?y$QExT"yh]ny$"'.7&}:$:(cʼn+ie}Fj+|W}{6ǕI':rK{oȁ {?O=2UlNz_ 9ӑ0jv)߯?O5;vjדܓ6Y{B}3=-͖%ͼMts_ykvNxiڐpd/Ytk O7Grk:D噃R4M,&,9g?Ѓ{nUlIJ?+m#6adn9imW 鷧gW?m&~_~u%vzN֋m~i`|6׭K\gl 靟j->7;\~bT\KNU;_⟯&}?N5?~DΜ%7_N0|?7V!s[ҺTR?ʼ[gᚷv'jn_9jV]qOVm݊^wp88O~r׈'ןlsE\']֓?qI.ynqڴƽͫ^|ݗ-u7uo؆rtli>?Qwouo65=~p~˰6(c1a<Z*;c1 }q\'wߖc`1/O:UsyDwY :1]>en!8J>6T O/tl^A/mSvꆎ\V_0F -" ?_pEwwY@_wϵO;_з|*ml6-¸z"::/P\¸$cC:>t :r[2R1>z^|qA17x2&35MċQnoNUŷ.3C_D.^ +ekX^*۠/#U^0bPߊxbu3^[ё *\9|}Vb J̅4>nג,Q;Qnoii]=Ρ/w/]erUljo/ic__ݶE﮲_T7t䂷~*>s: Cekblp^RvJݢ[*~`|as}Y,ZuWm`Pp]YwF]((*%LKr1/ktu&?:uCG.r/9u;֘ gs\9#f+(Ja|*;JՍˇ\tU޷  &MJun9 },*Rn~gOEEzW"6b;bЗ.YKD-/ t$ʍ\z_ڷ.8/ͥ(B~ OiOeGDMF^J*1R}PbU)^)W% :QvTwDREQ:o](;⢨:r[0~B|5q .7~#3zH:N7rQ=}#࿔}A7}Mh}#UvիnWrR=EmoW·ݿxR[AxK[:r[K<d%| ͱP%>8|b.uovaTl{V~Ŷa ܍n\j gK|ƚCHt {hѯRv졍#UW, +/Mj3'981 /~sOE^f_E,t|,%~kȝo:t Y__ĘOs[?s>/7'Os9XuC_:_d|W?Rk_/4E_e\$6g,=ȸHz(ČEagqAi|{Qދ*;G ru\XK8PY1up rc}YNSkEL}Ws~̡ ^\ƛśDe=Xfr?1{xAu35^X-x2^HLxAuCIF'͌`}%mo޶fAIxIԤߜ‹_LonCRrr'ab-`g+d!. tx $^3v#vrV__8G7,G9>AM.CT{_xӠv6?z[?+3,냼};zHjU^j[Ng_=+(ے&xK[}N?=&n\09wHst^Ay.Q?[(^?w\ꆎ\as.5ge\st;xR\E볈ܹꆎ\VɧW[Q|C߱7w(;1F녪o =$5*3^˟P|N|ҌBǟ( @eg|~#w3Pw;{H:CЉ˝WPƇx'^TvƇy;Bws F?>#Hr f2+(`#efk rm}uqab%$\<БS@../\W1"L{vr?owOLr9R|wlIt34}sꆎ\V!& Oh.QCLC.偯?.H_FrG_ E(^X ~;a>>Tuc2P?,c{D܏+MM}w?G0q+՝+[7 ҳpʣ26|ը;=BD:Sc?PwJ[Ip&W[ ם2UDoܱRȒȢ$}%Gv{PJ\´|¥rhw, >G_J[9Yl.=R}r 8ҭ67<':z8>0 \)ǣ?=dq?0X@O<2}ܢ`<`x8\\EwB-չk?u;"h}bX;?ѱ/?)NӴɏ@5 㘌oyidZd`l󁴹ڦR:%wzm⣊~s?ݳ5v~Y>oY}@Cep,i[ԁ]j{:2]me9>kS{ m&FEFk:>=MjqZr#++tu;~ T?P͕/^t;?f/؜tKm"uimy[Αq5N='?"..m3?_嗧_k46~}Ooo(_~n ^rr}|I.ygy-D3_8nFA\{axni>ūt@߾ūtAW7{ni>ɻ!iR rw/-^V/QUxEtU@ fNj@-t#wߖеGyW/-նh:0^bWG;]%*wߖu.?˒mv۴ &䁎-Z lxsꆎ\VlvfiӐʻN_sC-`KNm=$.7rw.6[|?Ec|ڬx&0??e;e{ݢ#U5ڥyy{}a.mo)u |(wT}:Q7t䂷XiKb.]VR[qy벪lꆎ\Vo<َsj\\Mj[Dg̅h>L=-zH:7rMP1al, <*"x(ct弝7إmr[ߦΡ/w/%/fv&GخV1AGRx/h/UaN@w/Pac~GuCOIo' :|a:&x:MotopSꆎ\VWQnf%q}ۡ2+ fX0Xv_ECPr>Lbigd,&?:> ))z3Surm9mC}my#w0Pm.xږbl.67%. r`[^iĆ?D>3}ٯӱmx#!Pva[t$q_e,[,bΖ t%= vbt!05*{WT7t䂷J1lOg~c&~^y.>uCG.x7:B9W`5`_5/scc=Ҧ5űYtfLd*{Q%vr:vm|ŘC?`)١cAw/]uбCUDIF^bĆ/ ~۟|z-^f$/>=e6N-_ɇyҼ$a<>Җ t3YUmPiKCRr짋%:_BU1?mNoB1a\O:ST%vre!_GN\9#t6O5(s}wU%GБ *woeLU1,c2+۶xrLN0/c.e1ExKajҿ+_^ }[A/ҭfnomבKR=_Ă>ĨzH:7rw/n/WS|vl1g^!osCucq0u^ߑ5F>(⭂ru)=$~mח/mګ {|;j][`F=k+e:r[ٯluھn*qO^lS77n\yq¸/)L*vN\/P¸/)^3Uv:r[~Y/K`&, t%0n_T5b2߮c|۠wހ.a, ^Ǣno{} T^u_X1Klaٷ tEuevхάz@/VwБy;k-Ϭ1[{͏A,xe쭝?KlM%y #ܯޥip=X:&uLc>N׭#u,0'!KEt$ʍ\C/s #/reNހط ^QvK r_Ja|;tssΕo seb)1 \) zHjUuX;['n۫X 6e4N]e2Pv'ڍ1k7mU>/V]۵ }!tSQvC=$;mIۙ|CjJ;L̸'XszU7tok.s]a:_lK_ _ qZd`kޥ-Fu~t䂷}\M'_2W%}WP檄|xEQvUQ7t"WU~[eKA4Of,y:s,@K3)%S*-:r[s%&ȯW#ZngWP݄(ݨ[t䂷zڗ Ʈor-t; #aF^ۏe~:r':OrOqϺo-_ȵ>u~u/_=$ؑ_Q!yDwYPbGa<_ ;/#)U~*0hغ%}#=}^/PF¸#^}TvF:r[~x%*r?0'U_U U$YC(&IWUٹUuCIFXYú"y(S5IXЧn=s KlSc\)k;Бk(O$kU7)}}C};}]MR!V_1o:my\?Ksu0__^Wn//P룺#U_wc0SyNc\wj"t*^^6I9H.xOZ(ab>~߶Z()5_@G%n8v^$.~uo_+c0.tcib챗:zF9n~#wza+~s헵fy!=x_ӾZ* uo[/"}rL|'6$_bGDTcGakF@PCaSvׇVw!҇Ur670vV󫟽gs5?sxlnKkgo8uCIݽZZ%8o^ XX^Q ^kK=٠^ o{|XZ z[G'Й2N,u׉MqB*:NpVWt$X/8)1- 5Ng$a<A*;$ rw1E8[˘\^X,:xc x3ֺ[}.[t N_e~jp;~ùfcu^Aik=ಗ9 !erp u?`9Y+^8';v6ʎsQ7t䂷XzcZr땞@G,;ˍ#uCG.~z Y2cSavC}2/,tC4Nu>.^Uv :r[~&Z~ Շ'O ~h],}XhN\|K'>'Хϊ(xS]I\V_m6ːלBٹfC77!٬0nwsGiy;_{븻ucۂUvqmIt3.NxW) }ޯEQg}lK}oCEs^S>UIr/1 ]n: x mm5!:r[sN%cAoCE[@㱄x=P-r[c/iߖNSHtE﮲_T7t䂷^;&;QNa_r`s"i0WWWe>_ rGٻ+ᅰ{s{]WPף[Ν_{w)='x;>WoaϔT?[~S([3:Bꆎ\V{;,m[)mD:x-¸kn|-h Pi wlꆎ\=}Vv]V8Qa{֠Y/k4:b)xe5joױ?&r~?Dz"  > U7trNqK?RxG?af8 O7O?YO+5~޲2VWE~ӲQ<޾W88P)grw)4wVHo<|>"./=GWǁ2<>*F#n6ZUm[~` ߏ`m{֨xbQsjnu8zݟt;p-E~QE- x|T5ZzxP ;d9E~G%voQDR~_ޯ(."X1ʣ\\{?;ag7l.>pʇubfOt .2XU:=|>n#6+GNJ;Z|fBN]  MΧqEwsS= w~c2x6-}ϏtHf%g>{m=(ƉON;Gܴu2>nlI{ֺƓ>U}u4pathϑf7ӽqrB,&^{ ;!_۱5OLy&?5HZ8pY?J\b-[h;8?͜궬rlv0imi*ƸPwߞ m~6qs~_~u)C~px?}Ers[^-~MU๴WFn~m5f]>;j]?{5ۻ}w7PYZktWެe/[h<8{{K\k{pr@߾ŃA_f눙nCq{<ڲ>Uۋo" p/-'S ނ {ٵ_ny;_WǦ,hjW֫-umY][&644uF=Xayt {@NJc] T%0{Aǜ6NY-v{mgF}s< y#+@VvזB`!.UN\}3-mcρOƠ8o@܏cs `P@ꆎ\Vo}a~5mknNt+(m__xm.Oݢ#U-O}]~K?Y8Y~0`~ꆎ\V_ЇW}oI[-iK-i tUɷ^|G.%uCG.x7m)2Na/Wy#+@i/  @{_u侙+_Ӿ+ϲ_4Ak&~ƿx r8FHbe5 旡xk z綹@e;TEt$k/lkK;=v: mCč+X;~:nDq%1 }1i'w/-եX_:PhqKc { 0{8P˥r,ʶ]V~Etٶ ʶqɚڒcL2*b/ᅭR[^iK+ɯxuWR+7Scc׹BɏE^~(ǨXJo) m~' o>)0}GvrN޷,0x:#2ޗo1Rf/:$U'Rw?s|~yb{T݄ȅ j{oŠ۟2&0VhZQno5 3I .b / ]@S\$hwlSPm#U-o{aKcѩ!J7R=c&mPiwБ *ӏkvŌL?T9kr].n`/А^:|qu+4ţ@"I[tKUn],h0kQז#Mxx,19y#6]!x{ڡ0nK|oWo+w 3Geg*;PuCGF:s|   _:/U>r-Y^E%䁎獄˃r)QvZnoB rt(б:&x]Tvo&*k_k~AY"vN\գ[-.k_="V~)ڂ;庄TxD/WѺD2F?DjYׯ2G}1!^\ׯr ʸk_99 }cі#ɳbcxdn;/cކ^ r?piXs?(?(^æsƹ*;` =$~@x6=+7򋄁L68 de`xnxnݙuCIݭ_lך͟u[qڡng ZuK`8٭guǔb¸-iLq;Әv1 Cax^Ct弝me~_.N`T3fů0z[0>y+ǼR녕x@p|ZuCI?<-Y}pcg!nUwt_a rcuoo,1^sձ^t deױ?'RX/:r[~bWڱ0:ֆSgv:_Rʵca|w+.Uvno~[v(f v3ܣᶵJ;LL%񺝩C =$5*wwCa&=>FC[t?+^Ai¸-Len弝7pa͖=_?kuδb¸-Le>o'w /0f(=C}]-:X0cW[v¢p#wcmZ:[Ryݷ/P1@^vձvz 60C@UDGR~zI1N|hX;xr|Ǹܿƿe]/o6]+o>YY}Po' cߓcZ1s1@G.0\&e]sNj{*sΊ(ŒހK?ɥsϥꆎ\Vɧ8U.K@9V%7HeX[~&eswbO}g}vބ>NU%X317y~JV :1x6*Wnڷ]o&ܯ0U]ţU XyeWߊs*;sy;طÒC3+;N\ /P~3.5f1;b#5z[䕜07#SgkΉ}us|P朄x'.4Vvቷ6JI_ DO e y#x)Qv9Q.x}Zyyћ٥MÚs>w謷9Fn>zS'U7t䂷T^qWAki/Z#1x^q{b/-:r[8w~Wb,a@_K'T1Vce1ҝgzH:l7r?}N0gӠ?9Qs9 e }/I٥[t䂷eL 2A'fWP)|\P&Zl,K~7Aǧ|,KVٓ[~A;d)s0>O1F11՜qEY7 SK(S[t䂷}cQ[OlGGKlk4ԞWVgewvۗm{,dБtkWx>{TW>xg[\cĒWБ *ށ0|[b);Vb1=N/a*7]妡#)U5˜yT:3ČZ_x6Xs8'9 :Uz|XT XN9Ou+]:9ֿyܖͬvӿ'~#Oيt?O/cqR=*q)/g>Yx.E=W?G>Q)ǽ=vP(>%28=.,ɏd((c;ZHw?1~RCL3[>0޺qD7XhjTW>QQj, C)S&?Ipu~aE~Q9wTѧU-Ra=] Q?ֺwdс.XCkQ^ԭ"oUÁeIcmU=u?IナC6Ut'ŹV?ad |'B |F#r<-O6%}O4M>mb:xGv$BM#^E,'>׈nP:[q_ز2*bO'Zğ?w?]5efWo˿/Oא ߟӯ-, }rs ps~ r~wl2kOǵ?8R[׏9So~gu8wo?_7oy>} endstream endobj 377 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 381 0 obj << /Length 1413 /Filter /FlateDecode >> stream xXK6 W(D "%uC$-Ɂ+^Hz7 Aym;]g\L *WoT0J*ZjPQ%D*\-O)JTA)M_Mz>փY3^ժ֦3jgo\^YlmW/Wgf_g NCW+XRgdSJr]\'9UMq׌TS1E*^Aol~d N'in 7FGu H8.Y`%"oJg~x 7HNgI*Y F `y$5Icg(KHRJaD8U2Bh?UT|ͻHvA`=uO+JR<ɩRquF$U<vBd)(:8|D ^ݳƊ4 s0f׭uQ7zZ}ݘǨHoM떓-Cq2x!cȼB܍ߝ $T#yacjk{E  t3WMuQ,#‚nи89㊓J"|M aut#,eU)%\Nsxe[[4@*Rp6Q ~>Fp C!GB\ *9܀_@ht`6_swkoP@)}@"0tD=1B q;?hwL[-lfIkʡ@P[d+CQu| D#^u$./SK i}GWTM!`\v\/Gjiu!P p S`ݪ!Ap\ &xWhJ 8+W M {N?*Mwދ;v''Ʉ>Wx+ggx'*96~\Ж5Wvpϴ  '%'LQ|K Z]A* 2qs~a3hL> /ExtGState << >>/ColorSpace << /sRGB 385 0 R >>>> /Length 88896 /Filter /FlateDecode >> stream xKcْ%ׯQ~CPB6(b_Yj,\X2΅jo矏_?_O|׏>n//ޮ?/7 =o}c׏&ۏc?~oc~|صOc?~=?~=_gn]˟Zٟ?}eǏ?vn?~ٵ]?}{{nO)}_oooݽ?Ϗ_zA? Ǘ>~w}? ޞnooz7M~^w7O_ҟMM/.__}ݧVS/^t{䟷kv~Koߟ??t{ &WMn~{ z_}7=}>?>o~{WM޾ۛO}7y~}~{ znooznoo_&t{{W_}~^xm^oSo߯znooozA7~OS/ۛ&<&oozzSoozoq{{ k秿&?nozov>noz_v>nOt{ zɏۛ&?nozzoMC/_}7=}}>~6t{껽yyǯwq{WM_}ۛ~߿s_}77q{{7}}*o??}ީnO$]?G<޹nwF(7BυJ? 7 U۽K( 4z{{;qJ}B{0iPүABk~{PPB ~^?Za{P~lPkkw=O(uQ55~{';^)~?(*RTQQkN=Z}?_SRoJ}?~yJ?%~?L*}J?^_ߩ )zTyzsq_~?C*}ixxMۧ޿~'o~'o_v(YRk2q{|;q{;R'JGM~^ǟz'?nz'?nN~U ?ngU >ɏ;&,Nާ~'s\'zUX>{Oy~^Y_UJ?N}>ɯ_UfJ^}w?G>;yDGz'?`a_UJ^y@}"w>֟}&Wүk>;y N~~>އ~U)}w?7kˆ?o&Ԕo=o=\{P^ߕkM !S~ޚ+ސ]µ8T]BKȚQ(\u֏w${'om)ekɔߕFcjҌP1qԞQ1BjҌP1>F(4(`}`0 p8`h30 pg[ i4 m4qN50g GC!fS iC|/ q!8`80N3g@e0t m4Cj0N3g ݇`}0tg yaS!=s&T&qr8M4&Hq?Nq?Ξ6=C?Nir8Mǩr8M4=C%s=s?Tr=s=Z{{J{~{{J{{J{~{{J{{J{~{{JZ$~(U~ aQ!tC(%C%t(za~ah J5n4e C`n4 DFQ@`9!!~6믻rs p!N59_`:!=C%~. z롒J~hoӥv*4㼐ڿ]۞ڏf*Zx*UjǩR{.HjVgOǫb=Tb=8Uz*HJhq$CXSzj[>mC%C%C,Dz<ڋǩqd/>8UǩqXS8qXS8]ǑXb=ŇvY8Uǩt{8Uǩ>Nq$Z‡J‡J‡JQMPIPIPIPIC-C%C%C%Z‡J‡J‡J‡Jj * * * ?>T>T>T>T~%|$|$|$PKPIPIPIUϷ$V ?$ v ?JHt ?JH.Gvݣ ؜RKb}*GҜQXQX)eǑXb=NtGb=8Uǩb}.T8UcZz*HXm9  *>Nq$C 8Yn>͏Ӆ}*T8UǑja*aZ}*>Nq$C%_ 8Uǩ>NǑr*T؏ p!NS p!@@!N5q! ؏ӍpN5FqN5F8hGF6h*Bm4TFP \TGP @e4TF6h*Bm4TFP h*2h FP @e4@2h*P @e4TFP h*2TFP @e4jq4'ח$ȜoD9K8*>G%G%G><JݏSD9֫>y4>h`}4xtOC[^V;{g8{ҵW|%]??j}&]B~~Wy~>6zUHGMgWr3r8/oh{bM6gPClk螮WlT[4[HVIN%>N%>NqP$ݓ*~4[8Ֆ8͖8{(*Iݖ8ġ͖8͖8͖8N%>ssh%c**l~T44TƑ|>87N=Duhq$V;TQƩvivivǩb=PPPP/****>b=Tb=Tb=Tb}zzzPPPPPC-C%C%C%ևZJJJJXXXXj***>b=Q'.Gb}U=_u޿Wwϙ+J99J%(U  KQG} gnCX:e=mi9d;A/8%mz9e=GbqCaƑ*vҡPIN:9}*d~QKC%CeZT{ql**ZǑP~|!+4vhqSTQq,CSEu*:Duhq$vQ8UTǩz.TQ8UTǑjQ*Q*Q*Q=Ԣ:T:T:TE5C%C%C%C%ZTJTJTJTjQ*Q*Q*Q*Q=Ԣ:T:T:TzEuDuDuDPPPPPաաաC-C%C%C%ZTVQ=|`)]TRE({TJGx %z ݶ|j[>1VG9t>ն|j[RΩy=JڣTQ$_L8q}+qxj/>NST{8^| jG6ࡲjPـJ(xhSmTq xjgǑr.4_: 2!Tj[ F8h T8-jC 8GP\T7{?=rSmT[ql **Zmq-|j GCN5qN5c[j  T8hGFj4#[TCjTCjS pdjC 2 ԆP@e!Eu!TP@ejC 2 ԆP@e!@ 2*C Bm!TP*C 2!TP@e!@ 2*CP@e!T66__vO2?Pr?JRfS Bi4JE({6G۠4GDAi(4_jRS}lr?JT_j|)Js 1}8{Mǩ8{ڄq?Nq?Ns8ӄ} C? *~~ڏ 8}ՇQ*Q}Շ6Q}SEq>Ns28MTgPC>4QG=C=Z({q#{{hq$~3=hm 4A{&hq#A{6z&]Tz=]m8{Vz&]ӤqtSqt=Ξ6z=RC%R#=R#5T"=R#=RZG{G{JG{GjD{G{JG{G{JG{GjD{G{JG{G{JG{GjD{G{JZE{ݲH(N:Jk`E"5Prt`T9RQQ(N:JRE(Uj'IG"u=R9Gr4Tr4q#9Zh*GT9:NqUxcZgf|f((G6tCt H H H Hj*G͎7)GϤ8͎8UƑj9*9Zh*GDZ  s-R_#]kkhqt5T5T5Jqqqq 27Nq̍Sen*sDZ mǩ7NtG78CSo*~T;NqmS%qI⡖ġġġC-C%C%C%_T8T8T8T8Tx%q$q$q$PKPIPIPI⡖ġġġġC-C?$$$jI*I*I*I<Ԓ8T8T8T8Tx%q$q$q$PKPIPIPI⡖ġ--6GBy*GPXKoAioA٣:9'=Ju JsN:ʞρ͉(U(.GByt(](R(-(-Q[Ƒ|moq$*iNOqio9etIkJؿhwV81-4gӜՎS> 26g:8UǑ~*T8UcZ~*T?Nq$C܏#?8Uǩr?Nt8Uǩr?PPPP/****?r?Tr?Tr?Tr~~~PPPPPC-C%C%C%ZJJJJj***?r?+ȟy\o.K8xsZrvv"C`9E9֫!@qU9'z/`wQCQCQd[z[οN~!~m!!<``e/CC^/;ݷ6_:1?qog:i]Gܿ_)Un>x\EuLs828#?r?Tr?8UsZz%s^vm2q WC Co`}EC8rοWߜ@G !]E58 N5Fvm]a4`h#h5i40g p}i`` p}j`#P@e`T60* . 20*P@e`T60* Bm`TP@e`j 20 P@e`A 20* Bm`TP* 20ۯ]Q1B`P R>Ai& .T4? JP Mo4 J7GC}?92gff:2gff  C=q=q?9gVهCj}0tC?tOC?8n8M4*~~վ8{ڤqۏ{jl֏DuC>tWmq$m6i69"o?j~f~&ۏӤv*;8;=No?ՇQ}ϡf8/gPm֏r$Mٖ*{{{v${({(r{({(J({(r{({(rʇ|ʇ*|ʇ|ʡʇ|ʇ|ʡʇ|ʇ*|ʇ|ʡʇ6g~Cr$ J6_|*JQ/@Eٓ89q9q>JʣT<ʁ$_BUQ:Eٓ8QST_u|)Js`գTQ=DjNq$CS%8Uǩ~ۡV;8Uǩ~.T J8Uǩ~KqS8]Ǒڅ}*Ta qS}j8C-C%C%C%ZJC5C%C%C%C%Z‡J‡J‡Jj * * * * ?>T>T>T~%|$|מC-C%C%C%C%Z‡J‡J‡Jj Z%? %(/%(U" ?Jb ?P~`Cڡ.G9·V TCKQ!@j\J7R TQ!@`q$C܏S8]Ǒr?Nq8Uǩr?NXV8U~*TGr?q܏S~P9&>Ǒr.T8UǑj*Z~*r?Nq$C%_8UǑr? 駨*/{nr?Nq>Nq/ 8U؏caZ}*Ta?Nq$CǑ~*Tq܏S~*TGr~~~PPPPj***?r?Tr?Tr?Tr~~~~PPPPC-C%C%C%C%ZJJJjƂs_/:^e (A:(dzGG}xO ({6G4GDA9(ǰ>9w:H.q q?tC?puG31sNϫ:2gc焿?$/$ǣq ~뇾埯%ݳJ>q|> xχxUTgWUH>(<|tχ|!˫ 8ʇ|ʇ6GB=VW|%~??*~B8/ydǑ$>B=sm28{憾Ay!s{=sC%h=Rmr8{J{h{{=tC=tC =tC=tPC=tC =tC=tC =tC=tPC=tC =tC=tC =tC=tPC=tC =~/(lHbt9ʞ͞9Jg3Gsf3GịT{(͞9JgGQ=sf9=Jq$GC%GC=sj|=]mǩ"5NgS홏SEj=Rm6q,GCqqr=Rs=<A%Sml#A*A;Ԃ6G27ǩiiǩ7{ZmfKG2P =ht}n{f{ *hTA;mmmhXІJІ6ZmslsSmf{fGf{*h4868UƑZmsSenf{fGB9 8C-C%C%C%Z(J(J(J(rrrrP P P P ʡʡʡC-C%C%C%C%Z(J(J(J(PPPPj****v)_vjo;D*_JգT{Qdo;P/mGyT{ۗmGT{QPX})JЎ'2~HJ.vbC]lj8.vn8.6N7Ʃvqd;27T27T27T_jPٯJJ jgh_ۯy!$qďW!x#Gq$C#G✏ٯ╨y!Gy!{աաUTǩz>^bo [߮M/z r/ox*WK^hJJ*޿uߜC9lO䕄9$|WOq9bJvmoJHr)r?!㼐Sy%s[8G6*C Bm!TP\TP@e!T6*C Bm!TP*C 2 ԆP@e!@ 2*CP@e!TпޫC 2 ԆP@e!@ VGjK}XlC`uGiHAه}Xm4[(_GiHAiHAه:JnS}==~y7ܿ_q*4ǩ쯏S2N>N>Ns 8{'|${'{I8oF=c=T=Sf_9def}f} C?^ X26@q>tCqvC>tCvC|>tCYpYidj9e@@q$>u9:e=~=sCYy!s?vgń,4Ӥqt t=tOCt=tOPICt=tOCtjz螮z螮*z螮z螮z螮*z螮z螮*z螮z螮z螮*z螮z螮*z螮z螮z螮*zh?B59;JT:*]_JT:@Iu*]GtX(U.]Gu@@(]ЎR(́,(́,Q̍#Zen*sDZ 27Nq̍Se81-T8UcZenPܡ{J***:5T5T5JqtSk*]TJq,]C%]CtS8]Ƒt 5닖G5T5J8Uc**Z8Uӥk*]TJ8UӥkI*]T:Nq$]C%]C%]vJ8UƑtjZk*]TGukkkPKPIPIPIt t t t tj***:5T5T5TukkkkPKPIPIPIסC-]C%]C%]C%]C%]ZJJJt t t tjZ_Ft})]R(͹(Uо.hGك69w9wNqiN#ǩN# 8U(ǩB9P P P P ʡʡʡ/****ǩ9Nq|98ϡC-C%C%C%C%Z>J>J>J>|||y.T8U>ǩ678/oWshq$CP#e(ǑPPB9NX(J(J(V*]ؤk&]G5JQtҤ(]gOCt=I8UgOCt=Ni5Ni8{DjCH=5H{3xgG=~=~C%~=~Mq_?+I4I|&'q{dq}|{螹A;Ԃ=]&]ӤkICt=tOCt#z螮zhq^IϠJ4ziG=Rm"8/D6t=IZqt=Ni5Ny!]{=]m"8{JG{GjD{G{H=tCH=tCH H=tCH=tPCH=tCH H=tCH=tCH H=tCH=tPCH=tCH H=tCH=tCH H=tCH=tPCH=tCH H= $\" Ev1h A(:JQt})]R(UR(Us^_!糹(Uоs~NQA{.hGكv࿤jNhtAG6 8UƩv.h]t;enhq̍Se8#8{??ʇVI<-*$G9Tysshq^Nq|B>|Ss硖ϡϡU>ǩyWvǟ"Ϗ#*/?]5jv,DzNX‡ x]ǩ~.H؇VaG~hqS}*>Nq^I8UǑj***?r?Tr?Tr?TrE5C%C%C%C%ZJJJj****?r?Tr?Tr?Tr~~~PPPPPC-C%C%C%ZV0ErQ$VR,Jr*_9?G(UR(URKr*Gr*_JT?1/?zaGjS tC@!N5q!NՎ#[*DZr?Nq8UǑ x}vdydPP=TGSxj 8C-C%CxhuL8miGREcZƑ]wDuhSE8աաաUTEu*TQGzhqSEu*4GTGSv*T=Nq$CԎ#=K8UjǩR;NtJ8UjǩR;PKPIPIPIڡڡڡ/****=R;TR;TR;TR{vvvPKPIPIPIPIڡڡڡC-C%C%C%ZjJjJjJjJjj***=R;:=//E(UT"Q=bQ=Pz`գTQR(UTRE(UTREKz*Gz*_JգTQ=JCEv/X#*ǿ@P 8ʡU(ǩB9Nt 8Tǩ9ssPPPP硖ϡϡϡU>sDq|Ss硖ϡϡU>Ǒ|s*H>hq$C%C|S8ϡϡϡU>cG@%q*TIJ8U%q*TIJq$#IZ%qI]it*TI/(({>6 QQQPҜ|χ6|1/.sT|&q|#|h=C%=s3=sC%s3=s37T2=s3&sT{&sdq=ΞW^}8MgO*'MgO]gOC$>I4IG=ݓ&H'{$q?i8Mq$S%q$>4_#{螹6{=sC_Ϡq =I4_9N5T=]=]C%]=]u{{k{{J{k{{k{{J{k{{k{{J{k)NAكv`xHlvz t?=]v:1R'ls4QmnfQH})67J͍;"e戔qtG=R瘮ןlӥkqsǩuK*]4H mi>G79:|q$C|~ PPsqWi>8C%*4gTgӜ}>ՇJ>hw8HT6gBT P=^5/e2NsL8,o?jS}*㼐=N>Ns":dN8Uivqq$CX?T|h}>Nqqsj|@qq# ?>T>T>T~%|$|$|$j‡J‡J‡J‡Jj * * * ?>T>T>T>T~%|$|$|$PKPIPIPIC-C%C%C%Z‡J‡J‡J}oDH¿`T ?$*_JT ?$@I~*GX%(U¿ HQJQ)]R%(UR_Jq$CS%8Uǩ>NqK8Uǩ>NX‡V J8-8-T8U~*HV?~~~ht8Uǩr?PP*T?Nqd[¶2Tgǩ8 2VCjdžjS p!@nS p!N5q^~͇VCj*C B!N58j*Ta 8C-C%C%C%Z؇J؇as:*C 2!TP@ejC 2 ԆP@e!T6*C Bm!TP*C 2 ԆP@e!@ 2*CP@!GnEQ!@VCK!pv같KQfTDFQt(h J5R. DFQ#h죁r#Ch5q#hph5q!Nu >Z8Uǩr?Nt8r t竨r;*@%CPPP8]ǩb=Nu Nq$ևZJVG ,ٳ*,Cloc**@ClT_:NqԎvhqSxSEu*DZzhYSEu*:Duhu .TJ8վ}n8Uǩ1s닮ǩ6q e zHӳrN⡒ڡCznGR;TR;TR{vvvhK8UjǩqԎ#=R;TR;J8^|n/:G^E˽x P CWiGglY8^UǩNi6qMq=Niq$~miiqqqjS&T}渚q?9G*$֟gOCS%q?Ni8{‡J'MI8UI C?Ns8{ڄqSq?tOC}{CX?١gO*֏qX?Nib=8M8UgCX?NqX?Nib8f=NY?Ni8MgP C?tC?tC?taaaa*aaaaaa*aaaaaa*aaVa![>pOK~*GXKvQzնb=sPPC-CXrU.Gh(XT>Js 1?(DŽ.Gz sbc_/L8{mSm3CClƩb=Ns 9?.Tqlb31W~DZXXXXc=TP P P Ux*T6P*TY>Nq,#Y*YeǑ, xhq 8UǩNq^ 8Uǩ|hq,? 8Ux *T>)k 8BvN 8Uǩ<P P P P /****><7{@9悒ځǨtHTJu8N9ssh;G9uiuj=Nw N|huM j_ǩc**| 8ծ{PPPաաա͗tQ8͗SmV{sshq|G=$$~QKC%~C%~C/Vt-~3P9Z5T5:Gz 5N;|Y8UƩuJVqH#ZEj=RC}p*GT8>xn8{Zg ϡC-&?b|&?"?bYY~=?hq)b)b8M8k"?b|&?"?"?"$S$Sl?"?5aAװk]aAװk5?t Ck5?aAװk5aAװk5aAװk]aAװ?t]aAװ?t]at ]=?h?k?8 Q#]FXK~5,z89e*G)z8e栗Q^F)z89e⠗Q@u4,82VC⠗q^:x⠗S p^8cChq)zy8A/h*2Ak']cJ;tY8N)zy8A/XJVqXSzP-c=z8UeyP*DZ,]AK8-J8UjǩR{𖇳R;NtGR;J8Ujӥv*b=cPPUu8k>(U">+ӥ~: |*_JTY>JTY>J/Q,Q,)]Re(篣Gb=tZe8]Ǒ,eydydydydPPPP塒塒ն|.TYږǩNt G>J8U%|I*T ?Nsé>Nq9Ta 8UǑja*a*a*a?>T>T>TE5C%C%C%C%Z؇ʶy!?_ŞTB9 8k(V38 |{5펊y!~?_+ʻ#;7T7T7TwooojJJJJ j***;7T7T7T7TwoooPPPPߡC-~C%~C%~C%~ZJJJ m~Cπ7JQ lw>=hs)4e?xOQHDjcG9GU#1REqH=#~Hm#C=Nir49G?*Gq9z(Bx~|QnPC=tC=ޟw{z螮z螮6J4z&]Ӥqt#z螮z螮UgOCt=ΞCt=Ξzhi5{MƑt=tOCt=I8Utt=Ni5N&]ӤkW6G5h?螮UI4z=]C蕡M4z=RC%R#=R#5T"=R#=RZG{G{JG{GjD{G{JG{G{JG{GjD{G{JG{G{JG{GjD{G{Jq_E(/X|Q)D<(y( Q$hJо`E(UЎb3/JQ/EiFٿ4RKQ3Q/2mhsr85)hXІ6__:NsD8חT'2NsD8~5mhI=NH mq/G27RKǑ$]\ET2NqP})Ԓ8T89zeqWُ^*+H>6__:Ns 8UTcQ*Q*QZE8{T?KY<ΚVG쎏SxqWpJ6_T:NqWpWƑm6Ǒ,Z>Nq$JRj|搕qCVƩ>$PKPIPIPI/ * * * * ?>T>T>T~%|$|$|$PKPIPIPIPIC-C%C%C%Z‡J‡J‡J‡Jj * * * ?>3QPYJVQ,o'JQ~)q*(gf%4ǩDSAh~*GiSAtQք?QSTT;QSPS;8yCX8UǩqX: ej>ǩb}*Tp=%|$|$|Ϡ q8XPIJV qSxDq#>k_V8Ujc**Z8uhq$v8U>ǩ9NX>ʦ: 8U(Ӆr *H(B9NqPS8](ǩB9J8C-C%C%C%ZJJJ&q$q$q$q$PKPIPIPI⡖ġġġC-C%C%C%C%ZJJJ$$$$jI*I*I*I*I<Ԓ8T8T8Tx%q$q$q$PKjp/mGڣsBR_Ju"͗F6zvK` Gvݣ4_|hn>Jڀs`#Z4_sNk$tjPnڀǩ6q/ űm$t,j****vq$C%C%v8k>??;Z8]>ǩ9NSs硖ϡϡU>ǩyn_ǑQGס:N|(NHjJj6_c**G@/ R;Nq^HJ8UjcZmT q#Zx ]ǩԲԲV8y>JJVq,C%Cs>8Nqs*TI<%qlCS8]Ƒ 7.~T8Uo*~98C-sC%sC%sC%sZJJJ澨fndndndndPPPPܡC-sC%sC%sC%sC%sZJJJ j****;27T27T27T2wendndndPfA:Se߁9J}ḷT{(͞9ʾgT6Q̍dn&s-̣T{(͞9JQ3GiQ=s(8{l$q*'M3I8U33 8ʇ6|&ӄr=g8kTٷڇ6Qj9}=mNpǩ6i6768U44~=C%c&֏zj~f~=~h7644aG=&T'Ӝ>N3g@!8`f0N3`h?N3 Tqf40>Vq8h`f4SiF4{4qTC}`0t@e`0t CA `>0 20 *`>0 20 `>0`>0  `>0`>0 *`>0 20 *H62l?P~{o%J)FC{l!%\5ܿ4噝B[m1]3[?@BvVjHMHړ'TŞw] Sezj߯*KTٯ R+N oAVSVB2sA'=}zp)U¥o橕@Zs&UX*I9U6eSS;?B[+)[+N5੕Zoj缷 QWpL^޺;f.]Tډ7r^(L_Pݾ1שDTqr]Q* >QA* HL5 R΄ߍ!UZBT!E"D3ӡ?RԊߟS]t;k:Ԋߟ]RF ߟs'0D RQS Q[׿k_rҒ'~m]-& & >6Q6!|0D> 1#+&'>#{|Mj1DD'yox=߷\f*~^cڮm1 ^ 1 ^y_}mf}גjGSwwT;U*pjpG QR wT;]UٵͮQ]˙Z2c H R H RTA U@0@* H RTA` U@* HL5 R73ٵdٵͮ44Rͮ44Rͮ%3ƏV?R/_T~n*gfU93ԾUIʩ}rjߪ٪dfU93BT!Eb"UH٪FfVl*gfU93JfV[3#IJjrf6[3#I ``R0V%3ʙʩ}jI̿?߿~~y߿dDX7o-U*LbN5bvd & &?vdeG6Qvdh((;#ݎlFV;ՎlFV;ψ& &ʎl>q#ՎlFّ͈0;ReG*;#KDgf(=3OۧefOˌRe6iOK֤ kkR5šTaMf&UX*IL5֤ kR5OjT٧iY2#jIiYfư*I v>U*I>-UiS 0TLfRe*(I}Tۧ>-UiTTCRe* j HiYfi}ZfV>mRe*>-3||TA> uO?j[JgFʄ>-3}ZfBFT!E"uO>-3OKR ))ReڧeFHڧn>-3}ZfV2#I>mn>-3TLf&U*I]ffOˌ`'U*ؙjIݜ_~uz<#@W3aaa4Q`aaa4qu"<#eds"<#ٜՉtD%^콞pzxF63rUS) \{0p9'~f63:'~f:Nݜ?3sgfsN<37{wLܩrS79λS;Rwvޝywjݩw»S;N;.Uxwjݩwvޥ N;N;S;RlvwNS0ΰS;N j ;3ΰS;N Kvjgةa°S;N ;3,Uvjgةav* ;3ΰS;Rav2Vp*:tjΥTҩKv.zK¥S;N\:DRFn~)9hzmrj'Щ@7.=?ͻKO \:us<3ҩFva*0:ԾU9ԋ[!{]˩}rjߵʮJߟOsjLtUߜPNS;UR;U~70?ԾI;`~;Q]❨u@n^)edJF@z#BBBO4MMܼ&k2zM#0yM#0yM@FV `r_<2zy#0v?%2#JS7/`fD^ M^030zyl^03R7 Wk+U*Jp R\TRa°53#dK ٦RlBT!T#[-UȖ*dT%[j%ϟ@sJټR`P0U(*zl^)03TaTcc53yM1SS53#jM GSSW kff󚀙ټ&kff󚀙ټ&`fk SĩBT!T#qjMToSmwjMTm6U@;Uvzkꊮ3ctM ]SSBTk5uEי53BTku5uE]SSW BTkulN[Sѩ򚀩}svjߜ7gk?kO/.\]dƉƉ9(O\RlF+;"#{ܵRxG.x͎ݬ^JŎyّ}3#KȥPSg3sun6\U3# ={eF* j K Ra°ưTaX0,U6^TWkRe*JD RQTATCT *U*TETRe*{T{M5 vR;JW&U3*{T{ JR%S %JW@cA#U*HhLWj%ŷ+U^Sm*{T{^1(Q|ԋW}>A U@ TA U@* j HOR |TA> _!UzgPzA/Td?Ww~RS7 x~77& R S „TaB0a1!U*LH&L5&wgD3"(ۥ]DcDaċ;.=>aH1#3z?#+h|F Rbwi 3z>#G3"L%2S3z>3~gf=342z-cf+~dF*jH~ ?RƏTG#U1*H~ ??RTGc#U*H~L5~ ?ROU~ ?RTTG#U*jH~ ?RSTG#U1*H~ ??RTTG#U*jH~ ?RWȌc#U*H]cfvȌ#U*TG#U*H~L5~ ?RƏTG#U1zqL7?ffǏ̬?2#jH~ ?RSẘ~ ?RSTGc#U*H~L5~n~~YHИ([NNNBNľyH웇CF6LH<$n3bdsQFW1dds#w 83}opjZo Np7u783pG]f43 S;0qSaFS;MFvmjgݦvv M6nTaݦvvٍ*6nS;MFvmjgݨnS;M6[nS;M6Umjgݦvv M6nTaݦvvmjg7nS;MFvmjgݨnS;M6UmjgݦnnTaݦvv9yw;0O/6[nS;M6Umjgݦnafutډnj':j'O {S;MD7us3}ffsl>̬yS;MG]33}fsyS;QvΛ9ohfVGLv Ml~%gΈW& & >ј0Q0Q0QmBF6dD0q7aD0qs#C|2:ć!#CF{4R7;31dfc83B͎lv gfs3C|ffy83TTLfpf5šƚTaM&UX*jI֤ kR5S5šTaMf&UX*I֤ kkR5šTaTcM&UX*TeM&UX*IL5֤ kR5šƚTaM&UX3X*I֤ kR5S5šTaMf&UX*IL5֤ kR5šƚTaM&uskkR5šB&oN U>U*TI UR*S*BTJjʆTG#U1U6 4R[Ypf[N}T* H  RS TAj~TA> U/Ր_l/Q8DDD'% % % =qߗ~_FW}Y=#ߗ(D(}~_FV}YeD>fݨGT QW}̬~3>fǨccT QR ¨aT0@U , *F Q¨aTT0@Bc R ͨfԊfߟS'0` QبlOU` QبlTT6U*jF` QR بlT6U-Հ*F` Qب>yvU1zqXy7 T;UGd;3ӑש3cLH]92#xH<|Y':GF@#U1ՠ*Hhv"3ۉdFP*(I(}FTJP%UډYm?ffȌ`'b]6%YmJ2#0J0i;~߅!*U*J]mUffUɌ+U*jJ]~6pMp}kkk \\\\׌5#\ټa1#\(Ȋl39ʅ!'.ɖ![-U6Ȗ*dK]-3+efs 37, rȥnޥL0 R}S }TA_/U7З*K R}TATC_/UHM5ȥ Re*ۏTY,UpTY,Up*8j8K RgS gTYl,Up*8K ΦRgTTY,UjJGl?RQS QTAT]3#ۏHGl?Re1XbMf55?9ݔXʚ Nj}7gFN?\G5Sm[*0Jʶf(U*Jn̎@ʶ&U5Sm[*ImM*3ө򭛷1Ό$U5ڡu~TLN@#B %+ %%h(XQYy ƚg=YhF@W>#F+Ȋ@3"OagFVgdXxF;Nf;=Ό(Fpfd5uG̬ffs̬`43J]=Ό(U`4`*0J RFS FTQh(U`*0JM5 RFTTQ(U`*0j0J RF0J RFTQ(U`4`*0J RFTQh(U`*0JM5 RFTQ(U`4`*0J`TQ(U`9dR޸*[OU#T vRe36;INfS UR+U~<0Sovy~cM&UXz=35ߺ9zff6Gfy:TQ<ƞjJVN`'U3ն*UI^lU?'fIJlU`R7_;`& `V%S%oU&V%#oUVej )2I!EF6Ow-7f2#lU2٪dCcgCSV%U*v<٪Vl*ɩAxͦ VL83 v& NL83΄S;R v&ڙpjgB0΄S;NLH&ڙpjg© v& NL83΄Ta© v&ڙ0՘pjg© v&ڙ*L83΄S;R v&ڙpjgB0΄S;NL83!Upjg© v& NL83΄Ta© v&ڙ*L83΄S/LgB0΄S;N<,Ό0Vt&ڙ0՘pjg© v&ڙ*L83΄S73z|f:N{S;RWLg© v&yա839gf6pfVLév<ͣ3ӡqjƩS;4N8oJReSrjév< Ntnu #BOy O@c@cfϑ͞cFV{P2#%olsT#r2:*NbsL\fϑ͞##O\#3?{w(lv"YDΌ&u93șÌ&u93șD2#;SWɌ`'U3հ*I vR;S ;TN`ga'U*IL5 vR;TTN`'U*ؙjI vR;I vR;TN`'U3հ*I vvR;TN`ga'U*IL5 vR;TN`'U3հ*I^`jԛwk\[ QjjJlJΌ(UW<>Ճ=*RK¥7aR7TAT *U5U*\J. R7[̬8UZYvR;SeSrh֤ kR5So?O l`2C迮sycXj_?Lgm3Qh5Qh5QhFBÙ(;OpfdťQDl"ʈ<NMM}n3# ̌l"bDKeF60I T UR+U[W[1~^V%U*SMSTC!U*xjxH< RS TCa!U9^hf6 ͌@cA#U9^hf6 1c(I JR%(I JR%TAI$UP2P*(I JJR%TAId$UP*(IL5 JR7 x!f 0ffsvvR;f'3IVLj335?vbFzQ@)x_3BT!T(UXvI5 `R0TLj?ʚhfv[̬@Ym2n  RFSw[̬@. RKSm *[Tnafu(U6F1jTI]Q~~4L|Qe}`&nޗΚб*BBOhFV!cY=&nތ1cFVddGcD}QD RQS Qc̬cgfYsfV[T<-RW[RrS rT\@.U 7 *Kȥ RrTT\@.U@JM5 Re *[TW+U TW+U*jJp R\S \TWk+U*Jp R\TTW+U@jJ-PlRFS FTQ͘3#0j0J R7od=}Of@TNX\<~N]?~& >`4Q`4Q`4Q`OhFV0fdψhhhw0fdkɈ0ʌ(U`*0j0J`2ٵdFnQfFTQ(U`4`*0J RFS FTQh(U`*0JM5 RNԾ9U3հ*I;SN$*I `>U*I `R0S 0TLf&U*IL5 `R0TTL&U*jI `R0S 0}'rj߉*(j(I JRW(ɌdDN;S;ǯʏ1@3#H~|DN;S}'rj߉NԾ9U菺9?jϟ =R „TaBpfvL<>3Y=>3}'r@#U1u̬Gjﱣ]Ծ?9ON<,aSԾ?I5&?3&L&|1a0a0a0    cŒ0#„+&HeBrF   cŒ0#+&̈0LȌ0!U*LjLH&2bRWLȌ0!U0uuTUI*HR )RSBT!Eb"UH*HRL5R )RBT!T#E"UH*jHR )RSBT!Eb"UH*HGa;=*JR/Ǟ͞ycM&jIEP%UvS %TAI$u63gFvHT] Rgf@Rew*7휟fw7Ί3#gO<^s>y4?ZO4hLhLhLh|Ac@c@c@wИ4fD1qY#>#(И(И(4fdYAcF*4~ؒ~ ?RS?2GfVG~ ?ږ"UBT!T#E"UH*HRL5R )RBFT!E"UH1H*H]=mfS̬ΌQ%U*TI|R%U*TI UUR*BTTJP%U*TjTI UR*BFTJP%U2ը*TI33#x1֤ff73BFT!P(uUL%_P0 F0묶53cJ]!*3T|'X"*32B(U*\J]mfeFh͌+U*Jp@3Wf\T'3°ʰߟ]=Y{2#dK]{2̌{Reߓ*ffɌ-U=j K0/°ΰ°ΰΰΰ°ΰΰΰ+edðt%nd3,3,3la0,#e{&uf:N:+Uujשp \pי:+Uujש\vp N:S;R\vpujWS;NJpujw8vD N:pN;TѩFva4`tjѩFva*0:S;RFvatjQS;N0:(U`tjѩFv N0:pN;TΩ}sj*9S7;3w8+ ULw8S783v~Llqf:?Nl|Rөr*=v=S;?N8;'3+~ΏS;?NH}ϩ華'[S(UU9[+~9{RW3;lH)L'ũn=hzm~2hLhF:?~͉L8DDD'2r'3L.H kwmxq y pCw:BbDWz܃(U*jJ^c"y^7~޹q)u RQS QTAT *U5*JD RQTATCT *U*JDM5D RQTAT *UTAT *U*jJD RQS QTAT j!*U*JD RQTATCT *U*jJD RQS QTATWDMwkN֜*0JM5V}(U̩š̩}Tٔ7% ?RTF@#U*ИjHh 4Rx{?s TF@cA#o4NR )  Q|TA> _!U*GK5 Q||TA> U*ȗjG QR |TA> S|TA> U/Ր*G Q|TATC> U*GK5 Q||TA> U/Ր*G Q|1#ȗjG QR ۏMBߍS?Qzx|.nl?#b CI$UP*(j(I JR%+% JR%S %ۏ3 U#uJR%TAI$UP2P*(I JJR%&v JfdcՎ3b(((ݎaFV`fdY3̌`&3#+|Fv`fdy'.L 0YfflK*TI]Q%3+dfEQ%3+dFŘ&u`R0S 0TL&U3*I ``R0TTL&U*IL5 `R0TL&U TL&U*jI `R0S 0TLf&U*I ``R0TTL&U*jI `R0S 0TL 0L5 `R0TRʖ"UP򩊒TR ?ReK*[H]!3f*xH< RTC 3CfTTC < RWxȌ!U*xjxH< RS TCa!u~+H1Q6hGL`¿dD0 O֙ +~B%[mJfdYAcF. h<ҡqb%z-xCǷ#Ōv"3"RffȌ"uE̬H)fH]!3Rջ_ۥ npL٩g_8kxf>pVsudujp7\:uxCDA'&n6\ZMlf5Q5Q5QTFV&*#MԌ&n6Ql2rqnS29o!'.ɖ![-U6Ȗ*dKݜ7>3gfs837{ؖˌ/usL0 SS Tb1U8Հ*@L STTb1N;S}S }Ծs:R rT\@SrT\@.U 7 *Kȥ RrTT\@.U *KM5ȥ RrT\j9wNԾs:NpM5p R\gR11}tj#R7ό(7gO#=Qw!0J0}Sgfs T.u@TRp)N;T#P(U*JݜB R@Set`'UZөҟߜU*Jp R\S \TWk+U*JpM5p R\TTW+U*jJp$U'S QTAT j!*U*J]!*3?jTٟ$u1줮N`S ;$U,O&3MIf5waI~qc; ;3"<vfd|; vRwF`8=Y,No]q)3+.efť1.Rpiq)U*\J. RK¥TTRp)U*\j\J. RK¥ƥTRp)U4ո*\J. >U*\J. RKSK¥TRpiq)U*\J.M5. RK¥TTRp)U*\j\J. RKSK¥TRpiq)U*\J]q)3¥ƥʥo0f"Pf@BOU R@BT!v)RW\Rp)uťRp)Ut.}v\̊K3RfK¥TTRp)uť̬TRp)U츔Rp)U4ոϿl3Q`+͈hj{fdL}'4#+.͈{&=3|Fl3qEYhF@Ȋ@3x~F.R>#KeF`*0J-T vRWwf6FYU*I `R0SmxYTjTIV|djGɷ ?R[?gfwF5Zqj'ŷ R~Ό"uqd;S*xjxH< R+NLVA U@0@k@0Q@' %Nm'2Qv"y3挬.#w#fqp7D'nk9#Z 282%1#G ƥQ㨫GYa3+ˌmRWƌT6j QRҨBiT4PU(-(*FJ QҨBiTT4PU(*FJK5J QҨBiFiT4PU(JiT4PU(*jFJ QRҨBiT4PZQU(*FJ QҨBiTT4PU(*jFJ QRҨBiT4 ,zg37cΌufwF8*՛1ߙś1?U/ufwf"uf̙1 R+~͛1g*xH< RoƜ2#xH< nk)Ry;x;x;#H]43Ə{-ߙ{-ߙ{-gf^wFX*IL5֤nXϯšΚš͞##;=nj0J<,a񌬶 *#QGF6ۏGf##\Wۏl<H3anv"gfeRWۏ3y|f6f'!۩ș;C.U wjܩrvȝ!*;CS;Rrvȝ!wj\@S;N;C.U wjܩrvȥ N;CS;N;CTܩrvȝ!*;CS;Rrvȝ!wjܩrS;N;C.U wjܩrvȥ N;CTܩrvȝىIȩ}'rj߉yשg?9ON:#Ԏ3y|f:N<Ό ԎS/kI]=>3QvDupfgflgftpujWlkNO{S;N{Tѩ}/sj˜yC3ӱsjΩ;S+v_BO.|bNb27;}3Q6;y|'7y|/`0yyc=77vqc1J`.NM?n ;vU>S~O`} :0z^FR/`ʯ`ם_짞RCwťppyo7繟vRQS QTAT *U5*JD vD5fFhZi.:~_#dK ٦RlBT!T#[-UȖ*dT%[-UȖZς@].Ux*yu|FJwс.::p!fs3' SThptjOߑwu*h_3u:~:p oO5 Sĩ5TojMTan0STan07U;U^04URSѩ;?7ThG)GSԾ;oRƟ3SLN޵oΈ*Lb 11SB?U*lL6 SW;& ?vdW;6N\>#ٌlHR q 6lFd6q 63b۰m،a3"۰Omfd 6lF܆eFa K/v}@.uE3y3WfV{̬^Yf^WflBFT![-UȖ*djdK RlSm*8KW콦+[QTATCT *U*jJD RQJD Re*{TQ(U`4^JkRe*{TAId$U^JhL5h 4RJWRe5^JWjATC> U{͌uʌ U@ TA U@* j H RS TA` U6Q> *R7oef̬VYm2#jHR&*U0oy6љR )RSBT!Eb"UH*HRL5RH?2RLR|b3""gdGYbF#ŌH1#B+RȊ#)fdED=ƌ1#+h{N[#3TGc#Uy̬?ffǏ̬?2?RWȌ#U1*H~ ?RSTGc#U*H~L5~ ?RTTG#U*jH~ ?RH~ ?RƏTG#U1*H~ ??RTGc#U*H~L5~ ?RƏTG#U1*H~TG#U?RWȌ#UʏTG#U*jH~ ?RWgD*TIL=Jό&[*+̎*YQ%3+df}fv3#I֤ kXk2#I֤ kkR5š=ό(U*jJ]`(D#fD4qEȎ@3"Ќ& >qGYhF@W>#F+Ȋ@3"gdGYhF6G=1"O\b'3TN`ga'UNfV ;3Nf6G=L?i53cI]&3šTaTcM&UX*IL5֤ kR5šƚTaM&UX3X*I֤ kR5S5šTaMf&UX*I|&UX*I֤ kkR5šTaTcM&UX*jI֤ kR5šƚTaM&UX3X*I֤ kkR5šTaTcM&UXbMf5S5šTaM53cI]&3šTaͧ*kR5šTaMf&UX*IT۪ UR*B;dOraM7k2bMfV̊53cMf5šTak2bMf5šTaTcM&UXbXaM&UX3Xaߟk;k& kD0m6Qb(#cxF6HGcFV3J##~Ȋٜ4ȆǙ8ΏTǩnqf683~dFΔƙ8)Oy V83vh 4N8CS;4RvhڡqjF@S;4NHhڡqjƩvh 4N8CTƩvhڡ1ՠqjƩvhڡ*8CS;4RvhڡqjF@S;4N8C#UqjƩvh 4N8CTƩvhڡ*8CS783S;4N8*8us"tRZI3h9~f*?.:JN(IQrjGɩ%S;JN(9$U7%MɩnH)LǩAm<=NS;QW73NS;MG VLg©n<=Jߟ&ڏ"XEĈ0WG1"xXоŒ\D`И(И(И(QDl"bds#E~$^l?w:QD>~7EĈGС:С~s;thf61:thf6͌&us3?9uskR5S5šTaM&UX3X*I֤ kkR5š@̬@3#0J RFTTQ(U`*0TQ(U`9hf61cJD RQSWppnbfu8l@3#KM5ȥn@3#jK R}SWp43ÁY43Áffs8\pTNGtu*h:ܩ >3=q\ܩTԎߟ'0(^ s9'}FTvP;UzA绡S/t݅| SϩTTs9U*[L`7U*jM ~SS ToSTolSe+8@*MЦ hV0UT N`lSe+*LLN5LV0UĩTb1U8նL`lV0UL]m3#[L`lS7`yȮ0~ US;TTʦ/Uy*3 ?1 VpU3#I `RW™ 3ykټ~fF*JM53 vRe*{ũTL S7`fJbjJ SW?& ?>1QOMDM&L&|Y1aF / &"UHJT!E"UH*jHR )R/H~I؉b )FT!E"?jR5#;AokR#(j(I JR/P/g(I JJR7($d _OTITIT(TITITuثGF6HgMk`oޔz|7HF6;tMYD2ىdhFgS/^Jp|櫗(:bSyR_w~R:VթʙlUf٩ʙd;-'ȝZ!NKޝywjݩw»S;N;.Uxwjݩ}sjɖ*d;Ծ9Taةav6vjgةav* ;3ΰS;RavvjgX0ΰS;N ;3,Uvjgةav N ;o`NTթ}sjڹ*\:sΥS73s KՃuVvZn Nݼuf.n??un?{tqvjY'yS/ ܩr^<~~(O;CS7̬vCgCԋ-_wq]lȝ!wj\lNݼsvfnԋO yBS;Nd;?N=?̓[vf6eA:; }}(DDD'& &MTbDM\m2"ی&nXgdzFV[1S}?( ~*#TF6TA,qY,oReku+ul1VR737\ W!*oN. ʆTQjp*JM5 R@BFT!P(U4*JlfufKSK¥͆l6\1Z RVBOUZ RVBTTU*Uh*jJZ RVSVBTU*Uh5h*JZ RVBTTUfkuf6[3# j K R7[3ӷV:Uh*Jl2cJlLZڷVS'=*RQ7z'0Dna1D R7۰3ӷamؙD RQmXfV۰3#Jlf6RQmؙlfvf6۰3ӷaFTU*u jvf6Ծ ;oRev Fh FFFFh0(0(0(0fdM\hF6gD' & & >qGYhFV>#KeF*JM5 RW̊@SW̊@ R@BT!T#P(U*JM5 R@BFT!P(U4*J](3+eF4*JQlkR5šTaͧ*kR5šTaMf&UX*IL5֤ kR5šƚTaM&UX*jI֤ kR5S5šTaMf&uŚ̬XaTcM&UXbMfVۥ.kF`*;F2#J}@Y(3BT!Ph@Y(3Bf*Jo*ؙjTaM&UXbXaM5YffvɌ&UX*jЩ+d7tdjGoS=~Yffv鯙=R9Gjq~1.M.}qipipipKKKKҌ4#¥+.jfD5Q5Q;D Q3rǷj?qɥRK¥ƥTRKYq)3(uťRKSK¥TRpiq)U*\J. RK¥TTRp)U*\j\J.2#\j\J. RKSK¥TRpSK¥TRp)U4ո*\J. RK¥TTRp)U*\J.M5. RK¥ƥTRp)U4ոRfV\ʌpiq)U*\Jx`1#[J-P`'U3հNf;G{wv2#I{};efRW0Q(U`*0j0J RF0ڿ2#0J0JS5?_ :ԋ/CTQhFY(3ISI]&3+̌mvR7T_v/;U& U;U;U;U& U;U;U;U&vXQrbG@%F6ۚmMbFbFb42FF6ۚthLAthڡqjF@SJSJS%uk933͙hڡqjƩS vhڡqjƩS;4N8C#UqjƩvh 4N8CS;4RvhڡqjF@S7*@%f%nPrf6(93%S;JN(9u93NfV;3᜙ʚwf@ntf:N}ϙt=}O5gfÚ3Ys5֜Ysjgͩ5šS;kN9;'3+֜ΚS;kNI֜a͙;S+`N]=>3Ggf935v֤Xsf693}ϙ{2ScScTΩ+ߟv& v>Ѱ3Q3Q3Q󉆝O\e2dD`4qY3b0(0(0(0fdYhFFQfFTTQ(U`*0JM(3+eF`*0j0J RFS FTQ(U`4`*0J RFTTQ(u̬`TQ(u̬`43TQ(U` TQ(U`*0j0J RFS FTQh(U`*0J RFTTQ(u̬`432QfFS FTQf[sf&uG̬9ovR5+dFX̌mvN]&3šfl6;(3ԊS5šTaMf&UX*I֤n5ٱ&3šTaMf&?>UdF60bsfTJPe*YQ%3}sjTFfsf6JRW(ϟJ& J>P2QP2QP2QP򉆒OܡdFV(AJfdψdddw(Jfd|% JR%S %TAI$UP2u̬PAId$UP*(IL5 JR%TATCI$UP*(j(I JR%S %J2BIf%S %J2BJR%TAɧ*JR%TAId$UP*(IL5 JR%TAI$UP*(j(I JR%S %J2BJRW( %L5 JR%+dFP2u̬PAId$uJRW((JRW(Ɍ$u̬P23;dFP*(IL5 JR%TAI$UPBPAI$UP2P*(IP23ԊofAId%Y$3IfV1 `RW 03cI]ek(DDDD'`& `& `& `>!OG%W(J>#OܡdFV(JfDPKdFP*(IL5 JR%TAJ2BIf%TAI$UP2P*(I JR%S %TAId$UP*(IL5 JRW( %L5 JRW( %3c(I JR%(I JR%TAI$UP2P*(I JJR%TAId$UP*(IL5 JRW( %3c(I]$3+dFP2P*(I!gfyfvT̊*Y=BkRWɌ&U!rfVɌ&U!#;df93#1֤ kR7L{4 R@B(3BB39^B3#JDʣ驻GәOUfVVBNMUfV̊V3{4W5Q5Q5QOmfdfdψkkkwfdp}\p R\S \TW+U5u̬Wk+U*JpM5p R\TTW+U6=sͶUO뻺HpD⣁H@Oy g9L*T4]t2V2 QzzR1* EINQ,JZS(hMQ5+?L&;) PY=EAUUYtVBWƪʓzϢE~<)览:2Qfg@JfQH?**&UI*ʦl)dJQ7RU$E#yq$ <\aAAy Â/ IyXa"QU劐h, Ƃ ̪*+UUV$)`(%)) RRdQ %EAJ)Y4T&T(̢$0EA`Y(LQ 0EA`%) S(̢$0EA`Y(LH`* Le@`%) S4D2$0EA`( LQ 0EA`,JS(LQEI`) ( LQ 0EA`,JS(LQEI`2 LH`* Le@`%) ShTU ̢YU2QU2 ;E/γc2^vγȪ**:(P*PѨRA,@FUɪ*]* TwJIQP@EAJIQ ;EAvӿcY2d:NL&+ce|>^1Xq*ۏQR%1'IM I-:HڵPE訣y+rYu/0 Ѣt4͂t(hQEIG- :(hQѢVGW+7zE$;me"/&B3V&ڝ }&;me"ݙDhw&ڝIvgvg/&B[fix4ܕ!4ܝllqV&ܝ񚻩Mk^s7[4wS&3^s75&U4wgݙDsw&D3^s7ܢ̨_wS/E#ݙD~wfІ$J\Hw+Lĕ%4R xAP /J ($%^xAPA/OA%^xAP /J ($%^xAPA/J\((qQPEI%. J\xQR⢠EA/JJ\((qQPEI%. J\xQR⢠EA/JJ\((qQ BM/훦P&jQRעEID( "MAG^jxM}utS B6^ujԷhʐ , *XTpQh&7hI4M}(YQ_W4ҰD2x)WѤDgpmUeԪ2񄨗''MGShQtcqV8P4Z 0E}EnS#Wz6( Qt JIQ+%w U(ʢS\:mDSPUGe?t=,%qHJ)Yt?m:tåqgpnM}mQ43E?V4*Ŧ$E#y~<,pAAyX$ <, I|eAAy   <,pAAyX(EA<yX(CQ EA%y( P(â$EA<yX(CQ EA%y( P(â$EA<i+**Ge" Ǣ^?3'))4}LTO[VPVU2 ʀ) ZS4 tm ZSh5+CZS(hMQКE We/pU&pU&pLԲ3VE#LV+U*c/lj^^+YeF2 gjYjYjY"*WfpǙ/gp2$}EGgAW }3(bQEU^g@2Yt~$EUj LHհ EA&LM;(3d~$EL>MUe@ZA<,f_Cg W>T*:d? ɢc\ *\+U*Yij($E#yx.h3}Y). HIRI]$uA . .zAARI]$$ . HQRzA]9 mQڢ EAh.JB[(mQEIhZ='^sqE/}. \yQ碠EA>/J\(s & *sE}tA?w+tG̅vܨW鼮}WZ\iGt}%}v\jG4 }?ΕG/ ^ϋ(xQ ^yEwE?炀:E/gqEW犀ϖ*EwK}\QNvE?BUbb?-t Z8OV꫋4#bpQ着2s ?Y}qW_Yog3벝/M*`nc YP(}QhRQ((|QEAˋZ~Ekl}Tpg8E\ ߿#gM _TT9 qVpQfV8EAዂ/Jeb'_* /~AAY_d$ /ৗA/H _d}AAY zQPQ. EI/ ^|Q EA/J^*E\*ʋRE(T%. J()qQP⢠EAJ~*cE_Id5D5D=2P^(sѨ2Qye%(ԙ^3߯/9b QPg.uhV&R╡sQߢ E#]ߢ EA~Z=YM2ЀC4D[hQ4hIY {?μ2Y2E/TowK{?۬\2QE2Q'd42Vfme@s5WQsYP'eQh5}rQ]rѱg=kl.":Jj;_$5EGg1h? ѢE:s{}HZԵ(뢤EA]S訮wWY]sV~泺gV8EA].:kdV& EAR%̒ڟ,8,HRN~T.믗ԵWA] zu-յWA] zu-յWA] zu-յWׂV]u-յWׂ^]u-յWׂ^]$uԫ^]7ZuSzuԫ^]nuSzu- 꺩WMnյ(^]7꺩WMuԫ^]7Zji EH:T&wqQĢVϯ_Tܙ݇2Q$>:}4M+CUMA6M;T1+C2Yd(dѤYɢ EA&L.J2Y4ݙ^3Irg.(8W~R̢IsgfD::sA1?'mLR۬L£3I DYYϢIsg*$U̝U̢Qsg**I2$E*΀LM+CUM*$U̝,T1+U1wW17,T1+U1wij(gQEIyq= } Tx^ 9ƿB_\q=炎_7K_cIg< 9΅ RA4 }d\#K5ڟvAǹRJ LZꗚ+~ &YOs"럎cey?J~>W3.\Z8"g̼ݙE8θg^xؙkۼ4_4pұk=[X084`K]08صbZg1T}a 8~!b>_8]8"Nj"3;,IE {'e/Z.Ztk@,eW/et\g=/eYK28v)vb>y)bes6.{t\g;/{Ye]vk1wK$'Drz\D~!,,-TC bHAX YC bHAX )hCWJG5N*-TN ɂpRN IAX8YN IAX8) ' ‰]8&XN9ipRlDX8NQX8)J 'p" 'pRNDe`DN‰(,‰(,IQZ8QX8‰2vd~h9E4ZNLLLL ,)"Ie\YN_ r ?R4 XNY4\NQ..4Z"Q&Z"LDLDLDLDRDrRrRX=*-{(-{(-{(-{(-{T&[P&ZP&ZP&ZLL̸bedDDDɖ==4qcʌL̸=8Ǯ*3/{=L!<'agb/!vܢ%dK$ʌK$pDrq1/t|*/2 DҔCDbII.{Tf^~nq%lDD2_K g\8NN83 |rIDž? prhD "Z8̼pC 'vv)-Fϋo2-ŐbHCX(acAZ(a٣ < =R.e4 ay ,O,Hay ,Oiy ,O剂< .O剓B]hN vqᤰ EiADaA2]F8),‚AQZ0QX0QX0(J ` `P/E Csi8A393v`=i! A3sa`ELq QXX"6G\vfqai`?_8]8' Ztľ(}QV7W/}~fgߏsE A;3L'}̅A]4:3% ΌM?i=(YQ?,8 }#V00OR' D>oEI?)oQ~'ӓ$$#oQߢ E_tj5??fg1 m5bT~Ӭ8P/:յkQO ug0hEAG.J:Z4<ޚ+n?*b%x" .B{AAh]$ .B  $]vAAh/HB  ^(mQ+< oQߢ EA~.J[(oQEI~F5X%>'^!}. \(sQEI>}. (sQ碠Ed5\7LTCLTC %Q. \t5 3Ț)sA?'W8v>(EDD\qt^UTE/Hj. hV-LT-LT-t }?O++Wj֫FD*+ܲ xe dDD(5,q?DT&kLGQ㟕U,@7X 2mr 6^qAAm i゠ 6.xAAm\qA 6.ڸ h゠$m\qAA/X(hcQEI6m, XqQƢEA6.JX(hcQEI6m, XqQƢEA6.JX(hcHW&DX 2q@%m,뫛^d2 V&ʀ A(^ F$It&ɕR3}Vʀb,)ʐb, YsѨ=Ig$t2VGԊPB~W~e2bVA7 ;%m& e2Y uzz?N&ij2I#΀x.:](3g? /O4QfV~Qˑ΀bMZTZ4MZt記ab?)fQP̢b, YsQR̢EA1_/yTf};kEH:4"Q&jDԢ En:h:5:ڟ5hQEg8h?YGq"]IgFIFZtAQ? mnI&I]$$ . HIRI]$uA . H ^$uAARI I .zAԢ EAR.JZ$(HjQԢ I- Z$uQԢ EAR.JZ$(HjQԢ I- Z$uQԢ EARZIZ|Ҩ2Y2YPEI1bj3-6m(jcQ  bQ ҷ{S.ʀ+ʐ+ zWnQ  bH*U+"(\Q me2eLTt+rfVWH*EW4ҰDVWаE='*UV67t*:JTzDt[A,|+(h bTĨ(Ѣ$FEA1ZĨ(QQ+Fǫ+rEG1ꯐ"WQbUV&UĨ(QQEg1ߑY3FMA-U*U*34efgZ9 )%^Hvٹ ΂ ; ,sAAvYd$; , ΂ ;$YdgAAv.H ΂ ; \e(NQ ;) Sd(΢$;EAvYd(NQ ;) Sd(΢$;EAvYd(NQQEne\e\e\e"]LʐD*ITe:duDuʀpZ7ì2aE:]e:]e:x{RPlE#e[RlEAي-U*U*]e"L 2$}E]e"L+`ezW4jL 2 V&RD*XPEIF*XH+U*42YeD "w+CY4UhT2ae]e gQEI x-qoe}S/EA7MYu ~]؟u|q@S4/ @S4/ 4KWίM}z PݿSWt~^ZtEA7 TȕJ\XvZhzvڟfqa8\YF^UZFh&@{S_׺7W"~~W""(,4וE,ǹJzii`\Y_iivei8~+K\Yx:θ4)إ":3VYpq`0e/.vt\Fset]q8/D4"B#,D4 MB(T7KMF/a!y!¿B"qXh:.D,ƅ?y!¿{B+e|U8/99ݲ8Bo?[,O4O:9fohѢ/Q" BĂQ" BDAXX" }A_/ aqaAZ\( aq ,.,H aq ,.ŅqqAD}~S_/ M}~SXEQX(J PD}~S_WB~S_(hyQEIˋ-/ Z(4i ^- ݲnMnٝIڿtyQ碠EF/Ie+M}| J&<ķ9M}|SYiR ii ZԵhҦERעEA]. M+IZtttQѢvӤJgse$;4YLdE&3I$5MVDJӤJg:Ό2yʀL. vio[YpwTh҅2E.ܝIpwW7,},HE=)\Q r+t \Ѥc2Q3$;tLұ[cwg@Mf(xe{Ҥcwg|xSаaF;tntV&_4ݙc2P%4I ׂ \ p-uAAZ$\ p-µ"VÎo/ق g -rvAArv|MH.v|P䊂[D(\Q rEA%+ "WD(ܢ$rEA䊂[D(\Q rEA%+ "WD(ܢ$rEA䊂[D(\ "wM"WEI䊂 r3DneH䊂].EQΊ9+ rV(iXQаVÎX(g+CrV(YQEIΊrVÞkQ \E#L$\+I}cvD%I/}.UtiQҥVԊѓ t (Тs=M+FY.)4h:*P@E=_#(Г3Dgk Hv~@EAZ((PQ>)NHvVfuM<Md'O(36V&3ݙ ?ύ4(hXѱ?EevD(e+ vK?EhbBń2Qd-&\OljQT(hcQƢ6m,Lg3~Nq?qHG&ݧ;5̕8W36ά'2Y e~nY e@h%-LLB2c!JgVp9NғZmCʀTZL/ngK1ml<skqfYC5ȢE( xQ+Z~>?EI֋Y/ ^tʋz]w&uݙug^D;ɢEAWwfu?kcj? AƦIΌfV&k T1BQhQdh"?(e}A^ zY/e}A^ zY/e}A^ zY/eA zY/eA zY/T+bxo~S_mWoe}S/zYzQMoe}S/EA7MYڸMj㦾ڸWM}(T7M/9I$ɝɢěz%4i1љzI$'*CMokI e⹩xnO4MjIK^R7Z$uS/&':4I犤ޏiR3ݙfZIEg&ITt&iRLԤ3I$UםZ$uӤIEg&ITtWh:zBݙQGY@vQU>U>U>2Y}2P* PZ4D"WkMAيB%jѬUUDle29 YѨU2$rE#yX=A.H" ܂ r ]DnAA ܂ r -" I[DnA -" ܂ rD+ "WD(ܢ$rEA䊂+ "(\Q rEA%+ "WD(ܢ$rEA䊂+ "(\Q rEA%+ "WDh$r+\e.t}:Nw2:s#+ W4Dҷ2UBߧ@5(T.z6G }EAFҷ2$}EAoeH+ ҷ+U|~ V&D2 Vh$qe2AL$2 L&2 VqQĢ V&ʌxBXLA12cU0'ϕ%(he@GB 9:Z{,v %(3q@hBςEA]u]Ե(kQ+I-:JdZ+bQ+.JuŢ EA&Z (@P&j gѱVςjE#X+ u?άqHGB( %,(Cἓb (fAb (fAb (fAbY+悠bY+悠bY+悤z+^1bnsSz+fQPMbnsSEA17WMb+^17W̢z+^1bnsS&YH1w 7Mdrg_+, ڸMmܙ12 nTw& U7M n(FM:qS/&XM nqS/E* nH$ҷ3(4\hEnDv&D"3L"r;\e"ۙDv&"WDnDv&I*};wP&jЙCgID2PA4Qv9ܢYӇ$"3I]qg|]qS_W, uM}]qSa&uDuŝrMʶWMmmӤXDgmmSlEx4iљ2Qqg VgPnSwO+&DĝʶWMe4R/#e[키l -ʶ (Ie[mAP -ʶ (ۂl ]mAPAe )ۂl -vATlEAي-JV(([QPle+ VmQRlEAي-JV(([QPle+ VmQRlEAيFʶ2U& {WH*T+CzWhwI;TwW7UEQZ;H @rX+x{Ar+9N+CY((fQPE$5ȝt2V&AV&A kH]+dZAi$$ue2II+Jjeǫ8V&$ɝ+DguufT~(wPԢuMϚ\4u/:f:Zt+,H]M*յ#kQPעX$(Hjѱ%?{RעI2|n[b䷨bn[bBlz΀M}K ѹ%d$Ede΀[bbngA[4o$]$ . I~]wA . ^wAA~ .{Aߢ EA~.J[(oQߢ - [wQߢ EA~.J[(oQߢ - [wQߢ EA~F2V&DUD[H~W(oH~+d[H~+[(E#L$2L&2V&ߕ!- [(V&D[H~+d[ߢV&ߕ2Qݶ2W&Rɔ2Qݶ2W궋Rݶh42V&iLԀ3I$ 8:)ʐ2E#%2E#%Lĕ%. EB[4(hnHsW&ʀ-  mQܢLT3P- me"]Lh+B[tY$:ut&ʀF:jnQ-d[ߢP- EIhFB0$ ^vAAh .B{AAh]vA .B  $]vAAh/B[(mQEIh- B[vQڢ EAh.JB[(mQEIh- B[vQڢ EAh.JB[(mHhW&@H]+keGQԢ E#ILԀ2ԀCpx(gQh! M5D(4(5PjBS HV(H_Q }RS Qh!\e" 4(IAΊFrVHV&DrVH*drVH*Ye@%9+Ye"9LTCFeDM5j(5ը YQY3嬝#An V4lQҰaEAÊF2*5P4(hXѨQFeY4(hXQаQd2 + 2DQFѬQ2VEFD2*5P&j UѨQ2QʐZ* jU4jQQ2VEAZ-JjU4REj IZjAP Z-j ՂV$ZjAPZOzu|{I [4lAа z ;ye;D r9+ z(]QлwEA-_WR , *XTpQREA \T(`QP , *XԪ^_ݙUnQһwE/ 2[һwEA](]QлwEAk "WDMIيe+ ʶ()[QPVٞٓ-JV4հ'µW'tzInKOzAĨ2 FbVt>eBQ5OjI %{\IJRҟ=IIQbmՏ'( QDcQ EA4ޱ_D}OP4hzϢS'FQ EGѸ dQ\ @8!U) m DAY?wd֏ H?B[QhkP((EQPRwwV!( JQbQRRkM{9νV8I2^k ̦cU?ǹת#Φ|;΂ ;$YdgAAv.H ΂ ; \dgAAvYd$; , HEHE"1Z+Fǣ#MA1ZĨ(QQ FEA%1* bTĨ(Ѣ$FEA1ZĨ(QQ FEA%1* bTĨ(Ѣ$FEA1ZĨ(Q1DbTEIMcL$F+CbTĨt8G QEADZ4JɦRi$F+CbTĨ(QQEIMyL{g@%* U4y3#x:'z3#IyW&z3#2lMyL{gG;ޢA/g8}ޢ_Ajz~_=od_wzz8e |} }6^owz{??ev} e?w}e_5\Wlp]}=e{5\W M.\W?bɗ|][6>Wp _kp]}9]6^p |O}5>.\Wo'uu|o^^}O]^>'߮_W&߮_W&߮_W/?_~߮_W xx_W~x_W/?oׯæ?'߮_WU&߂k=~>d>? ~؞l|&{MO|߷ ݲk7~>>'?k>7~>&?35\W? ?~?0XwLZg‡Gp]}?'?35\W? |9L]6~>ܿVu>\WߏL ߟτoW~jl~bl~Zl~>'3}+x>__cege_V-}8q>_Ʊp~m|&|O~_6kq}_ׯ׿.\/.{ߔc >\W? up5@8*(-\.8c=}8Q?/߿>ގ%pppлp`չχ, KןχgEX{i7͏?r]6*i.?_? Z[82?O\_U{ީU{~>'n7okq;?>K,~pp| p>3Xy8uϋ7`4?>|zʥߪ>U??.`q7_Ɨ3Xxpyo/x>U/>UߙpVlw`13XMxpyKo>o>o>|_ɷ3pog _Ep>a;z<11aIOٵ3ZSv oӔ cf4e:ymʮu]0'!5g1zS~?o:c@cx ߾ZA`9;_^;=ג~ 5,(38)2W᏾oz4fՔ}[2,ZaQ7f׺ 1y]{39wSqz;cx z ř}OᏵ:3X1T  7N0n7xڟkfX]kfXkfXQkjKhco~n̾]/ٵ8Kcv^K34;f / ُi1u>ѐ^WG(]2+^WI_j0f׺ʦ*?qtvK:[-})ɘ]2+^I_:3e_֒_/kEfeeeY}/>KZY}]1+k-fem9n̾}җO1aV62ZYz_0+_WW'}I_;f_Wkeec-l|]}R=fWO1I_>fZx9_{UYUN'c :뚌=*k2szde̮FD+^GA^ :Z*k2 :뚌VAg]*k2^?8 :7^?XzjtJU9=7f_>=뚌VAg]ê笿ͬr1x(}2^8j95UYd^*9뚌e*k_WogB'uU)_Wju\~}dj8efR8r.[/ǗgWw/QYd|MG?z>z>}|=} o?kj'e~nqe~?V+=xj{g?]z]}x>u?c}qߺamǂ^u'_6opw3LxKjpw{|lõOxKkÙ8>:ߧ׆3-DL1õOxKʮpwWm}zm8;_LJpwݼg~9>HL?Q g mWqתkÙ~^ty}Ʃ->--=>eP[vX? wXU`-[wxMi}km}}Ckm}}km}}U0r`auUP[vxr`acjm}}km}mj9a֖ra61[FwGxvi^܇֖O#ܾLsm4Q0raaU][vxauxam4ª?{am4~-7r]Fwx(}am4Q0raa{#<4*R{am4~-Fյ6¾Gkm}]Z{TP[z>Q0ri}U0ri}U0ri]yW~?4|?JvX[n#<ﰍy?찶FxqՄ~r>*y{am>~+-vGoŵ6߇}am6j9mkmV֖O;#⸇֖O;l#|nŵy}V\[n#<~֖O;#|#-vFx_] w-;#֖O;#2֖O;#|ri}V\[n#<(@ߡ#<ﰏv!?Fxaa5:xam>*{am6χV\[wGxoŵ6GkmR֖χNj#<4Q0raiU0raiV\[n#;<ߊkm}}-O;?FxaCE[[wGx9FX[n#FxasזO;l#x֖s^[qm>Qp0ri}ϣa6Gkm>n$r>~+-vGoŵ6_[1FxaVP-;#nE%ri}D[n#<hm~>nr>~+-vGx M6[Fxa{+8іO;l#|݊Ny}V\[n#v8JUϿ߯˫"mU^f_~G8nqӹѦLUd<swϋկݍ8mQ7vGX0.(wHFteMQ6vGy]M0.(wo2R0.(/<ݏ8Q7vGy_f0.(wMFtexPd{u6vG:$ɍ(*"HM|\mVBqPq$%Vy GRbwPq$%Vy1 GRRג )r(8+׼#)*ʵ-3HJ*ʘTPq$%VyYGRR{k] )/3HJ +T#)ΛU8*o^e X9}TIk^jAőXy$%U}Ic޻BőX*=oHJԇI")r@$%V>;fHJ|_<|Is^AőXjqGRb3HJ|o +Ǽ#)Vۧ|L9"Ss~"SE1'r$~̋`8*ߣپ] )S<+HJ}IwCőTj++#)rc98+OGDRR{THJOfőX*3oHJ| v^K8+cG@Rb^XyXq$%UG_{I%Xq$%VZ`őXy VII )r,3HJ\Ɗ#)Բ+oJH#)2$%VeIwNCőP9G")rsj8+<#)֒+gX9 +W-DZHJ< NJ#)ox X9jGRbe+gT9>^s8+g-dHJܵ#)b+[ gXjGRbyHJ5P+G-lHJM$*|Pw.$%Um@Rbee;VIXq$%VZ`őXykGRR-3HJ +2Sx8*#$%VZcőXŠ#),3HJ2^ z8+Xq$%VZcőXykYGRB%^!+gDRbek׿)+WX9jGRbe"+gTٷ>^K}8+o]Io]Io]II+gDRb3HJ}HJԇWX9XXyT[DRbXfX}HUjt51ϓ\wC;# endstream endobj 387 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 392 0 obj << /Length 1220 /Filter /FlateDecode >> stream xWK6Wȅb۴R4oi$[*$ё![vݢЃEr8΋ 扈;lO͂DYZY%8'9V(0IY Ѫ>"/)!]Ĝ۵jXXzݶL%fU~u ,@M1!FO*$Q&0y&K'Oc%L`0o?v9Q3&FRHLdj-SL$g`PE5yu>ːdH 33Ov TR͇*hܷ0wGonmIPF)YlI2#NżS7M< 3 2%*|⎞e i$[M%y-AVjx^\f7a~Wc=wVmC5ROJ2|,toTӏ^,q+:oM5cnc)j«u eKAfQ֒WkNڏ-,"7.-EN"2G֏?z\bG;Nj%fb*+3PJjS޾Aoy?r*4.ETP%!A(=!*'Pƾ-lB̈́KyN8!>:?TɎ'jP$B)T aVXCc ~q6tA?16]o\מحZP 'uWE,x3GO]P0\h+5X䌂K@Qv$F{%JNgaN֕w.bWWB_1]9Pj@cl~7f@?"<teAS{|m`KY6ѽA ȷC`=F AB7ܿ-g7 'XjcW3(HEI 5+xÿ0 i77 + endstream endobj 388 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/DendrogramAggExClusterDataSet1-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 394 0 R /BBox [0 0 360 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 395 0 R/F3 396 0 R>> /ExtGState << >>/ColorSpace << /sRGB 397 0 R >>>> /Length 2440 /Filter /FlateDecode >> stream x\K޶BK{a6FZ@ @AA0BCI3D1}9Ԑ^mz{]㫏OjWJmO_VϛvyqM܃۬Sپ?7oFmˇWo]-ݹDG*٭?ӭ/U?CowzCګV_ݶ\N(aT5$-͜ezA4#gJbJλ=5]C?_5$݄-T Py|{z(hSٍG n7Y躮ۃ ‰ 4B.|hR O1@r{Qeg/ě\!/x\eTœpهK92r`Ri=h e;2={P{sy\{ɅV28o>A \~)f {`Ri=1h e[+  NtV4+\0}Qh@^D>I@0}h hx8X0J &鄶6K?F jD0aPaO^( vfj"P?pD RalF0AQ*` tBIsQƅ0h6 A4J7QX B@াjS_p疺*/.ap㠐7OUGtc3IZK~^m;:L:9^P}"$4Dt*OH'QJ&fi1IF40W=e'ASF tBKtt̮P@ iŅSwih]w|1K. "R*"HpS߂E58RG,Q L@7 nZ*„\uXt; up lA%Nt"Ĵ-+-hGM LA!T(; 'B bp'Bj2,ya"`X(JjID NO`q)* ( ID,Ɖ&a& Puй aru,aKc3F֗ek[0AqP{5D0y"]Qdtw AXYd';"Hpr:¬xCr#&a&  {k`MW L V D0?U P9a&D N0]D`liRs D ՗f$ HNN bl&`2 ږ`@0?냩p`sP%y师A)+: uR@ `eaYUX1A#A!^grnjQ*rKc"L < ԵF]Hû*Ջ@ (:_X&eXs(U<i;tZҡGtcY?3i"LDnKG$ 0IIjf܀F/@njB M=L\,"Tl(&/ } 0aTu*{Πdj_- b(+5` OR;| t\ CQFFP-sF( 7Sݘe9h&]h@^?꬀]o50[r Ln+„*:|b,hL/s7#mv5wk~ hiz_$@NTڧ`io_;gvWUN%Р5GFt44Yj|? endstream endobj 399 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 403 0 obj << /Length 1057 /Filter /FlateDecode >> stream xVKs6W`&rFb&ifC;Iusr)ђCё.lI)3 \|Ƿxa|뿟|ǷgFM؂ l2cI*Xfxja)L"J&>Q<ۦ7庞&cyӵuk"M\e"n=Xx''I% gjϜMa=el&E}ѡSi&4әL3k/Qj8 a ^kE~2fTt{3ʹ"-2˴dH_UxCL$&,l\uO˾dXvu8~ݼI_6,u@e|Cġ$jwcBpZ F]` l@j E]myK7 9YZUpR/aOWS 6aA+Ď5vOUtU=eo5qqs+1 /`GP\uM7G$]ݪ)u=NC}`ƪl( pJMm2pn7~;uy_Sz=P=r_xrGgE-'J"L<f}f-̩J~&;:))rF'3r ܓ]_'Ϡ<1/ ,VEKܔy_E9:ݐr>[9"{Hޜ'7.&}W.9o:qKnzu2Kw%Tt7pmoIͮ?-UP.W71TlKx{HcռH#n~}PrZi^"aљ~Vn8!AmF<#yrMrFrE"ߒk sۗ6!Sɭ) \IxCEQ*DXa}%Eim7#^-x.k?tp endstream endobj 389 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/HeatmapAggExClusterDataSet1-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 405 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 406 0 R>> /ExtGState << >>/ColorSpace << /sRGB 407 0 R >>>> /Length 17790 /Filter /FlateDecode >> stream xˮJv]+vnx+ߏ[T[|7s.2FF{+ƚA&31 >_|:}N_v~_?z~n/W_oyhNO_c|K"<_Ο{ޟ{>WDy]}>_ɞO_Zzpྜ$zl [7e>߼۽ڻu/汼7x}ߓ}}%1I>Rӽx-G<ߋ|A>ϸi9&gmorY~}=?c枞P:fyr}>KzN ~wrMir,~w.1;]^~K.\qYy|,'~˿\q]z3n\q]oٹ"4_[vV0]ow]o7߲or~{]d>g]s{)NW|G4]8O]3N-w|k3v;p峿3\732q 8hLBLߘDz$Ls S Q /Ctf:foo\|gEL:f߸HsɷC.b]$Co%xKyz˧8Se[L[D[L[D[D[L[D[L[D[L[D[Eo1o%o1o%o1o%o%o1o%o1o%o1o%o%o1o%o1xG[[KHP)#2ۿ82;t5qlfo88As11-Ldr1-yKdro1-yKdrr-΀ͽEf(3sCI?5CLPC )JPLPLPb 47S0  %hn(`(AsC1C1C )JPLPb b 47S0SC95'JEr<)2t+so9g4H"{`P3SCɷ\D\t:ߒ0+o :oI?183~fE{Ab:oIŢ8SefLrpq-ʐ4b "Jb "Jb "J"Jb "Jb "Jb "J"Jb "JbZ-{z|0QlF4H[)y#AG*0ǙD8΀'h8`36cZoL-`(A+LPC Z1ej8bZ2T 0   %hn(`(AsC1C )(JPLPb 47S0S0  %hn(`(`(AsC1C Zsy.d(5+ E!EJwCi 0wu(r S Q ʚg:DkLe͊35q\Dt'2%CQt2ʚeP퐡Dd(ʐ4b "Jb "Jb "J"Jb "Jb "Jb "J"Jb "JbZ1뽝s(BP2EJHn(`(PҽͼHzj xK[L[b b:7#C1aDL""A++e)Y3` o#݋u8SZ)LE"SqgE.b .4wSpSp]\$h"""As1 )HELELE.b .4wSp]\$Eg X`:X"%p$ ϑ靛tjLP"35|g}o1o {)xi["{i["{)xKЊ8347њDb(Δ řDb(΀  %hn(`(`(AsC1C )JPLPDPb 47S0  %hn(`(AsC1C1C )JВuێ=__"hAs0)(E/L/~a ~4 S S__"hAs0:}µ%կǑEj֡H:Zfu4H!o#}dAK~ )()((i/3AK&$}"?E™_(SXgjL:!0%0%%0%0%0%hCCCCCCCCCôb \ƹuCuNvTCu8[ Xan5p#h:[)XG371a__P)JdrC1C Z1gJ J5U3T 0ӒD"΀]\$h"""As1 )HELEDE.b .4wSp]\$h""As11 )HzE.r<ߴHE"QpEE,2.Aq  E 47Srњ8: X(Y:k&)pf>/NEDc^:ҽͼHijo:SreELEDELEDEDELEDELEDELEDEE1%1%1%%1%1%1%%1%1̋<r,Y#Pd!8_z892]BP)Jd*s(Wb 4SӒD&ӒD&z}+ٌ39gf"ZTř8ST𖠹ͽ%h--Aso1o {)x(yK[L[b 4SS𖠹ͽ%h---Aso1o Ze7޸DE-TE8{`[x"5oq-x3%oL--Aso1o1-yKdro1-yKdro1-yKd*L[o {h["SgJL["Sg[b 4SS𖠹ͽ%h---Aso1o {)xK[L[L[b 4S𖠹ͽ%heC\"H`i#'V8 xan(k)=](.CCC#hem3%-=]ʊgj֡LiMldE8Leʼn3"')Y2d`d`dd`d`d`duuuuuuuuuuuuuuuuuVfKޗȭCU8RqEJ.H""E ZgJ3 ]d0v[L[LK%mƴ-ɽ%hP)3`(A+kbJd* iP"S1gPb 47S0S0  %hn(`(d(AsC1C )JPLPLPb 47S0  %hP^g\"X3)qd(-R3EP$CQ-ʐE8{)JPpQrњ8."ZspҝȔ E(Cb(HВu(C!ZgJ֡ Y)X(Y)X(Y(Y)X(Y)X(Y)X(YGh`d`d`dd`d`d`dd`d1ӵ uaX/FYp$I&05 }TlID&74w4w3lp%2-:C}-SpT~,23l4uSpN!uDb[`MbIMbIM"hnMM"hnMM"hnMM"hn`MM"hnMM"hnMM"hnAshjAshjAshjAsFSF N: +B#u4H!Xp4E6Ze*[\D\\D\D2eRC Z22l"T/"C.b .(ia"2Y3%PCCCCCCQSQSQSQQSQSQSQQSQӊum˭CdÑu(RGr0:k~ EЊ_8S~a ~4 S Ӓ_D& \GdS0pd΀I-pVcTӒuDb΀uͭ#hn``As0[)XG:L:D:a 4Suuuͭ#hn`As00[)XG].!̭CV]D :Ry6"__#a_*Lm:L:a aZku[&_2uVZݖ)T~,2"AY _2i#3["΀]\$h"""As1 )HELEDE.b .4wSp]\$h""As11 )HВ(4q30_>Mo 13sW{$;h@AAD;%;0;%;0;%;0;%;%;0;%;0;%;0M hAi7UMtm8{4"vL gYe/Nt;eG\t""""|@PQ|>-ߧ߸HC1e;Pΐ % k#5zK޲|i޸2DE0A[[ so$o1o {)xK[L[b b 4S𖠹ͽ%h-4S401]dpdX3`A S0-Dd*& .3Atɭc"As1ϋG  %d^^̋¼HЩr¼HЊu8a <3 s8̉EdvhLA2 A0$$$hMBLLBLLBLLBLBLLBLLBLLBLBLLQ4 S0 =gJ<"3Gt2p'$$WsAp=!g0:q|Tf ^33Ν!}DLΐ>rQrө3tSpaUUdu هTAA0wAp sg$g0g;)8CL` ` 4wSp33͝!h Asg0S}:yg` ` 2 x@܁3̏X)ف2`3";)8C<3 A+ ΀3͝Vg0g:ID`ӹzS0M07I&05 $&a&47&47&47&47Il45Il45Il45IMbIIl45IMbLnMM"h G&47L"2Il0$6ZpTpv0݋3lΰWO w!23l4uy $ƹ&tN"ߋ/VLb˔LDd II4H&!& Dhd`d`d`dd`d`d`dd`IIIILBęȐuBt"89SU\DrӒ(SsA1M]$hnbzKw7"Hʚ-SreELS~JP6ZreEDk. hE}5"".".b )HELE.b .4wSpSp]\$h"""As% )iI-35:up\GЩu:N08~4I3͝t>Sd0St #g0S;H{L|bgݍ=`)y$h<@Sa 30S"LEЊu840Ezf3G04G4kA]Lc .c{8n c(0n c(4.Jc)4.Jc(07c)4n:ۏehl7ϯ#|/*K#2S<T!0-~ud*_ :t ݋{A~!J~a ~!Z!0-ȐuuVƖS; &!ZU-S1$$$ s0MBL07 A2 S0IIML"hn``As0)D$L$L$&!J&47 S0 S0pL"h>K` A+v ؁)AЊ8vb΀؁3%;P h)Adr;0;ہi;Zgv`Zv`:8pLn%L$4dI4H& Dd`LBLA4 Q2 S0 Q2 S0 Q2 S0 Q2 Q2 S0 Q2 S0 Q2 S0 Q2 Q2 S0F$L$D$D$LK& ieN |)(i$!0-2d%Pf-&aZ2 ej& (tBpwÔL´dʐII5 ^g0y38Sq sgg0̝A0wArSp33͝!h Asg0g;)8CLL J4wSpSpgp!hg;)8)8CЊ38 ΀383%gP7OHۡU%gL A+ 8)8CЊ384wSpgp!h)9CdJΠ!Ar$gghA5333333333333333334` J J`ZreLKΠ 9)8(9(9i!g0-92 %gP -C A+ ԜpQrӒ3(C J`ZreLDLKΠ 9(9i93gxj͝AA0wAp sg$g0g;)8CL` ` 4wSp33͝!h Asg0g0g:uyp*S30bD 32?b'$?!a OHL o:m<S):+g h;0-=M|i"S s;;0@0AS hn``As;0;ہ)ALLv Jv4SSS;8E)20IIM0Dw8DKs΀IMLBL"hnߎL0#&a &{΀IgLwdLaF!hqG )9Bp$gghAArApDLDLDLDDLDLDLDDLEg0g%g%g0-920r™`Z3 g*& an`II&!H&a &47 S0IIMLL"hn`As0))D$D$&a &a &tj33`A+ 3LLV~S;8vt~JLt;4'aZ` ΀IœD g` sA+ 8)8C/>:SUȔLBCDd II4H&!& Dhd`d`d`dd`d`d`dd`IIIINMx^WL4_`J` J :7q1D$LK& 3B]Q; #(g c|=Cz\#24҈o:}t8*C`h 33 5p s0= `L=0=`=`=`= hM= hM= hM= hAshM= hAsh"3_0KLa!23l4u3͝ayW.䯯 ɝa3͝a3l$&т3D&w3l0K6:C6Z%L A+veR;Z-S =` 4Hv v ف Ad` 4v` v Jv Jv`Zer;hAi7_F|,)D&F|eh7_FFq7_6;#(_Ei7-D&iu<@<ʐ<њ8S񀳆 s0=@<0AS=< hAs0{)x@LL J4SSS8{)x@LL+Dn|3A O?F< haAd*+ !g;ieɝ!hIȀ3383wL 8iI-;i"Sq sgg0̝A0wArSp33͝!h Asg0g;)8CLL J4wSpSpSg8igZx&22`As00{A O?F!hIȀ3Lv߬?LLɝ!h A"} A DF,tI!|5rOz;C 3hghArAp$gghAAAAAAAAAQtSpQrQrө3ϯW#Gg OFLLBLBL´Ldd$L+ΐII]QQ v ZQ ؁(فieFQ0%;0-<SQ;Z;pLsh7#SyqT<ઓ} `{ y)x@L` 4SS=< hAs%{)x)x@ЩAʈLL"v` vb΀38v b3dA _D& UȀuV~]aT\pV~]a3`_2LiP"S2 4`( 4H"  Jd(`( 4b "J"JbZ2ePL0dʐuuCӒu(CaZej2h%Pf΀u֬Ùu(C!ZgJ֡ Yi㈮ ̋-dd`^Ĵf΀u֬Ù:?"crӿ:h/'rj_~}?~_j]ϳ~Bv9<쭐]t{)d/ӹ>Rυ;WBv z+dSٵޣG;u±Z^]Χ8˗ҿۻ]NsuyN]Q.{9-'>B_{g{i'.[e8u?lBy_ーϷ=uW}BvGzc(uc*\(|Ʋs!0] ww? $cj[3y==Ʊ\ Xvq^ioϣwCC>ݻ|$[5|΅|;#ٹ󯅣û#E va;\a;SV ‡jarpsrƱK.0c GVuۣ?.ma+t[dڿ؟׹pg궸«?ko*܇s\{`lo9_,)oOˠH YLˈE߫q\י?y7MUN>."'|fm]FEN:;W9S, ׯdezj'8b΢*'8NOUNXfe&Z2;ͲpX,֏Dj'蜳2X/՝fbO9Qi _R̲*'|)3^%4X/fe_2NUORu]Fl`%4!,4eUPxJ`]$5f,8OL)YvQi24;c˧f|LMŽDZ|Jo}8O%β2œf_1S dv}HOϲ{d,6f1S" V4,1.,1.cre}c,o̲<4>b,omͲ3x,oM{:?Rkˉ:Kt]g?k?\^_N%nt7o1ߖ?qǹ_Xv[חO__GK|SݰOuO_w? =\^*@-~ئ+M7.-UN^.ꇾ@->t}&uuE__=-{*->?mz/P"׬zjip >cW2~ޞL_8rsZcN{ް |X /wu9C[C|Gu/vl'>ڻߵ!㮻Nǭ)C"m޺:l!ҟxL-=O=WCK|^o . =n ~:}cy; cz9=t/v.^W׷WZpAL:>7q9E-+8pklhcA  ԢYq'S{,h-`,7q[We!)8NCX8P:AE[VpAkPo C ^ic_8 ^8o0l=$= ՟U|m ֲ0˻x:e땇ֲ ӢP}Yt^gIr(6|J}Z2Yq'_q(h-q >M`oG=.}Z} >M׏PZCaM!-":g˂u(Pc(Ms-=)8ĕPmbPVpK q ܢ+ױu},/PK/0)8C:}n3}ZBQCzb ڡ`sۄ ԲςNqsk`smev'cSٸl= ޟ;y/zςEi@-[co֩PФë[} >Mܟмณ阡0ߔs`ak-[}Aƈ}]绻L iE=ǂmzZ/P2? ;oَXo_-,{XGP}lJϫjxop(7qk ZCWЏס@-ȥǡ>4mƂw6y3[Z0p&j}Ynsjh_kVp羓}˶c羉PPZb8  ~XZ} ޟ8C޲z=tan.]NC<eۇ`s㱮 Ԣzxz][b` >M׵CAk婞`a O[vƂmz/PK Iq'r(h->{&n޲=,:qne߇`w7=5zx޲Xmbm(Pn~w:Ln->>oEk=_+K{>5w~O~oŪO 7wlJn˵~|\^k]/cVr~CWqtc;?~|җqoehJn"5-%K}>zy%C/CSWrݮǎ^ٰi/˱K624 %G^=%ӗ M]~e| M]y]3nzuMC6Mk;i/>^H<7%}/áZ];wnhKf.9׾i(9Wr:%C^˱c76noKN%Vrշ/a_,Kߴ _dMvxe]>26u%*gx=[ÆE^<^Yr:EOi/lԕI{,~_<aC}P}퇦3h_7%þzy%C/CXr,ѡ{dhK}9xtPߴt_G<<79集z`C/CPrЩ k{ԕ^.M]y7vش gC/RqwǦ$7Ǧ+Kdؗ~926%e8TkcشzY"ӭoJ坿Jdؗc/u&eoK^nC^^ԕW;7X9nhhK3ñ6noM{I˰{~ݡi( eqehJhx}G M{NzY=4Mky]4M{I/zYr>[/CP} %Æd{yn^d8.{]ٰC^2K𾗾i/{.}_M{ɬw[M424%)/.Ʀu*⬑+~_ ԕ<9W{@ >{ԕ\^.5 M]m}cEB.J M{zy3дtJ<ԕ\7릁ehJ۝d1sԕW{Y124 %>ix=t7oK{e}wwhJ%c?CIߴ r彍[/}^2p%xw膦d[/CSWr^KZZr^gǒi/;½i(ablZKۈM{ɰ/^mд _XjCSWҝrz!nCCSWG/mjbehJ Y&+i/Θ^ngi/{vo}]awd^^`}/CSWrVjZ3 MCIG/{]i(NCǿڊ886%=r%}^2ޯvrݡi/ަ^Y>Rv M{ɰ/^z֒ Y/g a[/CPǦN+i/;ʽi/zO vٻǦd^KԕSc M{INw̓w;4 %1]46%xKdؗc/m8zƒgɵ=ƒi/݇aoK^m-iύ oдzY˞^(9Z䖖 rzgehJzӱIdhK}9_77 %1LMkI[I3M{ɰ/^nii/zY),lk-_ _O{ endstream endobj 409 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 415 0 obj << /Length 1440 /Filter /FlateDecode >> stream xn6_! a>D=搶nР)@Iĕ豑Pv-937gLE:߾<+"xr8 gDp ҔDL:,w^o<]+fW~se[72IeYwׂf-~aՖMT/W+@f\eA,Aެ}Ax6A$5Y:xz{%Ҍe,b\(Q,55" @ٗfbYpwN@i-HK(ͤw+f|&5sr@j4U-Цals.j;SBley)uBj\^CDæFZUͮG*'~m=_+ir|MY^x5?qJY4BJ$gT&7kyE'L?*,NY<?FL ؊(#;2uVmN%$H4onZZ\Y"ٻ˄m{0qtǝ!Ͻ@ Fv-7Sq@ D`3&ZkxT~1x@5W!vLS!֮@(-v UK64C`D-0,ɽ>1^4ASƪqEAi8U 5#ѷΖ) *GZV-੭m[02 M`Ies-y\Q'yǔ{lwv~mv0/Ua=x2S25Ǯ+p6CPw,}se=9fز1gYT*Ȕ]RjQ8ePym'oNԡy(5'#M ]徱:Nx4RR{{jv/nn60,1,éE2z 2wc #%p^$UAoT-462LK1"iΎ I`@hBUݜ-"X1?[})s> DZSDy$3xC<(>r<{<\R_۟<91U%sL7мB*>B:UTY-?j΋a𑡢Pp^۪7ĩ&k9J\U(#::n(a(#i9|ķ3'?Ձ"dbnRצ `52D*Ϟ}aXnh m} < X4rgK~hZ{0Ѧam#çXaۢ4x=:`uzY2/Ms0Mu!fY,k>i-#yߚu7>vk:ŃIï endstream endobj 400 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/ExtractAggExClustersDataSet1-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 417 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 418 0 R>> /ExtGState << >>/ColorSpace << /sRGB 419 0 R >>>> /Length 4498 /Filter /FlateDecode >> stream x[M-mdr髤ڎ0`y@AV`xya؋I%QE??Ο۟>mqr{{?#=~?~HmGx>ٶHx}DZe5hejriiqurmPVȵjU4GכQ<=R(/gJyԾ|þ||㟿mt;gj~A˹ ;c m޶1Uca#}Dž%њ9N#KSh;)]Įv~0۟ }jZ};tv8Nga}OF~ 0q 4b'\1/1H02f9>'v>EaV%?.,(FkrQb͞3tL[ߒRbW-_\9 7 >p O |\)rT spVƅCS,rEj7%M|8e;ئgݎ0io}; Ku59iSnК}SN]Ʒ<ӣ79'h%aMѧn q/!52Fl ŸsΖu`5L! (τ5W1j`*ѥ+FBVsv_&6#c-S}4u`sȻErhMNڎragp\BkM9"vr̆w.t$GϦ3.F 1'SRaIe-α>.ݠ}KN]dZls0- S_.)yEXR[t\XtFߔ.bWȫ%@yL;1.[qG/n^,Q%zS2枽 7EZA0XB:" Mɨ6i-RZj67zry-˔<BR}ÒJ`IO&cΩ lP)N5\vb7Q F5Ӂx`]܈$uGkpc<9IJ›z5­^]3s@2ײͽR6%Ku59\:3E*nzߔ.bWX+?eKH=Ĩ jejqGlH3#Z)svvV')tfV.96bvkqD~iNe%nf莯PΐQ|1Y}/cN"'ٙ&oiМbO¤7dϬ3]XR[GAɼnPKn)Kr| p>b7PsJd /կFɮˈ"oi/v+gKL6{ZƝ (jJ%?w;FC-]bWZoɳlǮvk^<7s:d,0dik8WK8+sM9"v[녹sˡgR>Qi5j>/AXR &Jv-;}4,f!D3[ q#JqKXrag>ׯtBkM9"n-ݞ mSˎKy*;6gI8qF*mD )q܋ 8 saKd&Vg6V">qѠG"!p%IҺ>!5j{-2T)"F}C/XRٱ[O#ݠ=oi-rڄмk4Uٌԧy Oa`I ^p#ltBk-9"vsx wk-9%*[nݷaIŪdZ CN5vo ]9@Ays(g@ <,8]O؂䇺nM9"v[}q^(Cq^T69/m|.υu}S4/]ּ"\r]m즾yjy"N^<+u58Vl~nP1Gi/vk^ōAcV/^-6^ɬ<6 lPC6ʉNyAߙPڅˋs%6sj)x3/u-#(%vJ5#kha-yitoi72X.{v:D)&[2&ymCXRYq,8vG]q,.bW/;cpW< E?a<ͱA% [mKuݠc78a׎;n}Kyn~lz*Ĺۛ$rݱ,v & ݠoa׷즽]B΁yiR;Di-%8cKlSw}SN]|XۜRUkte*J>f#A uN-v,z j7eR0WP%ɖZvQ1]ֆ w%KG{`-=C7(FַKe8kJP+m456Di7[aIkƥD}SN]VL\p[b#xo&?G+mYy|֪M}R k[l Ws/XIvv있ɏ `QBǗUgix\KշKn'b\xcDZa {'8{1`%\Bt΃w:[Ua=WN opONS#ty7凢cW `r 9.ɢ_*P&Q g-'xttV\r;;/ J-9zv}RZq-)N) 9OVSN)~YEyŠjמCNu4mnDbǷ# 6 %XIP3(P.ր"cWUw8j(RH;dm H_>WNm&6@] =_J`N*Wľ!]ح$ģ#tL~IJafܯKK:>Ӑ[u`?(fߐ.`_ַxU0ӓQ8,OV9 J#|Q 691]5&]OJa q6-_SAՇ;B>߶]V|](}; '!Bc{Pߔ.bWҳq:x.'/ X>}x^0 8v@akR8Z`X5 hI}R k[lT cN^F&0ˏPzs2|ٟRKYTk_،TsrKev^A@kBc{gu5MN7넵%t.9nE^fLjy)~a8ߌX'%3zXRЭ U~^nPiQǽP[> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 426 0 obj << /Length 1042 /Filter /FlateDecode >> stream xWK6W(1C"%4C:$Zez8wk;b0=X&gy`qD}u4߇A@?D`I$E*8&LG%Y2`40 w #n6g 5e2K"~[Uu>$VyJRkzи#0gǦ<Q <XPT6-lϘ@;'ؠ,5z>Fbקh!9vop$5 $3XXgϊ~$Z;vt\Aכʴ|aiOd]]ի&]Tdmtr{"x 2JR' )ءWLHL͍shXwGơç(i͌23Wvt`9".x=a 5'y|dƵP  F2b3zge4-Y˰ԓ&홫=i0^Z;<49/՟ KbZS 7 ҥ]RRN/[gvp|X:uSw#gnm&S,S6-RoBa: ^ |)m9:SU7I,AegSig]s {MHn!N9_))!U4NTbBR:՗J~[Ԫz=1;{.fqx3ҧ7W+b_[y|*SW>ݨ2I8? Ԁ 7?7Ago_p-^R? *qS!T'ց.9ÿ4Pc2L Cj9Zםvr$`Qh3mitgƵy'?,^ISuѹd~Zt$>ُp΀5wrMج5oMo.8,d'o{ n-8O LZOG&zO-%u !ik黍Q Աh/s:r=󽒽b8Jڴ Zą@j+}C6\ ƥP endstream endobj 412 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/DendrogramAggExAPDataSet2-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 428 0 R /BBox [0 0 360 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 429 0 R/F3 430 0 R>> /ExtGState << >>/ColorSpace << /sRGB 431 0 R >>>> /Length 793 /Filter /FlateDecode >> stream xWMk0W19DьkB[fCɦMnK~G ɲIz3n~6|\Wkւ<_o SL(`߻_O[X?@~|~ݜ?y*CzHxIR`_u݁i]b4?ups>6Ʉ T.6L ]JAoD JEC5! `BQH%X^ @6Y=W)60Rka2Z4m:(H%j K:&IgE}KՔka|K%\Hd+dO1DK%OVZ)V&Jr DERH%#IX>at/oMD6,zUN4T)2*S9jUJ4 $=EKT lK0J7  s좠WR?cKu&*ܒ=HBI֏ *kfA endstream endobj 433 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 422 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/DendrogramAggExAPDataSet2b-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 434 0 R /BBox [0 0 360 360] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 435 0 R/F3 436 0 R>> /ExtGState << >>/ColorSpace << /sRGB 437 0 R >>>> /Length 2536 /Filter /FlateDecode >> stream x\Mϯt079>b@( ?]+6DsЮdᘶm~j~x:}oak?|?c`/\\&M wф=߼?ӗ_nno_oٞޟ~|oMd&cc}x׆/>h{}>rjϛDS&clۇ:B0$"BWS& B(xS""Bo Dpn*@z& kJ!LPP& ŐDІniqnبN^hSxe"-{ ";ۮ 6`a 62TՉ҂ Di%B UMB=-LVִ`J[4R]0il2+4`4n6 ~D1FDD!r(@0QȦjAD ŎD0QpJ!L!m9aB "B(ԱPl{-(w-Ovi]n k-[شe8NH 6_n۪([xߖ39x gUΖ?D PD:FϠ/N@D0G٧Da|Dr)@-q>Dw6z=faPw.@c=S $:Lv8xAZ#AF! E9aPL¾!LZod& i*DG B> @1 py Vk0Sûï\c/v_oJR~?"(D*O|_$ХkSbn,, .u |$'qx8w ?ͮD{TD ?XCB endstream endobj 439 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 444 0 obj << /Length 893 /Filter /FlateDecode >> stream xWn0+$ f )%ȡK4"om-/d9!) zHBH#ɨT@ֿ4:`;ua^pFp28bQ@c-hcs$Y<i0q~:""´?Ew}Wu=|1H&GW$dBTs2*o?c :&kX%`='_ۀ7M0 81LD\INQM pO1ч6AE;k1},mtӇ8w,Nim='Z\pENVc@i65эj ɧaw$Π3=ز3ۙ#~5F!|YpKõ+qW(VTV^gu%JUͬ-V}֎)'si>&lf"JGoOgksj J| yf9ɚrd.P* [ިYVYHCHq+;FiuYQ.i\xrU-:56.}浟g6++/0[#vX;\ĝ!?hbk#kBt %«%BNc̺k @u"v˦>q{DyOb Ha{$?Bܮ3mӪor?޾qhbºz2ź.6~h-56-ݾzOOެk ǻ76E ^qOf'at]=4n Ni_]p౽={̄pt5_=~gA,Nz> /ExtGState << >>/ColorSpace << /sRGB 450 0 R >>>> /Length 45876 /Filter /FlateDecode >> stream xݻrk]i"usTDyU@QePt?Bm`Gݩi'[&Oo?_?~Ƿ?׷vOz߿?>Ooo~})3ok|i1#}گG#GQ}KϿ=߿o?siƛ߾/G>׷_?UaͿokon?;w?n~|{q}?*ϫ_?=~Ⱦ7۷y|._'8S>DϿOO>~|~c}'}?-kWo?k/?N7Oڿw?No~ڷǻ?"ۏg~o~7~j~9|o_X_ϟS*o?\ooɗ?|۷ }_O>ۇ}nof.ϟ^wǷ_~׏f.~o W3}ӏ`~?oǷ~~ӏG_3_ϟi~޾y[c7C?W~?AF{DVjqwX "u{Tv׉wh}o_RT;Fj~v7m>w?GN =|/|gU_o??raGKw꽿ŵgqWwO1\?}Co!?o~|'Z???N_N__\`>|?_߿9~|~%?ۇ? o,>p;շտ귷_wz{~mzO/n O@O~>nW՛?v]o?ŇO ?owhu?[kW>_ݙğϟŸ]:Zީ#~ϟ7x?nwټ}4 o?O/|G;z^jq϶|~>n~wǟ϶/]f)0S'-VOȎڗ?Ou'O!'p#8=C}_\gs(?;urɳΙЮrjW}=r'O!yS!8嫞 O~ Rs:zV?v_ǹ mecqrh/ZbsXLrx޼oG3yd,rLiĜSj*<}樲s}|9's=x:'ش|?.p*_ _Oy<,r*=?1ZwGS\'Wuk5G]'^Vs:ݔ\y@jNt<}/Lju^Z9r W*ZZ͉VWC[ש?-5ZZ!VuLk5Z9ZYߧoe^ZY9՜?_p9L~^yF&jS8[ITfXnD66ڙO"'>}As0ONO>(Sl[{QO?zꩻϢlkf6UTkf6g[}/?>|rj Ϧq9q[4.Mr6gӸ|6˳\>S_plSwONkOݭ=u6UT=uW]TQSw?SϻgkSSwkOݭ}DSwO~(Z??nx~SMSwOݵNOݵ>u:U>u]T]SwSESwOݵNOݵ>u:U>u]T]SwSESwOݵNEW촞IsdzΙT&fҘnD1111ę&NL5LL:UgR:QMՉ3T}M43٭Ml^ӜIوbT6UMm^F=uW5l4FLm^̦:MslDթ_TfW5Uקp|:_~`m{ډGUճϪ:jd砪SMTQ5S'w>9 Yٜ? z;kkvf󂵟Y;լMSi:;?Wb1kSo`,^x]tZgSi Oi{OSfxkS\;\NS֦j:TMUSb#>~/S<;fmX*־Z*֦ST6Uj֦bT6UMkbmX;լMkSکfmX*N5kSTvY*֦SK™4'LwDMlN4'ؙT'Ll&EIsIud69Τ;nb6'lSgZ`fMu=FճUMUOmΪg*~ygj ܊4glSo]ScS>4wg>fHHy.婻"婻RRKZ`Ϧ9ͮjjN۳ii{6#.,*O]>8d|6ͻrf:U>u]멦֧Z֧Zk*Zk}uh}֧֩Z֧Zk*Zk}uh}֧֩Z[/+?){51'>֟rMNZjLvwi=q:S$.'_>yqy?|}*p<NS_U]S'O?|".c' x+ē]]j.˩ԓ3vr}|'˩Tq9uw9??דsr|NLSwkOT*SMTQ5UTjNl*Ui g#֞zgIKynb*s*vM*lDTUUT-UDjh"T-UDKѦh"Z6DKRE&Z*M5RETm*hSMT-UDz3,~-{פsn&s3{M̹s3{M:f"M+hOϜX9s+f"νb\6\87՜KR+fcΥssFNǓYteS987s.ʹlĹ\8*M8Ml̹\8*M˦r.N6Ǔf<~~1RETo*~SMT/UM_6~1RETo*~SMT/Uj~NlDTUUT/Uj~T/UK~_7KRE_*M5RETo*~SMT/UZ~Y Mܧ_M2iDI%Z&Gٝ(%%6DDKEK<;~؝hgv.Zv.کhوh^̹JiNng;Zv6hgZv6hg*v.Zj% Φ-]:uTΝM4٘sڼSf;wN}Þ*&xnbje&*Ν;w\8wܩ/ǟ+S~̉&&Zx6&N5OMAU5UTjGUժjsgT?GQ9,Ϊ~V ן>UuI_ZUjS>jvX{T/Ue֦'UGЩMk㨵kOUSwUSl^xTMU}|bOkSکz_e«?sy*.V.F\>UN}+H~~"S;óSWUST1|*ST1 OSfx*O5ST1|jgwع;gRi=9׾AILki=J뙈֯hZOIkbZOIu2~Mʓq6bx>U 4쩻fxju2Φ}6و쩕dϦ=}j'{6وSMJlD):[sΦ~6vST~j}6T޿6و1Sw0TgصjumUs s\ʵT;9>UU>UO栗}x?ռOS}x*O5ST~y*ާST>UjާT>UO吏$o_&_SN39{w&G{?QOd?>|\z60õ'a9_G Lݯ Pif @̦ 0*ULmf @Solﳩ?]:ui?tޟوޟ˞*~uh}"𩻵 و *;?T.g#. |jsϦrl慿8gk}T]SwSESwOݵNOݵ>u:U>u]T]SwSESwOݵNOݵ>u:U>u]T]SwSOwډ3iN4g"'6LLy&<M<]뉝3iN4tSElvO]N5S4lو<qJlD੝Tg#O5SwOݭ}Fl*g m8UNvgS M%kS ڼ?8UN"p<NSE&pڼ8UNVΦ: *֞zgj'e6"eH*eH*RN5)SETrI*RSMT2UjR"T2UL)"eH9դL)SEʩ&eH*RNε7)_r&չv&r}E3qbeLkҝ`gxZS0'&&Vgפ3q&rVXU_򬚍*MNRlLͮ_8w*gʩݙ2JlDhTe#M5REJ٘hFl*fӉhhS;ѲD˦)EFDKΔ1RETm>5lLT/Uj~~g#~SMMel*Vtlg6s6وꫪj:TMUSEթj*N5USETQu*SMTQ5UTjTS5UTMUj:_?Ϫ~ {1U(&&+L&g??x?ʮD3x~}w=DTMlO?z}S]i2kOݭMUO=z3USESwUOUM=l7ͮyʻ?~skSSwkOݭM=^>'gk8bz]w=N8[[^tk6ϏM]>uw9U\>uw]TSwkSW[ϦK`iNو֧.*.|.pX{nꩻRV&n⩻SSwOMLOM(S$''6gK?1~6bxsMs/l9rV|6/x:K\>uwJ9>W8G6f#֞[{nmX{nb֦V֞Mc4f#֞[{nmX{nb6fSY{6/`y]TSwk֞[*֞[{nmX{nb֦֞[*֞[{nmX{nb֦֞[ZU绺c=u&L;3;֙4wgY;LDTw3]N6vY[{::ͭ6洛X{]? 6UZ݅>{6iw6il.t6fmX*N5kSTvY*֦SSwUOL^3>5UϢ+iBgc.˩͝l;gY>qyju2>:U~U:UN֩uh=մNSE멦uh*ZO5SETzi*ZSMT:UjZ֩T:UNvZ}Rع<cR<פsy&3_Q\NlOIxbq&r2~RlDTx *VϦz4wϦy868y}9Nl*iZiMr6g#S;ٳ5gS>=Ȟ.hyg]`S]`S]6U6rZ]ȦKkkYjuui^>ڝﳑ+TjgT9ՅT;ʙ=bMu~*W U* @WիT @v*Wr ծP*UU\UT @T jWr*WR*UP*@]U\HT @WT¤~ Is'4nxh}ˏ[4wn(. Z>4wg>Sو*~y.eHyn⩻~ߩsΥrl^8qzb⩻`@L~~sTe#M5RŹTqUչTq.UjΥsTs.UK禚s\87՜KRŹ\8*M5RŹTqn9*ΥsS͹Tq.UZ?l+VƤ/8Dqnb~gTz3if"ν97qw.:Ͻ&vؼx&FJ]bWj~gl̮و]S0Ѯ0Va6Nو]S6]akٕzx3MvK킠VJͦ;^v]b4NϦw:و]]1RŮTkٕ*v]SͮT+Ujv];1RETm«S:fcT-:ͦs.ʹlvKz6bbjb*&N5ST1q*&ST11ULj&bT31ULLbb8LLSĩfb*&NmLN3)~gR.&'wIϤ33YϏMfϏMqtMJfڜ?6ωB;QWk?j4l ?6Tl.G]]˧.叺|G]]˧.叺|jscQwگh nG] g) Mcf5u5QW?ju5QW?ju5QW?ju5QW?ju5˝3 IekbO Iek>1|bekbO'V&fX*O5S٘bxjel:óS+gMex6bǦ23<*VϦ3W/?M_%9מŮߩsUDKѦ}ۮ J}ܼ]ϟ+,gh4yD8/qDZ5+UJ]bW5JRŮfWؕ*vMT(5ՔJ]G<"O*ϩ1u䣮nLTUϜߓ}TNsIyRE&Oȓ}=>~rqch"T-u[]dM5RŹTqn9*Υ&~&O~f~'~E]ww&~~~OX>'rz(}ݹSwROr-ϔqDS33gxlQ_>=K}zFlDSwNKN;u/U;u]T]SwRESwNKN;u/U;u]T]SwRw>ܩsS$t.کhوh6M#Z6"کhhR,u~:u?K<˓*s6}NLWTRETQj+J}v~FK5yREԃ<%y>|&OA,Lv6/珫(~ĩfbju˦:??~|#~N<\4~fr|/3U%Ov&rK~ω%ܧOy_s:=S]S_y積T~9奞_˻۠KďͮjjNVij6/U~pxgym{+~8gǦŏMW٘6N5lSw?OL?Ou=Ud?u?מ*g{Eϟ99Vg_WTd?O4'gפ:gҜ3_ (O_QM(ZOlM+ݴf#gT:UNm٘bxjel:óSwޚMs>~~lF j6'> O:oS"p~6:MsV=:ij ZY;6UMkbmX;լMkSکfmX*N5kSTvY*֦ST6Uj֦blTUKkFYMem6bTyo$cglT6v6TfSY;l*kkbmjs9~و˩T9[o>UY?^f+VfҼ\eQk3D9/Ok_Ѭ(Nk_z4L*֦SJFNT6UMm^+ͦzll~󩕵xjulg#N5US{ȧS_M6WoN"TySWPY5ULI*RSMT2UjR"T2UL)"eH9դL)SEʩ&eH*RN5)SETrj'e6"eHv^/oI{j_64S+fc~~{zOʽS{=LTQ*UNSD*jsr;ݘT1v6u]TymSƦkcRHHy.婻"婻RRK*RKy.eHy.婻"婻RRK*RKy.ej%gS3N;/]SwRESwNKN;/Ji;FlDSwNKNm~?4lvNKNm;Fl:~unbuN̤o&~7o&~7Q(7QX~E~I_6_7KRE_j_6]OѦveӜf?vveSٕMwTGx6\87UΉvP+fcvNyfW5JmΉgӜgΥss1RŹTqn9*ΥsS͹Tq.UjΥsTs.UK禚s\87՜KRŹ\8*MFK^t.ݒg[2wz6ͽӳͻ%Ϧy(6gZ9l*?Mnɳi-y6bT6u?iڜ4FMk{VM߳I;?ggd:ѤXI9JĤ(RN)_qɛMʉ"Jפ22UjR}l>"T2UL)vRfSIH92Jl7Ny_7;eskNyTRƤLLTrIZIM%kR1)SETrI*RSMT2UjR"T2UL)"eH9դL)SEʩ&eH*RNw*&6CgSJSlD*'To*'T9N5RENVS+R唗*L5yRS^6rʛɓȓ*L5yRS^6)o6;+xgTxVϟ/JLwVDJlYILĮݮݮrKܕJ|w_'%>=AݮTݮSvI;_OTOML=xgӼfӼx6"婻R")?|HqDSoRKZ"y6g9ɳU=Q5Q]SwUSESwUOUMUOU=uW5UT=uW]TQ]SwUSESwUOUMUOU=uW5UT=uW]TQ]ST{穻6Rf#RϺ_z~/??GS_8=~^9=~~;MO>L˧'SwS/Mݭ=u6u^ |6ٜTMW< ʗIm&&Dx&Dx~NxF9yo=ON*֦>>8UNﳦ9ԣg;=v~fsF0UU%UTm+9ZGTjWT\OU?oLۮj*N}E+TyIOVTMUSEթj*N5USETQu*SMTQ5UTjTS5UTMUj:TMUSEWUUSEJ٘Ts?O)Sg*&Nl*~_~L5RŹg6lT1q?O˦o6LWΟ3~t97q7jbu|ML"D_sbM^ΔL9:S&2q.UΔSMT-:SƜKZg9S;? y918MuNFDjh"ͭ9'fSgcvRETmjwN̦:'fS_򜘍Z6-UDKѦh"Z6DKRE&Z*M5RETm*hSMT-UDjh"T-UDK^UEKRWS_yӿ=sb6Ts.W??831ULLΉ̦2~~W^e8㈵ST6UΔSL*~SSWS+|+r7I%e&RNܥ|| 918W&&/ gډՙ2L~hgSwkOݭMݭ}LS3eX{nT֞Msk9ڜFj~T/UK~_7LWIL*^obL*^o7Q{Eo751&~+^RlDTo*ynR+Ѳ_#Lw*JRS;F)Mӳio1Fsbݨgs+ލz6ͻQ1RoR/u#L̦21F~_jlLT/Uj~T/UK~_7KRE_*M5RETo*~SMT/U{U/UKM_6T;sk&ZZ6Nl*ѲsM_6T/UK~_7KREwz]nM<;>~DK<>~%W|~&>?.D2q2q9|;,hw>OM91~|H9դL)SEʩomKyj≫~~'Νv*ډhh'w_du.LVN\EKDج}USw>*G]E;9~lf]QWNsչSw>G];uw}չSw>mʣΝ;QoG];uw}չTq}Dx6͉c:QWN>6ؼ``룾`g]EsNďjש]u9lv>G-ΉgӜ?6׏MqlL)ΔgӜ)?6u3:S~lV??jq<ϏZ)?6řlv??G]6T3uRj&})~g;QW>jq;RŮW~+8ٕZ>6]_J}ݿ*'³1RETmo??Wsn9Z>6l̹,̹\8*McgW4&hEW4&hfDkfծtgREW,~و]bT+UJvgl_6"T-UDKѦhhوhSMT-UDjh"T-*M5Ro*M5RETUUT-:ͦ;e#gTkٕZ~1RW>ԩy.u8U>u]T9=ZQwUSESwUOUMm^O4֞nmX{nb֦VkOݭMkOSwkSSwkOݭj֞[{jszf*ڜϦ9fӼc[{nmje4֞Mcm6b6f#֞[{jcm6gZQc6rz8xj'p6ߎzl婝El.bL*g".bL*g".3<9ES+zLoonω ~;kOm1m6_˚:|𩻵b6F=uTSwUSESUϦQ5JճYU:𩻔RvRݿ\;L(&N_L(&N_QΟDM~3{M:fҜ?3iΟ3Q)SETrI*RT9?O禚s\87՜KFjΥsTs.UK禚sݹTqn9z;}͹Tqn9*ΥsΥsI3y6/8sS͹fӼ7yoŚ87\^q }\s\T-UDKכ*=9=Msz̦:=M%Z61f#h'Sa)OO&Oȓ*L5yREԣ<~~ |TT'u*=z~aykٕڼl0c]J]bW5;&&Dm*f"MlU&fD1qfęT&&3D9:*ΥsS͹Tq.UjΥVlV?bR?VoϦR5Qu*SMTQ5UTjvUSEթjmW5UTMUjjZ:NlSꜘMuNMwNFΉMuN̦:'fq6=L98UNΔΔTZgSi=Nl*MwFNmΦ{6"{>dOSE&{Ȟ*O5SEm6&{Ȟz=p{g#O5SSi6թt6ݩ4^٬??]U\HW{;ze6L*LD @ܯr\`\Ȥ d @ܯ$UUU\__UU4Wd|.{j%4.{~."VOeOODSwSESwOej~j#{6gӜf>U?9/Ms^F˧6ٽOgӜϦ9/g#Sy9U>u*SϦ8Ji>Flyz6{Omm6c#Zk}uh}و֧ZN;wOݭMkOmNgӜwAڨz6):U~وS;UTFTjTS5UTMU]TQuzUMUSEթj**Tl:UTFTjVfS:WB~ }:S5Jl*Ugc/YT6;˟?W,~'׫sy6fS_M'p6"pg]=,TTziC>uj"T8UN *TvYڼ{6"T88JT"T8UNVulWS&"p.pb#L*3NX .p.D88FTg <>u]T]SwSESϦ8Ji>]Ji>]T]SwSESwONO *z[>u]T]Sw+_=u6U=h߱f󂵟7r=uW]JճiT=Fl^ym/|.TM#ټ +'O4.gsv*.v.;׏@\~~֩?_(Ȟ~."g˞*~6Tݾ^yFL=n{Z\b(W +פb\1H+Wd"W Abu 5d"W UPA]1\1H+A666r bbF\1Tb@+TbjW Umb@+TbjW rŀ*W W rŀZ]1Ȧ:Msf?j͙l3{6ՙlU.vWTWTW3A6vŀ*W l+l+l3{6rf?66Muf?6@m)+̞*gS*Uʙ~>dOS+gc"T==}ɞZv.+uퟯMUZJ ^ C-?Y 3Hf2Fpܝ#g$e^fً5u^ߏ3uGkX30&Aϟ#A瀖?G9" Xt ѵkk:oVzCwf,/W~s(_<)XuOz?)cY2`AɪEEUUU%]jJV-̶jQdբ`բ`ՍUU:Vzowfvg:(Y<8cW_>~j3<=3ؕ!/y ȪEg+c=c=3{:VY:oV'6VJF?zBhʢ{!u۝꠳:㬶NkA \ \y2d``AE'Nm2d3_ 22ᓒ:oόqe`yҺ2l=(<=3eEgg(SBOZ|*hy`޵еQ6 ҵQڀ2pm (] (ҵQڀ2pm wm@ڀ2u]Ի XwC7H|? T*z@pPEo*~LUFf }@,^D///J^. ^. ^\B];(յE- ~`CҔgҟkAVZZ:(Yq\{ED.Z^>f9Of?]o3|+PU2eg%:|P2{ѩٯ̞>83{Zyu^q9ldE:/ n?ɬO~~xW>-?e&)}?yD2{Q0Fsw>󝖇f/:5˵ًN&hAf_#iE/:urk`9AE_#~P}щ?C=)\ 㓂o@f/X`mk> :`mk[m= غ`m낵$[OZzEֶ֓uQ'm]l=imIk[[Oo.l}se֓~`Z'm=im`Irej/mֶ֓Z^3SփRm=i][O:[=3:.vmQpS~QdfN:uSÜwڪ7:|2}̀?'92NVꤎU+32SsR˔3rf>?3SsڟƟd9ԟT9ԟ˿ ܟuN:ztσg*5u |se{3c2єވ癩kբsW+-:}eLW \tjZ߈6:2S/ל<5'/P% <2 vWWa9ϗC/Z:FK[oqn4;^jw8Ǻ  ~@  ~@  ((~P}Q}QAEE:3S.Jf/Z>(9hdʀ~fgƺ *2lp w@*2pQ WD)S_((~P}Q 虱|?2;ʒB <(EK[ߨ!/u_mdʐËB \ԲxLP2+3peEo\{ͬLu4 <2T\[pk+-:X|-E-/X^!/փRm]2pe,gX xP2pQ <2W < `m \6`  \6p .Xx@2𤵁' \ zEֶ֓Աue֓Ute˓^ԙuwfj/OZ{57=38sӕg*㙩+Iʀ'ugrQknzfj/OMW*IkO207=swf]vRg{fjNcόso2<83cW v^0{Qv7M 8OJk>wzݬ뙙:<,>(9(8GOO=wxX?_5c=3PEJf/XiOHO ^*D-/] 債 ^\r ^.X{y@rk/^.X{`˓^rQ򤵗'\iIkOԩ+cU3̶&ue\(~xҺIjwRǵ\;3kgvmQpkgqmeskk''ujXڵ: vڵ:ڙ];iڢkgq8ڙ];iA=LIz20DsӓsEɵE'OHxdcI'BYZ^7ZM[KWjQFcյ!u*ؙ:wzɵE]#huh{KZwL'rȔ)NMJ2sS37z(9tysS3zp#SnL9 r@0ɔ)SnL9 r@0ɔ)SnL9 r@0єEE)))%SSSJ, , LY2ee,Sgʀ))%SSSJ,Ԧ, LYtm!dʢ`AɔEE5MY˔jՑjʀ??%Y˟#C,j2?Gge,VȐ???%Y˟#C,j2?GYԪ`+cU#㹶2ڢڍXrmQ˵깶2ڢkGf$z--jvdȵE2V];2墖+^\re,/X^ xyPrQ˕<2o ^.X{`k/< x`債/\債 ^qr eՙ:imA=L=/<ʀ?'u93?Zڟ: Ԫ֦1eeO=gXԟ˱:3UU'u:3U+cYufLmբ`IΌcxVYudU7HV: XudU7HV: XudU7V- V- VZZ:(Y(X(XuPjQjQdբU+cYudy\_[4./r0N 7:5otn:ѩXFK{O=7pX ^a9' |Sy7^/gnWx7:5z^gz!o < x@0o < x@0o < x@0EE%J. .  \2pe%J.3ꣷeOޖ5.^^t+cٺ2`덢Q*rQrQ墖+cT3C^.ZzFKOZFKިQ ((sڟ7 ,jrd1t2ƝΙZ˪):ʀ?L2V]{ˀUZV;GRrme׭6kZZԨkgƩkoevfjh-My?-cT3TLSJ,ZFK'N}S6H7 od~6H7 od~6H7 oh``A~E~E~% J+jٯ2`A~E~E~%](ԟRYt}䮢V92*c2`ъZgergy* J+j<{X_Q[x*wfma[ƲȐUUU%5ʽergҢU+U{T-c<;3μ-V- UF7 ,j ՟E[A[XԘ2eQV[Ҕ7Z:qR_QcqP_Q~72*c2AɉE[Ƙ˟:t? )z k];`OV/\債 ^iIkOZ;(8|ҥtË']f[8|~8:}7ßS;|Pr8^ZU'm=im`IZuf[Wl=i]NZתEVU'uZꤵU'Z:i]NԪjՙ)z?Z8gQ˔3Srڔz2U+3?6ǵ3SܵN:uoJ'ZuXUo2[2^^. ^t7z{yJ' \ J! J>* >* >ڙ|AрG$ >|AрG$ >j R-5 8f@p1E1E1ccc% J) ) jPKj! J6)ZStSy 2[3̶QQѠ䣢࣢࣍ZuxuWe{n3s UU2ȐъZ3f(GƳ_e,UƲȐZ3#C3E~E-WU깢P sW~#PVWQr دt*e~E;q3NԺ73`ʢө!-GƛUUƪFrgVe\;(UUƪFƫ*3}R>_y(xK:Z)[ ֶ.Xz@uk[.Xۺ`mk[m= غ`m낵$[OZzEֶ֓uQ'm]l=imIk[[O<:3uWl=imIk[[Ozfj[m}~+c}f6f6{Qәqކ*@P y2{33 *̗c993λkI7'g:oCΌ&e־|?iI!+}QmșqކmXxLIokAW:xR$u攙*W:oNV$uޜ\ۜ2I'u攙E:ϨΌeegTgyrfꊻ(}R-˙q޲u$o|? ~@o|? ~@o|? ~@EE%J/ / |_}e%z' uXtm!dλ^Rr3U|UoeIPO:uËN;>-g|̐ֳEEK>#29ny3޵ekX"3602pm@ Լ :hkkZе֛3D7=+CDI7=+CWDW.bUz-**@Ut@ysfw:+c93ӫ65ˡku?i=_׺17H|? ~7H|? ~7H|? ~AEE%J/ZOW|_鞏WUQ WUѥx5{evCWDf}e,Wjb^jGƳueEփZe![/O +c2G \ \ <(e|`c/Oj2kGsme,Vrx (vk+wQ{FRƪ+3}Zn+3}[,] \ \2ȐQz=W <(eXuxuxe:2PJ- - r\ k]; `ڂk][vڂk ֮\[vmڵk'];iڢIkNZ(vڵ֮- vkk'uj뙩kIzڪE:s3S5>3QόX^e'\8^˃'<3^k.}fm]l=3?>3xe֓:3S;(̏ȌLjOW\fj[ȌW>i=?>S/Wƪg/jyyf/όX3S{yRg~|d<[LmI[WjI/L]g'u+S|-˓:^y3̚ό@ }@0o> }@\Wīp@p@p@p@Ue*@P WD*@P Z֓z1{e, ̰O̶rxQg2+c2 x33̰x̼f?okI*@P : 0RfZ?]kIkw0ן`V? 쓖WO\kpm@ԩ+36@8ȬO:)3:˜_GJ ZA&#CW DW ʿ ^1:bP#]1^1jIڀ0]'kIKOJf/:mËًN;ަX33̄ }P2{ѺËzZ0[ol= z@[ol= z@7Hu`DJ. .  \ \ <(((xP2pQJ. .  \Ԫ+^ԫ+8e,m^A=[WƲue(E/j#J-jUܕ*!*|13z9^u^uʐBu^K/J-:KOϫG']mZ|2~\ xW[Ҫ7ZsR (r1rESu@|&XwezweE{dȟEEg)3ןz^[LkrXϩ xyPrQ⮌UqWqW~\R0d``A-h; .Xx@0pk.X`mk < `m$OZxE6pQ0𤵁' \ )f>?^/ϖ}[ g{}=kriޖ6yٞGgockތVrĸgN{adow6~Ycvݳ:odGƶq 7cxO=kNj;ڏ-{7[h? k?_6쿟_w;~l^ώ-t~}~JϏ9y>?ߞG)e_o_:/K>?n\ϭݲsx=σX/˗Q~6~~~&τ4W=k|Ke؃Lxaj"gciBg#L/} =qsiryPa#OW6ߋw{>^3Gk[mzG>^[]~߇}6_o=??.؏w^cY]^5{[υ0{>kުwy}*Q۽'_{1{/_^{5ʏ:ݫEO_=j<]|;5]czb^?-u[}{o{\|x鮌~5.u77y~g!FuW\]XuU6!j|)b|??_,Wu|v宻QnK{s;>zR5EoYg}}FbggzB=`|\mY}}'COY_#,{%4Fy͢o[ڜfo.nT,W4^&ǶW|yfeFp6Y+P[O',vLLm:_fW>fWivYi͘+LM+[{o}Em}[_ɛeכ+lW.GIv|jNz_!f!|ez 4 GP"Rm>vW\fPp]f܇ 4{_,{k7WpEmm^p%o>\WgrT.egR2)ﳡJ<.iDԲްp]f. ׳WY}6vKֳ ӲcG{M7[Ϧf_MTMy|^f{i;p=[j} twɵ[fm=-nkSo=n[›f_-eumYl}yy[ϲeoٝ}ѭecZ%nLb-Rٻk޲:ۍM;{e徶6mZBղ}m^.]}ޮ^uNzn~K_vo?.?^g2=xKRܥVo?O\ڠeN|WzqϿ~cϯ{;Zx_7G#._϶z˺chp2po7p4sbNO<#W˻C+u#Cr^v?>hp4d%;8Mj#n >>!<ְO,4v=h v1=/ݷxĭ!gܧG 7 Gq׳yѐ^c5lw{ݶ9%/: #S,eСsGh Gy4dxo [|cy->ӟuh-9@auh-uRYס#;#\aE-áE-kG8u6uYp-aF-P}SqwkwvZ6Ba:}sa:ZnqmsqqǏ}Cu:D˶sa?mcx[OZOq0}Y';D6¹8B׍ZN!(ZN?e<E6BсFsBuh-xmsq-uT7BkG8uF8xCײp0lj@ea9ea.!(ZuTס#;n:hy0Ԓ#;F Z}8V6¡Cg)k렖y[aZ:tcn';DK^Taa-8消xԱClsaxnѱCl#:tcm.ҵ8s,ӍZNPmsq6E#:#<שoea.PuZ6Ba6ղp0jG8wGyѲp0p[u#}Sq:Ŧ#: #|_CZ6eavFh-07Znnֲp0w;>;˸G6BaN:}sa:1Zqmsq۸G>©8B'ۍZNg_w笽Cw&NTchiGa! u-]".eծ%TUuFޯu-::tcnjqea7c6±q|hٿͱi%Zr̡Fg+uZ>¹C?kٵl#; m8ea1Hղp0~Q]ֲPtFh:}smr[p U6¹8B܍ZN3Z>©0k msr[#ZN>t-AMs:m0^ZȻeܡ5Ѳp0}iea8=яeaawhG8uGx#:69Z ]ֲp0Оuh-qmsqL}:Ue.n_q^1"EL bNzcMh>M wD}Ew.(dpG零.=: 츠i>:ZN;-vM{{nuM.큆(:ik:ti6i[X{I<ҞdԏrlڻLG5~ce6zCW?J״wrԏrlڻLGi;G96]f,G(]e:ʲQM{(& Q~] GY/tM.v;9l]QnMvlڻLGikG96]WG96]f7m n״wԏrlڻLGiuG96]f7t܆Mشw9mB?^a] GyttM.QڻMn״w9~(qkڻLGiG96]f<#}lڻLG9e:t.Q̰vM{(U(Ǧt=8ʱir㱮kڻLGu]e:y'.QڻkoڻLGiG96]?~ڻpOi2e}0J״w9V2~]CÇGY/tM.Qͭѻoڻtq=8ʱi2E:rlڻFutM{(7]#fߴw_i2%Dشw}e6zаtM{(xqce:'vشw9Z?菻}e:t.Q^#f״wroOF.Q (Ǧt=8ʱi2ei^tkڻLGiO+G96]ffkڻLGbQM{(ziȯe=> stream xZKoFW1>}FĮm$hLP~(H,fF33̮4* %LJO|VI3 JIx+(|7Z^$b~+R25Nh hІ9L:Z%4YX H t% p<Г<QSf-,Đs Kí 8l-SL`*DNl*(3)γqLHz~K,yk<4,Po= t`pc% G[I6 +'[ 5sX3v┅hp Vx(NAp %h# l""o$AKY{Ł<66)F*#C>! 1O )، S)t'R!h&D>D)&!1 @$"*`h; kLD$ 1р"0A"idHBbvܙQ(= G F9A/G#l?'^UBҔn.2V7߄n4n>?&USVSq ˺Mgvո:W$Gm7Z^L,YWɲqQvxTˢ|;,KL̛UreY|7k.r\:^M^^eu=~PGWB/#W#x|z6AdBGH ]ApH7/]sK$:Rg"gÁ4m }O i>WV(FņIGqfJdA!{> ncdTMz3\˃SalB;kOZDz4$=B3w Vf3 ZM4s Ƹ[iƴ y?aD_IT$Յ%S;JT'aDj .ޭq-`qX <48 [8._*B8J8wXbu=U)?6U^%'73nv?IjPiWi;ֻ) -!ѹݸ҃<=4 ƤcnhawIt9{H7jmmuE䚟H6Q+څ.ĖVؐG~Ƅ|.ʇ|_۸:R+repwۨPDWmU(arPlԧk劸w{ C)<eӏi#W/ l?9 '&@;kx*\Nl,B'I'ZyA_IY~R6S.1o endstream endobj 453 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 459 0 obj << /Length 1044 /Filter /FlateDecode >> stream xڝr6<]Ps*I; D݆dL ~LAu%,s^q`Cf:t> Ä &? ~F.ilJ1yڎO  V 5ٙkr ɮED0 RΑ @Fd<?!Q% /XhvV;kO5pu7[璳^w)2t"C|-Eȫ:f!A0YH(67ji7N+2R"%䷤2kMwM:ݘop&B)Ø:q)TX<Bra_TRIE v-= eV1tG#(cuҜ̀| ywk% ?6Rj֚ H(ys= *V"d̗b8iA1ɠ/Tv 3aL _Fo7{M8>݂r.pj!nNlPmt[iEkD ~5[L'N3Ag h~h榷6-XqYtE #$tkkvZ Zqa״N?}?w:^ɶȀ+35!uIlLv%Be&b˂Xdmwص0 Ck-/*Ku endstream endobj 441 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/PlotAggExAPDataSet2k25-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 461 0 R /BBox [0 0 576 576] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 462 0 R/F3 463 0 R>> /ExtGState << >>/ColorSpace << /sRGB 464 0 R >>>> /Length 27488 /Filter /FlateDecode >> stream xK&Ir_Kr[\HH*@7H 3;yd]+3 s7~{ʷV˷??÷Om߷mc|~/V߿Voo~o߯׷Pob~qA{/ }PN\%%kp)y? ǿ<OSݟo?!w۷V׷۾'ޥ?>_Vw^t]}y?G-k'/8 BLrM@jo.1_p>O)=!=ֿS}K7ݏ{{//}.!~no_>J^w eW/(/~IuadS?o JI}6\vƷn?oo_,jiv/kRT)3Y?ve'ki/Tk1n>J?;~~m/%O;.-vJ%yÎwop_.e|MV5P,ֿu_s*GH/wtTCK'X#|{^-ݿ h1.(eʗWCs |xP!@$7+|y/fvۥ5ŇGH)_nZ/%Ow>9mւ(mZyް#]{Ok_+)K~ww},Cu|M~aMVދxeX~wf/ ^OYw+:֟gS / .?0UP!xaE4cE5Ũ_IQv;k67:hMQT=P+PjZF4˱5X_*iח05êEڝ_ =#` V| @q \:n]pR5=y0.nm)Su + +~6!*]AQ{Kw.Cwg.X}~; S5_*z߽o+kv3UwuwVǕw]h?Y/'+MY 6rKq5q7Ǎʴk+S(wC5Y7Z uX1~:+.*} ЯZT++.VD~9V \>t7vH>Æi~ ?3 xlLqUhK=OW0[bE9{#{|@a <%QdΡ+ݭH5]V~9V c}YkC߾vݥ~cGi׾3稽Ӧ_>yq/e(J[; %j:m_IstTLYA~؏ ߐ"ơCH,o)|sܸu?clX4>jaNi\$nͯ}ڛ9l M I>++3 ;o]Ɔ-W=J-d}!E]swYR\yӎHvWݣw~KI>rnS!ų^|!yq54}S.7aG\qw9ߑw#3ފӺ^%O+wa/%O;f[.n}A9جaG\č{)1i%DļPU%t;!y~eX*n?|CjhN{8?L;:7͇L=;)>pb>g^:ڛ7M3Ҝ{S!7ag{9 4W3cma-&_Jh GsW߱sL; %nˈ֫e~eH."_He/lFQ~/;mHiG\q϶rq9b>Ro%~Vo~ڈ|!@n|f`gGyÎXAQL*6=l{{bK).h| 1ɴ'q7 W:F/2jA^~F<_0 _oKl2q7ǝ6ffo{K[vXF_H{t#_WڍS|v7B{I}'=HH^~i Bo/R\aG\q^=neͰSY|I}F7Ov\/iVׇvq7wl ~WִzPٻOїҌ+s<vw*/W%(u4.]x;%:\ҼP;iocް#.^:_\ۧ}U}Ѽw7J"i״wo? IҠoŴ]7 9ٷoInU}Ktbtw77 %-5/jpo.aް#.ʚϮtZ \%NlB:W(4~wط+iG\qkwp\ӿLo msW: 3)ivw'eQް#.پēe_Y3[g5BJ#+дh[yUyWtW9ncޡqj|$},gJ 9i}!u5ƝJۥӎfyU- Geoň!E~;YQ^zJi/7vKܼ\/4M wJs0|)b@SO iodK,/{_o֬w1ӣ?-Vʼ=O_ovH; %n:4qh1d;>b=WYB^>X}!m\D ܡConyq7ǝ+ƠY'_އ+ơP'T'Ӿ}!U}j{CVڛ>q7=[|Ͽ# }Dr}M}`?lDv/`|L}aް#.cNԸژ(zBjeKRw d׾Ţז/zBJ }7vH~5q7&͖ObR})>J6 <ҡ}?}}Fiv7er [.Tjm ~nҰHv{d?쵔/¹Wi|&LR\yˎƽqOʚ˾LBl^FqNa=B:9;-Oww=' ;obG,_Zjd}>{d"v _H4&SJۥyÎl0[oio݇!S?fF)qA6Ƿ4Vח*:v7ˋo0]ǽP%/_V^{=W7b/$aF `ZƤQBW.qϲZw{5 QwgNS|n%}{=J}!IfO _|Sڃ# v7xzv党*w,[:M!`7=1)ʛ팡o8aG\q4 0ﮗ۷{4/q[i+i߭U/n)nއeڛ̛vwǚ1luc9^X>uMzLe|!yڪLv||sl7_\|n{Ɨx_e-Fms-ޣW_HǞ˚)C!Ց7}sl+yKվF1{gaoFuN{5aTPJ{㜖; %nc=vJW l =i?._Hv\ iæCbyiG\qя8}v.=& v/$O.ԟ|}vI}s|s,/ݻZi/mcOlCĶT,Ml=_i-q]z~_h= [- / }OKۥz:|+oS!w)m87}j|۞(?ɽS۴W`ЗRAi|\Gaڳüθw{-+eoC{w/iL$$2-ͫ{۰ztS!Յ_6}sܳr\s]ZllRדkzLEB:9*"xlw ZmAq7mR^w>7CLeg{=|MخJFڻV izmVy(v\'YҺȹN2kq߶𱜝%nwW.qo%n7&A豊ƦX?$_l31L_Jln4F<#]fRc43c mܿ0}˽c}!wj+c 9nދQٴ 5oKݬ|stre4GGY!o|sl}fe @OjB<|1CQq7flMo##%Y]CapB:MMšL{׷7q7=Þ-i>ن W"!yFo(R,4K}$ݸyKy~p}s]v9&|ZMh%\e &w ~L˗R#(oL,> 99YZ4~coQ{/-ƁvSf ?^(.FްW(ornGCYVgR57#2Tߡ}70M ;ok;~H3lu⫭u`\ྐSQMr)T;+|پGVv/j ӇǭJa}ګȀ/]\PCoJ{7gag\ͲlgK;F㰀IAbYiyOBbM=^+uv7}VcybN?oK~ƣɗRAfWlE!KӎwEU i1N_FqѦSB%E}7{c}[ƪ9ҸIv5؎}UƹS-1Bް#.;f3v֩w48exG{1WJ{d4B`cg|i'Iczmi.q;bԡq7jN[1d#uwI/CVewX#u@ް#.8k|9N}3ƩX#8~Q~N{c{v)m" }XO4|M ~QbdͶYٯct{iyB8*h˴ZvNihT?=C~|ց0v~=^~qM﷈u(1ϙh}|7J3syÎf\M1J|k缫OpR i*µ;+|&?MZ#ZmՒ!@}G93r">g7 9y3u:9G48Gz] ŗ+x6`NrO߫yq<.{gO18FqbGsషy[q4}Sqxp~Rk8"-HSv☟pMv8&yga0o) 8*ïuܑ$5;y8)Ӎ򜄨ޢIq h3+07`y5ɵ. vtT ٖT8vB^m}2’ϗ`h\e26o~Ҿbǧ;w4u,%31;'6} 6;i6~Gk|OυcK|-}Kc{,kOqAu.)c-"%sק\Xz K3֝^E.E.ٵ@c\~ R+V}bTzbҧX. ĢX$֢|J%pBx7>\u\1QmSkn12onmstƼ{*0wxpJX0s%~K(1 %b=QL<^Q N0{Fp1,`/ /xڎS]/ρ2 lbx C2p #cu|_Vt\_.y'Xl/? uy81Z j;TO<)pڪۇ( s7yD'y :%3$K0$K}aIpEסE67@z N~Z4ZP"% .%$.%b /%/%0Z@QQ 1 _1FeQJqJdY"+fm 3fWTJA3zuW4==ьZM4=aٯD3$4Z!6iFJ[4# H45@o#ጨ .QM#@J4jD+1(M4~ pӞ\#MHd5n܋ͥ.h#iIh#ڨǚlJB8.bmļi?h2h#i8lOh#KaEYmg{=FqڙFJ[0*oGBq^xVFqŖFC5m{K#I"Icqc -sƍ{F+&MQ:j}$QcA?pG8Hq^Hyh2z$M#qč|'r\~&$!?B޲@Zf=?H;O](H>. $I!I#=YH̛=ѐָY^ʃ$M5Z,OH$8>IH)Qa/ FƷ9Yuzl^{IH8Hd:Ry~$67~͞HT]x$?u#[/HԾHm|Ĵ'yӾ'@7@$I#&$JIjZ$;mr$ $0$-VH5n%ILIYIvd&Y2IDMd$=I̛-ָg=“$#q'q /%!b(oQZ:y?i?;%**oaPQMJkܼ*IӸw;%ʴ$Ip%ibXWRްDXZf?Kq(K6b_49Kփ%I"-I$:MIi anieاL&IbP&iOt'x77I㛷|_N[N[W $i[8ɷy़a?i8I[ 'X8NXN#{O$'IB9IL&ƉL[4' xNk]ʃ$M'gML'N6L?NX!:Q&iO$7ǔ$Z;aE;Τ;li$MLзqJwRލ{&i;I!}';Cz"^I>q͟(iwLQj-AF+ %I(iE s1m#Aָ&@N&MԨI u$ ƺ'Ӟ(M{M5nv> PҌ8L(>Y!P62!P62!PANqf@)oZ= Pɻ.@X!P4'ʗӷ? P8ȉybżijbCS J?}2@칮(DJ PҴ8/&Jyþ%7@IesB{= P8IR}$7@Q 'NO>] P P8Ͻʗu/(?sO PYȷɋRްZNƿm6=A$i;4GRްo ƍ{iGk 5Z@F e҄@IJ9!OJ[( {M5n@IVv%5ڣ&$AS}0K;+|JuH(+q+J@Yi(I3:jɔ7J[( {O5T^4;+,N@;_'$Aq|Ϋ}K5BҐ+ALe eB$i4J@)mA7 =+J?Ηe_J PJi aj{~(iWJ@s] PLI%_-A'=W@).n?A.Y!PIe %=A$ %+_<)mA7%AָY'J?j a@'hG@I#+ԴhRڂ@)ʖnBָ]4r2iBF}I(k&=>RJ97 (mAwW.q^% Ӟ} PkܳoB 6kBL(I@I6!PL{B7+|g=B Fh e5 iB(I@I' P[ Pks8jg-@I 'k&ھem@Y9!Pǻ^Ji θwxcO`'믬`~%$Awx&=N̛Nk[g;%5L`'m dcInR;)o؏vZfg9&z+ةc盫v> vMd['INBs:Ii 줼θwrMN&I3vbļi =+W4g2iXNVLE$# g;MJ{̑N 99 ɿd;I  pN`'-Nkl+$M>v^ v^;4NvO萯СuF$~YNDi[;y 4=mI?MQ!-|s,$M7Yi]N= v&& x-}O`59.9brM`;aON9+6Ii9{XIq7ogNtR@L.^r,pKx*"No9\ 8>Ƣyzs={.K{pG |zd_O\O ʶ^ýkFۂz}@}35J[(P/כk!k}A\~€vX A]=AR%1 k*Bz.4T!Lzd,4KBQA>Р>=Dz:n 5}A}%Ѡ^h[hP~LzM.4; zGBzXhP.4XʵР>tAf%𢡊4(O҂v ׾v }v WSѵР>\iP4Kn[hP(Ѡ^Р^V!LzР^c9ԇT2 5sAU. 9sSQ G}zdQ_‰Pp^3 m>]wbi 5}>/ܧT}zkp^˹p^- g<%}z.ܧe }lp^m 咟aIy';Y{d&ߌR~5Gĸoq`iXQ}mLV{HAsV8ڠb`R`yՈ}^b`I! fRmo/qJc&0N%`g?@q*e\8xߥښpGᐒ99d.mCQt;|c/`6;kC>F2/:krk~v/Hjrw jUo֣P3=?WHH?Ty[%@SˀXYRPoxv u܊юbH]0$dû&Ň Kip\支UڍG(oW.q0'lzBo8lNKny|`y~jq,(2wi߱ǴG*Osz0ϰ"˱>^☰z^uui>\ ɫ-;5*IBr-i|Y͛R@FVzYJ?+AU? : _D?g2b<]hoEV WV GOg/VFj~:ϢYC?c:tyѸ+jo:| <"еܪ~6.bR C!' rxK{o0|D*~wXW'$(0N OsEVAETjMH cPx_>-zrQ[n\Q<]h%V}”*Di)g=>B*|~>T+0ϰ"˱qZZmX*|GM%:nP@qCBv\*|G|SX!0ϰ"˱5§I._eb h^k]%M,CǗ.YA2~Rc0C{.8)9mZ ?'ۡ—?-T!X%+ +~`.t R~3|w~0UC3&rPUHiNAuHqaBBB*Gin!Pް#.Q&2'8|v VCY7V 8ʣbا|ޗjK + +T|E]|8 ?F&|ŻϸB 6\pr-> `#~D[jyѸ+ʱ/N.+ৢ7O|o{'8T{G5 }*6˅'k.+ \Om`S RH/}LU]' R|;> ?*|cw(oAn=6dݭe_:X ,gZjqiן[#XkIsqo1`c!s7ӎjNyHq7͟:ω tbpFP%;}`>qW'79Q^8^y!įqEtk~9\AʫD/p?zpgw]H_Q~/Fpȓֈ~)VB4>cOʾ}Cv?P4"з? ; %ni:^)QBxyb,$wwh})m^\sy שH;Pc2ocDfMR` `Ë!17YYRm45*SrL̢aG\qφny;tP)~bWRo%`v"ߐS9io"2o)|s*0]Bv1$io>K{? 9AH%*>H?˙,Nֈ&rl6@ J \cq]N- ՗F/#Z}R^x> 5_55d_I_ހ6S A&_ި{Hupy/Ŋl<}(|v_~}ЩjZ}%B9K*@aPLu kD+[;?8g1^Geq' /]Q3|v݊Pް#.&V*FbGy+Fw|hފ`v?3,(ţ7xLry/Ś p SgI0Z. CvRɼI "J[ ;o{~Hؘow6\}%~Kn?7B5/- K'<٧p=鶠LͻCLyÎ_VU_<+[pgߔKbyϿP>~#QH5/ hhF{7׀H|bs!RKCqz:4TC`wFxKyCٲ^/ƖjN_i"#ZlI!.<;ۧX~)VI "JÇ[A|]E3KVw/KIi*pI`F4K|1>dc=×3X"#_4ks ^ LGK/5 +wwYBu NY=\)$¹iFq iW1Gq7 …nQaA鱍 ${)@ B~[Wi*8]~>BTgXMXY6_cЀ}Ig!qi6C{-]wri4~|7j(K{7 9T^1s:򾕽W\xjՓ}X _HpI|>Rް#.g{}vcU]+#65w]h51!j!p18RckLhBƿa82v.s@k¾o\re+i||c/.7+|1WlZM'!y~ܦ}jhN_6's67Ǎ{~ùߑ&F1v5HX C=8)Iibm8}]Tڅ}Q ;oҝtkOi|IWHVPϰQ+a}B8i [bI"҆\e{owMobe)5ɸgAާNMcBMi>D_ySڕ ;ohFbhZ<Sq6.74؞_?8SiW~(o|s,/NtH%`E0q/A3򅤥=Do=%q,6:j̲_u[ifcĢэ3+V~md(t#_ؙ_[RvH,ev7n8Z+kb8{(1>|Nzcc}! Ki&[Tް#.Y^|c}c Bw U?d%nX>6~|!mT|XvQyq7ǝuc-ahc5IX/I3eo瀴{~NGv7_icpֶ6JlkvV rWwN\MGv7XU5w5vDwnN_X_HSK6,+gwW.q뱁`#~G_Qh?X-TH|}ڏ/ Rc|oL;$˛9nc#ꊍGJӆӖMIm;cľL;Z6 C __v1mH>7s*](csv7^<ӷ@~ح:?.EUJ7+|Ћ&֓K-o w>~it=BU_U[Ҧ}p_qwFh>!ÀGbT'i_J+iB0هaag\=R߲Ʒ==F7/%fʴX_Hi*{oUn3>?.6}sܳ/p\xviEK]OJ1gl/c!`[4|7?wiM{E_Fg퓭nHsFy<kl)$ ib+= AyÎoxjhib?ZFW iiC;>Ki#ˏGi"sgNۦhlk&ڗ&\oWƂO3wxL{aag\ͮ6MuVMi {!;bcj IS}/vr@ް#]Uy^/hz9ƶ{Mb b( i^l>H P7,=o;1΍*b{ (sC`^6gkOqIQSDǬH"OZ=XيƈVTD\lX,¾1[rkO;$j_ E!p|"(8Y>{ kS/г;'Yah9Y~:@!pdhb̘<#*Hb݉ {1чȸAT 7|=bs+#H.qVo'psDM{N_J}s@㣧mi'ۧq7=1RƏX`kvx_ځ5 } iEWiٰ"o+'{7Ǎ{9X_)Ƨ|O3wr] )ޗ#8:%kViWuJ7 9n.mع#owU9 ~ZV A1|?bR<Êh/ʆ"$Pqk*("rPbT©Ӆx0I+ . yU9Ҝ~=vaWr+DkhGB:ry֐zNaCJ{p=q7ͮMCc5×SbŰ/n%ƙv9vKܼx)]oԌ5ؒfXC8j<ڴB/=5kUA]U3ʊ7=G7l;5+RIKrvJ?8T}FXP,cdisyÎU˼hȐglWlME?wYC[vKxeAPX늮^t) ݯXv#R$ͯ? O;9mg!pdW,9hKn->bIE9 ٦T!AM*[8_إ96z9n606u~%Ewr;+֝kN bbSG:Ϗt`:y/:?;j|y#Mc &T7J뺦b/sNY@nioǜiG\q;/^Be͇?>'<״y4Q7jݸTyqkSvlv洕OG/sY6F!ehb}bqg7j)<9_.Iq> i={FlUrvjlqdpSz# >OA̝@[b͇l,IĶz#<9`pZ{^bI`y|p;QƲXWDC&\?ƉG`Wdclhi}K:cq%\k6_/X ~IaߙZ\1m{b{FX>\t'ǂ3S,V|HKHb{,X=8>RK8ͪ``×K[4M$[Idḽ^Qųױዹ40';dW̋]9)$b"&M^Sd@LK&!#Ǹ&k ƉY}1^zb hAW`WF > ~w~kЍO+;]ʟ/xހ4_3DzδvL1N`BpE<./J~f |g tש3=_ש3Nea?Qg+1S[~<3\3@\3^3^4k2hj 4pu C_ф;f~F(b|ht^i4/hrMk_q4p4V[q4\iAJJ8IHgm"=8 H85qnE!h-79yBҴ!4D; Ӟ`MHh5n4V64@MzbؓlCM6$ <<}0PްM{64 ~ɦ>i,ɦi}-&2 ӞlMHl5n {F4Ji["HFo`h0oW.q^z{j}&մ>ai|?|}Fyf2[#g <5mr'3k$ ^#ﰐ5+mk7=lָY4obc5ϊq&8A6DƑ4uZFyþ'7Kymq2#慴i<1m}$$amN(AQްĶY{xm 9 nmm5 -m$ n#V+ma?f-m<Ƙ+ưocHR"Miyþ'7`Hs&Mʍsl+87mFH7P|}jYi va?f=7Ҵ=JB޴Q̛f[iz#Ii_#_?Wi|af{c+F?Hɿi1)8VMN b})#lkH(oYp:yp,cL:y8IX|}JNiI 8kܼH3c)hoqLpIHV>a e@rv c4mm)_JBH&O-Z}O5n Ho3jcϤx]tM͑V:S[y>4ށo zcE$FOkHai#_'(mzwW.q<i$k&Zc-xsm$i41 jeړüi?ge>=A_Q cX:=Ɨ7=L{"|75A|ָф4;z&Ϩ׃3ږ(>D$4OoPz0oڏDY;֕CNl(>cɢ:&Ň(>Tx~uT'yZ'goJ¿^MglJeaK H N㡟sz(>sR|XC1jcNWu_pz OZIYbE6OP|qI3fR|\G(>8GPi⣼ag?X)>T\BiX/]Ji

~S{RcqX8)>VkN$ I=)>̛#Q|ָy/#M'P|NJI@4)O2u5dF{P|jDWrxǴ#6bO+Gyg{6t+Ň ϤX+"nR|(M4NoPz0okqkP4D7`!9P% -9)>Lu' >)>Kl6JV͋3J_)>DCAS!*Nkj3Ň ,o^3M>)>7 Wb0OXIYbE*||6)>3ژD ~a0OX,2AG'FgA^G(>8GEi θwoR_)>TƤX1Z(>VE)N㡟sz(>>)>K ,i|h_KQ|FO_:=Q|$#/noo(oطDY Ň X/_=.|c(>4]Oj2)>LUVD~9[)>FrMuV&Ǻx#Ii||}Gyþ%X(>P(>83*rQ|L¤P4Nu%VW X|d(>V,zhaR|pӃT'yZ&gk[)>T=EZ}OhǤPPhIIa0I%Vw(>T8~<Êh/J‡lFV/QI1DkPߕ񄎕HGАo[>]('gX)>T8ǚsQ|_(>5Q|(hQ"{t@Ia0OXIYbOq>(>8IGR|=E$4N⑯Sz(>3Q|ָSP|ײD(>^=G(><|S {I5^(>T&Lo+IR P48NNI߾>i|y{t}.4)>&M$Q|-}$77¶D\Y}d%O{@Ji_Pzv oٷDYƽH$Z5)>.+ŧ(>&G(>:Gi⣼a/ƍ{iAI<&MOoA'Oo#Q|$ JN-{M5nh4N'OAcO>D$4~||}Ni⣼aow|P|}Ln'o-n[D$$Q|J)^i⣼a?gr<(>ҠcgR|,IED\H5YW4~IR|NI#Ii|Aaړüi/Ͳ=(>8ǤI}{P|>^G(>д|ңEQag\Ͳ_i&OS؁.P$iO$w4NDkEeڏD$4No0'gr>(>8+Q|zpIq})#x-; %nA1)>=v&i&I$4II>EQްߥ>(>&Ň-Ԥ{0)>w<(>Aaړüi:=(>ҔkzXjX_vR|z-A$҃ygHe!ܴǶ.mm9}GC=AQްDY㞿JI&M$Q|٢O'N-{K5n.#xiM=ɕcOzR|1D$4~||´gyþ'[iz<+Q|R|͚&G(>T&Gimt% %Yi|ó.c5JiR|IPGu7(=L{R|75Q|ָ2:kV4NⱶmR|[)>6N#IixK(mQ|wW.q74J>)>_Y)>~%$aV \Ӄ':&g y~R_ZXј$ml$DSz(>#Q|ָi|8ΤIJ阰JIH$bHxP|7{qiD񱂹R|OI^(> ŇyӾ%7߱kP- ǿ3BŇ(>P~A6P|lKŇ(>PNLe.*|Q| i='Ň&Ʃp<P5*uL+~P| 6ꄕcuʤX}3)>DI(>&CAL*>ɈLU@ 1)>KlCcPGX'hXiR|Ň(>TF8Nu%\Aiۖ(>Vɭ!8&#W#_(mQ|wW.q4=ƁDJۤX:)>Dʷ8(oGq=icIQc#c“#i8G~tҮbGq_)>\ieN(>9rG{ Gy^g{c+G'}J{Vτl~%2JiO}$"\(>PcҤXݱR|&ҤPu<Ӄ':&g xi`EOco/>)>D&z-Y)>#Q|ָCiS,rc(>D0Tu LX)>D[x ŧV^(>9e1Ň(H{R|75Q|ָYGSGX\)>JA/%Q|i1w%Gyþ'[(>T&Ӄi6)>uLsYI_: OZ,屑94 *ǡ<Kx,"5 %<G΁zGBy1@}^\> }>Qf|$}^/s9ky}.u-pѶ~^h_h?~ƌyM.Tڂy-$}aP^ ɵp^ |mBK9E [ 5^.`ޒ82-yOZ?ydcA]{. 0zF|xrhr7?Ǟ?H蟷2'蟷$jFH蟷G12>y 2-+ޒχM蟷LZF|{A+kyk`蟷K蟷Kt蟷Kj׌ᒌnF^-pۂtG td˱>? 5mA^_ݢi>蟟Kfpy@\iAr -^.TF蟷$yKa_?oIrGGSMαZ, G;ۂy.\2VykA=?oƖ?oq -Ζ?Zu}Xw6 endstream endobj 466 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 472 0 obj << /Length 3424 /Filter /FlateDecode >> stream xZKϯK5-$J6|$ pAݭѮm=vfS/%ffA.R,U_=4nlvۛF~js{$XQGq=n~NA}oM}ۭ .?nw&OAߵ9CJ⇉v6Qwxr揹waM#butjAi#p{v=yUQù/wJg;8S3^]ՁW2k.;~?Dل~Fv8$7nD֏ґ/pUk~8fG^[<w>YA6)q2B\LČTxR&޸̺`|aPC4\hC,:օpu{uJ pX?} ^_8_ ;r 9xM9%υ[ko&>[ztV2WA#8OӔVX_+B|\?v)Ȼ6`-ZJ pݑ_U$jpwO6Ph(r-1Fr6LIL9ԏ]Ǽx99?PޫoG~~*]NYmG'g2aM(U9H/p GSB|12 b*ﮨ凾rcD2h:=UAYh] -M)MF[Fm" \g KXŁor`Ϣo4ܫ'82oVO5LȂ>ᰊ5= H<̄^Eq;}0t gNf;b}>v%E3*5JjI`7>cM,ΓA4k~ׯ'{ZS5Y%h~5Z5=5di`M&2~]PjeS`7A/W ĠJp_0šw0LX #wSf 5@KYՇqV06fyS"K8{@.Dž.A)9fCx~%L\gQ6]Tww_?M4D֌Z84uWeW9+K-+35.ɠ.j,WH!#rgdZs]Dce\I vtx 2I)2I%́(JP7p5uV esC}OgIP#hͬ Yw eIjLJM4uFvմQG 9<_L)$hES|.WjE")Ҭ^HkVXAgjo]/5>xM.syHY SԴ<;y13+%@@XHF1R C=G[~Wj6ώ})30aO·@Adž?mv62W r5_xhFDN֕"Єu20+ıJ8߂:z@!@bãFeLT0]8oSpXL8m5P:E;u |> @'9oAS Jyp8pYbAK7 oaٮ/@3L\Шj m,*J|P`3:#XfP.ApЙ;C._Fė!6,M~;da(隄kNuW':vH >q0D_\P$AGYQ~pd$$ T?=cƘoPfLݪAjTe6|3Gx`,MR1mgJ]R7lU Mͪ\rgod ubO Nmi,> stream xZo~_!P@b_õ^{}ؽadٕ!9c'>Y6.XJft$d"wg2E%*.3g 40dW\\R ϔϤ}?7 JsN5j]cf?^|w_g "Gef2Pxfo~&QCA-*R8C̃{0o6Kߍ7DRʲZ"Oĸ#d1- #3l.?eU=,MC$.nӓz:y?Lb\3- e=2˯1^2(m3Aw#ٜ*myQBaB)LRx[*Lh4[]wRŪ,t' حaM@5,VPzTM!pуC!E!m2b{> bfԅaj8*)]tWEr"e_otQ:p^Zqzcjcg-M| TBTOniۦ8PxŪ?ѹT>\=4t/|{jGW7W>K_[B<^/Z\h(FYښO(n-zM&s_Ƣ5޺]\dvp v3ELuH r%Ixq!aGEu<7BiT{7/;_k-;O|xj2UW6ZBV3]agr3 ~NI2ԁC)+\X%ߙʔO{\8rBS Χ3(<J(_BO]|C n?AZ(ӗ- JA20}^yњY O4d IË6*ܵ6r3S:)G` py"q7i\b?<Ӊ>x^l|U4K ikgrd<8c 9:~Ձ^a SG!ν8oexsVuxq%n8t./哀|EDWha"6t@g$$C6Grwt> A1ܭ7cBåt{-;s0l{A[& a,J3$ĝoCyyPM"@ѥNa/Wwlt~0#"=8qɛ>IGO,5*A&56uΥ@p /IáJZ2#VD +h~r[*V) ք9&> stream x]o6ݿB@_$`fy,úbE{Jش]IN#r(al0`-NI3.,gHޏ~n\9 ̳d܊jδd]srÜ 4sM}_a#} 'P\Ix\Ғ{TR)u4e=¬o;Ŝ{Cu4v_[y-s}s{_Q_Q R7$/ivظG`bs b x7 B}kfӴ3xw[=- #dF0~;2Sx4W~o4r7lQHق%pM fd'&yX,a!a<0rAS\wl|D?KcBቍWHF[ endstream endobj 481 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/APClusterLevDataSet3-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 486 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 487 0 R>> /ExtGState << >>/ColorSpace << /sRGB 488 0 R >>>> /Length 13687 /Filter /FlateDecode >> stream x}K.1n^&jk# ` &3@AV`@0g-x0g_し<?G_oS? ?Is|g/w?3sm{\;3os{kǵ>Ǻ7z+{FϟKA&3x0 w8gǯWq#w|4~f_7Wid^Jl3L{%_S_:>K3 ?폳-,[$KNg˶Z{ ޿I/{vWi{:)6ȞVߠK.o-}yO{AIxayO{LY +x Yxrv,l <;I\=滔{=̲OK3GL.sdAU&EymG $7 /r]nc{ .xagޣ@e ] 8m~Cw al8/dmf&rEn{'*aʞ\{<[Q4&z҉WI6țoxۀ4wߤK.w~r/11.KOH̠8/ b[y;@cdߤKRȭrml]rs5%`#f@AWm~`OP) NYc2z0Ӗ{C۪["k\Ao6Ke6[v%^}N{ʭe8so2Ḽ.[PtL.6>BHՂ>m刷R=]rERr}ϼ[JzаfAŖt@Rl"bC#/!k[_0خ{4m@RvߤK.ȭ16mRVOL{MJݖުi;}+ys&ca%oڪ\QߤS.ȭ2m1F̭nZJRC~՝~8/!`}Zi3}NI"TndžqZ۴ܬ][}B_:c mB[tJJSn?rk0[muC4* ƭD:/ L!ﺶ)Jm=tESn}5MթUJؿF1H]A[Su^B s 9Uo;VpM:")%Ebo}bo5i[^RVr漄mU"1zk!{ qiRW҅Y#0r&ڟ|ӬYluٌ}JEV`]vέ^lЭ{)># t'_7r0VbnC3n%m[t%SnMM{ j3m.;,v0ö8 zmtI\=q,$K0 N%uݖ mxi}b$/ʮ0fr^*l;YS}ir[%oϙmZP_TK./Heym}LXՒmY-蔔.榱Nj 1خ߮B~I}-:/!k6=᝷}6H&r[q}XN Sje:lfnE^Amtkh@6 E\=wi款3n^]iȷ[KW4L3ۿxնARUG :") { {L/U6o]7^Bɭ`ܣͻr{MepA?Ip`;n:|,OB^PQӾi/BfO sm>5}&vLnetRm:F*̄O{6 : z1;Tɂ6W% S1F&WëXx8o r[䰽Q|g#^NJya[sVr^B#ala[tJJSn} >1 egﭢdZҫyK+LáVXmy| ]rEnMfZ yLlYMi]ekd%ĖH4r^sM ONBHJ|9G0# 3"-sx͔iϣ~לWylǷVfl rE0 xde\ch9W A7 p k[ƣ샪\}N{ʭb=$2dw^j i @K]W弄jzڛgMHwD/x3r)08N'xEyi4!\3x U7 S(/l{ݠI\=؎v>1ž֍3@IFy c}EK'v[tESpggbm>G\]@onfK{E$SEN{ʭYvLWn%1zЩY%"o;V= .s/@{j'֭SvN)1pb.0M:ܡ'eƬ7{Ti~<Z#/#rW ފ.ۮ爴I\=ذKmGĆ&ly a ¨O7EoStʊذ>s6 ݷKܱWXW}0 )B4 {̓~(+yĒ0e/ΛOI\};vUM>1JCrӔʲ:@\fZx  $#e_|Mǚtpk2Nk21krtJ'9/!kdpA;a`gߢC.rT{kbon 6K^7Eov6/!k[o^]y;vx@M:"a}١|(.{')d}=k.%ELu6 aXA\=>E=XzbD9M6默Gz6H^Bֶ}h%]8ʰm@bA\=厸 MrI$ё钋7r]V<#>xY ah6wx &j}."żp{ͲV3̦~oM6-VA.+!HK؛v]tESn[/uLekQnlc\Nf/0"6.)1= O}ץ%51r..UESeݟ[yiٶArubܴZ4ÄaLz;< 0´`R"G+D3U|yjqC}JiwbPˏōeCA=  :L%dmkBMNVۀt,n)蔋qdٛoCЉtdIbZP$o[ x-?x c^f䦐t5͋FTDʙ_c+*堛Erl$LeE}@a/+0 fV+&r5CR.8S.d3IK{\TM˰nI*!)k| eyo~!5NқP؀1f:v?M:")wlmQlm ae\!#+/ۢ0+2+AE\)rkɪپu3eG Ӕ0ikS5uK("/ɰ57!mG&reeVXH4zbO"Hf ۻIH$/H/ѣEڎ"M:")wRUb)?NS*jc^rݖ n&Ph!-lZN{ֳ*)DwzMA(zUT"J/xCW[tʕsrGVXNʮ1t]ecDowK(Ajx3ێ<}5)wx77S YO+l=G3F^Bֶ4D ު#肤[tES0uX^-c{kL+A" PK :+(]n⽵7m@ҏVw:"+|IOH\ΈHjYv5j@I++>|tES0m͡YxJk0&HiM6>݌B%4&F^Pvs-A}N{}D!Aag|B$mq$̀ 3}KnGR+!x_>bEa&^+eU|QzMX "Lw MɾI\=PFέ Q`Z/~E(~!Oж~=c W))yO5A hwݢl'| B[[.u No!xO,Ug1& "M73޸"6} ūBC^A^1Wt^[m/}."w-imZ9W y ^BG)19EwzGI\=V ޥ%հ{qgƃFrޔibc6-6 !%eysLRe^6 lJdmEp!hjOSm]o1dž. I\=滴q{0\hzA҄j\Eg+3֠T^4m< v &E(dOo)y_|Ar<6p-z!u@Ұ[tJa"/6I b :%%)䌰9఻gpjNn+Kxq4V}N{cCG,L5cUC{e{[W v0 rKc,Wj%A}." UT;~ 2ԃ3Tn^1%dmΚ̤nsFi-:")eP4,9έrӥ$33yq벪[BμWwsLWjB3'*HdrEn}$Dw/D{ Ok Bf}XL0 ŝhy.-:".,$S>1Mq ;Fc#UAJq8Tk]=x MorC c4Vu.AZ7 T(7ormr&.BГe/ד SfJH %Td{vLVyM*`m'ٞ~+{m㼏TUn1Hn!0{%z9IW%i!ފ l˽o%x_}⟛0 lԄ/o;yElBfB1mW,KȻ䵒+v}."w֥sKG0늾`}&/(XX$2`mZP'{}c6p]1^A#ޜx]rEևn^/+Kg6]Y*LsLF@vSK]vr&=+1Nc+Dw21?ktzD_8S]j[#Q] қH.r]:rdCY[/s_3%X+(LL0Pa)=NZ}{ʭwAYLx&֡yP Rt/L~ǘy_s aٶq).[]gΦ!ݲ_ږ0KWm1qrCۀo))yOOwϹ/ l%p^, \ zQ~ Q Q #E(id /rkMζk2185t;N a_+=n{{YA/%iKtX^lEۀdr!xOc%jXٱ %:Whgr<%cDS=L%.1"7ӤorkyŚ os.d;h5ۺZ,8W^hpMqo" }N{eKc$osa*f_883CI\ Qu[ ^OiKvrr:$;>S'01i)A` /!_ Eu&r;b'dec:JQ B|SCH޴H9 - 1=LJMvQM:J CžRAr,OOYvAaz Pj@W&a`"=igeB.rǾ!:/Bۀ.{lkg{M5v~I0;U }KWwz"3OL=WTQ肾b)IkdmK:F6y+Jm@C.rk3Kُ^ҌW vKi-mk跊blur;bCW..3_e.rUMA/̈e _q Rċ3y7 /rk\anS% /0L(nxYCBEGaEI w[iZUp*")At{\1- 0tP;1ZEAAU5r[.I * )#BEpxOr A˃ٷ+) rV2;eKcK fwZ=x U? S]śĶ,;+<[ TA"Qn yEb @uMx[$&oy<ܡo2<<'!46u] ¿_Pu30Y k늶w:?+xOy@S qwӹEfK'dؒK q _!/ {m@p"/9>UfF˺1E B> K᝗PVcjn۞6 w ԠSpܐ;|6&״X /ދwgdɵF!J.1H&/sv[Vh[Bm* ,SITie*%<̓Ј b:'T[]# SncIJĄ@v "{wE LAab6x)1۠^A=r;fpLA6ث_]ilcK&&LB xۅahk)yO#id8gC﵏e:V /!Z7XKЗ4t%Sn#(>-]^`ȀzE{BeڛIGx -sGw׋6 "p 3.X.;k0]#@X`a~V!z8ҐfjFvv r=m%}b%BUxZQ @ w}bQdUqHǔ>K(+ j9m@ՠ{$rǩ;.ڟ8/[Hk;K8`6 -6vl"w E 1--"|s%.J*[6 ݷ/rkyN0"XA|U͓mEAg%y LCmט,[tESn)Uٴ3`P*#!J+WbP:v1=^;{pzۀ4[c Ji LQ _XaQG EzUZ:lήUm@!6`~ocXxBBjKmv/,[Ck;.>y+em ѮH!&+YyK!)S>"ՈŠʙd_[*r}xbO | hAPɂ^kκ G&^brx[v訆q2q0jA] cyo۳o)yOCe' |^ 9WXYH풵/4ÚOPQM"jO}."PWމ*̶VA@%ޤβ^_1+jqjڦta܇QX^Ha+2Z:Cȍz3舩/9aP~Xj;{&r;2CvFha%T=!"hjdm%Vvy 5 Sqs y.+U%x_#ngkp]: ɹ}3uXYxz_UW[=w[⾉J-ڳ1-@2mUt::/yJ^4+y-+yC;"DlL~ocu$sSÜtƸFБ3 ޮM! fx1Զ[}N{Qv#ŽTY5i5A2t%Ja-rh"݅A& !X$pٚ RPǔ w_zyۀ4pGGΕuM&u:!(!zPm7cifۄt.%)x_jVMZ)('- "1 wH6 y_}[E@:2 _~!3 e ?#}fs6κ -hE&r…S]- @L]vg޵H_XR/+|B>#LN@t16?GOR! Ybjd+NPpj> \,K(RU2HMT3Upʽ%w糘8!=^֏||מzJUQގ HNX"˸ Wqģ, 멣}']V#jn,ˀj? Y 70-+B=),-ug巏 On:#L"MZ_.`ڋKzQ1`21:=~h=N҃wl\Ͽ-L՘,jrSqOL2Dže^WA8]q%ԧ7tFM ;Ϙ`]W<}:Q)wXⴷ4Y-iaSL `qK*?:*j6HKTef~WʿǗFҺ)?̀K4qxez|D>ɧROALPW"oʃ{ԑtn{ߑkqwKp={Yxu /c_ZQ#k{=sTVpK`GX}w`6X=uQ}G,b;becX~ tGX>YUE+¾5NQmK3 EL:_Z.QrKۡꭸ,ێXu>lMVUCoT|*ІRqO//Ca.+xyYyM)Tz/ K5h cR,~uzeQlYQYzΊ/LzBӺ7zh#kTR=`i_MXDA!fA > IO ԃ,2<ˣ,psqB7e1>?SLC?X endstream endobj 490 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 495 0 obj << /Length 1912 /Filter /FlateDecode >> stream xڵXK QsIQ&V6f2IUjwLcHdk:Ӈ=t xp x!-Y <U?hP<|s/4aߝQUn~{G@\NSl~{,p4d76A%Lu>:KZ .XA&RVD9F$aCD'F̈́Ǫ=ҒƓi#"₪#<6-iӻ~8  C3 #tjL%I WpӘe,=1%D%qq#ω8Rxcg"$ ~#xiF`V=6gMÏ( j;,ez?xp`_\C8g5 zO45ˮuv _ 4g"x݅sVMg{mjl$d8'{W1jt6!p^=޼}u׽Q$Xӥ5:́XN}u0Hkp+6J0*eRƻV *z8 oK5 Ff;5;$uTs\M[T[A]7Ft,H1'; yK|%\Fx"Hq4X Vtp0eu_bcg&33M_gRY^boNa:S\}Lĕ*M0_aKx ב]\ݟ(!YzۙgRũmk`33o]4T5,\hUhK^wdl(E H)Ӎf5_^nDEtK oVDeFֈv Tnlat/SeFsfDKR'\`kWB$8$,Ie%ȡQ6MA7]\GqT3TS;VPj&)jvxy{vǥӨvRNZzaJ3#k޴7nQkT h ev^kbNծP2cGW%Bkd{s^8ff]5ۯ㏍? ~V&(_8=O1s(vH6,Gպج\Un0 `NMy6M򬈔T `U4]G0sxEhj:M}eǬb1/^l]]5gQspulk=L#M 0oڌU?<&K|~B!]L ܼs]b"θB c] H&/4% C_sӾzt:2C`.̤aUM:TW,e 4[f8" GdN5)ACd@ЖϭDzLgBULFQ۵D  eugQj#'uWx9W)Qq~+D9XHRߏ0o [CjT0O=9HOnje=`77Kih`~/[}N^M #9ӊBڋ/|YA˳B3Bj7&|4b54?.;ę6'Ⱦv1B\֌.-0݄jZC5seMfҴ-԰i_y$ |5üeirp=?xi endstream endobj 491 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/APClusterLevDataSet3Heat-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 497 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 498 0 R>> /ExtGState << >>/ColorSpace << /sRGB 499 0 R >>>> /Length 18564 /Filter /FlateDecode >> stream xˎȖe9a-MIk@w=U:@*gKwO"w6 E(\<<ۏ?}ݎ|_u~=h/MshΞAs<{v~h>gۿvzҜ߁x{ox{_;u|0g=9۾}?#s;_0;s?0gKsmzmw䶝i>=~Ӝu9;n4g7~GnG8|߃oFsv^4g/?o{#h>ٸjw{W4fکT^= `B3n-fSѲ#=w>w & z@vn_O:i o)v+ڮ[fwם#>o8x6د&~mCޯ=q]jl'_Gvٕ>߇&ۯy_O~\ v>o KȀO?qnC>#D׉F=|zy"o?cqD) w})eGy\{(e)a2U6͊NtXh ˰b07ËeCDˣaa.}\˼E'[F~prQ.pxq>n/6\ аȇ%>aiOm.|l tP"8l]by=q٧8\'|N߉9gܧx ;x <sw&O' Iѻ)yF)9'~U@\ H?O, <ҷ}r^@O0 &7)Oc{re@EXї 6x6U5 }XE_rt߈*zsgAsHϨ(>PѻS}8'oz߃t<tw[JѧR=g!"<җLmrO@|׳DH݋zBsr@MדH.Cї0x^E~_=''|==5H7/zݯ('Y ]}LDLm \U }N׳DH`g[3 =0?GnAw M;u[pfrj&g[0Q{;var\/L=kjr݉-87n`r Ν;uٺځM|WuˀL7]8[7+gk`lqT̝يΝg[tl\,[8[p62,$~~W]ѹߵK~w6`}E X_ѹQ,?̭?ia}q -J~wv^d}g <=7ă ]b7+CΖ X`;rp]ۙZ`{^ 3w8gYb;o ClǶ08sClgao۱- 7Ģslgu(.ǻ`ѹXX_;Sd}W[ߢ`}EW[_Qo}W[_Qo}W[_Qo}Ez[z+o[_Qo}Eַ(X_Qo}EW[ߢ`}EW[_Qo}W[_Qo}W[_Qo}E- W[_Qo}E- W[_Qo}Eַ(X_Qo}EwPz+꭯Ez+꭯Ez+꭯+꭯z[z[z+oQz+oQz+꭯Eέϻ*R[ߟo}j}ޛX߂[_wJ ַ`R[yWwulT[G[_w`} έ5X߂sNia}UVdn}݉.̭[d}EJT\~W Iw`;E]e. lb/\ Ǚ`; l**3w8E .X4Uf `;'T<kagnq`e!M 2+]QxPR~ܡ9w(\8*6PRmܡD1w(N\CQb@3 '5W(:P";Z8j=\!I9q> Aaa4\Z Caah6, ݆pa7, 0.L=0twx`l<,]sch=, Saa>, 퇅04 .AbahA,|脡 qaB, m04"Ną0"fЍX~АX: CKԓX CWbahK, } ScbaL, 7qajN, ݉=0'ŅC0(Фx`R, mO04*NŅU0*fЭ0+~аX: CԳX Cbah[, } Sba\, wqaj^, ݋}0/ƅ00ĸ0u16X C'X8YsZj2d..+T.W=+_r?O Wpp+#+/~VdaHs+ia"\Xq?+-\?+GZr8ܕѕ#-\9)r +W^\0rapʅ&W. \\0ʅ +W. |`tʅ +/L\\0rap oʅ +W^\0rapʅ&W. \\0rapɕ +W. 0rapʅ +/L\\0rapɕ +W. \\yarʅ +]0rapʅ&W. \\0ʅ +W. 0rapʅ g_ʅ +W^\0rapʅ&W. \\0ʅ +W. 0rȕ_^Ӽ2+e;32ʋ+/Y̫ɕ\ye]}eOG}̠W&2蕉 ze">2dЋF2`ЋF2sn?̠W&2蕉 ze">2AW(2 A. }6!WW(z{BsGBWyuȫ+yu Bs~a4f]ȠWhr̫+yu^0ta0‘AWh^Wgpd. e\ȕ+4wpȕ+ e\!pW.<O'ra࿅t:m"iF-ُ|pqw+y{V~+lOݳ= |B䲷W({˸B[iHH'P>qfFS> -^>qH ύ4~nFiaHs# G#]ܳ2& e\,0Xfa`2&, Y,0Xd2 e, y``2 e.LY,0Xfa` o`2 e\,0Xfa`2&, Y,0Xfa̅2 e, 0Yfa`2 e.LY,0Xfa̅2 e, Y,sa`2 e-0Xfa`2&, Y,0Xd2 eӵе #%PTePTePTe]-{-eCQui G E E .9m*k*k* eU EU EU EU EUʪ+UY+UY+o .L[0oa - [wa࿅ =0oa࿅&- [0oa߅7࿅ .L[0oa - [0俅 ]0oa࿅&- [0俅 - 0oa࿅[0oa - [wa࿅ C0TY&- N[08mapڅi - N09mapഅi .LN[08mapڅi - N[vari_w-kQ碑.ꍴwϢ`%\[fQEZAz,꽯7E.WmQomE- &V;WQoWEG-ލ6 * T,halfcRl y. V)l`co {*O&K' դㄽkBT;ަ5L 02ao{[/a[d {;` S0TQ q40P)-Rc{3$ 1aU^G 78iLc/4w*=O}4`.Cݝ0 { w go~B!cB Qj~y4N!o#Gs^#QSUn)L=ZέӁP?'B]^GޯsŽᡕ>ѣ)LFNOzN':NONӁ^/*`; Nzξ3Hd_tR詷H S錐>qRw@Ȑ CjNuO}磇#Q/RoHMxz$1<<WqyݸKK ^qK~-oc~ݯ_?ߟK,d_Av{_d߿߮yfA.=+{yU?g}Os?ÿ_& ];u!ou}vz3ߧGþub:|xq7_#ypq\ϲJ#kOxqwߨ}ϟ s}|bek?i_[ƳяқdK۳:X&o s=.-8z>oMu t]] z~z+]W׃_麺B5J}ΑM{Ȧ}\n}n,lޯȦzU .uobӕueLz3][aZtq]׽je˼iNպ~v{]4&W}]p¶#+l{^Nwv^ +z#^ac/XWPLG®Gfjyv|_xvle+8.S< ;o~_waF8^al7~m9G8^a#B<  nDfZG®WhR#^auogx]wCF8^as~y+ynLpž|pžP>v=Tk{WS=^aףNdW A~=WO9jk2y_l|~9y$Ao_ e{ɠŷAC-qU8uq|*t~=E8s|~&9i_5߳ Z|(߱ߏC-a]Y[-[V@oY|~?[7Jc=ǷK,K?%s7_[WGY|8Anc=Ƿ],;0o_=ʗ&]ߚ߇5p|c-S:oRem{)w'_E)[{8#]7C,^Rdƥ Y|7*u)Aߌ?X|/؞cc{8o_0oדcMw[b, X|*)8)4{}o%:VF,^WW x]=aqv'u8چ꼎-/2TX7xQ=wixM=`z>ՏWy[Wzm_zz-9x x}no?/n{\܅?/ܰ癟/y{?T OUƂ endstream endobj 501 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 505 0 obj << /Length 1656 /Filter /FlateDecode >> stream x]o6ݿBhL""%]v]ѵAiG,9$;V xw<4G4z1dDS͢Yf<$%Rd8ah'<㧳qmżʦLĂN^~:]G#P,UDhh K"JRKOR. U~n-O9yYBqQULMmnQtmyiajq(&GJOc&cvfvE=-ڀ}ubL5m0]g$P-aTۊ;֠5A ! RyL'He3EO|L:KƉJum޴n'wumU,IYTAŲ2 Sw,if^τhm TʼXN;|ۥRr׷|/׌4[sMbp]oZekf5ļ+qY|>ZnDsNµ1we\Uh F+:$c8иZVMւi#m6NSNɏ+͜dFLk.Ve&UkK~b SEI 䵃m-KLN J9a9C^#)Դ;ƩYcXA\q(fMU5N˲# -\8?hG^`)Ƚ(+xdQ @S)]ͣD3Q6od5rys)ܯVH8]tH%{om0D;6g C)R.Z]Nb#6W{HspV Ȝp \Pߗ x([M ЁNɿԅ_4_U[IrFɗwƅWCnwD 7|V\^-~o1~6%PC$e 'i. ̵|_! v; 9X7 ]6ָurֳ3 ]5l nݦ$N?6teޡSKîokxOq19zir pq=V2t,*4QzpӷR=޷툠l r7M*%\دvFR~RA[*/`B/XW#>\ هΉ3AнD_? '/\F4~ endstream endobj 502 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/SparseEx1Run-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 509 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 510 0 R>> /ExtGState << >>/ColorSpace << /sRGB 511 0 R >>>> /Length 7605 /Filter /FlateDecode >> stream x]K-;N_0`uQUi 1:4BH>pe[08kvp)Q>~;Omm>&??VϿ8?^kx{{z Tḫ նU*Ojzh?}o:(%_竵~_l?_?f.xz}|ڮuq1izm_emN5gr{t.@p)P, p-p. ߰,V/#ܥ??f?F|k"??f?h? b?\Zn G1n4~KʩԯN}[?}mʳY%ͺ! έ1/ʄ }G#,G8n^Ă=oީuҪ[t%U~=_;{lZuqB!40cBŌCNe U-R|hB%7m=W&䞎M]4~sl|H@ݍ<5@>P6sbګ-Nـo2M膠4(s%}j^A'1[~ 46]zw;ّxZb0%Z0c- Ӭvg&}ɗ ۥrܼ3"]zw[ƣcUvsι{`1;LTbY*ٙSTGUW?UȈmNr؛}[kF3I3M7K%STiCU״}Gh1GF(\&*,.پk͘f{fgku"jEB[/Q{8u?b\ps7"4E u f-1H,xZRVu Ԣt~LdcLW"bUO=|-RI!ߪ R?bbNչT <`z0%oYl@,I^}[ƨ`D 5݌JG0Ӏ\L@5HEQc)*EQ|O 8ԕ>10wK]9xËݚ!{&Hebimz Uo |:͋0g $ 2`b;Q v +m1;1o{n]Kޞ/ђ+#<#1 ٤Ƙ7|0 fiaКɻec7مE^]P+bLA6D7*OJ+hWB TƦ# D";9-Knѥxֺ~}C)ecGΩg_bMG~K b?uFYLwF?%]{/1wGȲ 46]zw՛}Om jw=s( }Gڙ~b1f[hyeb$KnѥxW-΅n>\1M:AB}'|(ӧAy azmt~$enѥxW/wKqqf mBn;Ek{b%/] aqZRui4y>J "'wR6! چJ/F]ַG y{-n{$"ڒFHcpmp^MYKġwke"E!pLX6+ڎ%^Onَeݛ0=pVV|LLEtjOOC'wW7dbmwȾlBcQ71ƳUoKG?6}(ĵ!Th:I{v+yAv΀tAlBzQ˼l!}E*)ŐW>ђW~ILgۊ%E^]m6r<% U;s1AP&cmqVQ70xַL:6Ek1Q>o]f+FC#p wLpGMȫQm:2WnWz%56k> y?ϛm+p%1;`ϰ¸ewȳnѥxWmט#W##H{Cbm$%XԂvیأf>[j:E6[t)so)1>slAQ/lQK 2fe$oCܲ[]˼Vv->sA0'5h><x:3ߵ+ZnJ-a?.Gj#EeV*"F߁8[Z^c:#'6koZ>x.^C͖71Ӽ,eoiy]臭(xWo$0D'Ő=v>`Ti !xgJ' لAFݦK f.eohVrGE0bk8ʉv y*k~9tA6ː|ߒnM׉]O"(,+[qe>`J`b 'lSI}@+@m:6DC<]df<`OUv88oHunIGn93sܰS8n:KWн}2f3' qbiM"D S>9 S?Q@48GFLѮ9#j [RZ\F|ѵ{B rYH>/w }wWShŻ%{ˮpݢK/z{?rw y W ~(8\g9i>=7885ȷsfPjOSTj#EWwňhz$0"1;\R%s0"2RdENE:91ΛU욮&zMgn{2wbѽj+V] -eJtE7myۈpr8NFEPZǖi=[I^Am1$XV-w"\]wyx!&vuI V B, "eN&%ML^yILJ)#YKޚ[]bV lfxDTAЮ&8yA6K )tͲ7m覆eD>o#Tܩ,nm;i&fذD/e biԝkz[™tl&@&Z|;{6 Co09 Hlf]/[ڲ 4ݚMo.\Ƙ1'b0 qlj!}\{I^CtV!߲)]zMo1Eyc5xp#ub}Γaj۽%v`Șp9y.K&5otfhTb>1*.^A/Ay -(nvTCH RcV,a$ٙB$" nżyZ٬[t%Uo}0 ?$4;6IkLJʼ(oqlB[tkJ7=O 9#<_L}خܼ 8(cυE yv􈅦ã{cn4rÖYXɯlH^CKIGނU.M^},`CbpA3~m~ 9l<6+kbQIޝ_.ٻW֬[t%Uoϗ87ǘ'7#5vUry6okm[t%UoIDNQq>4a㠞7K(/&1J&Ҭti*Uo˱qcx!hWS0d_>ʄ6zwP0NhLEqUӐe;n'WPl+Ȩ)KH/s9Udo:Zm7/^Ao #O]:іlA,޸Nw")gcaLaV=ozg ej1Ny >вK&n`R/m;3vL`Ðqa;vt˶SSv vLɩiTKwϱ 5z?-=q4Ty](t+0v`ޞKnѥxW݇Rhr?WLZ!1s`.7!ǼjaQ4/^FH[&qnҭyt'޷ Sq7ԉ3-~8f iE3MvLb6$Z7t-er<QE`R/m5㖟:Ɯ8y L]#ww"|DS :R;cvzOwy^{K4$8nc\p#AriOWq5覆؎-֎+QҊ>q!j7):+YZyyuѲ_GݢK/z[z;: {(.:82ML|4Idv䓱ԖXuJmķaOUaC Q؉TPRMJ(qW֓ -KSz #3n(+>1c{@hQ94*軌voIk~wRvwV|-覆IK0tQ^] ːSm 0n*Ch;y;R/-;Оu.87 {3 ÇbELh[:T%7'{ (+֋oz_p]*b7_F'14Jrs j܉1:loA[v\Ktazapww{e`b E 8n Jn]zPW<-s-I-Hg֮T_ No=y vTfr"Bnل';JUXBɗ0JK!l"p|,.S!JA=9z=*(S|ݑhĖ)E{0=ƞJ=->ŧWE տO.ͧ~cF|Vc_+zgx >TܑzCE ߉yGOcSWM/t|y8xl[=#No"Qge=xOOu}>p_Ar^~XėyYJp~,kּT$o_g)[ _tZ}UD"/]Cz|nK1嫦{C}QC !O%|_˞)^Kދz-WGdߝ-F.ٷHY(xt9e?o|UiK!N[?™'j =|Z:Oe2qAu*f8 騏9YEɯ=sUS(ot)Ҭ⋶zn]%/1kn=UT&<2X.Y)N:~ Ex &T<",K]OpI,?: c7c> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 516 0 obj << /Length 1479 /Filter /FlateDecode >> stream xXKoFWȅB-fߏ94-ֲZTI}gwgiYiˁ^po^lfXM3# m%)t}9OziN t_b?JVř‹H*m L>9O JZH7! !UtƫW㉤:B/@ 'B - 5`MzA3C36J'T0q0( AxQ+ޞ v'ȴQ #8{ajHޯi[VXF(z"*Ca<#J+D:ԆMxd|$?JB>( e~x&ZHC$ PLp8|@X( mlut |EA}'Nzʵ2sPS26cq;[v,}s!t=c @R&R) 5J;;z-f[a94saD`x@~AJg)v#K廰7[Ngq\\X<"_BLYD'q(QDE"E4pvKqcUL4T mjrQ4ʑB> stream xڵXK6W(/PI do=m ÑwCɒWiw${szu6J=΂ܻyIXxqȂ0 ܻ3&3]WFĉhf_d'dj`%*\^_^}]q8yK€ԋUD˪-rz@ȻD4y}ZbNiHzv=$~DZK8'܋YZt%yc0HcPx; <ںsp2e(7%[,gr ')F>y,d>{ބJ@s}0 DfCXcg$otvYU \Z9:Fʺ z+fU$偔K *jqє[@ [nI >r WS&(QtfblIM'X\$5Ojf8ľXS^8e*TϤT?L :L>7@%]!4<T>_/=Ȥ|ѭicR1J{G z"}(keV`=6+hKBiN4[iP 2H gc(?hjNhRP eMz>P(.:ܻi,]ww4n/xSRW>]ճ'vlm;B@j"sgg!(y - ˸Q5C9 s!W-H,&{'hyC$ßl r,v.s]wgiPON[!+S⥌?شۯ 4/7׫[, endstream endobj 518 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/SparseEx1RunHeatmap-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 527 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 528 0 R>> /ExtGState << >>/ColorSpace << /sRGB 529 0 R >>>> /Length 47433 /Filter /FlateDecode >> stream xr,Idߧ'HPЌ17cUn _|TZ#"?zח׿~^:~>___/o_oח^z;?~_G?>__b/oľ^>B`/ľ^`_ߤ7}}|zyx#/~&=?w·חzoo7x>f{}޾^^uy{7w?,oo᷏חwx}/~]<.~/"e_ ן?f?~|gy~|g~{g~}_D/zWw+>AG?/9^?]>?.o/쏷?Kx9#p.7gg#p|ϯ? =~?_y{-,8؇#iKR-&Ǐ+'{/Dߞ~>#~~'z=#|~ D5ooH?_~?|{~D6/D=#|~D>Hm>p>~~="x ^O~?~-׏x?~2_Ux{{~9Dv{?~2]xjү7Dw~Ż~|-O?ߏD_wx??~=*}dgz" #ч>.Oz: n]ZWxp~=9}{]'D_ϯHq.㡓?|?8>^q,緙7~O-@zzJ%̰ .aMq@͛znCUONmԊ28؊̭||p&~?̳k1]̹Ww3s.FtcHqFcݳYgFW143JCz3#_<@5D?y?ϘfHϡ$ҟ$s.r@g2sk6ItH$s0r`C;W&%/^F58q:W~(9(8h^ᕩ~2`~[_#ٺ(PuSrQ򓢗%///J^. ^. ^>\\|(y(x(xPrQrQCEEˇ:/m~EBgJO$;QYfY}|.d'1ۿM'fn*=j*=j*}FVSTS3Sij*L5 ME20Jf/ f/ f?^Ң0JSiQJ%PJUU%=UU%=V/Y(XPjQJT8h5 ٯh5VxhTNLv)[&C 2*;WWtLeT;n 8hvbQ_g|[0eQ0哢)))%SSSJ, , Df7f/i`'$f?`O`+^0;jV_'~:>jm"􉐭l֦+UK@m֦;U mfd%o >l4{i6pQpmlզCɟEE?)f'6+J+zdJ+z_\Qܡ乢ͩb΀瞴\e6smehE3C;U&{)P0ZSpW쮢լڙ0g.rWQpW]'ӹ2*Sd 3`hE]MRERVSig]E]O* * :UUu(((PrWQpWQpס䮢஢C]E]E]w]]\-dъuX[zv|mzj}FDDOM'R9DzU) VN<ʉ9ʉ'R9A'XĢ~mgi2մ{2dʢմ[ peȪETtnei2`CEEidi2մ[j=jDm @X}`(մ[hNZ4;ݓn@ݢ |_|(((n*L5VCEEًÛVLe듡I(xh5iL7iV^~(MEEO. . >l]l]l}(ٺ(غ(PuQuQd``CEEևf[_Z:ς pE%.ٴY-LZ\ʪi&d6mٙƟ6mٙƟ6ͦlX4;iTNLvbl๦G칢๦sk=W<״\g<יsifʀ63pg{h)Nl4;(8ivbĢ ܙfLvbZdS^^h5w3V}rjlզ٪EM)fSd6<4igQgϦٟEM?f6lY4igQgϦٟEM?->dզٟM??f6,ZMH?جԞ`3VJmE"Tz"d"Tz"d"Tz"hբTڙf2`զ?+ \ \ |heoO. \1THc4>i \l+W$`v`Ղ٪UAL4L4LvmQpmڦ٪EMvgeM?f6l2?;4(-4(܀?f6mfdڙ3);Ә2`ʦ);MY2eg3i Xijlբ`զU;Z4icTLc4LedS6ͦ, l-˙nYTVLjlCɪMUf6VmZ4[ijQjlզ٪EMUf6Vtm kf6V- Vm4[(Xijlբ}o[y_TV |`{"ۊ, )i6eʉ'CN,tcy&92ىM犂犂o;ӬvY 9hؙlʢ+S92OsbeE7;|ݯ4hʀXXx(9(8(8PrbQpbQpĢĢCɉEE-M>edʢĢĢCɉEEv/?@4Xy)((PgQgQϢϢCɟEE??f^uZZ5|ȪM???%J, , <Ϸ痻^WuHvmƵ'-جV$[ʟiY椰U 6HsRDiN Yi4 id6lYٴYL[pmڦٵEMkf6ͮm][\c][\X}Mkk6Lvk;Ӹ3TZpmƪV-ZY3U;X2`զ٪MUU6VLjQjlզU+SY3U;X2TڙڦٵEMvje*v&[idզ٪MUUf6V- Vm4[(Xijlբ`զ٪Wi rmlզ٪EMUf6VmZ4[ijje;HS0^rFSxkEOXVYgHdՊ,M9^9KkS,ڬvYQzWtrgS0dʢ`ʢ`CɔE)f'%J+ + ;WWw(ٯWw(ٯz~E~f5=)yi6Z]'C*,u莥^Nٰ3ر㐥fK]^cڙf3kevN?ٯޟޯ35mV_+Sv&;ޯ_e~E~O+ + ;WWw(ٯ(د(P_Q_Qߡ`oK'9(ٯ(د(P_Q_Qߡd``C~E~E~v3WmX͉H&[l'gw`5'H5'>#d fF+Z~fYm|ˉ2CsEsEs犂犂%J+ + ; ўv ߿]n2_:E]]OH:"ͽ'B:pcVhM{19Uteti݆ 'CF+ܡk\ 4;|S^>[U%mLu'g'{qEb`CEl``CE);n3]*Jߟ hؙv (P}Q}QMËVwCvl]9LTL^px`l\CEEˇ/_f^:dCEEˇ%///J^. ^. ^>Zx/6'$/^>Y=j="Պ4gTOZ;HvZVgT+ҬVY;=ra|4jg4+7mN;0iJf4-g*מ MEa*- l]l]l}(ٺ(غ(j2>l]0ۺ`3EH5EW$ۺ`;~j^b2<%r ]v `$7ps[6<9rmӥkݙd]0pd<_x(xy2x~^x~uf6,Zz-@6hLs -5n`Z@c|Lz5B Yu at*\E9(inLs =in Ls7 -inLs Z3;}_|4iTL4L5qw&݀(Mٛf7?4;ivxQpxEMï>,> dMËÛf7/ o4;(8ivxMËÛf7/ZMNwH?~`3qH5qW+L'RMi&dXMi&4B}fL3[W|_;}_^4)8PrxfL7Ͷn\ 4i3[W;V- V=Ⱦ"MYXX}nM~6ugsO֝ifT;jL3[wxh5[w;֕!mftLʀk%\{2k+S2kO\4[i3[W;-֕f΀\\|(y(x(xPoJ.J^. ^. ^>\\|(y(x(xPrQrQCEEˇ ~~I^mW3B>l}`sDiNbS'\S9sM}̵UgM |`s"ݲ&.ZL&ۙfM2CMu΀[7^nڬVZgLڙf2՞fgEn̟ϠZgLʀ\\|(xwٓ%///J^. ^. ^>\\|(y(x(xPrQrQCu֏m _'㣀/Y=jM"͚lEOXVY̪OH>"͚쉐ld+?-"ݱiVj;^ZLvxSd``CEa*- Sd``CEEa*=Ң`բ`CɪElբ`CɪEKV- V=ZҢ'ũ(LE+'LZ;2+fCsEsEsvjeY2ݱ h6eΉXʉ'CSiэWͪ'ͪY(̪vN 8(8IщEEg,M)8PrbQpbQpĢĢCɉEE%'''JN, N, N_j>lvf+̞yfg"쉠6;|lg~%mvf;Sͪ'C, , i9SVٙL ]j3դYݤYjҬL5i y(x(LҤY4+=\[\[4O4+SM&͓&TfeIdh,ZMivq+y2WWAn ^>\\|(y(x(xPrQrQCEEˇ%///J^. ^. ^>9]"F/7,NLS9EܑqGSiNWs8]͑h])ޑo0ں`u)l9Ӝ"~e 2M_4:EÛfhtF[7^~^n/4Ek_4ivx.]4E]ѵMk_4EUU_4E 3ٔ/~M)WJ;~/ZLiWJ_hʦٔ/MTڙf*}e)dShtSigN|h^칫Kh܋F5͞{k=s/=4{E^4zi܋FϽh\{蹦s/=sM^4zEfϽh܋F5<%<sV{F:ϝH^>^?PX}|UaM*J݀(t n@ѼR{k׏z/V/օ.|sEY%60,7wd1[ aۑ|sEVup+]`q#V_{BapܯUW&7pn4WyAWfyfy~`f/ 3{EAk˸~;]q0]ˠ Ӽ@OܯfO;' zv'[*h=iD(Min"Ls! Min"Ls! Min"Ls! Min"Ls! Min"Ls! Min"Ls! Min"Ls! Mb6Lo~™O6'Zܮk-iZ e];tz@t˸_10k Dw3C ×/v/Z Z62UkLZ8DšӦp&7;Mf>asH9L:R0&RugdgUD6VU. :l]Nq{j"U9VUv# A4] VZwoݛB70ѪP&S~pf Z&&Wf#T=d`)4gM=PDGPf#k\We:Ud]vAڅ.B PjD]va( .B0QhD]J( . vAQh )}2yh.(h^0 }y(]0kL t (J/wy5i^M J^. ^.Zyd:/WreT ^p߾_OcLNdl}߮ooG+6/?᎗߮ X p>n]ZE%p3 J/`p̎g#|_٫LWAj3;l8qE? %= 4{gViv%8~nW3ͮg*[ ٺ(غ(PuQuQd``CEEև%[[[J. .' `CwlsI.S`pfc-X pY q`-j_3;g} ;CGm*8Нugn~D &B|(y`<0PntΥ_ zp>`>Ap|'s>⫩""_fHnVSE"M0_0 io147_h Lsc`Qh L3_jL3w+SMi4Se`o_h LbLn D10=3ߙfL5w;{ߙfL#(=iLs =iLs =iLs =iLs =iLs =iLs =pg6NBaiLs ZM=i`2ݞg=4{ y5iDuuy݀hnn4(i^7`|m}5EMٛ6k 8Ӭ1pYcLf3yhu Ήj=C'ܹޙU?Ak}bA~`E(h0]vytjED D'N,0]HEU?AԺk+D+i"~e8鲉bP! M(4C&BDB! MPj"D&b(5DB1Qh"DG=eeB! ]ЮP jUř)WU(SP& J'Dch{(*DaUPEa hl-Ϟ Eg. Q8Z Qh-Rk![ku]yiE! (L#M]Z XhPYѠHB \Z0׷6EvAaΈۿW 4&ۅ~ . yin Dsc|hEiBGp+D10mv\8Pj igQX`ڴ4(LLs7 ZuѯLs -QpiɫD+w}g*~ gLW4;ivxQpxEMÛf7o^4;ivxQpx`,̞>G4;ivxQpxEoڜ0g/ oڜLvxgÛf7ogoڜLvxQpxEM78كÛf7/ ot̃Z70j݀"ͺEOH?Y7H}'RDuuOY70X7 جPݺgu@ 0 6i5(g)L쇒ً6ki(ә2+ӬPZ Lf-2վg6NjY@Sp6' Pj Db݀3;g154ZgT=dGAz#B =PDGa(#B0zQDG{OͲ]O AzQR =(Csp(ӬLf-3# AY C@ =PDGm(C=hR =(CG;L) B7 PD}'|"O|+ߟHO`"O@9P䟰:PCE*?#+ߟ KW}e|_4]Mً%f, NIt9%hs3~2r0rmzȵE du]Eug/Z|L5Whړ!J- - =\[\[\{(((PrmQpmdӓY8}`)PrmQpmQpڢڢC20fg+SJ-ZJ- -Z'C-ZJ- - =\[\[YaLuZ3CEEˇV^^>rE/W${@ri|" il]l+[WuE[غ`cd[ٺ3;m]lݴ;^ZLߙl`;ӬW;f/ foڬw1{ed7;/Zweg0[7=4i+SMܝiޙlC544pi44444wV444{gr `L'Mܝi&44Pf,Tygrc ZMɍin D10ݸ6ygrc Z:W( ͮ~gAv4 .v4 ]3A ~~'RP.`"Uc0`"= 'B'_Ҟ|ӍܠX>9Dn@v݀2U7 tCen`2]7L (PDn@L (݀(tCn@#(tC=n@P&E3U '-[e@ B 0ZQhDJ-( @ZQh<_E7@'@ZQhR -(C@Z޴YwLPjZt-2Wѵ@ -PjD@hR Z@ 0 u`CEӼF_l]l]l}(ٺ(غ(^O|$[?!@~WwTde^ZVTd fB4{,h^o}?by*f?^ta:V;YU0?%fх+g59(8еW^~(9;}wp/uzWO/^:\Ei![[[J. . >l]l]l}(ٺ(غht*Sd``CEEևf^3Sں2+W}j v (lxd[_??l}(ٺ(غh~~^jf?jD`(nw)~o?)~v(P$4&SiNLSi Lf"1p'L' i@Z L`}Չ4+V8Ӭp&#6+iV(Sp& ]V8ss9C@8g548Ӭtf?NqDg6@~~BtcYS?1 DgOܟN?q '~B72;*v_b8;9Ds3{6v+0&R'~b`c" 3BHޝ1:QHP?1Z1Xqr2 eJ(P?! (CmNXpZ?1n2O.x7ɬHWQmjUdUltg˸?ujE~J]ѬP3.#ΫO(]IiNnp2&C](te .C Q2R! ]h2̪B1 Q2DJ](te .C Q2R! ](tCU@! Qh-.4`#~ӔAz:e`(CG0L1 0L> Sh© zt#(Z] -Pi-@h@M HnV-"M HLZP$p&4LnLs -i8ӴTiL^ kLw}eyi/!Z]љpxgËÛ;83+S93;~h4LʀÛf7/ o4;(8itο_+(LÛf7o^4;ivxQpxEMÛfޙ3?*tiV)8QLs7`tTk gz6rTzf=3]v4 ]v4 ML.8On0Da_i`[ѮxI] 0'``LjHugEn`" &Ruiv0Ly 'M_~(((Jf/Z2e:W2{e쇒ًVfLe!ڙ2Gv&eVgUd߿heE;WrxeOJ' L+/ y(x(xPrQrQɼY:6@\\|(y(x(xPrQrQCEEˇv^LT^~fJ/WreˇV^>˕\'C^. ^.ZydE+/W|(y(x(xPrQr'y2CI3$p=VL:@EOHf?9@|.;ß;ognxFjv-2'*ޯ 6g8Suezuw߯:es Az]̑O Gq634g(SMLs63#;lga29B PDs Y5a)tCsA:9B PDsa(u9B0:QDsuT2UpfAsP:9B Zu:eAs u9;vR] tCsA:9B Zu:e4; e~B'Vz/} &R4p&} iLAg@89:>4N,p&-4Zg88A.4ɭn3yMiO(i'Ls?! i'۲Ls?a Q'Ls?a Q'Ls?a Q'Ls?a Q'Ls?a Q'Ls?a Ѫp&7`a2]iLse88|tgttgr?a QX`DVwqp3}*.4wMLe8tU'h~Џ@ Ma c@P0&RugHARb`Af"P10vl0n3yg)tCs簾j3D O8Ӭp~´Y?L~Bj3 gsJh™f2J gsahR™#w9 A(VJ8p&V8ӬpfgK;.L]څP ( Cs׫ QjD]va( .B0QhD]J( . vAQhR ( CvAf3tiV?8W? @0ZLf2fDž296a(~0ͫLQj D1t2yDž)tC'!B 0[u֭R8#*T&NH1Hl ww&RR8#Ja`Ja"*3BjD` U T`(RV)(|\ ShR Zpwlgdg{UcegTi (SLo^O@EWM=}p#n2n`(\4`hB@#|(h#fG2Ze4;v8l v(C(41X?#\(v8=PDbG3պet iv8 Np̢sWh9nL'` PjD]va( .B0QhD]J( . vAQhR ( C]vAڅ] պ3SP&vX!p DZZe`-(ZE . vA._n-2DB1Qh"D&b2]LD(S5e&Bh"4U!9@p'$'N<d8JqQ0ZQ0ڡd``ChEhEhъъ%JF+ F+ F;VF+ F;VXd`ChEhE_83[g~Unj^>hyh5/L5٦d|2d\&TL5L7W,U&Cɸ2>zƕ㐏VSte)d)2࣢ռ|2*>*ZL9/W+S'˕ʀTreydy2ռ\dբռ\pݼ\j^ xPr9ΐ]O3TStSte)2}2Mcp<37McH8R44#10`n 7]~al c .vAڅvᢱ]0Ecp.vᢱ]hlLsp.\4 ]hl..\4 in.ۅv4 =]4 ]zsp.vᢋ*Wf.ۅ3;Wּܞse~m;5M3MqebqD6Mĕh"44MĕMEca4Wh"Ll"Ls簾2ELD\D\h"i+M2Uqe&M3Mqe&&´i"LD\pi"LD\D&Eqeba4Wh"Ll"֯n'֏ӴW&Mkqe3"?NZ\pY~<mPkqZVD~tD6SpSoܽp.Cp|Q1R1pn(hq+qUPG" (t$C#D:ԑBG" PHD#d(u$БBG2:QHD#J;QHRG"z_HD#>WJS?U9ŎD:bO3;ɯnz8#1iC hv8ӆQhC6̢ b݆2 Y_Ξ{SpebsrQH:P)v\b3+8^fO3]s 4'9䢱 h=Lsqe\Zh{ EcqQR ;B04 =Ecc`C_4EÛf[hF7mw ?0%Qv (B`k-og9p'q5g;~B2``q?E]Xy +6w2w3J. . > \ \ |(((P2pQ0pQ0d``CEl`CEK.ZVν?)(hqּ3ݿ)4{(՟mtmk/Yx9=N.v+D^>ttk/ϯErӕZxӳ]x~z>]q_tt;^~Ϭg8 /wreEO^. ^. ^>\\|(yhF7%J- - =\[\[\{(((PrmQpmQpڢڢC+~;6HD0')Ҝt (OrE f/Xy"y. |  +/M7f෋ؚ߯9mɸirQrEMf//7^n\4{irQrEMEM۝3 [>40^n|(yirӥ߾w+Sy3;'㢕;4|;{f5kɸi6pѝ_j2L}+S3;'xg[2kϏ6 Ln |(i6pl`Mf7. n 4(i6pl`Mf7. n 4(i6pl2v\{"kOr3ҹD[0) '>!9<lVO:U䩴iJv x(xP\Q\Qܡ乢๢CsEsEs犂犂%J+zdJ+z~~ EsEsEsO+ +ڬW9_TygLqiօ+S wWwh.ܙ⼾+S*L._Tyg_Tyg`lڬ wYL.ܙw޴YLʀ犂=W ϢCɟEEO, ,Zd:Vge*LTLϓ i3vyh4lg*Lʀ?6le:Vje* LM+Vt h3VgeEO, , ֐UY(XPjQjQꓢUU6{ZʪgvLT<gQ4)?;SMLy2)+,Zd:SV2ee_}i?;VLs_,g*Lʀ??YYy(((PgjL5 ((PrmQpmQpڢڢCɵEEkkk%Z͟_=VgEW1TH? @8)LpcD`,Z0ϟ? flzOALAmwPVL6elʢ`ʦٔM))fS6ͦ, lM4(i6elʢ`ʦٔM)_\eVL#XmMYLX}M))fS6ͦ#d)Ly ʔHiʀ))LY0eQ0dʢ`ʢ`CɔEE)))%SSSJ,M*gn#(P2ecY SSJ, , |R4eQ0eх)~<ΔLY0塝)+S2)OLYLY4ϔEw[tbe*'LʀVN<Ud'(~ٰڱ;cYMx2+N, N|Rtb;???%Yʟ'y:fJ- - =\[\[\{((ht |g/lj~rxQpxQp=lrv?'R9~"OH?rTF?!9@py@Znڬ wYLʀË%J/ / ?^^~(9(8(8;Wg֐ËEᇒË9(8PrxQpxQpËËV?ᕩ^p+S92O^^vOv+S2O3{eE+L7Vv+?}e*W&i6VL^pxQpË\[CEEˇV^L員(̵Ekkk%J- - s4(̵u=rbE'V$Ck CK0{kDӾ;โsvĂىD3ymڢ;4;(8ivbĢĦىMf'6N, Nl4:1]TfenjqĢĦGtbĢĦNlX4;ivĦىM'Vrbg_tq]Ŏ~m9w8;w?ivVng6~k'} WfljNllWb:LަN|ʉNlɀ)/;ɮ~l8Ebe/lݴ;^4;ivxQpx^4ɾ hDٺ3lݙfL֏ۅy9:tn}F~b"U?1ff?jfHsF"qΈS|"{ }<H]ݞvuFDh-if-2] { CzQ=R! (CCz{ރ~*hC{B1z#{ CX}c({BqR=D]|e~YwL^ =*g嫨ΈSG3{B1:cݙugYzZzukOWkD{9ӜLsƺ2,O˯Pur2]G t$yPZ7` un40~b(0'E]kLGJ=(# A40`(0kL kLZӼ@y-hc<#]iHsTw WdR18#5'9v}dOH>"3.QܙMEkˮrXשۀ<04e Mfd&cEs8?jͺbdRڠjmPQkZ;AE *jy})*p=6ZtkmPQkU6R vPUkZTڍZTڠ.sp8vPk?v:~t{8Wz Q6Z}t]Xv8.tD 껧'UuPk?v:~rtXqctj8UuU5TTՠjPӍGUࠢxPU TTAU**pPQU8AETUࠢxPU TTAkWهx+~~BqvCqvb]\\ź %Z;uG4(y -QPTM\\c]Wy**pҼ'+pPQ8i^ 4I \|*©r7+H TTyNWࠢ'] 4AENT炨I TTyNWAUNW}X8gUqr:5p8b=7ko4:htʾqD_8i? ko48u_x8/ ctz4z4N_E54'{"P?X PO|"'@E>**'|t POU"DPO|T|Ty8^>S㬨ñVH-Ztt8V?Z"v΅WQH-@.8^jG?*UWAUPUWA}:N>!*:@ETCTtU5<zP!*:@ETuP!TuP!Ԫ~ׯzYXP(N@(VCSUbUP0ZPZ0ZTࡨRC!Gt8i^ 4I \|rӋ}Ҽ8i^8I 4AENWy**p%I TTKZ8i^ 4I =i^ٓ=Iʞ4AEeOWye**{Rg<*:)i^Ie;5^UbMPb<jAq PE]ޠ PڠV ǪQ6AETڠi^p \|sTڠjmPQkZ;AE *j6ZtkmPQkU6R}U *j66AZ;ֆcpZ;ֆcpZ;ֆ#jmPQkjm8V Ǫjm8vPֆcp@X6ǫZԪjm8vjm8VAE *jjm8VWkñjm8jmPQkZ;AE ꄧtzPUñjpT *jxPw}ontCqv ʾAPD0'R"(RU PE РL@qꄧ#P ;C)E<@E6**lTd"P l @<@P .We"P lQ l±"Gǹ|{P.rtw:}HE*^ntǺ_Q:pIEԺ_އcx>~qtx)Q=y;AEe**uGǪ=y;փjTT렢ZuPQ+AՕqPqeTAՕqм4yU2AWj]iȻR' 5ӣ\G>?ʅQĕqR.•yz ~LgQ[Bpo)Z0/OҪ Us+Z[Ծt=Op=]y**pҼ'{Wy*uҼZ'ͫuPQ:i^jtIuҴZ&y _MDeOWye**{Ҽ'+'+{Rg>8U:U:U8U:U:U8'}Rvps՟su՟N:ct^:y6jq:N6N/+y Ty @" S<)qR8" S<)i)HH4O@E @y *R< SP)iZW/bT ZWơ8WơWU0 Tx 6`~;:<o/7:UuP 6>s¹pgqD' >U]*Fe]*rP.J]>N.;:QGB]>? pp{:փz: j=ptD/=:q:zx6ǫĠ}UAgw_7:E.fN}_VE^?nosr>WV:ǩ T64g^.*GrP#+Aw"PG 俱:cu6 \?%z H 0O 0O H 0O 0O H 0O Ā4O H18y:r 99J0?N.^)~~8]py:ij'gyQ?<᨟=@EAy*r%=H/Ͽ+}Fd$yFBz!#_VFB'HH$H߉HN)p>:i<9͓N4< :NBICXi< !P:t.#?q:NrJN \ i$'SBINI8VrB'h -3YX '#d$pd$I;3I8VFB'H@N[d$US@YX) 'eS,qNRe;yTҠJY%HYT)K@)K*e (R"eiP,EP, %HYA{s8pVJYk H/)PyJPѭAwk[4 M7w%7Wr㤹G8yR?N$hB)>pDw RyrRb}d ~wQyJfSXyJ8V ?HYT,V) HYz) +eS, -OY禲*{8V8V e~R h$L)3e JYB,VNgq%eο2eQ,pʔe)znuʒ?N)K:eɟŕe%hJ2?jzBz!eEs/eS,q.,,DP)K*e (R"eiP,EP, %HYA)K@4R"e (R˝&9 URT,VJYzYX,pDeczYzYX,pD/KPGU,T$2AU/ WV/K8^/ %Od@E/ GQ3{ce/pNzY^bp=;8{vq# MY& %g':V7L8^7 9qDNT4!|$+{f/yʲSg :VK8 :"eu cuq:\8k8kx}/p8eKXk8kX}/XkX}/pDDHAt;h ꆁSR?i@n8V7L8֚#:V7 &'yscٝ$Zx +9c%'8vJNXI8^+cڝ$nyS+9#yrSc}訌4Hvj!p=c!xike4AiH@4Ґ" (ҐUP!EҠJC4$HCxRd$ϛg$2 iHC4JCXiH8^JCʞ1V쎱JN@Erj%'x)p8irB2P$Ysgwc+ i}vG7AUz7;MsRgX 4!ͳ}v^8"{((pN8:^' ceX)x) +ec,x)p=c,x)p8:*eR8"e SX)Oc?Ȅc%2kѼ:E"P$2y"'2E"'2y"P$2y"'2E"'2i"#XBr}D&JdHD4Od@E"C$2tDq:y"j%2tD iȐ: +$2tDT$2y"C'2V"Cg1:N"Jd,i"C'2N"Jd i:N"CIdX 4߭HTd$ +#e#2P%H±vv#PU յZ Z#PQ%'"9 u:Q8;vvBj) HY5SX)pp8V ?%?՟O OcSSX)pD)A8V ?%Z)pp8V ?%+eYK)K@) `) `)K@) `wPEJ$ ށ7:XOc%2xw;T"ӠJdD&`ȨХ)UN#X(U"P$2E"ӠJdD&HdTL@L2 HdDJdX3X;ҹM%2AU ?e ,)KPO ڗHd@E"T%2KȀ^HdOO"]2t}d\^DZ#GW81HYZ;qv#֎1tc8;vS$2qcXZ `ȈJӈ'= ` `L@ ` `L@Ȑ iȀDId8=2p:N <zd8=2t8V GNހZ=2t:y !< &2N GΒ憤y"Czd izd8=2t8V"C鑡ȀUK%R'ec,t4OY@q^X}/t2tHtꆡtqaX0t}d80pebKyPDF<)^%^TK@K*{ ("{iPe/EPd/ Td/"{  K4ta80tDJ2?+,2bwR΅=g濈#C鑡#R*e) HYtWP{!]3O,N HY@EҨB{ NB ڭ΅8#P#CJd8>2tDNT4>2t}d4pPk:"pDHd@D9f"Jd8;8"pDpDpDLP/c%2pD"KdX go8boR+KdX + Kdۉ'2)UN#EeL* ("iP%2E"P$2 D&HdDAL@4(PȀD&Jd@n8V7L8^7 Hdz0pn8V7L8*w&uv^D&Jd@E"*~tc_:VL8^ % #q#2F8V s&/Ӂ#2P#TȀPG&GHd@E"둁cpDKPZ=2pp8V 둁#P+ KdDJdc&2pHtpHtaX9M8^NiX9M8^NiX9M8^NYDXDj4pDNiX9 9뜁c4pΙp + iNZ*9} Ee< (<"< (<"< owi][b݇>> wu]nݷ>uw?n_A>n >~ Ѿv8]z|wh_kkWw]zڗѾt8^0Ϋm|>h_wiWw]/5Ϋc|>_O/5Ϋ}q^}+HwW~^y}]?ew?ϫ98~?ϫ=~?ϫ}~n_{{/?cW2~?y~.8?q'_z,98~y__Zu~߯q^kkWVpt8^9xyiIw꽴2] ۏqb gIqj}VdZ)sk08K]'dC}ۢ_ֲ~nw_'v/jyy뿦e .r[oW^.*u p/vXqR?7qVl7Z>ߌb%f7qbl?oƙXf9oƹ~ޏ{Ҧ5Ϋw{\Z?oǿ8^q^۫!x;}y^{7Ϋq^?8;~ {{sr_/~Ess_c^g}ǿ9_c^_~}Ws}_?:ϫr_oZ?8Vk9}y:yx=oZ?86Ϋ;=gyn{gB٠q>SK*}B]~0ӢR>+},AoY_{ؾ|NS*}"J}oP@Tc8^> gf~nۧ._w}%7m4߉J}b> w]^l6[@׮ܵKw}η(7_yMSxZtߞE Wm5+o^߼V.mN蕻-и@鶅:(ϫ_ySmNg?y̩r?m κJw>5u)7UjRmKOdYovb{Vl}﷎K-bt겿l(6Pۢ />J-).Tn~xLw[hKsUmKtռ}_EC(^-;WMKŋS]?ίq~ut_blW&ն).}%wr{}nm kWy->R(j[4߼p{t_|]K7'yVNuϫmQ+^yWZn wÕ߼ tRնtۢ7ﲬǝ߼t_գ-j}^m wі߼{t[Ozs5>^mQXmW/_ywv|]\zEc͵ϫO[<\7//_j޷?U|?mu?>y$Vi_U]_?o_q?vkߖ-޿n[ڿ?ߎlg≏֗~Vu]"&7]9#88%-;8疙h?¾Ox'uv`g<~q Ov[xہݞdG-<8@'5v`gnv;3 h=Ѿ# avO0'l]MH`0MpO/e'8 'xNfLr3L38p0^8g8 gLn3L3,mq@g8gh H4`]fhG  jǑ}yǑ>iC2OA??a@;g8gxg8gx/8g8 gl/ H4`s۾đ}yv=}33|3L3|o?33<ޘavp0Zdڑ>i8]m? pp1q08^8g3l?73+&P#C%x3 su ?E;Ӏy0ЎN-GZ;0C;g8 gl> H4`a[?>yi<{z ‘>i4ãuđ}yv"3#}ӀyE0ЎNmz ‘}d~M0a@;g8grqd<`5 3#}Ӏy#}Ӏim~Ǒ}y54ЎN[0C;g8 fg8gx/8g8 gh݀ H4`a*`sǑ}y֝0ЎG_q0?~~?pdyl8óđ}yQ0C;g8 ghY3#}Ӏi#  #}Ӏys0C;g8 fxݵ>y<2H4`=H4`Ӻ>yi4g~Ǒ}ye~Ǒ>C]l6܉qpUsW=lT2mso_>h<yl[?Na>q{nhAh.2r<ԇ}FYj12CYp)gy_C}H9KۏdxfyIYC}H9Kۣdx)g_C}H5֠{g9CY q>廜_C}H92CYOq>/b<_C}H9Kdx92~Sbz!,[xr78PRvIg9CYmaPR_C}H9w~!,KMee8ԇ}UYr2CY|!,mוq>\ fyXYC}H92CYPRj rc8PRng9CYv|!,p)gi;!,0p)gy_C}H92Cqpgyo[se]4g9CY{Lu>9׍rvqxf2C}H9˳`,C}H9w~!,뗓n<ԇ<,C}H9g0r<ԇT_NY7CY{x)g9y!,뗓t rvax)g/>er2rvarx)gl18PRͲ~9ޥC}H92CY>PRͲ~9ΗPR.H!,8PR_C}H92C_hyNpf޶,á>yz!,p)fyܶ YC}H9s9r<ԇ| ,C}H5PR_C}H9xf9UCYq>3j6rǶa8PRٶg9CYe<ԇ> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 536 0 obj << /Length 2446 /Filter /FlateDecode >> stream xZK۸ϯ`퉪DXA&l+Rmxק)hFqv\$u744h՟A$)wQid%Jz\yt5Ư"?d$+ۺ盬YW Dш &FhS\yK-|)D y"\x>D~]Inuu6oZ[ iMcǪ̐nhl˶±K8a}bX`VUVoj-{u"01i f(Q6 $mdyqmWH~vns|[/̰a nfS7*%N<4Y>xMYOk]⓷ܧ@YxT% ܥln93ˬS,7U]gͱ* F" 'Ctcpg`F{f̶!w]y# {v"|`^|-='S`tIC뻼 8`P2~6JTo}}>ˏW=^F=|"i y$$PB覥`V$YsE{y~KJ,wB+J(&!pS9ެ?/o'{ zkKz*%f?48WAEJ8o`1$cŐbܱ!D"&;A1 ˯n_-IJ bnk- 6> stream xZKs6Wͅ1,lKI;ɡ;F6#" |6j`bwv"#z*_EY%%R|]$Ji7d\Ti*?3K7eҘ'OE"# i"Z@4\\h߽(\Er & 7ћOWbgj.&r4-??8._Jg *J ycf<6Di<[*iM> L讦 TD1h(~ 0tRm*Pʙ7h퇒Y!x"֔-FoE#pF '1_!v2vDHɊ#ƴ;v"GhݐZ)¸ RRPb(i $D8$'P;C% Z!7iyӧOD)F i/׀`C4_.6~9R.XQNXˉcZɔ0œ1N/E9uvW uT#@xQ{q)xy[D4#1;9+ P>w3ECq,BpeR TN)-)K&M;']RgI{ 9 6qf$ ƺ $<Jljqf2_abPNqIjΠCaP~ 6m!e$V]"Y׈֣:cE$ZN} εM|p-5rS+ϲilR.E |_gwKm||sńj^!WX{Iޅ`C4D!\qiZs{xCxu#"QG8!Z6_׏p6W~@rr(1i|a[de!+2r=ȖU;t!pbGCq$"[B#6uz.QGcaݭ0 zdqSդ8pO 2%MS1g XӴᠠ^!6gKA!Ns76 4dV.rZ܇$cꛃAGHK^۴[ lG$u$ˍ]+}cDc` ofP.QGF"ejv ̄OE9c@Rj~XS6K&p omO4\ASWK)lḦMvڿ_/oC6`9š#pP5C5%a?Ϟٗ (/Nr|┵#~߉]侇KXI7 ?Y-=Ѳv1l-CO4ߺZ7Cs׽W^k{p}+_'d868w;{ NX2D /BC.(`j 3i0s?m  t+c6~ڷ2@Z}TU[Bt<#q܃EyPRI.o[e{?ܿWKHHMx2=͇1>J%lI3*F7Zfھ3䗁mWKo}.n^yb?/D endstream endobj 549 0 obj << /Length 1042 /Filter /FlateDecode >> stream xKo8DzzG aߺ=(]E~Kfu+dR?g&LQ!ay׌緯 Fy]<-Ҏ9 [beUZ錼+T܂T+}Ɩ,ۿe=4iW8#*KMr(޽gdޠgRh9X.䊂3\l|`a89X;") >/6$ nmpz+;7gm-F-QNٲl>:lq69p q?b͗Bh9 CT t>f /Vc)?{nJ ;8?rhxH%vT=TB)+"\E)S[yAP}YĔS0 'æ^`%PS/˓@d;BUI tɊ}~ya 4rle3E / chTZ9-setmw֋$θ#C,o*/o:瘖6qY/>-Dbr^T _i^p7K*,8];t))Dע~\N_$mwEE|.t0tGth ź@h;Zxy?}8fbhz.=)jmכmG&6}ظ-'TIƝLda1L#Yz.z`C-"|n ʂe@E(=_o݈u 5rb|y7\M*?o}V*xJS4_ JFH؝ODÁoN˗}rj_S}:J"ɢi28 endstream endobj 554 0 obj << /Length 1626 /Filter /FlateDecode >> stream xXKs6Wp 51x촇q3L;h PBR_vISfAoX`T:br/',o&8K2h4aVDVD88c,~S*o㲻΄M(k)bi'gɧ Q,Q&*Xţb5yE { )i/s)YhWћ_pÒ }Q# D4 [JBת٦2j\ J?\w N+j3s+w֔ -|QES R1EHo1:h#1in֋S<~d S%!UY\i?ONɗ`oR]'"<'?B$^Jwӧә|W"|SpW2ѣɚ[?3)cp)cZnw 4W#[O:4n5=ոI2fR%F 4r:0.r V.mݕC"r$Arru oOndprkE' pm(h\(l}-mWʻވI vJdSagp7Ŭ[qHZBiue?+$R \f_{>M񏳣R"TqݦSѥS۲l>q({lM>;,87t}zw$?ymy\Ir|Ok A*$Ѱe]0%,dNJHs{$.h9իzmӸk\]36@b7LCHo=eJo!׺G1Ӛ([ ^#@J:LT|Mq0qljG.m}qrv (rX»:ly z`*PIUH,qs(ըAURUTHq ',N`8 邪"H&)hIevpW/B(EX"K(|Ycؗ*cYV5Cm |l󋊺Pj*^<_S ݍAJrhPY'Fd*vyUQҾrYcLn?7*d]*o>/vUtf9W2Uqʡnꖤ,!ցYyE7!A;6âs/ea)t|-r) Q.oKY`g,5lϲr4VRD1?iOǗ 'r2YoPѸ ]w3>XoYk-r]/~njk1BRaD۰KiG߳_RV1 endstream endobj 561 0 obj << /Length 1133 /Filter /FlateDecode >> stream x]o8=B^daIprX7܀>l͞ryp558]e'pN(bS4)RIYKQix$C[JBED*s4"|2_'dg pRU\Xtyt9}1E(fdJ}FBmIBE%}ѦZL]HCn{dW`a֫M%ad˜x`(늿{]8 V]Wm%$7~fd8u&qLDNxo7K` 6Q<.z$˝&ŝ@5+,&c`2R^5f~"`G:+u^JD Q-cO@5%eىsq@2$ХsY| a:@ 3tkݩ2/kR? QM睧^#[8C_2;~,%(wRJ0Gg' 4*`h#]O/zԼts^avֶ=vо7pM]0C!<6 9\hHC)=BRe=`GBem#˾#_}&4ΔVqYs<翖:Ň»e|sZ"n0{rysQ@<,:umyD~z _Ԍ2ifȨ\Dj z1K)}K r}E;3&!9A)̒Y|H*>F=ͬLqg',38N/ ,o#}*3}^{qn눩k瘸W:%.%9&Q1=q|zPK3c4}uˌiHofv|z'' Mw{ ~ <ʁ @a}h݄]L|iY v(j)9!K ì:E 7X*ȖC/#+#?o.Nu 8#PP Jg"c,teǘNqK endstream endobj 557 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/DiscrepancyDistToyData-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 563 0 R /BBox [0 0 432 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 564 0 R>> /ExtGState << >>/ColorSpace << /sRGB 565 0 R >>>> /Length 675 /Filter /FlateDecode >> stream xVMo0WsmH@*ĩЊTg׳! C"x^~p ( hs`р~ 5ܟJ)zm$-W!I i JAOަjmed2VQnt' ;ɃudT61K(nv _?WPMh "S%g4u#L.2"@` `HAf`8d܀3x:sqݾ:\\gkˬr]sUo. EV*7nnIIo1;22>svֵLe襬b5Ȑ 30f*b@M >L7L+ŏH=L%u7;/&6KW[/6=&jn33S;*©,rnS ^ L׬҇B{R=M djb4Z'붰;zPǓL>ǽ1w8ow\Gv%/0V=yr˔Ionn;`Vn#rmH?YR kR>:1d..427<72ylgo\5 endstream endobj 567 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 579 0 obj << /Length 1811 /Filter /FlateDecode >> stream xXMsܸϯ`y/*7MZ[JefsfdA9dyT!6ݍDHoq}>doW/W~6cXjYvy%gFQ.ܮ F)ջZ noUf6 Sͅ]yry`f,+fFjb$64L ]&"+ e) +,U6HLӰ.Mil{!>OtYЏ(Mswsػ}_WM uV.#"c 8gf4f1ևp3f1'hBK H :Ghcʆ%kGO]U{׹>瞧SA.FyDb5U9xqaz[Rkr9C9ρu[]/b(jC$rFyicR!Zuhw6X1fUXf:Ig:|YX(d˩ݻ%/:Ji/KZ5qE|(dxVW|m("J>,<Ag.)P6nc&r)f'j,e#p9Fy Q"895p(k˥TrbXvI@Bl"u6džoENd *ٱOJ3fKF& i+hcn/щHύCh=@P6llXOc w4UhqH%ֺ*3M[4ŧ}ļv8Ɖ=ձjq5Q8RNP e\e_F5H3NZξB]{؎pu|?%A|bkdἝ,W+Fq͈$Rp{c( _n;^7UӸRj *%i.oNaM+s+DHZN,E`9@|śTߩDG&%lV>tt8Og}߮9Sa unZ׻mC}̓$)ǫ'>9yuN۵0kȑJv-8C=V_}p@GrPѠOlA˩!ɕT8cS fF{'6T 4'ιDG򲆰?p]u5% gHiɍ +?/PXzq_22T+ jB"DKN4wxEB?C u— uIP'Hw1=\dQ\FNpO$?>¸ endstream endobj 558 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/DiscrepancyDistToyData-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 581 0 R /BBox [0 0 432 324] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 582 0 R>> /ExtGState << >>/ColorSpace << /sRGB 583 0 R >>>> /Length 734 /Filter /FlateDecode >> stream xVj1W19XZϹ$C.rr58>h3 >@~H#< ~TA9UD0Q/O~~^P_돤o0d?CRN?;ÇiRcSOW#QN;ţ:ujՔ% ~`~9My&)v(.Q`gB6&΂#  aE@o%ք1KٳC2 \}u6kfm.Y뚫l"fml.Y&-a>Gigbܨ4j Xpq&0 q"N M! 6(?A`MSBuʵLG!@B+ ƚ冪ؓmSZ䫕rY>QG$˽WP48}J8?DkC+밡C[Jͭ\\X];][]҂oKs6=ez2!i~ ֫Fb&)d%] K-Hzz!]aӳG"aznc~nc~.< 6n/Ozv]1&d-1;ʼnmNl1'N/6f7̷[gk{V0, > stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 452 0 obj << /Type /ObjStm /N 100 /First 886 /Length 2234 /Filter /FlateDecode >> stream xZKs7WhWJeEwe*!djQaί߯4CMnA"f4_7H %iaHk pZ5'C;~v"y1#'VIh'G^hx,h[D:𪠨Ò d$K00)*a 0Vahш1z600'~ _.b)KNX8YxZ¥$3QطJFX@lTI@lXEoYR: NMc` m->\gQ|?a=z7(x'Q\&_'yQ'5(Wh:O.7bvMLݸ#e5rQjzuEW7\\ոoc0)'iqC@ ~_~z\=18/mu;Ȱxqr*W}'|̔|cL ~A2O5)5/A27X:00hz{~g/8y@`؃.Gj$xS,}:޷;nm/ iY{ D7xQ8`f2_\xɹ:IoaGKd!Ll0L0fASuWU2MRkIVI*~a' 6J\X8Պˇa {M, M̺ٚ;_'*͓4nR"WAij 5@88R3nV@!J d,@EJ5j [w[+S{ĦCĸ O&=ݟOl몺MSI:dLz4K3 g[!3v8 {n,܁MNC欺hss^]MyFz4)e uJS?O'\YiCiyG}ȓfȶ3sMu֧[D ǖS;1t ա/ITbı endstream endobj 593 0 obj << /Length 2447 /Filter /FlateDecode >> stream xZ[~_A /j1sCSAH-WD)R(7\H2-k;Mg̹͙$o|շϕM(,4$FfDKI%u:dd*ŒBW嶬==IwnD/\x(ЁP4Ym^!s?&$\%wr&3j5?HTbNm2LPoM.I*ʦ~Uy3PYٕEdǙ]^w>2۸ z ^×Nmrϰ'tO?ʦ;Uuz&]vE)Lva1]9Mb9%ɨ6QJp˸.()i_;uL-i2>y~[tzN n2b?0x-aƇ >EU rOe8$M?*LaS.v0I`mw6X`9<;E ,3w-L/EYy%)Yy,r*8Owm><*G^uSv@7.ypC[C[\vPuyfup'`] soC=]_ڇɲ6_kS{5̬M4Mv}mw-<\7swewWݖQ,Ԍ'Ǐ I-M+s3klfp[O"2A]v, ) (*!'?_x'M;&vWsk&CLy1f %{3 J5'7ά& 1f ~Tt@'TOPd(>v 'a0Cq%ȫ猔~~D``3^]"dTs Sqg+cνq./\@J H@/>|L0 |?g"!@dt^UzLǍST OyaNr *f+GO6B ˂=d#40 /ӓ'eÑa(eU9l YOg)kwM:L0퓽1IYBRv"Н3+p‡pDx.h vWxگ}BG tz뒉n"u*LkGUEYnPToŜnR@bDZl= sճOzYPl튋%3G/ԫd٤^؀?'uL~yKg8iC7yfP}=HQoLx9{=8'SBL!?OxL/͜_(=C}b+w_!_}t¾/,2?"G?g!bDi꒴R,y\%N: }}9Ԝ&c^x.[}/cӧ"eF(KE#{y+Ԡ[nǑP y7#"PgekѧL2n( O D( }4\,df MBX!nNM$S/_+Z|νs>\"n}|Zhw{u_=ֿq >nխtOva7} p|BXuMٻ,2"W麨mY]+k&~+ħ^᳽_ZOuݥې+2.}HbA]#nCsM_?W?4\r y49##]j}/N_oa (7!MM_7W @8۾M>|=(BӀ CLqxn\>q"ٸ~ J dA)a /JO%xP2C!{2|XJePC}KRrg78 $UTiQì"JrGԄ@Z/FTǽ{ЃsP%IeQjxϘ 7BGE9Q\zaS!j΅\sdϬClсGCHįN}&?/]P@򣇋 q'^?H״郙+t#: WN2BfPc.\(=d(aQO2 Aa G!#Y2pHg\ O>Y"})AS?bamIXDe0:!1D?c2?e@(6~2[E=8I(H%. endstream endobj 597 0 obj << /Length 1109 /Filter /FlateDecode >> stream xXKo7WefY#@/inNHVRᶿCr_Z jmX.7|K 42y>u㻉`4MMx{ns\X, lɮ3?A]6|G=V.e~$bEg7f?&@ Ն[ l\L+ 9xKkv5u";=}ƙ}Y3;H. U ȵ HlbFá woVEޤ}*[:ʖjOA:eQPZ2M(zs 2&:GifOM&嘎|wr2ҼcQRboW#o $ં47R@Zp4Gtca5(Hs!T=2"8w\OIJtJ2B$K*%SN@zkVct逃F$7MjBg% xQ`+4aj5I=iɛH0mem0uF3D uݏQ;(d4tfETM0)$ C\ǎwc;:%#pBT[pO5:h Hq}ie "+veT6X곡w\*P*}D? Ǥ$&II16tS[1!.ؼFɐ`Vۥ:zԙӺV\qQ?lwS,S__!U΅ endstream endobj 602 0 obj << /Length 1928 /Filter /FlateDecode >> stream xZK4WCMZoQpb2aqlz8VBfvaXjڒZK2EB_ $_->^|4 &"#$JLH\j:5BmUxZ opX|VE/oY^E8p2Sb%ǾA8ɽM8:a<̠߰9yJhfd͈DRIEdxbtFO28cbvF, PdnmHPd,l_Ő7w{lj@Tej%Gu `"b>l,H].HXv;&;o,gBh԰]Hs݃{tțS0i](W]YnII:\\ gl[kDۅ|W~@p+]^gQKfҢ]^ +>Qqn-a8Ȱ7~#S2.䨑uSY5?WEnv[Tه g딱_ fuZW͝'vWWGw wvw%%4/Ok@IZ;1! =D2җ乒Qr`C|O#Oj޿sg>~x&(qr;MOVIivǿmi,`7]{?HWsý(ڮ1^ȸˇs߃No>'~;!n)w8r¼@+zu:ΟW>ș2" }qg#˳sc 5Ib Xh,@C5'Tn_(B^_A+c /C}n%h*TU[ |5J.11zB)&gT D22jzoEqeH3`:?q"5L1M 'b}ARhI20e3J1:3ͬ)2D,Zh RLF6Th {hFB8 CjGETN èi6VP(L xZ0 /&(MdL1 9\ű&b2fDdmfIuavV0Z_/cw5~6kZTj;&T(տqIN&ۮ&_vZ)232շá,_tejmoP ͎rߕEeSt+@'uZ5kw:ʀ VܕS α5{ϠʼwUaǣ[VBhŎ>?b3+D/sQ]5^#.`1]V^|&CQɾ(lN5oү7~Z49oQT i7\V!fc_Ub|ݡ'n CBo{$ 96>_]/O endstream endobj 607 0 obj << /Length 2166 /Filter /FlateDecode >> stream xێ6_!/20fyEj}Hh)`_>ȶQkK. Cɒ5#/Tx x٧_I 8Kx"M`-FFscܭa2_yx]ZLy~ƆCVY@6 #5Www3G@V3D13V_xwE*}IDb` ng?\BDkHEi=,̹,b iXuSi\OYZ\0#f.uXV4esaVln!(6m@Yz(gJf+],w8ı!r`0AXчKˡB:L;2wm^95Š>#ڋHBQs2 tgpE{f4i`}$Y.Gqzhn‹|EhuSzܥQ,Brĥ!3)]ņQas"ïQ $USVyi8,T$X.$]s/ڿ.C 4MPdd 7Ÿmo1ho719vB-XEN+<ؒoIX-9n-DDǍmH{P'>?%.`R"G k# IIL'"sgٰ`4菆1p?9ڪ{U f tXO٨e+M¦yjZd\t;nƌ'ɌHJˑ5L!T#6mvGi5?\f;b1TS Ly?tHh fD#f+Q=D $8rִ(@U+iLG}γ?$ȎS:VVY izjzQK&=&:J0rf1zj3w߀>2˳XOt>ŠbbE%OVyMa dJO4z4 iD?e0!?)Njdtqν|lܙd] >ka:[8 &U!: RyQq#9dxkvFa A)2PA (!2M4&+q#)\H(>* ɮ|+]e~3N4No5v8mz:iUgϚ{ۼXb˄ ٹ`㮠;{} ]]Rh{2af0nXmt1NI~QVPmJ :Dt6 ɪ]O(yeEsn {{f?è4P4#(3!>(|Vrgtx{ `G#G <Ww|u7\R endstream endobj 617 0 obj << /Length 1871 /Filter /FlateDecode >> stream xڵXYo#7~ׯh$ X n8 ki2DYCGfS$rK#{ 5W_,!UFgA7`"qŷdC 6Y&+%Jn˥Xr#Y3zdjXO7w/ҌQdIJ&Uxfk XHA$Wuvςo1@}$_%9X& a)ā20e|&ZBSSapchb 0o>fW Õ]IS]\>0_i]O].c 1d!wԑy|n`h/C Y804822YO_UrTM|wE ɣh@ Ы d*$q1O(x*GKē%) /PJjQFj4}&>8¼_vhFh$F k$FV ^6.ƭ@(o0yx%Z^}) h%Z^"3La-7gГ-7gГ-7gГ&JS}&XPΨL#*o9Η,DJ HzRG1VUg/m'ncy6hC[\vo!{C¤#G9)(ߣg;ǓhH^ήg\U}C5n`N#Ml\Ezsy!xvjNEhn wEKN ]0si w2ȱF+뇨I0*5KDzكm&i<ֿt#kE>n[r^L0AA;Rnkգ(ˆT>n/7sÏ=k_Un l? W|6 mp胤v}7sSc5OzDnW+Kӵէa'kVaj\uT̊£wѶSyk~e=a\XWue_`>U{yG2cHso$d\TZHÅ?;IZr*>p(+?xʯ1oCBy !MLY~ć7 B?ZA2+[1K0jP?FaǽHd8 ;OE踈l6QPhk8hq{Hӭn[ q&**FeݮjU מ4(Lޞqyʘ.dMn "<Oᩅ0`a.xӐO&`Vw*oNe~P][֡&v\i *8&j7+4qcq վٱ;FK eW7/\o"2;Rƽ*`nܾ;Ox*>Grsk3#OↄPx¦DXïlDž5VVԁksp,O/F= 6@4C$`xxێpMWRxV x>2 bڣq"O&-o7qƺGaق [?tm~80_IZ8P| ncn y ̏WBՎqΞ,=WR ']U'%ܼ`9,f3 l endstream endobj 621 0 obj << /Length 1897 /Filter /FlateDecode >> stream xZKϯ`/T ɔ}p;W6{(hĔDjק PGmJ|FFģLjGݟ~4y$8y.MeIjδ:z X ysՕv+j bBҋ?pNX(ӌ>ۺ..K)ZKLhgJMHtխ-Ǻ_ 7GZ}AG!#;Bٴ T{Ϻmq6_zޖPDq?U1%lle[’1-,gW `s⿠ҰJqΉqÄA E*Kʥ`; JBQPc@{rR>6:"g:Oh?ɋyCb2bр/z"]^,? 0ˋ'x)' tFJs"T5wܴ7qzӾnZ[ޞ9tHI~Ms::#W}7#Sɾ/_WLoխnaܿbEmVuE*yyXI㴇6qΈGw״k~'%.%xznX񹔆eiJ$GYYK~[eAnE7TJ([߷jx<ńW2t1V˖=9a0`E$vv4`. n)˵:]p3x:UaDK0rcqX_ ڣ Ԑ:@/5 _ܴ`>?A΀N|0,pa喐#Bq<)Wlv*B$|P}4Cu] SdG{8tQcr0=]:1@Kz/e2({RZ^P{0 *?8Y7q7RK*^;@Raԗ$#8 DR$ h* sPg|8Dg7^Qs?`~Cȅ쇿 ~ɫ~9kNeEe-Qu?~f$ӛZ?oj3]zSVZhvW*ƆtUhRS" !Drڮx*xY8(p _Pu eoHGCMėF1 ;v!fB*aDwyQڵ~7  < endstream endobj 625 0 obj << /Length 1067 /Filter /FlateDecode >> stream xWY6~ׯ  UR$%1@HhsIl5:\IwxWl X%98b2o:Oo`u^Νބ ,(>E 5WiY7(1'C ? CJkΗ3ܺp<0~D̝38d7q{#hҿe֟Y2PUF%զJ6pߍRM; "fS7Co6e+Lz3 IErSȨ*ʤ-BYF8;cW!()0q!HS@nV)nyџш݈&N8K qZXaNfss׿pkn"9u2}\1 DNNA#/, endstream endobj 629 0 obj << /Length 2482 /Filter /FlateDecode >> stream xXKFϯ XL?${`AM&كJjPLRO~}Ѥ(gAb _~T?ZD:6}*J|w뫯_%6"zdY$RFD&1&xJXJ!DcѮ]Y敫b6Żz%aZ 36H,dWo߉`}?.b$be"iS(W+YK'I4P020*bRc-#ƁК$A-\&gJ)4_}X IhOrTX56ai#HNK FμʕgaD~h\O_Gޓ2KNiB;ϩ7O\ZgX'~V{>v/Iy+)yz-te\ˡ;*e|9XhG5FwՆߗaz0Us&\.g}rӌL" g w{ysh մVtڑO9l#N2]-lv!EJcZ҄4w~?Ԇ+{3W0_(~X(+Y`)!%HBdbۭknjkün-7E \mPhLM ֭jò` S*@>@'^@Pikiy}t֐*?"2QCn ]H)!dt%t(#Qlz` 4W (bCzW7;V*b@%&Q*]]9U0/K\ߢw)x{p\y_mǍyr[ب!o:?sSYUc/7 7GĊb5 :JDj;_Q%xOPX߂cn,fW"Ad4ñzLe<8{GBnXp:*n9-REZ*#bIj7M'2B$㖘uu&$Cݶr9^/2ۢ[x,@JcF^mps ٛ,5S}aΒ^I " h3u9;%>Ҟ. f8ګvlgJN3y17 ȨtچˀQ,]}"uW0懃.㍇Pmǥz;g MˇLaEfu'qV8C@yG]O O9ŪT 4:(OssR#Rki)V:><YQKG!Qml);)>zaZ? z`cedeLH&q1rb;حɋjU>Ɠxp>wJIBHK٠7EXl7P!JE4aX9@0 2H+.º.1Fo 6ߋv`a]4t` =~7Y@l9b^LϯAWHl@g͛_^[ c(SYB~HALg$yr煜j%>vW!y?h9qwk;^U! =P}sUMq|5:A#kGq.Ugdj2JX kTx(L-DtrYuKm;AG{t4|*ۆw%({LI?r'b,9> z0o#>E1@ypz 5vMi 1;/ac9n9/䖻Ik6Ǵw'=hz?c uu:혣!:X@`ATMŕ'4yQGe)z@د}@=|F z6ZfyK:@u yzq!>G-6)!鵴׵l[Pk{;=]?';uJwpP =uxβ " KbËp$| g֓ڥ52#ϋW Ow&P<@ HO3ofyE9~O}1(n\5M}Am< F endstream endobj 635 0 obj << /Length 1045 /Filter /FlateDecode >> stream xYo6_A,'T.VMt}P,Tn8n7XAژ@/,'K, Ă !LHAyO$w=ӷy;SEV^kj|tr[)abɬt$ñׄ0ds$$~AnwU-DD YF_U\/[JVrAOiyW(3λÜ{ͣ.aT5IKRef념lWJN5U n8T}@jabԟڮƥ|i6.tWP*:$noo>돟 d,Wșw=>qc "0Q-4̵G(s+4HlpFhl)M'^oz/~Ȥ/UY+ӻ> 5gzORþ#x$mL磅j5m1Z>$I=&Yh\6w1B SP7ra`!B$K uq~ٰIt̮?Od,':M'2~r]28?:52 Lu6Z?Xb\q|H:\ދOY~+~ZTF_~Gr_|u4o^vgSNbUc? +ؕh1bYU~~> b^X9x9xבv㱊vJ endstream endobj 631 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/HeatmapResultAPClusterDataSetq08b-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 637 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 638 0 R>> /ExtGState << >>/ColorSpace << /sRGB 639 0 R >>>> /Length 43659 /Filter /FlateDecode >> stream x͎$lS'HfFDM9ig>=y`שڲ s/jmI7pOg?׏_׿~߾׏ooϷ?}|'|#?oG۷d Ƿ|No=yo0z o??ooo߉!ٟoUg?} o?~~? ?e#%(_GI|%|gG|l~1zŸWS(>K"ã$:JZϿg7|s?GI|i ~DGI^K~ʏ/`xʏGx; gQ?kIr||ċ\Ce ׁ~.o >J }~.~ a?>_\<2\&~|u^|w?}.0xfz~Z(ҟ_ҿ_)㷏 ?_z__ZJsmqd\I(>OaEi#~?Wۆ\OWWFsrU)J%>WǿxзW }~ѷ_W}qU̷d}L?^U*qUӷ_]ҫrJϫvգ!jۯvj'57\U;\WWFvx{1W=J]UsW|W߲wyU|诫JJvqK_JU;~|-ҫv~|JU;?~\o?5zΏviXe î7?o>|s?o)e_zW;,퟉߿{.t [9 4a+_ǯxl~Jo Mkיq˻4n+hF__35&w˱is3>j|=[ޗ|ӫhȇ"O*ϥrl4'$\*OD޿VgGt4¿I#:gPmk83M%WѬO]`C q`.*vnRשU4^G]i:x{:V}E<#8wZ"xWN+{?xNNo[sX~'%'..2+^4>W?"Xlcl{]k7=g-ց,)*Z>y)Z( 5/%K eRGAdQ<v.OF˓r;Nw.iQO7ub_'UY_׉z]ѭج٠w+6gXq`m0 Ɋc+kH)q|t 鞇#&Rj]8Y7j+V|Jwʆ+'2#+'R]9ppeGWNdpe/+'2r"+;r"u DWgHwv+X`] аnv <p.ЉP%BX߭8..nR_o\:>0UWe$z]0 ڰt`] AVt`-1jЁSAvX˧a7PAV< %tQ(B m :a7Š` Za*µ>_MVbJ,V$ź?lb%+V<[NT+[NLc#5͈`näב0N+؝6pWE^[HWj: n0)8#{*2#= 'Y|ґ'|Z%W&,DjKu a7Rc&K 5\XS <հH v# <=䞎(䞂== {^_ubT'OU{YTS<Չz-DTS'Y==ka9pl":9pl"q1!t5\6Nⴉ ;Yv'Rۤ꿆kd8m"&r,Qഁ·8m"&28#&RפiY6v KPڀֶΰ;mొLNⴉ NHwVMX`K8mpqDjaO\KxQi 6:mi NXKm`-iBi؝6(~ഁiNx?pv Nk؝6OS˺ӂ< 2ڑ+1#vs֠_Ub:> 0]nLWtUp=NW#5+#HoF .&2#Ho\{d,魏!n'Lב v ~ii #:RM7Tആ‡NfvZ|gആ^.䩎VM<հ{!|Dz['Nkx *29#*Nkx,#v5<rZj&{YeM俎װa_A_࿆ bMkxk_G&5kW(俆 Z(係࿆ K߀ai([L _zhBsD-kt5+׌L?M6]4隑KM׬b`E1Dŏ'p{ YqSDȊWa@oDjC8#| ֆ(!^w _o -Q|'>O_e2DNV/~ tHvU`] Aаr౶+v+<0VM'Xrr»lU&WNX 7(࿆ka7X7k ֢X˧a꿁$v <o`7(~࿆v 4gN-{&iam&J,^'IäW 0]n[&N ^'IbäWeD?MY0_ޢ.Dzb8ivn0M;2Md:2#1ktM 8aor .w&2tYft5<yR^ˉ v/;^NdbNհ۫ao^ {'jx ӤבeқȱLO8Ndxq"ՊWW6Ņa2hEAMdŎ D!;mx,.dІB-m Z ڰe$`Іݠm&ݠ  6m Z (dІݠ Lmx`2hãA Av6Y7FȠɠkDAïTB a)ϕuW^ a0+WϦ]Y Xy#+6 Y1UɊ Ҥ=_CO|+؊%GY"xF+ +vư 2RЕU \ٰ7DZЊV[1~`Ł}Nk"`5kx d5=kXpqDtdqD{eǰg`m-{D??0HFX2nu < 0ڔv# <րHY4HFx,`Xc# ޭ`7v# 4=QHv# eٰi`5Ԃ4H V# =tdp:3pLE&t(e*2Y#22 {b-SpLGTdLGeK Y!ƃӑ=枎t i8< ʑiPKy`(<>Tު 橊tO <rOc!tw,䞆klFw{ m׫:~Ju끋+2# 3Wd2sG .fH7sA.spE&wdqpGܰ_Z$'wdqpGWdrpG.8aoanؽڰ7{`Іx"45;)Vlx, d1"06VsW;#++˯2;ci 6-m Z ڰe$`ІG '6m Z ڰa7hA0hãAv6<*QTɠ J-m Z pbdbA;1LX;Qf[e0vbb+ ڬ2v6*f++LJ,Sl'ijVRiHm +s7pb;L؉6pb'R$ŊmR`Ŏ,VHm 'at+ؑŊ8c+-Ŋ8Y8&r[q`m  Xav+J8k`WnXv{ x@Ԃ<ثaj$v{ <k`5(~`^v{ ~~y&{Ub*լO}ˤ׉aD?+F2įfL׉SDTa2uzb{i`wOeNHo; 9#H{3b-S[f0{udLGz3bX"e:-S,Ӱ(e*iX"e:X#RBi[-Pe:X#e*2Y#2 ٫#`4i8ivd9ޔ + 4L'r, d؎E`&x"SA\洉 sD9#˜6tQa7]A0]n`t /s5<=ad`t L(dt ZEL(d`tt ?,ptF[Cᗎk~^[ ^K%0{N0tyڴyFN?2]~ 0]~= g հ3`|zv5+k[_҉P;SoMMぁ Ű! _o౔Ӧ/KG,t>ǫ,VdDz&l]Xmh"k[5A_cudUD"05<re|2B[c!5&"a DpTG'O5*j=U<հ{vOu=SS vOO5<yaTãŏ<(~䩂੆SS O*SOubT%uN{ubW'{U۫YW^ ѝlW%{uf|5j;p{J7tX[ڢv L4Һ'RۙiY6v MN`uZi֑iNx,;ഁz[6i֑i6iY6v S`] ֶΰ;mొLNⴉ NHwcMx,ഁǂNX iEְ;m靏rNXְ;m`-i^Н6Bu5NX6JG Nx?pְ;m`uZ#>lrZ%i+ѿb>tXLWtX7݇u5[Vi8ObrZ% )LJpTGzax"੆8>Ui UdrZGz;c8":ҝVְ79i'udqZE&u;.N%nrZGudqZE&udqZG{dN8AWn{5 ث^ld,ثᱸ<Wn`^Ld4yG2~d`麣>2]n`tt ^kMMtt v5< %a7]ãPL(d`tt YH>~,uŽ5aHw@DZ3t"!,JdDvp`UaeG#9ΆCs`= _v3 |ɡGJ::W J]GAzVNf ۣ_YXhWm׋V];ſ_*/ZWЮ/:8x_p~2'x+3+3L* 2u{Ѻ}TWfd赌vUkn*~e_+~eٺbh]^t8./ZW4ůpw+3^Lw$e zCh]YBhuV Kh]^Ю/ZEkWM*/zdP7^u? N~~-%']PdDh MB85KOdt @Ky@t @.(]PiA8Lu.8SOLzM띙^M띩m֋WQfxgZɾ)Ⱦ&L&SׁN.BSev}g&wf}e6w.t/:i2B֛֛KNZǯ̵`Md鵎%V,zڄZo:i2˓_X/83]pf ]0. %Q` D)\0V `zx  JL)\KWKp ."JDU}(]0Kt tka  [Y''ݑe{"+2!yIA돏kaa#VD(._hLi2$ÞW^:e{2˾Wt+ 30 )C 墛;3I2;xk%B6&Zm$LR&LxgɐB'Jn nz-@(TZXFVf !)7V!r7zRnz,8U7Ze+3eRO7WMQdRjGVBSuEڑE' ȳ!M@ v8ベԎ԰ԡ]M'Nf :-8}7N7I~'3~';tog&N)whmw RnڥEvq&~/rSިy;o~~3Em)vhkY"m)vl$, vh.i0hv.nH'Nfdpvͯz $ڡ]Chhv6zoЫ~hvm E;Ыhv**vUQICJm ED;tiдQ]i#FuE!lTWdڨ$ڊ,kEHꊐ~ .Y6+snCs[6; D)7)6'Qs.Փ-Qt~e3Fdϓ3PhBCe J-:͹D[iΝLsE(HMQ9m>Ofs'̹ɀh.ϝ!6PDDBQmSh EIM%7M'rx2n%uˏU2sgHMAռNʓY6'l(wtVTuSPuQRuSPuQRuSPuSPuQRuk@U7|U]TTT]TɨꦠWMFU7j2UQEIMAEIMU<%NR"py#+2I#;H" }C9Gg'?>qGL\poGyjOSA:NdLKfQdtzgG1mu<]Hfr @2@r W^ބ Q^ug"Br3ӽ\6w.C^k)MCE~i!o<ڧg{Փl/vmp tBU.%~ .K;%~ /K)\B%SzU_/^ BB%SzUI` B%SlZ@E %e#xEx|klYns/%A@߅i[#p=pnW p>Arh\.❁|(4>0k6'鲩ݙMvSB;dZL`S{$LړY6'sO4k6K ߴ=eS{2˦vgMɀh.ڝY{(4u0ky6dShDaz- 4k7%5VW5tg$!v#x (Ħ$;y(iS{2˦dMΐ<^j.&&&&&~AlzodSdSdQdSdSdQdӫ&&^5ɦWEEM%M6M%M64[ M~ɊLDH.nȤLDH}A}"А?&ȦLD6UHA8!3qShqDi&~|*CkJc-Q&N̦΀&N̦@;$Jl )̮Eٵ3&+ͮٵBC%nbg&!vfbe6!vtbeHM}%!6bQbShDIMXZ-pkz (n%t\ex2R_545$יIr!5:JUQrEIrMArEIrMArMO; 5j2J䊒䚂䚂䊒^U%$(WD5$J(I)H(I$Wpz#vpE@r ݰ9lvdHa\Ap:Apyf"ga?I\C{+b:=,ޠ.۶q ]Z 43Q.-sfڠLGaq/0)k(=xנ0 퍏館,?̵ٕ&ִe:et2˖ig-tq ]ޒvq ޒ^)k1g@gCՂt6 ۵.wB7e\g`u-4MfduK:tjABڅ8ZHC&BzzHMACv!6!/ qhЫ^՗8$Ħ ġ]MAC'! $܄Xe[I lVdgE&yVNvM>$ς<+gY#NhM3RN<E>.˶mg&Ofxg&ON]M'Ofxg&O |j.ErdOfxg&Ofdw> ]CŊ> "Do zB'sB4UOاꡋ'H3 ]ݦNR",R$,RKy赲v)7)Rz HyhhMGHMAC^FARzU_.W%)/IyU}IMAC׎") Iy_!)CmuoQkiS3u$ς$iWмCƹ1&47~`W@8sy ?Ӛ!`&4Y ;YQtEy>>{gSVAy>>)gQgSkxפԢԦԢ]_滦*]ShߑXX}uP}!5WR_ShDI}MW*QR_kY@%5%5:[(P_SP_ӫR^5WEE55(餳ʐΚN:̤ʐΚ^uQgEij STӫ)UQ;MA;Mz8j3W< (WD52zMQYL NYG"42g4uE5*j؛ CRTQQ3EE5a?YQtA i' k@;MQ;4fЦ}M2 : $1v5 2z{y!2W *Wޤ$4^1C W&i4i j2IcUIti zYЫ4vi h K]T2)dU@Ϻ${zkڥ> P4U%c *6/Mf&KE /(} WMlUI\MA\C N2`>p:K!SNθNRG趦MPd:ݞ I\\fLUG@\H* N ġNdI2q,d@%:KtRTe6Eulׁɡ $оdqcޯCkJl&LgYΐRs&ʐhB'Jmz?(ڢ$ڦ ڢ$ڦ‚-Jmz,(ڦ DDZPME(ڢ$ڦp+(UQEIM30 ]ɜ=*qnQRGA- > (iU;i BlzmUQiqh_ Xt:3Mr!ynW;ʳ sy#<+B#] '(2#}`OBAg.ς φy1\Y'א ٰ8;:7>0 OhgIY9z:pn(޿`dz<ʙU4=5ȳ)shgSCy>: ϡ$b6:q2˯':3 ϡ㨒Y<^ɳ)shoLAC9ZCHC59 [.ϡ]MAC<y:ɳ)s2NW{oR^ghmi2N洃iL2Nrmi2Nf93LLd^ߡW'j= i;?9~.Oi$O߆pz MYߎL! 4PpN=T]py|"sONB%:M^txg&w5QRuQ[Ldh6Wf8xQxd@EIMmۡ}v6~BmJ2NfR;3C \5D[mSmQmk@%6KDZPEIME(ڢ$ڦ ڦWF6~())($ʐhhN&\wmg&v~eQI:ymMDۙEۙIDmӫ֣h.̝'s (0UMIM'nh?pّgEpRί~88V0) I\Vd?ڑ\&p> dI)4_ ڢ,G'tt2оn 4u6sgmɀRRBg ,?t?M̓6V oSo-Ept(4jWy)UGMV44Y4ɢɦɢɦWFM%M6*5jUQ&&^5ɦWEEM%M64ٽU;QMoSWI:3g_͘j稾\WtS_gЫg-ޡWE-ޡUFO>sY,/oNi2UdڠH?a ڊL`GzbO!ANî!1\6h+2HNAN~>Ip{rt21 LhNi2Mf٠ L}C{;d:ig2I :li li 3>50mhЫޓ4 4Mf|2uf&sMF )hUIFMAFC{d 2zuQSЫ~^d4R.]FMAFCK2zYQSЫvv i Y hghEгjUQYΡWLh wv= z[ЫƑYeU;*6L檇$ Lw'5?FX0 "`>@l EܤQ)z I HIqsꁰ)D$p)@ -7h$LAE7tfAgs ":lMf&@#Jh:I3 $ $ W Gi4G&L$lUGiT*QFӫ44B$Jhz-($ hzzF7@ WFi4*5J)H)H(I2LxYTIe3$`*3mMfv&sv$WF5hQi̲y7e3dk kzdv.r$י~䊒N&LP>p\E&}"$pz MrYu]}C !~ 4Ep=XpKV.YGS(Ϧ:n 4T Ϣ<;3ɳ3|n d<;yיMM%M64dQdSdQdSdk@M6K˦L̤l hʐ&BK&JlzɢɦɢɦWGM%M6j=jUQB&&^5ɨɦWEM%M64}&=uu&VtRjehfk 3[ӳ_'M6*5jՇ&n̤L̦\554ɨɦ&+i3WFM%M64YMY4 ɂ=,*2H?i Gu*2H < ذk hamη ,lȳ"<;H~B <6*jey~dhq8tyĔ3/'2p2R;3LWjSP> l:r3tVyقaC5aCi3ɡ%3MzЮɦɡWQ'M6M:irUIB]49k)hrhd7bɡ]C&&.>4M]PE} z࠾W$ $餾,̢LUgI}C^uvU}7Mɤ:3o2*`&ĎLD6UNZI}Ȧ@$@R_AP N$lpB>$QR_ShL'UZ'ShDIgM'Uf'm$l{L 4j 0!bM\q5WShɴ萸.d 3$W%W\ShDIrMArM2k m(IUQrEIrMkzo\7KWF5*5J)HZ.\ӫ䊒N$*3=9n[YL'sv$Ħ˳Ӹ/JQE7yvfgg&yVfggg#;3=9mӫӌ9t1;3׺-JmRe  ],8ɳ#jE`{a?= MVddGze5Y4ٰjy φ2 hɊLH? $H,i{u2 ۫MAC{ڛ/SE49ި.̤)wC{t&w49ɡ*@5 hr, hrU7Mv49k)hrUIMAC&&^449ߤɡW&MN[tUjЫR&vMvszU_dSЫ.۠Y4.`g`gg_ zUT^2)<*?*tQTg&EM檝4 zmUQ7L檳|יi?V~^?6E}"sQpy"Ž@_#@W>$E.m G*'Q\MEq/$x|C$o^,QbSb>MY.g;N444Y5xCM>^4ZPM7݅$Ltr23*2ԦRR^ *)4Ԧ‚J-JJmz,ԦԦn@MAMZJm JfZԦW'<&N i)΍\Gy:Bsc>FmSmQ|(SC:m?BVvU_oQЫhv>?Qrg~?׫~!~n]8= C@ " ~?[߂g?cğ *P!6VTjShlRWmu+:RNJ ))zԦJJ-JJm M()鵄RR^*ZR5TjSPjQRjSPj5xԦԦԢԦWE6/*()ʐRilzUT<^7 (MM'ufR_eH}Mzk gӫ.&\X&Ϧ*3CNkLב g2MNt3:H۠%7L3:8LYɉԳ,d/ZeE.WfW8i>.˄&į0!Nf2 :zѪ˄&,W^++K2!~e +3LY&į̵L:L[hЮ/Z۷Ю/z-]g_Z-@g_Z@g_V]^/zz:UgCξU}Ag_]g_P4!~eμKҝ1.WAC +3h+3hr2m_,>^,W~ѫRRUACM}LNB# PhqL'UBc ()館l 4I*pS_E&}"p" .لXvAHB,B@bI3$Ă?M3RNB;$ 3$nB$@C% 3fnB$LB&@&JBl )&LB&΀^ )oZHMabe6!vZ"F!V5QbSbk@!6LZPEIM(n@MAMBlzUjbSbSbQbӫ^XtbeHM'!v7!v檨;sYbMؙI!!6, $\(ĦWE!ؙ݄IلؙE?_XpbG!Vذ<2iG .?haot &Bl";H~B vtdzڅtd!N7T',y+tQ_g&M7jQ k:o2:3o2]}C77j^@}C76v ]tfΆ^Utt67TW&5 7lUIgu :zU_ЫΒΆ^tt6W$5 [M,:AO:U%7M檝&l2:3mNfؙdЫR^7Ԥ&3pr$_-I7Udy"Vp+2͂H},H+̂3큤>M}3RNB$ wBd<8*ShDn\Ld2]dp93=+hLA}EѡԉNJHrEIrM}R4=T+Z,`gYp21ʳ2$Ϧ Ϣ$Ϧ ϦBl -(ɳ<<^+ʳ<ݺj=ʳUQMAմ<^Y'ȳUgQEIM:;ʳ3<;sv<;sUQpgMٙIYpUgG!v(ĦWE!6/ (ضm~`v ZTݰ`WmD5Zϯ6a?Mi['Ss))LC{['SPgư<ߟ9shm)qhoBv5,[CjM$y-ӡjho|LatU\Y%:UV``v {g5(jUfAQ>ƮgzUjA}C {.1vM>^ R-cu~߯ӥ @CjL(@C_@p>8FzSyQc^ )N"HCǧ SЮ18Z &7Y{(=$%xQ>t__HvnHR. E$^PNh h?f↤uQuܰ i op2<54Yg<o?^D5SmQm>0ݔPjSPjQRjSPjQRjSPjSPjQRjSPjQRjSPjӫ~RR0R^5Z*R+)3РRRNJ̦LJ )UGVfSjg&VtRj75WF6ZM:3ͣC'MVfdg<ϼhNB $ʐNBL]Y T_kAP_ӫG5VQ}5' PLF!6ؙhڷN߯f$۔ZiJDH)"Ӕ< B'IAH,8ɳ">RjA8Jm J-JgShLa,JBl m)( 4yVfdg2M%M6M%M6v4Y44Y44ɦж&Bb m(iU0Yʚ4~.RNJ̦5.gѕ> uPׁئԦWUilzUuڊWQ:m6e!Ud'VbSs$!6] ) q(Q^+ 鵲7tQMAEav(m>&]w?N!M> 7~C54Y4tf7j ̂ ,XװF,5ݙa?YAg Nmᢳvt֑7_{AΆ_m ohoB{d ڧ&ۡ. ]rMArC{%$7K)HnhЫ~Vą$7$ WfLdzb Ы²V#qӄؙiBUI\C~c-&iuML&,݈MY6]'L,tBLy]΀<.di3 ϡ׊EzX$Ϧ49.ϡ<^kshqj'̍q27N2.Ħ ġw!DHAH,' /&y$ς YeG;!~ l6yS(Ϧ|̰ ]\aᲉّe(aWTiHW$q 퍏)kߦ΀Ά&)7I]gM'MC]gMAgCΚΆ')lhYSЮW$ 3lUCIgMAgC2M}V5k2uf& 6uf& (jhWe$$יi2us5MrY&,\gIn2$7Z.\g@CI3 ġ$7e LrCU&*Dk:MrzzCP}M@}cO|7e o2MrRЮjH}8r_"ɂ},+BJ- n$~4 vd;̂^jE`nl} zD6%6δClJJm )(()2wpfmg@MAEIMAEIMu2%6%665)8ZHM1GD*!PhqDIMAMY3,8QD*h+3h+CmzQ,]Etme6v.=\{geir249lϞNfRjeHMՂ8M9=`zt2˳# ڦ*-3 ڦW珢mzB3Pmtaיetgq2~;s9d@EIM')b?prE&)"$傓+2I!)QN ?prE&)Wd'I"?rA!| J)H(I)4 $ꙂNR&@Sg R.JRn R.JRn Rn R.JRn m(I)HUQMAʵ B;d (IU\2hDIMAM'UWfSug&UWT*+3+CnzUQB]UtRue6UwT]Mۦ\U}Tue93օQ՝T]Rui MM'Uw洃M՝TJnzMꢛ;nz )lRug`(MM'vGvf(gHM)')ܑE)7\ܑE)7}a? A NR",R$,RHa i*HRڥZoHCi'HyKy6NRLHCUhdv)-R2?wf'|2lLNO1=L۰-HR. q$~?[~+2"~?#ܰ.HJ- 8D6߄#?gΐBSg R.JRnڧ'~;m -Jm -Jm m -Jm ())Cߦ*ߦWE%66]6;3=,gΐNR&LR IUG)Wfrg&)Wtr7KWF)7\Mʝj6)Oh+3mjOfmwjAwV|iΐh.HKfa,gkB6V!mahɀh^?)( Jm JmڙIٔڙkeAy{CAEIMM`-Bl؅Xذ!6ݙa?A} NȢ,4yvd<+l~&vM6shoB$77I]rMArC{c:In2 k %$7-]rMArC䚂v 'Inho/\ArCJk zm4cN$x.МL߈g:V2We=Jq(gzUjzwRΆ^̍FMsdq2:3͍Yp>ZHgCΚ,8ZHQC,8A;Cu3ZH;MQ;?ˁv^]7h'̓u8F뀸vq,-Kf : WWN5t׏Er*B:+:M[X9 $!!~&ĊLB$Of},H+ ND5%5t:AYf ΐ<.۶ٔPjSPjQRjSPjQRjShLAEIMu%66IZ'-Ԧ:^*ģR+)3:)ɳ)ȳ2!vf'35I8*ۄؙiB2!v:ӯJ'LӚ~~+6MNfRu;33+39=l[Yx;CZozMڄZozMڄZ/:mNrC;Z;zSz;tיe4NfS%S JLK.ͮ8ݍr7"4.(܍t @."М!6]S`ΐ^ ޠn P`, CAMATܙҰ2سI}gSgQgE?[(ς<;ȳ" φ<;ȳ" φ3' ȳagIYّEy6,l{2~: EXpDNq]Nn]~.Ƞ߉ H߆]XO'CWhӋ̢̠̠߯߯t~AY׋V uzѪߡ]_C]_Ek;%֊Wq~Z_tdP&)(lA>AЮ/zIY:xzA_MX]^/:w2~2~D8IʓYA)3Eed~(n(wХ>/zMy1yصEu >tWj^Z׊5i+SE:r}Ś>E_>^_xQ%((_/].x"t@.Tݴzh~h h?v 0p+sNՏcĩqߦڄ-j+mz)(i~~K NODGA-Jm -Jm%[۰ a?a "m#Rnإ\Ky w;Y[oî߂~;;5~hv6v~lJ (uhoBRR.J̤6++)(uhWjSP$v6Jm Jڕ:ԡ]]AC*LJm Jڕ:txL[2Ӕ:eJ (uhWeJ4N+W*۔ڙiJ2v:+uhWE;J}.ڡӔ:nڦyt2W'6&,t׺@:X2 ϡjAg̡gC!>=q赲.O3ev!6!Bl+Ӆ8 qj_-@CA}CǴ2W_{:~n?^g:0mWZqG^PNh h?p~;L~ ~?B&'QMAEIM2Zix2SK2pt:&@f R.JRn R.JRn ͗)H(I)Y$ fk )7*(W!\Mʝ\.됪N̦@%34"e&4OZ-PM˲ 2jಬ)\5UeY5;3<}̦LZnZYPM'WtdHM'24^pZ@cKK1n }S0 ]p. …6Q0`:]p€3Ӆe`~\xX\d߰˾ e{DAtGp~hazAϰ= ]A A]MAC"}{Ы~<H@סxto^jyКdzd Ыʣv֛#jqs:zB4OuB$ta>Ow̲ϯòex./ Z|IC Cg@CaTL">zSA1և^j~cm^+u kޕ~ܕzYmMAC'Z$HHZ/Z@zA8z i`k`ꂠ$U&N$UU |kK@TuSPuQRuShLAEIMI2U%U7Uvg'&.~()43ꢤ}mI3UφT]TR$\Wq=D@V֠;CSuHMN(âD[Exװ=<;@y ɳ.L8FRjkZ.YsE'Mvfdep&~so!y6~LgS箑ʐ<<_ ɳ(u$Ϣ$1<^sLg;QMAEIO;Bk :4)?'uHMAEIM'yUIH,@gA8z ɳ wOiJ\ghNN% ؀ x`h@1 k7+cG1[VʌUSh@ <, '<y9 TTY9(ɳ(I AIEyJ, ԓge,yV9'ʀ<%ybF9(ɳ(sPOYDy%`OYkEy:WS#ɳ2P%MzcS#i2A=MVyhLfw:R+c)udHEUt"|̕~'K<~q RhE*nl»ץ2~G[{ZД)9IyPK_' ;u-u:Cjo#/jכ!oJ/JKݛHޣ%~@}Z ֧`}&QZ ֲd_./k/X~@}Z< ~ZEA[ZEAֲ}QZ3S;i蘆'GTJZEkkQ2%82t i]c.dƹåKI.{2%օ(~Ү7t%e_Gi[V:R HyR9qό%ϑ!yzuZ|%I׫&Zsב殕FdQ뢪2udhZԚV=؍XdQk:2X3)2pu`yҮfG)2֌2֌vdme'ugSS.FƛVƚVTjQkF;2ތ2h?K3v@mZh '`}+DZh ֢D[.' `-AN>h'E[D;i]%E[D;i]%E[D;i]fZ3ڙE;i-ڢ IkNZvZEAֳԢ0̓v=irR9w(nyy:|7s~y:~+3ڕ:dgu@Փv}\TsoS'zyFrPtシ5 |:$߿P=3yNLAtc (|zN\nԒֵHR|@p"p@ A$)R> Iy@(±? Iy@IQQE$ JR. ŗ(HyPrQ(DAʃBԓreJP2̀%"I>( (|PkN<3Μxfe_W OO4- Ix%ڑ!]S#㉶2V))Ou(AaxRg[OzSUt#%ڑD[n@S#㉶2hmQK#C-̔+ ʓ:sikpOWޙF!砞<+cɳ29feP!Mny!NJKǛHܽGO/[F< ir@I‰jI&k@䀠&. =&M49 hr@8DMMJ, (hrPdQdQ䠤ɢA=MVde,M i(hrPdQ(DA&&%MMz?dQ(P[%Mz@䠞&+ci2,2,ufl J, Iy@(3 Iy@I|@rQ$P%)))JR. Rԓre,)WƒȐ%)I<(I(HyPrQrѮC)b&UrѮD)I2+c]GE@ J-~WCd5s:$ru5YxL&Zɑ!M4Y\&ZdQK#C,ji2mi2ݸ`j2hde,MVxɑ4YdѮx75YK#i2&+ӍM4CRx꫌H! +Xo@P_T䀠 WV߀u&X=A}k +XW_7iI2+iI2+iIIRԿbKZK(&uVt6i]%uVt6iIkMhIh!Z:F3wRG}3C[ʀ&W7iחz o@}E7ϕLgJ]upv:QJIP)h'uD[sRZD;#ڙqD[s:UYe7ސ~'EƳ;)wYd+N@EI;wAvcw>5w:~wCݽwN sǕFuP#Ny~n{@~S9 ~= w@IBΞI~H; ~~%L;((_AIEAz (wPoQߢP~%‡*~0V򃱚DxQ(|T]KՕ:QTuѮ棕!))JR.Gƚ HyPNu4- IheHEYeFS&Zk>:3ίUYnΌXJNjɳny&PƙVZRгkRmeY{{xCϏNA83ڙqff3ӍB ;-5<˞8sXsיF,䠤ɢDII-o.A}$ \@8$ 5[@PI}H pHw@R߀pv@T_QPߠPP%J7((oPO} J+ WW7((<gQyz4WQk9:POgtVcDfqu@Wa{p+㩯2A{pgƹwf)c0,3RGZPUt#w8VE-Edƹ2=3,:p>Z礤ɢoehYY~gX;3]=JO﫝VIQ[7S}72*,L(Ģβmeeۙq9< kyKR۷-Xu=D[Щ&b?H`-AQ>+ R\r HRrQuIrQ򤵔'\)u{fYu$ wYje,UL0KiZf:J (uҮ&΢i:3K5K'yN:3`n<3'r>)dzyNڍMIhQNj)u;Hhz>: ir@87 irz>ZV7  A}$ Gm@8hD J+ (oPR_Q(DA}B9ԚL=% J:+ %(lPYQ٠]:+G3  *cldp>,ەߕuSo:$ĢG-uf@ZLש&~M4gRHJ-ڍ RGSje1ZRje,8KF!mz>Z棓:˶̴5K̀&pw~ ۼ 3SG'um+c- hrP7ϙMTΌgetcjrPdQ䠤ɢ&?ꄚ4Y䀠ɂu(X[AkM59 h`AL>& ֚4Y>j6 irҺtMNZIIkMMNZCIkMMNZ8&)q29i-Ϣ I%i-Ϣ IkyyNZsҮ#yNZ@IfrEA}vݝ'XGr$73]_I2f\QKr3u$f=L{%I׫&u$WKr3Ӎ$I\e,͌#Y%vInR&`ʀ&%m>jG3Vۖg.6~ǜH}E-͌sk8Sƺ5Xfj!1'7iW{ʌXL7b&W7 7  ր ; o@PI}BI}Hڀp+ UPR_Q(DA}B$ W Vᣌ! J+ Ō(oPR_QPߠ]?+ (hס%;S}#㩯2PEIx: lPOgqx꫌ske`qtҮ6W%I׫ZO}FT_Q072*cn@72Ff}{r5n˕PgEQu6X:tVnBr5Zrh2FS_e:@ J+ WRv:Hw@R߀p"p@R߀P 7  ; o@PI}QQ}EA}B$ W$QPߠP% e, (oPR_Q(fDA}%9T_Q(:%:Tߠ]wgodcpϐ2ڼN-;juѝ2ѝZ2zSIFH2Npn H2* d4 U3 $ ( AI0E J) Ō(fPLѲlIZN{T2((dPRIQZ fPLQ̠~=(PtDgK2*(AIFEњq͌3gf]kv63*:Yg{Rx꫌!ka^tqfrL7YL P}E9̐ =ίoL7bY38Yg{Ƙ͌3g`^ǹI՞dÚ3ƬofY=Cc됔,5SvHT}@Rp*3y@RPUT= d gπA$UT}@TuQPP%UKT=((TAAKUJ. T]Rue@Ճ֪7ze,W?QEHٹ1zg/v]|873t yмN} _x əqg@P {,@R{xDSfHEey$xc=83({$ُd_x1z{x^v.ۮ5Jм  j<)3t @xpӞi=yBF7 { əqg ;5ܔM{σ:n3 Xw3Ӕ3ܑzOS3Z/j#h ֢D[6 vZEAWZEA֢mQhZꙩgՓ֢- IkN,L-ڢ83XRG3$Ik)WlIyf)Lᒔ'\o 28KUO޲xeeU]Zneֲt?Ҹt,> n eIret -OHyf)Wƒ8&F,oY|fUWT=wRG3ֲt#,>30bu\ԒK͌X^K3S_r%w.zzX>3+czfUL7摪'u+c-ό > hA9; i}@1HZ~@q. HBN(zA(up (]M.KP.(D@P %z#)~PUOji}dExf_/"Eu"B-U1f0*\ .{ \нGOI^(gON gof`ljio28 3ә jh=/ 3I-Ul%A$UQ@8$UNIHpF H{@Pv@oQߢߢAIEHJ- oe@EA~~%f)+czd 5Y7g.jsyeh|-XsʴU7׮L76stU?sPfsYSӬz:4޽-^Ǻ1]f@E;1ڕ#͵+Ӊ wPoQߢ~?[߂(XAZP߂~K;-Xw@oڀIkNZNIkNZwZEA- 4O<3~Z4L- I'iߢ0'(zw^޷p޿i>%g} c~qSBn9z:4=^6_/s]H]f߿l=s74=}H<5D_GOx%[><|ϧ%ku2e?a~Y'z}~Dzgu}Sf/s}w~xJyލ尉ǔ5>YxY㘼< %}s> %k?8&o[59gaSoK8~]w˒5Hm%ud?A6[9v~<7%?o"Mo%/xŃ)]ߊ=V=,OSANkħQa#Gq6=j5q)}qUhW㘾Uh7t}nzu[v3[v3[v5y@;eV]V]~V].N]B~*VݾNvx~4&1*vyhh{V?Nvz~&Nooo8"/?e)kK\+D|lz}9tnӧquVVV~{Yj[mv~,:.qyh=(;oފ(|n_[Iv07Jo%㞎LÔ=JcyVR9۸&J;m/>^颗|Xt6h$793K^e>f&tmNK޷{&IɁ.y殹otcG=o5Y]MHD7.zFi ciMFNMfol:V_]ts3|m\j6Hse*snJ6{Fi.i[FШD=o4+LohN]" Zn4kb}i=oXχk])#?2@l+C}l+G}\ni _OܛKmZmYݛi]W`e6`îfke=oriݫ2m=uX}yX}YnF\oZ짻߆r fUsmx/`֣ e١ni{]VOٽ0ei6,ͺ6f4^Y=}f_]:f Զ>}6{VJoLYz @zA=Z>+4e|:ZģZZn"[/i{V/i{V/겧B,gWfBٽBu˳BS>&/{V/׽BٽB?kϷo ^e{V'm{V/cm-.zn˳zp=YD>3eݫzAv=YY>n{=YؾYƿ˞iA}gӯ"WtV?_c[>=[xcy[A;/ ??8??%aSCr_Ǻi|&- xʺiBj,[q=MlkGǫX7vyN2_f,[^;jNZXv8o_X^bn>1IJa[+W_M-,[^;p m)¼Mu-,[^;p ¼p./-[^;` ]-60oyja9BytlyzG}ׯ&M.Y^E*˖y0oy-ܷK ³N;-,[^;p m1¼~-Ӷ0piaځ[m-^-1˵ W!nvyG+Lame424{^ga8MqmibڡiⱭ_\v&i7lvZigy|ke4ҵrTpme4ҵ;̛]Vieje9~Ǥ{+iUEs+˦isvZok.VM.M+,,]VwLt~EںiڥiCjje4rV㭻M[nce42}V}uVM.S+0nvV>uӴK}[2oviZ٦xZY6Mt\գk+iǶtme4ҴMlvZQ62oviZVM.]+mʼiڥkiM.M+Y7MZYO1yʼiڅ[ȫ[]V>g4ҵ9iq|lvZuӴKC6M.]+±nvZoS3k+iӇx]V>c4ҴruӴ˫*1%X꬛^l8֭QL^h4ҵGi9rqxҴruӴKʇ]V~nvZ9okk+iӞvV₵uӴK׊gne4Ҵ-8xke4ҵaiX7ML2,2L]]bV mie4rٖ?/4ޮ;^h42}ViVM.S+k4޾jY62ovZylʼiڥiaYiZ7M4?,k4ҵZZ7Mt|XֺiejvQXt|Xֺiڥie[ ʲiڥkòM.]+nviZ}Xֺiڥk-q[[7M4?,k4ҵaYiZ7M>K<~֮y4zV* VM.S+?Bm\oh42}V>o4­TvZ0uӴKm[2ovZ9E7+t| iY7M4ҵr̛]VNfnvZ0uӴ˫m!z:Xvscٍ[p&|| zYnK?eyQ;򑫑y;8V٦W*ﳫP.3x_>|+2>7k/qlSoqq2{р6 endstream endobj 641 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 645 0 obj << /Length 1510 /Filter /FlateDecode >> stream xWK6W9.ÇG 4ޒh^č -h탃p8oCT#~=̦G^|x{ZD"_Gyx&LsSWXnֵi,*X~~i!@,DkUeIrDexG-FO(2ߋ ~Y"Y$dYaLTz/LѯN~ss;=}%ZzL˘Nm<6m+z5}zvwKǶk`0tLYR$[J?45+:Mf% bP\sNUKKS׶֮ GITMz-;uH'NǖClz 63t4TVםiNJDB؅b: m|T@)z06#ayt 2]d y/F ?'X161[DX]3c2cDܶG;v?`">VaD0s.IFP?ID{xtZy zO:0,T*Pu x<Q4ۘg.PVemMGçͶLTbPA$_oCEZhBBؠWLZ]aPI;f>w8UON%*~"QBR,V]Ç@fm1fغhYDruA@ ܕ=8eG%5=wbp mh齫tafۆ OZ!r=6İ f>y?b Dk4Lnvf3x4Rgp] iJ|̀Q)Bb="eP nL9"*8g}˜up%yZg:`63_)8C9֮L0l p?we׼.KI}3 HL^*Fi$%mAh {v@=7!BA/󳼝\깷>g.hA"s/✿$"g7%;QcrGhqES-TW6b-"$b5Xf\.\yD!7OCdJ!q F@u%XT{]\8큫|uMԶ}fT,k*#/6C[e {]x,7ίO( qŞz}0t_( endstream endobj 632 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/HeatmapResultAPClusterDataSet2q08c-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 648 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 649 0 R>> /ExtGState << >>/ColorSpace << /sRGB 650 0 R >>>> /Length 41119 /Filter /FlateDecode >> stream x͎$עd} >ŬTI=@Ch@P󔗭Ͱ#2U/Go?|_Ϸ?~?ǟ߾ϯ__o>]o?>C=}xwH~Zӏ/~[K{I?ϏoߟԚ_~''z?|z_/o ?~n~?|7j ߾~~Ծ}_~f}ڿYo_+=x}\t}\t}DžMWǕMǥ]\_Wqqq /᷏˛᷏\j8^2]_>e^/oZ.k?>?_>p|\?Y|W+\nzq-ZǵLo_};qU ^bx~z^_>e^|\t~zq-q-/z.U u~\t~z+^_?e^~\t~zq-z~q-+Su]NW׏+?U /W|=]_?{~\tm']qUqUqUq?~4}|Gk㺧k㺧k㺧k㺧k㺧k\ۿ W.~*~*~*~7^W8]q}\ztx{r6<G{D\ (~!į׿׿׿׿?>|}䛾ezQa'ߏU ~~} >|&~ ~}|y?Q?^UKz|-b~?/׿'*D_O R'"_ |Ґ|"_DK|w\xgG HI_o刺?5IF|~?';?uuJ|{;\ݟB$OHII/Lpub>'4|uҒO\K?y˗ӏ-_~ '>'_k|u}q?WEN~';'_=*~Oj}aﯧbkk|rkb'J?k|Ҕk|__׃Gi֯]ss?s_3ߚi?MG]N [ʿ5ѳho?>_ c~Xfljtl[iZ>N[Oc y:~xAoGpWQt`G?>9(:ރ(?sΓ?'ZENOAUI!g˗#+(:pg)qz :Eӣr{9aUi*wS!@LQG>TSU?k>W/)?OcT?2)o|NM) S|I) R:+/XRΗOF)Q:xBh4"lzqm{|mջnݻ?+Wz1(XE^TU- bPÃAoϿظ>ncnjcnģ7ر+8_[_#xg2(ؓOg|ƧGbNbVĜ fO1gRŜ8ٓE̙ bds&3"L_s~Ϥٱ88*ر+8*ر{7z7zױ{7Vde[ xoX|zƉƉƧ/|z~ӣt]'V];vG'VG'VG;vG'VG;vG'VG'VG;vG'VG[;щющщющющщющющющщѡmutbuhݶ}Z 'ZtGu1U1M6blEZ&kZbOLA]`Ǫ]7`.[.Ű`wMհV=ZM.u:v^q'@5IccfJM&UzғELÞe9d8NgO.u.U:VVVLaHuuZM.u.U:V:@"ɥ~Up{H P.P.PEc"Ա Ա T*'@@A]] P.PEcc"Ա Tuu5 @@Uj@E[["P/jԋ*P*PE^ 8ԓ.A{OO\>=JתcjbjbժLVVVVf2zҵ8z6jjXnjXɰ d1l&T:v&V:.d0l&a=Y I5LzҵX]X]]X]XX4~Iw صXXصXصXX]X4*P.**P.*P.**P.*P; 4 Ա 4 4 Ա 4 Ա 4 4 Ա 4 Ա 4 Ա 4 4 4(MuzIZ, P.%n֋EbҪ]j]WŢkAZu\ hqѪ'Uݥ] P dҪ';j=YQIwju\d$[O{3%|EPpb$[OzeuUd"[Oj2֓.[I,deeuU:v:v*Nd5dI"ֱֱVdeuuU:v*NVdeeuU:v:v*llc"ֱֱVdeuuU:v*llA]]fcY?u\w?k1wV ѻj1jxZLբ{W{jwX{-fR츼w6έt+A{g3駳ݻ{g=Y;IL\O=:JM&zOrI"|^d븜j2yד.[Ec+_K}|e]ݰ]V=Y hձkձkU>䗻=:v:v*Nd5dI"ֱֱVdeuuL'{ v v V;v+A] (ر+X v V;v;v+A]`Ǯ`Ǯ`ô+ر+XO+51G - ^+g?)_Qp~4]nUj]nGx};'oĿx>]]ģw7|[o}'gG6v6N<*>Et' ?BWpbUcWpbK3_x>^TSxGYL^8!~<+'ďGv\>*jnǮĪĪkǮh.**f.jcEPpbcnbnbcnIO .}|A̞t1'V;v'V;v'V'V;v'V;v'V'V;v'V*]U]UU]U]UU]U]U]UUiUpbUrjUré'&{Q6jz1jzѽֽ{׋W7`77`EPcW"(q8ͤ*q9]7.[77ŻwwLllA]WީprIcc7liS,3g2Ϝp?'̙ 6dXOaݰݰ`XnXE0c7c7rp yqdOOAΤ.t1+o:=њtG'V1'.6d9MddOюъhhhEpcw"8ڱ;ڱ;Z-퀣ююъhhEpcwcw"8ڱ;Zvv6mώoVGo^TG_)Oiպݎbns}홃6ϯر8ر8hvOظ>?GbN<˷;Z'Ɖ/?y'1? *f.*fţw( ŜXŜXOdcfl ߌnĪ`ŻT:v&V&V:v&V:v&V&V:.d&]ΙT;v&V&V:v&V:v&V&V:v&Vk:vU&֓njjMnjMnjjMnjM[3Zӱ[3Z3Zӱ[3Zӱ[3Z3Zӱ[3Zӱ[3Zӱ[3Z3Z3Lt<[J=޹ ZLb赘E"k1 TEVVyzn PEׂT"PO@A] PEt*@j2 ԓ*Pl} @=Y q&@=uU:v^q'@5Ic"Ա Tq'@=yt19\8ԓREpcwcw"ԱT\]]8ԓťds'ݥRRREpcw"ԱԱT\].u\\ ԱԱT\].u.u.U:vJRREpcwcw"ԱT\]].u.U:v*KKKMRR bgWQE[bk1YSŚ|p{ Z?XSm k:Vk:n_fMO5ݚ`MŚtk*n@5=YN;5NŚ,XSɚtk:vk*55YӓŚL[ӱ[Sx?$POzjgݚgEe2|V' P*S* RZU:v:v*NZjU\uuU:ponO #:v*VVAV5:v:v*VVA]]UǮUصZuZuZU:v*VVVA]UǮUEЪcתcתٵصh;_Z O^ |O^Tٺe,}\d"[/lݪlm_ٻ;M]]ģwe uMS6N V'.٠ӓW%1'V1;v1'b98w>Wx~(]׉=NNvNvNNvNުĪkI?KZmrEws?k8Z,'^,V뎾h-G_ rhMLLA׎Uo۱;Zq9Md1&=VbnOskv\̭dnO's{}9ٓI,K\$%8IܓE,d']⊓=Wx2Ggծ8ݓvIUrvIWIU]] qE,gיt;V;Nd& qE⚀A] q.q.qEcwW;v;v+A]] q.qEc"HܱKܱK8wWO>w\|I" c']̉Ɖٵ'3+(=NNvNvNNvNvChDG ;jNX m8b9b8b9;Z;jˉj=N=YN3N3VG;'ڞtG'V1'v+.'ڙ 'ڞ,'ڙt+.'ڙT1'.6lXƞt;v+v'VdcƚL6d'Ɗ`cncƞ,6d&=6V\>+ncEcc"رXlmm6v6[t+kgmXmXeV0c7c7"ֱV u솕4ݰ`XnXnXE0c7"ֱֱV uU:v:vÚݰݰYϿհja΂uZurpEתZUZuwIժrpIucwibuchpfIurfIuchbcfp`MO5kzX3jjMn5kzX3Tk:vk&Vk:.df&5=YIrIcfbfbrs&{=.M.M.u.M.U&744q9dЪ']եÙ'˙m&Ù'˙m&w=MMuMuMMuM޵JwwwwwwwwwwwwwwwwwC]7%}ޅvC Z I ZZYA8sε8öu벽;]>Z nۏ<9{}{ŻQws-;V'v*wݻ]ǣwdiOw9yP49+>1PcW"(ر*X`x]E/ 2N$O߉IUQ&{2|z' f.f.f.jcGPcWcWLߟtIu#ٱٱY9XؽXe hUЪcתcת"hձkUصصZuZ)@]UǮUǮUEЪcת"hձkձkUصZuZU:v:v]]Vg]WŢkZUZU;ζt2adX-aպa6VŰ_lۃЙdXOz u\ =wt*N{Wؽu\ :.d']] [.+nd&l=uU:.d'l=Yd$[Oj2֓ElllA] [.[.[I,&l=U:v:v*llA]] [.[E"[M@]] [.[Ecc"ֱV:v*lllA] [.[.[Ec"ֱVdeeklv:v*.{gzqm{{g1ߋ]Z,bwuUud$Llf26*[.*[nAT:.Zͤj~οE>.A 6q'l3MuMUd [OfReXee8֓E d'l3dLlaaaaaaaaf2VɰT:v&V&V:v&V:v&V&p=ʏfcn]Owwwwwwwwww]]]]]]z7zq{Y[w v;~p- n|Ť`-պz1N$-DEo ?{=螜O?NwA,Ldp' 3韩X~| xLZ7׳=NmW);uPlw]>t.7Xu@~og$O}A{S}X~~R~og? J>S {3=EuQw9N8J=u`{` Tħ.yj+H>U_۳Y>T fq |.X@lZתVvߵwͺZٟ Vvߵ?UwOk} p@j EWnחZ_H^ ˭ {ܜ _q=ݓL&_; Go>3u% `*1JwnL7xU 0^pz6x=tƧv]WiDsm6{i W%,ߛL4f7éz6MJ`wU@sUyjGx*p[u7L7*h 4W%vS;S;ٳYne7֮Dh׉]Ю@hU"+Z vB]JvBUЮ@hU"+JvB]ЪDhW +ڤBUτ~HMr=?kOXkv<' 5`kM֎ЎS֎ 5!X3$n.Φ`a N]`|c{C!

_hi:!<+x9!:q;mWvjvj+p;sڹڹ:q;lΦsڹڹ Nvnvn.fv6/c? NNvnvnS;S;]۩p;sڹڹ NvnvnvnS;]۩ۮs;su:~Y[5n]du]uO:[5n]d5α=+.kBW\n]du=Nsw[׳]Dsl:][׳wn]lYS[׳Yn]fy7wݸ p NX_u;f6әw6۩gAvnNgygy{3ygVnGJvnUۮmU+p NV%B fy[XvX;r;7DsWr7-,{C4w]ǽ!]vW* `W%+] `w]vW+] `W%U vW `wn``;7k2IoL45h~M6k4W4W\>.=qpo᪄pW@*!uB7Ǿe3ݎol`Ug3ݛ l`ݛ,5p {o&k{mg1B7 L/h kDz\gA/Na^JPÞlex1b+ܫɽ+ 'tr:hlR+h_p\\Wx!@^pTWx!^P\ ^pTWx!^P\Uz!^pTWx!@^pTWx!^0Wx!@uQ/x~!O[5[=YnBO/&  Znׄ^H]n|F_KҌj@*6uj6/ʦ:Dru6ML7Qg:5WWkjkj+5 |M|U>,ZW@mjGmjG+~\)uvԦ.Lf7@LK{,N,N,vvS;S;]ũņ 8XYY ,N,vvvS;]ũŮ08uct,bM`M_ `Yq]ZКL&@hǎS B_8 ]sao֩B]ЪDh׉UЩ˧{ڛNhSDhmЮNYgo۩n,l#<Jv]͆po&{3!\ ,˛U@sW*hJ4wU@S!vmAgg1ޛ]xm6{31^b+0Jwƫ]xUb+0^?]xW`+0^ W%ƻ]xW`*1Jwƻj`+0^ucxM&_'_L&xʼn31^qb5AƻN׆:1`*1Jw 0^:1^U7{31ޛ]xo&kCw_ud7 0Jwxo&{31^Lfc7xUb+0Jwƫ]xUb+0x׉]NU7{3\+u6ͽhFso&kC4wU@sU+hJ4wGm+\h 4w]DsW+\h 4W%U@sW 4whO[ۓ);;O6O:֎֎Њ@hINv=L߳#9]ЩЮ@NԎem XN,vA=wN} ޜLک MU%Ԧv楏z|o|YPK>78/88Z׉t_S;_S;_]WWkj*5ڡڡ PM$u|v|v|3S;(]/ 񧊐ڑڑx3GtLt<~sf3|v|>S;>8zqԦvԦvԺjS;jOWQ7SککzvvlW]OU§OmkI $uǯo6T9I'I&UUU֓UEcc"@ձCU%>/A]!vvTS_vv|>S?*/>]OgL]oy/?޼BIS;I]_!9IU@NNRW ij'+433@:1NGWcjcj+1 tLtT%:v:S;S;]@NNGWcj+1u9;@AA Lt: ϯ@ t<> P#1fz3fӡ PMP=>G+5zoWo!bkjFRHzԓT""THzԓ~A?W59}j5< UzE"9k697WW+UJPu]N_]Soli6WkUm6zsx-}wO¥Ԧ_|urҭʏ{| *?tRrRrR w>mo۪mW+p[ V%n]۪mWUۮmU+pJvn]ۮmU+p[ڹJvXU ֮I76+~>G~\|֏H>= kvj+:JXvXN]S]o˩Ů1b+L]NuYNuyO߅Nh3BhMYޓkGcSI"ڱڱZ :NhWޫS;]ǯ` NNvB.f"t6_`z|_o a Sf`l:S;]_9~>Z ߱ ^"qЩ/,fیY~7@êM'+:: NNvBvBS;]ЩЩЮ@NhW tj'tj'+:X{NN] pv6v6v6&tMG+p;u9f9f:fyg7L'tS;]w?s{$Htkw+v+n4d9 d: "1^Eb|*]upl O]lx׉l3ޕ|W6I7|L- W[ 0xW`*0>=ܕ:XgXgX{38p׍UۮmW*qJvnUۮ"]۪mW+p[ V%n]۪mW*qu6mWmm6n{Vݸmo۪#6n{V%nNf6mo&n{V%nUϳYnxty6kW*:}՗~;2'ϳU ᮀpU@xjvj+XU7,{XV%,]˪eW*a XV%,Xv,]ˮeU²+`Y Xv,]˪e ]ˮˮn~-I,N Xu;oΛ`o` tuS;j]AJ®p.Jt|>A+Sue~Tz=Yz5nqe[\ؓOEcǧcǧ"ӱSqe;]>S;>S;>]˧K{LLt|.gLg,l{$ML] 3u:ͦ333u:ͦSڙ LtLtt:v:N,,LtN$ͦHII $M$uvvIS;IU@NNRW ij'+44HI $M$u|v|v|>Sw{LLtfvPtej+11#ڑ HLHLHt. [ztLtLt wg3؛G`ōL̼&LGbFGMW$:*W$:*HtLHt%]AAWro6AUAm6z9z:gAt8to6˭lt tT HGW* tT%:U7:z3ћlt診* tT%:U@GW*xU+Q tt:]DGW+Q tT%:.(]˭3]'fj3r TH $DRW *u9fכvly!u]D]N]l&jCuuɉLfOSWq' u5:v:v*Ndy&`S+;ũŮӻgY=M'+::NhW tBho&Bg ::NԅSyMrjDzl:U ˩ˮԎԎeWrjDzl,g`ٛ t,NXΦcڱڱ XNXv,v,v,S;U ˩ˮԎԎeWrjDz+`9c9cڱ XN] `}~SX{NNXv,v,ԎeWrl,{3a9S;S;]˩ˮY `9c9c9 ]͂eo6,+N}dy&{_=B+p)L}Z X"aYce#]Ъ Z V%BvBU˧K:5,ЩPe&ao^9~~' ` NB_u{l6d' JwS;S;]Щe U ˮeW*aJXv,U ˮ"]˪eW+`Y XV%,]˪eW*au²6 ]'kCvU `Cv]'{3X Lֆ v]Nֆ v`vZkXkX `E  ؛ U `U+*8΅U j΅sa׉l|f,_+PxZ Ū__UWUtZtZ QQ*Q U%uU@]W*Q{U+PW uu]D]W+PW U%NՆ utN7QgD XX|~90}|T6@hU"Dho&BkڛLUۮpެ7{3q[+pmvnvXN[?wB+NdZ cDzeM&,{ұXvXvX>=y c'"a9cur6 Xv,v,SvBv,S;]˩ Y `9u7XN,vvng,gLXΦc9cڱ XN]͂eo˩ˮXv,v,v,S;]˩˩ˮԎeUrjDz+`9c9cڱ XNXNXv,v,S;]ũˍ,X {XN,NvvvnjG+66uj6 Tvv|>S^o >|v|v|Yo6Y7@D\:Wl+U>g/WW*W,ǯt.Ls~oqy]XJ,v=?ǍLϕ\L8 XV%,_KX~|}/a8eW*a:;9Lfzwr6k U ֮kW*`JvXU ֮"]֪kW+Z` V%X]֪kW*`JvNv%,NXֆ:Z}|k13sDn]_8C~|/!?+4>ܕ w}=k+!ܵ#ܕ v>~7{3!\Ÿ?g/"_O_ZϤ"+8~>+8q۪mWj]+SЮ@hW Z }׊ԉoaߜd²' 5,;OOa:-d:-_tܤ p_x pvVNYN~ڹ N7r>@xj?YNvn.fv6ɲ7p,g,{~ׅLΦs;sڹq;LΦs;sڹڹ}8؛vBNΦ NvBvBvBS;UЩЮ@NNhW tj'+:: NvBvBvBS;]'Bg:NhW tBha"t6Ю@ԅ,f"t6 S~ Y ,N,vvS;S;b׍+ndxϲ'{3gȎ{=N='ˊD]~"Vqxϲ'tO]llD]~Ju]N޳{3XShW{B{Cv>+ ]WM,*wԺjU Z 9 9 ٛ 9`o`W+X V%]`WU`U+Jv]`U+X V%]`ho Uwߛ~*u7Mڕ뺜 gV%U `U+l]^_ 5|M6kV|M6k"X"Xq5AU7{3*JvS]W8UPMk]U LPՆ:AU3 S]WUϧ7Sgʩq`UkȭW؛L,ֆN]]`U+X v]WEU `W*JvU `U+X v]Xu;f7`U:v~T@*uB7jPttct6]`W* 6H`f=~H;?| t} g?x t} 'O^1ϲ>= `ٱcYoV[7x 4|mt tj:Xz}ԎԎe3OXv=| t#_GXUN]>F˛c9'XS;Uf-oʦ:`z5}8/XvXNΦ`aa NvXvXvXS;U ֮֩kWuj+::`a NvXvXvXS;]'Xg:kWurk1,g OڕZ::rj]:cڱ XN]>`:|壼Y>˛l~h_q:dyw&dG@b(/ٓ~ެ͎@hE Њy&tޜϛ]ll֪k~Jv]n` -N]nf:~6:}W6Riofyo7ӭ[SծeWUg؛]˪e~+87ӭU7{V%]`W* V%v]`U+X v]`W* V%.V{VN:ZM?o]SlSho6,{ov%]_ aJXv'ˮp vldNf6` ,܆bO:ŎŎŊbDžŚS;]'g8bW`qjg+8uaq6ŮԅL,Φubq6ũ Xbo&gYY ,N,VXbo&gYY ,N,vv.,fbq6Ů,vvvS;]ũũŮbUbqjg+88XY ,N,N,vvS;]ũũŮԅSgY:8b?8bW`ql{38bW`qjgqboũŮbW`qjgqsaq6 XWXkB,V+sa铨=Y>Zb"XqOm؊bW`bo&{,V%UŮ]'k`boŮgN{7\Nf7`W*|Lf7`W*JvVΩZ jU ZW@*PJuԺjU ګ"j]ZW@+VP U%Ժj]ZW@*PJuԺjU fgfl&zUP VP VP:֛ lf1ڛ,8ΦDJv]`W`#s7ɮuQ@+ndx.M8 _\X8"XW$*N V`o`W*ص8:}r+ׇU%uUfȭlsamsaoЪB]Ю@hU"+Z vB]WEBUЮ@hW *JvBUЮ@hU"+Z vB]Ъ Zu#7@hq`#7@hU"Dho&Bk8Vsa׉UŮbUb+XX ,vzJꪞ?~U \:,g_!ܵ#,^xy=[yN`Ϧ `O`wvvS;U vW{j+== `O`wvvSSg:=vf{6gAOݛ tSܩˍS;]ˇyOOslytw@+sS+OSO؊p`W_er{xpgoUμSw* \O]t;n]B?"k%tj]ŮbU8N_g+X~qj:P '˩dnN7Q]&T+TPjd+0ڙy :>gI_5Aڡz:_P{^ uUHV%VsX>Btn#8ݵ^2,ӳ ܻ{9ޏ ~Jw=~MLoU 쮇vn +ݵ']_Gw}&W N]'@s~cvVn;vn;vn+ #K~+]Uv,v,S;]˩sluBsqۮmWvj/tko֮֩kWuj*:`aa NvXvXvXS;]'XgujujlX{3:k ,fu6֮tXSX{3:~ ΦS,{3a9#7~`qboũ ,>? UWvSg Nv.Φ|L,vXMgqj?=M꩝uPӉ'ˉ&bړZ""DhE "Dhʼnd$7@hU" 7?#Z` V%XS~ ЩbUb+XX캜Bg3aY²+`Y Xv,]WE,U ˮeW*aJXv,U ˮeWB_q:q֪` DZ }^tX+~>+~<ݜ V%XSЪDh~s+ܜy:bY²k?+!{C,vX­ϯXbzbW`3H,v],~R`*XJ,v7rp#+,>i7`wK?nO,W+`YunE8vŠ`~.υZǎZǎZ6lO7fQ M]PMG+6PQ {3 g NvsԅuS;u]@N]Unj+P7S7Sک MMuvN,pj?N|u=Hyϯ_>tZrZ 5յwvZM+P7u9-f:-f ;6lo۰YNNYNBvB.'SeoЩr6ɲ7@Nh N]NvBvBS;S+!.gLg3d 908uc~Ы, aY|E²"`Y|W>eHVB+Z̚ld`Jv7\UЮ@hU"+ڵ wJXv,]ˮ!,U ˮeW*a|UIJ+`Y Xv,]˪eW+`Y XV΅Y΅΅BUl`oЮ p6 7 p6 6HhW *T`*ص prr `8+u9꺜{C|u]Nv}ϑha`爨U%Ժ.jU ZUB |D]Urt PW>Qkzu]u_P"VP"+_H|U*_5;.5k2{PU%N'_UWU+u:f;PJuԪj]j!ԺjU ZW@*P{UD+VP uԪj]ZW@+VP UNN`W+Uu;f:ֆ캝z3^=TU ө7WUtvttvtvt X:jC,vNu!NLЩ+XaS]W*u:Jv]Tpc4;ANglgU^o` VC?u+Ndy&ež,`avvV΅=Y΅5΅Y>ڛgȩᮀԎpW@xjGxj?CvvXS;]֩{Y p;sڹڹ NV%nvnS;S;]۩ۮmWvjtMIk\8\؛#Nvmm6ngӹ N]M+p;u7!{gȩ NYNB.Oko֩E~[4= fY>$nvnSngӹ Nvn.ϕM?ovn.L,8fBx6gYʝ橝C5h~M5h~M@+@+n4d5iDsm6{4w]DsW+\h 4W%Uͽh hJ4wU@"]DsW+\h 4W%]DsWtr  `Wvm6{`wn`f ]:*u6ؽN`׆:]; ]'{3]r N`ݛ OJ`w ] `W%N`J`w B~!@pxRU'ԏa=Yh q' 5;v+;;'{\,4fy6橝@NsWyjyj+<hi 4O]hBso橝@NNsWyj*<hii 4O4wvvS;]'gyjyjDl{3ua|6 ƧswW{j];]'gPvSgi 4O4w.4Ϧhܛ,=,ݛtƧ.Yzjv|&ooEbc"q[r=!+WɄk2"ܛNqWxx*`JvX]_+~福?hJ4w];S'kCw]ᮀpUB+ pW@*! W%U ᮀpW@*!:ݺgL hܛl4h 4WhDk3*u7@sUDsm6{OSSso*eeU=QWؼDJu U%ԺOvONΐΐΐPvgj]ZU:vsaU+ ¹* OU§߿oJtem:I|. |U%.ifټ_]Ws |U4z4դ ֱV=V~Օ'ŊbbbʼnŞ,,dcq6\΅S;uS;u]@NN]7 w8B.7rguj+::`aJNvXvXvXS;]֮֩֩k ,nNNvNYNNũЮiq6i6iq6Ǚ~ u6r6ᮀdٛd9,`f{6 ؽr =u;ooԎԎ{W}jǽQOwܧ.7rgq O=^wܧ.gLg,gL7}gS/_ @ϱwi{K[8v^dy&p>/\^Pᅀ+n/h2pMTWx!^P\Uz!^pT^S+u½7!ܻU {W*pUĽ+^p wܫ]{W+^p Wp̈́{mSl@~<85O]NͳN,lSsW85OvUk?5wS LfC7µrj !ܵSsWn>Ҽ!.Kü!>J`w ]ow[SmUrtMP4 T I vB.7q!t&=N@hO:+;++Bg2ړ:wN턾k%tj']+Z  ΦЩw}oBg }JNVBߵ:Ю@VBvBߵЩwN턾k%]+S;Z  f!k%tB{3:N7Щ @ho&BߛJNVBߵ:Щw}oBg f!M']+Z }׊,7,keq@Y|7ߛ{Sڱ|׊V,v,ur6 Mr{S|׊wXNݰ'=NXv\nޜ*z߿m 7wӳ/^4&"hpEM 4 H/(N/\z@^4P h5_4^4P \EWx@^4p TEWx^4P^4fz@Eo  \ ^4І^4p TEWx^4P \E*h /‹+hJ/‹*h /n/x{3g/%K }6ɽ7}6+õ_`ܻ}7*h:h7Ӌ,'}6,'}6ӋЋNSWx!@NSɽBwܫ]'{W%ܻU ܫ]'kޛ }j?O>ܻ{ۊ++W$B+N&DhE "5}MFB{V%BVBc9]۪m7wߛ7wgܛJTxyj+Xן7!XU ֮kW*`}U+Z` vX]֪kW+Z` V]~~w67kW fl?j fvoOh7kUkyj%+ XΆZ {g?U'/|fY] u}`z:ax:agw]}o᪄pW@*!pn#U g|aw}=gAwŀpW@/#\wwW;.פ# ;v+v'&³w.ϦnS;]۩t;u7vXvXfGl1>Rɩc Hz'"N63<`/2],w,`a NNvXvXS;]֮֩֩kWujuj+:uzlkol:S;]lko֩˛ea:XgXkXga NN}_A+7|sNN]ΦXvXN,)tj'tcSy+`97vo<riC,N,vx~o:]ũŮcMg+8ua7wv- Wp+7??t3'ýL Z`}frO=_qL{+I#p[}$ܓ$\U fT*qJvn]7X{Lt3y6]ɳh hJ4wU@"]DsW+\h 4W%]DsWFso&kܛJ<]u7ص!N`,lqmwO?sO%7sW8O;.Оvmwhfyvo6{3^½+u½6{Cβ!. \P.xoG7u:/ 8^.Wǟѯ{ ӟ ,gqN96N~W8OgnsJN՟)O O#?}X/S;S)oGLӟ   pʟzd|n|[ +?H@x<[qmuzm~! (lS;]7OHW_pW_pO4`"]~E+] `w]vW+] `W%U vgyq+`~vW*~Uk? whMJ`wͽhM?aw~z39e6vz+p[ݿ.];z$t ^ Zz8HV%XNNS`˦:uò7y|͑/!B]~P HgLjCv=Uτϑ-$ ]#Zz$35'p ,V%Y\Ūb#oX\ ߡޡm]Ъ+DhE Њ@hE Њ@+Њ@+WDBUЮ@hW *JvBUЮ@hU"+Z vFhoЪBUЮ@"]Ъ Z VDhoЪDhW Fho&BkCgӮeWeo&,kCXvl?t f7kU+MUO)N_L?moIflAN]~~i q/ !,4o4ϜhzyDsVO]'{s<Ǯʿ9~~bke]+؏݀x}sĽ7G9mpW`Y}OOq"ɯwW;v;v+;@~N~E"j'+??ȟ OOwvS;]mvܻvƧvƻv,Wlܽ.d\Ȧ_p Bt! B@6B+\H\>˦^HvvNB~oRI+Vn4Ϧu\l(˦3NS{3=o$uBx6 ½.ϼS~zM9NNSngӹ:q;m??> yBl{3<S'N]=uA7³Ÿ́l:S;,fCA_"!\"!\~EB" \~EB" pW@*! W%U ᮀpW@*!Jw]˹7ӹ{6@s=+]SWs~qۛUۮmՍLJvnN,Lg4wNL4Iu]vW=*.7g4W%.7{3w6@sWtz6ML7gܤ {M]ԳN7g4_&l+!uB7&u79r? rC{6mUrC7ygtC{6 ~C{9N0;ێۊmmmEc"p۱s۱s[عHNvnvnvnS;]۩۩ۮmWvj+p;s;u9μS;];: JN]α`l:]֮֩Y`M+:u:Φc9vjrjDzl,{ةũŮ,k:NhW tj=cc{3cgӱڱ:cgc{ة97fl,{XN]αn&f9Φ&Xgs4x<`:tۛt;tvj\Js6vvlx׉l Wxm^9~~ ]wr7x#Wpf392?3sn]8xW`*1g*{sd|8g??tz6,ݕpܺ߯{]r?Oo:4W;v+;;掝@sNsNsEc"<hii 4O4wvvS;]橝@NԅL7g:xMg|jg+0>3^:gg Ow4ϼ];yNf7Nvmo7 NS;]۩fr$<Sngӹ N]l:S;]'ngpۛ,ڹpvrj bgo1wM/Φ:Lf!7YM'+:u!7x6 dz9ގӹvn.l?v+W$+W$+¯HW+¯HW_ W%]᪄pW@*! W%U ᮀpUB+ uB6½??]᪄pW@UᮀpU8KOgkU+Z` vXNg,gޜKyopy*`ڛ 9vr=YoR3yk͟~&Mꮄp~z*p[m>,,^ywgi~׊TI=]֮GX׿ymoۮ9v6m3s$nҙ9"U;77]RG,JXv=b~oЩbx3yg,aYHXV,_XV,_X"aYX"aY|EIJ+`Y Xv,]˪eW+`Y XV%,U ˮe lXf²6eW+`Y X*bJXv,U ˮeU²+`aٛ l'L']Ю@hՍLֆ:ڛlf" Z vBnf"6Dh׉Lֆ:ckc{3q[+pu6 qu7mՍk76ϼ]'n{VNN!N4hJ4whFso&k+hDsm&:掝@sNsNsEc"ܱܱ\hiH4O4wvvS;]橝橝@NsWyj+<BqxW8Vvovq[ٴ7@sU+hܛlZ+Mٴ*MUdzioЪDhW +M]',kM{s6o={ڛ 9DhmЮ omm֮&Vy3qۛgS~W඾-S֪ktۛt[tۛt[x;JV,"]slmsloslm: Xv,R'KN``Ecc"رXvV$vS;S;]`Wpj+8pj+88JNЮp OS;_])7jYPMG+6u9fzl:Ow6 .ӝ>Lo'vblΦ`aa:Ow6t{gө gӮMgO7tg :MVBS[SVl)t+x6~? MDzQW,Φ+|Uj+Wpr#w6 ؛ ,f;0u;Fno6B)K S n+W$n+VnWF4W_h4"hJ4wU@sU+hJ4w]DsW 46_?LyĞ wƫ]WEƻUxW`*1?zO^b/W%ƻ8XgO] vWtbvm:X‰uj?Va Z` vX‰urbtbMmT t r BNXֆ Xv]Λ>* ڜOAmo۪gngAַ˙ gөGX?}U6ٴ7G]e|ԕ7Ds׉UGм t* n~6cub%crbrbŲcrbŲcgqbpbcpb#wkpj]+S;Z| Vvߵ8wΦknjG]+jZQQ{׊ZW@]+jS;jZQ{׊Ԏڻg,ggQ{l:慳xϦS8yԅfl::XNX{Z|NBߵ;S;::֩ lߛ7Mtnߵr۩wnΦ-b9u {SoHߛBg{:u 7rgӱ|wMrj]sl߅79v6wXk׊V,nX֏3 ˊ+ˊ+W$,+W$,+Xv,]ˮeU²+`Y Xv,]˪eW*aZʹ_/@y\7 V%BvB]Ю@hU"k%tj]Ůũ` ԍLf7unf6D]׉uUu Ru6D]׉uUu٨ PQכlf6D]Wa]_ 8L,X؛,ߵ8:؛òY8 o ص`Uf`lfx3l`WA vNX``Ecc"رXvV$vS;S;]`Wpj+8:8S;S;]`Wpjpj+8 Nv`o:Z{׎Z ,P6=92=`mȾ7ũtS{38` ,fp6 v.8N=R?vg|~ԎZW@mlz36jS;jSoUuq7Y 888 NvI+W$+W$+HV+HV_ V%]`W* V%U `U+؛ ]`U+`W* V%U `W*؛ ]` LֆZ|~~뺡֛ fD7ZUBkE]~ʆP:V j]jP͆Zow~7u!NՆ:Qכu]C'uUG>S͛~Zo&jCuԺNoS'j՛_]Ws |U$+_W$*_W$*_H|U*_H|U|d JuuU@]U+PJuu]D]J+//_ؕ uu]WEuU@]W*QJuuU@]哏Mn*P U=潙P P UP̈́k3@*P:VBZm:j:|yᣘE]'j֛ j]WGڿk]ǮDRW P@RU"DRoϠ 8g!T]-ŮDRI%>M>H $u@RW DOI$u$U:v:v*I;I@R~H'LW`fjg+03333ڙ Ltf~:fA LLt%9W@~S),|o~ʆzS/gA\~ʆ.toB.]>Q~!OT7o#OYzOȯJw]޵ڛӗ,|o{*ެ>} Do/[ϊ@~N~E c'c'"߱_ɯwW$vS;S;]@NN~W j'+?ȟɟ j'+??nNWԅLϦ `O]>Pʛ,慏z~L>B?.u=ߺO]ό:+ƧO,N8'D_6@~{jǽkDl7s{ty 7l \Hw.9.tO8./g\O7򀡲|\>MzS; Yㅀ_.…᳞Y> B@:!x?On_s @+@+W$+W$+w]@~U"+_ w]D~W *ownȯˏ\B*]p W |׍,'UO]7{3ߛ~r 'u7ص!]ؽ ݵyj?aẅ́k3"@*! W Nf6mo&nkCvnNSswo)olo֟ۆpoU~=Jw \#˹7s \:!\4>4ޛ4>~ 6ۮmՍ+ ܾ"q[}E"p[}E"pmE"pmEۮmU+pJvn]ۮmU+p[ V%n]vmJ'kWtS}6n7g3kܛU@sՍL4hJ4wN7gTtS}6vWt|6ˍ]ƫˍX9aNr|6xUQ>u:5f;5(owhDsm6{( uQ> ]'kC'ͽpFl$\4(MEY ]'{s=gj3>xmܵ]=.u}ޛ L`f7vW>r7uǽ"ޱ^pqqwW;v;v+w]d{lW/ p! _p B@j RW/…~! u \H\B@j/ {j'*.f}6VxW`|r7Ypr7ӭ,{s]4H=^4x7p xѠEEᢁrhP#ܻ偧ݳ'prZɟ O=?m:wܧq_[Ynf%>ԎƧx `"]~E"]~E"vE"v~HpUB+ Jw]ᮀpUB+ \ W%]'kCw]ᮀp4>Ul&kݛ4>`*1޵ƻn`f74NSitr q VݳYݽ!n.ټϛ3Lglof \SMmMMgM/|xgZa }²+`7캼'7[ r Zu:w= *uy+l' { {qhJ4w]ݽݳYݽKb@+ \uB ]wwW;v+;;ኄԎpW@xjGxjG+ <# OwvS;SoNMGtvxjG*@wOgީˮԎe׎{KvvNf7` ,ϛSylj6ZW@mjGmjGlzM]P͂ZojS;jSzM]P .7O%O|n-UWjlz3A5iqj~>|{|LJqOק?w/?~󧗧/O2kͿx~}}f/o/O^b}}_pqG^ ??z~?K}%?[/q'Ώ}~O׿=.]mxG o?Yo重1m~(~{!O?=w޾1.xcbw=@?> OAixe@aO_]pu?^"̗?zap_m}^7?,}~u˷_MO0}{0}j_~ax0}f}fr ھix~vx0?O۷_۟4O+OEix}`Eixbt/O d/zOӋퟄlO9I?^=}OG~vȝoy^/?^l'ix@[?e%G~K۷K"%å;?f%i q vھf~Ziixp!}|G~ƧէU"ie}8 qÿ!-y8^u49_} :G% endstream endobj 652 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 657 0 obj << /Length 1369 /Filter /FlateDecode >> stream x]o6ݿB蓄 )T`/R`Ú{Iȴ-D_z;v3," "ywo3% {%>/hFINs,VA&M )2 qY21Ji[i ]UD74`\xF2ƃ]` OdsucAX¼ >>裍e,'y*sBci}S!ԡ}p~Q',xӂi#w5}5.S{;hH5L0+ j=l%BGXT_RkՔzj{DtU; ApQm͠{\f[ vh/mp;,!{j8H4q \EAp,9%@lAip1Cp ԋ=֎X}:d[l{z:[9LhZ7K0 -V.CO@$Fw xiA_SAa߶XYպWݦ, :E|x~Mi\i`)ʩpY9 PUM ڕ+nrD Z _$" JH2zaqf2,*lюU[Uڼ }E{ o5+Wo_(B:cI.& IbB=aZmoϺ$\.ܗźjj$t։Du6q1 On.m|olnݓ;ƧXUM+6O+N|҄ݣ|{@K:^3ŀ63Uuzq.1`׍t[i.vr#>bY.vmXlB6Hl@$0Fr!bk\Zi9`\\]k qL5ީj /4fr8 .^} :?#X{3 g$!|KuD-,7(Mc".  v@>܇5\vdB8o7v?XjgLOE*O5=˲qƙ o2ܾ /_dkr4M+۩W:A6Z3#Q)^n9)Us~3uK V!G7- endstream endobj 642 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/PlotAddLegend-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 659 0 R /BBox [0 0 360 396] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 660 0 R>> /ExtGState << >>/ColorSpace << /sRGB 661 0 R >>>> /Length 7904 /Filter /FlateDecode >> stream x}M.;n^ .}Tj;':LLKsgqIb郢(J]>|?nڶc=/?Vq~G?/ 8^.@p)PqWAp-ǫmwkUTr) d?G/uZk?}~?~ǟ ̥oWp_svc7ǹ6ۜPk.5 -Rl]RY@Z<_g \ HiXamY~i^4ZrrF`h??deD`p~6:jV'}lpqBk-ğ v͎m*S:m1Y(fv~|6늚,*s8Ƽ(3I?_yA6K 3y-KnѥxW,iA~\@9 (oÌ A3f:=S0VJ! fZm֮!x_߼(91G\){:6]w}e! w7*pKW@̉i6n8eBݢK/z[$Ͷ^l_mƫ9`fu\7 fiaʫ7>EҪ[t%Uo~lϫ|`QZU2qƔltǴk1)>@99 8cߴ }T:E6[uMwj\sda®Exiaۮ݌ mgLzX)X0پVT*$UǏ{ ^#Fȅ/8w#BXɘPJL`Ă%U oUW_L-JON6t%"FqPEHM@* ѣע,y=pJz #vM+Y;XqY L :K 0(+S6UҪtE7eѹ)F0Xͨt C? lT T T0, "Pu m̷z0N]3}t7ح[Ma“Wd0-tN׫ݲ'FݢK/z˰vnګХ1gϽm8'jصÀL Os"&`PTuڽ UWM6F@؟ι8naevj(L}3kB . 5Sv~JMe00%qpfN>r low27v=e%M^]B*%4ژzh ے9M/%jpͻ#' fia6.WlBQK Os_~M%yz [g4`Y}GiSх+hȑywD,KnӥxWه A/?16|س9Bqw>' jUW&F]zw[r\sڤcY4'1!w‡2}0gFGQ]zwR}}Wg0/&S__'\ŸK6_~-犩ػFMys7ٮss%-]2bd41RC6lBGҥxv acq%UA^L7რ rbު}'ebmbMo}qľ, y0 (b GB/b-鱁*kh4 eOل(u.ĻoAzGVv,1-hPԻMgeüXb$F++ٛXֽ C/zc geTDf?4pr'zx*A&fؖy[&1uzmqD%ؾ$a(cQF6-epuN̻au`g#?~\㊖3y J>]kn 2_rSr6[t]fE8\19+b8Z 7gi9+N H= -覆ჳ532}b<{vf+5lyS`=ͻZu~؊w {ANaND qBY كnvʙKumrwVtMdm:`v}Rvm%w);}T/։hːw)8Fڱy #L4os -֋ozt!L1X ¼% aW3^ k&&Y/pLVn/I=|o*{ Tqbo\ަc@4DHV8MhV[%ocvT7֋ozIqޘ18 ;<̌4y'cv:sް!Vݤ[/oAT!0 ё00dXLHDhKJy3q Ҹ%uJmķz]׻+Q@;z gNpg7zw0ZZ -覆gz#w bppŸ>"uQ#psS|;g:E6[tuWG#cͅ-%\hJx=#b,#EVY_sHy+]eɮJnҭy^|6'm,6a!ݫ&b5qhaμ8R6M^}ۖa,/1 .Gd$]? ulIֳD_H%o~ݲ }.UѥxW 0SHb`Jl*fix WN)s2)lbR?̛PwHb*6/VʮNɺE^]*dZ`38' v70+YZHk}nӥxWut&.#ycNEd!xtClIӠ6dWWL7Ɔ%)[KXw[\Oc3a2#ٳkB}Q7f@e0xҖMY֔ozk u:54ƌ9(8fn`cV Kl#ʼ )NYҋoz{)\AwSk-C ɫu^rU0)x'~#3C;"X_%Qq l ̋hplAivcx~ضBbO` &!"wWPuK'g-Ӳ7fݢK/z[@a``.&9MZ3 d*Wt8TD|۷k-egݢ[SxpePFqbT`B,vt.MWAcG.,Mȳ gG,4ͷދp1J~8d;֯ϏG]bNZ=$ZvXm"^ug Xm!aMy^YJr޽fݢK/z{쌔%Y@9l8?I"{0 y+\kˮeݢK/z{uw\N7&r qC7X%D,}90qPR6!fݦKSz&w^ aE}Ÿڇ!q91KS4ݚ",S4UT[eg^H .=ԊLH^qYQڎԓ[&9pDXW&\˼qDEc*B<bFG}/q>ɼJއ4fXFFEOلM^]v4Ez+ȩ"{SђGoG}9 |UyՉd biԝuZ޷?H<f Ff Cy;c=M@-Sp[]25uz]o۱cEÌXlǎ_۱[Bc୶cJNM;E^]_~el ֮FiaN;\-*jDaM+o^Aǽ/XZu.Ļ>BӐb 7FwyW =TϘ y2B2un8YMs9Ni#1SxN+:9oBŷc!Bk)A*z]o;1ġaR&WБ{ogunM^]!pc;ش j˄1 fݢ_覆GxDA%HKo,vtx+(rxJvt%U;~)YL2vO;^_֊sBWJW(-9ǭxW=vlv\-\1V HmQtMѱ%L^A˫ :]zwcq\Gu0ՉgǑ%ib#p1N"#ĪSTj#EW+}P0 :Ng2o:V%DvC4Mh P%]wfqDYa܋GGʉQAe{K$^CH0μېnѥxWNb_){2b\jØXq』U:@0ۑzi݁[tŹ0Un~`>dh-*mdzEۊi*19;l@|^I^}Rt4Z78qPet읓WPNax زKE^]|/o gP$ߛ/c("]M('wcTt]ҫ0mxmh HlNmE*K a;ƔeݢK/z[UiN--N GޥW ^C=R"k)yaRv|\-"%-L犁s68[q#fO7)fw`louGnނt]|..<=}~>t %f- jM|y~";阘+qOLcP:>xQu.ĻPWL>y$U JT"w_ gcFw A>7TEуu|4Q?G鞊ͬ/J=e-~ro>=3J'Zѳ=W2?(_N̳=zWj,eE}^H7cpz2<+ xz: }"\kRDc_"yØw.?K}V^x}3ת")%s4_)_5ꋊRy*b]\L֗\^h:' o|5Zt}ϾER~ͺE_ F.yH_ qM/?eWHTD~Z-3 U7XILG}ȹ|.E&O~U虓\Dyk̠{H`f_es*yiTM]s"0rA'iϺXTRtrx>H!SNgCSE 3\!ovaGm=7<qhA"2v\D8XpHj0.,EASS0hv(,}msǟ kś3d.ӿ2ծ!:svKǮ+/W}<+~ܲ.L3tsXM"$pL4" { BTD!kJ NQ t}S \RO%BC>1bkVR']'|o{WbߪF UySǐ@j!_~PPѤ 9ddxL&mg>0?> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 653 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/RtmpGpM8lJ/Rbuild1e68930b7713d/apcluster/vignettes/figure/PlotOnlyLegend-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 664 0 R /BBox [0 0 360 180] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 665 0 R>> /ExtGState << >>/ColorSpace << /sRGB 666 0 R >>>> /Length 1023 /Filter /FlateDecode >> stream x=7 *"owH H R`/A)-2͂hZ0 ޾<>:猾>=ْǟg>`)RL53@Oybn_Emb:Sl+"FB(Y$zwg`Ջ-Mws&ulQ#ym/վIsý;w(;4ZTm\'.hhkmh7\in/վ5wܾYwn܁q mD[ŽQfǏM:;^s;+n!n[k`C\F\܀oEoҦHsK|IMܐ :qCdh_F\޸^oҦHsK}qMܝJ}ݹ]6nmmklinr45÷¯^|+6n/վoKnw{vnLݲUVnM6Fb@> ͔f>:E+Ur}B%P[:V|BUbZ UF( FtT )[ԕPKQf]˺>Ŕ[3,suHe `JdYNU T )k` nYQ;|})Xc,s`oPƫ(T=S^w-uvGuP3c,`S#PR%`*Ԅ{}{}RP:Hq{ 5Ax 5\6'd}OnRPJnOyE'[ԞPЊ'uMs!ij UF( 5^q@rpQ.w~tڷw|6 t JDW_sy9~t)BZğ)m""+Ei_KZ֨vhzZ~2F}o̝n0p~Oݸ?8[CGMd+y endstream endobj 668 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 672 0 obj << /Length 2416 /Filter /FlateDecode >> stream xڭXK6ϯ`DUY0^|j٬٤6!"!eTHۍ(rLf6F7y2-"Y l{g=}w֫uwS~<uׂHe'b7/no`7D'"tRQ]?FiFwn)2aȠDon{[ϒ()+dN{]nx4#|Lh_o_ыE28y{t#i嗢#UU= dO]Im:s7 Sl$uuE[$*KtAF#ޝ)4g+3j vS^S*R>rnHz`XI3]hpKw}w9GB$L;Wpi+;A NXpH)[74 99XHSYdTy-} `5s+e;I!CvuC("Dj{``ta'u21'Y ت2<:, y,#iv4t'?ьÔS; mH6S˾u4PAPfuy$d(J.33THJ˵Q*% reZRYa%O3*e :zTiX]n.ah(Y"&>s2ig-ev[# #Q͖Ijn.!{h>hHZo$5*5 WoKPN\?e6wpq;zp=>|*JR ]_ȧr|1ղ&i|Wv!qsCr:$ɜ=48+`p[ñYg|B>hZ T5hǂ4Q,=]=4x(zY"Έ.^x%!ʱc3ل̇\K1רe<]_\6ю.-(PHhBn T#yH䫵.Ȅ2~Sxu$,OCux@J,[ƕLYpۑl'd?]Ɍzg'OƛYG[KįM<}wGи2Uޅ۟'NMzCu[ap(0|'L^! 9Yr&]ƏvӘYO0Hr-E!0\bsFp;y-*/֮v@~!SUq@}w?D ny 7OP :>~Y?;$ ('dK<9yݮp\`[\}rH) Xt+%\Ѹ ?7 ǬFgHQH zKH1eMWazV,QZٗz8ˁl'*P䀒LN?`!Y@bAt,Da+A@yM~l޽! ,]2m5 ?lr݅$V2tA-Z)+_ ȉ~RV5bc"X,'f2RE}f&RɃUWbT;Q v/';uYͺ}g"9phK bs7ڵ|pNw=I#ttV?V endstream endobj 678 0 obj << /Length 2385 /Filter /FlateDecode >> stream xXr8}W扪 xo83Y[UIh YH I|F%S[h4@}wodzoaf /A2/ac'_ɗ;OYD FZYLTԅHlv灀B艧4HE˃O_Bow^D*ҋDFW?%'@E^L!'SL fweǵu'z7Ua1(Lج Wz6M˕t&o;/ˠ,̹Yi'QB[l0oe=m ~Q_K?(˪f"MhOl0Pz2 d93LU&fnfH뼘(7Ҕ;y=gk)ZSVmsC R@%QZw8LuaV₌=.*Q 'O ‚msʺs6vξlj+e}Gd;!w2?.? E*:SL܌A$dC곔1Ic~n  v.@13fg]o6 l8{]6Ah/l|/rNTweGnM'N^.6{,D BϚUIB7-o:V4Q\>ܕ-Wp?ws'] '*mڟ/lB7Y bMЧg(nܮ+!73;E)DlT(-yߗOӹY\M0u@aٚ`+@튞"wKjsl}vÝ_q iq]{:<Rkoz 8A̳?2@0yZ"#%A oA V@[}Ր;Hj28xjoT!}b~E4\ۆ$,7e]Kr藟fbxNG8 `\aDD2^"7$skN:Jw'egiCKYJ|I|duZ2#U9.*8b۷Gϫ[$4P$n2MʪjoʻU қCFy(R"d+yYu1ik0Q74#NW<\w\9?;;s5[4~Â޸ݣz^vL(z)HDKW\CggqY#PW?{[\#W6+fK4ٙoay v1T7n/C-Wf3fiFb׌QHZfzO~ضoͫ9/a/ˢ3UU~Np[ ~YTOuA&=h@{E/-"oaXeUm/2tpt2~:,ơ{ , {ޗUCrsёhڳ}00$! 5)S}NΖ!<ݸum@ dQ3/^@DOZypqIḿUrO2mUDZe aaʽYyMH2^+ʧlhiޘvTb(;8:#!ZecHXCDhjf+ы~N\ YyeR 2!R. uԤ ~J<M>LJCy6;[ endstream endobj 683 0 obj << /Length 972 /Filter /FlateDecode >> stream xuUMo8W贠HIA]Es`dF]In[{ gޛhd{/F] Lx`!EFOQbNnt]6~^/rL/N:_OM(IDϞ g4D[-".!J4Oa_E_҇G~3caRs (ya vTq<G+&hiRU bUo;}<>$NmS EKwQ74)[&Nq{_dTx+*{+ٝG{Yc`I3BXaTO ԝ*)\;/)|M0<=Tf$M%-1@oAGXVn{Ww%X!4fJiSMÂB:J"s]v~Sw[6] JO~qRv ;8(y83<``~xlzGu5}QrjcK,ZӃ M1o'lxl(p*ù3E;ƹLp&n T2&vXeg^FI{rZKYyѥ,C3VjR:m)av%γ#UՋqK=IIkINF~|t|m8O^t[CaHN4c=ۿUY~{Sb+dVףӜf 4;`gࡽH}X endstream endobj 590 0 obj << /Type /ObjStm /N 100 /First 879 /Length 1924 /Filter /FlateDecode >> stream xYr6};@J*EWnRrQP2PᤜKֈhkS4 ht>%( k<~pk h{~y~,HƯ)Z&Hk&atp˜ $4DC'`Yc!ѰhD3e)$"47'nk i) .Y aX8) LF#@zaɳ, { ,&,N;'ӑF`g@c8%ἇG !AK$vr# 7yVFcP|"Q3{ GA#Q }7Q !%KG+* MA43 gA4-"=KK$.{P6DMn>xAg40%ul&mbp'$BX= 1-'A\7EL &[3cHq/FÙ:햃8<r 샾yj"cY{xDoxb~ߚzc+P=tǾ_78ǓS4vO՛?|.:rXzլu_718c L-Fz73U?+ĥƜ$[[v٭lV@1C S$þH^HnO!ד<:UD4[{24q ͣOD]o~H^Tgf|`ې8ΐ}e L|rG#x{ @bmt=^k$3<:IUoD#1C4 L'%XfD$"Y$ME>ȗz/=?c?SNd3N{%;gDTZ=V\4KfFLGlyz|J4ל 9I54WXx-vp|7W⻾~+z^ouHꃏcu`INfU]7]l}ںou7oGg1KvDanzlW?ˣh{MjȤf\ WVUQu뫋EA bި:ȠKUbծD7تFWj=[6U]uU7[u~]Îd ~Jc8w4DK//b~Z<{.%K)ٽK;Kpo)9Aיd侤9c|0KcZ[S2FwH .=7ۡ| @崯`2F5oTti8CuSu/H"߹RpjF姚qzI:IKE!ZWf%.:i+ɀULV&gз@ a4gbϤvt3|Izl=> stream xڕ1PDXl 磈V&&ZY+h G(ˆAB,ٙ}P!#y8ф.fsULԖI%+]'R5w=%1.iFe:o[ xcmrD/+lQa^n%k\h[%~Ҭ5.NnwZb.HhC5~X endstream endobj 688 0 obj << /Length 204 /Filter /FlateDecode >> stream xڕ1@EXL `EHaRK &vp4,- JBg7N @\e(D͡+QT쎜⇬Uz`.d㉻<U&);Q rDQMԱ@a1PıMmc ]y Z ~/:] {>tٴc_> stream xڭб 0H-} LSZ N⤎Q;\Oh 䃻 jh1W/qz1pAf@Pki| }Qa|cpÖqA# KN2lɠw:RE99[CO#/Jǎmݐg'7ΐl9gXɣ endstream endobj 690 0 obj << /Length 213 /Filter /FlateDecode >> stream xڭб 0-}{O`@U8 kTfИXi${NRuZ:AW` D{JPhݯ=RO39ǰOX",@,scm$61/Vq?*{b\ Sg% nQ6Zi/Zt"Md!N r endstream endobj 691 0 obj << /Length 225 /Filter /FlateDecode >> stream x}1n0 Ed0EG0/ ԡȔdР7 dPK#O'O *k!XnKVz>uөg^3e݋}N7Oo#XnkR 0,H"`nX,2d;F)ԃ"G ٦)eC$9َ}r9H>Gime2bֿɯꢻNǀf endstream endobj 692 0 obj << /Length 225 /Filter /FlateDecode >> stream xu1N0E49BM,)@T@"萒(9K. #3?pW=w<~(ё6[;ϝFOْSxϟ_dw7qB#h%^J"s-,&ï& M ugTi: d)ȧֿHee_3 Y}ETԼ4rs$jYh%t;#k} endstream endobj 693 0 obj << /Length 283 /Filter /FlateDecode >> stream x}J@Hfa4]<Vr YlWX `D9-4oɿ3eP=յj隣{^u\\:ݙ{z|bu~*.r冻D6 !#"%I\(3}Cc{mPD߄%:N4@&qTDMK2v ;Q9(nhK Idvd="Т>y &ɹf{[ӎ N4:58x'_'/t endstream endobj 694 0 obj << /Length 141 /Filter /FlateDecode >> stream x3532Q0PbS3#CB.c3 I$r9yr+q{E=}JJS ]  b<]0000PX?Po?=``D xr "cn endstream endobj 695 0 obj << /Length 170 /Filter /FlateDecode >> stream x1 P t*d |BB`A'qRGE> stream xM=N0j K.Yo?)@[%h(pGH"1&+Ai4絻RF.x/~-O_yUì o[^fv'^TGnBe*TRUCQf4.,B"tF) F#a~̇ Lͥ2~"1e`9Cf1YD5- VM4kcЇA-ʭ endstream endobj 697 0 obj << /Length 177 /Filter /FlateDecode >> stream xڭб 0+ 4%q- ftr'>#t =/u AIn(ƚ!kxB%N_C!Q-$Ft9_Ռ$h+3;tA|y=8ނM?`|ҋ-xI ,vQOzxE:Vv܄#Jsk|jVmx endstream endobj 701 0 obj << /Length 97 /Filter /FlateDecode >> stream x31ӳP0P0T06P0P05WH1* ̡2ɹ\N\ \@a.}O_T.}gC.}hCX.OȠl\=% endstream endobj 715 0 obj << /Length 97 /Filter /FlateDecode >> stream x332V0P04F  )\\@ 2ɹ\N\@.}0PRTʥ`ȥm` PPr \\\-r" endstream endobj 716 0 obj << /Length 148 /Filter /FlateDecode >> stream x332V0P0Q5S06U05RH1*26PAS Lr.'~PKW4K)YKE!P Ek``` @0?700ȃ0P=qqF0.b.WO@.`9e endstream endobj 717 0 obj << /Length 107 /Filter /FlateDecode >> stream x332V0P04F F )\\ es< =\ %E\N \. ц \. r @ -ǀ `S7(b endstream endobj 718 0 obj << /Length 104 /Filter /FlateDecode >> stream x332V0P0V04Q06S06RH1*@hhIrs{=}JJS ]  b<] 0AfpzrrQ8d endstream endobj 719 0 obj << /Length 103 /Filter /FlateDecode >> stream x332V0P0S04Q06V0TH1*22 (B$s≮=L=}JJS ]  b<]o\=t" endstream endobj 720 0 obj << /Length 175 /Filter /FlateDecode >> stream x332V0P0bcssCB.c I$r9yr+p{E=}JJS ]  b<]?0006@BaoBÈ: Pf(:C ār ]u endstream endobj 721 0 obj << /Length 194 /Filter /FlateDecode >> stream xڍ;@!$S `. ,Q &naRK (0bbk5_ǡ&4t :OѬ9^01vCT+2kgTfA4)]k=l STK`O;1@EsSώ܈? v+ 4TK[%1H;0)P7 endstream endobj 722 0 obj << /Length 183 /Filter /FlateDecode >> stream x332V0P0bc 3CB.c3 I$r9yr+q{E=}JJS ]*c<]?0c`~8F4`8 &` q*Q"j r BDP @cL0B? \=hA endstream endobj 723 0 obj << /Length 189 /Filter /FlateDecode >> stream xڍ= @  xY7+P^kP2W̛ycRJlAوOh0L)lzƨ]rB6-Sr[oBU|@ &DEL^YɏBW)M sžԮW@pV _7G endstream endobj 724 0 obj << /Length 181 /Filter /FlateDecode >> stream xmν @ hB{ ֣CB`A'qRGEݣ#8v(r;W-rFEnIJsMpaӡ=+nmuEVTmXP~®G@+i9oH~,x!a(RRQѾI0>F^XnFIxP\wFZh endstream endobj 725 0 obj << /Length 186 /Filter /FlateDecode >> stream xڕα 0 ->5Rqj3:9::(:V$PqCiF?5AD"_4F"qt٣ Q&)ؠNXpFIAܜpʚ&%t3Q@cy!gO_pϫ`5+;Բ>i; endstream endobj 726 0 obj << /Length 171 /Filter /FlateDecode >> stream xu10 E]u%GO@D "" & Xi310~)M='TUùT/Z;R OQ5o3veGڎ@$>,% F" 022??{|̐EX<(> "4Ci endstream endobj 727 0 obj << /Length 191 /Filter /FlateDecode >> stream xڕͱ 0  zO`Z#NZN⤎:vwEpwI䓩|LN)^d<'2ezK&C-zE\)E].duEq"΁A BsT܆g4ʁ!Fdx?V,HHJ|E]1V};=E|9g1 endstream endobj 728 0 obj << /Length 178 /Filter /FlateDecode >> stream x]= @_H&GȜ,#BBB6h9Jr%D;x?3,fጿ|N&WMr 7*kJlrJ7RZox])-w+V⣞H]ζhh@ҶhN0>"NXuM{pTR endstream endobj 729 0 obj << /Length 150 /Filter /FlateDecode >> stream x332V0P0bc3CB.cC I$r9yr+r{E=}JJS. @-\. ``?v 1ao`0 RK)0 szrrT endstream endobj 730 0 obj << /Length 235 /Filter /FlateDecode >> stream xuJA'X,LhD,J--Bn;_k7H %6|3?/g^jɴ-ͩ[-W+Թz!/宑Q rI#_& .}]r HMMr 0 U%=&9~=d< ؅B(mi@a@dblJ_?QG2C*-tKsT endstream endobj 731 0 obj << /Length 157 /Filter /FlateDecode >> stream x332V0CcK3CB.c  s<-=\ %E\N \. ц \. @!A3i@``$z @8D??qzrrcC endstream endobj 732 0 obj << /Length 134 /Filter /FlateDecode >> stream x332V0P0bcSsCB.#K I$r9yr+Yr{E=}JJS ]  b<]bHP1?mpC szrr>F endstream endobj 733 0 obj << /Length 153 /Filter /FlateDecode >> stream xڽ; @E_H!U |2B Fp A+ RK E;]K jaaTܬ ]p96l]k5;<c5i=+?pڲf#V5zžѐ(%,I}! ()Ƥi#_VʵǞA; endstream endobj 734 0 obj << /Length 202 /Filter /FlateDecode >> stream xڕα 0-~5bu* vtr'utPt~Z)3wU/%zi Cpt2|m4DrT>pa<â<0 o#7U\m`vtJ)2mφy2$Ipq6BK2ٯp ?}'K "$|Co endstream endobj 735 0 obj << /Length 116 /Filter /FlateDecode >> stream x332V0P0bcS3CB.crAɹ\N\ \@Q.}O_T.}gC.}hCX.O z f\ >'W /N endstream endobj 736 0 obj << /Length 160 /Filter /FlateDecode >> stream x332V0P5& F )\\&  Ir* s{*r;8+E]*c<]30??`?``H>o;|$l8'W ti0 endstream endobj 737 0 obj << /Length 148 /Filter /FlateDecode >> stream xڭ1 0}N`diB`A'qRGdЧWLl+Y>?Ŏ;rY/9_T Z6F-ZB[t'"H z*I/WDcl<pU endstream endobj 738 0 obj << /Length 168 /Filter /FlateDecode >> stream xu0a G=-T'&:9'qt*<G`dh=GszQҴh4qŖ;VՉFSTvO:l(GU9'}A[HЎ IeC>se%$C 1?&w?D:8.vJ@ endstream endobj 739 0 obj << /Length 195 /Filter /FlateDecode >> stream xڝ1 P oxs}mT: I_Vo#TPӧ$|ß!OH&t0zS+2!9O=x1!uBk f7.\3`Plj媂CJ|P OJ.!ίqk"%\gJ 3o8 ). th endstream endobj 740 0 obj << /Length 155 /Filter /FlateDecode >> stream xڥ= A ]=9 VºSZYZZ(ښ9#XZ,gWč֑&ύYEHy _G< endstream endobj 741 0 obj << /Length 178 /Filter /FlateDecode >> stream x=̱ @ B>B^SSVA'qRGAEh}{Øvp =2 =!]1+䬏pڠRQZJʬ~{P941sJ=[u2T!r;i@0w0,=ԱVG/\*U endstream endobj 742 0 obj << /Length 142 /Filter /FlateDecode >> stream x332V0P0bcCCB.cC I$r9yr+r{E=}JJS|hX.O: >!=x 웁y00?Փ+ LAQ endstream endobj 743 0 obj << /Length 137 /Filter /FlateDecode >> stream x332V0CcKc#CB.c JrW0r{*r;8+r(D*ry(?`$ 4#a#Т?@Ha#Փ+ YL endstream endobj 744 0 obj << /Length 170 /Filter /FlateDecode >> stream x332V0P0bcsc#CB.c I$r9yr+p{E=}JJS ]  b<]oOc? @~U"5 Ȅ<2ao$? `#1pzrrC endstream endobj 745 0 obj << /Length 168 /Filter /FlateDecode >> stream x332V0P0bc c#CB.c3 I$r9yr+q{E=}JJS ]*c<]H|HX`1y$=;L8Î <(|^2}(?v QՓ+ SX endstream endobj 746 0 obj << /Length 211 /Filter /FlateDecode >> stream xEͱ@ [DGy$`NK;:q$>(y-Sb _̌M2C e4Ndx2:&4|OXwdrQD]|.)E}J+@up 94h;EV7Jzd1qe@DG8Gdhs\7ru[|zT endstream endobj 752 0 obj << /Length 197 /Filter /FlateDecode >> stream xڍ `4w/Pj)MPԚ>#46_Gth =(TWC# |=yrϭ3;/ft싳^l,N+=u-',]ƠBR"/ w]OJ Hѐ4MJ0?_9.6վэ-iN͋eVL endstream endobj 753 0 obj << /Length 196 /Filter /FlateDecode >> stream xڍ= @ GbVbh%GH"/Vef Ʃj?8$C(gbg(X]r;fwPL@ | ~nF <z/@:Mrp\3]8[FihHOҙAHVxuO endstream endobj 754 0 obj << /Length 197 /Filter /FlateDecode >> stream x=;0DQ m#'1Q.@T@Ip'Xz&p:SN8qjhBq&,d p’r^ %mW|O w=ْ\%NfN‚R8Ԏ;?]Aq !帿;$EC3NMYBvҶ6n* UKe endstream endobj 755 0 obj << /Length 110 /Filter /FlateDecode >> stream x31ӳP0P0TеP01Q03VH1*22(Bs<L=\ %E\N @BA,BQ? C GG\\\0oy endstream endobj 756 0 obj << /Length 112 /Filter /FlateDecode >> stream x31ӳP0P0VеP0P03VH1*22 (Bds<L=\ %E\N @BA,B@ C \\\HB endstream endobj 757 0 obj << /Length 180 /Filter /FlateDecode >> stream x31ӳP0P0UеP01R03VH1*26 (Bds<͸=\ %E\N @BA,A<@ fČ@ a@@D9e :ɑ $aU?pH\\\o endstream endobj 758 0 obj << /Length 179 /Filter /FlateDecode >> stream x31ӳP0P0UеP01R03VH1*26 (Bds<͸=\ %E\N @BA,B@0"00ԃ@D0 @a"W" ",XL/=  p ISp endstream endobj 759 0 obj << /Length 106 /Filter /FlateDecode >> stream x31ӳP0P0UеT01R5RH1*26 (C$s<͸=̹=}JJS ]  b<]L!W51 endstream endobj 760 0 obj << /Length 180 /Filter /FlateDecode >> stream xڍN; @n!swCM*!Fp A+ RK E;!/^`%mȸ 0Ј2 1> stream x31ӳP0P0V0W01Q0PH1*21PACDr.'~PKW4K)YwQ6T0tQ``a:S$G`1j%r > endstream endobj 762 0 obj << /Length 142 /Filter /FlateDecode >> stream x31ӳP0P04S54V06R04TH1*24 (s< M=\ %E\N \. ц \. ?aC??@P`4,r endstream endobj 763 0 obj << /Length 96 /Filter /FlateDecode >> stream x31ӳP0P0@P!Ő H(`\.'O.pU()*Mw pV]zb<]\= endstream endobj 764 0 obj << /Length 162 /Filter /FlateDecode >> stream x31ӳP0P0UеP01R03VH1*26 (Bds<͸=\ %E\N @BA,<b@N ?8$D D`#2f2X3Iq,63 *@'W yK/ endstream endobj 765 0 obj << /Length 104 /Filter /FlateDecode >> stream x31ӳP0P0@dbUeh䃹`\.'O.pCC.}0BIQi*SPE!'EA0XA0Փ+ 9-I endstream endobj 766 0 obj << /Length 111 /Filter /FlateDecode >> stream x31ӳP0P0V04W01Q0PH1*21PA#CLr.'~PKW4K)YwQ6T0tQz ?*1pՓ+ JS endstream endobj 767 0 obj << /Length 102 /Filter /FlateDecode >> stream x31ӳP0PP04W0T02VH1*26PA3Dr.'~BIQi*S!BA,B?ĸ\=E:( endstream endobj 768 0 obj << /Length 118 /Filter /FlateDecode >> stream x31ӳP0P04P0"sSsCB.#39T*9ɓK?\ȌK(ΥPRTʥ`ȥm``P !\`߀ Apzrr]7 endstream endobj 769 0 obj << /Length 172 /Filter /FlateDecode >> stream x31ӳP0P0bS3CB.rAɹ\N\ &\@Q.}O_T.}gC.}hCX.O&4Ŀ,`ꀐh2B0 0`@?D0pzrrV endstream endobj 770 0 obj << /Length 262 /Filter /FlateDecode >> stream xuN@ u%+ iCN*E"L 22`7 or}g!uIg ZTW)Zg\5QUc~%c̛kz{}|usA^}I6k Fe`<@!cf0?]p sېy&dH}8*v%Vf51СJZ FGY&I⣽0n5FzPEZI7s.^6x*H endstream endobj 771 0 obj << /Length 256 /Filter /FlateDecode >> stream xE1N0`G"%G$QRX*E"L @!'GQ|?1uXn{y7|ZjӟT?qP}e{yzp>s .(\tʋ됨Bh:3N[Vfab1qAKĺgPm33Gqb[@fĹKt,(WpQ'm@b4*~UbE'63PT[ziqt;#Y endstream endobj 772 0 obj << /Length 254 /Filter /FlateDecode >> stream xڍ1N0E"49BD.!ҲH@Q V9#Xqabf4ҷoy5w|pw Raͫ~yzH==US53UKnC#[J  K(R( 4]7^/_2 (`\ <Lx\XgA7A:HÝְZjIKj)! "chI(QUJ{շ1Ge/]tG߹< endstream endobj 773 0 obj << /Length 201 /Filter /FlateDecode >> stream xڕ1 @E'l&GȜMFQVbIx--qFj%.̃^ )LKb> stream x31ӳP0P0bSSsCB.1s<L=\ %E\N \. ц \. P߀ J2~~d|"N`%값 hL F'y,$33oAYՓ+ H06 endstream endobj 775 0 obj << /Length 198 /Filter /FlateDecode >> stream x}ϱ 0 [|TkI Nj}>JcҘ 4蠄|4;.ˇ)Jq)+di#  3 bnA5o3bDTYk[z^DyÒ1 <§QSHhUsjD0N/QG<T]KDbh@C63K[xGj endstream endobj 776 0 obj << /Length 230 /Filter /FlateDecode >> stream xڥбJ@/L i +PysQ%o镶={[r\/䶷\C#;"L E(JdG)23!_#2C[{GE{ʐ :Z2 fFb֘9e)QSFO?V2C鎾?9ru endstream endobj 777 0 obj << /Length 197 /Filter /FlateDecode >> stream x31ӳP0P0bS3CB.C I$r9yr+r{E=}JJS. @-\. 700& @Y4$)&?H L2A :0Y&q RbbH.C _@|A! HC, !݈I endstream endobj 778 0 obj << /Length 149 /Filter /FlateDecode >> stream x31ӳP0P0bSS3CB.C I$r9yr+r{E=}JJS. @-\. $BփI uD6`D2JOĥj2|$(47Ae\=WD endstream endobj 779 0 obj << /Length 141 /Filter /FlateDecode >> stream x31ӳP0P0bS3CB.rAɹ\N\ &\@Q.}O_T.}gC.}hCX.O$3``'Lȁ|DAjD  \\\, endstream endobj 780 0 obj << /Length 114 /Filter /FlateDecode >> stream x31ӳP0P0bSS3CB.1s<L=\ %E\N \. ц \. p,~BĄ'W NP endstream endobj 781 0 obj << /Length 105 /Filter /FlateDecode >> stream x31ӳP0P0bS3CB.c# I$r9yr+q{E=}JJS ]  b<] 0 %\\\6Qg? endstream endobj 782 0 obj << /Length 231 /Filter /FlateDecode >> stream x]ϱn0` n#' v D$:1NClf1t#4Cd?Ka@?>ό/x7e`+/l2 .|w9be;U:.Jp΂Zг j@AR&B n ~x)[yF^}lEƪ# `"P0~? endstream endobj 783 0 obj << /Length 126 /Filter /FlateDecode >> stream x31ӳP0P0bS3CB.rAɹ\N\ &\@Q.}O_T.}gC.}hCX.O``'!P:'`b\=jo endstream endobj 784 0 obj << /Length 201 /Filter /FlateDecode >> stream xڭ1 @4 \kP1),J--!9D,,T]S[̃3nQ*9zK5.sWj9!!qSdaV o,cP$nPPBz@Q(>Zll/5.K=&Mإ(o9)[-_m0v`fs8 endstream endobj 785 0 obj << /Length 199 /Filter /FlateDecode >> stream xe1 0-wӖZtP*AAAQPPRo7iqpT I( 8{~B&6}\9Ol[L,7@g@GEq;>:@8w^@8@X&as!eV^zH4 6Q25> stream xڭϱ 0H^{ӐZZ+AAA(}$]8N KM9&xg,\Od+ f.S0~ ,Ђ)qo19/"jB.P;UuDF 'aybhF4j-iMːO*"`a oƅt endstream endobj 787 0 obj << /Length 218 /Filter /FlateDecode >> stream xڝн 1 Y|;? N⤎磝"b/Y>Jڤu)&cjiɈZ=qYh>&xޡG*hɘR. eى/".Ҭt ҪwVhO/o2C xBbMn7ݥ| "Ԁ3ï>$$J endstream endobj 788 0 obj << /Length 250 /Filter /FlateDecode >> stream xu1N@E'rai=1IL,  DѶ. (ig?lncQiں'Tl=yE&lk\FZ,6KNZa| 9|t5iûH Jbz<rd'0 (9qp&8 %?cFi=H^Q #t)g/pxLkDυ3zA endstream endobj 789 0 obj << /Length 127 /Filter /FlateDecode >> stream x31ӳP0P0bSS3CB.1s<L=\ %E\N \. ц \. D?`OY$$ ;R?$XՓ+ VX endstream endobj 790 0 obj << /Length 174 /Filter /FlateDecode >> stream x1 @ ) fa n!he!Vjih-GL2 +7&.&RY S2sjOƠZKFe7?/4#ڂJ"nݯ;QO7ZB؈U$fMYD@ ϝf+;|WW endstream endobj 791 0 obj << /Length 201 /Filter /FlateDecode >> stream xڵͽ 0+ zO`ZE`A'qRGE6Go t(;T%w.z!h>22J;@j)bAjPjJ-SYmEc-wy 7R5-!l·<дM nܝޣtVWYw8C:rb endstream endobj 792 0 obj << /Length 220 /Filter /FlateDecode >> stream xu=N@ _b%79 H" * D[n&"ymafYy.\O:/wa\gVVOK{Ǵý~~|m]=(k}fϋ kEm&fhF hrá +'2ʉ3q4|PY؁0e齳s5\@e'XreSU4Q~MQd endstream endobj 793 0 obj << /Length 206 /Filter /FlateDecode >> stream xڥϽ 0+->Z+S*AAAѹ}>b$*.bBz:ԥVDJQܣmT;fiTTf3:; :Yc6\;lhkb⍹/N-Z6*p|ZX?4>usn tn N2\KKv endstream endobj 794 0 obj << /Length 205 /Filter /FlateDecode >> stream xڍn1 ]1%o )$n@S ZYG!i _ϲ=gzp;:٨T6{hh.DmyءQvF0`80cf̱b9)zA}T$"'S|_Q((M I +TPGey?4dѸYz1_ S endstream endobj 795 0 obj << /Length 220 /Filter /FlateDecode >> stream xڝ; @ )isJE"b=A aS~] endstream endobj 796 0 obj << /Length 216 /Filter /FlateDecode >> stream xu1N0E*ir ,-D $(VT@Iv(>–)VAaYO??V=ϝz`U6]oX?ݕvⷺ}qE XXͨ̎p[P0LhB M 4ESDiDf( DETHIc %)>/~Œ\r/_})oG endstream endobj 797 0 obj << /Length 164 /Filter /FlateDecode >> stream x31ӳP0P0bSsCB.c3 I$r9yr+q{E=}JJS ]  b<]300? C=`cf ?F%5Ƅ@.N%\=CSt endstream endobj 798 0 obj << /Length 275 /Filter /FlateDecode >> stream xڅ=N@ M_(E"T+*AD \%7!H9Ec{BHLid=RI'tT%=VjIM}h=<|ŕԱh UXiSQy :!1{.g t<A9Nt¿ɽ`n [Y'(3@ ~sPoi5E,b6y0ɬ1$V ٺ[Lz #h&;ij$^MR} ^x?m endstream endobj 799 0 obj << /Length 165 /Filter /FlateDecode >> stream xɱ @ : Y k 7:9utPt>ZpcҘ(@>?1t>C1I0IF*x܂ڡA ʮv@F G` t>'C/fH= b賚'b6l Q"Di endstream endobj 800 0 obj << /Length 137 /Filter /FlateDecode >> stream x31ӳP0P0bCSsCB.cc I$r9yr+s{E=}JJS ]  b<](B` D00 aDHpzrrȧYA endstream endobj 801 0 obj << /Length 168 /Filter /FlateDecode >> stream x1@!&p,`EVJ--4ͣ(-!5W? 9ER?֔$4hqF=`iP(QͤGet>]ń4֚ | f!N^ :^]寸3 lnO(N . k7 endstream endobj 802 0 obj << /Length 217 /Filter /FlateDecode >> stream xڭνn0pH' Q" vP+ċekdUGk?>48^iƏ%Ii?1B4,Ⱦr'd Wwc'/kL8TEk%t:u=|?Q ;DN d~U7 S[v0ؼ?bjv? k1N\*7V*=4#S endstream endobj 803 0 obj << /Length 123 /Filter /FlateDecode >> stream x31ӳP0P0b#S3CB.c3 I$r9yr+q{E=}JJS ]  b<]``? ×0? 'W g endstream endobj 804 0 obj << /Length 161 /Filter /FlateDecode >> stream x31ӳP0C CB.sD"9ɓK?\ĜK(ʥPRTʥ`ȥm`C}?  Yo`*?!*9=g!@d\= endstream endobj 805 0 obj << /Length 159 /Filter /FlateDecode >> stream x1 @бa1[ZYZZ(ZoG 2΢]> stream xڍ1@E #0eV$&ZY+h+{4(- 㲘ڼOϛ$ͦ񄇚1'O6MvV6&U~{I7 ֤rkT dR" "/x"o"x Aā, Ң~~5oU9qNȩ9IR 3,hK` endstream endobj 807 0 obj << /Length 221 /Filter /FlateDecode >> stream xڭбn0bt @Y"QPNt@hycs U.ɺϿm˧ > stream xڭϱJA?lq0= %*#xE@+ I-SD5_,9 ,9nsckc_ťc?f5ySǣZhZ}dl5.dj0r DW@`D$  F]67@Hmtt9OYw억g߹٫e&ڥOM&7ۊ` endstream endobj 809 0 obj << /Length 172 /Filter /FlateDecode >> stream xڵ1 A i832VºSZYZZ(ZXYz#llXZO7荆d/9C;GtVibs0W,lQ9O=l1!洖}N)!0Z2-ygg"(.0P5tŷAUɲ+Y0\%-nYW endstream endobj 810 0 obj << /Length 218 /Filter /FlateDecode >> stream xM1J`b`w.~7hXW0VbZ * vnUra!,ǔK-tgQ ->Gy劲p3%WtpK-Ϗ kxzX 33䎅rCF40@:b #LɂY.dČ 曶AȺ lB{,Zxώ`1K{+orSN~o' endstream endobj 811 0 obj << /Length 160 /Filter /FlateDecode >> stream x31ӳP0P0R5T01P05PH1*26 \.'O.pcs.}0BIQi*Sm` $?` #$`'0   Sd.WO@.] endstream endobj 812 0 obj << /Length 159 /Filter /FlateDecode >> stream x31ӳP0P0R5T01U0TH1*21 (@es<L=\ %E\N \. ц \. `,dF }H<00g?`G"?\=kqt endstream endobj 813 0 obj << /Length 174 /Filter /FlateDecode >> stream x31ӳP0P0bScKCB.1s<L=\ %E\N \. ц \. 7P& eJ``$? @cg@%4*PFF2?F2~~F2?N7 H{ r V endstream endobj 814 0 obj << /Length 195 /Filter /FlateDecode >> stream xuν @ > stream xmν 0C(vAAAѵͣ7Q|AwݤGr6&آt&=>'|z zzBQvi z0b zoU YUX)է-ؽFF'{DžyVJtlH!r&u]Ŋ;7RCSQ񋦠iwH>ʳh endstream endobj 816 0 obj << /Length 237 /Filter /FlateDecode >> stream xeαN02D%{pҊ.TD$: &73Ea+RősƂ)eTQS9mr|IJҌ.kk* C秗{˫3Q&l [f۲cvӨh+켍 R PPÛLm55wۃQ?ڋ_"|v։&Ԋ*Z IM ]4O`9kb{0D>7k endstream endobj 817 0 obj << /Length 171 /Filter /FlateDecode >> stream xڍ1 @ aM@ Fp A+ RK EۉG(2E:/u ͧB"IIR9|c#ʅgݺ+Kٕr%:/%!ԕIDeoKhѰj#0#0?Y` ` `]ГnS^yi endstream endobj 818 0 obj << /Length 218 /Filter /FlateDecode >> stream xڥ1n@E?@#\ ^ c)ʅ*q"QQ8%Ŋ2[$r~y.9R3.#OcE_/T_ܙt_?g~)O)'o6`Pv*;k . , UPC< èzDNe{Υ]ɷ~+| 2%E_Iqhҁ x endstream endobj 819 0 obj << /Length 143 /Filter /FlateDecode >> stream x31ӳP0PbSsCB.crAɹ\N\ \@Q.}O_T.}gC.}hCX.O@l``z 灸C??P szrrRZ endstream endobj 820 0 obj << /Length 232 /Filter /FlateDecode >> stream xmN0Kxe' 0Y*E"L vd(~wH`O,+¯.wZt7j='(IB??v7ϭo^x# `0#,yB=:F0A.O= {řs2t 9FtJ:ZTTwHsͪTU!,)b")3t#}wo endstream endobj 821 0 obj << /Length 239 /Filter /FlateDecode >> stream xMбN@ `G"yv~%-a H0u@LбCQn館?I}LeC-c%H00cRbL5hR"&\/d /N^J+Jx#jC(^ Nw6d`NV?1F3:=0+(-aO"{|ldy endstream endobj 822 0 obj << /Length 196 /Filter /FlateDecode >> stream xڕ=@%$p."AL0XF;pJ 87[syc Of|F&di\%8])Hلט6?/#)"*C Ė(\ -p- *XJ  pZZYjW ( 0G(Yb_/*:p^ endstream endobj 823 0 obj << /Length 217 /Filter /FlateDecode >> stream xڭα@4;/@NYYZZ(ښWG#Lq:q5_1xD1 P)> stream xm1N0E'ris v7,eHV ()@&9#L<| Q`ɯ9JrZ\\Q<^ W7(s W+:C-GnB"LdT@.ëGHF316 6P9n\ Pbf4RuYHq_#B}!\0gܜ!TFIAC$yDE}H#A _|o_ endstream endobj 825 0 obj << /Length 187 /Filter /FlateDecode >> stream xڕ1 @49s݄$@Vbz%GHbQgq80 qL) (#r(SjEAjgTzNe*]LG'o:+x*Pd܂H.'oR(@RB)`na \# endstream endobj 826 0 obj << /Length 232 /Filter /FlateDecode >> stream xu=N@"4>`m Z) HPQ *HIh{=KV)yl/[.᳊Rsut_iۑ%e-o﮸"NJ'v\8I@/#2DR9LKp)Lz OnPY]D 5ň>Lr>AʍpgWi9ԫo0ZTj~]wtO endstream endobj 827 0 obj << /Length 261 /Filter /FlateDecode >> stream xmбJ@ )yŻgp` ,J--m/Zy/0`0h#eg?|%3Yq-SYc/> stream xڍTk6Ltwtw7 =C-t !-t7 H眷[3u0?㒳Z78@ASޘ+ˏ̬F8c1`p0"x)@M(  yyBaE PB@p,f7 lx+Ն '&&' m&ryhtAm `t@ \yx<==.pn(^ F8tApd 2@ {5n,fW@j@3?ClA0Cw+X/'qٿ !66PW  ؁A/' :á@ h3:,>l~p熃1+Al.. {>E0 dp<_ DzCl~acT<!B"¢e󻁾+Oa_W+a ? z;?mal65 w7/a`/)z3`-o+102x C\B.~!^ @h;(@q韑=aw--sA݌WL?),]JHO/'t;{x`;A-@jKPg"Z;peVq. ~  iCߟ/e?pO nV a07%?XB_9ڂ "R07**cxx1; ?xA / F"Ա:RړkkTjy(w~V B.e`qC\v=9I2Awb8YXށ\M/-& ߝajrs(v.gWMop̖v:m$WAYpi .Z v//SDYc8c}MVc}J᝔L&D,og} ?FHfIV7dЦqI fys6< c.TK*g,̠^1%#ruut%Q쌺]Hg^=)Nh!-3k='W1#lYK\{Zv7]~Gài]%9i8eX8^ ^4S\[IZ 4 h\ D ]Fb#Co ݨg1S]-GhdoeC LL]-xuSہ3ugd[ za@1{"m.75dla*7]0xQ'mCz;ɟJj7o%W' *048,'0jױ/%&wZU8yD)N0&͋H3d~ G`؊tVVƕ7ڼ ӣ{rߋ^wHˈuq|swg*P3SaLʉJ3ԧd]`}[/ռ(a7|-vf){"耺coo5 ??q\oal|1E'd>[b\`Z[%œtsO_~~Sre&6vViD c3a m=v9!ѷT lbN=M<-7,O !efV:Q!xKMΔ^kp֓S|LTJ5sUs+ޮiTS^<-2"1?uf4֔NAV+<()NDqNix =OUfς_[^}N'Ÿ!a`%y21 Os_'*&jc^p}r}tMjZ&7Gf0@?͂F!ѣ)5-?9:>#_d f0xvt`D-Yq7_۝c UMPb8vlozpw!0H0^8V|a+ħ~/R SuT2xGP,*]D~:wgv {UFX7wP Jp63|:Snlp[pUpr$m|5آVi ?x37CY47p:hmlMqʪȳ+X=l0ؚ, \Tw ;XQ܏pZg@7=J OnMG! nufn3,)x=DFj~03`hGB5~il^[̳Ү0_5Wϭ"SDopv"K>C9dLNduI?6<" ihE?FIt|*G O˯W?]Q6ZŌkL_#[_YF5Q,X n`>7m|vea"v__M: lv^G5IKwH tƹ>XVDxaXY1 #B/R $K~m{TZPj qhqNjɆgrUK}~9`0gh,k9-@Rz*@o mڥًb] A[V F_2+srQCKc)K9p"}滔YP哫O֢AMƸ3EmeD_ ։XiQl"%ogޢKJrVXL oepjw;6ԝI#GW53&sid[*v3*L#ڗ95мo%3UC^kL]waivQ1ՙ:~$^$~lAo]^}Lk@E*eK|i6*$Vt<2qL&Yr G)a[e<[E;X3؀ND"49{cvy15\r虨:~DŽbV= VLg#sܷlQɓZK+.ؼ\qw4s__ pi( ObC0#5{⨒a;B=bZ5j;e" jõJ})7t "6$f9rh>USQ zz{=#7 tkҢ f[N܌NK+FHԉtϺ'BI.&eδ BeN}6.*eUBScv2;.@]ϙ\pۗhI}17P#DjH[Sk}# l:Ͻ%5?&rn$v)2rֺw #'WiDʃxqfK(G!(J+(n/ɹ,)sf[T0!r5{j5E !@":T]oibuqx }ŬEWI{敉Y4^YNsf'zWR%D $P74p孎NyJ[uAftqFTF-zl:8uxOe#5f&v "NMk?{:G7J-R CSB0UptTwE0"%7Uކ'X ]0^=8Y[p^~DGt6ali!A"FQjiVӯ'3lXy'w)%'4ĞJ~\V 7`b~arf .9+#8 wXZU]a7k2 X w{_j]'uC2If-yE-)u~R>8z9NP?Q/L0ic}`Vqn/X#{‚͌B;'Q֊HENGp'|KJȃ䋙?Vۺ(uFdT6ˋ{/l '9c!K.#9<$TUqJIª W] |!yJ njs\^Pmp2_lJ(Byj1-=7br,fdO$,HGd,zż%ize#f7&q8rG<,I%;H,ߜQYzVcv^ཞž6)r=M{I&kSv8BzFt h[vJ25"#r7MS9*Mϯ0_nZ ޑ N%9>8$q-w1%,b+1vKs;$%= dGQeKh.?(ٍ>}UX<0 ]TSv#+McFKd1&x(.46~z: ?@gܲ)rˌ ͈fT ^N75 bx2[Pc /16Wh*&z=fŘ:HbIފ1 {'DTB"M}-\cx ]g{M"ŠλQE.S?r4!f*[.0v2|׋V-bqV:iՄVN{gIa7~3EJ+WC#VPf8 3wydQ\B ";3?V%xzjsIdcGT,og\Nh/ZNe9ֽ8ݚisSC[c%]Jjb.(x<ʓȡDQȢVHp^i}w5Гgj UXW䦛Fr*/d*pTryBsH{ ?_s" [z\`ilC*rTj՟za#i"ٕ%sS_qaeɥu=E$[XUI-Dny{ EJ8`Sǁd;#|Lʁ2/c>FUhHvl"vͺ ]GHcV@+`ܜ%baӏozއ˖tg%7߇1`< %]ѻi7?pwCI2gᓛ̖RldS}|gDOSz=QYoo!1cL9ٳW`'1epDۨ9)B֐a@#[!5]ރKl%FR bW)u΍k{_qUZ+jܴbE?G'!fI=W!xM)=Yku̷2ݏS "U` u-58 ~ANB@P~*@e4*zFPˎAHV. 3wڍdٜhyfb~SҼ.7u>ʐO._"Fe"\I%aa>>sڼNW*kb5Oټu a^ԬnĂ;'C}{o݅_ \VZUGﮍGEnʩ٤^AlY{o*X)=Z,Gx?E}[}a6`vՐW{ٖ$MQIӸ1;PYGXiӥ}XA/Ґ d ZXCEIe&m !ܩ_x!V.g'@ gxߘujuXGZ 3鄜}e8A X)"O3]쒰YjC|kEaɰ"-wj\%XrV:,@^߄5 96@'ݫM 3oԯիIn5oUJ%Cy">eQ)%Іf "ϥu}UFt{}.[QBE7Τv%|SM5 XqW>QM=ib; <[S)|vuDl个Qt dUg_Du'A7-w72_W$)R(ߗW쯸QqTEd#]ѬÅ.bDHBQiPGˎv8r$bRW+ߑe{+=2-P#nxچ-TS҆~5cM d cW_AOTK!# DZ3M7Zh:Ywؐ( }FK):V"g (, @|&AC sڒh4VZ,pbvG 9A6y^wü(\]; ϻGs`a$_\W7A,f tHTzė-!}GO{9CFt9f zaꩈh ?x1Eżu'(9~&7a&o G&}]vV-\?cgp˷ǖ%bNR3ch\4x5ʰ/_W9{Jf> hv:yug(SD +wɜ:cso&X6olx`|ǢL)hJU־KR==KdR _w,sCڒŇ0)_DCi 6~Fa-nYgTWDY,H;>eǍ|3T11m{2<>f@Qr7ڰ@G3,'EUЬ*?ٕ AiYp- NzQrb[0a3Y4z樸-:t!)JU\au_9CW>^-l.TYN޼(f܈vZ8 ׄ>3gF';V8⎖ɷ.ſ7zDr!eݵ¨?Rs9ϖW)TJJD:/OH?'%dq-ɴ )dSkvkK W4Ѓ"v+T,3(1RiDzP8VE4Mۯ2V}H.`i^xeR5@VѴ|Vm/ V|/Sy.g$OkH Ok9)eJ"s;_xZb O$xhKo3+vʆ?=,R+xQE͟5/268!}ж?:Yf;D eryƬZYk멮WQlQ./aIkv\!oIh+9"pqgehScrm$CSf b,CJL_4x1Z3 ^jֹm[闷՞p(gPyjGlq_ZL4<~y@3Lce畲m#+-l<ռA>_LqZ!w=&8Ǜ'}\o NR,8҆d< UH_ɜo. f(<9,7TX`D=WK0uho $, (7Wqrd?<c67 ~QMmng3ƼR㕁^g> stream xڍTZ6L#H7(0t]5C0twtJK4J %Rzz_֬yg#.-"8\<Yuy# Qpc3T Y8@;Cu @!Q/߆0(@ sT`P;6,w@'ņv!6 (@pe9ta60?!XWQnn///.; n/ :`w0l Y2@]6#@ Cx` C\<`8.;@WY ews@.?~{ r\\AP`q4Ըjy ;_W n"ܹ!?kP[Y py?9lswu¼~ P[ezrC!n`e6w=`o |\HO?W+ p|ppߟO@ bX!P`wC-끸[u2@m!.*#@w ww7V qK1?wk!?_'q{AdSCm`?W@A>wc; wi %d7sܕ(v{`; '//aPo?dG?G)?F #\Ďߔ𝃻˯wWgϿ$y܍K? ~Wײݙ}|`iXc}xy/ՑW r=~a ?N&&r"o3vej+YhɶtC5CN=5k7'fB7av!<[Zk9|lJOuZ@+_欽?IR{'0ml?v6~U"$2b4I"c7z4U^gX݁fX} K_yIYa 1{ַS8X"PrڅNP)<bZ 9#YG2d\}aPjgU|ۀF?N ]YWjCmSsٽm%ygB43WÌl&25xUttbAcY}NkWZ|2^m(T2%b6 3裐k'ℵĢR^b>U `Ͷ]}6 dyk:l UT\ح^_xVZصkVݏ x˧`ߘyxpz)9[pFt1{Rϻ >xL`伤|nh`ϤsWM47߶KN(t* \>f Yyg96sT4%to_]u!9rW!j<;cR&RRk;ڎrQ"q x/fDJ(~駤{3]zbj7vMeؐws*lFJ螵2}K/_<0U[ݽ<ݷ`b5X$Ñ11ֻL%=(R۟dfC0G(P+#K<ܑ!ޤYiWn= 5Xv'}C ,5E$J!PEa'>$sUkd[¾EF)6V#NnUL/YUL[I,ra<Zoz)6Oӂ+Y{"Ds4~ Q5^'9̎E//Uя{ԍWלO ~{nͱ@ekH45*imiE34*IBǯcP@U8:U*Iv6UP #<|BI)Hb:Pw)Ih ˈ0\iQێ7utfO/^zNIaFLÍ9e6 35(@GܠфuO>"q꾁kV1 +Q"Sdu<i8 ǜpJ t() %I-V2v;f#쩋{{l%mXi8!bv%=9$}ې}ݵVgy)ZXBQ5U}OұW:t-N&R9huw^wAk=3ߋ~7>*2 mWg:ċxCVuS M;%Bg^me| jx''g.r=o7Ca+qd!s q9뎞j/gKy7#( .>M~~EUX-7q}3Ԟ;8G^Ubkժ4}k/rS Ls*qtD? qavtX /Y^#'MFt{$Co<'r P~Rdo/>J2'ramց"CJS!O)0ւϫ;eP,y‹CA/ٷmneYGVn֢A69z0LQ(6\W0h(A2 2[ڠqʨbh_Ou5tP]yJ;IM$D%툓kz挭l͢`,bMrI*vN&+c:MIFri Y_`so<-͑/UkyT+%E+t{.O`U\<וˋBV% - 7dB1 ͥg~(0T<8BG=^U{֥p)鶱':7ٲG7=Hk{_]TgGx>b=ƺc̻+QkMe>~Zxw{I8RMMie$)kǧ\!\czrH-ܘ~V=Qg+wVJmW01{*+cL Hᡑb賷&dx`U{i'?rϋw[FEt;Zq3BK>&D5Wn&%*^$S+^$s[p.0jh3 թJ=); 8>æd> zAf٫,->StdI-nxu(7{;pjSduZMZibYS Մ]KtSI"d}v0U fDOЌ<~^$C~LBGPaH88yP.ƶt㪪&JXo$$MX]Gh %Ld *o/źSAO#CRXݗCֵotnC0nu;BBA'%mcr \zr@ت:G apjôS}\3s2OwLI5'X}IfM d@!!&;}E8|AjC +j:>QD GK̜Ze}ۓ"]TZH0vo5դ"-x#f@pHEDNi}(_sPݕ2/ lm\};L9e(hʛ}8 (㷺CuZ ~ϥsqwܮ`ne-FH SH*# 3IxylCB%-mmoרKA)~ knejq.-zCqfޣHyK/g.spsXh.u]qfo40/N:YFV9*{Xf7:<(l)qEkw&,64r&L«1+sLLqO[zl3j[ E70;w&J;Js9`dN.o1ˈi7 B҄[Xzr:aτ.Z8QEO <b5^<+6 i;j6! o8] 4,riUC2JL/HWk9T(q=F87;S|5+${,+SCJ؛~ѝoGA}Fe8Qd;6 z}x ڦ^TvsM_&}u|:)/5Ē({ ۵ӣ 90 J{-8h@4uE(`\y r|:/|"^yה# 2fZ~^TOr;", N2bL)z+o$:Eqy݉S<ӀN311#/S h΢#S49Uso3H.ˆ"/UPKGYQquЙHF6{]6NDxZYmAV`m$wo.VfZ $tw_F#*dGnL}6'O;}^wzq/l/ s}f(jQMF{%M-DNI XhM ;̢+bVYdf`X qSE.ѫ蹰0[&Uw%|lY7Z[9ilNN.$_?*kv:,{"MYic BO c9‹EO 8ړ[1*#oDg;PE=e Τ@5W32oc%g(0*H`,&M(,Rח(˜:w2YSrr3^IISԧֿȈ\_hҏ#aN`RAK#?94 !vɭM@OwʘHH6a=GERO8ϗ)$\Ru/32${U P|0fYR+Ƹa,rxC{Զw?evgA!{D3g`KKaNr*U~ԛwQ񜄓W)?>lZ淂:^X` {FF] չ.i׾7ޣ+oVnJcR.fy>cug)S 'Fr)}ylZd=8 r2}NַM7=*rс̱, =m7c 1qI\"fg+.HP$,oiZ+'v,`ݐ r؂!KMqML. 9TQ#vگGћrvnڞyb1>-ڂ1h9ʈ?;eBZA; P6û* W磽.'Yƥz`ny+> 1)Dž c2 a[Nc:sBr8tӗ1m :oڙ)$#䶄vL][wc6rhWL87{pHm2>`p^ΛI|rV(]YTICGhYv)xj+aؠȱk2(Kzzw6qLP>~;}rNJ+1teeyˠ_MKp ?` ߑX'4{=G+ZSuP~āYsʙoAnV5aB,yoDY}OXy <)m 5z7js*=~8@M#: j~ FNaQaXʼ&(aڥY4|ڞtᾯśa2*hjfƗX,T51 RO>Mw;60KcACM.oX(Alg¤OxN=n.eEuBKjG(mm7x1t%vhwB2N6PC>[-MrzsP.,<ث#0= endstream endobj 839 0 obj << /Length1 1652 /Length2 9484 /Length3 0 /Length 10557 /Filter /FlateDecode >> stream xڍTk6tH#!5R3tww4 0 0tw+ t#)) HK͇'s5k3p(WoE4NPG,xX528UXCݝW?9x9AʡnP/&ae'm^8G3D}v|(_ d]]FJN|?_{]1amt}Q4^~#`{]#gԱ >hOD'l qk):IFoyf[YI|; I6á[j)vċ/qCHBw^ŵKŲLRNx^&)T-gǖqq9=Oi*ի#:țM?vaFn,a)ŌGq+OeOb.N7LkPeoTj[eٚ\贋cizheOYI8ÎB9 -П~1g3k_ϚcS:8kuQC$Y}S B,/3#t^zngg3k.GFt=0vu6@8Ac0#{6K|fNʘTW>K{(&vI Xvy;~L|)غYS5oan <0ƕ +֥Y6'/⪉|pdZS`K-x1p D=&џ*7/ZVOL 268B#O.3t5|??%qΏ~9+k1nG~o>STw7BåkW _`ڞYSؑ4ِClVt5U9ZږA]▾8gS輗'KRZuX̥DFkphd;$E.ze Ḻ؅7 cH1?2O1'm40 V>#o啹_IUL|?N]6| XU57"x>jO*.7PTEjBgE`^zY@-JWjy;70p. 3TfnnS/W1>MQl ! N(=Ia( TAFqrY˧Ʈ QTֳ2^-Z:$Wzü>7W{tdx78I(7Q\Q:I}Fm2jlXm(ĐՈHyXW$TT5i0up=WVdr:Kh;+ %T9}'?,Ը 廉Nc/3'UՔHl&SQ;.Gm=:gOoZvOp'h(Y|hLd@lk4e%^!/N.;EI6(Bio뿒s]MxpS鰣Ip9_vdP}:xOr@t}⭓$+u.P¢\+r-BlO~.|NCiS|89E&g+k4T6U_v@'hx#B^z7\_gg[wV9}۸n#XMߠ"!b'3c̯İHlQ~Wc߲{ˬ6$} jsF9<nO2뒱!~>A/UO]R1Mԟ1?rleBFfsKqn_8]W0kPh9P6? - HzZ6P"] I&"Mz ]c R̝rYc'e%3ג歾a)]wA5w ͡d MSynn"LvmӴ1Je|w<<`ghKRNR>rP;E63':gOZ(dJ?ռ[`tKOZXlv qɐ_2^S|9n^O^HҌcWuz"٠e+Ъbi@^IOö&2{×4@l-a,_(oq&;тjν[V5EQoHe03>QPLo*㝐XVVy!Vَ F/g2AB8;NH~X[/{,٭P,A˩ I73 /{L}r, yݥϸ Чڋ5Wn6) E_L`lہ۫A=r{2U.ǽL/3P];L>|z Yx$Z%OWUȌ=A-m5@;GL; I0ϛmRc-%WNh:.:)3ᓋ a qЉl '#MSCl{먂4ӎēp@ZE Ig0Idn6;OW=z"rO“au-.wmV7wtpt[2{7߄chTl[.Q-l͵D8ZQdgAst~Z\AA.ǯFu17 7Kܸ^Idv rz|TWF܇+v& 4Y +GCfz<.Y ӧ2hto=b[N%2F8܄;M)E;$H64KOA08\/-E#Rn[)|WP6*0F?4Jr`O") uA2YZS,c7T<1[ ;s>"v~rۗ)/ńN1~ 3d6'^ ٹ> Ţ 4,8Wea!Hrm6{Akb+\'TM$-Vm:ktp'DLT7 ;ë7ꅇkk}k^=JvrboJLL]ImJ!?)qK"Q3jұgo[PH)~ k9ϼ2W7+ˊI6viaz#/57Mhe/=}"\Ѧy>&Ḧ́Q9 8y&.wɼ/+*Ro_7|:uFB]شz-`I]g0j{mΕ3byC`F楙tzN زk„EIK%3rW:N ěI8W/#<':b*r*LlE& X sq@Y8O'WCw.hs)d=~X+1%\əKIg-Q8ܤhnjҰ&;*_TuC >]M wzΝ "I}+tFyǔ,^+I (}^X| vem{y!dƀVR-%.Cv* w"yoz6bM]nKi,71:nߒe5eyUL%i;O;/$I_)ܟ(RLzIȊgʮAžd4,]%uX,AR^_Ms}4dD.0 p]25'Fyn6b` +)!tfciF,X-(C p:IJ+M&cjD-(}8o|jSe|*+M#H̫-vKv}2-[zV(y κ>y\[=W 50#6%%¾mɢGJ2~y-2߅dPjNd Od!TXï셂~N׺p:!)ImoɎ_Bi0+S/SQRVCq -r.7PG3|/ܮ_ֆZ;\'EiֽpN8rihSn.ɧ*db%CQ[M&A͇5 D< rMвҾ=J(]$ ,~B |=K}MEj+acfcAB1R D7e k^AhXDPMbJFŋw#* $gRП#PAtv#tY]Ton.:B]T c3ōqё*ٸ<3&:‚EmQwKW1$VX6-'`qA;1},XIo_x}ҍ9d1C(+o;pZ֒iO{r@j0z;.c#|fֱ+ɲC|Qv;m~J|=ZE!,ӵvo0ySބVâ1X-$>i˫͌n܃w,";!u p[+nMҷOd +"jX•ܓC k%1ȃGiph])#j|p]geHH,$`l5ۡA:s+ DW‘CnS/mp*MvV*NT>\KӗZC֋&sl͒NXԫ;* |Դ aÁ m' 4ْۈU;˽0s^28WZA MyG,_M󣈭hG r:#OqPN_~x{1]^[^#|T3CZ?+v*߽'g;qtM깎}ne**nElb `LM,K[z:u!2Hl 3g0856QZN%'aR狒ʞg^w2!}p,2Vi#Soߘ`4#eΜ^PksS x.#YmxtFerT uKI(t~^33c^:w-iLX2֟^9ɺ0Fqprck<#W׶WF$sEXf?9mBӕw A乨Gf;ܤ3ElM2&vӺ֎ 6^.o+1%s{V:5 .:YNE"dh fq` ~T*  ~2 j !vO{zg^Uji <%(a Uƅk+38|.kވ tYBA*~&u;3+/F|sF{~`vl_ՇH,DQqjyۼu'_y+}C0/#P[z1KiQwU1qF/xB6a*rz}&N B^0I-9QIVKI'&(/9<$ L/?7"?CƯ I"2 w,$n(1;y a义#’Wۤ /{Ə˂&yvr}\\rQx7*}OYzO2*.U|-zM?^ $uԙmTAɒ}[jo<;i! L K Z_2~#'b:@fپN@g`+ΠXcl^Vp{[?jnޞJ4UqGW!*()nU79@c Zlʧ$L!le6Je0M6C6'Ԟ̽qki3Mk[¢y7t9~ @l شFAx5]L%# Pz܅PKB͍ledY2[ߖ >c,Aü=b &43'8JAg l4$HWU*[nTokeLa@fgwLe -OUS*ɧN0Y/oi= ޼ ZǒEzC+_Q6]`#6*5k;;w~dQ{:~)y?iTf0`La8URckrS9bE"x+:k")4%q7)_}`hB:ԢA*ί 0}+o!}5Qsrʜf4eA鱑15$=iWu ._K T5&i\NkÏ##J*<r !Y%qEԇY^b{E>0mmJ]Ud3ccTīO1\ #|_sP=2q/J UKة~mNFށ8hF5f(1yw'afpޤIKtl*h9F9z%轙 ʗcص"uiKF8^$}۶! ET$͊0FnhwM!L׼Dg qxi۪W uؤ z2OڰcFZ_%Vb] /q!ݬ5׋v\c^4?_}Yr|IQ#!̮Wfg1^?PY)U~;оIŠSP*8|E/ ڈIg%/9HfKBheʨMCXjG{/6khaQyEz 1QMp;+\DG!WF팗nX&NO#LdYB] Qzg4m7n9tlѯzHVt>]jŸ : &Y}]q-0|t 9҈Tv{>KYܧJɆ (K7%^5h? "OL2!P(ޯaD1e~Ч_OGإ)T95b{֨, kGNEoMepUKǘw?ՕuZa:xԧ5G'Q*Ohܒpy!wvGpZS nVпtKriD>Psuw~+L$f1*t0Y>‚݉v%{^]fzTy&p a#.41&+lD4dh,'K$ UV*DD&M4N\]ick\pzjL$.7xo`"n[GY8XJc<\5Ɖd Je2xr8yuy$w1Q2xD-NK׮wɀcx:8~$4O {M4}qhݳO8i ߜ*JΘ "SL1U`# ir<:V= Hpz7iEIBd)f*,T 5\ ]@$ B+FYBC/|O/\-,^g`sjXs :p@ gZ:ݠa걥΃v8Ws4%|G_FfvaA!7zcK'_ɛVp_"V9kFn6zX'JmD6Ӯ> ub}4eʊƤ="l?C3Mo!GVvawa$i,_R",+z)=i=vi(sM'g{{S.׼i=ujX!˰y$A3q_{<`8B2//Pg+'fEFYf`s1/Lbp RSH᥾dӭۄӵk߮lplg -\V\ xA9Sj:P xmL6~?F;!AVND{`R^IGRnvV s;%OF&nqp3^P.y.^heyiKڏF'z\+b* g]7Cab,Hy3 WzYTmt endstream endobj 841 0 obj << /Length1 1413 /Length2 6550 /Length3 0 /Length 7514 /Filter /FlateDecode >> stream xڍtTo7"0J@rthI JIw7# %H ( <9{vwu_ih,E@HZ("&PזIѮj2^3D/5 h>r%@iy@\LL_H<@ E:H̓W ;:qeuC@997 #` Wv#!p)hwyQQ$ `07 503/ Got@Q0N /wa?z;_`F+ p'E /G']8ߝ #7xe?B\x Ocv58?oA l; T=N ޿𱞣OXa4{y?p5Kٌ97s^S*#e{q& (LB;L6p+1&m$[Q1uz1/<饾#?if*==ꈐ7u⳾,rރ- )fwg!3h؇$`pfvvBeoWy[oXQw?\F U$ "6:k}Gȣq)bTSZ . CmS9I4!j>hObݢyBQ{{歑q piN-f򗪅7 7ET^W:< V(ͯ!hgvugy)# Xp;:A(f5JNUƼ\*&did\3N[<OH|eYܽ]"/Ca#2?JNea"hws#e, >:S;/.Eo۟.Sw:e!-jN.?`I ^;+B9љxgB8C~ jT7:X#Y'1{'!4.5>rfkW#Q}O )ưc>F,"_ ӈ)1^+Ku mN{V]CXfI *DCQHp6jAZ㆜:POKu.IOMzcͱA?Sw9gq(-٨KV4Ի6G!d azoBt9 Qm2(_C'[q~dtJl*C fl=vzSyáx^4b}J˫Bn,nU+E` =(˳.PԳJPgѐ~v,>EuxP7LPm{HU_w`Xͧ<ɞȋShaaЦ4Y>?KӏJMz= !#獬Ǘ ](zs$w` /ښ~媧w됝 ԛyc`CXh"&ɥBDB̜IYEYSl5۟rV%JUR\wG\^tf:Yի9N:$|3ΛO-2ɑraD|Ëz݃2ߨkٴXb1)$~S:X.gfly큾e:M4`QMy/ nb4L3w [l߰ɋ,wy)G%Z %^4I+u>GiޣɨТi, Kg~ ;j\N`7pR<8q1'I#ܙAVu#Kq}DA]K\ e+bo+8B [vgzʽx22>}~1hSJŝ Uzݑ*;ݡȾytYEv:oJ7J_tN{yt:UB[lPw F$QmM5_z/`ef/x]Avqә}Vsn̔x7K(G2ѽ'2^{^qRދ.B4dfL|S`)\-SFIwM41T=i:O;G }>#Tu298ܙN4g<< Kt6sS.nU$5TyHRz iKZ5{JV9o7GB68 K$jG1gu Sӟ1/8) K6{ l k ]QL6-/"͒2v{u(H;.9ydG@5چϰR,(oOQ4Ӿ&).,8~d*4;.>Q3?9rI3R഼wjocOf6}7`cv0&zϴra  *}eΑQĦ$.Fc 0_BXCӵp1 }%t =2j0F1S N =o P?۱SF=IASgU;Y͜9# <\g?zT&hJs͇Ar.nvU &aR!)Q7;09SSj$ T ]  Qhk22ԷI A $5-=aOwfGܰU]cwoX^*:(!873z6t9_LSvu=Թ >\6_"=wXFiVVѲmKh|i1uw>eiY ǖ3S. \nxrWftw#9ٯ ZIm"1L[@Z&>yrԋMЄ޳ Ӟ82:u!F);rV<6=rAٝZ˾ ,@[NNR>~M]'YU(Mj9.}"SbzX+.I?2*Z5{fTr9ߘvOe/y!<|`Ȕ'8Mo!Pi~l{Ca/X'gG25X- qܫdry{qf쩃qXbE ~q Kic5EҰ3k{ˤA`?Ya7m=|?|.^ ZMЀ+4&OSyq.kBf1Q+O U͞!"fϗlFN/c {5V @>)"_Yv ;;z[u,O8Fy]`Ꮥ.^ 듪3OXlO3HzWӌ iyOnd$'4(*ČD( [ J1Wu]vӧ5t>P?nVT,8]ܜqX#2 dCfѠtWl7%ݹUnѲ^]_ ~7^#a3lϷܙ I  J@ɡ-}5 Vv)X V ؐe1w(ct ^nUۄһeG~J]K27m̨n2v`]ft4s_'#:8Sl@-iGvO >gSQ(>2v xCGgNHgKA6ު彇Ƕܗ V|2.nA@:S>hOEm. 5bV9 ~C{VW￘>Rd閍,S$((yҿhq)= f>zeJMi0D9jUIx ]3tmQ:#-?YM_X7%^xYǫ(TN_QQI40&llO(?U~_x'oCt5YL@9GI"K_乫nx9ňZY-t+ M#D'įbߴ}١|@I _8>;vh|JL@unke PX'ز5Lq=ɟHdg> stream xڍT[6N(H4 0CtHwC3C -]J* *!}{}kygs}4%,aY @ 7ȅNOe wE@\\maP8H@N SA n7'\@a.Bi%@B\`N^.6m0Y0@l[ 0 @v;4a׿R0NB`GW(3nЀB\!_ T?qll]0+x l- Pׇ7%9@S^ qVl +-w0zBVC-9\a`ww`:_Z:]9\m~+)@-`(W}Ҷ.csP/`e Մ6 "/7g x3ia+~ zhkkyCqCp7? F 0XB@Cw2~% TTP2`m0O;@@i;Vj<.S_ `k:N{-ʍ@YC$+M[o3o vuAn P=]u!VbiVy8a$jfpy𶮲K5[͚-sX/,Cޅ^Jyo_qӤ~g>ɃT_!U4Ku {-SbƜuǸh4 E+DՏCK]Q A[tap\ri|ۜox>rR45ҢeE$#nZd HH˙ Yh?>4It:9”EҦoXB3.€C72׋aĸx/J+ F݅V5JrvjZ_P{GPּz.0WJ?0 ;rR8)Ff""G(|f쯆bpz K[xM%,(>ډqx*@]Jdڝݛ=e s fK 0\Fjddi޻ܦӗ |A]kc2L4ͯ!+-ufgXWo 9:;9.O;#99a*QϦeí)_:)_uI]XW]fmdeleicc6rܼ頍3|C"ܨT|l# 6ڷ5X;>V~Lھ!|%^|[eȇ +Je<*=_Ěs5DY>n3B vGpT^KK= }-V9ՙ{R!VC2ǷQQ4_~p`PVjiO #LD #\yeNaRAYDֹnRul^EV*qXײp#w0ʐ!nb՛fL59BJ8OXtә=r0ɰz5 *%>WnUcI~nӨo3 &@ b̍4%M:QɧXc<0/SHRaYJ[]~Hw]!̢摧-_;my;j1 l|Qo0;"R2lv-B:7A)ƓW+{yEs7B Fft|I4YI ̰"e~ȋ QiO5j"y#I#ϝ#Gwǁ1rGeѠolynӑ5|](}wsH桊=Yק x7𫵑U k|+n4w| oO-ڭ/7cgqSUXk_qśt]Cx!ʐ"OtH{ӷN %jˑ8T`/~c\'LebXZrW,$|7,wGuqS g[?M.zcJuEy]"Tݱ_Х4 #*$ߞGp3pUxk {4q<9QIwMKǘqž#)0o6]dr;}z'|`1V`}E~ p^2[X)}.E:H%@ eLzb6EY}5؎#6:\<+%WGVY*陼'1(Ϩ5 *EA면 :zyL\saO!e[՟fxEޟ |vRKEH!WdȖIcJ{u\VHV"Nߠ1Qv_^$u9wLoaEUA}J@@#7z{\WNv7ڶ#N)|)tK3WS9+IMI~Oxxoa}v Y]̰N*E *)ă贻Q+P/g+#w^l?-*!Z-9sc0X~e_Oα6XLNa]jAfi(D I|wILHǯ =ƹp?uhzք{(:'*" d }=M+(~pWh)H$86>s١Ǟ ,"m)gh )Fna0鱎 L@#d6]ê^S4Sx,&TWܟw!V5cHda5`n;Ңr~4JLg1t@S! vOnޤѧl xQTiݟh¥Gm Ӟ#L&=gsD[iabx8"ԙF^S|b=S.j|Q?fD+j@mũm/j]u42Hx yّ5dGn˾t/w723V=7 |rsʵoЀO@#cL2{݂\4y29Ȉ:vNxXP 4 >UF:HW&Okx,S 'Ҏ{vE)*=~v;h22{_n~¼K}w?h{g˸\)O7%1vhs"'8,:Uϙ/iY/YwŠbErU+لk?yMX^|Ҏ!@)8qj=43/[=l.0|p z47uuXLwVGAk'+A K.M̫u#bH॥ʠ8w.<;.fVK^Li=d3\v8ӫm97CX-) )/SHSQNivcZ) }|Ii{0t@pj,=2n]&{pZ,&5$^`O:w&$n,!h:٘Tw\6=`cx%,=J-PAW}}_r=M+lsi*& ,vi @}dY5tzm^UVWM[Foa/yUr\t86rENa2F}U׬ %Zېom鮷bR6+Dt'މR hR)G _'<+&k2\/2Kwn&(RE]/(̄3P Ekm1VEhlWPa}KhY]T^-9(MlbVKZ=@.#Is)IG1o_y 7婝eW0s:<#)V r۾237`ΨdX|&'vP+f )Ӛ } Hw!wk#Su;QbD<.Vneq z/oWʠEսȻΉA;BSa19rױ6G&9?T&Y¿-VuF# `k̾}lبnD5tX$Z"rT]).ܠ&C,ybTu]X) #> =QQWOʙTO{->oݒ;w~]=Y\P^k=vd3Yܑ)/RbVi9 m8B{}@`!>2k@sqcugq~;oPU=qxf`ߗdZ6$FQ3nN=J ȮrPn"У3BtgX3^՛ۺGR#8 HeGIdC8([.\/}_vJ 2%,:}16G)fb=u^Ut1">^"(+#8!!3Au: Y~&c}z/:=WzN`oZ M6|#sܕ=qaW+Oӄ-ŞIbge`pZ^SnWk5<6BYywR:F]RFߤ^\7<':r}&':zU{y$omdjM7 /"d}yi^֛&֍w8djsPĐt0eՂ\+1qE$g$HBE;cFD0qkNP W8r\'bN+^\?Dzx*` c^EvZK`NJmCQ\Bs>JTx+JO&+|ݤ>^(3R ,6dԷœ\3KaFY .dMCN3yN+[۱$kV%8>N`/Rf|[Dm mM ﷴ#IBp v$m(MH8#Ӌc+ Ia5(I\xFek $ \,@+: :iW *X0[&REO[@Ƃ-_r*vÃ~4&J9j ~PZS9@ QyD>jl39&I3,͝[395秋[ס/ݤ"4T ڛGP*@,+ֻQy|JH3g"oPRȎˎ׸,'37lze?L:2 $'4IkXĒX{'B/"n7>zodZjgѕ~FX8+WTͧ¸=oT,S_6KlDs 6_T%4G%twTm &Gt9q{AՈwt]1DLpusn Ζ<0zm+t2$~\  @R `4b~ÏŗMRBXB ㎉Rİ05_X5'uvJI YqQӄJo?*͑ƇI96K'f4&T X]BPX^FJRo )"åz8Ȃj6Ža꣜7l\/3[w+[e"EM3>"6&N9ΤKYRjө%sPnզ1SPy*U/F)2}S-VU[@yv_%0}ozuii53~ԌY8[7UxM Twଫ.DHVoekTq oHGsͨ]z*}G.0%("||o-BLsݶ^ŪOs?ĥ~I8)Oz%ZZP9F1ELEgit(]O1 R4; ׍C/+lШ&헼RKD}]?EN,Hԅy 1/C6h3QIf>RpFT$ ПVD+t/1M"osH\Mh7:jepGҏV fge9\<@vx[#^d0 S_')g>R%q@{ᆬއ{ptGEG.tfAFxd z:3U]qpymu:8p-':=:. OW׼׺ uu8$N䱧e ov 7 3ƍ1 ?}CpiMՠ1TTȧc&i)*7 ǁSoD+D|^G)8]YOJҸW,|nB1"km^Z;Cxl2lNu?i#gܦϑ7Ц KP/ )5- 5ߛa<:ۢYԩwG8B۳u5Osks?>̹y[i(e9l[^5Yaڼi5cn3VU#T r>i"~qz6J ImfJo&K>Sg8K4hIx4RЧz" 6OdlMYUG%, v 8тOR"{ĻzUfҟAm]T-Ep|ف֟4'#-V9-sZ{&FU%6w+H$l(bO@5c :_ZJ4&ptyD endstream endobj 845 0 obj << /Length1 1740 /Length2 12064 /Length3 0 /Length 13186 /Filter /FlateDecode >> stream xڍPBp,ܝ|a;-;-}-ev=$URe15I؂Yyb*,ff6&ffVDJJ5K'k4"/1O qX8yYx-{#8Gϧ9Q`TNx<9B OQH9Ł. #%x(,_E 6֜2uJyQ""C.!kS9TuwڻԋcKT9<@K)g .1DL6HDw ,U'td;q&]\VczSQ/>ǑU^Rb>z.;اrԳ!z=0\WrX)|1lD^9&~껼Cѥ9^ۦ~0uC'#1gթ?9#c#m;*%R0NTͤRhDDjI>x`I7p/t $4( bri}wtz=ڭiKʍ7gkH ǵ+-wp滔{k[ѹxtRp_EFafwJn~RYX^GpO|˒skc^q,^>mJMޱ$p( rɴ>_9~כ\a)3: oqK:6P|@`^NkY2xhuY!ף"O"jdح k^;CGޯgpQ-ehu@lR5Ä_4 w攵(`죍8I畵"2-j^c8$7:w+>m;(0ʡ" a/4$8- ];wT6" &XT /O˿FQ#7]8ATY }p+ akZVUԟY<=_=xaZN%^1 >v~*_h'bƒEL0Wۇ4NuD&I~i((њtIx+0Q*4#VJS\EEoK=|TIK+/@1f; B9&ªRTI0qA.`nLtBmbK2Rwm2LHsa_lͼ֓R $'fH4՟n{"f)FI"^GH #B.|cd]Q?#R,-SYs>Wv/MGnTZ!E$űg(_vwe+IΈf&>ϫf:NP ۝h,y.{i @D/؂=a{<3St(O]: Q&a3NYnK >nTa:N~va U2hD}='VSksX__!a wWR:9u fQ~Ϭ؜ǂ衰T G lkq 􎴃H!H6s_NEC7ёKp*Px'tc[Fy[<3?_Uqyd{d(v\u޹ECK$ZQ,aReAAq S}+ƵE;Twlg<7E"Nt JA>%N_ GClp݊S#]0'F{rFA8VC޽nh{g0p)PǨdf0'jNeDF`>)$@#ԙ 0)Abf>}/tqXsC f˭kAd?Z=&/͏Gvbk%&S1WK'=е0yeb^(}4'u~焽ȶ:-Y6?.nK/2E 񮹰Lc ?Yq3UYnQ$#=bɏLGdt2˪\K0gV(DTS"2%{a?Z10w)8]Uմѿ/}{ek_(bWTCRn~T%oCXd_ =xi^#c02-{j-|k|&hT̬׷f-4b8}j"Hfs`ɦ[eobղP%nog⡈R:TzPg8_{'ӕH.ITGxO)dbဂCي҈4>U6 nev}Nm=!AӲ(\JASBjfjCHTxA g_ NUsbCsֿݬIcE2B;Z}UIF`3RB8քU-6R Σk札uJ~E{0G խ32J=+Z+?4HRM}=4IJʍA:ifo:=2,36%߃;ifP#yJC1ahOiX3VM+XapHi(MqP\de^v:^޹=r~fų6?D΢UX{btkLdVj/MNpѼ`ڭX&RE^±;&_Fd\dI .j5bbRjuW;x Lo(7NZVDU9xB;k #3Ⱥzj[Ww4{ai(_]aKh¿oP u(q'b*-F` Fd@rz [_<ɲӍ2ͯj*EKR` e+oVJ~妽-=( MÑJ~~O; "#[xQuOǰ7K%Sl/ujVe5;|᷊yϚL}e¤DqeW(VF[0{}ƺ5âm4:J5 y~djgs8-0i-}ЯC+WG1ϸ4ыK ZK#$%ɧw@hW)M;#P}O?FaQI̯ٮ`Typ%I}}$pcW8[Q8c][7~iJLO* &0P2VNI- Ԛŀ=1YZDT;ygX%To #iW֣kMq"|w2lu[:!C>HR;@ZjU`ukYj3)Ri|睴AD&nRj#_:&}6o8^RUZS xݫp?tNƃ 4<`㏗3ugɗJ,E p\JB<&?Sf @oZS4Sw8#_oWOO6M:V5/89uc4Wr< yőd^;dS>7⓾#Ozyc}yp'sk{ۓHFilu#<Ȑ&"U ѾkI7JXjH.:Y̫v21QdQV@2[ԚrUgG?*C2>|(cp 'E;r[%h4y}S @L=)όw1QpEtpt)E5$m} Ilf7C& 9n):17e}6@ɂԄBOr/(+\]elߠ}0jP smCKՋ 떆uhooSM>U 6!j25}ʖ $R7i ZJְ⟍N@W lSP͉& Gl) Yl4L:{7b0Eݤ *91MpIÍt09/&nfͯuߤ˳>:*<\^3ٗik8e$e( QA.5WPMcqvY_u q_dѳ JeLc:B}=ambY,9ו܈z.߉\ڜd,]np=I62aAk`Z̝׋ܔXYƍPLj^W|ACbL!6b2W}M!AxK*8gR-2M@ܸA441B~;7 Y)L YD2?Q #mZ=ˍ(a~#T/(J 48[=\ 3u"Dj B}7) M(FL~ƠQckzf4L,PV0TVwcNfm*64rn-fեO"> P~wXC=Tj<"|7h`AG? xTkU(Dk@7BɥXM1y dL[ +Cߓ*+T(0]x4Ѣ+.()Pt^-ӵW m IJ)>Z(zĀxHT,8,&os3+1[\1kh٫|5q^QnuQx C6Yyl. r2ԑ@lߕ ~L ?fgae;GWaz|?U/hD3;V繼܋4 k_VȀVp1$H|{m❐,O"8. '^<e啩+.E'ڰ]5e ҂E󞣊 |'Gi|?QR&!KPj+,h:DDuOѫ >_$&ƭIF^aiIRU )^Yh-}^ؕvN#bǓ~eGSTF>As:-%=m }]r a} ]*R6QdYa8c}{upx3 w6mq „P 6(.87#B/NO4M8"鈨3=$۹HSm9U\a\C1ӿhsIBQEr=!, ӳEM=Z M}9Ǝa*(~V>Dˊ@d@m9_R#^i{u+7yswQ@OGt`e/!Rjڑaaܡv_ǁBThqJƣ"f R_6i!J{Rl/z*`Ŋk $4bEno}=SLkS f!uK&3.m@&~@h=½x1Ae|&يӋ΀qj!zL]L9dPhX%[Q}8Okek(sZ'Q 3ГB0QWjen(gi$Eqd!Ԋ.d[-gTNȠ?A*uyE9g8 ~OxΛ]ru4 Q5dߠޢnIuok3iOڊMk4IHlNsx>:dXsx?Ǘfc@S&s2A^ q]UT lq wW`[D-@1s_V^eKNj"zsO@MwV/K K,Q]FPGvja"䒋~+ 抬t=ȶοeTBX:aTKĪ6h."i"#Ӹ6[;e8Ѻ*(NEdYtN~Ko$'! Y-(aGf9Aş~-<_z/}?G &Hq-ZDBX $ qӗ6wts:Q#˫y15*&m*b-URaFޓf_隲=b7p\`@~cEN٥oRϑƶ[w-P$rvԖkӣ6ge 1ҜÕII{N+bt'(8~e­`d;y9e)w )pG`}$",AG1wZ3ۜ(i"L6SHempB\;d,0K50/ba`!y(;;':gwih{ $¹gcRdN֎,mncCwu^ԶDUTxuK|%Q\oٰXPDxXZjc5,N>[LSۆ-[}ցǗ<cnfk%r1bەcgCXv*/x#<^+-η1 vfDP,$Uy쑵68` S'3g7f,nNǦ򯟔y9,^l$J>&O33i>H}N!_YѱW86jA>G٫*6PCyHO{sXPH)X z zmf놝qqMcl[ۯ HM:@a/y[KɹCgĊNi [.!gi$4HmA^YVuz(˾Iĕ(|Lk-L]sYLja=8 DK֞s W>-o7NM,(h6e w͒m2#~DG&8i=)P;;rb8ݫW2݈^I"w :q|fW0;.'?%Q JMN%8.8ÚR<+?(4F5iAYHV2,!vuYs**"p,xh( HkAԏt,\偑4Ľ(Z=6q ֑[wQ sZӏsbL%q!:[Mh q>+ڑEw@>h;3_Oɹl_-׸sA{^[R:,G(ysR]fXH8[ v sQboGoѸ*Yㆡ]V"5N{m!#>K~vNco<,ÿ2urHhIA104$h|6[!IRK.Y3A!0dy2k_{=1nMO?kyǥ Bv{D [Kbӫ=ॡpnė'tٸ:]JCVbWI%1RcQ9X 3LrWjf=ǶcAS[q |sx,]̋ endstream endobj 847 0 obj << /Length1 1357 /Length2 5945 /Length3 0 /Length 6875 /Filter /FlateDecode >> stream xڍWTlS@$T1:6QBc66CB@B 4P@N}w9=Ͽ{LHD"B`a,@T @@9#ZP^p$BP0'SqfH@ %eR @!% P]$ETCz`Qpg4.˿^(,##%Cv2B!n3$CcW{ #QΊ|_8` |`_ !ߍ S.p?b3p789x#a(.7LG`C1c k40 Bp8`#M}a4- Bܼ8q.T1@p՝@{ {~u(+ nG5; U:⦎VWG8:jCeQ-s HJZ0P_ͱJ/1@ ,P{A|`4QG8 p9GljaNͣ <0[Ho1UWUH _H`1(_UA8!2M_}޿g,C$0I/]7t?vsZ; Wo4HijCW#?:h*g h["3Fz=(!0:G *4L"KTBA X ܊q7 ?GCG7"$pB(~S\ {~ )Bh{0 A)f&Pmǵ*7|ƀVgPOIjQU^_{4˟gɦ#/)6UE~S\y%32ԕC-Mm\HwV ]쇨eI=ʳQxq`C Z= kyCl[ bK'~^\L}W]K׽>x!c'T߲1j]n,/3!N\bv{){ xޜ"FTQ Mr}ŁŕA EjRi۾b#ȴ-|Z8w6rS"gɱ/$u=٬J]*R쏦YX\ژ}ВJTEO^Nkn'UH~Y?]-V+H?<5+*ɐEɖ I+j"y X~%]y6Amo^^gHxF`^UH!5}R@AUxvV#kR%+HDᆩ(L۾ZHې_X^=Qy5\gBSV{x:zQU+^4Fa VV1a%?OiMv\u3@`%J;x\ZNu^W? KJTwBZ\Π]=s B)E;K3VR&,7S*EW׭<_!\ȥ'{12{{Nq~U;{/ˈ هI1u}.T. ]5͔H9vz/[h"/I:]H";mvX=L^hf\ .\p:V+zmLR1N9Ujp;[),x,w5!stjh\󺘹|mktI:5J;o^"-cJ5yZmߨn>$IOxLRz\G"nr$4B0$o5 !,*h2U\;"p:v17H`duu%K`Pv "sޛ] 6|g @"tQ:糙X  CgL` *n1L)& Iv%[w"֮`vrxL=1#J}fFG3oK4ǠkZyw}|mؘHhcwNE=Ԗq9aA}e#l-}DH1t{fE1SZN6_f9} dzD.HGKͰseQˢ"6f|.˨Kҕ*cWwؗV:y {) jZ\ʎ3]uMA}*`0X=xْ3k۫=ݲ+A_{:29^8l\3fffrzAW]&6*$ V>g]p_tO/*uu0V~jeʷVן!+%e NλpfSI#;TTp6p#uRaގ NbUjx @O?eHiƶܤWM<)(ِJ!|rї#U\}Bfuy#i!X}yv7ъntHtu:_Z__'_ȖfoF%o`I'sS}wJ0&[ 6m--5^?XLJiar@^ R-4,2f;Ӿ;@ʩ8,}Uڒux\n T:>Oms< m.wlrlH)biK k U{^t{jec%QAu+ f0Dտ,&K 0XR滏L߱l,8ڜbpVgWrS8T m I35UX6?*'QPByΔ;[E:W1(Tԗr]^@/ݰ6qV'tk'LYY>+ۓ$ ԕK]vccg J9 Ɋeh&W'4To㍩a}Eeq7P: 3,9Z-RUr&x348uxTk\+ife#^6Y0FVr%" ;aýqם"15KR*o#m1T(d Rtv~ȉPu1WC)͊7LLdFh.b:mwuj$".㒉ğvM(GeŔggcIޡ6o^9|H)M GCS+Ff*dUvV@Ny셼2GKEѮwl '_|"2')*W6XNWÚd1nzn CXK~)vWܸTlOH9{ g'/ۏ)ƅXӍp iNh wWxž{Ծ$bv[3zۤSݟTxE?,z&?hepD촎2ҋu%'}L> T'T98c7SQ`+ħn0vy}7'4!,} S4%=IũS} _j@{p㐋fvkpCِȠ8o[/ Ր=N0Y9;q=MJ$|.{١>5^}l G7c.ۓ}A Cjb6a9}Ssi* KToOŎJp*Vː{kG>(1[cgws7#ԷK/\XbXއZ oj֎ r6(TTT!+s\rzv<pZiRrг|P<:ewm [/`#(=/Ŗo=4cx۞z :dLdNqNqp85zSM!R-Ya\6Ƚ)KM7fA8p(3zgKk޹d̷g5">& rlZ @SZn۲=Mo/Vzcps s{wdL,g.֤G6x~-ܹ&zXav|ՒQ+{C9HD*a{VDMA#CO"-%&X6oLWWPGJf3*Tk@JpN5ϲt;_T,'J5T>|ޛԞn矇 ~#S~ۀv-ѼnۛwD6a:oU So¶D4Ts&}B+<%و1x@Pl@gF!tⶳEk5Q_4+)>#9SLyGXf$q¯ګ,h06#u5JXCf4Dtf[\G&Nsw`7;Mʫ33S!V #7P[u</-LҞuU\Aji_!6td_p:aܞmxV59/yi cLVUMx]ndk1&7A {3aOy`@`7EB\Qܓ9|5jړU)X"W4Ͱ/C9 endstream endobj 849 0 obj << /Length1 1484 /Length2 7089 /Length3 0 /Length 8090 /Filter /FlateDecode >> stream xڍwTj.]%H CHt4 30 " Hw )-ҍ(|?߽kݻfw?;޽ְ0jZ,AJ0(/ ౰wàK/Y iT]! ("mK, ^* rc9yv-V(ow#4,v GV Bx+#;Iݝх} p#  d U.@0^<A[A$[.HW5@ SQh9pzpy v9:Y@=P[ h)"< /C ofXX" ~'nPX :+8 W#+Ba (W~ `8 |CmPk_%X:@ή ,?-@߯N02_o'YlByX++-k` CA6dd`1?x@N&HnYà7OUMNIYwQ<<"a~_ <;,UE }X0$cA_ oEQr@~k#WW0@)ϸjUAX g@j #] km0U a._ /rK*rh}" fkEp'HI D57|P@ ~d[%9"7"$Cd~r[@! ?(/OCA#C#o_uY‘y,o <@Vx0+Wկϫdiy6&X6񞅷^b'qT\&"~"3pvhcNӕϵYFޗQʞo5t<2>7> m,ήbڹd]5ݥ!:"jKy ^MXfLQ1a!xp8I=&ON'HFT| b.\کRQѡzm'ޟ..XLQ 8Bٽ64u;?MYYF$ةU"$81&` e~U]P)`­ӂVuَռiqLA]M5B9J2xWR_JkR)2!Op%=^ߩ;Was\iʛOnCwJԴҢW!;Ttr^ʰgC.pT-]w3݅R#'[0hF7IY(cEu&'ZZ/V6ǁXN_du-)q@$|*ןci(kt/l3 ?czI% (6D(Zo] ()03 ~.W@xCP)sAANGTC*fb0z@;Vñ:]xJo.)X_܄iMXUR~5- T#XM0m  mzġQq #Xrp+96Whb7LEd3$T5AW#vah5h=t2F}1׉ gwm#c ZaCS"HZi..5Paoeі%+t9J +yņwA֚װZLfH<¥;K|pɈS:%FнyS8.pz M[v=ԈU@$^d`޾Rr볓X0.OnV޳yLcoQ#l"3~3xlw86ƴX;|x*Q[J>V2h$n&z׼Z;k8"|Φ J1V/jXuYLT槮-sBsM(@<*WXrzb~7e #gb>q.nKAqh3Bo^S+y C% 24~&L $9ߕ:M^#T:J6ydF_|Mͫ:hDޮG T^y coNAT8#(Ҋ'R$GstLUZ&X/Zeߞcwi %h$<[#\MPGyKe&h"{`=*is>~AZڭ2X m[ucɻm"=D )*F>WP ijWr,|eA=vj44R6.rn'{ 2*sCx$=gԋ1,9&!ɥ&k*8T Mj޺ڞJqǰ:a6i 2,3B[ڭuv7@s3Ve, Wu?ts("\ =2FJ+%`t<~&X%atKYh'g"<4nrc疘=G.UR0v1ۋn+~v3JMe7=P;u=m"wEڛcj G>Pv=mKGt,./3={;*tjJN]{e |_lGՅ6Op}.GBND⬎ ǧmvG&TT{pԮ&eOl{gPDs+$kRX6LM=O]ǁ݇bٙ^_EE l΍@ |ȁNXG:(c3"ɖU5C9Ir] g g.|4ΘXp)$kog#ZJ6teks(IK8; wZ1LT5AWI+_U#(Jl !:I X Bw9'R¼Z3|j+Wt/R9t/2 $ZJfZ 6O@9MsKoMV!2k鉪^!welsutc~?7]MA0+ƾF]*+A։Yl|!a#/Ɖ}v>&tdKx⪵} }'SxSkY?ש;hݡ+m;:uPeD'Q&؊UG0nÌf! Pk]d/'wj6H/idU}6IgpBw^*\[j6MB@r*9pSл1vkZIʾϲw+Gм.wʃEGvE'M\> y 2E;^}-m81}κgc)r۲ԑ$˔:/71=9ZOq[ȪpgoaT]"|&2hJDi*>I\ȅfiߨY̞s 9IBh:UAy@cy2aQPz&'ͯ s,%*+V0]+(mGl=takƾ6)QAv2M 1NFK[>S<VNx3{qe$2Ux,[#%?~bOCӶ<ܸr24Xz|sVy`{<s}3PC&$"̧[ hsaQit57,mTLTSvXG 0b񪙲7(9)tQ}mĘmu'ߚOH)냇fo)W^d3+|hLյJg'0Gܜѕ2<X`_ .pݧ:Qk1/p97@;MwtPDDg6!/d6F] I,bmEۑKFaiz[Uv{\3۩"S\hֻ&}!8?8*Fm1XuhL`>?|)c2&t(NOt\c߃/o`N &M돷aj >쭹Vwyz@P?+Ykr9"okKM$CQN&VFrhև?/ c!-YAQ>n!T흙/N3 paۼ7a]c4Ѭ2ziQ'?BF")Sj/[2B#P[Q[[8Onѽ53;JSIJG9ӊTH3p-WP{4έgic0#g땉i>|qɔCp&r]4p_*V$B4X6`e= , 5뤳=4X$kl`;|6z:p=ӸA@#b:yrqƤD-݇< O3uKJ?\mhR\j$[7,wG zzakk\ V'Fc>6.Mڕl01ȅ#o㸬ZFl-~v.TG#ϱ.m(QoMos$YQ!_+|7C m ^/ V&>Ҡ}cԮ-S=d+pԒ'Nzyo>jV3mUpMgaOa(E, cm[Yq3N<,l2_Eltށ_V;7{Iڏ;; ǑLzۧjn*R:}gqf,ՓGXIx7Xor(&m5-R_|.x҇*{G$ ]9Q-BNSnDZ+*;G6M,\KBIW;m(81)Gz.1\,-=}+W3۝p,ժUD넟Ϩ7Ϟ쥼 4EtfA(j|:m+&$7Tɦ>dpiBN_STwPI0l;IZrIoFg8/ ؂tw1DrhLgX:LG, G%1o)B7<$)yKv/ī^[2旌M3Fp;z^p>qn20Xɹf ʾ=Bw;wTgm`lRg7"ثK!ċ;).=2;ϫ.x9ܸܞ5~sDWyMu6(5E꜉iC4IW}H>XȽ3V~j0DQX +F12դ"~KTQDJtVz\*B0;\Yȳ`yͱLZD azqH ɣa54>gG!;*6ө]Dz˶ōCq)R[Rҗ[B~vw%!ySU7b_|Dw:wȒHPe~py,19Jm3"iVSд f\ bnbI<_z78q{2LL^axI&[RȊaqKɱ(Jth8 śr%dZC1ѳznzEMtDaiͪD@$/̅2AY%֘=*&m0 (HxaLM }<iK4 a5}rLEIt78=_spHmU=?1/|ń 9UD'uOk'VjӃ%Y U i矁8hL=:7gIHlsP~frS'ŠG/?rL5bN.}}%MQfqv~Mq%7v"Y1{RplهyHcx)B W*Iyuwmwxn&iVA/ɳkIu7sW}~[-"ʔb3 dzh38N>Q{]mb^$?Bi߉jEද.652 Zb-(}n)Ȱ>+cA 8AZZg h~Kp؈Tݟ+ l". |̈́a_>C18h%ޖ:IlqM$4є¾MM?(v,MsV@+0\qӶҗw^b}xO^;ٺ[,Ru!б{&r,ϗ-.OELd~LUzfbJJYTa&) [i%FŎ&ɳH2r]Ϡ 5޿=^̤;T,y7P02>,^?̠)6OxxGՕLDl$pʯ{%mBLZ%x(:ߋ^FϗgXO/@vw=ZE긯*WNg*ylm.i O\b<5\-4 p!L Gk>1|U=Q!_H+4g>fyGuȲQs?[iXr$})&e.(+Ʈ\(E:$C .K>vͱ%lJ9K س<ܞ vqA]5zhjͅ!f?jm-O㾅8i71̌X,Q9Y61`ڻWveV|LyTz,`<犩ԆIc^pK>bߢRM7ic ͜7fDp Wq٤Tc Idw6ݍڮQ?UwQ)GyїFlM+s{ycR օ93[d֖^?G- endstream endobj 851 0 obj << /Length1 1567 /Length2 7452 /Length3 0 /Length 8506 /Filter /FlateDecode >> stream xڍT6+N݋nE EbBq)֢ŭXE/k}ZɻyffϞgvƤgȧۃU0$@I\H ((/((fABl&`/”(6x Ĥĥ‚Re;/xlJp7_G' $)) `m;h0_!8:!nRv~,/t`/0d+Oil#'/!m(!P.00躁a"@_?x vnv0_ZH$/E"(;/;Eu;>U@@(+ U` %+Dڟ2 D0WW O7cH~%0u6Q520a =WH]9e?3 \ҁ p#ǂ@ԛWwGPo;_@)m8j`K55`H;4(Qz//PAz$/7(փ# nPCtA"4w^5l¢b;;_|TQ+Qj*A`bH Uc _@aaCEuo\X "{=Q=CM#AA+xB7?$TD7T8u Ee:_ȿNၢ/^`0qw ︬Q^^N4EϿwRvWUyP15@}p9mNRzMM/[G0N8!H4&l)O-)0!/}8!:l0L>=fjb .^o'Gڦz9 sx)AME倝Vi GϨCw! !n[:n2b"kUXQ&Aʄgdvs0~4'&uʂ]Kg-1WjnGtj /0BU%D>}0{=xieN݊e`$y%60;h˝ʭqυ{S|B$ZEmK8Eh|#Zu+gN= W#(J6{E~r9iMzfb\՛\҉jV@Z;GWtͨ.2T?*ɥ*ϖ`&uǴwq<5j=qrlE*MKXoFH\]b2 #o&] h70eֿP,Љ |(:SHQia}|0ۮ,tKncMp"KcSm=Z/hgw{H{!vV"}{`kA҅4Q=MFyh~ L/3)udnU9OMI-4ți6}L,n@oks\C*, [E ލnZ&who񁑋ݴ \GV[hIL9]4N-bTdkotzҔ˕q3h?^On={k'_#Hf}Kq3Q;y^4,*$}5" 3{wchf_ub`}K^e} l$ 7{h0̻mU/R>x1+*nM14W-' +QVZS[v"]hF!>qz /಄b.4o.ՅqK q ?B*zM dd~'EξFYq!&_P:* S'$.iBӾa$Ї|ҖԟqNϽ\2vcbVY>ܹx_9{^fAF6TYPS$I?8x8i޹ $VeyVOR*e4 ކ6s9=uXXX"_[s[59Q(\LԋZ-'~\ރڍZg.Ml/y Yw{s0H7 K{+]Q>Z9HH3b4sPE.-LЏ\5 {ts®]6_Gu f4="H _WX3,),a,*CܪU+Jj2=tg@0qBiL0j=3M,)%-z8^dvdgizvH< Ɏ5;!f=M8-NF?p'uf&~_&z{xm ),>B<|E۽%ȫlt&S1;z!72?cPgzDuzYJ7Ryykx8W* g$W7>_# P-j,HG䬴`3y h_\ݎEkjWC~(LSlw+2>a=T)hLtf%z}چXTHq ̭= Nb7KSqb" '^9Wy;g؟'vqGae^_:kN|.XцL淎Mm.4ѥ: J _ց {[`/@S~qY!SW]yWfL\߆ǡD?MԷ._HwM2GǓ.gxP#iqQаҾ$j2,<}H0^mO?qG#^<pyE~ ϝrT QUp'{!nL6]%9uWdaqj >[Tѹ|i#w7e^z54R+r _D>V_!LP^m* &MWI.}HIJaD9sauqaz[Muthɿ&iW2M?9yq܍_2Ekf4J) zK:.) , ݰ]r8? \5vbYBG'(vs^}়u7 6B#ƺ ʕ RsL8V吝\pU۲}/%)agdG,:l*VTz<;TY>DN}pդzZ'sK|H^Eb%RNN3K7ƭNK]+zqgíFm*) Iw)q8͍ G ciW,gUvQ]m6pB/ &- D%mR/ߋ|gkUό/5#"x*:ͻri-mV [2Ns XiYͯ R _ 4x XOeQdU-}xlB#v;L{hb$y悞S,a`%##JiM3驱7!P*Bs8:nW>a|z\L#P`w|$."dke4H̒|B\w)Sj{^OI2J WdLƋ.1#O[ѐc2*mFPa[K2q6YMLG6RW:{-^ 5a'V6t_vsb!oN+c7,_/]$8Tt|d*Aٓy^aZzW͙ғzGaɪb5<4gg*dvC!|V˙Fot?> FT5WV7Ff+K1ʋUQp\5#eM|P$ZDjlmeNg*dI2D~ոU>ƨ I4QD⫎ ,&3:Y"_ z#H|v 8ViE(HžMbrT,93ۀffwkǞ9)D'}s%4^@ n9!(vY$OCuSJmh; rVr,R+.bzRTP։1bVVw@_LCLиn^磄1O$B)KBK-} aQ=YJ[Ǻ;$}>DE#<7܍t;)SODqs[ŘzҊ e)"߻ԇy1Y5v~bؾg`}l'I/W]Ε[x;83]ӈ@紎iSlԍwݾSa#pr,}dIS^c9SE(G|!vF6!q ;,b1MTﱶ*Űq aSIYfe_ө2g[syDqosIӃ9!Kj~zCUMҵȅ;cN%w[-&?Es]r23 K tbXtƋz;hT4륮zwd` HwG*n2?.jYݐP>Nh=c_3.8<(d?\ 6Qv}zk6ϿY7FwJĠ..c~?djǭm{n6|94O6Cw#;n.=`7/E2HË}l!\[nKoʙ 7zgE/yk%4j[K2lGќB4~8^h$KO5ˏ ߼YT]OhSɹ<|)1^jLܭo2Ll*u?Za~iaa+M+i+A/*{]jsuyJ)mdr*  b|oA[:As>Վ1,} VI9' -:erM_W4sa;`Tx{I{wXcg,|߉6]7Yedjz*7Jcgɼ*b5gxz5;.?8_cH%Pc `LJ__;?zYy<5 !x:2TZjvw(M_^Y}0_{7jF}^?=ZP1{M߽'A4des&3QL ntvi2HI^"/2x:mbZ5c=8W/ۿ$ҼФP=ܗtqBV<_-,p#sNOF`f<GΆou1Wm% WdeZ i"ѰtR>v$!.h;1ʉn+DJD _Q%K /T"9Tu{L&9Fxl N_q<:di:.w16I?WY[?֓һ1z7SwktO,z[Ii~8_W\UBP'qDﴜ5cĜ6hԿ i\B,g;UIV v#r",TZsT:7>&cmP ӔwәJr+v,7Ҵ-Kb~bXlqxNpz;;˩5b71c}*Ye &{Y*U DQN=fr<:Kg*Nh\8S2U"/&?(o_:8'WK؁H縦x@^{fbK\pB_ K"Gc?X^oRj3zuN.(A IR.΢I nE"X;T9mgQc&=m@UH}P*zi :@29biɇ/C6\o׉꟥$um, A endstream endobj 853 0 obj << /Length1 1414 /Length2 6532 /Length3 0 /Length 7500 /Filter /FlateDecode >> stream xڍuTk.Ҏ" *C 0330Aw#4(HI4(!Jt9k֚y羮w8X MH UM,BB !!) pPh8!TQ0018?}$u %d%e"BB;"Q2@5 uE12?!<@aiiI@ew #`3Wv !p_)1AAooo Bxp3`Pுw?@Sg8ntxQ0 pC`4.P@\qǁAIWDp`0t#|'# 4a|0@0F^`s0PC xh Ap_# JeuTC`Ѐ_Q0}lFup#b=pO,L[/saBb@'q( M:ↀa?bPXX6B GɎaθ>@k!B>y D{jfjVwL / * K%%NcՆ?G$POkc8xuc- mą /o1W! o3oa|r @]-`D±mƀqBPF8, ,p8! nE /+ Ͽ# H/K( n8ABa> !\7c Z+. KK 1+ 7*- "~5 W, K+>V> 'ML˃_Zb,b1H4Y#^VH$&4-9zУJNJ(iŸY $\*SW9!;rǑO1y5uT=iTU>%'SGdztK _+}24h=9O[/؎>эfB@qIM0] 75~Ffg˃6 ^.@]'w ~gOL np!U XHԵǻ(m+9c^K%˸O"foB:j|ڕ[Usb|T|X-4 gB%4x[ 3BIgKj %̛ߖZ B`,11l?ԚJIfcXoc&PʑL]wagAKk-|!M y'~Hk0^CֵRHU2BGbKvkuw=J=UԀT\S3\)%t>t (\#4J6 YtQݩ$jH޼0 3cjHGla@Z3w45v#Sʪc1Ԁ7]>!<'X\M|Qt+-yxaGv\C82c o*?iZJ`p*շ]DRacT)X+A6EΛ]g/&9_:tOai!0鞑)/>' 4+M%4lP_MDbR!o52LnKt<%"Pڝmw/ 1B@o=:hUG$tBTa(sUė/m7a7{ K9nH^|~6Yyx&Tt45Zc){TLeyhOU4m.ͲTb!dF8Ġ\sm4S {;݈Nvb䅱pk;DJ_;ZD;REG^OrdxZX@ >ZD2Dܗ<N]xs:NEyeA;q*Da,I]̄vk㥞Vޤ GL-p lyiF !,G+Ј⦋MӧOG=aɑV*i;y;؅.}}Z2]blz: [3tϹFEyMZ3G.cJ^$T2)Vx6m݋<onԕ}볭==k[4Qn헍鲰'360R.,E".2,e{ا(~ aZ D2%wʐz()|o()K<86O( >m aNk F K<"7'TeOSuX_yf\̒/ԍ·=sڛ>tydW灰/C׋ʙ|CfloûUjԥOa]Q?Ns<׆sR C/lwZHX+9;LN\GB!\rg̋{1_x D'\=~7/IHZHx(0N u4g2E*m}%eՋM~H$7"Sc׋yi i{Rv0n)u&1*dGʑrU1=_+r~SٌLyɮ}:SP$XRAr@@괒cSơ{nSW V1l ֫ _J>bNOs%Y-}^c֏|BhrD(dN.ɑ{5= `30\Lvl$ I0Pt>q!W]o2ky37.tXO-kY0ÓSž|Hnʒ3њTUv2H_3>+EעPQa֧bGԷ^*N|z]&tqO2F63d1EWȢtbյ{sN `VJ* e*taÚ$8_]lh7g}*t/r/xy)"-s)޶ʫ^MKKeoԋ@ҸY$ CShÔ 㣞yR'=2]HBo꧘eƧa.1;+idG.lRݼS_S[ r 8 X/bSP 6з(mn2CJQG%֜͢R N PCM%P:䩐i)1zec <ə#'g"Ɨ33!vcn!ΑƢ".mbvfe&o$ d*CDuTm|Uf "%LKd2X< UX/YϺI(jo}RٌQb/Tt!&6YR0GП1Qs\h69nxӶěOGVq*Җ{n9'_,F~xo{%sUɃ^w^$FGo٧۵* *-o->>cߘf3BIŘeBF [;*'4 նX5k"_ /\?t u -gId%Z||E8ƃz|~쓝>s+e{Q⥃I!-^G_߃$؈.#3,ܽc!MlZMg^ a{~ UDTZOR/CVN0]ߏXܦrG{?AHAShg0?k3\MUC=u6;~TUCRc8zϟL\(wg6(WvGu4n[]YRNt -SIB;{sHMǠ66Ol T{VeI͐y0{zWueL{?oL6{SL |2(w>v(od%]d?`YL \3mKQOO=} [UV0 oU;21X;0*~kI.9# +:ʼn|wr[[{mkCyoȬ@w4|[0f{m݌O>n\ T}۷Ͻ t`äYøzweICZu]I{_i~4H^%HqRd l`\:V1LʟYȗ/`~.ɟ<`sZ͙l>AXjcۃM!wU+f^3H]6I Oa/*+ tUQp:ޜU}m:b KҨDe <+mCokiub5˴']S궚v/Ily\1^'qPnګ+&˼~_SYԁK,W`w^+)ECX#ÿfhޝ VoԎ7,:IІm#*N<䷒u@a2ګF\1J2f& ?}z \y5Sg+]XHn<%v 7@iZ-SV j1" w:l_o16lHC㛎d}SoudlЫ* Eb[foD/ozOBd$ s*tz{ iL}HVfnݐ`φDhj (3cvHdm"wx1~cդT<>>rśYwƅDT2qY7-w7T3Tw(FK> stream xڍS 8Tޱ]EOQ-O2AR*Yk̬1&Q;]RNH؅JEI]ӖP.]8g h9Y]O1l ōidpqQ St' OvX"E0+pfJ gfjA[eA:j I,8c(,%bb p |8DB(pp,"^BBqWL a`%q"ɐHJ$ֆF@$e`-$'K#N8<0>.$0 B R"Cy'WN ` liMt qH  |DulW2)P|(B?OlzN'J1.%KF2 f{gD0KI %L7hاAy|e<"2nCH_l0T܌`r 1<)D abL Dp8‡?R .a_;H4!\J0;1  6S U|B(B)[re)o3b˄qo~H{| ' !2ѷ^'"v?P\L0\{kBgH"$*:10O<8t\BF1 |LBR)4$b;'G>0 sIM1eL`~LK,qG D/a@QVCSOY7;9Vq5hi JۍvZ=F*w\ɏ+ܕi0o(/Ź.ީ-/!k$%i14TbJY饹6y2eҾ55o_ݹOgxvhҖݭ)vH>Tů4,g5Pi/Xgn5 7D7Պ:3ya AM5o|I_Ԑ'{wζbAOliEiGs 2_fj4rgz9Gf[Wk3}/J9h~?Uk|4R[ٜNTش@__vdݼcp"=Oy\ظ+t38cZs2.-ӱ('5u]팴^Hb+M:wUz.& [G6Z̸9!k&lĕԭR?:I=tm/#Xa RG"2dtOW'=nU$ǃ/:^-2YeINVyé<-GDUn+˝qcxitz8gdYBR%GMܸ}ŗʧns7xfkP*3SLP~PoT$\1 w7Wu}}flYSW-*Nyi/ }xzGxVQ³:3 yFœ9.^o2js> stream xڭweT\ђ5A[n]5@wIpw4k`58A$ofެͯ׺ή]뜾JCM j:qs 0m bx6aI;.` $ Yd@nn@ u0j3'`0 :ڃ\!A -` jFy5]< 4\- `K 1?KOi0g,I9,@ ?.V# =?03.Pj39 ,.2rb t~vϑVPK?%=<{]`'`9BϹi6d p OwY'Uttx _.0Ě9snǟAQt8aruOo 3  YcpA]Sw*D7Ho"MyWh9WD h<`7 s@{0@}?O .6H:Z?4ntז"./+h JNڇӑ~zone'3/]V߻^Tdn6-ƹ'UN&l82@P3G'EUt.MSIw+A2__._*zzy5JfdPS̥1Z%jeg?NMLټ/Z!:Knt&]<2_}أTG \s6)!MSsWO9"[T/w T\ #2D o}sSރKIc 8gtS $h$wo8 #CCi}|˃q.\7*;dN:UUB+uL+TŖEyDF\6Vrǔk_yG'"{۶OԎHSlG_He9ohVcÝ1C# .]ިrLwi`sư Ot|˖EV@_Eܢ#rl]wf{p~kxPeZDg..(E#W>Xj~5xYjtO?WXq--/"xưMs?ivSU,qQOcw[bj%Z*\#&6.U5Y"(-߄('T7Z>{>U{#™fIc9׍E^f=]*,E<>dlx{ aLF$/drqѕ3EJŬH'+ b%T_z j $ $DHnYR}g4&y;N hd _(J˜F7 9;_VFBn^KSHDŽ-R#DUS Yw4Cpmyf|}oX ھ( ;JCZ\q9D.PUCh3' Mz+(s\;kyqȮӽ&sAe7}% * +߻1'^K#dJ=V4gV<<Y"< Nb2% 4ML$iN1?(xfjtYirMsrjeFY2'V<3CxlEf*xl0=F/ZJXZdG:H_}G_/URQw#-XS⼧)>=ZW(G|}"0U,C@Lm\ѹ:n5e+=H/j}uwakYzY J[z gNq61v &5$;ӡ#oʋYҍ/k%yesJv2M.%Ze\47??u6\=__W0Z}8r;Xh>%m(k^XU$-gKG|n-w|wC`_vt8귟l8-P:@KoaYB{N[ƉeWe$}FgзxrMHI߲dȷ%2▙Od}D:fNB1?pQ 0FFTQR#AE؍3me eȵ.ocj@;eK')I< t-&)O}ZQ}ĩ֜OYn)=*!=w o6~kD͗_YB_v@ _ZO(高6S=}q>pgdXi#@i6 {"BG?{x< 0gh<}zePAȽ\Ng|b0l[!:5ȉ|(O͇?j<.-A*J,`J 0WLcӮ-ef!G+)d/KvUEV s>Q%mhX/ &5NTc u^bC^O$ib_ce+nŶHy^Pu4lr ~jIicteQN-r׫RHAf?m)꽤%wXX 6U۩~ٍjїWeWm4L_F͏i|"ٍX1-2CXnσZpWsMRQc@K(I-lZe?2)&{P4+h{Dm="ZٗQаo/e7?DDdF~2WIˊvd\AY /; FOz Ol x\p rjڽ>}cW駸}C/hjPJXe"w!.vB8a,#ݬ AZJ\n,ft3#g"c`QDXIϬm¿ jPlH@HأK[ LogAQpSYP_!lyqݲ3U*G݈溓0Y43Xb-nXTEjbalˢ!8#qڈy}P'L%'?SB?/]LqU7a -{m'H0STChs}-Q0Nm~iLf;1~7QrhRzʸ0 c"ΈoRxI (vsIbpr$9=4u#.[Fޥ0L8ECTqoqigI5~籙P@Qu3<?QnUРiwT7&wfkQ4Pl {zdži1͒Bۻ2lO әЖQ"ŹC:3-vt)|)L Uax~epBhK 4K(Iz{sT2DZ@pE^]ǧ)}Vm}vKH$!+3'8myx&F,? ֺSשztoY vA!u&&?r>I1>KBTWڼwZy'ue ~7k`s||]I:Oa0%K$B1bG=0Izz=SĖIvʛͩq+vA?a$Gۉ(v6VIb+6ñj ^HrND wI轳`,1®ňݾPdJzkJrRgrZ),ѡj9E;kh: 3kꦺl@+y4AnX#&z~[m-jgi&B,G:Csֻ͌6]˥n^Kj` # WdEP}EFA]RJ~ytη8[JTE,o,\@G .ͥG;SU㸴?x tt K"mƑu{Nݑ"MdMD$DP_!tod)sRGV2޾˚^q1\`T nX;8msJsם8K(4ik[{TņoxUCqcYqV]4vV5eIsx &Wuc5q[&gZkFNr$ROI_N]XQl YM~XΈ(*\*0DEIHC[ *A&}әOn@7WH]ZW\Y_ sλ͋SĮPzp)+c_]͗r!+o7q*tu{4 bGxK~wsDgpdr,w 0ǚ3 3z$!H\-񑒖py&D8y]Iŭe;/:i$-*DO*Q-@ԯ86Pq..DBZqj?wXn#B+C{aAflC&D784UflCP׋r\gmT%xn2OD$5/jHК_)ӗـ,38?#1Hm .:IUOAcOwO=iC??:_r^<*B0Dۗux㠝 c{K'64 K4m"E#hQ;m^7KZy\9ªѶOgBk ;2 W#ORYt^[*,!cFʣ = Oĝ(ŝliOFˆ+ /wnc~.HT29VO;sݿ~*iff10v8:k܏l_%{zJoPqfT ){7('u\Pv2&ao3Dd8u+9Y h>6T=+:E:~ u'FJF/.#S/OI*MI'D=Bir;&eb-nuӺ 'RZcӡn#AZ#d ;V_<6e!vߔ&پK4Әs]BR>pA@)˫Bt!8,w7/O4?^hItqT@# ] 8G!~,;<.{%jR깖f+J50)qfJ82~(dBxwY&+4DFH!HرHh bFno]KceF+2^L;ȕldzo޷uТisq('6Y4:8AUWCEC"hdZkګ_]%t7:nKLA +hKz/R29;kW$.wfH=E|ỲYJp_ݨD?ĬaIENf`>G"/j8>[-ڙxNc$PF|ÂhDvӉ#Y+ʱH{\>M4󷚱L6y, %&촵vWˤ=tν(ZE|aL-V1G̳ߨ#r Aw_g`Ҫlu3ut,.rQ:wG[D5Ԝl?+eH4L ɩO=@& Z*6–9h* Fkmϟ1c%\.j䘣-U*dFJVl;-^w:GCjT?7i^k_%Yo]r3`5گajW^W2x? 9"mw=MjgWg¡m*ؔoi v-W9߸v*Je]BIjB*_*[5 $ɛCk [6vdk]f;[gxQ޵17*dR^N/GTѪl"u_r!tRsAP0I (<`pWiכ2]>oRxb]bB"@% p+fun^rO73+Ɇn x\%!#yYNn4[kX:ޮ"8f )}CNOzϯ ZKhIP)fwcp* K6YP9O:҂EB|{쾶;4:1^KFY-JZL^D?szK?Ċ'YIx06)P;ނ69ʘ[3=u2S @z}c+Lq#MȢhu&~stPш*N*Dv\qRl_Vze?3_]%% endstream endobj 859 0 obj << /Length1 1144 /Length2 8352 /Length3 0 /Length 9117 /Filter /FlateDecode >> stream xuteX\ٶ-%kpw©p nAw 'hp-8;}s)kMO.X!`;70@M®u<:0'τ d e-aϼ;@ ps s s?x 4:ك)Y3 vwqq@nw5M`\g@\v0>3++_ @fo 0&17j?bgB̌MwtZ@RIQa^ wz#8(B~Q?uN$T{_(%򛒢.RVWeS?~%Oml% Gu}NutMvc5К/M^Tt$wN;,O݁a‹7EeWqpN1|\fknYʌ讆pL5:q\\.͙q;ta)XS=o5o$Cžjq&W楦~# pˠ=+ "㫹72+Ԛ{ɳYp}WQɓ >ziTÒb+)-6Jܸb&[mq~,Q4p7H+4 m/3au JúZN"WX>(eNܪ̆$gh"2Y=r)ojs{2k}c׽F/Nls^s-fdmI0]8:at4AfI]/*Gf6ZːP-#7m(Hؾ' 0=D90?_"YINt h}M0տ1E~CL5-P m.Ќ.]#=w,ZoҬlLd33}AlV'@tlBh}ܕd3LN@heT_kZ5tt޼zX┮R;Ԭ|[\0`uGxre}݊H7FP65Idĉυo=Embʑ5ԑHuFC3*[XyxH2H<(^:D%=p?G]cV P,;=18u(QT4Ъ0-;h-a,|?R`i\m|xHj+B R`HLx䗝8_6| ^_ ̓0;kK{LV=U0jmPG XJښt_iUv ?V~#EH$fV%~p0jKm! O3 Wt#w3*Ѿ]L6.Yi!S/|ZoG{"T 9&t+5hBͯ^A~\EKREU $2x;,A}a:l80CPlIBq%=R %(XT?F Da=IŘkj)n (W18ʯ1 rdN9 Q SfNgJTRN+2/MY2>a=YޑVY s/^M!Xp)%yyGDZr%}JSoCks+.5b̊kV̓lۧQA8e7Ҵ{TuB~ =ŧ*[#{`1=mbL-F~b'eI|=s53 %Hx^H&~{+nU0I:ᬀI9AV +)h\Y=?MyԠzV$pPuݮ ǨOt aDat8 /c98ӏDC<-BmBCٜKV UڭMȶ[0ZwgƳHXٙR'pLm?FG8[}ď'XwI.n"q+iEnL^jߓ 9Db:Ԥc-4Ǥbtl+Ż[zȓ5|`m| 4h9,o֒?M/Dm#fJʫm4}aUSWy y\Vו;PwEW"9iߖ/̆+ Zv@dp{Y$S[i|nHΩAóPvjdS8/] -P֜#߻M) &)zA\fCma Oҝ} PU헄']#k.0fF%]JO^J|u!r]BP ):!yfQT@GѐQu7Bj+x%F q3T=Gm묱9m{py^G|bTWMQhlID>m;Q*@JB53UhSXǩpAssl甴f.=i@V~Nk W2 /*t+){;#gZ쎮w63WrTc'RXjPN(XU˞\~ݶKL*IlTQ]< DoqBiN+RoçL~~Dd--)}}gYY+- a8oIVٖ]\\Ɨ=pu,nP2#{Q)h EjaΎ MRxR@ `C0OZ^vHo`N#SlgVGG 0rCřoeMN>}SOCv0wQ9-lW<<1`ɧl+[[q *K5 (kHx'23! _-řhK鉀ňC;i﬏H1.lPM% bOi5༒A\(! /L*i?lkOR*X6'jco>'tUvҍ=d`d"|e/r:]WB]2לYYuk͔t^HU~D͠_!O)6!_4XmDGG >(ZpղA~C.nx\:L }h&m귃/|FX%[.qݨQf޵$ٗTZ ٶ"C*{T޸ŠC@$2l9tk.H)6lY;஛mC1GWm55n4s"ftm7me*ԡߨq(^)4.lt3L)w7zo+R*j7Mjn90h[LW]l9v N 0v0aV^I5ϵ&ljz8\iT*֣F/'Gpjg q: z8\ңgi^;֮Y UNߣ;iՈo A#E; Rk"^+x䑩ݮ. BjE(z$CG^k-br2 ^( FX`Sn9{5A[xc܉r dCL点쒋8Ȱ:l5j#Ā~Go_rpZR>I YAI1/P1)#cIyV\!gɴߥ)$D>u4$ YR"1^-NqT# +=w2CER\C':Oc-~esRRlKnXf] rhFO_-e ~hQY8ia^{.]0%5{׀dMzCd(ǀ/K,AMt:!r8@tZ.VW%-0r_ֈUF\rBLZuݦt*_",--YpM 6|Y+Ck+R'R:uT '-)q-a:2uO#S@\b%E?՞TZb#@#> @5,]<@}nqCA_gXh >gŢf;U`oL][ޘwX/5%_A2-pz f&mQCV'ef]O̮Fo <NJl.^]`L(O)/`%#!;Z8 1##\ ^4B׽%2a.;ib ˕|߶pJ;wL.' #WRT lgIEx4y^{^CkItCYl۳}<8aF{6gx le)nǪ  O ]$Wy Yt֣w2}`Tק]$hk `$C%!@١[{~:9K˹ipǼrҍ0MRWѻϞQIQ;L3ڭ9X,Dc,uDͱZ |ˊq9j.P7Ot(ɩ B3d UΜ3QHL^/ RIތb\%ʏ R^r* Ӿ v z%ܞ/oUuP H1ܙnF'y\44ֆ#AkeN*$>Y­Yt] :UBBQ6 2V^jY, 9ښ=J8TGQ_ RъVWnDJ8};Cj؇W|l|\IJhѓl`<ȑ/Ttw8Rΰ:5Km7$es_HFwοpjNK|ZdzKk7J˴ģ^+Rlo|+8P{nߵ LN.}6E~OdZ(ODL }wj,EA łkIB9f\kyJʶG6((i梬;ʿPQ(P$x֢՝:Cm?sl㝁ҥ(}r&|g/? /c@d0 7Y) ĻS̡,$H?"((oh}ݕAcЬ1G8xJv1\¿XCᅺ .ii|C2dӀg}a+WʥuϤ;Г\fz?~H7tB0M-'L\sxcww(cZދ~]a/7D h"Y  ^R̢Ús_\%?`WW, )UWK h ~X-?49!R\1?ͣ&L_lD` -!{2 :C>`w9ejFHtFA T"QS Mk=xV q^e2GHl fTf ^l|jo%KFr,_ WG$V u7d'w%9m hdm{+!;'D`xՠT۝kUw{o2:[U*qZnuW ksJes Yc0w׍F/D.&fx3=x^M6C#=pJј?ih!_,k+dCh8v1mkާ,׸ď/9WyiEوbBLns :D"_}^J,d@,c;,}KxG$C6WzR juRA>po;j+8%*z!hgF ]XU&2M {K?3Eƒi }-sy73NQֿuRk#ZUNZ-Z/k?gi1̮U!.}z8qǜ 㡈{qwI6;;À7Wc֔w*G\M:Pj}+m}.ܣL4KuQdWuYK("ž)dtqL1Ĉms[#O%o/=/3RP2PqvqLF{qenv-7Iw$ʡ|ԏ44.);/A֠~8b\Ft~=C.;x⡙tHcx[7I\5oT4z„̋zvz VEHi,fIغ͟>nIs%I9Ozqr/}&NC~"j\8 Eҽ|7q?Fn/Ei×y<o endstream endobj 861 0 obj << /Length1 1626 /Length2 14258 /Length3 0 /Length 15107 /Filter /FlateDecode >> stream xڭeTܶ%SCpw.!Hp ]?s8ߟ~GQ{\sUTd*Lb 34dcoW)0)-lv.** g AZ$vv@lce TӦc``/?!3trP~qځ׉@ $Uted2JffgcP1: gݿs?0bL.@s49#lo`r6up+``nfO%_AO0+೪yZS Y~FZi_OO O-3 'Ϳh8XF3 tOֽ׿A_l\]vl5]?k[8 + nt׀hO ;/E Y@2 "?qS -fgdj~c(yh_)6v^_I 7[qd]M?G"`) +3뿍6.6@ Wsket:8?uHLlӰ1\v,T"Ϣ+x\^G+ uF\ fb0qp}޽OB|ܬ>b'@oVu?>u2)s?kj`iS]Ϯ_;z@Ai59l%U.԰-r`I^NqhyD>t=m< ,F%iQޗ PzܬZjFů0ēmptX()uh `5'?hG{cLq}N]Lߡy4G%-[-+2X*uTW=+&iF?KU8A5!K'+~֌~nt 9x@ab㨨i ?c"*&Ε4U̗KU,}?qs /wm0J/AkhE7 l~\oWfC0w t#:1[fE9LUG+^6+ Xi:wVLBcODE3 Ҩr{)!_ dU1z>U.>/O#'fiܾulmꂡcyl:zENeUnBD%Nӳ pęg_D[sR5TXav 8g&ҙ‰gUatoj71cū&P vAB@ \K`I3'p75. סk\xye]/.{f\% V9dH]u5}e0cJŨ}z]j;:h+5Ӽ;\ي Y=vn/4v'j|R_i qy)G-} hK ˱Kc_'ٽ1:| 8a=3@˯`}7:ȅox]F8>L&Z))֮r% 2n%+OcRe"ƶjOIQVVM ،=(.;낊ʎcx3Wx~_]&졻/-rG"gF[F(µÑ`]G`?y{٦qeeR: 5`\w?ѱR,s]ЭŁȇyj=YUY+R{v-bTJm +"ҙ:& p*xХEy\Ъ1My EMnj } #ָ Pzx_Pu1)po \9ç&C! Ξ_nX.o@Ý+v-9kPtnӓ%p|:pdRiiu(x-py/WjnuuSs1/%bh,$8M6֋4v5)h㯀w"{rCis.6]nU'whawx*uefytӥDl S]Fjs찌I|PegʙQΌeҠ7vm,F\W7 ]~}VǧveoNWX,|aCoUQ?pII麖{&FGK61 a)yް-M=p#b1Jѿ9$QFAI sga4*}*+>V: ZWPT 'iVܐN,ph87EG'b^PU3yx?R:lo s0@yn?+OE 7Hz Y3Yi,5]u}xf۞{ËQ/˺>؎J_1M\HAud[Qn4&hF5GK](j_A G~1qjxDiK9 LABa3N{oxR';;fYAe% K&V/{_K~ƈmBZ;c&~GOn:qm4BHW)Ǜ%QhKO-v= uK S j}ĬsT!sT| 呱*66>WL;ל)?vr{C1/P='~,Wzݨ+ɦ'YpFm>z!с5+k4zHXY-A,$u2~n{pcVAUC!,>4] !TF Ia*69߲XCgk?u fV˻$&w[/,6ϱ72/UYE s6`Ek]H<R*~9H(1]rV'!E*Z}P\iMea~کXloӄ:7FcJQR|V']OQI&m q9?!#< ̃TbҐIh,Rp)R BV9Oίo|!*"ռnj͐KQHm{`%zFpICC0hsx.:_~(M7uvpnϬA;Y B+wL}sB3Jyҏ~st3u>2J@Z?.\ʸ#O8M)1`1ǁL<ʘҀB(5>tR.QVNfiB+ Jme[aGvUa]):!yyrfA.'_ B jGNlGWQtf|MEIQTKub ISZjqvoz~XVs R g0GwnaWWb nYc߇t._`7Dr.JERwJ(v(UM-ְDG0NZyfVR5=P|R4G9EUΆ$0󏪼:_CGlN<6#؏î"ƨ+K .1R6D뾒$7hl$p#3r7Av2wAZqV ksnZ˚!D4'թ]{}5J"hM%(=*B0=Z V1G?I ([{K^˱jV+TyThסoD9"iHbo(Yyi{1&h6&DP p՗IA;'5QQj()ɶvǤD&CJSGaށ-)A&+sa2.zw&z$$|&oz/@៥Hɻ?R0>,=Я(X`% E.T\k|aeS7[ 35ek&"='xג1iD`=g׫i!ez&.^OUH-HAt|Dd}yy+dw prV $Oۇ\4k(A,zց>YҜ@<rZϯ%4n4MSb1՞JXXp?okRO+GnaWbY-Ȳms ͚3gl 3mmF@KiP<]G5!ro޲nMQ^%'<Wg\M5D5!{Oe\gZYGyeZ5]IL ws~|A큂y  d>8X$ДBfdDFaq6zd쮦swU]Ek2HpT-WZ6$g!m":Q劗 ɮ2W<# UV>t!^fW"a]/a'AC07 #^Cb- {`RU>Wv1-uX<\b S0Ǒ_)g>\RڦSR6467liae\Fbq\Yez G-3!bw6H I ?fE׎ e$Sr!Ѳ\t7n.'[~(e_n "9!Au#*32p)Qn+Hw95J ;$ c?@NV;FvGqIB&`dOԣ-b_~$HT^Sr-0Yΰ,!SxH2r?{q˂ }{AI-->\C0-,ye>I+6.8TLXvsRIӦ.ǻS0| o-䒌;u]q&ȎѬHV(!!S^7Dr5OT>H# wCv?=v8ڈeVcA(YOگ6JSj|/zN46Sf q| b ?jU~B$ئy}wɰ!SDsGy=8}bHelfDPeA9ϢVOCIe8žC+Z"#:#ޭ<5&Ll/ N*m#'Q9=b(bN9kN>vH Sѱ_K(%$cOuN~SFۚq(c8,>Pdq59?Q7wS3Uy)Bð'Oĉ ֒ĂsfFϝ8AW?߱\'}@,,*Z^c=.`Rg̫B?9}1h;5g*րbJ*$٠[:Zܪl*W!3$z]rJI1"K]hq-(2>oJY\W$X4u~ 'Tg[-l7nb.,7K}hƥϊv3:(m{T}&^; x|xNLFտXW Qg&n'K#릠2}g3u{GC$}jp(]FR%=0;2I X4́d%5W#??Ď f?h7 IzX<CT'q+n^/Zd"tf`1y.&j~9:`J|$l])\2C/#yE\ScRZ39Vi"ᯜ'ɟb" ^Hƿu}.In{_IFR@[^AjSf]l_m)cymY[Ћ-as9"eq+%]]Ȑ @/` )9l9Ir M\vS|y:J;VCy4of,FG>+z|5HIdW'Mgjs̅Uo*V~^EEXޕCE\"r>K fc@y [xM>¹ḑ!=K͹Gxra4%WgJh!BzLuP2c!sX5Ȕc0B.7uΕ9PpWmX򶺙0ml_Շs]ҏDƽ|)n`~C2BXPTfK7cDޘ;<(ew yUVinX :}ku:gE5_ʤ,/QZ0FSIzx(w3jEO%o_pmC2Gu#*kW)DMdO,28|4?0v KMl1a^Ò<􀰔TG81B Jǫ^RVieYʴyB9P$̐%_ɈO6z:.ϩ)f@f΄C}M38$7LF<BMUW@xaؾX\؆vHpNrB!@ɻᒛwVBqSt L4-4@M O<l SXws|cm. M @(]@@(Yg9NX|>g/pLW:wN=cڠEyk/@eG9LSS!G܁No?ǻa'Pxy@pddE:g2;̏?,!6~)`J|;rMeMq=Qv>x L 6h3Madv~qɹsЏOQ5kܮ nI?[ &i)x?CqVי[c{#6A5SOof\_d ZI-o4/'UxzyA4%gbYC_(h .@ÜQśH# Qugj}YJ0M,VY9'{Y,T`!2Xo"=ė=I?'Kt׹aچ> Xoz C hbs'֖˻e/҄-'9m^'=bNs9Xe1=/0qB W=HV1 뇪:JuoǏ}z& Ou99X.p[\Kd1zlhg*Qh̺`lHDw`Ct~_6n%d?XܓV1bXY䴡3T5̹p'2]Z |@ Ȕo.K jgdHCշ\"Em9*G+P1Ɋ{^t'?5KQC[5ބSK1V܀?o H 7#WmVF!JhYg\9!tV> 2[\g`$RUw*V0'f;;2s ۗ)N̺r"B+47JZ{V扦Psuad{3f|0ċivX{^<:|MNo!Y6q/"Ӌ9fx7.]BU--Z1m?%>L37,_c-{Ss~Th,݉tVNL;@J. #AEaG6ƞ b2vS kӺ֌1[}?1A8L4&X^I8M2A6/4z!H7oז)Q!1dQҾ< t0^*M*X7ߣ~YYSM(d,kՅ6-C 2jp^/PSA@B2c&vd}sgJ!{y8Ooi yI#ݝa3|3nFĚI8ZAFLFQ#rWX[r;q%KUKW "Y[8O[-x|G!b+rA6HCv~qcpe+V+}/bWm B-^b&IL]BQ{UG^[.|pb-h.V޾1xKޤ=s5<ϯW=1lXn1-` k'u*0JJy`HёY-;~7\9<͏X/IXgF^dKӯhlptdQT! ơKfcokm5[]W<snЛ_d;UX-]b΅!m֟S~6ťN|$m4N ͨ\u Fs1pOD}%z:[*uw n^7XU1 dc:0a}?yPM~[Y2Fd4 olx5@Xì0qeˌaֺ!KHh3dMUdq+5}FW<{ڴm jHG8cv޵Q<8~,_+G)5 U!SB"*hp .dSFu]j`*BSE𜇜AǠ9XkziWTl>"PQkٟx〉Va|-SZ '{ Nî@\ *֝xݿ%6 7CSUD\wZHl"\jO\D,ͩZhm(B[us>'m0\i_k%ZMh"FF o"?=" JMeaUA_2k8XPS.Ѭ:% fmNq %Wí6s\H!e,}R f7vUa*&ˌFw8ڔ^v1&numBq^bRL@;v:/4{E:JKRڷC ܻKG$CECX -R]O&vƫ70*\0H}*yqfl s,+XAoJnLל~1UΖ%͕l%}Ō"' 6P;mM[ ]?BB}0BS'v z$AM y)L-.@xA,\B( Kȱ: 끷pTź1~p1c0@i>PT劆&FCOv<~M,i6a%0&J?avWce}dεgU= |!r%7TaD[]=ᢙl3P dQ-WqHdS3\Kk~b(QHEz+^Y֖vG&0FL<|,p-[ 6oDHDCۧ.$. Q3`˃3qR1,{d%> stream xڬctem&۬xǶmfIŶm۪ضm6z޷O}~1=qM\{1)-#@◡/Y[NiZE3g_9+ ) @ lb`b0rrrl,̝*j4)`f6/.&ֶvLlB_;*M&!9y Y1 @ lhma02q4:}[S#_,G⯛?*/ Gǿ G8,lI_ 9WL 7t27p'_5?%KdO,C,f@p013p06qt gz;;ky`hbmJ7f60̊-rcgй8A $ mm&0NC(X#[#r\_Ee ~%c`gҀZ;߶ؘB GQ Wcy '#sߞKbcl`mac@_tFV6o/]ʟ^\NUJH`e(w?5`m]lZ&ƿoBL,^bϳ+@o $Gz0ɻMp){7٩uK"=4Tw'u? ڙ)}]}HRc;Pj NFo{pcI 0};V.f6U#'vy_r& yAeLd7g_2} TKC0&4,[ױ$q¶vQ˕jm{$J\ȺJ/>g,3RG*‹_;Z_T_u.O;cJx;'?e0ybK4Ol IʹUpHNRWoX!⛿"%rH=t:REXw iw]JAFz$i", 64hEhTd >%reY0\T]íkQ$GO%ա?L_E~HLn@ $Vm #ۇtqXͩB'_ tiHԘ-Ҷf1k^hh5bT <۩(Sl$0nk"M-I]%fL\>#^_$%\ _p^k*ғkc<b~g4MS823oyKY`aD0ԲRZ'z댇 `ps0C d2TNz_Qgk@=mr[21:Щ̈́} qdI&3M_ʡw݋#AtDOpOðB4ف뻑:trW&[m%t{ޙp|5.gL}|hAqPh5NoճE6w#Y}j%aQU *63!|'(tJϤNg-]6m32 \==򡪅@ke hUA&bFƊtr +ޘ8y$Jyt3LXv]Bʹ|46`8]DX59W pJf)Q0 c9P,)4z| BS;ӹRp wLʒΰdpVV%Y^d2YD6?$Rv^X7Wtq_T,FfiܘVd-J]-jKA8PQBą-\/yֱNk_q$.A:~ґP+Y.^#t,9PԗUj'e>l\df ꃘ](NꉢHc`e][S!LL2|EגE 5/Ff5{h~ 3vr;0SڞO]E𴞄8AFQt}P,Ǫla{r1\o570ȑE hr&O]\oի O(4v J'i{t&k;.\=Q{c܀Z[1=j/|^/ Q;Hv ~ c#ׂݶavH)*V|j*|m#sMx *EPܳ*g~_`8Cʦ1˝MOndmS67f ;=9@̔AwSA明f70R5P>ZCuםXI_q8r>:Ek p"BdǖQ/M17~pklJp4eQF>Ct*%(Z-޷M >Qc}3: Wp;geK%dJn`,8S&4V{-EL[iFNj$"U;:gN6t]p|"vFHZ9D#yrqx QՍ5['Ɣ(CC,z9+;(tcTrq7I0)j zZDуk{p޸tar*J:zXXiN+:agŅ^v۸m Ү`S9n "ʜu%e: r'$0.>$))u?nJBvIqA̱90RJ|i>O3#j /]f5V0YTk917V8< ^rJJD!mcg5m>]`jPdZFAz>y61#oh͆6V JTlCv]:ϊWѬ@ z$}` :G/wB &֤#Em 4ەiߜ"T$R@3\+z6uN'[?-K6zWk= 6SO{D/3 # jt5m ix^å 'z{F͛bQh:#US aO%ssmm ʴ=<SdK#Iov5j/Ps=<9:?>b(p0%u:FOA5t_#&Eu ][`8-M$7F)uoѱA Y,WZ 3uAjJsPvLU-w,9= mtN(֭o)ږgln gOΣ8( kq|e(|K1 !WE j "\݂0Yj] ּ>s(41< j=ފ6D4 ?jq`q8bpд.b2y$\Zᘒ+n-Ev#_GmBu ָ^վegET dz0v:i[yne# pCI4dsI}?Օt-gѰKbF5VP7ep}:[9䥞NwM 3 b(DZꊑν4j-C |޿p\Ƙ- ~gqUcgǃt-Ѫ{EvA')I}hm8׮_G.~Yxo=N+xNC} X`Nϗ˼S>½W =*p[_{垹zO+u[AALbMeAq4u+[2fAf!js4=i0/?u e?.H_ *!(3qѱ$JX:vQR ^91K\1 A6v>k +2nT%8v7X^gxaDǀ {Rip!Q#[s{&o퉛֪Ez14O[05cRR. e~[U9iAPW0H/̃@2̀6)c3b/qB vS91W*[EKC%aFc{DLw_LFq3Dnenۜ1`\v,yOzhWq@{ [/Ե lfR-n,&M<&]00u%xD `f$=w9=uEtyw[&!: S$UH{T1j_%%z-Ѷnj)cN\G&3yrRU]ʄ~x?.npg.ngA1sq2ǣ^gJUrBÊ儒r?aFqL̚_8!Bt@Rm[:)rWq~ʘ қ]OEsaef**S^CT|-^f ;U4]ԞLWAK/\+iԯTMOwZeYLJa,cr!Ƙ = <UV9TBܵ鎨Ŗ\-^9W =1C"gΙ48AyaGIptL9<&kyEx%I0#Q+|j@שddc!z(tŲ[$`^`.*m&1t4|FT`B{cǰ1o]73:3j*njV@3Sz6&+b]=~ՎQ1S[@ODjAQ|*Lc~b.,ZA@"|O=&BcNj+23o.,:- l`-kMn|H6%)"P}L7Fy!:"bXwVnAh i^X13A` ^DH4 DÒS@m(P!-i\@>H4ihrqS2ݓ΍IZ6.ac^/qׂwΦ}~X.'(a4*Ma3N YQ}};uvSI&++9CmV_-72T .k+޺]@Ș94*Xt{&mb=WZrEk3e'w,Un@@rL?k Z@[2E oͽ*"˗T`f ο}l09cJsO">ѼlB VZ($HRܣnˀ> p/5^f'ĶDGpC90'X6j/P)8ABP&<(%˻-x }Uy#6ؗMUCtllh2X9< ^ڂ^7KS SC*,-f']&M'15 ê@l*95=h`*]h e\͋#UzXLIH8?Dwl"Z&)bR24y}z~Rvֺ?/tHZO^5e;GM/$u#hXh:BӬڸ˝h7>y ;%[@FY]>)۳يL!L'nȑOl7s㷅Þ E1^Nhؖ[1lr+wGo'rp'̂Ӑ@,{퇸ׅF3.椪Sg9립q}[C]*>Ȏ)_&z{VͪXuxJ鎨?9ў$9Yl2qbvfZyJ #UcC5ᬲSJ]5`ZWds}Κ6NN| g0vQYn䋛>) ȉ*^H؎K`{vAFw^s}9 Qqo&7]tp侖.`nռ|&iabu[>hG;BA+Q{zz;*~1{nN2:7ԹWxL]1C\%j|P&S}̓4Bo.B4J;ߕ?"k%AFmcɍuʁboZRZ?9Q׺AUO!j/, ِBT an|O8ު/?Iټ"jn.;@vJ&+nPކXS4 &IU׏ ]I @2s ')ec,-BA&s]8i>.z>zͨ@?d7HSR7ߝpۣmADxݤ ds9kѫmɾc;vGAy~%8% r>K3[{JĂ1Y>P{z9G^h >KgR-csNRbVzH?(<^Gp \agK[Y?.r:0SHUA,3"ǽh-/\"6.:z$lkR˖QUB*| SRq[1J Ā=ڞJUF+/قHA.N!ma0$n4Ѫ I'C k NbSUA˥w`-]՛1o=t}^,z3O?$6-L|=4P<!K 9dKZD2@lE|jG2L|;S_VrR\$oQd(5 >#+^9kP}H &cߡVw"q 1"hu'C.UA@Ҧ ~o DvHOi-k8z`9PAi{T-kk<_20Tn{TqLBJf}ϩ_ &d+SVopI&Mk-ۈp_l[z54ۥnr<1f]NR0"HDN.]Z4\,G:wO Θ 2R6i%?g/0\QqD1VRUI-`N>oquN weOHʓ}-|,~#zIHuj䋶 w,[^#R H&pS:Km] Ҭw?O"]n@^!޻yD; 8 @3}o]$A(AjhB&:XšPu-ϭ'1JdfD'|,ރZ:UTx0[,?TSLj?ggmcMusva [4z"9ǏN?ifMNEYq\ #bѺ:C ۖ檍3 $T$;=f~JE#!&# 5+q>a9Õ3,A䶲,N䙏ٰ[/`yo-/(hIoƧ̹>9=UOѴ Q2L2&Wyov i>_e-@B j‡u1N6!JfuE[AA>jh'%L /kev(k~.a#62vO]n3 dc1Șpu;8iTeXƗvpnwN'm'c˒~M)M{۶iޥOhV>#{ͬݵ bĆ=dɄ8l)voe. gd%k fϺk Ð+1z:MBk/S7ư"C*7pO3R`iߏ7rsiO d}{'ILjQv_;cQ"-,axO!N+gtT91s䑎 r'PV եƿoe ?4m7"úךā,ЗK~z(K$<[5I#`ʉ_'F7a}veV͢m(a?TD4Hз^B7A]k88CYbRjˠuN]' *!t1꒱۰ւȃ9Jr)!,(Sr l~0=[T,R5Z H@NBqf%hBT,C(Ḻ@'9č|4ItWNft}m^/ !o ZXbOm vZqA_˟)˜a4KxJ8ujM١(U@-4oI_z/ՏCg K,/zء*XPlX=Vn ]-_zڂCo< iMjbdE;pBX)o0\EBPS3C,X @x3SGS>3>5%G z qD&$S+ ^ZC X~)[| k\mIQu%\0sYJyr,ȢLj&cHvf [ |%*7ZPMd~WtԠV$T+mʐ)yB L:!Ztf2bH=L-%Ԫ4wbƢ6_N'<Sѽ[,Q1I惏p!AԵ`rLDeQd4ɺM.,U94 Pmv%.N=偤AP7je >k ۵2/C+s8$2cW/;rS9(b^>FeRpZDqq¹Q 6LOY0)e"lR'lM% HG!K j|4?Ÿda>8r}m\ YѮ`Æ5 Ўݱ_bwڇþ=az M-r33=6k;b gUEn+?;&0I~2 "d?=Ŀ̗4·?=?D@px_`GZPS3ΐd'39.ˠX8~~2bN>]}{eC ffҫr&w ^ECI3IQ/х:sq2L3vrHd1[?\)h`˃=cCf~]ۗȹoV)a(IC54ZMsBq@Q U7z`bS+Қ=';;rI͎*H'{EcI^< rЄ=&\'j~4BI=} چ@u9叭jC#S %ځ8.= Eu\27PTnّ+bVq ->0VWԸɯz^oUmGg:+8jkd1Gs~{fWKD*ڱt.*,lGIwS*tm[z-E\{2/))GEZYp ,5H (~]:T$n :l@|$H˹0d-WҔ@D @'rѧoW 8mǕ|P|"75x߼ؗwMz:œucN2%Lf̝i<KHUIk3}ág7QE ̦ӊP4dB[]=+e7騺Ņ@!R?y2!#^g_GJ7וř2mݖ<! ܎,c֛4v:7WLf]L4 p~|opdnK^=FsȞ3 ta5Cs|1WHW3[5Z !Iy1Ӗv%໻ց6v!Fpdڕ84q}AaK~7!PCx,XT⺢,p~:fR\fb|4$u`Qa:}F#WQ}̂x]Շ_q1ӯ8N{xֺ#޶2j[ko-nWކ]85bqiw7Nj!}PU)b BY^rmٸ$fkԺʹp]}wNoɛj#Ni\(Uzl$̎8<Q])BbA"Fڎ_K`)r(yގ8),Nb}o(E? Uw-:!dIh*L>Є#{y^sOAVn||_m٧ih- 8 [94dy8ƴ O$3aq`ePU븴F"N(r2x5|lKj]fx.jޥ{^Ӽ6n\k\ê`@+ɂ![`V7V@ \VMKޏX2 sIeTL7ID˷@SB,Nb:hH5N Y3#~]by~ġHSZp|u9ChX:-F5o=)J8м]Uc"{͟Ug6tBƊНWħLKWX;aM5W{ݣcdIFc?/DU:J}\&ZYJf?͜_k'W6X3pՊ^e.K" Xc|8xa. ": Mh*(XCD--N.vYPLo/^7bk7'Z*_ ըX[ Ø~LAshOuZ);aÂy~ !HjG廑FGKQ?зc+}m41y@W؃Hr(}Y~T>EVLD_^38L̗\pA& A犲#YCeif xym\|CgeNkD1S&tB+z?.Y:笋нՓ ,AomӣvX4(pygX bV+IPpKN *i#e"PUta+hD!(NM':QB&\w+=Lt jwHTDawRUw fs SJyW8o9v{6טarsNTMիy\dwEȃl 1s@]r!Od<}G\:֘4сT!a|gKFeoYQ-32/\yj//P'.nHR"$1udktyЖ8{%M3+pUTw2$>ʐECCOsoX%OQ4%,kӰJgMyTS˄hIǾZntUD1Դ @y^w;>ɩv+UMS ٙ*})t aҍ\"!a%zC|وImcoK>,E E|6sikCi1]p0Їk! +r,~1c;5X9yeɏ=h!()CF V /w56 *pMWkVXzAujJ#%4,Gv,'Y*9P#MVQ50[S4 vY^96eX#s9Y0>`?݄g`VڝPxPH%m[1?ɁWs,\,f2LS}vq[x:psliuidBYB2F}*:zK6>wT /煅MFm!%BVf%GEm -7O Q33AwbB P;ppFq(Mu בp&U11nBeaj?Gy=a ȯ >{t~BL''_#怴~.j Ic YI5Ϟ5-jG5RTK#)'~W .4i/Vi]m/06 q9bOܟA\Ǖ6QgqWMēb8A@;Qm:<4ͣ%ʞv hib 58(?IF9U2KKQ"i҈ ^ȐK_P*qH9^t-˨DK6~_}t/DKа( `riG]s=,½5,)g@- ׈󋇛K%w [1ڽф>-e?d)θbyȧGyK%0 ؇?P#ކ^g+- qi`I+F7&|| "{J7Vč}1o7J/;c=en癩搽 D(EDAe|`_Bdx#ZOY{2ir_=8X*v][f_Zrvٿz5C+ t}(~NF3F6R8W+?a*EIVM$ zZ|U zJIyك|y˾QVR@^AJVe;kLTjY8,B*LjQ080 \$13fE-1:`Jq3*ډәIݨ9) >_Mp4pۼ'>eqZ4gnB)^3;ֆLUw-ǨPΦ=&Y\1j܍N&L*4VS]0$qq)G-rr?˗7^2U Xk9=6|0Y-n8rffORqtYh}V>*E9C#ȁfٶ8pg(,KFT& I@fڄCȥ!\w/:E̟a4L)@ )Ťp@r''94{vP&yN)?bN!,^aqK*vuQjkgA<^zia<SNy9-#?6c»t}Q8fByO<adS]i]6Xޛc@&oZwt!/ ]T9_DEF$J8LnWZTfca7ŏ_6T - (.9-fW_w%k|25g˜I+c^x=PJ4PFҷ|Lm2$OO,)޴?2'0@\<{JN( {}?4(?8tSTh %K TH5SFȒuM \?& @50}@A!S}rAe\l0-|Y/ BA0/p4U^|^?>sWvh36!PVU/yQ;0fNc*\ {^!u}@ފUWU᥈ Zv*⻮O*s0 $JOc_d}$㡇gWّHٚ;*hR߆* FS )EtCѿ=?jO|(]u.9EMd,%–Rd5U̝a q[.nvNߤmcFl7>gMS˹lۈj'Qvv!,5Z@s [UɎ.jC6B^K|E6ufaRgz:(Z7bDJ-^R0yqVѣ+ TXv2SRިJ w&V3B{~^\#=apyxGOrf W}S]Wj;4V?>]ra5zI.S 8LW_#4yL P@>5T٤hiH!0jeB¯Gb /mבqw0k-}"!lX5.ݩsNq J><-smq399JFk) 5ʛHZUsַF1^ՠKȴg@ cdݑK쨕49 /]rA |7/)^d|Å͉vV94Qȡ ]de`FxO~%R^|PUojvov>f4n~k{e!O"4 }EzNpUnLix>GK2#@1@%DJ"fÒJ~ \!'Oظw9*〼N1JۼΰZEHahֶ#[B =Pt}M#ȠӮ7\/|v dvOib_u uKlW[?I!􌄶~+M`?K-?IRiMÊƩ|Ѿ3̤[8WKqUذN9zA#^ؾhw] Ǣن{BOBK:vy\"Oy`6o29L+4Žy"lE61G먚~]}I mu߱Mdk?^b"4FpU|Ѝ7=RYHS6@il5yr/~;yohes iHM1UC~;^ǘE&j3O(ނ6'b F (v؏y"soN7@/zoU;Ni_:5!X6 OAEE%c[ `煻]3nIG g/PeWK gFpYO&:0FX8O(uiدwdn#[:4{+$s ԯ.J͢sNF lsgn8"ݱֱR ˑlP)NxVr3 }(uF-4 ̯9{Jd2b*ĖyhR6KcJ֏RuuȧMF6L2AtO⠌EN+.vV2? =ͫXz^Vp\WA!6!X}EPK]= %oeATĻTXZGۄ-c hw[*niX%^\݌;(T!yޣ|}Zs n=:kCaѐwF0i1=w -2mjKmR o2L>,Nu95HBi;-;s^/VGfpS y-߫͡J֯2lg)yR YsЬrc:_+!3XOEx+ڡiCs=*@j2 yrU؞N59Mw =fywVhǐJ# ҇RѰ `Sv78-=#~Qy$o5Q f _/ *42J^۷/iN%WzHKL,yUzxP m^uS-.L%5Z} a8|Sv`Y>泗> %4E(ę4yB14WyYlCPeDNnL6#VGِ)`满d|Nodʧnƫj],N,AG]Cf! )"&LIm1 :A] =WrŮqV9P)'e($[i^Sۛ@_,2){uV6 4 P'*(Y-}@7+ &)mULfJQ/h{K':CxF}Ee+#zpZtšqa" P^'^X#9r}C"qHv1Ӳ'$ '9mWb7؍fci+:j]SzDԮ0kMؒz!Riv o ]fPF:pƮ$UQ{f endstream endobj 865 0 obj << /Length1 1647 /Length2 13166 /Length3 0 /Length 14018 /Filter /FlateDecode >> stream xڭteXݒ-'K-w }gΜyνg~]jU^DQA(am Y8+[[[2(M-<Pdm%hb@C++ jmj21uP)k G= @Z9|PU@)` DIK%@+G C,he[,qZ[j͞K>€.@ z do L>2p4YxX~`dv GVE1`Wn{ 646tAdep80X~ ]=_&vF@{n_}K66G[5ƌ,9 >r)+ck ?F6Ĝv__3CQ+h $o@?SOW_O<=X4V]l,-o p[2Pfhr04[|\v5+# !o)/58IVJJD^ٶ;+~L 4䬍 ?#+#D,:;؁\ߙYo4VF͑/CG<@!!_YrZC5vnO6Eu>]!x^'xZ\l^wiw,g9d4=km\t~LE)sZ껛cJʺ/Єmlv4>dN>w6H^IQ(`hyGǔqwT#C]P=;tQp|^ G$zv7uoPON\Έ)dV֢5n3>mE"Iu˦n7d`T._jHà ^[dfu:i'MۺDD &j)+l }Mv&>jU4;Go<؜EU2=uVT1ϱй#X_ =TaP-(bIND+UjVs ̖#^jMzM(ctxK{ ]274V\w틮wdpNVpBe ='(BjD,܄ChǸWOȖ0b6 acM.Ϩʖ%F*!z "|m 5/ބɾ}1jAU.IJ8_o[p DOa!gIKL RTD8i9uۄBπ7HtPOXTvz,2J^9#AQ*OO5,| fLLP-~oʿ@ʦyCLkYQ_-B܀'Gӕ;q[DWEqCmj  |]*Y,.ϕdC]UCp1K8_\MgUHjOq\WAZ(7;C*Gy/H2ޅH#yXR%ˌx. zjl]$HM4isoÚB@Vhz@s69Vɨ(\Eh̆hGX듷So+VXs6~n~ T4ϊ =UaT'fQ*1,կzjۭ*p.U}o ׏V)\7?prlMM`B)`wD 9xy]&jGʾ~;a57=8+nd,㦩LpE zS`p r峌/ffrpcM I i/L:/˕MnlQ@ށoU!Q:ŐB/2XSͩotV_Rҋjkl%]Gn{ȷUgʋqٮGb.}W{y]c~BDMsu}g3`.I{PΙd'Ih?`)Oz{j8"w5dޝ5bD|W&@ 6U'.p `o Au:f/!]ɋwT\lpk}׈y.0S6;_YZ0`ijˀx:.Va3r= A`DAuij j+GzdUs9jn5(rG|PnMB^+壼O\8?`,٭ǂ fH^Z=u m]#5[?H4Usk^n4'8'&tוd5ѠRuZ%ЧBSʢ㘭`X.^JrG 8>s*9>1LuaEDj3ܷ^` OQWJ}B!U55Vq" ==jR ζy>} mcJuP !. Q{W(hUK!{IeK.}f#e#6\A!̻y+s쵬e"?8pykpxXc.ۢ)jiPzl!`W813#tiN}=tlHF{1[J]ڛ3CW$1ԅ&hqur|)S&(D`KK2:Wt  dya+Yɳ CK2p!Iݛ6gh[XϘ!}]s!S|1Cƴ02# ӱ!,~_~]b*p<x'+~{G5ӯc~(__=XԦ~oemGl>Lx c>\~F&C,Pig9oyf-yt+ "H0ˬ3t;ԄN/ 16Q_o8X772b@iӴGqJa5WJ'ҏ]G)ugUkpVc:0nRӮ,Q4ZmgQ4L~ s3}eH n5WRf[{ACnZJyI6JӝJ,H[M<2HUk oo/JpY[sŦq rY"NLws]%e5řc؎g^^pPIz Zsj_1}1'x3۩7]hZ,畮FJ;%b mƱdϰPίt*x?|Փ6wM}[$ fb+#ҝjљ\<7ELJs1"rMQtOQA֌\FzC2+4C^` Ըj_QݐN9;#IN.rw_0i~q (]/urS%V}f?9-ĥ0~!8bl`[gW37lP+Um+{z3|YnS/bk\ }#!X2RQ &K%G+hWb xӅlE4{}:8EelXgOJ:?_{lQ8oAj V̹u/&lhB.ŜT}vgÆBq!s(QQB\TY> רX+-۲~Pt }]۩ ԫ k Q "l8)$O>fpH ;KMKX=*Cm1-ȍ-T Q[ק,u#_$LM_aQzfX}lBJhB]Du Bɦ+)iL@v.'D/̯]J vрL`rJ[4BxQS) ξ7|+mùoJ]š!]̕#Kg,vE!]$wE&x/u-oLeDM,ȴ %Xy}J Rd;}!+րG)(c5ܿl}c<]8ukq+ےYJ׀' a?)t^/ߩm?+5LJַɻ tDm7I Y7Hl%76g7'/"zKpBcd'dz7cI[s`7} }Ud|Ǘfq,c3@t\vBZh{:]k9~-dTHD.9'm=@֞Tvq! 0'*=δ t^?6uyRھ D[.3lqʱ>ĊEW zYfs2GB0yI9:V.[ ND^JP7$/`l[5[bR&'p8v[HdՊ(J.@gXח[wV)?QcM,O4tpe">{aR׶Y*FFէ$\+A~/oO(IɎ=/֍+ P&\յǚ6qGs2avMI ܪE_9ZR]WdF KJ̬ZIAۓٯzrz VNOv QcH}#=gAmAu)~O圱;4nJ,CPԃ.`:r04vBx|TGX`PFf% uwbtiF,dEr OpU=^|Q$ى*k OAs^'[Y+x΋΀;񤾨VSٲ1dg(l&dp4Ff!+}Obڒܖ%߶fV"gMI2͒d?,LoDLqbu=nUH֔u4,q{q$*Fߓ(rJg(ȡ(-4VcvO4 }*Ut?yr^5a<-w]-oI$oP-rĥk&Y: 0lHI`mIYXeܤ8( yM^E3'imE98N*A}(m?FM0e@;P]Ze?1:ҽ1|ֱ)zBծ d=cU \wwmnN%Bk=R 5mHZ-+'q%z5j̦.-dui~QQ'Q:-Qwڸ]:GҽeE{Op5m_/0.SNQ1y΃йksY} &:K*N&C7V][SUCL|'xG7g~4np$\WHτֹ G;Erm7OU*lx}.tT[nuc6(@32uR(~"x#UpHrָ΍Yrم8LIp'.kzq4z7Л,G܀e{oL|0](%3AVQ } 3f5dPy+Xi^<;k mrz'v69P$n' VDNKH5*j9KԺ`0h8B-PpQ7=qiIX C3ldT6fSÄ2%W(捔'j: #2rɚCbd;ٯNHX~vloPu͸tw ® LԂgTD Eor1xnS_f׋ LoQ~qIQ jv|;u{-:ʐPq=*CH^s6'E #~Oin+M~ yN U4L!UyS'o1$GaNg S{}7'(Ia$ !IG~gɋQ0JWX#IIؼ@oXB˓nDb|'94b[.gD^+<ƒG]ke(4A`us 73GD*Ңl?DV_IjP.2K2j&GY) {^BdBV/ԫڰ4gy'21Ң]gİL]A*byż|!o+Aޚy ٷ@4}aj/̹ T: 8cW9Qe 6.Ȣ9ڮpw1?\l5^6UθHx5Ie˿ ?:⏪dAEib!DX5oZ-ilIQI(^٢W[۽+ 4 кxk@)?^wu(#a '_>t;BFWD#Rދ;t`XP]PE1ZdLH;hxnjLWX֡ʴ( e(6Ku><ZK Z_ TJc RjIiS0T!xL夲V[6lXk՚95" miSc5Lh_QC߾f\"`5s5*9.<!Xg埝;[ Py,-(V HyҤ-k ajy)!bZM`rb1*~|fp,+*wUF)]L'ٚXSjmnD d;T0HZu +2 H"}oZW7~\Ҩ#sm7q D2DN=PoER7ۃl3P1S @Yg\ SF0oa;~c}SB0(<'\b_[ee|1YޏJV؜3:V1%,GzXfDJY][QKPP9q\iHQmx'L2s%.11jcyY{Hw>JQ``=akė^i~kbXKC%wd)G0ѭ2Go~2JZN!Mqy)RAbQ2(Ƃ:*'bPKgDooӛ8`!I["bzxdK:Ζwv+b@k~=BM0Q9~nmc?4ynE\5;n2⺬_._<0BIIΤWMjX8]9fd={F_Fe4C=RF||\(̠L^c/աoSAG(S.sKA(w ^*PB'N[fʜV9v䇩f{^?YS99.NHsBW!LJgob) .֛իBWIh_ǔ h>׸a1MMrIY}/=ÞAKMi~U\_tk`%%]8ЖCy,-z!^u&Pj>Hд$,x;Gv~\#Fڭwz;U|ej9l䮭6{+[sӔ+]o/u-Kdx k"z|!,M(U~le 93 ȖSUtw?vK|ٲSg=([9">=L8M&,x5r-VQcl_9)HPǗ 8dQ ZZHlr#,'1=][w*WlvUJMZv\-A^ |y;{)dW:\>K05&D#; U=+ 0d7A=@Τ=ir;JfIQ)ZbmRFc;XD B7k+xɨ‰t[GAFA7:*V1*6L.1 ' W<<^(%Dyc.v?۾gCdmjh2 F| A%>%dk[lT'cp X,l /˷o#r:IR$ P`_C1}dhiL)Ql/0fQwDO7G|'R*5Dy?,x$h .}Xb~ RjMd:fuY7^: -aL8u>5;@G/w2* uo$zq[lF.MXX܈S`29M ^buX=[]I1jFn^?'~pSߌ=iX""tDcq) 5yOc< 9eӧ|-\M,hF[,4>,[P ҕ J\ed62%&2=3٤4-GZ-)ܼQYiש+&kE{Qz]ן Vhcx}'z_."8$9k=cB" %^⪸Ƌ.w9VFCޫiZjtWZ/0 [1xXJIY{;Y*Fo5Ll^fbWs Xd8lm(LsJM'0Tl|ڝeئ sqMߡ"v:aū%)4]QH:B1jEDYSᠥ8ĞM28Ż̏A(SyIF¥4V1n\|%0ӯ:n\х\ )߳?΍#rLp ےV!jp~,IC/UB4_^ˏIYLؤXp䬖#P6Us.|',4kw_ͧGZ!T>,*(f,k(T0y E)vׅ4ޣhh;$dWMFqqVꂁ\7߆M|/C KiUAJ"{W޿++ybC~Aӆȷtd8lUZYp.^S2nl'p;GsW=78O)l+M>H^KpʬaأcD`YMd0L4:GwyS_vw} $BRPsmBV2Y,4G~|ʻ{{~b\Tv? wr3%oh3v {n+rZA9vqGaH4:%^B8󣞱x mlYƬS kK*Pڳr9z͸j4yLǪ7H[pGtT.j۲[ӓYYTA$2Gd\Foظ ) .=}?zI{t;G׼lt[v0ooL°ե>;)Ge˃u5?!ݢF>؟QMGtlLUhsafž+eK&᪉<ȓ71V١un!>[j?2=s=~wjAOFU6 L|aӺ"Z@+(t*ϛt,CkVMD}k,N2:(a0Sħp^=6siMs7e*\4: $t *ԷOM<ٳ~Fs?‰~|kAwpWW$ָ]#KaFsV%OtJVܪ_cļvJ@#OdO/Br` 1,6ь"7JuÛtůq`^1cF8RP6;9J*߻^X4mEdTMB_bȷ43zm[Oek{n4̅޹lj,IR@uϯxKO%,o _vt @u ;lpoيw%_+Α[5lƽG*/50nrϯW F yyH8Iz1&^UvxMl0+FӋ1`M/6.PF?ָbho^] 4W2SەL_$ho5BW3'!h=}]675&$ú_L1onz"3XQb^|]p%"ǀUiC,wMϴB`(} d΋59g(qЛ=^ǟX|P8NjPe% _W-)9ȦZ`N)<9O\1uҘ=o0[LHcRBxTWhc'3w4"ɾkU7e0gSaUL 7Qi/!pG 3h8Ǖ1g9Rǧ^K*LjG@0|*7QduRtk#3#n BkPR?k=Y+g19.R}Gi' 箯O u9 ]ÅPH֛F Hz^RK 6"\-twؾ_V*A(`ue/L7;O?mV3MCڽr-Cyh͊'lOQ-w);%J6hmΉmї_" _.lEQ:wݶ^VI^mFT^ahʌ!fFfD |ݻPDN#Jb{4$hb/?C.+bV"L޵gKM8dB9\UII%Í> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/@̪X endstream endobj 868 0 obj << /Length 494 /Filter /FlateDecode >> stream xmMo0 !Rz|UAa۪V&$E 6~=HUAgɯ~uo$ƛLD- t @ZcNt=YNk`T=Ro æeCڕ(>Պ AiZsn[6uc^0Xah\je?0bprOY[AKS|dۙoF)MZ}4W@{YmG;<9`;K (EytbabisbgEjq(po$}Idon-p!J m-O[L endstream endobj 869 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 870 0 obj << /Length 695 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS'>u;q~:fc_0F)lGιmu f8Gӫ6b"!YUe.`M{My?IC4}+̝l/Bj*{pϻƲO('$ *{>J-9_eQ"V$)MP:^9 ^` br @ {@(\,RH&ti m+3ԅ ,;F$БzFFieD(0A1a8yΠFpnù[w6p@ )9r9b_ia|F-(:(nQHY^`nA|n(戥K}s\}sԑoA&vqc⠦ YK^ʛ!_my_)=^ ^{TGRw1RDž'xJzImi9j'pͽܳ/-_Z,N_: ~iyY2q,nЪ5QN Y58.] endstream endobj 871 0 obj << /Length 695 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS'K}v}tƾ`R\ws*pWl:*;m_Ű=EB.=]6E%‡hWvE;^N ƣՊU ٟweӟQ?OIz^UU|ڕߵ6ZrbˢXEIS:.trA&TH>4"PX H BM@5*08WfH AX v.2I## .zӘˈ0Qa8tcpN0A2 @݆s>^l>^wo_j4Rrtsľ x[%QLuQ.ݢT ܂PKߗp#}߂pMAM37CB2>*R{@8񩎤3 }c$f O#z  ) spW)9N{=g-_Z ~YK/t:/~e}Y%៍-t:UEk nmGkp\x{)ނ endstream endobj 872 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRx=7i'Էf[7̖s ~ts[(:0p l:5m_-tB}W{X8 jw]lj'OC=6}Ӿ|< D0,6;96ݕq4L MUWqS~Ӿ |Ҳ\Khv7RKs|*Z -1 b[d08A  i$C#.CZ\wF|TT<\`Gc)y ,<$g v1a粳[ RHדL1>g~8 䔷5 B{ $.  3qdAEBu7js"ܨF)EYQУ.?yRmTy'oOz>OZOyʄS&}/6>zչ{ZkZs}=?Fey endstream endobj 874 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 876 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vz|N8}No)e0&h?q:P_ X}ac1+a  jҢ~]ߏ{_r)4i_px`!dZ>i]<U_cr%ͪcךv[\٤ժX*be-@E-X@-꩖xkM PY@ ,#bEA 5rEqIb>,彐A$ G#e"&c D`%rE*s(Ǩ5ثCI*=ǔ^pk+ ܛbVLbX+@8:13Jp3<|6 ^ΜANVjRy9cpסAM}Ė)|֪,+pp70h8J+NK}Eլk)up >o U^g{_e{]*?`CBhgiیtV;۳ѝ)(ZK7bA;E^]|sQ endstream endobj 877 0 obj << /Length 833 /Filter /FlateDecode >> stream xmUMo0Wx8T·~h[ ۍT~3r#_)9۞c$_{t]P܂~ݣP_(&w(R|vp#P)->g_B?q8SG AC۽[ia߿{2ZE_cf/1/{/4G+)bUUwkuTO4[@ 0@`%! #P .w)úp%KcJe Rͤ(*1:bDDR@ ȓ2UR*N)KIΡԀ0CS,km:5Bͦ&[Y{Ł@꒩)NMvSpJs}irphS ᐙ2L9ΙV}yXi8'z Ԛxq1GyלNZ1fXt:s0>wpVR.խr)>1qҾKvHX1iS5rM yR6FBlH>]6b 5&5&0a'evb_dfQTtQ]zK/WБ^Zz&孯ӷrW.&_rUOz䢓n9)C]!􁠧r7dE?_;~T?m endstream endobj 878 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9톅ļ{3񼛤es^7箰 nn8l=hzI-._뫦~^JIu]f `tTsr*o8{&X,dew+mWos~X(2X.EiTz}ܟ^7uY~lVNMєo R.bY.֔O9؄b%9vsr(MXa#D$ar bqMDs!FKRLDP0.BEHQ#͸FuŎ577v}QȕanOd$g;A,əCR;6+ѧx**Ę$90q'oקfQ%n;5pX2]$^q~+s"F!CyhIh~CMnOf1$#h)r~hмj5F̹k#ni<7>Tsa>s\8s&wsaY1:+r1\ut[ZM,k4w6_%aJ endstream endobj 879 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTMk0WhFG*! miʲVZCcYy#9햅ļ{3񸟤e&Oo]&C]]Mq>zwt߉Ǯ)n.pCx?nڽVgx=itO"i [\l\WM}'ԭ̚t4pXeȉeU oq yM\-CnCW_Ey}wP dZz891euB)] W-\v\]~[S!8&+Zce"'2Ɍ5I@|"B2AQhSlLء28a}ɑFq5ҍnnbfǮCG= Wܢe$g;A,:sx l=NOTƘ$0_س/vЧQ%~Zx pX2]$^qnaK??q FqMyc0=) &l(mi,3|d &\c ]͹&ӈ9w{d-tx\ \cΜekqLJs?<@>qhx .׷8wl~1V<*m"mmDa endstream endobj 880 0 obj << /Length 664 /Filter /FlateDecode >> stream xmTMo0WxvB+8l[jWHL7RI;onDo3ތ?n~<&Y$ŝK_IsE77E[^N\5sߖ;7|[lzmS_*7F?h3΃;mc-bB`ew\_7oK׽;(2Z.ETz}ܟ~o9V^MVK7-\f\S}[S!pcSs|TXo1/ȡ aeuC> stream xmTMo0WxvB+8l[+ML7RI;onDo3ތ?n~<&YվI|/ŋ;t硋nn\3<:Wj\=?-wn6pGۦ|Tnʽgxté7~qzxKlqrnX7UޞMjuSAxHiQ,'wͱ 1}hW7q{UEݥ-rG*F>NNL7u]tNhWS;wE )b,#TTHy=)9>*QKr7P:MȡQ^s$LD6aȑ*s.$S56`>ƄmÁ#TL 5kd}WXssc*zRh/#? bE$L|ږ8^y>eSQc̯bV̯cNa'_OAJ195kd3EH@8ܰ%~As*=F 0`{RLPh33Y$LƹǬ oqMsȼ tx\ \cΜ-eksL ?"@>qhx ׷=l~1֍>*]!MBa endstream endobj 882 0 obj << /Length 665 /Filter /FlateDecode >> stream xmTn0C6U@"mTt@;olvR3ތm~<&YվI|+œ;t羋<]3;Wj|{}[ mmᆂMv{Kt=c_~B?zxoBS6wBJ)X7UaMuSxHiQV,4$O;nC-bD/OCnC_n^ѻs׽9X2Z.ET~{~ʶrn_~߼h!R,6ew*ؔb%k e+Kӄ$a"1x*s.$S56P>Ƅm„A Fs 5577vرϾ+uaя6R:!,əCxg+ѧy*JcL|*m:fvuiWUꧏɩ\g%<Ϛ"sÖ0_:3x0kjhyIYx0aCnOg3$cx0<<v5O#ܵu7A 6*sZ ZcΜ-ܠeYksL ?"@>qh|tngk;dGGM@c endstream endobj 686 0 obj << /Type /ObjStm /N 100 /First 948 /Length 6170 /Filter /FlateDecode >> stream x\YoF~ׯ$־'Y& жvZXd[j,Vk99uH ա SF=v 9k:+|Dꤠ^hOC(b;)8u2(K=SЪNECӥ4FJ`':#-(ughULgs-r~ ڋ>8VjE(B{E=ZP&ZvQEGT<!hZN:B9R:I@dXah(fhEfh#hMjg $"8K3$Fhq5a=2>Qce%*>0O#EI"8\"qjnD *O$f%} q$[K59G(@I5X<փD jpɨAͣ:DFFO}X%F`M5.PM!O!=: rH.RPD?JI"$ė`G P #28`څ*EHj:`<@"DaG]`bMg1"`18\P)}H=ϗˮ|q>ܼ[s83|Z.oӨ.hL'C ;zzy}qs~y}u׿xfaGAhAlD܃5[ѽ>9q:6{0_AG Jq3Y[ܪ-- Շ˫9/Iv?:X,? ]{d|=z#T5,ME:%A bӉpoD w0YABf02o"7"27#%*-ҍk"")g|;+TYC(-RT{+ru^vpanwDtұ_80M'aR#_JLil~kRFY\zd.⧩llKx"5G|g*YN8S6K| $?< Cc*ӒLv&l"˷]-"S*-VVJh0n-B6{F@StMsE^==(w %=udm%q3IDB. !\6Q\ \(lF#ɼb}qYBcaX-P2(x]-x`pږpk!%i+bu5`6k y,8VHvPXE"(2uҚYr8B'$vMt؇$]SRla7+( MOY aQ hyz:HDAD7 XPIHk6$Ҟ(Q2Y]/լʴjr j6F !Ă"qځ<DYxЃNb6aPg0+MfbZDX\2/R+QR|ƷZQb٨CɘdqJ؂s]Gxay lɞPtYrpGr; !A L=&1 Pg+'YF*s*t3A5orqX)X!a.a-=2/2+5Gms "{ 6yRȍTqz,QwMTm[ldzmг(9fEPS->NJTSME*9[[LHX$pdݛr.]8c9|rO'nW<U0nhL=ʽ u\#@~Y0⎋ّy*p0[}XPiAmN ZL^l;Z_r1JyOY`K!T|Ȥ#"h3pȯYgiqYgiޝF54/GF[DhOFxi'/3=F4@{2rE7 =<]hgG1fF?.T́B4*n*Sy#ŋWFJPMqs5 tr|\c7M795ȡx<(˞>jăOojcq/K[N~g9KM0M25}WMhP6qw+s:SFdG#8`t/ArC#+[O(Ҳ>CV7UCpX_,] N|q`[cH-KVxGY#^#^#^#;ch3ĝA& B5qg;h??6qg;bR'C#! eCl U(4 !kcPԪ(`h a^sUWDdѫeU3J|TWn^}brΨrcb(D kTEh5Gmu0.赍Z˽j+g.04i\bAo 'ʈQY$rDFq&톁1zIGJ-Zf?8]ewK"0 U,_fBLÊV &.u f^-\og3JNx#q5LHϘX^8cjQjTfKϪ0hIyfVMmCuIMsr=zy^d(&jvK7*MP h`rSRv SnEf|A%Caxh7H&ϓt|REӿ?of)u_㧄7[ҡ 1B{G48!`c|-2ѴޭƍܺzuZiwIc8Y_bZ[\^7ggdu}yFe/k=*[\g("x]f+qRœW_7X p[~ٿ[\//*euauZV$g7l1ɋlktVJ-r(Ӿ Ӎ AGS$ rX$',L !,EȲ[c f4^֪#>h5?hb1;-Ʉ*(:40 \F2nܷ9IރO6ӊ#%_!wW`d.(~ &)D_y_MMcʧ@6l%ބ($e5HM#!ʫ$y?@ 3H@H$54hC?DC F)<2m_g0ï3)^߃a+ O܄41HTz2lHjʗsZxLOS6j ʗ~Za᧐mȶbC~S;=,V'vêX]`muil 2W{ێS])@tW8J 2]o{$?n{ -(Ld]~{=TzqFH{t0 =}٩x=tϝNv::Q{! %/=` äWUtyL+Φo,;r;,}c{g3#%X]V^{8א\ǥ霾Vv&e.6mk;RlBk@,PUgŭ@Rz~[ Ϛ̭Zfu%Pe2ِur0dOu|N]сg_|œך|׌Zy=PThneaC3Q \c.=bY10A]G<s<1l_)0Sf:#VVʉ(S׉nsP橛fG j$iH tIXdJ?ـw3(Jqovl)f+ؾk >wn2- ]SL7#ɮ҆|$61ʟdfޚ]w3ķv1- Mq;-<s endstream endobj 915 0 obj << /Producer (pdfTeX-1.40.22) /Author(\376\377\000U\000l\000r\000i\000c\000h\000\040\000B\000o\000d\000e\000n\000h\000o\000f\000e\000r)/Title(\376\377\000A\000P\000C\000l\000u\000s\000t\000e\000r\000\040\000-\000\040\000A\000n\000\040\000R\000\040\000P\000a\000c\000k\000a\000g\000e\000\040\000f\000o\000r\000\040\000A\000f\000f\000i\000n\000i\000t\000y\000\040\000P\000r\000o\000p\000a\000g\000a\000t\000i\000o\000n\000\040\000C\000l\000u\000s\000t\000e\000r\000i\000n\000g)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240426122449+02'00') /ModDate (D:20240426122449+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) kpathsea version 6.3.4/dev) >> endobj 887 0 obj << /Type /ObjStm /N 38 /First 313 /Length 1519 /Filter /FlateDecode >> stream xڕXMo6W-X& @M8 99(k&,\6;#QڡDmГÙ7o+XTc0.4tI &̩`~&8r n&y*#NYN\Oҋ|9/\IS"R GAEb+tHD}س\4ۧ]vШ4ݮ3z DeBT/]]b}Ԫ>ϩ8 1N@#@) 3'`-4mΥ=1 ^оjnwuxѦnCڷ 0rkI/«2tʶy2&_B}ٖmSщ1>)$rr"9e}sUm B +,6%CvnABefW>4_g+Stg0Mn^w t8gyY>}8XYHZm}SC!i[|*#5-XsUE߇3kLlo:gs>tHr \Y{RP"[%%˧%# GqfМ|ΩDOPgbGJ\Ap]fߘT*YSeB38luƱ5Fz]u.^(]xlgxS=i.. ihxD7~C¹ ixSk-80х\4y$\'T5a_V;]ve|ߠ_~;tuߛ~Wp?sFcv/{p8L߭>AM endstream endobj 916 0 obj << /Type /XRef /Index [0 917] /Size 917 /W [1 3 1] /Root 914 0 R /Info 915 0 R /ID [<3F45541947C5CA366C68034044AB321A> <3F45541947C5CA366C68034044AB321A>] /Length 2435 /Filter /FlateDecode >> stream x%ytU~dxI^ B"d000`iuG,*hj:K}ի^)VW[gK;vvpι{wA|D`AhH"@m(Z 6 -I Ъ j&4jꀞhVs>heMCcT (GEp 'JT!h8B8 CkBLXNADXjf uhsN#Ѷm$ <m lh h ucX*@3Z5phES Ih(G86m5$0mЎm%T0 mte3-'f-A!r,<NeA֪.f],,W4Ᾱ9`wnƧT9h4g-VFK"ke EFð^]Y#-iG!"#vOÞg+-(88Q"쏨A*@--<ƕ0ɴϧA(4{OM @ KS C V(jaiy@I*JV 'mPRƬr9?GvZըn2 O= -ܴV}`kMk> w\i:.͞< 4l+z' GJaӷ*pǥ7[:q\ǷwV:vs|,u\qŎ+tʱۏ*[?ϱˮf8mq\rx}u(-txqs-LuP8[{}pI[xvǝ-tg>ltp<#}xfǏw~CFO19~og#/\}/8H6:~Yxizy`̿8|%vzfs\%|ko,rxEy|Aǻ;n?w|0nLJ1EN>GXjWo6Nn[`*5ZFY3Tj˛TmO4 4]8+k:sr좷Tj}Ri~Jik̺ߍ}^27;891mW3,sl%2;v-p\ݪN 2m{()P D (AER j@-PFF&>ps endstream endobj startxref 1158904 %%EOF apcluster/inst/COPYRIGHT0000644000176200001440000000055414170223535014532 0ustar liggesusersThe files src/distanceL.c and R/simpleDist.R are based on the work of others. The original files have been copied from the 'stats' package. The copyright of the 'stats' package is held by the R Core Team. The 'stats' package is distributed as part of the R platform which is available under the terms of the Free Software Foundation’s GNU General Public License.apcluster/inst/CITATION0000644000176200001440000000263614611430647014403 0ustar liggesuserscitHeader("To cite package 'apcluster' in publications use:") bibentry(bibtype="Article", title="APCluster: an R package for affinity propagation clustering", author=c(person("Ulrich", "Bodenhofer"), person("Andreas", "Kothmeier"), person("Sepp", "Hochreiter")), journal="Bioinformatics", year="2011", volume="27", pages="2463--2464", doi="10.1093/bioinformatics/btr406", textVersion = paste("Ulrich Bodenhofer, Andreas Kothmeier, and Sepp Hochreiter (2011)", "APCluster: an R package for affinity propagation clustering", "Bioinformatics 27:2463-2464. DOI: 10.1093/bioinformatics/btr406.")) bibentry(bibtype="Article", title="Clustering by passing messages between data points", author=c(person(c("Brendan", "J."), "Frey"), person("Delbert", "Dueck")), journal="Science", volume="315", pages="972--977", year="2007", doi="10.1126/science.1136800", textVersion = paste("Brendan J. Frey and Delbert Dueck (2007).", "Clustering by passing messages between data", "points. Science 315:972-977. DOI: 10.1126/science.1136800.")) citFooter("To obtain the references in BibTeX format, enter", "'toBibtex(citation(\"apcluster\"))'") apcluster/inst/NEWS0000644000176200001440000002133514612700255013736 0ustar liggesusersChange history of package apcluster: ==================================== Version 1.4.13: - updates and corrections of help pages Version 1.4.12: - changed e-mail address of maintainer - updated README.md and formatting of package vignette Version 1.4.11: - internal fix regarding a non-stable use of a class internally defined in the 'Matrix' package - updates of DESCRIPTION and inst/CITATION to adapt to latest formats Version 1.4.10: - minor correction of exception handling in some R methods - minor corrections of some help pages Version 1.4.9: - removed dependency to 'kebas' by rewriting the corresponding section of the vignette; consequently, the file inst/examples/ch22Promoters.fasta was also removed, since it is no longer needed - finally removed function sparseToFull() that has been deprecated since version 1.4.0 - correction of link to Affinity Propagation website at University of Toronto - DOIs corrected in help pages (therefore, the package now requires R version >= 3.3.0) - some further URLs corrected in help pages - removed change history from package vignette for easier maintenance Version 1.4.8: - correction of aggExCluster() C++ code - correction of link to Affinity Propagation website at University of Toronto Version 1.4.7: - correction of aggExCluster() C++ code to avoid compilation error on Solaris Version 1.4.6: - aggExCluster() now implemented in C++ instead of R in order to improve speed - further correction of conditional loading of package suggested by vignette Version 1.4.5: - loading of suggested Bioconductor packages now performed conditionally to avoid problems when building the package on some platforms that do not have the Bioconductor packages installed Version 1.4.4: - changed dependency to suggested package 'kebabs' to version of at least 1.5.4 for improved interoperability - bug fix in as.dendrogram() method with signature 'AggExResult' - added discrepancy metric to distance computations and updated src/distanceL.c to new version - registered C/C++ subroutines - minor change in the vignette template - moved NEWS to inst/NEWS - added inst/COPYRIGHT Version 1.4.3: - added optional color legend to heatmap plotting; in line with this change, some minor changes to the interface of the heatmap() function - corresponding updates of help pages and vignette Version 1.4.2: - switched sequence kernel example in vignette from 'kernlab' to 'kebabs' package - workaround to ensure that all apcluster*() methods are able to process 'KernelMatrix' objects (cf. 'kebabs' package) - replaced data set 'ch22Promoters' by plain text file (FASTA format) in inst/examples - bug fix in the heatmap() method - vignette engine changed from Sweave to knitr Version 1.4.1.: - fixes in C++ code of sparse affinity propagation Version 1.4.0: - added apcluster() method for sparse similarity matrices; as a consequence, the package now imports the 'Matrix' package and is now also able to handle non-sparse matrix classes defined by the 'Matrix' package. Moreover, similarity functions supplied to the apcluster() method may now also return any matrix type defined by the 'Matrix' package. - fix of apcluster() for dense matrices to better support -Inf similarities - added apclusterK() method for sparse similarity matrices - preferenceRange() is now an S4 generic; re-implementation in C++ to speed up function; changed handling of -Inf similarities for consistency with sparse version - added preferenceRange() methods for sparse matrices and dense matrix objects from the 'Matrix' package - new conversion methods implemented for converting dense similarity matrices to sparse ones and vice versa; consequently, sparseToFull() is marked as deprecated. - adaptation of heatmap() function for improved handling of -Inf similarities - adaptations of signatures of '[' and '[[' accessor methods - renamed help page of methods for computing similarity matrices to 'similarities' in order to avoid confusion with the accessor method 'similarity' - corresponding updates of help pages and vignette Version 1.3.5: - memory access fixes in C++ code called from apclusterL() - minor updates of vignette Version 1.3.4: - added sort() function to rearrange clusters according to sort criterion; note that this is an S3 method (see help page for explanation) - improvements and bug fixes of apclusterL() method for signature 'matrix,missing' - performance optimizations of apcluster() and apclusterL() - plotting of clustering results superimposed in scatter plot matrices now also works for 'AggExResult' objects - improvements of consistency of error and warning messages - according adaptations of documentation and vignette - adapted dependency and linking to Rcpp version 0.11.1 (to avoid issues on Mac OS) - minor correction of package namespace Version 1.3.3: - adapted dependencies and linking to Rcpp version 0.11.0 - cleared up package dependencies Version 1.3.2: - plotting of clustering results extended to data sets with more than two dimensions (resulting in the clustering result being superimposed in a scatterplot matrix); the variant that plot() can be used to draw a heatmap has been removed. From now on, heatmap() must always be used. - improved NA handling - correction of input check in apcluster() and apclusterL() (previously, both functions issued a warning whenever argument p had length > 1) - corresponding updates and further improvements of help pages and vignette Version 1.3.1: - re-implementation of heatmap() method: dendrograms can now be plotted even for APResult and ExClust objects as well as for cluster hierarchies based on prior clusterings; color bars can now be switched off and colors can be changed by user (by new 'sideColor' argument); dendrograms can be switched on and off (by 'Rowv' and 'Colv' arguments); - added as.hclust() and as.dendrogram() methods - added new arguments 'base', 'showSamples', and 'horiz' to the plot() method with signature (x="AggExResult", y="missing"); moreover, parameters for changing the appearance of the height axis are now respected as well - streamlining of methods (redundant definition of inherited methods removed) - various minor improvements of code and documentation Version 1.3.0: - added Leveraged Affinity Propagation Clustering - re-implementation of main functions as S4 generic methods in order to facilitate the convenient internal computation of similarity matrices - for convenience, similarity matrices can be stored as part of clustering results - heatmap plotting now done by heatmap() which has been defined as S4 generic - extended interface to functions for computing similarity matrices - added function corSimMat() - implementation of length() method for classes APResult, AggExResult, and ExClust - added accessor function to extract clustering levels from AggExResult objects - correction of exemplars returned by apcluster() for details=TRUE in slot idxAll of returned APResult object - when using data stored in a data frame, now categorical columns are explicitly omitted, thereby, avoiding warnings - plotting of clustering results along with original data (2D only) has been accelerated - all clustering methods now store their calls into the result objects - updates and extensions of help pages and vignette Version 1.2.1: - added convenient accessor functions to extracting cluster indices from APResult and ExClust objects - added a function for coercing an APResult object into an ExClust object - correction of color bar on the left side of heatmaps (default behavior of RowSideColors parameter changed with R 2.15) Version 1.2.0: - reimplementation of apcluster() in C++ using the Rcpp package which reduces computation times by a factor of 9-10 - obsolete function apclusterLM() removed - updates of help pages and vignette Version 1.1.1: - updated citation - minor corrections in help pages and vignette Version 1.1.0: - exemplar-based agglomerative clustering (function aggExCluster()) added - added various plotting functions, e.g. for dendrograms and heatmaps - added sequence analysis example to vignette - extension of vignette according to new functionality - re-organization of variable names in vignette - added option 'verbose' to apclusterK() - numerous minor corrections in help pages and vignette Version 1.0.3: - Makefile in inst/doc eliminated to avoid installation problems - renamed vignette to "apcluster" Version 1.0.2: - replacement of computation of responsibilities and availabilities in apcluster() by pure matrix operations; traditional implementation according to Frey and Dueck still available as function apclusterLM(); - improved support for named objects - new function for computing label vectors - re-organization of package source files and help pages Version 1.0.1: - first public release