RcppAnnoy/0000755000176200001440000000000014101037042012153 5ustar liggesusersRcppAnnoy/NAMESPACE0000644000176200001440000000022613132210432013371 0ustar liggesusersuseDynLib(RcppAnnoy, .registration=TRUE) import(methods, Rcpp) exportPattern("^[[:alpha:]]+") # export all identifiers starting with letters RcppAnnoy/demo/0000755000176200001440000000000012427557230013116 5ustar liggesusersRcppAnnoy/demo/simpleExample.R0000644000176200001440000000104612427546253016052 0ustar liggesusers ## cf the simple example at https://github.com/spotify/annoy library(RcppAnnoy) set.seed(123) # be reproducible f <- 40 a <- new(AnnoyEuclidean, f) n <- 50 # not specified for (i in seq(n)) { v <- rnorm(f) a$addItem(i-1, v) } a$build(50) # 50 trees a$save("/tmp/test.tree") b <- new(AnnoyEuclidean, f) # new object, could be in another process b$load("/tmp/test.tree") # super fast, will just mmap the file print(b$getNNsByItem(0, 40)) RcppAnnoy/demo/00Index0000644000176200001440000000005412427504071014242 0ustar liggesuserssimpleExample A first introductory example RcppAnnoy/ChangeLog0000644000176200001440000003731414101026216013736 0ustar liggesusers2021-04-13 Dirk Eddelbuettel * DESCRIPTION (URL, BugRreports): Added to DESCRIPTION file 2020-12-25 Dirk Eddelbuettel * .github/workflows/ci.yaml: Small tweaks to CI YAML file 2020-12-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.18 * src/version.cpp: Export as .annoy_version as we have an R wrapper * .github/workflows/ci.yaml: Add CI runner using r-ci * README.md: Add new badge 2020-12-06 Aaron Lun * src/version.cpp: Helper function to report Annoy version * src/init.c: Register helper * R/version.R: R wrapper * man/getAnnoyVersion.Rd: Documentation 2020-12-04 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/RcppAnnoy.h: Idem * inst/include/annoylib.h: Upstream sync post PR #522 * inst/include/kissrandom.h: Idem 2020-11-23 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/RcppAnnoy.h: Idem * .travis.yml: Switch to r-ci 2020-11-22 Dirk Eddelbuettel * inst/tinytest/testVignette.R: New test file * inst/rmd/: Moved from vignettes/rmd * inst/rmd/UsingAnnoyInCpp.Rmd: Allow for index file 2020-11-22 Aaron Lun * vignettes/rmd/UsingAnnoyInCpp.Rmd: Allow compilation of vignette without adding more dependencies 2020-11-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/RcppAnnoy.h: Idem * inst/include/RcppAnnoy.h: Additional typedefs for threading policy * src/annoy.cpp: Threading policy typedef removed 2020-11-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.17 2020-11-12 Dirk Eddelbuettel * inst/include/RcppAnnoy.h: New header file for includes and defines * src/annoy.cpp: Use new header file RcppAnnoy.h * inst/include/annoylib.h: Add a temporary define to identify version 2020-10-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/Makevars: Default to serial use (and C++11) but add comment to detail how enable multithreaded indexing * src/annoy.cpp: Default to serial use * inst/tinytest/testSeeds.R: Re-enable test 2020-10-18 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: Update to Annoy 1.17 * inst/include/mman.h: Idem * src/annoy.cpp: Idem, also enable multithreaded build * src/Makevars: Switch to C++14 for shared_timed_mutex * .travis.yml: Switch Travis CI to bspm use and focal * README.md: Update two URLs * inst/tinytest/testSeeds.R: Disable (already optional) test on seeding does not pass in multi-threaded mode 2020-05-30 Dirk Eddelbuettel * README.md: Add 'last commit' badge * .travis.yml: Switch to bionic and R 4.0.0 2020-03-12 Dirk Eddelbuettel * README.md: Standardize header and badges 2020-03-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.16 2020-03-03 Dirk Eddelbuettel * src/arch.cpp (getArchictectureStatus): Add simple helper function to show AVX and compiler status now that pragma has been removed 2020-03-02 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: Updated to upstream PR #462 which removes the (optional and no longer needed) packing and one set of warnings 2020-03-01 Dirk Eddelbuettel * inst/include/annoylib.h: Updated upstream PRs PRs #460 (which uses int not size_t in one interface) and #461 (which inlines two helpers) 2020-02-27 Aaron Lun * inst/include/annoylib.h: Replace two size_t interfaces with int 2020-02-25 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.15 * inst/include/annoylib.h: Use alloca() portably 2020-02-24 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: Updated upstream master post PR455 * inst/include/mmap.h: Idem * .travis.yml: Use r-cran-tinytest, no longer need edd/r-3.5 2019-11-12 Dirk Eddelbuettel * R/annoy.R: Small help page correction thanks to Bill Venables * man/AnnoyIndex.Rd: Idem 2019-11-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.14 2019-11-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * cleanup: Make safe for checkbashism by using only /bin/sh * inst/include/annoylib.h: New upstream v1.16.2 (plus up to pr436) 2019-09-23 Dirk Eddelbuettel * DESCRIPTION (Date, Version): Release 0.0.13 2019-09-22 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/annoy.cpp: Add unbuild() and onDiskBuild() functions * inst/tinytest/testOnDiskBuild.R: Add tests for onDiskBuild() * inst/tinytest/testIndex.R: Can now use tinytest::exit_file() * inst/tinytest/testSeeds.R: Idem * inst/include/annoylib.h: Use return code * inst/include/mman.h: Only conditionally define ftruncate * README.md: Small edits 2019-09-21 Peter Hickey * vignettes/rmd/UsingAnnoyInCpp.Rmd: Remove spurious comma 2019-09-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: New upstream v1.16 (plus up to pr410) * inst/include/mman.h: Idem * src/annoy.cpp: Add getNTrees(), use error message in addItem() 2019-09-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * R/annoy.R: Use a tempfile() in example to save + load an annoy tree * man/AnnoyIndex.Rd: Ditto 2019-05-12 Dirk Eddelbuettel * DESCRIPTION (Date, Version): Release 0.0.12 2019-05-11 Dirk Eddelbuettel * vignettes/UsingAnnoyInCcppWrapper.Rnw: Vignette wrapper with tip of the hat to Mark van der Loo for his January 2019 blog post * vignettes/rmd/UsingAnnoyInCpp.Rmd (vignette): Moved * vignettes/rmd/rcppannoy.bib: Idem * DESCRIPTION (Suggests): Remove three packages needed for vignette * .travis.yml (install): Idem * .Rbuildignore: Exclude vignettes/rmd/ from build 2019-05-10 Dirk Eddelbuettel * tests/tinytest.R: New test runner using tinytest * inst/tinytest/testIndex.R: New test file using tinytest * inst/tinytest/testAngular.R: Idem * inst/tinytest/testEuclidean.R: Idem * inst/tinytest/testHamming.R: Idem * inst/tinytest/testManhattan.R: Idem * .travis.yml (install): Add tinytest to Travis setup * local/: Old RUnit test files in source but not in package * .Rbuildignore: Exclude local/ from build 2019-05-06 Adam Spannbauer * R/annoy.R: Added documentation * man/AnnoyIndex.Rd: Rendered documentation 2019-04-12 Dirk Eddelbuettel * inst/tests/runit.seeds.R (test01seeds): Simplified 2019-04-11 Dirk Eddelbuettel * inst/tests/runit.seeds.R (test01seeds): Add tests 2019-04-11 James Melville * vignettes/UsingAnnoyInCpp.Rmd: Document setSeed 2019-04-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/annoy.cpp: Support setting of seed for KISS RNG 2018-10-30 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.11 2018-10-29 Dirk Eddelbuettel * inst/include/annoylib.h: Only define NOMINMAX if not defined * vignettes/UsingAnnoyInCpp.Rmd: Simplified by having C++ snippets typeset by pandoc instead of attempting OS-dependent compilation 2018-10-28 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h: New upstream version 1.13 past pr325 * inst/include/kissrandom.h: Idem * vignettes/UsingAnnoyInCpp: Renamed vignette, one size_t use 2018-10-17 Dirk Eddelbuettel * README.md: Added dependency count badge 2018-10-16 Dirk Eddelbuettel * vignettes/UsingAnnoyInC++.Rmd: Renamed vignette, minor edits * vignettes/rcppannoy.bib: Expanded, sorted (thanks, Emacs) 2018-10-14 Dirk Eddelbuettel * vignettes/rcppannoy.Rmd: Minor edits 2018-10-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version 2018-10-09 Aaron Lun * vignettes/rcppannoy.Rmd: Minor fixes 2018-10-07 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version 1.13 plus two PRs by Aaron and Dirk, respectively. * inst/include/mman.h: Idem 2018-10-06 Aaron Lun * vignettes/rcppannoy.Rmd: New vignette on using Annoy from C++ * DESCRIPTION: Added required Suggests: and VignetteBuilder: * .travis.yml: Added r-cran-knitr and r-cran-rmarkdown 2018-09-01 Dirk Eddelbuettel * .travis.yml: Switch Travis CI to R 3.5 repo 2017-12-16 Dirk Eddelbuettel * inst/include/kissrandom.h: New upstream version * inst/include/annoylib.h: Idem; plus some small changes to avoid g++ warnings, also sent upstream * inst/tests/runit.euclidean.R: Relaxed one '<' comparison to '<=' * inst/tests/runit.manhattan.R: Idem * src/init.c: Added new Hamming distance measure (via template) * src/annoy.cpp: Idem; plus more use of template type * inst/tests/runit.hamming.R: Unit tests for 'AnnoyHamming' * man/RcppAnnoy-package.Rd: Documentation alias for 'AnnoyHamming' * .Rbuildignore: Ignore top-level *tar.gz file * .gitignore: Idem 2017-09-25 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.10 * inst/tests/runit.index.R (test03getVectors): New test function * tests/doRUnit.R: Small edits and improvements 2017-09-23 Dirk Eddelbuettel * src/annoy.cpp (getItemsVector): Initialized vector (#24) 2017-08-31 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.9 2017-07-21 Dirk Eddelbuettel * inst/tests/runit.angular.R: Additional tests from upstream * inst/tests/runit.euclidean.R: Idem * inst/tests/runit.manhattan.R: Idem 2017-07-18 Dirk Eddelbuettel * src/annoy.cpp (RCPP_MODULE): New Manhattan distance module * inst/tests/runit.manhattan.R: New test file * R/annoy.R: Load module AnnoyManhattan * src/init.c: Register module boot function * man/RcppAnnoy-package.Rd: Aliases for AnnoyManhattan 2017-07-17 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version annoy 1.9.1 * inst/include/kissrandom.h: Idem * src/annoy.cpp (Annoy): Update call to match updated interface * inst/tests/runit.angular.R: Update three tests as the returned distance metric is now the square root of the previous value * .travis.yml (group): Added per Travis blog 2017-07-14 Dirk Eddelbuettel * .travis.yml (before_install): Use https for curl fetch 2017-07-02 Dirk Eddelbuettel * README.md: Use alternate for img.shields.io GPL-2+ badge 2017-07-01 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/annoylib.h (>): Ensure we write as binary 2017-04-09 Dirk Eddelbuettel * src/init.c (R_init_RcppAnnoy): Call R_registerRoutines() and R_useDynamicSymbols() * NAMESPACE: Use .registration=TRUE on useDynLib 2016-10-01 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.0.8 * .travis.yml: Switch to using run.sh for Travis CI * README.md: More canonical URLs * src/annoy.cpp: Use unsigned int for vector size * src/annoy.cpp: Added index admissibility test to addItem() * inst/tests/runit.index.R (test02badvalues): New test 2016-09-29 Dirk Eddelbuettel * inst/NEWS.Rd: Added 2016-09-28 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/annoy.cpp (RCPP_MODULE): New List returning functions from #12 2016-02-02 Michael Phan-Ba * src/annoy.cpp: Added explicit destructor 2015-11-17 Daniel C. Dillon * src/annoy.cpp: Templating Annoy classes * inst/include/annoylib.h: Ditto 2015-11-15 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.7 * src/annoy.cpp: Changes to adapt to new Annoy interface 2015-11-14 Dirk Eddelbuettel * DESCRIPTION: Rolled Date and Version * inst/include/annoylib.h: Upgraded to new version from Annoy 1.6.2 2015-05-26 Dirk Eddelbuettel * DESCRIPTION: Rolled Date and Version * inst/include/annoylib.h: Upgraded to new version from Annoy 1.3.1 2015-05-03 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.6 * inst/include/annoylib.h: Upgraded to new version from Annoy 1.2.2 based on our pull request (and fix) to support supplying an RNG * src/annoy.cpp: Supply R's own RNG instead of the default of rand * .travis.yml: No longer need BH, and install Rcpp via PPA 2015-05-02 Dirk Eddelbuettel * inst/include/annoylib.h: Upgraded to Annoy 1.1.1 (which no longer needs Boost) * inst/include/annoylib.h: Replace rand() with random() * src/annoy.cpp: Call save() + load() with use const char* arguments * DESCRIPTION: Roll Version: and Date:, remove BH dependency * cleanup: Clean a bit more in src/ 2015-01-22 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.5 2015-01-21 Dirk Eddelbuettel * inst/include/annoylib.h: Synced once more with upstream; this version addresses the UBSAN runtime issue 2015-01-10 Dirk Eddelbuettel * inst/include/annoylib.h: Synced with upstream repo 2015-01-06 Dirk Eddelbuettel * DESCRIPTION: Bumped Version: and Date: * src/Makevars: One char correction requested by CRAN Maintainers 2014-12-07 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.4 * DESCRIPTION: Added Depends: R (>= 3.1) as need for C++11 prohibits deployment on R-oldrel 2014-11-17 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.3 * inst/include/annoylib.h: Updated to new version from Annoy 2014-11-16 Qiang Kou * inst/include/annoylib.h: Added Windows support for mmap * inst/include/mman.h: Windows implementation of mmap * src/annoy.cpp: Add two #undef needed on Windows 2014-11-16 Dirk Eddelbuettel * README.md: Updated to note CRAN package, possible Windows port 2014-11-15 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version 2014-11-14 Dirk Eddelbuettel * inst/include/annoylib.h: New upstream version with templated int * src/annoy.cpp: Updated for new Annoy library 2014-11-13 Dirk Eddelbuettel * DESCRIPTION: Version 0.0.2 * inst/include/annoylib.h: New version with verbosity toggle * src/annoy.cpp: Added setter for verbosity 2014-11-12 Dirk Eddelbuettel * .travis.yml: Enable binary index test 2014-11-11 Dirk Eddelbuettel * inst/tests/runit.index.R: New test against binary index * inst/tests/data/test.tree: Binary file used by test * inst/tests/runit.euclidean.R: Added more tests 2014-11-10 Dirk Eddelbuettel * tests/runUnitTests.R: Added RUnit unit test caller * inst/tests/runit.angular.R: First set of unit tests * inst/tests/runit.euclidean.R: Idem * DESCRIPTION: Added Suggests: RUnit * .travis.yml: Added to enable Travis CI 2014-11-09 Dirk Eddelbuettel * inst/include/annoylib.h: Updated to new version from annoy 2014-11-08 Dirk Eddelbuettel * DESCRIPTION: Initial version 0.0.1 RcppAnnoy/README.md0000644000176200001440000000467013766202257013463 0ustar liggesusers## RcppAnnoy: Rcpp bindings for [Annoy](https://github.com/spotify/annoy) [![Build Status](https://travis-ci.org/eddelbuettel/rcppannoy.png)](https://travis-ci.org/eddelbuettel/rcppannoy) [![CI](https://github.com/eddelbuettel/rcppannoy/workflows/ci/badge.svg)](https://github.com/eddelbuettel/rcppannoy/actions?query=workflow%3Aci) [![License](https://eddelbuettel.github.io/badges/GPL2+.svg)](http://www.gnu.org/licenses/gpl-2.0.html) [![CRAN](http://www.r-pkg.org/badges/version/RcppAnnoy)](https://cran.r-project.org/package=RcppAnnoy) [![Dependencies](https://tinyverse.netlify.com/badge/RcppAnnoy)](https://cran.r-project.org/package=RcppAnnoy) [![Downloads](http://cranlogs.r-pkg.org/badges/RcppAnnoy?color=brightgreen)](https://www.r-pkg.org:443/pkg/RcppAnnoy) [![Last Commit](https://img.shields.io/github/last-commit/eddelbuettel/rcppannoy)](https://github.com/eddelbuettel/rcppannoy) ### What is Annoy? [Annoy](https://github.com/spotify/annoy) is a small, fast and lightweight library for Approximate Nearest Neighbours with a particular focus on efficient memory use and the ability to load a pre-saved index. [Annoy](https://github.com/spotify/annoy) is written by [Erik Bernhardsson](https://erikbern.com/). See its page for more on features, its (Python) API, and the other language ports. [Annoy](https://github.com/spotify/annoy) is part of the esteemed _let us find other music you may like_ algorithm by [Spotify](https://github.com/spotify/). ### Why this package? It provides a nice example for Rcpp Modules and use of templates: Annoy uses a clean C++ core with templated data type, as well as several distance measures. This package shows that it is easy to wrap both aspects from R giving us multi-lingual approaches to data discovery and machine learning. ### Status The package matches the behaviour of the original Python package in the original Python wrapper for the [Annoy](https://github.com/spotify/annoy) library. It also replicates all unit tests written for the Python frontend, including a test for efficiently `mmap`-ing a binary index file. The package originally built on Linux and OS X, and thanks to a patch by [Qiang Kou](https://github.com/thirdwing) now also builds on Windows. ### Installation You can either install from source via this repo, or install [the CRAN package](https://cran.r-project.org/package=RcppAnnoy) the usual way from [R](https://www.r-project.org). ### Author Dirk Eddelbuettel ### License GPL (>= 2) RcppAnnoy/man/0000755000176200001440000000000013763265274012755 5ustar liggesusersRcppAnnoy/man/getArchictectureStatus.Rd0000644000176200001440000000077513627327743017745 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/RcppExports.R \name{getArchictectureStatus} \alias{getArchictectureStatus} \title{Report CPU Architecture and Compiler} \usage{ getArchictectureStatus() } \value{ A constant direct created at compile-time describing the extent of AVX instructions (512 bit, 128 bit, or none) and compiler use where currently recognised are MSC (unlikely for R), GCC, Clang, or \sQuote{other}. } \description{ Report CPU Architecture and Compiler } RcppAnnoy/man/getAnnoyVersion.Rd0000644000176200001440000000113213763265274016373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/version.R \name{getAnnoyVersion} \alias{getAnnoyVersion} \title{Get the Annoy library version} \usage{ getAnnoyVersion(compact = FALSE) } \arguments{ \item{compact}{Logical scalar indicating whether a compact \code{\link{package_version}} should be returned.} } \value{ An integer vector containing the major, minor and patch version numbers; or if \code{compact=TRUE}, a \code{\link{package_version}} object. } \description{ Get the version of the Annoy C++ library that RcppAnnoy was compiled with. } \author{ Aaron Lun } RcppAnnoy/man/RcppAnnoy-package.Rd0000644000176200001440000000134413465270642016542 0ustar liggesusers\name{RcppAnnoy-package} \alias{RcppAnnoy-package} \alias{RcppAnnoy} \alias{Rcpp_Annoy} \docType{package} \title{ Rcpp bindings for the Annoy C++ library for approximate nearest neighbors. } \description{ Annoy is a small library written to provide fast and memory-efficient nearest neigbor lookup from a possibly static index which can be shared across processes. } \details{ Details about Annoy are available at the reference listed below. } \author{ Dirk Eddelbuettel for the R interface; Erik Bernhardsson for Annoy itself. Maintainer: Dirk Eddelbuettel } \references{ \url{https://github.com/spotify/annoy} } \keyword{package} \examples{ # Optional simple examples of the most important functions } RcppAnnoy/man/AnnoyIndex.Rd0000644000176200001440000001252713562654000015311 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/annoy.R \name{AnnoyIndex} \alias{AnnoyIndex} \alias{AnnoyEuclidean} \alias{Rcpp_AnnoyEuclidean-class} \alias{Rcpp_AnnoyEuclidean} \alias{AnnoyAngular} \alias{Rcpp_AnnoyAngular-class} \alias{Rcpp_AnnoyAngular} \alias{AnnoyManhattan} \alias{Rcpp_AnnoyManhattan-class} \alias{Rcpp_AnnoyManhattan} \alias{AnnoyHamming} \alias{Rcpp_AnnoyHamming-class} \alias{Rcpp_AnnoyHamming} \title{Approximate Nearest Neighbors with Annoy} \description{ Annoy is a small library written to provide fast and memory-efficient nearest neighbor lookup from a possibly static index which can be shared across processes. } \section{Usage}{ \preformatted{ a <- new(AnnoyEuclidean, vectorsz) a$setSeed(0) a$setVerbose(0) a$addItem(i, dv) a$getNItems() a$getItemsVector(i) a$getDistance(i, j) a$build(n_trees) a$getNNsByItem(i, n) a$getNNsByItemList(i, n, search_k, include_distances) a$getNNsByVector(v, n) a$getNNsByVectorList(v, n, search_k, include_distances) a$save(fn) a$load(fn) a$unload() } } \section{Details}{ \code{new(Class, vectorsz)} Create a new Annoy instance of type \code{Class} where \code{Class} is on of the following: \code{AnnoyEuclidean}, \code{AnnoyAngular}, \code{AnnoyManhattan}, \code{AnnoyHamming}. \code{vectorsz} denotes the length of the vectors that the Annoy instance will be indexing. \code{$addItem(i, v)} Adds item \code{i} (any nonnegative integer) with vector \code{v}. Note that it will allocate memory for \code{max(i) + 1} items. \code{$build(n_trees)} Builds a forest of \code{n_trees} trees. More trees gives higher precision when querying. After calling \code{build}, no more items can be added. \code{$save(fn)} Saves the index to disk as filename \code{fn}. After saving, no more items can be added. \code{$load(fn)} Loads (mmaps) an index from filename \code{fn} on disk. \code{$unload()} Unloads index. \code{$getDistance(i, j)} Returns the distance between items \code{i} and \code{j} \code{$getNNsByItem(i, n)} Returns the \code{n} closest items as an integer vector of indices. \code{$getNNsByVector(v, n)} Same as \code{$getNNsByItem}, but queries by vector \code{v} rather than index \code{i}. \code{$getNNsByItemList(i, n, search_k = -1, include_distances = FALSE)} Returns the n closest items to item \code{i} as a list. During the query it will inspect up to \code{search_k} nodes which defaults to \code{n_trees * n} if not provided. \code{search_k} gives you a run-time tradeoff between better accuracy and speed. If you set \code{include_distances} to \code{TRUE}, it will return a length 2 list with elements \code{"item"} & \code{"distance"}. The \code{"item"} element contains the \code{n} closest items as an integer vector of indices. The optional \code{"distance"} element contains the corresponding distances to \code{"item"} as a numeric vector. \code{$getNNsByVectorList(i, n, search_k = -1, include_distances = FALSE)} Same as \code{$getNNsByItemList}, but queries by vector \code{v} rather than index \code{i} \code{$getItemsVector(i)} Returns the vector for item \code{i} that was previously added. \code{$getNItems()} Returns the number of items in the index. \code{$setVerbose()} If \code{1} then messages will be printed during processing. If \code{0} then messages will be suppressed during processing. \code{$setSeed()} Set random seed for annoy (integer). } \examples{ library(RcppAnnoy) # BUILDING ANNOY INDEX --------------------------------------------------------- vector_size <- 10 a <- new(AnnoyEuclidean, vector_size) a$setSeed(42) # Turn on verbose status messages (0 to turn off) a$setVerbose(1) # Load 100 random vectors into index for (i in 1:100) a$addItem(i - 1, runif(vector_size)) # Annoy uses zero indexing # Display number of items in index a$getNItems() # Retrieve item at postition 0 in index a$getItemsVector(0) # Calculate distance between items at postitions 0 & 1 in index a$getDistance(0, 1) # Build forest with 50 trees a$build(50) # PERFORMING ANNOY SEARCH ------------------------------------------------------ # Retrieve 5 nearest neighbors to item 0 # Returned as integer vector of indices a$getNNsByItem(0, 5) # Retrieve 5 nearest neighbors to item 0 # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list with an element for distance a$getNNsByItemList(0, 5, -1, TRUE) # Retrieve 5 nearest neighbors to item 0 # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list without an element for distance a$getNNsByItemList(0, 5, -1, FALSE) v <- runif(vector_size) # Retrieve 5 nearest neighbors to vector v # Returned as integer vector of indices a$getNNsByVector(v, 5) # Retrieve 5 nearest neighbors to vector v # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list with an element for distance a$getNNsByVectorList(v, 5, -1, TRUE) # Retrieve 5 nearest neighbors to vector v # search_k = -1 will invoke default search_k value of n_trees * n # Return results as list with an element for distance a$getNNsByVectorList(v, 5, -1, TRUE) # SAVING/LOADING ANNOY INDEX --------------------------------------------------- # Create a tempfile, replace with a local file to keep treefile <- tempfile(pattern="annoy", fileext="tree") # Save annoy tree to disk a$save(treefile) # Load annoy tree from disk a$load(treefile) # Unload index from memory a$unload() } RcppAnnoy/DESCRIPTION0000644000176200001440000000220014101037042013653 0ustar liggesusersPackage: RcppAnnoy Type: Package Title: 'Rcpp' Bindings for 'Annoy', a Library for Approximate Nearest Neighbors Version: 0.0.19 Date: 2021-07-30 Author: Dirk Eddelbuettel Maintainer: Dirk Eddelbuettel Description: 'Annoy' is a small C++ library for Approximate Nearest Neighbors written for efficient memory usage as well an ability to load from / save to disk. This package provides an R interface by relying on the 'Rcpp' package, exposing the same interface as the original Python wrapper to 'Annoy'. See for more on 'Annoy'. 'Annoy' is released under Version 2.0 of the Apache License. Also included is a small Windows port of 'mmap' which is released under the MIT license. License: GPL (>= 2) Depends: R (>= 3.1) Imports: methods, Rcpp LinkingTo: Rcpp Suggests: tinytest URL: https://github.com/eddelbuettel/rcppannoy, https://dirk.eddelbuettel.com/code/rcpp.annoy.html BugReports: https://github.com/eddelbuettel/rcppannoy/issues NeedsCompilation: yes RoxygenNote: 7.1.1 Packaged: 2021-07-30 16:52:34 UTC; edd Repository: CRAN Date/Publication: 2021-07-30 18:00:02 UTC RcppAnnoy/build/0000755000176200001440000000000014101027122013250 5ustar liggesusersRcppAnnoy/build/vignette.rds0000644000176200001440000000040114101027122015602 0ustar liggesusers] ][D]`!A[kJE~yu(IMR!ŭP4q46NʵR "Zn.sϸ6ޒfh<*UNϠ$8;~XBE鑓7,J\ٙ&ρ* p܊o$iQ4fpK2_%K]'6Q_4HcK;3nwӄ{ fXRcppAnnoy/tests/0000755000176200001440000000000013465603623013335 5ustar liggesusersRcppAnnoy/tests/tinytest.R0000644000176200001440000000070613465565351015353 0ustar liggesusers if (requireNamespace("tinytest", quietly=TRUE)) { ## Set a seed to make the test deterministic set.seed(42) ## there are several more granular ways to test files in a ## tinytest directory, see its package vignette; tests can also ## run once the package is installed using the same command ## we need version 0.9.3 or later if (packageVersion("tinytest") >= "0.9.3") { tinytest::test_package("RcppAnnoy") } } RcppAnnoy/src/0000755000176200001440000000000014101027122012740 5ustar liggesusersRcppAnnoy/src/arch.cpp0000644000176200001440000000164513753267105014412 0ustar liggesusers #include "RcppAnnoy.h" #if defined(USE_AVX512) #define AVX_INFO "Using 512-bit AVX instructions" #elif defined(USE_AVX128) #define AVX_INFO "Using 128-bit AVX instructions" #else #define AVX_INFO "Not using AVX instructions" #endif #if defined(_MSC_VER) #define COMPILER_INFO "Compiled using MSC" #elif defined(__GNUC__) #define COMPILER_INFO "Compiled using GCC" #elif defined(__clang__) #define COMPILER_INFO "Compiled using Clang" #else #define COMPILER_INFO "Compiled on unknown platform" #endif #define ANNOY_DOC (COMPILER_INFO ". " AVX_INFO ".") //' Report CPU Architecture and Compiler //' //' @return A constant direct created at compile-time describing //' the extent of AVX instructions (512 bit, 128 bit, or none) //' and compiler use where currently recognised are MSC (unlikely //' for R), GCC, Clang, or \sQuote{other}. // [[Rcpp::export]] std::string getArchictectureStatus() { return std::string(ANNOY_DOC); } RcppAnnoy/src/init.c0000644000176200001440000000226413763265274014104 0ustar liggesusers#include #include #include // for NULL #include /* FIXME: Check these declarations against the C/Fortran source code. */ /* .Call calls */ extern SEXP _rcpp_module_boot_AnnoyAngular(); extern SEXP _rcpp_module_boot_AnnoyEuclidean(); extern SEXP _rcpp_module_boot_AnnoyManhattan(); extern SEXP _rcpp_module_boot_AnnoyHamming(); extern SEXP _RcppAnnoy_getArchictectureStatus(); extern SEXP _RcppAnnoy_annoy_version(); static const R_CallMethodDef CallEntries[] = { {"_rcpp_module_boot_AnnoyAngular", (DL_FUNC) &_rcpp_module_boot_AnnoyAngular, 0}, {"_rcpp_module_boot_AnnoyEuclidean", (DL_FUNC) &_rcpp_module_boot_AnnoyEuclidean, 0}, {"_rcpp_module_boot_AnnoyManhattan", (DL_FUNC) &_rcpp_module_boot_AnnoyManhattan, 0}, {"_rcpp_module_boot_AnnoyHamming", (DL_FUNC) &_rcpp_module_boot_AnnoyHamming, 0}, {"_RcppAnnoy_getArchictectureStatus",(DL_FUNC) &_RcppAnnoy_getArchictectureStatus,0}, {"_RcppAnnoy_annoy_version",(DL_FUNC) &_RcppAnnoy_annoy_version,0}, {NULL, NULL, 0} }; void R_init_RcppAnnoy(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } RcppAnnoy/src/annoy.cpp0000644000176200001440000003040313755472005014612 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // RcppAnnoy -- Rcpp bindings to Annoy library for Approximate Nearest Neighbours // // Copyright (C) 2014 - 2020 Dirk Eddelbuettel // // This file is part of RcppAnnoy // // RcppAnnoy 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. // // RcppAnnoy 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 RcppAnnoy. If not, see . // simple C++ modules to wrap to two templated classes from Annoy // // uses annoylib.h (from Annoy) and provides R access via Rcpp // // Dirk Eddelbuettel, Nov 2014 #include "RcppAnnoy.h" template< typename S, typename T, typename Distance, typename Random, class ThreadedBuildPolicy > class Annoy { protected: AnnoyIndex *ptr; unsigned int vectorsz; public: Annoy(int n) : vectorsz(n) { ptr = new AnnoyIndex(n); } ~Annoy() { if (ptr != NULL) delete ptr; } void addItem(S item, Rcpp::NumericVector dv) { if (item < 0) Rcpp::stop("Inadmissible item value %d", item); std::vector fv(dv.size()); std::copy(dv.begin(), dv.end(), fv.begin()); char *errormsg; if (!ptr->add_item(item, &fv[0], &errormsg)) Rcpp::stop(errormsg); } void callBuild(int n) { ptr->build(n); } void callUnbuild() { ptr->unbuild(); } void callSave(std::string filename) { ptr->save(filename.c_str()); } void callLoad(std::string filename) { ptr->load(filename.c_str()); } void callUnload() { ptr->unload(); } int getNItems() { return ptr->get_n_items(); } int getNTrees() { return ptr->get_n_trees(); } double getDistance(int i, int j) { return ptr->get_distance(i, j); } void verbose(bool v) { ptr->verbose(v); } void setSeed(int s) { ptr->set_seed(s); } std::vector getNNsByItem(S item, size_t n) { std::vector result; ptr->get_nns_by_item(item, n, -1, &result, NULL); return result; } Rcpp::List getNNsByItemList(S item, size_t n, int search_k, bool include_distances) { if (include_distances) { std::vector result; std::vector distances; ptr->get_nns_by_item(item, n, search_k, &result, &distances); return Rcpp::List::create(Rcpp::Named("item") = result, Rcpp::Named("distance") = distances); } else { std::vector result; ptr->get_nns_by_item(item, n, search_k, &result, NULL); return Rcpp::List::create(Rcpp::Named("item") = result); } } std::vector getNNsByVector(std::vector dv, size_t n) { std::vector fv(dv.size()); std::copy(dv.begin(), dv.end(), fv.begin()); std::vector result; ptr->get_nns_by_vector(&fv[0], n, -1, &result, NULL); return result; } Rcpp::List getNNsByVectorList(std::vector fv, size_t n, int search_k, bool include_distances) { if (fv.size() != vectorsz) { Rcpp::stop("fv.size() != vector_size"); } if (include_distances) { std::vector result; std::vector distances; ptr->get_nns_by_vector(&fv[0], n, search_k, &result, &distances); return Rcpp::List::create( Rcpp::Named("item") = result, Rcpp::Named("distance") = distances); } else { std::vector result; ptr->get_nns_by_vector(&fv[0], n, search_k, &result, NULL); return Rcpp::List::create(Rcpp::Named("item") = result); } } std::vector getItemsVector(S item) { std::vector fv(vectorsz); ptr->get_item(item, &fv[0]); std::vector dv(fv.size()); std::copy(fv.begin(), fv.end(), dv.begin()); return dv; } bool onDiskBuild(std::string fname) { char *errormsg; if (!ptr->on_disk_build(fname.c_str(), &errormsg)) Rcpp::stop(errormsg); return true; } }; typedef Annoy AnnoyAngular; typedef Annoy AnnoyEuclidean; typedef Annoy AnnoyManhattan; typedef Annoy AnnoyHamming; RCPP_EXPOSED_CLASS_NODECL(AnnoyAngular) RCPP_MODULE(AnnoyAngular) { Rcpp::class_("AnnoyAngular") .constructor("constructor with integer count") .method("addItem", &AnnoyAngular::addItem, "add item") .method("build", &AnnoyAngular::callBuild, "build an index") .method("unbuild", &AnnoyAngular::callUnbuild, "unbuild an index") .method("save", &AnnoyAngular::callSave, "save index to file") .method("load", &AnnoyAngular::callLoad, "load index from file") .method("unload", &AnnoyAngular::callUnload, "unload index") .method("getDistance", &AnnoyAngular::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyAngular::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyAngular::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyAngular::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList", &AnnoyAngular::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyAngular::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyAngular::getNItems, "get number of items") .method("getNTrees", &AnnoyAngular::getNTrees, "get number of trees") .method("setVerbose", &AnnoyAngular::verbose, "set verbose") .method("setSeed", &AnnoyAngular::setSeed, "set seed") .method("onDiskBuild", &AnnoyAngular::onDiskBuild, "build in given file") ; } RCPP_EXPOSED_CLASS_NODECL(AnnoyEuclidean) RCPP_MODULE(AnnoyEuclidean) { Rcpp::class_("AnnoyEuclidean") .constructor("constructor with integer count") .method("addItem", &AnnoyEuclidean::addItem, "add item") .method("build", &AnnoyEuclidean::callBuild, "build an index") .method("unbuild", &AnnoyEuclidean::callUnbuild, "unbuild an index") .method("save", &AnnoyEuclidean::callSave, "save index to file") .method("load", &AnnoyEuclidean::callLoad, "load index from file") .method("unload", &AnnoyEuclidean::callUnload, "unload index") .method("getDistance", &AnnoyEuclidean::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyEuclidean::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyEuclidean::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyEuclidean::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList",&AnnoyEuclidean::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyEuclidean::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyEuclidean::getNItems, "get number of items") .method("getNTrees", &AnnoyEuclidean::getNTrees, "get number of trees") .method("setVerbose", &AnnoyEuclidean::verbose, "set verbose") .method("setSeed", &AnnoyEuclidean::setSeed, "set seed") .method("onDiskBuild", &AnnoyEuclidean::onDiskBuild, "build in given file") ; } RCPP_EXPOSED_CLASS_NODECL(AnnoyManhattan) RCPP_MODULE(AnnoyManhattan) { Rcpp::class_("AnnoyManhattan") .constructor("constructor with integer count") .method("addItem", &AnnoyManhattan::addItem, "add item") .method("build", &AnnoyManhattan::callBuild, "build an index") .method("unbuild", &AnnoyManhattan::callUnbuild, "unbuild an index") .method("save", &AnnoyManhattan::callSave, "save index to file") .method("load", &AnnoyManhattan::callLoad, "load index from file") .method("unload", &AnnoyManhattan::callUnload, "unload index") .method("getDistance", &AnnoyManhattan::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyManhattan::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyManhattan::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyManhattan::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList",&AnnoyManhattan::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyManhattan::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyManhattan::getNItems, "get number of items") .method("getNTrees", &AnnoyManhattan::getNTrees, "get number of trees") .method("setVerbose", &AnnoyManhattan::verbose, "set verbose") .method("setSeed", &AnnoyManhattan::setSeed, "set seed") .method("onDiskBuild", &AnnoyManhattan::onDiskBuild, "build in given file") ; } RCPP_EXPOSED_CLASS_NODECL(AnnoyHamming) RCPP_MODULE(AnnoyHamming) { Rcpp::class_("AnnoyHamming") .constructor("constructor with integer count") .method("addItem", &AnnoyHamming::addItem, "add item") .method("build", &AnnoyHamming::callBuild, "build an index") .method("unbuild", &AnnoyHamming::callUnbuild, "unbuild an index") .method("save", &AnnoyHamming::callSave, "save index to file") .method("load", &AnnoyHamming::callLoad, "load index from file") .method("unload", &AnnoyHamming::callUnload, "unload index") .method("getDistance", &AnnoyHamming::getDistance, "get distance between i and j") .method("getNNsByItem", &AnnoyHamming::getNNsByItem, "retrieve Nearest Neigbours given item") .method("getNNsByItemList", &AnnoyHamming::getNNsByItemList, "retrieve Nearest Neigbours given item") .method("getNNsByVector", &AnnoyHamming::getNNsByVector, "retrieve Nearest Neigbours given vector") .method("getNNsByVectorList",&AnnoyHamming::getNNsByVectorList, "retrieve Nearest Neigbours given vector") .method("getItemsVector", &AnnoyHamming::getItemsVector, "retrieve item vector") .method("getNItems", &AnnoyHamming::getNItems, "get number of items") .method("getNTrees", &AnnoyHamming::getNTrees, "get number of trees") .method("setVerbose", &AnnoyHamming::verbose, "set verbose") .method("setSeed", &AnnoyHamming::setSeed, "set seed") .method("onDiskBuild", &AnnoyHamming::onDiskBuild, "build in given file") ; } RcppAnnoy/src/Makevars0000644000176200001440000000106213743414424014453 0ustar liggesusers ## Multithreaded indexing for Annoy (version 1.17 or later) ## requires this define to be set ## USE_MULTITTHREADING=-DANNOYLIB_MULTITHREADED_BUILD ## and also requires C++14 for std::shared_timed_mutex ## CXX_STD = CXX14 ## So to use multithreaded indexing, comment out the two settings ## above and make the CXX_STD below a comment. Note that it may ## alter your result (or their order) slightly due to the use of ## multithreading ## Default builds use no such define and C++11 CXX_STD = CXX11 PKG_CPPFLAGS = -I../inst/include/ ${USE_MULTITTHREADING} RcppAnnoy/src/version.cpp0000644000176200001440000000054413766143544015163 0ustar liggesusers#include "RcppAnnoy.h" // [[Rcpp::export(.annoy_version)]] Rcpp::IntegerVector annoy_version() { return Rcpp::IntegerVector::create(Rcpp::Named("major")=RCPPANNOY_VERSION_MAJOR, Rcpp::Named("minor")=RCPPANNOY_VERSION_MINOR, Rcpp::Named("patch")=RCPPANNOY_VERSION_PATCH); } RcppAnnoy/src/RcppExports.cpp0000644000176200001440000000142013766143621015755 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include "../inst/include/RcppAnnoy.h" #include using namespace Rcpp; // getArchictectureStatus std::string getArchictectureStatus(); RcppExport SEXP _RcppAnnoy_getArchictectureStatus() { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; rcpp_result_gen = Rcpp::wrap(getArchictectureStatus()); return rcpp_result_gen; END_RCPP } // annoy_version Rcpp::IntegerVector annoy_version(); RcppExport SEXP _RcppAnnoy_annoy_version() { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; rcpp_result_gen = Rcpp::wrap(annoy_version()); return rcpp_result_gen; END_RCPP } RcppAnnoy/vignettes/0000755000176200001440000000000014101027122014161 5ustar liggesusersRcppAnnoy/vignettes/UsingAnnoyInCcppWrapper.Rnw0000644000176200001440000000042513465634510021423 0ustar liggesusers\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{Using Annoy in C++} %\VignetteKeywords{Rcpp, Annoy, R, Cpp, Approximate Nearest Neighbours} %\VignettePackage{RcppAnnoy} \begin{document} \includepdf[pages=-, fitpaper=true]{UsingAnnoyInCpp.pdf} \end{document}RcppAnnoy/vignettes/UsingAnnoyInCpp.pdf0000644000176200001440000060002513755562056017733 0ustar liggesusers%PDF-1.5 % 39 0 obj << /Length 5661 /Filter /FlateDecode >> stream x\m6>txA/ay}qn8)(=LQ@SU===L4*/O"X|,^ B-_E24p5f#^g/B ?Q^dױ\\G[T7Ke"ﳪ/M_қ}DY [uf/"XDHB/pH᳴WÀ2wv-"#CKTx|Bjscʅ1j/y1,eb<{6 0Jp` sao"An۾|ֻ x~Vo^|}!D]~u$?v"uu^˛pqw!B/@(rjs*&c@EY# ^{xD#;xx7jܵ95 \j햂kwmyaS2i`Tnİ oM`@fS~J٦f}U'c߬Exy:`Ff&P[M(d R *i!U>M+]rmxє^g`qqAe_ X086I ft ;Iޏk`kXᖝ ,KQhc?J"^ {uLt|G & ;hWhzzfЫM e=&Ni20)Nz@yg~*|Pf$?AZͪmjD6{.`V-9f[曼P)U+_ ЇmB4BQhmOTݺwkP7Э`%E4w(_g~Xjh\zMw5٧x2 -;܇q1}8=?3C?Tjܸ9$|jW;Ѽ|,'D5e,ORI?D`x(jҲj}ciVۼ`7OZi+ΨXܽ~MzG 9NI( mx, ՞M^YK^] SV ۠^qGrي/>Ot2P $i?=9L{4)蒾pAnr䥥&:tσ#:*M[L]^$C>SV1) [B2j@(͸7jB Tۡ>շbOs$R 2ؠub?1F[8q(_ϯo^ E - ŮˢʏBd#~y_^,CP'uЇ6LNɌ!!@2o]QTG۴(ӫZŊyQKQYDVԪ= [v݇VjCG3^a}N  px&S e4:ڲ,A{!L`5WjUttiI&|a,o[ ~AGG#0* ݪxqϳX1d|iP 8a +onzV yExp0>ިr $B3gDhh+:9R2ؤϠX~pq/]>nd{*6~8Ѐ+$*C" %hO /glF=:YC(hh٤YSTmMb+xi9[2<Yhc$䪾k6 \ )_C? )!xjwV @WMSs jBؾɏS | iԴ m͚~wuSFxՎ"^xciSt/R@eRwEZD8,.OIP *S]ʔ-h-D}"r:pѱH%D'ILj -xe .5IB2 הdpK17 yi:d)#w. DLʗ?#0"&W"?f h{+=$bXsx o5Dv^5iիo~/\!䡖Tg10C|,ڶxfWE^G5ł )Yl>[O)%a:Mrʇa{o0MRQ'Z]H?&mxz}nj0:lc887񤗁:`Qmҏn}Z: ȴ:TFx)cЋi?l$ERҖvT*th0 )#i~P]7{}!W_1 dc~|OUC#d1U4let♣fyja M(Ƽ)*fST "E^.;Pd}.î⌙zzw穀 %M76CS frn_劊D=hS"=U C7Uhz8}$90o(q"Ǵ<>x˾1!P.]OȆ%hLixҡ@^dܚ|z9#5] %k$m5?9VQO{ʻ sTh`m)9|.Dbu,Վ,{b_na"|-O8I]=1 .VF V'oEJ2 C,_݇|kWLY JXNoV(A9#/_mvMy`$wSY; ƍ6GZo&HV%60}D_< @^q(O-whI+fLEq(\d7Ud)Ԡ.w~Wb!:3PeUGmf0$^̭{㞸M4cH'da 3а?|\"$!?_nǏ4Ǐ' tD8SZ6qm?1 @| W|QAo&2gkIXPХx,7uSt[s Z7$1kxjR ,4~LZb&#:gnk E g_8:T> ٤+%}hܢ_c~8dhQ@Ueoʩ${sH@m8PlzϨd.*Ioy p#8(nrz XEl*,ovYծ?-CxՋ4HP{:m镉uC_v{~Iz Mj_:*pT7xh7,5iX.G1I2,#zomzKCԱOK2ARw&2͌_y$1>v0Ml;GDnA&S Bv! =NKw 5d>Hm⫕a';@2gDR&40QӕS 5޸jwosǺM%42Q=Q'.K(iq#"+|Qp ܗhfHyGz_:> &'Y7R&0t9ʴV#qڄ7nQ#&WP-}j:Pa"|}6$˹ʾYnw+eo}jKwȸ]btͮXj4 SD#EAhV?K[yUz]9aj0aR[*;~x{u9M~u8C]9 ܇q`/&S9?}.~xȅ)՞jY]9X6~[Χ؏8|Q7U3}-J ;|iIMܯbAԢQ& lޅ9d EA:l9Y.31LO6B09,O91(6NqiBtg' :a\H!|&EuϱA*#bA АSIaϵ70s$b? Q+Cq =&`U h,m_cỦ&M'#$ -5`֠,/L?Y͋`7'W~!_dŏ{s=Jߋ sBI =xEߚ;"  aB endstream endobj 76 0 obj << /Length 3632 /Filter /FlateDecode >> stream xZmo8_O +")Rtm[lz([u+K^IN~=|EŎm{ڈ!9|8zM^EI7 !D$qt2_>A( YDU߻_0_+iИērrDcZ˝-!Q5@8=W*⒣ahJԺ>fQJnV Fҋ9ХZa&X7u!{:' 6?,WFBLj$LD2&J@EBēm$ibr#hӧ7?Oy #L-^!IqGWTin'Ngʋe|,E{ -f׋_>w_mw}:>VUcFkxbWi? 1jjt2^7 A{|kX+CKqyǺ[+dvs8iz iUaJƺMCP ,H& K+=Dp$!d\뺚AwArFtC&`E/לw*4*} if6EY .sS!"qY [u0J22 l.u9 2oZ2KQ(,<1w ֚Qyxl^~MPFEHdlƨ⺨%"VYkEHK.M͖1<)֔Y= af䝲s gI_ÔƔ1Uh")w* Ԍjj̳rgG:V$85ʺQJDnmt>P6v23_ q BPsO qF: P϶j8v3G7hs%uw ltaYb 6Ig8EX$,ش,KQ!Q"cy@9M^EՔ%ƍ:Iaޔ S̝ETD`EbMb[^9`^Wmț+jv}؎vSvviqcPowD&]g+yV7, `/wv %)BC@3qdWn:;ҭ;rT @LZ>o8nfY ܹٯ8J'#LӐem3+ҁ$ ;}kœ৫Qs;/[[LE֛n(xܬhdѥ=dd+6aVJґo=:߲R*MOtjT mo"lvjźo`x92]Ly7Pʚ#ukYR]YգUWtE:jq:[2&*S-?#g$diinjP!Ժȯ27r]4vT :k`U4oPҩc9p8FߩKkgsT{"]hr#E8{0b82۴]qQ|7 .\$vo$<`2&ڧ > eLQ\Ap. Xa2vTˮ2Ӄ"z2kO@hSdPll>4ξu47vp~e*܆"tF޺A:;i n'xuow%N: z5JƄc[cHv*S, p88mʐ)4mX)Ci媬O{ A &8z0 L%%l;/k?yumuP[P-Uk┅lRşӽ'ơ&, ]ygыJ?ﻻ|A!CF{]ѝYd!֖咟|f pf=AV9҄@_PX_0I9̍pTؕtu/=l6M#J"khjJ/6irܘLjQ]MQ~|w?5H%0t1$ڮ j}5TJDFX_M+^U]浭7~2GYi?vKvq'Y" WޙsSI<8kX19 & P}Fb>o7шub"Ô  I?1v2 h%Y'?FNi}=cK?ϯ$ `7tiHw ^H >`L9TˬY Iܤ&* =yfG<&ԗES8 N$TFsg<\F] 5E؛Gq\[;4':ʛp-ac#8'ӓVں*Iy! WG6}X&\'4eyD0qKüxҝ}TSg +ȤzQ* LluH2 _]O8m$ɤrL2߃1 ΍( 0 Ll Q 0ӳg$vȰS\X({HzhAI2tlp>%$/B&`9B]>f Y(N(E<HdH@4~EQmzfiH38HiƶUX,k68-ˬ07/4xl)o wmz`N7<ߴgelxBHMrohcD/`}h!lUeJZL|˯ޠ> stream xڝwuT[}-b-V P ݭ@w(.EkZ8ܴ'}{we%=3{:ju-6 KsԙN 9C g@ Pupp@!nD$!pg=@ a {]q (bnۀ-n0[`gHaKk0+@E$agp0ljC! ;%A0?p:Z95]MUUm4@SAN^[ mVn  dmb @ZDgЁYH.v8 spà]߁ E: " D`g E p0d Bi(+ l\F &#Uy"tg  9gD~P_UdpkVwAxD O EAV.^ďBL? Y8;8APΈt' .^,wh! `dE02K=1r19\\Ҙ#ܡX\j1B4!W]@v?ĄY:@<`+,Ugp?n¿?e]TAU$,?bo ' gb$ֈa. q[C-lV ;=ׁZav(X/l\! ##9-'9 PO,'ݫ 0dB8">yeR%j= `u_h/6.>>}CwA0l5;`,Op[~J |6WBQ%[X\ȭV9+׏$7DZ.fcXeZ\G: Er&'PK9 $^-_r6oFW͈3N wvY&C5dtҕLca/5Z)t'o2Y|nACxGUlCV-|xmٔF?v35vi!g ZÉm\z⮆w- =f졊 _$ehJy6HIVfq>• L[Y+f%0HH:~UDX'2\堮Y(=(RUS0T л@Y\P׳h5g#TLU p~2עkw D,~$P ?2 H q[aQL3A7g~N6kz++k[w[~0Fȑ,6e55Sz$.28J~o筪3ԡb 7̼+~Zk3[,bSˆpU'y{klR˃& 3/Dٿ1>]VX=Z-+ ^j" ;cʂn_@ ]:茦~֬c x`B]0KC䗤{nH3Οga4߁~G}Ph!Q~QZlͿ{}Uޒ*:ˊ?G@mDF.UnJ+!,Zt2Ym5Cg9ӵ*f!(w&@j4kHƏln,Z.e.6?RmMQ4CfqtlV4z~Ҝ Ԋ,VkeqՠvԈϞb/Uz㹝\L6ytq̠e<:7x1U >?$vz36N{G GC˯kmBU{>1 (]&h;qM rZ)Tx[yKy\NoQ[ 乲8]t{Jyg.K楢,P rI4َhsqx$VSqVTH{`[~U#-OӍnYuoRMy 圵Ԣ,ߋ]Sv,4Hg{]/tĘ[!(kd,k\@@z'#ur+` 977 x;NkB'e\=[͞ع;s ,!5'$"Y#T*ur~#ȝxNfEE_Y(}hQtYaY ͂s62rdOHEN&wȜˤ0~y .{X%SǤB}QRJO, ǺPA*Ù>g3Ad/Acd#Ex_hN 6kḫݯG j!B~'K=uk[(d|sp]B9ܘJ{ ɈCܸ=z%VhwO549_zp5gu:hq:|"RmVU`eU"Ĵ{-)RsQSEoG9>?{l+}#T)a+_u}f~mbeXnL΅E ٺs'VG 3ҋET$"^@_\2)ݰЈ&GnfE!ѧm&E[qLoU/Sh mb}O׏j.ܩAٜ/yxag<5:C>mnr Ǩ'0(-:M4CFT7#ΨE\Dy  $FtE-Q5kPUToXYx(2{gLHMd;?%ے0٭Kk;W\{OqߙXv EF+vOVV2_ 3Yh&yVMVUme0+9U{| V2:(΅  -4NʓOGyl:e)EC9} ^NL  L-:s#2e ٴ|i]v+<-1lK"돝PRTa}} 1슡ݤr*Z!@ՋhOk &/KZi&\F-9:6G>:Ka+aw^a.C,?[V#Ve?L>t4@[bXtyE©.Rj=C}UW!544MF"j e^~RCbr7o lg x ./)2Ԡ'H6}Wz7&i= "R;Ɉ9ćQ.wZiD;+ 讱KbZKհZRujC(1!=*%GJ+f:Jgkg| s΃f1cq|vӇwV L52l039<7mp3ϋ9>ĐҦSdik$;' Ϛ^B[Ht +yih&53_>ׄC[Z\a~χ #,¸9m?^j@ꈭ/Ѣy<)jYbzIDMQ ݃՛=hid$_w|ޕ$/%ӦY٢cR ItO ,Z!W%cx_~[qeWj.Ӑ#`Gw6ig2Ka92m:WMN-ײ(uBuhֈ {>=JҐsޮ$~"M3(k&!u__E-5=SҙU=VtKuՔLL 3^߫Bj\g~GHe\#J=}m2ԉ!u܍p޺nn~tQmͮ ؊% Bg)ցZ rĤ/DB(ECQeUCMs^VJ+`JN4y' b+iI1V AB&pbg%NϷ^~'(.WnLqǸjig<_Z#aoRBtr}=:=$-[KfRǺW"M)MXb^ rEce?R/}8QP%4Nm^\7%C.ja&=XZ)[OH'(ʉIй.M3c=FE-2-%T]NUP)[a„2HY7iWAj8 ~K~Q 㻌gb147p1X7nՒW dWHDTLҤn4$ORS2~rb*(lwfo}Ջ!ַiztfn|hMę=$| )/XVG{Y DT'x"3 XZ޻fjzFɭ&e <"Ƕ^OQY[*w7VDF-.J0ё4%Hٍi4 pvOuqd&=yW6# >/)z7CoY:H ?70:pLLc8-u.5P .f ֗Oѥf RAd@| ֟?ͺ 4LeB-D2x&>9|ҡԮ+oY`!2R} lJ NSbQ'ZZ2fį鍱H/ieLbzX2=ܫyj fl!9#z a+oA 6UA<oXL2֤>ދ;3T6hdˍ|++L<9f8MO?DUU20x9l. #=/N7'&Y}G2>բ"nn:_>Mkk%hzQϷ>#h;Xn%ZNu٩k}Gâp1T?C|n^;-8?}dQA0JYJY>P   |OO_¤/>D%*w9<&ˌNMgղQaCW?6"ESЇGt6M@ڵ} ^`H/0t ӯH()76afxSYd}*]{Z-Uls0<8kbk",ڼRIMn tjDHLrlvXW9r->!egIObb>AB!HCtxw&%ݜ&Na%qk)4J(:x9[Clvcw~-Q}%N@Tc}`+D*)+%lY7"9/`&.+uFRsv+xA2&!SpژL̡ 2axaT,^*k@1s-O4'|W.= bP/ -Rȍ=cm!.y2'VZV<"^/cGT en{.>q1RA%\睬Ϲ*9DGsUx!vhЮ)%R|5QO*6>HKZTwrl% ߪG;lPd-6Wq\kˇ4`1n?|:E @zkҭ-)]z6h*&Òz*ix%`nqe+!;l&yKů~dV3 + #mz։| |d7躩NTrF˩,XJ]"j'#,99aSiDu|.xktZ#?P+Fy")-uܠz1SڃEcK x7nͥB_ &`6(;0ԯ_QEs!/;s;BՊiԨ~qNl ޽fbȉn l g=pwZ㱢6=ep+&8᭒vnZ_{xXfj];nOjmҧmA3S endstream endobj 103 0 obj << /Length1 1454 /Length2 15343 /Length3 0 /Length 16352 /Filter /FlateDecode >> stream xڝst-v*;6:SQŶm験tԱmcӱO;?F^kϹ0~LYI\bbcfEw67Y;%A)gkY\@uOGs ]  p:YXm& )3#@Ҝ $jglbfn/668:;8:[= < VҔTUTTTJʈKJTe}[Y\,@gfƦ@ϥ'g bdhgmo)3kS;OϜAVi7sggؘ2|$.@s1,?D6-F)QU;3;;֔@U0d/?[ƎgbYA?[?,5J(I/'ag fu @k#y!x>?9Y썁M}J^ e}A!+;';'g-]@Ο$337Tg6}el2}6bgfg>)v3s Eg?gu0''2vr5eovi Ih$ڲv07SZ,>hb0s*Mm..nMj?o,b:R 3p1u&UO 5}?+@V* 4u0Z~ sFsx3}F `cqsw(SWg׳g =MVLbF>Ӻ87| (C ll4ߔjIL׉X40nM8E ?H!&;ƗM}Rx`Aio=,o\B;>?dzcT"p4Xj̑3HtQ&֜ Yx·ezi3XE+jD 4nD%Ft gSg%mS.V4x_&ie8h> 4~h9}&̼7b eLGoߌ4.;ю&6T ٵN>av$EP/RI"< D3!eX@+1.Y%jl$b<b>OzNH6cjTN=yцig|͏n^sL ފ= [FsOgш%s)0 X֗Å^Ia@zB3̏2 dVP]{a({XDzkGrGa30B9M4:!|i[Z]?XvujB$a,^m5JӬL\˷xU&4rz3^ECQ?$<~t?*h#f@Ҧ;ouroLT=YSk~‘!N>Jnalc8.1z(9j l@&b㡧HuJr.i^VSHU8J6hIۭlߏ:M>'t `BRebXܲH%#VOQJX|o-ohN|!_ziZR]Q[g\+K˛gˠN(2[o!W㒚ToDdJޑgY[iڌwi/j%3MBI]LLSYsFKX8Ѕf"RM ޜFGTQwy7Y)ʌS")\OF~\l.a.bj:Gpr~8vZSJ[(`;dUR&4)ԈO>(MzjexǨItc~kk!>cpf J07oDIW&eE{)uЅ܍Ch8= 2i{ e ;ٻVLT]J<?c!È:POCu/QRRg(L!>D(kp_(8lα)jP:.5a:q7wJ~3O㾷Ё^&{|vP5X='RF#(O$dK/[/n%"8 Ud I@=`ZRE$aՌۅLF=o/1N ЫdRDMVfER([!+"KE+ b܅w5@u49e6*Sn{E7*;U 9"G5LC$khԨI׎L3}P`z5;Y,9"*J+GnZaP"bYNJKS L{#U59E*[Qَ-w 9tR˰mQs~bd87K5*ET^^m{W;Dx]s5aUY:[g:-o7 p> ̋vM`ء58xvR}P#NZo*88 |X?/3i-s9ʐIEsϻQ;^o7JLfO$ƠaD'!Z~Uch|urՒN8)Stl0f?6ۚ#~e*sCLZЦպ FtOQB;CLgy7H@ۓfYku\`Ewij7EFJ4fRGHj9o h)6PL;+O^nwEzpi jlj$]mcysXf=0l bl[uAPY(rc<ұ$mf(,fܯ͠1w HRvyfyq÷1AQhS7_t1ev*.p':ܘ0GV5  9ǼOJ~TǕ? !xo!$DJ4 9q/[_fbQ2^6AKSN۟Zv]I›H%R+wz_?/ju´W%UK効KrK97QEzWl"*H1p&e]-+7S  coș[EGo)ыy.}e%=!*xGZG3`;5s'zyRiKmz ?S$,.{YIľѮ{MyܗG74B -%+"EUN%9ţ" DУnu鸋ר5v~aY˃JUQ*(!\ޭ'Dd\GaN4>fQ~j6,+Rx : yx~ a09ěE fo_]Oz D^a k}T< :0Nc.]6*Sxa74I\L ա'F.Z#)YUJ*B7$DϕdjHm?yټcNJãf l:'c7wL5$4]Mr,h a߬-:*߀qͯ 8ޜn/xٮGNM!)ɽM81A1 R{e3 ]MhIx#Uʡ;aǎ\?N+( ~ ?[DŽųAgk ?DN΂H_z{.ٙ#eɏcn;F6.˩/ {۸5dЬC8_wbREYc-g/Ja34VmGq/}jVI[=U&ymtAڊ?\Zw(yY^8;m{^ WRGhHj{w;|F 6܈o~{^h]]_m)Ctzݽi_) 5qq"W%`NO a7$#L̟uIAQIY#/o~̱e9nYg4R;&|Õ +ǨWP-JO69c2|J-ltA :Em5ݕ7 U=CHцm.kj<{N2=JfdѧŊ/bAuV4)ZjiC{_ XRUьe:)0B?N>e"^P#z/##:3K:|"uK/_{'+v'j37~Z?X%J3"}*̪?e"4xj&SzTxe!3ֵV72Ps>$JBڠ=f$=!CpFfmT/N'7yx׌|%c@gHl&!,vnDS#J/ ,5k[X} BU'½mgFJ8w^+K{$/:vgr/(]vK3US/IRU-IMAYη3˭2##NUEZc5b Zc+KȖ~iܫ=p`Of>twg{oJilPNmXWD ߸FˉR|7Ӹi*fZ54|rVXvF,&%[a4UM"MÝsOX`p[LE0ʩs1fy6ݦz `hfWX;:VYDFGȵpp~;pW!8hlt=w71|+l4d%Wrs9 nd|7p7.8ia4rڬx_Cg8oHIv6lAԏCT"8R0}A'*ėO).6oh;keN Bo0F̳ MD|-/?[ɰAP^ O {&lfVQW]bS])]|tLg%n>:W}6pXՠBA{n \Pi{4W[\\C |cza~/ܾև71ӓvhֶLҳw;Y0ׄhN:&kZ_/*P'̃gQoRZާ?=&^ۭjuPOIo?lh|ǕTCWصFo=?Lm3D]c9tuCTDo3`)MlK\]CŶ^fdƯVRR'CH݀bN`R*)vD{yX{V?13W;7Fk(U'UV2p*xˢ,ʏ3j%~b(L i1 5X5C>0"MP wMUet"4,>=u*]ǟҡ_3!8i^[e5agÐ98]^)+KH9Gi]O0ڶȏ1SK Xa)j{Y7o.,]Wh_.P̲0a=yv0hG8oXu%Vs!@hkUBՕ&5Evkv PvG `uHt1^b @*{o3?&$uw2~WV1!A_A-L|ä$xAuwa rp`na ԡ ?fNHaOptޞ{nָ|ٽs.?J+|Q 5Ks@GE0{OYBs d+U;PzPZ=S|Mf.ql9!tlT Y`zE6<,wzU֘j9R̺"q u@x\-WsΗN 76=ZR)^G|a[|Lbvބ$2_~ UY ,x mbvBȞʁkʝϜ&g*aK_& %b8IgS+J$ZD.St7)auQf)s$/qJ aK);QXgN'`nRn ÅWz}i!W_a[Jզ'eK$ }? g'o[r1k$p]s絝~2y)Y rv<!q l ؂ u~ Z֓x܎BzVۓ )meS.O )՟uYSgW7|^ cH9&CLPˢ6@}ܩ^~ש }^dNvόWu=Zw)yӶkw᪃ v~lMR-epVuc2'ܿZ({V !ы,QpQy5quI_it~aKqF>+\`bVEB.={qmr ¾&8[ϫwO"L(i^SC``E@ *r"mTV]ߣʲ<=}d{zjt+UmP%^R[!U.:_~ u>P$ʵVާD{xuڰqLgrП't畯FWP/ޏ{gpay 'y +q?Jޮڿ ug$J)#{F4'Fͫ%*V,W:R&Pu?HzZKk9·*!$;4SG0)i b17d*e\ƒ rFT/dRY:Km}qCL^'XnKWow_9Cd_ w32Jȅ{NJ&$4f'x̶G18\~V7WA0(w$/D~!=i!綝>lS0,M2B*: :2S t;?bbFa/5EgCk;s9:sJQn.YVx}c[M|1Ue$#XV d(ɗWnE3+"~L\g37e!א0-iVĽ䕧D7fou{,YA߂E,-1% Rlt0"A֠jUs̼sHg$j@8i}Hi(ooC'ǟ6}q8S M m>vH\?0d: HndW )>\@*7K$Bوw۵+dIʬF~ {;ag0-=fA)(ĠLћ\$ IR a+;qvP TGڛC;@JUɤ@2Yd{k6=0;]',mswJA%=V~fEu_vǘuD_Тwx\_n0>6,7瞪j/twߍȸ/5Ep;$}\tUg$P*p;Nַ6kjvEqTCmCϜSecXWHB ` B01(!GjD#9'N"f6hf`Pm 6^KKU2vkyRONJBO'{guwoIKFh2RtQLpWW`4RJ)$P`}K2CZl<,J4'o5uM| f~~8i!!']#,rx+ƹ~q̧ͱjjKrGC6#-(Y+h?ȗ^(Lb+R_us7;K3l)p®feS<TՔAנy2B7RGYB^!2lH:A[p ;($#-(4e mX7$hT),o9jL^(ϖf_D@Ґ+|I H KJʗERI.~VqOLA_IDʧ^ڀY1+ACT]<-4n@ojPҔe {>j<<<>)#zH,tC/⥗>,oFBFv.L.JuV L}3; -!wU_"&_aޠmE <>~ki۸_ {YN.B[4zb3pnYÆ|bq8fMan@YUsA#q軱0MV+knv$EU U~huyڥhdH(ΣZ ڠrڄ{%DPAvZüs/?s\#-Ϻ%gLI҅K/hCΆPsA nw;' y]?GY̔X% ɏ==kd6)BEy|̌K "D9hTü?@kUb%q}rV .]xlmfmP7# ^ bj3ϕ!,1 fT2ba͗Oj X7;7T -vzc{^f& h~Rg6ӭ.v!]M M*F\e+Xأ&PKhOoܦs5[$(åyǟ?dQn! Ӭ܄Jh\+ݞSX$8*P}X jKMDZ]=N,F;lۜ|‹Ϻnp C9LF=N5ܴ L#szpᐋ' u2k<ҡGHte?-uZ 8{#FtdN ֵi#4fCTdPo*5dԆV^?G2?+M㝯aTMLB=\#]yuRg@>Oٴ/~ U8}LpM6CsJcڻwrp\.!@1)XBzrq0~zy-X]D#bλ*3ڽB`ٹo.;"bki ӭ}>V riF99!OYwZQmpȜ~W'2.=Wh9o^.5lHYg=n$\UN..eZ&qOmfC vb}/NIZ2~SB :-*!&]]ryWAN%c H88Z@lj $ʶ&_8,c7ɿ|L.+QZ!/c=QU2GKg{+,{5i^c ǽ(G)XYm::;kViMmv /;mL_Rx|FRSMS3nOݘ# yI 9OP,(Y4!rwfe5MVhp7Tїpvhz#W.Cތl' Vz¾G> ̡L6ScI5&&.ĦcB)}+M4Db?禾YUa&GWwmUR4φUB< UR1QJ=iXoMX]xcyHW}ao=K}$Y_Mj)E@[ WtXTP#_T u܌u|\ \"qFuS52yᘨ SB!wjC%xPZ2Gޠ>ɼ(?h֫sޘu}, ƐU"?eu endstream endobj 105 0 obj << /Length1 1468 /Length2 9434 /Length3 0 /Length 10416 /Filter /FlateDecode >> stream xڝvuXT}.H %݈3C % !!!Hwww t>w93kZ׽b_ g-ZTn~>\E :+Y!@u%%7H?G }F^. ?@Y9!P/7`X9ܜ]ܬ!p;9/ ug.5 qyH򎎀Hp A@`䌀X9"!`^cC@@]HY `fd1p(aHe`+h 4"oݑ!0H@7GR0qݐH;@9;!Yۃ đ"0͟H8Y98CaH>X$2X@ 4xDl66Oʋ 1Q?y؁V.vD>J P__t/'I?DHB`B #/Ȟ8%cC?DّH  urvC6,O1/@`pi!1C>~!Y$ж8C6I9Y!')Ϗ5Hwg\?s ul .?ĎB@W@6&QQ PvV0j: aqWdOmŏ,/ ;9ύ #Cn7??lqp&r٢ x5u5 8#}#/7=+3ۋm_VeCϏtD~6P 9uon,Bq1>q;_Hy + ylpf6j7/sca=zo4e~9ɯ7 @Q*3½mvww¨[jN<ÇE5* zk)Ub*ئ(8<|XozZZg|$4lVs)qZنD\֛qv;{ މERX*.p1zqto p^#{& g{Nz8.חe(rǒ( WBi4fz'{zr"/~LLbe5Nt,aR9c{tׇoߘi .J&Ka›G(4ͯ{ĩd:0<(W%ā:I__d)?q&Ph\;Pj|y§l:)9qASs-lifi>I<[J6#}J@G'3GW.YUQsChWwjc^ $ ta!Sә˳4.Mcjm:l-zol*\? 9vUhn+G+xo#Q2./PV[-KK[<}l2+ykR?ǏX '8T>!5NB\hy;7?J(b6IC,!2KfQ1fiG">U^.S86yb ?6پrpgj m'CZc6f .Ƒ7 hP[qAPøaAs4|vieWABKtuYH_9K$[Dy|7<1I׋?dX0+ acwSaEzK$ᬳFy;v˸(?׹nj.ţc/n3vC80Ք5xO}W+ 4lG-g7\{pKVMQxDﭤK U76:B twX͘4Rzufqk xwFKB^+:BX eؿ9u!<RcB +B=Sץ`MtaPfyYF>D|?Sf4完FI>ڪ׸xg=;mC{yiU7^5f` Ʊ{K%\)M!aPnƣz#@bmo쌄 dx&@J0 4%6χ`+lyP9=n\GbLUد:SȺs\uxcd싦 Q. +ŻP Xg 4Q7 T^˱]xjgfNY4Ig]Ύ3E$hN鴘='nqoJ{7^E h F #)y1_w%Wy.}}!f)!}T2/Mw-F W^'5̍;s/AkXTعLa4 ?}W{2$DPlG1 86amF5#|m^~lCsP"x0״`{,q- WAѼǠ?ҹOߧ[@u1)uD q:S5/n13}cu*lۛ)Ll^y4 +L&e ߼YD_HTJ7YXe7 {}bDZ(tofڂ_ڟmM2!<\6luX ;ʿIß/V J҉l?2^o>R(r{tbWvP>Cx*QykNg<W7{Eu'A?ʞzRc.EX7b#%yXMpP^xVZxLK꾓OB}7FBq7194L=u9"x'$i5تf_3Svtdwdw\hBM#2BjDxhEXH>|鳭^,ߏPG\ْ jrV触66M\>GY>y{HoT}SOUC"IZ9A(ZtT'8^Y ~i&VbmKqCXe!i j|& BOyGQ>nmf*$<υ<esL޼c\zh8Uus+ #1> oЯHYZxa/,z*uV? x<+Ȣj|}сO5?k^gŬuhUnUGI!~ANSjei0Viux|QY&С`%V\EwYEFM`LT>+f7 Y]?~u+ՊL: *$~e*";L)Ra}gqM"r6bM޲ܕ v6z:v)((ow.2ޢ*_KF\,C{¤pð)} ʄ0/qƢߋաOf W,QB2э֜/BɆMe"6K 4w2w>3J}|ؤS2,ڲ hQeOކպ᪂Uw^;2'u+ ьmcUR3gSh$:3n2k#"oG$\eGݓ[]{nEJ5E HnXlִyFu< J#-~AtblrQso7.4kZ?ͷ=mw#Uߴ)z+5hgڰ r#FJC#NA'(3T=~)/GRNjRTM&\5%7'Ny Ǔk2('F(gvĨF@Rg}Z5 .I&c436<9b-mԖemK`)݃M:7&Rh)gw*Mjk\ICU`l}&`-X~:>>=X1F<z)8ҟddS_h}q [/m%ue,3MI{`I_{Fg N(%C\li(8o̡i J-Zj,JX1jRA"䰻}MqQD9ւ5*<[fGD415FXH2-$&jk̨e2Q$%t]PD^gҬWӈ|FmK`Sߢ7Mkw*TY2{QN=K0.迣^-y*&х,(-FGMϣx铧yQqP^59&քK/j>AW2,'NwƦ08F1 @qVN%0i:Ji|pAˎ#iqeRi 9"*&G^ njvqKy%z6;gyó Ĵ<VHK}á[;8++],zM$ ni˕8v*aySM֥ ilbɈbJ}&(?._ndk}Iݏţ/;<&VgA‚5X+1SO$<;n+О?K?Vyx0|FQ&%5<]bΊ v."iI^L˅g\)^ cv2G-q|"[ʼ9 ~YsN׻9x|x2Y$X۸`ra=kx[ը 9`+_11ePEdS/j5<2e< bPfDif'f=.ׯ#fm{ѳ{k] jovʅ"ٚb;m`3ۮOڻ옰ar߆"uߟFS3=?lbh\?dcnfz|y=׀%V6-[U1љ?%Ke,T%&qcqgيh7PvmïvW›U*I cc_fv&:-Vźv)떌 $K"([GqY*t]5{] "ƓV\kig8~BoRjqDҘLbSDnTqw iP早$ _R9eNs}u+齟˶8LG+Q&RӢ:+F [;`F[uIk1T/wXt~ ݻ8 zQP"w:'-E'Pr2\x)(eJ[knhygٽq`Ilq{11ik yTQN _4Ir;rI^ LSR*Z=URAH_8 j\r_~vN{h9H,ͯçʋu=Hgv,Ukcd?Ֆq=o3CW3U G2=(^HǀWFcL4Ub Nʌ[\{џ  {ǰ)P\1}$8 $f[' M-xwqVr]^Ja$N W1kaUVQ`yv-} NX0S6'~uMB="uB/Nߕc5vJN Ϯ~U+%m8Pfc{:qzT3x'7..#!B$W-(qEބi>s˛O?"9 oSJ;Fp?W anl_3 뽖}mo\YDofq+h~M&;8{ջV *1v ^?,r5VO3~xJ`k?- K`P1(XϫQ8Ddp\d8~dSvvUB!P۫iXo[@:XLWo yXt+jOڒc4ے׶S8H] 1lo @^ڷlԿ;/o#e]UZH-&u@ٛҁ87t\8- w7X2Wi^fJ)FE46̲o]r5F. l]|vȣH+=g;γP9>HS3 ڞxV.q ~tRG~`PP+x_͞ȳf^YsA5n7qpx%g=zV[lW$D/F&?7iCe^xbcmMm)[T% 2RF;FCWiY5́<#&]6Իvm3U/!]r7 5,6+AsDiWy0ɑ8vɅKpX*ؤ9a]OTR ls-}!?JokGﱹMs[JZʧu,tH隓L:iKw<9# cc}ؓ xsYeOOAlwER6Ҡ0{Zz{71Mmr/ ch:dMuFcrޟ/XT($?0 l>6h͙иKBYJ_,icS| j|c(a}ܿ2"]!ڈ QpT(PWޝ[Gg|5;؂;im!Xq"I. FE8JiUsy{!?JrQD0iB2[Yn*N8q=:4l8KbŌ4Ww.17UG6_hDm)$[XAIB}PP;7x{2%W:aMś׸H:v=I3VSc7ҵh~$`N?^ 9h'!SKe+\a?my0OO wtūw8=̂vyfA4zť1r Î,&޸&ϸ˚cئ)jUdXX36s{9ZnN "oJD咚 -:A yGoTWJ5- Hfy7Aӂ@_sN-A}l)LoZGhMGkTE&ض7w,_${|nD-б"TI=|JYqf"e7> stream xڴeT[5wwCEJbE;ݡXq}9od$;ҹ&WQg5@.L,|EugVF19Z 4q9H.Ve3<0 tߝSO"D 3]MM@Kk {8lmi;#JŘr&f wg[k9@I r7Z@Sd4%jʚ*L]A") !! j}Hkk:Px7]QRCTCWE=Xn@߶;3R{Oirqqcfvwwgtuva-ae pmW00rXÙIR9ߥ|Ozw!\ִW86V&*(M\&f.&.΀@s]=6M] ~gv>&wL\Mm3*v?6EQ%Y)Iu Fs`TOz |.+/}H%Aיִ'a Cmrw?F ks:2k:X;e%+݄6K t=̬6gNYv9,L윁> vx?"+7}߷ ?e,@ߙ-J?Avs"}a=?A&v"?r=*.fV_vYu?&Ϳ{}X a|W}/Y?1f skK' 6Ddy6NN7=3="'Y_,?ݧ?gl?lo 7`7^{a d0;x/h~tAl*8gu] [o̿(=Yއoрe<9Xlrrs3f\ylo@3ĥMRCpdT 5/i܏K)SmDY@ἯM4y >C߄:ԁ8v";&DZL%Gr93-?ZHmloW%-0s`;LEtvũvHѥsqG`;v!#kg mD.`!؇p+%)%;~'Gy$òry4NpQȧEhtQD垊Q]?);T,Y)TфWoP:pA<fB_ɰBwyyT쉑=zPw?S{w6ŜP#ݾD$Q~6z=vIs-C$" {]J^wOt*aNұ k9X!RKn>(l̕l MP|0IFx~ D_b"ْc©1ZTg :[{ ER#ڪJ r`SDgn~تo usc򣇡eb HÆktB,=D).=Қ,}~A9g".ϢW.Vҧ7'׸_np"[u&~/F'q5_Gq81r;#2 *~*⣠ {`ƩHc/wWK\Xf½Q4_NMVWKDvM$aj* A,8ΐy IOj:C#2P9~ 6P88+ ;Hy>A\/A}M1w);dA0%`d[jߎb ^^Y"lZ,Uq*MDCTh;YO?ʌmhBJd" ZIyQT ^{O^rn%׬(ڃɩAV\'}h0Rmp_QE?p4-ֽ 4;?YNH|n⿦+0;\&>U3)@)+_ "k9|9c@ [ޫg՗j$!Vj }uӈC]0IϚֶ6UI',d8iwt5)kͪ[\KJjP9ߎlJknxRصqόء^ STBW-Mm'ֺvGX,;{2XIƢsJB ]DS֌NŇy^SY^N e&ǢLhxD}:`2fvwBiABs)uc}!!EceY ʶyݩTr`GJr3`+'[Cا=`XҶEG^D}Awƭ[ۑ2nk}DLDz84O)qm0Dq1S铌va=N@9;|XMAbk$.e#ˠ9OI2ՕwM dsȄ] @wqd-d%n Ci~\5o|8mlR+YӖ+ SVa(6tV2[B{Y/^4O+W,BĂZ^*T[lKRyD_'{NW\A8$[ š2A~ }%ݥaxqxL! qqB*o}azm45mQ豪+i 'iH;M<(߾8CtQsᓻ2r[F.Ǡ{5==K?We(UURzj4x;{[r.1G4̸*SX٦Ni?̻ߨ:t^:?mJ/7(S,LcJC*0rKxT'$**`r!Y#^aO4#LvL A20MnRWMH'.r+WO 7mL8njx651lJt@0\[+xM9W>4gV= ?h%\T#fjE/RIE4?+eټ{#a $+qRkS&\WhuMˣ ~x:q(  iAaHs ܩǠxH\L^L{Wr9yiY49W6CrӖ{P)bRQRgJ=4bKpp;*dioz/;HCKȗq8ߓp}r!L] !wCP HŘمvv! Xy†S!1pw%|6گxY(hҡeᕊ:hNL/K<m?qt!ƴ,n#%vjKdReɮua ~hn%&Xk{5ͦwȑ`sUVT$,7jr=q V۶vn#L7FspamS ̶`?4lky#IQJ.Od&=+1zuie}**ao%̞ƿvt LC2!E b=rӅ^!ָ9M#w/։ ~M:G$]SP!ݒxe>-eڌgq*,I1DŽZ ` fZVa Sr' V3[sLlL^°ǪGG4m =ax~׫dAzzz_ oFll\wx_71 SoB셤FE>_*(AVECyW(6Y}W2>e]>$V= xKZ XF/V,v߸f V0/ByH &F(y=UQb ٵ¿y_"+f. >V G*iX:.g/5|_`Lئ8I?${d[02A&%X\:BigC{iq+Ї溑OȝN󜍣-Y!XBMza&>o*D+QNJwX8 t|:l!R5K30OAaHe#L٠KL0@ ph+'rH1 ?Qas;@T9nbuݺC7v&-[l?*vUIZ]"4#W 9($R]scͣ ?:zBbVuylvϺfjўdhfiKR^TV [,^F %Vqb\ֽI#-& āJ;QBawBdfC4 Kdx j΋4/EiWeU9}h{v{z?:Q"l_Rt $~=õ2 %׎8J ā+&3'[%զʵsP`H{)οU̍"%iȎ>rCco,f"/_sO8!I-_yα#u%`fͫQ#t)~C4J9%|P`:( TZL1w:Ys(|mx1_c>ӛ}Khkd{h&up# (HB!:6NPTʹY׆Rt7v7u=$MU((+Uߘbow*YBi{iLy '*HWWի7ÜrÄ~&Nv蓘3JӦE·ϠwWô՝ukIIuW^OKAo! Nt ęs)ʈkSS}OQXg쒤!(L4 .Z0Pkgo@$xdhH1 tQ^SVz^ߠb؟g4+uY$\֬H|E0E=}5>6Ԕ1#PgƢ8|-mJQخ۳FTH4W_bA:?+#'d?v^AyB_oDuߏhOtKQ5Vր"(9 7eNM h뚝­I,!^]3̠MqZKNPCFWy$#ٲSZDe֣>VJdN^ |G`1]Kg~I,,]B[%Bɏx$y5M $2Aʢ]ʉGECME{sCs {(7Th*juBbEK-mĂ 'HB8qHe͟I|>Kj8l'!R/:c~2FJ!H}UYPj`ckoAZ}3*ev)|_nrD[ڙ3q)u?ƑV;.nFen$kdB5E1ݮ|+mӧq끩udnmn(##9λ6܄z4]5I7Њ䟑l*Q0M`bE]4wH\1JRrwwC9yf}z>ړ5}|p}HP9nH3ʖg1yɜË+bmkw5 _#RgSսݸBL]w@Pm'6SUEFnŒ-PxV%g#+7`T}`! 1.#,.5b}Gܧtƾ,OwՁWL?[{.*l^jskv fDkb(8e՝(h,MG\)`1GNEe^Gu*PN"f@nbdX͗6U՚'Tjb9C͞t\j'EUȴ.]( *MWNt[eh2٢´Y= ^ e}k3U^Sڭ)}:Ym )ZƷk tBΦ!#67?"&qȘ&h̥BIyN*_krf qpK<.<}D_ut zRh(:؜ǙAߓ=%cq? XJ}#% M ^c_k3=\ sn/w[IqD]3vE&QsbT oiB8WM_/Ӭj`,4ܽLT_kT-ڨ!qqJ3\hw$, SJjk^|BD%dO1홗%ѡ[dJW6v2#,(nM $ASQ1DX?7)ϰ~)_14-&9JkŖoEC I E;qɧ!6!I)qa#5tO*U0\iPx=6U԰ZN9,0nLThC]7ZAa[ 0݆;&U/Ba7 ,3,LGOxt$~N.nZ&[o-ˉD $tq_z8$c8j]}&!UQxVwmyz[!z/gZNz͔qxUdf+pˆ 1vn( ݺΫ`Ux;rUL;U]iceSzXeUB'bM󷌄ΩtDI奍rƧ/xT4l i}q%suN6 T%8p en/ٹ' 490E}YHt\n>]xZ'rmRе@Zt5Q6j1SjmFG 6-AoܯdE‡fOL 7oOq_{X vYxSQ')H }l, K Bە4hL_\3`}ٔT\<`Oʎ5~xX|,Ls+@T"һ̒-;)ԃu?8w'/kkQZ2ңykVfIm=cZДo)!WP aQ1u)LC5Jūoؽi Iө+փx˕v3]ZO ( \U2~<%ĕk) &9Vw;z Kaz6^L(U/^)4G,dh:I(,S,Ȝ - ʪDoaZ9y9ZЯk.C933WL _Uv,.4-ыru5[V,|!0IMMLƍyO*}h>sAǀ)2 ,mWIٷu4l>ݢp͎arcϬ/~k4=?mЖpsefnHW-8vK'$fNnhf;HV=hW\h{afnP@O!/ : (Ud;?=$)tXS5 Pf.ٞ1t^EfJѣ w}K 9$;Rؔ雯'$Eaُw YԒҘSΩ0T+*HSkBʠ?yVqRE;Ho.$Ɖv%\{@q˓E JLǶ>geXũAQ)C'`o׉">޵ho_3T]*vA\$zd2zoƳ>m| < qwps^Fdzpf8^ғ£|n_:EvP#s2mK(4u(XrG/ÛoRU Abǚ|ҍ+?ϢYW4ib=-6o/-?7| @%>vk! TޯoR)vBwd} /!`JqCC8oj `$u=CG/ =1ad +K~2e"J$7⢖8k S oZ1?e*y %E 2zל&d"~>>VkS;E?j}sDNArf@uʊgkՅ ?([K߃@Pt^jY*rI֭# ,(q̜ >!x!~(,yd@,Ojɉ28+"ۉIUn|is'@ G{DS1w9Ԥ/Lׅ-4] ^~2 =!0?pqvЯqQ|X5ϰV66`4I}oIצն  xU5N!t M^˔йi)`vr /Z5_f@c.% ~or_|QX8P6kK|dr]fbې;VZ$!RH""L+Kp(wj]HD 9ߐJYC|HUJLiFCBϋQҗ1)OZIUB#v@v[D\f% 2 ɌIEZΆtE= 4{e-¿"=cҲ@8UWP۳肿ˠd>3)3&ŃltNL.IL}jK\xqď&CG( ;GlNAN.nAv8[- gvYgnxa.w O6*_EL" @i>7Vyd|Mv%AD|bW [@SF*l,mqXI;%y#0_읙V\<~#TSOv^A$QiQ &( $EpAuUX eKlGYscK.L,|k 2RH JϡuAֲ;vlһkXa@(6k| (ouy(6$*ε!XInѠFy qY o7‹(1J]>/JC3LO>:D퀒.NGxwcA\;ay` ԧ7!hdwɪ n]4@?eEZCIf]~NEGsEg05=6rc&>~N ^HB9̎[v8otO8s (WNv)H'ЃC8+s l1cK0.l|)0A%+ %z< y#4ݳ׫J NET~-6bn߄ ΐ1{5\ISY`;4rnǺH ¸VlWf'HQwUSARZkȷ;+ HL/ȓh CѮg삚>>4+oK鈚T ¹C8ˢ;L%ehtnmQOz@YMZv\b1-eTYc_g}ugY;Ecje+*>2ADqk_zGm&)fԇP/4~W?B>Z%2G0C ?yp 47eD OXNmTK'^=h< J8ynitdECT}N,`;J @Fg$0 E>uIe 5-AFYkxž$cڀ_*L?/s z,~_m?)`_DV,h*>7Xh"ԝ=2ظW˷0b* M3}5>Eφ6/XDkop:0GZLm\@;[5~mb/Ri*eکI-NN/kqV5_7qu&{l Éɇ|N;^q_kT{BBqo Ն6ѱ?gafi_yW 1LUvT#ˌX'D 4QҺaXOr[ңm$>uCSџ0€c#T-QbFD`eu杔%}]"OkbOofK5 D-E8Gs}+h1bvnȈkYdt~K+fT`k+W=.s9ҸPkgtF}n@EE-aˏ&GkFοXȯeO. Fy-qD@ X2*ط.9Gk:F[KeɐgF6ٝ[sYQ{'6W)eEȻv.]Vf;ߺ#kNgH_-+6hT=vuu}FڶNauCw[GbE1K몚ݔ5B8)'\1x U@2LTzӞrJzDk~Ӛ?.rwϗ 0 Ht31h԰> KjSP`7mqLJvV8B2^l}#\7272ǣ e w:K?Ea@U ِ&8*LY?IyzN+ ]ފzA`Jxe\^/&x^{;Ong=Ok k-E2R5 Q@ilpL}YlMo՛wʘ(nB,~M"+ l{ZkH+j)$˳('(_P%nХ 3}mRwgz3OxÁF"YX GhZHםu&JfŶSYdYW!3pI5lA!,a\|x`w-W8;|kx XḎN8m _a|rF O3ē?+kI@<~f*B}= ߐ #F{r ri@C͐gTxjjH!BWe=:W,@L_e](9IhVmu1>~DPw9|)򯄍"^g_@"$L6rڬ Dw#xA~wЩTIK "8#fѽl|D@);AxS;ogY;alBQty4_*OblQ,Է7'.llRr7`7cnr;#x+5BDKFS`o &;kTOB:R#R&CtO~9 8xKI#sֱaD7rܛ!$*|JNR uGeCӟU Ao TG =t8,YؐD^ok)@ 2ЌIu뷗[5ijz.B3sa1z쨿Bq qeVfXw(mHcfoul/=Y{Ps#(nƍ^v A ޽P".V4JΈVAHs69&fa@YW!bl%tt>>&TY/mf&,!>yq߉6>G-3_e:8<[i<|r /CvV cDH0g7l;)-TQ礟xWhԞY֮ E+kVƙWLS|*{N'#Q 4T{EG $غ x>C@܆ߘIG2Uγ]^4\JL!UdjHОvn{[^N`c)_Vۻ­]$ #4 Ae412Y|qDyunH4XMHA K7+$5n.@bPo6x0eM:,CGu`%~icCgĹ 74Nˎ/yR@[]gf^=bj%&]sF< c\:Aχ2SJ_v3b;]܊|Äҽ\'BH}ғ{G1KV {Y^uwQzS;}¤mD V80*F\VT*VBq ewO}TXfHloo w(/C'?H G?:X=g㨖}l;I዗$Pv&t/t55v}?)ߨDƲ]`)!3P ~ m"O~!1 ڐb3rv n:hOlUrxeƥkCW`l:A{FQ럺2r”b Rqs/( Mɩ ղ q7dYvrLaqu _lmDES9жEâΨ-R:|qc6׬uPqyi/)[bx9]'.S(1R20XiX \?rGh3R'Ί*nw>m;lAq 祫'>ijx}rJCwf`dnap7xLum{ó>DN2:&g!> AѴm^-  QC 'Dwjq]aű,2DAJnxqЈꥅn|>gAȔ;lcqHqvskI%$B 4*]>ɌC/\2B K ;^@W]Ve:J,܌b5?]ITTFѫ塪y,#q~:A纇G㒏(*0 Ѣu)ubٓ<Kg}Cd#MnɋuɑQow~V<6o}8A@FbkhǏ ܢb'b7&ȵpQd0w~y4 )7ꞹ}PæL7qu/(~؁1"Fy]Pʛc_vì0&U 5HHd1ŦG1'F+]$gT uc:[i8Q~`y)X x# iM^l:UFeR8i5D6) KѸt`wP8UJI1EۍE6yP"S. C ÒxK}HLQ 3Kp?>^7(F L FqZ|%@&%O ߮sc7ݑ^OuڀT(MpqNA^bIm8& #Ɇ&/AhhΞ@O͇C.SKk&teu;I5$Xga }ǡrP Lǔn=g8VMqK t!@uhJ 2N}M$HB2 31N$t\]t' = τlw8T"@jlBem>u#(xZ ?ĩ+3X9clN~,<ψoZHN %G.C'X,tA&Se8xv#aVBퟑ`wWjcPW"I޻3Z̻+b;sV3ev`ά-3,&Cz]>'v-bDCÉ ~_mhK fLOh$۠hG'ph Keןԭ[_[OP" vmD{^f>A0Jb[kn_md=D<US6.cPds<+eӚ=V8\t\I%`E/bFIwxr2`[84n2{{*u,9a3%YedSҌ肉 {X-хp^DJ9npxdW4tZ+*^SMwI DB3ܵ2rw4e`3c*Ϝa ~5e+ktZE XxKBfH?h -YǺ;? Tٸu\kޟ/pk?gi}/n6ny&WSd_gR=҄$PFXR#"K=yCAwl;?Ou Gqy;C=ҳ~ghj5s4b4 "Na^bWf9mS4$.iݳ3'뒭AN :lSk5UM23fDq#\CIV{NOQ1NHޭ=IT(UKܖOP>="a?s)i^P4/uZ/2 i)mrCIM K>!Pɶ`QJ~c!ӥn!^8_rA~*= xNʨHc9?uyQ!HRwb!%\5'pP5+DyʬxMV8[πE]R38׼)(u*0zV^Qj/a-HaA=Q3~>|Ba^!-;!mt+A_ Hu Mooe6ڣgy7 cfZ~Z]ZJE-a(o}JotX5"ޤ S^vU$5V}H>Rx4sP 0d5e9N> &^e_ U bCVSF{FbA@EzeV2#YnTw*<6 ͦsVH/I85D. Tzm}#SWF)xA $Őb%Z{?}=`k\04XxcB d?2KԱ:MSURDT}F̶a%!D=LkC#J8HUal͔Gedau;1VCR_Zo=av6tRwH|s j֍n›pa.͏v \.]douDr.&6 ]5yb# WwF '%ZaΒT \ppt)ݚl<,-cB8G尊0}$*KMzoLPցV#SW.+9}5`B:H6ašo!54X/@ŷQ{"AP2?a e۟wUιxwduZpmv5{qz?#b$b6~tY"2?cO1H,f~UOewVż 9zݓ(jM]77HSuQ=5*C=ً4%  8BJ_LFÍRs$дtĮ?~WݗWR>};'y#%Cq4 Geے dZ> stream xڴeXݶ;ŊXZ,8 ]S;os>ɓcXs'$J`C@rL"`+c 9 3pX@6j6@f?ށ )`W;sS3{ Vzf0d ,1@Av~T`hf`eԀ_*IEu%Ujª66`".IVP5j?Հ C)@A{tyq5a5-%qfƿk0v7wfjbٙށlg`c?53s{3Z#hp0șAI9G;տ@jcf`O `o1vv{mE+ӵr4p39ڻl {s{UḼ3s?ܻ@\[OXL`a0Sd, ~gmw|bsr۹2-A`g61 :(-_`@h 1mV!xۀm&V@Os psz[H̜cs#wKLL_RNc0` 4AbT;ˁS$ T1 36r%KdK`iw L[(Yk1{a9X.G#K >>lbʪ_iS0D S ;],ww9] vxO8:xLvH h/7h?&oL6ݿF1Ys]12?[l 47v0y;sw1Ϲl;=; XVnj[ݿ4BZX$5xM’s3|YJj" 6Qx|A_5WL+ mx{`PK_) >*bIki!ru>FLa\%ꖶ:17~tYD܎81*ܠGxfV?7gTΦ]6)WM+u1F>[ ^zT7F4paYjFU(\|, ΰA xJۭ\}^D<*)ѮH|/l3AkU3 k> LX 3_ܭ֬A=w* KeƐĐ ]r#}<{^n_1IS+8X$ DG22J/Y>Ԃw4R[7D0'\:Xb pcz2ejsVNL${ʕh1[k8/G$nuF<|t Hs@pȧ jK!O*fQNC_s>|Y,Ky"  V2mm\H9EBYV麫0>BLjwC|oLTF˭ߎ&{_ ɴO=D-VI`\ddȠj#X`i'?WSujD"_KG:ֽa}u_jO,4gX#:53 EO6ӘђS p'NAm9& [j~Ôi >a͵JaȂ4%̼˩(6E`p@b%juj7LZvm-Bt8u$)BWF?jPx&N~t#zmR94X/Qxd䁋nU3XV=}o%}Lz@7ڤR;ұmV~vVUY]@4O!q~@;"h]'NVKXg1K]:UQa+sF?c|ˉrhVmğBpiԯ;Ԅ ?C%" ƖiW5iFtheOe,ʤ2}4wՠ5Z)76,wc>i}},8&:@zmDZCKMo ^ԣF2T/7K(M ucSC/-"J-^(?-BAJN8z̅0ksxN_jwLz̹dY tFvCU(hw]cpT534gJBI-qD+,:l8ȾV3Ԍ,y)5}{BBkE[=kv~%Bz zٳNylc&DDvRTi*@z +"[ԍ3G<L'2M 1ߧhu4Wm1h=+<_\˃%uat KanԊƶxa#O {y3lb&tWZORܬXa3o ̈x-.K#L-U/s|TZ R5^4`܈&!w250*ӂdBj!q3ce QBgfݵOE,'xjvđ<X&.Z~`WӦ]9H[ђdΙz ENxèh]/Oϙ ao{D~izsآ^4WsnlerTmj m9~&2<)/j>T,TfHNdvfՐK]DK5x ﷈Jym_*+Q VmxLg\(CöO?R cbw5W'@k(l1qi y%ĠwTSLj !BAKdϩw/bcAq}? wEu11 פiǁPέ7vTרJDHilXdm&Њ/X-5j'@ Ś&uq} IFL "M; &G"-} 8P}v& &XYs\ ut*P[\;=In;{o\ߍ+G6xP>C(^q/pSbmo1,,*\${ͽ #:_6+ac~=\ALd(8e%,gv)ڊ+rำxC) qvjẗ_9Kc-c8TVPih1;/r2 h#q'=򳏨Z>Ee_U! aLQAp4s̢O[ꭿ-nM'jKcTj׿L֬aÓ,ysF 9J?zGLXG_>6R(~;Bc]$N[Q˄vpx(k;mZ){+kX贌L |Ɠ~H9Ӌ~+\= ahӰUBrA+M5C߂~"҄1s륻<3cTrua}~TGH\suyuZʦqa([Gy#Peyp< |L'R,]V79޷w1R.v_uqY3=Iwʻl nk: 4{]YqoC6бUZ;8T=msf׬-2=['3#>LDy4|*>qێ$Ţх+Q~R+ɞdUP[g5B{ xf'MXd%%䅒ƃ$w|@bG#e KOz2*nkSa=1f9Kf8g$9ߵ~(( `=ϣ93ft#R()?U(rxvfmDOT&Ha(r},šK'PM[ϧuc"mjV.zZ*!Nj b N@2˨!4dEV2*yESPm- (ՏJ2'zzYmNDu dU z6{<ę}3T:Ī)0Upoi:"Tk r{]ORz%Lh3UZTk|X6ȑpI.3 pOfɦoty⭢V|&>`M-q C9DĤhWUJiD:`kߧ_ g3nQL+4dԔY*"Q9=7 /JlgI1Ψ^wE1E%KɊֱ'L3].y9&cD$XJOe?{1:ZA J*.)^R#64OEX Cp,ב"h)=s3 H<YW_jzH/^{*Y{hpNJ!/  Vx~d&m%[l@=(~a" *d#\A鏙+7N}dm(v_Kԅ:b\/%eyO~ْZs8$X|\KzgqWD9rU_B%~02CgŐGŷ&t~jɏC?APuϋu2/JJVᬃ .XЊN&i%.5E2jm&\ <aoFʱ(W`uVN"յjt>kR—ahLbVKF# :oQ/3)-{25a#Dr6 ?2XpÓl,}&2]1DD#l8;ӏ{-!TxooLj#|+ (Wd5p}]+BZd݀DFr\CYLt[X?Zh^.@q?ECgxIѦ0חw|sOq'(58N#T?]* l%͂IMPjlq8,Q"v۾ tYwDfh =[-B6%\6v췅iH/!dDz@ $p hk,2\ %pVՏ(yf>Pz!{lQ0& Έ<+ȷNGi(($ .2s&ya3.D-@vc Yt(oR%XܛxW#_옋K#o6#?x_E')ϕ-G*Wg?[p [I{*a?ҜVݻwY? 8)[Eb41 d8j@wY!-[bwb=8Sq%:vH焦X}O)14IG:2:KtbK*7I2^l1M_(reռJ4!N/I9j?9j(_4zw IQ ;ed NE6M,vSW$ S28}Ҿ:eɼM^skCǽELNBqВyI%*]W[-3/Nf6[ VG'[)ҥ|Jpt!:`{>"_ܜwӖ#^Eg(;Ʋ ,P)F':duph%JT7m'8֞Cꁔ>ݎ1kZA1,"ɛq[?eex9N[t?rwW!@X T9 9?e=Mބ ZɈC:C$1hM K r*I SP7r+i)xM xGыPL$ ۻ`hEBC9M [8 *eD56͓bUq }h}ˡ޻}P"QWv&pڰ["w(GqRz3inJ'w2I #21kD1 Mnis,q҈v}z.0S8KakH,{4#c¡v)opMJΝ/qށ+3u3ZI9G08trumK`?2~GjW-^(ɧZia ;X-&(0dhL5[WKWB M0*Дx'37Ņdf,<ԚaWJOts* ^OߠNCԾPc9 !섿V#gIQl}+9P$ecMf{IgQXB84<-onFuNsLR]IDDXwQw#/cؾ5Ю2xs4; XPo\ C1[IX(H0J4L+?7k:G0C,L3L'6 0F ݐh2:/'ł7JXnNc׹@ BY"Q/gr~s9bЍt{!O{^23%*_| _N }9,>i_4actTFӸsyY!hva \{o%@vO~nc453 .eoݔF< A%}K=zm#/+<˪/`IF֖$A%OUv㲽R fX;C%:WM. =  idMt.'L„CE߮&Ebt1dY[sqF`>N$TKHLK,tB7tqyu95y'40dgS3*pv !`tPҨ(pM׾z[0y}S t#oۈܘEC2&J  ʬ4?puEgnڵM3=ew V\ k_mJ,ˍ9u1hm ާ&TSe8o4t{e/._1+VH~F r%IdF͵")ޝ3Zٰ,)ʂ(ctm3|{^`-RBV~ ٜBJiyɗ*T}.fH^̱3YU?AПVlYܖ)߬.췉_IO 5vbz,ԌN\W+:8Ӑ~yq@(0q12(gr%?¤Z|̓ jyެo8 ") c}7$S+EA'P`kwN] i^6R.kZ/P t!J[ZV6!!eH2q2 ྍ7^Gֹ3*\MΦT˲4(id`XF0y1 M@ "~/謍;C9]XV3]y*D间Ny g .2h>p !X@ܙ']ߵ"o:ŋa$UWj^ݘ9,G5zvH06j I`MAb[,+E^IoO=NW1Jnϖw%dA2SLYgd[#ݢ_b=uY_:㧯Nz5pV4˖9]<;|~OI=Bl?9)ԈaC>\hG20_k_eCIqAhU;o*BI V?z.(W D>%=l6.f@\ ɂ kwPܤ4$۞iJ9.pT_e0՜3*oS$1)ϩ˽8f~%3Gn&jܯy`AOZږ?FyŅt% c*d1heHpa.xfҳJ$]w DBBiLH߷ *˲4b+rb%VSutpyFcWDt"K<:C0%W qjqZc)svM&[.ba7b&0 L(1~i0cc@*;W/~!A? ̫vd?#v/I+)Š&PWd \DE;f}prJ{H+W-o>5W38 )pϕKF+vƂ iZ%ײ4|Xv&UAd1(Fhэ`6=kN1@-L/fښl;?w{^uW>ܘuOݟ}\vG8e%u({ܦta<. kB 7K;2&ߐQ7K5xYOM YWэ"l}D xۚQ?ac%b/ܤ<hjzk>?!87UM~~[ b#8]V^]ˍXWԠnDm0Op+5('hL{<>B5%J"6 &y9@,jYw1/HuZrq-o#a Eegh<n17+T%/`^ܻ' ;Yp(T'^ ^h2Dq/#G>҄cC$|9<? -AHUAܡxEdhon<M"ZV[s=p(9'+!\}Tny\Sٲ)'9,M{@sK.QCX2L!y$ DXoMeCG΢b~iY B[硻>'E3; gHƿtb'oa/-22I\]PN5yk&h)z}/{ mZԸQlY&(jZ# 0Hh."}$-˞HlEi>iLvVF - juyy⚈I>^SX16jL>=Cp7]0۴m~.,;6݊>ܨ.cV @Z mb&[DGcNv/ǭ5,ICy^Y8Zua{2Kiđ%aBc1u)/v>M&=N[*?Yo),aӼi֊9?`%K"#=}I7[ SOuر8[.j1 Eiԇ;G?ݴ?ϛeZH f5}} la IvmMN췄SaQ3*ht+Rm1F"ʜ=inChFzK aI{YieT3i<=JY [8NsaMQ0#D(؋=;}? s4ƚ?\iὝ0K!p.LA}M Yr8.W"f~q U/ Z~ Ozf?3]:Ј[jN<-K?9TУ`mra]+įdy#j׷B-{1{s?v:gZ`ٟG0]?7]c: )4yyNTᲬZsn6?_wO|] si('Jv R`a#R6ćܼmn%% 0JـV#KF/=fYe+_09\IZdUpQ6Ļ\=L\ -̋ "2Oya.)$3|JfalLFR guX1K)#U"zRZJT%F0}#t1'z951fmzmVmQ0zhnA@:%$%FC$FF钔8xúZ{o55Ԍ]iHKb}Tî5K\A۰W]f_ 8G:*:;.dHmA 04"%%,&tP&uICūl34+ʧp rx4x@x(44]$ O"GS[|[DWtPbp9;M4[x&HBER"՜岶 "z4Wq (Z Hsړzn>iB&9X=z /Ɠ3˼\r.I$0ZYwGy:OrI=V=Ll prDl믩9|]Y٧AG~EĿ~׀=3*iGh)ϸsg SҤTO ryBmLՄOGނa1URXTŭ+F 1p?0Q>RYHROtt^s=zz򡵚pfj2. 3z^S;[5p-ݕ̾Xh"?lCo0z0?vIbm?0m m)vNK}{. Hr-` ^a)n9 WTmcyy ߦ3=Oѷx8- gتO]IGwڌ嬆 !i"R٨/k HM耛 dr|;*LbGfv[Ըkg{R;^tuu0޹9$`6A>pS:|aF.)Nԑ Zxvs9թTWa<,BC1qDBnw9iD/%*z#~KS#݉¸=hmQ wi_ϤY7 VM1i(y ԈM?J"S[3*-&tB{sy{9݆/:/[#poK¿N1=] ;M4i#nϽVf6yH;g5qIKP. 'C'UBjD,ҙk۬*ut̞#2J3V_"x&l&gBQ޷;GG=wp~=,*b B^{RZlx;cz򱳘Yɑ{َ:1rLToƧh?TmZlftJK%\[` 0[k}#}۴#EXG[Amۆ F)1oSNG&G+xc QخH|lV, ;z,Gr/˱=(pj/c E>eI`/>v?S]) ߛFWUkuEۺL\QrG؛ؠQ"t {gMjEPEsM#c;Ýްgױ@Nh_ NCR>RvdҜʺto#Dު%0y7˷?V+JXg(ͽ`Ћc+Sr投 WR YE2N1 5.{_?P|;}H$i.KG~qYج`\74'Ex)!Zjki| Pu׸]B>E9 DgeCd⧰[G4УO:Q#326c/Fz0!(5\̟Bk"颼ϴDM K\x]R?YߒŦ۶&yqmL wjw+C}xt:M:)M6r;=hTtp"ϟ🥢m١Ί.7[bAZ1Rw}~`zK?2?Qz|uju6daا!A< _ K^bbx0 5B*:Vϐ"lY ڊ\*LUT2_GeܸD u~\kz|V¡nfSΚ_9@AO*#AP0r?D]mqTr>),n'z)B0M|tph1'9:[ kX+JwfXF={ѻfNeI)F7%p֗[egi5Lْ6zݝm ^P䈉n${uPLe{R!9]kjGƝW7N~H'XCxB60&mTapfՕPg$$PM ڬQTN`^{zΈb'|lZvw g/|J",(Qd6 ΈN375 Zqݔ>2ΓDt1 ҕjP}()s7;D&D_ZOLԄ (u#d=x4as;cR0JX/ڎjb? yrMoQ@CfTYΧh++pe E\W*+_6rp, nz{1nb2-=.;ǜO80%}h H+2uq~=Ԉ+B (f&lo f~6H'º{)>xsC5BMCƢ`Aڝ2\aΤA:B{*BF|Uh]TݭȒP E*(!7N0s2P0pxxCY2&]&=}Ѭפ3k֙/1F46+0 Pq 1g6H/Vz ŧVQNu= X!;_3< [pxp9›TvҤd-+* OԞ>TOzQ&kVq4sˆ$;ZY 8~4n<]4;#tF!]3w2! AOtcWOLm[zDZ&W?RtAv"!?"ڡ7RJH# KOP7#o3駘X-PVI8E{I^3&A26 *pS.P%Xȼne/teh* %0|;RP"_Ӯs!$.]zAssV@?KC۬t35}XzZD*̛ J&t'ˁ8௼;yO(֩i/*znZUaHT~@qq Rl|G)mGH.ѐ=49ZH'LܚKzw9)cȂљ,,+gTի!Ӱ: QM7ۂ! zp1.uk5/AnW76wca .h!$oXPoTX##h_n'sϓ\uYJF/呔;0-)b.̼IԔ 4mr89K;lfmb\?YWLdu"oI uXu7%qx1[ 45{ jFWpITwsVB]i")$4E^j\.%Z$T_GCoM6}>EOZKJiDOƢHNyiVP3@Q(<'-c!T bo_5#~V  ^wFŢ:iIVGOOсrIt~λb\&ɟJT9~S{ؐ[+lEp.q:^PŖ=߳#(s:]&A(̯H /.}nࢭ&v 0d o5N #e'c%M߭KMf)]jtt䭡dR;)}Ic@n>9jx +p(՘H9&>O›jwX))Q.Qz`ƛ!+(?=8Ge~9^|&>*qn)ZW4mh_O> 2EE.pl}D%7QܼItvU{-je*7a맔}[uVa%4 冫9Ca;%ݹݟ"s@0Zp}*7M?OE:R@~g }P=7b G鬘?8xO"CŨ# ~rF::oyp][3Wh ]jMTUaU`A0O̊hϢ`vdy)hibxob%yVr{ 2Tb4+{NGr8+!F{ ]moγvE#ٔxLz1<ːE[~o uYg|w.G<^% jr.69)JjHil|Ic{@3-)UR?YZ] endstream endobj 111 0 obj << /Length1 1850 /Length2 19051 /Length3 0 /Length 20226 /Filter /FlateDecode >> stream xڴeTݖ5 %h hC-NpkЗܧO`@=\**jL&`#։2̜vfVVND**ql+txN|Ti-i0r(v 6-g 5ѽ,̝`b[o3@hlvumMr̊%@ ֦́)@PTUH*k|Vc~/lgv/,jҌ Q%uIH :#@I{tEIuQuϒl,`-ljɎՕщ`lg>us G+ C;N{& c#o_Nw*ߓN5pOs? ?+lN [{`dB/ r6 ] 3]kOoqm uptrWE3Ǧ($+%Τ.<[&E;;NnND'*.E^;;;]&`wԎ铰x 򟲶zM-lMLnlǢaka wmf '+dmVIL֎ o S #prpy{o]!L,e>*T5e~G߮?cJ>&`[kw E .LrVڀh XXV `䳅?,|5D1i$wɾ_;o-hle rtpsp߉ -#/%z'Jlbak`"`xJ,̶`7$x,`w,lYWe[8,Jw~gcg_nv  j^7*@GǼu2w;p'}o /^+  (,tXnOy2qS x玍gEr#./,SB|$ aWk,gLuI>eRd|m_7Z&oLTD~}}Q%EGs452ʻrK8g2H|'ЯRu`]ؚ1ܖ: :!`FDg CpFzt˓dpqQi+Wrʅe5zyq0-~p6\FseJ@wbC A:Y0JU_l3z\GҔ |7fxþ Z&$46fBG8b ΥK1ad7/ٖЎ:{3cdeLb؃Y]՗bQ=3Y Dj;ytXM xc!_d\E]GiL:.gYN;yV ͛eu:}3\Á↛O v7/\"N]Sage0BK- -уqغfl6@ȫ v={ۉ{GC`^ 9%9cgBK!hchK_wЪhJT[ټǒm<֡|{]9LiZm/~wqPr"t` SVw3Vydlj5oë!Ǐj@ڕFͲzQ%ߒ[m`5(c5,%)jwH8W0&Ntr&P~3tg=@=S>O ZGN\rv5R^tTR[-%:7AdƾmD_qV6eT\^]=ٲ;QyJ9<1 ,>s쭎Gu!b♸"Y#oFKׄLڲrF-=ټz+/  [IoI( NGEZTUZᤕ zR`RGlE<$~ bY@dU/Xd#:)VE<:@W\bi0D';txV꛻N1-ccHj KtdǶTyB=@-WA%Ij9E*<>-ӓ!Oq١/B0)Q_0B DgUB~;W\U$8cw9tx\58>Cb{H"c6^[z(B$0;'QQ Tu*8 5U{ %.qi0b`{4莪1FuTT9<\zj^BT!XZieOt?΂^_xuD纼L>?0k{f4w;H̍N7%+v211dbg㞐q{Q dPIs:K"eg> ,x n&I8~z-xntC0#z&jnF2Bsv }'' 1J>%cF B=Ǥ?p(0n%=`Ϊ@.D"d2%3 9)lY)kYrE96BI.T>֪jUԚ%U_q)nVqQ(TE$g6Η`HſԿ=jQ$p1Ma2Z~("rp~C9[,R]t%TyeBÓ;TA4uBPM\SFPlP42h#_r#_V뢘U.`U:6 g$NYY{08^~L LJ:d0%he51ā+46Z3 ȏy^X' Y1V(hn9d: 얊DTYhG }.ۙ09Ae]LETsDK=Ki$u%8M!_&LV"O^.P=7hvmbpS99'%>RtSx\ƙqo222z)o P7~A Rnc;R._x6>)۝aʁfny 0 d 5IDP> ;p49RoCow!-}g,FÆV^R>b??Iuo7Y/l-6t?3*}|v3˜쭯1"}@hfT!3kə5mb? ;NE(7_Pct~˝ܕiGP'9ʾi2OdҐ&s-O^vXXL:e83 eX z% ڏPm0o&\^wSJBG!·ieNB_-~T>ӯ4^0PKhAʚ=L9 G{k `< v1+E7#5ۣ^0GT| Γ0ܮmo{uRQ +ʑNNQ&&W_oc ߳yfI& n"I:i3*ɏ0w xb eQOZG1BˋeG"QH g*Ƹ i }9ffyK]Ϡ5K~ײb67ɵ`~9'ur_9C0'WWH/dW}pQQ_W>%vs)]+F_)[,ׅũgO%9zH2ܫ[O$iAn87 :ͺ:=(l<;䨹:BYXE}B$Qn'}+dgiTT+4Wa-){ҺDOQQkWΎVq%i4Ĩk:?z@0 rs1fsT9Ucě#M tusZ 'ʆRF0k[_0vqfog H}No.2vԁY/_xUĊ oS%|iL/M) d?| Ob#߰(SwBNIV[.XyaI3B>=$LWquȝ;*ъ(WmQٍ+ZjgK^V@1d8u%+aiר̐yG0Ce fGeĄqi|S%f֣KM?f׺ -pzgŊJX4ˬhщ*Tjz)GeƾgN? Gf`S"hKRͽJ̰x1)U1aW Kc]F1ǣ}uL -@Sm z]?Բg7fVq.P3;֚M#"G@!{~Bʈ% d.̅u2]U{빥l~09Rn[u]i_$j9l|'FȈt6#::FV(:)o֮؛1:Hꦜd]`M,T+BtՑrG1Cw('5&CP~I7@` AULTKoʃ%6>NM] JGI!*Zь7>\I2FJ ߬jO4(]WƯDվ ]Q@RaE wa@۳TCE5_u2*,1ݨU p1j1ДP9dٮбb!TY =P$)a8*˔U/I6*Y<·v&fvψ䯆kXa䷥ D)̫^VVDgl3 d`މmE{#-}Dq?)^2_UN=@ZVc>eB{(cA2wk %ѓ*hV #I.*l?UV%^|eƅx #d9<:]d<,D`x\ V|S?R7Gcgo\prP)TuG4 Uh"Gx?a!Jl$(Lgw&mE0헁( J<9!Is,E21G T~@pbҙ}x*<]{\\z;^jF/z&>uO߼8 ZL{}ssB}#G ꩛ sȳcolTYӞe ,]vhe^Ҥuqov.PS>Ez*g# 7B4S9}x \.<gKl}tCP*֤rDW0cdڔAK`TY tBNB?^J6>mb>R7PB+'_Bg"MnJ[eKo yЅuBCN=.9(CH%~ \Ɂ5M f9Ez;6̬lL\ zn @ ZhƽFOvĨ}-IE;9{U0^J[l/@CQX*< Wj'w|-NQEkv@>㣛գ%gW!$ c.0s1јP^?p$(+(I ӇtVn+=d#B˺t}bj9D锱JB|EyBtRKuW@wQcRae` &ޓb}&K\ӞD` j,_>1 ,'JIApo'WlX9tc| ڜN$[\{yȦbԝ=WmU~F7aW/Dc9o?:)Fqղ۴=)f-w4W+?&gj b$9r\F5 bH8D"y3bJGaPsY)s[ pƿbhܧi&+w۰ж~ȇdm9%89Fw9.J|L sVcc`bzOC&QX% Z0Ht&Eb̿^Bjǣ/kp˪NbVYB}x~͔hf[M=@4p~z I)4r(Ec/遑J"!fDJ5#;Be#.Q fYfҺ"ZoFe:>S`VЪ'H=sf?;-dtš+uy9[c(˜rai*)愎H! 61sfZN8k?91DX=7DmoL YHY`kR$6ͺ|[qrQ>U/<3K>ҿT[=a2dİZls~\QX$Rg1t\A++5r}"}D>SGfzpD *%hC՟wIz'p:X@Z׹08ӏhO۲\C;d3= T  _= q%68+;Ԉvy1jb9~j qCaR?f,qv!=r6yߖl ke/bG&Aʘߨ,)sⰶI}PQbrBڜKȤHq@+mZ 8iUch28oQAA ImFEgt&D1+%^O_8=暤-Wjݎp(2')scTzT kq` iPxS:{ȋlP*}]!\n>G'Pʎg%{1j[+K-=lZJ\I/Vzk q#F9Q\ @Q] x!oI.{O_H.Q W;~M)P`#ߦ.bc+d?sxKD6x:I _I2)3C US?,–V )OS6g\3E>Ǜl(7p,dOI}KB-sH:Z+3DX.Oc֖ &گliIMbW!m68K2ăܢ* +/NhLf?-tJA>UXWKle]06 88e U4sa{JQx|}:vP069wv3Y "x:?Mc6Fj9aج~ CL?D^Lw{M̌㣌XtM*ppFA%^(1䣲%&iX*XE5ph?&3\pbv]뒈0\teBϵp 6"DžK6L|PG'\A^Zc-aJ%`P۳C~?x8MHwo}% )СX#cvXBя)dmm3|=F+Y ߟ+;AtDG`p"-&r솔[azی;kNLpoam~ZoM~| &8փ鉁D2/Bu;EgB<&ć}f/̈́M}t=gid0EaԯV`X2*>so%o0# _] D!@$|ocFۇa!u:/o@T0 qA(PQ7~lrV3`ݦ6C7NT"&I,,t/'ǟXj#8kƺ*-< ?(ڶ_s0-MK<"b{N̡ CG/K˿ ՕR:vn7SUr.Yl"<=(gJ7޶«MKH;:ՀJ]ei{:D ~W"0Vm+#lAM#?yXu:j`&*I(N*)q7\IB@Q,ywT^ao iQI-Q?AZ4ayrtA"<_U%MaF~k⭅sI!D5F-GG=gxcI9^gT e&F:f|f)3*@$lгfvA(pQdFRʲ²L֒x}$QWہ`7WUYuV!sO1U)#KN:C kV߯o TNʆ{~aG|&>*ʌV ׂ~G FwbTgŞEr`m0* = w]ѻ?dc\Q/,,ԥVc\_dl,=f럆}I3Z<x9}갩:4ڤQ,)7}Q]BoaYdq̒'Q31l>3Ɖa~5ݔt$XMgiH&qwxU] q$ԏ8L0 RGx6~y1t*{jPWmJ~|紋 .ޯEPHwLHGTp_!RW4m iivBvEj )~2-yo'^ydADe҇~ڙLCw6sJ21'2nL@m}`f+۞$dLyswUr(X0.U[9k^"WTtiѶ]8n<_:9E0LCxE,P`\E}uz8IuYMu"sn}梦}yĹx΢:vwL1ӳ/O#XOXRt< (_4#'˨yB@K0ua%Flo UPՙWASy ƗiaSm?Q0 sm\J?Cx,p3l Wj:Z,lϤ/ =3,ã(iG@yU(B_#V;Pt$ULs} SI[W*s,![t=bδ7/y懒Ӽ}s>j6,G<&כ{HE f Wun8lOvgNZɵٽDg@Vd6m+R]hUtU2ٔT XW؈( GjK06<-Y6m !(sU5{]gPWPai1f!CɛPV"kV+M8DnPi{ 7ᵝeo8ª+vFYhc5MeT[7 %(Ѻp r$5SԝJ{$\n[=^T bm£1np,"۔χ|<6qmNBe@iL[B;"FFƙ~Ik@)l"־p'Nom?*ŃR㜻ؓxY؆4 {XVC J :b;@߻BFOea <-wdau~zy%tQ>D94Sߪ}:1FcmXYX`s >(HGFBFm)A~*S$.OUKegjYCe(Ƣޖ4p%uHGNIUҤ}y;œ/Tm0զIsi 5߽˗nj׌yM xa!$e P!E&w[rO y1l4Fr"rX/^_>eXz\J@3\L% k,]0.-G8ƹ{D'cюHBh/iǼ*/Alww\K#"Hb,2i-9 #C1NsI?KQe >R)I>QQu8t] @TҒD8(۩Tkf:8Nd.(]^.3D H=h}> v&Wvq1N}*6 tOq#fI:zPBAA図 lxy5- +Z@PM*CALe`7͚aZp_ZjS`i? %RnPKZ=jHX i)㱗q#3r`pr,n6E8}J'u1f >c ݲΙYW my ]>e]Ll}%rLbbH_~0~,9fK~DEߟr}NF2z߆Y=ysL8l3@\sZMo+ "P -DϹR ;e5?NH!=jPuz!;V?WUB `(t?ztz;bG޷`;fȶ!g< y)AG# yځ#k׶iŲ/XϺUͩ"gABS\a:χӑj߄6)ca '` y+;\(Ͼ(ۂ 9+]u,L|5Sl1F(T=~GgMStN\ RH~+a2?|PNb]H^faď?3{&HډUd1x*4U 3̩@gHL`\zm \ۏY(s%+cFO嘀0=]IӌfS!o* 1Xu+?࿕Dwa`uf#*nQٲ+Ma1̸Sj|gY҈#p+ vɜ=-o mi 72>w'LΌp+e\=&ͅxtD;9\w{d\Meec&0ZRm.췻DذbFpzzМՎ*^z* Wd˳LR5VqPې=pp5VՋ(5|﷓'dqZ_˯0`h^-xgK;D!PPĵ@V4~Q:"uDfZw]it6ڊ1G|%HRa .nt$barXɸ@>rC|XLoъ|=d3Wށoz2K(!S\y94lګ"w=W&?vюw!1βߦCxwd{ZPcG'ph Ke.>*Q@pa@mƜׁǑ\̷CK̲'xy4N=#3/~(,eXfOIV eKSu(P 17dG/r-)2U`ԿǗSq^q9CTR>OɒL3RT+'M `r-/V_B9rM7{x(j! l%~#`~z~%L3W'j]6˾B]U3 %E~еqb%]k])*tÏ4%X^(U|8323uB&G}L܌uoGuJy'U( ^BR W+3/3eO,yPom1VeClbПϞ2 jIa Y,8;O&v7.5i,+xy./nQCqZ-86;ysFhfY(UK[@WX)͋ኲ:UƤqsVm<FCǓKB`!Y ]L' /Rz&F։%핌26z3HO ^thFvU#OͷRWu;Ո_z=<F+{%`Wx3eci/t.M/[MqjM)C'{nYxJ# /*s$IMP6 Y [$d ppW92wfM``c ^m^@?{/+G#ƈ3* ̅ݩ1/9AMG+u XbѩكO y QXH`S.TmWdY"{{ ɸv?AO7JW:8]FJ|u-3N-޽r= 9 %pkO?>oYECϘ-#{V ĬCD1/"JbJ,G]pW$~ʁΌ. LB2F?XN&xT8mIc7!G{EzsEREq|OgDm\f]7?֋$Q2햐dIs;1"i"& +~ՂS ';6a˔ QC0g̠zCih=\MNnd}ZT`< _ojd~'|ig8kyb{2,. umK?hcO蘠eit`RUg̹k ' WU"JdqY-oT[*?ڠ҇c+`Ҁ0:o&TP_ z0}c*U;,v9ܐAieiaIx)k2>G'=0qxG}-0dM]gld~l8f!!5Ç#7PIʉPQ endstream endobj 113 0 obj << /Length1 2684 /Length2 26568 /Length3 0 /Length 28093 /Filter /FlateDecode >> stream xڴuTJ7Rҵ[4tK Hww% t( ]w9zν|rww ~NY(3 @v&66.jj g $i xV30$ƏB 9{:t&w.`fS!)֖V58W-71upw,J,ew@L,u6@CM@潊;5zHa5WGG"!SV52jALeuwHt%)u1uwR쬿`]n4f? 4Y,.`gKG[YmOga\A9V'Ek3 ;I_N{$b!k+W+r߽S؛X@ 6A"H:;odev޾&c& We9\].XXwg֠lJbrRj̊1+9@=D'&E^> 2R s {{kIZCt;8{XۂA/5殎 k'WCL(l@0 t=̬X7gV~!"z;:8,L\@vvzo 06CS]d߮Sz3j-PXq)^Үvv&@QL<-ot&vvYr`؋,퀐ǤI,ر}jٹF3[ BM(Od 8;xAfs?S`e9!)GW/NpX~x/UJAV ^NAj*AJ`}qXA~jUt 5u!M8!M!C{mt2.!A&f$C8qCJ9A?~[0cg,/`7rr5+BO = k?ܿ%@B,T-߱C +b Bv//Y<?~J ;$V5;!urC u4=\gႰ̀_#/rӟ(.Lv/! a熤X{!`;Hg ]_!#DϿ DH?B@*yOw/n?@-ks_!J&`gk=6ȕC5s-.`,Rm9V_ h`6&1O`OX[>n9}@2w(RAS(+`*֦Ƶ{^oIe*cGJJl,GECR@y'|NN lFk\+@cH E2~yj{<{kg;l%Lh(^e9P1yǞ.L]Ɣ|unFkZFk#wt~/1n[ZYRmǰfm5̋œ̐tKB :Uw>U.9G@|HTOb>'D )zbgAvUqs[i0 >FQ~TZeOW5wlD/:jkJ85 y 9TFCS޾I':G1W_0MҎ_Dk>Tw8f90u`w#[HIޞ 3֎ionp< kI -). $F̊zպZ6,CN 9%8rW6/~xcǡJ/+QiPM1=.agfaKrH7:G؇{N"Y[}FyjDMLM >qq_AG`*yW7@& | ꓇n:GsX-GվWdˀi zƝt J%\5 lmg$ zfו/>Ȍ;۝UANTYҳ =)AQP4&5ݠZv Yτ.n0{)pƕ!:4e |)ܻ%^N: 3L _$5ò*2*?փhw(퐷o t >Ē59ni=: dw(aD֣$ߞ-*AެWkp{qaI,:{h667̤N2OǛnLp[Uzޠ40n,{ zWB_,U?徢#3 ,'T51}+ w0D#{4V%(2pPlM!)K+(Vsьm2K1<ˬSVIK?I_;6zsby嵋Wdq7x DVIBD8gUadFݡ}2?aX,3fGmɉfb~Cľ: 6č% #;:dCHrBU!WW* )Es vX{m9xKtA=T9n2i\WGU1@B_+ZMr*7PKU_{JP  X̋07t=J։eqٓq&NVjx.5hGqI3a]9B46w4M_ޯeρ0H G_qՊnjua3u9oqg\~=ٟ+j}lp|N?hp_򲙚E}ҰnJB!_+Z=Qz9&.&~jD_!hh(X?y,:ֹD/̢k|G]_+]騽tD_!+W;YS«$/,_3] xV.l@L "Z+l @?_ )ho֨S;>1|_kL6? 5hZ_(F1sSɯgz@vh9"x9-6. Bv! GSF߅M[й e{EӑA?@R~IWXÙcTBoG,[NouldRk/=igJDy9K+Vn yMS_H^v"p 'KX4hhM% [|tÜ&>vvOcpH*&70qH|)Wi@3Cʫqp4E4-$IIOu`{ɸf{Bo,ޙ-ڍ^߳Wҵ .Fmtd06-V2T%@ = F 63=BL.HUJ^;q& n WA 5 l V `}SAE:gїx2Ax00(` bS -帑Z6<i!?y]tEo5l{{tCuoyD7J]`*~yͭ՗Jjn2LD_%y1^"I#oL[d@ )7Z"JGكSh?ORQtޠTפBˊ6Xޑfq5da,sOD]_ l\Kw@j>vL4ݻbpȄxtȂ*d+E/e%3T],nLpEyi@>d.&$['W`"yҟ?TVZ<6_6-lVy@ +mB{lػ|'p9A'{Cb3ձ+IW+|k|~sj"#,n4ia=?l4|p̚jz 1ᯋҬ>D'2(%omPc>G)Nh\!b%l# ۴-zM\.sxT3!BY6ytuXoB襮&ipKdQPlt;riI8exPδ2sb ZQH7QoQq>gвၦ@3_sHVi_ C(L>Ҝ]'^U\b9<\>ʓ[7:A\Fe'}H.Rf el BN`м#wV'ͳ[d7aΡBL"d6 G_@L"^hʎt1Tz\gC0" --cs4f_w] \9B456ywX` ˩m `w!5^]aeIz!S zxaecG@?X ~ x j*t25W*=#7ALMЊ4XR+i86c)m*IpP޵$Qs~'}3Q?я)cK+YRsay !A\D/ם_jr/p+92,K[6#.^/,|ڹ[G-qo A3>CS/ό_BOGf=MD ʿ4pk5nI'Ih$}FYJW[ѬMP=lݚkMzXT6m{ dg_%DC@XG4]PI"-ݽR]^Vc;&ё#>Efd`L ԙFYԹ1(d`)sbmPlFv$*Ws+NH}#ߌZ6Кd? -3i[ s'U9(F[nWAS5İ2R.:L]Cs cO\Z6r0+׳J8`LSy˨ i 2Ma}J-:߿Oz3RVahN">y#$X߷f[j=ht\z^ >j8̶2s%ܗ BUEQ_}'_Ǒ)h̜^`&}E^ _1Ed SO-/<-ZC)2ddw8D$;XF$쯂0sб]ہ-I˭=piFs }ngn  vCJZ&u4/-6 6dlwfgaiw݆Y?ܐm\]%i { LӊBC(~xn}0Š~G?m?e|.)\++qk w҅O~ѿjVtE ;N@}_|B1˱njj"W~aM2۠sʹ)k(+ H:͏tc̚ D&I¼5Sm!ay6opxEp>Vw|ҶMQ b6ͼk%SiA7ӽYL*8z"k,Ç`ݡE 5Ɣg/^V5|t% 6t0c0&_AХaWՃ7/KrSLТJ@]j+9\/y`"U(yG.SEilGl)L3?/8Dڌi֙I$zox=SD(sGK&p\`3F}Iċ\f4Ey3Mti>txSf6*gz5|ؑ?q).-//-ij/i\XCR eniLN~6U5q(o#nPFK ΄} ~& T ^IT Yǰ^Q7[ת:dq>̕5R%%Rml7sO Zg1RE9ONL7a9h>b)ٹC7+kp+U YHAG!o xFYj>0Xڒ 3詠8 /8W> IJ'7|A䙔i g6wCݐkbmBŧPMѺ"[f"I|B̷j:cfKuލ$M+)ِwƷ뙰G"vA!ӖorWĭ 4ΟRNuyҘwXM>G +es(K4=w;>b;$]DζI^bv_ucUp-^8FO3aM>!TJ𻫭wοx}bemWrĩ3x2SEQ囹f6Jw=;%]zhZܨ>U_RE(hf[ HuڂJ/9v޶#;uUW"3\yT+Ywt,F2> A@\8tdqxCXw3uM3KGQײI8PjM4QwoSZ>Ԓ0ˤGb렂^N$S<<,XXUH&?(HC;WФ|\n= ֓~eeoZ."8rQF JG=1 In 4kDgCY]ꈓ_5aNbW ==gP:u6-.ReXǮ}!R]7JB3@STV̶1]鞢k+c]vw!Npܑm5o蒌Ű*qaj/HJb5Xz5MlV{Z6h7c.Ӳ1aTG+uĠ7vOe%.E|&Cac`tԍEQ*jߟ4 #;0_f1˕k?*o+rHpɰ?NG.}WM m%5 } DgqWׯ8X+Y uX֙J<0jZ9aCǴ-8qPk&!`fsaUAGT[M ^xBoSf,xo #3{T&X5{H%U`!K49{y(Lȭ=?\-(@`mm`EšYm2b B+y{4QXׂcQ$˗豗>ʹRW"  j }]hbE`0q1B/K!tPX0w{NG?Oz>xjG .ܕ lWgIܷ~Syo4`zL2鶺˪ZJӲ^mܧ?~nIiN{㐀 -;8#a5Щ/QwǶ@̑A_zbNTOjBxRb1 Ab5̛OݦԜJlI7{(FW gÀ7əMpd{>S'19VX(4[Vf:wT2 6~$[[B7u+ ؏$nʥzWCt-_}HnX}[bVNcmKzZ#ku:MW5N Pw/JxڥM?6+YFXXe='v@7W~ܔOF $SL@h: ?o໤+} tDOѓ^RZH{D8hW} [Cp{W̫Ee2#/SDqeЏk}<׸1T{ AS7keDkCkLYw~I[=1ۆE95goyER|Kt6k+>ѧVT<~Ax6D|\^9rJrRݽ#~\Ѻu!qĺ$|uI]ff{. m%n߸pRF /#/06 7BϘ©q57y*z{gJ>LIriv4nI*prթ1\?wPi{=Zl [[Q,G hWm?m;kF?o0Uf$Lm.'kt8U+ YJ6&W{6E>^dBg "e:/0_(CM%;."W}N0l *104Y\T!vi}0דǟ7Ǒ7CYO$fCC|}?D~h{ hneI7DL|d'TM?eSEm>7My߂Whl**[e|V6Kh& yqiㅐGN;^/-Aï @28GˬJ> Wk74Њ+[^i{Ti|Zy G2G1{c:GҗN@YY LU&d̝(pSR#{4Y >"sFŴJ{iu=P5d ^|%掶oت2iXiQ١2 ͗Ť n>wIbi erIck//op9k}䮡G~8Bc5=ҴΧEm'$*Ƹqt&mɖ{_2K(X~E%`1 =+( e5JJw'rx+#fS JQ9\$|c~iPNt7%BY4jE) Լ3BC52ׯLD"زA$8UBſ~nS9f1yg^SY%AP$᳛@⍧+MɊcm8/i)Ϻ ~Gu(p+l~!<h/bk2p}sX7$U,jH*$E\Kg؁:G-֪UCb`ƅ`"(GKaL%m2#yz,U`|Q(KP:| m DKWJ 6TǠ"\KK^!/,SI^KbSeGlHYUg.J Zז(˺g4,)ΈUZ/>F?d>s#Ç--Pzurخ,&(-2ܬD9r=Uˆ.lu E~򵀬5[H iloM(̅@JT9Zܸa'QKb*|ѕ` aTVެ_j;Z`'K7d(AnÞ8?I'mJX4Dqvcg {kT+I,f`M],bceQagmFH)[`y _ wX^!)Y`o?s` G/yoaM`;7ign+=bq1GzwHM~ư3eK&M4Ĭ%{ s7VL9|FllNB~ <>@pWTcaDn2-§% |+s/ swa{YJ{pF1|҄{$}AJ2gWbd_ԢC @WQz-I|!G69JOJR6KsK#kM+m*8lhz ?f -$Izo2\8JUN3\}Xd؋$P~1kwoyNBn&Mt 4 >r>$|mI*Ds,7fڏrXuMI%<\g NzuK8ywJ#u#ըYq!XӞ!?e/{}Z<}1+  bjˬyb5 'q_"'=J◻ k[JutTF/hqOмj1+-/ΘP\ٜ˲# jRFG{FBm94H &Աq0%S2<6?ePJqmen~yoX ]-~z2DXGHMZw@tv&4g`jP,s' '֥* 0IH4rR#L0=Ox_M_ @74NWnhH)9 h:BL&ha'8Y\sӗԣ&+MuwY+'$X.c XR(y_ph.i*^ /جr>'}O6!U j~5Ib`p%sN,|;V(HzD9*p #UxtC[!;mIz<|IpLWJ{-78bJW3F&O<+o߫k$&VHu7N]s,kW'Ĩ#fd~=*Da.WxtoԷ |0yXhny i~d_\@َC:o>HAW{ka{&e Z0)'frX>7>\Wkv _8?/J&M$Ǽ7wD;~=&YӭJx0+D|ΰ*fZKaZ#:pRow}gZ7yF8$Æb3fIm>|W]zlgmjWɇَ9Ury X,̯灯y۸tە$X}JLF  bΕ9崊f&:x/Ϫ*JZ#`ndc)׾oIKi>l^+( Kk Ҵp 3:ۮVv nVZ SN$qhe\!Qr:],b `*6eG媤˔RN̑&QŧL׾cB87LR|݃0څy痰/ ,;`697a >̕U<4"T^G&=HrIʞw(=u)4Q]j<52mػʔF{P_h zɞ N mL_kեZ$ `Rӊ5O<.'3~ , f9]4p( T^O ŘW(tܿ!})fC>{9E7!;B~pA/592- 8pK)ܟ?ݼHj//̍OzR}s֟o6R)[~)m"rH]|[oQss=RZ]Pr"g!h+|)`P$>Zj]!ٕTuA4W=j&qWf\7fQ9{%AȔ]2ƠHH#o#ZnU뾞 4wR3{tcَ< Vn8N>N~LTuMT LObsݔciIv" ot7.Mb,+%?}#/br­d@F) ݹ<]QzZ2!d8^;W]V獊EcM-#de$V|6&>}8Xq&NC^.7P/k92 CeU 3w-U3wi&H >˅GEĮCDQw̦ q,W~,ѹ iT٬MuX::ѿ358Sмk~5HW_`[cCn6T; 5cx.?vgvvYJk3}OG5ub{)ǞMLQ<96?Nf[KdZph+d,6LIHԛ 8l<Ұ=N oMlfzX\dha 0%ǚLh$2v@WH쒰أ9dOGUH̡c?hy׬R=;nV3Rhշcw34r#)|<ZK cJ3ּE_F/Lb~Je7o^R !-&gG{/) hTǻWBvcj$ u_BPDDsRmi= _rZ>&xZƴ>_藎=0Vy{w=R?@@W,ឬpqF)pnft=IAlE,>v%0z^Ut@}9ׅimAyzcL;K[Am }GAF qlg@lm[$=ST 䟿p[`*X~<7Y~Or$wlzkgYӱv[PE/V-[7:\ =KI燤<"ӭĭ])'AsIjz55y ](;H5O&TK~F[[bQ;T;\VmVS`9#c%H$raф??A$e Z2W-`4;E1iu[MQ2>4Nfa<=)s b} &}CCzr&g-34髒շ;!i+a? :>lG2j FVi3'ZMkÇ]H|f;H$;7I0,7Abodɬߓ9i'ŇxzvyoD2Ꮭnt@:lb/1"Q2VÌU.gM̈́z||+C>v5?F9n,ٽ];(2r/ND\B&dոf;*-0v4W|! f\LIygޙU@,~i ic)\!C5C(9םG^'hfC[+ߑ>mǑævLSX[ks慣/_>LWt AAvml϶ #ҹ-8C \XHJTqy qa71J!!&ԠrX<EFZ8,r Ե4p K!0Bq䴠l+N?mu5WcCzE~ Dsέ*S] z1RjIp\ndd0 8ڥq[6Ffe[X-TFU4gb1P4, #e}b0|:[y}ߡh)i,b?yEqO>(t[T謺M+31/"1 v*$4+g \\UqdF88՗B0EH$tkwc)e!x@XHhKC;tU6cdB-## xy*}QӂП36H 9<~X`W6NoEjw]_c FeG8=*WT1+$n__>P]j8^ShYFxm_ojV'4˽33cat#zT>޴.Lb+CRr硜&m7=xW`+~2(1y'bd+ )4ܸE"%c7LNсY%ߟǻ Wm8_,9Stj.՞uL_.Bz Uf@VVw'HOaظ`Թ|El5 RFt"6|g`"btEl R3T'ӓQ?,UxigC4CNC%^_vEOs0Yٳp/'czti´ Ee ]I.P%sR%<-Ә>VJkBx [c,tx4RfT?`D:҉6;46Te$,53^( Y:-ƳBg;M~PՁ~vhq^ > ߧ5P,_E7{eDܔCDb &+ST(ڪA5x]{Lԋ>!!JCfHqHDz7lV{=>\ @0$P~ωAMDBt˸1PiPd(q샿vMVrdkY*V2') n7Go<9\(ffέc%;^&Zg1sFbϴ=vo-d(Y)hgeiۖuL3H&BRҬ"z{^0m6ߜ(9"wH&g@*Ցy;])޸NXE#HiljpDGݦQ|+ QbZ|oWּ%9K4£m$#}HyiT"+?Tgpլͪ;+Qc,R 8@/3]J`^L r&\hM0dy%L)=/i~@t*YsY3kx@%'~"aM]m۵DşJdQfiN蘭M.$kl٦{S~WĬUMi1N|03%s`_)!\%#"iMZSK۫P8 -AÔWQ?QgqpCWuz0nԯV[qJ _&CEqKD߁֊Wf=\>Q"O0 S^rAvm2m2pdc<:E&|EZ1yd\ (. \߹KToB<3xI5g*Yp;t9cJg(cj7~@ZAp=c# U`xQtL;a\jڑ_KID̑&#/ƋWg٩9Crf24|"5χ;#:t2get#tnu2hqlxd',-cG8 \vQ`=Yhn L@{[NNn&X_`b6dmd KR70׏Pr.#_/W%.zyI8Mښ@q ]o M?NXmO9֝xX^G&GYjGdisdi)JLy#V؈O@q1IKz[ʰsMY QYɲG/Q΅"!KL:(BtAB`OziUVd3`y:!igO$#.C"UW<4J>9q)>׸^v`i{Ő.v\1UV =D㤳7%o-:Y{P:i'ZxB,3%r+_Ϯ~ppi>U4/l&!(I̳=lя\0xѐ.N.fԿ~QܜOʶ6ytFWQ0]n#-*ӏBoTz5ɲð_w/-*f_vlouCz$;Ti^7 F=5*:"XB]T 9N#M4|a,TS7*?xj9粫Ԥt A~T7*(`锏 ungԴP.Ee,oVO\Bࠖg1e;M4mډzmyiǙXE_'Rd+(k%HgUER<D)}R B߈޷OO<5K<YyG;puwϟ~D"GiDy0s 㥨nL{ynɓ)W sriGcʥpoʥ$ 3_]7(Bx"8~]~bcswMH G8NҾY!tTFLV_:aOi獾҃jr0CҲwӟ<294F{MblEu*]Ix[N^#gd# =lbz= e|8@ոf EPq lG.x#-ʢз{*u|Qrj@.â詏XP@xL˽b_ @`0Dl5>ؠ~*:^0HO@ ?JJʶe,Ŀ'd4Q=6;؋n&v(+q7J qO0[G5 "vX"K2J-, 'SeThXz.dW+l83UnRGd)y9mY qY7pS:gVׇz̩>)SiYg#n>g?>-C"ܾwkmN/*09lN~;`㤇W̓ \?$㣂Ai=γyCCH#ЧÅ-H]2G_-BQyfk) MT4}73%_/ežpuIE=$YkN-7,X+{8Vi;n3ǾX:p{E5Mo=s1%2#R)-]|i/jx9lqkժߐDxB9D.{f LGO/}Xia]v׋"?+e[$/̛nMSosܾ1n(BI?Cp~ҥ"2ߠ LqM`t{[M4ipsI yR\@2gC5aY#P㤂^y ?teE `dBXIOʉM:/mS6 )qj3lR%0'TVŤй$zWoB_q},i)*ˁĽOK[ilT*^2^)-\fTYGVxSEm\-qw>0zZD󃴌3r61iG@ Q!s\&`~ ~mYճ_u3䉛 9Woguuyޘ^8"B:͊4:$#g*5ٷ%7#06NFJwqWFQ̢@UuO@#zOUd+즞\g H9\P&h}=F4_1xw"~R1Sdɴ$_S \x2P_EeLcנ,Q'"M &8@%)~ntp_N~{F h]E̳֫e.>LDF>Z۫MN.>gJCBn6B (aK9Ԭƣqƒqŝ!rȁ1cŌ)" ^{htyd[2e:]^. }Ɔ )J?;2hhUnH.Jfv_p.A^|~FgAt4y}1aAV2Gj_h4q|)&K< ܰTUF1 F y/D?A4*Aj'9˗1w"*d4g'Rfg }hם( @][១ɣf#t& X?&tN%'GfL=_"/Pp-WSj4 I 2a"2H^Q܄"{>I-8UvݞD~d- ; )l%IfR~gUhYinFc,~׳={Qu );zq؃]G qnҶv'XFIj1i~cHceG: [ Ah 0#gcZ}Zg.@Θ+W-wppy/i~X^pno*Hy$ i4zV*shOFa&oxj<9QrZ W sL 3Pe 9rFxbލ$d]B]75 C2YA[_؛˕ч\Ml ,[B9 ;Oa1Y\{̉Mů*m?EvL !uD:V˽;3fo"XǕʦس'ubB10BȐIj ehM AI$)UBvVA^'(dP%7GtLꗤ(Qy6 m{ީp?xdN hS Ȏ\#\4YhK&/3)qG9>7'Z.,0Q27W[(P/鄒R  .\I9|PsY-\,e^jfI.X&?ٕ2&sg[2;5A=|~*.jK5(Vk%%S4~T CU{w<ȴ#?~3c3h\:Ë)k^zirf`oB =L,0̦FEІT07@gf6)XjۋE] fOUkG߹9sKu _Ex2I&=xF3xkt|]ZMƣ2O߁,m<Ug"a?bB aE=xdok*jiqcmϿ±dG:QyEGTHB>BȦh)>v ZmqRv3vXVdp+(0: J9fE|/?]UaEj-%..U_;< $ vk]r=rF)9U >|0R 3|<>D.mUv3*Hg&-Q Aih "eiי~CߘmhԣO : }^{d'lU?V!(j(Ҁ:G֊P$XIn%602'O -( `{:ƞ?XL @bDJ.0xJQgmi⏱N(:UOn`p=/F3G`{{<(2IVfv.~w:AJ^!E7 4"l ?K5Ѭߜz5w`D??Nsߟh02 mE*d?MEPz鰪 Ə͐ހOD"n G#2+.0S*![MûD7wu f6iSzݥ6JUSM} ro #od}D>9?,t zHJLڵά)^Eʝ-b!DkdrV H~'M θbylR2"yq k:*~RY҅806uCw9/HEzV?[l2FW+\tMVUJGBBFyJɋN0> stream xڵuT[ Cpwww%^;R)-Σ}##~k#"SVc1s01t31Xd@[)J9؋|n@ `geEHۛ;)&s0Pќ @ (;L.ojs{K9ݛ3 'ӟHE@SwhoeV`(: AZ{`P7hIT4:::815u )F\ S%#@QM'ϛw uue 6?k̝]@77fP{spv+ vcaqwwgtu3;8[2;O pwp]m*[9V'y'Ivo|szM?1m6W+_; ln7}3.doos3 \PiE]me޾@1?j6uw]hٚag@De$%ԙϞI:`_≈˿"7֤fbvvo]OV''Kl7Sw3WG {#4XNsS+??b?"z;:8,. vv57 d ~k󷣂Wt{ 7&R_uLΨ'E%jk3d_ce*t I2ljWIFω}kݷ3\{JS{s_*Z C".'}󗕄 tvz"5o63[,7+`gGy,??bo `1dX,9,oa3ߎL8,V,@.?3{bxѿqd{37x mjgm-aCη ,?(ORηڹ]7 E{ N2a5 v o}3T ufe0q\jkYu[hTᩄKщb2Fґ ܾ}T1JHH8{wϊ8QuwQbCڰTj'B.5~ w4 ׀ EY wD$9|?ړ2VJA3fd0 ٬ SP3۪f%Hndy 7J[?- ֎zmqPy0F ya ΐ; q&[QUC"([9|ӌ~AKi6n"qvÖ5|͢}d֙wg?_.(p~vp2.6lNv4 VA,]^tvd+!e7*jJ:Xh7Tgb_ 5&|E$_ULMLretq )7ˎQ];@RׁFH~~%lc`BGi 'ԆuOՊ9e6t1Y3,jj^v&(wiuJۊ"S23r/iAXeyۚUXA| FOy,P-%}Ś/uϰMki h]ĭDL!-U^gN'i꘰"泽M.-nVKAQ8`ibmh3הd5 18stq~lm2g>QskgӞKS3GC@F4 B UVXL%VcoP3L߃s JlZx8 o.忓gCj 3Dc k{U?L@rGµ ?g>!;e軬] x& Y:PjCe.)Nf2Vv XKQAl%YjDg(Zc`2}4.ET[273#Nm]Q7 p3~A-LiWBF}Ti{6œwM8~侘il!>ۏ6 puj7Tڑ֫oV7I 0K \ɦtB%PmjВ$V' (X:g{챝wBtfЙ:>cɾ._*3]@F5H*9V{{^K_!P,~\ʯ(ӞR*LtF]g!VA{1jkSDlzrfd&.'n, %cƪѥ͔l^ʋǽ(\Čk?Srʿ~|`F9ok)^–!=I{'9W4Yay0ʪo%k V>|^L݁KYou<$qzW r8uCk>6NlZY?l,kѠd"a"^^r"sP'bfeyEY\M5ta~4ˌ͍mڍC#cW8#^1 vLȵQ͓ىۓ)~[QTuB,8ɱE+ ]Wƙ_0М?,NWF  $q<3 ) 7{zdt%FڻQr1^d|rAB:*OB{A L߃&cH׃MSLD}_Kug, $|ԣؓΩRRGjb<=!B+XIVu|g-7e%rjMϾ݌"*͏^-l 3~^6cl_$(Zǹ'tgFCBi$IAhO^"1tQ'1S  }285H[j0MzoNٕ/˨hiBw'ACg_{C0hx5~n\vɴ86bmןzz<&$ޭLv£dkfEmؿ3Ÿ1)23!;]_!Z.>If]9g] gRFV "6,kӲ)oK\+~?y $x>TJT/"rTBLm#e*UÊ 8KŻn/ d/hZ3rsV?c5ͤ>fwI40am3j7 7ʋzaG>0rXb3c 8 'd@*&,dN,xdcĕ"ºV‹;lYE:UO?@SXsNodvmu=DG /xϭ~q[O w֏0YV-j4sV52[cdP;6:'Ƿc7W$BJU_Wc!epX,cR+LcݪM݋}"+ޭ9bBj' ikr0}NЍ BT쒲~}9yRd„{@ІL|U$rU!gpVs}I[tf7|N ڎAVǢT{hVF^^4+tԷRPiu_k~C!nRr/>`.^1?~"!% t]{걯BYvv0aͤ啵0|R2Q.茰'x#64Q n$U"JHC1yVDdmƠBb T56^1B wQH,Lz%;.gض\#Q5~}ݮuDh_^dM"*vFj+TlQnclۧ)~y8jxS.c(¯o_x.#P`M T}%SruV;A!7 Z2C`jGBϭS0-!#AQ޷I2/㖴.$A'Ek3o`,!cBbQ? -L|OMa680&fUUΘ^1fNNY ak8E3Y3is~ų^EPNd}pz~7Q;u_ڶٯkzJ6n0 p/;!ȝ!0Os8/x F\WI}јD`cvQ;>L8B[uxf(x;X}vl!kջ3l s[LCb+)) 2X| M]ge˼ZϓŪj/ovW({B0\7 'H5m :Ĵ 4Osya/c6BIB%tg}C8Zݶ d"JK%R)U!ߙoYj6G ['YǺWX$\ ̦N,>V1)atI~T_W2Qh3pB@^[Eᅲ!4OX5,>3Eѐ FֶK;TJ+\*%2O7xVg>lu 8!$+PHp!YޟבLA}w\h?_;gU5i=yG֥kꪈwSQG6uͷD AǞk)Ĥp)Fmmrdp$CNoIpG:[ _|ËfEpQ.PU~|Hp"\ݯ$Eg1wqS^ Td Ae34x}bV{' JBme%}*} ȁJm;-ai)/Y*;S?gco*<sLEZP?/F# d2–}[t'd5 /bfqEAff+ )iz%C|X,b|B!o^J+XREC"o9(Vi21`DAɯjXbL S^(z>LJNk M #vVK@F#XPeY,rA)u^u1iÜák^ X=_|D2#m]mOXs-̢xQ$dt ˢ{/9dzLj%5hք ${W{脝c}[_ XT'J>o)NJ-C|宽K ph})qЀݧH@`ƴKauh]Q$YM/xWI߈BgڇhiQ`Gj04,JDz/lb¦nKW%X QW%7+3yӤD}"p~/ş;yX;Jub yT$] qπ)=jǨC}]*aYN!T9!12`x,{gq1S31a#Aw%.s;7Ɇ 2"ʯ;L7^ &yAЂ) C_?(AW*  UKyel>[.w9?QY&_IAֶ1.lNub飡fo9= (nfK"Iz^F0!%[C|ɢa$dqjN'#qtژi=!x5ҍHToj~t䒭P$[~ uu.uc=AIR8E4ek_WzB,T/_{gjjkJL\6戩@!l:y"7 (׉ZIY!X1!iu+敩%5Ϯ2:ۘ^} 5r&*P}w;w p9|Υ%ʵ5~ 7%34R1'`EM/}7߄j$_@OE8R簤DXbS^6O5 &(J>ƌ~gyj9R* ZƼ W"ICb]_iЈf%HN Z.Y;$f -|`b 'jjRarڢy݊.+l#ᄡ`cS\$n{p=Ee$7F3cs{f &%3Z(al_>FN܋Ea^T_1mjt6>|RBd>`#?XDm~Zp%| zUsR g҆NP95Zf | :Y"Gd,ĹXz!wpu\p.ww"@aurI{ՌS)j重y-j%r\%jO"^9 #CaL7 MMc(Eq!M3?Q[ȳk|eΫ$\.!#Wn,)N-yE˗KDNê4V Mguc3UQ}1C*q bjKݯэ2x.+e;qO_׾.%e^DǢ%7=;7ߩ&Β+fr#<4kfX%"{"*J25W1=^s񊾝R, `\juڽז Ad[]okj"+n'ZRX %ٍeɫ&gSlIJ5+C}qAD", 8ɶr)҂.<532WDIk˜'R .DuC4ðɛ:sX(ᛣWϋ+Lkה~lO+})ih}0>|OJf{wgygpB\,_ޱ&nJS^s'xly)_X3KnogMFj ^l#ؤD8uOK5ꋪD7 h$_'/۬k)_az` "8z.쎲ú7.9ki'܏cP3ܜk}#Cu*{E=d^``F0AkV+˧,be82v) ?sZi}QIv$ [LNIy5/!:<|H_lw++0%y] Z(US鳥>=t~wPf)9}ugXlr7= pdum2Z9l^).Ķn=57`yK0Q!d(,siڣ4X';Md F͞$c3'G,ܖ aֳN2ʺQ OKب147>PO gI_HkV.l*NB ''z8-d7,P7^he)BANV4KoT+ 2b`I9b-R$g9۶=K<9vxX!J)Faz >7e7qT*3qb R,#V<j`w7{ }Ex,l# aH#.\|sg'jP! X7Tv AW> >GUBJ&eC?r' hOtjklT"ڑ;@ N"ce i-9ōWΧ{$4 f'dT: Bakg $Ժ0up=ӹL9@uN z3|F82Lx <>`QJS>A;|nW}˂{˩ol^E3 &(M@>уwI1qwbB0S)ESCmF@Km9&*I7Eo"٘ID4&|+ ZV\Xh@6=ݹe$qo 33B ǔ"+|vrlF$ea+>D J4z$hl—! ~nKϱdpwiZiDPHtDNS~L7J@{೬N0ⰪVITӦq”7~!793D` &7͜f;kz顔`Or!%iZV>0sq(]#!$gPcv$}9҅]夀7.uVO8|6jǿ:f!|$q,hez;-+ט<}4n]]bL^=hH${ck> ^9m0'p'0]LE@&o_֬sOg&p6cSry~槺]ʴ&L% +һLiy8n;zgOsFO_,@IY?3]a FO+iJ fOxYt i5J)~>K5q:.褽 |nNI)Nwf.͊`*l4.xGjt/lfPjRVN;R&4m1qDcB"־tbtd]mG.[TkȣhEJ,O^%,KGBPovaZHLr!W|+j|}??@Z42wU=[X@SW-<ivZ n#8HEpt<6\1c 9~V(ģsJ&Tij[~0VM~skû(\p Yd\zW'q}nS-I\/&3eܶ[ظLpI%, A!eX1j:XxLpP<~쓰5JÇP2S.so&mQw6s'ZvB[ KGglmyWYS /TOZk--nwD;*kDY^~k3)},|2',t旼 5!'9Yv<'̍DG@z.]F,X@$8ſzAM>~Ibs rT;F{2yȆLhPݻv6iFoELڋ!w#b!n?QvkQTeuc}ԹjpH'&eӤNOl }_/r@0JS AGd9AWVF<*6(۪;rBabD.($3f=LDHk#Ϡql{ 67U}JP8931<$U"ܧ施@[76רǠIЈʺ,9F,_dkMjZQ+jKopްYjyIjni9~;GwYZ¦}4e[t/k.֤Րo{2yM&dCOކ&d+s"ՄP}m=%ѵRL_;M`AZs㉙/;4L+ӑq 3fmؤV:Ȩe/OOd'ۺG+22xkKvdLڭ2Rqf,H`::y]݉ZhfTGfV7(",&3?1Mﻄ?ᛒ[0fY50%DdQ_#8 9ߊpt+6iŷDA;qdb|9wHfRס.&ЙrӫaO]K 3ԎNΩ2)Cm0C;6G b|X {ԛ*j;ȰnjZb0_:R15E|$I.VXۧ`?Vu7d P h*EhbeowDOE$=!JkuU Ei~$v|bNw|yY#0DS Os~;R;^ BfdF=ޱ{}U'v.` vB :-A 3P8*ǞdAZխmxKge^ˇ^+٧լ F;U#V:#n^.C SȋȒAEviO IGU>)m~!0`]7ݠ,1.9MTU#Kzg" E(Y=S߲#,"{g5,o*!sˆ~HHbQo}L! ,S~0bzIP,ԨO. KRbz}kz^C>;ζ8St z4/DiS<R,RNC5=Jf69T`⠹u:mW2,Zpο}+GN#!<͹)_j;w&WUlpr6Lwcs䁘CSvvGC:u H^<<7,g.rǖf7GZF!iDY@UiA0W+6ll3w-TGyO"DQV "aS/WbR!!_JoCNgGk:k!f5/lK UſO+ 9Lè¾K$ _&\yw٥ ]*iN[~;9_C6)+b\Cv߶\x8ʑQVǔ^KVlJ(H7f>*~}&^'^%r9]Em8U !6;Kl,WCVG)ڢ6S7yl_Pwje1btK pM"[o}4[)BB7^Nzd+nTN+JZ#nՊ#W_&9V't`\ 4W誶0Sq/5~{L'|nBCѬI>_C}j"+xtLl̨|bLdjn+z=ܘ\Do&RdND,aXeS2_ N:1ٸj׏U)uj;O05,kRr}bJ κ?_rD`] Wy2xaF2ۘ-We-=QL2A5,)w8LlDm;vځaVd<3UϲӏkQIR*A*Q&?5/$;X71%A*2f*[;ԣw0s%;{"0;!7gC󚍬]*(u6 Ɯ %C߹{c;dcn')z3,Qz7F}kT,,zߑs"J-?S>wblsWJ*{?¸f[@ @J0AsI$Ş2㨌ns_[LڒpGf>L_TN>ҝ\ 捸5ư3P~uB|t`/E3HgC~xwQp85gQ-l"T8 i)zdx|aӋ`v:&zU:kHi=0\VaL!S;%@F(z'=dNwƌjFB>%V8 aR{q0pI :TtSA endstream endobj 117 0 obj << /Length1 822 /Length2 1149 /Length3 0 /Length 1717 /Filter /FlateDecode >> stream x}R{\e+rb<~ mw щM`c{0N7m$C ~<089$qHQBq0D21Csr^N_ 10[b4b &BaB“4_0D0 *pv pkÍ`nw @EJpJγ(~E29N RTXHp bd2C.SHy WX01 D  (/a+$`^M.ApUˇa2i01> ĸf[!:1 /E#~~R%;3n. F/{,DnvKbOdt9ߴD]z6̙&Z}Tg0wblmߝzCt\Q[^IA nKmg9wLA6滟}ҫqʂD|NZ%etf|Խ]^y)?Ѡ7l`Ž&ZL;۸]u+fegw+ 3I=th5ϥl+3TdSq>^biX_:/x{SPlD'$ v3~Kb=tfxI9mfл d.ݔ~0wIvt6Zxr{φюCHScYej-:53]r両w\Xr  k? \3UQluF;0~|pSj}4E>)IPiS䷥7Bu%<{OB?/6j;^w}ϵɐJ-T+kRS5غa3se9UݼX=ULHPޫFKg'Ok4  6cI 62X|^eQJ~3~`L%N]r<dI uɬv$55~$N=1ٺR?+zhOv|yMeL$dչ-ŏ7F8T&=3 4v:V}J̄WvKrIv#(Jc$)7jY߶]{͝WɢlխGP^HLϓU>m93ztx}7.Gk-n/O~kܣ3Vk~lG,*llRUGxcds|꡻5,ԜAymմ•e VW.&Jz%EUA׽^sЪāR; 2ˡ& 9iJ+I>]v#;7Ͼֺ)}=Ri'F~}յ LM&=3sj>%~7qiۖڹuvkǗ;b['Mkț.YZҔP}vŒ%+ͅo|NJ]+U endstream endobj 119 0 obj << /Length1 1608 /Length2 8904 /Length3 0 /Length 9734 /Filter /FlateDecode >> stream xڭwuT61(% ! 0 %!HJIwtwI|w1kv~~5,b0S4 g`e*ClM4@PEq9ɃNK+a!0$́`3 ''(sXZ Z:o4uI%Hق'A 0- 6` AFY (A6@UGSPb:0{?  jӚtA]vBov`{[7AO3ÀO~ _Bv ۧ*`fJJ' S,2afZ{yAve Cl@O!i8:@dhٛۀ`L}[ ;;׿a`E|im Y9 ƜggHaPW9M* dߩ E7qUv_mlAO 8ޘ/d q5Q41pB!.`sU hy_lo;F Ͽ4 fo 5WO&),'ᚮvO%0a.@w^. ;ecs{qV!.@9ZF#5 8jZ6sRmj?KgafS?+_gvJh@RSkN^/1`:g!ϴʆ5|MI؞H˼ }pIe[vA5dM\Ϗ}r|^\a{%}"2wo.n꒾}9# We<\ =.`G/*M F `SD(Yk9ԬvkRbxWs1ֿMMpݰYCd8Д//eUH%6US0J~wڽP\(.K g| LH9 QĭϦqԓn^%_LXi=}XaR?2 `9%">a16ִ.F' (~ƽ^ޝ6|‡JS7ΐ6ΗxA׬6$pG;>RO~RTM6^%HM>Aq=a d-|߼<[[=GS XN:&XVM"ֽPq-8ք .QBNbʠf5lh># p\x4+KzU8$3$k]Y+2A|Sݞ7[БZh-^'#i;OZO(-9_so51T}A5O-=v/nUj;5]<&A |0Mg}1*3}7 e3S"X-MRRJ*~];][_c pY_١ȊW̲}֝XY}stع&l`(*tz8r *U|85[_#ؠ؆Iߌ{)|Ctc lwr֘HњlzP_>֑meæy`d qwÙC W1Ej,'[l2A~hYfaDpts2kS]䯋zP3gN(FעI,^!4䐥f1/E#\A*pw ⻶&':c>]Cy_p9xa0xf}FسQe(t!9#ES4e B.hj.c(FD uEYDܟV;rnk X{~%ti8~lcr,?71 t7y3.!=޷֩⒍:szHWi<zT~Au֭,>KMG/3VL2擎}':.L;>wWy6vw7t0C9 !S T'Dlj =Hs6hGB!&yW)֥Ńat!I!gxׂg׏7k.y'|qҎ4Ly1F@Bԙxේ柌|$A ],ȁn/ <v'bcҽtMO7~w}Iqi}(-Bf9ݻI'\Ol ɓ'tާ{53û$c }GHr$AVv%?4BG&cC!"c (]Apg!@ ̼ #FpwY(6ZTatXr[^\E%HESjJ5IayױEXM;`6b%L@md  yZq47esGGGVGwD`IUCʾO4LĐ#і,1<og)*/ےr !|s+<֣4sFY`,%6 TlNkgA"ivGů@I{îqUi٘ HUܛsSW6??^(a9p4W9[5 fKsMM,(9<nDlVRhƐ=^k\emNQ*=kU5 uw*͸ΉK`%|)dD[-j%iW,jo w>Ş\ϜghgWIHb!Kr&} ԙ𴍲~%Kg8 zH9CD.I?2.=auު?*qf՚?,=gN[VI\6;WfuEdIz3mf:("xh&ymCk0+]!DeNp c¶YH Mu1ӭ)F pg~J^lB_$LKSWMK>Y2kvr8 I)7P0rf['FR}ER~o,C (4NgT=N&4H8_IԟVF& %i7dˀuC(rqA䛣5hv)dU[g2:yu5ff߃]riC] AF" &;yp'4nWG{y3U!:scI`b:ga~[NLV!?z[ڣ0D19VÀ)+ YVk/LK_PSlJnPV9GPox"Ŕ}q^gn4a\>YN|5v%lrP񀙾ӨʝI3#$°4p(rW_ ,ң5C> DJhEDs-݌!GhWB[+ȆMy]r!V7VB&'[B pEG G[,&oL?8%ϿU.ZcQ-SL\/6X*L<3}2ɹx\ vIf$%zozĈWl{}-L;QjS`;dӇ7M߲ IgrWU?0W3EFg=J@yׯ/!\l%"w$}yd8r+TC}* ka?v2, 5}Vi]"M $uxYH$H}`$+I_Y{Un`7jw+<ltZ (~)\BQ)mW cu0MT&gb~[ 9Ý;SYFBWl'g{דt>B-%!ZZwSnN";i~ @l86?93ZP}#X3QӊŲ+na:Gnpܒ~_q㶞)"y^|G^=)s~mw7.KrMX|֠0)!hԥetFgnqXض>؄"DkQ z0bVs2Ò e?4M+PKzXgrQ.|S] klq-1f9$%w3l-D^sFIfWVW>f92AM &2KVKVx x\RG0R-.Q mZC/Ҟ-o̹xEki{ k.Ճ~,_4RZYks#7ˏ4S63bz:UICp^nj&9uV}T_aq/Qմg2rVM̠+5{£wۨ-UaXjHkB$`ǖBݑ+0fX*K",k(EQPh@e(ıkG<g3ZUV`#t3c| +aX{k*AoB<|exc};9m ɉ /ZV!enB QUՊ&4ׯֲ]#3tg+ \n1wL?NC$>֗Kz2hFF™oYm&Pk)c|.%3Qރ6%LXa!TJoRϙxG&ʓËnœ]b1ϏO 7ԞS_()KB}L=F}F5AӮ5.cƐcǁ91PiXP8cv<$6f 4s G2xz-F8ԣ{6),;|@ۢU٩/W:l&̐kjw=M Q/Y5$l Jsx5/pKfn.2 {HTsXY~U5|50 #3as$᨞ۥ%kmy7 .^]ɔlrU>N A3+*rlДQ9'G_jE➅C4'-yi.<gmz'U^(%SֹCdP M ZǎwYŔ;^WWylZp"Z+4IVE>Rl $=b(R'Y}q^p|N-iFۙ.n|B`P:M=#ōօ:f4TŇ_('ϝ-孤[C:&ֲ%-*bշnd- dxK$1LqA:8I.F U{mEqը"'^FRix$$ԴXē|BRozălI< ҕ7Gǘ=ރXTrfWWΰksТ+󡙃\ȉ d.^`9'oDdM ־K8 6~[En)Lj< ޭ0[PE;hc:tȾu9F}"_->M+޴?OCRL8ae9ueymCu'86o@[t̳''"{)$imt OP_hib~witVF3ʭ1 ew3HK˺7ya*,Kt[ j`=Ƹi&zsy#k,~ZI Ѥ&X PJj?C|%U 3hʳ͐wyTZa/?~ê H"$˱# Î,Gu)q;-MF_%SgZk}s6l%aRjh;VwIaM 3])P\gMıdb|өE7QJ{߁"n(4 <3e\Z>}}anGu>)_5y7:D&5CĴs|g`O>p]+c?JPEK1z@\Ӆ +pHk/AWa(xO.o\~D4"?X_n}k+~("iݣj -%ui& =NRx] d߯׋6MoPWiv^'jZӭ|20 [lD,P}wQjlwqZS4ɉ5g8*9#o֣jl8Ǵ8az7xjt&*] )}VjIw#e/npE &:헲,,d-_"2g|HUbx¯wvCl觅[j>p̤_|6Rҹ[ŽLVֲp1쾮Q)-7Zڐ#Zdu-ʲxל/lhG $q@S%ʕNTɚM",?/}7{:o=UB:kvk濬NS3!蟦yd8 D]]DJqM4鮟t!֢G3IQ'HZVRq:JMܦ"{Jƛѝ@ٶ%MiDO[`QjQ:&" ! 0W7pƟG0{# (/!u) L? HJmj1g+)~b 7=8FPE.\ܾˋ>NW}|"F]:ӢY/BBȿ*2Or OH"CGteZn61Y(acq?ޮ· yod[TlwFEũJ0^5K/uec˟~oFђ*cLgsAoUYS!vǞ.=$9")pv:5`{bg6oSDXX\ijL&Z俵X :6U=ǒsγ#ʔxdW*L8X6p\QR>굏#Hu C: c~)k*aKQnj9;+Laq#BGS,('Ł'țjW.mwdGtcdT 18dֿ._|+v  em0N]ͼ}` I_'J~g-?x endstream endobj 121 0 obj << /Length1 1625 /Length2 7025 /Length3 0 /Length 7850 /Filter /FlateDecode >> stream xڭVeXKCaafF@DIi$.TAZA>^^eg5S?a(>!~A)i` SC4PP ήۢ p- ,0 G!III|vqpDyxx%x q8>!qq$@HHP )*o|!Yxw<:YF-n) wig`/0z sJR6!Z0?/$YfsU_Y{rzMz_%=ޟcyq"X߃ E,31CzVW [AyAl'xhnp$}?=nyOv<-U@6s2=ړB*+)| k]Nq2b4~&`BivKgjK~~EBDB̶UOGLEWI !}9q1^[GnYdXsR>ᚑz9nѨ5Ul*ۯB *nP7DZI"'#s#@-LS>4oP6P ooi7{~@Onz–ViZ ^:x$&ނ2+rՠrKj6tga@_Z%0^d䓒PpSHu=n=Q3yÆ+٤Oc(tF{3Nˏ̰'>\\We*NQ Kfd,>fO EqvE.OYj̛MOByK_;htFKmڨ<- P7gSxh,+(ED%brD$c[P:۲x̌ +>滩"d!ƫ ڸRxσ=ώ[MItIyQ*ĵ%ZɸtYНyo豿>aQW4Jl?P'Qq5ރ^۔b𗺺4F$o-}:hL" 3nn])Umyq9*@æRapG=ë.WӘ $ԕi3F\LhrM$DLݷ;h#P7e|x׏#5)h5Or6^ʛ*n6~|1 \2)n< |4^Jl, کE=CrdķfN"sxX}U!Oh`5GoCZ &7*سs?.Tw1[dK[7^a= Sx,j‡*&ːcD!alè*_=GD|/z3Udi;唅mi#Zݓ#W'Dē5xTmͷtWǺnVo%u~~-w -O+! @:b1 % 9VII̒ ­AG![Ȥq9'vsY+=;nwe^A*#$'|uNO5B*t]<\F$N"#j?(z~/?I~.8=5{}g`ATݚBX:r\{wPMˆW9o'K|Cm{Ax<1[F%)RY BM)ާzzy&,k&)~ Zxw}Bc %Z)&,gW;_>Ě.[[y6lCdLْ"Jf=GPAUvo(fĝ-AW"9+9626؉WnĽ;ML,/rT_~sͣ.@ }ͽu^m#qQb񵼔" Mpʀ}{InaIdWgxN?MpjtƝdaJ) 3H|, 58_-t~t5 GIsܷ6Qg+h ϡ ޞxGS{ ;R7 x+6J'݌͇1UH txn%GTGN[_VIuPiM,)F8p`beoɣҁ++SVd{v5u$ܖ^r#$V:#͇m;|9WZ=5vDGJ}t 'z~ /rS^e8iEeQR;A`)['NGB!8vpAC~i͗fg9ɉ"E?MqΕ"p{EClV) vX'p1Ol]W. %a@TZj%ve:yl4e 9hl:T{yyR.@G";c9Ћ`(2L˭˝ \i6j=qjЄ =3YDj:Wy|R,#8pͯ:3sNO`xrdo,v5|6>!S|h^y zyWeVͺ?SC#/mukԺ!*m%ڋ1T_SKRyv+ cl T}.tkun`AЧi *n@[ԙ? ÓMvc\Ҝ;m̞YeNc5xLkveV{F AtO$DK"ÍYzXWʦ԰̙n$DYY*)Sf|x']ݯ .rpXq&RJN)\`Vm {:jH! (tiXVӏۇ1;_Ig[&~6c&˭V}GOHh3>ȹї9l>s! "r$Ote_*˶cyG9T{2^ ~(w>lY[UWW%) 5ju+p(Vp#[0ڙuηIą $)m#w]eϗKیK}h-1d{3"by)iQ]}Ӣu-dmPmѯiDP{HiV*-3Пmo?cwa`>iHK &[詞 E٥T3gj7*[;cF%hlq"6KߐЦ$cVzIIg+-.xAicU|:>l z};y[<99Ŀ4ň񜃸}1)"fXv\Je;OϢl$i41j>ˡ ]VfUgF EK!Qrù4U I)'1D],19s52ӊ_?6H/_\|3v/`eлy݀+z9;:ⴋGhYԹ_sT߶*#C ˞ݟUT_$Vǫ]{PegWn`606/(Ρ{iDg]#:CEtS:㫱!^>Pgغqa)8k, upu:Ȭo?KGO"mE{EC\ĩQZzoCpno~zt6F e_bMa6´ߌE)* b9"oR T_df]̗o}~|[cL,0H+7SɈ7Z}[&ϒD%¸O!]\CbalOX؋+^'}JklYYP$ Krdp_?PL1}Pc_cX_/_Q~*2 b.AQbi%t Ueǹ~ o~VxPn0/?=~;;w&>^$+\7lE{7=<9Ϻa]Sbl Q;s~f<)4R:T`B/Iq'xrS,:v|ޘV{JA;ԼAFV@yaH )9jPzn7PO%g6\Cw?NX\7}xMMZ43(EѤ<[2"'==$b 4&#(=|xv2ZN456 FY>찺g.B+!YSb,]~ YoG$Orŕ=v}ѕKx)D4,t\-DqɫUh֕*.#Mzs͢tf'"׹«J ;I4{ܚ; g@k;KSaУSDZ!YNH 1F|+A@T/! T<)J*8oD ΛI̦F$SvYmeUD? x !KQBٕfQAAcCe>6>pzV0k hSg/kcњꛜeX{FkU{,h8j?}Gv2;|\c[4چoݯbPmVIu鵝, Ո1!򏋕Ϋ}e'G(Bϒf*+V$OS/T89ƉPrvATe{Ţ]n ܡ3O(z^FK7MFMdĎ]_˄U=ݟc:g%qkk***?eߔppX[e*<6?L;f*쬒¶s MARixCSy:$Fv JiFo*kC"΅w hL& ^?^HrwR*O E&i5k 9^sZUǧ,DQ_l[YB~f<`''k6N] ,QC. b! endstream endobj 123 0 obj << /Length1 1144 /Length2 7997 /Length3 0 /Length 8762 /Filter /FlateDecode >> stream xuteX\ɺ5.q .ݝ 4H,8\f3ߙsgzuզTdeVvA UQEhxyPhi@{ѯ;v2Z6ne3';]_u/C @!@{+%ps:B4ݜA@K +*z쿣ށ\@6.#3ۿ׿d{ݸNDzu! t&m%GI Z:!lJ;Z;叞I\Eyov`G@dĦrvK+7f x99@g†폐Z^N?I?`3GK?'.(>f@ yBX, s :+A\@CvVvv߿wƯ;{mb)iȨ3[IJ_]pqX8y^Q@ߗؿw`I Y ĈU )O 33U8rW\d\./CAnU TA,l_/vf,<l@v@WWI-Rl rhB^gbo=V@O2B(Զ1^ăekW7J=.+L ]% w-ZڄGCXeXD8>;.VD0(S&aAH Iy ]PVӊ =:"W".3 y >WWDXb @Ui{W0@m=ǭ1]ZD X E40'ѯ|R}[]@p6mi 0%l p&GAh${hka yUwe~5췝m+]_VƱ#xm:w+nNB5CREǾ&}Y ܶ%ͦyHd3UY!Y+V*d(-'\ZdP!j7w8|j Gq3$q;?3r6{ԨdZ"D!mONkW@Nhi'9Js3%@|iX VDURB}Q?׾Z76!r5$D)*fD!_TƻD2*^{1;B fy,v@kQ^"$m +f֣AH"EDpNIJ JZ-k:"X5&ƏhAΓް -pl~aI 5?% Ee .hVE}3fo^K2]q R]c=G6]^](!.D@~YnP͓x&k3zZ'vi!ЋulB 8\túۧ7O6A&SP*Rԝ'sE/_A<Vz^Gh0_SE&?#r3skzy2jN_puVԵ'I1xcxW49۩ǎwU+µ;Gɋ,P.ξ?VqӒFV#|qVV꽷NZEOjGb@Rȁ%bԯo%ٺyZ~"Q [:نQ+$>\"ŴD)'pF i3%N:mA]T&r.t 0  󾆜 ˫bHI0F_Ϗ8X+U4B;uHbYky~nO/+Ev'8@^+1CGw^:ɑ6gC?BI)c07 ]WD仐wHm*sTn>J'rQLZvԏߏs\RKdFTFBi]{D?ِ0ގEun%ݢgUgK16$)+{])5(w}H_7Ve1#փ<MhÅ𓥛Z/r#nJsJN8`3B iG$jw_|{F[=V ߑB=,y_KsOci뉳jGxf])\ϥ {[u9j#ܹ#KK$% ^$BDǍ(̟@$Ρ̐4I..V@Jˢ8k T (/Ry[but S43~zI`""ȵ fF4vh cØ$վY/U`^ը^Rа;-| jn/b~ͺ[Mlk2$GOuA5, L)naҥF?ʷ I؟ N4s+F, ޗ?qZE– "0g>HFc|y騢1N/l6#wwV=5v'~P(`l#WXN Ѿ68>q2y<ٿ2[&L%S\\b)tօW启?U%%*heRBB'A aƩY vRD_7Zq ++ZԈͧԢA2Q Ш :;U^< `+Q R:^f8mdz.ƒVr X2rfҟu"勣%.Sw⣹Hv5TƼ :"U&flvh(n+%ۮƂʻZWϠH&n~U2@'t޽8`(Om9j&9tb'SF 䘜NjJFjjgg 9 ֩Z~s?j,HߩֿOAm*3"J4RaPN[ى[G~-s"/d!-shxj!} = n1`AJPTk,g7kOwJ=o2P|P0nVBLRW:!sDwU6"iRяjeB2a_?l/q&<3jPk%&ǚuyz[Xr1)e(9͆_N^>ybyQ]u7Ib.U* _s_EHn>Mwsx#aXOx$jdC%*:#UjgNib4%.١ ?Ὗ.1^w$ǟV-Ӧ}OldjǴfMekk7Vk>]iCku &vipn(z<[BS[ %wå,\?s6g~IGP:7*37q[d *v5vf))h4Un-pi +Q"){$'8qIK,QD>no玹Trikv|>Ҧg6 ±CEo;a%X0r6!-~G=ؘlL+0 L})=<Әvr%H>S0>73g_ (ع 4,87%NuxQSTwl\L4Gr<0>_PM< 3\rfg:Z 45 н#]߶eE@4r*k>XdT C{S6}ފ l)=os@9ݶv# o5N$&*rI]r EU ,;~t%ͷ|J ^ 068_mϔ_:̛I#L'p.Md?89"dR#9KN1+F"rpXRȸ9}jJ>,c4uZXܫcL #%]nhPX axژ:)EFy\oa`8f#3bZ>/Pw9]15 ck`XFQ-sG{-A34 E5;UMW ˏK;LVO'_xʿHwլݠS&2'd*컞7-Od-rS\~Qx?ȉ,φ~ !6aPtO5[ ? 6Hb2; $IiJѴN,{gzf~(}qTʌ~>N{Z#n}3xDg{Dsp Rdޞoddyj@NFgHW<6t}uoN Yq97VSHAgɚų+%8sS3}1"<__L ,pƌJ؀F4ǚRl@zQv6:)Eceg8IS|ٵfk3c |3؟E_m(1b= o14437oTM#x0A٪seK1 ^T_TAJ.`M.G\,~[QɗKVL70McaŋWyZ%[i?-Pdkn"dr*3~e  5drw4D>\jr(u8pߊSl\%Tv`ܐZLa^C]7j2Q?΄DLωQ$kWZagnX3_W3{4]& h)3q8RK:@vb'O|*Zɻ=4tq7p'R#|weD$~+|8}Emi jzzWʝcʼrZ'$r#^D7I6"=:Y+R>Cϙg Y|! (xIlKPT&sAVzNc4ꆤbӧ|̕fg+ 'MAݑ'ե){ہVRNuԣOKطo"8c:U=nQ|ޗ t@we6CȎAԯT[hM ϨXr d ,U#6ag\;t%jzW\S $N&p04sx5op{Z,~I|YŽ@&Ufvd[ ;؞ {n3Zm F(e 9o~ cO u52kvWjRF⏅ԅN?\\%?kg/Ŧ'N- S~Y}ĞjR΁ʹ楔;{v̷.}:&FMn4]I}OW]\r :7,i> (А.mAf/j9l0noG+bUwX"ϥٿpDS0C}PP!"U6wa> ]qw@%1>nZ4gl[*JY` H#!`B:y<,R2~#*c-'t'ZYIyn#~ bfJ}.G[//fV bdϔZ>羁PoD^N Ok]ڝYQ@B7=epWztd[90DBWe&q: 64y؃nc &j/XRg5_]9M>MoIrL+>!j-mUcWϘ`fk]7ÓBD#|:0-Rn3k0O<#dV.|+`-0FfCL:W,'|JLˆGMpU+aUo=pSw(fWX2~C>Vh7 7u1>L/o C5 x81jkO^qLYЫQͷ%aXQ DlW/%i?6.'kI]O竒$[q@Uz2-#Koߩ(P&o"$F`9@v~sk'J[u8N^p endstream endobj 125 0 obj << /Length1 1177 /Length2 5987 /Length3 0 /Length 6762 /Filter /FlateDecode >> stream xmsw<[K轌%D{  cFD/B =ZD%z肈|<<笵>{'#B"2]-hq@`;BDi E rG*yB@H( B;{t@QPDFDJF\n-"W S uC!H' `o7iB !^oO0Kx῟ PByBC3^~~4/ :\w  j8q߱ (l3.#,aB^BpRYw/SzBwmp/<_)G(y&p7DC? wߘ @<'`gGC a!(p APGݏ  =!A/; #+ qsBzBDDDW. ru ̵M#weRAQ)qxSZBUAt%w%uJ&o%] x6ȝW~5j 1?{@_ A E^'}(KM 1ߥH;Cpם p#p'Ό Oiݜܿл!'04 ¥!yQ&,q0Bti]+_H)룜Za`G&2IJ+v S<#PjՕ!:t$GKQ7~ZujPi(Atn塇\U\5+M}]Ol 39ܥ,A<~iIؼwFQIn75^X"d2Rph`Q!)5-zܩ GUL!G›aI"ڔ$E"Zڱ0 m`<쩢4 m 2I.xϗrwS@\mO|QlI خlL&h*;%=hr ГyB%2Q|t.B:N>J3 XFVB:_<)6|l#b>} .j[]͆ƗDZl&|t`UONGuF)!^rXA?7BRclY爣vfC<"NelS{!+|,6|@uhE7zəHoGkxƩ!)"S6KUr/AZVbbSP1$nƊҭsC-G;[z{HޛBFnYv]1{Z*m&).*)ACjWhO[&弰e{C ,+/BܤoPlJ LҎ]9+l'o[ҢjψAaRY|| r^hCwx =i- !0|8#"XL+;"]@b8nF;D|ۀjEA+3p -ҹw:O~3K\6+L҉/">h}൮H[ZV6<}\fɢ1MRlB$V=kK%{'{Vu>YOZ=V`Kّl[27vH:oeGcyxD쭍~Ӄ,VDMZm8x"7opؘF[[& [YJveTβnbQ1MAeҢkn* L.J 56<6{b47z`gzKy誚;3q4ɵ_HgB1ֶ ߲L(PyY8{uopmب8{N}W."UA==%>+Ҡd*4TtzG?l8QNGëcE=sHnM/fdg,iSvgt;ԠΗb01زELK`4]G/u}4 Alp?tOFikHOV+@qn`7_I~Oqɰz^yXg=,(~@>=#si5#a}ֶPmӲ?\_M##Gd(&H6&:@oPymM凩nhӶEx:=(OYm=A q[ZrKj҅J{\m+6OIMT`_0WmX =#w}o-FZ,X°TKx&1rW*$㷌LX'**\4 Dό< |Լ <=}!׆Oq ` Y3q%Xh$;eHg`l4I&N‡ ' gz\ݭ=󚐷h_1/H:gf q\ݨmnF9e8MAz%{ًM ~MMRu2{j]ek^K k&LvWz|Vu>q"ĆFS;bUFfjKgUq^TtC#5Lc]O]Oyg_w,qjkD%p4VU\jԥjPfAӕO"Z$ZNJU̹p~`澬3ץZԮ7ݝA 3MD$3bVw[:@[YŃ5P͒Fv8쓔YhC`֘x&,qL3۰FP[+Y]zCr>XGZ3ߑa2֌D#JQ*^-ʸAɥvWS1<[hEI_Z~!OҹߎE'JM,"F}AwD̪e2y4P9WM3󸙊wt/%m ݽ.̡{߰^ l3]ccr$~UjP_XJ-}s6mi:3>Ł-Vg̎U" ɦI.f F%4wƶbGp"sg,=hzw|i 9;&I_3cVmlwk\}T^]ZkA˃79îvBIY(shUI|>`Aj/r{B]^C4s73pm }WM=|LJ9C^ZhwNm_DZw{|dZ+ϧygxO79-mhڤZv3bM:v%::T“uly216󰞲*E{6.=刯2hO3b sLlJoT+F獩RJmcE1DE/:4)*zK4L:$[L/4lq~QJ :D1X^VMmpޒ^085S!<ڼ9W,u4*CKkMϢ[Fwo6Yb1--q`RTpv$dC~<`]X}qzB1?VFh4vf"9vmeV Ȏi[wSGndNٵ+LAa8"޻2;-%bQhFeOO$,Րm%rXPaE-2}kv#FfPKc_h{ l9k^H"Wfs8:R7V~ηcyvGAG:yKADeW{(JcR,[ Nse `*k?zM7'\],/uR=vDhPwr=ުWGDquj<~Óc۽_ |d>N.\qEs+/&e _q$c\ $@F":Z6u"ܱ9o I Fe"hG,֪qL'-d},V6%=}ꑑ ZWVYmgVzmS2PD:I2krW<\oq*zpc Ӑ 8(7xں'tc2o-$?yEmDH3~/.ZG; 8quߵ8pjl17) 0= VA4A/6hm̿b=S3Ϧ*f!ro1N+TU~ZZWH.kr)1jC>t ,$uf05=& s-ssZvdГ1KlŜ1lu2IJR=v.rsyA"T6L6Pn*)k)5hez˛`bOc9PZDyov}r[pF lG= Xɩ|("H]v}:Ә8]i)%.oBos& HhW9c%{n$\6Yڀh_%Vx9L`asq&drƈPᰒ{䒭*Aj/ KOT8b﫧z\VtcXZx<07(0(vQlZvMTK0[xF1GGvgG&91jh zt]= \:?MLLw!FE⪧f>&d4 v`xWZJ7P M9RH,j@ u:s4QTSX>LO5hB2ndhhE(>_)ZOo[K|)q>Dݖ85Nu2]}a+)ca A @<؍ VvfQTQW&|;­XRTke(k%qF' yMKUHE?nDL%wGðX_>o v:r7a, lUVdV;{eZdM>Ue'beA h:;{ӺŅUٮ[a&{%d% kObxg i{11rF%Sl<ͱ\>F5lof)g:x*ħk2͎ x̕ϾA4=$ 2lAIp+%f#W\л`,Tp'i&' 7ټ 9m+IOq"4MxWhY½* sٟ۵R"iGc9Gg>\\a5/Y]}>ө7xPhh=瘪]\d7)Tydk!9F`#mzҤe*( rfRSg SÉSכ JF- pnzCT~%pO`Ry|e@ȄrBQ?&*:40/BcqmP{ۙ KFcۻs^ו5"h_YH$oYR\Cmʓ6f8C9!.gŅdoQuY `)2) *Y sr >iCbfhv_Le,2G84veIƾ4?F endstream endobj 5 0 obj << /Type /ObjStm /N 100 /First 813 /Length 4494 /Filter /FlateDecode >> stream x[[s6~ׯc3dwv4RMf K,MwR"eӖw3۱!$.߹,gf,yJ\&4c2G晔LٓI4)L302cPr ƼC1͘P)5 GiPJ{ t$_9br43e Ԩf4`8$ BeKHpYѸ&6 hA@s\`Zx#V0;!s"gs*@B?4ỳB͑;,nIqU]YFRH4*iblN2NKa<r zȠ`@*.x#G]HKVxAs"eIHN ARFP:z"zJeP"!4 ͐IJ%t-*BhI%mx@HcrưJH51M Cs%-PAP%ւ{4 ת)㧌?Mƾy6읖yoNM.rƾLs6~_Okb2/Բ*Usv1{>+.FW2̃hOh2,>?:Ꝛ\LlR(.Χ-9hh/Gɍ6!ǜ0~4*?QO{ 0,&A>' Ϋb8L?9nXh Sђd2E?NѐS1)ݓHLJNYBR/*ODt JѨaZ[2LGT,=~& 1U0Fh]j]u]@ a2EU !{9Hifճq Ov<ώ?+>1Ff5ȵ Ml&m"ϥUDOKt5GZHZ[(2ʘ`p[F=J\t %e +,";LDU/)|s:AoN v $-4C=Mp9(i]5Z:\X?HtmВ]yXpF{鐚|5 ME;gI>8ڈ\$Zs,`ZyjZ!f^h9Tv6!HtmA#GѢ'*XHj/t ds:=gyf !D :Ƨ<D;3j*j:" HT#ӛ:g-hE<=z: .ѭ 5.kP^{;=z GfNu^2).Mm>&h&ĀZ!DހAWJ:&~Bi(Y- T=WU\=kuo5/IV5*E}"ܕ)1YIf"`YMt'M*gJBq cw}@I4MvFs:p19/@I@ "l0Z'I/"NSʭ YZzsw:08 `M4J \!RZrTMCFMtL牥(I&w>ҘGiлH@5ô:a=d"!@դ2vEM)k줨&amHj]WV9O,fsWh[X|W1:|5/]Yd|*ޘR@ۥuAgT7רjEg~+ԃUVmFo[lE~bPЮ]1.AtMwel-}IHw|dprU; 5t3Y?%7##z|4+%'z~ͷWyY!* S̓x'`[zb@GΈ?~|r=Nѳ=Qǣr\O٬_5]BA{h}~_~Oy¬x&_L.EEjMqhQl;(1HS~ϼf|9%2^_\ ~1ȳ/b:p:)a2]cY1M7rZqPRXJ$Eq=J@忦|ob>mK"oq! >oL|X+u(ɣV͚wUW0_}{?YZS8z?Z(f3bU53m>ȖTbx9i.T==~5L˻OѫpdIt@-&VI5zQ٥rİ ~xy"qE"\I2*~$mPsA$=lV%I_+^^͋"_d>>>>8c ܅VLѝL!s}ȟd/a_U&60`͢?LW!^%p-mG[v_Ls̨yG?7X,6q6-}^d鼸˚oޝ<i|1}o%Ά07е,me?Fi&7Lm0w>?FѪU`Yi l3j';tǗG߾WALVuޙa<*kS-wrG]!Sd. m4li)B5eF&Qɜԣ15'CpcQlM4n nLWN~%OG AF={B9j(X;NJҒnD2ώ޼hfM;*HkC!P] nw_numb81~;tme!tk-=*,wǯO߿ܔ]*IfbYCWj/*imB[8`@ ]\QBX*O4ZTDITQ# ALը?̘JIDʘIӘ5MEU+0sZ?6:tF_`|M%z++C̤i+.*^)ٺv`u0.NYny#GULҒCs~bZiDq[@BVRFغ%f];/2[꾾M]6tMW,FHiCT-tӘ6^j"ֵG2h(q*ϣay[Ǻk[m]:D LЂVd1u.7M\bGչĥ7q)YK>E&.{i˯qGյ7hMz XZmt T5-쎨s|S77ÚQսջbNXuad԰¦aݹۄ&aYl endstream endobj 135 0 obj << /Producer (pdfTeX-1.40.20) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20201119153125-06'00') /ModDate (D:20201119153125-06'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) kpathsea version 6.3.1) >> endobj 127 0 obj << /Type /ObjStm /N 17 /First 128 /Length 725 /Filter /FlateDecode >> stream xڭn0ylTQ0gRiR%كN6̪}cHiMmƞ6?׎c ~18!p| qą0"!Ą`B qR D.~h'P@Yk\]``݋\ּ^TİnhŔ~p>e]i>6gl]M-RH*8/+9h mXcy* &.OD5D~3p}/\>׃#lc#;[|$rAlSQ䐋pqKVb=5 k$jp 둧t l^/3\%5n"P1\Krp;s_ϴdK[>NTJmf^w,tHO=c<8tNpDt: Dw\D' 2[sIK9Ζ5ߨby^{ڕp.nH.c:[@FrJxCs~2TX;k̷\qIx/ Y SlsU̘Y1Z&~G%]%J|%-\Cy.?c40\ lȃZ4-VI|Vo*& MԥYj"K?F.5HںOUa:ՈbGkC,u5kG,ڿa͞Dʬ{]ӂD/N1 endstream endobj 136 0 obj << /Type /XRef /Index [0 137] /Size 137 /W [1 3 1] /Root 134 0 R /Info 135 0 R /ID [ ] /Length 330 /Filter /FlateDecode >> stream x2CQD^B{o!z/3^Yx ^] C7s۹g1O? aC&peN%A24),S)c8.?@.A>@ !(MK`1A**{TO ] =5ZzhFhVh>`Mp- ;00 000{0 S0 30 s0/&Dŵż""w%ֲؕӗ֊UO5|uZb6ž]jmD8&1/6>W4* endstream endobj startxref 196043 %%EOF RcppAnnoy/R/0000755000176200001440000000000013766143727012404 5ustar liggesusersRcppAnnoy/R/version.R0000644000176200001440000000107113766143727014213 0ustar liggesusers#' Get the Annoy library version #' #' Get the version of the Annoy C++ library that RcppAnnoy was compiled with. #' #' @param compact Logical scalar indicating whether a compact #' \code{\link{package_version}} should be returned. #' #' @return An integer vector containing the major, minor and patch version numbers; #' or if \code{compact=TRUE}, a \code{\link{package_version}} object. #' #' @author Aaron Lun getAnnoyVersion <- function(compact=FALSE) { v <- .annoy_version() if (compact) as.package_version(paste(unname(v), collapse = ".")) else v } RcppAnnoy/R/RcppExports.R0000644000176200001440000000106413766143621015012 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #' Report CPU Architecture and Compiler #' #' @return A constant direct created at compile-time describing #' the extent of AVX instructions (512 bit, 128 bit, or none) #' and compiler use where currently recognised are MSC (unlikely #' for R), GCC, Clang, or \sQuote{other}. getArchictectureStatus <- function() { .Call(`_RcppAnnoy_getArchictectureStatus`) } .annoy_version <- function() { .Call(`_RcppAnnoy_annoy_version`) } RcppAnnoy/R/annoy.R0000644000176200001440000001347613562654026013657 0ustar liggesusers#' @name AnnoyIndex #' #' @aliases #' AnnoyEuclidean Rcpp_AnnoyEuclidean-class Rcpp_AnnoyEuclidean #' AnnoyAngular Rcpp_AnnoyAngular-class Rcpp_AnnoyAngular #' AnnoyManhattan Rcpp_AnnoyManhattan-class Rcpp_AnnoyManhattan #' AnnoyHamming Rcpp_AnnoyHamming-class Rcpp_AnnoyHamming #' #' @title Approximate Nearest Neighbors with Annoy #' #' @description #' Annoy is a small library written to provide fast and memory-efficient #' nearest neighbor lookup from a possibly static index which can be #' shared across processes. #' #' @section Usage: #' \preformatted{ #' a <- new(AnnoyEuclidean, vectorsz) #' #' a$setSeed(0) #' a$setVerbose(0) #' #' a$addItem(i, dv) #' #' a$getNItems() #' #' a$getItemsVector(i) #' a$getDistance(i, j) #' #' a$build(n_trees) #' #' a$getNNsByItem(i, n) #' a$getNNsByItemList(i, n, search_k, include_distances) #' #' a$getNNsByVector(v, n) #' a$getNNsByVectorList(v, n, search_k, include_distances) #' #' a$save(fn) #' a$load(fn) #' a$unload() #' } #' #' @section Details: #' #' \code{new(Class, vectorsz)} #' Create a new Annoy instance of type \code{Class} where \code{Class} #' is on of the following: #' \code{AnnoyEuclidean}, #' \code{AnnoyAngular}, #' \code{AnnoyManhattan}, #' \code{AnnoyHamming}. #' \code{vectorsz} denotes the length of the vectors that the Annoy instance #' will be indexing. #' #' \code{$addItem(i, v)} #' Adds item \code{i} (any nonnegative integer) with vector \code{v}. #' Note that it will allocate memory for \code{max(i) + 1} items. #' #' \code{$build(n_trees)} #' Builds a forest of \code{n_trees} trees. #' More trees gives higher precision when querying. #' After calling \code{build}, no more items can be added. #' #' \code{$save(fn)} #' Saves the index to disk as filename \code{fn}. #' After saving, no more items can be added. #' #' \code{$load(fn)} #' Loads (mmaps) an index from filename \code{fn} on disk. #' #' \code{$unload()} #' Unloads index. #' #' \code{$getDistance(i, j)} #' Returns the distance between items \code{i} and \code{j} #' #' \code{$getNNsByItem(i, n)} #' Returns the \code{n} closest items as an integer vector of indices. #' #' \code{$getNNsByVector(v, n)} #' Same as \code{$getNNsByItem}, but queries by vector \code{v} rather than #' index \code{i}. #' #' \code{$getNNsByItemList(i, n, search_k = -1, include_distances = FALSE)} #' Returns the n closest items to item \code{i} as a list. #' During the query it will inspect up to \code{search_k} nodes which #' defaults to \code{n_trees * n} if not provided. #' \code{search_k} gives you a run-time tradeoff between better accuracy and #' speed. #' If you set \code{include_distances} to \code{TRUE}, #' it will return a length 2 list with elements \code{"item"} & #' \code{"distance"}. #' The \code{"item"} element contains the \code{n} closest items as an integer #' vector of indices. #' The optional \code{"distance"} element contains the corresponding distances #' to \code{"item"} as a numeric vector. #' #' \code{$getNNsByVectorList(i, n, search_k = -1, include_distances = FALSE)} #' Same as \code{$getNNsByItemList}, but queries by vector \code{v} rather than #' index \code{i} #' #' \code{$getItemsVector(i)} #' Returns the vector for item \code{i} that was previously added. #' #' \code{$getNItems()} #' Returns the number of items in the index. #' #' \code{$setVerbose()} #' If \code{1} then messages will be printed during processing. #' If \code{0} then messages will be suppressed during processing. #' #' \code{$setSeed()} #' Set random seed for annoy (integer). #' #' @examples #' library(RcppAnnoy) #' #' # BUILDING ANNOY INDEX --------------------------------------------------------- #' vector_size <- 10 #' a <- new(AnnoyEuclidean, vector_size) #' #' a$setSeed(42) #' #' # Turn on verbose status messages (0 to turn off) #' a$setVerbose(1) #' #' # Load 100 random vectors into index #' for (i in 1:100) a$addItem(i - 1, runif(vector_size)) # Annoy uses zero indexing #' #' # Display number of items in index #' a$getNItems() #' #' # Retrieve item at postition 0 in index #' a$getItemsVector(0) #' #' # Calculate distance between items at postitions 0 & 1 in index #' a$getDistance(0, 1) #' #' # Build forest with 50 trees #' a$build(50) #' #' #' # PERFORMING ANNOY SEARCH ------------------------------------------------------ #' #' # Retrieve 5 nearest neighbors to item 0 #' # Returned as integer vector of indices #' a$getNNsByItem(0, 5) #' #' # Retrieve 5 nearest neighbors to item 0 #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list with an element for distance #' a$getNNsByItemList(0, 5, -1, TRUE) #' #' # Retrieve 5 nearest neighbors to item 0 #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list without an element for distance #' a$getNNsByItemList(0, 5, -1, FALSE) #' #' #' v <- runif(vector_size) #' # Retrieve 5 nearest neighbors to vector v #' # Returned as integer vector of indices #' a$getNNsByVector(v, 5) #' #' # Retrieve 5 nearest neighbors to vector v #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list with an element for distance #' a$getNNsByVectorList(v, 5, -1, TRUE) #' #' # Retrieve 5 nearest neighbors to vector v #' # search_k = -1 will invoke default search_k value of n_trees * n #' # Return results as list with an element for distance #' a$getNNsByVectorList(v, 5, -1, TRUE) #' #' #' # SAVING/LOADING ANNOY INDEX --------------------------------------------------- #' #' # Create a tempfile, replace with a local file to keep #' treefile <- tempfile(pattern="annoy", fileext="tree") #' #' # Save annoy tree to disk #' a$save(treefile) #' #' # Load annoy tree from disk #' a$load(treefile) #' #' # Unload index from memory #' a$unload() NULL ## ensure module gets loaded loadModule("AnnoyAngular", TRUE) loadModule("AnnoyEuclidean", TRUE) loadModule("AnnoyManhattan", TRUE) loadModule("AnnoyHamming", TRUE) RcppAnnoy/MD50000644000176200001440000000443114101037042012465 0ustar liggesusers506b3a362a2fcb0c7ecac1c2bfc34cc8 *ChangeLog dbef91cc4ef5e10bfec336a8e1c31e3c *DESCRIPTION dae4f8ca1beeb667ee6121de3c975d2c *NAMESPACE 7ae968c5de1e6252a2c1ab5a6568517d *R/RcppExports.R 93628a741e3dac462131c3053319c589 *R/annoy.R 4d86ce7f605efd09238d1259c3edf71b *R/version.R 620aa16d573abe0fd26d5f8b106d02c2 *README.md 8c97b4af5a577832c66fb33f921166a1 *build/vignette.rds febc42ec3b6fd6c342a9fd8d38f20cd0 *cleanup f6f2db8ee77cb1083ce50ea2ce613ca8 *demo/00Index 626d1ee412f1f366f860e2fa1b7e15a1 *demo/simpleExample.R 6a5048e7f462b179001e26116e2ac2d9 *inst/NEWS.Rd 568dcf938bfd545c06324d487888e301 *inst/doc/UsingAnnoyInCcppWrapper.Rnw aa4d7dbfa7abc8a9c022d63d89adc129 *inst/doc/UsingAnnoyInCcppWrapper.pdf 94e637481ee9235e372d5d4df911a652 *inst/include/RcppAnnoy.h 0114e61924ae686871ec951c9416a4bd *inst/include/annoylib.h d71f69b770dcc346f36da24381e45814 *inst/include/kissrandom.h bb5e4ec24ecaed6c71be0d76836eedba *inst/include/mman.h d38cc277f957440ec37675c8a9d1a349 *inst/rmd/UsingAnnoyInCpp.Rmd e77d053b7f11b37333a71c8da8bdaf4c *inst/rmd/rcppannoy.bib 14c740fb1a1c4d78afc7d3b76641d9e6 *inst/tinytest/data/test.tree 4bb99f63e5ba7c7ae5b730625cf8e2eb *inst/tinytest/testAngular.R 56f9fece1ea637c58c269f6b530712b5 *inst/tinytest/testEuclidean.R 1ec108d7dc0af03ced95ccf131c6daf0 *inst/tinytest/testHamming.R 7d8dae4a58700885f9f424d9f38c63aa *inst/tinytest/testIndex.R bfc5aa0efdfe1fde02cc8fdb51e6b447 *inst/tinytest/testManhattan.R 15e6bfe848de489a6e6e0b972980c159 *inst/tinytest/testOnDiskBuild.R c31e274a819e1b945f2fcef39c3e9d51 *inst/tinytest/testSeeds.R ebb89d9c7e2a0af6a3ca60edfd328a54 *inst/tinytest/testVignette.R f44f93b08b6248788fc2f6c52b36c90c *man/AnnoyIndex.Rd a217c2244c13ad7cf558e7fde43d4796 *man/RcppAnnoy-package.Rd 5ac2065ddceaf546aa75a251678ac58e *man/getAnnoyVersion.Rd eb1a07c50cc3ab66aad1f84abf7cd18c *man/getArchictectureStatus.Rd 4cf3a9c99aed6410afbded6ed5eb58f7 *src/Makevars 946690d41f51e14187ae75f2895c2c68 *src/RcppExports.cpp bed6f1e5becf0dd23873cc92283b1ad3 *src/annoy.cpp f61d5764f4ba6cf6e90127398a30e7be *src/arch.cpp 5a94924b91fc3affd113e6b7162036ca *src/init.c 95527d46e099ce463e3654a399b64b6f *src/version.cpp c473b8f4e7d47b1b87cd6fa570f096c3 *tests/tinytest.R 568dcf938bfd545c06324d487888e301 *vignettes/UsingAnnoyInCcppWrapper.Rnw f5a359b03050b1758084a0c6bd11449d *vignettes/UsingAnnoyInCpp.pdf RcppAnnoy/inst/0000755000176200001440000000000014101027122013126 5ustar liggesusersRcppAnnoy/inst/doc/0000755000176200001440000000000014101027122013673 5ustar liggesusersRcppAnnoy/inst/doc/UsingAnnoyInCcppWrapper.Rnw0000644000176200001440000000042513465634510021135 0ustar liggesusers\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{Using Annoy in C++} %\VignetteKeywords{Rcpp, Annoy, R, Cpp, Approximate Nearest Neighbours} %\VignettePackage{RcppAnnoy} \begin{document} \includepdf[pages=-, fitpaper=true]{UsingAnnoyInCpp.pdf} \end{document}RcppAnnoy/inst/doc/UsingAnnoyInCcppWrapper.pdf0000644000176200001440000057716214101027122021140 0ustar liggesusers%PDF-1.5 % 7 0 obj << /Length 65 /Filter /FlateDecode >> stream x3T0BC]=CS0eaUeg```bQĆHBA=sM\@!(Nq endstream endobj 4 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rbuild2316f73c834f74/RcppAnnoy/vignettes/UsingAnnoyInCpp.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 10 0 R /BBox [0 0 612 792] /Resources << /ColorSpace << /pgfprgb [/Pattern/DeviceRGB] >>/Pattern << >>/ExtGState << >>/Font << /F31 13 0 R /F121 16 0 R /F122 19 0 R /F126 22 0 R /F130 25 0 R /F146 28 0 R /F154 31 0 R /F99 34 0 R /F109 37 0 R /F111 40 0 R /F141 43 0 R /F116 45 0 R >> /ProcSet [ /PDF /Text ] >> /Length 5661 /Filter /FlateDecode >> stream x\m6>txA/ay}qn8)(=LQ@SU===L4*/O"X|,^ B-_E24p5f#^g/B ?Q^dױ\\G[T7Ke"ﳪ/M_қ}DY [uf/"XDHB/pH᳴WÀ2wv-"#CKTx|Bjscʅ1j/y1,eb<{6 0Jp` sao"An۾|ֻ x~Vo^|}!D]~u$?v"uu^˛pqw!B/@(rjs*&c@EY# ^{xD#;xx7jܵ95 \j햂kwmyaS2i`Tnİ oM`@fS~J٦f}U'c߬Exy:`Ff&P[M(d R *i!U>M+]rmxє^g`qqAe_ X086I ft ;Iޏk`kXᖝ ,KQhc?J"^ {uLt|G & ;hWhzzfЫM e=&Ni20)Nz@yg~*|Pf$?AZͪmjD6{.`V-9f[曼P)U+_ ЇmB4BQhmOTݺwkP7Э`%E4w(_g~Xjh\zMw5٧x2 -;܇q1}8=?3C?Tjܸ9$|jW;Ѽ|,'D5e,ORI?D`x(jҲj}ciVۼ`7OZi+ΨXܽ~MzG 9NI( mx, ՞M^YK^] SV ۠^qGrي/>Ot2P $i?=9L{4)蒾pAnr䥥&:tσ#:*M[L]^$C>SV1) [B2j@(͸7jB Tۡ>շbOs$R 2ؠub?1F[8q(_ϯo^ E - ŮˢʏBd#~y_^,CP'uЇ6LNɌ!!@2o]QTG۴(ӫZŊyQKQYDVԪ= [v݇VjCG3^a}N  px&S e4:ڲ,A{!L`5WjUttiI&|a,o[ ~AGG#0* ݪxqϳX1d|iP 8a +onzV yExp0>ިr $B3gDhh+:9R2ؤϠX~pq/]>nd{*6~8Ѐ+$*C" %hO /glF=:YC(hh٤YSTmMb+xi9[2<Yhc$䪾k6 \ )_C? )!xjwV @WMSs jBؾɏS | iԴ m͚~wuSFxՎ"^xciSt/R@eRwEZD8,.OIP *S]ʔ-h-D}"r:pѱH%D'ILj -xe .5IB2 הdpK17 yi:d)#w. DLʗ?#0"&W"?f h{+=$bXsx o5Dv^5iիo~/\!䡖Tg10C|,ڶxfWE^G5ł )Yl>[O)%a:Mrʇa{o0MRQ'Z]H?&mxz}nj0:lc887񤗁:`Qmҏn}Z: ȴ:TFx)cЋi?l$ERҖvT*th0 )#i~P]7{}!W_1 dc~|OUC#d1U4let♣fyja M(Ƽ)*fST "E^.;Pd}.î⌙zzw穀 %M76CS frn_劊D=hS"=U C7Uhz8}$90o(q"Ǵ<>x˾1!P.]OȆ%hLixҡ@^dܚ|z9#5] %k$m5?9VQO{ʻ sTh`m)9|.Dbu,Վ,{b_na"|-O8I]=1 .VF V'oEJ2 C,_݇|kWLY JXNoV(A9#/_mvMy`$wSY; ƍ6GZo&HV%60}D_< @^q(O-whI+fLEq(\d7Ud)Ԡ.w~Wb!:3PeUGmf0$^̭{㞸M4cH'da 3а?|\"$!?_nǏ4Ǐ' tD8SZ6qm?1 @| W|QAo&2gkIXPХx,7uSt[s Z7$1kxjR ,4~LZb&#:gnk E g_8:T> ٤+%}hܢ_c~8dhQ@Ueoʩ${sH@m8PlzϨd.*Ioy p#8(nrz XEl*,ovYծ?-CxՋ4HP{:m镉uC_v{~Iz Mj_:*pT7xh7,5iX.G1I2,#zomzKCԱOK2ARw&2͌_y$1>v0Ml;GDnA&S Bv! =NKw 5d>Hm⫕a';@2gDR&40QӕS 5޸jwosǺM%42Q=Q'.K(iq#"+|Qp ܗhfHyGz_:> &'Y7R&0t9ʴV#qڄ7nQ#&WP-}j:Pa"|}6$˹ʾYnw+eo}jKwȸ]btͮXj4 SD#EAhV?K[yUz]9aj0aR[*;~x{u9M~u8C]9 ܇q`/&S9?}.~xȅ)՞jY]9X6~[Χ؏8|Q7U3}-J ;|iIMܯbAԢQ& lޅ9d EA:l9Y.31LO6B09,O91(6NqiBtg' :a\H!|&EuϱA*#bA АSIaϵ70s$b? Q+Cq =&`U h,m_cỦ&M'#$ -5`֠,/L?Y͋`7'W~!_dŏ{s=Jߋ sBI =xEߚ;"  aB endstream endobj 72 0 obj << /Length 65 /Filter /FlateDecode >> stream x3T0BC]=CS0eaUeg```bQĆHBA=sM\@!(莓 endstream endobj 69 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rbuild2316f73c834f74/RcppAnnoy/vignettes/UsingAnnoyInCpp.pdf) /PTEX.PageNumber 2 /PTEX.InfoDict 10 0 R /BBox [0 0 612 792] /Resources << /ColorSpace << /pgfprgb [/Pattern/DeviceRGB] >>/Pattern << >>/ExtGState << >>/Font << /F99 34 0 R /F122 19 0 R /F121 16 0 R /F146 28 0 R /F126 22 0 R /F244 75 0 R /F223 78 0 R >> /ProcSet [ /PDF /Text ] >> /Length 3632 /Filter /FlateDecode >> stream xZmo8_O +")Rtm[lz([u+K^IN~=|EŎm{ڈ!9|8zM^EI7 !D$qt2_>A( YDU߻_0_+iИērrDcZ˝-!Q5@8=W*⒣ahJԺ>fQJnV Fҋ9ХZa&X7u!{:' 6?,WFBLj$LD2&J@EBēm$ibr#hӧ7?Oy #L-^!IqGWTin'Ngʋe|,E{ -f׋_>w_mw}:>VUcFkxbWi? 1jjt2^7 A{|kX+CKqyǺ[+dvs8iz iUaJƺMCP ,H& K+=Dp$!d\뺚AwArFtC&`E/לw*4*} if6EY .sS!"qY [u0J22 l.u9 2oZ2KQ(,<1w ֚Qyxl^~MPFEHdlƨ⺨%"VYkEHK.M͖1<)֔Y= af䝲s gI_ÔƔ1Uh")w* Ԍjj̳rgG:V$85ʺQJDnmt>P6v23_ q BPsO qF: P϶j8v3G7hs%uw ltaYb 6Ig8EX$,ش,KQ!Q"cy@9M^EՔ%ƍ:Iaޔ S̝ETD`EbMb[^9`^Wmț+jv}؎vSvviqcPowD&]g+yV7, `/wv %)BC@3qdWn:;ҭ;rT @LZ>o8nfY ܹٯ8J'#LӐem3+ҁ$ ;}kœ৫Qs;/[[LE֛n(xܬhdѥ=dd+6aVJґo=:߲R*MOtjT mo"lvjźo`x92]Ly7Pʚ#ukYR]YգUWtE:jq:[2&*S-?#g$diinjP!Ժȯ27r]4vT :k`U4oPҩc9p8FߩKkgsT{"]hr#E8{0b82۴]qQ|7 .\$vo$<`2&ڧ > eLQ\Ap. Xa2vTˮ2Ӄ"z2kO@hSdPll>4ξu47vp~e*܆"tF޺A:;i n'xuow%N: z5JƄc[cHv*S, p88mʐ)4mX)Ci媬O{ A &8z0 L%%l;/k?yumuP[P-Uk┅lRşӽ'ơ&, ]ygыJ?ﻻ|A!CF{]ѝYd!֖咟|f pf=AV9҄@_PX_0I9̍pTؕtu/=l6M#J"khjJ/6irܘLjQ]MQ~|w?5H%0t1$ڮ j}5TJDFX_M+^U]浭7~2GYi?vKvq'Y" WޙsSI<8kX19 & P}Fb>o7шub"Ô  I?1v2 h%Y'?FNi}=cK?ϯ$ `7tiHw ^H >`L9TˬY Iܤ&* =yfG<&ԗES8 N$TFsg<\F] 5E؛Gq\[;4':ʛp-ac#8'ӓVں*Iy! WG6}X&\'4eyD0qKüxҝ}TSg +ȤzQ* LluH2 _]O8m$ɤrL2߃1 ΍( 0 Ll Q 0ӳg$vȰS\X({HzhAI2tlp>%$/B&`9B]>f Y(N(E<HdH@4~EQmzfiH38HiƶUX,k68-ˬ07/4xl)o wmz`N7<ߴgelxBHMrohcD/`}h!lUeJZL|˯ޠ> stream xڝwuT[}-b-V P ݭ@w(.EkZ8ܴ'}{we%=3{:ju-6 KsԙN 9C g@ Pupp@!nD$!pg=@ a {]q (bnۀ-n0[`gHaKk0+@E$agp0ljC! ;%A0?p:Z95]MUUm4@SAN^[ mVn  dmb @ZDgЁYH.v8 spà]߁ E: " D`g E p0d Bi(+ l\F &#Uy"tg  9gD~P_UdpkVwAxD O EAV.^ďBL? Y8;8APΈt' .^,wh! `dE02K=1r19\\Ҙ#ܡX\j1B4!W]@v?ĄY:@<`+,Ugp?n¿?e]TAU$,?bo ' gb$ֈa. q[C-lV ;=ׁZav(X/l\! ##9-'9 PO,'ݫ 0dB8">yeR%j= `u_h/6.>>}CwA0l5;`,Op[~J |6WBQ%[X\ȭV9+׏$7DZ.fcXeZ\G: Er&'PK9 $^-_r6oFW͈3N wvY&C5dtҕLca/5Z)t'o2Y|nACxGUlCV-|xmٔF?v35vi!g ZÉm\z⮆w- =f졊 _$ehJy6HIVfq>• L[Y+f%0HH:~UDX'2\堮Y(=(RUS0T л@Y\P׳h5g#TLU p~2עkw D,~$P ?2 H q[aQL3A7g~N6kz++k[w[~0Fȑ,6e55Sz$.28J~o筪3ԡb 7̼+~Zk3[,bSˆpU'y{klR˃& 3/Dٿ1>]VX=Z-+ ^j" ;cʂn_@ ]:茦~֬c x`B]0KC䗤{nH3Οga4߁~G}Ph!Q~QZlͿ{}Uޒ*:ˊ?G@mDF.UnJ+!,Zt2Ym5Cg9ӵ*f!(w&@j4kHƏln,Z.e.6?RmMQ4CfqtlV4z~Ҝ Ԋ,VkeqՠvԈϞb/Uz㹝\L6ytq̠e<:7x1U >?$vz36N{G GC˯kmBU{>1 (]&h;qM rZ)Tx[yKy\NoQ[ 乲8]t{Jyg.K楢,P rI4َhsqx$VSqVTH{`[~U#-OӍnYuoRMy 圵Ԣ,ߋ]Sv,4Hg{]/tĘ[!(kd,k\@@z'#ur+` 977 x;NkB'e\=[͞ع;s ,!5'$"Y#T*ur~#ȝxNfEE_Y(}hQtYaY ͂s62rdOHEN&wȜˤ0~y .{X%SǤB}QRJO, ǺPA*Ù>g3Ad/Acd#Ex_hN 6kḫݯG j!B~'K=uk[(d|sp]B9ܘJ{ ɈCܸ=z%VhwO549_zp5gu:hq:|"RmVU`eU"Ĵ{-)RsQSEoG9>?{l+}#T)a+_u}f~mbeXnL΅E ٺs'VG 3ҋET$"^@_\2)ݰЈ&GnfE!ѧm&E[qLoU/Sh mb}O׏j.ܩAٜ/yxag<5:C>mnr Ǩ'0(-:M4CFT7#ΨE\Dy  $FtE-Q5kPUToXYx(2{gLHMd;?%ے0٭Kk;W\{OqߙXv EF+vOVV2_ 3Yh&yVMVUme0+9U{| V2:(΅  -4NʓOGyl:e)EC9} ^NL  L-:s#2e ٴ|i]v+<-1lK"돝PRTa}} 1슡ݤr*Z!@ՋhOk &/KZi&\F-9:6G>:Ka+aw^a.C,?[V#Ve?L>t4@[bXtyE©.Rj=C}UW!544MF"j e^~RCbr7o lg x ./)2Ԡ'H6}Wz7&i= "R;Ɉ9ćQ.wZiD;+ 讱KbZKհZRujC(1!=*%GJ+f:Jgkg| s΃f1cq|vӇwV L52l039<7mp3ϋ9>ĐҦSdik$;' Ϛ^B[Ht +yih&53_>ׄC[Z\a~χ #,¸9m?^j@ꈭ/Ѣy<)jYbzIDMQ ݃՛=hid$_w|ޕ$/%ӦY٢cR ItO ,Z!W%cx_~[qeWj.Ӑ#`Gw6ig2Ka92m:WMN-ײ(uBuhֈ {>=JҐsޮ$~"M3(k&!u__E-5=SҙU=VtKuՔLL 3^߫Bj\g~GHe\#J=}m2ԉ!u܍p޺nn~tQmͮ ؊% Bg)ցZ rĤ/DB(ECQeUCMs^VJ+`JN4y' b+iI1V AB&pbg%NϷ^~'(.WnLqǸjig<_Z#aoRBtr}=:=$-[KfRǺW"M)MXb^ rEce?R/}8QP%4Nm^\7%C.ja&=XZ)[OH'(ʉIй.M3c=FE-2-%T]NUP)[a„2HY7iWAj8 ~K~Q 㻌gb147p1X7nՒW dWHDTLҤn4$ORS2~rb*(lwfo}Ջ!ַiztfn|hMę=$| )/XVG{Y DT'x"3 XZ޻fjzFɭ&e <"Ƕ^OQY[*w7VDF-.J0ё4%Hٍi4 pvOuqd&=yW6# >/)z7CoY:H ?70:pLLc8-u.5P .f ֗Oѥf RAd@| ֟?ͺ 4LeB-D2x&>9|ҡԮ+oY`!2R} lJ NSbQ'ZZ2fį鍱H/ieLbzX2=ܫyj fl!9#z a+oA 6UA<oXL2֤>ދ;3T6hdˍ|++L<9f8MO?DUU20x9l. #=/N7'&Y}G2>բ"nn:_>Mkk%hzQϷ>#h;Xn%ZNu٩k}Gâp1T?C|n^;-8?}dQA0JYJY>P   |OO_¤/>D%*w9<&ˌNMgղQaCW?6"ESЇGt6M@ڵ} ^`H/0t ӯH()76afxSYd}*]{Z-Uls0<8kbk",ڼRIMn tjDHLrlvXW9r->!egIObb>AB!HCtxw&%ݜ&Na%qk)4J(:x9[Clvcw~-Q}%N@Tc}`+D*)+%lY7"9/`&.+uFRsv+xA2&!SpژL̡ 2axaT,^*k@1s-O4'|W.= bP/ -Rȍ=cm!.y2'VZV<"^/cGT en{.>q1RA%\睬Ϲ*9DGsUx!vhЮ)%R|5QO*6>HKZTwrl% ߪG;lPd-6Wq\kˇ4`1n?|:E @zkҭ-)]z6h*&Òz*ix%`nqe+!;l&yKů~dV3 + #mz։| |d7躩NTrF˩,XJ]"j'#,99aSiDu|.xktZ#?P+Fy")-uܠz1SڃEcK x7nͥB_ &`6(;0ԯ_QEs!/;s;BՊiԨ~qNl ޽fbȉn l g=pwZ㱢6=ep+&8᭒vnZ_{xXfj];nOjmҧmA3S endstream endobj 84 0 obj << /Length1 1454 /Length2 15343 /Length3 0 /Length 16352 /Filter /FlateDecode >> stream xڝst-v*;6:SQŶm験tԱmcӱO;?F^kϹ0~LYI\bbcfEw67Y;%A)gkY\@uOGs ]  p:YXm& )3#@Ҝ $jglbfn/668:;8:[= < VҔTUTTTJʈKJTe}[Y\,@gfƦ@ϥ'g bdhgmo)3kS;OϜAVi7sggؘ2|$.@s1,?D6-F)QU;3;;֔@U0d/?[ƎgbYA?[?,5J(I/'ag fu @k#y!x>?9Y썁M}J^ e}A!+;';'g-]@Ο$337Tg6}el2}6bgfg>)v3s Eg?gu0''2vr5eovi Ih$ڲv07SZ,>hb0s*Mm..nMj?o,b:R 3p1u&UO 5}?+@V* 4u0Z~ sFsx3}F `cqsw(SWg׳g =MVLbF>Ӻ87| (C ll4ߔjIL׉X40nM8E ?H!&;ƗM}Rx`Aio=,o\B;>?dzcT"p4Xj̑3HtQ&֜ Yx·ezi3XE+jD 4nD%Ft gSg%mS.V4x_&ie8h> 4~h9}&̼7b eLGoߌ4.;ю&6T ٵN>av$EP/RI"< D3!eX@+1.Y%jl$b<b>OzNH6cjTN=yцig|͏n^sL ފ= [FsOgш%s)0 X֗Å^Ia@zB3̏2 dVP]{a({XDzkGrGa30B9M4:!|i[Z]?XvujB$a,^m5JӬL\˷xU&4rz3^ECQ?$<~t?*h#f@Ҧ;ouroLT=YSk~‘!N>Jnalc8.1z(9j l@&b㡧HuJr.i^VSHU8J6hIۭlߏ:M>'t `BRebXܲH%#VOQJX|o-ohN|!_ziZR]Q[g\+K˛gˠN(2[o!W㒚ToDdJޑgY[iڌwi/j%3MBI]LLSYsFKX8Ѕf"RM ޜFGTQwy7Y)ʌS")\OF~\l.a.bj:Gpr~8vZSJ[(`;dUR&4)ԈO>(MzjexǨItc~kk!>cpf J07oDIW&eE{)uЅ܍Ch8= 2i{ e ;ٻVLT]J<?c!È:POCu/QRRg(L!>D(kp_(8lα)jP:.5a:q7wJ~3O㾷Ё^&{|vP5X='RF#(O$dK/[/n%"8 Ud I@=`ZRE$aՌۅLF=o/1N ЫdRDMVfER([!+"KE+ b܅w5@u49e6*Sn{E7*;U 9"G5LC$khԨI׎L3}P`z5;Y,9"*J+GnZaP"bYNJKS L{#U59E*[Qَ-w 9tR˰mQs~bd87K5*ET^^m{W;Dx]s5aUY:[g:-o7 p> ̋vM`ء58xvR}P#NZo*88 |X?/3i-s9ʐIEsϻQ;^o7JLfO$ƠaD'!Z~Uch|urՒN8)Stl0f?6ۚ#~e*sCLZЦպ FtOQB;CLgy7H@ۓfYku\`Ewij7EFJ4fRGHj9o h)6PL;+O^nwEzpi jlj$]mcysXf=0l bl[uAPY(rc<ұ$mf(,fܯ͠1w HRvyfyq÷1AQhS7_t1ev*.p':ܘ0GV5  9ǼOJ~TǕ? !xo!$DJ4 9q/[_fbQ2^6AKSN۟Zv]I›H%R+wz_?/ju´W%UK効KrK97QEzWl"*H1p&e]-+7S  coș[EGo)ыy.}e%=!*xGZG3`;5s'zyRiKmz ?S$,.{YIľѮ{MyܗG74B -%+"EUN%9ţ" DУnu鸋ר5v~aY˃JUQ*(!\ޭ'Dd\GaN4>fQ~j6,+Rx : yx~ a09ěE fo_]Oz D^a k}T< :0Nc.]6*Sxa74I\L ա'F.Z#)YUJ*B7$DϕdjHm?yټcNJãf l:'c7wL5$4]Mr,h a߬-:*߀qͯ 8ޜn/xٮGNM!)ɽM81A1 R{e3 ]MhIx#Uʡ;aǎ\?N+( ~ ?[DŽųAgk ?DN΂H_z{.ٙ#eɏcn;F6.˩/ {۸5dЬC8_wbREYc-g/Ja34VmGq/}jVI[=U&ymtAڊ?\Zw(yY^8;m{^ WRGhHj{w;|F 6܈o~{^h]]_m)Ctzݽi_) 5qq"W%`NO a7$#L̟uIAQIY#/o~̱e9nYg4R;&|Õ +ǨWP-JO69c2|J-ltA :Em5ݕ7 U=CHцm.kj<{N2=JfdѧŊ/bAuV4)ZjiC{_ XRUьe:)0B?N>e"^P#z/##:3K:|"uK/_{'+v'j37~Z?X%J3"}*̪?e"4xj&SzTxe!3ֵV72Ps>$JBڠ=f$=!CpFfmT/N'7yx׌|%c@gHl&!,vnDS#J/ ,5k[X} BU'½mgFJ8w^+K{$/:vgr/(]vK3US/IRU-IMAYη3˭2##NUEZc5b Zc+KȖ~iܫ=p`Of>twg{oJilPNmXWD ߸FˉR|7Ӹi*fZ54|rVXvF,&%[a4UM"MÝsOX`p[LE0ʩs1fy6ݦz `hfWX;:VYDFGȵpp~;pW!8hlt=w71|+l4d%Wrs9 nd|7p7.8ia4rڬx_Cg8oHIv6lAԏCT"8R0}A'*ėO).6oh;keN Bo0F̳ MD|-/?[ɰAP^ O {&lfVQW]bS])]|tLg%n>:W}6pXՠBA{n \Pi{4W[\\C |cza~/ܾև71ӓvhֶLҳw;Y0ׄhN:&kZ_/*P'̃gQoRZާ?=&^ۭjuPOIo?lh|ǕTCWصFo=?Lm3D]c9tuCTDo3`)MlK\]CŶ^fdƯVRR'CH݀bN`R*)vD{yX{V?13W;7Fk(U'UV2p*xˢ,ʏ3j%~b(L i1 5X5C>0"MP wMUet"4,>=u*]ǟҡ_3!8i^[e5agÐ98]^)+KH9Gi]O0ڶȏ1SK Xa)j{Y7o.,]Wh_.P̲0a=yv0hG8oXu%Vs!@hkUBՕ&5Evkv PvG `uHt1^b @*{o3?&$uw2~WV1!A_A-L|ä$xAuwa rp`na ԡ ?fNHaOptޞ{nָ|ٽs.?J+|Q 5Ks@GE0{OYBs d+U;PzPZ=S|Mf.ql9!tlT Y`zE6<,wzU֘j9R̺"q u@x\-WsΗN 76=ZR)^G|a[|Lbvބ$2_~ UY ,x mbvBȞʁkʝϜ&g*aK_& %b8IgS+J$ZD.St7)auQf)s$/qJ aK);QXgN'`nRn ÅWz}i!W_a[Jզ'eK$ }? g'o[r1k$p]s絝~2y)Y rv<!q l ؂ u~ Z֓x܎BzVۓ )meS.O )՟uYSgW7|^ cH9&CLPˢ6@}ܩ^~ש }^dNvόWu=Zw)yӶkw᪃ v~lMR-epVuc2'ܿZ({V !ы,QpQy5quI_it~aKqF>+\`bVEB.={qmr ¾&8[ϫwO"L(i^SC``E@ *r"mTV]ߣʲ<=}d{zjt+UmP%^R[!U.:_~ u>P$ʵVާD{xuڰqLgrП't畯FWP/ޏ{gpay 'y +q?Jޮڿ ug$J)#{F4'Fͫ%*V,W:R&Pu?HzZKk9·*!$;4SG0)i b17d*e\ƒ rFT/dRY:Km}qCL^'XnKWow_9Cd_ w32Jȅ{NJ&$4f'x̶G18\~V7WA0(w$/D~!=i!綝>lS0,M2B*: :2S t;?bbFa/5EgCk;s9:sJQn.YVx}c[M|1Ue$#XV d(ɗWnE3+"~L\g37e!א0-iVĽ䕧D7fou{,YA߂E,-1% Rlt0"A֠jUs̼sHg$j@8i}Hi(ooC'ǟ6}q8S M m>vH\?0d: HndW )>\@*7K$Bوw۵+dIʬF~ {;ag0-=fA)(ĠLћ\$ IR a+;qvP TGڛC;@JUɤ@2Yd{k6=0;]',mswJA%=V~fEu_vǘuD_Тwx\_n0>6,7瞪j/twߍȸ/5Ep;$}\tUg$P*p;Nַ6kjvEqTCmCϜSecXWHB ` B01(!GjD#9'N"f6hf`Pm 6^KKU2vkyRONJBO'{guwoIKFh2RtQLpWW`4RJ)$P`}K2CZl<,J4'o5uM| f~~8i!!']#,rx+ƹ~q̧ͱjjKrGC6#-(Y+h?ȗ^(Lb+R_us7;K3l)p®feS<TՔAנy2B7RGYB^!2lH:A[p ;($#-(4e mX7$hT),o9jL^(ϖf_D@Ґ+|I H KJʗERI.~VqOLA_IDʧ^ڀY1+ACT]<-4n@ojPҔe {>j<<<>)#zH,tC/⥗>,oFBFv.L.JuV L}3; -!wU_"&_aޠmE <>~ki۸_ {YN.B[4zb3pnYÆ|bq8fMan@YUsA#q軱0MV+knv$EU U~huyڥhdH(ΣZ ڠrڄ{%DPAvZüs/?s\#-Ϻ%gLI҅K/hCΆPsA nw;' y]?GY̔X% ɏ==kd6)BEy|̌K "D9hTü?@kUb%q}rV .]xlmfmP7# ^ bj3ϕ!,1 fT2ba͗Oj X7;7T -vzc{^f& h~Rg6ӭ.v!]M M*F\e+Xأ&PKhOoܦs5[$(åyǟ?dQn! Ӭ܄Jh\+ݞSX$8*P}X jKMDZ]=N,F;lۜ|‹Ϻnp C9LF=N5ܴ L#szpᐋ' u2k<ҡGHte?-uZ 8{#FtdN ֵi#4fCTdPo*5dԆV^?G2?+M㝯aTMLB=\#]yuRg@>Oٴ/~ U8}LpM6CsJcڻwrp\.!@1)XBzrq0~zy-X]D#bλ*3ڽB`ٹo.;"bki ӭ}>V riF99!OYwZQmpȜ~W'2.=Wh9o^.5lHYg=n$\UN..eZ&qOmfC vb}/NIZ2~SB :-*!&]]ryWAN%c H88Z@lj $ʶ&_8,c7ɿ|L.+QZ!/c=QU2GKg{+,{5i^c ǽ(G)XYm::;kViMmv /;mL_Rx|FRSMS3nOݘ# yI 9OP,(Y4!rwfe5MVhp7Tїpvhz#W.Cތl' Vz¾G> ̡L6ScI5&&.ĦcB)}+M4Db?禾YUa&GWwmUR4φUB< UR1QJ=iXoMX]xcyHW}ao=K}$Y_Mj)E@[ WtXTP#_T u܌u|\ \"qFuS52yᘨ SB!wjC%xPZ2Gޠ>ɼ(?h֫sޘu}, ƐU"?eu endstream endobj 85 0 obj << /Length1 1468 /Length2 9434 /Length3 0 /Length 10416 /Filter /FlateDecode >> stream xڝvuXT}.H %݈3C % !!!Hwww t>w93kZ׽b_ g-ZTn~>\E :+Y!@u%%7H?G }F^. ?@Y9!P/7`X9ܜ]ܬ!p;9/ ug.5 qyH򎎀Hp A@`䌀X9"!`^cC@@]HY `fd1p(aHe`+h 4"oݑ!0H@7GR0qݐH;@9;!Yۃ đ"0͟H8Y98CaH>X$2X@ 4xDl66Oʋ 1Q?y؁V.vD>J P__t/'I?DHB`B #/Ȟ8%cC?DّH  urvC6,O1/@`pi!1C>~!Y$ж8C6I9Y!')Ϗ5Hwg\?s ul .?ĎB@W@6&QQ PvV0j: aqWdOmŏ,/ ;9ύ #Cn7??lqp&r٢ x5u5 8#}#/7=+3ۋm_VeCϏtD~6P 9uon,Bq1>q;_Hy + ylpf6j7/sca=zo4e~9ɯ7 @Q*3½mvww¨[jN<ÇE5* zk)Ub*ئ(8<|XozZZg|$4lVs)qZنD\֛qv;{ މERX*.p1zqto p^#{& g{Nz8.חe(rǒ( WBi4fz'{zr"/~LLbe5Nt,aR9c{tׇoߘi .J&Ka›G(4ͯ{ĩd:0<(W%ā:I__d)?q&Ph\;Pj|y§l:)9qASs-lifi>I<[J6#}J@G'3GW.YUQsChWwjc^ $ ta!Sә˳4.Mcjm:l-zol*\? 9vUhn+G+xo#Q2./PV[-KK[<}l2+ykR?ǏX '8T>!5NB\hy;7?J(b6IC,!2KfQ1fiG">U^.S86yb ?6پrpgj m'CZc6f .Ƒ7 hP[qAPøaAs4|vieWABKtuYH_9K$[Dy|7<1I׋?dX0+ acwSaEzK$ᬳFy;v˸(?׹nj.ţc/n3vC80Ք5xO}W+ 4lG-g7\{pKVMQxDﭤK U76:B twX͘4Rzufqk xwFKB^+:BX eؿ9u!<RcB +B=Sץ`MtaPfyYF>D|?Sf4完FI>ڪ׸xg=;mC{yiU7^5f` Ʊ{K%\)M!aPnƣz#@bmo쌄 dx&@J0 4%6χ`+lyP9=n\GbLUد:SȺs\uxcd싦 Q. +ŻP Xg 4Q7 T^˱]xjgfNY4Ig]Ύ3E$hN鴘='nqoJ{7^E h F #)y1_w%Wy.}}!f)!}T2/Mw-F W^'5̍;s/AkXTعLa4 ?}W{2$DPlG1 86amF5#|m^~lCsP"x0״`{,q- WAѼǠ?ҹOߧ[@u1)uD q:S5/n13}cu*lۛ)Ll^y4 +L&e ߼YD_HTJ7YXe7 {}bDZ(tofڂ_ڟmM2!<\6luX ;ʿIß/V J҉l?2^o>R(r{tbWvP>Cx*QykNg<W7{Eu'A?ʞzRc.EX7b#%yXMpP^xVZxLK꾓OB}7FBq7194L=u9"x'$i5تf_3Svtdwdw\hBM#2BjDxhEXH>|鳭^,ߏPG\ْ jrV触66M\>GY>y{HoT}SOUC"IZ9A(ZtT'8^Y ~i&VbmKqCXe!i j|& BOyGQ>nmf*$<υ<esL޼c\zh8Uus+ #1> oЯHYZxa/,z*uV? x<+Ȣj|}сO5?k^gŬuhUnUGI!~ANSjei0Viux|QY&С`%V\EwYEFM`LT>+f7 Y]?~u+ՊL: *$~e*";L)Ra}gqM"r6bM޲ܕ v6z:v)((ow.2ޢ*_KF\,C{¤pð)} ʄ0/qƢߋաOf W,QB2э֜/BɆMe"6K 4w2w>3J}|ؤS2,ڲ hQeOކպ᪂Uw^;2'u+ ьmcUR3gSh$:3n2k#"oG$\eGݓ[]{nEJ5E HnXlִyFu< J#-~AtblrQso7.4kZ?ͷ=mw#Uߴ)z+5hgڰ r#FJC#NA'(3T=~)/GRNjRTM&\5%7'Ny Ǔk2('F(gvĨF@Rg}Z5 .I&c436<9b-mԖemK`)݃M:7&Rh)gw*Mjk\ICU`l}&`-X~:>>=X1F<z)8ҟddS_h}q [/m%ue,3MI{`I_{Fg N(%C\li(8o̡i J-Zj,JX1jRA"䰻}MqQD9ւ5*<[fGD415FXH2-$&jk̨e2Q$%t]PD^gҬWӈ|FmK`Sߢ7Mkw*TY2{QN=K0.迣^-y*&х,(-FGMϣx铧yQqP^59&քK/j>AW2,'NwƦ08F1 @qVN%0i:Ji|pAˎ#iqeRi 9"*&G^ njvqKy%z6;gyó Ĵ<VHK}á[;8++],zM$ ni˕8v*aySM֥ ilbɈbJ}&(?._ndk}Iݏţ/;<&VgA‚5X+1SO$<;n+О?K?Vyx0|FQ&%5<]bΊ v."iI^L˅g\)^ cv2G-q|"[ʼ9 ~YsN׻9x|x2Y$X۸`ra=kx[ը 9`+_11ePEdS/j5<2e< bPfDif'f=.ׯ#fm{ѳ{k] jovʅ"ٚb;m`3ۮOڻ옰ar߆"uߟFS3=?lbh\?dcnfz|y=׀%V6-[U1љ?%Ke,T%&qcqgيh7PvmïvW›U*I cc_fv&:-Vźv)떌 $K"([GqY*t]5{] "ƓV\kig8~BoRjqDҘLbSDnTqw iP早$ _R9eNs}u+齟˶8LG+Q&RӢ:+F [;`F[uIk1T/wXt~ ݻ8 zQP"w:'-E'Pr2\x)(eJ[knhygٽq`Ilq{11ik yTQN _4Ir;rI^ LSR*Z=URAH_8 j\r_~vN{h9H,ͯçʋu=Hgv,Ukcd?Ֆq=o3CW3U G2=(^HǀWFcL4Ub Nʌ[\{џ  {ǰ)P\1}$8 $f[' M-xwqVr]^Ja$N W1kaUVQ`yv-} NX0S6'~uMB="uB/Nߕc5vJN Ϯ~U+%m8Pfc{:qzT3x'7..#!B$W-(qEބi>s˛O?"9 oSJ;Fp?W anl_3 뽖}mo\YDofq+h~M&;8{ջV *1v ^?,r5VO3~xJ`k?- K`P1(XϫQ8Ddp\d8~dSvvUB!P۫iXo[@:XLWo yXt+jOڒc4ے׶S8H] 1lo @^ڷlԿ;/o#e]UZH-&u@ٛҁ87t\8- w7X2Wi^fJ)FE46̲o]r5F. l]|vȣH+=g;γP9>HS3 ڞxV.q ~tRG~`PP+x_͞ȳf^YsA5n7qpx%g=zV[lW$D/F&?7iCe^xbcmMm)[T% 2RF;FCWiY5́<#&]6Իvm3U/!]r7 5,6+AsDiWy0ɑ8vɅKpX*ؤ9a]OTR ls-}!?JokGﱹMs[JZʧu,tH隓L:iKw<9# cc}ؓ xsYeOOAlwER6Ҡ0{Zz{71Mmr/ ch:dMuFcrޟ/XT($?0 l>6h͙иKBYJ_,icS| j|c(a}ܿ2"]!ڈ QpT(PWޝ[Gg|5;؂;im!Xq"I. FE8JiUsy{!?JrQD0iB2[Yn*N8q=:4l8KbŌ4Ww.17UG6_hDm)$[XAIB}PP;7x{2%W:aMś׸H:v=I3VSc7ҵh~$`N?^ 9h'!SKe+\a?my0OO wtūw8=̂vyfA4zť1r Î,&޸&ϸ˚cئ)jUdXX36s{9ZnN "oJD咚 -:A yGoTWJ5- Hfy7Aӂ@_sN-A}l)LoZGhMGkTE&ض7w,_${|nD-б"TI=|JYqf"e7> stream xڴeT[5wwCEJbE;ݡXq}9od$;ҹ&WQg5@.L,|EugVF19Z 4q9H.Ve3<0 tߝSO"D 3]MM@Kk {8lmi;#JŘr&f wg[k9@I r7Z@Sd4%jʚ*L]A") !! j}Hkk:Px7]QRCTCWE=Xn@߶;3R{Oirqqcfvwwgtuva-ae pmW00rXÙIR9ߥ|Ozw!\ִW86V&*(M\&f.&.΀@s]=6M] ~gv>&wL\Mm3*v?6EQ%Y)Iu Fs`TOz |.+/}H%Aיִ'a Cmrw?F ks:2k:X;e%+݄6K t=̬6gNYv9,L윁> vx?"+7}߷ ?e,@ߙ-J?Avs"}a=?A&v"?r=*.fV_vYu?&Ϳ{}X a|W}/Y?1f skK' 6Ddy6NN7=3="'Y_,?ݧ?gl?lo 7`7^{a d0;x/h~tAl*8gu] [o̿(=Yއoрe<9Xlrrs3f\ylo@3ĥMRCpdT 5/i܏K)SmDY@ἯM4y >C߄:ԁ8v";&DZL%Gr93-?ZHmloW%-0s`;LEtvũvHѥsqG`;v!#kg mD.`!؇p+%)%;~'Gy$òry4NpQȧEhtQD垊Q]?);T,Y)TфWoP:pA<fB_ɰBwyyT쉑=zPw?S{w6ŜP#ݾD$Q~6z=vIs-C$" {]J^wOt*aNұ k9X!RKn>(l̕l MP|0IFx~ D_b"ْc©1ZTg :[{ ER#ڪJ r`SDgn~تo usc򣇡eb HÆktB,=D).=Қ,}~A9g".ϢW.Vҧ7'׸_np"[u&~/F'q5_Gq81r;#2 *~*⣠ {`ƩHc/wWK\Xf½Q4_NMVWKDvM$aj* A,8ΐy IOj:C#2P9~ 6P88+ ;Hy>A\/A}M1w);dA0%`d[jߎb ^^Y"lZ,Uq*MDCTh;YO?ʌmhBJd" ZIyQT ^{O^rn%׬(ڃɩAV\'}h0Rmp_QE?p4-ֽ 4;?YNH|n⿦+0;\&>U3)@)+_ "k9|9c@ [ޫg՗j$!Vj }uӈC]0IϚֶ6UI',d8iwt5)kͪ[\KJjP9ߎlJknxRصqόء^ STBW-Mm'ֺvGX,;{2XIƢsJB ]DS֌NŇy^SY^N e&ǢLhxD}:`2fvwBiABs)uc}!!EceY ʶyݩTr`GJr3`+'[Cا=`XҶEG^D}Awƭ[ۑ2nk}DLDz84O)qm0Dq1S铌va=N@9;|XMAbk$.e#ˠ9OI2ՕwM dsȄ] @wqd-d%n Ci~\5o|8mlR+YӖ+ SVa(6tV2[B{Y/^4O+W,BĂZ^*T[lKRyD_'{NW\A8$[ š2A~ }%ݥaxqxL! qqB*o}azm45mQ豪+i 'iH;M<(߾8CtQsᓻ2r[F.Ǡ{5==K?We(UURzj4x;{[r.1G4̸*SX٦Ni?̻ߨ:t^:?mJ/7(S,LcJC*0rKxT'$**`r!Y#^aO4#LvL A20MnRWMH'.r+WO 7mL8njx651lJt@0\[+xM9W>4gV= ?h%\T#fjE/RIE4?+eټ{#a $+qRkS&\WhuMˣ ~x:q(  iAaHs ܩǠxH\L^L{Wr9yiY49W6CrӖ{P)bRQRgJ=4bKpp;*dioz/;HCKȗq8ߓp}r!L] !wCP HŘمvv! Xy†S!1pw%|6گxY(hҡeᕊ:hNL/K<m?qt!ƴ,n#%vjKdReɮua ~hn%&Xk{5ͦwȑ`sUVT$,7jr=q V۶vn#L7FspamS ̶`?4lky#IQJ.Od&=+1zuie}**ao%̞ƿvt LC2!E b=rӅ^!ָ9M#w/։ ~M:G$]SP!ݒxe>-eڌgq*,I1DŽZ ` fZVa Sr' V3[sLlL^°ǪGG4m =ax~׫dAzzz_ oFll\wx_71 SoB셤FE>_*(AVECyW(6Y}W2>e]>$V= xKZ XF/V,v߸f V0/ByH &F(y=UQb ٵ¿y_"+f. >V G*iX:.g/5|_`Lئ8I?${d[02A&%X\:BigC{iq+Ї溑OȝN󜍣-Y!XBMza&>o*D+QNJwX8 t|:l!R5K30OAaHe#L٠KL0@ ph+'rH1 ?Qas;@T9nbuݺC7v&-[l?*vUIZ]"4#W 9($R]scͣ ?:zBbVuylvϺfjўdhfiKR^TV [,^F %Vqb\ֽI#-& āJ;QBawBdfC4 Kdx j΋4/EiWeU9}h{v{z?:Q"l_Rt $~=õ2 %׎8J ā+&3'[%զʵsP`H{)οU̍"%iȎ>rCco,f"/_sO8!I-_yα#u%`fͫQ#t)~C4J9%|P`:( TZL1w:Ys(|mx1_c>ӛ}Khkd{h&up# (HB!:6NPTʹY׆Rt7v7u=$MU((+Uߘbow*YBi{iLy '*HWWի7ÜrÄ~&Nv蓘3JӦE·ϠwWô՝ukIIuW^OKAo! Nt ęs)ʈkSS}OQXg쒤!(L4 .Z0Pkgo@$xdhH1 tQ^SVz^ߠb؟g4+uY$\֬H|E0E=}5>6Ԕ1#PgƢ8|-mJQخ۳FTH4W_bA:?+#'d?v^AyB_oDuߏhOtKQ5Vր"(9 7eNM h뚝­I,!^]3̠MqZKNPCFWy$#ٲSZDe֣>VJdN^ |G`1]Kg~I,,]B[%Bɏx$y5M $2Aʢ]ʉGECME{sCs {(7Th*juBbEK-mĂ 'HB8qHe͟I|>Kj8l'!R/:c~2FJ!H}UYPj`ckoAZ}3*ev)|_nrD[ڙ3q)u?ƑV;.nFen$kdB5E1ݮ|+mӧq끩udnmn(##9λ6܄z4]5I7Њ䟑l*Q0M`bE]4wH\1JRrwwC9yf}z>ړ5}|p}HP9nH3ʖg1yɜË+bmkw5 _#RgSսݸBL]w@Pm'6SUEFnŒ-PxV%g#+7`T}`! 1.#,.5b}Gܧtƾ,OwՁWL?[{.*l^jskv fDkb(8e՝(h,MG\)`1GNEe^Gu*PN"f@nbdX͗6U՚'Tjb9C͞t\j'EUȴ.]( *MWNt[eh2٢´Y= ^ e}k3U^Sڭ)}:Ym )ZƷk tBΦ!#67?"&qȘ&h̥BIyN*_krf qpK<.<}D_ut zRh(:؜ǙAߓ=%cq? XJ}#% M ^c_k3=\ sn/w[IqD]3vE&QsbT oiB8WM_/Ӭj`,4ܽLT_kT-ڨ!qqJ3\hw$, SJjk^|BD%dO1홗%ѡ[dJW6v2#,(nM $ASQ1DX?7)ϰ~)_14-&9JkŖoEC I E;qɧ!6!I)qa#5tO*U0\iPx=6U԰ZN9,0nLThC]7ZAa[ 0݆;&U/Ba7 ,3,LGOxt$~N.nZ&[o-ˉD $tq_z8$c8j]}&!UQxVwmyz[!z/gZNz͔qxUdf+pˆ 1vn( ݺΫ`Ux;rUL;U]iceSzXeUB'bM󷌄ΩtDI奍rƧ/xT4l i}q%suN6 T%8p en/ٹ' 490E}YHt\n>]xZ'rmRе@Zt5Q6j1SjmFG 6-AoܯdE‡fOL 7oOq_{X vYxSQ')H }l, K Bە4hL_\3`}ٔT\<`Oʎ5~xX|,Ls+@T"һ̒-;)ԃu?8w'/kkQZ2ңykVfIm=cZДo)!WP aQ1u)LC5Jūoؽi Iө+փx˕v3]ZO ( \U2~<%ĕk) &9Vw;z Kaz6^L(U/^)4G,dh:I(,S,Ȝ - ʪDoaZ9y9ZЯk.C933WL _Uv,.4-ыru5[V,|!0IMMLƍyO*}h>sAǀ)2 ,mWIٷu4l>ݢp͎arcϬ/~k4=?mЖpsefnHW-8vK'$fNnhf;HV=hW\h{afnP@O!/ : (Ud;?=$)tXS5 Pf.ٞ1t^EfJѣ w}K 9$;Rؔ雯'$Eaُw YԒҘSΩ0T+*HSkBʠ?yVqRE;Ho.$Ɖv%\{@q˓E JLǶ>geXũAQ)C'`o׉">޵ho_3T]*vA\$zd2zoƳ>m| < qwps^Fdzpf8^ғ£|n_:EvP#s2mK(4u(XrG/ÛoRU Abǚ|ҍ+?ϢYW4ib=-6o/-?7| @%>vk! TޯoR)vBwd} /!`JqCC8oj `$u=CG/ =1ad +K~2e"J$7⢖8k S oZ1?e*y %E 2zל&d"~>>VkS;E?j}sDNArf@uʊgkՅ ?([K߃@Pt^jY*rI֭# ,(q̜ >!x!~(,yd@,Ojɉ28+"ۉIUn|is'@ G{DS1w9Ԥ/Lׅ-4] ^~2 =!0?pqvЯqQ|X5ϰV66`4I}oIצն  xU5N!t M^˔йi)`vr /Z5_f@c.% ~or_|QX8P6kK|dr]fbې;VZ$!RH""L+Kp(wj]HD 9ߐJYC|HUJLiFCBϋQҗ1)OZIUB#v@v[D\f% 2 ɌIEZΆtE= 4{e-¿"=cҲ@8UWP۳肿ˠd>3)3&ŃltNL.IL}jK\xqď&CG( ;GlNAN.nAv8[- gvYgnxa.w O6*_EL" @i>7Vyd|Mv%AD|bW [@SF*l,mqXI;%y#0_읙V\<~#TSOv^A$QiQ &( $EpAuUX eKlGYscK.L,|k 2RH JϡuAֲ;vlһkXa@(6k| (ouy(6$*ε!XInѠFy qY o7‹(1J]>/JC3LO>:D퀒.NGxwcA\;ay` ԧ7!hdwɪ n]4@?eEZCIf]~NEGsEg05=6rc&>~N ^HB9̎[v8otO8s (WNv)H'ЃC8+s l1cK0.l|)0A%+ %z< y#4ݳ׫J NET~-6bn߄ ΐ1{5\ISY`;4rnǺH ¸VlWf'HQwUSARZkȷ;+ HL/ȓh CѮg삚>>4+oK鈚T ¹C8ˢ;L%ehtnmQOz@YMZv\b1-eTYc_g}ugY;Ecje+*>2ADqk_zGm&)fԇP/4~W?B>Z%2G0C ?yp 47eD OXNmTK'^=h< J8ynitdECT}N,`;J @Fg$0 E>uIe 5-AFYkxž$cڀ_*L?/s z,~_m?)`_DV,h*>7Xh"ԝ=2ظW˷0b* M3}5>Eφ6/XDkop:0GZLm\@;[5~mb/Ri*eکI-NN/kqV5_7qu&{l Éɇ|N;^q_kT{BBqo Ն6ѱ?gafi_yW 1LUvT#ˌX'D 4QҺaXOr[ңm$>uCSџ0€c#T-QbFD`eu杔%}]"OkbOofK5 D-E8Gs}+h1bvnȈkYdt~K+fT`k+W=.s9ҸPkgtF}n@EE-aˏ&GkFοXȯeO. Fy-qD@ X2*ط.9Gk:F[KeɐgF6ٝ[sYQ{'6W)eEȻv.]Vf;ߺ#kNgH_-+6hT=vuu}FڶNauCw[GbE1K몚ݔ5B8)'\1x U@2LTzӞrJzDk~Ӛ?.rwϗ 0 Ht31h԰> KjSP`7mqLJvV8B2^l}#\7272ǣ e w:K?Ea@U ِ&8*LY?IyzN+ ]ފzA`Jxe\^/&x^{;Ong=Ok k-E2R5 Q@ilpL}YlMo՛wʘ(nB,~M"+ l{ZkH+j)$˳('(_P%nХ 3}mRwgz3OxÁF"YX GhZHםu&JfŶSYdYW!3pI5lA!,a\|x`w-W8;|kx XḎN8m _a|rF O3ē?+kI@<~f*B}= ߐ #F{r ri@C͐gTxjjH!BWe=:W,@L_e](9IhVmu1>~DPw9|)򯄍"^g_@"$L6rڬ Dw#xA~wЩTIK "8#fѽl|D@);AxS;ogY;alBQty4_*OblQ,Է7'.llRr7`7cnr;#x+5BDKFS`o &;kTOB:R#R&CtO~9 8xKI#sֱaD7rܛ!$*|JNR uGeCӟU Ao TG =t8,YؐD^ok)@ 2ЌIu뷗[5ijz.B3sa1z쨿Bq qeVfXw(mHcfoul/=Y{Ps#(nƍ^v A ޽P".V4JΈVAHs69&fa@YW!bl%tt>>&TY/mf&,!>yq߉6>G-3_e:8<[i<|r /CvV cDH0g7l;)-TQ礟xWhԞY֮ E+kVƙWLS|*{N'#Q 4T{EG $غ x>C@܆ߘIG2Uγ]^4\JL!UdjHОvn{[^N`c)_Vۻ­]$ #4 Ae412Y|qDyunH4XMHA K7+$5n.@bPo6x0eM:,CGu`%~icCgĹ 74Nˎ/yR@[]gf^=bj%&]sF< c\:Aχ2SJ_v3b;]܊|Äҽ\'BH}ғ{G1KV {Y^uwQzS;}¤mD V80*F\VT*VBq ewO}TXfHloo w(/C'?H G?:X=g㨖}l;I዗$Pv&t/t55v}?)ߨDƲ]`)!3P ~ m"O~!1 ڐb3rv n:hOlUrxeƥkCW`l:A{FQ럺2r”b Rqs/( Mɩ ղ q7dYvrLaqu _lmDES9жEâΨ-R:|qc6׬uPqyi/)[bx9]'.S(1R20XiX \?rGh3R'Ί*nw>m;lAq 祫'>ijx}rJCwf`dnap7xLum{ó>DN2:&g!> AѴm^-  QC 'Dwjq]aű,2DAJnxqЈꥅn|>gAȔ;lcqHqvskI%$B 4*]>ɌC/\2B K ;^@W]Ve:J,܌b5?]ITTFѫ塪y,#q~:A纇G㒏(*0 Ѣu)ubٓ<Kg}Cd#MnɋuɑQow~V<6o}8A@FbkhǏ ܢb'b7&ȵpQd0w~y4 )7ꞹ}PæL7qu/(~؁1"Fy]Pʛc_vì0&U 5HHd1ŦG1'F+]$gT uc:[i8Q~`y)X x# iM^l:UFeR8i5D6) KѸt`wP8UJI1EۍE6yP"S. C ÒxK}HLQ 3Kp?>^7(F L FqZ|%@&%O ߮sc7ݑ^OuڀT(MpqNA^bIm8& #Ɇ&/AhhΞ@O͇C.SKk&teu;I5$Xga }ǡrP Lǔn=g8VMqK t!@uhJ 2N}M$HB2 31N$t\]t' = τlw8T"@jlBem>u#(xZ ?ĩ+3X9clN~,<ψoZHN %G.C'X,tA&Se8xv#aVBퟑ`wWjcPW"I޻3Z̻+b;sV3ev`ά-3,&Cz]>'v-bDCÉ ~_mhK fLOh$۠hG'ph Keןԭ[_[OP" vmD{^f>A0Jb[kn_md=D<US6.cPds<+eӚ=V8\t\I%`E/bFIwxr2`[84n2{{*u,9a3%YedSҌ肉 {X-хp^DJ9npxdW4tZ+*^SMwI DB3ܵ2rw4e`3c*Ϝa ~5e+ktZE XxKBfH?h -YǺ;? Tٸu\kޟ/pk?gi}/n6ny&WSd_gR=҄$PFXR#"K=yCAwl;?Ou Gqy;C=ҳ~ghj5s4b4 "Na^bWf9mS4$.iݳ3'뒭AN :lSk5UM23fDq#\CIV{NOQ1NHޭ=IT(UKܖOP>="a?s)i^P4/uZ/2 i)mrCIM K>!Pɶ`QJ~c!ӥn!^8_rA~*= xNʨHc9?uyQ!HRwb!%\5'pP5+DyʬxMV8[πE]R38׼)(u*0zV^Qj/a-HaA=Q3~>|Ba^!-;!mt+A_ Hu Mooe6ڣgy7 cfZ~Z]ZJE-a(o}JotX5"ޤ S^vU$5V}H>Rx4sP 0d5e9N> &^e_ U bCVSF{FbA@EzeV2#YnTw*<6 ͦsVH/I85D. Tzm}#SWF)xA $Őb%Z{?}=`k\04XxcB d?2KԱ:MSURDT}F̶a%!D=LkC#J8HUal͔Gedau;1VCR_Zo=av6tRwH|s j֍n›pa.͏v \.]douDr.&6 ]5yb# WwF '%ZaΒT \ppt)ݚl<,-cB8G尊0}$*KMzoLPցV#SW.+9}5`B:H6ašo!54X/@ŷQ{"AP2?a e۟wUιxwduZpmv5{qz?#b$b6~tY"2?cO1H,f~UOewVż 9zݓ(jM]77HSuQ=5*C=ً4%  8BJ_LFÍRs$дtĮ?~WݗWR>};'y#%Cq4 Geے dZ> stream xڴeXݶ;ŊXZ,8 ]S;os>ɓcXs'$J`C@rL"`+c 9 3pX@6j6@f?ށ )`W;sS3{ Vzf0d ,1@Av~T`hf`eԀ_*IEu%Ujª66`".IVP5j?Հ C)@A{tyq5a5-%qfƿk0v7wfjbٙށlg`c?53s{3Z#hp0șAI9G;տ@jcf`O `o1vv{mE+ӵr4p39ڻl {s{UḼ3s?ܻ@\[OXL`a0Sd, ~gmw|bsr۹2-A`g61 :(-_`@h 1mV!xۀm&V@Os psz[H̜cs#wKLL_RNc0` 4AbT;ˁS$ T1 36r%KdK`iw L[(Yk1{a9X.G#K >>lbʪ_iS0D S ;],ww9] vxO8:xLvH h/7h?&oL6ݿF1Ys]12?[l 47v0y;sw1Ϲl;=; XVnj[ݿ4BZX$5xM’s3|YJj" 6Qx|A_5WL+ mx{`PK_) >*bIki!ru>FLa\%ꖶ:17~tYD܎81*ܠGxfV?7gTΦ]6)WM+u1F>[ ^zT7F4paYjFU(\|, ΰA xJۭ\}^D<*)ѮH|/l3AkU3 k> LX 3_ܭ֬A=w* KeƐĐ ]r#}<{^n_1IS+8X$ DG22J/Y>Ԃw4R[7D0'\:Xb pcz2ejsVNL${ʕh1[k8/G$nuF<|t Hs@pȧ jK!O*fQNC_s>|Y,Ky"  V2mm\H9EBYV麫0>BLjwC|oLTF˭ߎ&{_ ɴO=D-VI`\ddȠj#X`i'?WSujD"_KG:ֽa}u_jO,4gX#:53 EO6ӘђS p'NAm9& [j~Ôi >a͵JaȂ4%̼˩(6E`p@b%juj7LZvm-Bt8u$)BWF?jPx&N~t#zmR94X/Qxd䁋nU3XV=}o%}Lz@7ڤR;ұmV~vVUY]@4O!q~@;"h]'NVKXg1K]:UQa+sF?c|ˉrhVmğBpiԯ;Ԅ ?C%" ƖiW5iFtheOe,ʤ2}4wՠ5Z)76,wc>i}},8&:@zmDZCKMo ^ԣF2T/7K(M ucSC/-"J-^(?-BAJN8z̅0ksxN_jwLz̹dY tFvCU(hw]cpT534gJBI-qD+,:l8ȾV3Ԍ,y)5}{BBkE[=kv~%Bz zٳNylc&DDvRTi*@z +"[ԍ3G<L'2M 1ߧhu4Wm1h=+<_\˃%uat KanԊƶxa#O {y3lb&tWZORܬXa3o ̈x-.K#L-U/s|TZ R5^4`܈&!w250*ӂdBj!q3ce QBgfݵOE,'xjvđ<X&.Z~`WӦ]9H[ђdΙz ENxèh]/Oϙ ao{D~izsآ^4WsnlerTmj m9~&2<)/j>T,TfHNdvfՐK]DK5x ﷈Jym_*+Q VmxLg\(CöO?R cbw5W'@k(l1qi y%ĠwTSLj !BAKdϩw/bcAq}? wEu11 פiǁPέ7vTרJDHilXdm&Њ/X-5j'@ Ś&uq} IFL "M; &G"-} 8P}v& &XYs\ ut*P[\;=In;{o\ߍ+G6xP>C(^q/pSbmo1,,*\${ͽ #:_6+ac~=\ALd(8e%,gv)ڊ+rำxC) qvjẗ_9Kc-c8TVPih1;/r2 h#q'=򳏨Z>Ee_U! aLQAp4s̢O[ꭿ-nM'jKcTj׿L֬aÓ,ysF 9J?zGLXG_>6R(~;Bc]$N[Q˄vpx(k;mZ){+kX贌L |Ɠ~H9Ӌ~+\= ahӰUBrA+M5C߂~"҄1s륻<3cTrua}~TGH\suyuZʦqa([Gy#Peyp< |L'R,]V79޷w1R.v_uqY3=Iwʻl nk: 4{]YqoC6бUZ;8T=msf׬-2=['3#>LDy4|*>qێ$Ţх+Q~R+ɞdUP[g5B{ xf'MXd%%䅒ƃ$w|@bG#e KOz2*nkSa=1f9Kf8g$9ߵ~(( `=ϣ93ft#R()?U(rxvfmDOT&Ha(r},šK'PM[ϧuc"mjV.zZ*!Nj b N@2˨!4dEV2*yESPm- (ՏJ2'zzYmNDu dU z6{<ę}3T:Ī)0Upoi:"Tk r{]ORz%Lh3UZTk|X6ȑpI.3 pOfɦoty⭢V|&>`M-q C9DĤhWUJiD:`kߧ_ g3nQL+4dԔY*"Q9=7 /JlgI1Ψ^wE1E%KɊֱ'L3].y9&cD$XJOe?{1:ZA J*.)^R#64OEX Cp,ב"h)=s3 H<YW_jzH/^{*Y{hpNJ!/  Vx~d&m%[l@=(~a" *d#\A鏙+7N}dm(v_Kԅ:b\/%eyO~ْZs8$X|\KzgqWD9rU_B%~02CgŐGŷ&t~jɏC?APuϋu2/JJVᬃ .XЊN&i%.5E2jm&\ <aoFʱ(W`uVN"յjt>kR—ahLbVKF# :oQ/3)-{25a#Dr6 ?2XpÓl,}&2]1DD#l8;ӏ{-!TxooLj#|+ (Wd5p}]+BZd݀DFr\CYLt[X?Zh^.@q?ECgxIѦ0חw|sOq'(58N#T?]* l%͂IMPjlq8,Q"v۾ tYwDfh =[-B6%\6v췅iH/!dDz@ $p hk,2\ %pVՏ(yf>Pz!{lQ0& Έ<+ȷNGi(($ .2s&ya3.D-@vc Yt(oR%XܛxW#_옋K#o6#?x_E')ϕ-G*Wg?[p [I{*a?ҜVݻwY? 8)[Eb41 d8j@wY!-[bwb=8Sq%:vH焦X}O)14IG:2:KtbK*7I2^l1M_(reռJ4!N/I9j?9j(_4zw IQ ;ed NE6M,vSW$ S28}Ҿ:eɼM^skCǽELNBqВyI%*]W[-3/Nf6[ VG'[)ҥ|Jpt!:`{>"_ܜwӖ#^Eg(;Ʋ ,P)F':duph%JT7m'8֞Cꁔ>ݎ1kZA1,"ɛq[?eex9N[t?rwW!@X T9 9?e=Mބ ZɈC:C$1hM K r*I SP7r+i)xM xGыPL$ ۻ`hEBC9M [8 *eD56͓bUq }h}ˡ޻}P"QWv&pڰ["w(GqRz3inJ'w2I #21kD1 Mnis,q҈v}z.0S8KakH,{4#c¡v)opMJΝ/qށ+3u3ZI9G08trumK`?2~GjW-^(ɧZia ;X-&(0dhL5[WKWB M0*Дx'37Ņdf,<ԚaWJOts* ^OߠNCԾPc9 !섿V#gIQl}+9P$ecMf{IgQXB84<-onFuNsLR]IDDXwQw#/cؾ5Ю2xs4; XPo\ C1[IX(H0J4L+?7k:G0C,L3L'6 0F ݐh2:/'ł7JXnNc׹@ BY"Q/gr~s9bЍt{!O{^23%*_| _N }9,>i_4actTFӸsyY!hva \{o%@vO~nc453 .eoݔF< A%}K=zm#/+<˪/`IF֖$A%OUv㲽R fX;C%:WM. =  idMt.'L„CE߮&Ebt1dY[sqF`>N$TKHLK,tB7tqyu95y'40dgS3*pv !`tPҨ(pM׾z[0y}S t#oۈܘEC2&J  ʬ4?puEgnڵM3=ew V\ k_mJ,ˍ9u1hm ާ&TSe8o4t{e/._1+VH~F r%IdF͵")ޝ3Zٰ,)ʂ(ctm3|{^`-RBV~ ٜBJiyɗ*T}.fH^̱3YU?AПVlYܖ)߬.췉_IO 5vbz,ԌN\W+:8Ӑ~yq@(0q12(gr%?¤Z|̓ jyެo8 ") c}7$S+EA'P`kwN] i^6R.kZ/P t!J[ZV6!!eH2q2 ྍ7^Gֹ3*\MΦT˲4(id`XF0y1 M@ "~/謍;C9]XV3]y*D间Ny g .2h>p !X@ܙ']ߵ"o:ŋa$UWj^ݘ9,G5zvH06j I`MAb[,+E^IoO=NW1Jnϖw%dA2SLYgd[#ݢ_b=uY_:㧯Nz5pV4˖9]<;|~OI=Bl?9)ԈaC>\hG20_k_eCIqAhU;o*BI V?z.(W D>%=l6.f@\ ɂ kwPܤ4$۞iJ9.pT_e0՜3*oS$1)ϩ˽8f~%3Gn&jܯy`AOZږ?FyŅt% c*d1heHpa.xfҳJ$]w DBBiLH߷ *˲4b+rb%VSutpyFcWDt"K<:C0%W qjqZc)svM&[.ba7b&0 L(1~i0cc@*;W/~!A? ̫vd?#v/I+)Š&PWd \DE;f}prJ{H+W-o>5W38 )pϕKF+vƂ iZ%ײ4|Xv&UAd1(Fhэ`6=kN1@-L/fښl;?w{^uW>ܘuOݟ}\vG8e%u({ܦta<. kB 7K;2&ߐQ7K5xYOM YWэ"l}D xۚQ?ac%b/ܤ<hjzk>?!87UM~~[ b#8]V^]ˍXWԠnDm0Op+5('hL{<>B5%J"6 &y9@,jYw1/HuZrq-o#a Eegh<n17+T%/`^ܻ' ;Yp(T'^ ^h2Dq/#G>҄cC$|9<? -AHUAܡxEdhon<M"ZV[s=p(9'+!\}Tny\Sٲ)'9,M{@sK.QCX2L!y$ DXoMeCG΢b~iY B[硻>'E3; gHƿtb'oa/-22I\]PN5yk&h)z}/{ mZԸQlY&(jZ# 0Hh."}$-˞HlEi>iLvVF - juyy⚈I>^SX16jL>=Cp7]0۴m~.,;6݊>ܨ.cV @Z mb&[DGcNv/ǭ5,ICy^Y8Zua{2Kiđ%aBc1u)/v>M&=N[*?Yo),aӼi֊9?`%K"#=}I7[ SOuر8[.j1 Eiԇ;G?ݴ?ϛeZH f5}} la IvmMN췄SaQ3*ht+Rm1F"ʜ=inChFzK aI{YieT3i<=JY [8NsaMQ0#D(؋=;}? s4ƚ?\iὝ0K!p.LA}M Yr8.W"f~q U/ Z~ Ozf?3]:Ј[jN<-K?9TУ`mra]+įdy#j׷B-{1{s?v:gZ`ٟG0]?7]c: )4yyNTᲬZsn6?_wO|] si('Jv R`a#R6ćܼmn%% 0JـV#KF/=fYe+_09\IZdUpQ6Ļ\=L\ -̋ "2Oya.)$3|JfalLFR guX1K)#U"zRZJT%F0}#t1'z951fmzmVmQ0zhnA@:%$%FC$FF钔8xúZ{o55Ԍ]iHKb}Tî5K\A۰W]f_ 8G:*:;.dHmA 04"%%,&tP&uICūl34+ʧp rx4x@x(44]$ O"GS[|[DWtPbp9;M4[x&HBER"՜岶 "z4Wq (Z Hsړzn>iB&9X=z /Ɠ3˼\r.I$0ZYwGy:OrI=V=Ll prDl믩9|]Y٧AG~EĿ~׀=3*iGh)ϸsg SҤTO ryBmLՄOGނa1URXTŭ+F 1p?0Q>RYHROtt^s=zz򡵚pfj2. 3z^S;[5p-ݕ̾Xh"?lCo0z0?vIbm?0m m)vNK}{. Hr-` ^a)n9 WTmcyy ߦ3=Oѷx8- gتO]IGwڌ嬆 !i"R٨/k HM耛 dr|;*LbGfv[Ըkg{R;^tuu0޹9$`6A>pS:|aF.)Nԑ Zxvs9թTWa<,BC1qDBnw9iD/%*z#~KS#݉¸=hmQ wi_ϤY7 VM1i(y ԈM?J"S[3*-&tB{sy{9݆/:/[#poK¿N1=] ;M4i#nϽVf6yH;g5qIKP. 'C'UBjD,ҙk۬*ut̞#2J3V_"x&l&gBQ޷;GG=wp~=,*b B^{RZlx;cz򱳘Yɑ{َ:1rLToƧh?TmZlftJK%\[` 0[k}#}۴#EXG[Amۆ F)1oSNG&G+xc QخH|lV, ;z,Gr/˱=(pj/c E>eI`/>v?S]) ߛFWUkuEۺL\QrG؛ؠQ"t {gMjEPEsM#c;Ýްgױ@Nh_ NCR>RvdҜʺto#Dު%0y7˷?V+JXg(ͽ`Ћc+Sr投 WR YE2N1 5.{_?P|;}H$i.KG~qYج`\74'Ex)!Zjki| Pu׸]B>E9 DgeCd⧰[G4УO:Q#326c/Fz0!(5\̟Bk"颼ϴDM K\x]R?YߒŦ۶&yqmL wjw+C}xt:M:)M6r;=hTtp"ϟ🥢m١Ί.7[bAZ1Rw}~`zK?2?Qz|uju6daا!A< _ K^bbx0 5B*:Vϐ"lY ڊ\*LUT2_GeܸD u~\kz|V¡nfSΚ_9@AO*#AP0r?D]mqTr>),n'z)B0M|tph1'9:[ kX+JwfXF={ѻfNeI)F7%p֗[egi5Lْ6zݝm ^P䈉n${uPLe{R!9]kjGƝW7N~H'XCxB60&mTapfՕPg$$PM ڬQTN`^{zΈb'|lZvw g/|J",(Qd6 ΈN375 Zqݔ>2ΓDt1 ҕjP}()s7;D&D_ZOLԄ (u#d=x4as;cR0JX/ڎjb? yrMoQ@CfTYΧh++pe E\W*+_6rp, nz{1nb2-=.;ǜO80%}h H+2uq~=Ԉ+B (f&lo f~6H'º{)>xsC5BMCƢ`Aڝ2\aΤA:B{*BF|Uh]TݭȒP E*(!7N0s2P0pxxCY2&]&=}Ѭפ3k֙/1F46+0 Pq 1g6H/Vz ŧVQNu= X!;_3< [pxp9›TvҤd-+* OԞ>TOzQ&kVq4sˆ$;ZY 8~4n<]4;#tF!]3w2! AOtcWOLm[zDZ&W?RtAv"!?"ڡ7RJH# KOP7#o3駘X-PVI8E{I^3&A26 *pS.P%Xȼne/teh* %0|;RP"_Ӯs!$.]zAssV@?KC۬t35}XzZD*̛ J&t'ˁ8௼;yO(֩i/*znZUaHT~@qq Rl|G)mGH.ѐ=49ZH'LܚKzw9)cȂљ,,+gTի!Ӱ: QM7ۂ! zp1.uk5/AnW76wca .h!$oXPoTX##h_n'sϓ\uYJF/呔;0-)b.̼IԔ 4mr89K;lfmb\?YWLdu"oI uXu7%qx1[ 45{ jFWpITwsVB]i")$4E^j\.%Z$T_GCoM6}>EOZKJiDOƢHNyiVP3@Q(<'-c!T bo_5#~V  ^wFŢ:iIVGOOсrIt~λb\&ɟJT9~S{ؐ[+lEp.q:^PŖ=߳#(s:]&A(̯H /.}nࢭ&v 0d o5N #e'c%M߭KMf)]jtt䭡dR;)}Ic@n>9jx +p(՘H9&>O›jwX))Q.Qz`ƛ!+(?=8Ge~9^|&>*qn)ZW4mh_O> 2EE.pl}D%7QܼItvU{-je*7a맔}[uVa%4 冫9Ca;%ݹݟ"s@0Zp}*7M?OE:R@~g }P=7b G鬘?8xO"CŨ# ~rF::oyp][3Wh ]jMTUaU`A0O̊hϢ`vdy)hibxob%yVr{ 2Tb4+{NGr8+!F{ ]moγvE#ٔxLz1<ːE[~o uYg|w.G<^% jr.69)JjHil|Ic{@3-)UR?YZ] endstream endobj 88 0 obj << /Length1 1850 /Length2 19051 /Length3 0 /Length 20226 /Filter /FlateDecode >> stream xڴeTݖ5 %h hC-NpkЗܧO`@=\**jL&`#։2̜vfVVND**ql+txN|Ti-i0r(v 6-g 5ѽ,̝`b[o3@hlvumMr̊%@ ֦́)@PTUH*k|Vc~/lgv/,jҌ Q%uIH :#@I{tEIuQuϒl,`-ljɎՕщ`lg>us G+ C;N{& c#o_Nw*ߓN5pOs? ?+lN [{`dB/ r6 ] 3]kOoqm uptrWE3Ǧ($+%Τ.<[&E;;NnND'*.E^;;;]&`wԎ铰x 򟲶zM-lMLnlǢaka wmf '+dmVIL֎ o S #prpy{o]!L,e>*T5e~G߮?cJ>&`[kw E .LrVڀh XXV `䳅?,|5D1i$wɾ_;o-hle rtpsp߉ -#/%z'Jlbak`"`xJ,̶`7$x,`w,lYWe[8,Jw~gcg_nv  j^7*@GǼu2w;p'}o /^+  (,tXnOy2qS x玍gEr#./,SB|$ aWk,gLuI>eRd|m_7Z&oLTD~}}Q%EGs452ʻrK8g2H|'ЯRu`]ؚ1ܖ: :!`FDg CpFzt˓dpqQi+Wrʅe5zyq0-~p6\FseJ@wbC A:Y0JU_l3z\GҔ |7fxþ Z&$46fBG8b ΥK1ad7/ٖЎ:{3cdeLb؃Y]՗bQ=3Y Dj;ytXM xc!_d\E]GiL:.gYN;yV ͛eu:}3\Á↛O v7/\"N]Sage0BK- -уqغfl6@ȫ v={ۉ{GC`^ 9%9cgBK!hchK_wЪhJT[ټǒm<֡|{]9LiZm/~wqPr"t` SVw3Vydlj5oë!Ǐj@ڕFͲzQ%ߒ[m`5(c5,%)jwH8W0&Ntr&P~3tg=@=S>O ZGN\rv5R^tTR[-%:7AdƾmD_qV6eT\^]=ٲ;QyJ9<1 ,>s쭎Gu!b♸"Y#oFKׄLڲrF-=ټz+/  [IoI( NGEZTUZᤕ zR`RGlE<$~ bY@dU/Xd#:)VE<:@W\bi0D';txV꛻N1-ccHj KtdǶTyB=@-WA%Ij9E*<>-ӓ!Oq١/B0)Q_0B DgUB~;W\U$8cw9tx\58>Cb{H"c6^[z(B$0;'QQ Tu*8 5U{ %.qi0b`{4莪1FuTT9<\zj^BT!XZieOt?΂^_xuD纼L>?0k{f4w;H̍N7%+v211dbg㞐q{Q dPIs:K"eg> ,x n&I8~z-xntC0#z&jnF2Bsv }'' 1J>%cF B=Ǥ?p(0n%=`Ϊ@.D"d2%3 9)lY)kYrE96BI.T>֪jUԚ%U_q)nVqQ(TE$g6Η`HſԿ=jQ$p1Ma2Z~("rp~C9[,R]t%TyeBÓ;TA4uBPM\SFPlP42h#_r#_V뢘U.`U:6 g$NYY{08^~L LJ:d0%he51ā+46Z3 ȏy^X' Y1V(hn9d: 얊DTYhG }.ۙ09Ae]LETsDK=Ki$u%8M!_&LV"O^.P=7hvmbpS99'%>RtSx\ƙqo222z)o P7~A Rnc;R._x6>)۝aʁfny 0 d 5IDP> ;p49RoCow!-}g,FÆV^R>b??Iuo7Y/l-6t?3*}|v3˜쭯1"}@hfT!3kə5mb? ;NE(7_Pct~˝ܕiGP'9ʾi2OdҐ&s-O^vXXL:e83 eX z% ڏPm0o&\^wSJBG!·ieNB_-~T>ӯ4^0PKhAʚ=L9 G{k `< v1+E7#5ۣ^0GT| Γ0ܮmo{uRQ +ʑNNQ&&W_oc ߳yfI& n"I:i3*ɏ0w xb eQOZG1BˋeG"QH g*Ƹ i }9ffyK]Ϡ5K~ײb67ɵ`~9'ur_9C0'WWH/dW}pQQ_W>%vs)]+F_)[,ׅũgO%9zH2ܫ[O$iAn87 :ͺ:=(l<;䨹:BYXE}B$Qn'}+dgiTT+4Wa-){ҺDOQQkWΎVq%i4Ĩk:?z@0 rs1fsT9Ucě#M tusZ 'ʆRF0k[_0vqfog H}No.2vԁY/_xUĊ oS%|iL/M) d?| Ob#߰(SwBNIV[.XyaI3B>=$LWquȝ;*ъ(WmQٍ+ZjgK^V@1d8u%+aiר̐yG0Ce fGeĄqi|S%f֣KM?f׺ -pzgŊJX4ˬhщ*Tjz)GeƾgN? Gf`S"hKRͽJ̰x1)U1aW Kc]F1ǣ}uL -@Sm z]?Բg7fVq.P3;֚M#"G@!{~Bʈ% d.̅u2]U{빥l~09Rn[u]i_$j9l|'FȈt6#::FV(:)o֮؛1:Hꦜd]`M,T+BtՑrG1Cw('5&CP~I7@` AULTKoʃ%6>NM] JGI!*Zь7>\I2FJ ߬jO4(]WƯDվ ]Q@RaE wa@۳TCE5_u2*,1ݨU p1j1ДP9dٮбb!TY =P$)a8*˔U/I6*Y<·v&fvψ䯆kXa䷥ D)̫^VVDgl3 d`މmE{#-}Dq?)^2_UN=@ZVc>eB{(cA2wk %ѓ*hV #I.*l?UV%^|eƅx #d9<:]d<,D`x\ V|S?R7Gcgo\prP)TuG4 Uh"Gx?a!Jl$(Lgw&mE0헁( J<9!Is,E21G T~@pbҙ}x*<]{\\z;^jF/z&>uO߼8 ZL{}ssB}#G ꩛ sȳcolTYӞe ,]vhe^Ҥuqov.PS>Ez*g# 7B4S9}x \.<gKl}tCP*֤rDW0cdڔAK`TY tBNB?^J6>mb>R7PB+'_Bg"MnJ[eKo yЅuBCN=.9(CH%~ \Ɂ5M f9Ez;6̬lL\ zn @ ZhƽFOvĨ}-IE;9{U0^J[l/@CQX*< Wj'w|-NQEkv@>㣛գ%gW!$ c.0s1јP^?p$(+(I ӇtVn+=d#B˺t}bj9D锱JB|EyBtRKuW@wQcRae` &ޓb}&K\ӞD` j,_>1 ,'JIApo'WlX9tc| ڜN$[\{yȦbԝ=WmU~F7aW/Dc9o?:)Fqղ۴=)f-w4W+?&gj b$9r\F5 bH8D"y3bJGaPsY)s[ pƿbhܧi&+w۰ж~ȇdm9%89Fw9.J|L sVcc`bzOC&QX% Z0Ht&Eb̿^Bjǣ/kp˪NbVYB}x~͔hf[M=@4p~z I)4r(Ec/遑J"!fDJ5#;Be#.Q fYfҺ"ZoFe:>S`VЪ'H=sf?;-dtš+uy9[c(˜rai*)愎H! 61sfZN8k?91DX=7DmoL YHY`kR$6ͺ|[qrQ>U/<3K>ҿT[=a2dİZls~\QX$Rg1t\A++5r}"}D>SGfzpD *%hC՟wIz'p:X@Z׹08ӏhO۲\C;d3= T  _= q%68+;Ԉvy1jb9~j qCaR?f,qv!=r6yߖl ke/bG&Aʘߨ,)sⰶI}PQbrBڜKȤHq@+mZ 8iUch28oQAA ImFEgt&D1+%^O_8=暤-Wjݎp(2')scTzT kq` iPxS:{ȋlP*}]!\n>G'Pʎg%{1j[+K-=lZJ\I/Vzk q#F9Q\ @Q] x!oI.{O_H.Q W;~M)P`#ߦ.bc+d?sxKD6x:I _I2)3C US?,–V )OS6g\3E>Ǜl(7p,dOI}KB-sH:Z+3DX.Oc֖ &گliIMbW!m68K2ăܢ* +/NhLf?-tJA>UXWKle]06 88e U4sa{JQx|}:vP069wv3Y "x:?Mc6Fj9aج~ CL?D^Lw{M̌㣌XtM*ppFA%^(1䣲%&iX*XE5ph?&3\pbv]뒈0\teBϵp 6"DžK6L|PG'\A^Zc-aJ%`P۳C~?x8MHwo}% )СX#cvXBя)dmm3|=F+Y ߟ+;AtDG`p"-&r솔[azی;kNLpoam~ZoM~| &8փ鉁D2/Bu;EgB<&ć}f/̈́M}t=gid0EaԯV`X2*>so%o0# _] D!@$|ocFۇa!u:/o@T0 qA(PQ7~lrV3`ݦ6C7NT"&I,,t/'ǟXj#8kƺ*-< ?(ڶ_s0-MK<"b{N̡ CG/K˿ ՕR:vn7SUr.Yl"<=(gJ7޶«MKH;:ՀJ]ei{:D ~W"0Vm+#lAM#?yXu:j`&*I(N*)q7\IB@Q,ywT^ao iQI-Q?AZ4ayrtA"<_U%MaF~k⭅sI!D5F-GG=gxcI9^gT e&F:f|f)3*@$lгfvA(pQdFRʲ²L֒x}$QWہ`7WUYuV!sO1U)#KN:C kV߯o TNʆ{~aG|&>*ʌV ׂ~G FwbTgŞEr`m0* = w]ѻ?dc\Q/,,ԥVc\_dl,=f럆}I3Z<x9}갩:4ڤQ,)7}Q]BoaYdq̒'Q31l>3Ɖa~5ݔt$XMgiH&qwxU] q$ԏ8L0 RGx6~y1t*{jPWmJ~|紋 .ޯEPHwLHGTp_!RW4m iivBvEj )~2-yo'^ydADe҇~ڙLCw6sJ21'2nL@m}`f+۞$dLyswUr(X0.U[9k^"WTtiѶ]8n<_:9E0LCxE,P`\E}uz8IuYMu"sn}梦}yĹx΢:vwL1ӳ/O#XOXRt< (_4#'˨yB@K0ua%Flo UPՙWASy ƗiaSm?Q0 sm\J?Cx,p3l Wj:Z,lϤ/ =3,ã(iG@yU(B_#V;Pt$ULs} SI[W*s,![t=bδ7/y懒Ӽ}s>j6,G<&כ{HE f Wun8lOvgNZɵٽDg@Vd6m+R]hUtU2ٔT XW؈( GjK06<-Y6m !(sU5{]gPWPai1f!CɛPV"kV+M8DnPi{ 7ᵝeo8ª+vFYhc5MeT[7 %(Ѻp r$5SԝJ{$\n[=^T bm£1np,"۔χ|<6qmNBe@iL[B;"FFƙ~Ik@)l"־p'Nom?*ŃR㜻ؓxY؆4 {XVC J :b;@߻BFOea <-wdau~zy%tQ>D94Sߪ}:1FcmXYX`s >(HGFBFm)A~*S$.OUKegjYCe(Ƣޖ4p%uHGNIUҤ}y;œ/Tm0զIsi 5߽˗nj׌yM xa!$e P!E&w[rO y1l4Fr"rX/^_>eXz\J@3\L% k,]0.-G8ƹ{D'cюHBh/iǼ*/Alww\K#"Hb,2i-9 #C1NsI?KQe >R)I>QQu8t] @TҒD8(۩Tkf:8Nd.(]^.3D H=h}> v&Wvq1N}*6 tOq#fI:zPBAA図 lxy5- +Z@PM*CALe`7͚aZp_ZjS`i? %RnPKZ=jHX i)㱗q#3r`pr,n6E8}J'u1f >c ݲΙYW my ]>e]Ll}%rLbbH_~0~,9fK~DEߟr}NF2z߆Y=ysL8l3@\sZMo+ "P -DϹR ;e5?NH!=jPuz!;V?WUB `(t?ztz;bG޷`;fȶ!g< y)AG# yځ#k׶iŲ/XϺUͩ"gABS\a:χӑj߄6)ca '` y+;\(Ͼ(ۂ 9+]u,L|5Sl1F(T=~GgMStN\ RH~+a2?|PNb]H^faď?3{&HډUd1x*4U 3̩@gHL`\zm \ۏY(s%+cFO嘀0=]IӌfS!o* 1Xu+?࿕Dwa`uf#*nQٲ+Ma1̸Sj|gY҈#p+ vɜ=-o mi 72>w'LΌp+e\=&ͅxtD;9\w{d\Meec&0ZRm.췻DذbFpzzМՎ*^z* Wd˳LR5VqPې=pp5VՋ(5|﷓'dqZ_˯0`h^-xgK;D!PPĵ@V4~Q:"uDfZw]it6ڊ1G|%HRa .nt$barXɸ@>rC|XLoъ|=d3Wށoz2K(!S\y94lګ"w=W&?vюw!1βߦCxwd{ZPcG'ph Ke.>*Q@pa@mƜׁǑ\̷CK̲'xy4N=#3/~(,eXfOIV eKSu(P 17dG/r-)2U`ԿǗSq^q9CTR>OɒL3RT+'M `r-/V_B9rM7{x(j! l%~#`~z~%L3W'j]6˾B]U3 %E~еqb%]k])*tÏ4%X^(U|8323uB&G}L܌uoGuJy'U( ^BR W+3/3eO,yPom1VeClbПϞ2 jIa Y,8;O&v7.5i,+xy./nQCqZ-86;ysFhfY(UK[@WX)͋ኲ:UƤqsVm<FCǓKB`!Y ]L' /Rz&F։%핌26z3HO ^thFvU#OͷRWu;Ո_z=<F+{%`Wx3eci/t.M/[MqjM)C'{nYxJ# /*s$IMP6 Y [$d ppW92wfM``c ^m^@?{/+G#ƈ3* ̅ݩ1/9AMG+u XbѩكO y QXH`S.TmWdY"{{ ɸv?AO7JW:8]FJ|u-3N-޽r= 9 %pkO?>oYECϘ-#{V ĬCD1/"JbJ,G]pW$~ʁΌ. LB2F?XN&xT8mIc7!G{EzsEREq|OgDm\f]7?֋$Q2햐dIs;1"i"& +~ՂS ';6a˔ QC0g̠zCih=\MNnd}ZT`< _ojd~'|ig8kyb{2,. umK?hcO蘠eit`RUg̹k ' WU"JdqY-oT[*?ڠ҇c+`Ҁ0:o&TP_ z0}c*U;,v9ܐAieiaIx)k2>G'=0qxG}-0dM]gld~l8f!!5Ç#7PIʉPQ endstream endobj 89 0 obj << /Length1 2684 /Length2 26568 /Length3 0 /Length 28093 /Filter /FlateDecode >> stream xڴuTJ7Rҵ[4tK Hww% t( ]w9zν|rww ~NY(3 @v&66.jj g $i xV30$ƏB 9{:t&w.`fS!)֖V58W-71upw,J,ew@L,u6@CM@潊;5zHa5WGG"!SV52jALeuwHt%)u1uwR쬿`]n4f? 4Y,.`gKG[YmOga\A9V'Ek3 ;I_N{$b!k+W+r߽S؛X@ 6A"H:;odev޾&c& We9\].XXwg֠lJbrRj̊1+9@=D'&E^> 2R s {{kIZCt;8{XۂA/5殎 k'WCL(l@0 t=̬X7gV~!"z;:8,L\@vvzo 06CS]d߮Sz3j-PXq)^Үvv&@QL<-ot&vvYr`؋,퀐ǤI,ر}jٹF3[ BM(Od 8;xAfs?S`e9!)GW/NpX~x/UJAV ^NAj*AJ`}qXA~jUt 5u!M8!M!C{mt2.!A&f$C8qCJ9A?~[0cg,/`7rr5+BO = k?ܿ%@B,T-߱C +b Bv//Y<?~J ;$V5;!urC u4=\gႰ̀_#/rӟ(.Lv/! a熤X{!`;Hg ]_!#DϿ DH?B@*yOw/n?@-ks_!J&`gk=6ȕC5s-.`,Rm9V_ h`6&1O`OX[>n9}@2w(RAS(+`*֦Ƶ{^oIe*cGJJl,GECR@y'|NN lFk\+@cH E2~yj{<{kg;l%Lh(^e9P1yǞ.L]Ɣ|unFkZFk#wt~/1n[ZYRmǰfm5̋œ̐tKB :Uw>U.9G@|HTOb>'D )zbgAvUqs[i0 >FQ~TZeOW5wlD/:jkJ85 y 9TFCS޾I':G1W_0MҎ_Dk>Tw8f90u`w#[HIޞ 3֎ionp< kI -). $F̊zպZ6,CN 9%8rW6/~xcǡJ/+QiPM1=.agfaKrH7:G؇{N"Y[}FyjDMLM >qq_AG`*yW7@& | ꓇n:GsX-GվWdˀi zƝt J%\5 lmg$ zfו/>Ȍ;۝UANTYҳ =)AQP4&5ݠZv Yτ.n0{)pƕ!:4e |)ܻ%^N: 3L _$5ò*2*?փhw(퐷o t >Ē59ni=: dw(aD֣$ߞ-*AެWkp{qaI,:{h667̤N2OǛnLp[Uzޠ40n,{ zWB_,U?徢#3 ,'T51}+ w0D#{4V%(2pPlM!)K+(Vsьm2K1<ˬSVIK?I_;6zsby嵋Wdq7x DVIBD8gUadFݡ}2?aX,3fGmɉfb~Cľ: 6č% #;:dCHrBU!WW* )Es vX{m9xKtA=T9n2i\WGU1@B_+ZMr*7PKU_{JP  X̋07t=J։eqٓq&NVjx.5hGqI3a]9B46w4M_ޯeρ0H G_qՊnjua3u9oqg\~=ٟ+j}lp|N?hp_򲙚E}ҰnJB!_+Z=Qz9&.&~jD_!hh(X?y,:ֹD/̢k|G]_+]騽tD_!+W;YS«$/,_3] xV.l@L "Z+l @?_ )ho֨S;>1|_kL6? 5hZ_(F1sSɯgz@vh9"x9-6. Bv! GSF߅M[й e{EӑA?@R~IWXÙcTBoG,[NouldRk/=igJDy9K+Vn yMS_H^v"p 'KX4hhM% [|tÜ&>vvOcpH*&70qH|)Wi@3Cʫqp4E4-$IIOu`{ɸf{Bo,ޙ-ڍ^߳Wҵ .Fmtd06-V2T%@ = F 63=BL.HUJ^;q& n WA 5 l V `}SAE:gїx2Ax00(` bS -帑Z6<i!?y]tEo5l{{tCuoyD7J]`*~yͭ՗Jjn2LD_%y1^"I#oL[d@ )7Z"JGكSh?ORQtޠTפBˊ6Xޑfq5da,sOD]_ l\Kw@j>vL4ݻbpȄxtȂ*d+E/e%3T],nLpEyi@>d.&$['W`"yҟ?TVZ<6_6-lVy@ +mB{lػ|'p9A'{Cb3ձ+IW+|k|~sj"#,n4ia=?l4|p̚jz 1ᯋҬ>D'2(%omPc>G)Nh\!b%l# ۴-zM\.sxT3!BY6ytuXoB襮&ipKdQPlt;riI8exPδ2sb ZQH7QoQq>gвၦ@3_sHVi_ C(L>Ҝ]'^U\b9<\>ʓ[7:A\Fe'}H.Rf el BN`м#wV'ͳ[d7aΡBL"d6 G_@L"^hʎt1Tz\gC0" --cs4f_w] \9B456ywX` ˩m `w!5^]aeIz!S zxaecG@?X ~ x j*t25W*=#7ALMЊ4XR+i86c)m*IpP޵$Qs~'}3Q?я)cK+YRsay !A\D/ם_jr/p+92,K[6#.^/,|ڹ[G-qo A3>CS/ό_BOGf=MD ʿ4pk5nI'Ih$}FYJW[ѬMP=lݚkMzXT6m{ dg_%DC@XG4]PI"-ݽR]^Vc;&ё#>Efd`L ԙFYԹ1(d`)sbmPlFv$*Ws+NH}#ߌZ6Кd? -3i[ s'U9(F[nWAS5İ2R.:L]Cs cO\Z6r0+׳J8`LSy˨ i 2Ma}J-:߿Oz3RVahN">y#$X߷f[j=ht\z^ >j8̶2s%ܗ BUEQ_}'_Ǒ)h̜^`&}E^ _1Ed SO-/<-ZC)2ddw8D$;XF$쯂0sб]ہ-I˭=piFs }ngn  vCJZ&u4/-6 6dlwfgaiw݆Y?ܐm\]%i { LӊBC(~xn}0Š~G?m?e|.)\++qk w҅O~ѿjVtE ;N@}_|B1˱njj"W~aM2۠sʹ)k(+ H:͏tc̚ D&I¼5Sm!ay6opxEp>Vw|ҶMQ b6ͼk%SiA7ӽYL*8z"k,Ç`ݡE 5Ɣg/^V5|t% 6t0c0&_AХaWՃ7/KrSLТJ@]j+9\/y`"U(yG.SEilGl)L3?/8Dڌi֙I$zox=SD(sGK&p\`3F}Iċ\f4Ey3Mti>txSf6*gz5|ؑ?q).-//-ij/i\XCR eniLN~6U5q(o#nPFK ΄} ~& T ^IT Yǰ^Q7[ת:dq>̕5R%%Rml7sO Zg1RE9ONL7a9h>b)ٹC7+kp+U YHAG!o xFYj>0Xڒ 3詠8 /8W> IJ'7|A䙔i g6wCݐkbmBŧPMѺ"[f"I|B̷j:cfKuލ$M+)ِwƷ뙰G"vA!ӖorWĭ 4ΟRNuyҘwXM>G +es(K4=w;>b;$]DζI^bv_ucUp-^8FO3aM>!TJ𻫭wοx}bemWrĩ3x2SEQ囹f6Jw=;%]zhZܨ>U_RE(hf[ HuڂJ/9v޶#;uUW"3\yT+Ywt,F2> A@\8tdqxCXw3uM3KGQײI8PjM4QwoSZ>Ԓ0ˤGb렂^N$S<<,XXUH&?(HC;WФ|\n= ֓~eeoZ."8rQF JG=1 In 4kDgCY]ꈓ_5aNbW ==gP:u6-.ReXǮ}!R]7JB3@STV̶1]鞢k+c]vw!Npܑm5o蒌Ű*qaj/HJb5Xz5MlV{Z6h7c.Ӳ1aTG+uĠ7vOe%.E|&Cac`tԍEQ*jߟ4 #;0_f1˕k?*o+rHpɰ?NG.}WM m%5 } DgqWׯ8X+Y uX֙J<0jZ9aCǴ-8qPk&!`fsaUAGT[M ^xBoSf,xo #3{T&X5{H%U`!K49{y(Lȭ=?\-(@`mm`EšYm2b B+y{4QXׂcQ$˗豗>ʹRW"  j }]hbE`0q1B/K!tPX0w{NG?Oz>xjG .ܕ lWgIܷ~Syo4`zL2鶺˪ZJӲ^mܧ?~nIiN{㐀 -;8#a5Щ/QwǶ@̑A_zbNTOjBxRb1 Ab5̛OݦԜJlI7{(FW gÀ7əMpd{>S'19VX(4[Vf:wT2 6~$[[B7u+ ؏$nʥzWCt-_}HnX}[bVNcmKzZ#ku:MW5N Pw/JxڥM?6+YFXXe='v@7W~ܔOF $SL@h: ?o໤+} tDOѓ^RZH{D8hW} [Cp{W̫Ee2#/SDqeЏk}<׸1T{ AS7keDkCkLYw~I[=1ۆE95goyER|Kt6k+>ѧVT<~Ax6D|\^9rJrRݽ#~\Ѻu!qĺ$|uI]ff{. m%n߸pRF /#/06 7BϘ©q57y*z{gJ>LIriv4nI*prթ1\?wPi{=Zl [[Q,G hWm?m;kF?o0Uf$Lm.'kt8U+ YJ6&W{6E>^dBg "e:/0_(CM%;."W}N0l *104Y\T!vi}0דǟ7Ǒ7CYO$fCC|}?D~h{ hneI7DL|d'TM?eSEm>7My߂Whl**[e|V6Kh& yqiㅐGN;^/-Aï @28GˬJ> Wk74Њ+[^i{Ti|Zy G2G1{c:GҗN@YY LU&d̝(pSR#{4Y >"sFŴJ{iu=P5d ^|%掶oت2iXiQ١2 ͗Ť n>wIbi erIck//op9k}䮡G~8Bc5=ҴΧEm'$*Ƹqt&mɖ{_2K(X~E%`1 =+( e5JJw'rx+#fS JQ9\$|c~iPNt7%BY4jE) Լ3BC52ׯLD"زA$8UBſ~nS9f1yg^SY%AP$᳛@⍧+MɊcm8/i)Ϻ ~Gu(p+l~!<h/bk2p}sX7$U,jH*$E\Kg؁:G-֪UCb`ƅ`"(GKaL%m2#yz,U`|Q(KP:| m DKWJ 6TǠ"\KK^!/,SI^KbSeGlHYUg.J Zז(˺g4,)ΈUZ/>F?d>s#Ç--Pzurخ,&(-2ܬD9r=Uˆ.lu E~򵀬5[H iloM(̅@JT9Zܸa'QKb*|ѕ` aTVެ_j;Z`'K7d(AnÞ8?I'mJX4Dqvcg {kT+I,f`M],bceQagmFH)[`y _ wX^!)Y`o?s` G/yoaM`;7ign+=bq1GzwHM~ư3eK&M4Ĭ%{ s7VL9|FllNB~ <>@pWTcaDn2-§% |+s/ swa{YJ{pF1|҄{$}AJ2gWbd_ԢC @WQz-I|!G69JOJR6KsK#kM+m*8lhz ?f -$Izo2\8JUN3\}Xd؋$P~1kwoyNBn&Mt 4 >r>$|mI*Ds,7fڏrXuMI%<\g NzuK8ywJ#u#ըYq!XӞ!?e/{}Z<}1+  bjˬyb5 'q_"'=J◻ k[JutTF/hqOмj1+-/ΘP\ٜ˲# jRFG{FBm94H &Աq0%S2<6?ePJqmen~yoX ]-~z2DXGHMZw@tv&4g`jP,s' '֥* 0IH4rR#L0=Ox_M_ @74NWnhH)9 h:BL&ha'8Y\sӗԣ&+MuwY+'$X.c XR(y_ph.i*^ /جr>'}O6!U j~5Ib`p%sN,|;V(HzD9*p #UxtC[!;mIz<|IpLWJ{-78bJW3F&O<+o߫k$&VHu7N]s,kW'Ĩ#fd~=*Da.WxtoԷ |0yXhny i~d_\@َC:o>HAW{ka{&e Z0)'frX>7>\Wkv _8?/J&M$Ǽ7wD;~=&YӭJx0+D|ΰ*fZKaZ#:pRow}gZ7yF8$Æb3fIm>|W]zlgmjWɇَ9Ury X,̯灯y۸tە$X}JLF  bΕ9崊f&:x/Ϫ*JZ#`ndc)׾oIKi>l^+( Kk Ҵp 3:ۮVv nVZ SN$qhe\!Qr:],b `*6eG媤˔RN̑&QŧL׾cB87LR|݃0څy痰/ ,;`697a >̕U<4"T^G&=HrIʞw(=u)4Q]j<52mػʔF{P_h zɞ N mL_kեZ$ `Rӊ5O<.'3~ , f9]4p( T^O ŘW(tܿ!})fC>{9E7!;B~pA/592- 8pK)ܟ?ݼHj//̍OzR}s֟o6R)[~)m"rH]|[oQss=RZ]Pr"g!h+|)`P$>Zj]!ٕTuA4W=j&qWf\7fQ9{%AȔ]2ƠHH#o#ZnU뾞 4wR3{tcَ< Vn8N>N~LTuMT LObsݔciIv" ot7.Mb,+%?}#/br­d@F) ݹ<]QzZ2!d8^;W]V獊EcM-#de$V|6&>}8Xq&NC^.7P/k92 CeU 3w-U3wi&H >˅GEĮCDQw̦ q,W~,ѹ iT٬MuX::ѿ358Sмk~5HW_`[cCn6T; 5cx.?vgvvYJk3}OG5ub{)ǞMLQ<96?Nf[KdZph+d,6LIHԛ 8l<Ұ=N oMlfzX\dha 0%ǚLh$2v@WH쒰أ9dOGUH̡c?hy׬R=;nV3Rhշcw34r#)|<ZK cJ3ּE_F/Lb~Je7o^R !-&gG{/) hTǻWBvcj$ u_BPDDsRmi= _rZ>&xZƴ>_藎=0Vy{w=R?@@W,ឬpqF)pnft=IAlE,>v%0z^Ut@}9ׅimAyzcL;K[Am }GAF qlg@lm[$=ST 䟿p[`*X~<7Y~Or$wlzkgYӱv[PE/V-[7:\ =KI燤<"ӭĭ])'AsIjz55y ](;H5O&TK~F[[bQ;T;\VmVS`9#c%H$raф??A$e Z2W-`4;E1iu[MQ2>4Nfa<=)s b} &}CCzr&g-34髒շ;!i+a? :>lG2j FVi3'ZMkÇ]H|f;H$;7I0,7Abodɬߓ9i'ŇxzvyoD2Ꮭnt@:lb/1"Q2VÌU.gM̈́z||+C>v5?F9n,ٽ];(2r/ND\B&dոf;*-0v4W|! f\LIygޙU@,~i ic)\!C5C(9םG^'hfC[+ߑ>mǑævLSX[ks慣/_>LWt AAvml϶ #ҹ-8C \XHJTqy qa71J!!&ԠrX<EFZ8,r Ե4p K!0Bq䴠l+N?mu5WcCzE~ Dsέ*S] z1RjIp\ndd0 8ڥq[6Ffe[X-TFU4gb1P4, #e}b0|:[y}ߡh)i,b?yEqO>(t[T謺M+31/"1 v*$4+g \\UqdF88՗B0EH$tkwc)e!x@XHhKC;tU6cdB-## xy*}QӂП36H 9<~X`W6NoEjw]_c FeG8=*WT1+$n__>P]j8^ShYFxm_ojV'4˽33cat#zT>޴.Lb+CRr硜&m7=xW`+~2(1y'bd+ )4ܸE"%c7LNсY%ߟǻ Wm8_,9Stj.՞uL_.Bz Uf@VVw'HOaظ`Թ|El5 RFt"6|g`"btEl R3T'ӓQ?,UxigC4CNC%^_vEOs0Yٳp/'czti´ Ee ]I.P%sR%<-Ә>VJkBx [c,tx4RfT?`D:҉6;46Te$,53^( Y:-ƳBg;M~PՁ~vhq^ > ߧ5P,_E7{eDܔCDb &+ST(ڪA5x]{Lԋ>!!JCfHqHDz7lV{=>\ @0$P~ωAMDBt˸1PiPd(q샿vMVrdkY*V2') n7Go<9\(ffέc%;^&Zg1sFbϴ=vo-d(Y)hgeiۖuL3H&BRҬ"z{^0m6ߜ(9"wH&g@*Ցy;])޸NXE#HiljpDGݦQ|+ QbZ|oWּ%9K4£m$#}HyiT"+?Tgpլͪ;+Qc,R 8@/3]J`^L r&\hM0dy%L)=/i~@t*YsY3kx@%'~"aM]m۵DşJdQfiN蘭M.$kl٦{S~WĬUMi1N|03%s`_)!\%#"iMZSK۫P8 -AÔWQ?QgqpCWuz0nԯV[qJ _&CEqKD߁֊Wf=\>Q"O0 S^rAvm2m2pdc<:E&|EZ1yd\ (. \߹KToB<3xI5g*Yp;t9cJg(cj7~@ZAp=c# U`xQtL;a\jڑ_KID̑&#/ƋWg٩9Crf24|"5χ;#:t2get#tnu2hqlxd',-cG8 \vQ`=Yhn L@{[NNn&X_`b6dmd KR70׏Pr.#_/W%.zyI8Mښ@q ]o M?NXmO9֝xX^G&GYjGdisdi)JLy#V؈O@q1IKz[ʰsMY QYɲG/Q΅"!KL:(BtAB`OziUVd3`y:!igO$#.C"UW<4J>9q)>׸^v`i{Ő.v\1UV =D㤳7%o-:Y{P:i'ZxB,3%r+_Ϯ~ppi>U4/l&!(I̳=lя\0xѐ.N.fԿ~QܜOʶ6ytFWQ0]n#-*ӏBoTz5ɲð_w/-*f_vlouCz$;Ti^7 F=5*:"XB]T 9N#M4|a,TS7*?xj9粫Ԥt A~T7*(`锏 ungԴP.Ee,oVO\Bࠖg1e;M4mډzmyiǙXE_'Rd+(k%HgUER<D)}R B߈޷OO<5K<YyG;puwϟ~D"GiDy0s 㥨nL{ynɓ)W sriGcʥpoʥ$ 3_]7(Bx"8~]~bcswMH G8NҾY!tTFLV_:aOi獾҃jr0CҲwӟ<294F{MblEu*]Ix[N^#gd# =lbz= e|8@ոf EPq lG.x#-ʢз{*u|Qrj@.â詏XP@xL˽b_ @`0Dl5>ؠ~*:^0HO@ ?JJʶe,Ŀ'd4Q=6;؋n&v(+q7J qO0[G5 "vX"K2J-, 'SeThXz.dW+l83UnRGd)y9mY qY7pS:gVׇz̩>)SiYg#n>g?>-C"ܾwkmN/*09lN~;`㤇W̓ \?$㣂Ai=γyCCH#ЧÅ-H]2G_-BQyfk) MT4}73%_/ežpuIE=$YkN-7,X+{8Vi;n3ǾX:p{E5Mo=s1%2#R)-]|i/jx9lqkժߐDxB9D.{f LGO/}Xia]v׋"?+e[$/̛nMSosܾ1n(BI?Cp~ҥ"2ߠ LqM`t{[M4ipsI yR\@2gC5aY#P㤂^y ?teE `dBXIOʉM:/mS6 )qj3lR%0'TVŤй$zWoB_q},i)*ˁĽOK[ilT*^2^)-\fTYGVxSEm\-qw>0zZD󃴌3r61iG@ Q!s\&`~ ~mYճ_u3䉛 9Woguuyޘ^8"B:͊4:$#g*5ٷ%7#06NFJwqWFQ̢@UuO@#zOUd+즞\g H9\P&h}=F4_1xw"~R1Sdɴ$_S \x2P_EeLcנ,Q'"M &8@%)~ntp_N~{F h]E̳֫e.>LDF>Z۫MN.>gJCBn6B (aK9Ԭƣqƒqŝ!rȁ1cŌ)" ^{htyd[2e:]^. }Ɔ )J?;2hhUnH.Jfv_p.A^|~FgAt4y}1aAV2Gj_h4q|)&K< ܰTUF1 F y/D?A4*Aj'9˗1w"*d4g'Rfg }hם( @][១ɣf#t& X?&tN%'GfL=_"/Pp-WSj4 I 2a"2H^Q܄"{>I-8UvݞD~d- ; )l%IfR~gUhYinFc,~׳={Qu );zq؃]G qnҶv'XFIj1i~cHceG: [ Ah 0#gcZ}Zg.@Θ+W-wppy/i~X^pno*Hy$ i4zV*shOFa&oxj<9QrZ W sL 3Pe 9rFxbލ$d]B]75 C2YA[_؛˕ч\Ml ,[B9 ;Oa1Y\{̉Mů*m?EvL !uD:V˽;3fo"XǕʦس'ubB10BȐIj ehM AI$)UBvVA^'(dP%7GtLꗤ(Qy6 m{ީp?xdN hS Ȏ\#\4YhK&/3)qG9>7'Z.,0Q27W[(P/鄒R  .\I9|PsY-\,e^jfI.X&?ٕ2&sg[2;5A=|~*.jK5(Vk%%S4~T CU{w<ȴ#?~3c3h\:Ë)k^zirf`oB =L,0̦FEІT07@gf6)XjۋE] fOUkG߹9sKu _Ex2I&=xF3xkt|]ZMƣ2O߁,m<Ug"a?bB aE=xdok*jiqcmϿ±dG:QyEGTHB>BȦh)>v ZmqRv3vXVdp+(0: J9fE|/?]UaEj-%..U_;< $ vk]r=rF)9U >|0R 3|<>D.mUv3*Hg&-Q Aih "eiי~CߘmhԣO : }^{d'lU?V!(j(Ҁ:G֊P$XIn%602'O -( `{:ƞ?XL @bDJ.0xJQgmi⏱N(:UOn`p=/F3G`{{<(2IVfv.~w:AJ^!E7 4"l ?K5Ѭߜz5w`D??Nsߟh02 mE*d?MEPz鰪 Ə͐ހOD"n G#2+.0S*![MûD7wu f6iSzݥ6JUSM} ro #od}D>9?,t zHJLڵά)^Eʝ-b!DkdrV H~'M θbylR2"yq k:*~RY҅806uCw9/HEzV?[l2FW+\tMVUJGBBFyJɋN0> stream xڵuT[ Cpwww%^;R)-Σ}##~k#"SVc1s01t31Xd@[)J9؋|n@ `geEHۛ;)&s0Pќ @ (;L.ojs{K9ݛ3 'ӟHE@SwhoeV`(: AZ{`P7hIT4:::815u )F\ S%#@QM'ϛw uue 6?k̝]@77fP{spv+ vcaqwwgtu3;8[2;O pwp]m*[9V'y'Ivo|szM?1m6W+_; ln7}3.doos3 \PiE]me޾@1?j6uw]hٚag@De$%ԙϞI:`_≈˿"7֤fbvvo]OV''Kl7Sw3WG {#4XNsS+??b?"z;:8,. vv57 d ~k󷣂Wt{ 7&R_uLΨ'E%jk3d_ce*t I2ljWIFω}kݷ3\{JS{s_*Z C".'}󗕄 tvz"5o63[,7+`gGy,??bo `1dX,9,oa3ߎL8,V,@.?3{bxѿqd{37x mjgm-aCη ,?(ORηڹ]7 E{ N2a5 v o}3T ufe0q\jkYu[hTᩄKщb2Fґ ܾ}T1JHH8{wϊ8QuwQbCڰTj'B.5~ w4 ׀ EY wD$9|?ړ2VJA3fd0 ٬ SP3۪f%Hndy 7J[?- ֎zmqPy0F ya ΐ; q&[QUC"([9|ӌ~AKi6n"qvÖ5|͢}d֙wg?_.(p~vp2.6lNv4 VA,]^tvd+!e7*jJ:Xh7Tgb_ 5&|E$_ULMLretq )7ˎQ];@RׁFH~~%lc`BGi 'ԆuOՊ9e6t1Y3,jj^v&(wiuJۊ"S23r/iAXeyۚUXA| FOy,P-%}Ś/uϰMki h]ĭDL!-U^gN'i꘰"泽M.-nVKAQ8`ibmh3הd5 18stq~lm2g>QskgӞKS3GC@F4 B UVXL%VcoP3L߃s JlZx8 o.忓gCj 3Dc k{U?L@rGµ ?g>!;e軬] x& Y:PjCe.)Nf2Vv XKQAl%YjDg(Zc`2}4.ET[273#Nm]Q7 p3~A-LiWBF}Ti{6œwM8~侘il!>ۏ6 puj7Tڑ֫oV7I 0K \ɦtB%PmjВ$V' (X:g{챝wBtfЙ:>cɾ._*3]@F5H*9V{{^K_!P,~\ʯ(ӞR*LtF]g!VA{1jkSDlzrfd&.'n, %cƪѥ͔l^ʋǽ(\Čk?Srʿ~|`F9ok)^–!=I{'9W4Yay0ʪo%k V>|^L݁KYou<$qzW r8uCk>6NlZY?l,kѠd"a"^^r"sP'bfeyEY\M5ta~4ˌ͍mڍC#cW8#^1 vLȵQ͓ىۓ)~[QTuB,8ɱE+ ]Wƙ_0М?,NWF  $q<3 ) 7{zdt%FڻQr1^d|rAB:*OB{A L߃&cH׃MSLD}_Kug, $|ԣؓΩRRGjb<=!B+XIVu|g-7e%rjMϾ݌"*͏^-l 3~^6cl_$(Zǹ'tgFCBi$IAhO^"1tQ'1S  }285H[j0MzoNٕ/˨hiBw'ACg_{C0hx5~n\vɴ86bmןzz<&$ޭLv£dkfEmؿ3Ÿ1)23!;]_!Z.>If]9g] gRFV "6,kӲ)oK\+~?y $x>TJT/"rTBLm#e*UÊ 8KŻn/ d/hZ3rsV?c5ͤ>fwI40am3j7 7ʋzaG>0rXb3c 8 'd@*&,dN,xdcĕ"ºV‹;lYE:UO?@SXsNodvmu=DG /xϭ~q[O w֏0YV-j4sV52[cdP;6:'Ƿc7W$BJU_Wc!epX,cR+LcݪM݋}"+ޭ9bBj' ikr0}NЍ BT쒲~}9yRd„{@ІL|U$rU!gpVs}I[tf7|N ڎAVǢT{hVF^^4+tԷRPiu_k~C!nRr/>`.^1?~"!% t]{걯BYvv0aͤ啵0|R2Q.茰'x#64Q n$U"JHC1yVDdmƠBb T56^1B wQH,Lz%;.gض\#Q5~}ݮuDh_^dM"*vFj+TlQnclۧ)~y8jxS.c(¯o_x.#P`M T}%SruV;A!7 Z2C`jGBϭS0-!#AQ޷I2/㖴.$A'Ek3o`,!cBbQ? -L|OMa680&fUUΘ^1fNNY ak8E3Y3is~ų^EPNd}pz~7Q;u_ڶٯkzJ6n0 p/;!ȝ!0Os8/x F\WI}јD`cvQ;>L8B[uxf(x;X}vl!kջ3l s[LCb+)) 2X| M]ge˼ZϓŪj/ovW({B0\7 'H5m :Ĵ 4Osya/c6BIB%tg}C8Zݶ d"JK%R)U!ߙoYj6G ['YǺWX$\ ̦N,>V1)atI~T_W2Qh3pB@^[Eᅲ!4OX5,>3Eѐ FֶK;TJ+\*%2O7xVg>lu 8!$+PHp!YޟבLA}w\h?_;gU5i=yG֥kꪈwSQG6uͷD AǞk)Ĥp)Fmmrdp$CNoIpG:[ _|ËfEpQ.PU~|Hp"\ݯ$Eg1wqS^ Td Ae34x}bV{' JBme%}*} ȁJm;-ai)/Y*;S?gco*<sLEZP?/F# d2–}[t'd5 /bfqEAff+ )iz%C|X,b|B!o^J+XREC"o9(Vi21`DAɯjXbL S^(z>LJNk M #vVK@F#XPeY,rA)u^u1iÜák^ X=_|D2#m]mOXs-̢xQ$dt ˢ{/9dzLj%5hք ${W{脝c}[_ XT'J>o)NJ-C|宽K ph})qЀݧH@`ƴKauh]Q$YM/xWI߈BgڇhiQ`Gj04,JDz/lb¦nKW%X QW%7+3yӤD}"p~/ş;yX;Jub yT$] qπ)=jǨC}]*aYN!T9!12`x,{gq1S31a#Aw%.s;7Ɇ 2"ʯ;L7^ &yAЂ) C_?(AW*  UKyel>[.w9?QY&_IAֶ1.lNub飡fo9= (nfK"Iz^F0!%[C|ɢa$dqjN'#qtژi=!x5ҍHToj~t䒭P$[~ uu.uc=AIR8E4ek_WzB,T/_{gjjkJL\6戩@!l:y"7 (׉ZIY!X1!iu+敩%5Ϯ2:ۘ^} 5r&*P}w;w p9|Υ%ʵ5~ 7%34R1'`EM/}7߄j$_@OE8R簤DXbS^6O5 &(J>ƌ~gyj9R* ZƼ W"ICb]_iЈf%HN Z.Y;$f -|`b 'jjRarڢy݊.+l#ᄡ`cS\$n{p=Ee$7F3cs{f &%3Z(al_>FN܋Ea^T_1mjt6>|RBd>`#?XDm~Zp%| zUsR g҆NP95Zf | :Y"Gd,ĹXz!wpu\p.ww"@aurI{ՌS)j重y-j%r\%jO"^9 #CaL7 MMc(Eq!M3?Q[ȳk|eΫ$\.!#Wn,)N-yE˗KDNê4V Mguc3UQ}1C*q bjKݯэ2x.+e;qO_׾.%e^DǢ%7=;7ߩ&Β+fr#<4kfX%"{"*J25W1=^s񊾝R, `\juڽז Ad[]okj"+n'ZRX %ٍeɫ&gSlIJ5+C}qAD", 8ɶr)҂.<532WDIk˜'R .DuC4ðɛ:sX(ᛣWϋ+Lkה~lO+})ih}0>|OJf{wgygpB\,_ޱ&nJS^s'xly)_X3KnogMFj ^l#ؤD8uOK5ꋪD7 h$_'/۬k)_az` "8z.쎲ú7.9ki'܏cP3ܜk}#Cu*{E=d^``F0AkV+˧,be82v) ?sZi}QIv$ [LNIy5/!:<|H_lw++0%y] Z(US鳥>=t~wPf)9}ugXlr7= pdum2Z9l^).Ķn=57`yK0Q!d(,siڣ4X';Md F͞$c3'G,ܖ aֳN2ʺQ OKب147>PO gI_HkV.l*NB ''z8-d7,P7^he)BANV4KoT+ 2b`I9b-R$g9۶=K<9vxX!J)Faz >7e7qT*3qb R,#V<j`w7{ }Ex,l# aH#.\|sg'jP! X7Tv AW> >GUBJ&eC?r' hOtjklT"ڑ;@ N"ce i-9ōWΧ{$4 f'dT: Bakg $Ժ0up=ӹL9@uN z3|F82Lx <>`QJS>A;|nW}˂{˩ol^E3 &(M@>уwI1qwbB0S)ESCmF@Km9&*I7Eo"٘ID4&|+ ZV\Xh@6=ݹe$qo 33B ǔ"+|vrlF$ea+>D J4z$hl—! ~nKϱdpwiZiDPHtDNS~L7J@{೬N0ⰪVITӦq”7~!793D` &7͜f;kz顔`Or!%iZV>0sq(]#!$gPcv$}9҅]夀7.uVO8|6jǿ:f!|$q,hez;-+ט<}4n]]bL^=hH${ck> ^9m0'p'0]LE@&o_֬sOg&p6cSry~槺]ʴ&L% +һLiy8n;zgOsFO_,@IY?3]a FO+iJ fOxYt i5J)~>K5q:.褽 |nNI)Nwf.͊`*l4.xGjt/lfPjRVN;R&4m1qDcB"־tbtd]mG.[TkȣhEJ,O^%,KGBPovaZHLr!W|+j|}??@Z42wU=[X@SW-<ivZ n#8HEpt<6\1c 9~V(ģsJ&Tij[~0VM~skû(\p Yd\zW'q}nS-I\/&3eܶ[ظLpI%, A!eX1j:XxLpP<~쓰5JÇP2S.so&mQw6s'ZvB[ KGglmyWYS /TOZk--nwD;*kDY^~k3)},|2',t旼 5!'9Yv<'̍DG@z.]F,X@$8ſzAM>~Ibs rT;F{2yȆLhPݻv6iFoELڋ!w#b!n?QvkQTeuc}ԹjpH'&eӤNOl }_/r@0JS AGd9AWVF<*6(۪;rBabD.($3f=LDHk#Ϡql{ 67U}JP8931<$U"ܧ施@[76רǠIЈʺ,9F,_dkMjZQ+jKopްYjyIjni9~;GwYZ¦}4e[t/k.֤Րo{2yM&dCOކ&d+s"ՄP}m=%ѵRL_;M`AZs㉙/;4L+ӑq 3fmؤV:Ȩe/OOd'ۺG+22xkKvdLڭ2Rqf,H`::y]݉ZhfTGfV7(",&3?1Mﻄ?ᛒ[0fY50%DdQ_#8 9ߊpt+6iŷDA;qdb|9wHfRס.&ЙrӫaO]K 3ԎNΩ2)Cm0C;6G b|X {ԛ*j;ȰnjZb0_:R15E|$I.VXۧ`?Vu7d P h*EhbeowDOE$=!JkuU Ei~$v|bNw|yY#0DS Os~;R;^ BfdF=ޱ{}U'v.` vB :-A 3P8*ǞdAZխmxKge^ˇ^+٧լ F;U#V:#n^.C SȋȒAEviO IGU>)m~!0`]7ݠ,1.9MTU#Kzg" E(Y=S߲#,"{g5,o*!sˆ~HHbQo}L! ,S~0bzIP,ԨO. KRbz}kz^C>;ζ8St z4/DiS<R,RNC5=Jf69T`⠹u:mW2,Zpο}+GN#!<͹)_j;w&WUlpr6Lwcs䁘CSvvGC:u H^<<7,g.rǖf7GZF!iDY@UiA0W+6ll3w-TGyO"DQV "aS/WbR!!_JoCNgGk:k!f5/lK UſO+ 9Lè¾K$ _&\yw٥ ]*iN[~;9_C6)+b\Cv߶\x8ʑQVǔ^KVlJ(H7f>*~}&^'^%r9]Em8U !6;Kl,WCVG)ڢ6S7yl_Pwje1btK pM"[o}4[)BB7^Nzd+nTN+JZ#nՊ#W_&9V't`\ 4W誶0Sq/5~{L'|nBCѬI>_C}j"+xtLl̨|bLdjn+z=ܘ\Do&RdND,aXeS2_ N:1ٸj׏U)uj;O05,kRr}bJ κ?_rD`] Wy2xaF2ۘ-We-=QL2A5,)w8LlDm;vځaVd<3UϲӏkQIR*A*Q&?5/$;X71%A*2f*[;ԣw0s%;{"0;!7gC󚍬]*(u6 Ɯ %C߹{c;dcn')z3,Qz7F}kT,,zߑs"J-?S>wblsWJ*{?¸f[@ @J0AsI$Ş2㨌ns_[LڒpGf>L_TN>ҝ\ 捸5ư3P~uB|t`/E3HgC~xwQp85gQ-l"T8 i)zdx|aӋ`v:&zU:kHi=0\VaL!S;%@F(z'=dNwƌjFB>%V8 aR{q0pI :TtSA endstream endobj 91 0 obj << /Length1 822 /Length2 1149 /Length3 0 /Length 1717 /Filter /FlateDecode >> stream x}R{\e+rb<~ mw щM`c{0N7m$C ~<089$qHQBq0D21Csr^N_ 10[b4b &BaB“4_0D0 *pv pkÍ`nw @EJpJγ(~E29N RTXHp bd2C.SHy WX01 D  (/a+$`^M.ApUˇa2i01> ĸf[!:1 /E#~~R%;3n. F/{,DnvKbOdt9ߴD]z6̙&Z}Tg0wblmߝzCt\Q[^IA nKmg9wLA6滟}ҫqʂD|NZ%etf|Խ]^y)?Ѡ7l`Ž&ZL;۸]u+fegw+ 3I=th5ϥl+3TdSq>^biX_:/x{SPlD'$ v3~Kb=tfxI9mfл d.ݔ~0wIvt6Zxr{φюCHScYej-:53]r両w\Xr  k? \3UQluF;0~|pSj}4E>)IPiS䷥7Bu%<{OB?/6j;^w}ϵɐJ-T+kRS5غa3se9UݼX=ULHPޫFKg'Ok4  6cI 62X|^eQJ~3~`L%N]r<dI uɬv$55~$N=1ٺR?+zhOv|yMeL$dչ-ŏ7F8T&=3 4v:V}J̄WvKrIv#(Jc$)7jY߶]{͝WɢlխGP^HLϓU>m93ztx}7.Gk-n/O~kܣ3Vk~lG,*llRUGxcds|꡻5,ԜAymմ•e VW.&Jz%EUA׽^sЪāR; 2ˡ& 9iJ+I>]v#;7Ͼֺ)}=Ri'F~}յ LM&=3sj>%~7qiۖڹuvkǗ;b['Mkț.YZҔP}vŒ%+ͅo|NJ]+U endstream endobj 92 0 obj << /Length1 1608 /Length2 8904 /Length3 0 /Length 9734 /Filter /FlateDecode >> stream xڭwuT61(% ! 0 %!HJIwtwI|w1kv~~5,b0S4 g`e*ClM4@PEq9ɃNK+a!0$́`3 ''(sXZ Z:o4uI%Hق'A 0- 6` AFY (A6@UGSPb:0{?  jӚtA]vBov`{[7AO3ÀO~ _Bv ۧ*`fJJ' S,2afZ{yAve Cl@O!i8:@dhٛۀ`L}[ ;;׿a`E|im Y9 ƜggHaPW9M* dߩ E7qUv_mlAO 8ޘ/d q5Q41pB!.`sU hy_lo;F Ͽ4 fo 5WO&),'ᚮvO%0a.@w^. ;ecs{qV!.@9ZF#5 8jZ6sRmj?KgafS?+_gvJh@RSkN^/1`:g!ϴʆ5|MI؞H˼ }pIe[vA5dM\Ϗ}r|^\a{%}"2wo.n꒾}9# We<\ =.`G/*M F `SD(Yk9ԬvkRbxWs1ֿMMpݰYCd8Д//eUH%6US0J~wڽP\(.K g| LH9 QĭϦqԓn^%_LXi=}XaR?2 `9%">a16ִ.F' (~ƽ^ޝ6|‡JS7ΐ6ΗxA׬6$pG;>RO~RTM6^%HM>Aq=a d-|߼<[[=GS XN:&XVM"ֽPq-8ք .QBNbʠf5lh># p\x4+KzU8$3$k]Y+2A|Sݞ7[БZh-^'#i;OZO(-9_so51T}A5O-=v/nUj;5]<&A |0Mg}1*3}7 e3S"X-MRRJ*~];][_c pY_١ȊW̲}֝XY}stع&l`(*tz8r *U|85[_#ؠ؆Iߌ{)|Ctc lwr֘HњlzP_>֑meæy`d qwÙC W1Ej,'[l2A~hYfaDpts2kS]䯋zP3gN(FעI,^!4䐥f1/E#\A*pw ⻶&':c>]Cy_p9xa0xf}FسQe(t!9#ES4e B.hj.c(FD uEYDܟV;rnk X{~%ti8~lcr,?71 t7y3.!=޷֩⒍:szHWi<zT~Au֭,>KMG/3VL2擎}':.L;>wWy6vw7t0C9 !S T'Dlj =Hs6hGB!&yW)֥Ńat!I!gxׂg׏7k.y'|qҎ4Ly1F@Bԙxේ柌|$A ],ȁn/ <v'bcҽtMO7~w}Iqi}(-Bf9ݻI'\Ol ɓ'tާ{53û$c }GHr$AVv%?4BG&cC!"c (]Apg!@ ̼ #FpwY(6ZTatXr[^\E%HESjJ5IayױEXM;`6b%L@md  yZq47esGGGVGwD`IUCʾO4LĐ#і,1<og)*/ےr !|s+<֣4sFY`,%6 TlNkgA"ivGů@I{îqUi٘ HUܛsSW6??^(a9p4W9[5 fKsMM,(9<nDlVRhƐ=^k\emNQ*=kU5 uw*͸ΉK`%|)dD[-j%iW,jo w>Ş\ϜghgWIHb!Kr&} ԙ𴍲~%Kg8 zH9CD.I?2.=auު?*qf՚?,=gN[VI\6;WfuEdIz3mf:("xh&ymCk0+]!DeNp c¶YH Mu1ӭ)F pg~J^lB_$LKSWMK>Y2kvr8 I)7P0rf['FR}ER~o,C (4NgT=N&4H8_IԟVF& %i7dˀuC(rqA䛣5hv)dU[g2:yu5ff߃]riC] AF" &;yp'4nWG{y3U!:scI`b:ga~[NLV!?z[ڣ0D19VÀ)+ YVk/LK_PSlJnPV9GPox"Ŕ}q^gn4a\>YN|5v%lrP񀙾ӨʝI3#$°4p(rW_ ,ң5C> DJhEDs-݌!GhWB[+ȆMy]r!V7VB&'[B pEG G[,&oL?8%ϿU.ZcQ-SL\/6X*L<3}2ɹx\ vIf$%zozĈWl{}-L;QjS`;dӇ7M߲ IgrWU?0W3EFg=J@yׯ/!\l%"w$}yd8r+TC}* ka?v2, 5}Vi]"M $uxYH$H}`$+I_Y{Un`7jw+<ltZ (~)\BQ)mW cu0MT&gb~[ 9Ý;SYFBWl'g{דt>B-%!ZZwSnN";i~ @l86?93ZP}#X3QӊŲ+na:Gnpܒ~_q㶞)"y^|G^=)s~mw7.KrMX|֠0)!hԥetFgnqXض>؄"DkQ z0bVs2Ò e?4M+PKzXgrQ.|S] klq-1f9$%w3l-D^sFIfWVW>f92AM &2KVKVx x\RG0R-.Q mZC/Ҟ-o̹xEki{ k.Ճ~,_4RZYks#7ˏ4S63bz:UICp^nj&9uV}T_aq/Qմg2rVM̠+5{£wۨ-UaXjHkB$`ǖBݑ+0fX*K",k(EQPh@e(ıkG<g3ZUV`#t3c| +aX{k*AoB<|exc};9m ɉ /ZV!enB QUՊ&4ׯֲ]#3tg+ \n1wL?NC$>֗Kz2hFF™oYm&Pk)c|.%3Qރ6%LXa!TJoRϙxG&ʓËnœ]b1ϏO 7ԞS_()KB}L=F}F5AӮ5.cƐcǁ91PiXP8cv<$6f 4s G2xz-F8ԣ{6),;|@ۢU٩/W:l&̐kjw=M Q/Y5$l Jsx5/pKfn.2 {HTsXY~U5|50 #3as$᨞ۥ%kmy7 .^]ɔlrU>N A3+*rlДQ9'G_jE➅C4'-yi.<gmz'U^(%SֹCdP M ZǎwYŔ;^WWylZp"Z+4IVE>Rl $=b(R'Y}q^p|N-iFۙ.n|B`P:M=#ōօ:f4TŇ_('ϝ-孤[C:&ֲ%-*bշnd- dxK$1LqA:8I.F U{mEqը"'^FRix$$ԴXē|BRozălI< ҕ7Gǘ=ރXTrfWWΰksТ+󡙃\ȉ d.^`9'oDdM ־K8 6~[En)Lj< ޭ0[PE;hc:tȾu9F}"_->M+޴?OCRL8ae9ueymCu'86o@[t̳''"{)$imt OP_hib~witVF3ʭ1 ew3HK˺7ya*,Kt[ j`=Ƹi&zsy#k,~ZI Ѥ&X PJj?C|%U 3hʳ͐wyTZa/?~ê H"$˱# Î,Gu)q;-MF_%SgZk}s6l%aRjh;VwIaM 3])P\gMıdb|өE7QJ{߁"n(4 <3e\Z>}}anGu>)_5y7:D&5CĴs|g`O>p]+c?JPEK1z@\Ӆ +pHk/AWa(xO.o\~D4"?X_n}k+~("iݣj -%ui& =NRx] d߯׋6MoPWiv^'jZӭ|20 [lD,P}wQjlwqZS4ɉ5g8*9#o֣jl8Ǵ8az7xjt&*] )}VjIw#e/npE &:헲,,d-_"2g|HUbx¯wvCl觅[j>p̤_|6Rҹ[ŽLVֲp1쾮Q)-7Zڐ#Zdu-ʲxל/lhG $q@S%ʕNTɚM",?/}7{:o=UB:kvk濬NS3!蟦yd8 D]]DJqM4鮟t!֢G3IQ'HZVRq:JMܦ"{Jƛѝ@ٶ%MiDO[`QjQ:&" ! 0W7pƟG0{# (/!u) L? HJmj1g+)~b 7=8FPE.\ܾˋ>NW}|"F]:ӢY/BBȿ*2Or OH"CGteZn61Y(acq?ޮ· yod[TlwFEũJ0^5K/uec˟~oFђ*cLgsAoUYS!vǞ.=$9")pv:5`{bg6oSDXX\ijL&Z俵X :6U=ǒsγ#ʔxdW*L8X6p\QR>굏#Hu C: c~)k*aKQnj9;+Laq#BGS,('Ł'țjW.mwdGtcdT 18dֿ._|+v  em0N]ͼ}` I_'J~g-?x endstream endobj 93 0 obj << /Length1 1625 /Length2 7025 /Length3 0 /Length 7850 /Filter /FlateDecode >> stream xڭVeXKCaafF@DIi$.TAZA>^^eg5S?a(>!~A)i` SC4PP ήۢ p- ,0 G!III|vqpDyxx%x q8>!qq$@HHP )*o|!Yxw<:YF-n) wig`/0z sJR6!Z0?/$YfsU_Y{rzMz_%=ޟcyq"X߃ E,31CzVW [AyAl'xhnp$}?=nyOv<-U@6s2=ړB*+)| k]Nq2b4~&`BivKgjK~~EBDB̶UOGLEWI !}9q1^[GnYdXsR>ᚑz9nѨ5Ul*ۯB *nP7DZI"'#s#@-LS>4oP6P ooi7{~@Onz–ViZ ^:x$&ނ2+rՠrKj6tga@_Z%0^d䓒PpSHu=n=Q3yÆ+٤Oc(tF{3Nˏ̰'>\\We*NQ Kfd,>fO EqvE.OYj̛MOByK_;htFKmڨ<- P7gSxh,+(ED%brD$c[P:۲x̌ +>滩"d!ƫ ڸRxσ=ώ[MItIyQ*ĵ%ZɸtYНyo豿>aQW4Jl?P'Qq5ރ^۔b𗺺4F$o-}:hL" 3nn])Umyq9*@æRapG=ë.WӘ $ԕi3F\LhrM$DLݷ;h#P7e|x׏#5)h5Or6^ʛ*n6~|1 \2)n< |4^Jl, کE=CrdķfN"sxX}U!Oh`5GoCZ &7*سs?.Tw1[dK[7^a= Sx,j‡*&ːcD!alè*_=GD|/z3Udi;唅mi#Zݓ#W'Dē5xTmͷtWǺnVo%u~~-w -O+! @:b1 % 9VII̒ ­AG![Ȥq9'vsY+=;nwe^A*#$'|uNO5B*t]<\F$N"#j?(z~/?I~.8=5{}g`ATݚBX:r\{wPMˆW9o'K|Cm{Ax<1[F%)RY BM)ާzzy&,k&)~ Zxw}Bc %Z)&,gW;_>Ě.[[y6lCdLْ"Jf=GPAUvo(fĝ-AW"9+9626؉WnĽ;ML,/rT_~sͣ.@ }ͽu^m#qQb񵼔" Mpʀ}{InaIdWgxN?MpjtƝdaJ) 3H|, 58_-t~t5 GIsܷ6Qg+h ϡ ޞxGS{ ;R7 x+6J'݌͇1UH txn%GTGN[_VIuPiM,)F8p`beoɣҁ++SVd{v5u$ܖ^r#$V:#͇m;|9WZ=5vDGJ}t 'z~ /rS^e8iEeQR;A`)['NGB!8vpAC~i͗fg9ɉ"E?MqΕ"p{EClV) vX'p1Ol]W. %a@TZj%ve:yl4e 9hl:T{yyR.@G";c9Ћ`(2L˭˝ \i6j=qjЄ =3YDj:Wy|R,#8pͯ:3sNO`xrdo,v5|6>!S|h^y zyWeVͺ?SC#/mukԺ!*m%ڋ1T_SKRyv+ cl T}.tkun`AЧi *n@[ԙ? ÓMvc\Ҝ;m̞YeNc5xLkveV{F AtO$DK"ÍYzXWʦ԰̙n$DYY*)Sf|x']ݯ .rpXq&RJN)\`Vm {:jH! (tiXVӏۇ1;_Ig[&~6c&˭V}GOHh3>ȹї9l>s! "r$Ote_*˶cyG9T{2^ ~(w>lY[UWW%) 5ju+p(Vp#[0ڙuηIą $)m#w]eϗKیK}h-1d{3"by)iQ]}Ӣu-dmPmѯiDP{HiV*-3Пmo?cwa`>iHK &[詞 E٥T3gj7*[;cF%hlq"6KߐЦ$cVzIIg+-.xAicU|:>l z};y[<99Ŀ4ň񜃸}1)"fXv\Je;OϢl$i41j>ˡ ]VfUgF EK!Qrù4U I)'1D],19s52ӊ_?6H/_\|3v/`eлy݀+z9;:ⴋGhYԹ_sT߶*#C ˞ݟUT_$Vǫ]{PegWn`606/(Ρ{iDg]#:CEtS:㫱!^>Pgغqa)8k, upu:Ȭo?KGO"mE{EC\ĩQZzoCpno~zt6F e_bMa6´ߌE)* b9"oR T_df]̗o}~|[cL,0H+7SɈ7Z}[&ϒD%¸O!]\CbalOX؋+^'}JklYYP$ Krdp_?PL1}Pc_cX_/_Q~*2 b.AQbi%t Ueǹ~ o~VxPn0/?=~;;w&>^$+\7lE{7=<9Ϻa]Sbl Q;s~f<)4R:T`B/Iq'xrS,:v|ޘV{JA;ԼAFV@yaH )9jPzn7PO%g6\Cw?NX\7}xMMZ43(EѤ<[2"'==$b 4&#(=|xv2ZN456 FY>찺g.B+!YSb,]~ YoG$Orŕ=v}ѕKx)D4,t\-DqɫUh֕*.#Mzs͢tf'"׹«J ;I4{ܚ; g@k;KSaУSDZ!YNH 1F|+A@T/! T<)J*8oD ΛI̦F$SvYmeUD? x !KQBٕfQAAcCe>6>pzV0k hSg/kcњꛜeX{FkU{,h8j?}Gv2;|\c[4چoݯbPmVIu鵝, Ո1!򏋕Ϋ}e'G(Bϒf*+V$OS/T89ƉPrvATe{Ţ]n ܡ3O(z^FK7MFMdĎ]_˄U=ݟc:g%qkk***?eߔppX[e*<6?L;f*쬒¶s MARixCSy:$Fv JiFo*kC"΅w hL& ^?^HrwR*O E&i5k 9^sZUǧ,DQ_l[YB~f<`''k6N] ,QC. b! endstream endobj 94 0 obj << /Length1 1144 /Length2 7997 /Length3 0 /Length 8762 /Filter /FlateDecode >> stream xuteX\ɺ5.q .ݝ 4H,8\f3ߙsgzuզTdeVvA UQEhxyPhi@{ѯ;v2Z6ne3';]_u/C @!@{+%ps:B4ݜA@K +*z쿣ށ\@6.#3ۿ׿d{ݸNDzu! t&m%GI Z:!lJ;Z;叞I\Eyov`G@dĦrvK+7f x99@g†폐Z^N?I?`3GK?'.(>f@ yBX, s :+A\@CvVvv߿wƯ;{mb)iȨ3[IJ_]pqX8y^Q@ߗؿw`I Y ĈU )O 33U8rW\d\./CAnU TA,l_/vf,<l@v@WWI-Rl rhB^gbo=V@O2B(Զ1^ăekW7J=.+L ]% w-ZڄGCXeXD8>;.VD0(S&aAH Iy ]PVӊ =:"W".3 y >WWDXb @Ui{W0@m=ǭ1]ZD X E40'ѯ|R}[]@p6mi 0%l p&GAh${hka yUwe~5췝m+]_VƱ#xm:w+nNB5CREǾ&}Y ܶ%ͦyHd3UY!Y+V*d(-'\ZdP!j7w8|j Gq3$q;?3r6{ԨdZ"D!mONkW@Nhi'9Js3%@|iX VDURB}Q?׾Z76!r5$D)*fD!_TƻD2*^{1;B fy,v@kQ^"$m +f֣AH"EDpNIJ JZ-k:"X5&ƏhAΓް -pl~aI 5?% Ee .hVE}3fo^K2]q R]c=G6]^](!.D@~YnP͓x&k3zZ'vi!ЋulB 8\túۧ7O6A&SP*Rԝ'sE/_A<Vz^Gh0_SE&?#r3skzy2jN_puVԵ'I1xcxW49۩ǎwU+µ;Gɋ,P.ξ?VqӒFV#|qVV꽷NZEOjGb@Rȁ%bԯo%ٺyZ~"Q [:نQ+$>\"ŴD)'pF i3%N:mA]T&r.t 0  󾆜 ˫bHI0F_Ϗ8X+U4B;uHbYky~nO/+Ev'8@^+1CGw^:ɑ6gC?BI)c07 ]WD仐wHm*sTn>J'rQLZvԏߏs\RKdFTFBi]{D?ِ0ގEun%ݢgUgK16$)+{])5(w}H_7Ve1#փ<MhÅ𓥛Z/r#nJsJN8`3B iG$jw_|{F[=V ߑB=,y_KsOci뉳jGxf])\ϥ {[u9j#ܹ#KK$% ^$BDǍ(̟@$Ρ̐4I..V@Jˢ8k T (/Ry[but S43~zI`""ȵ fF4vh cØ$վY/U`^ը^Rа;-| jn/b~ͺ[Mlk2$GOuA5, L)naҥF?ʷ I؟ N4s+F, ޗ?qZE– "0g>HFc|y騢1N/l6#wwV=5v'~P(`l#WXN Ѿ68>q2y<ٿ2[&L%S\\b)tօW启?U%%*heRBB'A aƩY vRD_7Zq ++ZԈͧԢA2Q Ш :;U^< `+Q R:^f8mdz.ƒVr X2rfҟu"勣%.Sw⣹Hv5TƼ :"U&flvh(n+%ۮƂʻZWϠH&n~U2@'t޽8`(Om9j&9tb'SF 䘜NjJFjjgg 9 ֩Z~s?j,HߩֿOAm*3"J4RaPN[ى[G~-s"/d!-shxj!} = n1`AJPTk,g7kOwJ=o2P|P0nVBLRW:!sDwU6"iRяjeB2a_?l/q&<3jPk%&ǚuyz[Xr1)e(9͆_N^>ybyQ]u7Ib.U* _s_EHn>Mwsx#aXOx$jdC%*:#UjgNib4%.١ ?Ὗ.1^w$ǟV-Ӧ}OldjǴfMekk7Vk>]iCku &vipn(z<[BS[ %wå,\?s6g~IGP:7*37q[d *v5vf))h4Un-pi +Q"){$'8qIK,QD>no玹Trikv|>Ҧg6 ±CEo;a%X0r6!-~G=ؘlL+0 L})=<Әvr%H>S0>73g_ (ع 4,87%NuxQSTwl\L4Gr<0>_PM< 3\rfg:Z 45 н#]߶eE@4r*k>XdT C{S6}ފ l)=os@9ݶv# o5N$&*rI]r EU ,;~t%ͷ|J ^ 068_mϔ_:̛I#L'p.Md?89"dR#9KN1+F"rpXRȸ9}jJ>,c4uZXܫcL #%]nhPX axژ:)EFy\oa`8f#3bZ>/Pw9]15 ck`XFQ-sG{-A34 E5;UMW ˏK;LVO'_xʿHwլݠS&2'd*컞7-Od-rS\~Qx?ȉ,φ~ !6aPtO5[ ? 6Hb2; $IiJѴN,{gzf~(}qTʌ~>N{Z#n}3xDg{Dsp Rdޞoddyj@NFgHW<6t}uoN Yq97VSHAgɚų+%8sS3}1"<__L ,pƌJ؀F4ǚRl@zQv6:)Eceg8IS|ٵfk3c |3؟E_m(1b= o14437oTM#x0A٪seK1 ^T_TAJ.`M.G\,~[QɗKVL70McaŋWyZ%[i?-Pdkn"dr*3~e  5drw4D>\jr(u8pߊSl\%Tv`ܐZLa^C]7j2Q?΄DLωQ$kWZagnX3_W3{4]& h)3q8RK:@vb'O|*Zɻ=4tq7p'R#|weD$~+|8}Emi jzzWʝcʼrZ'$r#^D7I6"=:Y+R>Cϙg Y|! (xIlKPT&sAVzNc4ꆤbӧ|̕fg+ 'MAݑ'ե){ہVRNuԣOKطo"8c:U=nQ|ޗ t@we6CȎAԯT[hM ϨXr d ,U#6ag\;t%jzW\S $N&p04sx5op{Z,~I|YŽ@&Ufvd[ ;؞ {n3Zm F(e 9o~ cO u52kvWjRF⏅ԅN?\\%?kg/Ŧ'N- S~Y}ĞjR΁ʹ楔;{v̷.}:&FMn4]I}OW]\r :7,i> (А.mAf/j9l0noG+bUwX"ϥٿpDS0C}PP!"U6wa> ]qw@%1>nZ4gl[*JY` H#!`B:y<,R2~#*c-'t'ZYIyn#~ bfJ}.G[//fV bdϔZ>羁PoD^N Ok]ڝYQ@B7=epWztd[90DBWe&q: 64y؃nc &j/XRg5_]9M>MoIrL+>!j-mUcWϘ`fk]7ÓBD#|:0-Rn3k0O<#dV.|+`-0FfCL:W,'|JLˆGMpU+aUo=pSw(fWX2~C>Vh7 7u1>L/o C5 x81jkO^qLYЫQͷ%aXQ DlW/%i?6.'kI]O竒$[q@Uz2-#Koߩ(P&o"$F`9@v~sk'J[u8N^p endstream endobj 95 0 obj << /Length1 1177 /Length2 5987 /Length3 0 /Length 6762 /Filter /FlateDecode >> stream xmsw<[K轌%D{  cFD/B =ZD%z肈|<<笵>{'#B"2]-hq@`;BDi E rG*yB@H( B;{t@QPDFDJF\n-"W S uC!H' `o7iB !^oO0Kx῟ PByBC3^~~4/ :\w  j8q߱ (l3.#,aB^BpRYw/SzBwmp/<_)G(y&p7DC? wߘ @<'`gGC a!(p APGݏ  =!A/; #+ qsBzBDDDW. ru ̵M#weRAQ)qxSZBUAt%w%uJ&o%] x6ȝW~5j 1?{@_ A E^'}(KM 1ߥH;Cpם p#p'Ό Oiݜܿл!'04 ¥!yQ&,q0Bti]+_H)룜Za`G&2IJ+v S<#PjՕ!:t$GKQ7~ZujPi(Atn塇\U\5+M}]Ol 39ܥ,A<~iIؼwFQIn75^X"d2Rph`Q!)5-zܩ GUL!G›aI"ڔ$E"Zڱ0 m`<쩢4 m 2I.xϗrwS@\mO|QlI خlL&h*;%=hr ГyB%2Q|t.B:N>J3 XFVB:_<)6|l#b>} .j[]͆ƗDZl&|t`UONGuF)!^rXA?7BRclY爣vfC<"NelS{!+|,6|@uhE7zəHoGkxƩ!)"S6KUr/AZVbbSP1$nƊҭsC-G;[z{HޛBFnYv]1{Z*m&).*)ACjWhO[&弰e{C ,+/BܤoPlJ LҎ]9+l'o[ҢjψAaRY|| r^hCwx =i- !0|8#"XL+;"]@b8nF;D|ۀjEA+3p -ҹw:O~3K\6+L҉/">h}൮H[ZV6<}\fɢ1MRlB$V=kK%{'{Vu>YOZ=V`Kّl[27vH:oeGcyxD쭍~Ӄ,VDMZm8x"7opؘF[[& [YJveTβnbQ1MAeҢkn* L.J 56<6{b47z`gzKy誚;3q4ɵ_HgB1ֶ ߲L(PyY8{uopmب8{N}W."UA==%>+Ҡd*4TtzG?l8QNGëcE=sHnM/fdg,iSvgt;ԠΗb01زELK`4]G/u}4 Alp?tOFikHOV+@qn`7_I~Oqɰz^yXg=,(~@>=#si5#a}ֶPmӲ?\_M##Gd(&H6&:@oPymM凩nhӶEx:=(OYm=A q[ZrKj҅J{\m+6OIMT`_0WmX =#w}o-FZ,X°TKx&1rW*$㷌LX'**\4 Dό< |Լ <=}!׆Oq ` Y3q%Xh$;eHg`l4I&N‡ ' gz\ݭ=󚐷h_1/H:gf q\ݨmnF9e8MAz%{ًM ~MMRu2{j]ek^K k&LvWz|Vu>q"ĆFS;bUFfjKgUq^TtC#5Lc]O]Oyg_w,qjkD%p4VU\jԥjPfAӕO"Z$ZNJU̹p~`澬3ץZԮ7ݝA 3MD$3bVw[:@[YŃ5P͒Fv8쓔YhC`֘x&,qL3۰FP[+Y]zCr>XGZ3ߑa2֌D#JQ*^-ʸAɥvWS1<[hEI_Z~!OҹߎE'JM,"F}AwD̪e2y4P9WM3󸙊wt/%m ݽ.̡{߰^ l3]ccr$~UjP_XJ-}s6mi:3>Ł-Vg̎U" ɦI.f F%4wƶbGp"sg,=hzw|i 9;&I_3cVmlwk\}T^]ZkA˃79îvBIY(shUI|>`Aj/r{B]^C4s73pm }WM=|LJ9C^ZhwNm_DZw{|dZ+ϧygxO79-mhڤZv3bM:v%::T“uly216󰞲*E{6.=刯2hO3b sLlJoT+F獩RJmcE1DE/:4)*zK4L:$[L/4lq~QJ :D1X^VMmpޒ^085S!<ڼ9W,u4*CKkMϢ[Fwo6Yb1--q`RTpv$dC~<`]X}qzB1?VFh4vf"9vmeV Ȏi[wSGndNٵ+LAa8"޻2;-%bQhFeOO$,Րm%rXPaE-2}kv#FfPKc_h{ l9k^H"Wfs8:R7V~ηcyvGAG:yKADeW{(JcR,[ Nse `*k?zM7'\],/uR=vDhPwr=ުWGDquj<~Óc۽_ |d>N.\qEs+/&e _q$c\ $@F":Z6u"ܱ9o I Fe"hG,֪qL'-d},V6%=}ꑑ ZWVYmgVzmS2PD:I2krW<\oq*zpc Ӑ 8(7xں'tc2o-$?yEmDH3~/.ZG; 8quߵ8pjl17) 0= VA4A/6hm̿b=S3Ϧ*f!ro1N+TU~ZZWH.kr)1jC>t ,$uf05=& s-ssZvdГ1KlŜ1lu2IJR=v.rsyA"T6L6Pn*)k)5hez˛`bOc9PZDyov}r[pF lG= Xɩ|("H]v}:Ә8]i)%.oBos& HhW9c%{n$\6Yڀh_%Vx9L`asq&drƈPᰒ{䒭*Aj/ KOT8b﫧z\VtcXZx<07(0(vQlZvMTK0[xF1GGvgG&91jh zt]= \:?MLLw!FE⪧f>&d4 v`xWZJ7P M9RH,j@ u:s4QTSX>LO5hB2ndhhE(>_)ZOo[K|)q>Dݖ85Nu2]}a+)ca A @<؍ VvfQTQW&|;­XRTke(k%qF' yMKUHE?nDL%wGðX_>o v:r7a, lUVdV;{eZdM>Ue'beA h:;{ӺŅUٮ[a&{%d% kObxg i{11rF%Sl<ͱ\>F5lof)g:x*ħk2͎ x̕ϾA4=$ 2lAIp+%f#W\л`,Tp'i&' 7ټ 9m+IOq"4MxWhY½* sٟ۵R"iGc9Gg>\\a5/Y]}>ө7xPhh=瘪]\d7)Tydk!9F`#mzҤe*( rfRSg SÉSכ JF- pnzCT~%pO`Ry|e@ȄrBQ?&*:40/BcqmP{ۙ KFcۻs^ו5"h_YH$oYR\Cmʓ6f8C9!.gŅdoQuY `)2) *Y sr >iCbfhv_Le,2G84veIƾ4?F endstream endobj 97 0 obj << /Producer (pdfTeX-1.40.21) /Creator (TeX) /CreationDate (D:20210730115234-05'00') /ModDate (D:20210730115234-05'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/Debian) kpathsea version 6.3.2) >> endobj 8 0 obj << /Type /ObjStm /N 75 /First 628 /Length 3917 /Filter /FlateDecode >> stream x\ks6_oN Ngg;jV.u4i6hDr_>}Dv;]MBq99W@ X03%$ie "&% (5(C = &PW‰*La. DS0Tz"`*dRi4`Z2_+EFhP#DcZ`=#TWL1 QqG])c~Ɍ@? }Ì6rDu2; })H1 ~<j`KmOhS&Z)iRd(50ZHi PT`A0AB$p!УT@$ ŀ $~H@C@HO|z`d Gߊ2"P*,jၤE V*}*8I=0$"4葂TEcip|_~M ?Ͷe- @/&")]H n$4~}do<4!Qn{;49c!rHr2yu"ʛJ +o2<@2-׉-]=Y|'qI=1Fiyn@p'x||ˢf۳Dg'=ڇxO'{-2oo%x]痏^Mg*n˛`83{fe0DNM)7D<}E,J߾enHbL1ŷ5tN63HR*5 yQ9|qU;_%%kR Βb&46?.ۆGEL+Bv^KD8N w'" bHDxw"סB<BzC*R|%Bj HRN{tS4C*)ƢCŸrhHP9}Tv f\;}9 AEO""lN_joNČC1TN5fӏ:D2=C}ÐQLxz!(3 KM phj$uCtT!wem}CeöJ; Z\KhF6ݧoiPPBz!VHp̧elʾzԡrYJ->(ni eo ? u|9h Z{cizAsgh)1SJ[kUo۪Ymqkk~tm.zŧ3Ňd>2,$=;SV*HWtf?:tE6 Q k•*[ DX3䤔=3ܔGbr#.>dPi, "mknt ?c׮OK __-t#j["MG;DUhje^&{#)۵W;;JÖ[D~-<:S5-v9ʧn쯷ڥ(l^#:<. eZA>Ftȃ.@UTt(^ŭאziA7zF?'ŋ] B^'EoEdrh" e 1;6"Yb 춫8m /b'Lx<-Y:v3 ;}{VQ T`=14CڟLuϪ[_k8k8{S/u ?1&:z8zy⸽8<c8&w~^=s}=7߶3</0l&ih?+8^h8WpB9"h/8/? Կϻ=:?ԗ~aw@R/Of Sj<7x2>`|hsa ;>i$ BP,lhƷ?Zg઴=!+󐴕%aXyΤLgduRL6gu8A{Qq]!*78u䶬qvܭs͜'vvmzK sgBbi  ]Iq'&Nz#A7vTzRֺ+B#IGJ|=%:Fρbǁ^7?:ɋx[p82X?gjaZWo}FMuWwxP1z`vӋW`I]3t؉ѻޠ:xNz[o ,%΍v$"Y{؅!޼DW]4F zw`Y{#JSV1pA%7W42^V\Fwh=az@ اzz> ki&[m9l}I)$и`- C-A;ygAs={yy>${C3t\{2'^ #Ah';xwvrYw8|PDb5?}wOb“k?';Pmt&tM8uZ{l6>|4iu;ćy_oɝ^xNt s*sniQǨ&w.˨kќl`l'O//~BC|{݀^HwjϪC7l}|ɽehYn/ggΞ{AZ"B}ǃЬ9wyZm9܆n, o:J*ufcU3H0$q(RNT{U; d]sEu=Mޏ1H4륂_ځZPv. )qt`&[MVҕ endstream endobj 98 0 obj << /Type /XRef /Index [0 99] /Size 99 /W [1 3 1] /Root 96 0 R /Info 97 0 R /ID [ ] /Length 246 /Filter /FlateDecode >> stream x93qs&Xkwb*.EzF0ѫ|*yfm=,)@T6QAJASN` !. A`*` I؀^-ZXnmzhEH4,aZ`Za`a:`2P)[6#WaFa & 18qX5E>Yιr^d>wKɗ?9Nֹs||ƕ<x$ endstream endobj startxref 195713 %%EOF RcppAnnoy/inst/include/0000755000176200001440000000000013766142724014577 5ustar liggesusersRcppAnnoy/inst/include/mman.h0000644000176200001440000001323713743110346015674 0ustar liggesusers // This is from https://code.google.com/p/mman-win32/ // // Licensed under MIT #ifndef _MMAN_WIN32_H #define _MMAN_WIN32_H #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #include #include #include #include #define PROT_NONE 0 #define PROT_READ 1 #define PROT_WRITE 2 #define PROT_EXEC 4 #define MAP_FILE 0 #define MAP_SHARED 1 #define MAP_PRIVATE 2 #define MAP_TYPE 0xf #define MAP_FIXED 0x10 #define MAP_ANONYMOUS 0x20 #define MAP_ANON MAP_ANONYMOUS #define MAP_FAILED ((void *)-1) /* Flags for msync. */ #define MS_ASYNC 1 #define MS_SYNC 2 #define MS_INVALIDATE 4 #ifndef FILE_MAP_EXECUTE #define FILE_MAP_EXECUTE 0x0020 #endif static int __map_mman_error(const DWORD err, const int deferr) { if (err == 0) return 0; //TODO: implement return err; } static DWORD __map_mmap_prot_page(const int prot) { DWORD protect = 0; if (prot == PROT_NONE) return protect; if ((prot & PROT_EXEC) != 0) { protect = ((prot & PROT_WRITE) != 0) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ; } else { protect = ((prot & PROT_WRITE) != 0) ? PAGE_READWRITE : PAGE_READONLY; } return protect; } static DWORD __map_mmap_prot_file(const int prot) { DWORD desiredAccess = 0; if (prot == PROT_NONE) return desiredAccess; if ((prot & PROT_READ) != 0) desiredAccess |= FILE_MAP_READ; if ((prot & PROT_WRITE) != 0) desiredAccess |= FILE_MAP_WRITE; if ((prot & PROT_EXEC) != 0) desiredAccess |= FILE_MAP_EXECUTE; return desiredAccess; } inline void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off) { HANDLE fm, h; void * map = MAP_FAILED; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4293) #endif const DWORD dwFileOffsetLow = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)off : (DWORD)(off & 0xFFFFFFFFL); const DWORD dwFileOffsetHigh = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL); const DWORD protect = __map_mmap_prot_page(prot); const DWORD desiredAccess = __map_mmap_prot_file(prot); const off_t maxSize = off + (off_t)len; const DWORD dwMaxSizeLow = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL); const DWORD dwMaxSizeHigh = (sizeof(off_t) <= sizeof(DWORD)) ? (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL); #ifdef _MSC_VER #pragma warning(pop) #endif errno = 0; if (len == 0 /* Unsupported flag combinations */ || (flags & MAP_FIXED) != 0 /* Usupported protection combinations */ || prot == PROT_EXEC) { errno = EINVAL; return MAP_FAILED; } h = ((flags & MAP_ANONYMOUS) == 0) ? (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE; if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) { errno = EBADF; return MAP_FAILED; } fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL); if (fm == NULL) { errno = __map_mman_error(GetLastError(), EPERM); return MAP_FAILED; } map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len); CloseHandle(fm); if (map == NULL) { errno = __map_mman_error(GetLastError(), EPERM); return MAP_FAILED; } return map; } inline int munmap(void *addr, size_t len) { if (UnmapViewOfFile(addr)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int mprotect(void *addr, size_t len, int prot) { DWORD newProtect = __map_mmap_prot_page(prot); DWORD oldProtect = 0; if (VirtualProtect(addr, len, newProtect, &oldProtect)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int msync(void *addr, size_t len, int flags) { if (FlushViewOfFile(addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int mlock(const void *addr, size_t len) { if (VirtualLock((LPVOID)addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } inline int munlock(const void *addr, size_t len) { if (VirtualUnlock((LPVOID)addr, len)) return 0; errno = __map_mman_error(GetLastError(), EPERM); return -1; } #if !defined(__MINGW32__) inline int ftruncate(const int fd, const int64_t size) { if (fd < 0) { errno = EBADF; return -1; } HANDLE h = reinterpret_cast(_get_osfhandle(fd)); LARGE_INTEGER li_start, li_size; li_start.QuadPart = static_cast(0); li_size.QuadPart = size; if (SetFilePointerEx(h, li_start, NULL, FILE_CURRENT) == ~0 || SetFilePointerEx(h, li_size, NULL, FILE_BEGIN) == ~0 || !SetEndOfFile(h)) { unsigned long error = GetLastError(); fprintf(stderr, "I/O error while truncating: %lu\n", error); switch (error) { case ERROR_INVALID_HANDLE: errno = EBADF; break; default: errno = EIO; break; } return -1; } return 0; } #endif #endif RcppAnnoy/inst/include/kissrandom.h0000644000176200001440000000504713763170231017117 0ustar liggesusers#ifndef KISSRANDOM_H #define KISSRANDOM_H #if defined(_MSC_VER) && _MSC_VER == 1500 typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif // KISS = "keep it simple, stupid", but high quality random number generator // http://www0.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf -> "Use a good RNG and build it into your code" // http://mathforum.org/kb/message.jspa?messageID=6627731 // https://de.wikipedia.org/wiki/KISS_(Zufallszahlengenerator) // 32 bit KISS struct Kiss32Random { uint32_t x; uint32_t y; uint32_t z; uint32_t c; static const uint32_t default_seed = 123456789; #if __cplusplus < 201103L typedef uint32_t seed_type; #endif // seed must be != 0 Kiss32Random(uint32_t seed = default_seed) { x = seed; y = 362436000; z = 521288629; c = 7654321; } uint32_t kiss() { // Linear congruence generator x = 69069 * x + 12345; // Xor shift y ^= y << 13; y ^= y >> 17; y ^= y << 5; // Multiply-with-carry uint64_t t = 698769069ULL * z + c; c = t >> 32; z = (uint32_t) t; return x + y + z; } inline int flip() { // Draw random 0 or 1 return kiss() & 1; } inline size_t index(size_t n) { // Draw random integer between 0 and n-1 where n is at most the number of data points you have return kiss() % n; } inline void set_seed(uint32_t seed) { x = seed; } }; // 64 bit KISS. Use this if you have more than about 2^24 data points ("big data" ;) ) struct Kiss64Random { uint64_t x; uint64_t y; uint64_t z; uint64_t c; static const uint64_t default_seed = 1234567890987654321ULL; #if __cplusplus < 201103L typedef uint64_t seed_type; #endif // seed must be != 0 Kiss64Random(uint64_t seed = default_seed) { x = seed; y = 362436362436362436ULL; z = 1066149217761810ULL; c = 123456123456123456ULL; } uint64_t kiss() { // Linear congruence generator z = 6906969069LL*z+1234567; // Xor shift y ^= (y<<13); y ^= (y>>17); y ^= (y<<43); // Multiply-with-carry (uint128_t t = (2^58 + 1) * x + c; c = t >> 64; x = (uint64_t) t) uint64_t t = (x<<58)+c; c = (x>>6); x += t; c += (x #include #ifndef _MSC_VER #include #endif #include #include #include #include #include #if defined(_MSC_VER) && _MSC_VER == 1500 typedef unsigned char uint8_t; typedef signed __int32 int32_t; typedef unsigned __int64 uint64_t; typedef signed __int64 int64_t; #else #include #endif #if defined(_MSC_VER) || defined(__MINGW32__) // a bit hacky, but override some definitions to support 64 bit #define off_t int64_t #define lseek_getsize(fd) _lseeki64(fd, 0, SEEK_END) #ifndef NOMINMAX #define NOMINMAX #endif #include "mman.h" #include #else #include #define lseek_getsize(fd) lseek(fd, 0, SEEK_END) #endif #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #endif #ifdef ANNOYLIB_MULTITHREADED_BUILD #include #include #include #endif #ifdef _MSC_VER // Needed for Visual Studio to disable runtime checks for mempcy #pragma runtime_checks("s", off) #endif // This allows others to supply their own logger / error printer without // requiring Annoy to import their headers. See RcppAnnoy for a use case. #ifndef __ERROR_PRINTER_OVERRIDE__ #define showUpdate(...) { fprintf(stderr, __VA_ARGS__ ); } #else #define showUpdate(...) { __ERROR_PRINTER_OVERRIDE__( __VA_ARGS__ ); } #endif // Portable alloc definition, cf Writing R Extensions, Section 1.6.4 #ifdef __GNUC__ // Includes GCC, clang and Intel compilers # undef alloca # define alloca(x) __builtin_alloca((x)) #elif defined(__sun) || defined(_AIX) // this is necessary (and sufficient) for Solaris 10 and AIX 6: # include #endif inline void set_error_from_errno(char **error, const char* msg) { showUpdate("%s: %s (%d)\n", msg, strerror(errno), errno); if (error) { *error = (char *)malloc(256); // TODO: win doesn't support snprintf sprintf(*error, "%s: %s (%d)", msg, strerror(errno), errno); } } inline void set_error_from_string(char **error, const char* msg) { showUpdate("%s\n", msg); if (error) { *error = (char *)malloc(strlen(msg) + 1); strcpy(*error, msg); } } // We let the v array in the Node struct take whatever space is needed, so this is a mostly insignificant number. // Compilers need *some* size defined for the v array, and some memory checking tools will flag for buffer overruns if this is set too low. #define V_ARRAY_SIZE 65536 #ifndef _MSC_VER #define popcount __builtin_popcountll #else // See #293, #358 #define popcount cole_popcount #endif #if !defined(NO_MANUAL_VECTORIZATION) && defined(__GNUC__) && (__GNUC__ >6) && defined(__AVX512F__) // See #402 #define USE_AVX512 #elif !defined(NO_MANUAL_VECTORIZATION) && defined(__AVX__) && defined (__SSE__) && defined(__SSE2__) && defined(__SSE3__) #define USE_AVX #else #endif #if defined(USE_AVX) || defined(USE_AVX512) #if defined(_MSC_VER) #include #elif defined(__GNUC__) #include #endif #endif #if !defined(__MINGW32__) #define FTRUNCATE_SIZE(x) static_cast(x) #else #define FTRUNCATE_SIZE(x) (x) #endif using std::vector; using std::pair; using std::numeric_limits; using std::make_pair; inline bool remap_memory_and_truncate(void** _ptr, int _fd, size_t old_size, size_t new_size) { #ifdef __linux__ *_ptr = mremap(*_ptr, old_size, new_size, MREMAP_MAYMOVE); bool ok = ftruncate(_fd, new_size) != -1; #else munmap(*_ptr, old_size); bool ok = ftruncate(_fd, FTRUNCATE_SIZE(new_size)) != -1; #ifdef MAP_POPULATE *_ptr = mmap(*_ptr, new_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, _fd, 0); #else *_ptr = mmap(*_ptr, new_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0); #endif #endif return ok; } namespace { template inline Node* get_node_ptr(const void* _nodes, const size_t _s, const S i) { return (Node*)((uint8_t *)_nodes + (_s * i)); } template inline T dot(const T* x, const T* y, int f) { T s = 0; for (int z = 0; z < f; z++) { s += (*x) * (*y); x++; y++; } return s; } template inline T manhattan_distance(const T* x, const T* y, int f) { T d = 0.0; for (int i = 0; i < f; i++) d += fabs(x[i] - y[i]); return d; } template inline T euclidean_distance(const T* x, const T* y, int f) { // Don't use dot-product: avoid catastrophic cancellation in #314. T d = 0.0; for (int i = 0; i < f; ++i) { const T tmp=*x - *y; d += tmp * tmp; ++x; ++y; } return d; } #ifdef USE_AVX // Horizontal single sum of 256bit vector. inline float hsum256_ps_avx(__m256 v) { const __m128 x128 = _mm_add_ps(_mm256_extractf128_ps(v, 1), _mm256_castps256_ps128(v)); const __m128 x64 = _mm_add_ps(x128, _mm_movehl_ps(x128, x128)); const __m128 x32 = _mm_add_ss(x64, _mm_shuffle_ps(x64, x64, 0x55)); return _mm_cvtss_f32(x32); } template<> inline float dot(const float* x, const float *y, int f) { float result = 0; if (f > 7) { __m256 d = _mm256_setzero_ps(); for (; f > 7; f -= 8) { d = _mm256_add_ps(d, _mm256_mul_ps(_mm256_loadu_ps(x), _mm256_loadu_ps(y))); x += 8; y += 8; } // Sum all floats in dot register. result += hsum256_ps_avx(d); } // Don't forget the remaining values. for (; f > 0; f--) { result += *x * *y; x++; y++; } return result; } template<> inline float manhattan_distance(const float* x, const float* y, int f) { float result = 0; int i = f; if (f > 7) { __m256 manhattan = _mm256_setzero_ps(); __m256 minus_zero = _mm256_set1_ps(-0.0f); for (; i > 7; i -= 8) { const __m256 x_minus_y = _mm256_sub_ps(_mm256_loadu_ps(x), _mm256_loadu_ps(y)); const __m256 distance = _mm256_andnot_ps(minus_zero, x_minus_y); // Absolute value of x_minus_y (forces sign bit to zero) manhattan = _mm256_add_ps(manhattan, distance); x += 8; y += 8; } // Sum all floats in manhattan register. result = hsum256_ps_avx(manhattan); } // Don't forget the remaining values. for (; i > 0; i--) { result += fabsf(*x - *y); x++; y++; } return result; } template<> inline float euclidean_distance(const float* x, const float* y, int f) { float result=0; if (f > 7) { __m256 d = _mm256_setzero_ps(); for (; f > 7; f -= 8) { const __m256 diff = _mm256_sub_ps(_mm256_loadu_ps(x), _mm256_loadu_ps(y)); d = _mm256_add_ps(d, _mm256_mul_ps(diff, diff)); // no support for fmadd in AVX... x += 8; y += 8; } // Sum all floats in dot register. result = hsum256_ps_avx(d); } // Don't forget the remaining values. for (; f > 0; f--) { float tmp = *x - *y; result += tmp * tmp; x++; y++; } return result; } #endif #ifdef USE_AVX512 template<> inline float dot(const float* x, const float *y, int f) { float result = 0; if (f > 15) { __m512 d = _mm512_setzero_ps(); for (; f > 15; f -= 16) { //AVX512F includes FMA d = _mm512_fmadd_ps(_mm512_loadu_ps(x), _mm512_loadu_ps(y), d); x += 16; y += 16; } // Sum all floats in dot register. result += _mm512_reduce_add_ps(d); } // Don't forget the remaining values. for (; f > 0; f--) { result += *x * *y; x++; y++; } return result; } template<> inline float manhattan_distance(const float* x, const float* y, int f) { float result = 0; int i = f; if (f > 15) { __m512 manhattan = _mm512_setzero_ps(); for (; i > 15; i -= 16) { const __m512 x_minus_y = _mm512_sub_ps(_mm512_loadu_ps(x), _mm512_loadu_ps(y)); manhattan = _mm512_add_ps(manhattan, _mm512_abs_ps(x_minus_y)); x += 16; y += 16; } // Sum all floats in manhattan register. result = _mm512_reduce_add_ps(manhattan); } // Don't forget the remaining values. for (; i > 0; i--) { result += fabsf(*x - *y); x++; y++; } return result; } template<> inline float euclidean_distance(const float* x, const float* y, int f) { float result=0; if (f > 15) { __m512 d = _mm512_setzero_ps(); for (; f > 15; f -= 16) { const __m512 diff = _mm512_sub_ps(_mm512_loadu_ps(x), _mm512_loadu_ps(y)); d = _mm512_fmadd_ps(diff, diff, d); x += 16; y += 16; } // Sum all floats in dot register. result = _mm512_reduce_add_ps(d); } // Don't forget the remaining values. for (; f > 0; f--) { float tmp = *x - *y; result += tmp * tmp; x++; y++; } return result; } #endif template inline T get_norm(T* v, int f) { return sqrt(dot(v, v, f)); } template inline void two_means(const vector& nodes, int f, Random& random, bool cosine, Node* p, Node* q) { /* This algorithm is a huge heuristic. Empirically it works really well, but I can't motivate it well. The basic idea is to keep two centroids and assign points to either one of them. We weight each centroid by the number of points assigned to it, so to balance it. */ static int iteration_steps = 200; size_t count = nodes.size(); size_t i = random.index(count); size_t j = random.index(count-1); j += (j >= i); // ensure that i != j Distance::template copy_node(p, nodes[i], f); Distance::template copy_node(q, nodes[j], f); if (cosine) { Distance::template normalize(p, f); Distance::template normalize(q, f); } Distance::init_node(p, f); Distance::init_node(q, f); int ic = 1, jc = 1; for (int l = 0; l < iteration_steps; l++) { size_t k = random.index(count); T di = ic * Distance::distance(p, nodes[k], f), dj = jc * Distance::distance(q, nodes[k], f); T norm = cosine ? get_norm(nodes[k]->v, f) : 1; if (!(norm > T(0))) { continue; } if (di < dj) { for (int z = 0; z < f; z++) p->v[z] = (p->v[z] * ic + nodes[k]->v[z] / norm) / (ic + 1); Distance::init_node(p, f); ic++; } else if (dj < di) { for (int z = 0; z < f; z++) q->v[z] = (q->v[z] * jc + nodes[k]->v[z] / norm) / (jc + 1); Distance::init_node(q, f); jc++; } } } } // namespace struct Base { template static inline void preprocess(void* nodes, size_t _s, const S node_count, const int f) { // Override this in specific metric structs below if you need to do any pre-processing // on the entire set of nodes passed into this index. } template static inline void zero_value(Node* dest) { // Initialize any fields that require sane defaults within this node. } template static inline void copy_node(Node* dest, const Node* source, const int f) { memcpy(dest->v, source->v, f * sizeof(T)); } template static inline void normalize(Node* node, int f) { T norm = get_norm(node->v, f); if (norm > 0) { for (int z = 0; z < f; z++) node->v[z] /= norm; } } }; struct Angular : Base { template struct Node { /* * We store a binary tree where each node has two things * - A vector associated with it * - Two children * All nodes occupy the same amount of memory * All nodes with n_descendants == 1 are leaf nodes. * A memory optimization is that for nodes with 2 <= n_descendants <= K, * we skip the vector. Instead we store a list of all descendants. K is * determined by the number of items that fits in the space of the vector. * For nodes with n_descendants == 1 the vector is a data point. * For nodes with n_descendants > K the vector is the normal of the split plane. * Note that we can't really do sizeof(node) because we cheat and allocate * more memory to be able to fit the vector outside */ S n_descendants; union { S children[2]; // Will possibly store more than 2 T norm; }; T v[V_ARRAY_SIZE]; }; template static inline T distance(const Node* x, const Node* y, int f) { // want to calculate (a/|a| - b/|b|)^2 // = a^2 / a^2 + b^2 / b^2 - 2ab/|a||b| // = 2 - 2cos T pp = x->norm ? x->norm : dot(x->v, x->v, f); // For backwards compatibility reasons, we need to fall back and compute the norm here T qq = y->norm ? y->norm : dot(y->v, y->v, f); T pq = dot(x->v, y->v, f); T ppqq = pp * qq; if (ppqq > 0) return 2.0 - 2.0 * pq / sqrt(ppqq); else return 2.0; // cos is 0 } template static inline T margin(const Node* n, const T* y, int f) { return dot(n->v, y, f); } template static inline bool side(const Node* n, const T* y, int f, Random& random) { T dot = margin(n, y, f); if (dot != 0) return (dot > 0); else return (bool)random.flip(); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); two_means >(nodes, f, random, true, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; Base::normalize >(n, f); } template static inline T normalized_distance(T distance) { // Used when requesting distances from Python layer // Turns out sometimes the squared distance is -0.0 // so we have to make sure it's a positive number. return sqrt(std::max(distance, T(0))); } template static inline T pq_distance(T distance, T margin, int child_nr) { if (child_nr == 0) margin = -margin; return std::min(distance, margin); } template static inline T pq_initial_value() { return numeric_limits::infinity(); } template static inline void init_node(Node* n, int f) { n->norm = dot(n->v, n->v, f); } static const char* name() { return "angular"; } }; struct DotProduct : Angular { template struct Node { /* * This is an extension of the Angular node with an extra attribute for the scaled norm. */ S n_descendants; S children[2]; // Will possibly store more than 2 T dot_factor; T v[V_ARRAY_SIZE]; }; static const char* name() { return "dot"; } template static inline T distance(const Node* x, const Node* y, int f) { return -dot(x->v, y->v, f); } template static inline void zero_value(Node* dest) { dest->dot_factor = 0; } template static inline void init_node(Node* n, int f) { } template static inline void copy_node(Node* dest, const Node* source, const int f) { memcpy(dest->v, source->v, f * sizeof(T)); dest->dot_factor = source->dot_factor; } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); DotProduct::zero_value(p); DotProduct::zero_value(q); two_means >(nodes, f, random, true, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; n->dot_factor = p->dot_factor - q->dot_factor; DotProduct::normalize >(n, f); } template static inline void normalize(Node* node, int f) { T norm = sqrt(dot(node->v, node->v, f) + pow(node->dot_factor, 2)); if (norm > 0) { for (int z = 0; z < f; z++) node->v[z] /= norm; node->dot_factor /= norm; } } template static inline T margin(const Node* n, const T* y, int f) { return dot(n->v, y, f) + (n->dot_factor * n->dot_factor); } template static inline bool side(const Node* n, const T* y, int f, Random& random) { T dot = margin(n, y, f); if (dot != 0) return (dot > 0); else return (bool)random.flip(); } template static inline T normalized_distance(T distance) { return -distance; } template static inline void preprocess(void* nodes, size_t _s, const S node_count, const int f) { // This uses a method from Microsoft Research for transforming inner product spaces to cosine/angular-compatible spaces. // (Bachrach et al., 2014, see https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/XboxInnerProduct.pdf) // Step one: compute the norm of each vector and store that in its extra dimension (f-1) for (S i = 0; i < node_count; i++) { Node* node = get_node_ptr(nodes, _s, i); T d = dot(node->v, node->v, f); T norm = d < 0 ? 0 : sqrt(d); node->dot_factor = norm; } // Step two: find the maximum norm T max_norm = 0; for (S i = 0; i < node_count; i++) { Node* node = get_node_ptr(nodes, _s, i); if (node->dot_factor > max_norm) { max_norm = node->dot_factor; } } // Step three: set each vector's extra dimension to sqrt(max_norm^2 - norm^2) for (S i = 0; i < node_count; i++) { Node* node = get_node_ptr(nodes, _s, i); T node_norm = node->dot_factor; T squared_norm_diff = pow(max_norm, static_cast(2.0)) - pow(node_norm, static_cast(2.0)); T dot_factor = squared_norm_diff < 0 ? 0 : sqrt(squared_norm_diff); node->dot_factor = dot_factor; } } }; struct Hamming : Base { template struct Node { S n_descendants; S children[2]; T v[V_ARRAY_SIZE]; }; static const size_t max_iterations = 20; template static inline T pq_distance(T distance, T margin, int child_nr) { return distance - (margin != (unsigned int) child_nr); } template static inline T pq_initial_value() { return numeric_limits::max(); } template static inline int cole_popcount(T v) { // Note: Only used with MSVC 9, which lacks intrinsics and fails to // calculate std::bitset::count for v > 32bit. Uses the generalized // approach by Eric Cole. // See https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSet64 v = v - ((v >> 1) & (T)~(T)0/3); v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3); v = (v + (v >> 4)) & (T)~(T)0/255*15; return (T)(v * ((T)~(T)0/255)) >> (sizeof(T) - 1) * 8; } template static inline T distance(const Node* x, const Node* y, int f) { size_t dist = 0; for (int i = 0; i < f; i++) { dist += popcount(x->v[i] ^ y->v[i]); } return dist; } template static inline bool margin(const Node* n, const T* y, int f) { static const size_t n_bits = sizeof(T) * 8; T chunk = n->v[0] / n_bits; return (y[chunk] & (static_cast(1) << (n_bits - 1 - (n->v[0] % n_bits)))) != 0; } template static inline bool side(const Node* n, const T* y, int f, Random& random) { return margin(n, y, f); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { size_t cur_size = 0; size_t i = 0; int dim = f * 8 * sizeof(T); for (; i < max_iterations; i++) { // choose random position to split at n->v[0] = random.index(dim); cur_size = 0; for (typename vector*>::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { if (margin(n, (*it)->v, f)) { cur_size++; } } if (cur_size > 0 && cur_size < nodes.size()) { break; } } // brute-force search for splitting coordinate if (i == max_iterations) { int j = 0; for (; j < dim; j++) { n->v[0] = j; cur_size = 0; for (typename vector*>::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { if (margin(n, (*it)->v, f)) { cur_size++; } } if (cur_size > 0 && cur_size < nodes.size()) { break; } } } } template static inline T normalized_distance(T distance) { return distance; } template static inline void init_node(Node* n, int f) { } static const char* name() { return "hamming"; } }; struct Minkowski : Base { template struct Node { S n_descendants; T a; // need an extra constant term to determine the offset of the plane S children[2]; T v[V_ARRAY_SIZE]; }; template static inline T margin(const Node* n, const T* y, int f) { return n->a + dot(n->v, y, f); } template static inline bool side(const Node* n, const T* y, int f, Random& random) { T dot = margin(n, y, f); if (dot != 0) return (dot > 0); else return (bool)random.flip(); } template static inline T pq_distance(T distance, T margin, int child_nr) { if (child_nr == 0) margin = -margin; return std::min(distance, margin); } template static inline T pq_initial_value() { return numeric_limits::infinity(); } }; struct Euclidean : Minkowski { template static inline T distance(const Node* x, const Node* y, int f) { return euclidean_distance(x->v, y->v, f); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); two_means >(nodes, f, random, false, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; Base::normalize >(n, f); n->a = 0.0; for (int z = 0; z < f; z++) n->a += -n->v[z] * (p->v[z] + q->v[z]) / 2; } template static inline T normalized_distance(T distance) { return sqrt(std::max(distance, T(0))); } template static inline void init_node(Node* n, int f) { } static const char* name() { return "euclidean"; } }; struct Manhattan : Minkowski { template static inline T distance(const Node* x, const Node* y, int f) { return manhattan_distance(x->v, y->v, f); } template static inline void create_split(const vector*>& nodes, int f, size_t s, Random& random, Node* n) { Node* p = (Node*)alloca(s); Node* q = (Node*)alloca(s); two_means >(nodes, f, random, false, p, q); for (int z = 0; z < f; z++) n->v[z] = p->v[z] - q->v[z]; Base::normalize >(n, f); n->a = 0.0; for (int z = 0; z < f; z++) n->a += -n->v[z] * (p->v[z] + q->v[z]) / 2; } template static inline T normalized_distance(T distance) { return std::max(distance, T(0)); } template static inline void init_node(Node* n, int f) { } static const char* name() { return "manhattan"; } }; template class AnnoyIndexInterface { public: // Note that the methods with an **error argument will allocate memory and write the pointer to that string if error is non-NULL virtual ~AnnoyIndexInterface() {}; virtual bool add_item(S item, const T* w, char** error=NULL) = 0; virtual bool build(int q, int n_threads=-1, char** error=NULL) = 0; virtual bool unbuild(char** error=NULL) = 0; virtual bool save(const char* filename, bool prefault=false, char** error=NULL) = 0; virtual void unload() = 0; virtual bool load(const char* filename, bool prefault=false, char** error=NULL) = 0; virtual T get_distance(S i, S j) const = 0; virtual void get_nns_by_item(S item, size_t n, int search_k, vector* result, vector* distances) const = 0; virtual void get_nns_by_vector(const T* w, size_t n, int search_k, vector* result, vector* distances) const = 0; virtual S get_n_items() const = 0; virtual S get_n_trees() const = 0; virtual void verbose(bool v) = 0; virtual void get_item(S item, T* v) const = 0; virtual void set_seed(R q) = 0; virtual bool on_disk_build(const char* filename, char** error=NULL) = 0; }; template class AnnoyIndex : public AnnoyIndexInterface= 201103L typename std::remove_const::type #else typename Random::seed_type #endif > { /* * We use random projection to build a forest of binary trees of all items. * Basically just split the hyperspace into two sides by a hyperplane, * then recursively split each of those subtrees etc. * We create a tree like this q times. The default q is determined automatically * in such a way that we at most use 2x as much memory as the vectors take. */ public: typedef Distance D; typedef typename D::template Node Node; #if __cplusplus >= 201103L typedef typename std::remove_const::type R; #else typedef typename Random::seed_type R; #endif protected: const int _f; size_t _s; S _n_items; void* _nodes; // Could either be mmapped, or point to a memory buffer that we reallocate S _n_nodes; S _nodes_size; vector _roots; S _K; R _seed; bool _loaded; bool _verbose; int _fd; bool _on_disk; bool _built; public: AnnoyIndex(int f) : _f(f), _seed(Random::default_seed) { _s = offsetof(Node, v) + _f * sizeof(T); // Size of each node _verbose = false; _built = false; _K = (S) (((size_t) (_s - offsetof(Node, children))) / sizeof(S)); // Max number of descendants to fit into node reinitialize(); // Reset everything } ~AnnoyIndex() { unload(); } int get_f() const { return _f; } bool add_item(S item, const T* w, char** error=NULL) { return add_item_impl(item, w, error); } template bool add_item_impl(S item, const W& w, char** error=NULL) { if (_loaded) { set_error_from_string(error, "You can't add an item to a loaded index"); return false; } _allocate_size(item + 1); Node* n = _get(item); D::zero_value(n); n->children[0] = 0; n->children[1] = 0; n->n_descendants = 1; for (int z = 0; z < _f; z++) n->v[z] = w[z]; D::init_node(n, _f); if (item >= _n_items) _n_items = item + 1; return true; } bool on_disk_build(const char* file, char** error=NULL) { _on_disk = true; _fd = open(file, O_RDWR | O_CREAT | O_TRUNC, (int) 0600); if (_fd == -1) { set_error_from_errno(error, "Unable to open"); _fd = 0; return false; } _nodes_size = 1; if (ftruncate(_fd, FTRUNCATE_SIZE(_s) * FTRUNCATE_SIZE(_nodes_size)) == -1) { set_error_from_errno(error, "Unable to truncate"); return false; } #ifdef MAP_POPULATE _nodes = (Node*) mmap(0, _s * _nodes_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, _fd, 0); #else _nodes = (Node*) mmap(0, _s * _nodes_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0); #endif return true; } bool build(int q, int n_threads=-1, char** error=NULL) { if (_loaded) { set_error_from_string(error, "You can't build a loaded index"); return false; } if (_built) { set_error_from_string(error, "You can't build a built index"); return false; } D::template preprocess(_nodes, _s, _n_items, _f); _n_nodes = _n_items; ThreadedBuildPolicy::template build(this, q, n_threads); // Also, copy the roots into the last segment of the array // This way we can load them faster without reading the whole file _allocate_size(_n_nodes + (S)_roots.size()); for (size_t i = 0; i < _roots.size(); i++) memcpy(_get(_n_nodes + (S)i), _get(_roots[i]), _s); _n_nodes += _roots.size(); if (_verbose) showUpdate("has %d nodes\n", _n_nodes); if (_on_disk) { if (!remap_memory_and_truncate(&_nodes, _fd, static_cast(_s) * static_cast(_nodes_size), static_cast(_s) * static_cast(_n_nodes))) { // TODO: this probably creates an index in a corrupt state... not sure what to do set_error_from_errno(error, "Unable to truncate"); return false; } _nodes_size = _n_nodes; } _built = true; return true; } bool unbuild(char** error=NULL) { if (_loaded) { set_error_from_string(error, "You can't unbuild a loaded index"); return false; } _roots.clear(); _n_nodes = _n_items; _built = false; return true; } bool save(const char* filename, bool prefault=false, char** error=NULL) { if (!_built) { set_error_from_string(error, "You can't save an index that hasn't been built"); return false; } if (_on_disk) { return true; } else { // Delete file if it already exists (See issue #335) unlink(filename); FILE *f = fopen(filename, "wb"); if (f == NULL) { set_error_from_errno(error, "Unable to open"); return false; } if (fwrite(_nodes, _s, _n_nodes, f) != (size_t) _n_nodes) { set_error_from_errno(error, "Unable to write"); return false; } if (fclose(f) == EOF) { set_error_from_errno(error, "Unable to close"); return false; } unload(); return load(filename, prefault, error); } } void reinitialize() { _fd = 0; _nodes = NULL; _loaded = false; _n_items = 0; _n_nodes = 0; _nodes_size = 0; _on_disk = false; _seed = Random::default_seed; _roots.clear(); } void unload() { if (_on_disk && _fd) { close(_fd); munmap(_nodes, _s * _nodes_size); } else { if (_fd) { // we have mmapped data close(_fd); munmap(_nodes, _n_nodes * _s); } else if (_nodes) { // We have heap allocated data free(_nodes); } } reinitialize(); if (_verbose) showUpdate("unloaded\n"); } bool load(const char* filename, bool prefault=false, char** error=NULL) { _fd = open(filename, O_RDONLY, (int)0400); if (_fd == -1) { set_error_from_errno(error, "Unable to open"); _fd = 0; return false; } off_t size = lseek_getsize(_fd); if (size == -1) { set_error_from_errno(error, "Unable to get size"); return false; } else if (size == 0) { set_error_from_errno(error, "Size of file is zero"); return false; } else if (size % _s) { // Something is fishy with this index! set_error_from_errno(error, "Index size is not a multiple of vector size. Ensure you are opening using the same metric you used to create the index."); return false; } int flags = MAP_SHARED; if (prefault) { #ifdef MAP_POPULATE flags |= MAP_POPULATE; #else showUpdate("prefault is set to true, but MAP_POPULATE is not defined on this platform"); #endif } _nodes = (Node*)mmap(0, size, PROT_READ, flags, _fd, 0); _n_nodes = (S)(size / _s); // Find the roots by scanning the end of the file and taking the nodes with most descendants _roots.clear(); S m = -1; for (S i = _n_nodes - 1; i >= 0; i--) { S k = _get(i)->n_descendants; if (m == -1 || k == m) { _roots.push_back(i); m = k; } else { break; } } // hacky fix: since the last root precedes the copy of all roots, delete it if (_roots.size() > 1 && _get(_roots.front())->children[0] == _get(_roots.back())->children[0]) _roots.pop_back(); _loaded = true; _built = true; _n_items = m; if (_verbose) showUpdate("found %lu roots with degree %d\n", _roots.size(), m); return true; } T get_distance(S i, S j) const { return D::normalized_distance(D::distance(_get(i), _get(j), _f)); } void get_nns_by_item(S item, size_t n, int search_k, vector* result, vector* distances) const { // TODO: handle OOB const Node* m = _get(item); _get_all_nns(m->v, n, search_k, result, distances); } void get_nns_by_vector(const T* w, size_t n, int search_k, vector* result, vector* distances) const { _get_all_nns(w, n, search_k, result, distances); } S get_n_items() const { return _n_items; } S get_n_trees() const { return (S)_roots.size(); } void verbose(bool v) { _verbose = v; } void get_item(S item, T* v) const { // TODO: handle OOB Node* m = _get(item); memcpy(v, m->v, (_f) * sizeof(T)); } void set_seed(R seed) { _seed = seed; } void thread_build(int q, int thread_idx, ThreadedBuildPolicy& threaded_build_policy) { // Each thread needs its own seed, otherwise each thread would be building the same tree(s) Random _random(_seed + thread_idx); vector thread_roots; while (1) { if (q == -1) { threaded_build_policy.lock_n_nodes(); if (_n_nodes >= 2 * _n_items) { threaded_build_policy.unlock_n_nodes(); break; } threaded_build_policy.unlock_n_nodes(); } else { if (thread_roots.size() >= (size_t)q) { break; } } if (_verbose) showUpdate("pass %zd...\n", thread_roots.size()); vector indices; threaded_build_policy.lock_shared_nodes(); for (S i = 0; i < _n_items; i++) { if (_get(i)->n_descendants >= 1) { // Issue #223 indices.push_back(i); } } threaded_build_policy.unlock_shared_nodes(); thread_roots.push_back(_make_tree(indices, true, _random, threaded_build_policy)); } threaded_build_policy.lock_roots(); _roots.insert(_roots.end(), thread_roots.begin(), thread_roots.end()); threaded_build_policy.unlock_roots(); } protected: void _reallocate_nodes(S n) { const double reallocation_factor = 1.3; S new_nodes_size = std::max(n, (S) ((_nodes_size + 1) * reallocation_factor)); void *old = _nodes; if (_on_disk) { if (!remap_memory_and_truncate(&_nodes, _fd, static_cast(_s) * static_cast(_nodes_size), static_cast(_s) * static_cast(new_nodes_size)) && _verbose) showUpdate("File truncation error\n"); } else { _nodes = realloc(_nodes, _s * new_nodes_size); memset((char *) _nodes + (_nodes_size * _s) / sizeof(char), 0, (new_nodes_size - _nodes_size) * _s); } _nodes_size = new_nodes_size; if (_verbose) showUpdate("Reallocating to %d nodes: old_address=%p, new_address=%p\n", new_nodes_size, old, _nodes); } void _allocate_size(S n, ThreadedBuildPolicy& threaded_build_policy) { if (n > _nodes_size) { threaded_build_policy.lock_nodes(); _reallocate_nodes(n); threaded_build_policy.unlock_nodes(); } } void _allocate_size(S n) { if (n > _nodes_size) { _reallocate_nodes(n); } } Node* _get(const S i) const { return get_node_ptr(_nodes, _s, i); } double _split_imbalance(const vector& left_indices, const vector& right_indices) { double ls = (float)left_indices.size(); double rs = (float)right_indices.size(); float f = ls / (ls + rs + 1e-9); // Avoid 0/0 return std::max(f, 1-f); } S _make_tree(const vector& indices, bool is_root, Random& _random, ThreadedBuildPolicy& threaded_build_policy) { // The basic rule is that if we have <= _K items, then it's a leaf node, otherwise it's a split node. // There's some regrettable complications caused by the problem that root nodes have to be "special": // 1. We identify root nodes by the arguable logic that _n_items == n->n_descendants, regardless of how many descendants they actually have // 2. Root nodes with only 1 child need to be a "dummy" parent // 3. Due to the _n_items "hack", we need to be careful with the cases where _n_items <= _K or _n_items > _K if (indices.size() == 1 && !is_root) return indices[0]; if (indices.size() <= (size_t)_K && (!is_root || (size_t)_n_items <= (size_t)_K || indices.size() == 1)) { threaded_build_policy.lock_n_nodes(); _allocate_size(_n_nodes + 1, threaded_build_policy); S item = _n_nodes++; threaded_build_policy.unlock_n_nodes(); threaded_build_policy.lock_shared_nodes(); Node* m = _get(item); m->n_descendants = is_root ? _n_items : (S)indices.size(); // Using std::copy instead of a loop seems to resolve issues #3 and #13, // probably because gcc 4.8 goes overboard with optimizations. // Using memcpy instead of std::copy for MSVC compatibility. #235 // Only copy when necessary to avoid crash in MSVC 9. #293 if (!indices.empty()) memcpy(m->children, &indices[0], indices.size() * sizeof(S)); threaded_build_policy.unlock_shared_nodes(); return item; } threaded_build_policy.lock_shared_nodes(); vector children; for (size_t i = 0; i < indices.size(); i++) { S j = indices[i]; Node* n = _get(j); if (n) children.push_back(n); } vector children_indices[2]; Node* m = (Node*)alloca(_s); for (int attempt = 0; attempt < 3; attempt++) { children_indices[0].clear(); children_indices[1].clear(); D::create_split(children, _f, _s, _random, m); for (size_t i = 0; i < indices.size(); i++) { S j = indices[i]; Node* n = _get(j); if (n) { bool side = D::side(m, n->v, _f, _random); children_indices[side].push_back(j); } else { showUpdate("No node for index %d?\n", j); } } if (_split_imbalance(children_indices[0], children_indices[1]) < 0.95) break; } threaded_build_policy.unlock_shared_nodes(); // If we didn't find a hyperplane, just randomize sides as a last option while (_split_imbalance(children_indices[0], children_indices[1]) > 0.99) { if (_verbose) showUpdate("\tNo hyperplane found (left has %ld children, right has %ld children)\n", children_indices[0].size(), children_indices[1].size()); children_indices[0].clear(); children_indices[1].clear(); // Set the vector to 0.0 for (int z = 0; z < _f; z++) m->v[z] = 0; for (size_t i = 0; i < indices.size(); i++) { S j = indices[i]; // Just randomize... children_indices[_random.flip()].push_back(j); } } int flip = (children_indices[0].size() > children_indices[1].size()); m->n_descendants = is_root ? _n_items : (S)indices.size(); for (int side = 0; side < 2; side++) { // run _make_tree for the smallest child first (for cache locality) m->children[side^flip] = _make_tree(children_indices[side^flip], false, _random, threaded_build_policy); } threaded_build_policy.lock_n_nodes(); _allocate_size(_n_nodes + 1, threaded_build_policy); S item = _n_nodes++; threaded_build_policy.unlock_n_nodes(); threaded_build_policy.lock_shared_nodes(); memcpy(_get(item), m, _s); threaded_build_policy.unlock_shared_nodes(); return item; } void _get_all_nns(const T* v, size_t n, int search_k, vector* result, vector* distances) const { Node* v_node = (Node *)alloca(_s); D::template zero_value(v_node); memcpy(v_node->v, v, sizeof(T) * _f); D::init_node(v_node, _f); std::priority_queue > q; if (search_k == -1) { search_k = n * _roots.size(); } for (size_t i = 0; i < _roots.size(); i++) { q.push(make_pair(Distance::template pq_initial_value(), _roots[i])); } std::vector nns; while (nns.size() < (size_t)search_k && !q.empty()) { const pair& top = q.top(); T d = top.first; S i = top.second; Node* nd = _get(i); q.pop(); if (nd->n_descendants == 1 && i < _n_items) { nns.push_back(i); } else if (nd->n_descendants <= _K) { const S* dst = nd->children; nns.insert(nns.end(), dst, &dst[nd->n_descendants]); } else { T margin = D::margin(nd, v, _f); q.push(make_pair(D::pq_distance(d, margin, 1), static_cast(nd->children[1]))); q.push(make_pair(D::pq_distance(d, margin, 0), static_cast(nd->children[0]))); } } // Get distances for all items // To avoid calculating distance multiple times for any items, sort by id std::sort(nns.begin(), nns.end()); vector > nns_dist; S last = -1; for (size_t i = 0; i < nns.size(); i++) { S j = nns[i]; if (j == last) continue; last = j; if (_get(j)->n_descendants == 1) // This is only to guard a really obscure case, #284 nns_dist.push_back(make_pair(D::distance(v_node, _get(j), _f), j)); } size_t m = nns_dist.size(); size_t p = n < m ? n : m; // Return this many items std::partial_sort(nns_dist.begin(), nns_dist.begin() + p, nns_dist.end()); for (size_t i = 0; i < p; i++) { if (distances) distances->push_back(D::normalized_distance(nns_dist[i].first)); result->push_back(nns_dist[i].second); } } }; class AnnoyIndexSingleThreadedBuildPolicy { public: template static void build(AnnoyIndex* annoy, int q, int n_threads) { AnnoyIndexSingleThreadedBuildPolicy threaded_build_policy; annoy->thread_build(q, 0, threaded_build_policy); } void lock_n_nodes() {} void unlock_n_nodes() {} void lock_nodes() {} void unlock_nodes() {} void lock_shared_nodes() {} void unlock_shared_nodes() {} void lock_roots() {} void unlock_roots() {} }; #ifdef ANNOYLIB_MULTITHREADED_BUILD class AnnoyIndexMultiThreadedBuildPolicy { private: std::shared_timed_mutex nodes_mutex; std::mutex n_nodes_mutex; std::mutex roots_mutex; public: template static void build(AnnoyIndex* annoy, int q, int n_threads) { AnnoyIndexMultiThreadedBuildPolicy threaded_build_policy; if (n_threads == -1) { // If the hardware_concurrency() value is not well defined or not computable, it returns 0. // We guard against this by using at least 1 thread. n_threads = std::max(1, (int)std::thread::hardware_concurrency()); } vector threads(n_threads); for (int thread_idx = 0; thread_idx < n_threads; thread_idx++) { int trees_per_thread = q == -1 ? -1 : (int)floor((q + thread_idx) / n_threads); threads[thread_idx] = std::thread( &AnnoyIndex::thread_build, annoy, trees_per_thread, thread_idx, std::ref(threaded_build_policy) ); } for (auto& thread : threads) { thread.join(); } } void lock_n_nodes() { n_nodes_mutex.lock(); } void unlock_n_nodes() { n_nodes_mutex.unlock(); } void lock_nodes() { nodes_mutex.lock(); } void unlock_nodes() { nodes_mutex.unlock(); } void lock_shared_nodes() { nodes_mutex.lock_shared(); } void unlock_shared_nodes() { nodes_mutex.unlock_shared(); } void lock_roots() { roots_mutex.lock(); } void unlock_roots() { roots_mutex.unlock(); } }; #endif #endif // vim: tabstop=2 shiftwidth=2 RcppAnnoy/inst/include/RcppAnnoy.h0000644000176200001440000000334613766142724016667 0ustar liggesusers// Emacs make this -*- mode: C++; -*- // RcppAnnoy // // R bindings for the 'Annoy' Approximate Nearest Neighbor Library #ifndef RCPPANNOY_H #define RCPPANNOY_H // -- include Rcpp headers #define R_NO_REMAP #define STRICT_R_HEADERS #include // -- define a few things needed for Annoy #if defined(__MINGW32__) #undef Realloc #undef Free #endif // define R's REprintf as the 'local' error print method for Annoy #define __ERROR_PRINTER_OVERRIDE__ REprintf #include "annoylib.h" #include "kissrandom.h" // -- some version housekeeping not provided by Annoy #define ANNOY_VERSION_MAJOR 1 #define ANNOY_VERSION_MINOR 17 #define ANNOY_VERSION_PATCH 0 // create a single 'comparable' number out of version, minor and patch #define Annoy_Version(v,m,p) (((v) * 65536) + ((m) * 256) + (p)) // current build is encoded in ANNOY_VERSION #define ANNOY_VERSION Annoy_Version(ANNOY_VERSION_MAJOR,ANNOY_VERSION_MINOR,ANNOY_VERSION_PATCH) // -- same for RcppAnnoy #define RCPPANNOY_VERSION_MAJOR 0 #define RCPPANNOY_VERSION_MINOR 0 #define RCPPANNOY_VERSION_PATCH 18 #define RCPPANNOY_VERSION_MICRO 0 #define RcppAnnoyVersion(maj, min, rev, dev) (((maj)*1000000) + ((min)*10000) + ((rev)*100) + (dev)) #define RCPPANNOY_VERSION RcppAnnoyVersion(RCPPANNOY_VERSION_MAJOR,RCPPANNOY_VERSION_MINOR,RCPPANNOY_VERSION_PATCH,RCPP_ANNOY_VERSION_MICRO) // -- convenience typedefs // prefixed with Rcpp to ensure we are most unlikely to clash with upstream defines // usage of these is entire optional #ifdef ANNOYLIB_MULTITHREADED_BUILD typedef AnnoyIndexMultiThreadedBuildPolicy RcppAnnoyIndexThreadPolicy; #else typedef AnnoyIndexSingleThreadedBuildPolicy RcppAnnoyIndexThreadPolicy; #endif #endif RcppAnnoy/inst/tinytest/0000755000176200001440000000000013756552014015033 5ustar liggesusersRcppAnnoy/inst/tinytest/data/0000755000176200001440000000000013465550702015743 5ustar liggesusersRcppAnnoy/inst/tinytest/data/test.tree0000644000176200001440000004461013465550702017610 0ustar liggesusers>?O>a8վ+x2;w? r[?vVz?| sT7>^C>3>L8?ɺUE!=?]=A>o?׿1UD A>V>i.<\;┿pњ}Ҋj鿫v^ j>?2T?M?'OV45@\?@Q e?5?<= &#?Q?{?iҾI?{Z忏??⼟]?-'?8%>Ԛ:o>\??bZ~ؾ>B` Pgmc?֤>6x??ޒ??z2 ?vUp?s? $>:?&$) >:=>>QN?ۿh}>0B?qLp>BI?k^>q(u?ޜ%>P%-K?@)B=5@Ym>yn>̔1>+-T+N? ?K{=kE>)=ntq?= N>#>e?ܻTu?e"=ܺ>< >EV{R{?#>?v>z{,=(?=E=D?ˎc~?D?a%濨4?-S tо~5(9)?)m>f>=␾$$̜پ?\?yCc=߉*ג>T>[@X> ?2/SKo->> =6?h,%?1ܿC(>IzffuBo-Կ I?(ҿ g>蝎?@]?s.?HBK>9?Kd- ??q[`?A{F?W @q>Mtal(W=n?R,?UqT͗ -R?⳿C7@phh?t>1>V?>8\?͓@褁=?t??:"T>@Y<,ǿ>??x6xþ>@gO>G?sm d==?7U"RB?x @LL *C?=T?#Y??iT >Zt? UjB?$""Of@!?-9oC`{?5=#? Yf>>jO @Ŀ>+p)VF>/|?E˽bz\?iɿ1}f>}aٿ*/o=$?bvɽҬ,?W=jLU?~qv? "r?>?e ?Ǔ@?ah^81?!s?J_)?-ξ݌?I+>G ¿:毲>̍?40?ж\jݮ:>W?3?l?>@ھ>B~0>)S= ?k?5K =v?J=*2ۿ`B?>d^UܿS[?v>Htk2h_@ɠ~Y=[\i:??n?{?bò>㳿biyqs?$)Ć?>`=c<0?sojg?*J?rfxT?'4>8M >y<q|.i?F79>wܾmKg> +?7r> 6>[ >ɪTU5?'?}}IokZ?@yKt?a?=?"U>: >jd?܈>Np??Mv;Ay*>f%AK?q+]?ϔ?V?^S[a*ayUa??>R>;NP?mƿMe,s>Z6þ{?8,)oUL4?!3>wzx?">=%??F2MM\?V_ƀO?Dd? ?)U uDZ~naF?f:?mDb?fkֿ\R?mB?Ͼ42 @(&>X-hSC? FQChj!"@ݬMh?>>ɑL0ռ(?x(?e@v=Ȣ?Yg=s?ܿ8ÞR}M?ys~ó?Ad˶6w??>lۂ>\sx[#!&ן=2#-?M?j>_+?4̽*doK>zȥb?νSQ?ty?w9>a4@r@T@4Xؾ8?x~d?ȗCK/>Ͽ ?K?پ?XF? =>?R?^ο`?;S^??g?@yn? `?oi?L!?3q惿2?{ ?=F=Av?h]?#=(?٭>bb?,> ȿQ?6=~!=/R&>.{>?>?޿A>X?7>/§?>s}?e=V!P{ƾ}B*>O=i:7?A<?a:^ _!/?: ϗyI<̿I1f[>j9.6.-?# A?\L?>{>_zXMk۾Y)<Ƿ?IV<{v>Ma$@ʰ?Yw"99>KAžO?5=&Z?.?Ů>? l?&3k>r񿧘,S?ڳ&ڎܼ}rcmǾƽA4=nZ3?)xH?f.?yJU>4?S" >ȆS?6Y?/?Kw>T0?򒗿u_vĿ"@?z<>Gb$?L n?@?stތ m4#W?X ?aZ>C:|]/%>{`#4+>쿺>P?8!?>1>?=.@[K:^a=m?b?#??cϾh=,S hB?U%>h@o߾ ` ި?lKWlտc?8=Z?yd/ ?Y?>5myo]?n>W?5?8b~a>࿁?{??E'X>yJ|\=c̍?͟k ?%?҇?߷?-\>ߚ>`!0o=<?y@Yu? rGVդ?RZ۾D?Ntֽj~17S$L><Ҿ֠)T?t@Ĉ|X̛N?ed?*m#!=܌6der8{=e *>q? ?92>׽+p* :5fi_@>F>Z=ʌ *Z?S%>8ֽgh!k>ܳ>%9?;k Ż=6 ;+x/==eU  #'+283@AOV%jk?< <=>kC>pa4t>Cٽ &146T[lo!Yk>w=>BL>\^Y᥾mn=Q(@km>+jR/%>> */;EU\b-57BLpq'罓˾J>i$=g)>>/=?>?MPQa !%KRXY`/sxc> ba{_:Q>=±>S>=twSo >J>(<]k^=>k> g,?uv:Jcy~ ?7¼5>/>Ĉ>>z{:A;8N>(N>BS(}< [= $9CFS|}q|;}>logڽw~ႾMY>1 ()G  ".:=^ZdN>r@AxlV>>>fI>Q]?5O>}{B}A>(=p;K=VC> ~>q= g>W>Հ_0f^= &*?MPUXbg=^>s\- O>?v"2;_ ,.BDQ[c0z}?%OyپrEB'>1>տ1̾=W)?9K=ϤY> -4:ENRTY\%9K`'/CHOVZa/>= ?=~Xq?žwpo=='oZY2̜Lo>7"^¾ lD4ᾝ$> ?>9=ݮ>> D iJ>+ď>  <JL  +F]^ !$1W'>蟢Ⱦ#Ž߲>, (?W>DѾΝ> `>NJ1>p4%?NK!&=:W=F%涽=R #6=>AI(57 )038@GSd5R>Cޅ>>l>bʻ= >,0߾M>>,l>??ol7> >G>>X> >xg=wٽ8fyW3dh(&>Ã>  <CDPVa^'>d&}FKAd]>;þcҊ> */?OU38@AM$?:>ö;=H@><>(> >^%=#?  '2W]c OK/>>u=#>;F>h \=y*WE<#)+>GI&(5J_4m=-о9)?v> MK!BE=.>D> >[@d;JQ'>~V|>_>s>.9QZ.xY>im>N!?Ru> L۽Ͼ yT>~= $6=KLT ,07:HS,=8>=LJ>p? >| =h ;?TO>  "1;FN[^>?d7 1zj4¼tRSj = (W!+τ>z 뾆6f>?nS !B %-4ERX`bY\dM >H>^8\o>MF=Ho>t(>.;ۚ>3`v)=)})[a=ꤾA >ˇ*> KS >eᘾ傼L7X'==>$=+qԀ½=@v=_cz۾2? >F]_ '2<GJNW^",9V>J-[=gX>Ǿ23Vd;y #+11=>SYb=!# =0< I>>X  $()DI0:=H6>GO>9=`> >FB>D =91?ˎоT2>)*b.^ >j>chܬ߾Q> 8>{>#J>.J>}BrTg>>F>yE\s>CF8f= %-CMY`c !57;?@L\7 XD= ̊NQOj=J$?Zx>hb> ?%>?>g9п *.KQRSX4BU[b TR#7?d8>Uy)>L>F7ؾO>q3=-5>ӵ &/368AEOPad" X/2P=*1D0\2.+QYt'>B\",>9-?Q?h=*>پxm*=μ$n=YJo'>c>2;?NW5Y^_c|Zݼ9"> ߽:B<>|W?<?zY{l?z>tֽz;.3=?Q(.GR ,7>KMUZ` "*BCQX !/9:S1֩>j>=x(L?V)C:">3>>E=}ü4]$?>9ؾF[=5>=kT=})gD>= )&  $'DJP]a >Nї><P>cK>?[*=f׾<%4OV[\b 038<AE>QB)?tZ>4뼬`CV%J>u?=  #+-1=IL )6@FHTd?5 R>)肾_>Oc=N>rk>᪾;<c5>gk>a=&3>#?3>A>}>aB4>I:ꮽ:.>$(#=&+IT쓹= |v#=C>>p*?2>0== #=BN > ?f׾~>&g=\b!>=c^>3= '1DJR["4PQX\b K美>Oz6lս&H>`ʽ(rL{'-?Гb>?pv=\ݎ>H=¾7> %(6:YZ^`*5OUck >UC>_$)>se>)?q{<C>-.2KM ,7;(͎>P>?d:>.5?-۾}g>Eb?>ؾdv>>aP$9a/?CEV]>ʽU>rbj2j}z[!"L̽a0k=zw>x>>7>+0x>3o>'>K\=s <q>]=>1B?W_ !)<>FGS038@AHdڟľB>=>Q\gL>㇙>D?>4}u/4?Q>">->R?h>(7T= >I> ,n}҂= >\~C=b t>6ͼr=4T@S?u > . -.5KMSY`c %36U!79Z4T?倽gkJ$Ͻq*>,35P>'> ;Nm?:BY>;M=7)>ey#(Gt=1Ћ<} >c.>n>m=>=3>> 0:@HTW^ )IL5+b=>:Hv>h ȾFо:= 𽷇 UXs &L;4U$Q?=>l> )K>BE  >4r\⾄L%>z$>)>p1P6 FJ   |>+ykxt>x>`>kܽ=Ƹ2?C "$+18<=>]=3> >k=ʉ%>Y>ϙ>]>'%>ga†=F8a>+`DV_ *,OQX[43Oa>P 5$hS>J$潉<>/4A\ab &'PRd! *婾pۼn=YC˾o !%?EZ>(ƴCd?3=?lV߽DA>¾>Խ>d=ܒQt;IF> H]> ?˲>'%;#i=U'i~<[_\='<D $)0:@IL i=ATYܽ`>*1=FGBZ=?UW=H>>þ!3=d>>(p?"QW_  8AFTaE<"%֐X*A-' >T>%+&[?Wp#$?H;\y\z>eH?Ƚ>=V=  .17Sc#(,5;G*&+uHo,IK-lj8>;u'(]i߾3Ymﵾnо>=ż= \>!/B)*VV{۾#<->Ze=B=(yɽ,IX> &?U 3Y^`,-M=r!=D7=n c46NZ./ _>WE=d5#=EԮ: ?Mžc%-KMRX\ *+2CJOPV[bd1>$.- 8A>ۛ6ৼTa>%>229 >L>!> dW{`⾿Q3=sdɾRS38'w'ML X;נ/ +Hi'Ͼ45i#?μ =g>>XI>a>6q9>A[>=(67$v>>32>< pw !7FS5=>B"KL:==NJ>2$o>Su% >c_>r>8 ?;<~/%dDq7>>=ns&{μ>bv/0;@ ,9:EQTXZ\ 6HUY_2?B*Nm=2l>wt/(i?Ʀ޾a@Ais>OJc>i>0JT(Q]+?\S>|r=).<G^%*34IOV$CFM<ȫ/ ;[>}:==s rP<0>DE(O4[jWT>-wcCřLk>&]b 28?ACJP[aGH7>;<Ҿ=?ʾ&P>vͼF8H>$=Ժ= DMNWc   #$'+-1R`dJQs> (\>z>„U쾤>$K=2Ӿ)KNf>VH=$>LM1>=+!f>7ARý%8>ϋ(86 z^>  "5BXZ )79;STW^OP=z5=$c>?0I>m>J姼 &*+?QUY_ (.28GMc;R]\ݼ>ᖾ彘?>iu>)r>i:?-SZ:- >S9J=ǧĽ4>=9fl?TW>F>z&4>P>o9>U>,OUV]4.<݅>x((?ᖾ<2;>y>M>Β=!%/0KL-E\`aXYNh>:`${.ɽҜ=.*ДƊE[a% =FHPVb 1:N[\Q>;> ?2ӭ)>>:>0B $'@A[,<>C]^_M;h~>ԨndE c{o=p>='4 #36I 4DJORder8{=e *>q? ?92>׽+p* :dN>r@AxlV>>>fI>Q]?d5R>Cޅ>>l>bʻ= >,dM >H>^8\o>MF=Ho>t(>d" X/2)肾_>Oc=N>rk>᪾;dڟľB>=>Q\gL>㇙>D?>4}ud! *婾pۼn=YC˾o !%?EZ>d1>$.- 8A>ۛ6ৼTa>%>dJQs> (\>z>„U쾤>$K=2ӾRcppAnnoy/inst/tinytest/testIndex.R0000644000176200001440000000215113541674477017136 0ustar liggesusers ## if this is set (eg .travis.yml) then run the test if (Sys.getenv("RunAllRcppAnnoyTests") != "yes") exit_file("Skip this test") suppressMessages(library(RcppAnnoy)) a <- new(AnnoyAngular, 10) a$load(system.file("tinytest", "data", "test.tree", package="RcppAnnoy")) ## This might change in the future if we change the search ## algorithm, but in that case let's update the test checkEqual(a$getNNsByItem(0, 10), c(0, 85, 42, 11, 54, 38, 53, 66, 19, 31), msg="check loaded index") a <- new(AnnoyEuclidean, 10) v <- rnorm(10) expect_error(a$addItem(-2, v))#, msg="check negative index", silent=TRUE) expect_error(a$addItem(NA, v))#, msg="check NA index", silent=TRUE) ## modeled after annoy_test.py() and its t i <- new(AnnoyAngular, 10) i$load(system.file("tinytest", "data", "test.tree", package="RcppAnnoy")) u <- i$getItemsVector(99) i$save(tempfile()) v <- i$getItemsVector(99) checkEqual(u, v, msg="getItemVector comparison") j <- new(AnnoyAngular, 10) j$load(system.file("tinytest", "data", "test.tree", package="RcppAnnoy")) w <- i$getItemsVector(99) checkEqual(u, w, msg="getItemVector comparison") RcppAnnoy/inst/tinytest/testVignette.R0000644000176200001440000000130613756552014017643 0ustar liggesusers ## See #66 for the idea and discussion vigfile <- system.file("rmd", "UsingAnnoyInCpp.Rmd", package="RcppAnnoy") if (!file.exists(vigfile)) exit_file("No vignette source found. What's up with that?") lines <- readLines(vigfile) starts <- which(lines == "```{Rcpp, eval=FALSE}") ends <- which(lines=="```") ends <- ends[findInterval(starts, ends)+1] code <- lines[unlist(mapply(seq, starts+1, ends-1))] res <- Rcpp::sourceCpp(code=paste(code, collapse="\n")) # checks everything is compileable. expect_equal(res$functions, "thingy") # check we got a function compiled set.seed(42) mat <- matrix(runif(1000), 100) Q <- matrix(runif(100), 10) res <- thingy(mat, 1, 10, Q, tempfile()) expect_equal(res, 1) RcppAnnoy/inst/tinytest/testOnDiskBuild.R0000644000176200001440000000211213541674477020233 0ustar liggesusers suppressMessages(library(RcppAnnoy)) f <- 2 # arbitrary a <- new(AnnoyEuclidean, f) diskfile <- tempfile(pattern="annoy", fileext="bin") expect_true(a$onDiskBuild(diskfile)) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) expect_equal(a$getNNsByVector(c(4,4), 3), c(2,1,0)) #, msg="getNNsByVector check 1") expect_equal(a$getNNsByVector(c(1,1), 3), c(0,1,2)) #, msg="getNNsByVector check 2") expect_equal(a$getNNsByVector(c(5,3), 3), c(2,1,0)) #, msg="getNNsByVector check 3") a$unload() a$load(diskfile) expect_equal(a$getNNsByVector(c(4,4), 3), c(2,1,0)) #, msg="getNNsByVector check 1") expect_equal(a$getNNsByVector(c(1,1), 3), c(0,1,2)) #, msg="getNNsByVector check 2") expect_equal(a$getNNsByVector(c(5,3), 3), c(2,1,0)) #, msg="getNNsByVector check 3") b <- new(AnnoyEuclidean, f) b$load(diskfile) expect_equal(b$getNNsByVector(c(4,4), 3), c(2,1,0)) #, msg="getNNsByVector check 1") expect_equal(b$getNNsByVector(c(1,1), 3), c(0,1,2)) #, msg="getNNsByVector check 2") expect_equal(b$getNNsByVector(c(5,3), 3), c(2,1,0)) #, msg="getNNsByVector check 3") RcppAnnoy/inst/tinytest/testSeeds.R0000644000176200001440000000152313743414424017120 0ustar liggesusers ## if this is set (eg .travis.yml) then run the test if (Sys.getenv("RunAllRcppAnnoyTests") != "yes") exit_file("Skip this test") suppressMessages(library(RcppAnnoy)) f <- 2 set.seed(123456) # R Seed for next two vectors n <- 100 x <- rnorm(n) y <- rnorm(n) v1 <- new(AnnoyHamming, f) v1$setSeed(123) for (i in 1:n) v1$addItem(i-1, c(x[i], y[i])) v1$build(f) v2 <- new(AnnoyHamming, f) v2$setSeed(456) # different for (i in 1:n) v2$addItem(i-1, c(x[i], y[i])) v2$build(f) v3 <- new(AnnoyHamming, f) v3$setSeed(123) # as first for (i in 1:n) v3$addItem(i-1, c(x[i], y[i])) v3$build(f) checkEqual(v1$getNNsByVector(c(0.5,0.5), 20), v3$getNNsByVector(c(0.5,0.5), 20)) # msg="v1 and v3 are equal") checkTrue(any(v1$getNNsByVector(c(0.5,0.5), 20) != v2$getNNsByVector(c(0.5,0.5), 20))) # msg="v1 and v2 are not equal") RcppAnnoy/inst/tinytest/testAngular.R0000644000176200001440000000374213465550702017454 0ustar liggesusers suppressMessages(library(RcppAnnoy)) f <- 3 a <- new(AnnoyAngular, f) a$addItem(0, c(0,0,1)) a$addItem(1, c(0,1,0)) a$addItem(2, c(1,0,0)) a$build(10) checkEqual(a$getNNsByVector(c(3,2,1), 3), c(2,1,0), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,2,3), 3), c(0,1,2), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(2,0,1), 3), c(2,0,1), msg="getNNsByVector check 1") f <- 3 a <- new(AnnoyAngular, f) a$addItem(0, c(2,1,0)) a$addItem(1, c(1,2,0)) a$addItem(2, c(0,0,1)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0,1,2), msg="getNNsByItem check1") checkEqual(a$getNNsByItem(1, 3), c(1,0,2), msg="getNNsByItem check2") f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) checkEqual(a$getDistance(0, 1), (2.0 * (1.0 - 2^(-0.5)))^0.5, msg="distance 1", tolerance=1e-6) f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(1000, 0)) a$addItem(1, c(10, 0)) checkEqual(a$getDistance(0, 1), 0, msg="distance 2") f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(97, 0)) a$addItem(1, c(42, 42)) d <- ((1 - 2^(-0.5))^2 + (2^(-0.5))^2)^0.5 checkEqual(a$getDistance(0, 1), d, msg="distance 3", tolerance=1.0e-6) f <- 2 a <- new(AnnoyAngular, f) a$addItem(0, c(1, 0)) a$addItem(1, c(0, 0)) checkEqual(a$getDistance(0, 1), 2.0^0.5, msg="distance 4", tolerance=1.0e-6) ## Generate pairs of random points where the pair is super close f <- 10 a <- new(AnnoyAngular, f) set.seed(123) for (j in seq(0, 10000, by=2)) { p <- rnorm(f) f1 <- runif(1) + 1 f2 <- runif(1) + 1 x <- f1 * p + rnorm(f, 0, 1.0e-2) y <- f2 * p + rnorm(f, 0, 1.0e-2) a$addItem(j, x) a$addItem(j+1, y) } a$build(10) res <- TRUE for (j in seq(0, 10000, by=2)) { #expect_equal(a$getNNsByItem(j, 2), c(j, j+1), msg="getNNsByItem check1") #expect_equal(a$getNNsByItem(j+1, 2), c(j+1, j), msg="getNNsByItem check1") res <- res && all.equal(a$getNNsByItem(j, 2), c(j, j+1)) && all.equal(a$getNNsByItem(j+1, 2), c(j+1, j)) } checkTrue(res) RcppAnnoy/inst/tinytest/testEuclidean.R0000644000176200001440000000506113465550702017750 0ustar liggesusers suppressMessages(library(RcppAnnoy)) ## getNNsByVector f <- 2 a <- new(AnnoyEuclidean, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByVector(c(4,4), 3), c(2,1,0), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,1), 3), c(0,1,2), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(4,2), 3), c(1,2,0), msg="getNNsByVector check 1") ## getNNsByItem f <- 2 a <- new(AnnoyEuclidean, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0, 1, 2), msg="getNNsByItem check 1") checkEqual(a$getNNsByItem(2, 3), c(2, 1, 0), msg="getNNsByItem check 2") ### test03dist f <- 2 a <- new(AnnoyEuclidean, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) a$addItem(2, c(0, 0)) checkEqual(a$getDistance(0, 1), 1.0^0.5, msg="distance 1") checkEqual(a$getDistance(1, 2), 2.0^0.5, msg="distance 2", tolerance=1e-6) ## test04largeIndex ## Generate pairs of random points where the pair is super close f <- 10 #q <- rnorm(f, 0, 10) a <- new(AnnoyEuclidean, f) set.seed(123) for (j in seq(0, 10000, by=2)) { p <- rnorm(f) x <- 1 + p + rnorm(f, 0, 1.0e-2) y <- 1 + p + rnorm(f, 0, 1.0e-2) a$addItem(j, x) a$addItem(j+1, y) } a$build(10) res <- TRUE for (j in seq(0, 10000, by=2)) { #expect_equal(a$getNNsByItem(j, 2), c(j, j+1), msg="getNNsByItem check1") #expect_equal(a$getNNsByItem(j+1, 2), c(j+1, j), msg="getNNsByItem check1") res <- res && all.equal(a$getNNsByItem(j, 2), c(j, j+1)) && all.equal(a$getNNsByItem(j+1, 2), c(j+1, j)) } expect_true(res) ## test05precision precision <- function(n, nTrees=10, nPoints=10000, nRounds=3) { found <- 0 for (r in 1:nRounds) { ## create random points at distance x f <- 10 a <- new(AnnoyEuclidean, f) for (j in seq(nPoints)) { p <- rnorm(f, 0, 1) nrm <- sqrt(sum(p^2)) x <- p / nrm * j a$addItem(j, x) } a$build(nTrees) nns <- a$getNNsByVector(rep(0, f), n) checkEqual(nns, nns[order(nns)], msg="checking precision order") # should be in order ## The number of gaps should be equal to the last item minus n-1 found <- found + length(nns[ nns <= n]) } return(1.0 * found / (n * nRounds)) } checkTrue(precision(1) >= 0.98)#, msg="precision at 1") checkTrue(precision(10) >= 0.98)#, msg="precision at 10") checkTrue(precision(100) >= 0.98)#, msg="precision at 100") checkTrue(precision(1000) >= 0.98)#, msg="precision at 1000") RcppAnnoy/inst/tinytest/testHamming.R0000644000176200001440000000527113465550702017442 0ustar liggesusers suppressMessages(library(RcppAnnoy)) # test01getNNsByVector f <- 2 a <- new(AnnoyHamming, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByVector(c(4,4), 3), c(0,1,2), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,1), 3), c(2,1,0), msg="getNNsByVector check 2") checkEqual(a$getNNsByVector(c(5,3), 3), c(2,1,0), msg="getNNsByVector check 3") # test02getNNsByItem f <- 2 a <- new(AnnoyHamming, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0, 1, 2), msg="getNNsByItem check 1") checkEqual(a$getNNsByItem(2, 3), c(2, 1, 0), msg="getNNsByItem check 2") # test03dist f <- 2 a <- new(AnnoyHamming, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) a$addItem(2, c(0, 0)) checkEqual(a$getDistance(0, 1), 1.0, msg="distance 1")# checkEqual(a$getDistance(1, 2), 2.0, msg="distance 2")# ## test04largeIndex <- function() { ## ## Generate pairs of random points where the pair is super close ## f <- 10 ## #q <- rnorm(f, 0, 10) ## a <- new(AnnoyHamming, f) ## set.seed(123) ## for (j in seq(0, 10000, by=2)) { ## p <- rnorm(f) ## x <- 1 + p + rnorm(f, 0, 1.0e-2) ## y <- 1 + p + rnorm(f, 0, 1.0e-2) ## a$addItem(j, x) ## a$addItem(j+1, y) ## } ## a$build(10) ## for (j in seq(0, 10000, by=2)) { ## checkEquals(a$getNNsByItem(j, 2), c(j, j+1), msg="getNNsByItem check 1") ## checkEquals(a$getNNsByItem(j+1, 2), c(j+1, j), msg="getNNsByItem check 2") ## } ## } ## test05precision <- function() { ## precision <- function(n, nTrees=10, nPoints=10000, nRounds=3) { ## found <- 0 ## for (r in 1:nRounds) { ## ## create random points at distance x ## f <- 10 ## a <- new(AnnoyHamming, f) ## for (j in seq(nPoints)) { ## p <- rnorm(f, 0, 1) ## nrm <- sqrt(sum(p^2)) ## x <- p / nrm + j ## a$addItem(j, x) ## } ## a$build(nTrees) ## nns <- a$getNNsByVector(rep(0, f), n) ## checkEquals(nns, nns[order(nns)], msg="checking precision order") # should be in order ## ## The number of gaps should be equal to the last item minus n-1 ## found <- found + length(nns[nns <= n]) ## } ## return(1.0 * found / (n * nRounds)) ## } ## checkTrue(precision(1) >= 0.98, msg="precision at 1") ## checkTrue(precision(10) >= 0.98, msg="precision at 10") ## checkTrue(precision(100) >= 0.98, msg="precision at 100") ## checkTrue(precision(1000) >= 0.98, msg="precision at 1000") ## } RcppAnnoy/inst/tinytest/testManhattan.R0000644000176200001440000000460113465550702017771 0ustar liggesusers suppressMessages(library(RcppAnnoy)) ## test01getNNsByVector f <- 2 a <- new(AnnoyManhattan, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByVector(c(4,4), 3), c(2,1,0), msg="getNNsByVector check 1") checkEqual(a$getNNsByVector(c(1,1), 3), c(0,1,2), msg="getNNsByVector check 2") checkEqual(a$getNNsByVector(c(5,3), 3), c(2,1,0), msg="getNNsByVector check 3") ## test02getNNsByItem f <- 2 a <- new(AnnoyManhattan, f) a$addItem(0, c(2, 2)) a$addItem(1, c(3, 2)) a$addItem(2, c(3, 3)) a$build(10) checkEqual(a$getNNsByItem(0, 3), c(0, 1, 2), msg="getNNsByItem check 1") checkEqual(a$getNNsByItem(2, 3), c(2, 1, 0), msg="getNNsByItem check 2") ## test03dist f <- 2 a <- new(AnnoyManhattan, f) a$addItem(0, c(0, 1)) a$addItem(1, c(1, 1)) a$addItem(2, c(0, 0)) checkEqual(a$getDistance(0, 1), 1.0, msg="distance 1")# checkEqual(a$getDistance(1, 2), 2.0, msg="distance 2")# ## test04largeIndex ## Generate pairs of random points where the pair is super close f <- 10 ##q <- rnorm(f, 0, 10) a <- new(AnnoyManhattan, f) set.seed(123) for (j in seq(0, 10000, by=2)) { p <- rnorm(f) x <- 1 + p + rnorm(f, 0, 1.0e-2) y <- 1 + p + rnorm(f, 0, 1.0e-2) a$addItem(j, x) a$addItem(j+1, y) } a$build(10) res <- TRUE for (j in seq(0, 10000, by=2)) { res <- res && all.equal(a$getNNsByItem(j, 2), c(j, j+1)) && all.equal(a$getNNsByItem(j+1, 2), c(j+1, j)) } checkTrue(res) ## test05precision precision <- function(n, nTrees=10, nPoints=10000, nRounds=3) { found <- 0 for (r in 1:nRounds) { ## create random points at distance x f <- 10 a <- new(AnnoyManhattan, f) for (j in seq(nPoints)) { p <- rnorm(f, 0, 1) nrm <- sqrt(sum(p^2)) x <- p / nrm + j a$addItem(j, x) } a$build(nTrees) nns <- a$getNNsByVector(rep(0, f), n) checkEqual(nns, nns[order(nns)], msg="checking precision order") # should be in order ## The number of gaps should be equal to the last item minus n-1 found <- found + length(nns[nns <= n]) } return(1.0 * found / (n * nRounds)) } checkTrue(precision(1) >= 0.98) #, msg="precision at 1") checkTrue(precision(10) >= 0.98) #, msg="precision at 10") checkTrue(precision(100) >= 0.98) #, msg="precision at 100") checkTrue(precision(1000) >= 0.98) #, msg="precision at 1000") RcppAnnoy/inst/NEWS.Rd0000644000176200001440000001426014101027026014177 0ustar liggesusers\name{NEWS} \title{News for Package \pkg{RcppAnnoy}} \newcommand{\ghpr}{\href{https://github.com/eddelbuettel/rcppannoy/pull/#1}{##1}} \newcommand{\ghit}{\href{https://github.com/eddelbuettel/rcppannoy/issues/#1}{##1}} \section{Changes in version 0.0.19 (2021-07-30)}{ \itemize{ \item Minor tweaks to default CI setup and DESCRIPTION file } } \section{Changes in version 0.0.18 (2020-12-15)}{ \itemize{ \item Small tweaks to threading policy header defines (Dirk closing \ghit{65}) \item Vignette code is again compiled during testing (Aaron Lum and Dirk in \ghpr{66} addressing \ghit{64}) \item Upstream code (with Aaron's PR) was synchronized once more (Dirk in \ghpr{67}) \item A new helper function was added to report the Annoy version (Aaron in \ghpr{68}) } } \section{Changes in version 0.0.17 (2020-11-15)}{ \itemize{ \item Upgrade to Annoy 1.17, but default to serial use. \item Add new header file to regroup includes and defines. \item Upgrade CI script to use R with bspm on focal. } } \section{Changes in version 0.0.16 (2020-03-06)}{ \itemize{ \item Use \code{int} in two interfaces (Dirk in \ghpr{59} for upstream PR 460 and closing \ghit{56}). \item Use \code{inline} for two helper functions (Dirk in \ghpr{59} for upstream PR 461 and closing \ghit{57}; also Aaron in \ghpr{58} after earlier discussion). \item Removed a noisy \code{pragma} (Dirk in \ghpr{60} for upstream PR 462). \item Add a simple helper function displaying compiler status. } } \section{Changes in version 0.0.15 (2020-02-25)}{ \itemize{ \item RcppAnnoy synchronized with upstream PR 455 (Dirk in \ghpr{55}). \item The help page has a small correction thanks to Bill1 Venables. \item The \code{alloca()} function is now declared portably thanks to a working example in \emph{Writing R Extensions}. } } \section{Changes in version 0.0.14 (2019-11-11)}{ \itemize{ \item RcppAnnoy again synchronized with upstream to ensure builds with older compilers without AVX512 instructions (Dirk \ghpr{53}). \item The \code{cleanup} script only uses \code{/bin/sh}. } } \section{Changes in version 0.0.13 (2019-09-23)}{ \itemize{ \item In example(), the saved and loaded filename is now obtained via tempfile() to not touch user directories per CRAN Policy (Dirk). \item RcppAnnoy was again synchronized with Annoy upstream leading to enhanced performance and more features (Dirk \ghpr{48}). \item Minor changes made (and send as PRs upstream) to adapt both \code{annoylib.h} and \code{mman.h} changes (Dirk). \item A spurious command was removed from one vignette (Peter Hickey in \ghpr{49}). \item Two new user-facing functions onDiskBuild() and unbuild() were added (Dirk in \ghpr{50}). \item Minor tweaks were made to two tinytest-using test files (Dirk). } } \section{Changes in version 0.0.12 (2019-05-12)}{ \itemize{ \item Allow setting of seed (Dirk in \ghpr{41} fixing \ghit{40}). \item Document \code{setSeed} (James Melville in \ghpr{42} documenting \ghit{41}). \item Added documentation (Adam Spannbauer in \ghpr{44} closing \ghit{43}). \item Switched unit testing to the new \pkg{tinytest} package (Dirk in \ghpr{45}). \item The vignette is now pre-made in included as-is in Sweave document reducing the number of suggested packages. } } \section{Changes in version 0.0.11 (2018-10-30)}{ \itemize{ \item Synchronized with Annoy upstream (\ghpr{26}, \ghpr{30}, \ghpr{36}). \item Added new Hamming distance measure functionality; should be considered experimental as the functionality depends on integer values. \item Travis CI use was updated to the R 3.5 PPA (\ghpr{28}) \item New vignette about Annoy use from C++ via Rcpp (Aaron Lun in \ghpr{29} addressing \ghit{19}; also \ghpr{32}, \ghpr{33}) \item The vignette was rewritten using \pkg{pinp} (\ghpr{34}, \ghpr{35}). } } \section{Changes in version 0.0.10 (2017-09-25)}{ \itemize{ \item The \code{getItemsVector()} function no longer crashes (\ghit{24}) } } \section{Changes in version 0.0.9 (2017-08-31)}{ \itemize{ \item Synchronized with Annoy upstream version 1.9.1 \item Minor updates in calls and tests as required by annoy 1.9.1 \item New Manhattan distance modules along with unit test code \item Additional unit tests from upstream test code carried over \item Binary mode is used for \code{save} (as suggested by @khoran in \ghit{21}) \item A new file \code{init.c} was added with calls to \code{R_registerRoutines()} and \code{R_useDynamicSymbols()} \item Symbol registration is enabled in \code{useDynLib} } } \section{Changes in version 0.0.8 (2016-10-01)}{ \itemize{ \item New functions \code{getNNsByItemList} and \code{getNNsByVectorList}, from by Michael Phan-Ba in \ghit{12} \item Added destructor (PR \ghpr{14} by Michael Phan-Ba) \item Extended templatization (PR \ghpr{11} by Dan Dillon) \item Switched to \code{run.sh} for Travis (PR \ghpr{17}) \item Added test for admissible value to \code{addItem} (PR \ghpr{18} closing issue \ghit{13}) } } \section{Changes in version 0.0.7 (2015-11-15)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Minor internal changes required by Annoy changes } } \section{Changes in version 0.0.6 (2015-05-03)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Permit supplying our own RNG \item Minor internal changes } } \section{Changes in version 0.0.5 (2015-01-22)}{ \itemize{ \item Synchronized with Annoy upstream changes } } \section{Changes in version 0.0.4 (2015-01-22)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Depends on R (>= 3.1) to permit C++11 builds } } \section{Changes in version 0.0.3 (2014-11-17)}{ \itemize{ \item Synchronized with Annoy upstream changes \item Windows support added (Qiang Kou in \ghpr{2}) } } \section{Changes in version 0.0.2 (2014-11-13)}{ \itemize{ \item Added verbosity toggle \item Added regression tests } } \section{Changes in version 0.0.1 (2014-11-08)}{ \itemize{ \item Initial release } } RcppAnnoy/inst/rmd/0000755000176200001440000000000013756552014013732 5ustar liggesusersRcppAnnoy/inst/rmd/rcppannoy.bib0000644000176200001440000000535713756552014016433 0ustar liggesusers@String{CRAN = "http://CRAN.R-Project.org/" } @Manual{Bioc:BiocNeighbors, title = {BiocNeighbors: Nearest Neighbor Detection for Bioconductor Packages}, author = {Aaron Lun}, year = 2020, note = {R package version 1.8.1}, } @Manual{CRAN:Rcpp, title = {{Rcpp}: Seamless {R} and {C++} Integration}, author = {Dirk Eddelbuettel and Romain Fran\c{c}ois and JJ Allaire and Kevin Ushey and Qiang Kou and Nathan Russel and John Chambers and Douglas Bates}, year = 2020, note = {R package version 1.0.5}, url = CRAN # "package=Rcpp" } @Manual{CRAN:RcppAnnoy, title = {RcppAnnoy: {Rcpp} Bindings for {Annoy}, a Library for Approximate Nearest Neighbors}, author = {Dirk Eddelbuettel}, year = 2020, note = {R package version 0.0.17}, url = CRAN # "package=RcppAnnoy" } @Book{Eddelbuettel:2013:Rcpp, author = {Dirk Eddelbuettel}, title = {Seamless R and C++ Integration with Rcpp}, publisher = {Springer}, series = {Use R!}, year = 2013, address = {New York}, isbn = {978-1-4614-6867-7} } @Manual{Github:annoy, author = {Erik Bernhardsson}, title = {Annoy: Approximate Nearest Neighbors in C++/Python}, year = 2020, note = {Python package version 1.17.0}, url = {https://pypi.org/project/annoy/}, } @Article{JSS:Rcpp, title = {{Rcpp}: Seamless {R} and {C++} Integration}, author = {Dirk Eddelbuettel and Romain Fran\c{c}ois}, journal = {Journal of Statistical Software}, year = 2011, volume = 40, number = 8, pages = {1--18}, url = {http://www.jstatsoft.org/v40/i08/}, } @Article{Lun+Richard+Marioni:2017, author = {Aaron T. L. Lun and Arianne C. Richard and John C. Marioni}, title = {Testing for differential abundance in mass cytometry data}, journal = {Nat. Methods}, year = 2017, volume = 14, number = 7, pages = {707--709}, month = {Jul}, } @Article{TAS:Rcpp, author = {Dirk Eddelbuettel and James Joseph Balamuta}, title = {Extending R with C++: A Brief Introduction to Rcpp}, journal = {The American Statistician}, volume = 72, number = 1, year = 2018, month = {August}, doi = {10.1080/00031305.2017.1375990} } @Article{Wang:2012, author = {Xueyi Wang}, title = {A fast exact k-nearest neighbors algorithm for high dimensional search using k-means clustering and triangle inequality}, journal = {Proc Int Jt Conf Neural Netw}, year = 2012, volume = 43, number = 6, pages = {2351--2358}, month = {Feb}, } RcppAnnoy/inst/rmd/UsingAnnoyInCpp.Rmd0000644000176200001440000002022013756552014017416 0ustar liggesusers--- title: Using Annoy in package C++ code author: - name: Aaron Lun affiliation: a address: - code: a address: \url{https://github.com/LTLA} lead_author_surname: Lun doi: "https://cran.r-project.org/package=RcppAnnoy" keywords: - Rcpp - Annoy - Approximate Nearest Neighbours footer_contents: "RcppAnnoy Vignette" date: \today output: pinp::pinp: collapse: true keep_tex: false bibliography: rcppannoy.bib skip_final_break: true abstract: | This note shows how to use the Annoy library for _Approximate Nearest Neighbours (Oh Yeah)_ from C++ code using the headers provided by the RcppAnnoy package. header-includes: > \newcommand{\proglang}[1]{\textsf{#1}} \newcommand{\pkg}[1]{\textbf{#1}} vignette: > %\VignetteIndexEntry{Using Annoy in C++} %\VignetteEngine{knitr::rmarkdown} %\VignetteKeywords{Rcpp, Annoy, R, Cpp, Approximate Nearest Neighbours} %\VignettePackage{Rcpp} %\usepackage[utf8]{inputenc} --- ```{r, echo=FALSE, results="hide"} knitr::opts_chunk$set(error=FALSE, warning=FALSE, message=FALSE, eval=FALSE) ``` # Setting up your package The [\pkg{Annoy}](https://github.com/spotify/annoy) \proglang{C++} library \citep{Github:annoy} implements a quick and simple method for _approximate nearest neighbor (oh yeah)_ searching. The \pkg{RcppAnnoy} package \citep{CRAN:RcppAnnoy} provides a centralized resource for developers to use this code in their own \proglang{R} packages by relying on \pkg{Rcpp} \citep{TAS:Rcpp,CRAN:Rcpp}. To use \pkg{Annoy} in \proglang{C++} code, simply put in your `DESCRIPTION` the line ``` LinkingTo: RcppAnnoy ``` and the header files will be available for inclusion into your package's source files. Note that \pkg{Annoy} is a header-only library so no additional commands are necessary for the linker. # Including the header files Obviously, the header files need to be `include`d in any \proglang{C++} source file that uses \pkg{Annoy}. A few macros also need to be added to handle Windows-specific behaviour and to ensure that error messages are printed through R. Version number comparison macros help in conditioning changes on a particular version. Since release 0.0.17 all this is now expressed centrally in a header in the package so users can just use this one-liner: ```{Rcpp, eval=FALSE} #include "RcppAnnoy.h" ``` # Defining the search type The `AnnoyIndex` template class can accommodate different data types, distance metrics, random number generators, and threading policies (where the latter are a choice between sequential or multithreaded). Here, we will consider the most common application of a nearest-neighbor search on floating-point data with Euclidean distance. We `typedef` the type and realized template for convenience: ```{Rcpp, eval=FALSE} typedef float ANNOYTYPE; typedef AnnoyIndex MyAnnoyIndex; ``` Note that we use `float` by default, rather than the more conventional `double`. This is chosen for speed and to be consistent with the original Python implementation. The \pkg{Annoy} library uses random number generation during index creation (via the `Kiss64Random` class), with a seed that is separate from R's RNG seed. By default, the seed is fixed and results will be "deterministic" in the sense that repeated runs on the same data will yield the same result. They will also be unresponsive to the state of R's RNG seed. The seed used by `AnnoyIndex` can be specified by the `set_seed` method, which should be called before adding items to the index. # Building an index Let's say we have an `Rcpp::NumericMatrix` named `mat`, where each row corresponds to a sample and each column corresponds to a dimension/variable. ```{Rcpp, eval=FALSE} const size_t nsamples=mat.nrow(); const size_t ndims=mat.ncol(); ``` It is simple to build a `MyAnnoyIndex` containing the data in this matrix. Note the copy from the double-precision matrix into a `float` vector before calling `add_item()`. ```{Rcpp, eval=FALSE} MyAnnoyIndex obj(ndims); // from std::vector tmp(ndims); for (size_t i=0; i std::copy(cr.begin(), cr.end(), tmp.begin()); obj.add_item(i, tmp.data()); } obj.build(50); ``` The `build()` method accepts an integer argument specifying the number of trees to use to construct the index. Indices with more trees are larger (in memory and on file) but yield greater search accuracy. The index can also be saved to file via ```{Rcpp, eval=FALSE} obj.save(indexfile.c_str()); ``` and reloaded in some other context: ```{Rcpp, eval=FALSE} MyAnnoyIndex obj2(ndims); obj2.load(indexfile.c_str()); // same as 'obj'. ``` This is helpful for parallelization across workers running in different \proglang{R} sessions. It also allows us to avoid rebuilding the index in applications where the same data set is to be queried multiple times. # Searching for nearest neighbors Let's say that we want to find the `K` (approximate) nearest neighbors of sample `c` in the original data set used to construct `obj`. To do this, we write: ```{Rcpp, eval=FALSE} std::vector neighbor_index; std::vector neighbor_dist; obj.get_nns_by_item(c, K + 1, -1, &neighbor_index, &neighbor_dist); ``` Upon return, the `neighbor_index` vector will be filled with the sample numbers of the `K` nearest neighbors (i.e., rows of the original `mat`, in this case). The `neighbor_dist` vector will be filled with the distances to each of those neighbors. Note that: - We ask for the `K+1` nearest neighbors, as the set returned in `neighbor_index` will usually include `c` itself. This should be taken into consideration when the results are used in downstream calculations. - The returned neighbors are sorted by increasing distance from `c`. However, note that `c` itself may not necessarily be at the start if there is another point with the same coordinates. - `get_nns_by_item()` requires pointers to the vectors rather than the vectors themselves. If the pointer to the output vector for distances is `NULL`, distances will not be returned. This provides a slight performance boost when only the identities of the neighbors are of interest. - The `-1` is the default value for a tuning parameter that specifies how many samples should be collected from the trees for exhaustive distance calculations. This defaults to the number of trees multiplied by the number of requested neighbors; larger values will increase accuracy at the cost of speed. Another application is to query the index for the neighbors of a new sample given its coordinates. Assuming we have a `float*` to an array of coordinates of length `ndims`, we do: ```{Rcpp, eval=FALSE} obj.get_nns_by_vector(query, K+1, -1, &neighbor_index, &neighbor_dist); ``` # Further information The [Annoy repository](https://github.com/spotify/Annoy) is the canonical source of all things Annoying. Questions or issues related to the \pkg{Annoy} \proglang{C++} library itself should be posted there. Any issues specific to the \pkg{RcppAnnoy} interface should be posted at its separate [Github](https://github.com/eddelbuettel/rcppannoy) repository. An example of using the Annoy library via \pkg{RcppAnnoy} is available in the [\pkg{BiocNeighbors}](https://bioconductor.org/packages/BiocNeighbors) package \citep{Bioc:BiocNeighbors}. RcppAnnoy/cleanup0000755000176200001440000000024514101027122013527 0ustar liggesusers#!/bin/sh rm -rf *~ */*~ src/*.o src/*.so src/*.dll src/*.dylib src/symbols.rds \ vignettes/jss.bst vignettes/pinp.cls vignettes/auto \ vignettes/annoy.index