googledrive/0000755000176200001440000000000014071540356012565 5ustar liggesusersgoogledrive/NAMESPACE0000644000176200001440000000754514071421104014004 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("[",dribble) S3method("names<-",dribble) S3method(as_dribble,"NULL") S3method(as_dribble,character) S3method(as_dribble,data.frame) S3method(as_dribble,default) S3method(as_dribble,drive_id) S3method(as_dribble,list) S3method(as_id,"NULL") S3method(as_id,character) S3method(as_id,data.frame) S3method(as_id,default) S3method(as_id,dribble) S3method(as_id,drive_id) S3method(as_shared_drive,"NULL") S3method(as_shared_drive,character) S3method(as_shared_drive,data.frame) S3method(as_shared_drive,default) S3method(as_shared_drive,dribble) S3method(as_shared_drive,drive_id) S3method(as_shared_drive,list) S3method(as_tibble,dribble) S3method(format,drive_user) S3method(gargle_map_cli,dribble) S3method(gargle_map_cli,drive_id) S3method(pillar_shaft,drive_id) S3method(print,drive_user) S3method(tbl_sum,dribble) S3method(vec_cast,character.drive_id) S3method(vec_cast,data.frame.dribble) S3method(vec_cast,dribble.data.frame) S3method(vec_cast,dribble.dribble) S3method(vec_cast,dribble.tbl_df) S3method(vec_cast,drive_id.character) S3method(vec_cast,drive_id.drive_id) S3method(vec_cast,tbl_df.dribble) S3method(vec_ptype2,character.drive_id) S3method(vec_ptype2,data.frame.dribble) S3method(vec_ptype2,dribble.data.frame) S3method(vec_ptype2,dribble.dribble) S3method(vec_ptype2,dribble.tbl_df) S3method(vec_ptype2,drive_id.character) S3method(vec_ptype2,drive_id.drive_id) S3method(vec_ptype2,tbl_df.dribble) S3method(vec_ptype_abbr,drive_id) S3method(vec_restore,dribble) export("%>%") export(as_dribble) export(as_id) export(as_shared_drive) export(as_team_drive) export(confirm_dribble) export(confirm_single_file) export(confirm_some_files) export(do_paginated_request) export(do_request) export(drive_about) export(drive_api_key) export(drive_auth) export(drive_auth_config) export(drive_auth_configure) export(drive_browse) export(drive_cp) export(drive_create) export(drive_deauth) export(drive_download) export(drive_empty_trash) export(drive_endpoint) export(drive_endpoints) export(drive_example) export(drive_example_local) export(drive_example_remote) export(drive_examples_local) export(drive_examples_remote) export(drive_extension) export(drive_fields) export(drive_find) export(drive_get) export(drive_has_token) export(drive_link) export(drive_ls) export(drive_mime_type) export(drive_mkdir) export(drive_mv) export(drive_oauth_app) export(drive_publish) export(drive_put) export(drive_read_raw) export(drive_read_string) export(drive_rename) export(drive_reveal) export(drive_rm) export(drive_share) export(drive_share_anyone) export(drive_token) export(drive_trash) export(drive_unpublish) export(drive_untrash) export(drive_update) export(drive_upload) export(drive_user) export(expose) export(is_dribble) export(is_folder) export(is_folder_shortcut) export(is_mine) export(is_native) export(is_parental) export(is_shared_drive) export(is_shortcut) export(is_team_drive) export(local_drive_quiet) export(no_file) export(prep_fields) export(request_generate) export(request_make) export(shared_drive_create) export(shared_drive_find) export(shared_drive_get) export(shared_drive_rm) export(shared_drive_update) export(shortcut_create) export(shortcut_resolve) export(single_file) export(some_files) export(team_drive_create) export(team_drive_find) export(team_drive_get) export(team_drive_rm) export(team_drive_update) export(with_drive_quiet) import(rlang) import(vctrs) importFrom(gargle,bulletize) importFrom(gargle,gargle_map_cli) importFrom(glue,glue) importFrom(glue,glue_collapse) importFrom(glue,glue_data) importFrom(lifecycle,deprecated) importFrom(magrittr,"%>%") importFrom(pillar,pillar_shaft) importFrom(purrr,map) importFrom(purrr,map2) importFrom(purrr,map_chr) importFrom(purrr,map_if) importFrom(purrr,map_int) importFrom(purrr,map_lgl) importFrom(purrr,pluck) importFrom(tibble,as_tibble) importFrom(tibble,tbl_sum) importFrom(tibble,tibble) googledrive/LICENSE0000644000176200001440000000004514041617517013572 0ustar liggesusersYEAR: 2020 COPYRIGHT HOLDER: RStudio googledrive/README.md0000644000176200001440000000624014071405145014042 0ustar liggesusers # googledrive [![CRAN status](https://www.r-pkg.org/badges/version/googledrive)](https://CRAN.R-project.org/package=googledrive) [![R-CMD-check](https://github.com/tidyverse/googledrive/workflows/R-CMD-check/badge.svg)](https://github.com/tidyverse/googledrive/actions) [![Codecov test coverage](https://codecov.io/gh/tidyverse/googledrive/branch/master/graph/badge.svg)](https://codecov.io/gh/tidyverse/googledrive?branch=master) ## Overview googledrive allows you to interact with files on Google Drive from R. ## Installation Install the CRAN version: ``` r install.packages("googledrive") ``` Or install the development version from GitHub: ``` r # install.packages("devtools") devtools::install_github("tidyverse/googledrive") ``` ## Usage Please see the package website: Here’s a teaser that uses googledrive to view some of the files you see on (up to `n_max = 25`, in this case): ``` r library("googledrive") drive_find(n_max = 25) #> # A dribble: 16 x 3 #> name id drive_resource #> #> 1 chicken_sheet 1s0kEHcqG2PyciERoGq52L_Qwzp4y3__rBVKSx7E… 2 r_logo.jpg 1wFAZdmBiSRu4GShsqurxD7wIDSCZvPud 3 THANKS 19URV7BT0_E1KhYdfDODszK5aiELOwTSz 4 googledrive-NEWS.… 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm 5 def 1ALSW_Nqs7FsPOcrJ6MqyBoRm03gansmn 6 abc 1o89YN5n4325GbUA86Wp6pRH3dsTsE5iC 7 BioC_mirrors.csv 13tMFbhAHoeHLFS5xu19GbDjf6GWJSxyN 8 Rlogo.svg 1lCQGxjyoc9mQz719I8sKil_m2Nuhw0Fq 9 DESCRIPTION 1KKYhtcdJMKh4WYeri5TOPEeAtzdN_cqV 10 r_about.html 1mHtQhvJyDk5dX9ktKbeIoVW-wwWK0__N 11 imdb_latin1.csv 1S5HxY7a-Jb_fV4C3T6fkGyPpXfI_yb4w 12 chicken.txt 1xMvlJHia_qYNZmucaStDcOF9A9PD4BOT 13 chicken.pdf 1au0aK6YCTra2sucTRus8ZaUhbaLpinTn 14 chicken.jpg 1-BF1c4kWCkkByQbcLT-b2Hv6vnVsbqa_ 15 chicken.csv 12212CXY_TopUMIKYu_l8hU5UXI8lrzQF 16 chicken_doc 11GY4Q4BUG3m5U4CnZP564lYvGydvZe2XZOkwCfx… = "3.4") withAutoprint else force)(\{ # examplesIf} # get info about your "My Drive" root folder drive_get("~/") # the API reserves the file id "root" for your root folder drive_get(id = "root") drive_get(id = "root") \%>\% drive_reveal("path") # set up some files to get by path alfalfa <- drive_mkdir("alfalfa") broccoli <- drive_upload( drive_example_local("chicken.txt"), name = "broccoli", path = alfalfa ) drive_get("broccoli") drive_get("alfalfa/broccoli") drive_get("~/alfalfa/broccoli") drive_get(c("broccoli", "alfalfa/", "~/alfalfa/broccoli")) # clean up drive_rm(alfalfa) \dontrun{ # The examples below are indicative of correct syntax. # But note these will generally result in an error or a # 0-row dribble, unless you replace the inputs with paths # or file ids that exist in your Drive. # multiple names drive_get(c("abc", "def")) # multiple names, one of which must be a folder drive_get(c("abc", "def/")) # query by file id(s) drive_get(id = "abcdefgeh123456789") drive_get(as_id("abcdefgeh123456789")) drive_get(id = c("abcdefgh123456789", "jklmnopq123456789")) # apply to a browser URL for, e.g., a Google Sheet my_url <- "https://docs.google.com/spreadsheets/d/FILE_ID/edit#gid=SHEET_ID" drive_get(my_url) drive_get(as_id(my_url)) drive_get(id = my_url) # access the shared drive named "foo" # shared_drive params must be specified if getting by path foo <- shared_drive_get("foo") drive_get(c("this.jpg", "that-file"), shared_drive = foo) # shared_drive params are not necessary if getting by id drive_get(as_id("123456789")) # search all shared drives and other files user has accessed drive_get(c("this.jpg", "that-file"), corpus = "allDrives") } \dontshow{\}) # examplesIf} } \seealso{ To add path information to any \code{\link{dribble}} that lacks it, use \code{\link[=drive_reveal]{drive_reveal(d, "path")}}. To list the contents of a folder, use \code{\link[=drive_ls]{drive_ls()}}. For general searching, use \code{\link[=drive_find]{drive_find()}}. Wraps the \code{files.get} endpoint and, if you specify files by name or path, also calls \code{files.list}: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/get} \item \url{https://developers.google.com/drive/api/v3/reference/files/list} } } googledrive/man/drive_auth_configure.Rd0000644000176200001440000000545514070147664020037 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_auth.R \name{drive_auth_configure} \alias{drive_auth_configure} \alias{drive_api_key} \alias{drive_oauth_app} \title{Edit and view auth configuration} \usage{ drive_auth_configure(app, path, api_key) drive_api_key() drive_oauth_app() } \arguments{ \item{app}{OAuth app, in the sense of \code{\link[httr:oauth_app]{httr::oauth_app()}}.} \item{path}{JSON downloaded from Google Cloud Platform Console, containing a client id (aka key) and secret, in one of the forms supported for the \code{txt} argument of \code{\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} (typically, a file path or JSON string).} \item{api_key}{API key.} } \value{ \itemize{ \item \code{drive_auth_configure()}: An object of R6 class \link[gargle:AuthState-class]{gargle::AuthState}, invisibly. \item \code{drive_oauth_app()}: the current user-configured \code{\link[httr:oauth_app]{httr::oauth_app()}}. \item \code{drive_api_key()}: the current user-configured API key. } } \description{ These functions give more control over and visibility into the auth configuration than \code{\link[=drive_auth]{drive_auth()}} does. \code{drive_auth_configure()} lets the user specify their own: \itemize{ \item OAuth app, which is used when obtaining a user token. \item API key. If googledrive is de-authorized via \code{\link[=drive_deauth]{drive_deauth()}}, all requests are sent with an API key in lieu of a token. See the vignette \href{https://gargle.r-lib.org/articles/get-api-credentials.html}{How to get your own API credentials} for more. If the user does not configure these settings, internal defaults are used. \code{drive_oauth_app()} and \code{drive_api_key()} retrieve the currently configured OAuth app and API key, respectively. } } \examples{ # see and store the current user-configured OAuth app (probaby `NULL`) (original_app <- drive_oauth_app()) # see and store the current user-configured API key (probaby `NULL`) (original_api_key <- drive_api_key()) if (require(httr)) { # bring your own app via client id (aka key) and secret google_app <- httr::oauth_app( "my-awesome-google-api-wrapping-package", key = "123456789.apps.googleusercontent.com", secret = "abcdefghijklmnopqrstuvwxyz" ) google_key <- "the-key-I-got-for-a-google-API" drive_auth_configure(app = google_app, api_key = google_key) # confirm the changes drive_oauth_app() drive_api_key() } \dontrun{ # bring your own app via JSON downloaded from Google Developers Console drive_auth_configure( path = "/path/to/the/JSON/you/downloaded/from/google/dev/console.json" ) } # restore original auth config drive_auth_configure(app = original_app, api_key = original_api_key) } \seealso{ Other auth functions: \code{\link{drive_auth}()}, \code{\link{drive_deauth}()} } \concept{auth functions} googledrive/man/googledrive-configuration.Rd0000644000176200001440000000544414071171077021011 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/googledrive-package.R, R/utils-ui.R \name{googledrive-configuration} \alias{googledrive-configuration} \alias{local_drive_quiet} \alias{with_drive_quiet} \title{googledrive configuration} \usage{ local_drive_quiet(env = parent.frame()) with_drive_quiet(code) } \arguments{ \item{env}{The environment to use for scoping} \item{code}{Code to execute quietly} } \description{ Some aspects of googledrive behaviour can be controlled via an option. } \section{Auth}{ Read about googledrive's main auth function, \code{\link[=drive_auth]{drive_auth()}}. It is powered by the gargle package, which consults several options: \itemize{ \item Default Google user or, more precisely, \code{email}: see \code{\link[gargle:gargle_options]{gargle::gargle_oauth_email()}} \item Whether or where to cache OAuth tokens: see \code{\link[gargle:gargle_options]{gargle::gargle_oauth_cache()}} \item Whether to prefer "out-of-band" auth: see \code{\link[gargle:gargle_options]{gargle::gargle_oob_default()}} \item Application Default Credentials: see \code{\link[gargle:credentials_app_default]{gargle::credentials_app_default()}} } } \section{Messages}{ The \code{googledrive_quiet} option can be used to suppress messages from googledrive. By default, googledrive always messages, i.e. it is \emph{not} quiet. Set \code{googledrive_quiet} to \code{TRUE} to suppress messages, by one of these means, in order of decreasing scope: \itemize{ \item Put \code{options(googledrive_quiet = TRUE)} in a start-up file, such as \code{.Rprofile}, or at the top of your R script \item Use \code{local_drive_quiet()} to silence googledrive in a specific scope\preformatted{foo <- function() \{ ... local_drive_quiet() drive_this(...) drive_that(...) ... \} } \item Use \code{with_drive_quiet()} to run a small bit of code silently\preformatted{with_drive_quiet( drive_something(...) ) } } \code{local_drive_quiet()} and \code{with_drive_quiet()} follow the conventions of the the withr package (\url{https://withr.r-lib.org}). } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # message: "Created Drive file" (x <- drive_create("drive-quiet-demo", type = "document")) # message: "File updated" x <- drive_update(x, starred = TRUE) drive_reveal(x, "starred") # suppress messages for a small amount of code with_drive_quiet( x <- drive_update(x, name = "drive-quiet-works") ) x$name # message: "File updated" x <- drive_update(x, media = drive_example_local("chicken.txt")) # suppress messages within a specific scope, e.g. function unstar <- function(y) { local_drive_quiet() drive_update(y, starred = FALSE) } x <- unstar(x) drive_reveal(x, "starred") # clean up drive_rm(x) \dontshow{\}) # examplesIf} } googledrive/man/drive_download.Rd0000644000176200001440000000616214071404512016625 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_download.R \name{drive_download} \alias{drive_download} \title{Download a Drive file} \usage{ drive_download( file, path = NULL, type = NULL, overwrite = FALSE, verbose = deprecated() ) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{path}{Character. Path for output file. If absent, the default file name is the file's name on Google Drive and the default location is working directory, possibly with an added file extension.} \item{type}{Character. Only consulted if \code{file} is a native Google file. Specifies the desired type of the exported file. Will be processed via \code{\link[=drive_mime_type]{drive_mime_type()}}, so either a file extension like \code{"pdf"} or a full MIME type like \code{"application/pdf"} is acceptable.} \item{overwrite}{A logical scalar. If local \code{path} already exists, do you want to overwrite it?} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ This function downloads a file from Google Drive. Native Google file types, such as Google Docs, Google Sheets, and Google Slides, must be exported to a conventional local file type. This can be specified: \itemize{ \item explicitly via \code{type} \item implicitly via the file extension of \code{path} \item not at all, i.e. rely on the built-in default } To see what export file types are even possible, see the \href{https://developers.google.com/drive/api/v3/ref-export-formats}{Drive API documentation} or the result of \code{drive_about()$exportFormats}. The returned dribble includes a \code{local_path} column. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Target one of the official example files (src_file <- drive_example_remote("chicken_sheet")) # Download Sheet as csv, explicit type downloaded_file <- drive_download(src_file, type = "csv") # See local path to new file downloaded_file$local_path # Download as csv, type implicit in file extension drive_download(src_file, path = "my_csv_file.csv") # Download with default name and type (xlsx) drive_download(src_file) # Clean up unlink(c("chicken_sheet.csv", "chicken_sheet.xlsx", "my_csv_file.csv")) \dontshow{\}) # examplesIf} } \seealso{ \href{https://developers.google.com/drive/api/v3/manage-downloads}{Download files}, in the Drive API documentation. } googledrive/man/drive_extension.Rd0000644000176200001440000000136313200256167017034 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_mime_type.R \name{drive_extension} \alias{drive_extension} \title{Lookup extension from MIME type} \usage{ drive_extension(type = NULL) } \arguments{ \item{type}{Character. MIME type or file extension.} } \value{ Character. File extension. } \description{ This is a helper to determinine which extension should be used for a file. Two types of input are acceptable: \itemize{ \item MIME types accepted by Google Drive. \item File extensions, such as "pdf", "csv", etc. (these are simply passed through). } } \examples{ ## get the extension for mime type image/jpeg drive_extension("image/jpeg") ## it's vectorized drive_extension(c("text/plain", "pdf", "image/gif")) } googledrive/man/drive_read_string.Rd0000644000176200001440000000446414071171077017331 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_read.R \name{drive_read_string} \alias{drive_read_string} \alias{drive_read_raw} \title{Read the content of a Drive file} \usage{ drive_read_string(file, type = NULL, encoding = NULL) drive_read_raw(file, type = NULL) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{type}{Character. Only consulted if \code{file} is a native Google file. Specifies the desired type of the exported file. Will be processed via \code{\link[=drive_mime_type]{drive_mime_type()}}, so either a file extension like \code{"pdf"} or a full MIME type like \code{"application/pdf"} is acceptable.} \item{encoding}{Passed along to \code{\link[httr:content]{httr::content()}}. Describes the encoding of the \emph{input} \code{file}.} } \value{ \itemize{ \item \code{read_drive_string()}: a UTF-8 encoded string \item \code{read_drive_raw()}: a \code{\link[=raw]{raw()}} vector } } \description{ These functions return the content of a Drive file as either a string or raw bytes. You will likely need to do additional work to parse the content into a useful R object. \code{\link[=drive_download]{drive_download()}} is the more generally useful function, but for certain file types, such as comma-separated values (MIME type \code{text/csv}), it can be handy to read data directly from Google Drive and avoid writing to disk. Just as for \code{\link[=drive_download]{drive_download()}}, native Google file types, such as Google Sheets or Docs, must be exported as a conventional MIME type. See the help for \code{\link[=drive_download]{drive_download()}} for more. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # comma-separated values --> data.frame or tibble (chicken_csv <- drive_example_remote("chicken.csv")) chicken_csv \%>\% drive_read_string() \%>\% read.csv(text = .) # Google Doc --> character vector (chicken_doc <- drive_example_remote("chicken_doc")) chicken_doc \%>\% # NOTE: we must specify an export MIME type drive_read_string(type = "text/plain") \%>\% strsplit(split = "(\r\n|\r|\n)") \%>\% .[[1]] \dontshow{\}) # examplesIf} } googledrive/man/drive_share.Rd0000644000176200001440000000711614071171077016127 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_share.R \name{drive_share} \alias{drive_share} \alias{drive_share_anyone} \title{Share Drive files} \usage{ drive_share( file, role = c("reader", "commenter", "writer", "fileOrganizer", "owner", "organizer"), type = c("user", "group", "domain", "anyone"), ..., verbose = deprecated() ) drive_share_anyone(file, verbose = deprecated()) } \arguments{ \item{file}{Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{role}{Character. The role to grant. Must be one of: \itemize{ \item owner (not allowed in shared drives) \item organizer (applies to shared drives) \item fileOrganizer (applies to shared drives) \item writer \item commenter \item reader }} \item{type}{Character. Describes the grantee. Must be one of: \itemize{ \item user \item group \item domain \item anyone }} \item{...}{Name-value pairs to add to the API request. This is where you provide additional information, such as the \code{emailAddress} (when grantee \code{type} is \code{"group"} or \code{"user"}) or the \code{domain} (when grantee type is \code{"domain"}). Read the API docs linked below for more details.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. There will be extra columns, \code{shared} and \code{permissions_resource}. } \description{ Grant individuals or other groups access to files, including permission to read, comment, or edit. The returned \code{\link{dribble}} will have extra columns, \code{shared} and \code{permissions_resource}. Read more in \code{\link[=drive_reveal]{drive_reveal()}}. \code{drive_share_anyone()} is a convenience wrapper for a common special case: "make this \code{file} readable by 'anyone with a link'". } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a file to share file <- drive_example_remote("chicken_doc") \%>\% drive_cp(name = "chicken-share.txt") # Let a specific person comment file <- file \%>\% drive_share( role = "commenter", type = "user", emailAddress = "susan@example.com" ) # Let a different specific person edit and customize the email notification file <- file \%>\% drive_share( role = "writer", type = "user", emailAddress = "carol@example.com", emailMessage = "Would appreciate your feedback on this!" ) # Let anyone read the file file <- file \%>\% drive_share(role = "reader", type = "anyone") # Single-purpose wrapper function for this drive_share_anyone(file) # Clean up drive_rm(file) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{permissions.create} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/permissions/create} } Drive roles and permissions are described here: \itemize{ \item \url{https://developers.google.com/drive/api/v3/ref-roles} } } googledrive/man/drive_fields.Rd0000644000176200001440000000353114071404512016261 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_fields.R \name{drive_fields} \alias{drive_fields} \alias{prep_fields} \title{Request partial resources} \usage{ drive_fields(fields = NULL, resource = "files") prep_fields(fields, resource = "files") } \arguments{ \item{fields}{Character vector of field names. If \code{resource = "files"}, they are checked for validity. Otherwise, they are passed through.} \item{resource}{Character, naming the API resource of interest. Currently, only the Files resource is anticipated.} } \value{ \code{drive_fields()}: Character vector of field names. \code{prep_fields()}: a string. } \description{ You may be able to improve the performance of your API calls by requesting only the metadata that you actually need. This function is primarily for internal use and is currently focused on the \href{https://developers.google.com/drive/api/v3/reference/files}{Files resource}. Note that high-level googledrive functions assume that the \code{name}, \code{id}, and \code{kind} fields are included, at a bare minimum. Assuming that \code{resource = "files"} (the default), input provided via \code{fields} is checked for validity against the known field names and the validated fields are returned. To see a tibble containing all possible fields and a short description of each, call \code{drive_fields(expose())}. \code{prep_fields()} prepares fields for inclusion as query parameters. } \examples{ # get a tibble of all fields for the Files resource + indicator of defaults drive_fields(expose()) # invalid fields are removed and throw warning drive_fields(c("name", "parents", "ownedByMe", "pancakes!")) # prepare fields for query prep_fields(c("name", "parents", "kind")) } \seealso{ \href{https://developers.google.com/drive/api/v3/performance}{Improve performance}, in the Drive API documentation. } googledrive/man/drive_reveal.Rd0000644000176200001440000001376014071404605016301 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_reveal.R \name{drive_reveal} \alias{drive_reveal} \title{Add a new column of Drive file information} \usage{ drive_reveal(file, what = c("path", "permissions", "published", "parent")) } \arguments{ \item{file}{Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{what}{Character, describing the type of info you want to add. These values get special handling (more details below): \itemize{ \item \code{path} \item \code{permissions} \item \code{published} \item \code{parent} } You can also request any property in the \code{drive_resource} column by name. The request can be in \code{camelCase} or \code{snake_case}, but the new column name will always be \code{snake_case}. Some examples of \code{what}: \itemize{ \item \code{mime_type} (or \code{mimeType}) \item \code{trashed} \item \code{starred} \item \code{description} \item \code{version} \item \code{web_view_link} (or \code{webViewLink}) \item \code{modified_time} (or \code{modifiedTime}) \item \code{created_time} (or \code{createdTime}) \item \code{owned_by_me} (or \code{ownedByMe}) \item \code{size} \item \code{quota_bytes_used} (or \code{quotaBytesUsed}) }} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. The additional info requested via \code{what} appears in one (or more) extra columns. } \description{ \code{drive_reveal()} adds extra information about your Drive files that is not readily available in the default \code{\link{dribble}} produced by googledrive. Why is this info not always included in the default \code{dribble}? \itemize{ \item You don't always care about it. There is a lot of esoteric information in the \code{drive_resource} that has little value for most users. \item It might be "expensive" to get this information and put it into a usable form. For example, revealing a file's \code{"path"}, \code{"permissions"}, or \code{"published"} status all require additional API calls. } \code{drive_reveal()} can also \strong{hoist} any property out of the \code{drive_resource} list-column, when the property's name is passed as the \code{what} argument. The resulting new column is simplified if it is easy to do so, e.g., if the individual elements are all string or logical. If \code{what} extracts a date-time, we return \code{\link[=DateTimeClasses]{POSIXct}}. Otherwise, you'll get a list-column. If this makes you sad, consider using \code{tidyr::hoist()} instead. It is more powerful due to a richer "plucking specification" and its \code{ptype} and \code{transform} arguments. Another useful function is \code{tidyr::unnest_wider()}. } \section{File path}{ When \code{what = "path"} the \code{\link{dribble}} gains a character column holding each file's path. This can be \emph{very slow}, so use with caution. The example path \verb{~/a/b/} illustrates two conventions used in googledrive: \itemize{ \item The leading \verb{~/} means that the folder \code{a} is located in the current user's "My Drive" root folder. \item The trailing \code{/} means that \code{b}, located in \code{a}, is \emph{a folder or a folder shortcut}. } } \section{Permissions}{ When \code{what = "permissions"} the \code{\link{dribble}} gains a logical column \code{shared} that indicates whether a file is shared and a new list-column \code{permissions_resource} containing lists of \href{https://developers.google.com/drive/api/v3/reference/permissions}{Permissions resources}. } \section{Publishing}{ When \code{what = "published"} the \code{\link{dribble}} gains a logical column \code{published} that indicates whether a file is published and a new list-column \code{revision_resource} containing lists of \href{https://developers.google.com/drive/api/v3/reference/revisions}{Revisions resources}. } \section{Parent}{ When \code{what = "parent"} the \code{\link{dribble}} gains a character column \code{id_parent} that is the file id of this item's parent folder. This information is available in the \code{drive_resource}, but can't just be hoisted out: \itemize{ \item Google Drive used to allow files to have multiple parents, but this is no longer supported and googledrive now assumes this is impossible. However, we have seen (very old) files that still have >1 parent folder. If we see this we message about it and drop all but the first parent. \item The \code{parents} property in \code{drive_resource} has an "extra" layer of nesting and needs to be flattened. } If you really want the raw \code{parents} property, call \code{drive_reveal(what = "parents")}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Get a few of your files files <- drive_find(n_max = 10, trashed = NA) # the "special" cases that require additional API calls and can be slow drive_reveal(files, "path") drive_reveal(files, "permissions") drive_reveal(files, "published") # a "special" case of digging info out of `drive_resource`, then processing # a bit drive_reveal(files, "parent") # the "simple" cases of digging info out of `drive_resource` drive_reveal(files, "trashed") drive_reveal(files, "mime_type") drive_reveal(files, "starred") drive_reveal(files, "description") drive_reveal(files, "version") drive_reveal(files, "web_view_link") drive_reveal(files, "modified_time") drive_reveal(files, "created_time") drive_reveal(files, "owned_by_me") drive_reveal(files, "size") drive_reveal(files, "quota_bytes_used") # 'root' is a special file id that represents your My Drive root folder drive_get(id = "root") \%>\% drive_reveal("path") \dontshow{\}) # examplesIf} } \seealso{ To learn more about the properties present in the metadata of a Drive file (which is what's in the \code{drive_resource} list-column of a \code{\link{dribble}}), see the API docs: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files#resource-representations} } } googledrive/man/drive_examples.Rd0000644000176200001440000000276514071171077016650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_examples.R \name{drive_examples} \alias{drive_examples} \alias{drive_examples_local} \alias{drive_examples_remote} \alias{drive_example_local} \alias{drive_example_remote} \title{Example files} \usage{ drive_examples_local(matches) drive_examples_remote(matches) drive_example_local(matches) drive_example_remote(matches) } \arguments{ \item{matches}{A regular expression that matches the name of the desired example file(s). This argument is optional for the plural forms (\code{drive_examples_local()} and \code{drive_examples_remote()} and, if provided, multiple matches are allowed. The single forms (\code{drive_example_local()} and \code{drive_example_reomote()} require this argument and require that there is exactly one match.} } \value{ \itemize{ \item For \code{drive_example_local()} and \code{drive_examples_local()}, one or more local filepaths. \item For \code{drive_example_remote()} and \code{drive_examples_remote()}, a \code{dribble}. } } \description{ googledrive makes a variety of example files -- both local and remote -- available for use in examples and reprexes. These functions help you access the example files. See \code{vignette("example-files", package = "googledrive")} for more. } \examples{ drive_examples_remote() drive_examples_remote("chicken") drive_example_remote("chicken_doc") drive_examples_local() \%>\% basename() drive_examples_local("chicken") \%>\% basename() drive_example_local("imdb") } googledrive/man/drive_rename.Rd0000644000176200001440000000564514070147664016305 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_rename.R \name{drive_rename} \alias{drive_rename} \title{Rename a Drive file} \usage{ drive_rename(file, name = NULL, overwrite = NA, verbose = deprecated()) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{name}{Character. Name you would like the file to have.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ This is a wrapper for \code{\link[=drive_mv]{drive_mv()}} that only renames a file. If you would like to rename AND move the file, see \code{\link[=drive_mv]{drive_mv()}}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a file to rename file <- drive_create("file-to-rename") # Rename it file <- drive_rename(file, name = "renamed-file") # `overwrite = FALSE` errors if something already exists at target filepath # THIS WILL ERROR! drive_create("name-squatter") drive_rename(file, name = "name-squatter", overwrite = FALSE) # `overwrite = TRUE` moves the existing item to trash, then proceeds file <- drive_rename(file, name = "name-squatter", overwrite = TRUE) # Clean up drive_rm(file) \dontshow{\}) # examplesIf} } googledrive/man/dribble.Rd0000644000176200001440000000272114070147664015240 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dribble.R \name{dribble} \alias{dribble} \title{dribble object} \description{ googledrive stores the metadata for one or more Drive files or shared drives as a \code{dribble}. It is a "Drive \link[tibble:tibble-package]{tibble}" with one row per file or shared drive and, at a minimum, these columns: \itemize{ \item \code{name}: a character column containing file or shared drive names \item \code{id}: a character column of file or shared drive ids \item \code{drive_resource}: a list-column, each element of which is either a \href{https://developers.google.com/drive/api/v3/reference/files#resource-representations}{Files resource} or a \href{https://developers.google.com/drive/api/v3/reference/drives#resource-representations}{Drives resource} object. Note there is no guarantee that all documented fields are always present. We do check if the \code{kind} field is present and equal to one of \code{drive#file} or \code{drive#drive}. } The \code{dribble} format is handy because it exposes the file name, which is good for humans, but keeps it bundled with the file's unique id and other metadata, which are needed for API calls. In general, the \code{dribble} class will be retained even after manipulation, as long as the required variables are present and of the correct type. This works best for manipulations via the dplyr and vctrs packages. } \seealso{ \code{\link[=as_dribble]{as_dribble()}} } googledrive/man/shared_drive_update.Rd0000644000176200001440000000332414070147664017636 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared_drive_update.R \name{shared_drive_update} \alias{shared_drive_update} \title{Update a shared drive} \usage{ shared_drive_update(shared_drive, ...) } \arguments{ \item{shared_drive}{Anything that identifies one specific shared drive: its name, its id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. The value provided to \code{shared_drive} is pre-processed with \code{\link[=as_shared_drive]{as_shared_drive()}}. Read more about \link[=shared_drives]{shared drives}.} \item{...}{Properties to set in \code{name = value} form. See the "Request body" section of the Drive API docs for this endpoint.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per shared drive. } \description{ Update the metadata of an existing shared drive, e.g. its background image or theme. A shared drive supports files owned by an organization rather than an individual user. Shared drives follow different sharing and ownership models from a specific user's "My Drive". Shared drives are the successors to the earlier concept of Team Drives. Learn more about \link[=shared_drives]{shared drives}. } \examples{ \dontrun{ # create a shared drive sd <- shared_drive_create("I love themes!") # see the themes available to you themes <- drive_about()$driveThemes purrr::map_chr(themes, "id") # cycle through various themes for this shared drive sd <- shared_drive_update(sd, themeId = "bok_choy") sd <- shared_drive_update(sd, themeId = "cocktails") # clean up shared_drive_rm(sd) } } \seealso{ Wraps the \code{drives.update} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/drives/update} } } googledrive/man/dribble-checks.Rd0000644000176200001440000000271214070147664016476 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dribble.R \name{dribble-checks} \alias{dribble-checks} \alias{is_dribble} \alias{no_file} \alias{single_file} \alias{some_files} \alias{confirm_dribble} \alias{confirm_single_file} \alias{confirm_some_files} \alias{is_folder} \alias{is_shortcut} \alias{is_folder_shortcut} \alias{is_native} \alias{is_parental} \alias{is_mine} \alias{is_shared_drive} \title{Check facts about a dribble} \usage{ is_dribble(d) no_file(d) single_file(d) some_files(d) confirm_dribble(d) confirm_single_file(d) confirm_some_files(d) is_folder(d) is_shortcut(d) is_folder_shortcut(d) is_native(d) is_parental(d) is_mine(d) is_shared_drive(d) } \arguments{ \item{d}{A \code{\link{dribble}}.} } \description{ Sometimes you need to check things about a \code{\link{dribble}}` or about the files it represents, such as: \itemize{ \item Is it even a dribble? \item Size: Does the dribble hold exactly one file? At least one file? No file? \item File type: Is this file a folder? \item File ownership and access: Is it mine? Published? Shared? } } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} ## most of us have multiple files or folders on Google Drive d <- drive_find() is_dribble(d) no_file(d) single_file(d) some_files(d) # this will error # confirm_single_file(d) confirm_some_files(d) is_folder(d) is_mine(d) \dontshow{\}) # examplesIf} } googledrive/man/as_id.Rd0000644000176200001440000000155414071401260014701 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_id-class.R \name{as_id} \alias{as_id} \title{Extract and/or mark as file id} \usage{ as_id(x, ...) } \arguments{ \item{x}{A character vector of file or shared drive ids or URLs, a \code{\link{dribble}}, or a suitable data frame.} \item{...}{Other arguments passed down to methods. (Not used.)} } \value{ A character vector bearing the S3 class \code{drive_id}. } \description{ Gets file ids from various inputs and marks them as such, to distinguish them from file names or paths. This is a generic function. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} as_id("123abc") as_id("https://docs.google.com/spreadsheets/d/qawsedrf16273849/edit#gid=12345") x <- drive_find(n_max = 3) as_id(x) \dontshow{\}) # examplesIf} } googledrive/man/drive_token.Rd0000644000176200001440000000234714070147664016152 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_auth.R \name{drive_token} \alias{drive_token} \title{Produce configured token} \usage{ drive_token() } \value{ A \code{request} object (an S3 class provided by \link[httr:httr-package]{httr}). } \description{ For internal use or for those programming around the Drive API. Returns a token pre-processed with \code{\link[httr:config]{httr::config()}}. Most users do not need to handle tokens "by hand" or, even if they need some control, \code{\link[=drive_auth]{drive_auth()}} is what they need. If there is no current token, \code{\link[=drive_auth]{drive_auth()}} is called to either load from cache or initiate OAuth2.0 flow. If auth has been deactivated via \code{\link[=drive_deauth]{drive_deauth()}}, \code{drive_token()} returns \code{NULL}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} req <- request_generate( "drive.files.get", list(fileId = "abc"), token = drive_token() ) req \dontshow{\}) # examplesIf} } \seealso{ Other low-level API functions: \code{\link{drive_has_token}()}, \code{\link{request_generate}()}, \code{\link{request_make}()} } \concept{low-level API functions} googledrive/man/shortcut_create.Rd0000644000176200001440000000741614071171077017035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shortcut.R \name{shortcut_create} \alias{shortcut_create} \title{Create a shortcut to a Drive file} \usage{ shortcut_create(file, path = NULL, name = NULL, overwrite = NA) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{path}{Target destination for the new shortcut, i.e. a folder or a shared drive. Can be given as an actual path (character), a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. Defaults to your "My Drive" root folder. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder.} \item{name}{Character, new shortcut name if not specified as part of \code{path}. This will force \code{path} to be interpreted as a folder, even if it is character and lacks a trailing slash. By default, the shortcut starts out with the same name as the target \code{file}. As a consequence, if you want to use \code{overwrite = TRUE} or \code{overwrite = FALSE}, you \strong{must} explicitly specify the shortcut's \code{name}.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Creates a shortcut to the target Drive \code{file}, which could be a folder. A Drive shortcut functions like a symbolic or "soft" link and is primarily useful for creating a specific Drive user experience in the browser, i.e. to make a Drive file or folder appear in more than 1 place. Shortcuts are a relatively new feature in Drive; they were introduced when Drive stopped allowing a file to have more than 1 parent folder. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Target one of the official example files (src_file <- drive_example_remote("chicken_sheet")) # Create a shortcut in the default location with the default name sc1 <- shortcut_create(src_file) # This shortcut could now be moved, renamed, etc. # Create a shortcut in the default location with a custom name sc2 <- src_file \%>\% shortcut_create(name = "chicken_sheet_second_shortcut") # Create a folder, then put a shortcut there, with default name folder <- drive_mkdir("chicken_sheet_shortcut_folder") sc3 <- src_file \%>\% shortcut_create(folder) # Look at all these shortcuts (dat <- drive_find("chicken_sheet", type = "shortcut")) # Confirm the shortcuts all target the original file dat <- dat \%>\% drive_reveal("shortcut_details") purrr::map_chr(dat$shortcut_details, "targetId") as_id(src_file) # Clean up drive_rm(sc1, sc2, sc3, folder) \dontshow{\}) # examplesIf} } \seealso{ \itemize{ \item \url{https://developers.google.com/drive/api/v3/shortcuts} } } googledrive/man/shared_drives.Rd0000644000176200001440000001245514070147664016464 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared_drives.R \name{shared_drives} \alias{shared_drives} \title{Access shared drives} \description{ A shared drive supports files owned by an organization rather than an individual user. Shared drives follow different sharing and ownership models from a specific user's "My Drive". Shared drives are the successors to the earlier concept of Team Drives. How to capture a shared drive or files/folders that live on a shared drive for downstream use: \itemize{ \item \code{\link[=shared_drive_find]{shared_drive_find()}} and \code{\link[=shared_drive_get]{shared_drive_get()}} return a \code{\link{dribble}} with metadata on shared drives themselves. You will need this in order to use a shared drive in certain file operations. For example, you can specify a shared drive as the parent folder via the \code{path} argument for upload, move, copy, etc. In that context, the id of a shared drive functions like the id of its top-level or root folder. \item \code{\link[=drive_find]{drive_find()}} and \code{\link[=drive_get]{drive_get()}} return a \code{\link{dribble}} with metadata on files, including folders. Both can be directed to search for files on shared drives using the optional arguments \code{shared_drive} or \code{corpus} (documented below). } Regard the functions mentioned above as the official "port of entry" for working with shared drives. Use these functions to capture your target(s) in a \code{\link{dribble}} to pass along to other googledrive functions. The flexibility to refer to files by name or path does not apply as broadly to shared drives. While it's always a good idea to get things into a \code{\link{dribble}} early, for shared drives it's often required. } \section{Specific shared drive}{ To search one specific shared drive, pass its name, marked id, or \code{\link{dribble}} to \code{shared_drive} somewhere in the call, like so:\preformatted{drive_find(..., shared_drive = "i_am_a_shared_drive_name") drive_find(..., shared_drive = as_id("i_am_a_shared_drive_id")) drive_find(..., shared_drive = i_am_a_shared_drive_dribble) } The value provided to \code{shared_drive} is pre-processed with \code{\link[=as_shared_drive]{as_shared_drive()}}. } \section{Other collections}{ To search other collections, pass the \code{corpus} parameter somewhere in the call, like so:\preformatted{drive_find(..., corpus = "user") drive_find(..., corpus = "allDrives") drive_find(..., corpus = "domain") } Possible values of \code{corpus} and what they mean: \itemize{ \item \code{"user"}: Queries files that the user has accessed, including both shared drive and My Drive files. \item \code{"drive"}: Queries all items in the shared drive specified via \code{shared_drive}. googledrive automatically fills this in whenever \code{shared_drive} is not \code{NULL}. \item \code{"allDrives"}: Queries files that the user has accessed and all shared drives in which they are a member. Note that the response may include \code{incompleteSearch : true}, indicating that some corpora were not searched for this request (currently, googledrive does not surface this). Prefer \code{"user"} or \code{"drive"} to \code{"allDrives"} for efficiency. \item \code{"domain"}: Queries files that are shared to the domain, including both shared drive and My Drive files. } } \section{Google blogs and docs}{ Here is some of the best official Google reading about shared drives: \itemize{ \item \href{https://workspaceupdates.googleblog.com/2019/04/shared-drives.html}{Team Drives is being renamed to shared drives} from Google Workspace blog \item \href{https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api}{Upcoming changes to the Google Drive API and Google Picker API} from the Google Cloud blog \item \url{https://developers.google.com/drive/api/v3/about-shareddrives} \item \url{https://developers.google.com/drive/api/v3/shared-drives-diffs} \item \href{https://support.google.com/a/users/answer/9310351}{Get started with shared drives} from Google Workspace Learning Center \item \href{https://support.google.com/a/users/answer/9310156}{Best practices for shared drives} from Google Workspace Learning Center } } \section{API docs}{ googledrive implements shared drive support as outlined here: \itemize{ \item \url{https://developers.google.com/drive/api/v3/enable-shareddrives} } Users shouldn't need to know any of this, but here are details for the curious. The extra information needed to search shared drives consists of the following query parameters: \itemize{ \item \code{corpora}: Where to search? Formed from googledrive's \code{corpus} argument. \item \code{driveId}: The id of a specific shared drive. Only allowed -- and also absolutely required -- when \code{corpora = "drive"}. When user specifies a \code{shared_drive}, googledrive sends its id and also infers that \code{corpora} should be set to \code{"drive"}. \item \code{includeItemsFromAllDrives}: Do you want to see shared drive items? Obviously, this should be \code{TRUE} and googledrive sends this whenever shared drive parameters are detected. \item \code{supportsAllDrives}: Does the sending application (googledrive, in this case) know about shared drive? Obviously, this should be \code{TRUE} and googledrive sends it for all applicable endpoints, all the time. } } googledrive/man/as_dribble.Rd0000644000176200001440000000501214071404512015704 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dribble.R \name{as_dribble} \alias{as_dribble} \title{Coerce to a \code{dribble}} \usage{ as_dribble(x, ...) } \arguments{ \item{x}{A vector of Drive file paths, a vector of file ids marked with \code{\link[=as_id]{as_id()}}, a list of Files Resource objects, or a suitable data frame.} \item{...}{Other arguments passed down to methods. (Not used.)} } \description{ Converts various representations of Google Drive files into a \code{\link{dribble}}, the object used by googledrive to hold Drive file metadata. Files can be specified via: \itemize{ \item File path. File name is an important special case. \item File id. Mark with \code{\link[=as_id]{as_id()}} to distinguish from file path. \item Data frame or \code{\link{dribble}}. Once you've successfully used googledrive to identify the files of interest, you'll have a \code{\link{dribble}}. Pass it into downstream functions. \item List representing \href{https://developers.google.com/drive/api/v3/reference/files}{Files resource} objects. Mostly for internal use. } This is a generic function. For maximum clarity, get your files into a \code{\link{dribble}} (or capture file id) as early as possible. When specifying via path, it's best to include the trailing slash when you're targetting a folder. If you want the folder \code{foo}, say \verb{foo/}, not \code{foo}. Some functions, such as \code{\link[=drive_cp]{drive_cp()}}, \code{\link[=drive_mkdir]{drive_mkdir()}}, \code{\link[=drive_mv]{drive_mv()}}, and \code{\link[=drive_upload]{drive_upload()}}, can accept the new file or folder name as the last part of \code{path}, when \code{name} is not given. But if you say \code{a/b/c} (no trailing slash) and a folder \verb{a/b/c/} already exists, it's unclear what you want. A file named \code{c} in \verb{a/b/} or a file with default name in \verb{a/b/c/}? You get an error and must make your intent clear. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # create some files for us to re-discover by name or filepath alfa <- drive_create("alfa", type = "folder") bravo <- drive_create("bravo", path = alfa) # as_dribble() can work with file names or paths as_dribble("alfa") as_dribble("bravo") as_dribble("alfa/bravo") as_dribble(c("alfa", "alfa/bravo")) # specify the file id (substitute a real file id of your own!) # as_dribble(as_id("0B0Gh-SuuA2nTOGZVTXZTREgwZ2M")) # cleanup drive_find("alfa") \%>\% drive_rm() \dontshow{\}) # examplesIf} } googledrive/man/drive_rm.Rd0000644000176200001440000000412414071404512015430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_rm.R \name{drive_rm} \alias{drive_rm} \title{Delete files from Drive} \usage{ drive_rm(..., verbose = deprecated()) } \arguments{ \item{...}{One or more Drive files, specified in any valid way, i.e. as a \code{\link{dribble}}, by name or path, or by file id or URL marked with \code{\link[=as_id]{as_id()}}. Or any combination thereof. Elements are processed with \code{\link[=as_dribble]{as_dribble()}} and row-bound prior to deletion.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ Logical vector, indicating whether the delete succeeded. } \description{ Caution: this will permanently delete your files! For a safer, reversible option, see \code{\link[=drive_trash]{drive_trash()}}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Target one of the official example files to copy (then remove) (src_file <- drive_example_remote("chicken.txt")) # Create a copy, then remove it by name src_file \%>\% drive_cp(name = "chicken-rm.txt") drive_rm("chicken-rm.txt") # Create several more copies x1 <- src_file \%>\% drive_cp(name = "chicken-abc.txt") drive_cp(src_file, name = "chicken-def.txt") x2 <- src_file \%>\% drive_cp(name = "chicken-ghi.txt") # Remove the copies all at once, specified in different ways drive_rm(x1, "chicken-def.txt", as_id(x2)) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{files.delete} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/delete} } } googledrive/man/drive_find.Rd0000644000176200001440000001637614070147664015761 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_find.R \name{drive_find} \alias{drive_find} \title{Find files on Google Drive} \usage{ drive_find( pattern = NULL, trashed = FALSE, type = NULL, n_max = Inf, shared_drive = NULL, corpus = NULL, ..., verbose = deprecated(), team_drive = deprecated() ) } \arguments{ \item{pattern}{Character. If provided, only the items whose names match this regular expression are returned. This is implemented locally on the results returned by the API.} \item{trashed}{Logical. Whether to search files that are not in the trash (\code{trashed = FALSE}, the default), only files that are in the trash (\code{trashed = TRUE}), or to search regardless of trashed status (\code{trashed = NA}).} \item{type}{Character. If provided, only files of this type will be returned. Can be anything that \code{\link[=drive_mime_type]{drive_mime_type()}} knows how to handle. This is processed by googledrive and sent as a query parameter.} \item{n_max}{Integer. An upper bound on the number of items to return. This applies to the results requested from the API, which may be further filtered locally, via the \code{pattern} argument.} \item{shared_drive}{Anything that identifies one specific shared drive: its name, its id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. The value provided to \code{shared_drive} is pre-processed with \code{\link[=as_shared_drive]{as_shared_drive()}}. Read more about \link[=shared_drives]{shared drives}.} \item{corpus}{Character, specifying which collections of items to search. Relevant to those who work with shared drives and/or Google Workspace domains. If specified, must be one of \code{"user"}, \code{"drive"} (requires that \code{shared_drive} also be specified), \code{"allDrives"}, or \code{"domain"}. Read more about \link[=shared_drives]{shared drives}.} \item{...}{Other parameters to pass along in the request. The most likely candidate is \code{q}. See below and the API's \href{https://developers.google.com/drive/api/v3/search-files}{Search for files and folders guide}.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} \item{team_drive}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Google Drive and the Drive API have replaced Team Drives with shared drives.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ This is the closest googledrive function to what you can do at \url{https://drive.google.com}: by default, you just get a listing of your files. You can also search in various ways, e.g., filter by file type or ownership or work with \link[=shared_drives]{shared drives}. This is a very powerful function. Together with the more specific \code{\link[=drive_get]{drive_get()}}, this is the main way to identify files to target for downstream work. If you know you want to search within a specific folder or shared drive, use \code{\link[=drive_ls]{drive_ls()}}. } \section{File type}{ The \code{type} argument is pre-processed with \code{\link[=drive_mime_type]{drive_mime_type()}}, so you can use a few shortcuts and file extensions, in addition to full-blown MIME types. googledrive forms a search clause to pass to \code{q}. } \section{Search parameters}{ Do advanced search on file properties by providing search clauses to the \code{q} parameter that is passed to the API via \code{...}. Multiple \code{q} clauses or vector-valued \code{q} are combined via 'and'. } \section{Trash}{ By default, \code{drive_find()} sets \code{trashed = FALSE} and does not include files in the trash. Literally, it adds \code{q = "trashed = false"} to the query. To search \emph{only} the trash, set \code{trashed = TRUE}. To see files regardless of trash status, set \code{trashed = NA}, which adds \code{q = "(trashed = true or trashed = false)"} to the query. } \section{Sort order}{ By default, \code{drive_find()} sends \code{orderBy = "recency desc"}, so the top files in your result have high "recency" (whatever that means). To suppress sending \code{orderBy} at all, do \code{drive_find(orderBy = NULL)}. The \code{orderBy} parameter accepts sort keys in addition to \code{recency}, which are documented in the \href{https://developers.google.com/drive/api/v3/reference/files/list}{\code{files.list} endpoint}. googledrive translates a snake_case specification of \code{order_by} into the lowerCamel form, \code{orderBy}. } \section{Shared drives and domains}{ If you work with shared drives and/or Google Workspace, you can apply your search query to collections of items beyond those associated with "My Drive". Use the \code{shared_drive} or \code{corpus} arguments to control this. Read more about \link[=shared_drives]{shared drives}. } \examples{ \dontrun{ # list "My Drive" w/o regard for folder hierarchy drive_find() # filter for folders, the easy way and the hard way drive_find(type = "folder") drive_find(q = "mimeType = 'application/vnd.google-apps.folder'") # filter for Google Sheets, the easy way and the hard way drive_find(type = "spreadsheet") drive_find(q = "mimeType='application/vnd.google-apps.spreadsheet'") # files whose names match a regex # the local, general, sometimes-slow-to-execute version drive_find(pattern = "ick") # the server-side, executes-faster version # NOTE: works only for a pattern at the beginning of file name drive_find(q = "name contains 'chick'") # search for files located directly in your root folder drive_find(q = "'root' in parents") # FYI: this is equivalent to drive_ls("~/") # control page size or cap the number of files returned drive_find(pageSize = 50) # all params passed through `...` can be camelCase or snake_case drive_find(page_size = 50) drive_find(n_max = 58) drive_find(page_size = 5, n_max = 15) # various ways to specify q search clauses # multiple q's drive_find(q = "name contains 'TEST'", q = "modifiedTime > '2020-07-21T12:00:00'") # vector q drive_find(q = c("starred = true", "visibility = 'anyoneWithLink'")) # default `trashed = FALSE` excludes files in the trash # `trashed = TRUE` consults ONLY file in the trash drive_find(trashed = TRUE) # `trashed = NA` disregards trash status completely drive_find(trashed = NA) # suppress the default sorting on recency drive_find(order_by = NULL, n_max = 5) # sort on various keys drive_find(order_by = "modifiedByMeTime", n_max = 5) # request descending order drive_find(order_by = "quotaBytesUsed desc", n_max = 5) } } \seealso{ Wraps the \code{files.list} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/list} } Helpful resource for forming your own queries: \itemize{ \item \url{https://developers.google.com/drive/api/v3/search-files} } } googledrive/man/drive_browse.Rd0000644000176200001440000000145314070147664016330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_browse.R \name{drive_browse} \alias{drive_browse} \title{Visit Drive file in browser} \usage{ drive_browse(file = .Last.value) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} } \value{ Character vector of file hyperlinks, from \code{\link[=drive_link]{drive_link()}}, invisibly. } \description{ Visits a file on Google Drive in your default browser. } \examples{ \dontshow{if (drive_has_token() && rlang::is_interactive()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} drive_find(n_max = 1) \%>\% drive_browse() \dontshow{\}) # examplesIf} } googledrive/man/drive_mv.Rd0000644000176200001440000001051614071404512015436 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_mv.R \name{drive_mv} \alias{drive_mv} \title{Move a Drive file} \usage{ drive_mv( file, path = NULL, name = NULL, overwrite = NA, verbose = deprecated() ) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{path}{Specifies target destination for the file on Google Drive. Can be an actual path (character), a file id marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder. If \code{path} is given as a path (as opposed to a \code{dribble} or an id), it is best to explicitly indicate if it's a folder by including a trailing slash, since it cannot always be worked out from the context of the call. By default, the file stays in its current folder.} \item{name}{Character, new file name if not specified as part of \code{path}. This will force \code{path} to be interpreted as a folder, even if it is character and lacks a trailing slash. By default, the file keeps its current name.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Move a Drive file to a different folder, give it a different name, or both. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # create a file to move file <- drive_example_remote("chicken.txt") \%>\% drive_cp("chicken-mv.txt") # rename it, but leave in current folder (root folder, in this case) file <- drive_mv(file, "chicken-mv-renamed.txt") # create a folder to move the file into folder <- drive_mkdir("mv-folder") # move the file and rename it again, # specify destination as a dribble file <- drive_mv(file, path = folder, name = "chicken-mv-re-renamed.txt") # verify renamed file is now in the folder drive_ls(folder) # move the file back to root folder file <- drive_mv(file, "~/") # move it again # specify destination as path with trailing slash # to ensure we get a move vs. renaming it to "mv-folder" file <- drive_mv(file, "mv-folder/") # `overwrite = FALSE` errors if something already exists at target filepath # THIS WILL ERROR! drive_create("name-squatter", path = "~/") drive_mv(file, path = "~/", name = "name-squatter", overwrite = FALSE) # `overwrite = TRUE` moves the existing item to trash, then proceeds drive_mv(file, path = "~/", name = "name-squatter", overwrite = TRUE) # Clean up drive_rm(file, folder) \dontshow{\}) # examplesIf} } \seealso{ Makes a metadata-only request to the \code{files.update} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/update} } } googledrive/man/drive_update.Rd0000644000176200001440000000530414071404512016275 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_update.R \name{drive_update} \alias{drive_update} \title{Update an existing Drive file} \usage{ drive_update(file, media = NULL, ..., verbose = deprecated()) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{media}{Character, path to the local file to upload.} \item{...}{Named parameters to pass along to the Drive API. Has \link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by specifying properties of the Files resource via \code{...}. Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Update an existing Drive file id with new content ("media" in Drive API-speak), new metadata, or both. To create a new file or update existing, depending on whether the Drive file already exists, see \code{\link[=drive_put]{drive_put()}}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a new file, so we can update it x <- drive_example_remote("chicken.csv") \%>\% drive_cp() # Update the file with new media x <- x \%>\% drive_update(drive_example_local("chicken.txt")) # Update the file with new metadata. # Notice here `name` is not an argument of `drive_update()`, we are passing # this to the API via the `...`` x <- x \%>\% drive_update(name = "CHICKENS!") # Update the file with new media AND new metadata x <- x \%>\% drive_update( drive_example_local("chicken.txt"), name = "chicken-poem-again.txt" ) # Clean up drive_rm(x) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{files.update} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/update} } This function supports media upload: \itemize{ \item \url{https://developers.google.com/drive/api/v3/manage-uploads} } } googledrive/man/drive_deauth.Rd0000644000176200001440000000214014041617517016270 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_auth.R \name{drive_deauth} \alias{drive_deauth} \title{Suspend authorization} \usage{ drive_deauth() } \description{ Put googledrive into a de-authorized state. Instead of sending a token, googledrive will send an API key. This can be used to access public resources for which no Google sign-in is required. This is handy for using googledrive in a non-interactive setting to make requests that do not require a token. It will prevent the attempt to obtain a token interactively in the browser. The user can configure their own API key via \code{\link[=drive_auth_configure]{drive_auth_configure()}} and retrieve that key via \code{\link[=drive_api_key]{drive_api_key()}}. In the absence of a user-configured key, a built-in default key is used. } \examples{ \dontrun{ drive_deauth() drive_user() public_file <- drive_get(as_id("1Hj-k7NpPSyeOR3R7j4KuWnru6kZaqqOAE8_db5gowIM")) drive_download(public_file) } } \seealso{ Other auth functions: \code{\link{drive_auth_configure}()}, \code{\link{drive_auth}()} } \concept{auth functions} googledrive/man/figures/0000755000176200001440000000000014070147664015010 5ustar liggesusersgoogledrive/man/figures/lifecycle-defunct.svg0000644000176200001440000000170414070147664021120 0ustar liggesuserslifecyclelifecycledefunctdefunct googledrive/man/figures/lifecycle-maturing.svg0000644000176200001440000000170614070147664021320 0ustar liggesuserslifecyclelifecyclematuringmaturing googledrive/man/figures/logo.png0000644000176200001440000002316013422430463016450 0ustar liggesusersPNG  IHDRxb]egAMA a cHRMz&u0`:pQ<bKGD pHYs!7!73XztIME %/B%_IDATxyx\řuN.ٖm7,ff L I2˝$O2ɝ{'7I ka3fY/x-[lkWrN?tKmuKI-xmSN`$cm=| 0_{YP 8!$0:  XGځ==j>9gZ\.M?4ʢLb7LG&\/p5p70{$_.  5Ip76lp., ^()! *Q5~0$:gw_r~w98@4 6HFb;A`Ghg; ;먱mH.W)hvuq S?nC@Kh= & 8 zJjm#F2Xg_/`ؓ<| &VNG{YUMˑvmiQ:E-Ïx*+ 5gebJdRYr 7f=Ė;ٿ ou*_98zb4hfڎJ< t: QÞwᔟ-HrtHF @_9 ϫeÀ%X,B%*B%.QY>HH$} ؘ>:D DTjf`lNkSҝT0+l*|x x؟>:D.e/):Kc(+5+s7&~YR$ *уGpwϞGog5pa`ns@HUn<{sƁ"Y|42@PAG x@bH_ ,y$v,p x\͚^j(OyPeCx.+;*FLhJ ,y| -} 5_Ƴ{{Rpې˒LJ2 H˗H!F%3}8}lW|m^٣Qɒ@[ƻ?oadɁ<21” t{-Y<7@1Էv$у$K_a%)AL b8l׶4A 3\܆ $K]ۣEP02aFJ+ Y|e ƕLH)ixrn[.U30Y2{5Z+{MI5M宋2wB9RJi&acw{Ća}e晌 ғqj6"Vb10 4I,d]]3u'D,n ?,eAԱbTtJ(}ޔ-oR}Dщrw|Ν3ÎR}'$$եnΝ1ɕ^;#tE{X@hJpqXMosUER*@a1j*>?B?L;9Jb,RĺKA nN+ˆ0MDuF4l4%)51,=b]+&8t2 ym[CMuŃ^6=qG[aP֭t&tkJ=ʚGA7Flɩ.ZZJAH)4ܰw9736& >XSV.ErjRH:u<͋8FH+ 7Է9n{Xoχ )%.Ns߹.?"FRyOp7z[-{~n$v첞ӪFܬ'l;^[bfY2oCaC]ゼ&5 kӧ1gBC}ӔēƑ8)WK8 e# Kte v'r^ M**GȐ8  {/y}GEkpW=7ݿxHy?'ѺZ1'O-!k0L)㲳W?]!Hyq^}!&.ֆv~PnoO0X#卭YR0ol]d]zH`,MȆ,Xv[t4- r )wuFy֮p&tC"Dcy?L M&E4aJZr`d O.y9p|N&D#6rm8&t~(8quZײ?rȦL 6LV̭f_> ~|ѵ=c,#+6fM(1$ϑI0P\dRƕP]^Ȍ!MJpo~xiC0 hZD̟3sK (t3ģVd< r|g eSr/zobnv6cXzc뤼M0iǓ6tM#OTyoB7&bts,o-P^䦤I4i$&VyT)3L$aiDIVک,*I$3L"eS)p0H]+L8{1nrĒAeF+?٧V5)ēzw!B65%ƨb Bq#^wore393,"4X_^'3M~Q={79)R͝a^Wmf_kWIe|9;B7Iäk ,%8מ~-͌RiC;?Ff/oNݿyMs礪Rx>+VSR$0X[_G{ZeӸպd1%L|,yc+{ K2{|"w^8y58:(ϯW?3/}\o߆M׸粅ǒq=M'U-"QӅΒiU4]njIƗy9czAJ jX1gu|y._Êxh:Qn8s:y)0"qΛS?^El>8M)|9lVPUӦ 0-f|7ߢJOϯ,Kgs _՛8mg0?^eo'Ou!߸x>5;8{Dwb;))8 HHמ̱e<~-޼_z.w^4;O{W.qï}W-_>G*H$MINbmm7ݿ=͝ ϙjNϬ&sg6b֜K%yԌ*߾C_vZO=֧`W:vs&0uKN7?eGjWHM#KM|zCͯN^+iJ~lk!IX~mgɴ*-UaJN_)Y)LU/_f{{;BE'"B-XJFpru9j5 p zkҨ")aws'e,&?q_8ll?Hg]ȄPqf+ft j* ǒ xFkg&\[HMAIæuLUJI76tmdĊBM~e6=+sϥ X1--y(.pܺDb N:Ӕ:u o8#~Ǖy.a̦  ]v ]v:"^7I_F{ @k攩9 MgA(N[:u_ņMY74ͅgo!hɘ&L QŔzHk톶MSǔ0ڊ|u9*c8H OiLI))8goK';1*!RUWU]>ɴ:B1Z|!Zp=-8mއWrѧ1__G&rɂtM0&A!?.΄¬\Ǿ+v勘Q]֔LUwXiOm^2o^4'&&NeҨ"΃>vFfORO* bgFy]w\8gU6eJ* 勨*)m@lbΚV)EM5$/oK4mlW˦ t LX)hX^>}!9m*W:XZ{ F~\Nn{Dӵ#~avvNVuċtomi a9c,X֮H2 ^SFsxv~arxt6'O[,㾯,e2bLۖfQvvY t77rsy;j>:C1N=i v]c_[R3[5@?OG_z.Kgg͎I*,wv__LS=ԚvEX2eўL¦w/􋌇=puM~M@Jwx`4׻[<䚝l?&V2?Ɂ} w>W6kSpт|Tϟ{.!i$M4A!_~`tb.? # ^ZASo񽝄I}xw_:)@G?Vm%^FYA;B{]*v+3K$/ArIE_0r=/0L{h1Ô%{M0 m+*{3QhΛHG{[ LYknohg61Wuk:7He916K UM%S:PغNē>˪1|hֿŒu 5#cIlq3D$eqYөk㠏HkS89˸N½@%0.[(!Z!{XlTۺK+̈́@fV% :P֜nSDAgCMiﵕ{ >NB0Xb DF burڈ}wmxAB-`ٽm~|X D2K--| epy4;# /eHQ~6 5GՏr>5ٱhQBsT&"NlYM2׀I Kx9 ]GDX {\aw@k en3>p=PڻT>Y ˆ)3Ij:'_G‘K{,NEjmgPd\#J1T|jAl+ D,o=7q;N*/π}mn>ս Kx9lAnadDP Ӱxx 8>:rXLwwaRR5?9_Lj<Ms&*:gM$UD;(\El.埝#?K` }Դ hgsNVOBiGMl GLʹRT TV9<6l`beG0 Xy8y 4O=Frxl&ѓ_A{ZԄšJ&*=awvDŒrF7@l 't,dSJ'Yzq\ ;B"֟^@e6+|MDQ T7lne΢aB$>&%Ӫh4N8veϮT@lOxdvہi K@ *8z8@JNMێӦcivv Db?@2bMx˙^ <螎zɅn2"K(oQa,;' E.;/LDž!MZob:[ ٗmw8Ħ0kȒ&pt ,^UjlDn) n|)K^ Ć^^:[>N8!_f1֣) v:dIMR/&n8i늰q^kJxajYRJ\N;.awS'SǔI}+l;dMp;~2`ax`˒֒˽̫/DƁ]-Y^G$ )t] [)XB%*J, O!,ya,)%en&*fQH`"w@xKp eozӦ3ml ǖ4$n>ocSAl{DJ/7Xp̫Y[hlr$2j}$ `86YadZuM>[[aO+0o_p,Jbo0`YҮ~gM,7)dʒ۹eto02ʒo0rNeɔ0+}t#8޲ݨY%d_02`aB7^:ϡKl ]T9%tEXtdate:create2018-10-06T10:15:10-07:00@%tEXtdate:modify2018-10-06T10:14:37-07:00]IENDB`googledrive/man/figures/lifecycle-archived.svg0000644000176200001440000000170714070147664021260 0ustar liggesusers lifecyclelifecyclearchivedarchived googledrive/man/figures/lifecycle-questioning.svg0000644000176200001440000000171414070147664022036 0ustar liggesuserslifecyclelifecyclequestioningquestioning googledrive/man/figures/lifecycle-superseded.svg0000644000176200001440000000171314070147664021633 0ustar liggesusers lifecyclelifecyclesupersededsuperseded googledrive/man/figures/lifecycle-stable.svg0000644000176200001440000000167414070147664020750 0ustar liggesuserslifecyclelifecyclestablestable googledrive/man/figures/lifecycle-experimental.svg0000644000176200001440000000171614070147664022170 0ustar liggesuserslifecyclelifecycleexperimentalexperimental googledrive/man/figures/lifecycle-deprecated.svg0000644000176200001440000000171214070147664021567 0ustar liggesuserslifecyclelifecycledeprecateddeprecated googledrive/man/drive_put.Rd0000644000176200001440000000764214070147664015645 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_put.R \name{drive_put} \alias{drive_put} \title{PUT new media into a Drive file} \usage{ drive_put( media, path = NULL, name = NULL, ..., type = NULL, verbose = deprecated() ) } \arguments{ \item{media}{Character, path to the local file to upload.} \item{path}{Specifies target destination for the new file on Google Drive. Can be an actual path (character), a file id marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder. If \code{path} is given as a path (as opposed to a \code{dribble} or an id), it is best to explicitly indicate if it's a folder by including a trailing slash, since it cannot always be worked out from the context of the call. By default, the file is created in the current user's "My Drive" root folder.} \item{name}{Character, new file name if not specified as part of \code{path}. This will force \code{path} to be interpreted as a folder, even if it is character and lacks a trailing slash. Defaults to the file's local name.} \item{...}{Named parameters to pass along to the Drive API. Has \link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by specifying properties of the Files resource via \code{...}. Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.} \item{type}{Character. If \code{type = NULL}, a MIME type is automatically determined from the file extension, if possible. If the source file is of a suitable type, you can request conversion to Google Doc, Sheet or Slides by setting \code{type} to \code{document}, \code{spreadsheet}, or \code{presentation}, respectively. All non-\code{NULL} values for \code{type} are pre-processed with \code{\link[=drive_mime_type]{drive_mime_type()}}.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ PUTs new media into a Drive file, in the HTTP sense: \itemize{ \item If the file already exists, we replace its content. \item If the file does not already exist, we create a new file. } This is a convenience wrapper around \code{\link[=drive_upload]{drive_upload()}} and \code{\link[=drive_update]{drive_update()}}. In pseudo-code:\preformatted{target_filepath <- hits <- if (no hits) \{ drive_upload(media, path, name, type, ...) \} else if (exactly 1 hit) \{ drive_update(hit, media, ...) \} else \{ ERROR \} } } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # create a local file to work with local_file <- tempfile("drive_put_", fileext = ".txt") writeLines(c("beginning", "middle"), local_file) # PUT to a novel filepath --> drive_put() delegates to drive_upload() file <- drive_put(local_file) # update the local file cat("end", file = local_file, sep = "\n", append = TRUE) # PUT again --> drive_put() delegates to drive_update() file <- drive_put(local_file) # create a second file at this filepath file2 <- drive_create(basename(local_file)) # PUT again --> ERROR drive_put(local_file) # clean-up drive_find("drive_put_.+[.]txt") \%>\% drive_rm() unlink(local_file) \dontshow{\}) # examplesIf} } googledrive/man/drive_endpoints.Rd0000644000176200001440000000326413607405173017031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_endpoints.R \name{drive_endpoints} \alias{drive_endpoints} \alias{drive_endpoint} \title{List Drive endpoints} \usage{ drive_endpoints(i = NULL) drive_endpoint(i) } \arguments{ \item{i}{The name(s) or integer index(ices) of the endpoints to return. \code{i} is optional for \code{drive_endpoints()} and, if not given, the entire list is returned.} } \value{ One or more of the Drive API v3 endpoints that are used internally by googledrive. } \description{ The googledrive package stores a named list of Drive API v3 endpoints (or "methods", using Google's vocabulary) internally and these functions expose this data. \itemize{ \item \code{drive_endpoint()} returns one endpoint, i.e. it uses \code{[[}. \item \code{drive_endpoints()} returns a list of endpoints, i.e. it uses \code{[}. } The names of this list (or the \code{id} sub-elements) are the nicknames that can be used to specify an endpoint in \code{\link[=request_generate]{request_generate()}}. For each endpoint, we store its nickname or \code{id}, the associated HTTP verb, the \code{path}, and details about the parameters. This list is derived programmatically from the \href{https://www.googleapis.com/discovery/v1/apis/drive/v3/rest}{Drive API v3 Discovery Document} using the approach described in the \href{https://gargle.r-lib.org/articles/request-helper-functions.html#discovery-documents}{Discovery Documents section} of the gargle vignette \href{https://gargle.r-lib.org/articles/request-helper-functions.html}{Request helper functions}. } \examples{ str(head(drive_endpoints(), 3), max.level = 2) drive_endpoint("drive.files.delete") drive_endpoint(4) } googledrive/man/drive_has_token.Rd0000644000176200001440000000101214041617517016766 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_auth.R \name{drive_has_token} \alias{drive_has_token} \title{Is there a token on hand?} \usage{ drive_has_token() } \value{ Logical. } \description{ Reports whether googledrive has stored a token, ready for use in downstream requests. } \examples{ drive_has_token() } \seealso{ Other low-level API functions: \code{\link{drive_token}()}, \code{\link{request_generate}()}, \code{\link{request_make}()} } \concept{low-level API functions} googledrive/man/drive_mkdir.Rd0000644000176200001440000001020314071404512016113 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_mkdir.R \name{drive_mkdir} \alias{drive_mkdir} \title{Create a Drive folder} \usage{ drive_mkdir(name, path = NULL, ..., overwrite = NA, verbose = deprecated()) } \arguments{ \item{name}{Name for the new folder or, optionally, a path that specifies an existing parent folder, as well as the new name.} \item{path}{Target destination for the new folder, i.e. a folder or a shared drive. Can be given as an actual path (character), a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. Defaults to your "My Drive" root folder. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder.} \item{...}{Named parameters to pass along to the Drive API. Has \link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by specifying properties of the Files resource via \code{...}. Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Creates a new Drive folder. To update the metadata of an existing Drive file, including a folder, use \code{\link[=drive_update]{drive_update()}}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create folder named 'ghi', then another below named it 'jkl' and star it ghi <- drive_mkdir("ghi") jkl <- drive_mkdir("ghi/jkl", starred = TRUE) # is 'jkl' really starred? YES purrr::pluck(jkl, "drive_resource", 1, "starred") # Another way to create folder 'mno' in folder 'ghi' drive_mkdir("mno", path = "ghi") # Yet another way to create a folder named 'pqr' in folder 'ghi', # this time with parent folder stored in a dribble, # and setting the new folder's description pqr <- drive_mkdir("pqr", path = ghi, description = "I am a folder") # Did we really set the description? YES purrr::pluck(pqr, "drive_resource", 1, "description") # `overwrite = FALSE` errors if something already exists at target filepath # THIS WILL ERROR! drive_create("name-squatter", path = ghi) drive_mkdir("name-squatter", path = ghi, overwrite = FALSE) # `overwrite = TRUE` moves the existing item to trash, then proceeds drive_mkdir("name-squatter", path = ghi, overwrite = TRUE) # list everything inside 'ghi' drive_ls('ghi') # clean up drive_rm(ghi) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{files.create} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/create} } } googledrive/man/drive_mime_type.Rd0000644000176200001440000000241113200256167017003 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_mime_type.R \name{drive_mime_type} \alias{drive_mime_type} \title{Lookup MIME type} \usage{ drive_mime_type(type = NULL) } \arguments{ \item{type}{Character. Google Drive file type, file extension, or MIME type. Pass the sentinel \code{\link[=expose]{expose()}} if you want to get the full table used for validation and lookup, i.e. all MIME types known to be relevant to the Drive API.} } \value{ Character. MIME type. } \description{ This is a helper to determine which MIME type should be used for a file. Three types of input are acceptable: \itemize{ \item Native Google Drive file types. Important examples: \itemize{ \item "document" for Google Docs \item "folder" for folders \item "presentation" for Google Slides \item "spreadsheet" for Google Sheets } \item File extensions, such as "pdf", "csv", etc. \item MIME types accepted by Google Drive (these are simply passed through). } } \examples{ ## get the mime type for Google Spreadsheets drive_mime_type("spreadsheet") ## get the mime type for jpegs drive_mime_type("jpeg") ## it's vectorized drive_mime_type(c("presentation", "pdf", "image/gif")) ## see the internal tibble of MIME types known to the Drive API drive_mime_type(expose()) } googledrive/man/drive_trash.Rd0000644000176200001440000000333514071171077016145 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_trash.R \name{drive_trash} \alias{drive_trash} \alias{drive_untrash} \title{Move Drive files to or from trash} \usage{ drive_trash(file, verbose = deprecated()) drive_untrash(file, verbose = deprecated()) } \arguments{ \item{file}{Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Move Drive files to or from trash } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a file and put it in the trash. file <- drive_example_remote("chicken.txt") \%>\% drive_cp("chicken-trash.txt") drive_trash("chicken-trash.txt") # Confirm it's in the trash drive_find(trashed = TRUE) # Remove it from the trash and confirm drive_untrash("chicken-trash.txt") drive_find(trashed = TRUE) # Clean up drive_rm("chicken-trash.txt") \dontshow{\}) # examplesIf} } googledrive/man/expose.Rd0000644000176200001440000000177714070147664015152 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils.R \name{expose} \alias{expose} \title{An expose object} \usage{ expose() } \description{ \code{expose()} returns a sentinel object, similar in spirit to \code{NULL}, that tells the calling function to return its internal data structure. googledrive stores a lot of information about the Drive API, MIME types, etc., internally and then exploits it in helper functions, like \code{\link[=drive_mime_type]{drive_mime_type()}}, \code{\link[=drive_fields]{drive_fields()}}, \code{\link[=drive_endpoints]{drive_endpoints()}}, etc. We use these objects to provide nice defaults, check input validity, or lookup something cryptic, like MIME type, based on something friendlier, like a file extension. Pass \code{expose()} to such a function if you want to inspect its internal object, in its full glory. This is inspired by the \code{waiver()} object in ggplot2. } \examples{ drive_mime_type(expose()) drive_fields(expose()) } \keyword{internal} googledrive/man/drive_link.Rd0000644000176200001440000000163114070147664015762 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_browse.R \name{drive_link} \alias{drive_link} \title{Retrieve Drive file links} \usage{ drive_link(file) } \arguments{ \item{file}{Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} } \value{ Character vector of file hyperlinks. } \description{ Returns the \code{"webViewLink"} for one or more files, which is the "link for opening the file in a relevant Google editor or viewer in a browser". } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # get a few files into a dribble three_files <- drive_find(n_max = 3) # get their browser links drive_link(three_files) \dontshow{\}) # examplesIf} } googledrive/man/deprecated-team-drive-functions.Rd0000644000176200001440000000552614070147664022004 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/team_drive.R \name{deprecated-team-drive-functions} \alias{deprecated-team-drive-functions} \alias{team_drive_find} \alias{team_drive_get} \alias{team_drive_create} \alias{team_drive_rm} \alias{team_drive_update} \alias{as_team_drive} \alias{is_team_drive} \title{Deprecated Team Drive functions} \usage{ team_drive_find(pattern = NULL, n_max = Inf, ..., verbose = deprecated()) team_drive_get(name = NULL, id = NULL, verbose = deprecated()) team_drive_create(name, verbose = deprecated()) team_drive_rm(team_drive = NULL, verbose = deprecated()) team_drive_update(team_drive, ..., verbose = deprecated()) as_team_drive(x, ...) is_team_drive(d) } \arguments{ \item{pattern}{Character. If provided, only the items whose names match this regular expression are returned. This is implemented locally on the results returned by the API.} \item{n_max}{Integer. An upper bound on the number of items to return. This applies to the results requested from the API, which may be further filtered locally, via the \code{pattern} argument.} \item{...}{Other parameters to pass along in the request, such as \code{pageSize} or \code{useDomainAdminAccess}.} \item{name}{Character vector of names. A character vector marked with \code{\link[=as_id]{as_id()}} is treated as if it was provided via the \code{id} argument.} \item{id}{Character vector of shared drive ids or URLs (it is first processed with \code{\link[=as_id]{as_id()}}). If both \code{name} and \code{id} are non-\code{NULL}, \code{id} is silently ignored.} \item{team_drive}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Google Drive and the Drive API have replaced Team Drives with shared drives.} \item{x}{A vector of shared drive names, a vector of shared drive ids marked with \code{\link[=as_id]{as_id()}}, a list of Drives resource objects, or a suitable data frame.} \item{d}{A \code{\link{dribble}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per shared drive. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Team Drives have been rebranded as \emph{shared drives} and, as of googledrive v2.0.0, all \verb{team_drive_*()} functions have been deprecated, in favor of \verb{shared_drive_*()} successors. The changes in googledrive reflect that the Team Drives resource collection has been deprecated in the Drive API v3, in favor of the new (shared) Drives resource collection. Read more \itemize{ \item \url{https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api} } } \keyword{internal} googledrive/man/drive_cp.Rd0000644000176200001440000001164114071404512015416 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_cp.R \name{drive_cp} \alias{drive_cp} \title{Copy a Drive file} \usage{ drive_cp( file, path = NULL, name = NULL, ..., overwrite = NA, verbose = deprecated() ) } \arguments{ \item{file}{Something that identifies the file of interest on your Google Drive. Can be a name or path, a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{path}{Specifies target destination for the new file on Google Drive. Can be an actual path (character), a file id marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder. If \code{path} is given as a path (as opposed to a \code{dribble} or an id), it is best to explicitly indicate if it's a folder by including a trailing slash, since it cannot always be worked out from the context of the call. By default, the new file has the same parent folder as the source file.} \item{name}{Character, new file name if not specified as part of \code{path}. This will force \code{path} to be interpreted as a folder, even if it is character and lacks a trailing slash. Defaults to "Copy of \code{FILE-NAME}".} \item{...}{Named parameters to pass along to the Drive API. Has \link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by specifying properties of the Files resource via \code{...}. Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Copies an existing Drive file into a new file id. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Target one of the official example files (src_file <- drive_example_remote("chicken.txt")) # Make a "Copy of" copy in your My Drive cp1 <- drive_cp(src_file) # Make an explicitly named copy, in a different folder, and star it. # The starring is an example of providing metadata via `...`. # `starred` is not an actual argument to `drive_cp()`, # it just gets passed through to the API. folder <- drive_mkdir("drive-cp-folder") cp2 <- drive_cp( src_file, path = folder, name = "chicken-cp.txt", starred = TRUE ) drive_reveal(cp2, "starred") # `overwrite = FALSE` errors if file already exists at target filepath # THIS WILL ERROR! # drive_cp(src_file, name = "Copy of chicken.txt", overwrite = FALSE) # `overwrite = TRUE` moves an existing file to trash, then proceeds cp3 <- drive_cp(src_file, name = "Copy of chicken.txt", overwrite = TRUE) # Delete all of our copies and the new folder! drive_rm(cp1, cp2, cp3, folder) # Target an official example file that's a csv file (csv_file <- drive_example_remote("chicken.csv")) # copy AND AT THE SAME TIME convert it to a Google Sheet chicken_sheet <- drive_cp( csv_file, name = "chicken-sheet-copy", mime_type = drive_mime_type("spreadsheet") ) # is it really a Google Sheet? drive_reveal(chicken_sheet, "mime_type")$mime_type # go see the new Sheet in the browser # drive_browse(chicken_sheet) # clean up drive_rm(chicken_sheet) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{files.copy} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/copy} } } googledrive/man/pipe.Rd0000644000176200001440000000040013432612466014560 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/utils-pipe.R \name{\%>\%} \alias{\%>\%} \title{Pipe operator} \usage{ lhs \%>\% rhs } \description{ See \code{magrittr::\link[magrittr]{\%>\%}} for details. } \keyword{internal} googledrive/man/googledrive-deprecated.Rd0000644000176200001440000000145014071171077020233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R, R/drive_examples.R \name{googledrive-deprecated} \alias{googledrive-deprecated} \alias{drive_auth_config} \alias{drive_example} \title{Deprecated googledrive functions} \usage{ drive_auth_config(active, app, path, api_key) drive_example(path = NULL) } \arguments{ \item{app}{OAuth app, in the sense of \code{\link[httr:oauth_app]{httr::oauth_app()}}.} \item{path}{JSON downloaded from Google Cloud Platform Console, containing a client id (aka key) and secret, in one of the forms supported for the \code{txt} argument of \code{\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} (typically, a file path or JSON string).} \item{api_key}{API key.} } \description{ Deprecated googledrive functions } \keyword{internal} googledrive/man/drive_publish.Rd0000644000176200001440000000453414071404512016465 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_publish.R \name{drive_publish} \alias{drive_publish} \alias{drive_unpublish} \title{Publish native Google files} \usage{ drive_publish(file, ..., verbose = deprecated()) drive_unpublish(file, ..., verbose = deprecated()) } \arguments{ \item{file}{Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} \item{...}{Name-value pairs to add to the API request body (see API docs linked below for details). For \code{drive_publish()}, we include \code{publishAuto = TRUE} and \code{publishedOutsideDomain = TRUE}, if user does not specify other values.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. There will be extra columns, \code{published} and \code{revisions_resource}. } \description{ Publish (or un-publish) native Google files to the web. Native Google files include Google Docs, Google Sheets, and Google Slides. The returned \code{\link{dribble}} will have extra columns, \code{published} and \code{revisions_resource}. Read more in \code{\link[=drive_reveal]{drive_reveal()}}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a file to publish file <- drive_example_remote("chicken_sheet") \%>\% drive_cp() # Publish file file <- drive_publish(file) file$published # Unpublish file file <- drive_unpublish(file) file$published # Clean up drive_rm(file) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{revisions.update} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/revisions/update} } } googledrive/man/drive_about.Rd0000644000176200001440000000200514071403154016121 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_about.R \name{drive_about} \alias{drive_about} \title{Get info on Drive capabilities} \usage{ drive_about() } \value{ A list representation of a Drive \href{https://developers.google.com/drive/api/v3/reference/about}{about resource} } \description{ Gets information about the user, the user's Drive, and system capabilities. This function mostly exists to power \code{\link[=drive_user]{drive_user()}}, which extracts the most useful information (the information on current user) and prints it nicely. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} drive_about() # explore the export formats available for Drive files, by MIME type about <- drive_about() about[["exportFormats"]] \%>\% purrr::map(unlist) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{about.get} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/about/get} } } googledrive/man/googledrive-package.Rd0000644000176200001440000000414114070147664017532 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/googledrive-package.R \docType{package} \name{googledrive-package} \alias{googledrive} \alias{googledrive-package} \title{googledrive: An Interface to Google Drive} \description{ googledrive allows you to interact with files on Google Drive from R. \code{googledrive::drive_find(n_max = 50)} lists up to 50 of the files you see in \href{https://drive.google.com}{My Drive}. You can expect to be sent to your browser here, to authenticate yourself and authorize the googledrive package to deal on your behalf with Google Drive. Most functions begin with the prefix \code{drive_}. The goal is to allow Drive access that feels similar to Unix file system utilities, e.g., \code{find}, \code{ls}, \code{mv}, \code{cp}, \code{mkdir}, and \code{rm}. The metadata for one or more Drive files is held in a \code{\link{dribble}}, a "Drive tibble". This is a data frame with one row per file. A dribble is returned (and accepted) by almost every function in googledrive. It is designed to give people what they want (file name), track what the API wants (file id), and to hold the metadata needed for general file operations. googledrive is "pipe-friendly" and, in fact, re-exports \verb{\%>\%}, but does not require its use. Please see the googledrive website for full documentation: \itemize{ \item \url{https://googledrive.tidyverse.org/index.html} } In addition to function-specific help, there are several articles which are indexed here: \itemize{ \item \href{https://googledrive.tidyverse.org/articles/index.html}{Article index} } } \seealso{ Useful links: \itemize{ \item \url{https://googledrive.tidyverse.org} \item \url{https://github.com/tidyverse/googledrive} \item Report bugs at \url{https://github.com/tidyverse/googledrive/issues} } } \author{ \strong{Maintainer}: Jennifer Bryan \email{jenny@rstudio.com} (\href{https://orcid.org/0000-0002-6983-2759}{ORCID}) Authors: \itemize{ \item Lucy D'Agostino McGowan \email{ld.mcgowan@vanderbilt.edu} } Other contributors: \itemize{ \item RStudio [copyright holder, funder] } } \keyword{internal} googledrive/man/shared_drive_rm.Rd0000644000176200001440000000274514070147664017000 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared_drive_rm.R \name{shared_drive_rm} \alias{shared_drive_rm} \title{Delete shared drives} \usage{ shared_drive_rm(drive = NULL) } \arguments{ \item{drive}{Anything that identifies the shared drive(s) of interest. Can be a character vector of names, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}} consisting only of shared drives.} } \value{ Logical vector, indicating whether the delete succeeded. } \description{ A shared drive supports files owned by an organization rather than an individual user. Shared drives follow different sharing and ownership models from a specific user's "My Drive". Shared drives are the successors to the earlier concept of Team Drives. Learn more about \link[=shared_drives]{shared drives}. } \examples{ \dontrun{ # Create shared drives to remove in various ways shared_drive_create("testdrive-01") sd02 <- shared_drive_create("testdrive-02") shared_drive_create("testdrive-03") sd04 <- shared_drive_create("testdrive-04") # remove by name shared_drive_rm("testdrive-01") # remove by id shared_drive_rm(as_id(sd02)) # remove by URL (or, rather, id found in URL) shared_drive_rm(as_id("https://drive.google.com/drive/u/0/folders/Q5DqUk9PVA")) # remove by dribble shared_drive_rm(sd04) } } \seealso{ Wraps the \code{drives.delete} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/drives/delete} } } googledrive/man/as_shared_drive.Rd0000644000176200001440000000274514070147664016765 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared_drives.R \name{as_shared_drive} \alias{as_shared_drive} \title{Coerce to shared drive} \usage{ as_shared_drive(x, ...) } \arguments{ \item{x}{A vector of shared drive names, a vector of shared drive ids marked with \code{\link[=as_id]{as_id()}}, a list of Drives resource objects, or a suitable data frame.} \item{...}{Other arguments passed down to methods. (Not used.)} } \description{ Converts various representations of a shared drive into a \code{\link{dribble}}, the object used by googledrive to hold Drive file metadata. Shared drives can be specified via \itemize{ \item Name \item Shared drive id, marked with \code{\link[=as_id]{as_id()}} to distinguish from name \item Data frame or \code{\link{dribble}} consisting solely of shared drives \item List representing \href{https://developers.google.com/drive/api/v3/reference/drives#resource-representations}{Drives resource} objects (mostly for internal use) } A shared drive supports files owned by an organization rather than an individual user. Shared drives follow different sharing and ownership models from a specific user's "My Drive". Shared drives are the successors to the earlier concept of Team Drives. Learn more about \link[=shared_drives]{shared drives}. This is a generic function. } \examples{ \dontrun{ # specify the name as_shared_drive("abc") # specify the id (substitute one of your own!) as_shared_drive(as_id("0AOPK1X2jaNckUk9PVA")) } } googledrive/man/drive_create.Rd0000644000176200001440000001203314071404512016253 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_create.R \name{drive_create} \alias{drive_create} \title{Create a new blank Drive file} \usage{ drive_create( name, path = NULL, type = NULL, ..., overwrite = NA, verbose = deprecated() ) } \arguments{ \item{name}{Name for the new file or, optionally, a path that specifies an existing parent folder, as well as the new file name.} \item{path}{Target destination for the new item, i.e. a folder or a shared drive. Can be given as an actual path (character), a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. Defaults to your "My Drive" root folder. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder.} \item{type}{Character. Create a blank Google Doc, Sheet or Slides by setting \code{type} to \code{document}, \code{spreadsheet}, or \code{presentation}, respectively. All non-\code{NULL} values for \code{type} are pre-processed with \code{\link[=drive_mime_type]{drive_mime_type()}}.} \item{...}{Named parameters to pass along to the Drive API. Has \link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by specifying properties of the Files resource via \code{...}. Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Creates a new blank Drive file. Note there are better options for these special cases: \itemize{ \item Creating a folder? Use \code{\link[=drive_mkdir]{drive_mkdir()}}. \item Want to upload existing local content into a new Drive file? Use \code{\link[=drive_upload]{drive_upload()}}. } } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a blank Google Doc named 'WordStar' in # your 'My Drive' root folder and star it wordstar <- drive_create("WordStar", type = "document", starred = TRUE) # is 'WordStar' really starred? YES purrr::pluck(wordstar, "drive_resource", 1, "starred") # Create a blank Google Slides presentation in # the root folder, and set its description execuvision <- drive_create( "ExecuVision", type = "presentation", description = "deeply nested bullet lists FTW" ) # Did we really set the description? YES purrr::pluck(execuvision, "drive_resource", 1, "description") # check out the new presentation drive_browse(execuvision) # Create folder 'b4xl' in the root folder, # then create an empty new Google Sheet in it b4xl <- drive_mkdir("b4xl") drive_create("VisiCalc", path = b4xl, type = "spreadsheet") # Another way to create a Google Sheet in the folder 'b4xl' drive_create("b4xl/SuperCalc", type = "spreadsheet") # Yet another way to create a new file in a folder, # this time specifying parent `path` as a character drive_create("Lotus 1-2-3", path = "b4xl", type = "spreadsheet") # Did we really create those Sheets in the intended folder? YES drive_ls("b4xl") # `overwrite = FALSE` errors if file already exists at target filepath # THIS WILL ERROR! drive_create("VisiCalc", path = b4xl, overwrite = FALSE) # `overwrite = TRUE` moves an existing file to trash, then proceeds drive_create("VisiCalc", path = b4xl, overwrite = TRUE) # clean up drive_rm(wordstar, b4xl, execuvision) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{files.create} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/create} } } googledrive/man/drive_user.Rd0000644000176200001440000000267614071404512016002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_user.R \name{drive_user} \alias{drive_user} \title{Get info on current user} \usage{ drive_user(verbose = deprecated()) } \arguments{ \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ A list of class \code{drive_user}. } \description{ Reveals information about the user associated with the current token. This is a thin wrapper around \code{\link[=drive_about]{drive_about()}} that just extracts the most useful information (the information on current user) and prints it nicely. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} drive_user() # more info is returned than is printed user <- drive_user() str(user) \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{about.get} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/about/get} } } googledrive/man/drive_upload.Rd0000644000176200001440000001327514071404512016305 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_upload.R \name{drive_upload} \alias{drive_upload} \title{Upload into a new Drive file} \usage{ drive_upload( media, path = NULL, name = NULL, type = NULL, ..., overwrite = NA, verbose = deprecated() ) } \arguments{ \item{media}{Character, path to the local file to upload.} \item{path}{Specifies target destination for the new file on Google Drive. Can be an actual path (character), a file id marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder. If \code{path} is given as a path (as opposed to a \code{dribble} or an id), it is best to explicitly indicate if it's a folder by including a trailing slash, since it cannot always be worked out from the context of the call. By default, the file is created in the current user's "My Drive" root folder.} \item{name}{Character, new file name if not specified as part of \code{path}. This will force \code{path} to be interpreted as a folder, even if it is character and lacks a trailing slash. Defaults to the file's local name.} \item{type}{Character. If \code{type = NULL}, a MIME type is automatically determined from the file extension, if possible. If the source file is of a suitable type, you can request conversion to Google Doc, Sheet or Slides by setting \code{type} to \code{document}, \code{spreadsheet}, or \code{presentation}, respectively. All non-\code{NULL} values for \code{type} are pre-processed with \code{\link[=drive_mime_type]{drive_mime_type()}}.} \item{...}{Named parameters to pass along to the Drive API. Has \link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by specifying properties of the Files resource via \code{...}. Read the "Request body" section of the Drive API docs for the associated endpoint to learn about relevant parameters.} \item{overwrite}{Logical, indicating whether to check for a pre-existing file at the targetted "filepath". The quotes around "filepath" refer to the fact that Drive does not impose a 1-to-1 relationship between filepaths and files, like a typical file system; read more about that in \code{\link[=drive_get]{drive_get()}}. \itemize{ \item \code{NA} (default): Just do the operation, even if it results in multiple files with the same filepath. \item \code{TRUE}: Check for a pre-existing file at the filepath. If there is zero or one, move a pre-existing file to the trash, then carry on. Note that the new file does not inherit any properties from the old one, such as sharing or publishing settings. It will have a new file ID. An error is thrown if two or more pre-existing files are found. \item \code{FALSE}: Error if there is any pre-existing file at the filepath. } Note that existence checks, based on filepath, are expensive operations, i.e. they require additional API calls.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ Uploads a local file into a new Drive file. To update the content or metadata of an existing Drive file, use \code{\link[=drive_update]{drive_update()}}. To upload or update, depending on whether the Drive file already exists, see \code{\link[=drive_put]{drive_put()}}. } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # upload a csv file chicken_csv <- drive_example_local("chicken.csv") \%>\% drive_upload("chicken-upload.csv") # or convert it to a Google Sheet chicken_sheet <- drive_example_local("chicken.csv") \%>\% drive_upload( name = "chicken-sheet-upload.csv", type = "spreadsheet" ) # check out the new Sheet! drive_browse(chicken_sheet) # clean-up drive_find("chicken.*upload") \%>\% drive_rm() # Upload a file and, at the same time, star it chicken <- drive_example_local("chicken.jpg") \%>\% drive_upload(starred = "true") # Is is really starred? YES purrr::pluck(chicken, "drive_resource", 1, "starred") # Clean up drive_rm(chicken) # `overwrite = FALSE` errors if something already exists at target filepath # THIS WILL ERROR! drive_create("name-squatter") drive_example_local("chicken.jpg") \%>\% drive_upload( name = "name-squatter", overwrite = FALSE ) # `overwrite = TRUE` moves the existing item to trash, then proceeds chicken <- drive_example_local("chicken.jpg") \%>\% drive_upload( name = "name-squatter", overwrite = TRUE ) # Clean up drive_rm(chicken) \dontrun{ # Upload to a shared drive: # * Shared drives are only available if your account is associated with a # Google Workspace # * The shared drive (or shared-drive-hosted folder) MUST be captured as a # dribble first and provided via `path` sd <- shared_drive_get("Marketing") drive_upload("fascinating.csv", path = sd) } \dontshow{\}) # examplesIf} } \seealso{ Wraps the \code{files.create} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/files/create} } MIME types that can be converted to native Google formats: \itemize{ \item \url{https://developers.google.com/drive/api/v3/manage-uploads#import_to_google_docs_types} } } googledrive/man/request_make.Rd0000644000176200001440000001016214070147664016320 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/request_make.R \name{request_make} \alias{request_make} \alias{do_request} \alias{do_paginated_request} \title{Make a request for the Google Drive v3 API} \usage{ request_make(x, ...) do_request(x, ...) do_paginated_request( x, ..., n_max = Inf, n = function(res) 1, verbose = deprecated() ) } \arguments{ \item{x}{List, holding the components for an HTTP request, presumably created with \code{\link[=request_generate]{request_generate()}} Should contain the \code{method}, \code{url}, \code{body}, and \code{token}.} \item{...}{Optional arguments passed through to the HTTP method.} \item{n_max}{Maximum number of items to return. Defaults to \code{Inf}, i.e. there is no limit and we keep making requests until we get all items.} \item{n}{Function that computes the number of items in one response or page. The default function always returns \code{1} and therefore treats each page as an item. If you know more about the structure of the response, you can pass another function to count and threshhold, for example, the number of files or comments.} \item{verbose}{\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} This logical argument to individual googledrive functions is deprecated. To globally suppress googledrive messaging, use \code{options(googledrive_quiet = TRUE)} (the default behaviour is to emit informational messages). To suppress messaging in a more limited way, use the helpers \code{\link[=local_drive_quiet]{local_drive_quiet()}} or \code{\link[=with_drive_quiet]{with_drive_quiet()}}.} } \value{ \code{request_make()}: Object of class \code{response} from \link{httr}. \code{do_request()}: List representing the content returned by a single request. \code{do_paginated_request()}: List of lists, representing the returned content, one component per page. } \description{ Low-level functions to execute one or more Drive API requests and, perhaps, process the response(s). Most users should, instead, use higher-level wrappers that facilitate common tasks, such as uploading or downloading Drive files. The functions here are intended for internal use and for programming around the Drive API. Three functions are documented here: \itemize{ \item \code{request_make()} does the bare minimum: calls \code{\link[gargle:request_make]{gargle::request_make()}}, only adding the googledrive user agent. Typically the input is created with \code{\link[=request_generate]{request_generate()}} and the output is processed with \code{\link[gargle:response_process]{gargle::response_process()}}. \item \code{do_request()} is simply \code{gargle::response_process(request_make(x, ...))}. It exists only because we had to make \code{do_paginated_request()} and it felt weird to not make the equivalent for a single request. \item \code{do_paginated_request()} executes the input request \strong{with page traversal}. It is impossible to separate paginated requests into a "make request" step and a "process request" step, because the token for the next page must be extracted from the content of the current page. Therefore this function does both and returns a list of processed responses, one per page. } } \examples{ \dontrun{ # build a request for an endpoint that is: # * paginated # * NOT privileged in googledrive, i.e. not covered by request_generate() # "comments" are a great example # https://developers.google.com/drive/v3/reference/comments # # Practice with a target file with > 2 comments # Note that we request 2 items (comments) per page req <- build_request( path = "drive/v3/files/{fileId}/comments", method = "GET", params = list( fileId = "your-file-id-goes-here", fields = "*", pageSize = 2 ), token = googledrive::drive_token() ) # make the paginated request, but cap it at 1 page # should get back exactly two comments do_paginated_request(req, n_max = 1) } } \seealso{ Other low-level API functions: \code{\link{drive_has_token}()}, \code{\link{drive_token}()}, \code{\link{request_generate}()} } \concept{low-level API functions} googledrive/man/drive_auth.Rd0000644000176200001440000001331314070147664015766 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_auth.R \name{drive_auth} \alias{drive_auth} \title{Authorize googledrive} \usage{ drive_auth( email = gargle::gargle_oauth_email(), path = NULL, scopes = "https://www.googleapis.com/auth/drive", cache = gargle::gargle_oauth_cache(), use_oob = gargle::gargle_oob_default(), token = NULL ) } \arguments{ \item{email}{Optional. Allows user to target a specific Google identity. If specified, this is used for token lookup, i.e. to determine if a suitable token is already available in the cache. If no such token is found, \code{email} is used to pre-select the targetted Google identity in the OAuth chooser. Note, however, that the email associated with a token when it's cached is always determined from the token itself, never from this argument. Use \code{NA} or \code{FALSE} to match nothing and force the OAuth dance in the browser. Use \code{TRUE} to allow email auto-discovery, if exactly one matching token is found in the cache. Specify just the domain with a glob pattern, e.g. \code{"*@example.com"}, to create code that "just works" for both \code{alice@example.com} and \code{bob@example.com}. Defaults to the option named "gargle_oauth_email", retrieved by \code{\link[gargle:gargle_options]{gargle_oauth_email()}}.} \item{path}{JSON identifying the service account, in one of the forms supported for the \code{txt} argument of \code{\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} (typically, a file path or JSON string).} \item{scopes}{A character vector of scopes to request. Pick from those listed at \url{https://developers.google.com/identity/protocols/oauth2/scopes}. For certain token flows, the \code{"https://www.googleapis.com/auth/userinfo.email"} scope is unconditionally included. This grants permission to retrieve the email address associated with a token; gargle uses this to index cached OAuth tokens. This grants no permission to view or send email and is generally considered a low-value scope.} \item{cache}{Specifies the OAuth token cache. Defaults to the option named "gargle_oauth_cache", retrieved via \code{\link[gargle:gargle_options]{gargle_oauth_cache()}}.} \item{use_oob}{Whether to prefer "out of band" authentication. Defaults to the option named "gargle_oob_default", retrieved via \code{\link[gargle:gargle_options]{gargle_oob_default()}}.} \item{token}{A token with class \link[httr:Token-class]{Token2.0} or an object of httr's class \code{request}, i.e. a token that has been prepared with \code{\link[httr:config]{httr::config()}} and has a \link[httr:Token-class]{Token2.0} in the \code{auth_token} component.} } \description{ Authorize googledrive to view and manage your Drive files. This function is a wrapper around \code{\link[gargle:token_fetch]{gargle::token_fetch()}}. By default, you are directed to a web browser, asked to sign in to your Google account, and to grant googledrive permission to operate on your behalf with Google Drive. By default, with your permission, these user credentials are cached in a folder below your home directory, from where they can be automatically refreshed, as necessary. Storage at the user level means the same token can be used across multiple projects and tokens are less likely to be synced to the cloud by accident. If you are interacting with R within a browser (applies to RStudio Server, RStudio Workbench, and RStudio Cloud), you need a variant of this flow, known as out-of-band auth ("oob"). If this does not happen automatically, you can request it yourself with \code{use_oob = TRUE} or, more persistently, by setting an option via \code{options(gargle_oob_default = TRUE)}. } \details{ Most users, most of the time, do not need to call \code{drive_auth()} explicitly -- it is triggered by the first action that requires authorization. Even when called, the default arguments often suffice. However, when necessary, this function allows the user to explicitly: \itemize{ \item Declare which Google identity to use, via an email address. If there are multiple cached tokens, this can clarify which one to use. It can also force googledrive to switch from one identity to another. If there's no cached token for the email, this triggers a return to the browser to choose the identity and give consent. You can specify just the domain by using a glob pattern. This means that a script containing \code{email = "*@example.com"} can be run without further tweaks on the machine of either \code{alice@example.com} or \code{bob@example.com}. \item Use a service account token or workload identity federation. \item Bring their own \link[httr:Token-class]{Token2.0}. \item Specify non-default behavior re: token caching and out-of-bound authentication. \item Customize scopes. } For details on the many ways to find a token, see \code{\link[gargle:token_fetch]{gargle::token_fetch()}}. For deeper control over auth, use \code{\link[=drive_auth_configure]{drive_auth_configure()}} to bring your own OAuth app or API key. Read more about gargle options, see \link[gargle:gargle_options]{gargle::gargle_options}. } \examples{ \dontrun{ # load/refresh existing credentials, if available # otherwise, go to browser for authentication and authorization drive_auth() # see user associated with current token drive_user() # force use of a token associated with a specific email drive_auth(email = "jenny@example.com") drive_user() # force the OAuth web dance drive_auth(email = NA) # use a 'read only' scope, so it's impossible to edit or delete files drive_auth( scopes = "https://www.googleapis.com/auth/drive.readonly" ) # use a service account token drive_auth(path = "foofy-83ee9e7c9c48.json") } } \seealso{ Other auth functions: \code{\link{drive_auth_configure}()}, \code{\link{drive_deauth}()} } \concept{auth functions} googledrive/man/request_generate.Rd0000644000176200001440000000621714071404512017170 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/request_generate.R \name{request_generate} \alias{request_generate} \title{Build a request for the Google Drive API} \usage{ request_generate( endpoint = character(), params = list(), key = NULL, token = drive_token() ) } \arguments{ \item{endpoint}{Character. Nickname for one of the selected Drive v3 API endpoints built into googledrive. Learn more in \code{\link[=drive_endpoints]{drive_endpoints()}}.} \item{params}{Named list. Parameters destined for endpoint URL substitution, the query, or the body.} \item{key}{API key. Needed for requests that don't contain a token. The need for an API key in the absence of a token is explained in Google's document \href{https://support.google.com/googleapi/answer/6158857?hl=en&ref_topic=7013279}{Credentials, access, security, and identity}. In order of precedence, these sources are consulted: the formal \code{key} argument, a \code{key} parameter in \code{params}, a user-configured API key fetched via \code{\link[=drive_api_key]{drive_api_key()}}, a built-in key shipped with googledrive. See \code{\link[=drive_auth_configure]{drive_auth_configure()}} for details on a user-configured key.} \item{token}{Drive token. Set to \code{NULL} to suppress the inclusion of a token. Note that, if auth has been de-activated via \code{\link[=drive_deauth]{drive_deauth()}}, \code{drive_token()} will actually return \code{NULL}.} } \value{ \code{list()}\cr Components are \code{method}, \code{path}, \code{query}, \code{body}, \code{token}, and \code{url}, suitable as input for \code{\link[=request_make]{request_make()}}. } \description{ Build a request, using knowledge of the \href{https://developers.google.com/drive/api/v3/about-sdk}{Drive v3 API} from its \href{https://www.googleapis.com/discovery/v1/apis/drive/v3/rest}{Discovery Document}. Most users should, instead, use higher-level wrappers that facilitate common tasks, such as uploading or downloading Drive files. The functions here are intended for internal use and for programming around the Drive API. \code{request_generate()} lets you provide the bare minimum of input. It takes a nickname for an endpoint and: \itemize{ \item Uses the API spec to look up the \code{path}, \code{method}, and base URL. \item Checks \code{params} for validity and completeness with respect to the endpoint. Separates parameters into those destined for the body, the query, and URL endpoint substitution (which is also enacted). \item Adds an API key to the query if and only if \code{token = NULL}. \item Adds \code{supportsAllDrives = TRUE} to the query if the endpoint requires. } } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} req <- request_generate( "drive.files.get", list(fileId = "abc"), token = drive_token() ) req \dontshow{\}) # examplesIf} } \seealso{ \code{\link[gargle:request_develop]{gargle::request_develop()}}, \code{\link[gargle:request_develop]{gargle::request_build()}} Other low-level API functions: \code{\link{drive_has_token}()}, \code{\link{drive_token}()}, \code{\link{request_make}()} } \concept{low-level API functions} googledrive/man/shortcut_resolve.Rd0000644000176200001440000000470514071171077017247 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shortcut.R \name{shortcut_resolve} \alias{shortcut_resolve} \title{Resolve shortcuts to their targets} \usage{ shortcut_resolve(file) } \arguments{ \item{file}{Something that identifies the file(s) of interest on your Google Drive. Can be a character vector of names/paths, a character vector of file ids or URLs marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. Extra columns \code{name_shortcut} and \code{id_shortcut} refer to the original shortcut. } \description{ Retrieves the metadata for the Drive file that a shortcut refers to, i.e. the shortcut's target. The returned \code{\link{dribble}} has the usual columns (\code{name}, \code{id}, \code{drive_resource}), which refer to the target. It will also include the columns \code{name_shortcut} and \code{id_shortcut}, which refer to the original shortcut. There are 3 possible scenarios: \enumerate{ \item \code{file} is a shortcut and user can \code{\link[=drive_get]{drive_get()}} the target. All is simple and well. \item \code{file} is a shortcut, but \code{\link[=drive_get]{drive_get()}} fails for the target. This can happen if the user can see the shortcut, but does not have read access to the target. It can also happen if the target has been trashed or deleted. In such cases, all of the target's metadata, except for \code{id}, will be missing. Call \code{drive_get()} on a problematic \code{id} to see the specific error. \item \code{file} is not a shortcut. \code{name_shortcut} and \code{id_shortcut} will both be \code{NA}. } } \examples{ \dontshow{if (drive_has_token()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} # Create a file to make a shortcut to file <- drive_example_remote("chicken_sheet") \%>\% drive_cp(name = "chicken-sheet-for-shortcut") # Create a shortcut sc1 <- file \%>\% shortcut_create(name = "shortcut-1") # Create a second shortcut by copying the first sc1 <- sc1 \%>\% drive_cp(name = "shortcut-2") # Get the shortcuts (sc_dat <- drive_find("-[12]$", type = "shortcut")) # Resolve them (resolved <- shortcut_resolve(sc_dat)) resolved$id file$id # Delete the target file drive_rm(file) # (Try to) resolve the shortcuts again shortcut_resolve(sc_dat) # No error, but resolution is unsuccessful due to non-existent target # Clean-up drive_rm(sc_dat) \dontshow{\}) # examplesIf} } googledrive/man/drive_ls.Rd0000644000176200001440000000332214070147664015442 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/drive_ls.R \name{drive_ls} \alias{drive_ls} \title{List contents of a folder or shared drive} \usage{ drive_ls(path = NULL, ..., recursive = FALSE) } \arguments{ \item{path}{Specifies a single folder on Google Drive whose contents you want to list. Can be an actual path (character), a file id or URL marked with \code{\link[=as_id]{as_id()}}, or a \code{\link{dribble}}. If it is a shared drive or is a folder on a shared drive, it must be passed as a \code{\link{dribble}}. If \code{path} is a shortcut to a folder, it is automatically resolved to its target folder.} \item{...}{Any parameters that are valid for \code{\link[=drive_find]{drive_find()}}.} \item{recursive}{Logical, indicating if you want only direct children of \code{path} (\code{recursive = FALSE}, the default) or all children, including indirect (\code{recursive = TRUE}).} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per file. } \description{ List the contents of a folder or shared drive, recursively or not. This is a thin wrapper around \code{\link[=drive_find]{drive_find()}}, that simply adds one constraint: the search is limited to direct or indirect children of \code{path}. } \examples{ \dontrun{ # get contents of the folder 'abc' (non-recursive) drive_ls("abc") # get contents of folder 'abc' whose names contain the letters 'def' drive_ls(path = "abc", pattern = "def") # get all Google spreadsheets in folder 'abc' # whose names contain the letters 'def' drive_ls(path = "abc", pattern = "def", type = "spreadsheet") # get all the files below 'abc', recursively, that are starred drive_ls(path = "abc", q = "starred = true", recursive = TRUE) } } googledrive/man/shared_drive_create.Rd0000644000176200001440000000200414070147664017611 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shared_drive_create.R \name{shared_drive_create} \alias{shared_drive_create} \title{Create a new shared drive} \usage{ shared_drive_create(name) } \arguments{ \item{name}{Character. Name of the new shared drive. Must be non-empty and not entirely whitespace.} } \value{ An object of class \code{\link{dribble}}, a tibble with one row per shared drive. } \description{ A shared drive supports files owned by an organization rather than an individual user. Shared drives follow different sharing and ownership models from a specific user's "My Drive". Shared drives are the successors to the earlier concept of Team Drives. Learn more about \link[=shared_drives]{shared drives}. } \examples{ \dontrun{ shared_drive_create("my-awesome-shared-drive") # clean up shared_drive_rm("my-awesome-shared-drive") } } \seealso{ Wraps the \code{drives.create} endpoint: \itemize{ \item \url{https://developers.google.com/drive/api/v3/reference/drives/create} } } googledrive/DESCRIPTION0000644000176200001440000000307314071540356014276 0ustar liggesusersPackage: googledrive Title: An Interface to Google Drive Version: 2.0.0 Authors@R: c(person(given = "Lucy", family = "D'Agostino McGowan", role = "aut", email = "ld.mcgowan@vanderbilt.edu"), person(given = "Jennifer", family = "Bryan", role = c("aut", "cre"), email = "jenny@rstudio.com", comment = c(ORCID = "0000-0002-6983-2759")), person(given = "RStudio", role = c("cph", "fnd"))) Description: Manage Google Drive files from R. License: MIT + file LICENSE URL: https://googledrive.tidyverse.org, https://github.com/tidyverse/googledrive BugReports: https://github.com/tidyverse/googledrive/issues Depends: R (>= 3.3) Imports: cli (>= 3.0.0), gargle (>= 1.2.0), glue (>= 1.4.2), httr, jsonlite, lifecycle, magrittr, pillar, purrr (>= 0.2.3), rlang (>= 0.4.9), tibble (>= 2.0.0), utils, uuid, vctrs (>= 0.3.0), withr Suggests: covr, curl, downlit, dplyr (>= 1.0.0), knitr, mockr, rmarkdown, roxygen2, sodium, spelling, testthat (>= 3.0.0) VignetteBuilder: knitr Config/Needs/website: pkgdown, tidyverse, r-lib/downlit, tidyverse/tidytemplate Config/testthat/edition: 3 Encoding: UTF-8 Language: en-US RoxygenNote: 7.1.1.9001 NeedsCompilation: no Packaged: 2021-07-07 23:19:26 UTC; jenny Author: Lucy D'Agostino McGowan [aut], Jennifer Bryan [aut, cre] (), RStudio [cph, fnd] Maintainer: Jennifer Bryan Repository: CRAN Date/Publication: 2021-07-08 09:10:06 UTC googledrive/build/0000755000176200001440000000000014071433175013664 5ustar liggesusersgoogledrive/build/vignette.rds0000644000176200001440000000030314071433175016217 0ustar liggesusersb```b`a@&0`b fd`a9)EezA)hHhR:3JrsA q `aBgKM-FZ]?4-ީE0=(jؠjX2sRad9.nP&c0Gq?gQ~ 6@btr$$ <|@googledrive/tests/0000755000176200001440000000000014071433176013730 5ustar liggesusersgoogledrive/tests/spelling.R0000644000176200001440000000024114041617517015665 0ustar liggesusersif(requireNamespace('spelling', quietly = TRUE)) spelling::spell_check_test(vignettes = TRUE, error = FALSE, skip_on_cran = TRUE) googledrive/tests/testthat/0000755000176200001440000000000014071540356015567 5ustar liggesusersgoogledrive/tests/testthat/test-drive_user.R0000644000176200001440000000034014070147664021037 0ustar liggesuserstest_that("drive_user() reports on the user", { skip_if_no_token() skip_if_offline() user <- drive_user() expect_s3_class(user, "drive_user") expect_true(all(c("displayName", "emailAddress") %in% names(user))) }) googledrive/tests/testthat/test-drive_id-class.R0000644000176200001440000000747214071401260021557 0ustar liggesusers# ---- other ---- if (FALSE) { ## how the test file was created ## see also test-dplyr-compatbility.R saveRDS( drive_find(n_max = 10), test_file("just_a_dribble.rds") ) } # ---- tests ---- test_that("as_id() copes with no input, NULL, and length-0 input", { expect_null(as_id()) expect_null(as_id(NULL)) expect_identical(as_id(character(0)), character(0)) }) test_that("as_id() errors for unanticipated input", { expect_snapshot(as_id(mean), error = TRUE) expect_snapshot(as_id(1.2), error = TRUE) expect_snapshot(as_id(1L), error = TRUE) }) test_that("as_id() returns non-URL character strings as ids", { expect_true(is_drive_id(as_id(c("123", "456")))) expect_identical(unclass(as_id(c("123", "456"))), c("123", "456")) }) test_that("as_id() extracts ids from Drive URLs but not other URLs", { x <- c( "https://docs.google.com/document/d/doc12345/edit", "https://drive.google.com/drive/folders/folder12345", "https://drive.google.com/open?id=blob12345", "https://docs.google.com/a/example.com/spreadsheets/d/team12345", ## Team Drive URL "https://drive.google.com/drive/u/0/folders/teamdrive12345" ) expect_identical( as_id(x), as_id(c( "doc12345", "folder12345", "blob12345", "team12345", "teamdrive12345" )) ) ## properly recognizes a missing URL x <- c( "https://docs.google.com/document/d/doc12345/edit", NA, "https://drive.google.com/open?id=blob12345" ) expect_identical(as_id(x), as_id(c("doc12345", NA, "blob12345"))) ## properly recognizes a non-conforming URL x <- "http://example.com" expect_identical(unclass(as_id(x)), NA_character_) }) test_that("as_id() works with dribble and dribble-ish data frames", { x <- readRDS(test_file("just_a_dribble.rds")) expect_true(is_drive_id(as_id(x))) expect_identical(as_id(x), x$id) class(x) <- class(x)[-1] expect_true(is_drive_id(as_id(x))) expect_identical(as_id(x), x$id) }) test_that("presence of drive_id column doesn't prevent row binding of dribbles", { x <- readRDS(test_file("just_a_dribble.rds")) alfa <- x[1:2, ] bravo <- x[3:4, ] expect_error_free( out <- vec_rbind(alfa, bravo) ) expect_equal(out[c("name", "id")], x[1:4, c("name", "id")]) }) ## how drive_ids look when printed test_that("drive_id's are formatted OK", { x <- readRDS(test_file("just_a_dribble.rds")) expect_snapshot(print(x$id)) }) test_that("drive_ids look OK in a dribble and truncate gracefully", { x <- readRDS(test_file("just_a_dribble.rds")) expect_snapshot(print(x)) expect_snapshot(print(drive_reveal(x, "mime_type"))) x$id[1] <- NA expect_snapshot(print(x)) }) test_that("gargle_map_cli() is implemented for drive_id", { expect_snapshot( gargle_map_cli(as_id(month.name[1:3])) ) }) ## low-level helpers test_that("new_drive_id() handles 0-length input and NA", { expect_error_free( out <- new_drive_id(character()) ) expect_length(out, 0) expect_true(is_drive_id(out)) expect_error_free( out <- new_drive_id(NA_character_) ) expect_true(is.na(out)) expect_true(is_drive_id(out)) expect_error_free( out <- new_drive_id(c(NA_character_, "abc")) ) expect_true(is.na(out[1])) expect_true(is_drive_id(out)) }) test_that("validate_drive_id fails informatively", { expect_snapshot(validate_drive_id(""), error = TRUE) expect_snapshot(validate_drive_id("a@&"), error = TRUE) }) test_that("drive_id is dropped when combining with character", { x <- as_id("abc") y <- "def" out <- vec_c(x, y) expect_identical(out, c("abc", "def")) expect_false(is_drive_id(out)) out <- vec_c(y, x) expect_identical(out, c("def", "abc")) expect_false(is_drive_id(out)) }) test_that("you can't insert invalid strings into a drive_id", { x <- as_id(month.name) expect_true(is_drive_id(x)) expect_snapshot(x[2] <- "", error = TRUE) }) googledrive/tests/testthat/test-promote.R0000644000176200001440000000407614070147664020367 0ustar liggesuserstest_that("promote() works when input has zero rows", { dib <- dribble() tib <- as_tibble(dib) tib_out <- tibble::add_column(tib, bar = list(), .after = 1) dib_out <- as_dribble(tib_out) expect_identical(promote(tib, "bar"), tib_out) expect_identical(promote(dib, "bar"), dib_out) }) test_that("promote() works when elem uniformly present or absent", { x <- tibble( name = c("a", "b", "c"), id = c("1", "2", "3"), drive_resource = list( list(foo = "a1"), list(foo = "b2"), list(foo = "c3") ) ) expect_identical( promote(x, "foo"), tibble::add_column(x, foo = c("a1", "b2", "c3"), .after = 1) ) expect_identical( promote(x, "bar"), tibble::add_column(x, bar = list(NULL, NULL, NULL), .after = 1) ) }) test_that("promote() works when elem is partially present", { x <- tibble( name = c("a", "b", "c"), id = c("1", "2", "3"), drive_resource = list( list(foo = "a1", bar = TRUE), list(foo = "b2", qux = list(letter = "b")), list(foo = "c3", baz = "c3") ) ) expect_identical( promote(x, "bar"), tibble::add_column(x, bar = c(TRUE, NA, NA), .after = 1) ) expect_identical( promote(x, "qux"), tibble::add_column(x, qux = list(NULL, list(letter = "b"), NULL), .after = 1) ) expect_identical( promote(x, "baz"), tibble::add_column(x, baz = c(NA, NA, "c3"), .after = 1) ) }) test_that("promote() replaces existing element in situ", { x <- tibble( name = "a", foo = "b", bar = "c", id = "1", drive_resource = list( list(foo = "d", bar = "e") ) ) x2 <- promote(x, "foo") x3 <- promote(x2, "bar") expect_identical(x3$foo, "d") expect_identical(x3$bar, "e") }) test_that("promote() does snake_case to camelCase conversion internally", { x <- tibble( name = "name", id = "id", drive_resource = list( list(thisThat = "hi") ) ) out <- promote(x, "this_that") expect_identical(out[2], tibble(this_that = "hi")) out <- promote(x, "thisThat") expect_identical(out[2], tibble(thisThat = "hi")) }) googledrive/tests/testthat/test-drive_reveal.R0000644000176200001440000000376414071171077021350 0ustar liggesusers# ---- nm_fun ---- nm_ <- nm_fun("TEST-drive_reveal", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("i-am-starred"), nm_("i-have-a-description"), nm_("i-am-a-google-doc") )) } # ---- setup ---- if (SETUP) { # some "simple" cases of digging info out of `drive_resource` f <- drive_example_local("chicken.txt") drive_upload(f, nm_("i-am-starred"), starred = TRUE) drive_upload(f, nm_("i-have-a-description"), description = "description!") drive_upload(f, nm_("i-am-a-google-doc"), type = "document") } # ---- tests ---- test_that("drive_reveal() works", { skip_if_no_token() skip_if_offline() dat <- drive_find(nm_("")) expect_snapshot( print(out <- drive_reveal(dat, "starred")[c("name", "starred")]) ) expect_true(out$starred[grepl("starred", out$name)]) expect_snapshot( print(out <- drive_reveal(dat, "description")[c("name", "description")]) ) expect_equal(out$description[grepl("description", out$name)], "description!") expect_snapshot( print(out <- drive_reveal(dat, "mimeType")[c("name", "mime_type")]) ) expect_equal( out$mime_type[grepl("google-doc", out$name)], drive_mime_type("document") ) }) test_that("drive_reveal() can return date-times", { skip_if_no_token() skip_if_offline() dat <- drive_find(nm_("")) out <- drive_reveal(dat, "created_time") expect_s3_class(out$created_time, "POSIXct") }) test_that("drive_reveal() returns list-column for non-existent `what`", { skip_if_no_token() skip_if_offline() dat <- drive_find(nm_("")) out <- drive_reveal(dat, "i_do_not_exist") expect_true(all(map_lgl(out$i_do_not_exist, is_null))) out <- drive_reveal(dat, "non_existent_time") expect_true(all(map_lgl(out$non_existent_time, is_null))) }) test_that("drive_reveal() inserts columns, even with 0 rows", { x <- dribble() x <- drive_reveal(x, "mime_type") x <- drive_reveal(x, "starred") expect_equal( names(x), c("name", "starred", "mime_type", "id", "drive_resource") ) }) googledrive/tests/testthat/test-drive_update.R0000644000176200001440000000422714071401260021335 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_update") nm_ <- nm_fun("TEST-drive_update", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("update-fodder"), nm_("not-unique"), nm_("does-not-exist") )) } # ---- setup ---- if (SETUP) { drive_upload(system.file("DESCRIPTION"), nm_("update-fodder")) drive_upload(system.file("DESCRIPTION"), nm_("not-unique")) drive_upload(system.file("DESCRIPTION"), nm_("not-unique")) } # ---- tests ---- test_that("drive_update() errors if local media does not exist", { expect_snapshot(drive_update(dribble(), "nope123"), error = TRUE) }) test_that("drive_update() informatively errors if the path does not exist", { skip_if_no_token() skip_if_offline() expect_snapshot( drive_update(nm_("does-not-exist"), system.file("DESCRIPTION")), error = TRUE ) }) test_that("drive_update() informatively errors if the path is not unique", { skip_if_no_token() skip_if_offline() expect_snapshot( drive_update(nm_("not-unique"), system.file("DESCRIPTION")), error = TRUE ) }) test_that("no op if no media, no metadata", { skip_if_no_token() skip_if_offline() local_drive_loud_and_wide() expect_snapshot( out <- drive_update(nm_("update-fodder")), ) expect_dribble(out) }) test_that("drive_update() can update metadata only", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("update-me")) updatee <- drive_cp(nm_("update-fodder"), name = me_("update-me")) out <- drive_update(updatee, starred = TRUE) %>% promote("starred") expect_true(out$starred) }) test_that("drive_update() uses multipart request to update media + metadata", { skip_if_no_token() skip_if_offline() defer_drive_rm(c(me_("update-me"), me_("update-me-new"))) updatee <- drive_cp(nm_("update-fodder"), name = me_("update-me")) tmp <- tempfile() now <- as.character(Sys.time()) write_utf8(now, tmp) out <- drive_update(updatee, media = tmp, name = me_("update-me-new")) expect_identical(out$id, updatee$id) drive_download(updatee, tmp, overwrite = TRUE) now_out <- read_utf8(tmp) expect_identical(now, now_out) expect_identical(out$name, me_("update-me-new")) }) googledrive/tests/testthat/test-drive_create.R0000644000176200001440000001253214071401260021314 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_create") nm_ <- nm_fun("TEST-drive_create", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("create-in-me"), nm_("create-in-folder-shortcut") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("create-in-me")) shortcut_create(nm_("create-in-me"), name = nm_("create-in-folder-shortcut")) } # ---- tests ---- test_that("drive_create() errors for bad input (before hitting Drive API)", { expect_snapshot(drive_create(), error = TRUE) expect_snapshot(drive_create(letters), error = TRUE) }) test_that("drive_create() errors if parent path does not exist", { skip_if_no_token() skip_if_offline() expect_snapshot(drive_create("a", path = "qweruiop"), error = TRUE) }) test_that("drive_create() errors if parent exists but is not a folder", { skip_if_no_token() skip_if_offline() x <- drive_find( q = "mimeType != 'application/vnd.google-apps.folder'", # make sure we don't somehow find a folder-shortcut q = "mimeType != 'application/vnd.google-apps.shortcut'", n_max = 1 ) expect_snapshot(drive_create("a", path = x), error = TRUE) }) test_that("drive_create() create specific things in root folder", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("docs-in-root")) out <- drive_create(me_("docs-in-root"), type = "document") expect_dribble(out) expect_identical(out$name, me_("docs-in-root")) expect_identical(drive_reveal(out, "parent")[["id_parent"]], root_id()) expect_identical( drive_reveal(out, "mime_type")$mime_type, drive_mime_type("document") ) defer_drive_rm(me_("sheets-in-root")) out <- drive_create(me_("sheets-in-root"), type = "spreadsheet") expect_dribble(out) expect_identical(out$name, me_("sheets-in-root")) expect_identical(drive_reveal(out, "parent")[["id_parent"]], root_id()) expect_identical( drive_reveal(out, "mime_type")$mime_type, drive_mime_type("spreadsheet") ) defer_drive_rm(me_("slides-in-root")) out <- drive_create(me_("slides-in-root"), type = "presentation") expect_dribble(out) expect_identical(out$name, me_("slides-in-root")) expect_identical(drive_reveal(out, "parent")[["id_parent"]], root_id()) expect_identical( drive_reveal(out, "mime_type")$mime_type, drive_mime_type("presentation") ) }) test_that("drive_mkdir() creates a folder in root folder", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("folder-in-root")) out <- drive_mkdir(me_("folder-in-root")) expect_dribble(out) expect_identical(out$name, me_("folder-in-root")) expect_identical(drive_reveal(out, "parent")[["id_parent"]], root_id()) expect_identical( drive_reveal(out, "mime_type")$mime_type, drive_mime_type("folder") ) }) test_that("drive_create() accepts parent folder given as dribble", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("a")) PARENT <- drive_get(nm_("create-in-me")) out <- drive_create(me_("a"), PARENT) expect_dribble(out) expect_identical(out$name, me_("a")) expect_identical(drive_reveal(out, "parent")[["id_parent"]], as_id(PARENT)) }) test_that("drive_create() accepts parent folder given as file id", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("b")) PARENT <- drive_get(nm_("create-in-me")) out <- drive_create(me_("b"), as_id(PARENT$id)) expect_dribble(out) expect_identical(out$name, me_("b")) }) test_that("drive_create() accepts name as part of path", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("c")) out <- drive_create(file.path(nm_("create-in-me"), me_("c"))) expect_dribble(out) expect_identical(out$name, me_("c")) }) test_that("drive_create() parent separately, as a path", { skip_if_no_token() skip_if_offline() defer_drive_rm(c(me_("e"), me_("f"))) # no trailing slash on parent out <- drive_create(me_("e"), path = nm_("create-in-me")) expect_dribble(out) expect_identical(out$name, me_("e")) # yes trailing slash on parent out <- drive_create(me_("f"), path = append_slash(nm_("create-in-me"))) expect_dribble(out) expect_identical(out$name, me_("f")) }) test_that("drive_create() deals with folder-shortcut as path", { skip_if_no_token() skip_if_offline() defer_drive_rm(c(me_("g"), me_("h"))) target_parent_name <- nm_("create-in-me") shortcut_name <- nm_("create-in-folder-shortcut") target_parent <- drive_get(target_parent_name) # no trailing slash on parent out <- drive_create(me_("g"), path = shortcut_name) expect_equal(drive_reveal(out, "parent")$id_parent, target_parent$id) # yes trailing slash on parent out <- drive_create(me_("h"), path = append_slash(shortcut_name)) expect_equal(drive_reveal(out, "parent")$id_parent, target_parent$id) }) test_that("drive_create() catches invalid parameters", { skip_if_no_token() skip_if_offline() expect_snapshot( (expect_error( drive_create("hi", bunny = "foofoo"), class = "gargle_error_bad_params" )) ) }) test_that("drive_create() accepts metadata via ...", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("create-me-in-root")) out <- drive_create( me_("create-me-in-root"), starred = TRUE, description = "files are amazing" ) expect_dribble(out) expect_identical(nrow(out), 1L) expect_true(out$drive_resource[[1]]$starred) expect_identical(out$drive_resource[[1]]$description, "files are amazing") }) googledrive/tests/testthat/test-drive_examples.R0000644000176200001440000000177014071171077021703 0ustar liggesuserstest_that("drive_examples_remote() lists the remote example files", { skip_if_offline() skip_on_cran() dat <- drive_examples_remote() expect_s3_class(dat, "dribble") expect_true(nrow(dat) > 0) dat <- drive_examples_remote("chicken") expect_s3_class(dat, "dribble") expect_true(nrow(dat) > 0) }) test_that("drive_example_remote() errors when >1 match", { skip_if_offline() skip_on_cran() expect_snapshot( drive_example_remote("chicken"), error = TRUE ) }) test_that("drive_examples_local() lists the local example files", { all_files <- drive_examples_local() expect_true(all(file.exists(all_files))) chicken_files <- drive_examples_local("chicken") expect_match(chicken_files, "chicken") }) test_that("drive_example_local() errors when >1 match", { expect_snapshot( drive_example_local("chicken"), error = TRUE ) }) test_that("drive_examples_local() errors when no match", { expect_snapshot( drive_examples_local("platypus"), error = TRUE ) }) googledrive/tests/testthat/test-drive_mv.R0000644000176200001440000001072214071401260020472 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_mv") nm_ <- nm_fun("TEST-drive_mv", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("move-files-into-me"), nm_("move-to-folder-shortcut"), nm_("DESC"), nm_("DESC-renamed") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("move-files-into-me")) shortcut_create(nm_("move-files-into-me"), name = nm_("move-to-folder-shortcut")) } # ---- tests ---- test_that("drive_mv() can rename file", { skip_if_no_token() skip_if_offline() name_1 <- me_("DESC") name_2 <- me_("DESC-renamed") defer_drive_rm(name_2) file <- drive_upload(system.file("DESCRIPTION"), name_1) local_drive_loud_and_wide() drive_mv_message <- capture.output( file <- drive_mv(file, name = name_2), type = "message" ) drive_mv_message <- drive_mv_message %>% scrub_filepath(name_1) %>% scrub_filepath(name_2) %>% scrub_file_id() expect_snapshot( write_utf8(drive_mv_message) ) expect_dribble(file) expect_identical(nrow(file), 1L) }) test_that("drive_mv() can move a file into a folder given as path", { skip_if_no_token() skip_if_offline() mv_name <- me_("DESC") defer_drive_rm(mv_name) mv_file <- drive_upload(system.file("DESCRIPTION"), mv_name) local_drive_loud_and_wide() # path is detected as folder (must have trailing slash) drive_mv_message <- capture.output( mv_file <- drive_mv(mv_file, paste0(nm_("move-files-into-me"), "/")), type = "message" ) drive_mv_message <- drive_mv_message %>% scrub_filepath(mv_name) %>% scrub_file_id() expect_snapshot( write_utf8(drive_mv_message) ) expect_dribble(mv_file) expect_identical(nrow(mv_file), 1L) with_drive_quiet( destination <- drive_get(nm_("move-files-into-me")) ) mv_file <- drive_reveal(mv_file, "parent") expect_equal(mv_file$id_parent, destination$id) }) test_that("drive_mv() can move a file into a folder given as dribble", { skip_if_no_token() skip_if_offline() mv_name <- me_("DESC") defer_drive_rm(mv_name) mv_file <- drive_upload(system.file("DESCRIPTION"), mv_name) destination <- drive_get(nm_("move-files-into-me")) local_drive_loud_and_wide() drive_mv_message <- capture.output( mv_file <- drive_mv(mv_file, destination), type = "message" ) drive_mv_message <- drive_mv_message %>% scrub_filepath(mv_name) %>% scrub_file_id() expect_snapshot( write_utf8(drive_mv_message) ) expect_dribble(mv_file) expect_identical(nrow(mv_file), 1L) expect_identical(drive_reveal(mv_file, "parent")$id_parent , destination$id) }) test_that("drive_mv() can rename and move, using `path` and `name`", { skip_if_no_token() skip_if_offline() name_1 <- me_("DESC") name_2 <- me_("DESC-renamed") defer_drive_rm(name_2) mv_file <- drive_upload(system.file("DESCRIPTION"), name_1) local_drive_loud_and_wide() drive_mv_message <- capture.output( mv_file <- drive_mv(mv_file, nm_("move-files-into-me"), name_2), type = "message" ) drive_mv_message <- drive_mv_message %>% scrub_filepath(name_1) %>% scrub_filepath(name_2) %>% scrub_file_id() expect_snapshot( write_utf8(drive_mv_message) ) expect_dribble(mv_file) expect_identical(nrow(mv_file), 1L) }) test_that("drive_mv() can rename and move, using `path` only", { skip_if_no_token() skip_if_offline() name_1 <- me_("DESC") name_2 <- me_("DESC-renamed") defer_drive_rm(name_2) mv_file <- drive_upload(system.file("DESCRIPTION"), name_1) local_drive_loud_and_wide() drive_mv_message <- capture.output( mv_file <- drive_mv( mv_file, file.path(nm_("move-files-into-me"), name_2) ), type = "message" ) drive_mv_message <- drive_mv_message %>% scrub_filepath(name_1) %>% scrub_filepath(name_2) %>% scrub_file_id() expect_snapshot( write_utf8(drive_mv_message) ) expect_dribble(mv_file) expect_identical(nrow(mv_file), 1L) }) test_that("drive_mv() can move using a folder shortcut", { skip_if_no_token() skip_if_offline() name <- me_("move-me-via-folder-shortcut") defer_drive_rm(name) mv_file <- drive_upload(system.file("DESCRIPTION"), name) target_parent <- drive_get(nm_("move-files-into-me")) shortcut <- nm_("move-to-folder-shortcut") # since I'm not specifying name, append slash to make clear that I regard # `path` as a parent specification out <- drive_mv(mv_file, path = append_slash(shortcut)) expect_equal(drive_reveal(out, "parent")$id_parent, target_parent$id) }) googledrive/tests/testthat/test-drive_ls.R0000644000176200001440000000747714071401260020503 0ustar liggesusers# ---- nm_fun ---- nm_ <- nm_fun("TEST-drive_ls", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("list-me"), nm_("list-a-folder-shortcut"), nm_("this-should-not-exist"), nm_("topdir") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("list-me")) drive_upload( system.file("DESCRIPTION"), path = file.path(nm_("list-me"), nm_("DESCRIPTION")) ) drive_upload( file.path(R.home("doc"), "html", "about.html"), path = file.path(nm_("list-me"), nm_("about-html")) ) shortcut_create(nm_("list-me"), name = nm_("list-a-folder-shortcut")) ## for testing `recursive = TRUE` top <- drive_mkdir(nm_("topdir")) drive_upload( system.file("DESCRIPTION"), path = top, name = nm_("apple"), type = "document", starred = TRUE ) folder1_level1 <- drive_mkdir(nm_("folder1-level1"), path = top) drive_mkdir(nm_("folder2-level1"), path = top) x <- drive_upload( system.file("DESCRIPTION"), path = folder1_level1, name = nm_("banana"), type = "document" ) folder1_level2 <- drive_mkdir(nm_("folder1-level2"), path = folder1_level1) x <- drive_upload( system.file("DESCRIPTION"), path = folder1_level2, name = nm_("cranberry"), type = "document", starred = TRUE ) } # ---- tests ---- test_that("drive_ls() errors if `path` does not exist", { skip_if_no_token() skip_if_offline() expect_snapshot(drive_ls(nm_("this-should-not-exist")), error = TRUE) }) test_that("drive_ls() outputs contents of folder", { skip_if_no_token() skip_if_offline() ## path out <- drive_ls(nm_("list-me")) expect_dribble(out) expect_true(setequal(out$name, c(nm_("about-html"), nm_("DESCRIPTION")))) ## dribble d <- drive_get(nm_("list-me")) out2 <- drive_ls(d) expect_identical(out[c("name", "id")], out2[c("name", "id")]) ## id out3 <- drive_ls(d$id) expect_identical(out[c("name", "id")], out3[c("name", "id")]) }) test_that("drive_ls() list contents of the target of a folder shortcut", { skip_if_no_token() skip_if_offline() target_name <- nm_("list-me") shortcut_name <- nm_("list-a-folder-shortcut") direct_ls <- drive_ls(target_name) local_drive_loud_and_wide() drive_ls_message <- capture.output( indirect_ls <- drive_ls(shortcut_name), type = "message" ) drive_ls_message <- drive_ls_message %>% scrub_filepath(target_name) %>% scrub_filepath(shortcut_name) %>% scrub_file_id() expect_snapshot( write_utf8(drive_ls_message) ) expect_equal(direct_ls$id, indirect_ls$id) }) test_that("drive_ls() passes ... through to drive_find()", { skip_if_no_token() skip_if_offline() d <- drive_get(nm_("list-me")) ## does user-specified q get appended to vs clobbered? ## if so, only about-html is listed here about <- drive_get(nm_("about-html")) out <- drive_ls(d, q = "fullText contains 'portable'", orderBy = NULL) expect_identical( about[c("name", "id")], out[c("name", "id")] ) ## does a non-q query parameter get passed through? ## if so, files are listed in reverse alphabetical order here out <- drive_ls(d, orderBy = "name desc") expect_identical( out$name, c(nm_("DESCRIPTION"), nm_("about-html")) ) }) test_that("`recursive` does its job", { skip_if_no_token() skip_if_offline() out <- drive_ls(nm_("topdir"), recursive = FALSE) expect_true( all( c(nm_("apple"), nm_("folder1-level1"), nm_("folder2-level1")) %in% out$name ) ) out <- drive_ls(nm_("topdir"), recursive = TRUE) expect_true( all( c( nm_("apple"), nm_("folder1-level1"), nm_("folder2-level1"), nm_("banana"), nm_("folder1-level2"), nm_("cranberry") ) %in% out$name ) ) out <- drive_ls(nm_("topdir"), q = "starred = true", recursive = TRUE) expect_true(all(c(nm_("apple"), nm_("cranberry")) %in% out$name)) }) googledrive/tests/testthat/test-drive_publish.R0000644000176200001440000000433514070147664021537 0ustar liggesusers# ---- nm_fun ---- nm_ <- nm_fun("TEST-drive_publish", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("foo_pdf"), nm_("foo_doc"), nm_("foo_sheet") )) } # ---- setup ---- if (SETUP) { drive_upload( file.path(R.home("doc"), "html", "about.html"), name = nm_("foo_doc"), type = "document" ) drive_upload( file.path(R.home("doc"), "BioC_mirrors.csv"), name = nm_("foo_sheet"), type = "spreadsheet" ) drive_upload( file.path(R.home("doc"), "html", "RLogo.pdf"), name = nm_("foo_pdf") ) } # ---- tests ---- test_that("drive_publish() publishes Google Documents", { skip_if_no_token() skip_if_offline() drive_doc <- drive_get(nm_("foo_doc")) ## since we haven't checked the publication status, ## this should be NULL expect_null(drive_doc[["drive_resource"]][[1]][["publish"]]) drive_doc <- drive_publish(drive_doc) ## the published column should be TRUE expect_true(drive_doc$published) ## let's unpublish it drive_doc <- drive_unpublish(drive_doc) ## now this sould be false expect_false(drive_doc$published) }) test_that("drive_publish() publishes Google Sheets", { ## we are testing this separately because revision ## history is a bit different for Sheets skip_if_no_token() skip_if_offline() drive_sheet <- drive_get(nm_("foo_sheet")) ## since we haven't checked the publication status, ## this should be NULL expect_null(drive_sheet[["drive_resource"]][[1]][["publish"]]) drive_sheet <- drive_publish(drive_sheet) ## the published column should be TRUE expect_true(drive_sheet$published) ## let's unpublish it drive_sheet <- drive_unpublish(drive_sheet) ## now this sould be false expect_false(drive_sheet$published) }) test_that("drive_publish() fails for non-native file type", { skip_if_no_token() skip_if_offline() drive_pdf <- drive_get(nm_("foo_pdf")) expect_snapshot(drive_publish(drive_pdf), error = TRUE) }) test_that("drive_publish() is vectorized", { skip_if_no_token() skip_if_offline() files <- drive_get(c(nm_("foo_doc"), nm_("foo_sheet"))) files <- drive_publish(files) expect_true(all(files$published)) files <- drive_unpublish(files) expect_false(all(files$published)) }) googledrive/tests/testthat/test-drive_read.R0000644000176200001440000000415314071171077020776 0ustar liggesusers# ---- nm_fun ---- nm_ <- nm_fun("TEST-drive_read", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("DESC"), nm_("chicken_doc"), nm_("imdb_latin1_csv") )) } # ---- setup ---- if (SETUP) { drive_upload(system.file("DESCRIPTION"), name = nm_("DESC")) drive_upload( drive_example_local("chicken.txt"), name = nm_("chicken_doc"), type = "document" ) tfile <- tempfile(fileext = ".csv") curl::curl_download( "https://matthew-brett.github.io/cfd2019/data/imdblet_latin.csv", destfile = tfile ) drive_upload(tfile, name = nm_("imdb_latin1_csv")) } # ---- tests ---- test_that("drive_read_string() extracts text", { skip_if_no_token() skip_if_offline() suppressMessages( r_desc <- drive_read_string(nm_("DESC")) ) r_desc <- as.list(read.dcf(textConnection(r_desc))[1, ]) expect_equal(r_desc$Package, "base") expect_equal(r_desc$Title, "The R Base Package") }) test_that("drive_read_raw() returns bytes", { skip_if_no_token() skip_if_offline() suppressMessages( r_desc_raw <- drive_read_raw(nm_("DESC")) ) suppressMessages( r_desc_string <- drive_read_string(nm_("DESC")) ) expect_equal(rawToChar(r_desc_raw), r_desc_string) }) test_that("drive_read() works on a native Google file", { skip_if_no_token() skip_if_offline() suppressMessages( chicken_poem <- drive_read_string(nm_("chicken_doc"), type = "text/plain") ) chicken_poem <- strsplit(chicken_poem, split = "(\r\n|\r|\n)")[[1]] expect_setequal( chicken_poem, read_utf8(drive_example_local("chicken.txt")) ) }) test_that("drive_read() can handle non UTF-8 input, if informed", { skip_if_no_token() skip_if_offline() suppressMessages( imdb <- drive_read_string(nm_("imdb_latin1_csv"), encoding = "latin1") ) imdb <- utils::read.csv(text = imdb, stringsAsFactors = FALSE, encoding = "UTF-8") expect_equal( names(imdb), c("Votes", "Rating", "Title", "Year", "Decade") ) leon <- "\u004C\u00E9\u006F\u006E" expect_equal(imdb$Title[[1]], leon) eight_and_a_half <- "\u0038\u00BD" expect_equal(imdb$Title[[31]], eight_and_a_half) }) googledrive/tests/testthat/test-drive_share.R0000644000176200001440000000212314070147664021164 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_share") nm_ <- nm_fun("TEST-drive_share", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("mirrors-to-share"), nm_("DESC") )) } # ---- setup ---- if (SETUP) { drive_upload(system.file("DESCRIPTION"), nm_("DESC")) } # ---- tests ---- test_that("drive_share() errors for invalid `role` or `type`", { expect_snapshot(drive_share(dribble(), role = "chef"), error = TRUE) expect_snapshot(drive_share(dribble(), type = "pet"), error = TRUE) }) test_that("drive_share() adds permissions", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("mirrors-to-share")) file <- drive_upload( file.path(R.home("doc"), "BioC_mirrors.csv"), name = me_("mirrors-to-share") ) expect_false(file$drive_resource[[1]]$shared) file <- drive_share(file, role = "commenter", type = "anyone") expect_true(file$shared) perms <- file[["permissions_resource"]][[1]][["permissions"]] expect_setequal(map_chr(perms, "role"), c("owner", "commenter")) expect_setequal(map_chr(perms, "type"), c("user", "anyone")) }) googledrive/tests/testthat/test-compat-vctrs.R0000644000176200001440000000676714071401260021317 0ustar liggesusers# based on https://github.com/tidymodels/workflowsets/blob/main/tests/testthat/test-compat-dplyr.R # vec_restore() ---- test_that("vec_restore() returns a dribble when it should", { x <- readRDS(test_file("just_a_dribble.rds")) expect_identical(vec_restore(x, x), x) expect_dribble(vec_restore(x, x)) }) test_that("vec_restore() returns dribble when row slicing", { x <- readRDS(test_file("just_a_dribble.rds")) row1 <- x[1, ] row0 <- x[0, ] expect_dribble(vec_restore(row1, x)) expect_dribble(vec_restore(row0, x)) }) test_that("vec_restore() returns bare tibble if `x` loses dribble cols", { x <- readRDS(test_file("just_a_dribble.rds")) col <- x[1] expect_bare_tibble(vec_restore(col, x)) }) # vec_ptype2() ---- test_that("vec_ptype2() is working", { x <- readRDS(test_file("just_a_dribble.rds")) x2 <- x x2$y <- 1 x3 <- x x3$z <- 2 tbl <- tibble(x = 1) df <- data.frame(x = 1) # dribble-dribble expect_identical(vec_ptype2(x, x), vec_slice(x, NULL)) expect_identical( vec_ptype2(x2, x3), new_dribble(df_ptype2(x2, x3)) ) # dribble-tbl_df expect_identical( vec_ptype2(x, tbl), vec_ptype2(new_tibble0(x), tbl) ) expect_identical( vec_ptype2(tbl, x), vec_ptype2(tbl, new_tibble0(x)) ) # dribble-df expect_identical( vec_ptype2(x, df), vec_ptype2(new_tibble0(x), df) ) expect_identical( vec_ptype2(df, x), vec_ptype2(df, new_tibble0(x)) ) }) # vec_cast() ---- test_that("vec_cast() is working", { x <- readRDS(test_file("just_a_dribble.rds")) x2 <- x x2$y <- 1 x3 <- x x3$z <- 2 tbl <- new_tibble0(x) df <- as.data.frame(tbl) # dribble-dribble expect_identical(vec_cast(x, x), x) x2_expect <- x x2_expect$y <- NA_real_ expect_identical(vec_cast(x, x2), x2_expect) expect_error( vec_cast(x2, x3), class = "vctrs_error_cast_lossy_dropped" ) # dribble-tbl_df expect_identical(vec_cast(x, tbl), tbl) expect_error(vec_cast(tbl, x), class = "vctrs_error_incompatible_type") # dribble-df expect_identical(vec_cast(x, df), df) expect_error(vec_cast(df, x), class = "vctrs_error_incompatible_type") }) # vctrs methods ---- test_that("vec_ptype() returns a dribble", { x <- readRDS(test_file("just_a_dribble.rds")) expect_dribble(vec_ptype(x)) }) test_that("vec_slice() generally returns a dribble", { x <- readRDS(test_file("just_a_dribble.rds")) expect_dribble(vec_slice(x, 0)) expect_dribble(vec_slice(x, 1:2)) }) test_that("vec_c() works", { x <- readRDS(test_file("just_a_dribble.rds")) tbl <- new_tibble0(x) expect_identical(vec_c(x), x) expect_identical(vec_c(x, x), new_dribble(vec_c(tbl, tbl))) expect_identical(vec_c(x[1:5, ], x[6:10, ]), x) }) test_that("vec_rbind() works", { x <- readRDS(test_file("just_a_dribble.rds")) tbl <- new_tibble0(x) expect_identical(vec_rbind(x), x) expect_identical( vec_rbind(x, x), new_dribble(vec_rbind(tbl, tbl)) ) expect_identical(vec_rbind(x[1:5, ], x[6:10, ]), x) }) test_that("vec_cbind() returns a bare tibble", { x <- readRDS(test_file("just_a_dribble.rds")) tbl <- new_tibble0(x) # Unlike vec_c() and vec_rbind(), the prototype of the output comes # from doing `x[0]`, which will drop the dribble class expect_identical(vec_cbind(x), vec_cbind(tbl)) expect_identical( vec_cbind(x, x, .name_repair = "minimal"), vec_cbind(tbl, tbl, .name_repair = "minimal") ) expect_identical( vec_cbind(x, tbl, .name_repair = "minimal"), vec_cbind(tbl, tbl, .name_repair = "minimal") ) }) googledrive/tests/testthat/test-drive_get_path.R0000644000176200001440000000630514070147664021663 0ustar liggesuserstest_that("get_last_path_part() works", { expect_last_part <- function(x, tail) { expect_equal(get_last_path_part(x), tail) } expect_last_part("~", "~/") expect_last_part("~/", "~/") expect_last_part("abc", "abc") expect_last_part("abc/", "abc/") expect_last_part("~/abc", "abc") expect_last_part("~/abc/", "abc/") expect_last_part("~/abc/def", "def") expect_last_part("~/abc/def/", "def/") expect_last_part("abc/def", "def") expect_last_part("abc/def/", "def/") expect_last_part("~/abc/def/ghi", "ghi") expect_last_part("~/abc/def/ghi/", "ghi/") expect_last_part("abc/def/ghi", "ghi") expect_last_part("abc/def/ghi/", "ghi/") }) test_that("resolve_paths() works, basic scenarios", { # a -- b -- c -- d # ??? -- e dr_folder <- list(kind = "drive#file", mimeType = "application/vnd.google-apps.folder") ancestors <- tibble( name = c("a", "b", "c"), id = c("1", "2", "3"), # id_parent = c(NA, "1", "2"), drive_resource = list( c(dr_folder, parents = list(list())), c(dr_folder, parents = list(list("1"))), c(dr_folder, parents = list(list("2"))) ) ) x <- tibble( name = "d", id = "4", drive_resource = list(list(kind = "drive#file", parents = list(list("3")))) ) with_mock( root_id = function() "", { out <- resolve_paths(as_dribble(x), ancestors) } ) expect_equal(out$path, "a/b/c/d") # target is a folder x$drive_resource <- list(c(dr_folder, parents = list(list("3")))) with_mock( root_id = function() "", { out <- resolve_paths(as_dribble(x), ancestors) } ) expect_equal(out$path, "a/b/c/d/") # target's parent is not among the elders x <- tibble( name = "e", id = "4", drive_resource = list(list(kind = "drive#file", parents = list(list("9")))) ) with_mock( root_id = function() "", { out <- resolve_paths(as_dribble(x), ancestors) } ) expect_equal(out$path, "e") }) test_that("resolve_paths() works, with some name duplication", { # name(id) # ___~(1) __ # / \ \ # a(2) a(3) \ __ b(4) # / | | # b(5) b(6) a(7) # | | # c(8) d(9) dr_folder <- list(kind = "drive#file", mimeType = "application/vnd.google-apps.folder") ancestors <- tibble( name = c("~", "a", "a", "b", "b", "b", "a"), id = c("1", "2", "3", "4", "5", "6", "7"), id_parent = c(NA, "1", "1", "1", "2", "3", "4"), drive_resource = list( c(dr_folder, parents = list(list())), c(dr_folder, parents = list(list("1"))), c(dr_folder, parents = list(list("1"))), c(dr_folder, parents = list(list("1"))), c(dr_folder, parents = list(list("2"))), c(dr_folder, parents = list(list("3"))), c(dr_folder, parents = list(list("4"))) ) ) x <- tibble( name = c("c", "d"), id = c("8", "9"), drive_resource = list( list(kind = "drive#file", parents = list(list("5"))), list(kind = "drive#file", parents = list(list("7"))) ) ) with_mock( root_id = function() "", { out <- resolve_paths(as_dribble(x), ancestors) } ) expect_equal(out$path[1], "~/a/b/c") expect_equal(out$path[2], "~/b/a/d") }) googledrive/tests/testthat/test-drive_get.R0000644000176200001440000001155014071143564020641 0ustar liggesusers# ---- nm_fun ---- nm_ <- nm_fun("TEST-drive_get", user_run = FALSE) # ---- clean ---- if (CLEAN) { files <- drive_find(nm_("thing0[1234]")) drive_trash(files) } # ---- setup ---- if (SETUP) { file_in_root <- drive_upload( system.file("DESCRIPTION"), name = nm_("thing01") ) drive_upload(system.file("DESCRIPTION"), name = nm_("thing02")) drive_upload(system.file("DESCRIPTION"), name = nm_("thing03")) folder_in_root <- drive_mkdir(nm_("thing01")) folder_in_folder <- drive_mkdir(nm_("thing01"), path = folder_in_root) file_in_folder_in_folder <- drive_cp( file_in_root, path = folder_in_folder, name = nm_("thing01") ) drive_upload( system.file("DESCRIPTION"), path = folder_in_root, name = nm_("thing04") ) } # ---- tests ---- test_that("drive_get() 'no input' edge cases", { skip_if_no_token() skip_if_offline() expect_identical(drive_get(), dribble_with_path()) expect_identical(drive_get(NULL), dribble_with_path()) expect_identical(drive_get(character(0)), dribble_with_path()) expect_snapshot(drive_get(id = NA_character_), error = TRUE) expect_snapshot(drive_get(id = ""), error = TRUE) local_drive_loud() expect_snapshot( dat <- drive_get("") ) expect_equal(dat, dribble_with_path()) }) test_that("drive_get() gives n-row output for n ids as input", { skip_if_no_token() skip_if_offline() two_files_find <- drive_find(pattern = nm_("thing0[12]")) two_files_get <- drive_get(id = two_files_find$id) expect_identical( two_files_find[c("name", "id")], two_files_get[c("name", "id")] ) }) test_that("drive_get(path = ...) works", { skip_if_no_token() skip_if_offline() one_file <- drive_get(nm_("thing02")) expect_dribble(one_file) expect_identical(nrow(one_file), 1L) two_files <- drive_get(c(nm_("thing02"), nm_("thing03"))) expect_dribble(two_files) expect_identical(two_files$name, c(nm_("thing02"), nm_("thing03"))) }) test_that("drive_get() for non-existent file", { skip_if_no_token() skip_if_offline() expect_identical(drive_get("this-should-give-empty"), dribble_with_path()) }) test_that("drive_get(path = ...) is correct wrt folder-ness, path config, rooted-ness", { skip_if_no_token() skip_if_offline() # files with these names exist, but not in this path configuration out <- drive_get(c(nm_("thing01"), nm_("thing02"))) expect_true(all(c(nm_("thing01"), nm_("thing02")) %in% out$name)) expect_identical( drive_get(file.path(nm_("thing01"), nm_("thing02"))), dribble_with_path() ) # file exists, but we don't get if specify it must be in root out <- drive_get(nm_("thing04")) expect_identical(out$name, nm_("thing04")) expect_identical( drive_get(file.path("~", nm_("thing04"))), dribble_with_path() ) # several files/folders exist with this name, but we only want rooted ones out <- drive_get(file.path("~", nm_("thing01"))) out <- drive_reveal(out, "parent") ROOT_ID <- root_id() expect_true(all(out$id_parent == ROOT_ID)) # several files/folders exist with this name, but we only want folders out <- drive_get(append_slash(nm_("thing01"))) expect_true(all(is_folder(out))) # several files/folders exist with this name, but we only want rooted folders out <- drive_get(append_slash(file.path("~", nm_("thing01")))) expect_true(all(is_folder(out))) out <- drive_reveal(out, "parent") expect_true(all(out$id_parent == ROOT_ID)) }) test_that("drive_get() gets root folder", { skip_if_no_token() skip_if_offline() from_path <- drive_get("~/") from_id <- drive_get(id = "root") from_id2 <- drive_get(as_id("root")) expect_equal(from_path$name, from_id$name) expect_equal(from_path$id, from_id$id) expect_equal(from_path$name, from_id2$name) expect_equal(from_path$id, from_id2$id) }) test_that("drive_get(path = ...) puts trailing slash on a folder", { skip_if_no_token() skip_if_offline() out <- drive_get(nm_("thing01")) out <- vec_slice(out, is_folder(out)) expect_match(out$path, "/$") }) test_that("drive_reveal_path() puts trailing slash on a folder", { skip_if_no_token() skip_if_offline() out <- drive_find(nm_("thing01"), type = "folder") out <- out %>% drive_reveal_path() out <- out %>% promote("mimeType") expect_match(out$path, "/$") }) test_that("drive_get() + drive_reveal_path() <--> drive_get() roundtrip", { skip_if_no_token() skip_if_offline() file <- drive_find(nm_("thing04")) file_from_id <- drive_get(as_id(file$id)) path_from_file <- drive_reveal_path(file_from_id) file_from_path <- drive_get(path_from_file$path) expect_equal(file_from_id$id, file_from_path$id) expect_equal(path_from_file$path, file_from_path$path) }) test_that("drive_get() works with a URL", { skip_if_no_token() skip_if_offline() file <- drive_find(nm_("thing02")) out <- drive_get(pluck(file, "drive_resource", 1, "webViewLink")) expect_identical(file$id, out$id) }) googledrive/tests/testthat/test-drive_find.R0000644000176200001440000000721314070147664021007 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_find") nm_ <- nm_fun("TEST-drive_find", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("find-me"), nm_("this-should-not-exist"), nm_("copy-me") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("find-me")) drive_upload( system.file("DESCRIPTION"), nm_("copy-me") ) } # ---- tests ---- test_that("drive_find() passes q", { skip_if_no_token() skip_if_offline() ## this should find at least 1 folder (find-me), and all files found should ## be folders out <- drive_find(q = "mimeType='application/vnd.google-apps.folder'") mtypes <- map_chr(out$drive_resource, "mimeType") expect_true(all(mtypes == "application/vnd.google-apps.folder")) }) test_that("drive_find() `type` filters for MIME type", { skip_if_no_token() skip_if_offline() ## this should find at least 1 folder (find-me), and all files found should ## be folders out <- drive_find(type = "folder") mtypes <- map_chr(out$drive_resource, "mimeType") expect_true(all(mtypes == "application/vnd.google-apps.folder")) }) test_that("drive_find() filters for the regex in `pattern`", { skip_if_no_token() skip_if_offline() expect_identical( drive_find(pattern = nm_("find-me"))$name, nm_("find-me") ) }) test_that("drive_find() errors for nonsense in `n_max`", { expect_snapshot(drive_find(n_max = "a"), error = TRUE) expect_snapshot(drive_find(n_max = 1:3), error = TRUE) expect_snapshot(drive_find(n_max = -2), error = TRUE) }) test_that("drive_find() returns early if n_max < 1", { expect_identical(drive_find(n_max = 0.5), dribble()) }) test_that("drive_find() returns empty dribble if no match for `pattern`", { skip_if_no_token() skip_if_offline() expect_identical( drive_find(pattern = nm_("this-should-not-exist")), dribble() ) }) test_that("drive_find() tolerates specification of pageSize", { skip_if_no_token() skip_if_offline() out <- drive_find(n_max = 10, pageSize = 5) expect_lte(nrow(out), 10) expect_lt(anyDuplicated(out$id), 1) }) test_that("drive_find() honors n_max", { skip_if_no_token() skip_if_offline() out <- drive_find(n_max = 4) expect_equal(nrow(out), 4) }) test_that("marshal_q_clauses() works in the absence of q", { params <- list(a = "a", b = "b") expect_identical(marshal_q_clauses(params), params) }) test_that("marshal_q_clauses() handles multiple q and vector q", { ## non-q params present params <- list(a = "a", q = as.character(1:2), q = "3") expect_identical( marshal_q_clauses(params), list(a = "a", q = as.character(1:3)) ) ## non-q params absent params <- list(q = as.character(1:2), q = "3") expect_identical( marshal_q_clauses(params), list(q = as.character(1:3)) ) }) test_that("trashed argument works", { skip_if_no_token() skip_if_offline() defer_drive_rm(drive_find(me_("trashed"), trashed = NA)) trashed <- drive_cp(nm_("copy-me"), name = me_("trashed")) drive_trash(trashed) untrashed <- drive_cp(nm_("copy-me"), name = me_("untrashed")) out <- drive_find() expect_false(me_("trashed") %in% out$name) expect_true(me_("untrashed") %in% out$name) out <- drive_find(trashed = TRUE) expect_true(me_("trashed") %in% out$name) expect_false(me_("untrashed") %in% out$name) out <- drive_find(trashed = NA) expect_true(me_("trashed") %in% out$name) expect_true(me_("untrashed") %in% out$name) ## make sure that `trashed = NA` is "inert", i.e. `trashed` can still be ## used in user-written q clauses out <- drive_find(trashed = NA, q = "trashed = true") expect_true(me_("trashed") %in% out$name) expect_false(me_("untrashed") %in% out$name) }) googledrive/tests/testthat/test-files/0000755000176200001440000000000014071401260017634 5ustar liggesusersgoogledrive/tests/testthat/test-files/mix_of_files_and_teamdrives.rds0000644000176200001440000001444214071401260026063 0ustar liggesusers]rVvf/v^xfj'f@a'*}q8Ua@ bn2RIU#o7w\%u]j {·sp/ OO~ߘCsݠy9QeC j`NɪH,M=!j=yɮ<= ) ϮcEyՂ1}qUϋi2DFgQOivUFYAB jY9Kgeߦy *KJ,j􏳶B,vT*FQQUfUR4Rj,MtYda77K=}B$Zt5=8OoIT Ci" 2XBm B)CnC&40@dh&Ο#R2ڢQ傢׍tz1fѾq!U*WIneWZ'/rcxgafnBhs׳-DE ۋϸuO4vepm\(] VgP>qCMJ:l) k_ H&&dU "Off9JXj,"n_SFqVJ /C^1P[IzH3x7Wͺj(rUQ8635eQPcQ'dd7hiþ! $r=66zb]`X\- Rx'm.dǻ"ԡ0mMY\ O:߀F4cˬXL 8G8]WMԝYbJhp(@b{+Y$KSDΙ'xYuF,+hV3J %0COf_*b:<=r@ֱ~ϗő|ռՕgn9{, ^zפ$}^ 4;,7_K s /M-:cw,r?$NYi&~R#Ǿ>57+̇x|sijifTzߚY X&!+smh3Uf. 3a7;R;7J5MȨZ¼7OL|bYdqM%[쐤dfR|Y%E^E^c&d9H>`[)%Gs1+1guSo]v%lj/V2o6mUcH xsEꭝ.49>sL87u{"Ѹ7$Nٺ7S%a*ũqДH$( Gtð3 0VcD<.Mj@ZW4FtVgҪ GC R P73lm>?Im}.jRťPJK {Jo4k%*^ksSgZTИ2猳ϗUiI/` [VVbM" DX"o{`FfG+|sI|!Xcf,,m:7||ܯqPD^ZLQbΙMP0MxIs! *).7-Q[=S3Y i9h n؃*|&)mY!_;a̝x!O`n'Wmp{ Ck'G>Uyo~pX$9f,cH$pS5zԨt|z[F]: G- AbYp6YFe?arv{EM a|s{= bh(-"4y%i[ 0Strv^N4N(U]6a9فL1$Q, CFBw "!0٧=r;i`ցJ3rg B` a By a˞_VK!sM [.z1u cRrdyAYP,(SH*mual?޻Tr>w4#`,Dzʢ!Uwpl.Aᐑ=`f%oq߂p E0QԼC:lJgk2j5/gn  V G_4sf9&AZVFgȽ&+{WU>uّ6n;~ eM*h{ B].9qZ^5C՝ֽ#Ӻ'9. =7A{e݇Ğpὲl +{_UK %.@)ηv^׌KKevo޾v^wS֋A7EXsTぁ8=9bx)!<1&}=ӮR Do1g<1-mê9VX gB סHD`$7IhvX ovŀ0pC۔]yj7>گoR&oRդra [vX}BX}BX}FXBX}BX͇Mt?f߰5N^>ǟ2*p/]+%1j^!.xPC\a7\y3yݹF4@0^fWyB@ (0lK@G h Q!hI`[H͟N~+~q؛L4?vf?v^cg ;C@9r qC>zW:w>Jɍq'~GEU9N)``zs09G 9LΑvvl]漰A8~Rlr$PJ(r1yI9?o ݙE; 7ݧ{r gjN+9T8+q]Ivn|n mvpy9x{۷e9>P] Voo }@}^G (vE}x7ܹI]>*y09ǁ;&Hp<#s`rwLw>Hz~2yE-Xz9BQVЛ䥁9Y;@H Ӈ az®qh:qG|V46}CXCq:[#H* V9YqbӉ~uu_vx'Z?)C/!~Hq~)pD4͋qhM;#is4`rLqд9v0=> 4B?!U ̮Y& rox҆}C& Izl\m źjñ6r~uLPVYR'zvđaaL|in1?b^.0|V0bXB zc!lP- FBhdS{ |$G|$G|$D¼(wLq9v0=A&HH ;#!a#a>#a>v HHڞ,[G;a3PD6\gq5<:jҪQ5%̉AiyoKiԚ*Qѕ,(bb0#v.Itψ 㳋Ad?6\:ͤx/IvE#S e dm4;2Ue5VcRF:BJI(1VINmS_,b2h}3erc˹bJ븊7 CeQ熍e}E3q̌3xh,A y"cT6\zP]&E=ͳgؤf!v#q'eeQJFvbN#hgNHÝ 0||R", -H(T|,R96V=zRuv &dIb(g"4ΐW(1:I)[hvRN:F^cڊfAÉ:Mp*cֿ(07SPX3c"Z&%5/J"ϓ>{PIaA±ȡqr "*ı3!t$bp4n:MbtR*)VCRy5*g!}kN/4!֫#F2%^&k,B5.Y "c#Ň'y b_?(A?ֻ=,Eát0Zq<ea ci&LqqFDx kt!͔T3I]N.t-Nj8"Uu*Q {tr.u`8kٖ仠XOk1Oe%$>l O_CPF  ܋ (]PU,z̯,2b駟1'./fJL6T}|*7awA: '|Yjdϴgoogledrive/tests/testthat/test-files/client_secret_123.googleusercontent.com.json0000644000176200001440000000057013515664367030310 0ustar liggesusers{"installed":{"client_id":"abc.apps.googleusercontent.com","project_id":"a_project","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"ssshh-i-am-a-secret","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}} googledrive/tests/testthat/test-files/just_a_dribble.rds0000644000176200001440000000723014071401260023320 0ustar liggesusersص-NO:ES̛ fi5}il RMam 1k`\.wUOjnIUe{s;U$yy}.wwUi% ]hfI4F;:]|&2Ft\&), *ZDUYgXsLQ2֙6v mVJ45=0Vm#O]7,Wt2uvPbQϦD梑QA]"eDgjo^8[b%ik'Q=l7kL "i*βM!;Et6a4bH:K6L+[EOR:oG˞D Vq-zUjfdB>#b'$3uYs9Um>Ͱ^FNEl!OE\K,M'%Pi[r֨VV])}}Xٜ-.ӖlU.3L1T2#S=JD>6qkd#|"eqnKn,g :} 6ŹuZ( pf?Iiȱ&.gG/UR 6 ,*i ko̧tb$Wz$}\lT b>GV6G9U>q?0^Xhn~չ",JVr&q3,Lg/? ?UC̑3C9U1\K&Lu;8/>kf#1C <[o)% 4xQ1%o,?8;(!hA4J|b(zO8 >hO7âd(=o[7~<;8KI;b3dusD: Y9z rZ"'C㈩~h*OFD,b;x5uvfw5}>ECXzMep y]X-XO_ؐwwtn6_[sc~[Ues#Quk)ip΂s_ )7bK!jvSD-]6Un '.( +ZmQ zqN[mV `c#p7]6_ۚhĤʋC_~[Ƨl䮲)Tiz3>&ƓxhQMA6k'J.{)np_R|-zi2cF1W9xlzUzH]/ނeo:>?N>:ObIUi;诮լ#;s6GhZSFڣLG2k~Ty6 ng{!{{pW ԋS *5D#j5s6=ZSXg&;@ Pؐyb.(_{ vZSB:PŲ6ŪNϱZR؏ߒ,+}D/vM8转+˸wEYwsdu}=_oMɦk=_m{|3v. 6LMT&~{ߌXv+xm_Y_gm}ܷ; -; %=;W+w-·ڳ6ǵK'7QMqko#`J^!P Ngfmqhd4-33G..髝-ͪbR0Y0Y   {,ݱ\3_(C!dۋ\8zv0&'Hx}abdvBagbx?,M%襣t*/8ţTАwdH  }0}0w>9u#"g]`$ ?vQyלgsF,y-<S2㽚ޫy̅[C_:KZ|uCbNW՜9W쌡•D1Kᢦsr`[,x1Z |Q' x€]<9H7x/Ck}u i>7<(d(f^pBA9#X2q˃ⷢ.bהG}eXLfhمƤD.6԰MKXΧKB%:CxdmRwB`2K ,Mo0x򆄁00X|y/)pb(1<&4xDp>'1,@CLcFGiދ5 IubW$K1 6=!_ !lGnM_ +{y7ÙAy"71iJ?JoGݩwo9B}]n A<׹ΓK=5g]@}2J`zh=Oސ_CPBZdMG6NP|?gc&m$&B="=PPn\>ZGLD I߂R>R~nMAR~rt{̇I1F @ĵṕmH'oHH!mCچ isi;|SN Qtq!Bt:%pTO^q |3Zmb 'SH- bZh7)=%א!Ix'gGb 9 *8rU.jAiV:*5ԊUVb4WTTN#%5E(UyFQRȨU&)/ -]Ď'I" Cd?yCBd ";Dvѩ ڽxh*&?΢-\6>%!<ێ: uk9cO܈CAچ}򆄴6mHېyS*yZ핹E۟=%ّ,=ןrHҐ~jrG\Ʃx9nx-%.8Zlj5cd'b^B)ϔyfLPb턝O :HOj|]P5ǰh ;o9rrzk!CN킄p1 sXkRuF*h/VYmr~JO!C5B=nɝ[ZZua1gsbA5Up,"!֥X/]B2h փ,Y Y>5dy!?PoG t%vO UeCvFE!?(djvab1_tԟVrꡳ|9nA% scrub_filepath(download_filepath) %>% scrub_filepath(file_to_download) %>% scrub_file_id() expect_snapshot( write_utf8(drive_download_message) ) expect_true(file.exists(download_filepath)) expect_identical(out$local_path, download_filepath) }) test_that("drive_download() errors if file does not exist on Drive", { skip_if_no_token() skip_if_offline() expect_snapshot(drive_download(nm_("this-should-not-exist")), error = TRUE) }) test_that("drive_download() converts with explicit `type`", { skip_if_no_token() skip_if_offline() file_to_download <- nm_("DESC-doc") tmpdir <- withr::local_tempdir(file_to_download) download_filename <- paste0(file_to_download, ".docx") local_drive_loud_and_wide() drive_download_message <- capture.output( withr::with_dir( tmpdir, drive_download(file = file_to_download, type = "docx") ), type = "message" ) drive_download_message <- drive_download_message %>% scrub_filepath(download_filename) %>% scrub_filepath(file_to_download) %>% scrub_file_id() expect_snapshot( write_utf8(drive_download_message) ) expect_true(file.exists(file.path(tmpdir, download_filename))) }) test_that("drive_download() converts with type implicit in `path`", { skip_if_no_token() skip_if_offline() file_to_download <- nm_("DESC-doc") tmpdir <- withr::local_tempdir(file_to_download) download_filename <- paste0(file_to_download, ".docx") local_drive_loud_and_wide() drive_download_message <- capture.output( withr::with_dir( tmpdir, drive_download(file = file_to_download, path = download_filename) ), type = "message" ) drive_download_message <- drive_download_message %>% scrub_filepath(download_filename) %>% scrub_filepath(file_to_download) %>% scrub_file_id() expect_snapshot( write_utf8(drive_download_message) ) expect_true(file.exists(file.path(tmpdir, download_filename))) }) test_that("drive_download() converts using default MIME type, if necessary", { skip_if_no_token() skip_if_offline() file_to_download <- nm_("DESC-doc") tmpdir <- withr::local_tempdir(file_to_download) download_filename <- paste0(file_to_download, ".docx") local_drive_loud_and_wide() drive_download_message <- capture.output( withr::with_dir( tmpdir, drive_download(file = file_to_download) ), type = "message" ) drive_download_message <- drive_download_message %>% scrub_filepath(download_filename) %>% scrub_filepath(file_to_download) %>% scrub_file_id() expect_snapshot( write_utf8(drive_download_message) ) expect_true(file.exists(file.path(tmpdir, download_filename))) }) googledrive/tests/testthat/setup-testing.R0000644000176200001440000000060014070147664020525 0ustar liggesusersCLEAN <- SETUP <- FALSE isFALSE <- function(x) identical(x, FALSE) with_drive_loud({ nm_ <- nm_fun("TEST-drive_something", user_run = FALSE) me_ <- nm_fun("TEST-drive_something") drive_bullets(c( "Test file naming scheme:", "*" = nm_("foo"), "*" = me_("foo") )) flush.console() Sys.sleep(1) # without this, the message still gets mixed in w/ test results }) googledrive/tests/testthat/test-drive_auth.R0000644000176200001440000000154014070147664021025 0ustar liggesuserstest_that("drive_auth_configure works", { old_app <- drive_oauth_app() old_api_key <- drive_api_key() withr::defer( drive_auth_configure(app = old_app, api_key = old_api_key) ) expect_error_free(drive_oauth_app()) expect_error_free(drive_api_key()) expect_snapshot( drive_auth_configure(app = gargle::gargle_app(), path = "PATH"), error = TRUE ) drive_auth_configure(app = gargle::gargle_app()) expect_s3_class(drive_oauth_app(), "oauth_app") drive_auth_configure(path = test_path("test-files/client_secret_123.googleusercontent.com.json")) expect_s3_class(drive_oauth_app(), "oauth_app") drive_auth_configure(app = NULL) expect_null(drive_oauth_app()) drive_auth_configure(api_key = "API_KEY") expect_identical(drive_api_key(), "API_KEY") drive_auth_configure(api_key = NULL) expect_null(drive_api_key()) }) googledrive/tests/testthat/driver.R0000644000176200001440000000327214070147664017215 0ustar liggesusers# this script extracts code from all individual test files to do: # * test setup = create the files/folders our tests expect to find on Drive # * test cleanup = delete the above files/folder from Drive # execute this to get two R scripts: # * all-test-setup.R # * all-test-clean.R library(purrr) library(glue) library(testthat) ## grabs code from two chunks: 'nm_fun' and chunk ('clean' or 'setup') do_one <- function(r_file, chunk) { knitr::read_chunk(r_file) out <- c( knitr:::knit_code$get("nm_fun"), knitr:::knit_code$get(chunk) ) knitr:::knit_code$restore() if (length(out) == 0) { return(NULL) } c(paste("#' ##", basename(r_file)), out) } test_files <- list.files( path = test_path(), pattern = "test-.+\\.R", full.names = TRUE ) clean_code <- test_files %>% map(do_one, chunk = "clean") %>% compact() setup_code <- test_files %>% map(do_one, chunk = "setup") %>% compact() header <- " #' --- #' title: googledrive test {action} #' date: '`r format(Sys.time())`' #' output: html_document #' --- #' This script aggregates the test-related {action} code from all test files. #+ setup, include = FALSE, cache = FALSE knitr::opts_chunk$set(collapse = TRUE, comment = '#>', error = TRUE) #+ body pkgload::load_all(here::here()) source(here::here('tests', 'testthat', 'helper.R')) drive_user() ## change this to TRUE when you are really ready to do this! {ACTION} <- FALSE " writeLines( c( glue_data(list(action = "clean", ACTION = "CLEAN"), header), unlist(clean_code) ), test_path("all-test-clean.R") ) writeLines( c( glue_data(list(action = "setup", ACTION = "SETUP"), header), unlist(setup_code) ), test_path("all-test-setup.R") ) googledrive/tests/testthat/test-drive_link.R0000644000176200001440000000144314071401260021005 0ustar liggesusers# ---- other ---- if (FALSE) { # how the test file was created # using shared-drive-capable token ... files <- drive_find(corpus = "allDrives", n_max = 10) sds <- shared_drive_find() x <- vec_rbind(files, sds) saveRDS(x, test_file("mix_of_files_and_teamdrives.rds"), version = 2) } # ---- tests ---- test_that("drive_link() extracts links for files and Team Drives, alike", { x <- readRDS(test_file("mix_of_files_and_teamdrives.rds")) links <- drive_link(x) expect_true(all(grepl("^https://.*\\.google\\.com/", links))) expect_identical(as_id(links), as_id(x)) }) test_that("drive_browse() passes links through", { if (interactive()) skip("interactive() is TRUE") x <- readRDS(test_file("mix_of_files_and_teamdrives.rds")) expect_identical(drive_browse(x), drive_link(x)) }) googledrive/tests/testthat/test-dribble.R0000644000176200001440000001074714071401260020271 0ustar liggesusers# ---- tests ---- test_that("tbl_sum.dribble method works", { d <- new_dribble( tibble( name = letters[1:2], id = letters[2:1], drive_resource = list(list(kind = "drive#file")) ) ) expect_snapshot(print(d)) }) test_that("dribble() creates empty dribble", { expect_dribble(dribble()) expect_equal(nrow(dribble()), 0) }) test_that("new_dribble() requires a list and adds the dribble class", { expect_snapshot(new_dribble(1:3), error = TRUE) expect_dribble(new_dribble(list( name = "NAME", id = "ID", drive_resource = list("DRIVE_RESOURCE") ))) }) test_that("validate_dribble() checks class, var names, var types", { expect_snapshot(validate_dribble("a"), error = TRUE) ## wrong type d <- dribble() d$id <- numeric() expect_snapshot(validate_dribble(d), error = TRUE) d$name <- logical() expect_snapshot(validate_dribble(d), error = TRUE) ## missing a required variable d <- dribble() d$name <- NULL expect_snapshot(validate_dribble(d), error = TRUE) d$id <- NULL expect_snapshot(validate_dribble(d), error = TRUE) ## list-col elements do not have `kind = "drive#file"` d <- new_dribble( tibble( name = "a", id = "1", drive_resource = list(kind = "whatever") ) ) expect_snapshot(validate_dribble(d), error = TRUE) }) test_that("as_tibble() drops the dribble class", { expect_false(inherits(as_tibble(dribble()), "dribble")) }) test_that("`[` retains dribble class when possible", { d <- new_dribble( tibble( name = letters[1:4], id = letters[4:1], drive_resource = list(list(kind = "drive#file")) ) ) expect_dribble(d) expect_dribble(d[1, ]) expect_dribble(d[1:2, ]) expect_dribble(d[1:3]) d$foo <- "foo" expect_dribble(d) expect_dribble(d[-4]) }) test_that("`[` drops dribble class when not valid", { d <- new_dribble( tibble( name = letters[1:4], id = letters[4:1], drive_resource = list(list(kind = "drive#file")) ) ) expect_dribble(d) expect_false(inherits(d[1], "dribble")) expect_false(inherits(d[, 1], "dribble")) }) test_that("dribble nrow checkers work", { d <- dribble() expect_true(no_file(d)) expect_false(single_file(d)) expect_false(some_files(d)) expect_snapshot(confirm_single_file(d), error = TRUE) expect_snapshot(confirm_some_files(d), error = TRUE) d <- new_dribble( tibble( name = "a", id = "b", drive_resource = list(list(kind = "drive#file")) ) ) expect_false(no_file(d)) expect_true(single_file(d)) expect_true(some_files(d)) expect_identical(confirm_single_file(d), d) expect_identical(confirm_some_files(d), d) d <- d[c(1, 1), ] expect_false(no_file(d)) expect_false(single_file(d)) expect_true(some_files(d)) expect_snapshot(confirm_single_file(d), error = TRUE) expect_identical(confirm_some_files(d), d) }) test_that("is_folder() works", { expect_identical(is_folder(dribble()), logical(0)) d <- new_dribble( tibble::tribble( ~name, ~id, ~drive_resource, "a", "aa", list(mimeType = "application/vnd.google-apps.folder"), "b", "bb", list(mimeType = "foo") ) ) expect_identical(is_folder(d), c(TRUE, FALSE)) }) test_that("as_dribble(NULL) returns empty dribble", { expect_identical(as_dribble(), dribble()) }) test_that("as_dribble() default method handles unsuitable input", { expect_snapshot(as_dribble(1.3), error = TRUE) expect_snapshot(as_dribble(TRUE), error = TRUE) }) test_that("as_dribble.list() works for good input", { drib_lst <- list( name = "name", id = "id", kind = "drive#file" ) expect_silent(d <- as_dribble(list(drib_lst))) expect_dribble(d) }) test_that("as_dribble.list() catches bad input", { ## not testing error messages, as_dribble.list() intended for internal use drib_lst <- list( name = "name" ) expect_snapshot(as_dribble(list(drib_lst)), error = TRUE) drib_lst <- list( name = "name", id = "id", kind = "whatever" ) expect_snapshot(as_dribble(list(drib_lst)), error = TRUE) }) test_that("as_parent() throws specific errors", { d <- new_dribble( tibble::tibble( name = letters[1:4], id = letters[4:1], drive_resource = list(list(kind = "drive#file")) ) ) expect_snapshot( { foo <- d[0, ] as_parent(foo) }, error = TRUE ) expect_snapshot( { foo <- d as_parent(foo) }, error = TRUE ) expect_snapshot( { foo <- d[1, ] as_parent(foo) }, error = TRUE ) }) googledrive/tests/testthat/test-drive_trash.R0000644000176200001440000000210714070147664021205 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_trash") nm_ <- nm_fun("TEST-drive_trash", user_run = FALSE) # ---- setup ---- if (SETUP) { drive_upload( system.file("DESCRIPTION"), nm_("trash-fodder") ) } # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("trash-fodder"), me_("trashee-1"), me_("trashee-2") )) } # ---- tests ---- test_that("drive_trash() moves files to trash and drive_untrash() undoes", { skip_if_no_token() skip_if_offline() defer_drive_rm(drive_find(me_("trashee-[12]"))) trashee1 <- drive_cp(nm_("trash-fodder"), name = me_("trashee-1")) trashee2 <- drive_cp(nm_("trash-fodder"), name = me_("trashee-2")) out <- drive_trash(c(me_("trashee-1"), me_("trashee-2"))) expect_dribble(out) expect_setequal(out$name, c(me_("trashee-1"), me_("trashee-2"))) expect_true(all(drive_reveal(out, "trashed")[["trashed"]])) out <- drive_untrash(c(me_("trashee-1"), me_("trashee-2"))) expect_dribble(out) expect_setequal(out$name, c(me_("trashee-1"), me_("trashee-2"))) expect_false(any(drive_reveal(out, "trashed")[["trashed"]])) }) googledrive/tests/testthat/test-request_generate.R0000644000176200001440000000446014070147664022241 0ustar liggesusers# ---- tests ---- test_that("request_generate() basically works", { req <- request_generate(endpoint = "drive.files.list", token = NULL) expect_type(req, "list") expect_setequal( names(req), c("method", "url", "body", "token") ) expect_match(req$url, "supportsAllDrives=TRUE") }) test_that("request_generate() errors for unrecognized parameters", { params <- list(chicken = "muffin", bunny = "pippin") expect_snapshot( (expect_error( request_generate( endpoint = "drive.files.list", params = params, token = NULL ), class = "gargle_error_bad_params" )) ) }) test_that("request_generate() and request_build() can deliver same result", { ## include a dummy token to prevent earnest efforts to find an API key gen <- request_generate( "drive.files.get", params = list(fileId = "abc"), token = httr::config(token = "token!") ) build <- gargle::request_build( path = "drive/v3/files/{fileId}", method = "GET", params = list(fileId = "abc", supportsAllDrives = TRUE), token = httr::config(token = "token!") ) # don't fail for this difference: body is empty list vs empty named list expect_identical(purrr::compact(gen), purrr::compact(build)) }) test_that("request_generate() suppresses API key if token is non-NULL", { req <- request_generate( "drive.files.get", params = list(fileId = "abc", key = "key in params"), key = "explicit key", token = httr::config(token = "token!") ) expect_false(grepl("key", req$url)) }) test_that("request_generate() adds gargle's tidyverse API key if no token", { req <- request_generate( "drive.files.get", params = list(fileId = "abc"), token = NULL ) expect_match(req$url, gargle::tidyverse_api_key()) }) test_that("request_generate(): explicit API key > key in params > built-in", { req <- request_generate( "drive.files.get", params = list(fileId = "abc"), key = "xyz", token = NULL ) expect_match(req$url, "key=xyz") req <- request_generate( "drive.files.get", params = list(fileId = "abc", key = "def"), key = "xyz", token = NULL ) expect_match(req$url, "key=xyz") req <- request_generate( "drive.files.get", params = list(fileId = "abc", key = "xyz"), token = NULL ) expect_match(req$url, "xyz") }) googledrive/tests/testthat/helper.R0000644000176200001440000000267114070147664017203 0ustar liggesusersauth_success <- tryCatch( drive_auth_testing(), googledrive_auth_internal_error = function(e) NULL ) if (!isTRUE(auth_success)) { drive_bullets(c( "!" = "Internal auth failed; calling {.fun drive_deauth}." )) drive_deauth() } skip_if_no_token <- function() { testthat::skip_if_not(drive_has_token(), "No Drive token") } with_mock <- function(..., .parent = parent.frame()) { mockr::with_mock(..., .parent = .parent, .env = "googledrive") } expect_error_free <- function(...) { expect_error(..., regexp = NA) } # usage: # test_file("something.rds") test_file <- function(name) testthat::test_path("test-files", name) defer_drive_rm <- function(..., env = parent.frame()) { withr::defer( with_drive_quiet(drive_rm(...)), envir = env ) } # used to replace volatile filepaths and file ids in snapshot tests # may eventually be unnecessary, depending on how this works out: # https://github.com/r-lib/testthat/issues/1345 # @param replace_me Should be a bare symbol that holds a fixed string scrub_filepath <- function(message, replace_me) { x <- ensym(replace_me) gsub(replace_me, paste0("{", as_string(x), "}"), message, fixed = TRUE) } scrub_file_id <- function(message) { gsub("", "", message, perl = TRUE) } expect_dribble <- function(x) { expect_s3_class(x, "dribble") } expect_bare_tibble <- function(x) { expect_s3_class(x, c("tbl_df", "tbl", "data.frame"), exact = TRUE) } googledrive/tests/testthat/_snaps/0000755000176200001440000000000014071401260017040 5ustar liggesusersgoogledrive/tests/testthat/_snaps/drive_ls.md0000644000176200001440000000100614071371401021171 0ustar liggesusers# drive_ls() errors if `path` does not exist Code drive_ls(nm_("this-should-not-exist")) Error Parent specified via `path` is invalid: x Does not exist. # drive_ls() list contents of the target of a folder shortcut Code write_utf8(drive_ls_message) Output i Parent specified via `path` is a shortcut; resolving to its target folder i Resolved 1 shortcut found in 1 file: * '{shortcut_name}' -> '{target_name}' googledrive/tests/testthat/_snaps/drive_create.md0000644000176200001440000000167314071371344022036 0ustar liggesusers# drive_create() errors for bad input (before hitting Drive API) Code drive_create() Error argument "name" is missing, with no default --- Code drive_create(letters) Error is_string(name) is not TRUE # drive_create() errors if parent path does not exist Code drive_create("a", path = "qweruiop") Error Parent specified via `path` is invalid: x Does not exist. # drive_create() errors if parent exists but is not a folder Code drive_create("a", path = x) Error Parent specified via `path` is invalid: x Is neither a folder nor a shared drive. # drive_create() catches invalid parameters Code (expect_error(drive_create("hi", bunny = "foofoo"), class = "gargle_error_bad_params") ) Output These parameters are unknown: * 'bunny' googledrive/tests/testthat/_snaps/utils-paths.md0000644000176200001440000000203114071401260021633 0ustar liggesusers# root_folder() and root_id() work Code root_folder() Output # A dribble: 1 x 3 name id drive_resource 1 My Drive 0AK935f1rlmIZUk9PVA --- Code root_id() Output [1] 0AK935f1rlmIZUk9PVA # rootize_path() errors for leading slash Code rootize_path("/") Error googledrive does not allow paths to start with `/` # partition_path() fails for bad input Code partition_path(letters) Error is_string(path) is not TRUE --- Code partition_path(dribble()) Error is_string(path) is not TRUE --- Code partition_path(as_id("123")) Error is_string(path) is not TRUE # rationalize_path_name() errors for bad `name`, before hitting API Code rationalize_path_name(name = letters) Error is_string(name) is not TRUE googledrive/tests/testthat/_snaps/drive_auth.md0000644000176200001440000000030114071371303021512 0ustar liggesusers# drive_auth_configure works Code drive_auth_configure(app = gargle::gargle_app(), path = "PATH") Error Must supply exactly one of `app` or `path`, not both googledrive/tests/testthat/_snaps/shortcut.md0000644000176200001440000000073114071371502021243 0ustar liggesusers# shortcut_create() works Code write_utf8(shortcut_create_message) Output Created Drive file: * '{sc_name}' With MIME type: * 'application/vnd.google-apps.shortcut' # shortcut_create() requires `name` to control `overwrite` Code shortcut_create(nm_("top-level-file"), overwrite = FALSE) Error You must specify the shortcut's `name` in order to specify `overwrite` behaviour. googledrive/tests/testthat/_snaps/drive_id-class.md0000644000176200001440000001226214071401260022255 0ustar liggesusers# as_id() errors for unanticipated input Code as_id(mean) Error Don't know how to coerce an object of class into a . --- Code as_id(1.2) Error Don't know how to coerce an object of class into a . --- Code as_id(1L) Error Don't know how to coerce an object of class into a . # drive_id's are formatted OK Code print(x$id) Output [1] 1CEefQCUc5T7B4yrawnNfqwdWEbiDyDs9E5OB9p6AXQ8 [2] 1oUrQNg-2lcAieZyCqoQ_vDwYLMVzhN4-oOSTt2L3Glw [3] 1V6qQhCVkgVRLUL24_lExApTklRsrDLv3 [4] 1uBR1UMWUXQ02OS9B6sQ3-98Z7QFUGUwn [5] 1U_5_O1-Od_q30wQVhGgZlMevFkcxHr7V [6] 1Y2O_otAmg7BN0Bk_5d-i9ZlGcflmw_uo [7] 1o_UmldMPpRfr4JlVyZKu1ZR2vN_m-uhs [8] 1oa-yeDNPd8x7sddbwHEWjGadY7HkGvMv [9] 1yeH1TqZczcPvhZoJvSOnG2_rfFCycyix [10] 1qSmvJtYUf6w1UtnA4XWUmG_qrVjjTnCN # drive_ids look OK in a dribble and truncate gracefully Code print(x) Output # A dribble: 10 x 3 name id drive_resource 1 foo_sheet-TEST-drive_publi~ 1CEefQCUc5T7B4yrawnNfqwdWEbiDyD~ 1 foo_sheet-TEST-dr~ application/vnd.goog~ 1CEefQCUc5T7B4yrawn~ 1 foo_sheet-TEST-drive_publi~ A must match this regular expression: `^[a-zA-Z0-9_-]+$` Invalid input: x '""' --- Code validate_drive_id("a@&") Error A must match this regular expression: `^[a-zA-Z0-9_-]+$` Invalid input: x 'a@&' # you can't insert invalid strings into a drive_id Code x[2] <- "" Error A must match this regular expression: `^[a-zA-Z0-9_-]+$` Invalid input: x '""' googledrive/tests/testthat/_snaps/drive_mime_type.md0000644000176200001440000000150414071371401022546 0ustar liggesusers# drive_mime_type() errors for invalid input Code drive_mime_type(1) Error `type` must be character. --- Code drive_mime_type(dribble()) Error `type` must be character. # drive_mime_type() errors for single unrecognized input Code drive_mime_type("nonsense") Error Unrecognized `type`: x 'nonsense' # drive_extension() errors for invalid input Code drive_extension(1) Error is.character(type) is not TRUE --- Code drive_extension(dribble()) Error is.character(type) is not TRUE # drive_extension() errors for single unrecognized input Code drive_extension("nonsense") Error Unrecognized `type`: x 'nonsense' googledrive/tests/testthat/_snaps/drive_reveal.md0000644000176200001440000000255414071371445022052 0ustar liggesusers# drive_reveal() works Code print(out <- drive_reveal(dat, "starred")[c("name", "starred")]) Output # A tibble: 3 x 2 name starred 1 i-am-a-google-doc-TEST-drive_reveal FALSE 2 i-have-a-description-TEST-drive_reveal FALSE 3 i-am-starred-TEST-drive_reveal TRUE --- Code print(out <- drive_reveal(dat, "description")[c("name", "description")]) Output # A tibble: 3 x 2 name description 1 i-am-a-google-doc-TEST-drive_reveal 2 i-have-a-description-TEST-drive_reveal description! 3 i-am-starred-TEST-drive_reveal --- Code print(out <- drive_reveal(dat, "mimeType")[c("name", "mime_type")]) Output # A tibble: 3 x 2 name mime_type 1 i-am-a-google-doc-TEST-drive_reveal application/vnd.google-apps.document 2 i-have-a-description-TEST-drive_reveal text/plain 3 i-am-starred-TEST-drive_reveal text/plain googledrive/tests/testthat/_snaps/drive_update.md0000644000176200001440000000142014071371465022047 0ustar liggesusers# drive_update() errors if local media does not exist Code drive_update(dribble(), "nope123") Error No file exists at the local `media` path: x 'nope123' # drive_update() informatively errors if the path does not exist Code drive_update(nm_("does-not-exist"), system.file("DESCRIPTION")) Error `file` does not identify at least one Drive file. # drive_update() informatively errors if the path is not unique Code drive_update(nm_("not-unique"), system.file("DESCRIPTION")) Error `file` identifies more than one Drive file. # no op if no media, no metadata Code out <- drive_update(nm_("update-fodder")) Message ! No updates specified. googledrive/tests/testthat/_snaps/dribble.md0000644000176200001440000000564614071401260021000 0ustar liggesusers# tbl_sum.dribble method works Code print(d) Output # A dribble: 2 x 3 name id drive_resource 1 a b 2 b a # new_dribble() requires a list and adds the dribble class Code new_dribble(1:3) Error `x` must be a list # validate_dribble() checks class, var names, var types Code validate_dribble("a") Error inherits(x, "dribble") is not TRUE --- Code validate_dribble(d) Error Invalid . This column has the wrong type: * `id` --- Code validate_dribble(d) Error Invalid . These columns have the wrong type: * `name` * `id` --- Code validate_dribble(d) Error Invalid . This required column is missing: * `name` --- Code validate_dribble(d) Error Invalid . These required columns are missing: * `name` * `id` --- Code validate_dribble(d) Error Invalid . Can't confirm `kind = "drive#file"` or `kind = "drive#drive"` for all elements of the `drive_resource` column. # dribble nrow checkers work Code confirm_single_file(d) Error `d` does not identify at least one Drive file. --- Code confirm_some_files(d) Error `d` does not identify at least one Drive file. --- Code confirm_single_file(d) Error `d` identifies more than one Drive file. # as_dribble() default method handles unsuitable input Code as_dribble(1.3) Error Don't know how to coerce an object of class into a . --- Code as_dribble(TRUE) Error Don't know how to coerce an object of class into a . # as_dribble.list() catches bad input Code as_dribble(list(drib_lst)) Error map_lgl(x, ~all(required_nms %in% names(.x))) is not TRUE --- Code as_dribble(list(drib_lst)) Error Invalid . Can't confirm `kind = "drive#file"` or `kind = "drive#drive"` for all elements of the `drive_resource` column. # as_parent() throws specific errors Code foo <- d[0, ] as_parent(foo) Error Parent specified via `foo` is invalid: x Does not exist. --- Code foo <- d as_parent(foo) Error Parent specified via `foo` is invalid: x Doesn't uniquely identify exactly one folder or shared drive. --- Code foo <- d[1, ] as_parent(foo) Error Parent specified via `foo` is invalid: x Is neither a folder nor a shared drive. googledrive/tests/testthat/_snaps/drive_publish.md0000644000176200001440000000053714071371433022236 0ustar liggesusers# drive_publish() fails for non-native file type Code drive_publish(drive_pdf) Error Only native Google files can be published. `file` includes a file with non-native MIME type * 'foo_pdf-TEST-drive_publish': 'application/pdf' i You can use `drive_share()` to change a file's sharing permissions. googledrive/tests/testthat/_snaps/shared_drives.md0000644000176200001440000000217414071371500022213 0ustar liggesusers# new_corpus() checks type and length, if not-NULL Code new_corpus(driveId = c("1", "2")) Error length(driveId) == 1 is not TRUE --- Code new_corpus(corpora = c("a", "b")) Error is_string(corpora) is not TRUE --- Code new_corpus(includeItemsFromAllDrives = c(TRUE, FALSE)) Error length(includeItemsFromAllDrives) == 1 is not TRUE # `corpora` is checked for validity Code shared_drive_params(corpora = "foo") Error Invalid value for `corpus`: x 'foo' These are the only acceptable values: * 'user' * 'drive' * 'allDrives' * 'domain' # `corpora = "drive"` requires shared drive specification Code shared_drive_params(corpora = "drive") Error When `corpus = "drive"`, you must also specify the `shared_drive`. # `corpora != "drive"` rejects shared drive specification Code shared_drive_params(corpora = "user", driveId = "123") Error When `corpus != "drive"`, you must not specify a `shared_drive`. googledrive/tests/testthat/_snaps/drive_download.md0000644000176200001440000000264514071371347022405 0ustar liggesusers# drive_download() won't overwrite existing file Code withr::with_dir(tmpdir, drive_download(dribble(), path = precious_filepath)) Error Local `path` already exists and overwrite is `FALSE`: * 'precious-TEST-drive_download.txt' # drive_download() downloads a file and adds local_path column Code write_utf8(drive_download_message) Output File downloaded: * '{file_to_download}' Saved locally as: * '{download_filepath}' # drive_download() errors if file does not exist on Drive Code drive_download(nm_("this-should-not-exist")) Error `file` does not identify at least one Drive file. # drive_download() converts with explicit `type` Code write_utf8(drive_download_message) Output File downloaded: * '{file_to_download}' Saved locally as: * '{download_filename}' # drive_download() converts with type implicit in `path` Code write_utf8(drive_download_message) Output File downloaded: * '{file_to_download}' Saved locally as: * '{download_filename}' # drive_download() converts using default MIME type, if necessary Code write_utf8(drive_download_message) Output File downloaded: * '{file_to_download}' Saved locally as: * '{download_filename}' googledrive/tests/testthat/_snaps/drive_examples.md0000644000176200001440000000153614071371351022405 0ustar liggesusers# drive_example_remote() errors when >1 match Code drive_example_remote("chicken") Error Found multiple matching remote files: * 'chicken_doc' * 'chicken_sheet' * 'chicken.csv' * 'chicken.jpg' * 'chicken.pdf' * 'chicken.txt' i Make the `matches` regular expression more specific. # drive_example_local() errors when >1 match Code drive_example_local("chicken") Error Found multiple matching local files: * 'chicken.csv' * 'chicken.jpg' * 'chicken.pdf' * 'chicken.txt' i Make the `matches` regular expression more specific. # drive_examples_local() errors when no match Code drive_examples_local("platypus") Error Can't find a local example file with a name that matches "platypus". googledrive/tests/testthat/_snaps/drive_find.md0000644000176200001440000000053614071371362021510 0ustar liggesusers# drive_find() errors for nonsense in `n_max` Code drive_find(n_max = "a") Error is.numeric(n_max) is not TRUE --- Code drive_find(n_max = 1:3) Error length(n_max) == 1 is not TRUE --- Code drive_find(n_max = -2) Error n_max >= 0 is not TRUE googledrive/tests/testthat/_snaps/drive_get.md0000644000176200001440000000075414071401260021340 0ustar liggesusers# drive_get() 'no input' edge cases Code drive_get(id = NA_character_) Error Can't `drive_get()` a file when `id` is `NA`. --- Code drive_get(id = "") Error A must match this regular expression: `^[a-zA-Z0-9_-]+$` Invalid input: x '""' --- Code dat <- drive_get("") Message ! Problem with 1 path: path is empty string ! No path resolved to exactly 1 file. googledrive/tests/testthat/_snaps/drive_cp.md0000644000176200001440000000325414071371316021171 0ustar liggesusers# drive_cp() can copy file in place Code write_utf8(drive_cp_message) Output Original file: * 'i-am-a-file-TEST-drive_cp' Copied to file: * '{cp_name}' # drive_cp() can copy a file into a different folder Code write_utf8(drive_cp_message) Output Original file: * 'i-am-a-file-TEST-drive_cp' Copied to file: * 'i-am-a-folder-TEST-drive_cp/{cp_name}' # drive_cp() doesn't tolerate ambiguity in `path` Code drive_cp(file, nm_("i-am-a-folder")) Error Unclear if `path` specifies parent folder or full path to the new file, including its name. See `?as_dribble()` for advice on how to make this clear. # drive_cp() errors if asked to copy a folder Code drive_cp(nm_("i-am-a-folder")) Error The Drive API does not copy folders or shared drives. # drive_cp() takes name, assumes path is folder if both are specified Code write_utf8(drive_cp_message) Output Original file: * 'i-am-a-file-TEST-drive_cp' Copied to file: * 'i-am-a-folder-TEST-drive_cp/{cp_name}' --- Code file_cp <- drive_cp(nm_("i-am-a-file"), path = nm_("file-name"), name = nm_( "file-name")) Error Parent specified via `path` is invalid: x Does not exist. --- Code file_cp <- drive_cp(nm_("i-am-a-file"), append_slash(nm_("not-unique-folder"))) Error Parent specified via `path` is invalid: x Doesn't uniquely identify exactly one folder or shared drive. googledrive/tests/testthat/_snaps/drive_fields.md0000644000176200001440000000074614071371351022037 0ustar liggesusers# drive_fields() admits it only knows about Files fields Code out <- drive_fields(x, resource = "foo") Message ! Currently only fields for the 'files' resource can be checked for validity. Nothing done. # drive_fields() detects bad fields Code out <- drive_fields(c("name", "parents", "ownedByMe", "pancakes!")) Warning Omitting fields that are not recognized as part of the Files resource: * 'pancakes!' googledrive/tests/testthat/_snaps/utils-ui.md0000644000176200001440000000376314071371512021154 0ustar liggesusers# bulletize() works Code cli::cli_bullets(bulletize(letters)) Message * a * b * c * d * e ... and 21 more --- Code cli::cli_bullets(bulletize(letters, bullet = "x")) Message x a x b x c x d x e ... and 21 more --- Code cli::cli_bullets(bulletize(letters, n_show = 2)) Message * a * b ... and 24 more --- Code cli::cli_bullets(bulletize(letters[1:6])) Message * a * b * c * d * e * f --- Code cli::cli_bullets(bulletize(letters[1:7])) Message * a * b * c * d * e * f * g --- Code cli::cli_bullets(bulletize(letters[1:8])) Message * a * b * c * d * e ... and 3 more --- Code cli::cli_bullets(bulletize(letters[1:6], n_fudge = 0)) Message * a * b * c * d * e ... and 1 more --- Code cli::cli_bullets(bulletize(letters[1:8], n_fudge = 3)) Message * a * b * c * d * e * f * g * h # warn_for_verbose() warns for `verbose = FALSE` w/ good message Code drive_something() Warning The `verbose` argument of `drive_something()` is deprecated as of googledrive 2.0.0. Set `options(googledrive_quiet = TRUE)` to suppress all googledrive messages. For finer control, use `local_drive_quiet()` or `with_drive_quiet()`. googledrive's `verbose` argument will be removed in the future. # warn_for_verbose(FALSE) makes googledrive quiet, in scope Code drive_bullets("chatty before") Message chatty before Code drive_something() drive_bullets("chatty after") Message chatty after googledrive/tests/testthat/_snaps/drive_put.md0000644000176200001440000000074614071371441021401 0ustar liggesusers# drive_put() works Code write_utf8(first_put) Output i No pre-existing Drive file at this path. Calling `drive_upload()`. Local file: * '{local_file}' Uploaded into Drive file: * '{put_file}' With MIME type: * 'text/plain' --- Code write_utf8(second_put) Output i A Drive file already exists at this path. Calling `drive_update()`. File updated: * '{put_file}' googledrive/tests/testthat/_snaps/drive_upload.md0000644000176200001440000000031714071371477022060 0ustar liggesusers# drive_upload() detects non-existent file Code drive_upload("no-such-file", "File does not exist") Error No file exists at the local `media` path: x 'no-such-file' googledrive/tests/testthat/_snaps/drive_mv.md0000644000176200001440000000236414071371421021207 0ustar liggesusers# drive_mv() can rename file Code write_utf8(drive_mv_message) Output Original file: * '{name_1}' Has been renamed: * '{name_2}' # drive_mv() can move a file into a folder given as path Code write_utf8(drive_mv_message) Output Original file: * '{mv_name}' Has been moved: * 'move-files-into-me-TEST-drive_mv/{mv_name}' # drive_mv() can move a file into a folder given as dribble Code write_utf8(drive_mv_message) Output Original file: * '{mv_name}' Has been moved: * 'move-files-into-me-TEST-drive_mv/{mv_name}' # drive_mv() can rename and move, using `path` and `name` Code write_utf8(drive_mv_message) Output Original file: * '{name_1}' Has been renamed and moved: * 'move-files-into-me-TEST-drive_mv/{name_2}' # drive_mv() can rename and move, using `path` only Code write_utf8(drive_mv_message) Output Original file: * '{name_1}' Has been renamed and moved: * 'move-files-into-me-TEST-drive_mv/{name_2}' googledrive/tests/testthat/_snaps/request_generate.md0000644000176200001440000000051214071371477022742 0ustar liggesusers# request_generate() errors for unrecognized parameters Code (expect_error(request_generate(endpoint = "drive.files.list", params = params, token = NULL), class = "gargle_error_bad_params")) Output These parameters are unknown: * 'chicken' * 'bunny' googledrive/tests/testthat/_snaps/drive_share.md0000644000176200001440000000057214071371450021670 0ustar liggesusers# drive_share() errors for invalid `role` or `type` Code drive_share(dribble(), role = "chef") Error 'arg' should be one of "reader", "commenter", "writer", "fileOrganizer", "owner", "organizer" --- Code drive_share(dribble(), type = "pet") Error 'arg' should be one of "user", "group", "domain", "anyone" googledrive/tests/testthat/test-drive_upload.R0000644000176200001440000000622114071401260021333 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_upload") nm_ <- nm_fun("TEST-drive_upload", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("upload-into-me"), nm_("uploade-via-folder-shortcut"), nm_("DESCRIPTION") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("upload-into-me")) shortcut_create(nm_("upload-into-me"), name = nm_("upload-via-folder-shortcut")) } # ---- tests ---- test_that("drive_upload() detects non-existent file", { expect_snapshot( drive_upload("no-such-file", "File does not exist"), error = TRUE ) }) test_that("drive_upload() places file in non-root folder, with new name", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("DESCRIPTION")) destination <- drive_get(nm_("upload-into-me")) uploadee <- drive_upload( system.file("DESCRIPTION"), path = destination, name = me_("DESCRIPTION") ) expect_dribble(uploadee) expect_identical(nrow(uploadee), 1L) expect_identical(drive_reveal(uploadee, "parent")$id_parent, destination$id) }) test_that("drive_upload() can place file via folder-shortcut", { skip_if_no_token() skip_if_offline() upload_name <- me_("upload-via-shortcut-folder") defer_drive_rm(upload_name) target_parent <- drive_get(nm_("upload-into-me")) shortcut <- nm_("upload-via-folder-shortcut") uploadee <- drive_upload( system.file("DESCRIPTION"), path = shortcut, name = upload_name ) expect_equal(drive_reveal(uploadee, "parent")$id_parent, target_parent$id) }) test_that("drive_upload() accepts body metadata via ...", { skip_if_no_token() skip_if_offline() defer_drive_rm(me_("DESCRIPTION")) uploadee <- drive_upload( system.file("DESCRIPTION"), name = me_("DESCRIPTION"), starred = TRUE ) expect_dribble(uploadee) expect_identical(nrow(uploadee), 1L) expect_true(uploadee$drive_resource[[1]]$starred) }) # https://github.com/tidyverse/googledrive/pull/342 test_that("drive_upload() does not mangle name with multi-byte characters", { skip_if_no_token() skip_if_offline() # KATAKANA LETTERS MA RU TI tricky_bit <- "\u30DE\u30EB\u30C1" filename_1 <- me_(paste0("multibyte-chars-1-", tricky_bit)) defer_drive_rm(filename_1) file_1 <- drive_upload( drive_example_local("chicken.csv"), path = filename_1, type = "spreadsheet" ) expect_equal(charToRaw(file_1$name), charToRaw(filename_1)) # TODO: when I was here, I hoped to also handle the case where the user # allows the Drive file name to come from its local name and *that* # name contains CJK characters # Ultimately I concluded that curl (the R package) doesn't really support # this currently, so I'm leaving it alone for now. # Leaving these notes, in case I ever come through here again. # https://github.com/jeroen/curl/issues/182 # https://github.com/curl/curl/issues/345 # filename_2 <- me_(paste0("multibyte-chars-2-", tricky_bit)) # filename_2 <- file.path(tempdir(), filename_2) # file.copy(drive_example_local("chicken.csv"), filename_2) # expect_true(file.exists(filename_2)) # file_2 <- drive_upload(media = filename_2) # expect_equal(charToRaw(file_2$name), charToRaw(filename_2)) }) googledrive/tests/testthat/test-utils-ui.R0000644000176200001440000000247314070147664020454 0ustar liggesuserstest_that("bulletize() works", { expect_snapshot(cli::cli_bullets(bulletize(letters))) expect_snapshot(cli::cli_bullets(bulletize(letters, bullet = "x"))) expect_snapshot(cli::cli_bullets(bulletize(letters, n_show = 2))) expect_snapshot(cli::cli_bullets(bulletize(letters[1:6]))) expect_snapshot(cli::cli_bullets(bulletize(letters[1:7]))) expect_snapshot(cli::cli_bullets(bulletize(letters[1:8]))) expect_snapshot(cli::cli_bullets(bulletize(letters[1:6], n_fudge = 0))) expect_snapshot(cli::cli_bullets(bulletize(letters[1:8], n_fudge = 3))) }) test_that("warn_for_verbose() does nothing for `verbose = TRUE`", { expect_warning(warn_for_verbose(TRUE), NA) }) test_that("warn_for_verbose() warns for `verbose = FALSE` w/ good message", { drive_something <- function() { withr::local_options(lifecycle_verbosity = "warning") warn_for_verbose(FALSE) } expect_snapshot( drive_something() ) }) test_that("warn_for_verbose(FALSE) makes googledrive quiet, in scope", { withr::local_options(lifecycle_verbosity = "quiet") local_drive_loud_and_wide() drive_something <- function() { warn_for_verbose(verbose = FALSE) drive_bullets("this message should not be emitted") } expect_snapshot({ drive_bullets("chatty before") drive_something() drive_bullets("chatty after") }) }) googledrive/tests/testthat/test-drive_endpoints.R0000644000176200001440000000062113516162146022062 0ustar liggesuserstest_that("drive_endpoint(s)() work(s)", { expect_length(drive_endpoints(), length(.endpoints)) expect_length(drive_endpoints(c(1, 3, 5)), 3) nms <- names(drive_endpoints()) expect_identical(drive_endpoints(c(1, 3, 5)), drive_endpoints(nms[c(1, 3, 5)])) expect_identical(drive_endpoints(2)[[1]], drive_endpoint(2)) expect_identical(drive_endpoints(nms[2])[[1]], drive_endpoint(nms[2])) }) googledrive/tests/testthat/test-drive_mime_type.R0000644000176200001440000000452214070147664022057 0ustar liggesusers# ---- tests ---- test_that("drive_mime_type() returns NULL if no input", { expect_null(drive_mime_type()) }) test_that("drive_mime_type(expose()) returns the full tibble", { expect_identical( drive_mime_type(expose()), .drive$mime_tbl ) }) test_that("drive_mime_type() returns MIME type for Drive native type", { expect_identical( drive_mime_type(c("spreadsheet", "document")), c( "application/vnd.google-apps.spreadsheet", "application/vnd.google-apps.document" ) ) }) test_that("drive_mime_type() returns MIME type for file extension", { expect_identical( drive_mime_type(c("pdf", "jpeg")), c("application/pdf", "image/jpeg") ) }) test_that("drive_mime_type() returns MIME type for MIME type", { input <- c("application/vnd.ms-excel", "text/html") expect_identical(drive_mime_type(input), input) }) test_that("drive_mime_type() returns MIME type for mixed input", { input <- c("text/html", NA, "folder", "csv") expect_identical( drive_mime_type(input), c("text/html", NA, "application/vnd.google-apps.folder", "text/csv") ) }) test_that("drive_mime_type() errors for invalid input", { expect_snapshot(drive_mime_type(1), error = TRUE) expect_snapshot(drive_mime_type(dribble()), error = TRUE) }) test_that("drive_mime_type() errors for single unrecognized input", { expect_snapshot(drive_mime_type("nonsense"), error = TRUE) }) test_that("drive_extension() returns NULL if no input", { expect_null(drive_extension()) }) test_that("drive_extension() returns file extension for MIME type", { expect_identical( drive_extension(c("application/pdf", "image/jpeg")), c("pdf", "jpeg") ) }) test_that("drive_extension() returns file extension for file extension", { input <- c("xlsx", "html") expect_identical(drive_extension(input), input) }) test_that("drive_extension() returns file extension for mixed input", { input <- c("text/html", NA, "application/vnd.google-apps.folder", "csv") expect_identical( drive_extension(input), c("html", NA, NA, "csv") ) }) test_that("drive_extension() errors for invalid input", { expect_snapshot(drive_extension(1), error = TRUE) expect_snapshot(drive_extension(dribble()), error = TRUE) }) test_that("drive_extension() errors for single unrecognized input", { expect_snapshot(drive_extension("nonsense"), error = TRUE) }) googledrive/tests/testthat/test-camelCase.R0000644000176200001440000000050014070147664020543 0ustar liggesuserstest_that("snake_case() works", { expect_equal(snake_case("name"), "name") expect_equal(snake_case("drive_resource"), "drive_resource") expect_equal(snake_case("mimeType"), "mime_type") expect_equal(snake_case("viewedByMeTime"), "viewed_by_me_time") expect_equal(snake_case("md5Checksum"), "md5_checksum") }) googledrive/tests/testthat/test-shortcut.R0000644000176200001440000000402014071401260020524 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-shortcut") nm_ <- nm_fun("TEST-shortcut", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("top-level-file"), nm_("i-am-a-folder"), nm_("good-shortcut"), nm_("bad-shortcut") )) } # ---- setup ---- if (SETUP) { good_target <- drive_upload( system.file("DESCRIPTION"), nm_("top-level-file") ) shortcut_create(good_target, name = nm_("good-shortcut"), overwrite = FALSE) drive_mkdir(nm_("i-am-a-folder"), overwrite = FALSE) bad_target <- drive_upload( system.file("DESCRIPTION"), nm_("target-to-delete") ) shortcut_create(bad_target, name = nm_("bad-shortcut"), overwrite = FALSE) drive_rm(bad_target) } # ---- tests ---- test_that("shortcut_create() works", { skip_if_no_token() skip_if_offline() target_file <- drive_get(nm_("top-level-file")) folder <- drive_get(nm_("i-am-a-folder")) sc_name <- me_("custom-named-shortcut") local_drive_loud_and_wide() shortcut_create_message <- capture.output( sc <- shortcut_create(target_file, path = folder, name = sc_name), type = "message" ) defer_drive_rm(sc) shortcut_create_message <- shortcut_create_message %>% scrub_filepath(sc_name) %>% scrub_file_id() expect_snapshot( write_utf8(shortcut_create_message) ) expect_true(is_shortcut(sc)) expect_equal( drive_reveal(sc, "parent")$id_parent, folder$id ) expect_match(sc$name, "custom-named-shortcut") }) test_that("shortcut_create() requires `name` to control `overwrite`", { skip_if_no_token() skip_if_offline() expect_snapshot( shortcut_create(nm_("top-level-file"), overwrite = FALSE), error = TRUE ) }) test_that("shortcut_resolve() works", { skip_if_no_token() skip_if_offline() target_file <- drive_get(nm_("top-level-file")) dat <- drive_find(nm_(""), type = "shortcut") dat <- shortcut_resolve(dat) expect_true(is.na(dat$name[grep("bad", dat$name_shortcut)])) expect_equal( dat$name[grep("good", dat$name_shortcut)], target_file$name ) }) googledrive/tests/testthat/test-drive_fields.R0000644000176200001440000000216614070147664021337 0ustar liggesusers# ---- tests ---- test_that("drive_fields() returns nothing, if no input", { expect_identical(drive_fields(), character()) }) test_that("drive_fields(expose()) returns full tibble of Files fields", { expect_identical( drive_fields(expose()), .drive$files_fields ) out <- drive_fields(expose(), resource = "foo") expect_identical(out, drive_fields(expose())) }) test_that("drive_fields() admits it only knows about Files fields", { local_drive_loud_and_wide() x <- letters[1:6] expect_snapshot( out <- drive_fields(x, resource = "foo") ) expect_identical(out, x) }) test_that("drive_fields() detects bad fields", { local_drive_loud_and_wide() expect_snapshot( out <- drive_fields(c("name", "parents", "ownedByMe", "pancakes!")) ) expect_identical(out, c("name", "parents", "ownedByMe")) }) test_that("prep_fields() concatenates input", { expect_identical( prep_fields(letters[1:2]), "files/a,files/b" ) expect_identical( prep_fields(letters[1:2], resource = NULL), "a,b" ) expect_identical( prep_fields(letters[1:2], resource = "blah"), "blah/a,blah/b" ) }) googledrive/tests/testthat/test-drive_rm.R0000644000176200001440000000043614070147664020505 0ustar liggesusers# ---- tests ---- test_that("drive_rm() copes with no input", { expect_identical(drive_rm(), dribble()) }) test_that("drive_rm() copes when there are no matching files", { skip_if_no_token() skip_if_offline() expect_identical(drive_rm("non-existent-file-name"), dribble()) }) googledrive/tests/testthat/test-utils.R0000644000176200001440000000166014070147664020036 0ustar liggesusers# ---- tests ---- test_that("put_column() adds a column in the right place", { df <- tibble(v1 = 1, v2 = 2) expect_identical( put_column(df, nm = "insert", val = 3, .after = "v1"), tibble(v1 = 1, insert = 3, v2 = 2) ) }) test_that("put_column() updates an existing column", { df <- tibble(v1 = 1, v2 = 2) expect_identical( put_column(df, nm = "v3", val = "hi"), tibble(v1 = 1, v2 = 2, v3 = "hi") ) }) test_that("put_column() works with an expression", { df <- tibble(v1 = 1, v2 = 2) stuff <- "stuff" expect_identical( put_column(df, nm = "v3", val = stuff), tibble(v1 = 1, v2 = 2, v3 = "stuff") ) }) test_that("and() protects its inputs with parentheses", { x <- c("organizerCount > 5", "memberCount > 20") expect_identical( as.character(and(c("createdTime > '2019-01-01T12:00:00'", or(x)))), "(createdTime > '2019-01-01T12:00:00') and (organizerCount > 5 or memberCount > 20)" ) }) googledrive/tests/testthat/test-drive_cp.R0000644000176200001440000001005214071401260020446 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_cp") nm_ <- nm_fun("TEST-drive_cp", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("i-am-a-folder"), nm_("copy-to-folder-shortcut"), nm_("not-unique-folder"), nm_("i-am-a-file") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("i-am-a-folder")) shortcut_create(nm_("i-am-a-folder"), name = nm_("copy-to-folder-shortcut")) drive_mkdir(name = nm_("not-unique-folder"), path = googledrive:::root_id()) drive_mkdir(name = nm_("not-unique-folder"), path = googledrive:::root_id()) drive_upload( system.file("DESCRIPTION"), nm_("i-am-a-file") ) } # ---- tests ---- test_that("drive_cp() can copy file in place", { skip_if_no_token() skip_if_offline() cp_name <- me_("i-am-a-file") defer_drive_rm(cp_name) file <- drive_get(nm_("i-am-a-file")) local_drive_loud_and_wide() drive_cp_message <- capture.output( cp_file <- drive_cp(file, name = cp_name), type = "message" ) drive_cp_message <- drive_cp_message %>% scrub_filepath(cp_name) %>% scrub_file_id() expect_snapshot( write_utf8(drive_cp_message) ) expect_identical(cp_file$name, cp_name) ## should have the same parent expect_identical( file$drive_resource[[1]]$parents, cp_file$drive_resource[[1]]$parents ) }) test_that("drive_cp() can copy a file into a different folder", { skip_if_no_token() skip_if_offline() cp_name <- me_("i-am-a-file") defer_drive_rm(cp_name) file <- drive_get(nm_("i-am-a-file")) folder <- drive_get(nm_("i-am-a-folder")) local_drive_loud_and_wide() drive_cp_message <- capture.output( cp_file <- drive_cp(file, path = folder, name = cp_name), type = "message" ) drive_cp_message <- drive_cp_message %>% scrub_filepath(cp_name) %>% scrub_file_id() expect_snapshot( write_utf8(drive_cp_message) ) expect_identical(cp_file$name, cp_name) # should have folder as parent file <- drive_reveal(cp_file, "parent") expect_identical(file$id_parent, folder$id) }) test_that("drive_cp() doesn't tolerate ambiguity in `path`", { skip_if_no_token() skip_if_offline() file <- drive_get(nm_("i-am-a-file")) # `path` lacks trailing slash, so ambiguous if it's parent folder or # folder + name expect_snapshot( drive_cp(file, nm_("i-am-a-folder")), error = TRUE ) }) test_that("drive_cp() errors if asked to copy a folder", { skip_if_no_token() skip_if_offline() expect_snapshot( drive_cp(nm_("i-am-a-folder")), error = TRUE ) }) test_that("drive_cp() takes name, assumes path is folder if both are specified", { skip_if_no_token() skip_if_offline() cp_name <- me_("file-name") defer_drive_rm(cp_name) local_drive_loud_and_wide() # if given `path` and `name`, assumes `path` is a folder # the message capture trick is necessary because cp_name includes {user} drive_cp_message <- capture.output( file_cp <- drive_cp( nm_("i-am-a-file"), path = nm_("i-am-a-folder"), name = cp_name ), type = "message" ) drive_cp_message <- drive_cp_message %>% scrub_filepath(cp_name) %>% scrub_file_id() expect_snapshot( write_utf8(drive_cp_message) ) expect_identical(file_cp$name, me_("file-name")) # error if `path` is not a folder expect_snapshot( file_cp <- drive_cp( nm_("i-am-a-file"), path = nm_("file-name"), name = nm_("file-name") ), error = TRUE ) # error if `path` doesn't uniquely identify one folder/shared drive expect_snapshot( file_cp <- drive_cp( nm_("i-am-a-file"), append_slash(nm_("not-unique-folder")) ), error = TRUE ) }) test_that("drive_cp() can copy to a folder-shortcut", { skip_if_no_token() skip_if_offline() target_parent <- drive_get(nm_("i-am-a-folder")) file_to_copy <- drive_get(nm_("i-am-a-file")) cp_name <- me_("i-am-a-file") defer_drive_rm(cp_name) out <- drive_cp( file_to_copy, path = nm_("copy-to-folder-shortcut"), name = cp_name ) expect_equal(drive_reveal(out, "parent")$id_parent, target_parent$id) }) googledrive/tests/testthat/test-shared_drives.R0000644000176200001440000000247514070147664021525 0ustar liggesuserstest_that("new_corpus() checks type and length, if not-NULL", { expect_silent(new_corpus()) expect_silent( new_corpus(driveId = "1", corpora = "b", includeItemsFromAllDrives = FALSE) ) expect_snapshot(new_corpus(driveId = c("1", "2")), error = TRUE) expect_snapshot(new_corpus(corpora = c("a", "b")), error = TRUE) expect_snapshot(new_corpus(includeItemsFromAllDrives = c(TRUE, FALSE)), error = TRUE) }) test_that("`corpora` is checked for validity", { expect_silent(shared_drive_params(corpora = "user")) expect_silent(shared_drive_params(corpora = "allDrives")) expect_silent(shared_drive_params(corpora = "domain")) expect_snapshot(shared_drive_params(corpora = "foo"), error = TRUE) }) test_that('`corpora = "drive"` requires shared drive specification', { expect_snapshot(shared_drive_params(corpora = "drive"), error = TRUE) }) test_that('`corpora != "drive"` rejects shared drive specification', { expect_snapshot( shared_drive_params(corpora = "user", driveId = "123"), error = TRUE ) }) test_that("a shared drive can be specified w/ corpora", { expect_silent(shared_drive_params(corpora = "drive", driveId = "123")) }) test_that('`corpora = "drive" is inferred from shared drive specification', { out <- shared_drive_params(driveId = "123") expect_identical(out$corpora, "drive") }) googledrive/tests/testthat/test-utils-paths.R0000644000176200001440000001375514071401260021145 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-utils-paths") nm_ <- nm_fun("TEST-utils-paths", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( nm_("create-in-me") )) } # ---- setup ---- if (SETUP) { drive_mkdir(nm_("create-in-me")) } # ---- tests ---- test_that("root_folder() and root_id() work", { skip_if_no_token() skip_if_offline() expect_snapshot( root_folder() ) expect_snapshot( root_id() ) }) test_that("rootize_path() standardizes root", { expect_identical(rootize_path(NULL), NULL) expect_identical(rootize_path(character()), character()) expect_identical(rootize_path("~"), "~/") expect_identical(rootize_path("~/"), "~/") }) test_that("rootize_path() errors for leading slash", { expect_snapshot(rootize_path("/"), error = TRUE) expect_error(rootize_path("/abc")) }) test_that("append_slash() appends a slash or declines to do so", { expect_identical(append_slash("a"), "a/") expect_identical(append_slash("a/"), "a/") expect_identical(append_slash(""), "") expect_identical(append_slash(c("a", "")), c("a/", "")) expect_identical(append_slash(character(0)), character(0)) }) test_that("strip_slash() strips a trailing slash", { expect_identical(strip_slash("a"), "a") expect_identical(strip_slash("a/"), "a") expect_identical(strip_slash(""), "") expect_identical(strip_slash(character(0)), character(0)) }) test_that("file_ext_safe() returns NULL unless there's a usable extension", { expect_null(file_ext_safe(NULL)) expect_null(file_ext_safe("foo")) expect_null(file_ext_safe("a/b/c/foo")) expect_identical(file_ext_safe("foo.wut"), "wut") }) test_that("partition_path() splits into stuff before/after last slash", { f <- function(x, y) list(parent = x, name = y) expect_identical(partition_path(NULL), f(NULL, NULL)) expect_identical(partition_path(character(0)), f(NULL, NULL)) expect_identical(partition_path(""), f(NULL, "")) expect_identical(partition_path("~"), f("~/", NULL)) expect_identical(partition_path("~/"), f("~/", NULL)) ## maybe_name = TRUE --> use `path` as is, don't append slash expect_identical(partition_path("~/a", TRUE), f("~/", "a")) expect_identical(partition_path("a/", TRUE), f("a/", NULL)) expect_identical(partition_path("a", TRUE), f(NULL, "a")) expect_identical(partition_path("~/a/b/", TRUE), f("~/a/b/", NULL)) expect_identical(partition_path("a/b/", TRUE), f("a/b/", NULL)) expect_identical(partition_path("a/b", TRUE), f("a/", "b")) }) test_that("partition_path() fails for bad input", { expect_snapshot(partition_path(letters), error = TRUE) expect_snapshot(partition_path(dribble()), error = TRUE) expect_snapshot(partition_path(as_id("123")), error = TRUE) }) test_that("is_path() works", { expect_true(is_path("a")) expect_true(is_path(letters)) expect_false(is_path(as_id("a"))) expect_false(is_path(as_id(letters))) expect_false(is_path(dribble())) }) test_that("rationalize_path_name() errors for bad `name`, before hitting API", { expect_snapshot(rationalize_path_name(name = letters), error = TRUE) }) test_that("rationalize_path_name() can pass `path` and `name` through, w/o hitting API", { # specifically, this happens when `is_path(path)` is FALSE expect_identical( rationalize_path_name(path = NULL, name = "NAME"), list(path = NULL, name = "NAME") ) expect_identical( rationalize_path_name(path = as_id("FILE_ID"), name = NULL), list(path = as_id("FILE_ID"), name = NULL) ) expect_identical( rationalize_path_name(path = as_id("FILE_ID"), name = "NAME"), list(path = as_id("FILE_ID"), name = "NAME") ) expect_identical( rationalize_path_name(path = dribble(), name = NULL), list(path = dribble(), name = NULL) ) expect_identical( rationalize_path_name(path = dribble(), name = "NAME"), list(path = dribble(), name = "NAME") ) }) test_that("rationalize_path_name() won't hit API if we can infer `path` is a folder", { expect_identical( rationalize_path_name(path = "PARENT_FOLDER", name = "NAME"), list(path = "PARENT_FOLDER/", name = "NAME") ) expect_identical( rationalize_path_name(path = "PARENT_FOLDER/", name = NULL), list(path = "PARENT_FOLDER/", name = NULL) ) }) test_that("rationalize_path_name() populates `path` and `name` and correctly", { with_mock( confirm_clear_path = function(path, name) NULL, { expect_identical( rationalize_path_name(path = "FILE_NAME", name = NULL), list(path = NULL, name = "FILE_NAME") ) expect_identical( rationalize_path_name(path = "PARENT_FOLDER/FILE_NAME", name = NULL), list(path = "PARENT_FOLDER/", name = "FILE_NAME") ) } ) }) test_that("check_for_overwrite() does its job", { skip_if_no_token() skip_if_offline() withr::defer(drive_empty_trash()) defer_drive_rm(file.path(nm_("create-in-me"), me_("name-collision"))) PARENT_ID <- drive_get(nm_("create-in-me"))$id first <- drive_create(me_("name-collision"), path = PARENT_ID) expect_error( check_for_overwrite( parent = PARENT_ID, name = me_("name-collision"), overwrite = FALSE ), "already exist" ) expect_error_free( second <- drive_create( me_("name-collision"), path = PARENT_ID, overwrite = TRUE ) ) expect_identical(first$name, second$name) expect_identical( drive_reveal(first, "parent")$id_parent, drive_reveal(second, "parent")$id_parent ) expect_false(first$id == second$id) expect_error_free( drive_create( me_("name-collision"), path = PARENT_ID, overwrite = NA ) ) df <- drive_ls(nm_("create-in-me")) expect_identical(nrow(df), 2L) expect_error( check_for_overwrite( parent = PARENT_ID, me_("name-collision"), overwrite = TRUE ), "Multiple items" ) }) test_that("check_for_overwrite() copes with `parent = NULL`", { skip_if_no_token() skip_if_offline() expect_error( check_for_overwrite(parent = NULL, nm_("create-in-me"), overwrite = FALSE), "already exist" ) }) googledrive/tests/testthat/test-drive_put.R0000644000176200001440000000347514071171077020701 0ustar liggesusers# ---- nm_fun ---- me_ <- nm_fun("TEST-drive_put") nm_ <- nm_fun("TEST-drive_put", user_run = FALSE) # ---- clean ---- if (CLEAN) { drive_trash(c( # no current need )) } # ---- setup ---- if (SETUP) { # no current need } # ---- tests ---- test_that("drive_put() works", { skip_if_no_token() skip_if_offline() local_file <- tempfile(me_("foo"), fileext = ".txt") put_file <- basename(local_file) download_target <- tempfile(me_("download"), fileext = ".txt") withr::defer({ unlink(local_file) unlink(download_target) }) defer_drive_rm(drive_find(me_("foo"))) write_utf8(c("beginning", "middle"), local_file) local_drive_loud_and_wide() first_put <- capture.output( original <- drive_put(local_file), type = "message" ) first_put <- first_put %>% scrub_filepath(local_file) %>% scrub_filepath(put_file) %>% scrub_file_id() expect_snapshot( write_utf8(first_put) ) expect_dribble(original) with_drive_quiet( drive_download(original, path = download_target) ) expect_identical( read_utf8(local_file), read_utf8(download_target) ) cat("end", file = local_file, sep = "\n", append = TRUE) second_put <- capture.output( second <- drive_put(local_file), type = "message" ) second_put <- second_put %>% scrub_filepath(put_file) %>% scrub_file_id() expect_snapshot( write_utf8(second_put) ) expect_identical(original$id, second$id) with_drive_quiet( drive_download(original, path = download_target, overwrite = TRUE) ) expect_identical( read_utf8(local_file), read_utf8(download_target) ) with_drive_quiet( name_collider <- drive_create(basename(local_file)) ) # not easy to convert to snapshot, due to volatile file ids expect_error( drive_put(local_file), "Multiple items" ) }) googledrive/tests/testthat.R0000644000176200001440000000010213515455715015711 0ustar liggesuserslibrary(testthat) library(googledrive) test_check("googledrive") googledrive/vignettes/0000755000176200001440000000000014071433176014576 5ustar liggesusersgoogledrive/vignettes/googledrive.Rmd0000644000176200001440000000071013370700034017535 0ustar liggesusers--- title: "googledrive" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{googledrive} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- Please see the googledrive website for full documentation: * In addition to function-specific help, there are several articles which are indexed here: * [Article index](https://googledrive.tidyverse.org/articles/index.html) googledrive/R/0000755000176200001440000000000014071401260012754 5ustar liggesusersgoogledrive/R/promote.R0000644000176200001440000000254114071401260014566 0ustar liggesusers# promote an element in drive_resource into a top-level column # # if you request `this_var` or `thisVar`, we look for `thisVar` in # drive_resource, but use the original input as the variable name # # if a column by that name already exists, it is overwritten in place # otherwise, the new column will be the second column, presumably after `name` # # morally, this is a lot like tidyr::hoist(), but with a more specific mandate promote <- function(d, elem) { elemCamelCase <- camelCase(elem) x <- map(d$drive_resource, elemCamelCase) absent <- all(map_lgl(x, is_null)) if (absent) { # TO DO: do we really want promote() to be this forgiving? # adds a placeholder column for elem if not present in drive_resource # ensure elem is added, even if there are zero rows val <- rep_len(list(NULL), nrow(d)) } else { val <- simplify_col(x) } put_column(d, nm = elem, val = val, .after = 1) } # simplified version of tidyr:::simplify_col() simplify_col <- function(x) { is_list <- map_lgl(x, is_list) is_vec <- map_lgl(x, ~ vec_is(.x) || is_null(.x)) is_not_vec <- !is_vec if (any(is_list | is_not_vec)) { return(x) } n <- map_int(x, vec_size) is_scalar <- n %in% c(0, 1) if (any(!is_scalar)) { return(x) } x[n == 0] <- list(NA) tryCatch( vec_c(!!!x), vctrs_error_incompatible_type = function(e) x ) } googledrive/R/shared_drive_get.R0000644000176200001440000000437714071401260016410 0ustar liggesusers#' Get shared drives by name or id #' #' @description #' Retrieve metadata for shared drives specified by name or id. Note that Google #' Drive does NOT behave like your local file system: #' * You can get zero, one, or more shared drives back for each name! Shared #' drive names need not be unique. #' @template shared-drive-description #' @param name Character vector of names. A character vector marked with #' [as_id()] is treated as if it was provided via the `id` argument. #' @param id Character vector of shared drive ids or URLs (it is first processed #' with [as_id()]). If both `name` and `id` are non-`NULL`, `id` is silently #' ignored. #' #' @eval return_dribble("shared drive") #' @export #' @examples #' \dontrun{ #' shared_drive_get("my-awesome-shared-drive") #' shared_drive_get(c("apple", "orange", "banana")) #' shared_drive_get(as_id("KCmiHLXUk9PVA-0AJNG")) #' shared_drive_get(as_id("https://drive.google.com/drive/u/0/folders/KCmiHLXUk9PVA-0AJNG")) #' shared_drive_get(id = "KCmiHLXUk9PVA-0AJNG") #' shared_drive_get(id = "https://drive.google.com/drive/u/0/folders/KCmiHLXUk9PVA-0AJNG") #' } shared_drive_get <- function(name = NULL, id = NULL) { if (length(name) + length(id) == 0) return(dribble()) if (!is.null(name) && is_drive_id(name)) { id <- name name <- NULL } if (!is.null(name)) { stopifnot(all(map_lgl(name, is_string))) return(shared_drive_from_name(name)) } stopifnot(is.character(id)) # TODO: use a batch request as_dribble(map(as_id(id), get_one_shared_drive_id)) } get_one_shared_drive_id <- function(id) { if (is.na(id)) { drive_abort(" Can't {.fun shared_drive_get} a shared drive when {.arg id} is {.code NA}.") } request <- request_generate( endpoint = "drive.drives.get", params = list( driveId = id, fields = "*" ) ) response <- request_make(request) gargle::response_process(response) } shared_drive_from_name <- function(name = NULL) { if (length(name) == 0) return(dribble()) shared_drives <- shared_drive_find() if (no_file(shared_drives)) return(dribble()) shared_drives <- shared_drives[shared_drives$name %in% name, ] ## TO DO: message if a name matches 0 or multiple shared drives? shared_drives[order(match(shared_drives$name, name)), ] } googledrive/R/request_make.R0000644000176200001440000001306314070147664015605 0ustar liggesusers#' Make a request for the Google Drive v3 API #' #' Low-level functions to execute one or more Drive API requests and, perhaps, #' process the response(s). Most users should, instead, use higher-level #' wrappers that facilitate common tasks, such as uploading or downloading Drive #' files. The functions here are intended for internal use and for programming #' around the Drive API. Three functions are documented here: #' * `request_make()` does the bare minimum: calls [gargle::request_make()], #' only adding the googledrive user agent. Typically the input is created #' with [request_generate()] and the output is processed with #' [gargle::response_process()]. #' * `do_request()` is simply #' `gargle::response_process(request_make(x, ...))`. It exists only because #' we had to make `do_paginated_request()` and it felt weird to not make the #' equivalent for a single request. #' * `do_paginated_request()` executes the input request **with page #' traversal**. It is impossible to separate paginated requests into a "make #' request" step and a "process request" step, because the token for the #' next page must be extracted from the content of the current page. #' Therefore this function does both and returns a list of processed #' responses, one per page. #' #' @param x List, holding the components for an HTTP request, presumably created #' with [request_generate()] Should contain the `method`, `url`, `body`, #' and `token`. #' @param ... Optional arguments passed through to the HTTP method. #' @template verbose #' #' @return `request_make()`: Object of class `response` from [httr]. #' @export #' @family low-level API functions request_make <- function(x, ...) { gargle::request_make(x, ..., user_agent = drive_ua()) } #' @rdname request_make #' @export #' @return `do_request()`: List representing the content returned by a single #' request. do_request <- function(x, ...) { gargle::response_process(request_make(x, ...)) } #' @rdname request_make #' @param n_max Maximum number of items to return. Defaults to `Inf`, i.e. there #' is no limit and we keep making requests until we get all items. #' @param n Function that computes the number of items in one response or page. #' The default function always returns `1` and therefore treats each page as #' an item. If you know more about the structure of the response, you can #' pass another function to count and threshhold, for example, the number of #' files or comments. #' @export #' @return `do_paginated_request()`: List of lists, representing the returned #' content, one component per page. #' @examples #' \dontrun{ #' # build a request for an endpoint that is: #' # * paginated #' # * NOT privileged in googledrive, i.e. not covered by request_generate() #' # "comments" are a great example #' # https://developers.google.com/drive/v3/reference/comments #' # #' # Practice with a target file with > 2 comments #' # Note that we request 2 items (comments) per page #' req <- build_request( #' path = "drive/v3/files/{fileId}/comments", #' method = "GET", #' params = list( #' fileId = "your-file-id-goes-here", #' fields = "*", #' pageSize = 2 #' ), #' token = googledrive::drive_token() #' ) #' # make the paginated request, but cap it at 1 page #' # should get back exactly two comments #' do_paginated_request(req, n_max = 1) #' } do_paginated_request <- function(x, ..., n_max = Inf, n = function(res) 1, verbose = deprecated()) { warn_for_verbose(verbose) ## when traversing pages, you can't cleanly separate the task into ## request_make() and gargle::response_process(), because you need to process ## response / page i to get the pageToken for request / page i + 1 ## so this function does both stopifnot(identical(x$method, "GET")) ## if fields does not exist yet, you will need something to prepend ## "nextPageToken" to ... "all fields" seems like best (only?) default choice x$query$fields <- x$query$fields %||% "*" if (!grepl("nextPageToken", x$query$fields)) { x$query$fields <- glue("nextPageToken,{x$query$fields}") } responses <- list() i <- 1 total <- 0 # TODO: do I have anything to say here at the beginning? # what's a non-jargon-y and general way to say: # "we're hitting a paginated endpoint and we're working with pageSize n" st <- show_status() if (st) sb <- cli::cli_status(msg = character()) repeat { page <- request_make(x, ...) responses[[i]] <- gargle::response_process(page) x$query$pageToken <- responses[[i]]$nextPageToken x$url <- httr::modify_url(x$url, query = x$query) # TODO: presumably this might need some generalization when this moves # to gargle (how we determine how much 'stuff' we've seen and how we # talk about it in the status bar) # TODO: need to do something re: non-interactive work, e.g. Rmd total <- total + n(responses[[i]]) if (is.null(x$query$pageToken) || total >= n_max) { break } if (st) { cli::cli_status_update( id = sb, "{cli::symbol$arrow_right} Files retrieved so far: {total}" ) } i <- i + 1 } responses } show_status <- function() { is_interactive() && is_false(getOption("googledrive_quiet", FALSE)) } drive_ua <- function() { httr::user_agent(paste0( "googledrive/", utils::packageVersion("googledrive"), " ", "(GPN:RStudio; )", " ", "gargle/", utils::packageVersion("gargle"), " ", "httr/", utils::packageVersion("httr") )) } googledrive/R/sysdata.rda0000644000176200001440000004535414071171077015141 0ustar liggesusersBZh91AY&SY~ r_X! I#wUTEUѷa´e@)4P@@4HVQƖetYNZ094JZ)JnlIF4t]`4[P1 +jlhXIEbѐ4Ilae@ H @pl-RB$LNC@ bV*=MM<?)5OSh Rm21M =zz)M44ḍM44񩨀4ɦdѦddd2ddh ѠAhdɀ LhMM`FFMC&AF2 `4M h!)"%OU2iSlJ=TP4ѡ4P H R?ԧJzj64 =4' SOHCISj 0@ѣ@фJD @F"aSҞSI4TD~=OPm3S@Cy*j}&Qc)1 e_*\D1%K\ZU+nM-RmIMEZEI4- QR aC?oY@]v][mjk:FiiRr]zaͮnp1iO3 XRiz1%}_&U8>R;Ih.ZEwV9~'⥌1IQ=;5J}075L>gێ2^&*jb_J$n$I0p%# A,BD&H1&z8XILeG$@ 4d$@ 1lkF&2e2\O:u;#JdVe CA01H3@иJ I$2I$d  +K͸35~d^}6K,V؞?F?do_]n߭k8}ߞַ˷o'=g:>|cs͞tL[GL!N$:6wqzM:saqYkYI@ $֒52qG ZskQ1c$8Na,06\umf` !Đ${[F0H#$fdCՙ9LLN&vV.&s[ dÒ":1H$Ju&Д;r] evML> :uƴyW 9В(O*RM2#&L(rSlmWlA\2"@GClmQҟXHL>x?"pMMG')U7 Hz$!$e*44H0U24xBPrw0591ɵs520vdMLUK%X` DcfS0, 2,bT^}/T1DLM]Fח#R_.~ɒ:`21Jm^XƓʝOOdɓ&M& L572l@sHJ,ň41<@;z;ҽvC)\bO_aE)dΘgl^[d&L̕O4AZ8\g?6nmm׌l.U]w @S`v(z;xNo@p_V0/huhVvUȇscT{vjdGg|vYNٗ?o߳;OOx,3&H};QL9Iu?q U^+)z<帟?T)?2bq^hdl{71OS.2rɀ`2@c;`O$ɓ \0d6kSUA2HJ&L$\rpLc CQ$H82N:d8u)Lc2Iph[qPlTf]/L^š`Iw;|&{iOyLAl!pq^':o`詣3;25?x57*N"?FL2e+#)KDVV+<; _=OߟgtM̙1;`v񖚟tY8<.wq>x#Q1 ZzO'֟c8LJ흭fgy{9k33/Çz7:#ck^vW:.I{]UQ//O4OG$|SOzc1sf;[莓xɓk~2r=?D;'=s75z1ê5Ra964-_ݙ?4e qi5ƦsW#|﮷~3;'œ֚|<|s |zڞgGs}>z |.;=؛{ s yǒ~x<~KEm1oo^wm$&ᣥe_R;>sin{./EN;ll^23K͹?0\E{Q@O]q؇>E @D L+k|!XR]S뾏k<5< Ryd=,).SKN\N&2sUiO+3sWj^f-)7vWF714wiZ0ndN-:O N|'zv]ۛxpNd{npS4>'&tzdžV5nyqreh nlɼNkmjnku;2źzxyO_G}ivv-<\0q[p KuɌ,d4i~V\Q֋S&EOwΝ۞(LOOxo2rxe{۫v/F1xc٩7f 7mc豟[m[cLO6 0lѹzW/y70Nf?ipw{Z >h6n[00dcsdmV3slD22dq8P۰RS)9SszxG+s3O)|ϳvbd;Y=lt]mSWF517w6)ȝjj22ww;;Ni7:.ML!秩SSBi sSRɉ&còiÇ]NM|7Sޗih{&Ob}jv@Sj⺍j{k'᩻'CypzieY>I=O3yӱ߽MۘOIV`|fMչx112gs_mV<bg80MNɯ8_߫ʽ|ij4s^<]u2jx9Z^'c߆&g {Ltj}gOy5=m=b=m;_;3mZM0j'BqONpY12&'Ѭ=kUx_p1q>RX~ZO@|?/`K'ƮgwëSsuvǙ5ܽ+c,yif -k̮u-F'w q7yOnȰ,}Ө#qXc'}bbav8}t'DSt>E2g+q OCOSSs8Lnsr3+F2̶oi W;zvM3odh5V ;Va6=}~ө75;i8N]NSәՓ"ɑjw޼vmӊe;7q;fxpT/{\ywMz{N)E?b p3$Yiޭ54s-kssuˀ|".:u74ƹ֑`gˇ3S3 |i4ɯlOvi[|2~ssѩ=jhᆧjy&2M({&QɹfNlɹx9c> c'ËwG}zs;g3zw`\MMMNΦI5sӮ3SWiNfNGgSbwa8az_\ |!g:V$ݢi1V=YcOǁHT>_ GK.ެWrr[k/3 #)ZKfK[hΘԘ&EmҎEt[^ >IzM9p\ی먺n ʽ]N%NB-M-/Q>gc *42`*=/"X1bn񔖫 S6g=\F&бS]X[z6OLs(#^L.<ʩܕ/}yql9x<<#.ZM>=Ga/3߀-.dx4b>N֟qB}?1`~DSA_89J~>ό52pn1SVdޚyGe-.ct'rnlg˘O9rbX݌=GE&YR|-LsvMw?c;4^͟Ng7[?{4'a:z՝s|òN;{cnh4'+*{f=ZF|zcM}ZS1:xJH$(?~]>I %$/I ;%I"0}g9,I`0?9{sދ_ `t{$ճVmLq񿓒M>'}>}f7Du3_N~Gz3Oɟ-y6Y[͔O?w9u刺:sxwgm&f;Y6PT>k,Z`TVIhpܛaF-&3POaLFVF& 囿Oc4]Gʯdyy%?XC: ֲO9T鴯}eX2 &T2 c/S*9U*z^Sޅwd&X7?qdf24k|[MV'Y I@J{@{W $ɥN< hS顠;72?{I?>e_]u2xԿTV-L Q>d_!}+FG3_v*KF KZ@ɻI̙(ew|'v)MP?;M_1'?Gs?/-VX VOIl.Mz:vMҫꯈjN^Wys^\(0},#Id¡YC&F,t#ʸ ˄8ꩧ{3S%VĐ/$ed^ڗe,Prof2%eG3VL2Z'RȬXY>C#5PE^we,g6j22P ̋n,K˅[Sٚ2p+Ljq:mzE)ع\0Yq55Ŭ'5966CNl ~T~s|Ǟ~`jaO#ཾp2Q :elō"ڞDWSC&RɄVLI# )?ڠ@9fK"Ԏ*nTⲜNϩ Ԏ&&2` LECԞt<3;gLF):g w-fx͞f)1NjOc6~ى3g{ʭ3x^8,+X^Zx01I&Uď~J+RI@̙2dȒkR_ /±|j_G*n=&_*-E3)O4tc xqAS(QVXeʲU$$ Hd*ڙ6\HQQLc0MLd vssT@<(^INIrI '9:@ I|&Q\d8K!aTMLa%s11ƚ8jp-Rɹq'Cb$D\h@-#б )#XeZ`m;4j [`ė1 I$=&*1\2ndFLZ:&?qr?l;GIWAou1F8ip+eFU`ikU< U.Y0)$D>=i$E0+*0@8M➓E›Vg3SϺ)wըVU9t=B6&$sW&&ULe[z s&&i=mU]GctMFNƤ\OatZCK{Ne- u lޜ ?_'+M4c>/m.hxwi?9tM9ycwi׳]ovK\zo9UΌ#qM$>VmgVέg~ GL %e;W2~ Nr>R-cޗ˪e` CH2Q3QUQ. ;̚r:2n;oyX4cô?̞̙:hvH^=SV;S,iz[-N'6xmu4:Փ'ᩦU'}O]Y83ˉ1}4vypT{ڭm4^/gi6eerَhvF׾FSنN8+wdôI񞎗OI> z56̕:5,.7wu8 O&O1SSSbHwg:"cd1<{z9u;=3ùjbz-CgNMɃ Szi4r丞2{XG3NNR˦ꌙ'.iz9q5q6r{{So q>Cޓ32 ̎SқaWUһML9<'/yZ8z4]2i4CQ7cgEc1^j 4Gl%n4,03ilvӳqýZm[M3971i;~9p4dٚ;N+Ù]<4d˭s:7>s.'\`peN 7=gzu4㶙MU|3^ysz .f'i'w{s-MdƜm™;GC2t\K~C4-/=[\^y!rxzg sadCď5'U׼lpL_\jh_:T c 1\MꞒ}y2| Ip?z}f ._I;C+2ec*= /ѩ&ad}M6R^ZΖn#&TU='fFh'3{U?z Wlҵide*X9b \8 &A&',m۩c 1`#у0L1!Uu>pODIiQv-/߅/鯶۫(}uf kJ>q2h&H&H.0;<$d 2Ba;6_Q9dƮKGӄ2 3a.՚ӴO3\S#MLx>-꫚XXIudjxhtMU;`;=b|ǝ$$wӼCN/0XLd!*D ,0)ø|h+ѶzN&'pq1IZ4rctZY(+HofUd>5kxHx f2nԯd,OaoJs6\U8kx&<,Уn /Ij}Xcleo)NhM'=[VɹG] q '$'tY!.m,=CjXhG-s#Ec[pw&tɓ(VֲahF15ih-TG!MJ9fU:LC +dOZIHs]N9:?q2`4iiI2° ̢ J2a,1$H8G LاJ,FbŘ"wأ*oHA JI @DɃ,bcLY!A"A@I)a&eX $H)$e a$DTV T!!!HIX a !&bVL#&FLL0~r+V,&%#Nrs͵hf))jF$p ULc&Bu?rwryt˰&1YU:L[zb22H!$J, Qa/c e{̡e.gS8?h_=@וRbgv=׼ɓQ9rOcjZ2S0ܯ;WC:Gw$1/74E=x||AzOYᦧ |>sO_?"q? ƿ8ovN] L;}X=5 6zN<[\L&{-yL=9?e6/ deU[ꋲڱ_[u602b)12`IY$$$!$L0rD!*̡ bQȌHD0+2+(HDIɔF2}\#t_i}$$OSL @I(2C  Db2a`̘2)aYe`v ? 'y/J]00G[~ޫN#4`wMMS^)FjK_ƾɲjSڏ! 1_]zRȺȞ![++SqEw,>wX=,Oe\̝SK'k&~Y\3W9Ub# >>Ka\ &Cq8$IpM0f$')pvHpΘL08%8 sQ_R+gC+ZBb>*W%^SS|VaZ}F5?ZNi52M2IāDH$T$ɒ7I\$Hʸ0KS%2d-FʪךOgwU5? OC>a%)xJ^'Q0g(L)2X4\8̃&#Wc=7Y54&ICQX?2mZj-֙ZIܯqaiC ȕY\ޭ2j*|2tb014ɔ^`X*eM&KR+ z_ţlpo04r51nq6g3snf/DhiyJi-1C2j* .*,R _R9itEg%?Hy%ٔ2.R?RI2I$$IJ ˒XaX DdcQgV2E݊/1M4yte1e3zL_Ijea/ft֪?y}$2t'B,&UOa/q I+~QsU|\̑u1PPQ(Hf.ٰaY2`ZcA4$2JA#'(|AxhH% pr2VeɪoF---252i[GkvK&VYC90oo-UUź-̙,2,拆U8ڸ14iiұCi5Y1VL]LQRN RI8\& 0 a2IW2p&ˌܽ'2Dݕ;7&H"Z Ne? QM#qdj%ST5YKVɋTq-ĮŌX,VLdDZ0ɋl}WX,.M,Ya\IUПcA-?A8uKabdǙc4dSS{'3NʺLJ_ TC(-, C&.iyWeźZMN!qUYEbY,X2V'2(kzC0,S&V plҹԦ2)S,Sn&-#l$Y+"Unbb2K82dÉN$f+u:1#2&+4i-EsC|EHOR[NLjd]Iђ LS*e%q7?4*!|% E\]>ZZ%IyʣbzOo!qO>TY0c!c&VbĜ%Ut|Su}LGع=ؓDѕ\YOh(e0aq|XLe>,0,bYY)2`b+CI`&U:/I?* B>R;5_ e4b`#I!C;<W*~f^$z]Bµ2d|%-*!$$I v4|Gb[^)l2p]>}fLe?_Ua_I.s?L|1U &U` -?4?b0?vYS,<_q&{>cp[:LbAjjH_gX.tRMGڦ:+YNGp^B^Xϕ.t^_:0aqVqAN=fTqOJؚ Sh#_J?~ GfJ;'f+2q)lX~ xJ _bɅ1#Uw 8 p>S F#uMnh<;F*]_P\d'誰g{M2~i@Y 1=}4gG(xdԟMv;VJaоHbEOYvU6~w(&J Dā%$ `"$BHdhYQI` a<̙UHD! H ba$$I($.H`8",@@Ȍ+$$$L) 2BI$$)Jt  2TXeSST҇LS$b;\ ub(pNbȲLA'dɎjdu.< ZWأimɆ1];ڙTp8Ix'JBl8;Z-,[42ұ<нQ|a^C1>LALR=ɕmI6K~._'R dzةH,ڼj<) [iQʩ|> *ӵoy\Z?eeGW9nES5GAmw?)+/Y ʴiuPg-kT\zT/kAe?Б®'P$ b !$D He` ""H!IP` ! """" (!*&Bj0Č13)Mǡ܁ K'ɇ¿`L`\a*e&&CVOW9OԪeO &SA3npq1Tl3n7^Sss]oSl0mf|f_ o<: Toӭ\cx啎yqx7-iO.sCS8N ̓Q紷qLC2v9NsS\࿘p/f5S;JO̩ܟS_2u. ~%Ic̢IlLAoma["N2MO TY&_WԬOi!O9!QeLbb?4 ThbN5;w[ְDv, I+'7x/iVv]yU-g7_&Oiݻ1^# ɓq!dR\TLgfxe2X"J"XH $BFqradSGݓdX<ȆWe1MXұ7J[f у Z\!2L99"I%K-#?jz/s$v?^ʼn;'s8L [Zœ1/7/,^~cP=^ǏGcS^ffPCk@-G[ap5&I,bL,)$:D~$`CuTU귝ؤ='I"C\uoKvcǖj}ŭu9gqq<=^N^:yKLӼ`^7:V':1;fvuzI1D.Jь24x01<]M'&dkSL:i^<5|&USOPYnqΖrn챓&;osNIܺ зZBdĘZpL5f;L;ibvs\u3/ZkGNƫk&OVFi.fM/?zvw A Eҹ%9JZ̬:׏jdb $X ԔM 2I8CXFcԋ&ѪH7wwݰuθ0ؘ̳=~TӃ5|Ӆ#6 .&Lmc'K 8\+2\0d.i6d,_mE,,\OȫR^U:4y^+1FH2r¬ #I+HhH"&*e%jbi,48 J+ t,K-.K-M+  'Z6,_AaOLt9|f-)w0LLfOJ JJҦMΗvaSr4^kQYeX*±1 $LD)h ,HY2bcS&BaG (٨[bɓl6Y9N)jaYK&PɍL?m`\*_pJyh6VW9Ϯ:{9bld,/CkM4/}ȹKm>f0دݩ=IۙŚdZ79ևtoUq7d_3Q_|-"W;L2b9 KEUS⛫^*eS/Y2IQXNRH?cQY s^ER'yy`(VUe|Yk&Y4'H_9ܖ?OᚨndF҄!2v̂y% aH__dFs2dŕb|xG8 r#b _ }{\/ʧkL8֓ Snid!91atW_E~yIؗ[dܟJLLjYRH2$'N- FEb,LLA!aC$2fim2Uirke#e--4ԯ??s^rRmDg¯vcIzOȻ'{)hJŅxFQ6ZVyk$j/yj wk+q𣒝&1!112`DP Oo\>+  @RPPB!%C*DI3#"q43apjd ?tO[d;cj-q8p'iihx?\ isW{g,L=wF1ߪ755Y1NSftjbwm&ݨ8 ۤ| rc.86ژMOυ-zK!>H?x%LDB*))2DCY1!Ug gMT,fE e"(H?9googledrive/R/drive_download.R0000644000176200001440000001222014071404144016100 0ustar liggesusers#' Download a Drive file #' #' @description This function downloads a file from Google Drive. Native Google #' file types, such as Google Docs, Google Sheets, and Google Slides, must be #' exported to a conventional local file type. This can be specified: #' * explicitly via `type` #' * implicitly via the file extension of `path` #' * not at all, i.e. rely on the built-in default #' #' @description To see what export file types are even possible, see the [Drive #' API #' documentation](https://developers.google.com/drive/api/v3/ref-export-formats) #' or the result of `drive_about()$exportFormats`. The returned dribble #' includes a `local_path` column. #' #' @seealso [Download #' files](https://developers.google.com/drive/api/v3/manage-downloads), in the #' Drive API documentation. #' #' @template file-singular #' @param path Character. Path for output file. If absent, the default file name #' is the file's name on Google Drive and the default location is working #' directory, possibly with an added file extension. #' @param type Character. Only consulted if `file` is a native Google file. #' Specifies the desired type of the exported file. Will be processed via #' [drive_mime_type()], so either a file extension like `"pdf"` or a full MIME #' type like `"application/pdf"` is acceptable. #' @param overwrite A logical scalar. If local `path` already exists, do you #' want to overwrite it? #' @template verbose #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # Target one of the official example files #' (src_file <- drive_example_remote("chicken_sheet")) #' #' # Download Sheet as csv, explicit type #' downloaded_file <- drive_download(src_file, type = "csv") #' #' # See local path to new file #' downloaded_file$local_path #' #' # Download as csv, type implicit in file extension #' drive_download(src_file, path = "my_csv_file.csv") #' #' # Download with default name and type (xlsx) #' drive_download(src_file) #' #' # Clean up #' unlink(c("chicken_sheet.csv", "chicken_sheet.xlsx", "my_csv_file.csv")) drive_download <- function(file, path = NULL, type = NULL, overwrite = FALSE, verbose = deprecated()) { warn_for_verbose(verbose) if (!is.null(path) && file.exists(path) && !overwrite) { drive_abort(c( "Local {.arg path} already exists and overwrite is {.code FALSE}:", bulletize(gargle_map_cli(path, "{.path <>}")) )) } file <- as_dribble(file) file <- confirm_single_file(file) ## preserve extension from path, before possible override by file$name ext <- file_ext_safe(path) path <- path %||% file$name mime_type <- file$drive_resource[[1]]$mimeType if (!grepl("google", mime_type) && !is.null(type)) { drive_bullets(c( "!" = "Ignoring {.arg type}. Only consulted for native Google file types.", " " = "MIME type of {.arg file}: {.field mime_type}." )) } if (grepl("google", mime_type)) { export_type <- type %||% ext %||% get_export_mime_type(mime_type) export_type <- drive_mime_type(export_type) verify_export_mime_type(mime_type, export_type) path <- apply_extension(path, drive_extension(export_type)) request <- request_generate( endpoint = "drive.files.export", params = list( fileId = file$id, mimeType = export_type ) ) } else { request <- request_generate( endpoint = "drive.files.get", params = list( fileId = file$id, alt = "media" ) ) } response <- request_make( request, httr::write_disk(path, overwrite = overwrite) ) success <- httr::status_code(response) == 200 && file.exists(path) if (success) { drive_bullets(c( "File downloaded:", bulletize(gargle_map_cli(file)), "Saved locally as:", "*" = "{.path {path}}" )) } else { drive_abort("Download failed.") } invisible(put_column(file, nm = "local_path", val = path, .after = "name")) } ## get the default export MIME type for a native Google MIME type ## examples: ## Google Doc --> MS Word ## Google Sheet --> MS Excel ## Google Slides --> MS PowerPoint get_export_mime_type <- function(mime_type) { m <- .drive$translate_mime_types$mime_type_google == mime_type & is_true(.drive$translate_mime_types$default) if (!any(m)) { drive_abort(c( "Not a recognized Google MIME type:", bulletize(gargle_map_cli(mime_type), bullet = "x") )) } .drive$translate_mime_types$mime_type_local[m] } ## affirm that export_type is a valid export MIME type for a native Google file ## of type mime_type verify_export_mime_type <- function(mime_type, export_type) { m <- .drive$translate_mime_types$mime_type_google == mime_type ok <- export_type %in% .drive$translate_mime_types$mime_type_local[m] if (!ok) { ## to be really nice, we would look these up in drive_mime_type() tibble ## and use the human_type, if found drive_abort(c( "Cannot export Google file of type:", bulletize(gargle_map_cli(mime_type)), "as a file of type:", bulletize(gargle_map_cli(export_type)) )) } export_type } googledrive/R/drive_get.R0000644000176200001440000001455414071401260015060 0ustar liggesusers#' Get Drive files by path or id #' #' Retrieves metadata for files specified via `path` or via file `id`. This #' function is quite straightforward if you specify files by `id`. But there are #' some important considerations when you specify your target files by `path`. #' See below for more. If the target files are specified via `path`, the #' returned [`dribble`] will include a `path` column. #' @section Getting by `path`: #' #' Google Drive does NOT behave like your local file system! File and folder #' names need not be unique, even at a given level of the hierarchy. This #' means that a single path can describe multiple files (or 0 or exactly 1). #' #' A single file can also be compatible with multiple paths, i.e. one path #' could be more specific than the other. A file located at `~/alfa/bravo` can #' be found as `bravo`, `alfa/bravo`, and `~/alfa/bravo`. If all 3 of those #' were included in the input `path`, they would be represented by a #' **single** row in the output. #' #' It's best to think of `drive_get()` as a setwise operation when using file #' paths. Do not assume that the `i`-th input path corresponds to row `i` in #' the output (although it often does!). If there's not a 1-to-1 relationship #' between the input and output, this will be announced in a message. #' #' `drive_get()` performs just enough path resolution to uniquely identify a #' file compatible with each input `path`, for all `path`s at once. If you #' absolutely want the full canonical path, run the output of `drive_get()` #' through [`drive_reveal(d, "path")`][drive_reveal()]`. #' #' @section Files that you don't own: #' #' If you want to get a file via `path` and it's not necessarily on your My #' Drive, you may need to specify the `shared_drive` or `corpus` arguments to #' search other collections of items. Read more about [shared #' drives][shared_drives]. #' #' @seealso To add path information to any [`dribble`] that lacks it, use #' [`drive_reveal(d, "path")`][drive_reveal()]. To list the contents of a #' folder, use [drive_ls()]. For general searching, use [drive_find()]. #' #' Wraps the `files.get` endpoint and, if you specify files by name or #' path, also calls `files.list`: #' * #' * #' #' @param path Character vector of path(s) to get. Use a trailing slash to #' indicate explicitly that a path is a folder, which can disambiguate if #' there is a file of the same name (yes this is possible on Drive!). If #' `path` appears to contain Drive URLs or is explicitly marked with #' [as_id()], it is treated as if it was provided via the `id` argument. #' @param id Character vector of Drive file ids or URLs (it is first processed #' with [as_id()]). If both `path` and `id` are non-`NULL`, `id` is silently #' ignored. #' @template shared_drive-singular #' @template corpus #' @template verbose #' @template team_drive-singular #' #' @eval return_dribble(extras = "If the target files were specified via `path`, #' there will be a `path` column.") #' @export #' #' @examplesIf drive_has_token() #' # get info about your "My Drive" root folder #' drive_get("~/") #' # the API reserves the file id "root" for your root folder #' drive_get(id = "root") #' drive_get(id = "root") %>% drive_reveal("path") #' #' # set up some files to get by path #' alfalfa <- drive_mkdir("alfalfa") #' broccoli <- drive_upload( #' drive_example_local("chicken.txt"), #' name = "broccoli", path = alfalfa #' ) #' drive_get("broccoli") #' drive_get("alfalfa/broccoli") #' drive_get("~/alfalfa/broccoli") #' drive_get(c("broccoli", "alfalfa/", "~/alfalfa/broccoli")) #' #' # clean up #' drive_rm(alfalfa) #' #' \dontrun{ #' # The examples below are indicative of correct syntax. #' # But note these will generally result in an error or a #' # 0-row dribble, unless you replace the inputs with paths #' # or file ids that exist in your Drive. #' #' # multiple names #' drive_get(c("abc", "def")) #' #' # multiple names, one of which must be a folder #' drive_get(c("abc", "def/")) #' #' # query by file id(s) #' drive_get(id = "abcdefgeh123456789") #' drive_get(as_id("abcdefgeh123456789")) #' drive_get(id = c("abcdefgh123456789", "jklmnopq123456789")) #' #' # apply to a browser URL for, e.g., a Google Sheet #' my_url <- "https://docs.google.com/spreadsheets/d/FILE_ID/edit#gid=SHEET_ID" #' drive_get(my_url) #' drive_get(as_id(my_url)) #' drive_get(id = my_url) #' #' # access the shared drive named "foo" #' # shared_drive params must be specified if getting by path #' foo <- shared_drive_get("foo") #' drive_get(c("this.jpg", "that-file"), shared_drive = foo) #' # shared_drive params are not necessary if getting by id #' drive_get(as_id("123456789")) #' #' # search all shared drives and other files user has accessed #' drive_get(c("this.jpg", "that-file"), corpus = "allDrives") #' } drive_get <- function(path = NULL, id = NULL, shared_drive = NULL, corpus = NULL, verbose = deprecated(), team_drive = deprecated()) { warn_for_verbose(verbose) if (length(path) + length(id) == 0) return(dribble_with_path()) stopifnot(is.null(path) || is.character(path)) stopifnot(is.null(id) || is.character(id)) if (lifecycle::is_present(team_drive)) { lifecycle::deprecate_warn( "2.0.0", "drive_get(team_drive)", "drive_get(shared_drive)" ) shared_drive <- shared_drive %||% team_drive } if (!is.null(path) && any(is_drive_url(path))) { path <- as_id(path) } if (!is.null(path) && is_drive_id(path)) { id <- path path <- NULL } if (is.null(path)) { as_dribble(map(as_id(id), get_one_file_id)) } else { drive_get_path(path, shared_drive, corpus) } } get_one_file_id <- function(id) { if (is.na(id)) { drive_abort("Can't {.fun drive_get} a file when {.arg id} is {.code NA}.") } # drive_id validity checks catch the id = "" case, but just FYI: # when id = "", drive.files.get actually becomes a call to drive.files.list # and, therefore, returns 100 files by default; this is a bad thing request <- request_generate( endpoint = "drive.files.get", params = list( fileId = id, fields = "*" ) ) response <- request_make(request) gargle::response_process(response) } googledrive/R/utils.R0000644000176200001440000000461614070147664014264 0ustar liggesusersisFALSE <- function(x) identical(x, FALSE) is_toggle <- function(x) length(x) == 1L && is.logical(x) last <- function(x) pluck(x, length(x)) escape_regex <- function(x) { chars <- c("*", ".", "?", "^", "+", "$", "|", "(", ")", "[", "]", "{", "}", "\\") gsub(paste0("([\\", paste0(collapse = "\\", chars), "])"), "\\\\\\1", x, perl = TRUE) } ## put a column into a tibble in the REST sense: "create or update" ## tibble::add_column() except ## 1. can only add 1 column ## 2. if column by this name already exists, overwrite it in place ## 3. provide `nm` and `val` separately put_column <- function(.data, nm, val, .before = NULL, .after = NULL) { if (nm %in% names(.data)) { .data[[nm]] <- val .data } else { tibble::add_column(.data, !!nm := val, .before = .before, .after = .after) } } ## vectorized isTRUE() is_true <- function(x) vapply(x, isTRUE, logical(1)) #' An expose object #' #' `expose()` returns a sentinel object, similar in spirit to `NULL`, that tells #' the calling function to return its internal data structure. googledrive #' stores a lot of information about the Drive API, MIME types, etc., internally #' and then exploits it in helper functions, like [`drive_mime_type()`], #' [`drive_fields()`], [`drive_endpoints()`], etc. We use these objects to #' provide nice defaults, check input validity, or lookup something cryptic, #' like MIME type, based on something friendlier, like a file extension. Pass #' `expose()` to such a function if you want to inspect its internal object, in #' its full glory. This is inspired by the `waiver()` object in ggplot2. #' #' @export #' @keywords internal #' @examples #' drive_mime_type(expose()) #' drive_fields(expose()) expose <- function() structure(list(), class = "expose") is_expose <- function(x) inherits(x, "expose") ## partition a parameter list into two parts, using names to identify ## components destined for the second part ## example input: # partition_params( # list(a = "a", b = "b", c = "c", d = "d"), # c("b", "c") # ) ## example output: # list( # unmatched = list(a = "a", d = "d"), # matched = list(b = "b", c = "c") # ) partition_params <- function(input, nms_to_match) { out <- list( unmatched = input, matched = list() ) if (length(nms_to_match) && length(input)) { m <- names(out$unmatched) %in% nms_to_match out$matched <- out$unmatched[m] out$unmatched <- out$unmatched[!m] } out } googledrive/R/zzz.R0000644000176200001440000000137314071401260013740 0ustar liggesusers.onLoad <- function(libname, pkgname) { # .auth is created in R/drive_auth.R # this is to insure we get an instance of gargle's AuthState using the # current, locally installed version of gargle utils::assignInMyNamespace( ".auth", gargle::init_AuthState(package = "googledrive", auth_active = TRUE) ) if (identical(Sys.getenv("IN_PKGDOWN"), "true")) { tryCatch( drive_auth_docs(), googledrive_auth_internal_error = function(e) NULL ) } # in rlang 0.4.10, `is_installed()` doesn't have `version` arg yet if (is_installed("dplyr") && utils::packageVersion("dplyr") >= "1.0.0") { s3_register( "dplyr::dplyr_reconstruct", "dribble", method = dribble_maybe_reconstruct ) } invisible() } googledrive/R/drive_find.R0000644000176200001440000002152514070147664015233 0ustar liggesusers#' Find files on Google Drive #' #' This is the closest googledrive function to what you can do at #' : by default, you just get a listing of your files. #' You can also search in various ways, e.g., filter by file type or ownership #' or work with [shared drives][shared_drives]. This is a very powerful #' function. Together with the more specific [drive_get()], this is the main way #' to identify files to target for downstream work. If you know you want to #' search within a specific folder or shared drive, use [drive_ls()]. #' @section File type: #' #' The `type` argument is pre-processed with [drive_mime_type()], so you can #' use a few shortcuts and file extensions, in addition to full-blown MIME #' types. googledrive forms a search clause to pass to `q`. #' @section Search parameters: #' #' Do advanced search on file properties by providing search clauses to the #' `q` parameter that is passed to the API via `...`. Multiple `q` clauses or #' vector-valued `q` are combined via 'and'. #' @section Trash: #' #' By default, `drive_find()` sets `trashed = FALSE` and does not include #' files in the trash. Literally, it adds `q = "trashed = false"` to the #' query. To search *only* the trash, set `trashed = TRUE`. To see files #' regardless of trash status, set `trashed = NA`, which adds #' `q = "(trashed = true or trashed = false)"` to the query. #' @section Sort order: #' #' By default, `drive_find()` sends `orderBy = "recency desc"`, so the top #' files in your result have high "recency" (whatever that means). To suppress #' sending `orderBy` at all, do `drive_find(orderBy = NULL)`. The `orderBy` #' parameter accepts sort keys in addition to `recency`, which are documented #' in the [`files.list` endpoint](https://developers.google.com/drive/api/v3/reference/files/list). #' googledrive translates a snake_case specification of `order_by` into the #' lowerCamel form, `orderBy`. #' @section Shared drives and domains: #' #' If you work with shared drives and/or Google Workspace, you can apply your #' search query to collections of items beyond those associated with "My #' Drive". Use the `shared_drive` or `corpus` arguments to control this. #' Read more about [shared drives][shared_drives]. #' @seealso Wraps the `files.list` endpoint: #' * #' #' Helpful resource for forming your own queries: #' * #' #' @template pattern #' @param trashed Logical. Whether to search files that are not in the trash #' (`trashed = FALSE`, the default), only files that are in the trash #' (`trashed = TRUE`), or to search regardless of trashed status (`trashed = #' NA`). #' @param type Character. If provided, only files of this type will be returned. #' Can be anything that [drive_mime_type()] knows how to handle. This is #' processed by googledrive and sent as a query parameter. #' @template n_max #' @template shared_drive-singular #' @template corpus #' @param ... Other parameters to pass along in the request. The most likely #' candidate is `q`. See below and the API's #' [Search for files and folders guide](https://developers.google.com/drive/api/v3/search-files). #' @template verbose #' @template team_drive-singular #' #' @eval return_dribble() #' @examples #' \dontrun{ #' # list "My Drive" w/o regard for folder hierarchy #' drive_find() #' #' # filter for folders, the easy way and the hard way #' drive_find(type = "folder") #' drive_find(q = "mimeType = 'application/vnd.google-apps.folder'") #' #' # filter for Google Sheets, the easy way and the hard way #' drive_find(type = "spreadsheet") #' drive_find(q = "mimeType='application/vnd.google-apps.spreadsheet'") #' #' # files whose names match a regex #' # the local, general, sometimes-slow-to-execute version #' drive_find(pattern = "ick") #' # the server-side, executes-faster version #' # NOTE: works only for a pattern at the beginning of file name #' drive_find(q = "name contains 'chick'") #' #' # search for files located directly in your root folder #' drive_find(q = "'root' in parents") #' # FYI: this is equivalent to #' drive_ls("~/") #' #' # control page size or cap the number of files returned #' drive_find(pageSize = 50) #' # all params passed through `...` can be camelCase or snake_case #' drive_find(page_size = 50) #' drive_find(n_max = 58) #' drive_find(page_size = 5, n_max = 15) #' #' # various ways to specify q search clauses #' # multiple q's #' drive_find(q = "name contains 'TEST'", #' q = "modifiedTime > '2020-07-21T12:00:00'") #' # vector q #' drive_find(q = c("starred = true", "visibility = 'anyoneWithLink'")) #' #' # default `trashed = FALSE` excludes files in the trash #' # `trashed = TRUE` consults ONLY file in the trash #' drive_find(trashed = TRUE) #' # `trashed = NA` disregards trash status completely #' drive_find(trashed = NA) #' #' # suppress the default sorting on recency #' drive_find(order_by = NULL, n_max = 5) #' #' # sort on various keys #' drive_find(order_by = "modifiedByMeTime", n_max = 5) #' # request descending order #' drive_find(order_by = "quotaBytesUsed desc", n_max = 5) #' } #' #' @export drive_find <- function(pattern = NULL, trashed = FALSE, type = NULL, n_max = Inf, shared_drive = NULL, corpus = NULL, ..., verbose = deprecated(), team_drive = deprecated()) { warn_for_verbose(verbose) if (!is.null(pattern) && !(is_string(pattern))) { drive_abort("{.arg pattern} must be a character string.") } stopifnot(is_toggle(trashed)) stopifnot(is.numeric(n_max), n_max >= 0, length(n_max) == 1) if (lifecycle::is_present(team_drive)) { lifecycle::deprecate_warn( "2.0.0", "drive_find(team_drive)", "drive_find(shared_drive)" ) shared_drive <- shared_drive %||% team_drive } if (n_max < 1) return(dribble()) params <- toCamel(list2(...)) params[["fields"]] <- params[["fields"]] %||% "*" if (!has_name(params, "orderBy")) { params[["orderBy"]] <- "recency desc" } params <- marshal_q_clauses(params) trash_clause <- switch( as.character(trashed), `TRUE` = "trashed = true", `FALSE` = "trashed = false", "(trashed = true or trashed = false)" ) params$q <- append(params$q, trash_clause) if (!is.null(type)) { ## if they are all NA, this will error, because drive_mime_type() ## doesn't allow it, otherwise we proceed with the non-NA mime types mime_type <- drive_mime_type(type) mime_type <- purrr::discard(mime_type, is.na) params$q <- append(params$q, or(glue("mimeType = {sq(mime_type)}"))) } params$q <- and(params$q) params <- append(params, handle_shared_drives(shared_drive, corpus)) request <- request_generate(endpoint = "drive.files.list", params = params) proc_res_list <- do_paginated_request( request, n_max = n_max, n = function(x) length(x$files) ) res_tbl <- proc_res_list %>% map("files") %>% purrr::flatten() %>% as_dribble() # there is some evidence of overlap in the results returned in different # pages; this is attempt to eliminate a 2nd (or 3rd ...) record for an ID # #272 #273 #277 #279 #281 res_tbl <- res_tbl[!duplicated(res_tbl$id), ] if (!is.null(pattern)) { res_tbl <- res_tbl[grep(pattern, res_tbl$name), ] } if (n_max < nrow(res_tbl)) { res_tbl <- res_tbl[seq_len(n_max), ] } res_tbl } ## finds all the q clauses and collapses into one character vector of clauses ## these are destined to be and'ed to form q in the query marshal_q_clauses <- function(params) { params <- partition_params(params, "q") if (length(params[["matched"]]) == 0) { return(params[["unmatched"]]) } q_bits <- params[["matched"]] stopifnot(all(vapply(q_bits, is.character, logical(1)))) q_bits <- unique(unlist(q_bits, use.names = FALSE)) q_bits <- q_bits[lengths(q_bits) > 0] c(params[["unmatched"]], q = list(q_bits)) } # https://developers.google.com/drive/api/v3/search-shareddrives#query_multiple_terms_with_parentheses parenthesize <- function(x) glue("({x})") and <- function(x) glue_collapse(parenthesize(x), sep = " and ") or <- function(x) glue_collapse(x, sep = " or ") handle_shared_drives <- function(shared_drive, corpus) { if (!is.null(shared_drive)) { shared_drive <- as_shared_drive(shared_drive) if (no_file(shared_drive)) { drive_abort("Can't find the requested {.arg shared_drive}.") } shared_drive <- as_id(shared_drive) } if (identical(corpus, "all")) { lifecycle::deprecate_warn( "2.0.0", "drive_find(corpus = 'now expects \"allDrives\" instead of \"all\"')" ) corpus <- "allDrives" } if (is.null(shared_drive) && is.null(corpus)) return() shared_drive_params(shared_drive, corpus) } googledrive/R/drive_endpoints.R0000644000176200001440000000340513516162435016310 0ustar liggesusers#' List Drive endpoints #' #' @description #' The googledrive package stores a named list of Drive API v3 endpoints (or #' "methods", using Google's vocabulary) internally and these functions expose #' this data. #' * `drive_endpoint()` returns one endpoint, i.e. it uses `[[`. #' * `drive_endpoints()` returns a list of endpoints, i.e. it uses `[`. #' #' The names of this list (or the `id` sub-elements) are the nicknames that can #' be used to specify an endpoint in [request_generate()]. For each endpoint, we #' store its nickname or `id`, the associated HTTP verb, the `path`, and details #' about the parameters. This list is derived programmatically from the [Drive #' API v3 Discovery #' Document](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest) using #' the approach described in the [Discovery Documents #' section](https://gargle.r-lib.org/articles/request-helper-functions.html#discovery-documents) #' of the gargle vignette [Request helper #' functions](https://gargle.r-lib.org/articles/request-helper-functions.html). #' #' @param i The name(s) or integer index(ices) of the endpoints to return. `i` #' is optional for `drive_endpoints()` and, if not given, the entire list is #' returned. #' #' @return One or more of the Drive API v3 endpoints that are used internally by #' googledrive. #' @export #' #' @examples #' str(head(drive_endpoints(), 3), max.level = 2) #' drive_endpoint("drive.files.delete") #' drive_endpoint(4) drive_endpoints <- function(i = NULL) { if (is.null(i) || is_expose(i)) { i <- seq_along(.endpoints) } stopifnot(is.character(i) || (is.numeric(i))) .endpoints[i] } #' @rdname drive_endpoints #' @export drive_endpoint <- function(i) { stopifnot(is_string(i) || (is.numeric(i) && length(i) == 1)) .endpoints[[i]] } googledrive/R/drive_about.R0000644000176200001440000000166314071403147015416 0ustar liggesusers#' Get info on Drive capabilities #' #' Gets information about the user, the user's Drive, and system capabilities. #' This function mostly exists to power [drive_user()], which extracts the most #' useful information (the information on current user) and prints it nicely. #' #' @seealso Wraps the `about.get` endpoint: #' * #' #' @return A list representation of a Drive #' [about resource](https://developers.google.com/drive/api/v3/reference/about) #' @export #' #' @examplesIf drive_has_token() #' drive_about() #' #' # explore the export formats available for Drive files, by MIME type #' about <- drive_about() #' about[["exportFormats"]] %>% #' purrr::map(unlist) drive_about <- function() { request <- request_generate( endpoint = "drive.about.get", params = list(fields = "*") ) response <- request_make(request) gargle::response_process(response) } googledrive/R/drive_mv.R0000644000176200001440000000723614071403571014731 0ustar liggesusers#' Move a Drive file #' #' Move a Drive file to a different folder, give it a different name, or both. #' #' @seealso Makes a metadata-only request to the `files.update` endpoint: #' * #' @template file-singular #' @eval param_path( #' thing = "file", #' default_notes = "By default, the file stays in its current folder." #' ) #' @eval param_name( #' thing = "file", #' default_notes = "By default, the file keeps its current name." #' ) #' @template overwrite #' @template verbose #' #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # create a file to move #' file <- drive_example_remote("chicken.txt") %>% #' drive_cp("chicken-mv.txt") #' #' # rename it, but leave in current folder (root folder, in this case) #' file <- drive_mv(file, "chicken-mv-renamed.txt") #' #' # create a folder to move the file into #' folder <- drive_mkdir("mv-folder") #' #' # move the file and rename it again, #' # specify destination as a dribble #' file <- drive_mv(file, path = folder, name = "chicken-mv-re-renamed.txt") #' #' # verify renamed file is now in the folder #' drive_ls(folder) #' #' # move the file back to root folder #' file <- drive_mv(file, "~/") #' #' # move it again #' # specify destination as path with trailing slash #' # to ensure we get a move vs. renaming it to "mv-folder" #' file <- drive_mv(file, "mv-folder/") #' #' # `overwrite = FALSE` errors if something already exists at target filepath #' # THIS WILL ERROR! #' drive_create("name-squatter", path = "~/") #' drive_mv(file, path = "~/", name = "name-squatter", overwrite = FALSE) #' #' # `overwrite = TRUE` moves the existing item to trash, then proceeds #' drive_mv(file, path = "~/", name = "name-squatter", overwrite = TRUE) #' #' # Clean up #' drive_rm(file, folder) drive_mv <- function(file, path = NULL, name = NULL, overwrite = NA, verbose = deprecated()) { warn_for_verbose(verbose) file <- as_dribble(file) file <- confirm_single_file(file) if (is.null(path) && is.null(name)) { drive_bullets(c( "!" = "Nothing to be done." )) return(invisible(file)) } tmp <- rationalize_path_name(path, name) path <- tmp$path name <- tmp$name params <- list() # load (path, name) into params ... maybe parents_before <- pluck(file, "drive_resource", 1, "parents") if (!is.null(path)) { path <- as_parent(path) if (!path$id %in% parents_before) { params[["addParents"]] <- path$id } } if (!is.null(name) && name != file$name) { params[["name"]] <- name } if (length(params) == 0) { drive_bullets(c( "!" = "Nothing to be done." )) return(invisible(file)) } check_for_overwrite( parent = params[["addParents"]] %||% parents_before[[1]], name = params[["name"]] %||% file$name, overwrite = overwrite ) params[["fields"]] <- "*" out <- drive_update_metadata(file, params) actions <- c( renamed = !identical(out$name, file$name), moved = !is.null(params[["addParents"]]) ) action <- glue_collapse(names(actions)[actions], last = " and ") drive_bullets(c( "Original file:", bulletize(gargle_map_cli(file)), "Has been {action}:", # drive_reveal_path() puts immediate parent, if specified, in the `path` # then we reveal `path`, instead of `name` bulletize(gargle_map_cli( drive_reveal_path(out, ancestors = path), template = c( id_string = ">>", # \u00a0 is a nonbreaking space out = "{.drivepath <>} {cli::col_grey('<>')}" ) )) )) invisible(out) } googledrive/R/deprecated.R0000644000176200001440000000125713654163655015227 0ustar liggesusers#' Deprecated googledrive functions #' #' @keywords internal #' @name googledrive-deprecated NULL #' @rdname googledrive-deprecated #' @inheritParams drive_auth_configure #' @export drive_auth_config <- function(active, app, path, api_key) { .Deprecated(msg = glue(" `drive_auth_config()` has been deprecated. Use `drive_auth_configure()` to configure your own OAuth app or API key. Use `drive_deauth()` to go into a de-authorized state. Use `drive_oauth_app()` to retrieve a user-configured app, if it exists. Use `drive_api_key()` to retrieve a user-configured API key, if it exists. ")) drive_auth_configure(app = app, path = path, api_key = api_key) } googledrive/R/drive_fields.R0000644000176200001440000000573014071404407015551 0ustar liggesusers#' Request partial resources #' #' @description You may be able to improve the performance of your API calls by #' requesting only the metadata that you actually need. This function is #' primarily for internal use and is currently focused on the [Files #' resource](https://developers.google.com/drive/api/v3/reference/files). Note #' that high-level googledrive functions assume that the `name`, `id`, and #' `kind` fields are included, at a bare minimum. Assuming that `resource = #' "files"` (the default), input provided via `fields` is checked for validity #' against the known field names and the validated fields are returned. To see #' a tibble containing all possible fields and a short description of each, #' call `drive_fields(expose())`. #' #' @description `prep_fields()` prepares fields for inclusion as query #' parameters. #' #' @seealso [Improve #' performance](https://developers.google.com/drive/api/v3/performance), in #' the Drive API documentation. #' #' @param fields Character vector of field names. If `resource = "files"`, they #' are checked for validity. Otherwise, they are passed through. #' @param resource Character, naming the API resource of interest. Currently, #' only the Files resource is anticipated. #' #' @return `drive_fields()`: Character vector of field names. `prep_fields()`: a #' string. #' @export #' #' @examples #' # get a tibble of all fields for the Files resource + indicator of defaults #' drive_fields(expose()) #' #' # invalid fields are removed and throw warning #' drive_fields(c("name", "parents", "ownedByMe", "pancakes!")) #' #' # prepare fields for query #' prep_fields(c("name", "parents", "kind")) drive_fields <- function(fields = NULL, resource = "files") { if (!identical(resource, "files")) { drive_bullets(c( "!" = "Currently only fields for the {.field files} resource can be \\ checked for validity.", " " = "Nothing done." )) } if (is.null(fields)) { return(invisible(character())) } if (is_expose(fields)) { return(.drive$files_fields) } stopifnot(is.character(fields)) if (!identical(resource, "files")) { return(fields) } out <- intersect(fields, .drive$files_fields$name) if (!setequal(fields, out)) { bad_fields <- setdiff(fields, out) drive_warn(c( "Omitting fields that are not recognized as part of the Files resource:", bulletize(gargle_map_cli(bad_fields)) )) } out } #' @rdname drive_fields #' @export prep_fields <- function(fields, resource = "files") { resource <- glue("{resource}/") paste0(resource, fields, collapse = ",") } ## usage: ## resource = NULL because we prepend "files/" when n > 1 items can come back # request <- request_generate( # endpoint = "drive.files.get", # params = list( # fileId = two_files_search$id[1], # fields = prep_fields(c("name", "owners"), resource = NULL) # ) # ) # response <- request_make(request) # gargle::response_process(response) googledrive/R/request_generate.R0000644000176200001440000000640714071404060016451 0ustar liggesusers#' Build a request for the Google Drive API #' #' @description Build a request, using knowledge of the [Drive v3 #' API](https://developers.google.com/drive/api/v3/about-sdk) from its #' [Discovery #' Document](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest). Most #' users should, instead, use higher-level wrappers that facilitate common #' tasks, such as uploading or downloading Drive files. The functions here are #' intended for internal use and for programming around the Drive API. #' #' @description `request_generate()` lets you provide the bare minimum of input. #' It takes a nickname for an endpoint and: #' * Uses the API spec to look up the `path`, `method`, and base URL. #' * Checks `params` for validity and completeness with respect to the #' endpoint. Separates parameters into those destined for the body, the query, #' and URL endpoint substitution (which is also enacted). #' * Adds an API key to the query if and only if `token = NULL`. #' * Adds `supportsAllDrives = TRUE` to the query if the endpoint requires. #' #' @param endpoint Character. Nickname for one of the selected Drive v3 API #' endpoints built into googledrive. Learn more in [drive_endpoints()]. #' @param params Named list. Parameters destined for endpoint URL substitution, #' the query, or the body. #' @param key API key. Needed for requests that don't contain a token. The need #' for an API key in the absence of a token is explained in Google's document #' [Credentials, access, security, and #' identity](https://support.google.com/googleapi/answer/6158857?hl=en&ref_topic=7013279). #' In order of precedence, these sources are consulted: the formal `key` #' argument, a `key` parameter in `params`, a user-configured API key fetched #' via [drive_api_key()], a built-in key shipped with googledrive. See #' [drive_auth_configure()] for details on a user-configured key. #' @param token Drive token. Set to `NULL` to suppress the inclusion of a token. #' Note that, if auth has been de-activated via [drive_deauth()], #' `drive_token()` will actually return `NULL`. #' #' @return `list()`\cr Components are `method`, `path`, `query`, `body`, #' `token`, and `url`, suitable as input for [request_make()]. #' @export #' @family low-level API functions #' @seealso [gargle::request_develop()], [gargle::request_build()] #' @examplesIf drive_has_token() #' req <- request_generate( #' "drive.files.get", #' list(fileId = "abc"), #' token = drive_token() #' ) #' req request_generate <- function(endpoint = character(), params = list(), key = NULL, token = drive_token()) { ept <- drive_endpoint(endpoint) if (is.null(ept)) { drive_abort(c( "Endpoint not recognized:", bulletize(gargle_map_cli(endpoint)) )) } ## modifications specific to googledrive package params$key <- key %||% params$key %||% drive_api_key() %||% gargle::tidyverse_api_key() if (!is.null(ept$parameters$supportsAllDrives)) { params$supportsAllDrives <- TRUE } req <- gargle::request_develop(endpoint = ept, params = params) gargle::request_build( path = req$path, method = req$method, params = req$params, body = req$body, token = token ) } googledrive/R/drive_create.R0000644000176200001440000000777714071403305015557 0ustar liggesusers#' Create a new blank Drive file #' #' Creates a new blank Drive file. Note there are better options for these #' special cases: #' * Creating a folder? Use [drive_mkdir()]. #' * Want to upload existing local content into a new Drive file? Use #' [drive_upload()]. #' #' @seealso Wraps the `files.create` endpoint: #' * #' #' @param name Name for the new file or, optionally, a path that specifies #' an existing parent folder, as well as the new file name. #' @eval param_path_known_parent() #' @param type Character. Create a blank Google Doc, Sheet or Slides by #' setting `type` to `document`, `spreadsheet`, or `presentation`, #' respectively. All non-`NULL` values for `type` are pre-processed with #' [drive_mime_type()]. #' @template dots-metadata #' @template overwrite #' @template verbose #' #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # Create a blank Google Doc named 'WordStar' in #' # your 'My Drive' root folder and star it #' wordstar <- drive_create("WordStar", type = "document", starred = TRUE) #' #' # is 'WordStar' really starred? YES #' purrr::pluck(wordstar, "drive_resource", 1, "starred") #' #' # Create a blank Google Slides presentation in #' # the root folder, and set its description #' execuvision <- drive_create( #' "ExecuVision", #' type = "presentation", #' description = "deeply nested bullet lists FTW" #' ) #' #' # Did we really set the description? YES #' purrr::pluck(execuvision, "drive_resource", 1, "description") #' #' # check out the new presentation #' drive_browse(execuvision) #' #' # Create folder 'b4xl' in the root folder, #' # then create an empty new Google Sheet in it #' b4xl <- drive_mkdir("b4xl") #' drive_create("VisiCalc", path = b4xl, type = "spreadsheet") #' #' # Another way to create a Google Sheet in the folder 'b4xl' #' drive_create("b4xl/SuperCalc", type = "spreadsheet") #' #' # Yet another way to create a new file in a folder, #' # this time specifying parent `path` as a character #' drive_create("Lotus 1-2-3", path = "b4xl", type = "spreadsheet") #' #' # Did we really create those Sheets in the intended folder? YES #' drive_ls("b4xl") #' #' # `overwrite = FALSE` errors if file already exists at target filepath #' # THIS WILL ERROR! #' drive_create("VisiCalc", path = b4xl, overwrite = FALSE) #' #' # `overwrite = TRUE` moves an existing file to trash, then proceeds #' drive_create("VisiCalc", path = b4xl, overwrite = TRUE) #' #' # clean up #' drive_rm(wordstar, b4xl, execuvision) drive_create <- function(name, path = NULL, type = NULL, ..., overwrite = NA, verbose = deprecated()) { warn_for_verbose(verbose) # in the special case of creating a shortcut, `name` is not required if (!identical(drive_mime_type(type), drive_mime_type("shortcut"))) { stopifnot(is_string(name)) } # the order and role of `path` and `name` is naturally inverted here, # relative to all other related functions, hence we pre-process if (is.null(path)) { path <- name name <- NULL } tmp <- rationalize_path_name(path, name) path <- tmp$path name <- tmp$name params <- toCamel(list2(...)) # load (path, name) into params if (!is.null(path)) { path <- as_parent(path) params[["parents"]] <- list(path[["id"]]) } params[["name"]] <- name check_for_overwrite(params[["parents"]], params[["name"]], overwrite) params[["fields"]] <- params[["fields"]] %||% "*" params[["mimeType"]] <- drive_mime_type(type) request <- request_generate( endpoint = "drive.files.create", params = params ) response <- request_make(request) proc_res <- gargle::response_process(response) out <- as_dribble(list(proc_res)) drive_bullets(c( "Created Drive file:", bulletize(gargle_map_cli(out)), "With MIME type:", bulletize(gargle_map_cli(purrr::pluck(out, 'drive_resource', 1, 'mimeType'))) )) invisible(out) } googledrive/R/shared_drive_find.R0000644000176200001440000000277114070147664016563 0ustar liggesusers#' Find shared drives #' #' @description This is the closest googledrive function to what you get from #' visiting and clicking "Shared drives". #' @template shared-drive-description #' @seealso Wraps the `drives.list` endpoint: #' * #' @template pattern #' @template n_max #' @param ... Other parameters to pass along in the request, such as `pageSize` #' or `useDomainAdminAccess`. #' #' @eval return_dribble("shared drive") #' @export #' @examples #' \dontrun{ #' shared_drive_find() #' } shared_drive_find <- function(pattern = NULL, n_max = Inf, ...) { if (!is.null(pattern) && !(is_string(pattern))) { drive_abort("{.arg pattern} must be a character string.") } stopifnot(is.numeric(n_max), n_max >= 0, length(n_max) == 1) if (n_max < 1) return(dribble()) ## what could possibly come via `...` here? pageSize (or fields) params <- toCamel(list2(...)) params$fields <- params$fields %||% "*" request <- request_generate("drive.drives.list", params = params) proc_res_list <- do_paginated_request( request, n_max = n_max, n = function(x) length(x$drives) ) res_tbl <- proc_res_list %>% map("drives") %>% purrr::flatten() %>% as_dribble() if (!is.null(pattern)) { res_tbl <- res_tbl[grep(pattern, res_tbl$name), ] } if (n_max < nrow(res_tbl)) { res_tbl <- res_tbl[seq_len(n_max), ] } res_tbl } googledrive/R/shared_drive_rm.R0000644000176200001440000000353714070147664016262 0ustar liggesusers#' Delete shared drives #' #' @template shared-drive-description #' #' @seealso Wraps the `drives.delete` endpoint: #' * #' #' @template shared_drive-plural #' #' @return Logical vector, indicating whether the delete succeeded. #' @export #' @examples #' \dontrun{ #' # Create shared drives to remove in various ways #' shared_drive_create("testdrive-01") #' sd02 <- shared_drive_create("testdrive-02") #' shared_drive_create("testdrive-03") #' sd04 <- shared_drive_create("testdrive-04") #' #' # remove by name #' shared_drive_rm("testdrive-01") #' # remove by id #' shared_drive_rm(as_id(sd02)) #' # remove by URL (or, rather, id found in URL) #' shared_drive_rm(as_id("https://drive.google.com/drive/u/0/folders/Q5DqUk9PVA")) #' # remove by dribble #' shared_drive_rm(sd04) #' } shared_drive_rm <- function(drive = NULL) { shared_drive <- as_shared_drive(drive) if (no_file(shared_drive)) { drive_bullets(c( "!" = "No such shared drive found to delete." )) return(invisible(logical(0))) } out <- map_lgl(as_id(shared_drive), delete_one_shared_drive) if (any(out)) { successes <- shared_drive[out, ] drive_bullets(c( "Shared drive{?s} deleted:{cli::qty(nrow(successes))}", bulletize(gargle_map_cli(successes)) )) } # I'm not sure this ever comes up IRL? # Is it even possible that removal fails but there's no error? if (any(!out)) { failures <- shared_drive[!out, ] drive_bullets(c( "Shared drive{?s} NOT deleted:{cli::qty(nrow(failures))}", bulletize(gargle_map_cli(failures)) )) } invisible(out) } delete_one_shared_drive <- function(id) { request <- request_generate( endpoint = "drive.drives.delete", params = list(driveId = id) ) response <- request_make(request) gargle::response_process(response) } googledrive/R/shared_drive_create.R0000644000176200001440000000167414070147664017107 0ustar liggesusers#' Create a new shared drive #' #' @template shared-drive-description #' #' @seealso Wraps the `drives.create` endpoint: #' * #' #' @param name Character. Name of the new shared drive. Must be non-empty and not #' entirely whitespace. #' #' @eval return_dribble("shared drive") #' @export #' @examples #' \dontrun{ #' shared_drive_create("my-awesome-shared-drive") #' #' # clean up #' shared_drive_rm("my-awesome-shared-drive") #' } shared_drive_create <- function(name) { stopifnot(is_string(name), isTRUE(nzchar(name))) request <- request_generate( "drive.drives.create", params = list( requestId = uuid::UUIDgenerate(), name = name, fields = "*" ) ) response <- request_make(request) out <- as_dribble(list(gargle::response_process(response))) drive_bullets(c("Shared drive created:", bulletize(gargle_map_cli(out)))) invisible(out) } googledrive/R/drive_id-class.R0000644000176200001440000000763114071401260015776 0ustar liggesusersnew_drive_id <- function(x = character()) { vec_assert(x, character()) new_vctr(x, class = "drive_id", inherit_base_type = TRUE) } validate_drive_id <- function(x) { ok <- is_valid_drive_id(x) if (all(ok)) { return(x) } # proceed with plain character vector x <- unclass(x) # pragmatism re: how to cli-style a path that is the empty string # this is related to the use of gargle_map_cli() for vectorized styling # if cli gains native vectorization, this may become unnecessary x[!nzchar(x)] <- "\"\"" drive_abort(c( "A {.cls drive_id} must match this regular expression: \\ {.code {drive_id_regex()}}", "Invalid input{?s}:{cli::qty(sum(!ok))}", bulletize(gargle_map_cli(x[!ok]), bullet = "x") )) } drive_id_regex <- function() "^[a-zA-Z0-9_-]+$" is_valid_drive_id <- function(x) { # among practitioners, It Is Known that file IDs have >= 25 characters # but I'm not convinced the pros outweigh the cons re: checking length # for example, in tests, it's nice to not worry about this grepl(drive_id_regex(), x) | is.na(x) } is_drive_id <- function(x) { inherits(x, "drive_id") } #' @export gargle_map_cli.drive_id <- function(x, ...) { NextMethod() } #' @export vec_ptype2.drive_id.drive_id <- function(x, y, ...) new_drive_id() #' @export vec_ptype2.drive_id.character <- function(x, y, ...) character() #' @export vec_ptype2.character.drive_id <- function(x, y, ...) character() #' @export vec_cast.drive_id.drive_id <- function(x, to, ...) x #' @export vec_cast.drive_id.character <- function(x, to, ...) { validate_drive_id(new_drive_id(x)) } #' @export vec_cast.character.drive_id <- function(x, to, ...) vec_data(x) #' @export vec_ptype_abbr.drive_id <- function(x) "drv_id" #' @export pillar_shaft.drive_id <- function(x, ...) { # I would like to present drive_id in full, space permitting, or truncate # it severely. Anything in between is a waste of horizontal space. # But this is not currently possible: https://github.com/r-lib/pillar/issues/331 # Explored here in https://github.com/tidyverse/googledrive/pull/364 # Current compromise is to use pillar_shaft.character. # Not sure why I can't access via NextMethod(). pillar::pillar_shaft(unclass(x)) } #' Extract and/or mark as file id #' #' @description Gets file ids from various inputs and marks them as such, to #' distinguish them from file names or paths. #' #' @description This is a generic function. #' #' @param x A character vector of file or shared drive ids or URLs, a #' [`dribble`], or a suitable data frame. #' @param ... Other arguments passed down to methods. (Not used.) #' @return A character vector bearing the S3 class `drive_id`. #' @export #' @examplesIf drive_has_token() #' as_id("123abc") #' as_id("https://docs.google.com/spreadsheets/d/qawsedrf16273849/edit#gid=12345") #' #' x <- drive_find(n_max = 3) #' as_id(x) as_id <- function(x, ...) UseMethod("as_id") #' @export as_id.default <- function(x, ...) { drive_abort(" Don't know how to coerce an object of class {.cls {class(x)}} into \\ a {.cls drive_id}.") } #' @export as_id.NULL <- function(x, ...) NULL #' @export as_id.drive_id <- function(x, ...) x #' @export as_id.dribble <- function(x, ...) as_id(x$id) #' @export as_id.data.frame <- function(x, ...) as_id(validate_dribble(new_dribble(x))) #' @export as_id.character <- function(x, ...) { if (length(x) == 0L) return(x) out <- map_chr(x, get_one_id) validate_drive_id(new_drive_id(out)) } ## we anticipate file-id-containing URLs in these forms: ## /d/FILE_ID Drive file ## /folders/FILE_ID Drive folder ## id=FILE_ID uploaded blob id_regexp <- "(/d/|/folders/|id=)[^/]+" is_drive_url <- function(x) grepl("^http", x) & grepl(id_regexp, x) get_one_id <- function(x) { if (!grepl("^http|/", x)) return(x) id_loc <- regexpr(id_regexp, x) if (id_loc == -1) { NA_character_ } else { gsub("/d/|/folders/|id=", "", regmatches(x, id_loc)) } } googledrive/R/dribble.R0000644000176200001440000002700714071403675014524 0ustar liggesusers#' dribble object #' #' @description googledrive stores the metadata for one or more Drive files or #' shared drives as a `dribble`. It is a "Drive #' [tibble][tibble::tibble-package]" with one row per file or shared drive #' and, at a minimum, these columns: #' * `name`: a character column containing file or shared drive names #' * `id`: a character column of file or shared drive ids #' * `drive_resource`: a list-column, each element of which is either a #' [Files resource](https://developers.google.com/drive/api/v3/reference/files#resource-representations) #' or a [Drives resource](https://developers.google.com/drive/api/v3/reference/drives#resource-representations) #' object. Note there is no guarantee that all documented fields are always #' present. We do check if the `kind` field is present and equal to one of #' `drive#file` or `drive#drive`. #' #' @description The `dribble` format is handy because it exposes the file name, #' which is good for humans, but keeps it bundled with the file's unique id #' and other metadata, which are needed for API calls. #' #' @description In general, the `dribble` class will be retained even after #' manipulation, as long as the required variables are present and of the #' correct type. This works best for manipulations via the dplyr and vctrs #' packages. #' #' @name dribble #' @seealso [as_dribble()] NULL # implementing dribble as advised here: # https://github.com/hadley/adv-r/blob/master/S3.Rmd new_dribble <- function(x) { # new_tibble0() strips attributes out <- structure( new_tibble0(x), class = c("dribble", "tbl_df", "tbl", "data.frame") ) out$id <- new_drive_id(unclass(out$id)) out } validate_dribble <- function(x) { stopifnot(inherits(x, "dribble")) if (!has_dribble_cols(x)) { missing_cols <- setdiff(dribble_cols, colnames(x)) drive_abort(c( "Invalid {.cls dribble}. \\ {cli::qty(length(missing_cols))}{?This/These} required column{?s} \\ {?is/are} missing:", bulletize(gargle_map_cli(missing_cols, template = "{.code <>}")) )) } if (!has_dribble_coltypes(x)) { mistyped_cols <- dribble_cols[!dribble_coltypes_ok(x)] drive_abort(c( "Invalid {.cls dribble}. \\ {cli::qty(length(mistyped_cols))}{?This/These} column{?s} {?has/have} \\ the wrong type:", bulletize(gargle_map_cli(mistyped_cols, template = "{.code <>}")) )) } # TODO: should I make sure there are no NAs in the id column? # let's wait and see if we ever experience any harm from NOT checking this # also, that feels more like something to enforce by creating a proper # S3 vctr for Drive file ids and it might be odd to make NAs unacceptable if (!has_drive_resource(x)) { # \u00a0 is a nonbreaking space drive_abort(c( 'Invalid {.cls dribble}. Can\'t confirm \\ {.code kind\u00a0=\u00a0"drive#file"} or \\ {.code kind\u00a0=\u00a0"drive#drive"} \\ for all elements of the {.code drive_resource} column.' )) } x } dribble <- function(x = NULL) { x <- x %||% list( name = character(), id = character(), drive_resource = list() ) validate_dribble(new_dribble(x)) } #' @export `[.dribble` <- function(x, i, j, drop = FALSE) { dribble_maybe_reconstruct(NextMethod()) } #' @export `names<-.dribble` <- function(x, value) { dribble_maybe_reconstruct(NextMethod()) } #' @export tbl_sum.dribble <- function(x) { orig <- NextMethod() c("A dribble" = unname(orig)) } #' @export as_tibble.dribble <- function(x, ...) { as_tibble(new_tibble0(x), ...) } dribble_cols <- c("name", "id", "drive_resource") has_dribble_cols <- function(x) { all(dribble_cols %in% colnames(x)) } dribble_coltypes_ok <- function(x) { c( name = is.character(x$name), id = is.character(x$id), drive_resource = inherits(x$drive_resource, "list") ) } has_dribble_coltypes <- function(x) { all(dribble_coltypes_ok(x)) } id_can_be_drive_id <- function(x) { all(is_valid_drive_id(x)) } has_drive_resource <- function(x) { kind <- map_chr(x$drive_resource, "kind", .default = NA_character_) # TODO: remove `drive#teamDrive` here, when possible all(!is.na(kind) & kind %in% c("drive#file", "drive#drive", "drive#teamDrive")) } #' Coerce to a `dribble` #' #' @description #' Converts various representations of Google Drive files into a [`dribble`], #' the object used by googledrive to hold Drive file metadata. Files can be #' specified via: #' * File path. File name is an important special case. #' * File id. Mark with [as_id()] to distinguish from file path. #' * Data frame or [`dribble`]. Once you've successfully used googledrive to #' identify the files of interest, you'll have a [`dribble`]. Pass it into #' downstream functions. #' * List representing [Files resource](https://developers.google.com/drive/api/v3/reference/files) #' objects. Mostly for internal use. #' #' This is a generic function. #' #' For maximum clarity, get your files into a [`dribble`] (or capture file id) #' as early as possible. When specifying via path, it's best to include the #' trailing slash when you're targetting a folder. If you want the folder `foo`, #' say `foo/`, not `foo`. #' #' Some functions, such as [drive_cp()], [drive_mkdir()], [drive_mv()], and #' [drive_upload()], can accept the new file or folder name as the last part of #' `path`, when `name` is not given. But if you say `a/b/c` (no trailing slash) #' and a folder `a/b/c/` already exists, it's unclear what you want. A file #' named `c` in `a/b/` or a file with default name in `a/b/c/`? You get an #' error and must make your intent clear. #' #' @param x A vector of Drive file paths, a vector of file ids marked #' with [as_id()], a list of Files Resource objects, or a suitable data #' frame. #' @param ... Other arguments passed down to methods. (Not used.) #' @export #' @examplesIf drive_has_token() #' # create some files for us to re-discover by name or filepath #' alfa <- drive_create("alfa", type = "folder") #' bravo <- drive_create("bravo", path = alfa) #' #' # as_dribble() can work with file names or paths #' as_dribble("alfa") #' as_dribble("bravo") #' as_dribble("alfa/bravo") #' as_dribble(c("alfa", "alfa/bravo")) #' #' # specify the file id (substitute a real file id of your own!) #' # as_dribble(as_id("0B0Gh-SuuA2nTOGZVTXZTREgwZ2M")) #' #' # cleanup #' drive_find("alfa") %>% drive_rm() as_dribble <- function(x, ...) UseMethod("as_dribble") #' @export as_dribble.default <- function(x, ...) { drive_abort(" Don't know how to coerce an object of class {.cls {class(x)}} into \\ a {.cls dribble}.") } #' @export as_dribble.NULL <- function(x, ...) dribble() #' @export as_dribble.character <- function(x, ...) { with_drive_quiet(drive_get(path = x)) } #' @export as_dribble.drive_id <- function(x, ...) drive_get(id = x) #' @export as_dribble.data.frame <- function(x, ...) validate_dribble(new_dribble(x)) #' @export as_dribble.list <- function(x, ...) { if (length(x) == 0) return(dribble()) required_nms <- c("name", "id", "kind") stopifnot(map_lgl(x, ~all(required_nms %in% names(.x)))) as_dribble( tibble( name = map_chr(x, "name"), id = map_chr(x, "id"), drive_resource = x ) ) } # used across several functions that create a file or modify "parentage" # processes a putative parent folder or shared drive as_parent <- function(d) { in_var <- deparse(substitute(d)) if (is_path(d)) { d <- append_slash(d) } d <- as_dribble(d) # wording chosen to work for folder and shared drive invalid_parent <- "Parent specified via {.arg {in_var}} is invalid:" if (no_file(d)) { drive_abort(c(invalid_parent, x = "Does not exist.")) } if (!single_file(d)) { drive_abort(c( invalid_parent, x = "Doesn't uniquely identify exactly one folder or shared drive." )) } if (is_folder_shortcut(d)) { drive_bullets(c( i = "Parent specified via {.arg {in_var}} is a shortcut; resolving to \\ its target folder")) d <- shortcut_resolve(d) } if (!is_parental(d)) { drive_abort(c( invalid_parent, x = "Is neither a folder nor a shared drive." )) } d } #' Check facts about a dribble #' #' Sometimes you need to check things about a [`dribble`]` or about the files it #' represents, such as: #' * Is it even a dribble? #' * Size: Does the dribble hold exactly one file? At least one file? No file? #' * File type: Is this file a folder? #' * File ownership and access: Is it mine? Published? Shared? #' #' @name dribble-checks #' @param d A [`dribble`]. #' @examplesIf drive_has_token() #' ## most of us have multiple files or folders on Google Drive #' d <- drive_find() #' is_dribble(d) #' no_file(d) #' single_file(d) #' some_files(d) #' #' # this will error #' # confirm_single_file(d) #' #' confirm_some_files(d) #' is_folder(d) #' is_mine(d) NULL #' @export #' @rdname dribble-checks is_dribble <- function(d) { inherits(d, "dribble") } #' @export #' @rdname dribble-checks no_file <- function(d) { stopifnot(inherits(d, "dribble")) nrow(d) == 0 } #' @export #' @rdname dribble-checks single_file <- function(d) { stopifnot(inherits(d, "dribble")) nrow(d) == 1 } #' @export #' @rdname dribble-checks some_files <- function(d) { stopifnot(inherits(d, "dribble")) nrow(d) > 0 } #' @export #' @rdname dribble-checks confirm_dribble <- function(d) { if (!is_dribble(d)) { drive_abort("Input is not a {.cls dribble}.") } d } #' @export #' @rdname dribble-checks confirm_single_file <- function(d) { in_var <- deparse(substitute(d)) if (no_file(d)) { drive_abort("{.arg {in_var}} does not identify at least one Drive file.") } if (!single_file(d)) { drive_abort("{.arg {in_var}} identifies more than one Drive file.") } d } #' @export #' @rdname dribble-checks confirm_some_files <- function(d) { in_var <- deparse(substitute(d)) if (no_file(d)) { drive_abort("{.arg {in_var}} does not identify at least one Drive file.") } d } #' @export #' @rdname dribble-checks is_folder <- function(d) { stopifnot(inherits(d, "dribble")) map_chr(d$drive_resource, "mimeType", .default = NA) == "application/vnd.google-apps.folder" } #' @export #' @rdname dribble-checks is_shortcut <- function(d) { stopifnot(inherits(d, "dribble")) map_chr(d$drive_resource, "mimeType", .default = NA) == "application/vnd.google-apps.shortcut" } #' @export #' @rdname dribble-checks is_folder_shortcut <- function(d) { stopifnot(inherits(d, "dribble")) is_shortcut(d) & (map_chr( d$drive_resource, c("shortcutDetails", "targetMimeType"), .default = "" ) == "application/vnd.google-apps.folder") } #' @export #' @rdname dribble-checks is_native <- function(d) { stopifnot(inherits(d, "dribble")) d <- promote(d, "mimeType") grepl("application/vnd.google-apps.", d$mimeType) & !is_folder(d) } #' @export #' @rdname dribble-checks is_parental <- function(d) { stopifnot(inherits(d, "dribble")) kind <- map_chr(d$drive_resource, "kind") mime_type <- map_chr(d$drive_resource, "mimeType", .default = "") # TODO: remove `drive#teamDrive` here, when possible kind == "drive#teamDrive" | kind == "drive#drive" | mime_type == "application/vnd.google-apps.folder" } #' @export #' @rdname dribble-checks ## TO DO: do I need to do anything about shared drives here? is_mine <- function(d) { stopifnot(inherits(d, "dribble")) map_lgl(d$drive_resource, list("owners", 1, "me")) } #' @export #' @rdname dribble-checks is_shared_drive <- function(d) { stopifnot(inherits(d, "dribble")) map_chr(d$drive_resource, "kind") == "drive#drive" } googledrive/R/drive_put.R0000644000176200001440000000666314071171100015110 0ustar liggesusers#' PUT new media into a Drive file #' #' @description #' PUTs new media into a Drive file, in the HTTP sense: #' * If the file already exists, we replace its content. #' * If the file does not already exist, we create a new file. #' #' @description #' This is a convenience wrapper around [`drive_upload()`] and #' [`drive_update()`]. In pseudo-code: #' #' ``` #' target_filepath <- #' hits <- #' if (no hits) { #' drive_upload(media, path, name, type, ...) #' } else if (exactly 1 hit) { #' drive_update(hit, media, ...) #' } else { #' ERROR #' } #' ``` #' #' @inheritParams drive_upload #' #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # create a local file to work with #' local_file <- tempfile("drive_put_", fileext = ".txt") #' writeLines(c("beginning", "middle"), local_file) #' #' # PUT to a novel filepath --> drive_put() delegates to drive_upload() #' file <- drive_put(local_file) #' #' # update the local file #' cat("end", file = local_file, sep = "\n", append = TRUE) #' #' # PUT again --> drive_put() delegates to drive_update() #' file <- drive_put(local_file) #' #' # create a second file at this filepath #' file2 <- drive_create(basename(local_file)) #' #' # PUT again --> ERROR #' drive_put(local_file) #' #' # clean-up #' drive_find("drive_put_.+[.]txt") %>% drive_rm() #' unlink(local_file) drive_put <- function(media, path = NULL, name = NULL, ..., type = NULL, verbose = deprecated()) { warn_for_verbose(verbose) if (file.exists(media)) { media <- enc2utf8(media) } else { drive_abort(c( "No file exists at the local {.arg media} path:", bulletize(gargle_map_cli(media, "{.path <>}"), bullet = "x") )) } tmp <- rationalize_path_name(path, name) path <- tmp$path name <- tmp$name params <- list() # load (path, name) into params if (!is.null(path)) { path <- as_parent(path) params[["parents"]] <- path$id } params[["name"]] <- name %||% basename(media) hits <- overwrite_hits( parent = params[["parents"]], name = params[["name"]], overwrite = FALSE ) # Happy Path 1 of 2: no name collision if (is.null(hits) || no_file(hits)) { drive_bullets(c( "i" = "No pre-existing Drive file at this path. Calling \\ {.fun drive_upload}." )) return(drive_upload( media = media, path = as_id(params[["parents"]]), name = params[["name"]], type = type, ... )) } # Happy Path 2 of 2: single name collision if (single_file(hits)) { drive_bullets(c( "i" = "A Drive file already exists at this path. Calling \\ {.fun drive_update}." )) return(drive_update( hits, media = media, ... )) } # Unhappy Path: multiple collisions drive_abort(c( "Multiple items already exist on Drive at the target filepath.", "Unclear what {.fun drive_put} should do. Exiting.", # drive_reveal_path() puts immediate parent, if specified, in the `path` # then we reveal `path`, instead of `name` bulletize(gargle_map_cli( drive_reveal_path(hits, ancestors = path), template = c( id_string = ">>", # \u00a0 is a nonbreaking space out = "{.drivepath <>} {cli::col_grey('<>')}" ) )) )) } googledrive/R/drive_upload.R0000644000176200001440000001140314071404276015565 0ustar liggesusers#' Upload into a new Drive file #' #' Uploads a local file into a new Drive file. To update the content or metadata #' of an existing Drive file, use [drive_update()]. To upload or update, #' depending on whether the Drive file already exists, see [drive_put()]. #' #' @seealso Wraps the `files.create` endpoint: #' * #' #' MIME types that can be converted to native Google formats: #' * #' #' @template media #' @eval param_path( #' thing = "new file", #' default_notes = "By default, the file is created in the current #' user's \"My Drive\" root folder." #' ) #' @eval param_name( #' thing = "file", #' default_notes = "Defaults to the file's local name." #' ) #' @param type Character. If `type = NULL`, a MIME type is automatically #' determined from the file extension, if possible. If the source file is of a #' suitable type, you can request conversion to Google Doc, Sheet or Slides by #' setting `type` to `document`, `spreadsheet`, or `presentation`, #' respectively. All non-`NULL` values for `type` are pre-processed with #' [drive_mime_type()]. #' @template dots-metadata #' @template overwrite #' @template verbose #' #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # upload a csv file #' chicken_csv <- drive_example_local("chicken.csv") %>% #' drive_upload("chicken-upload.csv") #' #' # or convert it to a Google Sheet #' chicken_sheet <- drive_example_local("chicken.csv") %>% #' drive_upload( #' name = "chicken-sheet-upload.csv", #' type = "spreadsheet" #' ) #' #' # check out the new Sheet! #' drive_browse(chicken_sheet) #' #' # clean-up #' drive_find("chicken.*upload") %>% drive_rm() #' #' # Upload a file and, at the same time, star it #' chicken <- drive_example_local("chicken.jpg") %>% #' drive_upload(starred = "true") #' #' # Is is really starred? YES #' purrr::pluck(chicken, "drive_resource", 1, "starred") #' #' # Clean up #' drive_rm(chicken) #' #' # `overwrite = FALSE` errors if something already exists at target filepath #' # THIS WILL ERROR! #' drive_create("name-squatter") #' drive_example_local("chicken.jpg") %>% #' drive_upload( #' name = "name-squatter", #' overwrite = FALSE #' ) #' #' # `overwrite = TRUE` moves the existing item to trash, then proceeds #' chicken <- drive_example_local("chicken.jpg") %>% #' drive_upload( #' name = "name-squatter", #' overwrite = TRUE #' ) #' #' # Clean up #' drive_rm(chicken) #' #' \dontrun{ #' # Upload to a shared drive: #' # * Shared drives are only available if your account is associated with a #' # Google Workspace #' # * The shared drive (or shared-drive-hosted folder) MUST be captured as a #' # dribble first and provided via `path` #' sd <- shared_drive_get("Marketing") #' drive_upload("fascinating.csv", path = sd) #' } drive_upload <- function(media, path = NULL, name = NULL, type = NULL, ..., overwrite = NA, verbose = deprecated()) { warn_for_verbose(verbose) if (file.exists(media)) { media <- enc2utf8(media) } else { drive_abort(c( "No file exists at the local {.arg media} path:", bulletize(gargle_map_cli(media, "{.path <>}"), bullet = "x") )) } tmp <- rationalize_path_name(path, name) path <- tmp$path name <- tmp$name params <- toCamel(list2(...)) # load (path, name) into params if (!is.null(path)) { path <- as_parent(path) params[["parents"]] <- path$id } params[["name"]] <- name %||% basename(media) check_for_overwrite(params[["parents"]], params[["name"]], overwrite) params[["fields"]] <- params[["fields"]] %||% "*" params[["mimeType"]] <- drive_mime_type(type) params[["uploadType"]] <- "multipart" request <- request_generate( endpoint = "drive.files.create.media", params = params ) meta_file <- withr::local_file( tempfile("drive-upload-meta", fileext = ".json") ) write_utf8(jsonlite::toJSON(params), meta_file) ## media uploads have unique body situations, so customizing here. request$body <- list( metadata = httr::upload_file( path = meta_file, type = "application/json; charset=UTF-8" ), media = httr::upload_file(path = media) ) response <- request_make(request, encode = "multipart") out <- as_dribble(list(gargle::response_process(response))) drive_bullets(c( "Local file:", "*" = "{.path {media}}", "Uploaded into Drive file:", bulletize(gargle_map_cli(out)), "With MIME type:", "*" = "{.field {pluck(out, 'drive_resource', 1, 'mimeType')}}" )) invisible(out) } googledrive/R/utils-ui.R0000644000176200001440000001600214071171077014663 0ustar liggesusersdrive_theme <- function() { list( span.field = list(transform = single_quote_if_no_color), # I want to style the Drive file names similar to cli's `.file` style, # except cyan instead of blue span.drivepath = list( color = "cyan", fmt = utils::getFromNamespace("quote_weird_name", "cli") ), # since we're using color so much elsewhere, e.g. Drive file names, I think # the standard bullet should be "normal" color ".memo .memo-item-*" = list( "text-exdent" = 2, before = function(x) paste0(cli::symbol$bullet, " ") ) ) } drive_bullets <- function(text, .envir = parent.frame()) { quiet <- drive_quiet() %|% is_testing() if (quiet) { return(invisible()) } cli::cli_div(theme = drive_theme()) cli::cli_bullets(text = text, .envir = .envir) } drive_abort <- function(message, ..., .envir = parent.frame()) { cli::cli_div(theme = drive_theme()) cli::cli_abort(message = message, ..., .envir = .envir) } drive_warn <- function(message, ..., .envir = parent.frame()) { cli::cli_div(theme = drive_theme()) cli::cli_warn(message = message, ..., .envir = .envir) } single_quote_if_no_color <- function(x) quote_if_no_color(x, "'") double_quote_if_no_color <- function(x) quote_if_no_color(x, '"') quote_if_no_color <- function(x, quote = "'") { # TODO: if a better way appears in cli, use it # @gabor says: "if you want to have before and after for the no-color case # only, we can have a selector for that, such as: # span.field::no-color # (but, at the time I write this, cli does not support this yet) if (cli::num_ansi_colors() > 1) { x } else { paste0(quote, x, quote) } } # useful to me during development, so I can see how my messages look w/o color local_no_color <- function(.envir = parent.frame()) { withr::local_envvar(c("NO_COLOR" = 1), .local_envir = .envir) } with_no_color <- function(code) { withr::with_envvar(c("NO_COLOR" = 1), code) } #' @export gargle_map_cli.dribble <- function(x, template = NULL, .open = "<<", .close = ">>", ...) { # template can be a vector, in case some intermediate constructions are needed # this is true for the default case # templates should assume a data mask of `x` template <- template %||% c( id_string = ">>", # \u00a0 is a nonbreaking space out = "{.drivepath <>} {cli::col_grey('<>')}" ) stopifnot(is.character(template)) # if the template has length 1, I don't care if last element is named "out" stopifnot(length(template) == 1 || utils::tail(names(template), 1) == "out") for (i in seq_len(length(template) - 1)) { x[names(template)[[i]]] <- with(x, glue(template[[i]], .open = .open, .close = .close)) } with( x, as.character(glue(utils::tail(template, 1), .open = .open, .close = .close)) ) } # making googldrive quiet vs. loud ---- drive_quiet <- function() { getOption("googledrive_quiet", default = NA) } #' @rdname googledrive-configuration #' @param env The environment to use for scoping #' @section Messages: #' #' The `googledrive_quiet` option can be used to suppress messages from #' googledrive. By default, googledrive always messages, i.e. it is *not* #' quiet. #' #' Set `googledrive_quiet` to `TRUE` to suppress messages, by one of these #' means, in order of decreasing scope: #' * Put `options(googledrive_quiet = TRUE)` in a start-up file, such as #' `.Rprofile`, or at the top of your R script #' * Use `local_drive_quiet()` to silence googledrive in a specific scope #' ``` #' foo <- function() { #' ... #' local_drive_quiet() #' drive_this(...) #' drive_that(...) #' ... #' } #' * Use `with_drive_quiet()` to run a small bit of code silently #' ``` #' with_drive_quiet( #' drive_something(...) #' ) #' ``` #' #' `local_drive_quiet()` and `with_drive_quiet()` follow the conventions of the #' the withr package (). #' #' @export #' @examplesIf drive_has_token() #' # message: "Created Drive file" #' (x <- drive_create("drive-quiet-demo", type = "document")) #' #' # message: "File updated" #' x <- drive_update(x, starred = TRUE) #' drive_reveal(x, "starred") #' #' # suppress messages for a small amount of code #' with_drive_quiet( #' x <- drive_update(x, name = "drive-quiet-works") #' ) #' x$name #' #' # message: "File updated" #' x <- drive_update(x, media = drive_example_local("chicken.txt")) #' #' # suppress messages within a specific scope, e.g. function #' unstar <- function(y) { #' local_drive_quiet() #' drive_update(y, starred = FALSE) #' } #' x <- unstar(x) #' drive_reveal(x, "starred") #' #' # clean up #' drive_rm(x) local_drive_quiet <- function(env = parent.frame()) { withr::local_options(list(googledrive_quiet = TRUE), .local_envir = env) } local_drive_loud <- function(env = parent.frame()) { withr::local_options(list(googledrive_quiet = FALSE), .local_envir = env) } # keeps wrapping from wreaking havoc on snapshot tests, esp. when I have to # find and replace volatile bits of text local_drive_loud_and_wide <- function(cli.width = 150, env = parent.frame()) { withr::local_options(list( googledrive_quiet = FALSE, cli.width = cli.width ), .local_envir = env) } #' @rdname googledrive-configuration #' @param code Code to execute quietly #' @export with_drive_quiet <- function(code) { withr::with_options(list(googledrive_quiet = TRUE), code = code) } with_drive_loud <- function(code) { withr::with_options(list(googledrive_quiet = FALSE), code = code) } is_testing <- function() { identical(Sys.getenv("TESTTHAT"), "true") } # dealing with how we've communicated in the past --- sq <- function(x) glue::single_quote(x) bt <- function(x) glue::backtick(x) message <- function(...) { drive_abort(" Internal error: use the UI functions in {.pkg googledrive} \\ instead of {.fun message}") } warn_for_verbose <- function(verbose = TRUE, env = parent.frame()) { # this is about whether `verbose` was present in the **user's** call to the # calling function # don't worry about the `verbose = TRUE` default here if (!lifecycle::is_present(verbose) || isTRUE(verbose)) { return(invisible()) } called_from <- sys.parent(1) if (called_from == 0) { # called from global env, presumably in a test or during development caller <- "some_googledrive_function" } else { called_as <- sys.call(called_from) if (is.call(called_as) && is.symbol(called_as[[1]])) { caller <- as.character(called_as[[1]]) } else { caller <- "some_googledrive_function" } } lifecycle::deprecate_warn( when = "2.0.0", what = glue("{caller}(verbose)"), details = glue(" Set `options(googledrive_quiet = TRUE)` to suppress all \\ googledrive messages. For finer control, use `local_drive_quiet()` or `with_drive_quiet()`. googledrive's `verbose` argument will be removed in the future."), id = "googledrive_verbose" ) local_drive_quiet(env = env) invisible() } googledrive/R/team_drive.R0000644000176200001440000000437614070147664015246 0ustar liggesusers#' Deprecated Team Drive functions #' #' @description #' `r lifecycle::badge('deprecated')` #' @template team-drives-description #' #' @inheritParams shared_drive_find #' @inheritParams shared_drive_get #' @inheritParams as_shared_drive #' @inheritParams is_shared_drive #' @template team_drive-plural #' #' @eval return_dribble("shared drive") #' #' @keywords internal #' @name deprecated-team-drive-functions NULL #' @export #' @rdname deprecated-team-drive-functions team_drive_find <- function(pattern = NULL, n_max = Inf, ..., verbose = deprecated()) { warn_for_verbose(verbose) lifecycle::deprecate_warn("2.0.0", "team_drive_find()", "shared_drive_find()") shared_drive_find(pattern = pattern, n_max = n_max, ...) } #' @export #' @rdname deprecated-team-drive-functions team_drive_get <- function(name = NULL, id = NULL, verbose = deprecated()) { warn_for_verbose(verbose) lifecycle::deprecate_warn("2.0.0", "team_drive_get()", "shared_drive_get()") shared_drive_get(name = name, id = id) } #' @export #' @rdname deprecated-team-drive-functions team_drive_create <- function(name, verbose = deprecated()) { warn_for_verbose(verbose) lifecycle::deprecate_warn("2.0.0", "team_drive_create()", "shared_drive_create()") shared_drive_create(name = name) } #' @export #' @rdname deprecated-team-drive-functions team_drive_rm <- function(team_drive = NULL, verbose = deprecated()) { warn_for_verbose(verbose) lifecycle::deprecate_warn("2.0.0", "team_drive_rm()", "shared_drive_rm()") shared_drive_rm(drive = team_drive) } #' @export #' @rdname deprecated-team-drive-functions team_drive_update <- function(team_drive, ..., verbose = deprecated()) { warn_for_verbose(verbose) lifecycle::deprecate_warn("2.0.0", "team_drive_update()", "shared_drive_update()") shared_drive_update(drive = team_drive, ...) } #' @export #' @rdname deprecated-team-drive-functions as_team_drive <- function(x, ...) { lifecycle::deprecate_warn("2.0.0", "as_team_drive()", "as_shared_drive()") as_shared_drive(x, ...) } #' @export #' @rdname deprecated-team-drive-functions is_team_drive <- function(d) { stopifnot(inherits(d, "dribble")) map_chr(d$drive_resource, "kind") == "drive#teamDrive" } googledrive/R/drive_reveal.R0000644000176200001440000001604014071404575015563 0ustar liggesusers#' Add a new column of Drive file information #' #' @description #' `drive_reveal()` adds extra information about your Drive files that is not #' readily available in the default [`dribble`] produced by googledrive. Why is #' this info not always included in the default `dribble`? #' * You don't always care about it. There is a lot of esoteric information in #' the `drive_resource` that has little value for most users. #' * It might be "expensive" to get this information and put it into a usable #' form. For example, revealing a file's `"path"`, `"permissions"`, or #' `"published"` status all require additional API calls. #' #' `drive_reveal()` can also **hoist** any property out of the `drive_resource` #' list-column, when the property's name is passed as the `what` argument. The #' resulting new column is simplified if it is easy to do so, e.g., if the #' individual elements are all string or logical. If `what` extracts a #' date-time, we return [`POSIXct`][DateTimeClasses]. Otherwise, you'll get a #' list-column. If this makes you sad, consider using `tidyr::hoist()` instead. #' It is more powerful due to a richer "plucking specification" and its `ptype` #' and `transform` arguments. Another useful function is #' `tidyr::unnest_wider()`. #' #' #' @section File path: When `what = "path"` the [`dribble`] gains a character #' column holding each file's path. This can be *very slow*, so use with #' caution. #' #' The example path `~/a/b/` illustrates two conventions used in googledrive: #' * The leading `~/` means that the folder `a` is located in the current #' user's "My Drive" root folder. #' * The trailing `/` means that `b`, located in `a`, is *a folder or a folder #' shortcut*. #' @section Permissions: #' When `what = "permissions"` the [`dribble`] gains a logical column `shared` #' that indicates whether a file is shared and a new list-column #' `permissions_resource` containing lists of #' [Permissions resources](https://developers.google.com/drive/api/v3/reference/permissions). #' #' @section Publishing: #' When `what = "published"` the [`dribble`] gains a logical column #' `published` that indicates whether a file is published and a new list-column #' `revision_resource` containing lists of #' [Revisions resources](https://developers.google.com/drive/api/v3/reference/revisions). #' #' @section Parent: #' When `what = "parent"` the [`dribble`] gains a character column `id_parent` #' that is the file id of this item's parent folder. This information is #' available in the `drive_resource`, but can't just be hoisted out: #' * Google Drive used to allow files to have multiple parents, but this is no #' longer supported and googledrive now assumes this is impossible. However, #' we have seen (very old) files that still have >1 parent folder. If we see #' this we message about it and drop all but the first parent. #' * The `parents` property in `drive_resource` has an "extra" layer of nesting #' and needs to be flattened. #' #' If you really want the raw `parents` property, call `drive_reveal(what = #' "parents")`. #' @template file-plural #' @param what Character, describing the type of info you want to add. These #' values get special handling (more details below): #' * `path` #' * `permissions` #' * `published` #' * `parent` #' #' You can also request any property in the `drive_resource` column by name. #' The request can be in `camelCase` or `snake_case`, but the new column name #' will always be `snake_case`. Some examples of `what`: #' * `mime_type` (or `mimeType`) #' * `trashed` #' * `starred` #' * `description` #' * `version` #' * `web_view_link` (or `webViewLink`) #' * `modified_time` (or `modifiedTime`) #' * `created_time` (or `createdTime`) #' * `owned_by_me` (or `ownedByMe`) #' * `size` #' * `quota_bytes_used` (or `quotaBytesUsed`) #' #' @eval return_dribble(extras = "The additional info requested via `what` #' appears in one (or more) extra columns.") #' #' @seealso To learn more about the properties present in the metadata of a #' Drive file (which is what's in the `drive_resource` list-column of a #' [`dribble`]), see the API docs: #' * #' #' @export #' @examplesIf drive_has_token() #' # Get a few of your files #' files <- drive_find(n_max = 10, trashed = NA) #' #' # the "special" cases that require additional API calls and can be slow #' drive_reveal(files, "path") #' drive_reveal(files, "permissions") #' drive_reveal(files, "published") #' #' # a "special" case of digging info out of `drive_resource`, then processing #' # a bit #' drive_reveal(files, "parent") #' #' # the "simple" cases of digging info out of `drive_resource` #' drive_reveal(files, "trashed") #' drive_reveal(files, "mime_type") #' drive_reveal(files, "starred") #' drive_reveal(files, "description") #' drive_reveal(files, "version") #' drive_reveal(files, "web_view_link") #' drive_reveal(files, "modified_time") #' drive_reveal(files, "created_time") #' drive_reveal(files, "owned_by_me") #' drive_reveal(files, "size") #' drive_reveal(files, "quota_bytes_used") #' #' # 'root' is a special file id that represents your My Drive root folder #' drive_get(id = "root") %>% #' drive_reveal("path") drive_reveal <- function(file, what = c("path", "permissions", "published", "parent")) { stopifnot(is_string(what)) file <- as_dribble(file) if (what %in% c("path", "permissions", "published", "parent")) { reveal <- switch( what, "path" = drive_reveal_canonical_path, "permissions" = drive_reveal_permissions, "published" = drive_reveal_published, "parent" = drive_reveal_parent ) return(reveal(file)) } drive_reveal_this(file, what) } drive_reveal_this <- function(file, this) { elem_snake_case <- snake_case(this) is_dttm <- grepl("_time$", elem_snake_case) if (no_file(file)) { return( put_column( file, nm = elem_snake_case, val = list(), .after = "name" ) ) } out <- promote(file, elem_snake_case) if (is_dttm && is.character(out[[elem_snake_case]])) { out[[elem_snake_case]] <-as.POSIXct( out[[elem_snake_case]], format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC" ) } out } drive_reveal_parent <- function(file) { confirm_dribble(file) file <- drive_reveal(file, "parents") # due to the historical use of multiple parents, there is a gratuitous level # of nesting here file$parents <- map(file$parents, 1) n_parents <- lengths(file$parents) has_multiple_parents <- n_parents > 1 if (any(has_multiple_parents)) { drive_bullets(c( "{sum(has_multiple_parents)} file{?s} {?has/have} >1 parent, which is a \\ remnant of legacy Drive behaviour:", bulletize(gargle_map_cli(file[has_multiple_parents, ])), "!" = "Only the first parent will be used" )) } file <- put_column( file, nm = "id_parent", val = as_id(map_chr(file$parents, 1, .default = NA)), .after = "name" ) file$parents <- NULL file } googledrive/R/aaa.R0000644000176200001440000000144414071171077013636 0ustar liggesusers# environment to hold data about the Drive API .drive <- new.env(parent = emptyenv()) .drive$translate_mime_types <- system.file( "extdata", "data", "translate_mime_types.csv", package = "googledrive", mustWork = TRUE ) %>% utils::read.csv(stringsAsFactors = FALSE) %>% as_tibble() .drive$mime_tbl <- system.file( "extdata", "data", "mime_tbl.csv", package = "googledrive", mustWork = TRUE ) %>% utils::read.csv(stringsAsFactors = FALSE) %>% as_tibble() .drive$files_fields <- system.file( "extdata", "data", "files_fields.csv", package = "googledrive", mustWork = TRUE ) %>% utils::read.csv(stringsAsFactors = FALSE) %>% as_tibble() # environment to hold other data that is convenient to cache .googledrive <- new.env(parent = emptyenv()) googledrive/R/drive_trash.R0000644000176200001440000000502514071401260015413 0ustar liggesusers#' Move Drive files to or from trash #' @template file-plural #' @template verbose #' #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # Create a file and put it in the trash. #' file <- drive_example_remote("chicken.txt") %>% #' drive_cp("chicken-trash.txt") #' drive_trash("chicken-trash.txt") #' #' # Confirm it's in the trash #' drive_find(trashed = TRUE) #' #' # Remove it from the trash and confirm #' drive_untrash("chicken-trash.txt") #' drive_find(trashed = TRUE) #' #' # Clean up #' drive_rm("chicken-trash.txt") drive_trash <- function(file, verbose = deprecated()) { warn_for_verbose(verbose) invisible(drive_toggle_trash(file, trash = TRUE)) } #' @rdname drive_trash #' @export drive_untrash <- function(file, verbose = deprecated()) { warn_for_verbose(verbose) if (is_path(file)) { trash <- drive_find(trashed = TRUE) file <- trash[trash$name %in% file, ] } invisible(drive_toggle_trash(file, trash = FALSE)) } drive_toggle_trash <- function(file, trash) { VERB <- if (trash) "trash" else "untrash" VERBED <- paste0(VERB, "ed") file <- as_dribble(file) if (no_file(file)) { drive_bullets(c("!" = "No such files found to {VERB}.")) return(invisible(dribble())) } out <- map(file$id, toggle_trash_one, trash = trash) out <- vec_rbind(!!!out) drive_bullets(c( "{cli::qty(nrow(out))}File{?s} {VERBED}:", bulletize(gargle_map_cli(out)) )) invisible(out) } toggle_trash_one <- function(id, trash = TRUE) { request <- request_generate( endpoint = "drive.files.update", params = list( fileId = id, trashed = trash, fields = "*" ) ) response <- request_make(request) proc_res <- gargle::response_process(response) as_dribble(list(proc_res)) } #' Empty Drive Trash #' #' @description Caution, this will permanently delete files in your Drive trash. #' #' @template verbose #' @export drive_empty_trash <- function(verbose = deprecated()) { warn_for_verbose(verbose) files <- drive_find(trashed = TRUE) if (no_file(files)) { drive_bullets(c( "i" = "No files found in trash; your trash was already empty." )) return(invisible(TRUE)) } request <- request_generate(endpoint = "drive.files.emptyTrash") response <- request_make(request) success <- gargle::response_process(response) if (success) { drive_bullets(c( "v" = "{nrow(files)} file{?s} deleted from your Google Drive trash." )) } else { drive_bullets(c( "x" = "Empty trash appears to have failed." )) } invisible(success) } googledrive/R/googledrive-package.R0000644000176200001440000000520214071401260016775 0ustar liggesusers#' @description googledrive allows you to interact with files on Google Drive #' from R. #' #' `googledrive::drive_find(n_max = 50)` lists up to 50 of the files you see #' in [My Drive](https://drive.google.com). You can expect to be sent to your #' browser here, to authenticate yourself and authorize the googledrive #' package to deal on your behalf with Google Drive. #' #' Most functions begin with the prefix `drive_`. #' #' The goal is to allow Drive access that feels similar to Unix file system #' utilities, e.g., `find`, `ls`, `mv`, `cp`, `mkdir`, and `rm`. #' #' The metadata for one or more Drive files is held in a [`dribble`], a "Drive #' tibble". This is a data frame with one row per file. A dribble is returned #' (and accepted) by almost every function in googledrive. It is designed to #' give people what they want (file name), track what the API wants (file id), #' and to hold the metadata needed for general file operations. #' #' googledrive is "pipe-friendly" and, in fact, re-exports `%>%`, but does not #' require its use. #' #' Please see the googledrive website for full documentation: #' * #' #' In addition to function-specific help, there are several articles which are #' indexed here: #' * [Article index](https://googledrive.tidyverse.org/articles/index.html) #' #' @keywords internal #' @import rlang #' @import vctrs "_PACKAGE" ## usethis namespace: start #' @importFrom gargle bulletize #' @importFrom gargle gargle_map_cli #' @importFrom glue glue #' @importFrom glue glue_collapse #' @importFrom glue glue_data #' @importFrom lifecycle deprecated #' @importFrom pillar pillar_shaft #' @importFrom purrr map #' @importFrom purrr map_chr #' @importFrom purrr map_if #' @importFrom purrr map_int #' @importFrom purrr map_lgl #' @importFrom purrr map2 #' @importFrom purrr pluck #' @importFrom tibble as_tibble #' @importFrom tibble tbl_sum #' @importFrom tibble tibble ## usethis namespace: end NULL #' googledrive configuration #' #' @description #' Some aspects of googledrive behaviour can be controlled via an option. #' #' @section Auth: #' #' Read about googledrive's main auth function, [drive_auth()]. It is powered #' by the gargle package, which consults several options: #' * Default Google user or, more precisely, `email`: see #' [gargle::gargle_oauth_email()] #' * Whether or where to cache OAuth tokens: see #' [gargle::gargle_oauth_cache()] #' * Whether to prefer "out-of-band" auth: see #' [gargle::gargle_oob_default()] #' * Application Default Credentials: see [gargle::credentials_app_default()] #' #' @name googledrive-configuration NULL googledrive/R/utils-pipe.R0000644000176200001440000000031213432616406015200 0ustar liggesusers#' Pipe operator #' #' See \code{magrittr::\link[magrittr]{\%>\%}} for details. #' #' @name %>% #' @rdname pipe #' @keywords internal #' @export #' @importFrom magrittr %>% #' @usage lhs \%>\% rhs NULL googledrive/R/drive_update.R0000644000176200001440000000763414071404203015564 0ustar liggesusers#' Update an existing Drive file #' #' Update an existing Drive file id with new content ("media" in Drive #' API-speak), new metadata, or both. To create a new file or update existing, #' depending on whether the Drive file already exists, see [drive_put()]. #' #' @seealso Wraps the `files.update` endpoint: #' * #' #' This function supports media upload: #' * #' #' @template file-singular #' @template media #' @template dots-metadata #' @template verbose #' #' @eval return_dribble() #' @export #' #' @examplesIf drive_has_token() #' # Create a new file, so we can update it #' x <- drive_example_remote("chicken.csv") %>% #' drive_cp() #' #' # Update the file with new media #' x <- x %>% #' drive_update(drive_example_local("chicken.txt")) #' #' # Update the file with new metadata. #' # Notice here `name` is not an argument of `drive_update()`, we are passing #' # this to the API via the `...`` #' x <- x %>% #' drive_update(name = "CHICKENS!") #' #' # Update the file with new media AND new metadata #' x <- x %>% #' drive_update( #' drive_example_local("chicken.txt"), #' name = "chicken-poem-again.txt" #' ) #' #' # Clean up #' drive_rm(x) drive_update <- function(file, media = NULL, ..., verbose = deprecated()) { warn_for_verbose(verbose) if ((!is.null(media)) && (!file.exists(media))) { drive_abort(c( "No file exists at the local {.arg media} path:", bulletize(gargle_map_cli(media, "{.path <>}"), bullet = "x") )) } file <- as_dribble(file) file <- confirm_single_file(file) meta <- toCamel(list2(...)) if (is.null(media) && length(meta) == 0) { drive_bullets(c( "!" = "No updates specified." )) return(invisible(file)) } meta[["fields"]] <- meta[["fields"]] %||% "*" if (is.null(media)) { out <- drive_update_metadata(file, meta) } else { if (length(meta) == 0) { out <- drive_update_media(file, media) } else { media <- enc2utf8(media) out <- drive_update_multipart(file, media, meta) } } drive_bullets(c("File updated:", bulletize(gargle_map_cli(out)))) invisible(out) } ## currently this can never be called, because we always send fields drive_update_media <- function(file, media) { request <- request_generate( endpoint = "drive.files.update.media", params = list( fileId = file$id, uploadType = "media", fields = "*" ) ) ## media uploads have unique body situations, so customizing here. request$body <- httr::upload_file(path = media) response <- request_make(request) as_dribble(list(gargle::response_process(response))) } drive_update_metadata <- function(file, meta) { params <- meta %||% list() params$fileId <- file$id request <- request_generate( endpoint = "drive.files.update", params = params ) response <- request_make(request) as_dribble(list(gargle::response_process(response))) } drive_update_multipart <- function(file, media, meta) { # We include the metadata here even though it's overwritten below, # so that request_generate() still validates it. params <- meta %||% list() params$fileId <- file$id params$uploadType <- "multipart" request <- request_generate( endpoint = "drive.files.update.media", params = params ) meta_file <- withr::local_file( tempfile("drive-update-meta", fileext = ".json") ) write_utf8(jsonlite::toJSON(meta), meta_file) ## media uploads have unique body situations, so customizing here. request$body <- list( metadata = httr::upload_file( path = meta_file, type = "application/json; charset=UTF-8" ), media = httr::upload_file(path = media) ) response <- request_make(request, encode = "multipart") as_dribble(list(gargle::response_process(response))) } googledrive/R/shared_drives.R0000644000176200001440000002467614070147664015756 0ustar liggesusers#' Access shared drives #' #' @description #' A shared drive supports files owned by an organization rather than an #' individual user. Shared drives follow different sharing and ownership models #' from a specific user's "My Drive". Shared drives are the successors to the #' earlier concept of Team Drives. #' @description How to capture a shared drive or files/folders that live on a #' shared drive for downstream use: #' * [shared_drive_find()] and [shared_drive_get()] return a [`dribble`] with #' metadata on shared drives themselves. You will need this in order to use a #' shared drive in certain file operations. For example, you can specify a #' shared drive as the parent folder via the `path` argument for upload, move, #' copy, etc. In that context, the id of a shared drive functions like the id of #' its top-level or root folder. #' * [drive_find()] and [drive_get()] return a [`dribble`] with metadata on #' files, including folders. Both can be directed to search for files on shared #' drives using the optional arguments `shared_drive` or `corpus` (documented #' below). #' #' @description Regard the functions mentioned above as the official "port of #' entry" for working with shared drives. Use these functions to capture your #' target(s) in a [`dribble`] to pass along to other googledrive functions. #' The flexibility to refer to files by name or path does not apply as broadly #' to shared drives. While it's always a good idea to get things into a #' [`dribble`] early, for shared drives it's often required. #' #' @section Specific shared drive: #' To search one specific shared drive, pass its name, marked id, or #' [`dribble`] to `shared_drive` somewhere in the call, like so: #' ``` #' drive_find(..., shared_drive = "i_am_a_shared_drive_name") #' drive_find(..., shared_drive = as_id("i_am_a_shared_drive_id")) #' drive_find(..., shared_drive = i_am_a_shared_drive_dribble) #' ``` #' The value provided to `shared_drive` is pre-processed with #' [as_shared_drive()]. #' @section Other collections: #' To search other collections, pass the `corpus` parameter somewhere in the #' call, like so: #' ``` #' drive_find(..., corpus = "user") #' drive_find(..., corpus = "allDrives") #' drive_find(..., corpus = "domain") #' ``` #' Possible values of `corpus` and what they mean: #' * `"user"`: Queries files that the user has accessed, including both shared #' drive and My Drive files. #' * `"drive"`: Queries all items in the shared drive specified via #' `shared_drive`. googledrive automatically fills this in whenever #' `shared_drive` is not `NULL`. #' * `"allDrives"`: Queries files that the user has accessed and all shared #' drives in which they are a member. Note that the response may include #' `incompleteSearch : true`, indicating that some corpora were not searched #' for this request (currently, googledrive does not surface this). Prefer #' `"user"` or `"drive"` to `"allDrives"` for efficiency. #' * `"domain"`: Queries files that are shared to the domain, including both #' shared drive and My Drive files. #' @section Google blogs and docs: #' Here is some of the best official Google reading about shared drives: #' * [Team Drives is being renamed to shared drives](https://workspaceupdates.googleblog.com/2019/04/shared-drives.html) from Google Workspace blog #' * [Upcoming changes to the Google Drive API and Google Picker API](https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api) from the Google Cloud blog #' * #' * #' * [Get started with shared drives](https://support.google.com/a/users/answer/9310351) from Google Workspace Learning Center #' * [Best practices for shared drives](https://support.google.com/a/users/answer/9310156) from Google Workspace Learning Center #' @section API docs: #' googledrive implements shared drive support as outlined here: #' * #' #' Users shouldn't need to know any of this, but here are details for the #' curious. The extra information needed to search shared drives consists of the #' following query parameters: #' * `corpora`: Where to search? Formed from googledrive's `corpus` argument. #' * `driveId`: The id of a specific shared drive. Only allowed -- and also #' absolutely required -- when `corpora = "drive"`. When user specifies a #' `shared_drive`, googledrive sends its id and also infers that `corpora` #' should be set to `"drive"`. #' * `includeItemsFromAllDrives`: Do you want to see shared drive items? #' Obviously, this should be `TRUE` and googledrive sends this whenever shared #' drive parameters are detected. #' * `supportsAllDrives`: Does the sending application (googledrive, in this #' case) know about shared drive? Obviously, this should be `TRUE` and #' googledrive sends it for all applicable endpoints, all the time. #' #' @name shared_drives NULL # Shared drive and "file groupings" support # # Internal documentation! # # It is intentional that googledrive's two parameters `shared_drive` and # `corpus` have NO OVERLAP with actual Drive query parameters: this way the # googledrive high-level wrapping is option A but user could also pass raw # params through `...` as option B. # # @param driveId Character, a shared drive id. # @template corpus # @param includeItemsFromAllDrives Logical, googledrive always sets this to # `TRUE`. # # @examples # \dontrun{ # shared_drive_params(driveId = "123456789") # shared_drive_params(corpora = "user") # shared_drive_params(corpora = "allDrives") # shared_drive_params(corpora = "domain") # # # this will error because `corpora = "drive"` also requires the id # shared_drive_params(corpora = "drive") # # # this will error because `corpora = "domain"` forbids inclusion of id # shared_drive_params(corpora = "domain", driveId = "123456789") # } shared_drive_params <- function(driveId = NULL, corpora = NULL, includeItemsFromAllDrives = NULL) { rationalize_corpus( new_corpus( driveId, corpora, includeItemsFromAllDrives ) ) } new_corpus <- function(driveId = NULL, corpora = NULL, includeItemsFromAllDrives = NULL) { if (!is.null(driveId)) { # can't use is_string() because object of class drive_id IS acceptable stopifnot(is.character(driveId), length(driveId) == 1) } if (!is.null(corpora)) { stopifnot(is_string(corpora)) } if (!is.null(includeItemsFromAllDrives)) { stopifnot( is.logical(includeItemsFromAllDrives), length(includeItemsFromAllDrives) == 1 ) } structure( list( corpora = corpora, driveId = driveId, includeItemsFromAllDrives = includeItemsFromAllDrives ), class = "corpus" ) } # this isn't a classic validator, because it fills in some gaps # there is, however, no magic # there is user input that is unambiguous but still won't satisfy the API # 1. if `driveId` is provided and `corpora` is not, we fill in # `corpora = "drive"` # 2. we always send `includeItemsFromAllDrives = TRUE` rationalize_corpus <- function(corpus) { stopifnot(inherits(corpus, "corpus")) if (!is.null(corpus[["driveId"]])) { corpus[["corpora"]] <- corpus[["corpora"]] %||% "drive" } validate_corpora(corpus[["corpora"]]) if (corpus[["corpora"]] == "drive" && is.null(corpus[["driveId"]])) { drive_abort(' When {.code corpus = "drive"}, you must also specify \\ the {.arg shared_drive}.') } if (corpus[["corpora"]] != "drive" && !is.null(corpus[["driveId"]])) { drive_abort(' When {.code corpus != "drive"}, you must not specify \\ a {.arg shared_drive}.') } corpus[["includeItemsFromAllDrives"]] <- TRUE corpus } valid_corpora <- c("user", "drive", "allDrives", "domain") validate_corpora <- function(corpora) { if (!corpora %in% valid_corpora) { # yes, I intentionally use `corpus` in this message, even # though the actual API parameter is `corpora` # googledrive's user-facing functions have `corpus` in their signature and # the rationale is explained elsewhere in this file drive_abort(c( "Invalid value for {.arg corpus}:", bulletize(gargle_map_cli(corpora), bullet = "x"), "These are the only acceptable values:", bulletize(gargle_map_cli(valid_corpora)) )) } invisible(corpora) } #' Coerce to shared drive #' #' @description Converts various representations of a shared drive into a #' [`dribble`], the object used by googledrive to hold Drive file metadata. #' Shared drives can be specified via #' * Name #' * Shared drive id, marked with [as_id()] to distinguish from name #' * Data frame or [`dribble`] consisting solely of shared drives #' * List representing [Drives resource](https://developers.google.com/drive/api/v3/reference/drives#resource-representations) #' objects (mostly for internal use) #' #' @template shared-drive-description #' #' @description This is a generic function. #' #' @param x A vector of shared drive names, a vector of shared drive ids marked #' with [as_id()], a list of Drives resource objects, or a suitable data #' frame. #' @param ... Other arguments passed down to methods. (Not used.) #' @export #' @examples #' \dontrun{ #' # specify the name #' as_shared_drive("abc") #' #' # specify the id (substitute one of your own!) #' as_shared_drive(as_id("0AOPK1X2jaNckUk9PVA")) #' } as_shared_drive <- function(x, ...) UseMethod("as_shared_drive") #' @export as_shared_drive.default <- function(x, ...) { drive_abort(" Don't know how to coerce an object of class {.cls {class(x)}} into \\ a shared drive {.cls dribble}.") } #' @export as_shared_drive.NULL <- function(x, ...) dribble() #' @export as_shared_drive.character <- function(x, ...) shared_drive_get(name = x) #' @export as_shared_drive.drive_id <- function(x, ...) shared_drive_get(id = x) #' @export as_shared_drive.dribble <- function(x, ...) validate_shared_drive_dribble(x) #' @export as_shared_drive.data.frame <- function(x, ...) { validate_shared_drive_dribble(as_dribble(x)) } #' @export as_shared_drive.list <- function(x, ...) { validate_shared_drive_dribble(as_dribble(x)) } validate_shared_drive_dribble <- function(x) { stopifnot(inherits(x, "dribble")) if (!all(is_shared_drive(x))) { drive_abort(" All rows of shared drive {.cls dribble} must contain a shared drive.") } x } googledrive/R/drive_publish.R0000644000176200001440000000722514071403776015762 0ustar liggesusers#' Publish native Google files #' #' Publish (or un-publish) native Google files to the web. Native Google files #' include Google Docs, Google Sheets, and Google Slides. The returned #' [`dribble`] will have extra columns, `published` and `revisions_resource`. #' Read more in [drive_reveal()]. #' #' @seealso Wraps the `revisions.update` endpoint: #' * #' #' @template file-plural #' @param ... Name-value pairs to add to the API request body (see API docs #' linked below for details). For `drive_publish()`, we include #' `publishAuto = TRUE` and `publishedOutsideDomain = TRUE`, if user does not #' specify other values. #' @template verbose #' #' @eval return_dribble(extras = "There will be extra columns, `published` and #' `revisions_resource`.") #' @export #' @examplesIf drive_has_token() #' # Create a file to publish #' file <- drive_example_remote("chicken_sheet") %>% #' drive_cp() #' #' # Publish file #' file <- drive_publish(file) #' file$published #' #' # Unpublish file #' file <- drive_unpublish(file) #' file$published #' #' # Clean up #' drive_rm(file) drive_publish <- function(file, ..., verbose = deprecated()) { warn_for_verbose(verbose) drive_change_publish(file = file, publish = TRUE, ...) } #' @rdname drive_publish #' @export drive_unpublish <- function(file, ..., verbose = deprecated()) { warn_for_verbose(verbose) drive_change_publish(file = file, publish = FALSE, ...) } drive_change_publish <- function(file, publish = TRUE, ...) { file <- as_dribble(file) file <- confirm_some_files(file) type_ok <- is_native(file) if (!all(type_ok)) { file <- file[!type_ok, ] file <- promote(file, "mimeType") drive_abort(c( "Only native Google files can be published.", "{.arg file} includes {?a/} file{?s} \\ with non-native MIME type{cli::qty(nrow(file))}", bulletize(gargle_map_cli(file, "{.drivepath <>}: {.field <>}")), "i" = "You can use {.fun drive_share} to change a file's sharing \\ permissions." )) } params <- toCamel(list2(...)) params[["published"]] <- publish params[["publishAuto"]] <- params[["publishAuto"]] %||% TRUE params[["publishedOutsideDomain"]] <- params[["publishedOutsideDomain"]] %||% TRUE params[["revisionId"]] <- "head" params[["fields"]] <- "*" revision_resource <- map( file$id, change_publish_one, params = params ) n <- nrow(file) drive_bullets(c( cli::pluralize( "{cli::qty(n)}File{?s} now {if (publish) '' else 'NOT '}published:"), bulletize(gargle_map_cli(file)) )) invisible(drive_reveal(file, "published")) } change_publish_one <- function(id, params) { params[["fileId"]] <- id request <- request_generate( endpoint = "drive.revisions.update", params = params ) response <- request_make(request) gargle::response_process(response) } drive_reveal_published <- function(file) { confirm_dribble(file) revision_resource <- map(file$id, get_publish_one) file <- put_column( file, nm = "published", val = map_lgl(revision_resource, "published", .default = FALSE), .after = 1 ) put_column( file, nm = "revision_resource", val = revision_resource ) } get_publish_one <- function(id) { request <- request_generate( endpoint = "drive.revisions.get", params = list( fileId = id, revisionId = "head", fields = "*" ) ) response <- request_make(request) ## folders generate a 403 if (httr::status_code(response) == 403) { return(NULL) } gargle::response_process(response) } googledrive/R/drive_rm.R0000644000176200001440000000504514071403523014716 0ustar liggesusers#' Delete files from Drive #' #' Caution: this will permanently delete your files! For a safer, reversible #' option, see [drive_trash()]. #' #' @seealso Wraps the `files.delete` endpoint: #' * #' #' @param ... One or more Drive files, specified in any valid way, i.e. as a #' [`dribble`], by name or path, or by file id or URL marked with [as_id()]. Or #' any combination thereof. Elements are processed with [as_dribble()] and #' row-bound prior to deletion. #' @template verbose #' #' @return Logical vector, indicating whether the delete succeeded. #' @export #' #' @examplesIf drive_has_token() #' # Target one of the official example files to copy (then remove) #' (src_file <- drive_example_remote("chicken.txt")) #' #' # Create a copy, then remove it by name #' src_file %>% #' drive_cp(name = "chicken-rm.txt") #' drive_rm("chicken-rm.txt") #' #' # Create several more copies #' x1 <- src_file %>% #' drive_cp(name = "chicken-abc.txt") #' drive_cp(src_file, name = "chicken-def.txt") #' x2 <- src_file %>% #' drive_cp(name = "chicken-ghi.txt") #' #' # Remove the copies all at once, specified in different ways #' drive_rm(x1, "chicken-def.txt", as_id(x2)) drive_rm <- function(..., verbose = deprecated()) { warn_for_verbose(verbose) dots <- list(...) if (length(dots) == 0) { dots <- list(NULL) } # explicitly select on var name to exclude 'path', if present file <- map(dots, ~as_dribble(.x)[c("name", "id", "drive_resource")]) file <- vec_rbind(!!!file) # filter to the unique file ids (multiple parents mean drive_get() and # therefore as_dribble() can return >1 row representing a single file) file <- file[!duplicated(file$id), ] if (no_file(file)) { drive_bullets(c( "!" = "No such file to delete." )) return(invisible(file)) } out <- map_lgl(file$id, delete_one) if (any(out)) { successes <- file[out, ] drive_bullets(c( "File{?s} deleted:{cli::qty(nrow(successes))}", bulletize(gargle_map_cli(successes)) )) } # I'm not sure this ever comes up IRL? # Is it even possible that removal fails but there's no error? if (any(!out)) { failures <- file[!out, ] drive_bullets(c( "File{?s} NOT deleted:{cli::qty(nrow(failures))}", bulletize(gargle_map_cli(failures)) )) } invisible(out) } delete_one <- function(id) { request <- request_generate( endpoint = "drive.files.delete", params = list(fileId = id) ) response <- request_make(request) gargle::response_process(response) } googledrive/R/drive_mkdir.R0000644000176200001440000000377714071403417015422 0ustar liggesusers#' Create a Drive folder #' #' Creates a new Drive folder. To update the metadata of an existing Drive file, #' including a folder, use [drive_update()]. #' #' @seealso Wraps the `files.create` endpoint: #' * #' #' @param name Name for the new folder or, optionally, a path that specifies #' an existing parent folder, as well as the new name. #' @eval param_path_known_parent("folder") #' @inheritParams drive_create #' #' @eval return_dribble() #' @export #' @examplesIf drive_has_token() #' # Create folder named 'ghi', then another below named it 'jkl' and star it #' ghi <- drive_mkdir("ghi") #' jkl <- drive_mkdir("ghi/jkl", starred = TRUE) #' #' # is 'jkl' really starred? YES #' purrr::pluck(jkl, "drive_resource", 1, "starred") #' #' # Another way to create folder 'mno' in folder 'ghi' #' drive_mkdir("mno", path = "ghi") #' #' # Yet another way to create a folder named 'pqr' in folder 'ghi', #' # this time with parent folder stored in a dribble, #' # and setting the new folder's description #' pqr <- drive_mkdir("pqr", path = ghi, description = "I am a folder") #' #' # Did we really set the description? YES #' purrr::pluck(pqr, "drive_resource", 1, "description") #' #' # `overwrite = FALSE` errors if something already exists at target filepath #' # THIS WILL ERROR! #' drive_create("name-squatter", path = ghi) #' drive_mkdir("name-squatter", path = ghi, overwrite = FALSE) #' #' # `overwrite = TRUE` moves the existing item to trash, then proceeds #' drive_mkdir("name-squatter", path = ghi, overwrite = TRUE) #' #' # list everything inside 'ghi' #' drive_ls('ghi') #' #' # clean up #' drive_rm(ghi) drive_mkdir <- function(name, path = NULL, ..., overwrite = NA, verbose = deprecated()) { warn_for_verbose(verbose) drive_create( name = name, path = path, type = "application/vnd.google-apps.folder", ..., overwrite = overwrite ) } googledrive/R/shared_drive_update.R0000644000176200001440000000354114070147664017121 0ustar liggesusers#' Update a shared drive #' #' Update the metadata of an existing shared drive, e.g. its background image or #' theme. #' @template shared-drive-description #' #' @seealso Wraps the `drives.update` endpoint: #' * #' #' @template shared_drive-singular #' @param ... Properties to set in `name = value` form. See the "Request #' body" section of the Drive API docs for this endpoint. #' #' @eval return_dribble("shared drive") #' @export #' @examples #' \dontrun{ #' # create a shared drive #' sd <- shared_drive_create("I love themes!") #' #' # see the themes available to you #' themes <- drive_about()$driveThemes #' purrr::map_chr(themes, "id") #' #' # cycle through various themes for this shared drive #' sd <- shared_drive_update(sd, themeId = "bok_choy") #' sd <- shared_drive_update(sd, themeId = "cocktails") #' #' # clean up #' shared_drive_rm(sd) #' } shared_drive_update <- function(shared_drive, ...) { shared_drive <- as_shared_drive(shared_drive) if (no_file(shared_drive)) { drive_bullets(c( "!" = "No such shared drive found to update." )) return(invisible(dribble())) } if (!single_file(shared_drive)) { drive_abort(c( "Can't update multiple shared drives at once:", bulletize(gargle_map_cli(shared_drive)) )) } meta <- toCamel(list2(...)) if (length(meta) == 0) { drive_bullets(c( "!" = "No updates specified." )) return(invisible(shared_drive)) } meta$fields <- meta$fields %||% "*" request <- request_generate( endpoint = "drive.drives.update", params = c( driveId = as_id(shared_drive), meta ) ) response <- request_make(request) out <- as_dribble(list(gargle::response_process(response))) drive_bullets(c("Shared drive updated:", bulletize(gargle_map_cli(out)))) invisible(out) } googledrive/R/drive_ls.R0000644000176200001440000000511414070147664014725 0ustar liggesusers#' List contents of a folder or shared drive #' #' List the contents of a folder or shared drive, recursively or not. This is a #' thin wrapper around [drive_find()], that simply adds one constraint: the #' search is limited to direct or indirect children of `path`. #' #' @param path Specifies a single folder on Google Drive whose contents you want #' to list. Can be an actual path (character), a file id or URL marked with #' [as_id()], or a [`dribble`]. If it is a shared drive or is a folder on a #' shared drive, it must be passed as a [`dribble`]. If `path` is a shortcut #' to a folder, it is automatically resolved to its target folder. #' @param ... Any parameters that are valid for [drive_find()]. #' @param recursive Logical, indicating if you want only direct children of #' `path` (`recursive = FALSE`, the default) or all children, including #' indirect (`recursive = TRUE`). #' #' @eval return_dribble() #' @export #' @examples #' \dontrun{ #' # get contents of the folder 'abc' (non-recursive) #' drive_ls("abc") #' #' # get contents of folder 'abc' whose names contain the letters 'def' #' drive_ls(path = "abc", pattern = "def") #' #' # get all Google spreadsheets in folder 'abc' #' # whose names contain the letters 'def' #' drive_ls(path = "abc", pattern = "def", type = "spreadsheet") #' #' # get all the files below 'abc', recursively, that are starred #' drive_ls(path = "abc", q = "starred = true", recursive = TRUE) #' } drive_ls <- function(path = NULL, ..., recursive = FALSE) { stopifnot(is.logical(recursive), length(recursive) == 1) if (is.null(path)) { return(drive_find(...)) } path <- as_parent(path) params <- list2(...) if (is_shared_drive(path)) { params[["shared_drive"]] <- as_id(path) } else { shared_drive <- pluck(path, "drive_resource", 1, "driveId") if (!is.null(shared_drive)) { params[["shared_drive"]] <- params[["shared_drive"]] %||% as_id(shared_drive) } } parent <- path[["id"]] if (isTRUE(recursive)) { parent <- c(parent, folders_below(parent)) } parent <- glue("{sq(parent)} in parents") parent <- glue("({or(parent)})") params[["q"]] <- append(params[["q"]], parent) exec(drive_find, !!!params) } folders_below <- function(id) { folder_kids <- folder_kids_of(id) if (length(folder_kids) == 0) { character() } else { c( folder_kids, unlist(lapply(folder_kids, folders_below), recursive = FALSE) ) } } folder_kids_of <- function(id) { drive_find( type = "folder", q = glue("{sq(id)} in parents"), fields = prep_fields(c("kind", "name", "id")) )[["id"]] } googledrive/R/drive_cp.R0000644000176200001440000000723214071403252014701 0ustar liggesusers#' Copy a Drive file #' #' Copies an existing Drive file into a new file id. #' #' @seealso Wraps the `files.copy` endpoint: #' * #' #' @template file-singular #' @eval param_path( #' thing = "new file", #' default_notes = "By default, the new file has the same parent folder as the #' source file." #' ) #' @eval param_name( #' thing = "file", #' default_notes = "Defaults to \"Copy of `FILE-NAME`\"." #' ) #' @template dots-metadata #' @template overwrite #' @template verbose #' @eval return_dribble() #' @export #' #' @examplesIf drive_has_token() #' # Target one of the official example files #' (src_file <- drive_example_remote("chicken.txt")) #' #' # Make a "Copy of" copy in your My Drive #' cp1 <- drive_cp(src_file) #' #' # Make an explicitly named copy, in a different folder, and star it. #' # The starring is an example of providing metadata via `...`. #' # `starred` is not an actual argument to `drive_cp()`, #' # it just gets passed through to the API. #' folder <- drive_mkdir("drive-cp-folder") #' cp2 <- drive_cp( #' src_file, #' path = folder, #' name = "chicken-cp.txt", #' starred = TRUE #' ) #' drive_reveal(cp2, "starred") #' #' # `overwrite = FALSE` errors if file already exists at target filepath #' # THIS WILL ERROR! #' # drive_cp(src_file, name = "Copy of chicken.txt", overwrite = FALSE) #' #' # `overwrite = TRUE` moves an existing file to trash, then proceeds #' cp3 <- drive_cp(src_file, name = "Copy of chicken.txt", overwrite = TRUE) #' #' # Delete all of our copies and the new folder! #' drive_rm(cp1, cp2, cp3, folder) #' #' # Target an official example file that's a csv file #' (csv_file <- drive_example_remote("chicken.csv")) #' #' # copy AND AT THE SAME TIME convert it to a Google Sheet #' chicken_sheet <- drive_cp( #' csv_file, #' name = "chicken-sheet-copy", #' mime_type = drive_mime_type("spreadsheet") #' ) #' # is it really a Google Sheet? #' drive_reveal(chicken_sheet, "mime_type")$mime_type #' #' # go see the new Sheet in the browser #' # drive_browse(chicken_sheet) #' #' # clean up #' drive_rm(chicken_sheet) drive_cp <- function(file, path = NULL, name = NULL, ..., overwrite = NA, verbose = deprecated()) { warn_for_verbose(verbose) file <- as_dribble(file) file <- confirm_single_file(file) if (is_parental(file)) { drive_abort("The Drive API does not copy folders or shared drives.") } tmp <- rationalize_path_name(path, name) path <- tmp$path name <- tmp$name params <- toCamel(list2(...)) # load (path, name) into params if (!is.null(path)) { path <- as_parent(path) params[["parents"]] <- list(path$id) } params[["name"]] <- name %||% glue("Copy of {file$name}") check_for_overwrite(params[["parents"]], params[["name"]], overwrite) params[["fields"]] <- params[["fields"]] %||% "*" params[["fileId"]] <- file$id request <- request_generate( endpoint = "drive.files.copy", params = params ) res <- request_make(request) proc_res <- gargle::response_process(res) out <- as_dribble(list(proc_res)) drive_bullets(c( "Original file:", bulletize(gargle_map_cli(file)), "Copied to file:", # drive_reveal_path() puts immediate parent, if specified, in the `path` # then we reveal `path`, instead of `name` bulletize(gargle_map_cli( drive_reveal_path(out, ancestors = path), template = c( id_string = ">>", # \u00a0 is a nonbreaking space out = "{.drivepath <>} {cli::col_grey('<>')}" ) )) )) invisible(out) } googledrive/R/utils-io.R0000644000176200001440000000340414071171077014657 0ustar liggesusersreadLines <- function(...) { drive_abort("In this house, we use {.fun read_utf8} for UTF-8 reasons.") } writeLines <- function(...) { drive_abort("In this house, we use {.fun write_utf8} for UTF-8 reasons.") } # https://github.com/gaborcsardi/rencfaq#with-base-r read_utf8 <- function (path) { opts <- options(encoding = "native.enc") withr::defer(options(opts)) x <- base::readLines(path, encoding = "UTF-8", warn = FALSE) x } # https://github.com/gaborcsardi/rencfaq#with-base-r write_utf8 <- function(text, path = NULL) { # sometimes we use writeLines() basically to print something for a snapshot if (is.null(path)) { return(base::writeLines(text)) } # step 1: ensure our text is utf8 encoded utf8 <- enc2utf8(text) upath <- enc2utf8(path) # step 2: create a connection with 'native' encoding # this signals to R that translation before writing # to the connection should be skipped con <- file(upath, open = "w+", encoding = "native.enc") withr::defer(close(con)) # step 3: write to the connection with 'useBytes = TRUE', # telling R to skip translation to the native encoding base::writeLines(utf8, con = con, useBytes = TRUE) } # used for building functions that construct Drive file names in tests ---- nm_fun <- function(context, user_run = TRUE) { user_run <- if (isTRUE(user_run)) nm_user_run() else NULL y <- purrr::compact(list(context, user_run)) function(x = character()) as.character(glue_collapse(c(x, y), sep = "-")) } nm_user_run <- function() { if(as.logical(Sys.getenv("GITHUB_ACTIONS", unset = "false"))) { glue("gha-{Sys.getenv('GITHUB_WORKFLOW')}-{Sys.getenv('GITHUB_RUN_ID')}") } else { random_id <- strsplit(uuid::UUIDgenerate(TRUE), "-")[[1]][[1]] glue("{Sys.info()['user']}-{random_id}") } } googledrive/R/drive_mime_type.R0000644000176200001440000000542514070147664016304 0ustar liggesusers#' Lookup MIME type #' #' @description This is a helper to determine which MIME type should be used #' for a file. Three types of input are acceptable: #' * Native Google Drive file types. Important examples: #' - "document" for Google Docs #' - "folder" for folders #' - "presentation" for Google Slides #' - "spreadsheet" for Google Sheets #' * File extensions, such as "pdf", "csv", etc. #' * MIME types accepted by Google Drive (these are simply passed through). #' #' @param type Character. Google Drive file type, file extension, or MIME type. #' Pass the sentinel [`expose()`] if you want to get the full table used for #' validation and lookup, i.e. all MIME types known to be relevant to the #' Drive API. #' #' @return Character. MIME type. #' #' @examples #' ## get the mime type for Google Spreadsheets #' drive_mime_type("spreadsheet") #' #' ## get the mime type for jpegs #' drive_mime_type("jpeg") #' #' ## it's vectorized #' drive_mime_type(c("presentation", "pdf", "image/gif")) #' #' ## see the internal tibble of MIME types known to the Drive API #' drive_mime_type(expose()) #' @export drive_mime_type <- function(type = NULL) { if (is.null(type)) { return(invisible()) } if (is_expose(type)) { return(.drive$mime_tbl) } if (!(is.character(type))) { drive_abort("{.arg type} must be character.") } human_m <- match( type, .drive$mime_tbl$human_type, nomatch = NA_character_, incomparables = NA ) ext_m <- match( type, .drive$mime_tbl$mime_type, nomatch = NA_character_, incomparables = NA ) m <- ifelse(is.na(human_m), ext_m, human_m) mime_type <- .drive$mime_tbl$mime_type[m] if (all(is.na(mime_type))) { drive_abort(c( "Unrecognized {.arg type}:", bulletize(gargle_map_cli(type), bullet = "x") )) } mime_type } #' Lookup extension from MIME type #' #' @description This is a helper to determinine which extension should be used #' for a file. Two types of input are acceptable: #' * MIME types accepted by Google Drive. #' * File extensions, such as "pdf", "csv", etc. (these are simply passed through). #' #' @param type Character. MIME type or file extension. #' #' @return Character. File extension. #' #' @examples #' #' ## get the extension for mime type image/jpeg #' drive_extension("image/jpeg") #' #' ## it's vectorized #' drive_extension(c("text/plain", "pdf", "image/gif")) #' @export drive_extension <- function(type = NULL) { if (is.null(type)) { return(invisible()) } stopifnot(is.character(type)) type <- drive_mime_type(type) m <- map_int(type, one_ext) .drive$mime_tbl$ext[m] } one_ext <- function(type) { m <- which(.drive$mime_tbl$mime_type %in% type & is_true(.drive$mime_tbl$default)) if (length(m) == 0L) { m <- NA_integer_ } m } googledrive/R/drive_read.R0000644000176200001440000000760714071171077015227 0ustar liggesusers#' Read the content of a Drive file #' #' @description These functions return the content of a Drive file as either a #' string or raw bytes. You will likely need to do additional work to parse #' the content into a useful R object. #' #' [drive_download()] is the more generally useful function, but for certain #' file types, such as comma-separated values (MIME type `text/csv`), it can #' be handy to read data directly from Google Drive and avoid writing to disk. #' #' Just as for [drive_download()], native Google file types, such as Google #' Sheets or Docs, must be exported as a conventional MIME type. See the help #' for [drive_download()] for more. #' @template file-singular #' @inheritParams drive_download #' @param encoding Passed along to [httr::content()]. Describes the encoding of #' the *input* `file`. #' @return #' * `read_drive_string()`: a UTF-8 encoded string #' * `read_drive_raw()`: a [raw()] vector #' @export #' @examplesIf drive_has_token() #' # comma-separated values --> data.frame or tibble #' (chicken_csv <- drive_example_remote("chicken.csv")) #' chicken_csv %>% #' drive_read_string() %>% #' read.csv(text = .) #' #' # Google Doc --> character vector #' (chicken_doc <- drive_example_remote("chicken_doc")) #' chicken_doc %>% #' # NOTE: we must specify an export MIME type #' drive_read_string(type = "text/plain") %>% #' strsplit(split = "(\r\n|\r|\n)") %>% #' .[[1]] drive_read_string <- function(file, type = NULL, encoding = NULL) { drive_read_impl(file = file, type = type, as = "string", encoding = encoding) } #' @export #' @rdname drive_read_string drive_read_raw <- function(file, type = NULL) { drive_read_impl(file = file, type = type, as = "raw") } drive_read_impl <- function(file, type = NULL, as = c("string", "raw"), encoding = NULL) { as <- match.arg(as) file <- as_dribble(file) file <- confirm_single_file(file) mime_type <- pluck(file, "drive_resource", 1, "mimeType") if (!grepl("google", mime_type) && !is.null(type)) { drive_bullets(c( "!" = "Ignoring {.arg type}. Only consulted for native Google file types.", " " = "MIME type of {.arg file}: {.field {mime_type}}." )) } if (grepl("google", mime_type)) { export_type <- type %||% get_export_mime_type(mime_type) export_type <- drive_mime_type(export_type) verify_export_mime_type(mime_type, export_type) request <- request_generate( endpoint = "drive.files.export", params = list( fileId = file$id, mimeType = export_type ) ) } else { request <- request_generate( endpoint = "drive.files.get", params = list( fileId = file$id, alt = "media" ) ) } response <- request_make( request, httr::write_memory() ) # only call gargle::response_process() for a failed request # it's hard-wired to parse a JSON body code <- httr::status_code(response) if (code < 200 || code >= 300) { return(gargle::response_process(response)) } if (as == "string") { resp_body_string(response, encoding = encoding) } else if (as == "raw") { resp_body_raw(response) } else { drive_abort(c( "Internal error: unexpected value for the {.arg as} argument.", x = "{.field {as}}" )) } } # stubs for eventual calls to httr2 functions by these same names resp_body_string <- function(resp, encoding = NULL) { out <- httr::content(resp, as = "text", encoding = encoding) # Learned this fact the hard way (quoting from Wikipedia): # Google Docs also adds a BOM when converting a Doc to a plain text file # for download. # https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 # Therefore we remove such a BOM, if present # UTF-8 representation of BOM: ef bb bf sub("^\uFEFF", "", out) } resp_body_raw <- function(resp) { httr::content(resp, as = "raw") } googledrive/R/drive_share.R0000644000176200001440000001250614071171100015373 0ustar liggesusers#' Share Drive files #' #' @description #' Grant individuals or other groups access to files, including permission to #' read, comment, or edit. The returned [`dribble`] will have extra columns, #' `shared` and `permissions_resource`. Read more in [drive_reveal()]. #' #' `drive_share_anyone()` is a convenience wrapper for a common special case: #' "make this `file` readable by 'anyone with a link'". #' #' @seealso #' Wraps the `permissions.create` endpoint: #' * #' #' Drive roles and permissions are described here: #' * #' #' @template file-plural #' @param role Character. The role to grant. Must be one of: #' * owner (not allowed in shared drives) #' * organizer (applies to shared drives) #' * fileOrganizer (applies to shared drives) #' * writer #' * commenter #' * reader #' @param type Character. Describes the grantee. Must be one of: #' * user #' * group #' * domain #' * anyone #' @param ... Name-value pairs to add to the API request. This is where you #' provide additional information, such as the `emailAddress` (when grantee #' `type` is `"group"` or `"user"`) or the `domain` (when grantee type is #' `"domain"`). Read the API docs linked below for more details. #' @template verbose #' #' @eval return_dribble(extras = "There will be extra columns, `shared` and #' `permissions_resource`.") #' @export #' @examplesIf drive_has_token() #' # Create a file to share #' file <- drive_example_remote("chicken_doc") %>% #' drive_cp(name = "chicken-share.txt") #' #' # Let a specific person comment #' file <- file %>% #' drive_share( #' role = "commenter", #' type = "user", #' emailAddress = "susan@example.com" #' ) #' #' # Let a different specific person edit and customize the email notification #' file <- file %>% #' drive_share( #' role = "writer", #' type = "user", #' emailAddress = "carol@example.com", #' emailMessage = "Would appreciate your feedback on this!" #' ) #' #' # Let anyone read the file #' file <- file %>% #' drive_share(role = "reader", type = "anyone") #' # Single-purpose wrapper function for this #' drive_share_anyone(file) #' #' # Clean up #' drive_rm(file) drive_share <- function(file, role = c( "reader", "commenter", "writer", "fileOrganizer", "owner", "organizer" ), type = c("user", "group", "domain", "anyone"), ..., verbose = deprecated()) { warn_for_verbose(verbose) role <- match.arg(role) type <- match.arg(type) file <- as_dribble(file) file <- confirm_some_files(file) params <- toCamel(list2(...)) params[["role"]] <- role params[["type"]] <- type params[["fields"]] <- "*" ## this resource pertains only to the affected permission permission_out <- map( file$id, drive_share_one, params = params ) ok <- map_chr(permission_out, "type") == type if (any(ok)) { successes <- file[ok, ] drive_bullets(c( "Permissions updated:", "*" = "role = {role}", "*" = "type = {type}", "For file{?s}:{cli::qty(nrow(successes))}", bulletize(gargle_map_cli(successes)) )) } # I'm not sure this ever comes up IRL? # Is it even possible that permission update fails but there's no error? if (any(!ok)) { failures <- file[!ok, ] drive_bullets(c( "Permissions were NOT updated for file{?s}:{cli::qty(nrow(failures))}", bulletize(gargle_map_cli(failures)) )) } ## refresh drive_resource, get full permissions_resource out <- drive_get(as_id(file)) invisible(drive_reveal(out, "permissions")) } #' @rdname drive_share #' @export drive_share_anyone <- function(file, verbose = deprecated()) { warn_for_verbose(verbose) drive_share(file = file, role = "reader", type = "anyone") } drive_share_one <- function(id, params) { params[["fileId"]] <- id request <- request_generate( endpoint = "drive.permissions.create", params = params ) response <- request_make(request) gargle::response_process(response) } drive_reveal_permissions <- function(file) { confirm_dribble(file) permissions_resource <- map(file$id, list_permissions_one) # TODO: revisit this in light of Team Drives --> shared drives ## can't use promote() here (yet) because Team Drive files don't have ## `shared` and their NULLs would force `shared` to be a list-column file <- put_column( file, nm = "shared", val = map_lgl(file$drive_resource, "shared", .default = NA), .after = "name" ) put_column( file, nm = "permissions_resource", val = permissions_resource ) } list_permissions_one <- function(id) { request <- request_generate( endpoint = "drive.permissions.list", params = list( fileId = id, fields = "*" ) ) # TODO: is this still a problem for shared drives? probably # TO DO: we aren't dealing with the fact that this endpoint is paginated # for Team Drives response <- request_make(request) # if capabilities/canReadRevisions (present in File resource) is not true, # user will get a 403 "insufficientFilePermissions" here if (httr::status_code(response) == 403) { return(NULL) } gargle::response_process(response) } googledrive/R/drive_browse.R0000644000176200001440000000275514070147664015620 0ustar liggesusers#' Retrieve Drive file links #' #' Returns the `"webViewLink"` for one or more files, which is the "link for #' opening the file in a relevant Google editor or viewer in a browser". #' #' @template file-plural #' #' @return Character vector of file hyperlinks. #' @export #' @examplesIf drive_has_token() #' # get a few files into a dribble #' three_files <- drive_find(n_max = 3) #' #' # get their browser links #' drive_link(three_files) drive_link <- function(file) { file <- as_dribble(file) links <- map_chr( file$drive_resource, "webViewLink", .default = NA_character_ ) # no documented, programmatic way to get browser links for shared drives # but this seems to work ... I won't document it either, though sd <- is_shared_drive(file) links[sd] <- glue( "https://drive.google.com/drive/folders/{id}", id = as_id(file)[sd] ) links } #' Visit Drive file in browser #' #' Visits a file on Google Drive in your default browser. #' #' @template file-singular #' #' @return Character vector of file hyperlinks, from [drive_link()], invisibly. #' @export #' @examplesIf drive_has_token() && rlang::is_interactive() #' drive_find(n_max = 1) %>% drive_browse() drive_browse <- function(file = .Last.value) { file <- as_dribble(file) links <- drive_link(file) if (!interactive() || no_file(file)) return(invisible(links)) if (!single_file(file)) { drive_bullets(c("v" = "Browsing the first file of {nrow(file)}.")) } utils::browseURL(links[1]) invisible(links) } googledrive/R/drive_user.R0000644000176200001440000000234114071403213015246 0ustar liggesusers#' Get info on current user #' #' Reveals information about the user associated with the current token. This is #' a thin wrapper around [drive_about()] that just extracts the most useful #' information (the information on current user) and prints it nicely. #' #' @seealso Wraps the `about.get` endpoint: #' * #' #' @template verbose #' #' @return A list of class `drive_user`. #' @export #' @examplesIf drive_has_token() #' drive_user() #' #' # more info is returned than is printed #' user <- drive_user() #' str(user) drive_user <- function(verbose = deprecated()) { warn_for_verbose(verbose) if (!drive_has_token()) { drive_bullets(c( "i" = "Not logged in as any specific Google user." )) return(invisible()) } about <- drive_about() structure(about[["user"]], class = c("drive_user", "list")) } #' @export format.drive_user <- function(x, ...) { cli::cli_format_method( drive_bullets(c( "Logged in as:", "*" = "displayName: {.field {x[['displayName']]}}", "*" = "emailAddress: {.email {x[['emailAddress']]}}" )) ) } #' @export print.drive_user <- function(x, ...) { cli::cat_line(format(x, ...)) invisible(x) } googledrive/R/roxygen-templates.R0000644000176200001440000000273314070147664016611 0ustar liggesusers# nocov start param_path <- function(thing = "THING", default_notes = "") { glue(" @param path Specifies target destination for the {thing} on Google Drive. Can be an actual path (character), a file id marked with [as_id()], or a [`dribble`]. If `path` is a shortcut to a folder, it is automatically resolved to its target folder. If `path` is given as a path (as opposed to a `dribble` or an id), it is best to explicitly indicate if it's a folder by including a trailing slash, since it cannot always be worked out from the context of the call. {default_notes}") } param_path_known_parent <- function(thing = "item") { glue(" @param path Target destination for the new {thing}, i.e. a folder or a shared drive. Can be given as an actual path (character), a file id or URL marked with [as_id()], or a [`dribble`]. Defaults to your \"My Drive\" root folder. If `path` is a shortcut to a folder, it is automatically resolved to its target folder.") } param_name <- function(thing = "THING", default_notes = "") { glue(" @param name Character, new {thing} name if not specified as part of `path`. This will force `path` to be interpreted as a folder, even if it is character and lacks a trailing slash. {default_notes}") } return_dribble <- function(item = "file", extras = "") { glue(" @return An object of class [`dribble`], a tibble with one row per {item}. {extras}") } # nocov end googledrive/R/shortcut.R0000644000176200001440000001436214071171100014755 0ustar liggesusers#' Create a shortcut to a Drive file #' #' Creates a shortcut to the target Drive `file`, which could be a folder. A #' Drive shortcut functions like a symbolic or "soft" link and is primarily #' useful for creating a specific Drive user experience in the browser, i.e. to #' make a Drive file or folder appear in more than 1 place. Shortcuts are a #' relatively new feature in Drive; they were introduced when Drive stopped #' allowing a file to have more than 1 parent folder. #' #' @template file-singular #' @eval param_path_known_parent("shortcut") #' @eval param_name( #' thing = "shortcut", #' default_notes = "By default, the shortcut starts out with the same name as #' the target `file`. As a consequence, if you want to use #' `overwrite = TRUE` or `overwrite = FALSE`, you **must** explicitly #' specify the shortcut's `name`." #' ) #' @template overwrite #' @eval return_dribble() #' @export #' @seealso #' * #' #' @examplesIf drive_has_token() #' # Target one of the official example files #' (src_file <- drive_example_remote("chicken_sheet")) #' #' # Create a shortcut in the default location with the default name #' sc1 <- shortcut_create(src_file) #' # This shortcut could now be moved, renamed, etc. #' #' # Create a shortcut in the default location with a custom name #' sc2 <- src_file %>% #' shortcut_create(name = "chicken_sheet_second_shortcut") #' #' # Create a folder, then put a shortcut there, with default name #' folder <- drive_mkdir("chicken_sheet_shortcut_folder") #' sc3 <- src_file %>% #' shortcut_create(folder) #' #' # Look at all these shortcuts #' (dat <- drive_find("chicken_sheet", type = "shortcut")) #' #' # Confirm the shortcuts all target the original file #' dat <- dat %>% #' drive_reveal("shortcut_details") #' purrr::map_chr(dat$shortcut_details, "targetId") #' as_id(src_file) #' #' # Clean up #' drive_rm(sc1, sc2, sc3, folder) shortcut_create <- function(file, path = NULL, name = NULL, overwrite = NA) { target <- as_dribble(file) target <- confirm_single_file(target) if (is.null(name) && (isTRUE(overwrite) || isFALSE(overwrite))) { drive_abort(" You must specify the shortcut's {.arg name} in order to specify \\ {.arg overwrite} behaviour.") } drive_create( name = name, path = path, type = "shortcut", shortcutDetails = list(targetId = target$id), overwrite = overwrite ) } #' Resolve shortcuts to their targets #' #' Retrieves the metadata for the Drive file that a shortcut refers to, i.e. the #' shortcut's target. The returned [`dribble`] has the usual columns (`name`, #' `id`, `drive_resource`), which refer to the target. It will also include the #' columns `name_shortcut` and `id_shortcut`, which refer to the original #' shortcut. There are 3 possible scenarios: #' 1. `file` is a shortcut and user can [drive_get()] the target. All is simple #' and well. #' 1. `file` is a shortcut, but [drive_get()] fails for the target. This can #' happen if the user can see the shortcut, but does not have read access #' to the target. It can also happen if the target has been trashed or #' deleted. In such cases, all of the target's metadata, except for `id`, #' will be missing. Call `drive_get()` on a problematic `id` to see the #' specific error. #' 1. `file` is not a shortcut. `name_shortcut` and `id_shortcut` will both be #' `NA`. #' #' @template file-plural #' #' @eval return_dribble(extras = "Extra columns `name_shortcut` and #' `id_shortcut` refer to the original shortcut.") #' @export #' #' @examplesIf drive_has_token() #' # Create a file to make a shortcut to #' file <- drive_example_remote("chicken_sheet") %>% #' drive_cp(name = "chicken-sheet-for-shortcut") #' #' # Create a shortcut #' sc1 <- file %>% #' shortcut_create(name = "shortcut-1") #' #' # Create a second shortcut by copying the first #' sc1 <- sc1 %>% #' drive_cp(name = "shortcut-2") #' #' # Get the shortcuts #' (sc_dat <- drive_find("-[12]$", type = "shortcut")) #' #' # Resolve them #' (resolved <- shortcut_resolve(sc_dat)) #' #' resolved$id #' file$id #' #' # Delete the target file #' drive_rm(file) #' #' # (Try to) resolve the shortcuts again #' shortcut_resolve(sc_dat) #' # No error, but resolution is unsuccessful due to non-existent target #' #' # Clean-up #' drive_rm(sc_dat) shortcut_resolve <- function(file) { file <- as_dribble(file) out <- purrr::pmap(file, resolve_one) out <- vec_rbind(!!!out) is_sc <- !is.na(out$name_shortcut) n_shortcuts <- sum(is_sc) n_resolved <- sum(is_sc & !is.na(out$name)) if (n_shortcuts == 0) { drive_bullets(c( "i" = "No shortcuts found." )) } else { drive_bullets(c( i = if (n_shortcuts == n_resolved) { "Resolved {n_resolved} shortcut{?s} found in {nrow(out)} file{?s}:" } else { "Resolved {n_resolved} of {n_shortcuts} shortcut{?s} found \\ in {nrow(out)} file{?s}:" }, bulletize(gargle_map_cli( out[is_sc, ], template = c( id_shortcut_string = ">>", id_string = ">>", out = "{.drivepath <>} \\ {cli::col_grey('<>')} \\ -> {.drivepath <>} {cli::col_grey('<>')}" ) )) )) } out } # TODO: why does this have such an annoying signature? why not dribble in, # dribble out? resolve_one <- function(name, id, drive_resource, ...) { target_id <- pluck(drive_resource, "shortcutDetails", "targetId") if (is_null(target_id)) { return( list(drive_resource) %>% as_dribble() %>% put_column(nm = "id_shortcut", val = NA_character_, .after = "id") %>% put_column(nm = "name_shortcut", val = NA_character_, .after = "id") ) } out <- tryCatch( drive_get(as_id(target_id)), gargle_error_request_failed = function(e) bad_target(target_id) ) out %>% put_column(nm = "id_shortcut", val = id, .after = "id") %>% put_column(nm = "name_shortcut", val = name, .after = "id") } bad_target <- function(id) { as_dribble(list( list( name = NA_character_, id = id, kind = "drive#file" ) )) } googledrive/R/drive_auth.R0000644000176200001440000001700514071171077015246 0ustar liggesusers## This file is the interface between googledrive and the ## auth functionality in gargle. # Initialization happens in .onLoad() .auth <- NULL ## The roxygen comments for these functions are mostly generated from data ## in this list and template text maintained in gargle. gargle_lookup_table <- list( PACKAGE = "googledrive", YOUR_STUFF = "your Drive files", PRODUCT = "Google Drive", API = "Drive API", PREFIX = "drive" ) #' Authorize googledrive #' #' @eval gargle:::PREFIX_auth_description(gargle_lookup_table) #' @eval gargle:::PREFIX_auth_details(gargle_lookup_table) #' @eval gargle:::PREFIX_auth_params() #' #' @family auth functions #' @export #' #' @examples #' \dontrun{ #' # load/refresh existing credentials, if available #' # otherwise, go to browser for authentication and authorization #' drive_auth() #' #' # see user associated with current token #' drive_user() #' #' # force use of a token associated with a specific email #' drive_auth(email = "jenny@example.com") #' drive_user() #' #' # force the OAuth web dance #' drive_auth(email = NA) #' #' # use a 'read only' scope, so it's impossible to edit or delete files #' drive_auth( #' scopes = "https://www.googleapis.com/auth/drive.readonly" #' ) #' #' # use a service account token #' drive_auth(path = "foofy-83ee9e7c9c48.json") #' } drive_auth <- function(email = gargle::gargle_oauth_email(), path = NULL, scopes = "https://www.googleapis.com/auth/drive", cache = gargle::gargle_oauth_cache(), use_oob = gargle::gargle_oob_default(), token = NULL) { env_unbind(.googledrive, "root_folder") cred <- gargle::token_fetch( scopes = scopes, app = drive_oauth_app() %||% gargle::tidyverse_app(), email = email, path = path, package = "googledrive", cache = cache, use_oob = use_oob, token = token ) if (!inherits(cred, "Token2.0")) { drive_abort(c( "Can't get Google credentials", "i" = "Are you running googledrive in a non-interactive session? \\ Consider:", "*" = "{.fun drive_deauth} to prevent the attempt to get credentials", "*" = "Call {.fun drive_auth} directly with all necessary specifics", "i" = "See gargle's \"Non-interactive auth\" vignette for more details:", "i" = "{.url https://gargle.r-lib.org/articles/non-interactive-auth.html}" )) } .auth$set_cred(cred) .auth$set_auth_active(TRUE) invisible() } #' Suspend authorization #' #' @eval gargle:::PREFIX_deauth_description_with_api_key(gargle_lookup_table) #' #' @family auth functions #' @export #' @examples #' \dontrun{ #' drive_deauth() #' drive_user() #' public_file <- #' drive_get(as_id("1Hj-k7NpPSyeOR3R7j4KuWnru6kZaqqOAE8_db5gowIM")) #' drive_download(public_file) #' } drive_deauth <- function() { .auth$set_auth_active(FALSE) .auth$clear_cred() env_unbind(.googledrive, "root_folder") invisible() } #' Produce configured token #' #' @eval gargle:::PREFIX_token_description(gargle_lookup_table) #' @eval gargle:::PREFIX_token_return() #' #' @family low-level API functions #' @export #' @examplesIf drive_has_token() #' req <- request_generate( #' "drive.files.get", #' list(fileId = "abc"), #' token = drive_token() #' ) #' req drive_token <- function() { if (isFALSE(.auth$auth_active)) { return(NULL) } if (!drive_has_token()) { drive_auth() } httr::config(token = .auth$cred) } #' Is there a token on hand? #' #' @eval gargle:::PREFIX_has_token_description(gargle_lookup_table) #' @eval gargle:::PREFIX_has_token_return() #' #' @family low-level API functions #' @export #' #' @examples #' drive_has_token() drive_has_token <- function() { inherits(.auth$cred, "Token2.0") } #' Edit and view auth configuration #' #' @eval gargle:::PREFIX_auth_configure_description(gargle_lookup_table) #' @eval gargle:::PREFIX_auth_configure_params() #' @eval gargle:::PREFIX_auth_configure_return(gargle_lookup_table) #' #' @family auth functions #' @export #' @examples #' # see and store the current user-configured OAuth app (probaby `NULL`) #' (original_app <- drive_oauth_app()) #' #' # see and store the current user-configured API key (probaby `NULL`) #' (original_api_key <- drive_api_key()) #' #' if (require(httr)) { #' # bring your own app via client id (aka key) and secret #' google_app <- httr::oauth_app( #' "my-awesome-google-api-wrapping-package", #' key = "123456789.apps.googleusercontent.com", #' secret = "abcdefghijklmnopqrstuvwxyz" #' ) #' google_key <- "the-key-I-got-for-a-google-API" #' drive_auth_configure(app = google_app, api_key = google_key) #' #' # confirm the changes #' drive_oauth_app() #' drive_api_key() #' } #' #' \dontrun{ #' # bring your own app via JSON downloaded from Google Developers Console #' drive_auth_configure( #' path = "/path/to/the/JSON/you/downloaded/from/google/dev/console.json" #' ) #' } #' #' # restore original auth config #' drive_auth_configure(app = original_app, api_key = original_api_key) drive_auth_configure <- function(app, path, api_key) { if (!missing(app) && !missing(path)) { drive_abort("Must supply exactly one of {.arg app} or {.arg path}, not both") } stopifnot(missing(api_key) || is.null(api_key) || is_string(api_key)) if (!missing(path)) { stopifnot(is_string(path)) app <- gargle::oauth_app_from_json(path) } stopifnot(missing(app) || is.null(app) || inherits(app, "oauth_app")) if (!missing(app) || !missing(path)) { .auth$set_app(app) } if (!missing(api_key)) { .auth$set_api_key(api_key) } invisible(.auth) } #' @export #' @rdname drive_auth_configure drive_api_key <- function() .auth$api_key #' @export #' @rdname drive_auth_configure drive_oauth_app <- function() .auth$app # unexported helpers that are nice for internal use ---- drive_auth_internal <- function(account = c("docs", "testing"), scopes = NULL) { account <- match.arg(account) can_decrypt <- gargle:::secret_can_decrypt("googledrive") online <- !is.null(curl::nslookup("drive.googleapis.com", error = FALSE)) if (!can_decrypt || !online) { drive_abort( message = c( "Auth unsuccessful:", if (!can_decrypt) { c("x" = "Can't decrypt the {.field {account}} service account token") }, if (!online) { c("x" = "We don't appear to be online (or maybe the Drive API is down?)") } ), class = "googledrive_auth_internal_error", can_decrypt = can_decrypt, online = online ) } if (!is_interactive()) local_drive_quiet() filename <- glue("googledrive-{account}.json") # TODO: revisit when I do PKG_scopes() # https://github.com/r-lib/gargle/issues/103 scopes <- scopes %||% "https://www.googleapis.com/auth/drive" json <- gargle:::secret_read("googledrive", filename) drive_auth(scopes = scopes, path = rawToChar(json)) print(drive_user()) invisible(TRUE) } drive_auth_docs <- function(scopes = NULL) { drive_auth_internal("docs", scopes = scopes) } drive_auth_testing <- function(scopes = NULL) { drive_auth_internal("testing", scopes = scopes) } local_deauth <- function(env = parent.frame()) { original_cred <- .auth$get_cred() original_auth_active <- .auth$auth_active drive_bullets(c("i" = "Going into deauthorized state")) withr::defer( drive_bullets(c("i" = "Restoring previous auth state")), envir = env ) withr::defer({ .auth$set_cred(original_cred) .auth$set_auth_active(original_auth_active) }, envir = env) drive_deauth() } googledrive/R/camelCase.R0000644000176200001440000000235614070147664015000 0ustar liggesusers# camelCase() and toCamel() taken from # https://github.com/rstats-db/bigrquery/blob/master/R/camelCase.R # in theory, belongs in gargle # but then we'd need to export it and I'm not sure it's worth it # https://github.com/r-lib/gargle # camelCase vs snake_case policy # ** all arguments in functions exported by googledrive shall be snake_case** # # HOWEVER, the Drive API is camelCase # both wrt parameter names and many of their string values # examples: `pageSize`, `mimeType`, `corpora = "allDrives"` # therefore, whenever we pass `...` through, we process with toCamel() # this means user can say `page_size = 20` and we send `pageSize = 20` # # we do not trumpet this snake_case to camelCase conversion in the docs, # because many of the strings/values we handle are camelCase and we ARE not # going to alter them # there's too much potential for confusion # # at this point, snake_case to camelCase is a very quiet feature camelCase <- function(x) { gsub("_(.)", "\\U\\1", x, perl = TRUE) } toCamel <- function(x) { if (is.list(x)) { x[] <- lapply(x, toCamel) } if (!is.null(names(x))) { names(x) <- camelCase(names(x)) } x } # added later snake_case <- function(x) { gsub("([a-z0-9])([A-Z])", "\\1_\\L\\2", x, perl = TRUE) } googledrive/R/drive_rename.R0000644000176200001440000000220114070147664015550 0ustar liggesusers#' Rename a Drive file #' #' This is a wrapper for [`drive_mv()`] that only renames a file. #' If you would like to rename AND move the file, see [`drive_mv()`]. #' #' @template file-singular #' @param name Character. Name you would like the file to have. #' @template overwrite #' @template verbose #' #' @eval return_dribble() #' #' @examplesIf drive_has_token() #' # Create a file to rename #' file <- drive_create("file-to-rename") #' #' # Rename it #' file <- drive_rename(file, name = "renamed-file") #' #' # `overwrite = FALSE` errors if something already exists at target filepath #' # THIS WILL ERROR! #' drive_create("name-squatter") #' drive_rename(file, name = "name-squatter", overwrite = FALSE) #' #' # `overwrite = TRUE` moves the existing item to trash, then proceeds #' file <- drive_rename(file, name = "name-squatter", overwrite = TRUE) #' #' # Clean up #' drive_rm(file) #' @export drive_rename <- function(file, name = NULL, overwrite = NA, verbose = deprecated()) { warn_for_verbose(verbose) drive_mv(file = file, name = name, overwrite = overwrite) } googledrive/R/utils-paths.R0000644000176200001440000001177514071401260015367 0ustar liggesusers# path utilities that CAN call the Drive API ---- root_folder <- function() { # inlining env_cache() logic, so I don't need bleeding edge rlang if (!env_has(.googledrive, "root_folder")) { env_poke(.googledrive, "root_folder", drive_get(id = "root")) } env_get(.googledrive, "root_folder") } root_id <- function() root_folder()$id rationalize_path_name <- function(path = NULL, name = NULL) { if (!is.null(name)) { stopifnot(is_string(name)) } if (is_path(path)) { confirm_clear_path(path, name) path_parts <- partition_path(path, maybe_name = is.null(name)) path <- path_parts$parent name <- name %||% path_parts$name } list(path = path, name = name) } confirm_clear_path <- function(path, name) { if (is.null(name) && !has_slash(path) && drive_path_exists(append_slash(path))) { drive_abort(c( "Unclear if {.arg path} specifies parent folder or full path \\ to the new file, including its name.", "See {.fun ?as_dribble} for advice on how to make this clear." )) } } drive_path_exists <- function(path) { stopifnot(is_path(path)) if (length(path) == 0) return(logical(0)) stopifnot(length(path) == 1) with_drive_quiet( some_files(drive_get(path = path)) ) } # `parent` is NULL or the file ID of a folder check_for_overwrite <- function(parent = NULL, name, overwrite) { hits <- overwrite_hits(parent = parent, name = name, overwrite = overwrite) # Happy Path 1 of 2: no name collision if (is.null(hits) || no_file(hits)) { return(invisible()) } # Happy Path 2 of 2: single name collision, which we are authorized to trash if (overwrite && single_file(hits)) { return(drive_trash(hits)) } # Unhappy Paths: multiple collisions and/or not allowed to trash anything hits <- drive_reveal(hits, "path") if (overwrite) { drive_abort(c( "Multiple items already exist at the target filepath.", bulletize(gargle_map_cli(hits, bullet = "x")), "Although {.code overwrite = TRUE}, it's not clear which item \\ to overwrite.", "Use {.code overwrite = NA} to suppress this check. Exiting." )) } else { drive_abort(c( # \u00a0 is a nonbreaking space "{nrow(hits)} item{?s} already exist{?s/} at the target filepath \\ and {.code overwrite\u00a0=\u00a0FALSE}:", bulletize(gargle_map_cli(hits, bullet = "x")) )) } } overwrite_hits <- function(parent = NULL, name, overwrite) { stopifnot(is_toggle(overwrite)) if (is.na(overwrite)) { return(invisible()) } parent_id <- parent %||% root_id() q <- c( glue("'{parent_id}' in parents"), glue("name = '{name}'"), "trashed = FALSE" ) # suppress drive_find() status updates local_drive_quiet() drive_find(q = q, corpus = "allDrives") } # path utilities that are "mechanical", i.e. they NEVER call the Drive API ---- dribble_with_path <- function() { put_column(dribble(), nm = "path", val = character(), .after = "name") } is_path <- function(x) is.character(x) && !is_drive_id(x) is_string <- function(x) length(x) == 1L && is_path(x) # turn '~' into `~/` rootize_path <- function(path) { if (length(path) == 0) return(path) stopifnot(is.character(path)) leading_slash <- startsWith(path, "/") if (any(leading_slash)) { drive_abort("{.pkg googledrive} does not allow paths to start with {.code /}") } sub("^~$", "~/", path) } ## does path have a trailing slash? has_slash <- function(path) { grepl("/$", path) } ## "a/b/" and "a/b" both return "a/b/" append_slash <- function(path) { if (length(path) < 1) return(path) ifelse(has_slash(path) | path == "", path, paste0(path, "/")) } ## "a/b/" and "a/b" both return "a/b" strip_slash <- function(path) { gsub("/$", "", path) } # partitions path into # * name = substring after the last `/` # * parent = substring up to the last `/` # if there is no `/`, put the input into `name` # use maybe_name if you have external info re: how to interpret the path # maybe_name = TRUE --> path could end in a name # maybe_name = FALSE --> path is known to be a directory partition_path <- function(path, maybe_name = FALSE) { out <- list(parent = NULL, name = NULL) if (length(path) < 1) { return(out) } stopifnot(is_string(path)) path <- rootize_path(path) if (!maybe_name) { path <- append_slash(path) } last_slash <- last(unlist(gregexpr(pattern = "/", path))) if (last_slash < 1) { out[["name"]] <- path return(out) } out[["parent"]] <- substr(path, 1, last_slash) if (last_slash == nchar(path)) { return(out) } out[["name"]] <- substr(path, last_slash + 1, nchar(path)) out } ## tools::file_ext(), except return NULL for non-extensions file_ext_safe <- function(x) { stopifnot(length(x) <= 1) ext <- tools::file_ext(x) if (length(ext) > 0 && nzchar(ext)) { ext } else { NULL } } ## add an extension if it is not already present apply_extension <- function(path, ext) { ext_orig <- file_ext_safe(path) if (!identical(ext, ext_orig)) { path <- paste(path, ext, sep = ".") } path } googledrive/R/compat-dplyr.R0000644000176200001440000000161214071401260015512 0ustar liggesusersdribble_maybe_reconstruct <- function(data, template) { if (dribble_is_reconstructable(data)) { # in workflowsets, davis uses new_workflow_set0(x) here new_dribble(data) } else { # @davis tells me there can be internal-to-vctrs-or-dplyr situations where # reconstruction starts with a conformable list, instead of data.frame new_tibble0(data) } } dribble_is_reconstructable <- function(data) { # see above for why this is is_list() instead of is.data.frame() is_list(data) && has_dribble_cols(data) && has_dribble_coltypes(data) && id_can_be_drive_id(data$id) && has_drive_resource(data) } new_tibble0 <- function(x, ..., class = NULL) { # Handle the 0-column case correctly by using `new_data_frame()`. # This also correctly strips any attributes except `names` off `x`. x <- new_data_frame(x) tibble::new_tibble(x, nrow = nrow(x), class = class) } googledrive/R/compat-vctrs.R0000644000176200001440000000767214071401260015535 0ustar liggesusers# based on https://github.com/tidymodels/workflowsets/blob/main/R/compat-vctrs.R # ------------------------------------------------------------------------------ # `vec_restore()` # # Called at the end of `vec_slice()` and `vec_ptype()` after all slicing has # been done on the proxy object. #' @export vec_restore.dribble <- function(x, to, ...) { dribble_maybe_reconstruct(x) } # ------------------------------------------------------------------------------ # `vec_ptype2()` # # When combining two dribbles together, `x` and `y` will be zero-row slices # which should always result in a new dribble, as long as # `df_ptype2()` can compute a common type. # # Combining a dribble with a tibble/data.frame will only ever happen if # the user calls `vec_c()` or `vec_rbind()` with one of each of those inputs. # Although I could probably make this work, it feels pretty weird and exotic # and I think that user, if they even exist, should just turn that "other" # tibble/data.frame into a dribble first. # So I'll follow workflowsets and not attempt to return dribble for these # combinations. #' @export vec_ptype2.dribble.dribble <- function(x, y, ..., x_arg = "", y_arg = "") { out <- df_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg) dribble_maybe_reconstruct(out) } #' @export vec_ptype2.dribble.tbl_df <- function(x, y, ..., x_arg = "", y_arg = "") { tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg) } #' @export vec_ptype2.tbl_df.dribble <- function(x, y, ..., x_arg = "", y_arg = "") { tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg) } #' @export vec_ptype2.dribble.data.frame <- function(x, y, ..., x_arg = "", y_arg = "") { tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg) } #' @export vec_ptype2.data.frame.dribble <- function(x, y, ..., x_arg = "", y_arg = "") { tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg) } # ------------------------------------------------------------------------------ # `vec_cast()` # # These methods are designed with `vec_ptype2()` in mind. # # Casting from one dribble to another will happen "automatically" when # two dribbles are combined with `vec_c()`. The common type will be # computed with `vec_ptype2()`, then each input will be `vec_cast()` to that # common type. It should always be possible to reconstruct the dribble # if `df_cast()` is able to cast the underlying data frames successfully. # # Casting a tibble or data.frame to a dribble should never happen # automatically, because the ptype2 methods always push towards # tibble / data.frame. Since it is so unlikely that this will be done # correctly, we don't ever allow it. # # Casting a dribble to a tibble or data.frame is easy, the underlying # vctrs function does the work for us. This is used when doing # `vec_c(, )`, as the `vec_ptype2()` method will compute # a common type of tibble, and then each input will be cast to tibble. #' @export vec_cast.dribble.dribble <- function(x, to, ..., x_arg = "", to_arg = "") { out <- df_cast(x, to, ..., x_arg = x_arg, to_arg = to_arg) dribble_maybe_reconstruct(out) } #' @export vec_cast.dribble.tbl_df <- function(x, to, ..., x_arg = "", to_arg = "") { stop_incompatible_cast_dribble(x, to, x_arg = x_arg, to_arg = to_arg) } #' @export vec_cast.tbl_df.dribble <- function(x, to, ..., x_arg = "", to_arg = "") { tib_cast(x, to, ..., x_arg = x_arg, to_arg = to_arg) } #' @export vec_cast.dribble.data.frame <- function(x, to, ..., x_arg = "", to_arg = "") { stop_incompatible_cast_dribble(x, to, x_arg = x_arg, to_arg = to_arg) } #' @export vec_cast.data.frame.dribble <- function(x, to, ..., x_arg = "", to_arg = "") { df_cast(x, to, ..., x_arg = x_arg, to_arg = to_arg) } # ------------------------------------------------------------------------------ stop_incompatible_cast_dribble <- function(x, to, ..., x_arg, to_arg) { details <- "Can't cast to a because the resulting structure is likely invalid." stop_incompatible_cast(x, to, x_arg = x_arg, to_arg = to_arg, details = details) } googledrive/R/drive_examples.R0000644000176200001440000001034314071171077016121 0ustar liggesusers#' Example files #' #' googledrive makes a variety of example files -- both local and remote -- #' available for use in examples and reprexes. These functions help you access #' the example files. See `vignette("example-files", package = "googledrive")` #' for more. #' #' @param matches A regular expression that matches the name of the desired #' example file(s). This argument is optional for the plural forms #' (`drive_examples_local()` and `drive_examples_remote()` and, if provided, #' multiple matches are allowed. The single forms (`drive_example_local()` and #' `drive_example_reomote()` require this argument and require that there is #' exactly one match. #' #' @return #' * For `drive_example_local()` and `drive_examples_local()`, one or more local #' filepaths. #' * For `drive_example_remote()` and `drive_examples_remote()`, a `dribble`. #' @name drive_examples #' @examples #' drive_examples_remote() #' drive_examples_remote("chicken") #' drive_example_remote("chicken_doc") #' #' drive_examples_local() %>% basename() #' drive_examples_local("chicken") %>% basename() #' drive_example_local("imdb") NULL #' @rdname drive_examples #' @export drive_examples_local <- function(matches) { out <- many_files( needle = matches, haystack = local_example_files(), where = "local" ) out$path } #' @rdname drive_examples #' @export drive_examples_remote <- function(matches) { many_files( needle = matches, haystack = remote_example_files(), where = "remote" ) } #' @rdname drive_examples #' @export drive_example_local <- function(matches) { out <- one_file( needle = matches, haystack = local_example_files(), where = "local" ) out$path } #' @rdname drive_examples #' @export drive_example_remote <- function(matches) { one_file( needle = matches, haystack = remote_example_files(), where = "remote" ) } many_files <- function(needle, haystack, where = c("local", "remote")) { where <- match.arg(where) out <- haystack if (!missing(needle)) { check_needle(needle) sel <- grepl(needle, haystack$name, ignore.case = TRUE) if (!any(sel)) { drive_abort( "Can't find a {where} example file with a name that matches \\ \"{needle}\".") } out <- haystack[sel, ] } out } one_file <- function(needle, haystack, where) { out <- many_files(needle = needle, haystack = haystack, where = where) if (nrow(out) > 1) { drive_abort(c( "Found multiple matching {where} files:", bulletize(gargle_map_cli(out$name)), i = "Make the {.arg matches} regular expression more specific." )) } out } local_example_files <- function() { # inlining env_cache() logic, so I don't need bleeding edge rlang if (!env_has(.googledrive, "local_example_files")) { pths <- list.files( system.file( "extdata", "example_files", package = "googledrive", mustWork = TRUE ), full.names = TRUE ) env_poke( .googledrive, "local_example_files", tibble(name = basename(pths), path = pths) ) } env_get(.googledrive, "local_example_files") } remote_example_files <- function() { # inlining env_cache() logic, so I don't need bleeding edge rlang if (!env_has(.googledrive, "remote_example_files")) { inventory_id <- "1XiwJJdoqoZ876OoSTjsnBZ5SxxUg6gUC" if (!drive_has_token()) { # don't trigger auth just for this local_drive_quiet() local_deauth() } dat_string <- drive_read_string(as_id(inventory_id), encoding = "UTF-8") dat <- utils::read.csv(text = dat_string, stringsAsFactors = FALSE) env_poke(.googledrive, "remote_example_files", as_dribble(as_id(dat$id))) } env_get(.googledrive, "remote_example_files") } check_needle <- function(needle) { if (is_string(needle)) { return() } drive_abort(c( "{.arg matches} must be a string, not {.cls class(needle)}" )) } #' @name googledrive-deprecated #' @export drive_example <- function(path = NULL) { if (is.null(path)) { lifecycle::deprecate_warn("2.0.0", "drive_example()", "drive_examples_local()") drive_examples_local() } else { lifecycle::deprecate_warn("2.0.0", "drive_example()", "drive_example_local()") drive_example_local(path) } } googledrive/R/drive_get_path.R0000644000176200001440000002337614070147664016114 0ustar liggesusers# all the helpers behind: # drive_get(path =) # drive_reveal(what = "path") drive_reveal_path <- function(x, ancestors = c("none", "parents", "all")) { stopifnot(inherits(x, "dribble")) if (no_file(x)) return(dribble_with_path()) ancestors <- ancestors %||% dribble() if (!inherits(ancestors, "dribble")) { ancestors <- arg_match(ancestors) if (ancestors == "all") { tmp <- sort_out_shared_drive_and_corpus(x) shared_drive <- tmp$shared_drive corpus <- tmp$corpus } ancestors <- switch( ancestors, none = dribble(), parents = get_immediate_parents(x), all = get_folders(shared_drive = shared_drive, corpus = corpus) ) } resolve_paths(x, ancestors) } drive_reveal_canonical_path <- function(x) { drive_reveal_path(x, ancestors = "all") } # TODO: can this somehow be unified with drive_find()'s fussing about with # (shared_drive, corpus) and with shared_drive_params()? sort_out_shared_drive_and_corpus <- function(x) { shared_drive <- NULL corpus <- NULL sid <- map_chr(x$drive_resource, "driveId", .default = NA) sid <- unique(sid[!is.na(sid)]) if (length(sid) == 1) { shared_drive <- as_id(sid) } if (length(sid) > 1) { corpus <- "allDrives" } list(shared_drive = shared_drive, corpus = corpus) } drive_get_path <- function(path = NULL, shared_drive = NULL, corpus = NULL) { if (length(path) == 0) return(dribble_with_path()) stopifnot(is_path(path)) path <- rootize_path(path) last_path_part <- get_last_path_part(path) candidates <- get_by_name( last_path_part, shared_drive = shared_drive, corpus = corpus ) candidates <- drive_reveal_path(candidates) # setup a tibble to structure the work dat <- tibble( orig_path = path, doomed = !map_lgl(last_path_part, path_has_match, haystack = candidates$path), done = FALSE ) dat$done <- map_lgl(dat$orig_path, path_has_match, haystack = candidates$path) if (all(dat$done | dat$doomed)) { return(finalize(dat, candidates)) } # all undone paths assert something about parent folder(s) candidates <- drive_reveal_path(candidates, "parents") dat$done <- map_lgl(dat$orig_path, path_has_match, haystack = candidates$path) if (all(dat$done | dat$doomed)) { return(finalize(dat, candidates)) } candidates <- drive_reveal_path(candidates, "all") dat$done <- map_lgl(dat$orig_path, path_has_match, haystack = candidates$path) if (all(dat$done | dat$doomed)) { return(finalize(dat, candidates)) } # TODO: paths that are still undone could possibly be resolved by considering # folder shortcuts, i.e. non-canonical paths # but for now, just return what we've got finalize(dat, candidates) } path_match <- function(needle, haystack) { if (!has_slash(needle)) { haystack <- strip_slash(haystack) } if (startsWith(needle, "[/~]")) { needle <- paste0("^", needle) } needle <- paste0(escape_regex(needle), "$") grep(needle, haystack) } path_has_match <- function(needle, haystack) { any(path_match(needle, haystack)) } get_folders <- function(shared_drive = NULL, corpus = NULL) { # TODO: could possibly be nice to limit the fields folders <- drive_find(type = "folder", shared_drive = shared_drive, corpus = corpus) folders <- vec_rbind(root_folder(), folders) } get_immediate_parents <- function(x) { stopifnot(inherits(x, "dribble")) x <- drive_reveal(x, "parent") parent_ids <- unique(x$id_parent[!is.na(x$id_parent)]) # TODO: I suspect I must deal with the case where don't have permission to # drive_get() one of these ids, but I haven't tripped up on this yet myself. # TODO: could possibly be nice to limit the fields drive_get(id = as_id(parent_ids)) } resolve_paths <- function(d, folders = dribble()) { probands <- pthize(d) ancestors <- pthize(folders) raw_paths <- map(probands, ~pth(list(.x), ancestors)) pretty_paths <- map_chr(raw_paths, pathify) put_column(d, nm = "path", val = pretty_paths, .after = "name") } # converts files in a dribble to the form used in pth() pthize <- function(d) { d <- d %>% drive_reveal("mime_type") %>% drive_reveal("parent") %>% drive_reveal("shortcut_details") purrr::transpose( d[c( "id", "id_parent", # needed to resolve path relationships "name", "mime_type", "shortcut_details" # needed to create path string )] ) } # turns the output of pth() (a list) into a filepath (a string) pathify <- function(x) { x <- map_if(x, ~ .x$id == root_id(), ~ {.x$name <- "~"; .x}) last_mime_type <- pluck(last(x), "mime_type") last_is_folder <- identical(last_mime_type, drive_mime_type("folder")) last_is_folder_shortcut <- identical(last_mime_type, drive_mime_type("shortcut")) && identical( pluck(last(x), "shortcut_details", "targetMimeType"), drive_mime_type("folder") ) if (last_is_folder || last_is_folder_shortcut) { nm <- pluck(last(x), "name") purrr::pluck(x, length(x), "name") <- append_slash(nm) } glue_collapse(map_chr(x, "name"), sep = "/") } # the recursive workhorse that walks up a file tree # x is a list, each element describes 1 file # a file is described by: # - id # - id_parent (can be NA) # - name (just along for the ride; needed to create path strings) # - mime_type (ditto) # - shortcut_details (ditto; is often NULL) # typical x at start: list(some_file) # typical x at finish: list(grandparent_folder, parent_folder, some_file) pth <- function(x, ancestors) { this <- x[[1]] if (is.na(this$id_parent)) { return(x) } parent <- purrr::detect(ancestors, ~ identical(.x$id, this$id_parent)) if (is.null(parent)) { return(x) } pth(c(list(parent), x), ancestors) } finalize <- function(dat, candidates) { scratch <- dat scratch$m <- map(dat$orig_path, path_match, haystack = candidates$path) scratch$nm <- lengths(scratch$m) scratch$status <- NA_character_ # doomed: never even found a file with correct name, much less path # (remember this filter goes a bit beyond the name, e.g. maybe folder-hood) scratch$status[scratch$doomed] <- "unmatched" # empty_string: special case of doomed scratch$status[!nzchar(scratch$orig_path)] <- "empty_string" # not doomed, but undone: these could be valid paths, but we won't know until # we start resolving non-canonical paths scratch$status[!scratch$done & !scratch$doomed] <- "undone" # unspecific: path is compatible with more than 1 file scratch$status[scratch$done & scratch$nm > 1] <- "unspecific" # resolved: path identifies exactly 1 file scratch$status[scratch$done & scratch$nm == 1] <- "resolved" no_status <- is.na(scratch$status) if (any(no_status)) { abort("Internal error: paths with missing status") } report_weird_stuff <- function(x, indicator, problem) { weird <- vec_slice(x, x[["status"]] == indicator) if (vec_size(weird) == 0) return() drive_bullets(c( "!" = "Problem with {nrow(weird)} path{?s}: {problem}", # these really should be sub-bullets, but not possible at this time bulletize(gargle_map_cli(weird[["orig_path"]], "{.path <>}"), bullet = " ") )) } report_weird_stuff(scratch, "unmatched", "no files found by this name") report_weird_stuff(scratch, "undone", "no file has such a canonical path") report_weird_stuff(scratch, "unspecific", "path is compatible with more than 1 file") n_empty_string <- sum(scratch$status == "empty_string") if (n_empty_string > 0) { drive_bullets(c( "!" = "Problem with {n_empty_string} path{?s}: \\ path is empty string")) } index <- unlist(scratch$m) dupes <- duplicated(index) if (any(dupes)) { multis <- vec_slice(candidates, unique(index[dupes])) drive_bullets(c( "!" = "{nrow(multis)} file{?s} in the output {?is/are} associated with \\ more than 1 input {.arg path}", # these really should be sub-bullets, but not possible at this time bulletize(gargle_map_cli(multis), bullet = " ") )) } resolved <- scratch$status == "resolved" if (all(resolved)) { if (nrow(scratch) > 1) { b <- c(v = "All {nrow(scratch)} input {.arg path}s resolved to exactly \\ 1 file.") } else { b <- c(v = "The input {.arg path} resolved to exactly 1 file.") } } else if (any(resolved)) { b <- c("!" = "{sum(scratch$status == 'resolved')} out of {nrow(scratch)} \\ input paths resolved to exactly 1 file.") } else { # TODO: this wording is not great, yet I don't know what would be better b <- c("!" = "No path resolved to exactly 1 file.") } drive_bullets(b) vec_slice(candidates, index[!dupes]) } get_by_name <- function(names, shared_drive = NULL, corpus = NULL) { nms <- strip_slash(unique(names)) is_root <- nms == "~" nms <- nms[!is_root] q_clauses <- glue("name = {sq(nms)}") # fields <- # c("kind", "id", "name", "mimeType", "parents", "shortcutDetails", "driveId") if (length(q_clauses) == 0) { found <- dribble() } else { found <- drive_find( q = or(q_clauses), #fields = prep_fields(fields), shared_drive = shared_drive, corpus = corpus ) } if (any(is_root)) { found <- vec_rbind(root_folder(), found) } found } # you might think this can be merged with partition_path(), but their purposes # are different enough that it's not worth it get_last_path_part <- function(path) { stopifnot(is_path(path)) path <- rootize_path(path) # NOTE: we ignore (but retain) a trailing slash # why? googledrive encourages the user to use a trailing slash to explicitly # indicate a path that refers to a folder slash_pos <- gregexpr(pattern = "/.", path) no_slash <- map_lgl(slash_pos, ~all(.x == -1)) last_slash <- map_int(slash_pos, max) ifelse(no_slash, path, substr(path, last_slash + 1, nchar(path))) } googledrive/NEWS.md0000644000176200001440000004262014071433026013662 0ustar liggesusers# googledrive 2.0.0 ## Team Drives are dead! Long live shared drives! Google Drive has rebranded Team Drives as **shared drives**. While anyone can have a **My Drive**, shared drives are only available for Google Workspace (previously known as G Suite). Shared drives and the files within are owned by a team/organization, as opposed to an individual. In googledrive, all `team_drive_*()` functions have been deprecated, in favor of their `shared_drive_*()` successors. Likewise, any `team_drive` argument has been deprecated, in favor of a new `shared_drive` argument. The terms used to describe which collections to search have also changed slightly, with `"allDrives"` replacing `"all"`. This applies to the `corpus` argument of `drive_find()` and `drive_get()`. Where to learn more: * [Team Drives is being renamed to shared drives](https://workspaceupdates.googleblog.com/2019/04/shared-drives.html) from Google Workspace blog * [Upcoming changes to the Google Drive API and Google Picker API](https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api) from the Google Cloud blog ## Single parenting and shortcuts As of 2020-09-30, Drive no longer allows a file to be placed in multiple folders; going forward, every file will have exactly 1 parent folder. In many cases that parent is just the top-level or root folder of your "My Drive" or of a shared drive. This change has been accompanied by the introduction of file **shortcuts**, which function much like symbolic or "soft" links. Shortcuts are the new way to make a file appear to be in more than one place or, said another way, the new way for one Drive file to be associated with more than one Drive filepath. A shortcut is a special type of Drive file, characterized by the `application/vnd.google-apps.shortcut` MIME type. You can make a shortcut to any Drive file, including to a Drive folder. Drive has been migrating existing files to the one-parent state, i.e., "single parenting" them. Drive selects the most suitable parent folder to keep, "based on the hierarchy's properties", and replaces any other parent-child relationships with a shortcut. New functions related to shortcuts: * `shortcut_create()`: creates a shortcut to a specific Drive file (or folder). * `shortcut_resolve()`: resolves a shortcut to its target, i.e. the file it refers to. Works for multiple files at once, i.e. the input can be a mix of shortcuts and non-shortcuts. The non-shortcuts are passed through and the shortcuts are replaced by their targets. How interacts with googledrive's support for specifying file by filepath: * Main principle: shortcuts are first-class Drive files that we assume users will need to manipulate with googledrive. In general, there is no automatic resolution to the target file. * `drive_reveal(what = "path")` returns the canonical path, i.e. there will be no shortcuts among the non-terminal "folder" parts of the returned path. * `drive_get(path = "foo/")` can retrieve a folder named "foo" or a shortcut named "foo", whose target is a folder. * When a shortcut-to-a-folder is specified as the `path`, in a context where it unambiguously specifies a parent folder, the `path` **is** auto-resolved to its target folder. This is the exception to the "no automatic resolution" rule. Functions affected: - `drive_ls(path, ...)` - `drive_create(name, path, ...)` and its convenience wrappers `drive_mkdir()` and `shortcut_create()` - `drive_cp(file, path, ...)` - `drive_mv(file, path, ...)` - `drive_upload(media, path, ...)` and its close friend `drive_put()` Further reading about changes to the Drive folder model: * [Simplifying Google Drive’s folder structure and sharing models](https://cloud.google.com/blog/products/g-suite/simplifying-google-drives-folder-structure-and-sharing-models) * [Single-parenting behavior changes](https://developers.google.com/drive/api/v3/ref-single-parent) * [Create a shortcut to a Drive file](https://developers.google.com/drive/api/v3/shortcuts) * [Find files & folders with Google Drive shortcuts](https://support.google.com/drive/answer/9700156) ## User interface The user interface has gotten more stylish, thanks to the cli package (). All informational messages, warnings, and errors are now emitted via cli, which uses rlang's condition functions under-the-hood. `googledrive_quiet` is a new option to suppress informational messages from googledrive. Unless it's explicitly set to `FALSE`, the default is to message. The `verbose` argument of all `drive_*()` functions is deprecated and will be removed in a future release. In the current release, `verbose = FALSE` is still honored, but generates a warning. `local_drive_quiet()` and `with_drive_quiet()` are [withr-style](https://withr.r-lib.org) convenience helpers for setting `googledrive_quiet = TRUE` for some limited scope. ## Other changes * We now share a variety of world-readable, persistent example files on Drive, for use in examples and documentation. These remote example files complement the local example files that were already included in googledrive. `drive_example()` is deprecated in favor of these accessors for example files: - Plural forms:`drive_examples_remote()`, `drive_examples_local()` - Singular forms: `drive_example_remote()`, `drive_example_local()` * `drive_read_string()` and `drive_read_raw()` are new functions that read the content of a Drive file directly into R, skipping the step of downloading to a local file (#81). * `drive_reveal(what = "property_name")` now works for any property found in the file metadata stored in the `drive_resource` column. The new column is also simplified in more cases now, e.g. to `character` or `logical`. If the `property_name` suggests it's a date-time, we return `POSIXct`. * We've modernized the mechanisms by which the `dribble` class is (or is not) retained by various data frame operations. This boils down to updating or adding methods used by the base, dplyr, pillar/tibble, and vctrs packages. We focus on compatibility with dplyr >= 1.0.0, which was released a year ago. googledrive only Suggests dplyr, so all this really means is that `dribble` manipulation via dplyr now works best with dplyr >= 1.0.0. * The `drive_id` S3 class is now implemented more fully, using the vctrs package (#93, #364): - The `drive_id` class will persist after mundane operations, like subsetting. - You can no longer put strings that are obviously invalid into a `drive_id` object. - The `id` column of a `dribble` is now an instance of `drive_id`. ## Dependency changes cli, lifecycle, and withr are new in Imports. pillar and vctrs are new in Imports, but were already indirect hard dependencies via tibble. mockr is new in Suggests. curl moves from Imports to Suggests, but remains an indirect hard dependency. # googledrive 1.0.1 Patch release to modify a test for compatibility with an upcoming release of gargle. `drive_share()` gains awareness of the `"fileOrganizer"` role (#302). Better handling of filenames that include characters that have special meaning in a regular expression (#292). `drive_find()` explicitly checks for and eliminates duplicate records for a file ID, guarding against repetition in the paginated results returned by the API. It would seem that this should never happen, but there is some indication that it does. (#272, #277, #279, #281) `drive_share_anyone()` is a new convenience wrapper that makes a file readable by "anyone with a link". `as_tibble()` method for `dribble` objects now passes `...` through, which could apply, for example, to tibble's `.name_repair` argument. # googledrive 1.0.0 The release of version 1.0.0 marks two events: * The overall design of googledrive has survived ~2 years on CRAN, with very little need for change. The API and feature set is fairly stable. * There are changes in the auth interface that are not backwards compatible. There is also new functionality that makes it less likely you'll create multiple files with the same name, without actually meaning to. ## Auth from gargle googledrive's auth functionality now comes from the [gargle package](https://gargle.r-lib.org), which provides R infrastructure to work with Google APIs, in general. The same transition is happening in several other packages, such as [bigrquery](https://bigrquery.r-dbi.org) and [gmailr](https://gmailr.r-lib.org). This makes user interfaces more consistent and makes two new token flows available in googledrive: * Application Default Credentials * Service account tokens from the metadata server available to VMs running on GCE Where to learn more: * Help for [`drive_auth()`](https://googledrive.tidyverse.org/reference/drive_auth.html) *all that most users need* * *details for more advanced users* - [Bring your own OAuth app or API key](https://googledrive.tidyverse.org/articles/articles/bring-your-own-app.html) - [How to get your own API credentials](https://gargle.r-lib.org/articles/get-api-credentials.html) - [Non-interactive auth](https://gargle.r-lib.org/articles/non-interactive-auth.html) - [Auth when using R in the browser](https://gargle.r-lib.org/articles/auth-from-web.html) - [How gargle gets tokens](https://gargle.r-lib.org/articles/how-gargle-gets-tokens.html) - [Managing tokens securely](https://gargle.r-lib.org/articles/articles/managing-tokens-securely.html) ### Changes that a user will notice OAuth2 tokens are now cached at the user level, by default, instead of in `.httr-oauth` in the current project. We recommend that you delete any vestigial `.httr-oauth` files lying around your googledrive projects and re-authorize googledrive, i.e. get a new token, stored in the new way. googledrive uses a new OAuth "app", owned by a verified Google Cloud Project entitled "Tidyverse API Packages", which is the project name you will see on the OAuth consent screen. See our new [Privacy Policy](https://www.tidyverse.org/google_privacy_policy/) for details. The local OAuth2 token key-value store now incorporates the associated Google user when indexing, which makes it easier to switch between Google identities. The arguments and usage of `drive_auth()` have changed. * Previous signature (v0.1.3 and earlier) ``` r drive_auth( oauth_token = NULL, # use `token` now service_token = NULL, # use `path` now reset = FALSE, cache = getOption("httr_oauth_cache"), use_oob = getOption("httr_oob_default"), verbose = TRUE ) ``` * Current signature (>= v1.0.0) ``` r drive_auth( email = gargle::gargle_oauth_email(), # NEW! path = NULL, # was `service_token` scopes = "https://www.googleapis.com/auth/drive", # NEW! cache = gargle::gargle_oauth_cache(), use_oob = gargle::gargle_oob_default(), token = NULL # was `oauth_token` ) ``` For full details see the resources listed in *Where to learn more* above. The change that probably affects the most code is the way to provide a service account token: - Previously: `drive_auth(service_token = "/path/to/your/service-account-token.json")` (v0.1.3 and earlier) - Now: `drive_auth(path = "/path/to/your/service-account-token.json")` (>= v1.0.0) Auth configuration has also changed: * `drive_auth_configure()` is a variant of the now-deprecated `drive_auth_config()` whose explicit and only job is to *set* aspects of the configuration, i.e. the OAuth app or API key. - Use `drive_oauth_app()` (new) and `drive_api_key()` to *retrieve* a user-configured app or API key, if such exist. - These functions no longer return built-in auth assets, although built-in assets still exist and are used in the absence of user configuration. * `drive_deauth()` is how you go into a de-authorized state, i.e. send an API key in lieu of a token. `drive_has_token()` is a new helper that simply reports whether a token is in place, without triggering the auth flow. There are other small changes to the low-level developer-facing API: - `generate_request()` has been renamed to `request_generate()`. - `make_request()` had been renamed to `request_make()` and is a very thin wrapper around `gargle::request_make()` that only adds googledrive's user agent. - `build_request()` has been removed. If you can't do what you need with `request_generate()`, use `gargle::request_develop()` or `gargle::request_build()` directly. - `process_response()` has been removed. Instead, use `gargle::response_process(response)`, as we do inside googledrive. ## `overwrite = NA / TRUE / FALSE` and `drive_put()` Google Drive doesn't impose a 1-to-1 relationship between files and filepaths, the way your local file system does. Therefore, when working via the Drive API (instead of in the browser), it's fairly easy to create multiple Drive files with the same name or filepath, without actually meaning to. This is perfectly valid on Drive, which identifies file by ID, but can be confusing and undesirable for humans. googledrive v1.0.0 offers some new ways to fight this: * All functions that create a new item or rename/move an existing item have gained an `overwrite` argument. * `drive_put()` is a new convenience wrapper that figures out whether to call `drive_upload()` or `drive_update()`. Changes inspired by #230. ### `overwrite = NA / TRUE / FALSE` These functions gain an `overwrite` argument: * `drive_create()` *this whole function is new* * `drive_cp()` * `drive_mkdir()` * `drive_mv()` * `drive_rename()` * `drive_upload()` The default of `overwrite = NA` corresponds to the current behaviour, which is to "Just. Do. It.", i.e. to not consider pre-existing files at all. `overwrite = TRUE` requests to move a pre-existing file at the target filepath to the trash, prior to creating the new item. If 2 or more files are found, an error is thrown, because it's not clear which one(s) to trash. `overwrite = FALSE` means the new item will only be created if there is no pre-existing file at that filepath. Existence checks based on filepath (or name) can be expensive. This is why the default is `overwrite = NA`, in addition to backwards compatibility. ### `drive_put()` Sometimes you have a file you will repeatedly send to Drive, i.e. the first time you run an analysis, you create the file and, when you re-run it, you update the file. Previously this was hard to express with googledrive. `drive_put()` is useful here and refers to the HTTP verb `PUT`: create the thing if it doesn't exist or, if it does, replace its contents. A good explanation of `PUT` is [RESTful API Design -- PUT vs PATCH](https://medium.com/backticks-tildes/restful-api-design-put-vs-patch-4a061aa3ed0b). In pseudo-code, here's the basic idea of `drive_put()`: ``` r target_filepath <- hits <- if (no hits) { drive_upload(media, path, name, type, ..., verbose) } else if (exactly 1 hit) { drive_update(hit, media, ..., verbose) } else { ERROR } ``` ## Other changes All functions that support `...` as a way to pass more parameters to the Drive API now have "tidy dots semantics": `!!!` is supported for splicing and `!!` can be used on the LHS of `:=`. Full docs are in [`rlang::list2()`](https://rlang.r-lib.org/reference/tidy-dots.html). `drive_find()` now sorts by "recency", by default. `drive_create()` is a new function that creates a new empty file, with an optional file type specification (#258, @ianmcook). `drive_mkdir()` becomes a thin wrapper around `drive_create()`, with the file type hard-wired to "folder". In `drive_mkdir()`, the optional parent directory is now known as `path` instead of `parent`. This is more consistent with everything else in googledrive, which became very obvious when adding `drive_create()` and the general `overwrite` functionality. `drive_empty_trash()` now exploits the correct endpoint (as opposed to deleting individual files) and is therefore much faster (#203). Colaboratory notebooks now have some MIME type support, in terms of the `type` argument in various functions (). The internal table of known MIME types includes `"application/vnd.google.colab"`, which is associated with the file extension `.ipynb` and the human-oriented nickname `"colab"` (#207). `drive_endpoints()` gains a singular friend, `drive_endpoint()` which returns exactly one endpoint. These helpers index into the internal list of Drive API endpoints with `[` and `[[`, respectively. ## Dependency changes R 3.1 is no longer explicitly supported or tested. Our general practice is to support the current release (3.6), devel, and the 4 previous versions of R (3.5, 3.4, 3.3, 3.2). See [Which versions of R do tidyverse packages support?](https://www.tidyverse.org/blog/2019/04/r-version-support/). gargle and magrittr are newly Imported. rprojroot has been removed from Suggests, because we can now use a version of testthat recent enough to offer `testthat::test_path()`. # googledrive 0.1.3 Minor patch release for compatibility with the imminent release of purrr 0.3.0. # googledrive 0.1.2 * Internal usage of `glue::collapse()` modified to call `glue::glue_collapse()` if glue v1.3.0 or later is installed and `glue::collapse()` otherwise. Eliminates a deprecation warning emanating from glue. (#222 @jimhester) # googledrive 0.1.1 * initial CRAN release googledrive/MD50000644000176200001440000003025314071540356013100 0ustar liggesusersd22756a80c194196b97f9f7f47988918 *DESCRIPTION 5174dfc514f0941d2edd4b0b4c9941dd *LICENSE e62678a0aad353a3832d503af9e6620f *NAMESPACE 7f041719429f5522c3a32d1a4cae59ff *NEWS.md ea51517bb25071a980c92241446fdb59 *R/aaa.R 7ba93853b956e2c318aa79b4cd53de1c *R/camelCase.R 741c968df4f97326122c41b570e3b8a9 *R/compat-dplyr.R 508067e098bdd8539a8c8e6ae75a63e2 *R/compat-vctrs.R 57eebe4f22f669dff20da1595fb5427a *R/deprecated.R a61c3c1ce8c8ae0df78d59854f71b7d6 *R/dribble.R 1424f45362835c0a6deead9ed294b8c4 *R/drive_about.R cb8abda4b0c782ed9f54a881bcc6c1dd *R/drive_auth.R 1bf6933d8c5d2b7fb64b416766de75ef *R/drive_browse.R 0424c1d914aacb7682caec3834f67e88 *R/drive_cp.R 4b48872f51e41a4120c95e63150170d1 *R/drive_create.R 0018b1d5561edb8b10bc6089fa6ff644 *R/drive_download.R c0a80fda6bd07f85ee67f705ac6fa531 *R/drive_endpoints.R 6fec84cfdf12c4a6bd3cf30528e49895 *R/drive_examples.R f97da5f2c4ff94504133060efc908787 *R/drive_fields.R 9069854cae05b7077f690ee1328ed1cc *R/drive_find.R 63f882dbf2bfc1f321eb7c200c0513d9 *R/drive_get.R 7ee55cdf84cbadad9966cf2a492e50a0 *R/drive_get_path.R f410f75fceb66456f1ded73e5785c337 *R/drive_id-class.R 3fb2b46791eb9f7d16e09430ce3544f4 *R/drive_ls.R f6bb1caf57491b191916c30607f81782 *R/drive_mime_type.R 81838badd2e4edf10fb20becc104eee9 *R/drive_mkdir.R 1f42536cfc1e213530a2ed83149331db *R/drive_mv.R 436bc0a1f382d63a75129cad7d9a636f *R/drive_publish.R c65d3efca565f88703b204b28710d211 *R/drive_put.R 5bc52c22ef63c3c54f07a752c4df144a *R/drive_read.R 95b91505123223c7579c9b5662a4121e *R/drive_rename.R 6758e7ce663fc1f365f9a0c770d175ba *R/drive_reveal.R 8c6249360497b5644ad6d0bbc66c5d8e *R/drive_rm.R ac9663b2ece0f948c33eac813cce4746 *R/drive_share.R f21b30b77e3e216b695b2dee2923fb03 *R/drive_trash.R 88362b8255132bd4697f84abda452cb5 *R/drive_update.R 99ec83d25d405a4c1584a26ddf5a1f4e *R/drive_upload.R 20256c232b84c0e50813b625914ac0c0 *R/drive_user.R 46711812d5732722295e7153eef3803a *R/googledrive-package.R 1f17a4c4efd9f168bf03eb1b9ea67600 *R/promote.R a0fea4b8e6b320bf1d85e3249440ac20 *R/request_generate.R 7c1eba382cabab1831ea25974ad995b2 *R/request_make.R 2dceb498264815c10e146921907d08e1 *R/roxygen-templates.R 265e1fc20a7d9d0e3fd1c91f74bb5abf *R/shared_drive_create.R 0e450b796fb6e7a4b600aa157e30fadf *R/shared_drive_find.R 13a3214c3032fc1a29a34dc9a2d83032 *R/shared_drive_get.R b5d4555aac3a23bd3dc2b4c59e6e73d5 *R/shared_drive_rm.R 6ada27efdd054a61b17f2afea4d70bba *R/shared_drive_update.R 3b80a89dfb912b8b4ab899f3827640cf *R/shared_drives.R 21db78c120f9dc7aacb84c1fe6fe01a4 *R/shortcut.R fc71b4ce68cc6a05acec69e0d2dd7120 *R/sysdata.rda d7ea70af42def713f212a81014623126 *R/team_drive.R c4c2f30834f1540d22f927efd1d93cb4 *R/utils-io.R 3537c7c82c4d74aa155ef942c2969dd7 *R/utils-paths.R 8d2487dbf45064f33b08e5a80830b68e *R/utils-pipe.R 879e714654b80b512b91e449f51531c4 *R/utils-ui.R 433588140823a03fca8a3a868d13d7c4 *R/utils.R 0c3d7b27bca99bf2a64fd8b21b9792f1 *R/zzz.R 5265cd26c54637b4d47ed2658d03029b *README.md f9ee2ec10ddebb81c56a34681c885594 *build/vignette.rds d25118fdb496d38a7bad55b4d6a1185c *inst/WORDLIST af88656bce0fd2cf3c81364c2dabb766 *inst/doc/googledrive.Rmd 0a548da8f77c8807f6e7f752bb84fbb2 *inst/doc/googledrive.html b08ce6e425ce3b2ae8088dc71cbdcab2 *inst/extdata/data/files_fields.csv 0f0f5164e73bd195070359dc5c641442 *inst/extdata/data/mime_tbl.csv 8967d8837435a02dff7698e747b4e2b4 *inst/extdata/data/remote_example_files.csv 17ba8188511e5ea5579d6775df0d10a3 *inst/extdata/data/translate_mime_types.csv c1fe9be9e93f097020c8b58327d8e4be *inst/extdata/example_files/chicken.csv 09f711098341d950d21c2852794e5c77 *inst/extdata/example_files/chicken.jpg a5dd1e70d36cf44ad0d1acc2121fae24 *inst/extdata/example_files/chicken.pdf bcbd74e657a87ab5d6c200eb44acc2b0 *inst/extdata/example_files/chicken.txt 9b29bbf049edfeb4ad68a4c12cba5ecf *inst/extdata/example_files/imdb_latin1.csv 3f488056330c5ed3b1e9cfbe7f015d2d *inst/extdata/example_files/r_about.html 12f1db814335beab91f8d3b968396842 *inst/extdata/example_files/r_logo.jpg 343a68ef34a7a1461525cae18e72f5e5 *inst/secret/googledrive-docs.json b9f6c0130f2535a268cd9e299fda5800 *inst/secret/googledrive-testing.json 21cf5318576c54311468ecc1d25b5925 *man/as_dribble.Rd 363d0ba56c06b06520665f9e0555ba78 *man/as_id.Rd a8f748d5e5aa9443c856bab5d8070c78 *man/as_shared_drive.Rd e54c37cb1d3e77a418205178e6ddc2d5 *man/deprecated-team-drive-functions.Rd bb7c7bf8658e8860801d025b4ed430b1 *man/dribble-checks.Rd f3a501c97701390552085282264b5dd3 *man/dribble.Rd bfbb45af24d379da8118dcc41168228e *man/drive_about.Rd 7957be1f37d8ada755150fbcc7a76665 *man/drive_auth.Rd ab471c32e809ff69534d8a325e015af3 *man/drive_auth_configure.Rd b39a7962f20cd450d52d5be0ea64a03d *man/drive_browse.Rd ccd43553b75349ffb739a5233ef0a799 *man/drive_cp.Rd 85f5b847bca99b8a93f21c85ba3907f7 *man/drive_create.Rd 7f38bff3820201353ae358d4f330e7b0 *man/drive_deauth.Rd 80a25edd90394e87fa2e861f720bd21c *man/drive_download.Rd d360ddd6e94f6d17a835ae7dbd97e706 *man/drive_empty_trash.Rd 7284ecbb98b93b156875297c0c0ebe24 *man/drive_endpoints.Rd 28477706b4dd3c615fe7aed54d10425f *man/drive_examples.Rd deb9609318c4d1905097bf5810b93bc8 *man/drive_extension.Rd fc8673613011f6bba75d57f08a577032 *man/drive_fields.Rd b51d76713fb91ae58126dd50b7de2cb0 *man/drive_find.Rd 4f1bd35d6af9f392040d92eb4109c19b *man/drive_get.Rd fc228e2e9bcf520fa18a40671a810c75 *man/drive_has_token.Rd 4e48e950204fc836a411f4650304f80c *man/drive_link.Rd e26ffa5d5508e46e6f80fa5161f2f0e7 *man/drive_ls.Rd ce47bb5c09b66e7c63d20be90a8ffcd6 *man/drive_mime_type.Rd dd0d7cf246ebc2388647cc068f958fb2 *man/drive_mkdir.Rd 68bdadb2b7d0c512f76cfb0e4e003e93 *man/drive_mv.Rd 68bbfec943a602342573313dc990457e *man/drive_publish.Rd f1f8a9c54ccf70c284ebce17c15fa740 *man/drive_put.Rd 9e62dbfe19546ec54f5b3de0623f6a17 *man/drive_read_string.Rd 02e19f37c3af8ac9ed849c9c63efda28 *man/drive_rename.Rd bc7f0e73df1773c81f6b9a3035f08de9 *man/drive_reveal.Rd a5bd0216bbee1baeaffbf7b891cf0050 *man/drive_rm.Rd c1dfe70bcec8185ea57fb625418ea709 *man/drive_share.Rd 122d31ef0e5123a1831de069146ba42f *man/drive_token.Rd a2d63e924e75af60629cbba70d1fb615 *man/drive_trash.Rd fc87730ce9fb83cdc14a977613b671aa *man/drive_update.Rd 622a8428aa86785f06f7c52d5c2b1487 *man/drive_upload.Rd 03df6b1c506810022b8df50b29ad4b52 *man/drive_user.Rd 4f3e24b507f139585713a021aed616ec *man/expose.Rd cb1e46f469cfbbbde29c8b5113e1d789 *man/figures/lifecycle-archived.svg c0d2e5a54f1fa4ff02bf9533079dd1f7 *man/figures/lifecycle-defunct.svg a1b8c987c676c16af790f563f96cbb1f *man/figures/lifecycle-deprecated.svg c3978703d8f40f2679795335715e98f4 *man/figures/lifecycle-experimental.svg 952b59dc07b171b97d5d982924244f61 *man/figures/lifecycle-maturing.svg 27b879bf3677ea76e3991d56ab324081 *man/figures/lifecycle-questioning.svg 53b3f893324260b737b3c46ed2a0e643 *man/figures/lifecycle-stable.svg 1c1fe7a759b86dc6dbcbe7797ab8246c *man/figures/lifecycle-superseded.svg d48765608c6e23ce7a983b37d1cb0b94 *man/figures/logo.png d91782e5e41a17e0f6013a436c87672d *man/googledrive-configuration.Rd 7f2387c15f74153f6470ca6ae705c2f1 *man/googledrive-deprecated.Rd eceb068a810615291843da9e17c5c2d5 *man/googledrive-package.Rd 1f7896a1b866ff9ae89ba35be7c7b6f1 *man/pipe.Rd effbc9be84cfa70267016d65bc918d56 *man/request_generate.Rd bbe42c77fe483c437080d1f6af8370f4 *man/request_make.Rd e18bcbcd9433de39af9d8c01633a71b6 *man/shared_drive_create.Rd ae9429e15989a077cd8c7308fc484ccd *man/shared_drive_find.Rd acfe8f1c1a566f8400526c5521de22ea *man/shared_drive_get.Rd 9e2aabc05dd1a9b512876bfb28f84e3d *man/shared_drive_rm.Rd 2d315a9e0393ba606c533a65bbb0e6ed *man/shared_drive_update.Rd 293cda53550604c4b7365a4d9e22598e *man/shared_drives.Rd 4150f5167038d7716d577de8e50de1db *man/shortcut_create.Rd 534e44f6bc2e8511b80955df874ec770 *man/shortcut_resolve.Rd 0622a97a2aaa3c342f09636052c2d7f5 *tests/spelling.R b914f6badb3c8759a3b14db07d5d2727 *tests/testthat.R f8946e77a3e83d4bed95e5e5824ccb51 *tests/testthat/_snaps/dribble.md f56917d3f7197814f69cfc209157adde *tests/testthat/_snaps/drive_auth.md 2f13b2923a711282633cd48bda82ff6b *tests/testthat/_snaps/drive_cp.md 42e2ed96746c93c7eee9c1d593e95272 *tests/testthat/_snaps/drive_create.md ec8a64a29b2024019274ee1f47fad1bb *tests/testthat/_snaps/drive_download.md ae173804c70a7927b243e4b6186baa87 *tests/testthat/_snaps/drive_examples.md 075c658cc44e3f3de03812ecfcf0d176 *tests/testthat/_snaps/drive_fields.md eb08df0742621c4135c3538dd86029dd *tests/testthat/_snaps/drive_find.md 7e7f1358ca47af82cde1175196c58d36 *tests/testthat/_snaps/drive_get.md 08c878594a83ad58732783a6fd53f23c *tests/testthat/_snaps/drive_id-class.md aeb2916b07b699186e1f9b799b972130 *tests/testthat/_snaps/drive_ls.md 642af13114ae31f451678ee858ab44b8 *tests/testthat/_snaps/drive_mime_type.md ca788436eaac0ef646b94c00735b3b56 *tests/testthat/_snaps/drive_mv.md 27ee533f4b449b76cd78a3cce368fcc2 *tests/testthat/_snaps/drive_publish.md 8439d490260d73c3d1b53a87a355444c *tests/testthat/_snaps/drive_put.md 430c4f3f486280b7f9a0c1c0e0f35571 *tests/testthat/_snaps/drive_reveal.md d45ae9d7917ef296a8536835f34e0b4c *tests/testthat/_snaps/drive_share.md d9cf4a10006559b210ec6e830a0a49d4 *tests/testthat/_snaps/drive_update.md c534cf6b0679f825665be30a2521c3ee *tests/testthat/_snaps/drive_upload.md ff950ffc222eaa73632bc120d53c3cc9 *tests/testthat/_snaps/request_generate.md 57ad1c20509f813f372df3bdce05f968 *tests/testthat/_snaps/shared_drives.md f5c0df63e806abc451c9e8e71deb4c5c *tests/testthat/_snaps/shortcut.md 99c4aafcf064a632eacf88a1fb6be264 *tests/testthat/_snaps/utils-paths.md b280a6892814a55e855edf88c592b8ed *tests/testthat/_snaps/utils-ui.md f78b528b6e1e68de63163921ef22e4d7 *tests/testthat/driver.R 08d4c4599eef1ed4cb69e38b8f29f8c3 *tests/testthat/helper.R 3fcfe623c68b17945bcda282c619dd2a *tests/testthat/setup-testing.R 814c72bfe9d67c369cddc89a0e0a58d0 *tests/testthat/test-camelCase.R b0d058544682d58f9584b1f168bc1b2c *tests/testthat/test-compat-dplyr.R 93fda80c2daa9e77ce7acd7163fba9db *tests/testthat/test-compat-vctrs.R c072ea3e7853c87d9654f9d94113e58a *tests/testthat/test-dribble.R ba29324f2273ebcb6ae15934921454fb *tests/testthat/test-drive_auth.R c733d666aeb8fd0fd96f5fc5cc096a37 *tests/testthat/test-drive_cp.R 1c6b9d9ef5d8c528af067a903d9c0746 *tests/testthat/test-drive_create.R 35868678201e3be02b8cc33002a47ab1 *tests/testthat/test-drive_download.R 0f7659f2306c83c564d08a43daee3fc7 *tests/testthat/test-drive_endpoints.R 24c71ee4ed8ed5e5620f4be73b1ce3dd *tests/testthat/test-drive_examples.R f0a1307b2ddc3d49006dd8a5ab6b7ac8 *tests/testthat/test-drive_fields.R 6f4a0b5c4b446c37f90216ddfb387cb1 *tests/testthat/test-drive_find.R 1e8270e1c151234404c42a278d6b45e8 *tests/testthat/test-drive_get.R 636bdfccae9f3bf30e81242bc15a8333 *tests/testthat/test-drive_get_path.R 3c03913635500c4d8cba578d6f3d2f01 *tests/testthat/test-drive_id-class.R f6ca76076ba6677e4bb95901f9f8f85d *tests/testthat/test-drive_link.R 8de2ab0bfb55c44e4d6b93e45d0adc8f *tests/testthat/test-drive_ls.R a66b48e1e1fec963f0780df42fc3c8bf *tests/testthat/test-drive_mime_type.R 8ffa6e45390dd2c47d3338bc144bdd6a *tests/testthat/test-drive_mv.R ca5a683ba487fdee09b664c570f1678e *tests/testthat/test-drive_publish.R b7e0563574c64219de9f3f4bc7512841 *tests/testthat/test-drive_put.R dcf702aa069b7c2df44682799fdfde80 *tests/testthat/test-drive_read.R 207d3c6e046d8e9bf09782aea70e4608 *tests/testthat/test-drive_reveal.R 8ea4fe6a6b0bed77a1b21dee6e02d4ee *tests/testthat/test-drive_rm.R d183a1c5138cade9cd5cd52178644e8d *tests/testthat/test-drive_share.R 2f2b2dbbace100ad892bcad00a03ef0f *tests/testthat/test-drive_trash.R 1fd7d1cd852693f6973e113618a512e7 *tests/testthat/test-drive_update.R d8fbd98af48675b5666e75f24a3613cb *tests/testthat/test-drive_upload.R 03140ddb2597799652c55e9eb9ad4c49 *tests/testthat/test-drive_user.R fdf50c6e6a5881cd0406cc37ae101a1a *tests/testthat/test-files/client_secret_123.googleusercontent.com.json f71765cd43d799e2503d853b9d772e0c *tests/testthat/test-files/just_a_dribble.rds 21a9e853e89465cf4463260bf4fbf817 *tests/testthat/test-files/mix_of_files_and_teamdrives.rds 034c3a6b84348e85a35895458c541e1f *tests/testthat/test-promote.R 2e3832df75627cb28b5c280cd65d01ed *tests/testthat/test-request_generate.R 996d5a00ccb80bccb6e557927d38f205 *tests/testthat/test-shared_drives.R b2d15ce5f30e2f198faf6c31539f3474 *tests/testthat/test-shortcut.R d0ede80faeeb6fe5dd9e3c2d8f293278 *tests/testthat/test-utils-paths.R 127ff6d3a6ba2a43217b8d27ac9314bc *tests/testthat/test-utils-ui.R f125cb71d93ab52948f953dd5aa0fc20 *tests/testthat/test-utils.R af88656bce0fd2cf3c81364c2dabb766 *vignettes/googledrive.Rmd googledrive/inst/0000755000176200001440000000000014071433175013542 5ustar liggesusersgoogledrive/inst/secret/0000755000176200001440000000000014066520116015023 5ustar liggesusersgoogledrive/inst/secret/googledrive-docs.json0000644000176200001440000000444213460434413021157 0ustar liggesusersp&8Ը4x/d%!; ;[ׯ?]d΂&G_]Ҋ)21[*8Rߛ[֟WuՖ+JU N@zXaX} & ׍wNEj1s@wUkce$V!™#kC]b">x.%VY %u?ʿ*cC4. [ajfO}b28¹D߆NZ= |_ WngO?fK+%gT\\Π>ݍ)ܽt$r%fą,$oӑr酥(28^NpbT߻?%+сvJeT1uLe2cm/ kM糷w|V%[`6sAE04^/\"n_v^ ::"i8ZM6\mGQaͶ؍b,쨚CU|:Sy%33i=Hmh͑fM҃GKW[Ъj >`Dܾ[F~:e;fr a?rrFK{|8C{ۻ^Hf2&ʨV3h[#npkur:W\"\P`æ[ 2<i*.~C5ۙ|׃{oCOeh,٦J7 owIiiMjxJ@ ] ;x]I.= cmK*SZ*[h] eA%e/[ aԱdL},'',yнyC5%Ai?4#'Da산`gwP[L)Y"ulGI1G!_2TblXhnqiп[qrՑX U4Xp=,ccy3(.ZW :3>y6,&Hd0F <rnDnUzܠH&+<3|zf)PVQ$XTk^3 /}uiuVZ>joiQ>ynj3ynXy{H{vNۋlE~s z'3WGHq=yAo[O ^ I#˔C24YV&N'nq P.fw:ȅ.- Xl ͘b3J:-/7?PN&"*|r PH8:‹.IoU5+{߾Ul2*5n(K { 8P?p£,̍{IFnA&}cTp iئzuX\l@jI.Oݍvfg7@E+圯~뙩x N|pRuh$g?W4i%L] KaoU+7(^3Tי5Cen>?ϧ&DIT{$%^7O%=mA}( `-Pr׆h @E ߳mIJz~5 ~}ʩ}ŋvX}Be`PR^)v>nAA{Kk~ZF_mgf ܲc^5F"M%IAkp7iMD8.}k.m@vwɧ@sOV #|9N?$D4W`s!Vn x$2<]W;rED7LW-M3XON-WS=+ =3D{WvYӴ50{ PdBa' <.z +ϥ6{F\*{UJM8zq$J+&VqOcѿ띎dtla$?pRUTE~WQ%u<3o#0O/\ VDoŜwn"u4PV9xF88 (Srw nI(.!$%K(.<6w$googledrive/inst/secret/googledrive-testing.json0000644000176200001440000000446013515707526021715 0ustar liggesusers.IAr^ux/d%!; ;[ׯ?]d΂&G_]Ҋ)21[*8Rߛ[֟WuՖ+JU@\OpW7]x]._*De>p@wUkce$V!™#kC]b">x.%VZ %u?ʿ*cC4. [_jfK}b28¡b*rZ?v7tS֎ nm#F13Cb.Hr/z~œ]8t$D"[*ƷtZmcΩ._TjND栨9k>|Q 32Y*=OYXzkQb{ⷼd2|qJ,QE !_ʨ\gPIDv|X7ȼD45OϘ#Zs a,͐~}2ϕwxP?Wc33+T[*ä!Mآ!Ioc1pB([r@%+n2!J$].H`bYSs8C{ۻ^5c2*bUhՃKkD{~'#mAdG}P619#}%/~j*z]f9NJ]<' fQ_R M~tD($c05?Jf].YAӁ\^U>,3&mrOqZXF>`=[8EËx݁vc@{&f2!J浀{i{\(ϣe^%'D) Q$F&/}E=n>Ad8jF]~ӫO@{ncI5/䵜5޽[qD;MJ3mdV><`ޘHwq*RV! .B/ŸR *[6u OJr=]A !(YGT͘$i9EɇŔ=h:aKYyXbrqFh #[Ek #+RA-bSEPiXz!քERT#(%jEō]dv*4{3;T T(KW+ MLY@u4.2[ep\m-ZжI_-H}B9(hV-޸:zʕ-9_.b;l ϔʇze4:.Qu2P%~ ^ G#oſ5fm/T5ȡ0b{J#İOZ ; !ƃ5]aP0VR+_o>_5MʊJcTK[M'_ύb3+Ԋ CCEP*40bK5vJx }uq dN*9qOlud7S}{c>!#q—NZ'ZWvK lPl?e9vx, pX  L2]ZchvLmN2 Y18F!26$FMH' zjsQ-R^|G1>J~}la [ I0s"񩣚gd<"R=-e=I.pIxr]KAvW&RuؤUS? p9t!|o#0S7?h*(^BM)(a`(5u0M犫3H61}ONgq6q\JzDvb̈~1ᮺHCtc>Qm~#ځdV쳹5"X^^ZOdK:<_< fm+Dl} uSh; l? VkXeK'G0v:Hc"BubFzQ:p? iGEhI8'ER#׹6z'^!'4M0ABה X 6,h,f9B JssYxzb ,r`I#ma~r&n/kqn googledrive

googledrive

Please see the googledrive website for full documentation:

In addition to function-specific help, there are several articles which are indexed here:

googledrive/inst/doc/googledrive.Rmd0000644000176200001440000000071013370700034017247 0ustar liggesusers--- title: "googledrive" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{googledrive} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- Please see the googledrive website for full documentation: * In addition to function-specific help, there are several articles which are indexed here: * [Article index](https://googledrive.tidyverse.org/articles/index.html) googledrive/inst/extdata/0000755000176200001440000000000014071171077015174 5ustar liggesusersgoogledrive/inst/extdata/data/0000755000176200001440000000000014071171077016105 5ustar liggesusersgoogledrive/inst/extdata/data/translate_mime_types.csv0000644000176200001440000001317014071171077023054 0ustar liggesusersaction,mime_type_google,mime_type_local,default export,application/vnd.google-apps.document,application/epub+zip,FALSE export,application/vnd.google-apps.document,application/pdf,FALSE export,application/vnd.google-apps.document,application/rtf,FALSE export,application/vnd.google-apps.document,application/vnd.oasis.opendocument.text,FALSE export,application/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.document,TRUE export,application/vnd.google-apps.document,application/zip,FALSE export,application/vnd.google-apps.document,text/html,FALSE export,application/vnd.google-apps.document,text/plain,FALSE export,application/vnd.google-apps.drawing,application/pdf,FALSE export,application/vnd.google-apps.drawing,image/jpeg,FALSE export,application/vnd.google-apps.drawing,image/png,TRUE export,application/vnd.google-apps.drawing,image/svg+xml,FALSE export,application/vnd.google-apps.form,application/zip,TRUE export,application/vnd.google-apps.jam,application/pdf,FALSE export,application/vnd.google-apps.presentation,application/pdf,FALSE export,application/vnd.google-apps.presentation,application/vnd.oasis.opendocument.presentation,FALSE export,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.presentation,TRUE export,application/vnd.google-apps.presentation,text/plain,FALSE export,application/vnd.google-apps.script,application/vnd.google-apps.script+json,TRUE export,application/vnd.google-apps.site,text/plain,FALSE export,application/vnd.google-apps.spreadsheet,application/pdf,FALSE export,application/vnd.google-apps.spreadsheet,application/vnd.oasis.opendocument.spreadsheet,FALSE export,application/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,TRUE export,application/vnd.google-apps.spreadsheet,application/x-vnd.oasis.opendocument.spreadsheet,FALSE export,application/vnd.google-apps.spreadsheet,application/zip,FALSE export,application/vnd.google-apps.spreadsheet,text/csv,FALSE export,application/vnd.google-apps.spreadsheet,text/tab-separated-values,FALSE import,application/vnd.google-apps.document,application/msword,NA import,application/vnd.google-apps.document,application/pdf,NA import,application/vnd.google-apps.document,application/rtf,NA import,application/vnd.google-apps.document,application/vnd.ms-word.document.macroenabled.12,NA import,application/vnd.google-apps.document,application/vnd.ms-word.template.macroenabled.12,NA import,application/vnd.google-apps.document,application/vnd.oasis.opendocument.text,NA import,application/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.document,NA import,application/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.template,NA import,application/vnd.google-apps.document,application/vnd.sun.xml.writer,NA import,application/vnd.google-apps.document,application/x-vnd.oasis.opendocument.text,NA import,application/vnd.google-apps.document,image/bmp,NA import,application/vnd.google-apps.document,image/gif,NA import,application/vnd.google-apps.document,image/jpeg,NA import,application/vnd.google-apps.document,image/jpg,NA import,application/vnd.google-apps.document,image/pjpeg,NA import,application/vnd.google-apps.document,image/png,NA import,application/vnd.google-apps.document,image/x-bmp,NA import,application/vnd.google-apps.document,image/x-png,NA import,application/vnd.google-apps.document,text/html,NA import,application/vnd.google-apps.document,text/plain,NA import,application/vnd.google-apps.document,text/richtext,NA import,application/vnd.google-apps.document,text/rtf,NA import,application/vnd.google-apps.drawing,application/x-msmetafile,NA import,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint,NA import,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint.presentation.macroenabled.12,NA import,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint.slideshow.macroenabled.12,NA import,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint.template.macroenabled.12,NA import,application/vnd.google-apps.presentation,application/vnd.oasis.opendocument.presentation,NA import,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.presentation,NA import,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.slideshow,NA import,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.template,NA import,application/vnd.google-apps.presentation,application/x-vnd.oasis.opendocument.presentation,NA import,application/vnd.google-apps.script,application/vnd.google-apps.script+json,NA import,application/vnd.google-apps.script,application/vnd.google-apps.script+text/plain,NA import,application/vnd.google-apps.spreadsheet,application/vnd.ms-excel,NA import,application/vnd.google-apps.spreadsheet,application/vnd.ms-excel.sheet.macroenabled.12,NA import,application/vnd.google-apps.spreadsheet,application/vnd.ms-excel.template.macroenabled.12,NA import,application/vnd.google-apps.spreadsheet,application/vnd.oasis.opendocument.spreadsheet,NA import,application/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,NA import,application/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.template,NA import,application/vnd.google-apps.spreadsheet,application/x-vnd.oasis.opendocument.spreadsheet,NA import,application/vnd.google-apps.spreadsheet,text/csv,NA import,application/vnd.google-apps.spreadsheet,text/tab-separated-values,NA googledrive/inst/extdata/data/remote_example_files.csv0000644000176200001440000000114614071171077023014 0ustar liggesusersname,mime_type,id chicken_doc,application/vnd.google-apps.document,1X9pd4nOjl33zDFfTjw-_eFL7Qb9_g6VfVFDp1PPae94 chicken_sheet,application/vnd.google-apps.spreadsheet,1SeFXkr3XdzPSuWauzPdN-XnaryOYmZ7sFiUF5t-wSVU chicken.csv,text/csv,1VOh6wWbRfuQLxbLg87o58vxJt95SIiZ7 chicken.jpg,image/jpeg,1b2_ZjzgvrSw0hBMgn-rnEbjp3Uq0XTKJ chicken.pdf,application/pdf,13OQcAo8hkh0Ja5Wxlmi4a8aNvPK7pDkO chicken.txt,text/plain,1wOLeWVRkTb6lDmLRiOhg9iKM7DlN762Y imdb_latin1.csv,text/csv,1YJSVa0LTaVtGrZ4eVXYrSQ4y50uFl5bw r_about.html,text/html,1sfCT0zqDz3vpZZlv_4nFlhq2WMaKqjow r_logo.jpg,image/jpeg,1J4v-iyydf1Cad3GjDkGRrynauV9JFOyW googledrive/inst/extdata/data/mime_tbl.csv0000644000176200001440000000751514071171077020422 0ustar liggesusersmime_type,ext,description,human_type,default application/epub+zip,NA,NA,NA,NA application/msword,doc,NA,doc,TRUE application/msword,dot,NA,dot,FALSE application/pdf,pdf,NA,pdf,TRUE application/rtf,rtf,NA,rtf,TRUE application/vnd.google-apps.audio,NA,NA,audio,NA application/vnd.google-apps.document,NA,Google Docs,document,NA application/vnd.google-apps.drawing,NA,Google Drawing,drawing,NA application/vnd.google-apps.drive-sdk,NA,3rd party shortcut,drive-sdk,NA application/vnd.google-apps.file,NA,Google Drive file,file,NA application/vnd.google-apps.folder,NA,Google Drive folder,folder,NA application/vnd.google-apps.form,NA,Google Forms,form,NA application/vnd.google-apps.fusiontable,NA,Google Fusion Tables,fusiontable,NA application/vnd.google-apps.map,NA,Google My Maps,map,NA application/vnd.google-apps.photo,NA,NA,photo,NA application/vnd.google-apps.presentation,NA,Google Slides,presentation,NA application/vnd.google-apps.script,NA,Google Apps Scripts,script,NA application/vnd.google-apps.script+json,NA,NA,script+json,NA application/vnd.google-apps.script+text/plain,NA,NA,script+text/plain,NA application/vnd.google-apps.shortcut,NA,Shortcut,shortcut,NA application/vnd.google-apps.site,NA,Google Sites,site,NA application/vnd.google-apps.spreadsheet,NA,Google Sheets,spreadsheet,NA application/vnd.google-apps.unknown,NA,NA,unknown,NA application/vnd.google-apps.video,NA,NA,video,NA application/vnd.google.colab,ipynb,Colab notebook,colab,TRUE application/vnd.ms-excel,xlb,NA,xlb,FALSE application/vnd.ms-excel,xls,NA,xls,TRUE application/vnd.ms-excel,xlt,NA,xlt,FALSE application/vnd.ms-excel.sheet.macroenabled.12,NA,NA,NA,NA application/vnd.ms-excel.template.macroenabled.12,NA,NA,NA,NA application/vnd.ms-powerpoint,pps,NA,pps,FALSE application/vnd.ms-powerpoint,ppt,NA,ppt,TRUE application/vnd.ms-powerpoint.presentation.macroenabled.12,NA,NA,NA,NA application/vnd.ms-powerpoint.slideshow.macroenabled.12,NA,NA,NA,NA application/vnd.ms-powerpoint.template.macroenabled.12,NA,NA,NA,NA application/vnd.ms-word.document.macroenabled.12,NA,NA,NA,NA application/vnd.ms-word.template.macroenabled.12,NA,NA,NA,NA application/vnd.oasis.opendocument.presentation,odp,NA,odp,TRUE application/vnd.oasis.opendocument.spreadsheet,ods,NA,ods,TRUE application/vnd.oasis.opendocument.text,odt,NA,odt,TRUE application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,NA,pptx,TRUE application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,NA,ppsx,TRUE application/vnd.openxmlformats-officedocument.presentationml.template,potx,NA,potx,TRUE application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,NA,xlsx,TRUE application/vnd.openxmlformats-officedocument.spreadsheetml.template,xltx,NA,xltx,TRUE application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,NA,docx,TRUE application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,NA,dotx,TRUE application/vnd.sun.xml.writer,sxw,NA,sxw,TRUE application/x-msmetafile,NA,NA,NA,NA application/x-vnd.oasis.opendocument.presentation,NA,NA,NA,NA application/x-vnd.oasis.opendocument.spreadsheet,NA,NA,NA,NA application/x-vnd.oasis.opendocument.text,NA,NA,NA,NA application/zip,zip,NA,zip,TRUE image/bmp,NA,NA,NA,NA image/gif,gif,NA,gif,TRUE image/jpeg,jpe,NA,jpe,FALSE image/jpeg,jpeg,NA,jpeg,TRUE image/jpeg,jpg,NA,jpg,FALSE image/jpg,NA,NA,NA,NA image/pjpeg,NA,NA,NA,NA image/png,png,NA,png,TRUE image/svg+xml,svg,NA,svg,TRUE image/svg+xml,svgz,NA,svgz,FALSE image/x-bmp,NA,NA,NA,NA image/x-png,NA,NA,NA,NA text/csv,csv,NA,csv,TRUE text/html,htm,NA,htm,FALSE text/html,html,NA,html,TRUE text/html,shtml,NA,shtml,FALSE text/plain,asc,NA,asc,FALSE text/plain,brf,NA,brf,FALSE text/plain,pot,NA,pot,FALSE text/plain,srt,NA,srt,FALSE text/plain,text,NA,text,FALSE text/plain,txt,NA,txt,TRUE text/richtext,rtx,NA,rtx,TRUE text/rtf,NA,NA,NA,NA text/tab-separated-values,tsv,NA,tsv,TRUE googledrive/inst/extdata/data/files_fields.csv0000644000176200001440000001565014071171077021261 0ustar liggesusersname,desc appProperties,"A collection of arbitrary key-value pairs which are private to the requesting app. Entries with null values are cleared in update and copy requests." capabilities,Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take. contentHints,Additional information about the content of the file. These fields are never populated in responses. copyRequiresWriterPermission,"Whether the options to copy, print, or download this file, should be disabled for readers and commenters." createdTime,The time at which the file was created (RFC 3339 date-time). description,A short description of the file. driveId,ID of the shared drive the file resides in. Only populated for items in shared drives. explicitlyTrashed,"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder." exportLinks,Links for exporting Google Docs to specific formats. fileExtension,The final component of fullFileExtension. This is only available for files with binary content in Google Drive. folderColorRgb,"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource. If an unsupported color is specified, the closest color in the palette will be used instead." fullFileExtension,"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as ""tar.gz"". This is only available for files with binary content in Google Drive. This is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension." hasAugmentedPermissions,Whether any users are granted file access directly on this file. This field is only populated for shared drive files. hasThumbnail,"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field." headRevisionId,The ID of the file's head revision. This is currently only available for files with binary content in Google Drive. iconLink,"A static, unauthenticated link to the file's icon." id,The ID of the file. imageMediaMetadata,"Additional metadata about image media, if available." isAppAuthorized,Whether the file was created or opened by the requesting app. kind,"Identifies what kind of resource this is. Value: the fixed string ""drive#file""." lastModifyingUser,The last user to modify the file. md5Checksum,The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive. mimeType,"The MIME type of the file. Google Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded. If a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource." modifiedByMe,Whether the file has been modified by this user. modifiedByMeTime,The last time the file was modified by the user (RFC 3339 date-time). modifiedTime,"The last time the file was modified by anyone (RFC 3339 date-time). Note that setting modifiedTime will also update modifiedByMeTime for the user." name,"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of shared drives, My Drive root folder, and Application Data folder the name is constant." originalFilename,"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Google Drive." ownedByMe,Whether the user owns the file. Not populated for items in shared drives. owners,"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for items in shared drives." parents,"The IDs of the parent folders which contain the file. If not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list." permissionIds,List of permission IDs for users with access to this file. permissions,The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives. properties,"A collection of arbitrary key-value pairs which are visible to all apps. Entries with null values are cleared in update and copy requests." quotaBytesUsed,The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled. shared,Whether the file has been shared. Not populated for items in shared drives. sharedWithMeTime,"The time at which the file was shared with the user, if applicable (RFC 3339 date-time)." sharingUser,"The user who shared the file with the requesting user, if applicable." size,The size of the file's content in bytes. This is only applicable to files with binary content in Google Drive. spaces,"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'." starred,Whether the user has starred the file. teamDriveId,Deprecated - use driveId instead. thumbnailLink,"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content." thumbnailVersion,The thumbnail version for use in thumbnail cache invalidation. trashed,"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash." trashedTime,The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives. trashingUser,"If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives." version,"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user." videoMediaMetadata,Additional metadata about video media. This may not be available immediately upon upload. viewedByMe,Whether the file has been viewed by this user. viewedByMeTime,The last time the file was viewed by the user (RFC 3339 date-time). viewersCanCopyContent,Deprecated - use copyRequiresWriterPermission instead. webContentLink,A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive. webViewLink,A link for opening the file in a relevant Google editor or viewer in a browser. writersCanShare,Whether users with only writer permission can modify the file's permissions. Not populated for items in shared drives. googledrive/inst/extdata/example_files/0000755000176200001440000000000014071171077020011 5ustar liggesusersgoogledrive/inst/extdata/example_files/chicken.csv0000644000176200001440000000056414071171077022137 0ustar liggesuserschicken,breed,sex,motto Foghorn Leghorn,Leghorn,rooster,"That's a joke, ah say, that's a joke, son." Chicken Little,unknown,hen,"The sky is falling!" Ginger,Rhode Island Red,hen,"Listen. We'll either die free chickens or we die trying." Camilla the Chicken,Chantecler,hen,"Bawk, buck, ba-gawk." Ernie The Giant Chicken,Brahma,rooster,"Put Captain Solo in the cargo hold." googledrive/inst/extdata/example_files/chicken.txt0000644000176200001440000000024514071171077022157 0ustar liggesusersA chicken whose name was Chantecler Clucked in iambic pentameter It sat on a shelf, reading Song of Myself And laid eggs with a perfect diameter. —Richard Maxson googledrive/inst/extdata/example_files/chicken.pdf0000644000176200001440000251362414071171077022125 0ustar liggesusers%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x+TT(T0B3C#sK#Tp<ԢԂL33S= #S]Z3c= Ks3\.}\C| endstream endobj 5 0 obj 83 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] >> endobj 6 0 obj << /ProcSet [ /PDF /ImageB /ImageC /ImageI ] /XObject << /Im1 7 0 R >> >> endobj 7 0 obj << /Length 8 0 R /Type /XObject /Subtype /Image /Width 1200 /Height 1103 /Interpolate true /ColorSpace 9 0 R /Intent /Perceptual /BitsPerComponent 8 /Filter /DCTDecode >> stream JFIFC  !"$"$CO" 4Zy_FOS94?g f@/m@&4`9݉h9 -W6e[BkVo@;ZJ +yr՘vj5 k^N;`E0e_xb~[Ί|,3B4(u꬟Meh&-`9Q(ZIhSV]2mZ*FWΩӘ`QɐRRm1~9~)0˛qdtzi&OS]+uK蠳6 Ҧ0Bf쫒}i .M }>עkDdW}d=Y_ ʢޥ\ZXd 0[ mȬ4s ٲC0e:cYnuʺkKeIIl7M`ic:Zd꒩6(ڙ+J`s*JZkSfRu%Ի:),lej {6kE]KrbgNx;9n:r"о = /U=UtF3W.C:]+x]g,"'Wo%ӯ% Jq4V;mdU2n2yREyJfp]xm\M@P= 7bD:,Rm&DЧ[fNoVmiFt[us 6B{I*RKq[<(N3S! 6 LT)?A;T0.nK-ه3{  ]NǠ0NJ,Uf( @s7V "6V2%A)UN,󓙢^d'AˊP&?T8̊ _ jFp t]nR]hˣzV}Rr,/Da=T_jfp[Le 0 +Ӟ2Vg[>0#Q4gU/]lYZT׎Ԕ(\ᴣ؋3z:T%@gUNTzOk*˧<ީC1NƎ1|>tS,@EaJ^2P7Jx.~=0ڐnP#`s[s9{nHa3/c64.vbeإH|Eõxc^^VS7XEdje@wg;ɨ#%H7QYh̟+DP.FU$bNh--˯#/rtBOWOƑEqP-b{8sWOKf-ǯL"䪼 6)wAWj s>M#-m@OWsJd.{* Rd(Z궓rq^fA.MbU%P[* $T#i0qS(*KSSZ)pk6K CH$PC!(8[߽U?MĮ]xGyUٲe̜cZ`-VB5ڑ3UEaTi`6͹U7L Bsk Yz.dؙAYaLm+TwR0R$*FZV0Gd3 U2l5:+x1 5ݤݲtisFI(}3_Xd¬eR.^+3<ZU<5By*iܚ f(.)4֑q%vdXrE_{JzNL{M/[,mɝQ& /-wl{LֹN x/ҋ'Q'?K֪=i \LSL0\Vbu}$#}:!z&B fl94Nv1tfT~ԋUXʳ`&:r>8IҥLBL[s@̛ r[I[Dc٤E]cO TMN!^@m#3Fp)4ӉDs}(_[';yf$J MexnזvCNbUkR9I^7Fy$j-Af èhށsO+0Ӈ\\o+[1\k&њknEtҗ":͠&GmIO|ID5-+IvLx7.-613/(>*#Wm/ l# 1bT+ji墳W[cY7VuΔSC77x6D.7\RNxVP5*oSJEDy9Z7vrG M *9/f sBf?nB9ȵ 6<;-ρByz*ϲS^K>TowD]0hHךJkYVMJkY}@t2|[y^=N(5v~xrvU  pH 7@* *;S=s6cqF4`M#:x-$}yފ#B֕s&ް*.X[Tشh tTà<׊ǧ!a~CnUBQ"=&KeI+MGy(5΋ԢѢʰ95K&wM>oGǥO 2͊;Dޗ#ɠ)~ZdJ%F`YRLZѵ]z?5g`7.`3ru OA"=8,D׊~Ϲ|8iԂO̦be\PVG9+D]eR 2sJ\׋23k U8&kQmk~>&ӳ M)Б5Oaz|2vX讦tYit.|8)g:CA<ә0K_U:T/ cyގ{O|'%<MN&jheQcPt\d3(u W㛺&Nԩ3i"XZ#~kcsG>C2N}{;s&~jH@9R¡_3,+GUk βӳ3GX'k7%=BT4GI2ƒuj惾77&W3>[溗Lйb]?͵!C;B4¼g4u&FpD(<>v]7g7O>(SBݦ-P{%?֨m9Atg#6x쑆LW/}+eYmkzrzAzPEYѱ+Lpi[4!V;t/hbc"9R6yJŒqNߕbt`P'/Av}I΁a յQ$ucOGNzN/kaU]H yKO%HU湌5S,Y6iI;1V7['q59oVmiEL}@1[Dk^n**|}9/5r:z®ȏ,0yPͽQD8i@7J/RosM2s}KUBXN;\Nޅllln6YkϪsjrhu0HEJ=#9ӫsEOk~mg,/%Xs*nNV M\nԔNZq8/z[n6Gpʪ1'z>^m#PMi{Bnd: bMjiZ7jE%u@kOyav\T C%'6)yej¤Na&eo9UUs˃  3s"+=*PyZQT?>-lDQc>Fa,=%S6Vf`IG%g| ^,܉1̙&3ܔՆ~j-tt(#Es,u:h B}.E,@)z Fj.40}9kV\f lYN;va S  T•Y$bT_yY|#]}4CstJedU|GUY]H@-itF^Y >Sm)J_ A(ƾyX{NtT}P>E?rmcʅA]_+xhf;-yM;:jVBI9n-LhUY9V~)w)≲hl#TJ9t# F4S|l5lJ&C,DNac%Tu-g;(`fEm6:$Wd I/6UG|!=ָ*"CZSl'ѴUJ;nU斵XuU)/êX:ƽ鲁JkWF;EIKJ;*EPɧ6v#s'Ҕ35+_EU@}ĨZ&1Qp;@S^?@:<ѶmouF/1#-hә4䠱,1!U+/ttx4YlUz9'PS Y6v HȲ*SV>?/H|//РEtf9='V:aF}yHҺX[_uF-7lURAykJ3MɤӪ!a`&:Ӻ`)4:Q32R'vض8&ZOyt†%lsTF>oS궒zQǬX{JCȭuNBSV/ ? */vWEYDmξ jc^Q +1B oЋ+qKizu7*\wdz6/<{g8]s7,,5`6ƴI6ОhjEB 6|qZnLiUO5,_=E.Oi_>@d7e}tw @DGO{f/zGړf_.6R<d07RqXu$oAEUL$ĺE亩̟z%zZtY%YBBEyTXn[(&}buԒ ϙzE<5Ղ0bmKsJy@ ʁTst taX|83}nQ|q4` "My>IiΘWdK P@s\tDV7W4N`P//&\I1o^N7t.f}jnxPMB#QUg%WbUft `_.>'dO |D/ʙ-ZR[l<ĘnFGL\r hrtZ Jv.j6ruWi APIͽ\05Ӕ) ĩwiQU7< Ua;lx3΢Vc=]}iZz7S#%jbL+3z'\LF CzY|VUh,VOW*7jitc73kze%A5ydI[Q(}B͙uhUo0L-% 6Xf']Hq07>-ՙ֚1Q[jv$r\z9FWF3+ӛ6&$9Y\<_" Dz5nWUú,Gr%ݙ!}з1E_7r!gej^0s7=Qu)+ ]UdQN /[ //@8bʻ1%BYNʲu)+|-ߒzi-҇k3G]2 Fu_YZ؜%ŮnA'e$qheՅSXQI`›PϪGXm9LAQ.tR*d60n8,T ;uy2Nэ(XXNcϤ:2-Ls KWg R%#%;IdF-ޙJ0?a?<) iGN{|$^lx@M ˻z4fl}N{'SLⴸc=\U)*{k^s]ҹs6:=yX=fywUЭqthIYS7#xuY~iC>T&촥J;dC)Ȁk:1]tq, 4/u(fKU47 ;ݲS1IyIḓLNt]4J4`B=|E GA>vr:f!g'Tg=il: THAJC (~~(mt~zBIQtbd:iZ]* OMh˭Pnh;IY{9t}e]'aDOKG dӍ:hcx)jz\e뗲fKEξ}%q>9Qew{(ԛE'QN%D>oH&`Xq-&͡Jl3-3R<2ߊ %a/KE=2Iۈ;G39"^rؓUyM? kO,D#*dd1*aҟl/=BMFB"r9:JnNJUGœ}J/-'Bj5*21H S#U5e^0B҅>NO^'ㆶ1#WCώ TꬮVgZ*&f^m {S-$)۪GcY-i@yi$'_fqLAydzϮD1Y9 '뮳:A)+FUb`B"!!—sfʔ L{WU2&-0Ti++Q1(|kAttntIee])ǀ`yL9`Yjy]x".\ؖ|\yctKgvf >74ƔU>M6]5rP;Yb5gJ;.H `F4vMKKD/a-2l֡sڦwDiJjP ht } VkZ>@VuHtFTz䠍Lw7o;izԐQ:@4l8yMC ´fkkOGaPJ6ʬ4ZwJUنJ9UIubEgy%Ki)DIk(E;[,^M_sLm@79m_^49Nci&yUThlX4fk"i>{"ev3zEUpm6ʾ X+V~snz}KW΋3,1M& J5.ftjS9;.w-:4 dWEXUdx }H^IotU|s>0hhIvTپwivڳjtrC:~%k/k+&lrLV{r8M">Rd*o,JϨRTBE4tPm,* S%ﺑJ"~\^ˎ;m6/)[~~vK%% ѪW6D#WN~~Py8uH?E?X.F:եK9_k: 'yYbA&uN^Nf($է]VLnx3Fy=KVA_Q:<'C4I(>8Y/ŧt^x*U_optG=ToMIjLKOzJ,^( &rwܸ[:'&4>uH{@iUbYw6U&9m]B?4"H1a|qV}}DZl_T8&Z.uۼits=B"%q{ J"(DWu&=[^[:B#^e qh#_]X9LaZ"Tԝ[ݸ\٘מtxm٩_|ہEv\ͼ(42 @`{kD] OK[I] D/&my-&R EQp~[ 2VC`tLV\gԽ[zBT*.?S:հ )k' YM~N&=B45By=|-eUjS?dIyeSKQ|n=F&ѲsvSnt tϺtu~`L(??lz 闻&/gg*K~g rA-r(* pI.ɶ~疜95N:ɾ|YulcڨmҊ1Tym2E?:=TQ#`yV24F.(sk6iYC7י8>;ӡ>2/A5=Y*=+dLCN(Ɠ;Ҝ݋0LĠA2{EIŔڹFs5/q]A?H"RiJ-dQcNI2(OТ%js2h'XՅr^\ԍcbOIY 19u]n+&nrNfэf_ushd%җPzPP$C(mB%SI]F rAt4s9JZt.d]Vpze.Yɖfzg $C^Ql6"CD,ŬIzuhQϓ՝J|0j3( TBF)!MU S'^imDT:)2 R,56i=U$=tJG,'\Ru]$+1VFIK ~v .BוVmDygv&M?Q76K3#!(X56u 7(u1,ɵBU5j7fN09*kX f.Hލ)OQDcv aW4MҼZ~H>I,AձPt ʭqI{Y$Z,9.2 ;?4lͪ|ir490ALxq&*h,jGϛs}41H11vlԎ31F؜Q7!٧$´ F4LfUuPrjM:\U%RЭ S;1!d ?[mWq%^W}vʖ3 Behr5?8;+.s,o)NeZPil0z>[,ՅZD9C2őxչ;tX kIdǪٞ+)E[׹H^g,"ӡD@#E/z9'+4GSV`ث1L uf곟Z#-ɻ%,bHJyO2][};,1mu%dLFYrş&֚Вi46%|D-) /|ކ}OhM*Ia-NaU|ٗ9ނM{h* =I=!M&2Ez>W|,B4IFP/JɕPpWڅD4GX:Gzt\EpQP V}EYt348i1¥*m5:0wrW#| Q= @4zi@<IV7@levl~wJWY3F/S?24QRg__!mi@n*f2vyGU:: Г8W f~^N1vR0BT;WSt27 Y$y>nTʨ4e Jכ42}&5%q _bt+}""&b\y{>8GS5Qg e[bF ^ZYS{u!FtXYZ59o~jTmzk5Y,Gms4[t,zC_c)\i)cK=]&D{$2gƖ1Ks\V$&Ze&@c' tiE"Ӎ(:)ߨy$u F|Ӎ'J u5J]nЙ^~M|KiPyfCKOJs, '[+u h7 nzRXтiLCh3T}^5S#ϟW6ВSz0KSI aQSyUKV*f'6g0|E1\+:GgGMAYfWT D`5Ȭ,&y:#v[Q'lQazo_6JYSՒN<α#!.hUDXl3p/ϱ+lb:I/!ypѷ[]RWoR+xd-Q,Ljs5fRDL=T\ܞ'K2o-VX$5t>hsJ{TY֞XW1Lܙ1 >]TRZ#V@G!zUF8:gG9ސ\uHDg%.J62آyڮ2a'yBYaUy;+T@/7å)܇i Ƞ+un|Ѯ2W ӧ>|v̷J =VryT#RZsDQ?(6% :9X>9q}kh>iPf_[UiK#5 3pX:vS2r86EB$sDA^li[iz@.5bIJt" 0l-N`,(|_z3jV>AF*;.@UY WXsDH\xtG |K749c/4goE'\rnnayg瑪]0J"eeUɞ~yїTD@tԜ-rC]JܭݝRmXYvO5Kfd'3s |iY!^ԫQ/^Y7o4@%BRm]LPv.͹fhjZʎx?8=US ˫nx,"8RX>&R/Dh1`6?xO>zhʏM:+q>ҞAALMLVo1.nM+Y%Ttvc8R]_91< g*:13!AF*e:.}ʪQꬰkklNy/ϡ=iImq*F;z+-u) V$4h6yyܞ[֓Si6EJ5-N~+2mP+N\WjUp˿#m?pcIs*GoT U șQ)v NsX5md+AYcϡ"WN|.Jc$rʙ1|Z+CgW^ߔP)*-1BL< ꢇ(7B h*éZ]Cg GſAԟ壏F624U[]0ܨV!r ̿eb'%>utV;M+S^,HsN(٠eIh=AW8͇h*)AV(-]4Ζ;*)UjDL,/*% w)1Y\vy|C2t~~=啭&--SS`]JK.aZhMg RtǁM8wK|tC{RovF1թ3 m³s⁃XvTj?OʹeZS}ji™Ub{Eʺ2&ψ0WA*x1TZIgʬE(8 nih\ɞJ7AY!MuθU'1Cz#9+ ˝:8ym+/d!u l ȩ#d"7q=l.y<;\WqIY ,>ϳTфG]8P G)m#g12[AʋPGF z\ 5D3F] |T)Si6Tvt\ &5nbr`ns2e)j۝19]İT{CJT[o!ӜBmdL$;yޑӧbזYzzdN\xvҠUc`]ۏ% _uG{"QwRi<6ijMefE7J .除A(ox;>7aJ<ơ6{~)F M5 FC}$Zfk\ߞrujmňqכj5cOn''s -SU fXc: rt-h^ߟy*T_?բs8[;51 "LAEÎ5=5: 8FU$L$Tּ zyIH hQvN *ZJ'Idg V>T%ʯu!vt ˣژ&i $Xld阋KN鼍(BiʩRz.z73r w D 4=.*s 7pU>\6 CZ}e~{i:uM0gjFә=-oS\H*NZi-4W ;`3gW5|]B?9ze(v ;銳8MRQƂ, s5Rx>Zıy$&`*ȚYJ?sWh2u~Hvf[(S̽7T M=je:e,hIUT vW_t$%p.~tLNg tQPD<@ʉd2_(QUD"yh]F\XWP#dTOtmbZX̤tʒšXu^M}t>:Vh[`'9I/CQ\?nXްYvd;5tK#OsԚ&Q#]bQ,㒒MNq-Fyjʍk4#0 TX dԳtҏ:&me5vPLM:=j>[3jҒ}|<*n;yZ$q0YlZш-/1U]Rxӡ%}-)N=At`őNB`I$t:[LGHt* UI1Xe >X9Yd^Vi6$w$[O:ޚ}piz&D|,I"d $K,rziOZuTIh4cT1RQSMŗqWqrr^f(t+-pz.QtzV9N1>N3sAJ6ВZ(tN6G6q:ӘrmסH!,M138,֐it)zvok,=ۜ6csiJn|ʬJXeJj_(tJқ veog"ԡ͖:g=7K d _6@g9IA&28̖:qMՓ^Te$ql}Lˡ[i_E]c+onuΥ.x3E:-qrdV[8h>ĴvJVTA?pJ]!DJ:3bLlE%%g`sГQ ~r%[VM0YUI.tsR=j5WCѝy3Zj6qrתX#n-TGNז:f-AEըJ8WlOM:d˗y'ўLgt[&ZYKD,3\vZ kUo:Ԇ۪fOK|5qt64xP/wd U_?N;X_jӞD]xKS)0BiךIZosZ*K͔@:tW-FШXW>"ζVffz~i>^AۚLj}YyiʢCHAwj@X46 2 82^mJME~Z~"yӬRUTI8{P1@!λw<ɨ3]+&_HA0]&ݥ(ލf^K\UT}S5sfa_ v8Kb_`|:FzLRHMiUNFk˅eqD/"bP'.Z%*YEʾ='NDߟ. t#& jIgI,vMoOIR̈́u3<_ۻ*stuv6Tj:#:(4 X9bUG'PZ750iQV9WK:] Ⱦ]{G0ŷ *VI1-Hlx E3g6T [IJ)Ml(f G@Aoɪ<䌶4(B؟Х nWCvdlP x [F Utrʙ (seZnB̢GȽ:n՜EDB-|)eʿ Bt&Nq,EM sFB^$+1K-F[w$r`'0l2K@7gjT0x1P8Ufk˩ &o|~9{?.#"$!%32451ADCBo9u΍CAúse4, ӟg}tk7tŞg0_n:'Πfrog3v=GXh[䒮H+GT;=4e =JG 4}2-Y˜VW)Ly?GC`cJt|SQQԔ=HFSɤsZg lvOs~;_M%T=L| g*^\*MP~鐺]{>ΌRBH] V.}+p!M{E,;[o“OA/5(Ք&sΕx|:"gl+4i,9̵OMh:P"C@#)i/y޲qܶo?,7e̬(6ҙWEtb1u.YM?9~:q6,Z~&fEQWK|S+܈r3oG]ʘ9Po]~-y6TV[OgZCtUrmxʪGՕn[G}.E*ui 53%z⛠^9ZE5̺wjYzQg߸ ]JMʍiy|u 8?"p$'')2RDB/Yisj'כqk]~?eXDWNq*] 9v(ޏ>tƹubsZ>-6AjBXd,VwRԄD`%f ǽZ~|`gd7*}Jt{5h 3ry*fd8WWhhNZg1E'ȹ|Z]+W`9&(aO(HrS<ؚ. ׏yuj$ yҤMQEB11+ &2 t2N}IussԌJR~wCNfWHQzH}y+˓+?`WԠV .3_j5jZ!~΅L].jM\84;S,ur-$4'iMZ'rjLISI\;,B^J v6JkThUp(s0 u&,-&}͊ɱLԜ`^KܵiXPf^WRC1Ma._Z??g0N]kץ[Nft<͢U}oҡBcH}C3ýqՋ~u&.*FX;fop7?ohn炬 z%igS:zzT,nتan 3u?YSOAj' IrÔa$4)\r%%}X9)麒Gr/:jm1̣h_XH2ɨ)_0|Ozr+`8Q q/WiE/5~:iWf?O:yw3ȓ.gqB4UlI86ډyھq@#] RNϕ $1|mL+DS͈sQ/9b.bk*Bw@\ <]`!gh_X,G+OORtϽԟ'SԠ]D9HމCoRݽzCM_uռ:uFe]EzvX-`΂t g6rZ-Lnjtu(k5SxA9~օ0s~#n,/͜[FO ɭ4?o)*N-E[AE;- Z~9fAɐ:}q|򸮛궦iKCё|c 8Oz ^R(?&_>Rw?7Kth_ٖ>#WԒ[J]닝 *ytة9לiI|͵:G.siI!i,]WHq}q9. K1^72&+I%=J^Cޓ[J VA:Lpfhggy6Mba + UMKQ72M<迲[Ty?HQ$d4.]'r!Y$TLQN_Ⱦ3>fm瘒w>r uR^nu23;IN#1:tq{t|Zŕ/7JV٭+ɏW~BY|a0eg{ P\ԭ"ç*z=Ljn~F.ndl: 9Щ,FYg(0:;ͥcD 9C)S勤Fy9MP>[\dߏ忉b^09|q^ [3SG*,j]zerit-ȼk77x'%> bEGMx@.,-\gZz?b4 mOL@\N4Odε]'}&ʟؿŗHN{W_FK!wZ߶mU"|%/vq:&Q.Y~+Do~r Fǐi/DwZĆ;wBIDOAe^}I҂|[!Xd;\=d6ZP~5Ms'W.wci@L꾤c4zg7A#1" cN?iu:ȇocS,'/E{?gzѽk4|AMV <ϕrPx/)}D͆~jZ[)u(J)QCT1x@%Rib,ʳd.( ZĄ2Ǥh"yK=>s?1LfrXĢwQt? .^gG?&6t\wSjzg吇t~Oѕ \-UҎT@3sCyVIM7_Tk lVzvzNԉ;)&t|:t_QlW5KHMJ >$h`:榣%Q= fÓ!:AԮ%NORMK"._&gOR(/a}JAz+Hsi,/=1!mz_9lk!?3 d & f^|X[DYÞwMN7J̰5Hk4qW/ʲ9c!V:{mPhO]f+}<fU{zVMneɷބ.#XWVBn7%__w7L~T&W,z9|u>U,C3Y%B/ϭ ƍa`!4cFnLaH OԦ&̔ò&xÝh/ɩNR>36J)ϞΤe FiΛܥwe›jDÝPw iI13K@/ǀe}˱KTH1ܱؽPe_O^~WTԫ=^/yTc&>W%ש I:*ъzM[\iڴDNDʏLYy(΢RKIzG-B2a'0y`,o/ G3$B76 2\bh >H-4{ЇlXwP9R`Ώ^0~-68).ѥ+csܛԻ߮|&Z'T[M Rʪ tIpzSko~y|K jG/1=_ψ r)Hj5f`Ǿ.E6rsI7@@ҽOeIɳ%iKW/:GIGeNB)}Шgΐ6y-9tZ7Grj575HPO! {Vk[KP{q~GB(|S@|YG-u(\YG2>p[Lɒ΅G`jy3R NJCX\1 )oU(\× >Ma4 iZ‘n]Oj& H]7{EZvʜakw[lJLٵj ,֩\BM9&RiJFŕ4d:0ƴ=2 uϫyw*:֡ kg(puj\E\A [Nzi%~-Ke3ʥRNt$/(Ύ S3I"N5a?p"'ʄuo3[S5ʥaU鳰Ů|垼`\hVCy?g|8GBb zO,fQx\~W:'gvz0 M|4E Ñ.+y RfbL=H3Ң',)P4dbfqy Ag#yݾlq\y $ kπ[睧9r&/9=Q8ۍ/~ h٥qjN'U Jp[ l~Ps皆K4>t}ҧL~8٣2ogkP?ecI~P3&~ssA,>d? *WβG_қex?,*O4I,VknV>oU~'05EF0Q>4r"*o!{L!:p% q헟-y9A G,B'T2iGWϭ!ts$>]s%.Gz'hp<{qHXA>PI٥OR7@)sZC0KP0^%oZSg>-S 9oJT&_aUiD](3dJس~WTnUfGϤ3ƊM?Jzs L jt=9Yth4?M_N+s~B{k藖H 41њxR|[`n6\gNf9\! Y ݿN|Kw5*q syUdi>c`DZʏj1Vt/3 LϕzT& 8l@dL/}_ ޮ9YЕ9AZكLIO):=5̹#tn[Y Mz]G6ʉn._y$y8Ky}PfU"/ҔO 1y_1J<# rccTs9L#\/ЎOiwFJr~,W8n;Г4)B8ذ3DK}@At_so.M7A AW|HötC(Mj)'J&?,^x%G϶, +\ e5dp 2$Fc˚tfe +2[Z;'>LIOŊlQ )\.^ⷻ"$n3p/rL^tpgR"ع5%BTM*624\KY>bAYr*-޽ "Cգ0N|dwFaZFV"TsTZRNN< -}.yaNF&T|$RcH1T|qkKRm! _, [ge\mam~O/;g!n*f3?(>c,LJ:HQB:E+z?`Y) Yji W2~p k G&|+=]:gT`=)W栧D>ܕL"bJJ8{\o5_TuUIR (Qst9~=G\r5QJ>4?*EP"tfheyricB~ug=*LaRF>9"ݥ;(wGL%~|Vm%Js!& 0֜[j&_vO, 5OJ hi\̚3dH 45DNG75[K2z$@oI8+H%<usW0 <9~>\k· M̦5ǝX\@>ydQwS+Klfޚg[CU'wP-Q*kuhܬ,( FQ|QnE`aR?^|)TjXO/gHơ$v/bֱ'R,R&Ա))>;&OGWX>Ns$'hb%ZK}频JDU8jt`sXiT":0(uC5EvBӆq˒߿NYM[߲hEH*'}Po+HHJG.J%DG7_y6MʚdP@r2ԝlsD\T&zJ*V F$_;j煋DTo It>ώ[g@#k/qI>lxCɩbD݈݃R[Bt&GOtH+*u)?'q>cJWG 7%>ТtxӜa] lC7H*o Qxx9EVP_q9hx"BpOi*Io]IȔVkW6D$LԢF\H%LL}+FǛu.c'lR,JϦ[@}W -1ȵ_;e{$:*Q;.d쓏FĦsVPUӬ)y:V'oAy+n椪J7qP'OFu?B`}z \HO\ِ>:$? %2syCj߳OF7w:TM=55(M{{(ZP:syN)gLt ,J(b_Nw \(܈Gjk-xuĂTb0L` n? xH+D&A/JXܛPiJ'Z%F._"T*w5+5\`󂷟@".,ȂOke( `!̿.u+(ufӔL*oC)j_-JaY]`3uW-a}$]Ly#7Պ!TC\ }qi:ZY^'%^|-cWDyşfnu9T D ruG?\S)|V;=9Dampw4@З|oƣyA;*r͙\.`XL?#19dQP 1/3kW cRLPTNtB=?F:®z 1i`g6PKVX%iuJk4 }Zh}>iDws'V'=VG+p|)bt́>}^[&Cu- ӓ޷m|S?+r566^sl9Ny0/p| ~"+󑬰y&PLB>?"@$c>C#W,Ov&+ XUDTFġ'MB}!*Q>H8Kb8R=g~S:,坦l\0$_EUMcwDuU&wZુT3S"-e#VCdWZ2V7ǝ~^6ze/Y>>(}=h|7.\[Bya(}\c=%?͋\ 2FɧOOT8*OjU5J̸%6NPxmE;4ǷAtQ%Eu}ЭZiꫨFGTS&F!*|ٙOy ף=g;/CĿ"f$1l,T]\*@4Cl4qFJ1@LlxG*HboYPA 㭾VPs+I'^D[A+tsd>pɰ|nps VyK.1W |˓ЗL{|Z1/W1"d_jRCʐtVtDv=2- 6 NS5eZaz Li!olR}Czb> ֩zj{m獳EKdsGͣFORlbYBuO;!}C3s&Dj#u&Z˿nI(J9g`wn_1|r yd>63$p ̬OĚ1PobzΒ}jtPmtXK[N ER}|ޞ"LEVM_3]inS$Ŵ_beb[DabiinW}~ܾg߄s΀MK;Z{& S*rXc{e/X[3T3V]mZ"I9'w\^3,¦y!o,Č܀w%þ35Po_Ǖ~)yܬ\ Q&I\_4B+R_ҔBrjZ.|ΛEMog=Tt9!-إ+?'SfgvC~Mvm:y}//n{piv_UK/mwCa3*P[뼆iz*SZެŲtlHC0"/=/Ӊ2s~"A9X3~SB|92xf"qo I8#KvE4 G5(lolt7Row.z,Nڥ8cHR=OC=_nkS JJ)dRMOU_ mEvB"m@2jzlLhL w-t>+̥Tݬ'dF>c)ں1'ͦ4JՋ_,$=p%Ħw4H7% F,Ҡ&)|oIrys?u9V"/~oj*DĮ~v¥xM,K$b\8 g $ʰ_,uكx:U ayRkb3 (Xs/lOĽͤ{ VKNPaAڇ¾x]5vVB]AtWח SE#?o[7:,1nj:+',V s,Gm$73٥2ulZHdi RMR^trN~CJ9o;\`lqtGzE/]5n->QsYV~vVh@j kTKgSgߜ>J)h #&.փ!G1Q7cQ+sjOFrtgrb)RQӷMzD(jo*R/ב$TUn&kM g ǐT/2#RpUSNbGj{ D/O9>XJWsZEGԢIV$LGɱ_x"̜YCHzeVĻmRjzwLޏ~a|?ᨏ0Zҝ,::igDAs}j|t"_,6)7l.}E2TVЯ}.XTPNՐϤ'=s?+J} ,\ i@)+I? S5^??DTGꏲeڳTZ^TR>%𣱬l2旱ΚŻ+3seM~.[V*aVҘa?;׍/Q㚍H&rrbAN ~YM<[殏(Ј'=*%㥓nE=pnGAퟡR72L h/FPJ2%t?1cѓz~zU}6ؿ]p*UPRAOW=~v^r3Q MyK–N|?%+6hSCx~w3JzfgWM9ܭ7BZ Mo f'_+UY_ΉbF&8K:^)ʞ!\dho I?L!y\At YA۱ޅ2;9P1$VdEriUۥd5`}aBY2:><{,{c,\&tD>esfgʖ~5f1odY G097;\UIؘ }H{gC)ObUk21rĂs&fM 0}yOI::1kG8@/Ǵ)ˏJߝ.C&+s]Qd}/=n/:`.M~tB# NZ)%IDzx pk{%oo%Rda_R4nBEC ?sgUXϚg34ܗxi\L0Uګۇ.b[HG;&L!JIlTLX_}r>J7f7s9 KΜ Z${<99C~2-ӞfaZˆբ(OHh<5hKvgF?ڻs*4vFgKYdΗ9Rޏ_* fiXjƎJa-ť4{20ә]yW תc7CNj5ۊ$1K8qJnU @ UH8bc 4>99x Hg9)1^Y%/?*zQ=%E/p'?O9+-9׻W+uӹ>[W4Dn &J jt7/z z%FvP`,ξ[Z;,X^GjysJT.eb,ꝒdBRNdi\[`uNZ xF>M3(] j݌&tSGC3ʬBIs|\Zh/+Zs$K =s'YOz礈$EXD_sIu1aveurb:}oY4nq.S;W;ޯIIKnRhSe jMAvSRn2gAe]&q':Ȫn98L,淏Jک֖ ٵŜzW_6U.X-o=3b] K1H&UE5d8i"AEآ3НTjy34mz*PNn}*BLnZtr7ԟ^fyyb3@k祲ش%6yz2̝|24rdb6ݣ&x|4>/\/KGBO&eA#z,t&Шuqev]\R6XMXeE]cxscWn*WC,BۻINKڜJǔs֪ +Uȓ&Ɓt۞kX\ :8;T~3NTJ5 FW5gGjc-1:n?|zbвcCbfw?ٗG/=uX5w3h6e_~]@i`y\ެ&ϯ5Eϲ茠- Jg$33Kɠ!"hW(筍D'9E2|սdW7i'6r}KK-AbZ Wn*|\uT0|YaVn9xY?8>0 U~s>>@-tc[ϥL'o7Ɲi*U]NUvuvr7DԖo>nƥs)_O4` QZ|lZkM /.|@X3_bXsf/gBL,|r~x3S>SHX_01sD\s -󝍑Pδid!Nž06^gSfnA 0>lS긲f/OM wE_0pL'g֊ iQ|\蚭Bɭg (–1#G\%?~̋^D΍q*ò%eF!L-9E?JbUy|P6)f<5v(jqɇ:]G"rknsX\yU?5(wI]4)$qtW+4V|+Vٽ_7M22_20e?l-D dH_ZyߠFIL4C<e%a"BS92<ϒrj洧85&gfZA1qVnW5gk/ oS$]%G0+ z}UXuoc@ngg.Szj):.&gė瀞yWyB.} `>dZ?'=ilg:5Q6i0j-uFtO6my,}ӡi/oC>-0.y|[a{tºLwWf&l6}|cYͪ#V7`,أ>T(v9{s+4DB̿bd=r\zK_`lƺ9:SF!lZ3 r߻F~6~T΃Bǡ?$Ķ~N~W챺Ɋo043;P6pU 7;oЂ{|"*U {'mTwy'J:U%N*_%)_BR:`SwsS?w2ؾ(Ψ"1 g=l%?j3f >t2yBV̛X`~Nx,*Oun5vCo[k)l;7˽ oM!W*G΂? ]M;FocX䗕`m;U%m7ƾnsz1lv1iLIyAdZQϔx?/?< gʦsyM9@FA~s~)uXo$bBBu|KbF\F^,o-:\(:*WY~5;qZӶUWԺ;:*H~//gJN)Ҳ"zy20{ҫ.o\v@-ni>MHnd4IT:\f?269U6WC~zyut)OP+fiT:7JU/{#.lA(dCojG@|1J2 />fR6ns|ԡ= }+w"_fbw<:-(nEwRL`z[_U ]}^_~)ڲˏvN } ǝWUܟt\RIQMwۗG#,(;$z\kuz6c6}D[DrQTֿkfPe 5zf{{-N/`׽?}Q^y2{⮗YMegWg̹ɚ-ZaFt4rU'ΧӮV`RŒ̞NzR3Ф,0ݱPz_`rgBNTO*v0s{=>E}'I=NU}َol 3z1HN:wܵ>ԵJP'3 ]K)ɹcgpH fBW,s診눃8_R+"WGAE1YP(e#]|ܿ:^+wƖciMҸ,\u6y.^:Jh/+_9(G35ֻW|sߍnK>t^q7 x3~pHFt&)' ĜL '7O )frǝ削yk"k)^c)ɍUИ{ ?[j@A{.y` Kr*ڻ'^kUcʜgZ7%{hSп}‹g5u.jN?$O K9͏vÕ O̟sud?s&{чFX]ZAW=mm>_j((so:=˽Y>qh5oPnk~%\ʯ:[h{ś^n_Flo'FWC,,2/󺟽Cܹ9W>lRW3,,5;h-=¸^1%|sGǷV{ nTd td/W&e8y,˟:909BwjLa#Ex'rdΪ6uM y^DJ`G}2YG>.KPItat~ߙ*LZ@^;Ki{i-N(؄/Կ9zΗOښr5>r`Vxɍi@UխK=9z%@.eJ8p hK *c&mN3qLI<~]m`4)x'&6^r4|/gE$ih _] %NOX(oJwF bcۧ\HkY??F}.©y?p󸺻 G>n]^۵Ԯٹ۽F6ŪnտߵO 4^=,52~/kHzZڲ{7)Cڡ.[*}'zxp<ՏזƳ& 2qЖ0^W9T% ?swbDk>sF9>nAiRX?o:ln 9=젺i* 8-ZqTUeCMK4:}JWenEy{ Gk-J*pR4hgԱƉ66}'dS3&Hs'jgh/n_8)@ c=kqy ϱDG8V$È}/(є`#tӥҭդcwX52>4Nwİ`~$b6Y9uͪ:eo?Lyy߰ZY:RMC=ٴ?ֻ m `T zϿ{j6󎪙ԢyKcf_JK}rKX:daje w@`NX 4ꝳ{ D*!g9ɡB)c5ZSeC<\'RsC!B}ngR~!/9's3$t}9;}NtL[+UvR~щ@B.:wEΗ3_3`t?O;=Ryq%y-4Y w͢*2XosߕOR ILM1ly1uAkz8X(fZԑU@?_NF9Zz^7&TP9hת?$J^wSdHldZ=N91ym%wr.X>Kߩ|;b; EL`{\{tK.*z _@GuBwJ~shF[oѻzm;ҮVmү,kWx9Yu<zwL ̌u\蚉΅D5mԐz*/ sR?rY-*ނ֔-ZחJǧ'K8^j+TC;Wgyd4=;*B \ϕv=qOA;YS[ԛ,sFSXE4SoeP6Kʛ(g02ݑ Qs8ݗ춄-(t:\h1+0GS+})Lj3ѴAUֲmnyntoާI1wǕU=147!ͳ_zdwF)F#]e4x1?!bk 5vnfnn9MtO˼4 2IʷY+&禱/iO6:~* [[I|߽JPy:W(-k47oHb릞~[TTZ {Gv{'YM̕nO3?<t,O:j8\,`}' 1ѻq=fk>/BO;Olbg56q>.:)&YgU:ō!ٵS߄q ,s|?2l|s_5TuaQL>! smLEG=% SW5_@RU2j_%D VGI~|fJI0ՏVd~UY!MUdQƍZ&Jr+1St^B(Xm_&*Җ2|lƳur8ydoLoM9E}#{8 Hetsz*l}e*)ϔΌv쾷΀DAסMx, W;k6c,E._͓f<2O%y\W ~)~S]00+l|9~';eCxXfQ\;(Rls^$؛3ƳBJ{DC:5Uy̻4%XL Me(4BE|KsԌ8K2f+:Rr=mOCz/f_[T-'?+Uᇘj^",sx?I_~7C)1qTNmDإՉ!: te~=v>5eLrNA`-/y%2S afW%obԘJv;#_td:["C/g|O︟i/Q5F;T$h%&@-#,ɶ'hv۝'Rau4,\#("r8*W*m-{C?3}q#*.QS#D,zs"͟9T-/&o#\wA|^_<:E-<6=X"i vC;YgM)rܣmWHO u~N.~fί-} ,:\;m`UoEUR^n⼎o:*J`y81[[g![ Jltޣ!>-rr-q0S,b4eJ[䒉h[+kgCtz}kkc=\)3]N&Bd$Ͽp`H0б>>kӕ?=f5L.>ny;#Uw3ڛ=)LO~$X(~[0~P nuYx軫UӦu5?{,0]lc>}ߎ[;,m*uK<[K?qe0:MNJJtU ANalOisuʿZ#Vx9G++Z_ kxeG9 kcIָ{>y"g?̈(?f34> {9jq4r~5H&Ubv_>{zylt ވfyE.B sQW7fp%i]/XrGF\[_7jUhlx^MLnlͬU'xrh.}*$)Vn&X2F^jXߘ^r42.uqToCUg6),j0#~n➕o8~Pe_wyp:>+76OVY?]I36}0~o.=E{v"HCSr}McP@5hmgs.=55}!I˹Tq/!% 7fϬ4gqdN}i3^iT0墆)%sgJ2p|1Ůd3ITH7Eo }s_T`֊BɩuV7j<ŝU< ؤObo٘?m r'|BHЃ⽍2TKP\WHF>d~!eT5 FKY*qFwPz>C(I[J,MD]%Ze}#?+2bs!}sk^z"]$/jRHߎs K"s~s]MjVt1 }%3 ײwNag1{WS[yɃΥ]G^RYoaoQֲsOu׾F&W[?{Oc^ rZyԃGrܕydF"iX}HsjgHQSU9y2YIG1lyюb:luhѹ"ٹ/"pֱ> ψ_ IBIK1/MNS{=ůތh?=ah6?Ϥrӫ#w>q LZ.ɛ1Y (VX=zytD:{QS=.ѓ8_6F.Iƪ}%:rm+y-VnNXL663]Ν|R7Z$ D29GQ? k!wMKLVcic4C0ʚ'cΆ+ iSatw:?O~~8 &bℙBX\T _ڙ?R"||oH&_enqy )J5nFh;tQh574=hWc={6*YYfȡx3.uΪgzM, wlzsf߭kD`Eİ";| qg:j3/BվV[Q=ka6nF1kΕ /eL [;=w?r)F&ʺ%Kݛ@~l hcpLҞ o܏7컹80-KIh*ݳ|撤Н>Z4(Ygмڍ὚,Y9imSE9b4PϝJmv(= ;$U瀾|<?X;?TQ3Q*.$M?Q,ěs~8ЭRM}?;6:mpEs]*"Cy%2Nkӌt9`hyvC)!V㍿uS/#jlTCf7>J'?K9$yMmscK)k_S.'L>t~S~wE]_iİ jyR^ǁ@c دUBʘaVj3w8(*);:G&enGm? 4/8_G;QGQq0qWҟZ }sem, gEɣ5jEǛnqmA;k4ʹ1\~yiw(*-|x]Oi}u;\YOh}귤oV;wͬo\N֪S(YЭSR}[$S'ʙCUe9;\\08GߔN'Bno*G=f_9 >O>v?!bʿySY;JM2omN:c>󵁝G캬=Ш]?=k>)yi<ΦبfsWQ7Yj1>O3UǞ jH]"OD^gCb10njn}g~xf9EQMdWsKryhdʿ]ZYQ$VusXl{&i#2h} VvhU!?Mk]FjŸks:Lܱ$i+ϝ>YuʍTQ*AaK9ްu>^ 4 `Qi?!M!AD(V0fOoɷ3y,3J3 0Yֱf Ht탋us",+M&=i_|%# ?!vZoH?ª,Sֳ_V-QC2Ϯ5yZó"Ү7! T&د /QlQ}XK񋏩f$M8Ilfbd8h&ĝN"7⤼Y\|U5Wz|~s]W f:Z2L &,L#MőK2ks8$?1 +Zb:~ۙMGt7iu=ʘmWCo٭GwUaj jics}Y_ޭkVw֯-=!LnF筆׫oS*ߛ^hrTM/X3'QH<Քm5e!E?Djwy|~fM~(\pf-P>`!Jw%_5,q)4H~kJvS;ۏHhR+g>D̓ 8> 'u yJ'yi[pm[.ٙ/U.β,`}5:m*_Vb<RCM (P'!|)h+C"Ŏi=TVp8blt9T0}!B!n&^E,֥fN+?\nsB?*ZІrx_WI0 w#YE.o;S3[ޞrffuQ6`3ZΒm\>a>Wbv^~)E[֤Ժ)EMG2u Z-n^ՙ$dkدBV:beR%/#>Dh`SrDm!@bOdG63ESqGb\9PwUޏBo?:Z4P_0^SՖ](LwnraSƅ~E{9hγ:C8vi,&}6syA|尵\' 3>DsR m~?@>P%v\@)y~>ѰVg)tBǭc2L=9״]çԚʝA4`u_HtG5~;1eإjIobP#^wi04x3ybzg0͇騛ΟLJO>965{+#Srfi.=G3 |p)Q1p>Q. &C;!TɣJQ^G76qjFĕ6|4 gqtA4бdiWENésZS>&y(?V= h&O2.nxRhh}ru~[u91EJ6>&;ط<lJ#74zg_) mµPj|صҲ]*xzֿ'P*BO+I/I9!; _Q"4P|+Ц!&&ϡaO)y'M?ny.73uԈ}Y{3CKfvA9 lm>v=N?}ʩ@R߱} ʞ'BD IɃ?<^l+|/1iqtlVҖ|ŗ>+rh yjw4ptQ[R+-`.7k.|ٷ1*-Ać: '##˙?k9]գma}KQw!qEz+H0<}BK1C~!XyjB&Vh#_ɵNj_goz8Њ~E~>ۻWAʬi9X:1SMW+j֗G1P^]c:1^}L_xhf5HM=dhVKHbr4Y݉Lϙt*`@?>SC3oWFB}ӥޭ]7 J>#}GE9OP@IKCj(emЙ5 6pM$L VL,*^ߧbQ*d#)Xl4IgpL1P>>J?No*c-lت狒S<ȩ8HY&s+?2zTdd!Z =ud/U.~fgتcBI+i,e+K9ZQy;fEZQB _+$OC5tLxDŽuT-/$:Sdt)KWA-5^?4dn4Y1Yz))^JWqx`38hgL7YCŴCtRY:gOAg.|󈦄5D;UZ(y,ޠb? * ƹ=H3?`Y~^Fy8j~;xz'qݑY>SS cC 7q[ư7 Q%Q4/\H%r[_SY_>BEfUΨ8έqNy7``f,6RU? Hə,yZD |]٦$ş~E@AOz JCѷmFM{3J~Џ_晦O2jK-%|5<'խdzG+iS[㠜[xY-U4O$eB^.f$L={~JrǽL%jf К 0.R#,U(36Lͻ!SQOƞ <ʰr$}ִ͝J&FBcP >ED5+8PDP0L JUH3($Z O م/HfwBqG;Ӻ5+r@iG ,. 8!P=Wjٛ+Pl=u@p7R9WF+Zs>tC椿XgΡsq:.澑;_EɶzVq|_ 8$L&{E,,YE^LSɋfeGe~ % a*7CfYHdY?7!.ܸ]100ݖǔRJ9N`yVBho_.݋̶B Ӹi:iPZ57svˤF])iXay|U!?.1U^:A 3_{WjKruWf6`~'dޏ;THj-o׫F4cץbκ?']**כcԱj;L?yX%+̢)J9M~:K՝ݣ-U#Y^z ʿ|GoVuH~g/xD?؋\A!l+M j%'sv6:4C\sZ_i+ n9~k.ߑbw2ն)R&Q^1lq7iWEMdWEػG$e*U ïrU:4 U8Ƽ# (XQMj'gâyϨ.x)v6Y7_ :a'݅%9}~b9N~qPz$Y 7IRk=Tm4}OJzqo{K]\v!._ԝݿ-׋ԔttG^&k?Щu#j)O`*m{:^Gfcw`A"yt+ƚ6/бrnuL6zmSlv#單Lb![L^=.JzUXQ1s 'ɬ[2$h4%nYar=tRF7n+~CΦc>Ly~-iWZԈ:L $ _^Fة۠-DH^ S_bb9s¨i_n gEhJBa͡2g>%9N &]pQdUn)bX4IDWI;i|C5S э܅1 LO5૛17!`#n탠li"%Jp,(|mtJj//RFvcAR҇|RUSnyzz=Ha} {OFS*sJetIO;οJUb!ctpt|a=aԸ'J~6fڙzR=JCmj5 Yg,7M7RRDˤTqucg>W'4|*SrZؔTW MdC%4`e52zйlW|%JgRc=g)䀳vܢg-jrޟ VխORCOku?c/9k߶Bd]; rhmJ[.WSgxyZ ҵ4fӿdSjTnt<ĠzrwM/ Ҿw(1YGʴrB|qL؏fluTR8g\Z ˞j|W/TXa^sRb\ךo1Q͕Oډޝ=]@9E3@W`OȚٯR؅E㣿Y,^JtF_bʇI&9[!'ߝUMhl3'_gч|g}5 30G?X}oAL˫k:DEY׊hⲔ_ߎ/On>sXqw5 HtCH d#( +Cק[=9ui,@N(^g?0X |#ybƯ1sG?C }E&r4at):5P?;z{Xq籃/̥yĮteIY xfh*ЛL:̨~$=eC9W4dZ&) oѬ+\)UdXutellu8~_EaKhXQ-ƦRyJl n-i֛kOYthNDgj-)Cm^6]-W}17)*Ba%9^4 'sЅ|ܷ!a}p`}Eop8؊a>=k`9gQd?iu'-nfR~?05d?ݒ~U !`n zCήT1 Oq檏'{+dI;t>PR+KPΥӃ${XE U5-[ɑa~T^.T >a91K7b?%;!(7橺RPy޾IQCG:z\שijⶡxʂr ̨ς`d3'1|ϻDA?SٍK*;9:I${*~)_he,l`/}TO JcG>OP:ĭoFd(,LV[\->n>-z)'s)(\qV4PIO:^ s%0c1"GTAa,}45u4w~:z}a371~ *tGؖtG2wlo(*gDɐLiP h%`}=w%,衵~`s\~[Et}lD41șSQMOPqt<@{ϋ@(e=NL՟>76rTsN$")T+BjQL{*׀6pif:L~=p7J-|2Iz(V`i%rNh;}>.Wܝ4#sYv*~ִ]7 _h+nۨ^oܚbS鐹*tK^@İ:tx:tPy"yBZc2~TW#9ȋD0(:ycTKb589ؽzC"CW0;9,]ɝ^Ү19b]F;kYTRʝ>}VĖbo&[3TH5B}2у2C77)E<*gqITGτ %Ք7Ru֭Gw'61.پ[Tɛ39gҘOAӫwc ]N#_Jqg_7ΞOU%+=c(Ϝb9iU6kh:>eԯ߯B5=8yGHJ ճ(?}e*}c]لsCXMQ^˙Q-kãmѠqbO孞IIO3a='U % 2 ܫzNrǐSf2s$?$m\Cr9 $c?3b~i9TbHA6|WBo.J NR2D Uzu򡒗I?o?OFnfN0"և5qykMwźԩ:"k]XZ.lE)^7FW٣䪪ZQZʸyP Wk=h{O|AްWlZ6,'ztc=?sPl}8(WJ|sm:*JO[\s4͏OIk&CKYF@О-X¿+3LwkS GCS=׹$etU=T*s.v&s3'ps Btr>VP, g(# kt4LD шk}fQôu+%lH<%jSBTCd$Ɋ tx~Q7&Bz όHֶg2ٽzI +dY͹pgփOjj3vmw>lX2R|x]Aэ!3Xhq:I>>ّz~6Z!y:2TRSYZ}1bֱI*M_''<ǜϩn}rjJP3QKEBGo@#/CR4^̼&Lȅ*GsGco3"|뛖#WZo==y +GtKүM(ܦ >i2IIѢ 媁Td>UG8*~1|(:Cb*K M;@Slq09SZ9?}L46L~vgFw JΰSi/7!jέ>aM/IJg˙zygCg"[CJݮ^QOW9;3ZjLۍ//WwaA76;2)>GRwvYK(S`"֩7I4Җ$@HT;,7re*){$1Ft`cq 5,G5fo7GFsF*>I d*t*ls>y_FA:&aL |6^bhOgz*G724 ٠/8}L5ָ򮹧TNk9[Q,8lR E>%hs!n],qV,d襁":&pDܝ9i~qid7/ebt,B>YPFYX`Ld?9|tMQ Spy孝-3+YM6?,?K/և٣Sg(9Ftc;1sdz~M'zɞQ^kogh?Ci&I+CfPsb0yJ9L cD 2ec[~> =s#0TQt͟.%uGLF;.s~@!ZH *a`p*o_ g)]j i;P,E>I;k84Qc:JAGIɑAUYZ'D-5@ 1Jm*o۪oB<5r1Pi=(ʋJ G߻L|gȁ:TFϒ,xN9_;,E_sPtK~\_33Φ៏|<ΜHrboӋV'ΜpVL޻A_;3u[5N|iؔxRҶy*3b\x.SD̘e83by=(U47i熖s-<jfi3y0Oˁ2vH}#jѫ/!qjٖ`3nKdM3U}` 0>kNy4^V;0UFܯלG$깞41Ͳ_9lQ}ϣGq: B^hsC\>* Y=9wPY9R _|߼4jݍNNtK0KEsF<']'EqM'1IXBt)DxdQ\ ϬMe6_]`aYTi/}9Y[ştӲP{h/хJyѕ_[#ci?I'%\:;$seU\s2'Bq5?G"!P̔b,˫ ,:&u'o=$D4`J9b3cN)uIBԿ] Ri;9w%%_}(3qycϽR͏s$ 8o(j?Pyr_Rl0(@N|.z^Ps5ΡLoh.(Fk׆魓 p&~,o9e.- u%OulTW\JӧiM~/smt; +}&R~29i_pzT[GGM{R)oz&l$|gGѭo?5O*B9˟uH;h菏*B̂oe4] C> ~~w}uz9JO}HRTt} ȷCF[yh.^&*bjӊ?:B1%>+bPWH5"eZ^Np̒uͤ"m*AJً ^'ǙɔyK a¯#<;hљ6BesiqLF4ņs4#z}ES.$Btϛ̊cSAt&_K95 ^yl32)_-lr׌.Iӊ΀^<\tlR`vƓdCR[pF|ܧ >ٌYEƿK΍pڔaDU"W7 NK3'o-XtBz_5̩si˕>~ITtK" ) j'rGStӔȺ"ޚ?;ۤe-- M1:=sn,踃3&eOZRbVw5g,!Rܚ$a6Z>Wc VR_lN5۠L Xz@cTWe7AXfzI")T&qΚx_3g'C&N%%];G68VB]QȽߪj9][Y?mT9K ?7Bk韜jf9 h#R!*}dnJeNLy!;Gr^Q`e]`ߋ7 GZќߑ"ÛL>}RܘJC5J;\.J9Zl)%4FaU2~O`b>$ZQMkYiDK,3z<> tr* ~Qg=<F\Q" pcʌ/ 4b v S#%IZ[VN[U~΂07ƅ7(KԺTh\::˭ˁSV 9T'|crZ5A%mUhŜ•i2 BVaO7?byωg*BД*J1&DܿUYfٹCTHm0ЧsԀ?t qC?2-ݤ L:?aNRL!E8PU7Q#MЯ"a$`P4#ThJX7 _Ml>̜C62n{k9c2ms)u0]+w',.GވAW aOo Uj?_MӶnLJ%!Ny/ʨz=I ӆ 9'̘\LbEDM L^rI.zFe2YM"Gy^Q͛w.`%?2~Uэ?[tοvx/Fat3~;=Ǫ8EL ?X~C w3%j G5|ZmLItRO*Ƃ[7H}9);g>ٖ)CӓY/AyZ1,)%C.!3<)g}AP#=t ϫ[xM(g2IpyGc5(!$>}1@,enpgWP,Y }&:v/.s^9?Ly9_s/ `' 1\5Y@PKvq^zU9|kkG(kArg*K> ɩa]}s7ئ3Vڿ’yfR*wѰG#Sb=SM ^"ng2%KߜDfsO<ȑ޹\U\-9*a~S&~P 'Nɧ1BcXR~? J L߂);opH{KUidk]7ѧMhZI!o^OV1)u#\W>[GΞ¿'{7W՟i-ܧ НYT?F){)*qiĥ+KsJ9c?HeqƝ$Κ"M(s9ʢ߇?ߙ9F7xq+Nk3ʥ|ld MkKcac~`ϜL̡AJ[ߦ6xuǙ*X39sܖ&<[Ub/$ڥ>78"U$3<HÓ&aB8CdcU;ʦ~әC׸D&C}&ɹ:·`?g49 )j50(2`e7s zQ(LU 1|FS%?,إScTb`A̚z߮MdB;4\udHxh{h۟JTt}O&Cywc&!бˮ&}D_z<4BybjڔZ3(.u NyPO:[up%fJh}4嗩4X&jZ¯:Ã2% g4!QG~LrD>F7 0sEn&Y`I E~󒏅 33koJ}46Q^r?+i#^N\ba΁3rH&%$9VbhsOrq性Ela MHU 2Y1EʼnbIQg<>)< ~ _).]\{U8JbΗN=Ui*D8d"Oҝ^斜3N.HQjORgv_co 8"z8jӻ ͢ ~STNYZz7/K1gRTfzKr޶`CV?NoHgǕ\eu>zD=u}cI*޵t:(Xq> Gr"df9ua}omgxҡɥ_pA͉[fDgc25hiFb[ˉKD9.f%B~ 2VG-S"튛 2_J6h|xП|_TT,*.}x6XJm 1ygRKBO?GB$TQVN*EX[)h)FNhb^}"VۜXJGkW;hnyfD`]?;'֦Bޓ}v_&Hr]"uyma/+dB(fK,س%B* td\șNt(B_>o|󟤆Ԭl9??_=)M╗__{ė?5j|lʱH<[aͿډ0V vvRk_be[e}zmW/@δvB9 '.ʣ <9*kZ?Aj]=ahn}@J6~&ULH xQ/vN'X+%cxTo=t%Spj,9BN)[|sR _'?2N 9~'UCϙ)9J/2'3\TnϵԿɮ(&).95~#ϑDmvT_q]L^˅ P#raހ"SwBZlsm;vjyGbg%v5gӟ33P(QEz:;o1N+ GGRaXK3Zޕ n*(| T/ QDw~ nW>.R hVgjAWuЁ~ZuZO ǫ_!ׄϜe/O?Oql鲞K񗮕"O>o7=nF5JO8B|V.|ն0^\H1ct)bC:З PnϜƭa|Wˆ,hr e*xzg9~:_("gDuHGD`pV,a)TZ}.)4\|HûLԤzТLqu'7'-{Z *Ó߯RZÞb 'lY,zg(~?p/%J|RsHC\JC>{II)T\I_W71ɏpQY˘ x~JS9ҥ3K@xhCԓf2>z3T^Bυh/OR/~q1q[Zv1rC!+ؓwA{lZxLe0ĪpބT {A|ytc hȏK7< B]ze<)(Vݚ=a{^/:&9l]WNZߓU3ڵ+=e{ VTR;^3cH3yk#6r~.!ۦ^Sv#y O{[W_}?=~ҴEv;?#5~tAg+VPY}HW;Czљg+#:w%}>; W=ʩҹ{ =4ij?ӢAbV󣔙r_dtq3Miymw\ϵ/u?<&U2fYҩd4oR \Ɨ3(sZZv1Tbʋ)hHO|JӢ}}f&J)6{|6?3d} .Z\ɧi=KR?6]'1]>'Eɹbt+xkf9':v2f9lJ~2o?> oU-a \KO2Au~pUR`&fL#̒+8npvBݡ\/..Hc79WrFݬMgdHoc|[vo~^DrU?;RGCԔ0˟Zvo-VBm17!&b@.P}w*rcvlM>8yO|p$]y'V"/ي,ɄV'[V#H\٧.xxѿ?q%dJtئY8͏8a unS%is2U͘fIf+tPB+#DظT2teeT<&h<3gRuTjE3ٳԯʦkٍ3–5n~A/f!<іbdg3١yުTZYⷭCJgu;>\q̾^>r Gl$E){|DGG &kS[/e/[ˉt2m^}Sek {)+?!p3G,>͝a_?NZܻ Pg'+oKsAP1S/m挤z p.|?G7%b&.RW8NjLs'N(x|bZ-u\bbK(|ı>r46B)~zTtG??GUhH<XVꌺ tE҂t!3_WV- ع:dH:~D6"O_Q "v႑Ly|%6$7HS9s V~T](t֖{-1c/3N8WC~o_;w%ɫDtc36}#?m}>kW ? |ܮz|*(LNlH:)k-s.t+~ !w%SPf|;ULP~rc|MI13*x,C~ͪVVTq5N=3l(3ShJ,PY҉|j&DRCa.h3""WL(u \ԍ?NF]<БKU| LI3͂X6ORy%%05tͳе0IDcU [tN=KmL<5WUVu/?4˘f*JS:3Egz1eLo^cɽ if.N6Lji;&N?no]]&a?5Ƈ; M.:O I ּMu2ROW"8%Y9 U|A*?6r$`%ʔHBhGVrq/>1)5|"L3j;(?&jyBHrL[} jꊨ25ƓOR9k@P XzdjTb'&J:@*j*rF:gOڴ>@|ol8r?2b9*C,\Y%ievvsOC2! NUVRvMYL,H:Z[V{+tp=)9~q)mFUh26xe&]?|}æi2AR=0UvىNϳidb=yr 2cWF:ߦS|JZNt=m2 ?v{&Tc>t%εlJ'iYZ]| FH3X1\n2OAUC>t#ud^kҧo,y&/#_%󥕳iyUFy4NN#VsWz7xN߿ j7`:GϑId%4gճ2U9~}Ma\J2MEU/vgI_atn;iseg?qrJZTh⽛r/0(CG Х&G&xئ a9hPلt!C7E yNnPɣdğtX!VQe_W !&r*2ì飞qm5s  i%uy%;Ɍc\]`uY24~sUQW^u~\ g:;Y'^"ݷu+Ο΍Ӗ \+Zs/N[D-_h_uU߻AP?kNݐxff s X.+Cv}[䋙WfY3@^T0"A\;Y@W'$ƒ#&#y2h/:,~0H㇗*~r,Ҏt}2Ry]C2yC8@:-R33i,KൻP|qd)azU/Lf>g Ԫ~{yS-G/K%X2dXog2ڀr+%f棟iLxii-%#RE7.M:^(du}:v)fJݟHYW~q.4z *_"t.ALۿXGO=e: )9%e͒T,w'~̎ ǭH^}WU& r~`%t }7BƔ[kL)dIei3}T83;G}GA~!n} Jr- ] GZ8?<͇J&(s+UJ&"+BF}*}p'y9 I 3Kb#5/>J끊Kv"FagSb[rrqk5V&CrWe_iwUu??67j ?$Ssڗ>yyۥo 8aAy~g4Zi"xșJOPY0ƟAL|77)CGZ9{4%|\t" Emt(kb-MSԷt*rmSLh>[X[4xuuthaϴqBr#!=d9$ 80U K'U!t[Er֢FՎV^d >_?ALhoMjΩz3:[; :[6wۯD+m=MQjC:06P户0&/mkb*)aX?yg `39Ola<|P9g*'^g\f{mX/_h;3V-e H[Ф΁3_'<0n HYA-4"9Ɨ5>sdf&1J}I3'ci:$.i7; 9$VDKR>[5Y2 fEW|#*2JNYgBYͨgW.|X>ڢZ-NϼMSl`Vߞl_1Ds~MCa7Uޥ=xbbdJ LtYZkƃ$PƅcJa/؏75VKɥ̖ɀBɮrNgLv /ۺ?f4>7ۣPKi4)jb͠ g^oQ"'z`ncb~k?6<}DTKcJuҟVeLՁ]3q~j=As t4#/9 QL{ ߌC̋KdUd YqzhyJIjT-3%OM1 /:X#UᎏJֆ!rV/g Jx[X/ ]#8$c#|Jn̜jnh(e^6^A;~fQ'tl_uz tX~RJߺ`g1$Bȷ}9r_7ЛW_y9].l@ɅbN1gG:}a\Y\>ycvoBq`(A6߷Foe:MO)}5֠-WjU@~3 `U8s tP4_N(ɦuM䛸z2 `iLEqS徎yiJܪ>B~bI?e \U̝h@x5KS46Ϥ&. uZ#+Ic_H8)*ZySB}%u#+VHfb"]&N>d>2Z6 J-Oc\yԱ,L1?.-`]np6C%q}V4~)B^=.ZJZ)4Y=TqmWXʍ7CsGpl'[!m6ЖJPŮ,Nn\LdW10-N܂722I.n}1eS'f} PL/+'{KU_yӦt^=.h}i\Y^L;=-m[__`-[\4ջ{71ϗ}8t(,~P W-`5醭o@"%Xܑl:6W<2,g'/O]y@ Ť^?6mM aЏ 0M|ʯD_}bV*v) )R ʖTӵW#}E"prWϡDI߯AY[H'n93:(dG4My+yE^9 ;ݎ􃉞VaI!W,xr$~U  $<[*-%Lf'oh/,9O2Fѕ4OG- UA eKNit,rbb+$ϵ1ӿ"?%6|EBʅY.R:h>Em٠1xв6CT7Yw㣫tF.pJʱao;2bv$}=Y[5 BO={<^ ^aԡ`9v_&*3y̞Z୿Tio@K "zf䲵xQ`M% ԬNgd_ˌ |5PWo/`P!+1-rWƸ|X)RfRuRL pQO6hN& h }1jӕ5J] dua?=Cs /9T ˋozBL>CY{P[6OGgZc3G&ggߝJ18j٥TepVYgTv7+O]TIk(y6WΓg>ӝa,nqk\Ǿo(qS70Mv9ONco0H0˫C]>κ*CP볡}u%_kוK)UKR]f)O˻}ޒG<K!ౝ>V.(䙡#,!_* bn1XnQjI6]ՑLjye2W}p>P/ȩ2pw;q$K<۝,\ \ Z 3ibIWXhPSqlO?S$E犨jf2m+ ҿ $m(6M,?IZͅNotGɫ+JfP$}) _Հ8~NhYӣuk V8 V .x]SwYP4S}K[r'55:QM"tA<i➕8:vnZ5TtJ(z${sykKkwK֪Bޅemnoc_BmW%Zojw)K1_Ia6gS~uT[[QΡq#E7,=c) ߹OKX_:cs!vwʿ?`,mɫ?B_Ci]P?\cGZ4F|%?͝ ,D[A&+&E v*?e7F3VuB@RZL5N|~-S7O%qQ c:3 :IvI FmuNl9ft:r ?rO=[U E-13~G_r }P2v~=OD{E 5 u띷azۿ`X~惛kV9OOP3n~ϝ {\˿"#qc3G4>냴D],t+]6uÒ+1 )/^8aVr9}Sujt sPxxC<@ʉS9~tl 䅫j c\VP](:y_C?d_;FC:l w&noG$S󨮓_E6 tfޔJp>/ߕGPCYUd,ycC`cai8KTƕKWļ crߎVJӤDkcyNOlo>(^N}<4E):N3_jԬʞWKBAZfkZX7*BZ5'DO)g'@aFQo.{hԿYrǞTӺ2:Y;Y6]Hg4U3荭(%LSFH>^GZwXNt! YN.d:t9D)>`3S|lU@ysk-ly(~\̮ *(>3 WZQ' 4Rį<灋U{fQ2V-I* '\hp\;_LzCO~迥!m>R/Р՚4SU>|xt-ɵ :DG&ABYBZǍߤ~MuӨwbCVT}s ӣsj$Qa5ufPg9 kX֌f;yxkV' ]w@юu9I<~r>lwuPRfq~isR:~ZZ3wg ι9dV;Lz_t(cDl]Ixʒ/W%T|}S9ϔgi+d@T72l:k$lGw*mGHkg4t}RuLe>vMWj2THI+hxUȐ&0 G7=7ӓ̈iNnlb'k&9 5z};\ePx!RլҠMOWhD?DfY?Ze,?C&4ڝ,2:SkfΪpWz67"ΣnAnbAǣSM9z~&(ձUHv7k4 Hu0F}6W>o_B˫T/DwɂzҘmֺqE-WT3jw(v.wbuPT3=wgI?5 K=y)?Tg{Ekas}jnX&v:ʪ9z,TgR:e.2uK'տUD~UitsúyM6mUyep3(Byф()jVb~8249pDxisރ^nQ8ŧw:7PcZTŲeNt[4QKL!l] bf5H}#ԾL&v>Am>kPt: =:'u({Um}\EVt=O9*"tW oW.>itO%yj;x6ݧ@9a?z_=P2}ruXbݧypZYGj{o:g>콋Z~P(>]*p(-*(nn&q\|^127@Uժ^sVMmnQ^),\jP?^r309*(ңXFX+*S:vOn4>Y |-3o*-3o%ux/92)jc_ gٕ)sue^Nw6WRhJޔ6ZL:(;]WSPoF(]rU׫H΀0T2g D)ۦsr/"RPi%z{U"nK^{SQW`ѿ u ؟Um# Ka"9K^S+n[ɋZ><ښJ:T)jzM j ߻AS/iҧ450E/aJoUcRl_Bc1epyV;}`eqפZch΍Iv8et%Xϝ@R9Lzi6C] EBMsFZ@pǮىLsHkt6l N5!0iD[CR籊x5辢Z;Z#V.s*/k3ѥTFW)_InEUW^֠ȒO(o"2܂G{l4 8NFV92$QVM9/3!P_{^IOf =U[E\<`&t4Úsr`A`ZiDt+Y&d uaU$1뢁wE^>H}FlqQ>F+%4oLݧLFWJɘ#bі\:%σ#Xwm uQNۤ>'hTٔM6K@/I\e gZǮ_,CZC]jwxW/M݊]ܖT4>x- QRgzL!xU,ڕ-K]j &YߜzļKឺc=UhвZх޽XU}\ tC/_#( p&ujj >e5o<^ (^m%LƜ+@ L\Oy|'75fd.`u!PIGH`5 cOǒ k7ȓ('ޮ3_r^E-M%SI~`Ʌ%$jDӥt ,ua)XPRT4_=n6QGCMXUUto5Ar߈ejr Vl/ZJźХ :Sa48glss>5#+F=976@AhOYEdH֖QVRꛂ'keSD/wAC{Ҝq}i'QqP[gQ %tQQ$8 "S ۘ䗶:r̟uDz~&.ji]<&ҷ3h}t8u}.gj~]A:5F Q%Fa~4R*koɫbB!I[t \m#=31@$9t83 /n-~3mꜪ'_ҴwPʵ/H~/}٧$]u5Yv'*kZ4|~&_&?7LYM.MZ>XߵCgIQsnj@*e Ҟ~QRp_lQ?/ygzCkʦg{#<ԤpI?+ti7GOnUQLWHI1gHJ [ WL8I'YY;Ƶu0, Wg~:ҟM1&2Wgkh>})~b6& [h&}Ia'$. A㸧D-JW%Nʔ?XL&K}=0B"\Ѧ)h9kΏ:>C皩:sf5Yj5,?Ոlsr=] v~YߣGgF-rW1_1TʸX5z:<к[Eg>{߳^"k|mfn0/wKw~P諧!^}t]Tm:®vv\ iJ_ HgéBNp7]'k(MU֗Y}OCTTtJmtwGq?^X(e 1VE(UQ̤Do9?F<`''. {~E'_Z麚fEgdڗ<~ۯ4wwwX߶OzS0CUGӵ UޏN)tΛ5'TşEtYaα֝cyA=&/W3}BB)E+5͝U9kI2#CsM̖7+=y>2gND[0'HUC* ! 4 -؉~1CGxoMw?gF]ro]SιܚnzfI "s_DNސ)aE]ə2,޷G[k]K [=y9y<By^-Qdo$fYG! Wf %=F_anwv2oKn'}$IUo 6r\* `6j[mU;k? :s%gD&Ud)26;ShSEOaUoUڤ8.~UF,3eUkJ sU?YjxmҮ9~j'KZvá5 ^-_밾Mաbx VQNrF5?@؛̳ %,^Ԟ_w-XYUMk.QAXp(}Ma{%u& @O|i 2n'$;:kBK YaiB+8ٵzŇϺ|0LTӿ hЙj ?TLlls?uC[;sK=Ci7[fхGRūKvɈTms͙Fk:3\Ϫ·ݡ xn)GfuWJx2 }<$ܿ^ ^siyKQA|Iէzh؂Xr+IЦ.g"i^x>7ru6Vv9g? !Дn+`]\Ea\鿐L|:dm3މ6{2su:1KO?Aa u:=Rʩ$e!M=:TU09h smWy|P_Nո֩Eʿ&k'IkyL(U,nG2mT1;;zwXGM#)-lbe$9&ۮ=V)|9o&O];+f^A4fNUk-`st9zؼgc]^Oކ#wrlY}"YziF7GJQ}֎rFa^?6\溓򾅋E@|u4,(~K}>]В}:MEk+Mu8WKbe[:,dfK3ڔYmT=m祛XZt$'Sְg_N2:OJo˵:pQᓡ^Y>oGRs[ K5%\Kkq(BHa-SN!|vC[r{4Gy6YGE>QO! ,X̊DFsťA- .:giV\sq;ҵɕ{ӉSH9k R)62|JrWI}x-?NMU`QJҪmiX$=*C8| \s>uVUriu':ck8tF2蓒sLw0}&mVPt^}{߹fwMu#JĴ\ }9ɂӫ&oGpxcqaF0/*I0bΉ](>GZZܲ_=Ge,|VI\˥pO GW5&I&ҫ%eRc\rdzۡPV$z_L[pICF+ic gW?brѦb:>Sq|_E/e|(+X<y/`K VIL ^98AY2U%@Y6O!2bȽw|$}mlC0yPN#*]QZ5l1.\zt z>c窀oCh&>ھΝmnO}sJ7Omj/@[6FbC guxȅKڧsڶ3{ۇ'M \5&6i#akWKW0ucF|[K;+鐩g5/Tǚ4v_~}Ŋ0B}dF55GU-dm'o#(9`eF[+TeE'Z?5m@3/龅KiLQ@jj}΁ߡֱ'7zg&iG&VH뒈Q֬'{{kUP)k|$fRs9"4Lx+,Aŧ;j%GɞicBQΩ3yI%3??!jBn; _B.ܯtu20=߇|tb$l6s/nTӯikVufݤ'teGTNE]>e1X՞ar6j,zotao7奮?2~|̝ж$kG5[ܝh;^tn?zA/X_il}=>Ҩ:JlC IJ@Zm_!K-BSֳ B\)_PH3fBA="aFϜ L( 5~b3&1zX-oC z׶VfoBKLմ)u&ju($ zt~}%+zȹlY#fuJj["΋))zQgbۢ|yo5{&uEW z9t5Ǖ,ߓ`\f͕>5̘rP:ʫ {B^-C5K8&̡DgT/>%C͈PCSu]/,'(k10G3&+I{Vxs:]; ^PeNS_Iۗ[Z8PYt(gK]7rrxJg0r_?oG_RөxDHԝ7._fRLX`TAFhSoLY 9/G^ZH߆-~e ݞѣ"I>Gf~x7LZQ4=U!`ˣ<CAh։%Sեa;@&^KμﵹoJ|]h\{%XnSm oc%|m+i 3Bw7mUrt|yz3N&v#HLχ~Hi_S9O+[KA_9hj|^a9%\T΁$oXrv?tLm:NQ(!C'_mRQy9uZ K5TqPE18]f{MUL*Q1VhQvIC)\>S/z' :}GDT[J(|}?Tf9re[M3XKvvvՋH rNyQ*JU bp!lS=yo#ouc/G$:,o'gdFK26ʂ;m qbٟNZ: GFD8uO֩.|pÞ@&Sskf} 2uyXkFI֯Əй~Xzj͋'lY uM窽?\_|4O()'V湟KтsЉ̹h[~.=Y̐QȃI~ߔ㩇_k$kϷBELgt+K::otWOgMbj$( c, }JB;6t 5|- W` h,bv]z#EX^Up(0΄ @Tb.W]?浂fa5!1"A2QaBq#3RbCr?͹:ASw BY@n[%<3 RDQtckX .= Wɱ Έ.rx^?ʄpQ^y…-{?$C{](#rT@l"1+q09Uhsh#qyn33B,Y qQwGe#'RhNU>7 g! 5?ZǞ:L5X@C1g[os1`椸7{nrq0FWC) g_uvӏf%3v@Wj;T$#L T]GC꟦\F. A-Az0/'(m`E-jjT<&&q"q?STa~yCF Z0~cu8Ic@K*r-(1"j}@@lmj;b:dNG#wX lTčB"(,:` `c ea>az#t%\R=sU{Fl*|5G9-7+Jgbh.*\U,u_ps|*rq.V:V$A}3UI5O' LwvʋlXAU;, O E;ݙ҃ЀߨxrmFFF9 'hQ @Z3encƀDf1\C$n!rkxنF-MޠP5`ʾ$O/)M91@9fX֦'x-8/>4_j@`@qJ>⚜Qw3AT7B j#J6"{d/ALj70yq= i1Ps/8?FS˗J5Pq؜`4g Md* l7qsfne1Ȍ9'7\k$!uS0#wLO|uLP-.@MTEu[R *}D4v#p'*0c`ka/^@}P4C7U$d*(6@SEb* [br*fr0aZQ5^ SCQA%EL1X4DBkPT@u|&}+/( ֌5@T@.XS1^BLBs}\XBOP '/"E8,^Y[n KjۜKnΥ!7 _{j|!7QMN4@0"gjb ZnjeB@[a/ S`{& 2EajF&JbvAu _p,/EMO8A|lnq>lP@aP)Ʉب8ql}P.Vd 07?@AtnV"gm9-!ˉױ!#,_pplqތɞ+Q{1Abr_ İь2k^s˙ib/Hn]*}n mNz2yɍqD\1GOԡ5Paol `ЏD y]J"+)5C:ơ͗>L@2J U N=En1aV"Z@P؊0-w99q;n3cWY_N*Aq>@gr*dTrW"sr~)x垯}bOP1C׏w8x{rRֵm1:]&N-}S#bVPGn>+#S^%/]F9xqHuUG(uQrXAo%d%zJ0ܦ>C-mf6D339kJj> q5H)Nӓ`gQWp0=L>א*;Ck65 :U0.-\TXq(1ʷoqXP 9z@~g%&,HT9N1xœ21_QBH 3ژB=L`߶zqSɆfĵ7q}r8DMx4 BEb;FZERNl@SԶT%b3(bX9уp7PL uBW:Ћ˾X5bT+1VQ8N,:b -^6P6=CX]n. MjSХ]z#e.+>3]EWS>&רjqo-3ϨRdcD T o}N=#_X&X 0 @1=FǓOnd*E3CVU*1 -ZVE M@Ϲsè2(}fp5 N [nq \]@ϕ^.2FPr* ̔14h㉅u>Bp]|,gL2da^̖ӲCn B_kUK7S3(M6-|kN,E4 )L!BQ1X]R"1ǩ>&X~g9y@)-\4Mz&5 j2fz95j9G9ď$&N"pggPMً^5>Q70 j' v'Ħ+ƚC61UJ2up Pbq;nPe1huOYs)^Sw(wFwgRFFX lg_'`91 DoN[ɏc1*&ƛoS$ƶkGۣp|wL^w 7XٟOa 5ESA!sMT= ύĨYqmFT sqg!'CP6FUs@8;Vj&[&̶)eU?\_=E#~Ȍ>,S]b*a#(@IlBh~.gPUј,@ ;R3QPlTw]X{8?L[#d{薀2wo E&?xIXL>W?Wk]N5Q^UNc>i4!8sUN3mɉj F؟T[R_~Elc 1BDvk p.>Z+|z"'_nS Wp㪌3ų Q kKzm.SB!Yx_5_bbȶOЙ"r:wٱ6[O^ppnTjS9qr8܋Br JSCuVCS O8qZyZ8R%A@b/8Q)~jXT>:n14 @j;߈ڀ.{n3evW*7=8Vٜkޥeޠ (jU {[gĭE oC]uNɀ40p#+~=Fj2"V]8H9?1nG[]C/d@1'ոJQVc`"LLPwqpc>&fdc&rn!$n^R."A?b!*Ek!7ƉF鍊9F1F#Zܿ).w?~Qs5M)5 ZaW`[BbP=ǰ E{3JΎ6΢`Fg4gw518^S*Pn-9,muYj&-;X"s&z&\Z0*w8k_Wg#k`~ uSɔ7|V".ϗt%1[b",&!u!ZiMP! h^rÛiY4 OF ]]n*!{R}Qr/ 0;908̺IJѬ>( {~A6E|Zr[Q@C6ƥTwg#n`8?P 0q?3ğ}LoI2 8PeZE"zXnxK$A* ƌ@|͆#/ 4#=xC㸮igٗ cK1'WV&&_hDp:6g#2`,9)F78gSe 2!(@-lkOn#/<`D/z,\ BQ>U>2qMޣQN^:CQ|!BF+0.gDYww\jbPnh1v.z$R^m0&mLu1n,.)8=Mq\ZN:FрuS./c6=E|KP4Q(jkaqMDBXʸV9lhtn%QN o W= uIu(ߺAzAMŶW(?yW:}( dƔOfP95b| / n2_\@}NPCxrqbu3⢏r01O?#yL2F EECjgVqĈ@'J"T61>4:U]Eϸ{&6 +}N$c-\U ~nES$SXN9?!tLapE$ n+w6)Y7?2НKd+Dq&5381jr*DU3w綇'Xpb19VTQro1wp>c8b@Q !8A-jQ*pUZ O}_h92F=K 6bɡ>vAB>[;nCTbVq-p4jb=&& UxΣډCKc=CrW˨\2 \L ШHhL؜F7Qh{cq?oQ0^N$VUp ?ڜ{e-IkxM.u E$OCgSXϙi E򸜙c cqcf2/>U{b.Kh Pݘ_>5T D^0'+djq'kcSl194.;[B`^Qίp;bD9PY3>(FrZ4*(ƥќy*Cp]C|{1aUQ|8[_3!K?!T,@c4C0UXHd( OLPqG)wCdDr+e8DҜGkU;. Z|~}6fS7-TN=~ "%&w:,},vrM fs7\ُ8EELQ3s@&=Bk''1Cy>TQ хHj|@5qjuuj-!1|좀08ị́TU72BSF|5S0Ab38cDTo1?L/яj)Q-w1p8WqՉŵ;WqwTj&9DLv7U *{6\3Zsq:f2h́U"pTdǕ@E#(&V &Y&Yk& s +P-ynR>@OA{0sX3^vplD8 #B:@`@2|E9fJ. BQ̼^054qdSqKfLw-fKr v.2cSQc~S >ƌ&ϡ8-9rtE qawpkCL*,N\I1'ܛfjaTbD4L:clՃ88 ks6>].;uès6֧ǐ!#U8[k#+#sg-5"/+N㾺r kz;ZèCď]e(X#n]!mOa\g$zGllS (\~~.@d#LVbȌ)LU 7q2 )1g!,T+7 P?&9Pve8_n=k4bQN~blFoq ULڸR>UmQ7ϟ} s0޽@t+zJqRשF+g;Z"H&0Y1~l5?"q`Op)O#QRne_ۇTe$"L>KY!WERpܱ5zhz@ J 6`#QUl\ ?LꮤzX/Pus@Ds%nXl @Q4KJw?qs¬A[m(˟FCPrNWat}Ej8 p_Br$ +b8!Qs P4LA Ǹ[*U1רP''/)fcNH=\eT5ܼeUEEb2p|eS_q#Y5s=A;yP~Pr1FO\LtWǹ @5>Gu҉}FB3< r30LaPPGqDANJ$ZA=n"cGC0f$T`@$lODwp Лq\^Bڜ? K@xB]$n n7*a`顽f6"U#DtA{c]8kGprǃѨH 2\b'/b>nEQDA.c"rjQ|20V SGw9[ v~R15>&.7s" l}:?n>+ޠO H" :S!$MST.Nh> \((E]XzSSnapcܣP7t'7/uSbDG؜>1E@28[hb9?8щI z6@]@=lo|\kcw8>.ʈE|nQhcޡ -Y{s~27}GK ?'Ĉܙl,BC?\hLkL-n*Aޡjc9PUҌLafV.d=6'(*H p0р;Lc<8@N?=x¦M8dz2רIM%w0иPޢPLˀH|Cȥ6xenbdE>8ǍfN191P27Χt&W2]N^6)HBd F FEJc} gDFPzJ#sEOw-q!D*jPIwSfU&8f6#czD4 O)'P]r}#-EN|@n7"'Srp)(E\D}3#Й,&0 ULla+ܢ|^r0f:^ Z|q֌Fq]L&0`8 G-uI3"n6s,a!AB$G#&B|ndt#qQȜoqWo3hT@#A52 OpC'ߨHꢂFpA1{X\Θ񻙫`RWQlf%1ĵu8 ϡ c'^"qƴ|91 TTKs#DvQrgRtj]Z+*A|D{Xv ke[9ZkxM1$LhG#蜀!?/p@8Wbqq|k }w,,o jMv"1ۍSB{] GpFC>6+cT::#=fI@Ô֌P7F!p.; e= 5X}r Q_Jʲ>FįSzhC' q>w/!Q#P$Mϫcbs)꜀CţUgP-JЈa{>`WPlXuqsk;POP|Lk&ln10Lc\N1۸虊1@w1؅oWj|\~t#֧' $Ո"c GiƤ2#S4% +YL8#PHe2y:wsW`G+ SoLo̤+=DJ3b/b.ؖtfBh-_PBVa`j}2FN TC*3aL\O&4ns!VVM=FV=j":1?j::Op 壩Yu8v;j|t;#Mqn6Ugl%`s; n'P_Ќn2((ϓ=dc_T417k930w 0]xsqx*%\SZ:=J_q0TNWƯ Xjc0p{a@؜l050PޣA[؄ O|(eP􉘯rn: \ [J .)`} jYu+#/JN(xqID?‰ʖn'"cMܥ7sS5Q~0BC@9w/p~ND* Y5jQRQ3BcJ&(-UQ'gb8,/+nRmB|N?)S0|ul"~6 #8ȣu8 ќ"9;1{19 qDbSFX3ډt3GA V1P#hnbUW 7߯j1v^rƪc`3* kQ3;uܦU,{lO*qxUq?u D7pec5`#Rn0ig#"2>2DP~zbC=NJ B]И0P;Na:V><>!(w8ύw+*e[Kن)g/ ξN\N!;QyۈE) 0Q:UX`C\=jl@ bwOUp'/}Cy{4CK@j8Ȯ.j7.Ρ ^ V0e1·8jt#7@3ʢ;Eyu>U:''.L 2քVaDu8ц6QvÓyqP+>gmA\y%\t s O:1H-{Tv(UΧU1<[%krTnrdy2k *KzBU> ;dC)90 0d;1jM+j3}šQQM\T?Q 3*Q_{sIuLٸ*_D-Oqw zfcu:'؍llBRZe=%\If:0DÑ:&3+U" ]ύ&8nB@UML҉c%W>FP4"]ADfVюFQ+Mq2l[ Q9N9D-}Q9 +CbYQ#Q?OUª bބj}ϐg^h]|gi9 R@ό,28 wOٙh9]~QϗɌsCٗG7?yf2֦\^]^UESQوh0AF*X*E=\41IqHQVfdNCET[3T``b:+ \r7pz~χ g+yXw8n ݓP3ȯ8uq0*6"qфYLnUI"51M(wb9]%ѾEQ 9{vePlgbzqz֣FETBp.Lw;"TЩٝ W39w>Od`GB!kR )t llBjDuBn 8Qy ;8SD(Ep:njc]N5qXAE/UsD)lY_Sla (!H0B;ݟqFQ%.۩gȁj#NHGp QT's;*/lhB֢+#QtjVb136?39&w*$7 rryN@v P@ùbDsPa2D+2h %DAE4@Au1̇ 7p3=lLX &&=,O]re3b.QX+(Qg[S|rQ.@AWB =@?+n_;kQIcpP ҵ\]qxbAN~c7r]/V8N1 ӗcQu8e AWٔT]0/[ X{h7p(kS!Y*(;1Os<⺋(qASTmQX,7}Χ~G MO+t.YCl -N cPp>[jU#O23qF2  *)z\`Ah)_ DE78b@r̙6&If#bCV'JD$@gLY2#NFj1@쇿sor?x{}6,V6;19KYPoPb7!n *ш7ZE4PBdT{ ՘Q>/!6!V:fn"-a\NNĐcgFhQse~ж3' >[%uZψ)㹓riLOs8ַ1K㒼ʸYnkCbĿ,pK2I_gQM FKU{Lܸ1_Q[L]}@3Q1cG]"38E-P_}Y1p>fnIO{2w3-8@L \㟧*+YfeМ< ~ -b; ]ό3zedz^0 rN^Ry5:5qUwٯfkIYQPК2i@T#sE|g5>f}[CenZ.w LQM7>7 Toc9~@r>$Mѕψ>elN3wG4lEij nK "(1׸C]لP5e?nNl DsAflЃ:s;LUaK T^sT푋͘x Wp CƤʮ9x?/mKorgzQ ބ/qlsFN5\bP3iLG2qjfq3K.LVn 7 9?+q+SrxX ]/Hj9X9R#4n7S؅}G^EU U; N73'uI"+Wqq89~7 EB &*.lt`78'e&q$6Te whqOWS@Tb*I\L{1fKC n}f*)8\½6f7Q?6MGɀGZaq㊸.Z0P *,N^/N5q8ŝAjkK-]b+oBpkFrvBF4ZUܙ=@lNb ؈u93MN3ħsO4!1"A2QaBq#R3bCr?q!;+xE%B"ևmSR%XD-ݜN\m9~Q 6ź2|91E݉nJ4 ]#FNjJ,Y'I!nvTd lX.%]5.ءO~{V91r4##vV+9IG#%-Uѣ;(PѨEZ2LN $Bv_T#h|z.N \شѴJp='RQ:MU2㭢]qqWeވh1NI"q>(Ui"PŤ'蒃|yDbx.R֨r9H匛T8IM96z99n8йГ#Xn&xʬjIOI?(rrbIvJy- >2woBk|Z%"YǗF#p&vBI-)4iئ&mm)z#/"KG?,el¸8;I?)#c*f-vNKP[!z*{VFKFxHG!vNhtE>:ci+)%N7#QN~VM;9&,"gKufbX8槿96Jq~?vG5uelJ?3ܬy"IH"t6F/5Eʑ/8I]I1e7{#&rqx!YdJTECЩ*CV3~,⌠#,DT|K\2k' UD#lԥnɉwG.b0iHnLq_fKE**VPhqkd$7.)A"1lM SEN|n+ɜjPϣuԞՙ)vhbQVOqrJ2"jEd>X>yz;f u m4Nj[6G݉j zgd=Y5BĮ#>)3$$.H>9ӳr"H2eV>XG,sb•<^)NF#)xSjDndy%(%8>Ic؜0v&yL.2iq85b''t\ߋea$Lrodeݍ)JΈ$ΤdzZK)'qU'orrkR>ĝ5FXol[D9!<-3ɬ[>)%:=7eQeF1DZG] У!9e)-H14:k? .U7&s[7}loΎ9kOCm>g*Dy3Gʑ85*f2It%HsF9%ޗ)i1)exw)r e_Դ$stD*%oehGmdՑn.ug')R#֊q{.FX}eRS9FFSL#2uoȔ}O:TGkf35٨_#'&5]*-R䟶rIm[B[92_J0 >TJQuHPh~8%d#'E|d-MrmUIGWBf.햗u&6й#.hx g] O5>=d{vrl&98vW$ZbB;-v8ϱ&odج_)ty(=F>9^+5OEeŗPu =XJc_La")>W|p3ߍvN2p= FU}lqʝIcVJTD$ GZFNѕ2JbkDctƯ~V>kbiء)Dy&1rT''j*|}&1p잺dݡ^N=%9kò?%jZЛ]R.6d.oITEE%˔v$dx!H%KI#%ʹ.3|v-(z.RZdqUe"R6/sy)W8xSe$̼uƛW>5mqN]X&qr_lt\LI]ڣ(;}JU:tWPrXDzu,rFPCEm22M KQm7Cq&FJRD$"N1~[q79rF.IIHkqM<#܍#ȟF6q $"I~x$tx.OI\{gӈW-JTum7[!.IJIáKv)|ݐԻf)89Ta%<{&U"]푕;6m5HjbRIRr1rǢMF no$Q ) 2ȷQVeAi)JDh|i(uܥ$۳)x}(Hgɸ׉ǒlne#rIZ%Ɵb).Ȯ/CjŹg.6=Db)!h㟎nj~wXJ5G[+ȯe\t(EvFkcjcӹF^#̗/cn~BtLV^GƸf2r_aĨMG,9^q&*e17D`O.ɤN9*c1k9l_&V|7⯱EV7؞vM BJLȱl|Qhs܅Tx!?I;ҕqQ||2Mv5)4y-"I2/e4oFlRQ{WC:У{9G*D{DU܅M"~=nHX=gfD(&xNF'%߱8sRv';Qdb+Dpf p싛J47;XV$b8a)=V.IoQKC9e0\h,| K{f+wDTƞz=H8P|n\BFG?"U,z-ޅ>D<+ETpx*8d_Sh!>J<}>W=l(arf'Ʈ=nVHƒ~~,Qz5Gogǎ陫J[{KCwq$GqJ*FQPN8hxC[KIQd]e%N액bz~%IL$ωZbvNm⃌t8Eb>"Wh" W;܊4C'J6C"䛗eԫiVWVi $Dgd DtA&9~XO>OA$rzCB썮F:&IK$i>G+7kJOgg,ᒢ*! cC]|;"/81 dRV/(OK$eG&ߎ7 bs: [- 82x4qq\qd-P>ѓr=QcصжO%ܑp?g7,""7{FD]X۶J- &y%q0qvWv{) iŵMtd= >If?CWh{CCZb+_aVK' .(RX+3IHN:H.3ZPr%*zX!_)r^ض4~;#RPHiEؤ>7EWE8"YSUE6 "|Y-RtN(v#~(&JVrIwF}qmO+VEY(bC^Tug)̤rr@D(G'$"#r.1x䟍 erpi :}>̢F|w썪Fm-it-+ b?&5D`Cf?/g.6Bwvbb}[} R#7{ݏ&}Yx)6zCX^"v$Mv|>u'gISw5䨜sk!)TE$]VǴq_wr7H1d)%#*%um;>Iʖ4AO2N-ݗ5]GheB2#Ė/t%Z_B9XHt1GvO('.8-(>ByIyh]FS]Мkhɧ"KDIQqHod(NMd((.JB0Pl0\N/£ [g~GnyZEDn>I81!I^ƥ8R5ŵGO!;1D`),F2g$B~5FXVG 2z~&tr_G1lE( q)b#Iɡ".-ф%}7[2Elo|_&OSJHmCH++<ܫTG32M#hr"CJmtO̒^;K㕢1Q8K $]L{g$F'uc&NXhᗂخI;+J):V7r{+0H t#lQTq)V>7$≭XJDZʇ] JNFv.JYg+cn<ϊP ڣcѝveb1"[IMHx Qr (I?de|G#ɸqd#M)Jľ8n0"TEJQ% ZHPݡqD菁ytʇ'S(g_~tvrq|d1NR_KcUأ5;G4ZV)+;'oHTqIŢT諒dJeHSVvY"s~l&G0jh?W !=dEo7ܘ#jVn(++v9 b+.gk8^jJDJ_ Ȭncd]~G(E`#ߡKGRNNVFBIw%c} |Y^D1l~c93BHq_Ēއ8=ъ;G6ݏd^1FqD\)G2%(KEhj$C1KG8o5тKDx[0)~ě$?i{%fxz8!KOGJ87HNTFT4̨XC}1F$E"I⌷E:V_,hsд)!Q\58ے%z$BAQ)Fl< %'.8/E'%r|k+%*dc>G4=}?KG' ^7d8dtG:'Op3z (aEމy#*G%ً%M7t%%ۢr9Pi:쵘IՖ5jB(9YgƈZ8ɫ6-FC?# ؊1e.5xTF_9fz$ܴ$J~&B;7 Z{$N%1}c$hp4q2c//% 642\NN=>?dinH,E2ѭŊ*}^蜗*֏%%(]H}KqdjC Wb]_ '>)gf6x J${Œƹ$%ɺYt|_h~KfkG.dxh і*ύ9WCk)~Z2i([1%KmV-Xdcz!dɏxZ"RI!Z'( I!J*$Mgec=əd?xУz>xBNt/F^pd[DV${V\VhN[|n*#h|%4n'"ulCc`c''D#oFX&N95ײ6co!6D8Ӎ[#bk_dpN>>CxKd}N=[r‘}wnԝY6Y ߢv5tIJ P1XK+K)5Nؤ&F>Ʋ>(gJ-P1D~ԅ}e#'%hFEdݳ czed"2Kш䊭5#ˡIbF#3DB*Wd1jO'Mz'r\C\/.LN98?tFwфC+;作rC㵍Q"3Id^O1!Ip&bi^ϒQ%Ȣ$RuH"sJmv&'qVv9b:_CNZ&yYJ%ȶ?)PO'i1E&9o_7yde/CYJFHm]\./7(qڲ;d}4(_Ւֈ7F8˄U!T.HШLy +Y><Dc.[V|m5j98-Cb[% d%9#=9z#eŚL#x#F=hllCNIi+G0Mi}iZ>G$5LNi-c]=Yl{>EKV;ܯD$:Q~HIƐ<_r$KHSd'J-S+Z8~:)_[Rd%"!'Vz-G؋ɜmiJR~6cQ1M[d:#l69Etg=z=Y9s+*7GơHBN~IHNR:hsv&*qod{rJȋ -?7J$^g]yH^zbz%5FYUj\qtrN*IJ1! 5D[}9TW7%qd'}2)#\r0~H|3tئ8)G-Q8Ja<8`G/$i}t^9'{茖HGٜp)JlR_OZ>bSEF21Rױ_{/t== =rvT*=ltJ-v)F7̱PrYɒO)CxdZP7Dx99|סZc'eZd8ɫCdyGHY2휜Rr{>76gմ&Kc{2Pٛ?- 8YN)?D%8-IFm4 Ke vKeE~Db}|d6އ1yedVHD7,g[8Ԍo=|vBUgRFY?rRda,\sBMe㣗Icbg윲+F9{/&F |&OPt9J+$,M(n.J:[d9.2q1.)X {Hv֎&W! N9"?]21L愓M3PM]nȽ_G'"UfR8d!-1rZB*/i;fW l$mK}?#KctnLKM),d)5LPQ0F[?rkײASdcDžmXcmڢ*\ēل;Ȍ'ԒN2ls#5&N2oc'$׋$=Blrb7Z'88WJ}yǢSIIAK-/C{#8Rȓ+!] *Kqq}O\dOD >$9dʈ0v#8GKfp&-1mA,NB輌RTbاYЛ"-1cvE~O ]iiqVqI+Lggrq4I/)x5/O#l:dfd} n8Dz>'Q>̤7'ƒ"2ld1Z KJDj^Pz%]"}߱_II{;BV+,I\S5T=4ǤRJϷ'iQY]FِȨՖ5NIo㑓M (Jޘ8ґ99xq2qZ(/lS{"?㣗O8v|(_G9*+||n ъWń2d%9IסǒZvc9:ђ}MQ~V=-|bŕljĥ[0ѻG*j X78Ҫ J脱v%r M.6֨+nEfTNr]hr+?Ź|sb4971Wq?*1fOؠ89e'5휜1Opy&LTK|y JYtroe^J.9SJ}%:-N'3r9&-P欷~NWbY6ӶF JQ>;e+ٍ}(MVZ$[.ZBd{ml./TQ3RVoKϳ'R?F1dIM %ד\x2%'nٔ.8%-HԔcMZ){3YPọ̄ZBzf[HdD:._CLQ)uC#H%J?qJ쎷d*$г؟ȣJrȚc)ķ-Q/Et8섡b'~=ɕ]!.\Jeq*VCv|?#9rZI%eMԬJ]#h(%hQP-MyZ8N.:v>T*%ƿ%̛]Qq!h+a%%-J:'QD>ݒ=\O|]ވQ2%hɭ ) :Gb脒Ż#$ֈKhVcǤR^s脣/rz)"_I.]Hļm)}U$^Z"OeCnű)$|6e=EQmliiXlR)2zxYCZQ鉱4J1U*GJiXԆG!(YzD"[ƛ ER=F2~bD\T1#MGGע-#+퓓gdrlQb>?^O9rpzbRwCN?NhE&?hƣFZ&(FMQ+ij#&hG{8-T.F 'ػǖ'#䎣d9g6ɹcbޙ!ʻ!;nTkD )HV.qG Fn+I^]*T5)!{'Zߡ=G1Bq J_J?Ԅen_4]e%'Zb&%z'w~(eD]V\hKGTW{#8Z^"י)wZ*OBdkRڡ"FAB~bKd^ݓͮѦƕ l^"sDz2BȕhrHo$R/.ܖcm6cTH>=Eigٷ &NIld4A9&s^h%О.59—d[eD_J |x,ƶlp]g^$RC^F~[Vʈ#KF};MKsOf%?F5A'*+#Rm7g]( טg=*^VBS~L'Bi~ O\`>KFu']#z-eA} 1$Wz$苦Iƿed[RLLs :++*"@IQ'% fMk(*qU7ӏ$rZDH kG3KWg-'CV.QZ2u~;kt7[)].K*$GGj)|k[6'oNp(܎o95uKvb!K5+DGȋlU~''kuc+G=hƉctXBD+G2"dT$Mʙ%{g| 9[U&IZ枆'~#'Yl_(fJR^KYGMKEK(h)c{bCb~C#M$__FRdHu?(ohδ!AE oDR!KrJL?'e7m#o?6V8nDH98nD(N#!F'D[vb!hd)9=EFHI<RTKFE_CoKcEdӃTa&B |ETGZ:HlO+R6إْ#%i]Y-jKM9hR36&7-L~IOcH{Lh}TIy-J4f-EqEPg?mQâ3WB4Ǒ M)ۦ&+4**Kd䗕+T}z84{NyIJR}liH룽seq#XZd]5V/d''FԵGhOE*iꎿ[O&M[T9G=O8Idkd8ݑzaT$6'hʉPg,Tz:qp勯Hz#q~rKњdRJ:9N6Х)hn񦏅A*uWT7([hw؝RCtGIRHMCǴS ư+7WCКXKQv`&"&G"kdYEvΊR65JeC5i»?'1F7OF$m#-j?D"蝷KCf Nɵtإ5$FIУE-XI_H"f/EQ+1Z.UDf9G̒ӫ#&N9߲>*LB*;] XG.eͩFy12<ڡEG s$BLt4%eEVU Wci!%T}VE<)~hV%W} ZGCz5g#j[G,nؿ!%XkQKgU|yEQhQUͷF{%ТGЦ~ndɱ'ش$.$݉DUtJ"heh%DMdˤ58V%$ކw7cمl[jS(| j'x⚒8ႣʢM1G_hjHJRxkbIy?%_!DbUWЭrk.O^ɺ臒?Q-9O#7^Ha,]gG UШ_QTqyDQGBT(KlQpB88C!"1A2Qaq#BR3$bCr4Sc%Ds?~lToImRP:D|?޿֣xA! lW%aВ7ЕZnv+t95tⲷpN vCkE H$6kL&Z.#Iilt^ƶkɘ-i=z~9pQkK N=j81>yo!o}S m %y#㤕E‘++RIϏ2j&Q#,aގLKmC挱ޏ_kޔ;{mM6!-Y|Wo~r3޵YI2[RO>z{Й3d}S@v5+H5*mז.@WlCތhT<]ͽPҫ';мG^Fʤg!Ʀy'/RZZpyїqMǘ.'$_s/2\k_f%oG|.穵q3V=2n'?,Zf_޸Fq)ǥڏVvJcp`ؚ-O@1'sF`?:7$MCQEDځ/Mڴ񙂏7[ZU [Gl[QMFymY+]n.Wz>$e6jpŸn uv͵BcnV߭4`|}jY^ĉ$wǵE7|z y1iPjlv$e[{>˨r{cZ(vDOyQi/e)yr)5&l%X.9G3u5ҷ|h ]kNŕVlI&wB2XN(ʳ_cG䉬/XhuS®OFYΜc0F+yw[:"iќq>%,E7%*k#۵c46Pd*7k"I4.S( L1Tj$!VO,٠jq|vbR'}Za@OQZ,aڧ!Z%CS0S#nynj#azR)ͨf+[tGҵsqnb\ԧTd7ٍRPhW+)%zT$b -Rm{xh]I%QɵT\c ^͙+]e?(qlZ{rޯi/zB$6֠і^R YHq.*r-THǧzC&EHjEN#h4ӱE{HzUrFͺ./Onu+RLOP* L@ ҦYpǔ(Qj S֘!m]mRԜiy jCItTŎ+_j,JO 6Yb[S\V\m{Q.mץn_4|6޵x{Ӕ[oz2ʍ U"B4k%?t޸aZԏ(UL;(U̹[.Qj6#Daq)}޳oڣMDѬ6G*JAu گ돥O!H_LMwv*QbrO* 0LO[0m\[[n|lI۽LjNV׌պ^ ʗja Ite5;NgPjupo!f-ZH+NǑk)x_ёTWχX8nk`rd x{S3⯧LwQ{kR9eȄ[.چh|c8PֹF >Tc;1^%7'4lޡ2c_j//$N zDDmEK"z#cڴ1fCߖ}{T\T67ߛ~KVXyn]C}VQ߯Ja X{TEeRnM*;uZ4oiWSm9n3 cI!^ǽxRV.:_J6S2C>^ |K,:D MZQ.ҾL-Z7S4"9yM:Rjh8_H\ V}فn\G[*^ 4V䗒eS2/1p_޵B%Yf>%N E#?*6)U;jsrVpϟ&-ZxVR=QdGPZ$^ 2|jpN[Vtuc'Pگe{_z+fЈWнwwMǵG|5ϒcEק:}TK݇<B,DX a*_9Բf:Tep'26'~F0wT ]\IQENqacsX@_O[j/.KT >n<ƆSE/J! J,٩6wmmxZ"8V2ck^4.jPؐ7[ӫbToW|[-HWy+V1*+ޒol[-R 9q>#6mr+4[ֳ:֔gnoN@?#8ⴼ96'H1v4BSW{])P;{Tht"H Oڠ0](ia06k P~0dzzCLF!v7=w:ɼ6hZHe6E'cnסM\ؕz! ŵ #_wR UѰkR$)ГLɗo*R##$l$Wj ~T FimzY~+Q.Q|W/z1UQڵ1 ~ᷥ1ʿjU? ʔ,y6 )W) xH}(FIͱ7kG KLz¯KzČF|>W⸛qjbtpಟV4QMʀoZ? ڴq2J-E~?LGg Qj8e~ŌB_z`](lyR8XoRI&lm|HEK!K #?-jX?cb;֚ B˳2t_ZIu* k ƣif&~ώG ?/<>,315o֔!d-4y+dj}7v<_zU# Հ-,F1?jD[7%M2-N>eTlj+L/[u?%LW?5"k{Zv+~}QK(ͩr8{6Cq~1*qjbvo.RSuޙTټN7ާdzt>TE ڊjyA5M#w."1*\ߖ漿Ε+jJ.7rn ̌ŝ)>%o*'BݍzhRuGH_7\(‘Uz[ڦ 3WW/.^Tc&ڭVۯ)clYl,p}faN;/!L ϯ `r*>pEUN_=HeMŲՋonҬ*jwm+"Eq'!wh5 sڔ ~ jszT/ ɻ P $δ@kC",Y^^ qptEŸXf.U])XV oj9,zIcW=XD#0Wn?z`1`n-{ IRv&h.G(jdL/ek mZ)mv)9ص>+scE)&ەڢ}G&]i$fƌV(E˭<<5@țR149noDwRQnIs{(e!sֵwuٔ “n. z׈ef0)ۛŶWqEPI{K n:ֹcq|Ψyފ#v Q7&]"\؅7]_kڤYq㱵j.Wf?l6T\}i섲K>kDjِع^A{+"iۖQRD9.}EOgV[xJQ|cR+Re 3yV[$yD#Y !6 ਷ojS=2 ml`yO(>`E2[ڎ6ۧ03E-xd1 &5 Vr# g? yW4JlO-PbOnyG7i pRmZN!l9S߽L%2ɫ'xP Z=N}]jٳ\>"j0ԁ[=/J8yz*\㍍ZҬR"~TljCǵ &%6ʴ@SZ{Xv|y{zHKS|֢ӽŷif8Ѻƕ\-[S_@͍8c21ϝF4G`d$u%a'UFtINb4\\0DV%Eq#"GE7ؗz4ʣz PMtE $sSaX, 7AS\R8M ^_Tx͚tLc||AlOܑ'"ܦm}Oq@Ip:46rLl9 yT\k޵whʏh*[R?}Ew[AZc`gH(8}oܰڥ1$y\rcz7#K]sL8C`݅Ք9\I:^],-z.%&[[o$ku"3)X'i}ɵ3&R^}eң|ckHFXWŐe{Cd1l<Ns6nA6@ci*l1ހx`g,B&J(*U啣%> 7۵@p/% ZӴx 6vXVP'{ԪV<ԁw/%#`MiʮQ:hHHKtQH4cڜ8Y,rj?DB uLVK QzFc&.T֮r֮<#mJeJ6Zʬv4΁c&ޣ(7bBہm؎:'_-aZmC<@TpM~ҴG/xQ㯧(XD V;$d,5 ߶#sPC'PJR޹ĊV0#}i~Q4%DzQdHk^wHc!+NY R-kza$nx$+ mV**aE:XnL[XrSOD:)>1" ajvS#= 9syc}-W8سV3 H@4(Ypq92Q.i P֠ {1wK sTf]J1(3NOoSi@zYaxE頂oT#zq|\?ytǿkyVlߥM1UεK_% Zui&Dav:y %XM˒G+8_j#FeQ;mRwңK ZBj=c9o}P:}+J9IRyzZPX{RmK PR3%QmWۥrEs3 cKqt|92dyQ̆/5 ll<|_4|i֝G [Qow_Z)*A<0Hƫ׽(r+a幤eazibym.2O0pVFg^zTc C$!R& 9%6AKcoPR6$-TRVnbm@XߥFl‹FڎoJP6V}#ޢxV1k)0c#ga{R#&DZ?%E[S' IkT=N{fRlU6[vm?*o#f#n"L8TTƩc/zēBcS,8aq鹥 dWD߯6,zޣtB9("QTUI q^Zwrޠ]6 v*Z<FvxZIq:xy D#[ԌiQ؄9D͡Av?/7rra͍Z3$,C@Y]ҘG{VNEW*#[_*2[mfc;|y!\n eK#F ڦ(n 5P`bgPw"G%Ƚ:?jSeV LoΚrU%[W%/$j]G5ޡ {vB! j8&mҢÆEL%M;L3n7.}1 0E WWr^ԸF`?F:i?x&o)UAZG]RR:/`ʦ`[5Y8^+u!5 ] $Qacqk8w -ͨ2oԈ1+J~S6;Ԏ>^"7>bI1x{ڤ`:S#x16֣7Ǭkjhh'qMDٲHѸn@ޙx0 ְaZAuUi[OK8:]G|K6jYW?8H#rHZ&}B9[/Tr,Z' ~SG. l)#{0c ywү4(ow PA(mW`kPM+[!gftjXogtj/uw| }zܢzq#0iB&G1V";m@^qw`U1U#ۿ,i6 [wfeKxZE1b5M?4TZi>+O"i&CzVd zHpn޹ TF]kV%Ab-z}D@URHqj<ʦߧK8)aczhN[D;[Hxj)h" n$`(I#q(nm8,>o$ۘ25A r_j׶b/=76u gwGcm@2Kx~-$ùyba6)Q'FI~x}wԜ9r6j`esaf=9zI[xמUuՖ#/]{A֒:0CڸS&dF5ӠP('?E#Ag5[ ֢WT6J D V01e> W"R:{zTF1(4ftv{HC;B.[_V~c‡#[b*1h^.^ʲ:[x0A+83TK7 &v[sX{[E 7޼;֬ `T]v6)s\M*:XtnÕ׸M$}H+2s3mR+1dy8qll֙eKfmޱ*vR)A _dSɦ(ٖ*[*$9z},F/ku$p>?Ҥ J.#U *b# ž&ɔT:#@W mmS$txG*b4~֣,Ǘj)"Z mBHv`Ҙ#|MNH7mAOEBX?Jΐ͏$JUm<}QR6cӟi:ha*A%q߽.;64Xm+)/ހ8`ȨFP+Y -~і8#țS~0R&)ZӥS!+K ņno5]-ڡ;c8|z}Q0\xn+L1lm|z41*lixC}Ve(#b@hPV E ÷H@~bIqҘ9j̀[ZI{vH`MY7[o֧u(m~߽ڊYMq>c 4*rOF7g~%`^5Ղ~%8]};#W1k-b:B[%u=ɤ̵-A("Iy Oil7Cq&;*vR´kp2XqՔp+~u/@է^.AAèrn؞gix֒Ua`qdvr!֡p'P`$5!Y1%]#Ai$csH^`ͽ .W!`ﰨԦ |H\95W2-,ͷ7sQu#:ړ .vC(Tr})/{pd|TMnZ{c2ߥzt*i0]w(g LФq/[xho؏RX[޵ǂFq^[Y;T60?P7]377;nsS^@X:叝zrPTBnDb;3)KKJyXf!3Jl6Zh;j1 nڥEX_o*@`'aB*cZ}M6˵H,*/kR4X{n̢$RAxZ9wRR6H\yc򷑭DIP; MSkjoޖ!,m"WnUa&#ˉN|?`ǣyQ$En ,<#?uF^aNg%[ou'YOȽ/^We̞u+ۆ./noCCrTH#㟗E~ mZQcqR. lJb<.K_inZU^1Gml*1QJ(:Ȱ'N2:XvU .#DKUƼ5^Myv:"en愲nu'rlc#7"ɘ.դIY#l풽_/JEi][pgc!ulڴ%jԲJs֧X qҒۚ:Q U+t;Qt9oԪq|ޙ_P5mfu S,HCjA #؅sP#@# qbצ(<T,$@[;T$ݨyxz&1*~G,2XO[{1Ѭ K cD""6Juw[}Tw6X?2nqOAmը'YDjVMb._23Q9XfikS4 1^;V½x Z#Yr{cЕ(0-+|F1-K$ec3"GsI IO-IbiQ 8oޙxs]Ne0 vIu s>ux4.U RQHxGjVDN~ȊF7 "8?\QBIjK슃sz$j >j8lkjӴF%{c)DL/JvLk\PˡnW"A3-#fRxHfIE XmޥIٽEIc^2/mH 7L\*bg,cr(ʚtܯM!&C}WDeM 䬃q#%ehb"gmc⤅,䀶-HxQl.ӎpo~{ԤH}բM;,m$5֓-R~# )u*XoCKxfZXFKnb~ DXɷBe'l/E&ezjD]8IX۩ðV8Dv[mI: ӠHd@:金a}pԢʴ*F⪲ERq.^an(]6qpSu@eWQnn,vI_:H ^D![Sq(Q+QkQ~/O#IkN"I,E8 j 9Kx{\U{OK?<>‹N6ڠ2eWXcb J"VuLmNr*lP ؚ2K amjE<+mj&S)C)_jxl/j7D>n ){V2][֠ŎŠqEPޔosxzG_ Pc/PjP-~TjHj'bT'. *zV'.:i48GMdÕl;j߇y᩵u~թv8ke9rmVO*U(#zrq`ް8a ;W}55;Tɓ,hl[Ţ獀U@}X(۵Te)|kI*B OJ5JYYOAD iiĎyuF4Bu֜ vMy' (k~ v_+֜LcY/eʐpX|T˅IGf[b{I鹍(ԯarGne  uڱ TɓcvsBERQ7GcKH1'}鲰؁T#E$8o֞cөeޢ%ԸT2!7Qm¹ڤxȀuECd7\H8+ʨ49TyޖNJ:b;nZ6̇aɈ=:8#REޕ4:1A%}*3,pp'qש$m#o)['L&Q6"ػ\]p TyvK)f -3HdyJk|c("DSIVɽWmu[#,)K/*.65@ 2#TD" ڤh3VK! mc%eu܁+^&:DT*{tU|:ԐYOi!gȔ\s6[%Y%6*9n֤֩d!w~+S 1;#-uF+oL!*qb= vknUڑXZ3eW=k"}?:jwoֿ҃Dt?GRН\^$yÀj[2ǻ{֝E~ur7czR.GH#< mjZl1Up \VIͲl-ްamBILJ_kT4 Cb<^tGQڤ v6F0ߛ4AYS*)>wA7ʝǑ J#`u|ּGkw  Ms6E&bD=֓X'b<]iH|ʤbmQ4Hr*7ǭ$r[|?W}SЈ#J+a0IcZSkV)"XQzק(r\]zuHNPf,AsZM>L=`{E`v=|jS#=*C,ײ=H35T? MW^sKuJr4>D! e[/0d[ C[&9-͇Ztk Y|a|T˓ڬǷ|5<+4n`y,zPC2vUV-4; ~NSۯ3*(NcD@[c3t.t;] EK+ HFfq=<_jM^4&e]j!| .eJ FEvB b\z1ǂE`ڎLx+ܟJ9r9#{R$a\IM],EQ:*&Pm} d&,|-ҿ܏mbXǵp\zMJ7 T\[@mw{R!mɳu$~UUuN[0~' _B5͔U8;zkN#h!%*ilh˓o\IfsJ4i>}Px{1G,za*5!@dZ-$( I`?0@If~{֠EL[fem\:oƶ8a6YۥP=}\3$p|_-T3-?Nj0εp2?ʕSVU+!F$X^KƂ!mVMDńūE1:jiuQ+qn$Hr4㹭 14\[jm|j.K tq=@*(ѫo#"nn:Б⼀"MǿGskQè97RaLo߭FGrm~9; ckbj9nzDn{Ԝ(ᏋQs{ӨMZ$;u~Ҍ20tTT[LF3-V]Yp(CÌr;j7mt۽1KxҕUWΩ%́'ޚ=D4БL2Q&1ܷ09ƈd^sפmBGfUVIRLQ_J,bEccZyI%mY<\D+_ޢhl -V@ݐ[sojgXiIR~ƙX[ȽCpPƉ?5uڸ/EOh?Kԅ㍘DhV˖"a;S*]\-ptJ_FEPē^a&A->F}6680>xg9ejA&O{iU\ձ?QÈx$ `mQY%G#{kHA:gL֒%X}HP|H1:ޕ1b\EPM zҮir:^CzF߽Bs~Y_qDo4!^5vF9APGl1DP$AqzȪ[ΆUr$~%J $rNߝUn֢tR㠭Z 5 :Pi Mcjs2w[N2i Pw{Q2+<5W0m:rI^hIǧ{Sjp^4s`NS#@Z9~+—Ǚh9tPIōj44v,$-bERu?3.1yLR"GaG i`t݆KM_Gʵ1@Q~QWX%w;׈15H7)WĘY#7Jj w7Q?ZcOM`bzަ(# zoSxGklkEI[jҞ&Q'-]G.o:&~gzErZeh KZq"2޸OҴCM"RO(ѧ%C4,ʦmJ T`GoJ]"aHж+8,c <ʜG#R+FQAGeZ}F095Š6nPg/y-R4ve1o3W u ҖokF_ S/֕S`Kz")6# qgG3}EWOQO} BU?$$E*"bUwLXfIb7=Mkh"|jR;ZVLt;t$M{k֣Z0JmkVmEN0 d7 ^sKƱRoKu86ĉg]L9/V>dܥ޵:jjcVp׽" ҩNNZLkR`iTb3^~;!sv6ByQ5`[rGLF;^Z`QȓƎNҥvx| L:erl*Yk8FpFR X[kԖMlz c9sj<%?ޤHPHҵ*&+Nqk]Cڵ,wW[cKxzƱBvi1 aZs'Jֈ^6{R#I#ժR!6QV {9,zR/ {kPoΥToJHWOq+F֑ W|zKʼnWe˿97|%Ӥ<;4ȑe䓽a'#g[kkm?,HORC/2ݏX=*,PNkuvj$q! 1_>oQBc Ynz~u |#pך)\5SW߭xyYNժVo( ZEojE$&w0n bIvԣN,ۮŅ)de6Z1#"ʒU?@AEz{J))"+d=O I|#c˿,/*\aj0TE0B:m_$ .3hN?i A77_ֵJÐ,H5 #K& 9$AS6m4q눲&l-Vg/Ϸo q"ojб> S/%jtA+MLa@an*XT[zKǥI,*K6:}.WT?:)c*W\LkYA<^+ֵJ81N`RQ(7D;tcZ/A `l2;RpR|Z,I7?Fo`$Zь\ЍO*ƹoʊ֐CȒnWh.+zN9@ڡhۇ^itѨ2-Pe " WȈDһxVk8U[˭ r-2ZuT>/1T܁gl7$>2ȫn¢f}\\t֩;" @E*۩8tݏZF295FPq(+_A{SJ_dX/;^B׽Lp#S7Z/6Oh44ey*I4gP 9iCc!nM5g9ZbouwVeTKnO(, dTݿ:1d{v3MmODL(q>]jiW 秮0=Yy|j"U:TT[ڝ,mphLE=j@5oDH9RHzBo^tY:r?j)`Q{E6BGkcyQXᮧ3qxJ~e |\"j3k[ޗOG ;rY<9΁Kc-\xRimeᑸ@#kb9M4d+(lHDMÔEC|N!^[R 6C\zzLI?/Ƚ)x3z2jE Wq ,{JciZ$"ڕ C&'>~1t&ۥFgҙgqz+ɉu$?å 731fYq{mCK\pXӢzwǪA"+YK6}?&@6'u^'6׽&I&k8_1&ϕM.Nep2loZs$DyH1Kmp:{SiOul6ޤ=3 ԉש νhxI*۝S6h%U]\kqKdqlI9DZj$#oOK:Uoޕ.ybi >i1䵁қVV=ޤ9|&hS"|8H]*0p6ScaƵN$LȮ'43eF`cJxWhoϽCHUXe==j/n`-7NȬQj$GfB g:X r饑UũP]Go΄VQa~LyVjS>*˧M핪00Rַ_:02Xސ >Y d_oR2RcCOf1ͻVޘ&|131gޕ&QqlmޢI;-Ͻoɮ?ZPc>wIte"/zb-.U-+u(+l:Ho4ǖMۜzDHQf7oBx|O6ڥFre*:"WyO}Oi3Qm)Diq6q)VKsR$@FEU4M\vc}K,1LPayG7! M*b6FQ̬1dv4,m-:[׊MJ#Ƨ+w6N'zF39zю"3kTn]$Fxf&17<#LaqbW13&J\ @9[K(i11#i,CZTD]9?G#quZe$I+ZӤQl8u n4Π޴2dzdnmߥ F=)6Pze LHFQ`I*nԹR4r[GWw+Z3úσof|,rԮɏ"ޤa˜@c ICjg%z@? 7`YcJܢ3F`Yl566\7& "Y9@lmҦ^-ʹ[Te.X0rcɄmcԛ[/Gq4tTih|o*yG@mO U*xng~|HH9_ 5I02ӫ=;W b;VONE67LS+n|Xt ؚg-|j_L\A;0*sPc6 k'mL7Tr?jhⴑyTZH!"6[nI&KqoMM{u] 7S؜Ź510O3@G0@r~1XoN0 ߵLf֤bnYO_ʾ|'&~UJ&I)qb֨x˹f9/oz2E l7^FcT\T,ߥH?|4a.7#aj1J8{w͞ bwI`K푬8m:қqHO-#tpfE^WaiKGkֵ`됖]Wr t<+3yZB_:K"i7^y}*Hm<Ѳ\Oj!/2IuK0f2MxkcjT]nr;ԣ]uua#jY՝?9SFʀ-j&*u]jr.⦺SGLW Yx+%]R)'f)L10 AQ`0KUå&xc-9m}J/{5'r3 O[޸1a~gC"_ڡşqzeQf!}Y? 򰝬 jA>*8n΁ 56@d$^7-FK?)$N@4@B$vf+}N[r͵t?͛C7YsM,k`nzuAkZL)bek}H_26SieFnv6\t囜ߨ%Psҳ[2eIpKw*os5g p++/nĺOt6VR Qo,PO5)sh=E:*6ߚ<G|vi8Dy6vE^{ZH%1ɷAޥӟ:҂g*HJ wރ|ۂHt_| ; }j8&cȠ|Z jhvT<\mb$;{TQy!OoZئDl)&]UeRB+{)-aK9;ReǽJ#+$}'5ԅDlsYr>o@ +_aҾמ2;m5oŽ! &!y<)pSfF s!ftXHFW=wcd!␣FI&,mT-=Ÿ7c]:I#Z=8[98q2S~Z,,p;1v~׵,q s}E*ݨn,D[+һ* g9S}DJGĭjy$Xc~佨⤏zg}E"q\<~.x83l17ZrW>nEOpǩ cvm֚H⋀36Vabms׵c9IJ5bקDQ}7 {|9򣜑J%ޢx_F|M#|nc41o(M"lIk:_o9d|zy~7 US0 mnt56[£Us~yM7uNo֤.ݤpō`Evk&c蹍rR7jY&sJT ޴t#iڝfv,zC;Lsb;ҋ[3}\ܛo֡e6Zj'X8ס=/Zm $)7'.I߽E" 6kXnM' )qrmK+v;j靮l eehMђ7h>Pw Sh t.kjr1fzӞUzlc*+od8?[ LbRec!:2V݉B2aKӠĝӴ $Z /+'(xzn{dEPnn)E<'q) |E*}t}X_=Cs+#u,&a9>֔jdYsɑv41b1u3oZ%*XB 1C&! Af-o1Xg+J0\%֤IOR#$0?|*S2Y7d#Z,8+d2ڃ Uާ2 F6jqw *'nބ 8;_:Ͽib``9*mĆE'79Etˤs6K~3%v=IyNM|sz1>^"77q,V81_R7T֬8p{\e`Va͖_Fc+ BI4kc_-ɩuj t).*]?vYz.ʴPYSTFXrqe1*r%sv'#$P縭>7eFxk‰X,RgZF8LL=u|Oc@1KcHHUcs m0RNūOu &mQE1؝5 b.THl> sdfۜu2sQHqV•uz];HYG-JMQf2"ۯ[T|A%ߜ n;ڦ1 ։:5ͥ>ËgF '`mzvlZIN,m܁Z@,|PKo=Rݦ;)`O\12#Rֿ֧] AĬ,[~ HQ%=z-#cL15C[+PMб6{HzVLjdŏzryU$pU,WC/&c2A%]KeqYqUdNhK:5H2ko*LK~12SD9|cGQcKR!l}Ί<7p1.zvq^`7nڤm+r 59ddua+\Q[ -ҡ>1[3K.]EHN`*4vTqX1 mR@C{)֟9)X ۔}SY,jgLOQ"D#4p`eR,.SkmWį1;ӽܗCq6#H?67'Q ı;ޤV Ա.ݮmE 9^2FnsRiR"nר|5ڦr ?QFkd,(,hKo]3F{uڷf}3?c69GRA"NU4"˟#zj%/djl/:XVbof4^g~,:Jo,Gs~co'5 ڸwݓ+Ʌ[_Žc[yޥ7*eQ#$p.mUn׵\B{V(X Z 4(7^7Yl9E`47Q"ۚ^֟HWlE díj%U-!d $ef?ڴh#;ݭ}JG`TTfL Au=QơǧRDoڎMQZ\o*v/ۦ^$JLCڒIC ᛪe˿\S$d]y c|U.͵ޚ_<ԥs~U$XZg~^]?uVZ^yAwǕ0rc|jmP.8Nn0Li14[RըM@Pq7T7ZG~#3k ӵ֢߮C,DN'f!z[ŒH\͹_3R@vKz#iEϋ m n2Qè{ɖVKjYN~Rlk[[}%r;t'oqs7;eĽ?JK9gZbr Q=L\q=*Xd,I s3t9uӻoľM3[g~!'b+kX__MZj8ִ) fV2ټ; @Pt[oQ.'crIp0N+E?rh*Ir*Ím,-Oresw$4ud.ܭ%61Jl ncSN7>uָkeNs&V_1դGco?*ܱ2qmBձ!h" ÿj$G7$ u+a߰JYnhM" ;]Zث(Zt6_KN-zxJ ^f^nRM),QPX78n!t[ƹl~۶˸SsƦi5q5# X{Zkx;TF\tmMTw'.MD@~x:Ve5#}IW67f6`N*NHԆ޸93z&I7ju[&uڤ nM]ҢEvazӓ:Ql/jF ✌ieƔ.?J2\畯z]/j rY/=t:' [lZN/)n@T `$\&j7VwYNlr4ub&J _õD:5fOaQOb]#݇X<ʣkZ־%-[jҖ9[s;\&W;jUy32lP飖FRim֣a XwA/ sn|k=)L=J[P9SUuꯉHB[< lAeȫsΒeћۥa y>fp]%ԏJa낡cnnڣ⭌nSBe zӍ""$Bޣ$ӯ#IbmL>K~U@mqR+V8&oQJNZ>ſ< \g; YzV\ (ܠߛ3ފ<~DIOyu*ϿM6lQdGIϝ:%hyjkɸոڻ>|mRpkZU^Y.::_{p33{׈T\}\n EG^cڗ9uE-'J4:[S̟NDT"b,TIK].zM2*Y!L?K/m:U:^\4vh[ڟc xy}#IqnJlp,G1Ԓ)c җCö^vZ=An M\ti2;=փJqKl, s֛I/WQxw~ 콏ڥ&9nQ˾av_soZyWɺRƌ_9ޤDY5kk%ڙK_ڥnl7<ڀPuҌR% Rܳ [}i$vVZtLq6"u {]B^֤1$c}#[ MjC#+ڵEkݼFXx5=FMg/Sڤ1fROb=,{s~4nvoMf0Iw_.S~Syy4_ +txQq5:rgOm0qdiE~8-4`'M͇m=T(])9I ݎ+{V˕Y`cJ+&}ϯJ3p-cGp45U? 工fp2\N f{2]w4Fr.L`=*5Q8x3_,N$߭E8N9Q%6}JHV>%Ԟg46@Zd )P_6zQHXU/k*UCҊ8 I/0 R$ 3Dܤ ;o;O \Dh*"{V`UDsS ar;m҉Q$poަ@Yl׭M&L jdS[PIlztbS6AM[<[u"z.4& |ż9Flc]v@CTEc__91:~S֊$=pmoJ51' Ck'2mަS0rۏP|ٮrxޘٷR$6[QM, 65%oA6%\$QθۈxAU 潺C'pozX]h>Tb/ڊO#,QUU+' T:[Iiso@p o_ ~fܚ0\+7c޸$ep76[mIdO5jb<ƓY:Ժxaǐ;34/6 %6oln LY]9_5ZӃh~֢q ŖR+3aDm ^ t;cFg2 nkP"7Uz24Y%qxvIJ*i%K,d95l;R;N\rPwPPCĘ9$+Z 7sMi3LJu%Ζ$nKPoұZK 쿥MOc>F&>Z/rFv֚HYo֦jTsMSK}*XcUd!'o{Te/ج};V@HG`wHbxקHrozCK(兮yS2 Xx[H_;0+NX62Ѷ&9)AgmgoZhI=cҠռFj`s*ܷ6gp/vfޞ<33׾4| cMcRI}[Qy=) Kڲ 3闙 -ՕoҒ=Sȿ(?kyP(rǥÕu[c%ۥdu3] 1~ \_sK#q]x=dU&FX{mQ͐PL% UFƢIq!-VzǓ nz:_&T23ՁROK@^kRa{\zWJz٤s<[j=ɰңiF}OK&yT\;Wř,>9JG [RKǛWfڞdLŶ7QKncemqcR  X P/ 6ǚc}.J\1׬#)Al^UX )*F]Zj^vB-qڟZדQ;&բ }~n'/Jxu8 =IO)g #*zG4FDlǵss $p ojM rUz+嗅ޥ!.5$K}9;oJ8XUv1گAGDxđ"2yxr_Rs8zŏ=v6ٓ*G:O Ri'Tyd.TL. 5OM yI^A+I3W|+# a֣A>&7CPye,zSu{ uכ~8>uLJI %mjq\ӵ'&[n_O:\Ǡh~cGTp¦4fj(ڵ\6Y 񴤒ߕgݗҢҼsc~ ^;A=kLnA (#A,dt߭i e˖aOMN~#Aڸ_Њ6$f&Nn 0{-CO!19U5hB89/u64f+{QfybNiAP+ 1Q}KKJ0jȂPd݃iŝ^C"y@Ri.[a${xT7 7"QIÉץjc$?j4lY0e6{ )mڦOxۯOS-`\3S[2U#G]Ŝˍڙ]ANF8"z8ʱ\I1=H;"!֛e-,j0=iuS4@oھ)Q[~tDumt.P Zno+w)yuʖx&E| ZNԗ$^I'qn\"ÇkSY~I-ɥޟVcE,-ۥj3L{mCudw$ac=yc'%y*cBUU|͐۵$Re*1 ϥyp͹۽)$-ɖK(2雔 |7ޢ13^t&Fa"E^Σq;coOz@f[mw"1I/"jc+pgepbX -Pgidͽ+Ge7ڠM3H *zK7#*@cU|Yd@d2GB>Te7CQǀYoT Ǟ`{W8d^[:Vu}6FJV;O2fN1I9 ѭo1\o1SSCѳcMq.K.oY+936}}m 4B@anu%Q4E' TĦHIZZC|H=~;F<>ץON-SʚCΥRh|03\ͩkzn;JSy c^<;;%@wIqo*;aڟG3t6ةQQ&3 f | ȷCQHYطNnׁ )HfZkI; {f̲$tJ JY7k?jN.ʇ$^buo"uǚlTp,0,#_ >{ mMHLK{RJ t{6$oP)ow?iH`M@R,$Ȏց;pG..[PJbT,Lwn.P/UZy_U6%7aaiQڡc+~*+j퉰_sEزyR)$ U!Ym .!P%<~s³ -Ύ.NoʄϨ%@+a='N#ee~'r {/jysH ڥÞ6ۥOh! N_.Oܲ+f-R-TIܨ"ߵO((k*uZPjb9o֤?!w.]R,O7M$>7nmSvHFY hQu7=k[8Hlڿs'tT c?V#wQo^,yطJ[^CޗMK Cxnmj2976g|u-n+>4+ɞLzz{R:/=DKvmR˃bXej ڡDqI// 86:&Ԏ]޳MQ7,eFyFڗjfW\ܵV2T;V]9̡,:htJja-5*aj-;ݫN+f" Y6DQ11bZH0rO0$=|#j.J9}UN*s@÷ސîRBg;TMIpOCG&B!- nXUZF$!N /c`"ozdV܉MR#/OjID77}2"6!_|,<\?cԨH wVMġD}FQ:Z'{3qOTq&q_ӡ͵I$y UR760qfWJ\i5IRBsN8k9SCė3jb(7ؑjbe^{Wg.('߭(y?Ur-֧wQ&Qw\͵L!'$S:Cv[,q`j_jR, qSp2jM47>,O^zG>!7\i?,3D&_ҙ@&ȶk+#+$t5:E6pF0\٪W7\Te[LqQ2֧ZӛaчlGV%}DdH7kq;>Lvھ39RD4W[%+8;gO+Չ[\ۥqRG|lRĵדKS4ۿOj9Fʣ.-voʧԝdplJM[Xۡ8';GFt'1s[O|4X..Io\x9ɵ}a͖" p̒>=8b@oO["(ޟY7P@cGlwpNޥN4*D]7ۭs2,[ݺt^W1wu@QBojLxxkʼn_Y۔>;Frڒ=yߥ]zQ~KjF%\ݺGPȺr.Vʵ_fC4^ve2,(v%:֚$NvچGG{s$ ӷzm(/jEit>/7#Ap~j#Yz\RƑ啶5LogDM9oۭD|B񒪣ޡҰc=/ޣ@*z`@wM!&⢒9(Xz!j]'(3`*fG-8_ڡlߝO-}7Zo/ tbK.Cb1Fy+ZvZoN3(woJtGeͱ֢/sO ywӮ#fB OPg;*͌}EYdӕ녘TOUkZu$3Ww@]UW]N^qfߵ4>RG,EdWt44v4rq[sI/eSDe o#uǽEÆoNY99Z޶}d|F6LHCw'~܏jJN{j8| 2H>o5%ozrV|;y3zuh=K'xw'+bòF{V0DZ=IMk7 c֟HjBS!6T*1MgbVge1S^ b? :ƪ.vmPNlH&jj wts9:^z3i,o;TwS+5Kc&K+Oi#miUtL. o{ =*LXF \;fJtQ TOR.yvNȼ:Eð;Ւi '`/>$V^ߕ :ݮ/!;I{t(u> YMZV~.U#.;ըY-w VW*7S&땁Κ!ˆy$NCNjX`N$ nF{Q\?Evg>LF`}lrsʦLZ>78*jr$ua,K "8(ŔXcҰGcKȾ>PqyTks:x%6V+$-4#Wu M 4 7|Va߭4 i{}LxT6QwK$d9$ܜߔTw5kҗCDs=T1$4XX_֌_}C,Y(Y&ۙ7Aj|{ZYK\ά6V6%OAPV8noZq"Lz}O|[unbN#|ֿZöעymǥ, ;+[zTϖ}75K9Q],{$’?Mbڙ!l 7˭=m$8HcrTѮF Ul 2jd)rR^=v\t:X5G_1R#e CNåH( ޤHf`^"]Q>Y^'4+']ը@*7_kEnd k x8+l [޴t8ZW~Xɶ_K/*-f. _[qҬo۽:-cߩv5w-$E';T>aKhd1,=m{S _.֗DU3d|ωoZ3U|4=ܵʋhFzYǽN5C[MQo&rsD6? {ڤNH3jL[PQ9icW$Ftr}O2cҧu*6/Z\J/ T3ku߿Hٸ' >k{oOhϋhŅ^&{S214<\+~ԢoDkjB'$vTpJPu o[c.{R &+5#W@Hc 9J-62__P)6/N%;4ΨpZaŐ)U{T%2eE2.ҩV?s(8' +HNL}(f+ZM<~dݫC;۔Όϫk6ѨAQ)2ba{z \$H ~uIU;\%jAKPEPmP$c+Rabckp:Bn, z,|*OSK6WK(Ve[ޚڇn[oRhKmO@ m,p^õI%c*ېI9 *OlHޥ<(=O.3>AzhWTҤ㴨qַG `%mǥpQpXXyzT!ZTMLb>u\"#_4ЩAA)Mt l֦iu,vRoO\|mR2Kbk$1Oj9۱ޙCTubW)#JNE=A+Lr-SݮooڥUs^թ=֟Qf:V\ڕ~!uvZĥi/}g @G{ҡ~eqL7T߽2>U7F7VwSFQ9I~jedt_ڛT $H~_CBf2U7K`TV+fzpk_qxve7Y,\Q̆+֙#C65I(n+;OQv/Oo>gᎽzR,e6QIs[X外mD3^#{tkX mڲ6W$k=nۚ1""#uGlz~G,2(h`oM .F/q 0m5i:n“_@l.P&y"m渗1kI'K+PJ ^iׁBmsކWlڝc]>VrTM9(oҧYlKd-kQy6ۗ:N 6 Iŷ Z9rS8;,|li,zkSشoJȱ ޤQxXe7 RpxjkjX kf +a:41䡯~츩K q=w13ֵLPIYf>ӘWCPm@s3сb mښU`zTl,O^O3O OΑҺÖ+-;>/snWe Wހ:x/O+U3>}!WĸR`&[R__|yRiv8lEPo|B3yvڠ҉kjM;j^oJ7t}/J%Est IYDw6K+5ߥ `Tdxw4&HW|ɤLŭl}+S LoQr.x8kR*Wlhz{cZ(71-W+k 69rVKs(MofFm#}ɷjim_4|qqT  M$n9`çZ]1+ڙ U<:'Bq X=mRJ8vvt\ŧ:N Ѿe.ojDxnalojFY'"W3d|@uwGKpRQ{W¦zԼO9׫͹^!mFl}RIMLb,k.ޤ1tt'ȷXʰak&i1v!Z̎+`,Hu29An}df"Sw-ŗ}QO,& vmҖu?1IW,SKAFsu}+ncY^W\ Sn1~QL^BZH8r|y3rF!/jp3$cNLfYD|P7R(6 u$2I#!`ƥM<9#?RZLԨ%,GjHNId+X h)ݱ{ޘC^D<.^,ڌV*E0UpH뗊3n$ޕ*ʝ׽|LYrC>TAx7 A2XE].AUq>*LQ|^.+w מ1ot K^ӉyqFNېWNk{ok˳J,!DZҍXwj!&ԚK7 8@؇3 /*E6j/Hb1MBI]$ɩ`[^P MESo)ݫ>9A})PJWf-R)9aOσ?Zxϛz)葪d-`ipసԔ=jqQيu2%}n:~+5oqLKENQ]ͪY,:aҋ$rD8ՐXHK <={9/घ)ք;2jr=NL&mފqz&^NuM$6!oLٰfZXKfe{u|SeC_ǷB#ێzЬH[+J.8Tv(]2]65c,WӼR8f Očk_Zx` F6K*)!`z/L1o׭K<{QvM)>,^ ш[(ЭJj^K^@vHp>/֚,k_A1u-ʞ W{o4˂xy[yQM>1l6څr|\1ys6X`/nl.H1=.ץҰź߷Z2,O2v|oĹljr!R$N+TRb ɳ[~8H+Vcq#.?JሸK]blI?]4y7$<ݯj\9 2q:8aekE$:Yɾ?zbWvsW>bIF%ER Lq6 שpk-ޝ~%ls!/^6x$ɖ 67@Ç~";d0 O#~⢞mK9T/´ ֗C-G)#zp=Zr,ֲY&yҞօo6^MP|I 8\=jcoArڸ[ɓ8_cߥqWPBCڜ1Kx-Ԓe*yJb5tӐw_<6KBR8=TYs#cz +X[_1E'mfSOj> ^P~jE%ϹV/ 3[pdٺҵ+LWż]=(~SZPWu̳9ZoQBI߯NR~m]#b~ݩS6Tg %pk})@c9-K5̊߇kT R[-`*(rցL[2Q#Nq1C pk[g#Su<\Mo=>/?|>oʶuzG5sN4[ͫNkyFȌ.+/Rņlos_kҤ(X;16cYG)[}h@RrJ*+4lbh&oMˊ1+cIӕ_ K#-*xnXxRO n֪5 os}Bq9OZYpB/ \ڦ̊~5*K%2{mOǡ1Zy8eA{HhŤ6- օ;I惟%[5ϫ;5ΥVAٓn8RI;#o޸_nمZSCb0)mGK^~ u\= c~uDv Q;LɺONR 1քZjmb<7}H1 /f2R,eG'j 1&O޸F Cz5ԴLsjjvKh !`A>,&:j#Չ]/6kc|hi9GCH<[VJ>\_nLvRV3:{[^9 yR幯L_;u!,i4KE\,8azF3KLCu vdφ~72v5B)rLJ^"sY+eOyֱttBG`E<7KI L 6ufkn,؍a֒S wF_*n(26j W m}Ԍ!$7vޥg,x\GԹ=$f۩Dpy)q |_o֥5O(JI36'`jh0O^QԻʾS$Hg) -jM:^Tsh-S/ZOÍg v}}VsmS"ߡ1~UVM|P~{Qa!#դ+!6Eʘl(B5<%[ uXĿMғQ+"[`7>WLky<},16HDRQ| moJ_VuѲtf߽%E\ӭg2:6}*6I pz|FN~u%@Uaޤ4p"˸ߥD-MҔJiqEoI+e(G$aq_ 4nE+kT@қٷ4$]'4y!osޡ˺b6զ2I b"v3LSXR[: ĔIn".{Ty"6 %۹ѣۘt>Hz"]Q Ss6޵U}=4* 2^n`X7za\ڤq%x8kz'˰]=ZYu&޵sAU-lׇsjRYԋ_dVL 6۵&[R/Q B*c1޸oV>m.Bؼ;*PVʒ&, ɟq9^O 5z5*Td 7"W#~1}Ff2ߡY2ǷVEԣ_v\?mȭbpwd>!^77ZHVL=+?i |,*}4XcRD$#d\Fe'f)[ysI jڊDB\a BcNFmAxrhdd[KY67[޴ .z9:IJx|QSOsooZUG})RZUܽ7Uq&3]DA!g[oCi$FǾwM9n VvڤIaqjAOVYڸ,aTrDG{^!-7!-~!ڄ8B("oRiaxf/p {~n]#zIېۭυN1V;tZ񻙗9"lD^(By km.[ b6F[ȩt v[Zf򥛏H##qA_UĜ{u?BMJ [nR-EKeܓLEB9 '&-M,2X}=DNj:&Z,my7`Īj}0Ӵ;.j4ݏ5ΥNb[v۵ bXejy&+ :}ԉ`*3 C:hZ}8xvڳB* >"$X$G֌uHYbjYݟZiqPVDˡڞ!E/,ė`sRqܓQJ~ܦMvF2[7+pZhDᵂ# k4>ZlmO㽅 xpv\lidaDF{+]VmKvIqfTp E,}6yX漾ҩ(!'qޣv*vSΣ(vզbd ǭ"fH}mqVLd3lDMF 海Xo֬#F˱*XQ :p8fIer:l>c9$5(Uu"qDÎelOd/6m16iY/Ne1JT<(7k0ŎDbH K/-c0X&,.h<Ƕ%%MڥPȣehm|/֥2Ȳ#sa rzN*cTew֩u7]H[U ('垴%(yi4|ZO,|~@C4Jq9g5 r^4.^<_Ar 1Mthc7T2yyQwp8ߵ|;XndxzBE " YV¸?3[O*cŻ8چ9낗'cF0UʐJMAy'h˒ ̫k^5U/~_=} T{ ezzE+~Bou[ԟ1g_(yQR̢q^6([fQS#֙ΦsKof) )j&i`E5J[A}"n޸EnR@8Y^fڛNd5`}kb\ܛ_֚)[%bZstRC ;0j>tD8'%>^U 6;$ &Ur%KEJe*cnR._ڴ&Wuo=*6"XyoS UYq.\S. <>-^JԼ-T \ʜ)wU q2qL-K%ڵXxFIbQ̏B7)u ojec[ԼVTN>7OND|?E/]SFCQM<ɉxV&[Z甈KL׿-kN{QX?̼F}׏9,#HjXrHT%W$)],jP FUH5h><=j?i\]e+ED먉[bMu@Tָt,/-B;;VbMڎ)A9*lj,H Q2"$G[C]QQ(`Ovbg{Z؆7JeuB69+XJȨjhaA9!s`q 15m$ЊMFejl =)=VxͼX\Ŭ-G,R'Y7ދsW )|4f.Fpqa3vZ\"onU%LċoAب9v.Sr/N_a-<хlܵ$,ZyqڟM9ї8)ڥ:FSzz5 1mqކb%CRjm WvkT\;j6,Yjɬ2nM$,ű!ԬgN$m87}UiɉCv#nHexY'mVg h(xzdpc҈uGm\nJpqMkxvq3|on /m/8ytSYćjiՃZ-Fu&:6nGzF;w;ZVFYy|>BRQڑGocs8LUHZh̗<<p෌-x;H@|}tqZ긓cKd޾濝p#~bSmLFx`Rړ[ e no:S/ G91EjdZHRmcP^8&ڞ,Xq{$ Hl OX:7ʄj"0jU 2ڸO:qƥdWA&]mLl,<"$ώ[?:xF[:(Bi #7ޮ#/T\:iP Wz'[Ԣ Y\rIcj4WŻt]_!7&FoO̒6䊔qiW ҧSE; 9ը3H"uqL#r:F0?*^&8hs]hImjboF$w<=rQogQ6"Y&F8M*A мP#ږXqCc43L'NzА2qe[PڄHroL^,m8L68ڣI#mjY-os B{0?nȶ_;VL%YMk}5Z^3-FX)qe; T!)]vơ4WK#-~f1TP"GʣuF躉]iZ>Mkn{T* O~On؞Gi"/mkq4hn}j%HY1** ;\"mI3!ZD>S>34@c]j !jN`܏*>jܻۗqzW!;(ܚ3 'pzԿ5B-pvX E"!7LCDU$ާ0̢t xz]A,:mb{#7 E;%pק2̶6⤛ ^1HfMޑ^ tW~CWʊvj4nn Xq!* MnSF iv@}%MԺ.)WUda\xšybzXuiMeWϧ߬[ޔҫu*Gn b|7Vm |ƱSJVed8JzmuW]^58◊vxP}}2(QD,zi$7v'uߘO߿gPPnL4rҕ7GJ ͋tmlNV7u.c[ ԰x҆"acQFL-NR&-M:D/J ';8_ UZ>.rH`x[N.kADP/QLabڸxޝ?ӠU҉#qcɋzTApCԓ1AfLq{H [JYA_%Kw= :nH*+(һľ(4C.DŽ.ʕǶB.<Wd,iD]EzhtZIT+^P*UH%sK5UBN@)Ւ>c>MShybxj7 שUE54z51HRȽYMWNTȲ֢͒x$2+c=)uRͷ%DD}(Mːvw%N^)i)־%Eju#o6;#NǟY岰iظVLٽsۢzkJʧw\|Wڑ8L;^<Q-FF+ؑK,[/zc( ;Gݱ[ޒ4Q7(Z_փirT:7x:mC,#m Z{ 0 y*$Q +ԘNzM`HԓBOù7*,]>{Txu/|J& `\Ք10^)\ڤF|>K7Phk1KcԛT6`pرVJ/%HmKcxІ֜؎YZ/z:h3ԼfIكjlpn PH#rݩmFD/1ڊIJiC3Gq#Aqielvش\KXڙVy1ۥO>P1 2 !?P>}ie;oBLS~άܧaFGNI5y@nytJC>oW+\ݲSc2мwG Zen#뛃 1֦!r9}H=\^.?KVܗ/co.eQ8l S[ʌyiQl??: 1x8X8{i 6CQMnӃq6AEߡ'z2s j]ʐqO>i^>F 1=&r^چRK`yE Us/ޞ6^ҸPS~L󑉓`qq#?WRzH%議\l: ]*@HfS$QK}G[T%_ =*X 28>Td@sζdAyw7&ڑ04_M%kEld@lO4D]ED!91K+yK_ 2/j7gVQOXkPZ^@%T z}~c;m1f}A Ps+1:2Z\@LsFP{9<>uG+&?UP3IWZ>T|7iʭ԰[Jv;`_j)dU5Zc-'-Prl,Q|$pG=(ΣO"+ӭ$صP]}wߵ8b6K\߽I< TrbVk9 5&d;86jfMqcM1|-`Qoz͌H:ؐ-ڌ9 tvZޤWQ{_qRK3 .nG3"L|$cj]#t2]qocK1bҮ?*t=mb "E(ޜz{V1,ѡڥ$R27V/慑cָYmyP7$$rMKw=Iu֙U,NY.-R$+{RdY Qթ y"[9oX/J $v=+%8\;Z wm#t5!õ[,byM忽cE2z]-׌{rQizȕ?M$h_w#cơM^ic!*rmTn8l*=ͩG=JYot 9`l+K( {~դi͊Ctz\)'J1؝Qn<+ l|D߯inEEȴA{zqGؚKޔ!E׽AFC*q7QַZRlBZqLه4Bg?kbH*MQSLUھQ}صkTAA7jy'p\E&sʃ=ź('JW0o[mCvӴ6f*azg>ʵKxrX/p{T$$?XmS"fϕKb9zԖh0>wORǔIAb+FS7poFVkVŃ zRxF;ٗ{mK6Q Cc/ pDFUo zmڥcyNWjtr$F)ďsjG^[үN1~` ޛuqm}>mҙîʸj"|Be/'{߭|? ن%xA= Ynd>uYb[feMz{>9t6'V~†^rdjQ#Nj$__SZ]8ۓ~/ý4;F/޵+!?zH|aGO4,*2K HZ`(6iL3|)&>(Q'ʥKglE=ǥef#$Re~R|N)@l냹{ iә&i Qj_suz1Jٳ EGd$*ojH5$IldG/uZx^s)ZZzpVk)D}6O00O0`;z{Tͫ7U50% -H*֡e/8޾ۜ5ͶEd##jx}` mky@vL<,o_ _s?;oOpA"02#dz2L7nugU[6m[rb:_Qj%EEX4m!$_SREҟjL>m -oj"IԲ\mY6T!^2}pڒvQqM!ːֵzZ6~)@HqV1Ae$`.F1"1_ ޖW_ QI?j4`lR;tYŔTl0 bӉs;JD-yO:ڋ%0/kQ5)7ޕ-2+ ,;t7ty)$ECoĸ+oAZ(&{{j(JvTGaH~QAs3DzS-ߵ-[O.]{XURokW:ޛ&; ā*M([1V?04ǭ<( [~n83՛nѣ[kH3Q4wa`ǥLg$kmWAq JS7ݷ3W? vsűʸڌAԾ }JJ܎)cO(#x9OSK41fl{$|^ڣjF&v}$NY rZYG [{T*o|WeJkZ[_ m{޲:;F(pyMeN aDmŻ m͐H1_H74Q[j%)@@Υd .rR}E;2( ޤ|-Ŏƛ'e6:lAwoN |Aj_{Z(pi&׸@kԧ}c}컕oZCFNcbm֏ͻ^㷭GӴAQJ"r &ߟK6~)1kű8mP̐'D~K\U77B$+MH } [ Ã{Z)Ĭ+ҷ*HLv^ݶ3KԐLsMRf;;fuHl\oo:("GV+WycQC e;іyX#ZE1)ݷVj(pd zI,|Gq ]NyFO.bA4V1YI;=Cn'zރk.X(P2O& ʎ?cڟ K}>Q*rO͸ 2 1xX;-Y4FOI}*N{Z#1J8m 95F;SZc*kHq|Sa"7 bT^^6)8 @!h~>4FT-oǔzmS̸رKJ,ozJj:AQ8O?2vSC*ڦM{_θ'.^'Vwk_/[R!oGV@zm EͿ*/:ނ*EX6s*wW|;e=%(pGjpc:mدcm8߇\Aęl|+PiY`X35;RA:fk՛*X7AK<< C~ƴAŹǭ a@1?Ғc& ]qWтbz\o\#nQ ץbZmj@dK{Zԑ"GWoңIa{m&)OH栄| K2WY@mqE7FnWޕMUP8+yha p#iVtO?WY\.|y>Hd$Y.̩x4gzDž+$K-4&Bz/qAt΢9ntͿ^$Z#o;>\sC_N=;B y\m52dN.J6X vRD#s+>KjX7*uwd.6&*IU<-Qi/>JUUg/~Pz&xj!qS{{P:x6*o7Nek |@ə֒R$tQSRI°Qirua/vD1ԫl,qT^͸Wd` "t[:LRYV4PzmzBaOZda`oS 8 ?UJ+贛HrӇͿOO&#oSE7 0^UH.+͏Zd>c&zwp-Xpӊ._T>A|P+m\"v,mGdQ;>CMu)镔/DelB~Կ%HSoޑb ?C' ַjm? *ۜڢ' "wۥi4@ŅFdƄƙ(g~l }O0՚8@l4QdW5)w xOC,z爁Đ&2:jF%k$&wR cӀ:%Q']c5kNc`mڢH{^Sco/ҵ3=0S!iD GՔx zZ.xc JaQhB$h {qbQT6;ZڽRƋQKUݍԎf!oAS6|_j0xIhIxl 6j3_cRzQqZC_z3#q$ Mj OB؁RNS^IeNd\nI7ڢ. _szpJ>yH2DïM'NvըmT.#B˽7ʌqq(Q=6A{}ަ2>ƒ<c>Tҥxqﵽ)4Y(XHpʃ1 cj eN-6 6p ly飍rl!ydmoR.G`;U<т6޿fj:Euu8oZF vU8 b7$\-v) u4-uR.ieT#*53Y{V)H;e#8{X|ELP_\Ԏ@Qq dq äFTͧ}ŸSQL!݋5iZ=3]ǛeyPJ1};IM 3+;IUzKȷ(ܯvPI4[P-Z_ VfSmC&H;PW'-hE4XJHȫ"_5D(-n=clB;Cl "Hd4g!sj'9DNj[^WM<";&2k" z֢USƇ;yzN4/ZGҗ=2zF4Na_ŏnm}_ [#ñ G/ɽ@Yv܌U^/~|82xQTr:*k~4:x,bOE֛ ƪuz 2rBԯKh4ږEIj.>Տi :\6ߩ-\̃(ǁk$-(ʂSҒP@sl,nt '|RGL,|XD\t WL"G_jVӈ]=- gh6>z1Ӌ/kTi$kojVHJ?KwKQ6 %vBCHf{yZxa{v>=-oQR 18e^}8k*Ϲ߭3ꮥMנ3[L%:ax!~UL#<0OyTH!3aaoJG&MsE4wB)@ƶ}*,GڟQ,-jH)YTBە:xE?Q5$q97_(O(3[zY~ف,z7aR>@L *!iao:2ǔM>(${֥qX} JMea|.hD`_Qz),< ܯ:Lq^&󤇓%b9OM>T2j)SOMr q}&0c2<[΢p7B .-M[NqyI;*pESzr 3@Zh^g.mZ^9Uvnl֦2!!-j@G§ܲm'1HÀ<\ ymq*y]uAEƣ ߜ%f8ڐ7Å؁zr8PG-QM- ھ1ew_ָ֥ @녧 V]X6,JV+[LX̬jzF;v*~ըm@9>@ pR # )"Z};¸%9u[T{J]0].]SmS@xeښ\vQojIYLW 七lTd͹tS%nlkr} 0~4bvFcO0Ͻjĉ㠿k}Ξ\c~a?Pz2ͽ*9cśͼ1MX:1lZ}ԩWr7J#PTR& &u2ijmpzUB2# ]ݱF qz?9:2.SIrz^)xY. 1oK8T 8%Mx l쌸6jT)xvV<vL65d.>dVquae$u4z4 qRZc}G>V60+CKlԹiJ/̶SL@;jl0T֠Ԁ$vƄӑ F~E w5Oln(Km"hY mgX{n|7zl4H?j53btr.ֱB Z #|` V%\zS$ES< }gi8\j"϶$KD@0iL#ASRs 1aR |Z=?8%nVwE*Q}AT8K{^i jsfp摱狨T:-*ʲ9vh@/ DZl:ݭ3|mQ#4imD6  5tف PAP|9riDG-cP4 0˸nQY[Egx/Ec1!nGcoʴk7 XڄS:++=+&q@|U;hȑ[ڠL6x'ܛXB^GiG?GC*ږ([)unF6͑Ԍ{ZH,8F+K ȵ/Nn} 2IO1AQKeЉR k[>4VltsK | [|;ī&V FR\G{I ڎ7*|\4b[-, xg}ͭoz:FԚk[޵QsV+!lUEKdΕ&%YNX5LЦopE/M.+n$Ƿޥa XN/ EBV~+-Q tR0Z}4IfΈHrҲߗ9E,-;=)`lʡ;1jwy.w>2r֕%iؖlTN+EZ߯*iU~a-ɸǩ$%Nxx3 #\}u;ྠ~QSݐ$ ̶6˵6ku ~[R5RWs ȷ#αEs?:M=ۚסc\c\oQF4\]nPxx|0׻ wPoh@O7^)'2{RLUGP4ÈuhBF|Vv4ȂMu1 yǽp ŵJ ir4܁NÆZ-;ik&)_򯅓Jq]kAja,j\eSTmމ@LsazTYxh;d^<U|=+RRG1g-[fҜw(i#%FU;ʼHd-ZJFCcTKf>ŭP6§Ib,ތ3 Xv+UU߆B )]SM+ml-k8@ok2.pk(-B2\NIHgm&txTsIubkєg1ψn-ބzr#c)JryVȦ?0kz֚N)/W2lXFL.|6FJ?RԑȖxr;M7uE_ڰV`W!6@S6^㪵M-,sSQ0\?/՗7~|Pl ڧGv sX l\o{WK,1=VÙ⍽ZMU[icQM6HqQqQ\y NՂazermD>SԎ4;yGuk ;T H +[\=IӤi() Жt!..]nUEz.I{7 43sxjlǠfK`@sר[X V b?j-v_A$ځ/֘pWy~P\,ZXǘ Ve6(eiAbkO' iD7].V0,#E01JPqm\ejUYe,,ʣhc׎WX{qvߛkTs&VT0T/KtUoR,R32sT.UTS:KPjf= BTefUweQ!nkT'>?jjҔPAMJ)Ylj4ˢi;^:yGѺ#Al{S J2i &ܧ~u4sݶzQH1fGykYv7Ԑɦk2[!g>U * Z%[miLPi{vz1p 5q+6LCoh sKT$7X۱H:T$={_௒z޵ XW | |)m9Nquʑ#%Lc>Sqaֹ;U{']++UXI"oH [DjˀXH+?6M܋TL=ws^hxSR@ckތ.{`ԺXq0f/\5KQ/?SJzڐ6%_*iÐ~`%1jH̠/M_@e;^<:cs$Zi[ [~Z঒) z؏І5ze%]oZЬ}<[cF}6 TeSޢm6e4,,*G06 ] g,HGҡęF[rڢG ~e͈*>巿\WuI !Qȑfmޯ刓pm׽LEu9u H*%]1QP\cFCEO F,j< %Kmщ&&}J˧ )*l/Ki" _W! /**2}M-ߥKD%F bάw /x*8sby=kHaZ$p 4|P?#5f>5⏖?ځ I=I4Gɳ|UMdo"`jhUgUal4xqYWsޣ1_|G;  lj#C3cTR닃_ZDOPӼgd߆<\0soþlV oQ<&EQH:b ޲' 'C>FT"ϒRLaqQGL u B(̅q 44[ zɆ =}kOiqs~Tq,O$'ܭc#YfONu܊}4͘&"|< ^v?O!u-;tF`&bHTCRN\TVOer5iYTW2=k,nx 3c<>D/zֱH8ҠeoOE/ܫ/]'3.SHSJuqGRzfğJl-Mc1=(#j6r-FBr;zV. iեLd<%m{T-Ro6bb<=+ɶ#H`gF ޥI#;\Ͻ4ِ`Xy,nnv$I5lZﳚ'&zR!Ha/ ckԺ3q;X%O1Sʐ;X*D~BocJDF;oN.wL@ EI:x`+fk0\6q. K(錘K/{ۥmn 'Q.J|aImg/֣$[|EDߥld[qO¦1]i\hvkxkHx3gV/kJi,Ed.Ƿރ8EOZ d N"x@zm^Niጛ鿊-D0||޸bFG loRaM&z8 ù󥓈m?J@2zU?fZXub7Ik`CP7PL7&il2զI쌄ޣi?oMY[{uh}eyGonnGJgZD%rToZT$):$Iu)73Gw o;'lTq#nX/l׭E#qXRpDKʫ7F>h7JyD_|ZV!M'2;[֦]_&{G|N@Ap[kэ˖}rP?z)uX!lmkk2° MZ؝E$V!֤ o}DSJ[z)p8k{ o.64t-` U)$=ENN\_uju^.*4A&ь[½G3K]TJ|}ϽHObZ.76 y)Y@k!n!iD|nn" j1%W!s:RVTkTr<62^ޚi\W֔,jH۸u]}:'VI~i$ O2YѯD%p1i:LZY}K;ރȡԳ,OjmKj[Ø'#Z?FJ6kFBڟ5j.Kma޸ X֊ZQ=)-PCJc\B7[G-cK_YI8m4 >'% S-Ċa;pLJwjr&G|@>""o=L\6{jSKa{t6MVphDT(ǭG%g^$zVϨhiZ[5b/ZӕC߽4rߗ>Rpی+2(?֤ x[CgN SƜ˨{NG*Zi7jM+T]F䷕O =Ϙ`$r./'~5"BS z,[Զ75XɹG-ja9Zs5zKkW2[}N&Lk:pqږ:mF.}an UE(+ ;Rj?YoMtILnڎs&~[Cc{G(\zm-Zt$ cJ<.e~XU<(E-sTr.QZM8PtfXhEs1ڗLcE$e%Kc. lZqc_/L)3kh`"ynhʦ/7Qʳ9y~Uzx$N5FK`D\zTMGC֒30,ۚHCB9[Yl*1F򥍠a7ny&H s50E;[޸I]6=CpkV G>!ӧ*ºʰqK_b"uAGI?4;)ZLj)s֞hB$GMʉ\c5>$\bG1J MԚe%`ԒFyme@mWL 5.ԍ3#ޤ jSkSGk֤fpkaojh]Ҧ5Vy(^OGs.;) {Yh^;`[՛p{q|>Y 3|Aȷ2m34i8{yԛRxHD߭,G.;d4: +@H7C[΄˂SSFZhJ kA,r[f۽|,H|Y|;Hŏ/?*k֤-ZSM8l:_*oj+s\l?jƘɐ va\Rq#;zVU> Quƅ~^3{T֓vşsVBq~ GG4IA[db6MN,.6{M,lˑF5Ƅ|9$a'&?Bq-ִ"; ~~ڦu8s %5iZҡ1舵ε B˖2˸=fWozH2bm_U\tJ NjY{\ǚj1FQOFש1yz/ҷ̸mԚǧ/eaLe|Z*tM< }M|~! ^V1J,l^7"NK: ˜s֦/U|MҾQ ѾqKic׉KXEޙ$LN eokb{-OhoZ.1[*[ڢ]$N Hzf0Io SJaޥyׅ8ϭHxN \Ts ߡ5F#H0slGF4Ps+Pӝ F>Y*IESˍG/ecқIH/0hg΍vwQi7|9xD'(,{h4Ze<8O+֒&y#N:Kr7Q*~thZgu@Pq= $['a'w(0 ҕO+bmҸJ'!E2ȿڡ|;]7.O?RدU{TC'[ _ҡ:xrէi4* Imڬn&/#ohJlf>jEm3čyYhOjɧ$_@,vB;>ӵm-Ԑ,LXIz9i>#sEqWt脱/^֣I/h÷ZMhRH?z3ED+iGajӦ>kYJcW>k626 *Zb!S\["R~T}3,b]\A)7RFbdV=^[o:MMXX4ѹlBSYđ +}j~1`|]jb{Pb#=ΐ=F7-zN_Q'Et)RL2 Bm${(EkM"DmcK8-{LHPt[P UULk6z5O40^*=&$0 3@{Zw5G(B"/bI4/t?*'%M0빫&YV>Rd.%:oV+yl{H5K}?@K[m\$M"5"jC[FbdDcfp7:H%ŎŦeW^4\}-P#%cKw ݩiA@25=Աp6̐ GK62jex%{ MAfM\?9M$ӭ{/mjDl;3 bZϥH>wR;4B~:ˡnynHI5Hp[}X[ݿMc1qXZ:)nқSae 3$UZg ;7qA: Tىm7u&ܾ(x2 ՛8Fic(m0E?1̥aF+HBq%C,H#x]o~CCPiVUS3Ҿ^G=:j!߭!Y-B[ϝD7BXc͍A*(q㈪.̧ϥ1dV}_HبfG `wi1[7+n/_N׽8`mw[qRɹ v>^B궺9̷o{ԭҒ:%:@چm҃5[ҧŕK^H9rMRi T&C{SB4μAlRo*YNf܄ (YTL,6Eci '۠^&6ReUR2_z`Ώ)/ZD-mͻtStk5j9p]JG=ޒy1!{/:MB{sGfH07#κ/ڰ_4Gv^ߗjm96<hZۜ:J=^Wx{  ҐǠeZbkOrE*+._Y<3,icw+sNLw$?þ$Y/jJߕpu#ȗݖyNҌIJqmPα:ۂ:T{,d j(d5n{T)ķOT"298 VX [sᛊ͓}Ep m0{XˀXo 6{lw۩?jg]TR2i"]>˱4$齍6\W ԁV$jln*Y.iU46UsXtjf_,wmavu"msOZB \/zcJM-U#\΢0R7AzfPnnZ߭GWf1Ff/jA.}`(+#x4q# l_Y%crGo}$!f!F=>^2LK7Zr"~4^z]D-?,ڒAC:y H~akSɩFTVE,Q1}* s1 ѼRq<{^tSuZm.lI ljBoޘʆX/[G[vGuE+ydDU t]d7Q@*,㛯Z'H:')8_-mEy\FR7@Yy""DMoZGf[qYE`fCEK}H8mxl)vYۄ26bi9:Nyy<&eԭS3 L}hDbqcp5 7*z Nxb1ieĎ {T׍ۭ?[nP-֧k;{֖8LKn]֋8wz _Z@FV5*9HJD^vO/ 1k;pʣ\itR[Hͤ0XԳpkQoχZYƃY¿%]0.Myذc/9 K ^Z-j9KzFWק݇N̻^֫Rɐ=-V\fߛN>>w;Vd,mQ&pn'֔#Z-#obOBC+o/AZBQl~g)TF&k-{VjU)\*rc\_"?VTQ|CwԮDu;\:0҆r\CR:sw3'6֎n#vLZYuOTKj(RڀEo[Yك6;~XtJϽ728{]yd30=Ak M<[/ /zi B^fK_MoAaEXog"ڝPԲɱ 7Vڵ3L˄jNU1Gņ׌U"|< q {"}GOS7b ^vmoVVNn[ M,2 Rh[׋-NiZtʞ]j]GOjQ0nOSу> R,z3ڤrozx0(ћuoZ";2ɸzIa{ڞw(%r:ԻHQ'Nէem˨޾\M( ڥE8D$.Ƶ\Dx~",Ccaz0Ŗq,Iʤfu:TXtO:woJ%awRԒzcGjVhLQTaSRA{֢Rs~P-)h\o+jDKҙ' :֦@z}`:ӱhE2|6n,rL {*Rо.nx=%tܷJSh/è)kH7bRֶA[n+qc֞_gzSHA{zt&FPauaTXDzPJr{mCI "ޑ.<"〈*]Unޤ F(GHSҴFJPI얽o4Г"G*7k<(ef2QJΠȃwCqJ2@$,*=2i33c QZA$:԰T[ڡk4L̄cCIJsb>BjHK#mQY,Ӫқ"͆hF۷V|@;jx`-aKxA$D2W›&mN힢9:7QX$oKgU9pԺTS۽kg@VeO({#Z6UvE*] d8K8=8q4r& LJ;RL{᷵j9 amR'KTNF+m錑M1H%$tPTmE?^C/m6:kST.#eL4r#WmJL2u>*y0k䫷C_ n^o ߥI \FREug7R~-@;|wa\v6$m<8pXFMͻPA}#{g-6\b8FK#l<;S6q ڤE%MSpυ6֢@Q ִVXTA,bt8opߦWnn* ʖ{—YAӏ[%7rf|J2MKGڴNJHb2q[x})bJK ")@II6.wܫP =-i|65(K/ ͳcֽHK{ <"jOz// E!ȋTGu>j(lVc⌒e'鈥~]K4zehz\R8dž_*g<#)15u}E2,A+n?7d\u%A.}}h<VVn6AZԳ\8*T͋^8|3{SIJ0[kɼ :> sfF_kO W{tމ ;n=Opn7dI}4a~3?z'xkGutGʿR:xZM'r-}־T˻n*D]̏}k7F m|HF޼4DbCb|_SokϘ|O9ByQ%;ȃcoLBL D7".;s⛕xPMBBƵ&C`vsJ9VA$؆\eLޙ~c˥"ý~#z>(.7Elݪc.%jqO1ۥiONi[ޔGpymSSoGLqL.:.!-f>X5 ~JͽL]RLl*߃&\J2kS dceӄ|\=FM,G Ӫ"Wڴ'SY #2~@Rjc;~ ҆Ljԓ0QS )'"],y? Rc~h#y#slz,s卅75S`YGeFۡZePH <™ l6{Xl1+T$ԕ=$sұS$ئ;n=' /Nj]Fr֎ 2nj6E˔ ښ1Y[u&m< {E aP܀;Tq"Ƀ?H==-2c|p4Ӂ-AB jDj#i5nF%")yu;SɃuۭkC.-KnMIV2wS_ťJcuNƘO8 G~A’XuZI%y0B,S @bSoTDYVD_{S-ڦAS2Ҥ$QslNժ ܝE yoZ/kO?ZH)tK'T EI;֡gį<ըM4'נtʜ-[ViES*SiJʅנ=Q4RMTq[ j"qmޞN%$Xmf'#庶E|Y`{ztjmB'^T/o圿. )5/*FN1@':YOޖM NSd?gl|Z$DLP xwfa`Q|ܒ$p>[ښH bsQ:VFQcicpv[.Gu=k6Qrq밭uVG#{*ӝQ7fnkJSzB;(O*1FeY򋝨HHlAڸ,nL̈)#!%;- ?JPY;΂p8"1*rmk 1sU4jj`, dy׉EeqԔ=vO' BfZrpq Sw2&zvTBkmS_2S؏:ybM;&Jݯը;R|1yTUR7DTҳEo\&LCn,:S;xF-׭%8[okˠOYOLmZ>-rJ(}x~/O,RƬLv>&iVk!M+I7ޙz-(loԲ=֢h*U 4^vb:]8k)^oʰX]uKEz1d]G GK~, ,R^ʃsZ-ڔ{֞ArP('RAes식VE̪nDJIrW0,r9l;V|)$n/kcޢDPgv9p*#GZPRrD,oZ|*!#o֠tޗNVW|T֐2zEW>!~oz]>N$|*P2DmiV3&ìcuzmKW# `u;/(]6FAjx¾TL "G*k TxC{:h'sZ8ςV\^Il.jxӒ/ժiQyNը.EאTxB6?I.'Ӆ[:*I]r@fָ煾)Q2n9 j׬*ŽH[+3eO2zrr\un7Y^Qc4ekLc%ݸ}2kQ -Ws}ޙ>N:XQ+nkJAޙ;GJ0;г Wf'4ĮNPYr6TFZ'6_.n_ҠebXivˆLQZ!*Qx\Jo-Jx[ljBy}kP>)^VF´#vߠ޵#j6Ip '0܊癕A; #"3zT6PYt dnd]VEPOK 9\R7kGH{>:UA=>"aLu,6E:E|ר՗֝cq>樓5CZ}'YГj1pʲ5muVX{E:G6ǖKe˵VbT֦fak*En/*1 zTȋ$M|9ԸԠ1;}Ac[ʳHFW !Xm rbv)דcK\1ӵ_IȀn~gm v$ȩ~kztI&^Goʰ;_ʈuza:%؞czld[Ҙyy{zF$(EWe;nrRIf-r>yRe!I\mIԄ}S'1yˍiNL Ç!wR:zPXeXѹfgˏF5)+Lt'/j !Xդz%Z|2Apvkv$+%hKmiŮN{nj1#~w6ƌqH{n$Z=?yA.A%j/VČAr;ٿrGFMem֨ɰ EPFCw-w?1Iw%/Tivi.veē6Xԭ.SgeAQE _HdIBH nO`$7"V+Yznc;DY.38 >+TljW<|uӂ֧E .]MI)ۯ5>W^;ԒO:8zxv &(+ܶFܖ(C!-h`P9J_Ib,rTٍL|aRmyWck'R2i۝fV5$utG>1[=U_+Z:+[_z\O.W0V}ތ';oJ$ȫf I 15X_ZYqzP8jcf&3SmjĊJ_|H)X0֠NV|q6PiNSŏOdoO0Sz^0R7[hvkAd+0cH2m>t!C9CүmBB{\]gW[ ^R̩$\72R?pq~LC-:maMQԟG(.{NڡVwZ4H{SBjcn-8 ܓDkVC8\r*ejmLߔZ1gU\;N-SFoM,2Gs["䀃r]Jeen-כp+~j m:8)Ř_j[F-`莥EC~[P NR:+{WUH[6Փ$>k;S.ʊc#I!Tڣݑj9s{J9VŘbzZ)1,`-zA|;Q*{b{VNx1 j97PAڛTA[jS $hT6b1Dx܎N . jVp!pT}bowZAK`Oz?rzҼL 7;o}SȬEi*NZ$tff )DrJQ*̿YC:9_Y7Kl.|99X)ΗX6ڝf JWϐB>.'zEM]4'۝Ra4E9f2$ԚX&*vM|8Nk{Pl(4G_/˵|2s@o; 2F%U\N3>S@ S?n+W"g]f RK~a3b.Z$۝ L_ִzt3:o+xe \g&66ۭ*$2 z[x^i/ڙk6|__颹5>2\lNT_Q'{Dx )`G],}ޥlGL۰Wi\mN y+F 9dXҡ ԒE95ʂ175 CP{ߵ3 W;̓vkH4pL\]D[Z{_q(/QHU:mOayޡy/~967%MSy7"Ƌ &_o$cRM~IP=\ jyA\-nGEd潬ޅhĝ닒&ji-S˽j 7;_߭J%?*tڅp ":nF\iek~T|mzcqT܇2h/ex7JiR춥Ԧ:w n)S~qlk8ЫO18>{([*.BsQۅ@=E/{!ֵ;)$q\xmZW4/O$Eb~U>IHooI/F^]ҵ1`!E\zR"هMTD[vᵙC ָGބRuehf jEpՃɿ̯RnQC]cSVh˿HSnUndV[]rjѦ2Ƚ6Nxf8%n|r.QA&HwQӹ|ӗm*Oa_1DȠFT o;~dc,J5'SfFǠ͖yfn,קXo>G᧟\j\׽ԓ!T,BeEɸ?+O~IzPeɦy 6OZI nVkRS~tˑ\6e'ʙ 'ʢuwb>턖ƽ?i8ޝlmoJ8$?e*۶v#3Y~: 6W* bJl?=\msQ\  2m- ߙ*X ~2[cDnc=|&ؑD\oڸk7$j'ތJ{O^#I~! j9YX:kڒ'\=Nԏ)'4I%GJԓ4ܝcS*wL1 WήB;'!n$)%޺ځ&_({ժlG߭6S7^/rlz 2XzK_MQosT2:N?Ns-o*1v/ޭLb^ǡ"{NHޟ֛1+.צ|P11+* Rt.,ץqUQSi ʡ25ue|¢16*ifBk9exv }eʠ4#!f޵zD[:zE6E2qo}[NM1O{THFAQQdC}zՉc Ŭm׶IVeTʂ@™lr,`,ԜfwGc"4G_JBΌ +Jj 9ڎ&2.VKyR3pnE&$e 6Ǯڴm[[:ދb5쵣mTٮ9z_Y,l-ef%>У  TLZ$pSVK\IcG?2zPBMʤTdQI5vӴ$~5:)d59R rTdbM԰OZ~!>[sZ8.Yt,W{Iez < 'ekeϕr?VJxkT]^}41ٛ{-i6DbOJW ڑWR Z5/1Q)\MjCk#~Fk%mCΞ㽷lp/ ImR`N8E*Q[+bޔK4`ҳ3Jȭ{^rXHرK-L\ϓĸXðI.Kku!F*oZeVaznRO^Ԡb?m8p<j")G.źG5 ͍|T}KQ̸Mla)"q)؃֒H!qT܁wnwG`|FޔqqPL}PapI[طlX;7!ïMD O ~"_jL++NӴ҈yÈmڤmav'[׮+bzniM;V2[=JmhD\f>S<M5Fmε(tyb\%ms[NE'1S4?/xXާQQz;G;AŃ5[T˿-k[>Ouޥ1h؍P&Cpu&W?8g+@[zȐ̤f`W*E#RW忕7Q;W9^'lM 23 oWs\ Բl$b:ְ𳐽ֲb,{Z ֡@ ʟM Nk§flwU,QpH;+.žO%Emi_kھ!eq؊_eϿJa}W<Pv7 p7Lٔ_z3#)ᓔdsƱHbn®ѯ~^V[U* 1;X^*+{p,Ң~=c* F51/#MccQҡf*3n[W +#+mN6QҤ*Y;W7\ؖJ'i~&I 7 ٭NIXz4rS!c@fi Y-COŲҲTm;da9?SM"t8#yԗ&8?juvTn]!EE{zP gV3Q^'[$ZN*^!#cjHW kԜ>!Ӕ z^Jf^qqj<>!O_U̬æR[SXV8}}+O}GʚNX2qA|1%RdZ/!}m\U(Q_jIrd2Ko\H&#dmjЩԩu3"TvkoX:TQ68e VȄ~VTdB7kdǘZЯi/mʏmM3,s' qein1koB ҷ"YFB.mе62ߋ҃,x{oE&S!+0.w3vU$W"TjV )'{ά6OTwrS4izT]qQԚx|(|@1lk]]7{҇#d}B)v *]fy#Ӿ5v;n)G+Ҍ~/ޙeV BQ' &U=;'H3_zaAkRAQe {X E .cTxvN!Ө ~ZH_ĿOsr2£''՟%}D` ڤg2mh n)Ĩ?jds[oR:ΧܢmʋN5ɒ7OQ7 lie=ڵʤ{)ʆ/wk^zwj&4J\3䴷 76!%Z%ڨ"aF1Bru"fۧh3jӇ!b7*.25x+J(\9cbvv9=]OBTnFGE\d;uZm{"1+[c{ۯ)RV_s/{[ڴ)yzEJzR4bڣG}j7aPH&Q0~^rz : yjbл [1G6;PB0A8`2^ՓEkc~ccAvT8mTRKG ڢG3jp?i/~l_9n793E,4ʩ)Hب.Y<T|9H/Q<Ѭ64$mz69N|5 Ck Q|\"_~>T|ߝ+,#]VDmmEpG4h zɩ6XNHςWk wrU $? BۚD 2ɸ5(3$X41YvcF/}NʸS43*1X{\QUwmۨG"bGKDI."zoұM0$!ށ~k{r[gK 'ڧQlbiS}-}Q?G~ש4ؼ yyPKgVޛyWmчZQ\^ܫ!+MGFQd'cjoɿWbFvlkY;BN֙GMī~ճv_N<{;Er K3֑H:9oSQ끤3\աCp}z^ )fKy rX.1_*LW$*( 9*RbNEy_0ySLb1aEcR cXoGvJʈ#5#ENWƥ<|?Obx{}D>EսOJ67A~ҎHޥi`ln~p$EySYHޮEcj.׹Le9'+sze(X@!oK֠HM;R)mpL(6oҚrl79L`j~(71f1jl^,PAa}T\|#u\b(ƫXq'e/\ʬ=wRMDrǑ܅4..y>B*XSc!Jv " soڭ 㥻TҐ}5`9qZgb R:އ-}pl9p$Q^޵S/a!T>(q['r(FYΈH3SVVE1;t `qjըO-"-ETc(V[\V7QVZ}T ^!aL VCk#R+a_ɋۇS\?nFJzzQi%F3Hck{ozZͲ7>*S4Uy7/3=.L<`z@oZw\=F,HSޯ1~԰q yGs{VoTZs:oj.؍1KV<>URq8mֿ_ޕ19 Ѫ2_f:efw6 z~aa:٢fktޚ!.xYS!^U[1:ʽ ԧӿ8|ߞժbdӗq}*Nby\syS(eDحK6>vbȡHZlJyNw',9[qnޕױߧq~BErKW62nms2kms5hx=9(]DG/ curqK h|J3|M.q.Iۥ4m3N嵽(Ic/ccޏ8ڙ-x}<|޻c+s5Zӳ1F[wQ<& @Auп DSb8K]Iv@9aJT@+>hPbl"]TXƶ ibuJ<ډAh>PY# ˎGf]# ,* BcvU,qK O?Ҫ -TQ97%Q1"fA&#j^;issm$^$sBHc%N.UMβ2bߋjeGy!AP|m~y7`qWDL|`,/Q4C.5FeBU[S&ߕwZ(t[hlzS96n-䑁KobmF)^1YGjnpuרYaHQoZ3p="zuF2/L>B3rȃy}d2A{k3RŪ1VҦqmˆa-֢_I2=iMÂ?ZU|bYd£ ^į)9KנF鵓*xE^Q ?MTbW\b"4T" [Öǵ2jU"%zm@pb?ZIk pvWD' '(=Cvv}=H7RU$V*0AQqR![U6^;@Qȩ#˿.1+pZ*`eozs*v Zd,#:LM.pc^vMߵj2ߜnw޹jd*X0ck8J'eۥyv6}C(BNJnQ^evS1o0[j~;R;6XHyy>G+_JEAQh:*dr5 2xGkԜMim` SlmPA]腓+ku0r oRwN@̍$[__L|TڒiMZle`vRCh p=Oq=qrmZmqW8nNOe֒ȢMZqp#`qL$1̀(j^== iZRQp25k&}#keTCLn.}i.䷈(4'Wp3/M3C 6;H$e#)ZoZSVq CCͷR,󵷱4ǯ6⟋\"ᒍR 5#f{ڵ(@l i UڦJfjiVNVۋNYF>*B eDpu8w6}R!*i#0WX2aqwTlotx2t;X/SZsژ&TP?:p=&:{zrV9ok޵e4JҤB4+(x{`o6,EPVj:zWX%hur\m~!/]HĭnޞKoǖFwַzG7l߭,~"_#d4_C,mТ aғ73M;nvڂCw!@RD`.*nXJٕF# ɖ)&"ҹC zBt%fɊ]UL6biu&aC dU87ڗb0uPCdY.Cm(]Pqc͏7N9 _Q5 "|yFPʹEZ#$ BcV#/Z$ TRPƸE/R,"8"5 UF$эn: Q^_jKd/ށ}^/ZtVqZv@dolCP| rr[FZz-c"Y{Ј1MX }$">jELxG4G;4ff[zf1뵁߽C!} 38E7[AbYpǘ[j`d~/Jan McJAnrPoZoIڀTc}K+yI[;K C13\OLLn*[E̘({im3:H}A2YcM,GmQHV}5=5۸hbq.7(iy#]5l6~KˈT@*6ơĸ*_zpl#k.o mVp7ר`C.C-"n.Smj M^t4v9ZI3ٜXCboRO+.ýI ujPª֧F zbwe"7at觏,p1*ϾQ;Sq77,due_HqϷڦ8JUv)p-LH+YD)pҘa mjӳK>R$xSRF}|1dvW!(17LJ7-}6> FC#o1RŁkv+k*'mx5gŐ6) r(3X] Ԙ!aeePv*IZ8T́Mu jX&>tʒG2ۚHՌvG ٙ"S6m6[|(R[+mڥ2lAYܛ&Uf;M5fݪr-u(k9?h"8PX.jkI+@b;tcB*A_qbR,>Pb(|4ǔS Ԩ\Uū9uGNATDuȢ6,+D};?jf<(|FQr&DW DrV֮:itDŽ+,@䄄Qkb*>ōi`b@cz,y 24W`YnlSPLXXRլID ,+[/:PT\nT"{cQ;FEϽep[#f<6&@VK`wUe,Zᬪ[c\3RˑNޥxρ /ZkٛdP≴e~J\ƣqQ$./̋bwng9ujEFf1mjV8]`iL*/~QjR!o:958nE7ڵxn^Ǜ{ҴzX\è ˇO[ ]?oAqM"-uJk\Ƣd~jQƢt?YL[(S68s1_7-K,rqjxv YmlvΙ{{Tq?O545|Fo#"`:])H0X [o*PҤ,In 7tg2e{Z(#}tV=h$,8p 0Y*\%SWr3 {$h$KO<<|ߝ \r^9/*mڜf"ڵD"QuEnjǜ{mj_9&CoGPcVߧeU1p)> Iz-K T~8 ;΃R=V\@%R4tG}낺>TΐR0$b1qҴ8X#)[B"%ON4&A wo* 2 6*}:M˨xݾ_:@_?*+'`:l֨P;|zլdmraZ$c"  ;g{T1xp M$)&; چ9C9(XQ!QzixwJN'75I h̞d0~*2K/uӺu=E:©enaIӬ _a֌rFpaje7Oz0囒1Vu d L:(c+s,cs*2$-mZ!PrӨ޵(~ v,mq`Ux [/ԉ/܊Q;-??Kl1#K@jխ-k%ѐTxY ھV)cYjRæ"xe(#*2n| \BYtSezVr?di?Prj$X"u*YQ'_j?.0Ⓐ߽7c}%C+u5`9@^%0D"M(E@|v'փ W-:hR|-8ٮ֏KȹaޡeoO+q17Kd- >QJcڝ w*z\8爸֏nyۆ>SQ~#LWIGbGP$.tzVVUNxdxWtji!."VdZn۵N)$:xԪ,F? B6MLE .+(ޣq7jPm4x\Tڈ'cW, 8-eR-޵*06Cann`-}A:xHkt(m梞T1nb,)^^xoھ.Y./L1~I/[zvbKrtʼnl-\Y`ݎ^ ?҈8)d.Eըi$z/P>xt9Up'Ju<-Rp".?^[mMixiߝj"":agaqͽ".*s[DV`uö<01&⎛'NX܍]#"#b z!ϩB Fv n_ڀ(QjKbE;ǛzEV^mR$S@%Sڂ;d7VK78^H&Q sR\ut, [3kSP.8zLrKGv;tv=jU]WiܢS^/6,|π%LwqS.3`ďn<2c{nթ{vo_GsVSVkuzha{vy|ڍ8Q}+wd{QReV+o{WlʤO˽l[7B$Ad$sP{Ta; uJfmm\0qb;ծɯ S=>G QΛY\U %-X%(#}Tr7R*ۛsR04FAtapV UAځ]pb>J,b*kke$mV& ֜*޴")6k?{ $HE TNmo"9ϭBF8QhNL℃MfKǰI8 { AI+" %UVUԦ(>˰Eb 4ze`2QWIU]@΢i>!t@A+S C1K}dRW z쌹ۙ_}PƲ˙FhHZIQcS$/V/Zܤх05I#AҗËnjfq~(>[b@R61" ޸V2)KkzVc\O/:Y^ kBf+"rJ:D͸_?ITlڤ|+y#{dN>7 VQpK0S$ 툿L%0~PE`*Ӫhhcq_O@ZI7`-JFD8{rfyK# m* d-JYV9-uޖoҝ>$+~$|0O*. .9-;d/~#.uH8\%1whzyJvޔڍo~[zsu2 1tCi4؞MHbPIqrz%~^u|9ޑe'Ȁr$*IHW5u5did wBz5h!5 ?6 #4̀X 5MtFXb2!zIKϽHkZ+l=q,_ 4bXlxvYE ZIJַ #[N)"aRjgևC6-Pȳ/Z 32eݨLhW *12"mj<XۨS,ۿD#g`.EHfEab ]L[lhY۽!;ɔ^|Bj"vPe_V+"X0 X^PH!xb8k6pضըc`zӲ"尸#(l{w0ojxG~h(oڦ2E Կ&lSҵeE*fR֭BF<nG¥\QKQWH8OoC\MP.#RtR)U;t}׵c2>4s%_ʾG˦4KET-`jt}8X8ژɧB^u3\m~gQt1ځc_ E%}ι N~$szx 6&޴pá[e751L53AfM^$u'k HYO_SDQk/EVx'fM4[!EdVdS$"y;Qhfjbix@pHU4PHxx[^L/ڟKKhm֋8c#!]+dmVnѺ;[ڳ*/SM+P1 :nW:+ 27l/}*A¹oǵBb:GE2}t"bPʘD$!﵀EO,kZpfG[S,:T%R_~Eucp1*KO~nb{_:(?“&/"ݩd\dhSsPFal.=)eD7KGSǯC T(R6DzVڮ̈@oKsg?Ji*n  i0ØDG ]ޢMl7Pp jȐq\TzeWN#1[Pw647[Գ"\azP2wڐ3J#ñ/cm}dM!nEXyVZ 'a>^NVaGD*κë>YSeط ֝Ew| Y6l*vG CIz qclLW!vʟ[0ڵ7cc']:+[g=MuF7?MXyT poZxƭ5Zr7 TҗO q[ŗ׵f$=\~Z0T77|;^4&V؋E8n:ڠ4jnAjxKn*F8 fڵ&: D&l:~u#pcc: WÏyr=MjCn6mR#"Y7F&="ʤmp*%1A8>u$Hu q ٔT$1j"J\rH#ee(oN&#p:kzui]OjNhoʕ5-bmj^XwZ a8'eB E%y?I}:\>;ޅ) ܅AkSƘ {Vѣo{:{;kkk7eCjJ#MJɈp߭};xK[ T/m{uv;1ǰ!UFV=5#ыXoڙw.n}Oacdb}kE1G_CW~Ұ 2ʗSqtb#81K|Nޢ`M?j=0 m##֙8k"|{> c] g[cP _/Hb!-TCz/wZ](k(%XTcsFbs֢w7|;t^](WG$u*TB7n7c->lQrNNZ snzeԢwڥ M_M[!c .!I,c۵I`ڂ :$'t.AK0ðTľsD|: <(,dSZͳozYFrS6"ڞvUms|_u.fR%kRM-Jee)PaUKc` ^5ez,CJY f+HB)@6>$Χrt)8YF2&'oJX>n{wG Pڵdv cY6%^2d` KUNvJC#Q { ֍]>\Qǽ25imPF G|^?"VE"F2c;ZO k߭O7}G30jW @|=KZs+}r.E5β:c;W,@էl2+>CE,L.BqZxp¡ n <ޑWT`x/kRc@L{uQh$Xڸ.w<$ޝH1~XyVjYdĝ9w;"$Q n/T5np] r+{ym>JGa{cɣ*&w@NӆzQS@lǽFx 2å:*"@ iwB:e @1˖ԲM!Ԭ̯{[kWJـs 0mH0z9$/oJUG(c¥yWRAssڧH+_j-!'t7h~"omȭc2z^&/sH_ RJwnz4| ;:VAynj}A^I6):wd/n4O$Qӽj%29:< $OWHаvi4$2'sM/doCU(Vnh,IVӥ+K5{V"!*q%fiBQa)elqE c[T TGtYZԋWYM[q"; G;au+\9E8=Vſ :t)>+!5mڤ♯Ze2k֢NUl {RfT[׫\:G?-P 6yE$'h4+aj4OM9~ya\س^l)R(6m˂kQk ncK}ږw@ ɹO28bhi["wt[CgVژL BLE[:KAv;6W}zԒ&ؖ@:\4S7K P0[F YǪ arRļ@|MHv%nɧ8!,/("m&"2|A&GĔsU€''9֢6BKt{VW;fuڹU\#TR Iߜ԰pK,e"-ʭpV F17j( 5/Q0P鐽fdHZYX˵uH|> ^'[H_֒7lpbN.h̻mj1m CdUjep੶&6QwS,ZmaO48r(ۑE#)aȤ/Ol?Z_4ad?JF<6 iHBR/:LIOz1O-ӥj̊vJQ pֲ0é5HA#N sj0SP;֩tvVVb\ =.y$pUuunYcK!恅kzj>!"\ji%8U|Tc^ ߛΗ ,ǑKlI9dPRǞ5VXN۔5HdޕʚYjh ŷ.ڦh1 }똂"^[tҦ+te@}]L f17kGz2IáZ!z:ݨG}ZCneE[鎝sU"#G"|M+jx^qzYT$M 2H0jEXSo:td<4qfZ3/2T:6 ɪ 6t`?-̡I+8ٕ'޹p9Ѻuq|E7-HʵC.noΝX0J{jwS)K]>]jYT=5וNт@-wCKi$]}E mzmִ(BMbDͽa.,hbyI4ĭ(nVȍ:+$&0n >zXZڤl}jd{N7DnWu4[$}HB鉲_aQ߇c(LKovH|-CUaҁd l-[닃*'HoGTkSo5™Q4uJ49aSo^{<"̠+w5i,=Qm!_+Zv*6C6Ć yXYf}G3sȞݩ!(T\u:_Z0O:M sT\NҚHc;A^K&*.mcK$q~{XFRŨtqeZC#Tcnz+c!6Tˌ)q4!~-CG#b^%U!g@p8#ewd+f!͛}Ӹ%7nmq2r*84C"*K<4"9DhCǵ Ytđ H7_ |35ÅkrjCwpV#ssoS{SqySBa4ۇ"oa{WZ eS8 `1zNe%T=!r~t ~\ Ө ǨȲۊEz}Пf8nu헝ͨ&1"y\ZHp[5#pKQW;`]VUcyv~8^>鷭@=M֥d့{ ]|gnGڙzVVKֿ1B3cw;PE!NM"ʷFnK:8'*/ZmL g {t - sbk 홽DxHwMϭD^8ڑ=*2l&*2Ť[WH3uaj'UP¦OᇒK}+b/RH@6zkd˧oΕfW_Sh^BAB9}ClU Yz FnoaۥJ-Q` $=jt/|N< HkcOƴ-clQI81693 әMiWPD|&jDM~#l:*zȌ޾dFrHtt }42wK_'%v$ޔ6kLl*W]dgSžfdԘ,.~^#{[!DF8IvI`H$<&&c$/ڤYAutO4Nʦ،{֩N€mFїaSIJ(k-Lr@FmO޵c +mCfwq B2֥Ȧ oׯ\+uŒ^zx(N]YD#@Z8tBi#HɊy{V$oY;#zE/*/mڴч!nzBҰ]WqHF74-֥ 6*TebN֣궳!4Pa=j(/ԽP#+v" @x?39k(w~Ԯ#sX*S,IҤY1`HfF[l?j6Mlz(w{Oռo1R+Go\Xf6"FOn,q+Zn iKrR(EmHdf!;mQ ,(kRF|Z 48żWԌ7vy1nVDQ"_D#^sjWa3"X82rmPE1H/cK"@"[ x:7W*l~*L+^ȸfqVP"s(2^2D78N$t•we DPUf əzP*X_Fנڎ]:6\MOwUkUKo*'J2.EAnⴶX՚*HdܨR7 +7d?mEuE ,J~O:LIbQ(ǥqIԲMd~azVfˋqVNt"Db;Z/ңPͲpzunsbQx 7?Ʋ zYBFd~ԓ,rݐꄹ3jB_HI@)X m֧f]:Y]/vAO$lxCښY'BNԎ=ٮT֧'ަvr θ5_ǠO.-3zna8ۭR_ޥ64rẠz2/R #ڦGL\sb! {wiT@\q]Ȍ jo:G%2cRA$V*6 )ܫR߅8gni^S<ftktZF7.{u5:021C᠉E-ٜzR'kjXv~|n{mֵ0,7־$[>ɐ{~lIzԈn9Af6-@?ڞkKtG[#jV0rD3sdoXvq@P2Td.2vqz+v\e<}\f7"ijd,:]z^Ҷ :tp,zz$$K 2B镸`{ފv!$λX F$ŕg坲xIoΔ#z}@`@k},oRάAqw,gD,1뷝jgu fϷJ uPnm#{[_H!3Ңm?"׹ڿf̃31ŇF 7 mRYA#]r~„p46zJ]}?bӔeR6!jE?tQE~sj]9Y4L?]7%mbޝqRWtłn.*cf;֧J#uKs҇1NV}ƝE[IRf1@kn?? pzȼ{ ȳnѶjP'%HG}S4 J{MlDЫd~Tx\NZvrϿQRp 7S0R1,6$c˾5?m޵׭p{Z t41M&8ͮv{.@ޢ< ڦ)Ż]J3~V"aI!)FNҁ6w$"d/JY% dZIVsa֯loz:9_jFݓdBkQI Xƒ)K8*˷peG522su^)ZFH~f7]M$l8a{؟d^5ߥ4$O3N%/֯dܥrJ$eX)d7&XUj<+lQξ!~Fm$2;fT E򹷝2q6ØkqFsS"8X "rIa{ыWhXm<Bsڤ +$oL9k 6y&oz[' 0O:5fݍ͑y2@cn_#rdM"G)Xv+Ѻu3śkPEZԩfdYymML`x9/HeW&K1(66 mߩcu Q ٹ7 3 NԑJ8lw $~&" g.k\R2X7}iỠn4i>:[4B [p&FK_Z{B[>~bz oR\-ocFf"y}&[ާ\ Xh1|T3`|[Res1|{SCbcڤdPsK82U j~ ?cSfXlI:!?>ߵ$qjN{ɖ5P.5MUZM/("u Qe}fa)`**OPpPOLxz2Bmvo@"5E/^mR^[}?BN˪tiեyam d*vQ? .\u( vO / ݎ Su. Oi:1ۚYekԚaʭ ]S֤գlT^"n  pѵKS3 s֑CL!b cH`rk+5$ ? {ԜC-?44z7Y)VnsXA1鹷jLPO1`~bn}H'Pͻ7qY츃K" CukT \-\ٹwJV\slvy]5g6DuB'Mˏk\3q >A-E1|Sq8܂-z9! 4\=wtyQ_X͖|njp5åsI)^%Vp繽#-޸XZz;G'QbEkHݏJXF+٥9o*/=Msrjqk\78xRϹfXnj 8~h` #@/;);LB-[ʴ3@7DK}7& ꦴ~}})O1 E ʶO0"HXQQS33&FyCy7Ďo:M~Ia1=GjN32dn E.< zɴ]FmHmOJxv#/?D9fȖmRevzWRTɛJ~-&kⴳDrMK󜛣I Lٱ&ϱ%&F6,lSIv3ޣӉFۥ&rK¤7SP83u-dT("DY9z*#)jM){}VaW7Cr.]M 3ۯHeDv83fG](zmY:cMn=֧M#O^x 7PmSwRys^CY%c&Ƶ"KMTlޤJZka߿i9%C*nmLxlP~2q!ϵg0sR*M&>sgvZrRWϥLS>"-roL5A`ljiI<\p [-~F7w,LL}KϽpVL|̛mG6f֟n~ 9y4r{ԬLPHZv$tḚkL4ݿh!ьd-"Xd3޴qDZPILx~"NDHYkY.íF^ޢ~،B|LK_s<]iehDCمi)cfe tFE &ace\DR.wܟFmi5H P99&Q? 0q&iH^sS{Z'oj, a[(S,*齪U p=Ԯ4xZxrڤYb@v;1Rtԥץ8pI0W[>-jD1@z+*JPz[RfBebVE7?<[.zhg0]B n**{ <)FN֣J0nm7~;e[}jg#޴ECPc,XNn ˨nt[z> o&D#n7zEnvrtKn-Z)~ԯXrW!+pm\b1]/JN=n׿qRY8֦6t`OM<`z*i\>:ԑokSZ =zVkpu>PI#̀ާM;BVĂr3x:S8>;{ԃNjE<zx…CԲv݆ש#l7DĞX\ŷ4EDryڸxdߚA %;6)ݙc17)mgz4d#|ț\R2./m t%{Vu<&e6ؚ>8U>TY,n6ƗsFQcmQs%|1޵?$wo9ޥL vР#1} $#Q5K.-1jIlf&N3^8,7SR.\ʙu0&QؓC7iY縭LvǚĆ:e"jU?1jlSkK֢|߭N-2޴eyRH-}ڗKiC .,|j9,E5rt̏l2-9OlZ\9Kns6<==֥lwܶN#>}+?Wj_6?"E$qSZ!f+Ud*M ͬli>k,[r"6\ &VLQŭn I+E'oʡ/OzIe3>֭.XWb> H?քo5$dC}WLt!E 5Е0B'6{tMfb۰?ҢH2$phcԅeqoڵ uZi(/j$JyX; J6@j=:Ye\6lۥ^?qU%s|jKl W)xGm$3D,Y}F>9c{=HǚsO(1nӕj ҵ3Dڋƿ'E÷-נN"j*Te.HUcm-;~$ycl;<9mK,(p `~ȣmjH&beX$m65%FȇjpFsWQ2kU"jarf3FvWk#-fu,bf]á_~gI6oP.|-kS elsZԇ(?CQ[oCSSS' پ9FV"j\M%b],Yz t&iI3e(È Fui9%FܧޤK\QyAӿCO1 ^Ժif͵eZHNG"]cF4tD }Coʖ.*6 =*mriBc#QAcʴNI5:xִL\'NӼqt0~MzʂLmzX*݁ס$??塋jZSᒛ*W]{_mR-rzԟe䜓,}*HbLA [R-Y$-4Q$`?j~yjMZK6ll+M Pn;T`T!vuDK~(xlߥ u1. ӆ+:s|VNŭUUǽ8CIljEGPjSy y.]qZDI*2Zbj}9s|ӥÐژfn!rPvcK!Mj۵Cfr}FYUT`,Q;ԜTDxⴥ9tmE!K ȃSe_WeJq9էԞ!zbLC.q68>!KHw:t6H7< ArѷPrK-i ɸ >ZN,uoK;)}_/ҒQ4:`Z|"7TwV7( j ]q"ZL^԰C4!N6\C,cIyŏvRċŽvTUnڍZpۛ*Vtq6vRjǴ{k3H7Hc)yU;>J z GF52 4y V橖v*h[ĜN8N[7:ԫfU uLQ%U y>u<7naQoяcuQ6 ;OF'rwʝJ:oҙ8ш- R\ ֗Z<; \H]P8o{W'텛Rav6vՉ7\I XLnC=9VwZ!Naz^P@El.3tji$<1CHAT1H&.D@%? ҚeV\4y/M9 ];,*yDW>&榎' _J(셐9Ԝ5{WG4HmޭӼA =)y0Ř.xrvE)0j0"[s>4xL tfs{v v'PyNڊJFY:[/zUI6޽ \ %#lJЍY#2_ fTP6_ZxC3_2HvZgHJͲ٫9ÿZVb~ ɝ $n;#"#rG=jO.ýa˭K V,# TڎS\|TE0]7x'S0onS1d53L.>Qoz֥qdu6[ :m(ZkV6}z'rj8xozI_ϳ\se]\H-㷞dNW~ÜȱALOR7JX t{mdnk2({˥.W# pXޑZY)_MJG A)g͈!ju%Tx^։8.{^Y6,H 2>9w3ޓ09U8er \l7ϰoJ[SŇ@Te>'M\$Z8ЅSmߧZY3X=5y8ϭE#O^*H>|xP6Ae_4I?HȺObK$~mI=* qk*}rj#SG8zgmjqIεZ<aqcV(ժ oCJPjdyY:Ο)߇eo6B,Lq̏ZDk~'Fma8"ca,w㺲F&~)u6N]+CIygd+Äj6& 5 Ľz[^k;}[T3C?)>f4E^e MAӘR,N[(EP_*:eemG!7&'ΎE [-Mj=Q{6cgڬۇØzyTg[oIiQOXZ<]jP˕y=$*XdTݼi*lTZn![OƂ wkV̂`-R宕QrJj-埩 G+lwf@ڣk-B1>lTs//2ݛ!r²u(w ʡ_nO_.Ҷn˖ݍw#ioR"jgK6KO-Ө=мvq[_ʵ Y,2 yh͈/^j Eue;UmSˉ^4n7Shr|mmpRJ#9e.ֿ7)ۧo J/>Inz ,'+;3t Y,ܯ V۸]n[ ;CpN !Ev-a֤6[wָ\5L M\qBljH"ֽ{I6(E^),Qy~Q7 >65ěMڀq޵H#^Uoo:n]년j˰o A8ؐ{w֐& 7?b򰳳AI-^$/RE JBQ&6:ő`mM\Ht`|Qy4JE*4*!4;Z!O,?w?>\yH7qRj5X[ަpw5"Y5QUFtg Typ{0q ]?j sէ"cڦب mNDfis>c43ҌU<;F/wU{mP3j6Qrvo!L;)Vm6Y AҙNY>f@PdĀ93BuXsQg{7 sk:8AZDVC5=(v_YZ2ָvmzm*}B-{S~bt^Qrl ozcӊ2O,\Z6blmhK o[t9q6QŮh'A߯QFvcJd|# yEᰵ+Gp.7&ޚPj Rȥ>M;oڵ'oJU2wJyy#z)d/4W'M oK,Yoʦ/#jO*avC`H(9b)-SkL&H7{АN|*7q$[(C3D|.P;ВiB{_+GzmTéCmMkre=2=)8u,H?UZIVADPuolFO @jXcDQݫQb|oP$xP>8\ﱫ* `} ʍqR44l7t8Xn*HˢHب7>%}ZP.all1[&7msO}_ja 0%j8$]P> T2N;*[S`/ʄ͎ǝM!2y43%>CiKŽ+Fy%\\\F6Zv~ u֑croB3V3iȌ:ޚcC[i%ӹ `7V4l5VU-pэժq&eqoT#T$>ӮR-7$\M>DlX3Dlu%[Ȼ{7. !>DŽwzombfmOtVס6$Y&ŵFF6r ak+,d ߥE" Ҿh%rCђ0pʺ7\5&Xc7~>Ib,C}+{rӤ.Գ;(qʻT6ﺁXR-jlI㣒t:0k[c"7wچunoJMcK*@,@ڂCHĝOmS AЊKR뱰S'LcΠGl"؍ m3qa~Tn@LmDeOk&rmI@j'ȜaKE0rK.:ڮʜ+Ʋ eS!Y[}ZW.Tu42%>\”7 "m׭Y֦\I+^vP:éb: d>![eۚ3q dlloj.;oGXڙ 4q'u[QhĭioFe Ql[VY|ڏ[oE'~m&UZ?F~6L\ُ PZF͗} ۭ<Q vI1j UdͽL^T5 ZyR,5ۧ-n$cn7V udh-Tr-<=2ʲQbHewJwd[-=#NffQh_4hHM 24'# p w!i,,zITȈ)uzX$s )+THjm2=J4)ڢaIZSdi!/5'KQ*]j3K4L@Eص}]7?;P LLJإTy%OJB W߮[S%VLO[;#|{T$Ivc~ksc}#B%ݶΕSE2-G-C] ֘CQbxCQ>ɽ/zfQQX7j!"9OIڃʕYtt {[P^;%/ԯ 7*` tC-m#Zbk߉"n2iz3[YKv1R"ҟIkp&ϋo<4kɎ6`::M"jm`׵bV3ecWEHz 6Y≮#2--hxP2oՕ>>]T*KC2z~. jM9\GZo;ZHN2eWd@P (*7}0$^Ӊiַn"𔏩ҴH[j2,x+Tc V*_TцmiI,qNeD5utaڦDOKiqj(Yc%wׇ<48JY:Ns~[T9E\wHD Ć{JgQ+.tf׃AS$llM3ClzH9.zQ;劰, 3mJ:j9yFt\i@V1%V49͵65v7imY']3w+q_z]GL=A74c'kRbM Kś)t[)J%w{Ҍ3 H$2Ñ]26^sTi-JakoM:Lc6T-a=jW k\p_΋\a ,_*F7~Q~-׃Z,11S4Nۆ VZG2zv߽(Vo{Njt` v68њ]nB?xM[G`WvIsx{̵.l$ ׵%71,T.w 8}e\.Qx;INt1NC0>ⴠ܋I20uXClvޒ9*LƗWV,Nm:^1$R$(a`j#5զJbF ٘. -DWwԯ6 +{V>[5Zi.Qƙ?ZU^-͍"kQ- ipw (i.͎;yu_Y͘#AUr/1FaQ #5*PoZpd}dֿަ$6`ɺo48lABlJ(1JSr"RhztysZ!kZ:~9eǭ?9i;ET6ʷ{߭8b; Lq Y[>e>V }TeHTnW{TerK\uHȷk)&%q{;җQo#FI߯ZኰՆOXqm9_qk}Gb<07ާI𘐸x(${mbvdMEVꬿZ$UVL Ze6TNG/1HrWċmGT"HVަ"r Vn5,w/稨 Ky֥Qzݍ4}[_M&T &($<{LڤdaތV1OZ}:z#3EaR9jB,-å%;R$R-|y5e4qR0ǯzUlnj)x<*"8\^a'6&Ry2+I[2ʓv9}B5,uI!VMz6*WVM%ݱ>j-{qڎY> XA>ε2N'jΎe֌$G7f^˗:ZĊ,YOxG7XN'ca"d6\.%_[s򨥗m֎:s' Zf$_+R?:oҹȿ[VY=6wmҾ6Qc$|ֹо쟮1QqD2jos"z٠Sg M'k OޤD ̵$lp\or)a6oZf7P$eP.ynBoS"up)42S О+Rw[{ޥ,჋%qlVp/B4DT_5xCyWg]O!0KʋKb͹ƤmorCO*\c &}= Z7bzTڤT87_ʣh a򂶱Z\{\֥JGԲp*%\vh"UmjOI mjt!l%WeDL5,G`c4^F5.QV{7rG'S;<&7BZX<07Jp9TBie MMb*XR^$@iB3)ݯڌȖ{ĖBY㲐(ѻRQeԑMk|kOavpZޤ 5z-˽1 &]W"j2x R ~ěs֨D+=(j%f,1xkE_f u'ܛ/Z$:q9Vwǯo:f*~( Ankұ'+G@\8\\QqL\nl7s[mC+o޸؂~ηƸ'j7fkcP7[X+˗~T2I2ïQg')H"Xb~>j<=Z:&Ѧ+M:bi$G%IpUZ#K;jS XWYvuJ[eHzzIKLzv[H#~aqz1I/fWdIA$]QC3әVV, Zӣ>ޑu2q岅i OQGR$ ~Ζ)5HXKwfȒ#c?zW,|4DMx|"sbj4QSQ22;nkJ7;R]k\-j]lMN q֌ [{֢G4"<0?i$wyBs7Jm/qNr-Z<'GLnǽhYS=)c70#rvGIvn2:mʭ>!^Q~l!.4jYr}j1Fl$E>Xٱl߮ըCnPtɺ.43t\+c;mTB#?:d=D:5[xڗO 8Ze&-۷2fCs~kMzu.r4"p-c- LqF=7Dr[vX.iŮV@&/QfCaEI8c~Җ.l1˵D݂j#+zRIj4<1ޢ=+1?{:v6{&T$×iDʗ #jI2Q fz{]ndhOps$t=80q}KxtIYX$PJ;Q5bJBKIэ-sz$3MT-+/\*2idj#SeNɍz\hٹڧU'ĭFIPqt ihs-ٽ+Pj>EZ*.,) L8Ne%Kbhcr6fZQզ10bHHعa YFxX5O+a(:)i}FtÇ{}X3 JcK)K?EzuQJ8ar޴tNbz ix-\:Q2&b_mi4'6,m:iYF\-<s;}AT،xf:)P+ 2p77oO=(ujT;tz,{)u*8.">Uƅ?msy~W_mM, E,?]kuxwY47J$$I(Ne5&OOzXg6tƟë/S1Gҧ$kP}{S@˧n*ڵ ag[D ӂE`o0ض-^_KgGQf(ŸP1';\T=,=JGqwSIZ6Ի#.~ęʵozyUC8}D(ǐ'/ljfbʸRyUpu<YTu2bſRo*䝀 F>1 ߦ>yK T8 wY|01wcj+f/QFrq',r_¸2jb}vfɘl;RA$ 9ZĈS k[Rɧ ϑM*%]FV_:ýHqla\p2\v_-86d>ڥMB7JkEOMSBI+ְX\ˏ/s8tz-kb5= ^%1&ZZABP$Q}k67$JwX4$h Pmo_QVBݭF|?n?`cUMӹ6qZqRnHٷ|%rT>G8]:zH\v)R^Sa֤G.< f *Mh޸/ fyVEٽjI˂XL]zC[4F^zv^o{`ǵ~j."]t̯QNy30S#`ie}Jaԩg(D.JYZR%hYQ)!\jXd#iL(󠗛qeM/ymC\?N%~ßmBqq =lۦSjY;',b[pqbZ:(ecE2F`1#s~b`E֛ ~2-m"}T5<!.؃ 0ʡ7_z'xb;z֗ɟr x7:bl9j>o;Пbrʢ"nbj!?*_"A}KȮ\i4niIyWdO.)ڠ0\5M0HXK<cRC#|bȊTR ͬ8W.z) ?:XARqYʣica{2԰f4YaRg*I,o:fbxFƔ#qA,ߗjHIfG7gKgm"dzoJ8\oL˖gsz 6̙9]XΧRe!NkqHE̓FoK+%koڵ2Wk!k0^U:mM*FIxm{VWQ|s07oZ\E!ҠXt S1of_DlңĤU'(OfD-VoͫTPlM[B~+QELMSElRބFlAkFצKGs`ֽݨHozZ|ku+"{$hYl8tpJ}:!9` cާb<]#*u7dc^mr0򦗋I8kpB.tq"ǾI VrP۳(zhx˔ EVF 'γ}:9 ZWe3FzRi˄=s O)V`l< B% ;RiHҴ\@XRuHIWcPHxc)Qi1Edj7_az3"$Y&c+WwVSniPnmR1n}!"G 5ݖo(+SH$f` 4x;2e$rqG 5 Q1+oFyqTE(_ҹ8nljèD6?AM18ZTZFej?4!JZv[,l5qzs,u/ ժtj*k4n IX15gk\j9EŒWnTǨA%M\h07qN [`jGx9S9Pťai+O4ŭd_;+tgD>*6bK^~ʁ{9GkN)#I7 ھ# z(@F@.ԉHG0wpyKįoz:2I-)“~m,FU. j#xx>g:wg|"IݭS@ jOS!F+H֧HYu27pd(AC"?.ʑڗLn9zYϥ;N5A|kc/?MvtY$IזLY[-ngvq8Җ(Hy5f nmY6{ߥ6!r<>=Dq+lAa7n'z5+;c~AQ/}bvRMqp8%D/lo33Y/37zO/ !G}8PlmZr/).*6pQp1aSM1 qGZX&*CZ޿iY"ݔvF Jx>o:EKN*|NG{1v- X^HUVPɉ!".v),f2֣HAHqBm$ʙ1bkޣ˦Aj5m\"0~aE7qA# R2Qg;/6yR%RFlۈݶ*m):j1cRVMDVLf ,24f&SU[ΕtF]jdvE1ݪU<_34r6M$xbc1Z!1ƭ!\gކy΄E* Ϫmo*X8nn'?N*dΎc!Q#aSjဏ}OZ}O*. bUCH+?:)<z6,ٍŅjlzqe\/[֖AroQ)mǕ Qg4Zs r{`j1mQNf@%Td],7.D QZqF6[ h|,vcS?{I.vR"|ފM#Y\.؜+}emSq N$2ЊGGK؍rڠC:acZgG25NqPŶjA KxɷPE!PMe|܊#b!'4"E̦9ef]W Y^|\񫋯 x' B/ypA U4pn<,)u*`Wk8.EE21Rǧ4lqM;-,/+U#YpGG4@oRK,߉ɱe}7$H3bK"避JN !Q&uKԲ\_wKmX?3F3_B KClyQ:^ j\\woΣQԮܻ+%=Ôy^wk,dX|O;ކNN,K֏NQ^ʪIL<}4su e{^ԐQ .j=T2:,$E-Pi~ JI}z9eN^ kZO NZ%QPTzX4Dqkz7W˜ZG\{\EYp#J;ږ m,MpNJWK4}<ڛZ D Ϩn]ޙq y.1E*U뽩p-ڱHyR{[AC$HٮKwiI4iUTF}`AhBe(#MiEjx5&m*I^>yQ{PE"=="2:sj#!^3eU067&th۝5d͇ըF;i1yFȲx, $oK((Y=EwXHl߷Bq84m07+F]=<"`o`׵,qVu%[SN-G"$udAlWU.v5 O*JvGt4.wlnt΋|׷zR.mLH~Qɬ`z51HCRJEvRiR-+&V#T̶c/;Ӑ)c\u,N#*}29 czBٵw4ʙ:BDfzGCa֥(HՏl6&o R?An6Lk(4Dk,vچV0lߥ WI5#^O,Pq16ߔԓ.Y(-CIo4Vҙ"V}}%e˧qcUIU=|ifǟ:E*`FN*QlMF`Ox.եYN$Ň5R8ԓڸe+F?GRb^ޕіA%}|C/zY"A2[zIo֛k9T)^gHn{NH`( o/Φy7LătZfYJ<4YomzR #ה~Ub_ S"s$d}dmzM٭o3 JV66ڬ?jT{VR 5=*EYGjPc`h8Q!oaoCn; tXpxmu?9MTf e|^'1kQ%m5c!lF#HYP=,y7nEX^^^ֈ?6cQX Xm֛M<{b*b;hBNچJo*8J(c5ß@LG n$!lEZ.jO$oԱzbA498"10 {K@]m\YNId*:^VйKmGj4@~>*8\%,[R|JA_-7ܱR;$GяS-? ŭE{ >|;XIkn5#4p\X?&w'ʦ}Cig}_jurճj'PQ ܌j)dCbE+2cp{&K/p 6qڴ :yEp/ڵ|)T<Д*C90=CH 0A$rċlkQ"sJNK]ۡ&F(vn2/QMv/O*mHo,TzR r*ƌ$H=)Xp z*aK2yWhvFL%4Lֺj ڸǵJc(SIpcuޓwXfAP50ViO $p9reNp",I*V ._G+Gl:ˏLRт̲'ڦHI${dTnCKKʃn$K-%QN@9oΌJ wE~-DMwy8t74˩Rz;tăC9zWS΂>ݷNoe-e UPr$t5FY1ڲh$X(֛sxtJרQ߁{ӳJP7NQU~ucvTx?`j+#,9҉uUX2߮j:^?Zu}9!F0cjyBqYD\ԜÁ0 ?,S*,26 qSu1!kPho`OO*H'ڤȌ9T,-m>Jӯ&ڣwSC0cj 'קڦU2co-ݬ|Jܩx#feoN*i8d>7T@4h㕶&I[ŇPi$pGFi%9XRjڧ=zUxڊ IbJNoJJc|^9:6t"6'ǖYD'J 'sS<αTƹ%>mIԾWћmB aςpM6`VZÌ&ʤ 1QA2HEjQt٣E)$Śy}tqj๯vgC-s$P{Q g׈֨]H"Êw$g:*e8z^kp^EC# O8-mښC ۥnlMޣoZFBէv#H wdž1ޕBKlJ.kOUg֛MaDa7G0ܓ{Z)"uK#},XTi(^֣dx#9YM7_$BQG|{*[^* 4L.Qj!&?g|Aݒ֢bɎױvQwc% 7QDb4WO,+-WFgvڟTxMjI_ޢtU#p6R$_Ҵ%U&(8|'DwNJf֣N3#Iyw 7M yj8|cҐL$%U{*n[2 P".ǙxB1`*ڥU]<Edm@dVK8ZG*h%f="oGG`GCo*|6۽8Y|Tl7C|K-҈(Nb_o[Sm>v}-pq][v$۰Ӧ!S^=#{j5B p4<[JO$jQqGplΠ,˿&+zP_(}E dmG(c7A1z qzN^E5 c|hsQ55Ͻ,qrq*ue#陴eoB"{Df "":.7/PiR$75e#.;M6bnO:rA|ֵ$vTm|Bh|< wO& k ǟj@@#R&>~|"7% .2x4, ٪6oczg>$f俟ڱ*Jm޵Z|ށ*z 3T\ZƎ Jokm>tp64t_H~iwNyTYĸmG$|k#0߰v8ޯӪa뷩~brR#ci/u.]RX][5,GL&1ľ^$A@ҡ8Y>޾U2EDm^3's7ZR- ɔmJ#ڴj""_jsUd>\/n,P`9e\m& :d'c~#Hܧi/M_=JڄB,{yNnZzoY;ְi:Ce_ؐ7Tň[Q(12F]0<'m_,St4 ґoxT.д4t'ޞ-TV25 2$ԚyVHlo*5Gs 'uU5"]ڴ3l@5u?F=gxi$N-K%)_Z+Gu_; x}о.Uo:`@FW"mn>.h&!!0ٶĵ.EK X%>6W.*G+yȪ]|LnQyo* CXiqt6n`lj!)8(@~JJG-߽;H1`6[tXK Y: tӷ; cP AʢYMozaRݩg* N`"S8 }h|Q$L s4BۨH_V(DE^+km"ESͧHbfņ{ڑfǺ+Kn ljr QEr>iLd=*|xl׽.U#ıԚgGd#ƾ&>`9oDlmчZ:Y#S `̯MŪk\饍nߵN.+~ݶ#VW}U` 3]<$ۜ|?ޥ [z,ÁZmB$cKZƧD:T49_sz$:;}(h,(d0$j}F c~1þצ}$8z2<oj"WWNŏ7p"ebVᨾ&(U;A>! MB3zDp#gwRNo#:?A&+Ks5MH'[6zMHzֿ"2Cj;Hv5ߚ1*qcfjh$ᮡzzRq`V' ~4BW%#?Q{cXD?VN8ىk^.CeZTBȶ lޓ+/|MC4yr>zMIbW4,!g -t.v'skډ{ޒ_'-5 (o-P bh(< mGJm9* {Rg5qr okw@.Z2%@ˍE;#?p]n \}2>xYwmUߋ6"Ȝ !I&K[JME7pa|d~t.Aoz2z:OL^7qU8}qvVLk€NV}i`*nzS~ZhصFUcrmaw[8@U02oO 6 n=*b!lzm\f"] f@0GC_&XYRZWFup(#z(r~\oJ4 Дi)ߥkpt NM`)"EP݅ȭDQq[u3Jޤ$K1?zCڙ K4f<܄(Ԋ$K?HNf;5fjhc_֠Mjt@eV|2ԋUIl֚=BW2CZccQbF-֧I& xTpSY ɦb/--Qj9wnQ]榙#B~jY<OB(q~> 7ތdT/d\1$F5P` Fm*$aHeK KN)b.mZg*Hp@rxt 3׫|ͪ+[(So!PB"[{Ԝ2p̽:[zcl7Z[\ wRGO[$7iFJє#LdXb0"Œoz֥\Qic9JMf#O;s/=2//Қ9>CҙK_* P6Zu G 02nQ4^0zۇy˛Ăy?jÄD~t4\ O@Ģ^t~ Ҥer Ip .%k5رEplaJRbC5޸GZ=r~Ɇv.)p75#$lHʶtxiqz҈i? FB\g5k /0ڠ:N3FRDqRXKQK$*rJ9ϕTRO@{.n'( v'oJB]~Ƹ:C*׶ԒI"%S6ٸwTb ̱*"L;aorQG_<ih Kew$%N m:HBذt 7JXi?[4['6|1]3#F68M6bE|j̛|mz 7!z:c(# q̑ҡM>du .X.ClTjPz޵FX@W긫<&,巙]mv?ҷ|UP/k:~\uh*.€V^n$1R㚖50nd+Nc~n䎆SOZ7Sfi/&M)#'@q W XpN|TrclNI64R+/N1bln buu.QĎC&O 9$\r5q~FjGRzd@~_zD୔dw#ֳ~uoL*8[N1XmRL>Z -1S~)8;hjug7g19eҸ/֢Uí&wLJG Wʸ+P޸/sÌ3ǧ_/:__ O}42@ڣhU ڡ+vʷ`~R7jv4B\Kެq5IsHo`2qADޢ+yM& 7?8Z;H>-jHuad]AI>ѪɟsG哟\nkJx˩I5 ނ"#vƢ2 :ckcc{Hp7;-ˈ֞tXLyѹ50VKڦ*+_&p) qn,*k12G/ڥCyۛzk8aS>t4d杖"?Mj-*{KEkb*=d<,"֥/ZE(qkZJΤ?0Xw\+I@Y$yhhivhڃ+]2&b棝 UP:d˾ Xg ޤmU`j//pފ!,j, ܟj* efn/nN[ͨgT JIp;ŸQ>J!{Tǐʤ9z`:Ji GxKx~ӡUdyi46EPz"B}]<$>!C[oaSp]_TNrb{tLU7ʱӫ)8 Q6Wŀڵ]an?b\vt'H$yVMfE{T |5 w+C;V֯jxu4&jRKx5*mS:uVC9`v}oZՠ9S i8wylStG |4#mZTP3AS܌Yugm,,w-o*B8YY- "Pˋ֣:eDu#{R/MݯBF> P\rIZ[D,AǭCC=kS:+ vƣyn/IPx6DZ5 ῟Kcˉ#u jWųE/BURla [u3jBn q\jiARj Vpq?ֲlqŔ:kK{֤`|R4qoVw5z^kT;X6pzRW-T<l(A6O4 .r2, V ICfk1浩1% zX Zh~7.4y>w!/,nU`_nkɸ ]PEF^.@\iu[{z^b d$/*c̀٬ uMHLxkÔ%$<H̜,Enia)dGAi#6Ytnl–x[By{e_*n|JKj&UbcZi v\v^&gn[Gbްi'OZ/ [n)7,zWiw^{BG£W{0j8bć݉4N yO+U/ yn") wA&̄p վpV6PXq/J!搪y߯JHK݇G iw]4 |`ϭ χ.]0ڡ=e=/R1Z_Tݭ4K)K܂l 6ƭk}B- 2,7TrHSicY2{JEѲYF=Gތh=*Ț{bSC.T89I2uPBN:TIڠ e{yM M:-ojDH\G\צHvOnZhɒUƥ˪쾵6G/~j|=9#b w{=mBoǠ.T\rzT */C҄Mm{US"EDb\-ƦKNsD$z04cl :c,#̵#Lͨס b>Uo:m( ep6Sn{پu9-b7ZjYZgqoziCYGK޵* ޸Fʶ4x͔=icX \<6u,ߡbAGJ kT+[T:ȴc{z3i,:E|K/Ƞvھ4G1ߵupj7ޟU:ZX¤w;gRhg w"dž6IhxyԏXP*|j-Gn {Aw\7@i2 F"";GiiZ- +]P,/oʐ1q7GnǽS1sԼ %pEi(Ȏ-J!-.r) "b޻Ԛt-p[ q4ičvV[?{2cqڍSmwGXRY5I*GAq>*{FmCj/EkHfSKԚԑ ?ͬSM Y_*de̙Q~9Chn6Ɩ3E>[ï֮\L&WB.?6QNƌ8yVR ݶ#ʥT֧Ep* #z3MPN92clZq@P.6YTsSGQ9w,cAQSɮnoP 7l"f6\N>?E .{-DuK0Կ(kĿT##̾e)HEnfv=S&p؁~h:K\yoˍG K'1߭p 7P°čsw+ZTxź/M#%ĂaPfR䶸<]@j9b6GŸ;'nGzS%&F*I|AsZKB3lsIŒyqpGAc+K1Y_ñ4tB7 6nk^d@zfn7ϖHOcj5m F[~ 3ۆ2 "]KsB ; ʓ;97%[5ԏ/JDۖMzx8QO N,X/?j/XRE0[j.{Ҭ^+޵1QrkaA_I1^8:~⿈A5jN]1f@7VtS"A{ڎysRA'^&iT=y|N in7];<~XU𨥶+zC5!Vy`"k6=XdYoS΁{juqEt/SEd>^?*mfKWPI^@vڢU92 mmxc)!<ڴMGξ&Po$rOp $2Ejgn[JlGkTs+dP00/kmP!I#Ll¢AıhȊű'Kܨ8A*,l|tP˶VrN!\Hl|7/æ73eW&d-Z~&>,.$' eb#Sݿm^! u&T'`w>Um?C*#d6ȪIq}c: c\cmPtv{a=z;E]hXHNuOjUd˛gӶ׿/2T7k-OW3heʃcS<7 #en!s5`HZQ4Y JGc wK.Q"#,ӻ?3,-W̔0./zgta\~(N#VP[;mFicU aҢ}Dr_6k{VDrJHB35]讧Pt%NS"aSA[ө2 5 Ä#͸w޵Nxn_%6>t=pe |ێzjYTݔ~g$k̒?hjdLW.Q߯Zi$TuFr/:]Cosjitp+*`|@yq_VM nՖ偺D/Xdw' gd# Pnq^ER$"42rۛTjeWwk>fU~7!p{PIͣ9d(t75JEʭN#}1 dQyTZߧR@۸5iOMw^`"-ZĚ}Rrά_/ZC+*qaD7JSzmYÄm\Į[ߵK ,oU})[U/QK!Bߩ sſյ)NUڢ~a`uR\ZF^$aǥirDs+u$S3+e[ʞIlᐭjЮ0uo֌Gs/9 Q8%hZ|`Iqh8zf0:IY,,з(!޽kW T6brI3j "kW+;z8־T!eRfJZME{OM)#n;mQ"yKS4AU[nhI{-uY9K,z~*D@#W3rZlU >E-HO\TѴ?|Lgot^0M8-솏NS"|Dw4N2i%⨇FW޾/xT\hJ Ĝ۵fl$7eN֯@c|GZAOv|eq+ck{*,l֦Vmj/lډs͗(q!6%x-w8Wo rӬzP>&FzF=B3 lXߧy.2їM"ȗ54x1B"A_Bnxnє:2-nE{'"TD6i1P:V[XҖY ዂ;jṊ1^lj&bކ۝|iG QڎidAT,*ÅrqzOK2 ۥVV)&v@ 'u"$۟_I$*8 \֩P>\5$mΖ$xh/J}鴨] ʗ~|5IeWƁFqv=ZǧLZ`a +ysr܊ 6mB2^yoG[q6ޤk<&̲GrsRϔ+~m4qpMj5'޵+uYT=1;-iF9,[|4"(-/ݾ:0oѯ@Mc:M(QE:YGsflw2^51Bý,lOA&Km޵_fGZ!zV[#TlWY\T@.Wʮۉfүܬw-GniR{qrڕ&Ҝcܮ[ަByDIdnhن_G#IڡXZ]]︩i~~\F)])Ƿ+⤉O0ٖF^WAƂHŕ74-,P1OJϧnsqRfu*3$F%jh$[DQ&ڴ٤ejDҗ@ɐ,-ʤXOZ? V& ?+jZAcA8#᥁Ez֠KLY|0~!D<&m^q4xr 6,AKhgCsNݯhw``Lv/C3M*ƫQfW#sj= s[z2ºP:T -˥G!F2,joFeսھ",Gʣw(oCQJnI<:DH6nޕn0,:PHUuL6 ! G2-IWjSupJԬixR)=-MxO +Ps9m -Egޚhg{Ө4X/X,h𚆆ܤ ?q6 KqiI%ڄ. ;RCB%W =mB e=;C~:D4oj[iIiONjuIYgލ&[X1FF7sOm>r=۟J@JύRJN{]b3d!Ag9(a2FYޞx?I,QIm|^VIn}~(Y.q_JKȫ}w411Wcvʠ5G).V"8`:TR 0d԰El[а'թW8OzVr+sI kW ^5Q.\ZJQ六P[}R('n\L66<y7MH7,E(Oȵw'Ϟ} =@6Vޡ c B#`Z4!rxQQɢ9Ly Nʨ7ږed\v-}*HG:QԬv;mPB[A+}BmIMSljX[G~_$QPfP,Kiɀ^gf\v_R'#jS){it>O~aFQ50Ժyv&=s~1/?2VHEǡqc뽼TE<ݣNaDB) <T`7;^LZõI ^$t^RG&dzxd+SK.jgԓyź5nըNsJvaZ:#Ģb/O*>"Hv~FX|rw$qڦbpoF4l͟2OA{NUȝ m3DkI%ܥw+1#t/zTlIsgҝBoqC,<ߘޣxUK?:Dh;VIbeHv#mŪxV7ZΕ2wHW.֣*ۥ|tܑpډ&YUFduL%i&:ߵ^LB-==k\ziOٮےg.)vXhddoz*2R,(ZH6Q"rxU/\8xc8$ ް<{V1UkV'P$k$6/fjW^ 98ڧe=z, )DlI ok^*wc{߭<w&{ZA`/ñ<֠o2۵&\E 5oR堍h5ռ7"Fڭ$+&{&5{R R*cs׶(I /Ñ(U>^wn{{TTrd"Hzєd!;OO1 4hhq4g|/ p{TX`b$6S0m?[!a}jےwȲxoMg/~RV^ 7R_*%cRkW/\U;ZԬfPZH#*K2E)$[e$%ґhV+S?2ҞFSCKը K;/Ky39M )r?,xpڈb!kw;ssGխSvC,1fsMwٺ\B9,X|SO* Y¡SxK޾ p?߇ujlzQ4 vONjqL!+}ϭeWX6~d.@}VQw'JJ4G[Ժ=p$$$&T0v|TJOjJFqR@rؚU)enR"&20QV,R[߭E #˷J<j|B92_E]ڂ K:iZx%ۘmKK 6Ev&ըDqfrUڴ:xFD#}WB.6\TA[#֦3;goH,l69˃ 29Io:"RB5L8&ф[PW{TH!si$ғTnbc lM<cPpx2h a7:'N &XDQYa^d<^Pvn'(ـ6YË(I{%w`@~b> ߁󍗟yv=OޫerNGr4DEwʠSZoy/;wo"̕<̒UM Rp@%VTU ! Gc$# "G6MNXoeD>seJ-zm6d:Nb+XUD-!"Nvwm5̚dMaʼ3L<3yM8wԸ0k>sľ)9-pUƓLx'k9<3%(M8bl$HdL6 ,a3/"X6>Hє URTzjE{4%q)D^\K fѓ"h 7J$(e؛f[kWie<9ÊHx0nmj7FKB D笒_$XʚoNexk4F&.˹Hq+.X%FxRfE=`:m6J[5-}k%ܭrbUYib*cCbI2M EM?ђ [ |X5愩zH T(9˦l[gxWHbp"9 V2xG@G7z P6|dȑ笹ل!$wjwmTx/'b?NZBʵdywr"_ϦG'i5 &LqNP+ &"V0G&+ޚ0^Ed$iTIiJ~O*);{z*Aj?SqimF<)ISq@Fw#^ȮxD2'OA2)+Yo?.4JdrqF@Qgh: hyaG7A5K\n-a Ld Fɮ:EՖ'z}Kuxj8T<;e|8W5};LU3"]?IX_Yo؄T&JMo/\YLTCB(Š;(fuBִ)w{e4! x[.\>!ۣ?ZUTby#PNֲ*R #t wbV~!Re$^JORpk8qfx]>7j=ya& i>8P$%>&pMt z.q>[I? "kdc -dxP|`Ы=˯ *a ZaԚ}FLf84OQL.:2*3&A( d_/Q36Zut ^wQ洘v#MF^"*<1J5!NfV/rK!)\hi&$&A\ ͕m+Ίj6S<>:⚠qav܄"&xז 1d 8/iaō4S}bTᓲ/}y"NDLѼ"mFHYX#~D.L#q"@&HtJ[K SHf1EN|h18bp8Vw'y!:q'21T)Cj1kQs~$,kp†zd\̏/8"Ac# s:/ ܥe־uXDEA2ERH B#9I&^j5F( !-EH!߹$:O#}'U[ k?80tlx̃հEԫ%nvw2y 5{u¯ۼRu`lt=wFdYwYxY댘%fd;:K2ҒIKp[j=RYYJcO=*88DJ"#bvǼ)QҦ|8d`XW5Z"qR0\ Mٖ(P:1[nptH S)E6LxLA,qMdhW1\Aq%:xˠau]ѱč[cy=BF%k1B y)r/K"e6z2RSqn~2أ W^4r*Ǽ\u;&rB-0JCA RG Ls#^9>o.Z`6|#M%7_t;[Xqߙ˺+YO6ŐޣEhX(2#8txXm'eYByLK/78ĶfAwkD?K>k%-KG۬0Kx;$[?嘓3Ƙ^ZHN0Q2YxEQ`2Zb7(&QĞxJn d(5ї $l0@rjed;t D"/>1I#X 1ϬAh{fV-Xz;^N:ʃ@1&iF[!Qx΋\?D, `i 2>ADUm^!gewgR,/AB"әR(te嚃"([PA$θw<#$ bL.K 2(wQ&bu/mABN78ԜvLdR+k*x[yJRY5s^Up䟝GS$n b5'5=嘔ޓ QFBڪZsR9` nj R2E24m]X .Isb9lEx.^c=5n,dzɭs?ՎD.:mhҔ5[t%VG`K-?ъ"O iMaRXH\OXӝ`o2zS"#+Pw{*WNB6EHQSHBtsR5@䃕&]p",-oԟ/ybK8D ڞ}NLc*-}43E6yXx%W|BI l# @Bn~ps=.4o#E`LY'qb;F~1v`TQVC>]j\ o 6CYǭO3yWޓ]|ίSj1M]XĘ&]8d!  fԲBΧO~ bYkA0h<6܍`nyq ^գMK!꽱._pȨ`uUԃEkVI!XXTT` `a.?ӄ7A%.a3!Jw22<±u;O(Ӓ) ÌAQ܆M?qDq7-hwW @7{$ FkNM5qFɐN0%my97xIekqJG,- LU:QgxLT'Yxp`Gr)+ xeMZX?KJ1yy1U鼋Q7x/$+όK%3?!?b{ 2E8>qxP(AgF t3}ȹ-@3!)P qjlt džE#c2g(7xcZOO=J>`e0L)SДru'G%1]fs9:23^j&!WcX0| &]qŮ)R)T78i]n ( {pQ>ekqJQE&w. k$|fzuo!I;na޿42W2%SGt^~ $oՄ.0.DUdAu6Ql@r&. rYcS+5k9Dy  >ETd(es81{~q. ~2bL5e#Wל /t~0X@4-CpF&4;$PZ%G5 )[QwsS㬌Is<[gYLzqB© ;5b#cL`LqXl\amPxÓ(1:M]p=e'04' `N^0Mq,MEnútn3^8 ^~1_YHԙބkhʪ뛉qCǦS6`B" fha?R2A1ISs,@ʫbrAUbyA+!#D`"X<+_U\3OS!󬍣=0-C&i r2?to $D J4.52HY$~0 )4r|LFmEВJsY$j5&[T|z{Q3 W RkJ#Mrþ(u&rqIϜZ{_Bb"HxrCDx|Ƶ>.D[xp\4-u xAgI($r#8u:+6(s ^D"VDg(ݢ:5q )!ل(yro$K,SXt _jk 6xjW4KfجP# RR2t5e4D -;@rmIe\v _ȝa'j]( 19.KxS]`ֿ_Z[oT:ET_y Ĉ{R4nS!M' ӎKW.)r)TxǙj+dk-b[K}0 spe>|pwЍ+x{Z8y² #Q9Q]sC^g;q#$$B(y4:<<0QϷT:i3n8d׽"ɪ`DبjKZdF=Ix/$:?D-0D P t~ܒQ&kלOpZ7=G^kS)`hzu]q}B c!*ڛBɨIGMD jwS:P҉MJFUnmb13p'{1)kS 3{&}a u#P6Gn5r@?!ߙ%"Dzq`Ę19r8(Zdyq!5qþOP7p S3sVx2ZFWBy%|$GD)*LX;=Va˼S-wy?:|D-dX2B }aACb:`yk02 9(jpuGXPw.0T[Sj<+Evy0p1m,; o'ڦ\ H I!Z_2B2*$;XƄ ۈoH]x#9a-F ^N.yYĭ T;q?~szV^=upHy1,O LR|1r -B hkv+1O3m.׼bm~cb<*zEN,̓Y^Iw#> $ouZQH7 OJRFuQ|6Jz^-GaaF$ !p7` cRqxYnuy$[]Wk[02(5Ek DWw[o 79+;㸃zHUƲ8{ up8c+0wSBP eBY:G05:HqRK߼ad|d "I 'ZT R+æӈ$ū5M#2 Z(|V&ӭeg}Kx=%QK#quF3C/)B3[͎b*g$ rN5Lo/H2OQzCb3n/)a=_Xz H #D&9< alG[fƊyD#[D#46pO_Ftw@ٝ{28XZyŒ3q pT"m:D.t+fI !# Z7'<o&B1 *aSd6'@2ܜz(aVP;Ez00;`3[j'x#M,FܰN NDa%)p9(#Ӿ ,}>dky2=^Oanp#<{Sy"_3 ! Pw!T8Wm<š#2bs@ }1:p`4p?lWT-kx75!'3]$^]VM /!ҥ`]#eޚFSJ4^̜8R#nFO>}|op# Ù4 Gjn߼Ì]\~\'CZ_2L:wB d9=>b-\t8GIJ@[OWܟ(f@ O>\1)A#yT*)L \b!FG a0za]{xp+%0e cSF_|<cf-2R/@ uzYD(j1Yi.' 04`Qf{Ri0f:l_4!ȯ~[;j^78XDj+ ;|d@W pbz3$(RAfݘ{uT&+#UXG4MbUYONɄxCd5J 51@KGav2CMkx[] ۖa@\-QV_j)N5*eZaecѨK!YWYmCw󒚭/6:eBV#P(d@1 IJV²Y߶ Z55ToBVF4$pGR"--kY͕"+"xN- 5Me<yMfWn9JXtF n" W gy=7J`|1;F'Tdl v|fHBST#Bv 9\37|`QCh pUqlXRh۶/;ADWX.c RGx0XntۋX@#*€8k7XrSIOإ )0gi?Czƨ,k"$}x✭~ z`cX($c[JQ&40c.MN%WbrP:<#3g(χ?WbMFYK!.iM]e2AMM-LY!wy L"ՂIaIQJ/. tkŻ(C"?+VE@Qevx2C=<1HEu,[K5U+[{**fܠC=T9CTcx4ĸNŽ &ݵ8ǞHjq`"qN.H33â<~w(-(V1l!'zyɒ)7k`R0 ~XFEJaw<`"4JHb6 C]MVDF.`zퟜzSy VL6N˴= j&g⮍V3Uթ'E9Ndk[q\4KpsWv'߼4RDbU%. kX5/ 5x6C@ ѵ!{/XjHg&7xd%]p`hi?Xqوx8-&x&Jk Ee 7%Qi1'eQ-s[q_A[C3F0Ry4jd;1Zy8ґ|1, ]+%dAFl DόOÈA5>>9ͿW_p qI󌉩`8k Ub{.9yi%G~1%Ν$&nȓ,X@:f ˜7~iew˚z,d (>=q`1f8+x108}`ɡd{y [,X,8y+A  t:EHt)jp(VtBWs")GPk/H@$|Ee,Lb]x%9GS+48kY( -G% 'XhGdtJe&a/;y՝ b&rX][+8 916Gy6u!EwϜߌs^H1.7$&}f!Ƀs5ư0yf [+SEm$vlG%qd? 'Uw4b p#UlM8T.o*1oŸqœ^]+m\9]@TRSC=sQ(Zg#YG|KV Gj2at,o'IQߚ0I =ǜ%ʓ" YCSIm{cz_ ^I^j0E%D܄NXA¤„`Bђ%2gޤ㷜m 8b*Hƾh lQd&,SSPIZ'&0i{KK`JsN1[HY3UOud]-O)T 1[F/R9܅it`;h_r`o9 GS0JS?s [?UmЉd1sL4Zs" h`Md#K=lƛ%rc"K$J )Nư=Q9'E/x{A4=M"<88-p>rTj^HD!Osۼ gሪȧF0{jgs"Yz⼧Nd(^JDT-˥1>,xJ2BM$>D0~UǬR+qY-yI]N'÷SVv]>gfEƴ=ɝ|E_&vb'k @4[%^ctlPb09T]1Vb{-FbL"pI0 udKky!03Z,{+Ycz+np&'ߠ#9!8e<>He$5!Fq=ġˉq /E r+!-}òa:#c*9AF"u @*6ٲ@GND1Q)!pGI|ce h9m(7i! vFE.8، 94qY+$6X 닖XbX=َ(d|s0! bY(xt`>qf$0tkȐ{BRo,y]@?,QFMp {D{Y/|`P9diڤm` _Ant 1c&GD41yM:"ycӈdh)RdD^gNX?x@^dO ɯ/t:64A-v;M""V [q2y'2H{N@Շpb<{ϜdHDy/D'TI r!TF;~4&1,`|hLBxW<ѥ D#\'97Jklx 69Den u:_*~G TX1kbCrԄ+=-UD!˱LGr6 9Q0i=#wFEOy´ȟu€)81Lylpaîc 076<|ay"*S/ [Q=H-5>rfww]ynYf<7Ƃ(%~Yd&)zȄ(9vVB4G7j\Td&N# pakyF<2Q`=1XƴtnUFr`_c4qqT +0 hH HbK@pn*<x&/1'(Ӫ@'ujhU`mUDNS$E/a{0F4oh/t U.1]ckd;LMɴ_>~0Ȕt]w1^3Rjq @ہ5O2MH/ө'іKup6ל]U&B- 8):-dqՕ+#wp]`ѯ@\*σ!P;.ûIR)qƂXF8GOT!~~p, GټV'VP"0QbI/N.Ս{ؘvEF^j #;G &S>2[B8t;DBwh& ExyIN|<piYW%~.1 j2j(MϏ8J*n'H̓k Q<, m0@t9C)l @MX%'(yYwB(<:TFr_,ݬkל*Yoxnw)*}O[$'?q٧_Ihtl4#`O+RBg PNkQ𹻱LJ][űCwwl-(]2K?82hZ|F' U#,uE0792f-`4Dn4&( i2g9Z%!IO>c& I|Mz)mo9bbÌ=h:!&_p/(o)Q;cJJ\I{,069kL(@R=wrFۃ*B`5|cM 94Ets {l"v;M=Vbz5U̪'#{q0K~8`%>2N-MI YM4S5)|9 3Q֓<: $Oq]dڔjN q `(F4#V@~P}`_Rq#y’N0JPLL.3cW "*a)֋yo"6jwaqF b7pshCŕlNlPf ]S?@=;ų&u(&t6k+ _H"##=vJ0!i[XȂN9c.lwoABX/F&"jy Ify %5yV1U8GpjV \8#0;w78/Mh^^'wʲM!>”"IIL>?ܝS^) R܈( 1f g_xZ?<0 Lސ t#ҳBߙ,`hY0 9efN^)V G1T.Aq[(FL 1p,%$@K#cB OX|A7+h*NqSh_G1X&7, 6F6 `5LTD[Q.q)> "6I8qmFЂ% [V]#e /RdqK48BLlxpzb%1 `{I LX50q1EGጟ8p6}bΈ^8x+ro68k rsC3wDd$ ?U9m[""*AHV4`hR #f5:AwSup{O02²$$bIe^{)-%2ra|/y3jquw@ɻUS3UO%+7uz﭂ۚhxvd+}u-W9VyHV96]}FJ+mekXQ^$S90xک+xf\ MUn5a }[qHtJOg?:ND˅A{&! "<`3Jt/9a%^^*Ѣ0B,>P'9I9t]H>g/ H.bJ18PIFO䗠V7pY K~S2~\L0y_5&_K-{O'kv@$2L$ɨL~rahOG %Qc5ۛruVqMRN""ip!A,)šc cfW|і0+87(! /!3F--cEӎ 1SE8ee}w1 OTA,5^qÔa5dM9B K6>FO&ל#+x(^LjAdU ng&jL&3jd'^e&Oi#s3k70#'&+ 5cRo-kz$|9nTmr&@Mim2ZwϹ~3!cr@"da.1 ad%8HQ#!8`w)-0Fօld#43#s?{pnML|upA>>1#xxL%wVo9 h91NX}Aå䬓yϢYQ{#(cd%˯i*B\&a4(OfFL" xXau`u`QwQ?98J]bNf* ^/2Q\b"XC,:1Vk9q:>'eM(jqإS'qX%aQ5kA7XrAZd$HC@,P󼭻P5p M_.:"Z2WM׌l7Act9%Jf5F%ʲNt?P5$\"9MklABn˶>K1A7TO6xq7w%hyvwZ8sC>m4UHK<Ţ^!ƻf)f5 iK/mΉ2j1hg$pԦ`46%{4t!]0G`^nFǞ3Gy.>1*U֒*GA;.Q0'Y!FŐOX#Q'HJwn@ h1sd-h D՟OXLAKduDk6>R~ ݈2yuBM8_UerʨG>̜v@F5,+BjEQ)FkAF:›}RFQ% SL&ͩ!y3e>@^p Ζ1|v"/L!r8xK\ LfU$ ٭O"Q*cԡV/ `(!529XhgӤvf.qc'1rXƴl暖) 8hRߘzfه={xIöݏQ1% {Eqh>K>!5 a38ȷW3hがjm.̼GwGWؚˮ*C; `fAE ޱYG}&@2< !$ÒF/{ote@@þ6 d-:#>HA &# C&t|p右*H2_!.F 29N̛͍2'ֱTbHD 1014QM\j0S&D(Y L )p'y/}5fR/IBjTJv ga . QcfxɇFW$?5 F+/ߖ*Jm7[⭩̲w8k[-Rm8FCf 2 :eO. VتR3s  E{XޜK6A_2e!$bZXvc`ފ5KŌ%8y5<;3 ړ $'At)@{j|8'1xԤbr?x<xoڑ&a "x}=(w>27 a(p#yl(0N0eե.P8@Y$~$ϩ<JƉEk !)H dJ˻0) ;qy0%'Ϝ@ 52 8MR̳4:z `2sܢD!2!EX9q(Ԁa35La[ y&JSL o܊~(R>Xk %m` p N+%M'wFv!0'ɽP+L*ezSRg1r5#ҸPWbmtp9h,e׼tLՈgX RLVcW@EfRK)yw'V"̦faHwTu[rpwl4ngsP@.@?mݷ`2 \%N-hNpptȫM \$UyJ >77#5}9$ x]'*7*镖ILxC}yʣ4)ß"ns^UJslvfP8kxDJj=g;r2auK`@fejjs`1"X)E8ġ8 hH(±5P LrD\{wndv`\;$)3izBb,) Y1.N,-aUD-Í)DkQfbfcY>h Y$ȣRnLb@{3v暝 ϜID .^8ue"CdD{8*_K6MaACE_dTQ(14M"K<2w^a ըK 0 edrv$d>z?>œFgDa'&g6jQpĵ(̃9_ҮG7Uo! 7~Uk(c~NN걸$;J![DIjF+4Ƿ7%֐+ɽ3r7`!` ;bj|`pl?6ɊIg0y>~cX@P)o]@QOkyru*C +0K[;8_5S) /i5f*٪F ͸1Q(A?QJoMcIfh\L(zAPO5Jh9gI&8îhai\9$ Hv.VrHDAsz jMǜW+4s71́4x ʢhU12' }?w_ed}5[MHwo?R77I{i1C8͟)2I5x$n# E"5kGAFjPOѺoX'oqT 7;IK*u,A\ِ73XᐒYg1&p+vI2X`yY2!ZoZ_.3>9}JX8!=2($F lِ^#Ҍ.A*>S& φ@o*,w\b`.0t̄ՕGk'X[imb(eY0" 2|bNnʏoi!36sl|䅺 Hdn}8aD"!l^E@$Jebd{#LfӄSM&ǒ@{""1xz*sch&" gMbwλD#j|dA-˖9Ƌ͒WG`0Qx$:ʱQuGM46QNkQr`hT;u>XzzqB8{aኌN@ !xUfH63r%O `!auĘXuwZfUf1#dI$ *FTV bER!jM5{FV"p{T#IDy<eH 7m "rWIQMnS!NwXfl-`#S8pA q/A2tCknM&HZJNF`sP&rL.p(L/f-(4όVfxͣ8g(%rx0J`*%UXFgb҂(lwfG~W&穣\UwHDlz# Nq5f%S .vj# bQ~MB-GK(IM>~&17U:q,dS60igNlƱmpK^4\#,ԷY8Goze%O 0&6"g8 Y3m"el7LaBJ޳*Zb'[ȶ- ywMy5&0 +U^bk6I"gT.^tZ1' vy[$g9 {Ba:Kg_茑BeyɄL< PE1a=Fu`>ud)!a#.&;A=3PTxMZ}W ܹήk"&nj`qO YEd -"J"!ɒ '"IN#Zh/R`F㏜jO_g9lu=\nHj1a GubOD ڟxzAɎ8Qg<̘.L11c[ ;9hF4$Fe.[ N:DZmA'pؙԄ&l!d]T\cJ3sv*-wx"hȦ(ʐ>:kHSʭ ~#Yɮ^ ebw:&@{ pR ?pmM^#ɞLb`AqhįuxE?1unw[b !u4$]-$p w^g9ɉb(C\hdaDy_V㜞UYP#'b;8?2@*z@d*0o-3.AvJ1HJלAndF .O$eV6'K: e6 7NІ1$E+]wZBY[,횏!*(T}HO?bV N163e(hrMJVpC ѿ*c'{3W-&h 8' A"gOw-rfw=Rތ}b.^ Vi_@w>gtd~&ccjSt,-@!I$Ɏxz?t`>in<G_i|K cQPhx U='*Ē TG ?#o4SQZƞn7dv@RIzM #%B#ABƟ&ЌU!?xd8O/ m1YqEK(#;5๮Nr7Bw\!Si(C-ޓJrWj\ ;IJ#!/`XB4st4t!X&AT)f5sXxd,{0u|??ȊہU:"L|c0i<2ܺ#grFmjP iS&a_?;cY ( 4=2>Dg <Yf@b5?ƒu=I*Js)#$tIwgD?8gֺgiX"ZДk~@yJA/Mu9F݅q~1OP i{ΛM^@I$ӗ YxuH(D%`^C!? 1vpqg 7,{Zx˿0U (;  a;(" d-BL {ԙi'@.fW|񓥹1@^t @DJjx⛦R4$ikႚqdO.H`HgN1'%UG$[4|xÛ)1~oI˕JaW_P'q伳_xaǼΌ16 Vw#DG-o 3+ i8vaP9O5α%vy N$JRɛRTQLpcIgɋڥChۂ8^apU:Çl?PmOh0ujPS 6yem. nidE rssF Lt&㌢N XH@J8>Q-f!-.Sq,?ĵ&u8u~m$|yQ%uy$Jug*2#ɿ"xi9@Jc2YEkOlFq*gsr59+pd>!2M dx Dw CcH*X^T$^弚|Hp+G$_v-Zz]:S;L[v5tcx-y(0ǨWaj0s?8#!gV+ tcXY#gRԃv 1in&@8W 8zٛ8.1K-%Ƀں +^)@>ZJk"ɧXairU"5xcx%a Ӝ`IDCF5%YY0&dx(M|`$/\Oy$%uβI-y1SH yJ D'(Il?Q]^;)+^%66v/!}rJlDx0:$pѕ?mARXF! cw)[*7Ʊ(3\ %fN (u%k9wW9LGy3!88cͣxd eaJ?d8AMy/xhP(H8;-4¥;ͬ+bxqH9_4^Rk9hwYmnEyl~Q.WJl]@1(R]#$$; 91mLD >gRT+18 e,\mc&3D ?-$SQ5joA:Pu,::NAy7"9q~ 2yy$D6 ۍ`ŕNd…@f-l{s ); IPEx7OnCt)WX[ѧR=?cQP 1XԇJpӳ65S.@Ӓ~6m*st h.OqٰkόӐ`!J޷cmX T$E阻bh8j k1WE BUv, E A2bdgC -qx0¥?dтkMᰔq,/-NI|o'79Bd_yt^'Ze315r*NLe(H[Ȧ ]ry )#'y1m/Ϻur$]~p@A UEK$V],DҞQ1gA"k&fЧ> ZR>5"QO ԅY(ш˒K"7:7TȰ5nwD!6UFࡑ?Ӗtl)\b q\ƛ)(3ϒ-h HֿͮLgiODipT (xt0DFTC =.!8pz? r|v@h| wpqys()\~߬4g”JiA%:Era[r4b8Gvק[ˌtpSo|7~Hyc5fڋٴcpvk cEdDʛ+&:[&9) 1 a1`Ζ,K]B2$WTxĒ r X"-UQ7gL p!%K(v|ہH \,oNtȇ(tާz/ydc)Q&#j9qa6vfrNB>ԠAȎc+h}/!pqi0d-K$ˀF 1KC /N1 r+W184)#-A0>'=N#, 9KqW`?5V1OۙxR#p؉$X#o]Ʀ[ Gpb4RbeW$X1Hdq$o5ʝrP4lI7%g3z*=z V4$jc)Ra׷8@/x'Mb֢3'UEeCE 8 wXdIJs/ȿX&<59 Eusq!odׯ$WF̉~79QTzb/"ޥez2(RDq$`p5˴)raŴsȶ Z@5[kHL@Z DLjj6E*x$Z'`ƮB5NBy *o#yNMwʶȾտU3I3y^tLfF!-+8+05q,V1|jZ?fn6$ᗥV.)]b7S[W* ڲb*J&|-R[|:$^?d%}aJ┬"sHBV0M3G?X!LuXp8-[YbE" $IDsk |n#Ű$6lx:Q0V'1 eůX;3!n$' |)5h1(rv61%|Gea.Cq*OpSPotH94(Q2b%,7iraQ)2zonbA~g39K]@V\k@&3Mpo0NsyU )O9+d8.#ll=f%&NJry@I9 b#5yG>|d1)W%y c$me6Vxb#i|GJbvx-yO/`U> Q4N L,u (6%EkՃJ4+A`\vJU2)͉V*yPuCUnG H/X0 ~䬃>fkŮZx"ANoVkj4X0xs+LP&_x4DP #9%!=b;'Sm,PF2IJ۰t##l*1J1*x JQ(&mI7dZ.ʾd W`KN˲ZG0["G0k$\HBnjO :< BT`=8m`hٻT3%0jENch)0^BGbеs>y_Ҡk'k8ן8FP_$My `fe-}XwnS<ӗֲZv8c. ~E-`*p=y1ZHB]JF'1͕^>k$pd?уqxFSt.]q)wkp  הaW8Q3du,&0 yNڿ3ҟH+(Gd'Q $pg :JX e[ip Sb?>q R?d"roŖ*@-|HeɆ,GrƀPvvBzkL D[ˤ;ea7h/4O2#:?HvA(;o ~ y%ޒ2@|.P. ._PFSL- NDدTN#+ ebQ8t.t \"MA=k9y7$ l#²^$i^Dgj`V4"B`T*Jyh+r`ov(D ]iz! &et&PO8 Wsy:³|1(2G(]+n`|/i};VRv8ZΈ#'g{)١Ip%%j)/wсR=0ȞNVPd H˯$7pu1#1$V$;Jd焙`ʼUA/DQ3G3/@c- GC=hUOhpPP_b3KL\hxI,ٓ\*j70-}`YbSl,ZJ pЉ끚6MkHR?8-Y*a#uy;p;5jL!Ib8!d kM+}u>3i?B'h3`Sd`7& YXre *Jϔh9efdV@>eD kző! &`(6BMF/W*̇e0D* |!/KLn*0J"V4isj?#;1o 10A󂅜' čP Ae?Jz˘TmLh,TتQȋ'rXh+euYӭbS dౙEB9%*MD n'*&05)8|BϔdZU=S2([!5`.sёM 3yyV$y@we[wX~i\j͉1E(g2Ũd󛛇@^blXDĨQڎ5Y!}ד86 H {x_}e&8Rί7Aov@2cP¥i(xo90 BB\G:gy@F1 % $5ۂ2~Xzo&]*7+ :P) YG~I" b&=+\Q33t Q%2<jO*#q5ƍnXK`)%|`jTެ" H#/&*bY̘'TM[NQa|E 2>/Vj)-`.Z^3eX.QF&D@ 528Ayo?CxU}<+d A&^BC|B C,kCùE"@ #n@D`Jh'jc5os(NJkAGyD)y9@f1M*22FNAy ( jIP?$`zn"dxxQE= 2urXp*jb!;g3(A)ZqH\W9r#]CM&z˨-d|^[C1n{Iޑf"z?hlN1ZIS#=`2,aS3Q|$0yuׅ_#L4cGDUiet;ɱLI""$mw!#9z4@0:oWp\D]_XiqA]V^x9@PV^o'9#S`OO&X$9 ?l'R*Yb2@n1 aH&X"Z_$.ZU8j4ke¨5/!) zn"A6A7.Ksno|؉gXvIMy/]b&Ȝp& %~KȲNqG`S= I럌G: |OɇTv ֱuO96xTx ء|G<6__XLOf4 ksƔ?` $C8Ȅ 齙;$,^rD"~_Y% "\ -D8Hb &!XOyHj`CY>)3Ue8mAA++"W|eb5&$N`c G+6-sGKYh;y:zy  B#m_HM'(BDp"`07x"4h`dx8ŜƐljxm*.od~uvqu1 I:[ Z m[Zw \GːAz_X'< X$]WRb3.""s|d>Z!~E:}r`DGu!T;!a[3ag2Q{a3i"q0ƒc%蜬ǻF 8(QDGx 82P6'&+Dsp!jo$n* 0߾@ߓ DSY)1,8:x s6}MQ.(犼!$Htxi>W֓95;Bgz!>q9Hw*090Rt οאiṕ?^-Gx,o XqG;r BwzFy"n9Ą<^& $T|b@mtPMBް6ȇn^I&oI#_asn\ib \gDf\ܩX3(, 8@^'&SiwQs˽iXad;Y8Jc0tG y~8[F̩? jJeIp6~( D -wXiSr=\_mdBdF#BfWD**AP2ݨC=h'Ap  1d5nj- VVET0){"q TdD5nG$N4x{䟃Y'l\L0渻n0z,B R-y&&  qj@-\ț7RLBf+/*b֫9~}2 =y_ME\n ^79!a?L?ӋڎzŝEa]´n 4MWd[aFUWV}a`4~ e"̞So3N^2AӼ׋(NRLC^2A2$1jG^W܄$]a.Us4'U~LJ3F@ww>4lw]17q  F?K *&2{~T{8 T,r- V*G弮@J1˄MInj0 "c[=>p$6q_zU',V 2*cӈɱ&ư$By]JY n tC;C|0sCۉc|PrElV+D' 8Kɬ4DZ|cўyȻe)+5պchqN`tH8X$]nW;#9'4(w׬,e^Vz$E6hOxɛOhrG|!:ĕpJV BjL$$9陥1V0-䛏)΁^2$g#b8-Je$vkʿH.8&k"Y@dLJ:JL%X1C5 LUVb6%bu8Fu߀#$=ә|cHً%n}%.&p`B&NO|T9>X|:>"Qnm0t($ 6׍!$=ۍC51oUya;I.%  丘k"+f]cl | t{>Ws R9VN m޳a(3kH(^!,IjynS'#*& I=byډ44 CM!5>0T,9 9`;Y",Rv *7S;JJRjK艇K &4Θ0b 1^ZӬUE#,W1'Z,n+[D^OU2Q 5";Ba}#-/񂦀?Ƴj*Vq<[P;wE 0d~q1&!I)Rf#E=.;%:G^x>n)!n:,o'mBYdIV .U}"dQu7X)ĒG3 1wCKy2Ec`Ӂ'hu6xp> CfRM 0?9'9 3=3 |aQNudX1ep#-P'zxF MH!#&Dby`5#`/Nt4Xm?Eb',Q 3Zυ"¿X4s∐rjbZI;;I'sZlM*Aa[>@j70 '40.Q"x&P!jGC59Ҳ\5qdeӬ\ Dܸa*͡KuɎċ'Q$7NAHbo갢: ! i0ըB.9;QtM0 !|`/$( $AmzQe*,[j+(V`3!%O$=6 :R xwC_Li•5JU*P9>8@!Jws9Ŀ/=#tx`x¼p@3 NG w1blѻka~a$7XpCGp^u4E|a2Y[x5ȡF J^x6WdYeFBъ&1\'A'+)&d 3"#B"\7kC*plomV6o `.52wb^#+NLJ vJ$FE϶+ ϧ9ߘ(X&'bUY ߜ$npc0| H#RĨ9/0"偲t%KE^ES$@9/ B6^5vu޹v)ucv A^(tcyLDKp}x'V|J¢1K.JJDH%uI}_ruk^uEp6A o%iYĩBRmY(dP;s%20Ҙyx0{6-(}Y:FO QE3;-#6-kxNg"WqG?J,zrk Vo/VAI}b(kPӾ jZ-Qg%[L^; y a lg BŔ,6#m!A0?PMቡ%Vq$园VALxӈCvsM̿ hNp!bb.r%)rsXs#.SJ{FA'isy _Z4I?o |SZ; k-W8=̓02Y'H!N?Y#Z$%0#NtEd~sIxZH튤!(&+.hq[ݾ+;lQY~YcsfnezX%$٫U` $'N'IVM"ȳ,ef%}`i>|k#hz u~;*%Et]¾!>gX>8!ht&HR^qdI)5<9A >Y&ݷ-8;b("w'sHv#~>ߚ"$9LVO@I~'IChHwpjiK$%&1ȕ1ߗlj%,tΒu#"oħ% ׬j6twIQ >0>|{Y5rVV@?1 `#=.`cg M+xxxL~qPn6oT3p0և%.v Ó,Vɋndi>4,-YA>pKk.i{T7^9 U*1zIjYyBy+ -As/Xe?&Xt-}dX+o$lϮ_8NG1yq$o鈇]f<(aBO1 % -P9)p ){|ƒͧY3IiChvx(B(p$cn)DjJ~[s^jf<4K~r _gı,*ʽE-{Z dQePMzɸ8o* r*'4 E+t,UC@ڛI)A'VH!UNBܿ 嵰6Ĵ93XhH9e/ ij|Pj6πdc5œpx0Vwo 󃫔 g} JX'-|`>0{EHr/gU޲h3__DȾ !nę( 7)J{r1T(ߜ<`͖i6tt( ٭dYtz2&?f"R,A*!$)/'@{0~GtnZ*&ȡy9RhsqGðC{3Gb$faH xTfoJCę2y_gl1)>rBաx~g ٗ詃Z񑇦z6tKƧb%B)A¸BWgv2'qXY 3~Ba|FF F|'ћZ0$I]`$*t9`0OM(Fc)b<6FSL` U53RKLhQkA* 4KUi.LPr>KbxT3X[2BL%31;N}U"sPLr"W=b6TTڂK"''Rckɛ <Lzq^"M^(.pPehLG2y"FzF~Kgfv@d1*@.CEB4%W+)̕s#A񸴼O) 0μA-Dl8;=wH.1r|>.iW ~4$UFGRqg1Izc%/GDE^j EcSu%@%6ѫx\P]lxkNϖ֫ <_leq,(x;͗(_[#gd㙪~ LJ~MNs`CWtx#?3p^7oxw8G,gx:?HrzLQ(zh›&42i[p9{vS|pȄC(X'kduEڦg`TM$Hm=jA%°o=;KKru9'^S^a`* Ud{k0|WՆ S2GA*vїU1cJdl9GOIZygRVQc&#<@tO&qܼOWzn@#W\fǸ!*=dre[j!CkaM@; )q d"DX0ao Gc̵l+$P|`_P4p$'*SU_j?o95kX\#B8`jnR>ځfz! x*b[IrfC:%yj eUzzq"c8ynn*/c.Q ڤ93-3j=euI; D,G-Hi 3O|8{Q_nJBEo `:<B:FrS/ Myʹ93ƫ L8&~:\`~5(a'QΏ)M$n.rV&ƴLۍ%ϙpK3B xǼ7dk. rteԬ-APvq {B(F" 7"1Y|ip\ɅX Qxbud;BHy2g lWRozd3j#UNEc tC߾rS3h:+7HSǬtmo^1Կ7!5/$K?gDOZcl0S*-Yk$ k;\Tb[q1Bb6&i)wL(Yɡޞ)8?aX(gbto\ M>Dd?܉({B}XւdGL$lMFEy10' řQyΫ8EuNDBM>pL֋|^j&Xpcmk @NrG/IT>'ItI;St2ԧ hEUtoTT8r\m"¿E #OI ϧ2j<$1{N^9|g\h%+-`'M^'Xos

o*-^t@UVq46yU*8<$#EL9NR )/5gOdS탲&'ǔ $SV,W&t6'`}5U&LoaoPӧ#"FɌu wX1לSk0*% FZbבqI#&a|`ў,+ @(6aa`2<0.@=F'.%N;3E3 R!y6̞q`@Oy ikj7zy# }a"zvUʂ`pBSB" ~!2BەYK'8nAΓPXbS1z4Y'DXK-召AػH5I@_,IL!`ْFT}btpԛ~eobѪ*U|J)YzƭL@$ *(ܜVÆ2)IMW\/pnP]xp!Y󐹒$=]pKXx 0CL(^LQPM&z8$lbxəW1*kI4Ar5Nrk<}cFҗ'8ӓO8x2#*4( r$/BDxE2Z&Մ:XU1~}֬ ʼWLcGW`diP6Dc"w3gTRȒ>q*Mjc(!uG I䖯&ڐ5Sx8$LH;\#|eBΰ.xˎZ9 gD.12<8KE0jna*@#qL՜M=a%ӊ>1d2'+7c,.?0uVDLpL-XXYA]cŸx`СrGSɘh7 -1pDOI_B#c4RZ< \)6dbK>0kdu2'&Iv8`s@I7n#'p9>dJ#kʠڤnAn" T̳\;*SMA&1qֲH!5AȬDKy#@dc͇O4n\a0xCAn! X8͕M  /aυ# Ykx͇?n9( O$2Xmh=e[ǂ%f|bKf``ɯ!3y yA K`de$@Re-s5ɚ ( IQ[%1ko! %x (.T.()k9 u眘HS-uH?橬G21v*[0Sd:֦ F5U1 ql< ;ƴ+ js󃌭V;a"tgK X*͘}!߼{?0M(YRz?d&$%|`3 Tz06?\DN]cu"Rxx jTݵ,a<,4"䤁 FD@_X e$ ?|Z0aSOaX=B̄I;`< ' bCDGdj*"iUjHqX&DE$ T2/dS;2lcd= Ivpra.EM0G78.5=NC!-WR 'ᐸ2>H$r$S):Bna{FnquHVa eU i.5ZaFkK3؂C1CNapn51$M84v~808_^ ˴'ޅ]8XSZ2uZà*wnY !^ +K"i:A͗d=z,a*fh%*ڼe 1ݽbImYϷt=hD#L6*cXvG!B\Fs#$5/88[C؃XвNV89+(]!4"FxxJ ]3$ϐUQWSǬG9 ISK BoZhy񆤬+wbњaYf%ɠCyijrV^⇨nrn~g)=qء!H$׋Ɉ ּk&tYR´X ȂKf@"\Bjd $E_W KyP1-1*ff~# 467@%z)J aU~pͅo8,TuLf3]NMKW4Jn8)..Yo88Ǭ.G[0bHga|_qP|J2lk%7:we <',B%3`HKt&"G!2t i`_}$م*$&_hcT'uS TtDE]LŘ )]aG Z DDN=b'؅yG~dK!(}w)˔QoW{x":M1L3>mdB*4kڵU%dza 25H9A#Y`4d j #t<8,A˻j DT,BX L=nWAS2 ~N$!-LX ^@\IQJL2@=`>d0ǃ,F@daZrZez,!)S!ѯW~0]" J lic=ᚭ~|a|ձ,{rj"6 &!~O16O꒔qXJB@AT^}>}doY2)Ay١4E2;k"A4#nʹ:}H+ͼa*n\mMLKS>r-l u/2\Fpnj`EQyȼBqH%.O-86DHml;ș%q~-clEKa4yq2"Wd[b~2,N"B"`Nh(큽pRjhApV#82CɉY%~Hkä?`Y)a0c9G~|]8@aCK% JrWx8\MΚ0jr Hw&[. 7%0dl$1QH TS凚p"~dX)"to~'P(j)QH:A*k7\SdL07沣%A"0NL@'x+/ܝ8RሽdQw<^!kydm45Xށ[*pU&hʒzTTj/ZBS"sv5v=# ormϟ]gzb9}U Pȶ%~Q \{~cpXڅY ΞpIV$jO:@$ ʺ65jrl\cM`dTES8b:RUQ1˨Y "kqͥȥ M# oY Gפ 0/,A$a$Q:̱C+wIy9O5P#Ț`/yO pib&5'L0MJ,c«, )#4'/rP58ŝ$K&rXebDw 05& XL1"G3DUSfytʘ.YG̱`F:nrhM3#8ޝ+3)Y[E4ED>M/O9Z|$M|EIyōL>g@K/,_~rLK(]V9 3 P T$G8dz)Z .2!Kʹm\S!Y, rfhll~< W|juy)N?S ji,sqԷ>r1m1 BKguDNB )lWF#ZfC?vzg޸fLJ_kgPZq!F7&LsYr5 0b58Q pc>38W8e[o/x!!פEg$ ;" Ik 6O>pvL'! xHQG vN #"%qk&n;| ~%Ą@6%H*K(b0bh1$*O 8:>ohԊ#͆_9Q c($7oXWU>8]b< #nDQ<6g[#&mX-A VHVS4dlCY&  1;yĢ%RԋH_I7%1 ТLRcՃ 9<oEIpeTNrL-"g'Zk SWeӆ\&ُee6x!07d-!su"Bn#i`I)G1 PT};~^Grf7q"`Y)DAvc <9{rLD,Cj,T~H+V$&{+k|OhaA\U2jΙ-}jAcz9|X>!t8bqXiN>sfԡ%`g I"K8()QYUD^Kg7x042k*ͨZPIJ,PNƣ$֊Ojs;0]!wXs{J@d˧DRJda] E "nKFO BH6'8ܵ]N;Q~Fl/ NPE,7:y(2WoJVqS"+EV_h8HldzdQH ZӳddN7b*{]X2h,gфQG7Df̼F,,&~&^rT4 Q$ΰUa:Xw?r 8s:DD?!2*]?9)EkRFɗ`Ir>qQ3)x1A'8rm0d!321 ;ьm̠IBv^ fʔ~|SBiʴsL89`A .SPM' vȲQv'MAP!)RD2׌%|KV+[yrCwO^ yԛ>b^#n$zH847*S,lIYnjKXWm?;¯E?x ȐpV! wɌH0E>0%.|xsN:T$iL uZ0DBYm֚Xdn="kHC:Hn` @lW5$jP)d ƪLgz';nY'3tX Or ȾrX8`DmF):^Sf7ܴ#oٝ1)- u@yhy1ZFJ 3SzF;k$ #0Jʱޱ8( f[|j52,2/9p&>? :vj-r,GSH{hY/XWmlsRTƏi ouް ޣd ÷s~O9ƥŚ[(Yhћ:rΤs#5.wIA_8(İȬN\E>ؐɜ,]%l`UJ3N7bJuGXH_ JƬ f# ""DinbpE6[g1?7〪L%<:%\3kH d2&R ,vLA'$FˆF:p"=Vjׯ8r e?Wbٞz92r E'6lw?PNMل 7dvz.u:v6{̕R}b@&a䍾1.ewȈ"BK"$CRp *tkT7aHP:ƛ{~!C^.Lk:u&jTH"pnu*1uprye&7Ts3̄s\dXCceMhڔ!GKXi`&||7A%YL\cd 58X)/]A4Q@W$e@HFx wʣ2Bp!0T!:y 7!JC!E0s}eWG؉g'%lSM' }a."6JVNcCxS "'njy/ c=,Ε;e*EݰBM %>p}dPC1FS,k ȓV7Qj'ُMM y>k$U ɷ1 t:y$dgkl4a䲺$y TX3 xȪ>\d<)YTLHދ#!OlȎN0xs98="Vr˕]T𛃒ߌtPjL #=զǜ(a?C93{Id)(=c̎P@bH+^93-F>xG" p.3q޲f#7#͡w5#%,!>?wHqdk/Xzɉ!T&p% P'2B ΍eBsϣSPD΍7xٿ @xWn&ŲCU{JY:Ejy;p8fj;^&$y#D/$۶oE_Xǝq–I>lB+s2S^9E%8nE `Edn(ʳmĤa@ }Fi#dW\.A/n aN _ou*9Yg@H&xBxlҖ6@`q kAV}ax }&rX H)ub,h 'NJ 3)?ȫ >MbZ/&,A֡£$U5rdփs#2`Oxr,tP fGpfH3u&#ƱB WvJmCX٩"8vEs0L`>be ^u45C8?l}3}q{xL1b3RW]q$ѦCb~csR Tef /'J'L6؏RΌvׁ<8LAY'a(M|6-J(^ecAr}O BPhW:\/41$DMP&b[Ʉ08L,;SE*=aBx.C]^l4fܐ832 Xڴ 6$I@߸cȑX߾=86=d AQ;38Ѩ)2_.KĂfFg'l"NsIPvV! O"mq 1#ұ![S=2&w><+ ;L[ͳTA1 ' gi}x̀_r7Ձ>p}KIz*fk&'uu_AC(p"_"@KsBA ̇k-XܴcC̴ŭgIgSCB  ;E213׬CQX^*] kr>r9E>X@A إH!|ON,OͧVQwXwiX|ˢS%wݖӼm5whP Eh hԺ'Kؚ< C')1uF,jRnxCK>rF0X82ZP[IN4OqF7R%" {cX,_bUe&m}&֊ON}/(cL:+lϼko$6MxIA@n{f8Qx."8 %X D _:ȱU$$n0qmʦ4%Z0؁O8 KLT34jMV:ǕDW;rЛ""*oF$bp?ŲS1?Q% IO8)"uJSYd pĿ 9Ɯ9L@xf* a/:uA2 X&YA %]3YHkxNTT&9h r. !kHs3 gS8).{-7^2/14g,gn_C#p$OC0&s3Gkt{KRv*H\NAp$[;W KQ3 ,7|kcjOrdm|#fɫdNMO #*'x-B`$A)| f";;(`ᒂcqa_Y4.IT{R0|" K/ K si$Gs,p#-73sdʡ{B&b=\#!D8tD^ͮ#A\F5E.ϼ._/[KH" i"F/r!E?xVk>2$b)ōDN2vE-;tbc`;*CR]p/^qfW$yL1h|y _ԥ^50!%S*P([1T\%O1vxlpGjlo lP. MOI6Ucu6%6p H2XOf8C 2{>bq"^TqIƃbM<Ѝv9,r%q 9M jgKdϜDq^iwp_c}ZY[,b訍 (XK=ڝVF i ͯKZzް@L3?X mC휿zsMqe,eˁHf"X#K0NE’a0Vsy* $_<*ieT~EDVG 0Psel0rt?#3%neV Oy@:㴙Hu]F-Ȃ?9͉K4Q#Ø2<ZJyRó:<7f[N9), t'ؔWŸ3ن -wc XV#]d3 "fy?XKkYwڰIDT\u*#_epl~r?,ic|u׶FFatVJ%Tzcy2O)/<B*~Gsg Dž CK瞣e!@ILGt:HF3[(]OLɄoD"y\ ':G/(T ۳;_8lc3n 9) aOH8͉RFz=a B|.#Xb)VOll" e#veHb2)- bH;|H_Uqw5xj3sdH筠9 MS;:Zӓy0+t(U13eQ[ <kYʉ8ߜk& juf<7’V\| $kagтIk$>JFTHڞ1)U[uZ&.I!tCg{^.M_4;W z<OenK(/sN?]cHN^9uPV?y ֱPx&F9H c]?{KF$W>%}#$f%[cw6eKxzl<.}eͮ [^iB&{F{ UCی zeM}p.p_ z)FJlɀd87N\td#rŋ$@e> Ġi&S7z#-rrq+(5 egN#myKJFǝdKjbPe[fW(aY0I&F=LRq6j6Fa+ePĹjU֙dDa=%8ks D_ډd'rQHMaU,.k0|x8a" ihqG*T%e~eW9^g$2:Q (^0rBOws'iCHXiV}jRIIcqe]1RPW 8L~q>JNoM|XLf bu xq퐄@-TBu[YO8D׉L`YOLrIJPƯ  * 878 6^1TM!a;<҉Aיud]r E0$VqXy 4PI CDCY`H.9F!ɏa)٩iFU138DQ$\a sng%h[MɂW* QI<NUbvg_nGɊ3 ˏE b[figEKcWK5#66>OĹY(qx~\:^N+$T+a:.g R&p  y),I*->f@_g׮0 񲧵;2os 2coZFj:C1vO[DB"]7pM)yqB>d *7יܹ=qr}p;+i .q**YVnxGe؍U0(k9py~T5R-D@ Sb9 6^e}CQ)8CwjƫϼB5 vBRnŔ$+0݇*bI4_B]/Ͱc&0^K*#8^UvAĿ2QL,yy2OQ5X">Gtϼ$)<>x0[s`ۢԍ:Ymj1:ɦ2TeH[\v N\ 1BЇc,B$wM) I"XDCTɹEAjchxbVɂ`QD#yLiFy˨!oǃ cFpۛ`2:/%y{efSJfX S".,!"p $}ʓf'㼒@VVm&mG)=R)^aK6W{H QJ]=3:rKYtwQ؄""5/d<7AHJ TGYKsa%rA !Z mw /Łkz}KMIoKd8a!x2Պ(OVI@,r((Hdh ޢ2 &B|wgXom?T 6}:6g["ODqڐn?Q0ϸڴ&uxYyW1g/ ?:갅 y3\ep-߼,. ʗ;͹O4cBNY@ ʂrΠ&g2H-!/Z6ie#g-LoG+߇ Xʒ1CRI:r;:,f9{9đk kaGFOYa1+`f;/'?G|&k$B+Jգ[GxQL؟(-BHF0LaIoOW ƃ[̞?tPIs[ wl}A+څk^ V3˄[r`[""2`{B KOW {aG;)5T'1Al4&JRz )X$S3_!a@=*;R emTG1AqfQhG'lNz?Yexw=4eq_>zX90HY(;B]ĸ9D;O' zV`ΡTu;Te\Oc5j er~ YǃQ'RT8̴P{ǧV+JqI16dHyyp ɒzI6TBD$AϼH|uq8Hǔ*G1;dLk!F$I~6@O9Imk 0sf zc+0%+($L/>sJ# 6i y Lo԰O[JT]5r m9JߜcP><C & ه&ه˚] v( =8qŏ|aЮqX-6ɐτ)dB9Q/h,FrA85(fߌR2(uέK:Fkਹq 5>O`{'!ɩ#nQaR18;8T c^H IoŒ6KF< JX.rSzS$b(X蒔G)QO.nBݟ%X%!-a3k{ȳr<=,:RNdȯ-{O'0B.oMŚTy3[X؄ɰw (KB ]N~Km~X8`C owDs'O2Jk3ɂMOfaVV=¦D_g9 Ra;fr6NՌa㛐Cn۴`1 Q{Hk߯#ɊZ$̆uĘT$ĥIȘm vo}4I5")~ZV p3YPMǑt՝ebavLj`9J&{ m1c5|z5QՇ@|!ҳSEOy#`o 6hx\M"94PL>)06OK)`>Tՠfl(œKEy_Sӌbi1ѻx4?cJ r,b"::6v=1V (UɃ@>HB G 2Ԡ`ًI˸Ur1xpcC]a`$)ky T8 r :ړX HSk%*H)pfTs& 琜ONA8{>+E.x/9UQp5)~Y:E]cc"M)F @=Σ N)Pn!w'.Kx8'Pz{񇓧E~ 0{Jj_$oz$F*G/[FA\LG,_8q[a/ "S댁xK%:# TxdZcysDR?omb1:O͵!;q L;ה2F@eeZ*;cjh<~b\vLlN@4yp'#LAo# 4me!"kLsV1li;FK+pZւJH[r&^1)"o"ofZkE/wʡIg|QK:3zyYtK!K=c8^Ģ'a& 1.*7IC'T#a¦ /W4xs I3uTi;l#"$_5~Y*C"27a~c!E:ɨC铃&TcAP>ke 30% z2/."/ M;`-^Neο nH:Tx5u+(Cp/* :+|?p&y=c*pÀ “<,#Izrl@)!-5'㺨j$B:t硢CZj' aPp`JƤ?x@s0ͱQiDExhx2tK/<y($x1mq'!6b8DpR[9P2fDd5=/F=:rMi4 aಔLLaL@K+IP0sA ÓX7DQrڋoj]ΘB<5@FʏY|I@[jTf[ hNCz6Z!R?|ua3܁5Z2DH'(b. WqHLtZӻʁTz0py͋P`z銥J,Ͼr` 'qцQm-׌]g.eգXU6 [-LJ5 MFbde$rUüJ #xu:% QK A4!dIazUE@y39ġ82ǡJ>@@BQ[u s#QEnf+|K<C*rrF bz_7at:LB )ӯ &QxA! ~ HeN1G`8`I-n塯XKu;D.oΖ>3[c]#*e:NfMq%zg9.>N>l1&j]ǗPBMcl^kSMkv\?9q[㌾o@h8|MVK Nqαɦ1ժbQ!3G2ǼN-]bxx@w}u#YES n?]w.!4 ǜD8RdA;57/dfcߎ>qؾÏ?N$<82Jt` )1%K="" J 1>5iֺ() V<vAh@M(R<#ɠ؀8&I 660aoDiD8 ] W2sy)0@d W8NE?&Bt1rDx/:"Yq\k Bhpп8q &tw]i K8g⒛stO8jIPD9%!)j-0)ͼ=cW2 L0)"SD5c~7e#n Ş7[n4_lJ<9,jMe#Y{XQ9J¼R Upy%Zp@uR1HSi{1rCᬇGÌGz1ͻ13f_fAh5%8uWr1s+Aac^˻Xers2&5]"PnH1ϖDg2(2iՊfK(W"#RGGn@/`'ps2^QWEyaZ$HJH%+mY,lhbEu GS M[LZ^g${OaIL4r4ֿ, 9ƞ4cv$iU(Њ=Dc 0 97/pMf޲혱oD".3Jc ӐO/yxdf"3d3@}Wh$vG8(ѳ{ ;E#fQJsJ`~2WIXP [DzbYW:3TsiH]ҘZ'\!4rwD[g, $i7TRb.G|{F>sd*PIsV͆c{T_($$0~G51^pl(GOp}~_ ߟMƺI^bM!6yn!H),!#ӿmI!~X p'U.Z󄼩3 ,?-dn1!Z?ЄH ! Ϭhitxlp#C(IHC 0֟8X U`@m'j:sg 'l5ɏgezL19-wMƽmR,fx^ ߄u)ˇsOzfVA>uVL Ӱ[e"]Sh5RK $rY"`B"x M]y8oYp=FU|lJc51" 8^\;ƺJV qxrUM_f^ d#[3FA’kjWp`E8 ĴRm/ْHB{oT/mjM)5ĘQ;lɛCKnU_|'A)֧*tV~p^k41!5 4|\4e  1Ʋ=cJoDOS3H4aw&<~qܰ`}~H,LlM]Hy)ٍ XzjS!XteT 9l&hOkNyiU' 3 #~uX }$PF7vn!eHHm$ A"HB;|d/ƫ| Q4NK4,טZ ~̀BSf vAW D&0{>e\#FG.LExFy=y++!/ۤfN*+%55AS "}V9gaFypTק&2ȳ;Ѥ; hޱ`O8Bx$_ mrEýut`K)FpRo2Bb ӐLp?1M41:q$09&hq4%]CP{_2QxK~hC@o7ߝFNa%&wԸ<1+ЇOF)*konǯ]. !g0}:}~L! ʯҬŵdᲵ+T-@% &ZM40>qg>p/#߬l5a{/zC~c\YLqOX>š@S'3RA& ,YY "jŜʵcS)b[両e$M۞wђO}!Bf45 B |.3ޔ3pGnwE7c;"K^+$,+R"Y\C+qx lv Ǯfg9y!?0&d v`x:# m#lֱ0~fq<%(\fcYdzl, *|d$)>rʷFU5W4 ps!3M!=H#mૃLn|䫦)G>3;+ XPUЕDʗ[@d2Ax?kS:߽,1 JUTK"}R翬^-#JCfw)'1 ZQ$DdʓF($w(ӎƊ3֣\zK ET?xA_X#k4U(Y}Hw2Ar, nQ0O29<~sjA_iȥcy' ,3 %rl7 [Z@m1=Mf@g\uŴz7Un].i3`rqh!KsO6'&-y?`dkUdeә >D߼{<(1&0U sbOxmeF Kݸ5Smg$Ĥ$))|#H#fA6q%OxjD.&// 5*| hGiq4RGP.:E ƞuC^~1#ᓋ)<e( c?u'l:>a̼=j#b/U"v|gI1:D+q*xlEm.Md}NoBhyP}b/׌`"ڮXAQXN'횀%Eל 1o a9-lq_95MMCv"@YLB9BTln; ta$ @iHHz|}-F NMW  U8}sНL kKKv߼u"m—)Lތ閴fK'KPR E$(q+ `1a>} K.{Jb\b F?4)8,.XM.p`2Ix"&V3NJv8\M9%1+w\)rXI|8;&ۓ)d1163D$$a0%D& 딪v2X2H{b!'0nf6ֿ+:aYIssPAR+0!ׄrTbT}bp< 㗩]ڱn\D&'.; eEMm~:LuBϚz?I@1#󒕱e.2f Ӻ̈́2Rg0}n< S)@Q*%ISL S_^+S~.Gc-8K(l?x i@ "idBaV:t{"4/," n)} d"8Zh)h3#.juHIj=ჿk ;ؾuvp,m"H6! 2G=:"%GvlyL4fc LHg¾=s6u"W|9K@p" xd+A5PB2}`2*/$ O8%%g.Oy&)) V 4 Sx#eFMGX1Ȳ*"5BWDxi('3\pgэ(\3P2 GIb?aYLF. aӯ2ɒZE!y2[-ª,1]q:OAHR_9 DA{GO#xL 2q"7=V,ԴʼnV<\)yʜ\C{׬;1&4M}0\3s;%!knQC Jk8ਗA(fFk)1Fm8_v`Ɇ$t\h Sru'EdS@!62V9H)xݏIfK_qcs! A LiNk`M^]zn ]eҒ:?ЁطF5F*2—~ss{#ŌVYŎ m8C[HULPSs4s$D/ #\};#'"<+|uU)rY85&9}'fL!N` ޹ȱ'$:̞2E%9MWcY\d*kۏ3DI`mg_8c Lpobq5tT-Dc򌃌,@>UثDpO&yC_YUXbY(ð17'QXi0’-+ wyiWibe=F]'9#2( M'X%,] q义_~40]n<ٰlhM8z0Jx؇; $4ֆOũ]8E\JR f6j' tcxj9 0qbl!:|1>ȄLDTD`(E{ï4؈'^"/4I!4{@$մv`q_z߾L$A! y2t L#$4dSkB5$%fayilI:]bK/dybP{߼tYޢ~ 9t=#_&Bd0a˞b–X CDtȐtdf_5LaJ*H3w{ɜEzE5)ʱg[,B`N#LwA_󋚈LG.2TG Dpy ew|\P-Ieq ZlCԲMUn9Bޔע;{iHnp&lȦR#Eq*^8?<_8$ uÂ~ND#4f*fODŽlP#pB?d0|iK=`סZX1hw+r'pDN@mYSrmWHfh9ɭQu9 pvTHZ ~\B8R"i}{@%hr3AݳG0_Zq0&?d2ČI s8̸O8D!Ȍ" 1.X C{T`I?c'nF!)L x0 |~r M!e5ϳĀJ2$\yֲ*#Fp~/  y#*t-ecnֳ/9Gg_93FKBhOHE?ds0UۂCÈ_9JF79DId4dL{o:nuɖ DnT‚8i46⭣i3?>81I4BV5R0́"4AoźG1)Iw{[>#z}iqi"mQb[H-4 $ЫPӼVhP{$@3a;8`8&Y+FJݕ~ 3Y?7".u<`-o=tX~F*+R -.V_auĢZS#Cţw||k-UAm[&" 9vfňęPn!65a]e.(H R 21J`78KTF;d5xSGpŶ[6waRs*=uwXG Kl}5CүF1#ymoQ u.sV=nn%Bl̓8cJ 㓼-$fӐ~Z9?~3]-.$A'@;*fd~rL3DX.pݵ \dXDY>BNw6e:[DFj Ij<G3JQvpQQu UoLNV^--)>'C sL6}{'ukI&K.y"cE0 $ߣH߾o-֖,9}Fװl^J57v4u+nr+g$ngKz%)O5-1FN2h!2:'b) cSqo"$e<xE f'J j! iQw}}bJ'1;e9*-Tc&U+ETOYZVEnhӌdm%+p,n:J*a\bmŅDcDdޒ4a$#- 0奿3?RY5aR28uKQ# yNlE; 5&e &A4uMjDQ/ =8FXn91¤͒ˆrV9&x'Y@Ή7 "MQu:Dӷ$\Tv~0)2 wNSRƃ "ʋ ȗN8O):s: x! yNLV$Q9r6jM5 $:402;K0d~qDӃ6z[e lԻ ;ʵ nE ?C5aGvvF!nU y5 ')8zE/%xnFL72ݭf_,ˉ}YEfhFweu zAtlo,I YYjn0]b w?ZhŘnr}cTnwό|R_eZ]?$vڱŤ2?[A*`V^bnLdvXa9H?2.7E}bdgOx0) H1f­IĨ 4E9zWLyd/-BÎk1aOCĜW^ *oz|S:zh6N #@#Y$40Tq.ȱA6SrG*7i'HޗUfB#G/TYMS8˶1(v$Py5oY ` M ܋"na; do"6Z`,mG,"oFWiL,i"&.OGE8M<2U*%q,Nq #%hr^E!Wr:zqwYuc5k/gdo/?2o\eCz3|fR>mUrByH Trq%&v8g+{nByɦiD~k k&Z&7t`T)$ bR g\?"_ 6}qo0PbxzJYh#Db8Snj10wxseo\COy].k*S(7]aqmIN% 2)sY.h "kN W0=[G)q HZN)4"CKnMd^ uIBj6SH W/[oH!{V$tᖔA>" hO0-XqdE4vpKFrC=⣧"-B36Fa^pY*1Bro]& k*mB)z}c 䣾+/ (C*&#OtD7osJ/`Ces,0;r``T(0g9$VS:[%v%@@mo)U%>2(Il#o8!+)ӛ{DA)2&dӈH8oZ'fO?)@-hQC/ X"?@d4\p` 2ʛ0A9@JhYz {OHQ;:#D(;?^pܝk RѰɌHLC BCEk(@&xi›HG&K~wy2To(fmK#pHl$;(Ƿ]S, c!|bpzqU?XX_O,358M X{ %L2=sxT\GQX4qBjJ0Z|au%[ u< éwKj>XâэU ҙf9P)\?X֝l90rg+P?ˎAr=Yx̺ĒHį/s&І^M,<4 ) ,Kd A,@`A^ $H[<`roS$M8Tq.*ul{bK'%So_ eK&D Ԭ'1u%F(*WfT!vfK6X q%rF"-'`̑閖%D25{\Uo۬9R!,KDK Yz؄')dVhQ2 9FqigRxP~?-;?EF5FqF&M&N 5Njw`X[Li#F=!ok'_1hMbjb'^.ЬuC>|(nqxĘi zGE.?YnZ*~q(85Io$Ʋ}x[(%(܃oFlGk&@'kNtyҎ(o @f8r0,2 j!e'cD % ,ho# UQHYʄKeKV(A1xb:Xi/_Dp}k4@˥m$4l}O8LA5,&0DدCN|,ۼDc n+2ґP1 j:ld09yGIrnb)Ӊ-֧S@2t'<䔋Rk43(Fu~Q:f*G? *n7aH']sNܖόC(-6氰LW{$̰KYD} ύG 9/7昦bvcʯRFZPu93.$/n'9= B f'X0/ߏ o+Xx$-bD&=K#Tpp 5!/@Дn-;?X,|d;ȓ}FFO R(|Cȯu8%A?9*f+`h5?<CZ X&8OCBL8󌘋7Ō6>J ?=:٣^2w^E']]fT8!FPu9`D*/O8SYcy* E5ma; d7Q (1:_9Ċ4-*]J]A"\JqhAT9)P .+wgl0X!Z!ȣd(}>qZ=FB]Gx ƨ6_"{X%."ksfyq"XyIŽ)\bkXիGL2bH*'Ej;JO2}^xAnŪ2B̑njyV6~N D$Y~U$JSόqdq.GP# 6$AGOdxf,C˶F hrHUDI3g%O7IUӬWQF0eӔݽuCŎB?hlodrA)V%:k'5`.D@c.E2|0&5@bn rxՄhpu 4x9@Htd$]F|R\P]b)|yX7 XTcNT=/DFIي:FFjc( ~'mo8&HndC֧)gR<R#W>oHi-eis2(YԜ`w pυAN)$9* !l12& VCQB]W9ICuk2JTAYbWȭ~& QVKDNaG-qIj2uƱ@k@XzCX??avϡܜhLo6bKh$Z{=3 [DO#9^<'/*{a~[.iuI S9C<㥄6?Їɣ> V۵4Y4F"_X ٭sM[qoY"ga9{U^8:#fMp<!!T$pF6jHxɳylPEbyRnd33-%3G_@GHp$0<K:䬈/'In単)yE2;*z\ ]s&CѯcЍ F9h |RLSZDsPHFDF)NtM+Q\ʮ 0|NSkwxa׾R*J=, N AC &s\K(Hsģ}$ `KQd~p)55P`CW5Kqw>Ud ӷyaU{V.y<#'k&V^4"7σ P6: I #'<*Qk+F&UL|unpKcy $#;>)2u\%!Tq$$X⎃5Y8T zPjcԢrL` `bB`n*5KH.eI(%V#:u5$QJU4A];F-ǚ~@ta3F"*ė3rdؕ^G4CrMFJed:?nB@Na UK5YAk% Ȣ3ajcԈV=j~qT5FZRȍxpPh EH,R8)' =9;+&\L$2BHDwG8'a\ '9f?$}:0!IX'E)ypXHT-GP. ޹ÅXƥ@:!(rgJ דN7(P"FAAGN.Ɓǘ @NjB''3 @jC}Pn8~##&j* 8 y76$ڐz6dW; X#-10̆S7g.ч+.ݰA;?Ij0$e/5B<8TDV!%m"8ROX8EŠ{' q=LoR[:L׶gw%j<ք$ia(PyȔ*NbdJXD[LzƱ7'+pjRL:#ufNT+qNk-$ -I$zAJ͠lab9D`!MUBF%AXNNk2&Ô"Sy (ȏYoHCm8~T~l JE&)!"ڏDR/'cIQL*7ĸ/cn#cY!AI}sfX2Wz0*e7{eы>"и'qۉNyIIu2 (PPUmE8tPbju+D |UƘ +ְ7B51vU y>BZ/pꃒ6C4ZҺcFAxbM]QͶ #<5 u J<[$Sg1i`QRDE%" Rd#c@޽e- ߟ:w![9d9=aj6^۞]t\d%VB]oxg( xwM3FNRc ^{Ȓg 20>pcm(G}bwv9Zq 5u'HE ԔIcQ(1@Q hR`(U!ȑWɍoC9)O`YV @ fGtEG&\[A`2q$PP嬌S\Oࠈ}J,Y!jph̦L>P|,}%?0J ߈ê@=zW)}qg7 P9A~ .RPw TLsĵV+AMYH>xbX[pFd/..y:ɥ'7p)`( H{cTdkYS.Ø_#WV2haol>2801lif.Drl<=>$}H_k;2.\kG:qR,1H0@p`O3W2SzƓSH1uP:$[by38n'_٘_xu DCLRTBHkQ=5o u#-'O UF01H,X BWr89yIQz;\Zw˄"ƦsE@mjpѐxwŀB՘Iw@ %, d6߇XwmGPWixŌBܬbt2TOtZžGLSG8VF5 a 4vzP'% k {_*$ F. %''{R"Z&Uگ$d#Em Vf\b~!X*PADp ;?ׁ˚'yY;jAIs81`"10s)U20GHE*gaU#'DS; (p‡z?RtjO6S8-7׼H:_d qӜb`AZNfSn? Oc#>~pP^6%9y;V)Dr%Cdyrx!О5#9&ACFqxur"ZA>&2cP0 ]VAr&IeDK9Ef!qd'āK'%֝-3{O86:p9`';yͦ' MQX\^pIożԶ9#AAi*qE=̼ ~˼ 2}E}߇Ď_J0gH7#@$XP $q`(&l-d#$!Ʒ` n/a2,@. $*}К{'IFU33R|8vVU]+&Z csE`_2wE&a..d$Yd:xŁ4܏1 Q0!eܮ9mX+9Lc~bBL"ܵ`%U9d`ϐۼ4ݼ#*~5_`p|><=^dvFA|{Ip{Bc2L=Mw@ɩ 퓀ˢu:QgiN5 7V)EdRX ʨ@) t!&H`0!k+%A!fV]Q{ÉP X޵A uBL1A1?2vd'DXQ1ٺkMhrVÊFaB"# D08SK|.1R܂3&*k}=8`K#if,$O  DrʱhPSU* hŪL9+NBC&a>q EQ^rE)H^& ;0>(ÈƆ?LzezrRA^ ^#n@q8'bqư2DڜNɠRF!&ɀIaZGP\yDs;2}u`QdAnfpx|FHLKQێ#2=a|XY~6tdB*"WGFFcN=|DaAudzrͧKmqf#"r|1;iK^&OGl7iIUZ@d0]KYĮm7?c,C 60 &q)3iɬ=˱W]aظlXې?U9S|OeyCYD09zCVtw ! JSGtⳀU9p<*veHI%Qa"n+xIM|`B_7x 802^ xcZx'& 64K%r8VOЁ0O ЈzH!o)@vEu߹a3Q쇚2jV҆~3rJG13y< ˁ. 4rybgy%:ș`=!BMۈ 'M25-7YQp+ù{׿y3.NWՙ ~~0A(GʁEy`l:c v|Ý9 o+|Ϭ_^|d2BХ;`p>@v"waK{; \ xZV`Ҥ'#Epa6'o ?JLx!:HrZHcww_@LF@'B9ɝ MFD5"_QN쌂ī]VLjyQo|xg Ao|gMm&iYwog*;l肐8R9>XHp.ky0 !.Hn!n]; @W0,R(,w;0yM| sANHLxqα.os}02'x/`] @P*b3#UwΚgQh!$_pL /Q9n'P}h&:Y!o o  &LC ԴH20Oс2]d<}}e}db u̡1+HIBX_y8H}^LqcDFn>ї o  hdL(&y\ M)bF%JBi+$6u#7cD o8 a$ߥrll;`xB=@b9(L j $qP8dB6 W'GklYlXvtxulHW8u_/No F3FYdxaKQ/͂ Z͎zVEXBa1hD0IF>1x0Y{/}~qw$nT8.\c88kmI;Ī7E`v9))٭Ml|#Py:Ayۍ$yߓymLsbDG|#Ы *bw蚿#Yp`T0L+xHql4HZh"~@$[158X@^0Put*@)\\<7(wB$5( _9M EOO9O'L-н8,""DۗX (D@˻;Z!W=_pU'ncF#貄JgdJP숒L:5`/*ox9@FD45A@PޘD )T"/[dPxVKmI}9\ᬓntbȷaC2˿LnO+hw#M`(/M6V']Af*lySz&*eI1Y-tTv& 1YAԬ@ӏꄇdϜ^%8bf7vƌNf0# fbk Ӱ!q.*&s\}sT'!uB|bYo΍ iX\S’#, KJ5ь]VL(beG8]NeGjIqR%@o[fmH0 @!=_bI*Gɼ5DR_ *8pBry#Q{I~-=8{=#24@"p'FD,㜾 5O&y.R44ߔ0TE6b!aO=#ܿxQVPW2͝Y,RnGN@/_SbU#IUܾJ + f(XUS=eȚbxo;g @E !Ql/h Pu$MPJ>"9*KCrLRCb5dĶPT7@|✢1r6c&nUF48Tu{e&h Hp9]4kaպE\(q.-ȑd[oɇ C&%[M2=NR7TBe~QpM@ΰd+g`ʿ߬0K-|8`نuc%vw9HDVϝѼM;f@?|01YAq}k&ѣ. )X+/@,RH(WVK̺ðO&N6 X65' H/w%K[ 0ue^ɼgd=#0FJ6 /ǻg[8yC'ޔ$=u8%O1B{,:DI0T;D@tO(0<0kKH6!Q RaTcVo:+ 8I'hŸx~tzå%S\&e"02t:ˠu{NcHЩp9Ԋ2B1ffwVU/_Y jh-b 3d^8ac) {i{wEjU藞 aթ5}`*8)$MZNsrm"j\аHw~XIs#I(xw8͆-6s%jg'd÷z̍Oy'Ylra' PS"!3X%cB^z?8 {c?bD HrR'rj$. T 3e;nHl y;$ ''qo>\WM d|(9'l@=ܔM@u缥п R~] Bt>>*VLK XB Ԑ$bع&j fT ̅ɒi@"6=\+1\Q98jkg:(VvE^^,8ci>r<#%BkQΰrpӁ0Q8Fe!,r_C/b~+|^& JSo˄"W8rT2ƐϷ!Q,<@=#P@Me+嬞=2'zޡ~q1{Nu͸I4+ '2 츅)^K{fl ,0j0Z&>2"4Y;F#tǼxծ9w=^UPe{^sih$LLsMϚ=c2,'!_2{a׼>,2$Owjh2RMzF@p-Pf|f4IMj Y2AT'Qby:`FZ$d h%`%.8'ùQ1< 4bqi{D)pUqsjS<׬˜;Q=pBCv1)X, /`EsFKJbf& ReMמ8e@Ue"'yJ=* SEF0/ZWsuՎI+C=% Gpg,&?0`ߩ#x <]<8 Xy ʞw;Gx&;z EbE7 ?E- dx$OXi]!df;0Зh [~/}2m4yHpS^z(/L^Ua=Q61T ͬ83`0߽a2/xX3jH|Da#MOxByl/J`[ue鹬˚{nypTC2Oƾ0U{ɱ4 q;~DJÉ}$啸D!5(YYF)MdzI$A' bM `7Dˆ[8D[!SRx"w ^+js:I~rq7WF<}uyۇT1/x=LbFH1H"H$:c#$I%mjCp!pIn*$K7NjI@!$:C'˻ H%Q@x¶L{"p B/ض'NIxV8TDDO/W>, -e9qMiT<3I~I"Zb;3ij<,ύdߟ$ 䜙\+.I#+>q'Xّ /9dXɉqh{ywHK% ZRL& ͵LyIJ輂y0)뜡\(ɭc& 1-qNMG!(ek dbB&ow lι/Hh$2@u+UևB̓)0!#}m":՗5/Q ^;QI'T: Rul$u"|0Dֵ5·XTA6"hc(d--;^JڪpɪfqaW$5]ad& F!8=93z4$d)[DlZE=ίwhܐ/y*O!umd9CgIe ~QhJq[4T)8t3LUId/#79u:ߌw5to[˸2C*ETDS<Ks3fH$`d!u;h7&*Tfe/4]ݹ @@LWbAQEY!op"X7B &mMsyÞ|ˆL-(ycK:{PzbPV m쉘]d%ߒq+Yk1M H&23穀|a hUP&e6/>@`m$d}:&Yy(=4e wRC8_,10PAZAތBv:2Oj& ijX_\Ki:EBi6[k&ɫ ݖdib,׷^Aľ(\' xCe Vk$0}cIA؆8 Qzoj۪ĢBûjrwc /k.Hƃor^Gl7M2BH\-XD8((cq=FA 7~p"3yDlNEQڊf|df 9} 6oDKdh# DK% !7 Sbe(G:҈!ɎsDoY(%CXHdQ {#M(}ce,u*|dcNc\˟B 2BexHLp h7p[&* {"@fN&Kp,,ɴN!y =;iE>]Cs"I"zk*e_3/l%(0\匌Ud,l ׋#80UL{9 Jd+J&e1#HȦ(IUZbDd$}GOHc7| T6v0!C f1N<,l2+H;0;SlI8 @Χ,Sp|miSjt!Ղ-ۣ ʢS@p"OVC!rlH 'dzbq 5hQ:LF`F?L~zAϧ8sAњaY8X9ꙪB\?SXn\~54a )^yd 1` XRk⨺9$Qo.29VƖn˄,řVO]d4l,s!N:BAõK߷)LkY  v)ĈKgļU>PpAP|Ӑz3m9|BvLaA{El!q)Z8:-uyz*([1Xg"%j\o8Ʉ+Ь11FiJ N(]L*\TI) $[FǠ CoVqxHdNǩ`m,dzDi&ȍo#59@=q$_[~ri /C=l5{i 0I^1[<®JǞ2鐻'7aVL.błܩM8.ݓ)ɿHܔ׎c#ӛ*lmjgbwˇeZ2fRbe$jO#oSpK]}Z,KE3Y^e[:&o !YŃbaUpڎ,'USLT?QNB\A 1y"@iU|T2s‘KβFNL|¯}w94ً [qDw- /X.? ZNǜHa~#qyĤnGF<Fk죨5^QJ% Չ>=ɎŻp-WZ  ֟$Z(>7`qJM2z,Ф5K 10]L51LÂ1 D$ֱR&='̴N8~GҲGHuFd);'NID|HYEOG'oXUwnL<r6rNG}S!-p~q&7xc3HIfTPB# e`{ky)IM+U{X4=c-Y XcH(M>>r29ܲ8,z54a,rX]8Q&A,Oy9 En00$+OP|q|SYMT ԥZwI.Lp^HkϯNq6DN_B:5rtKMY%|E}9O9%/H߬F̓3Hda]qdbZ pKD5M9`- (|+'@p(ۭk-p9=<|eQltS0$I`cy,~wwƲhXGdB^'5uyDx Xqg&l4Nx2*7Uo su)e8-OJmzm5 PtKq.'uB3Gք-ˀ:<zl 2O>2DX9rbɽGBR&9*~0"{@dOrC81ywS"_r t3vualk }nB Va~'XJWYQ=6<26l^#v B묇.5lf}⣁P`ߕqc$XҙNZQ J.u\?z6;p"j0YIT:B+ b_q4LH׼8wPh^%^6׬L*g+|D6kB5?9[ji0:œ8DV^g3ñ^M\I&8d86$`m yYk'߀7q49rN3@:`]VR$09"N#ِ0 n&(e%p\頻w&\;9Rj|VFe=uY_Xm71u^#P]K~;r ؎FFJxH,'߅;A#Ip[th4pN5b$8%ZB1 iŘH근Ҥg&g8XL!31x*̢a(]Tq۷# 3xU!t1h{xnk$DO2-qDgo$fYox|03#DgdmADVa@&bC`_`RuǼpah6`ˆP9!E9`T :=RNL&q x̭uy^퐇Rxm˂qưfRrPgz'fK[Wxɀ`'09}~2I4b@$Ÿ<ۍkyʩ QdmKI`_q =2YnZX"o 46Vt$>G_0Z1P#5*M  )O<0Bh93<=FW.q.TD3F'#,Sj?44:Gl'`ol7S9Y2I\!xN,O!$B zņpFŢZi@LH7'۬L^1ym@FcOh ,Yxpov'NKM:}GVE$׌UK]bN]VCgCX!/Jt|WIN?9R+9'+؋7R/qǯ8ubбMH|2h,U/\Bcdq3{$q3:J!{ U=oDj)R<!zLe<  &bcܐ*;)'r=&H]ze]Z$21CiS6 FFZR_2xUy1_1; f.OK'qCew" d/ȅu9n 7$$Y_Ґ$_wkY#+L)tK"~pdbd48)L4;$&jQڪeQLT#~/Y ŷE#8mmH#oxE9D֤+Nvi$/m xlAڔWKR)%ѣj, E`Oq ԑ#F^q_U Dٿd"v?OD\˹3@|Q =AW0\JHa$}M:a5 ('0dq  B" us"HxNTaA5dsȞ뫓K ,9H[ h|ix K]a&+/÷'ehD5-?9F4'h!1C lߜ浘Ag{'5=B q7M$n9CF.ӤS9lY\py8ik<ֱ|+{ 9!3)>2Rr9a<~BN-&J 5{0t.rOWXf=JyfQ/"n`04*j/qF3\:Ldܓ# L{ȖY@v5x~w}OɤA/LWSK2=-3{PІ/a*Xf'\$16M{ń.k>),D,9V[(#dυ)a|ydӿG"a)! yh=FobZ*j2OT /'yf ]Qq$rqMV@xP Naw t !ՔwxɌLX9^iLDaLH`Ns\UqScP! 6sdh.=>p4H@#xP}f=#1UW1bdAoEexDYQ- q„zo_lt+a3h Mq{`^]ږⰆa[j}c z t`1+jâXXs_B`./k"ڶF2'@4SNAPu-R$@|6 GJ* FGm?uA_ }#r+!e̙;00) M<>!|$"1L{L([Y0&Gf+.[w3k !rxֻ[+`H@c.^}L~3oRe3HJ&cfB>Jz`|6bDwGV`(q_-'^4%Nh5Uzk%ĉ#w҄/>ome_XWkوuNK3WL`x@W b@ ana}b>\5ہ[0ID*qP0^jΫPIM^1gR|qS{udrxph`ƪPe{DzaG.gmkC7 A!ľqr.f/AVQ,i5C&6-^"r)')13,PۑˡAB$Μr *e"7 K/ }&ܜ,?0&IYh2ѧ4 Eo^:%8* :Պކ~Ж{I.C٪Y$*7]%hfĺ3ҭG !f(giLYI^BAy'"29Fd#l7Jbx2DB 0 `4w^D9 7'&^0LhQ3#!8ovx]f}K /&CWXeӒ&r7y&dTyiz JY? ]y!e3s AQk#͏=Ɣ&V.=wH6Oqyx «RѴ1TC|>Y*K*!qk+$+#!mlcTo>r=#,4oyK_cXhuhzk mTUEyˍY8  NpW? (Í1^"jŠoXYXxAL尀Wz-@0x 2<_q ,a eˍ-з@` fף#0IrpˑAC 9sDu ig]a\)Fx͜ 68kX8(%HJyj. "h_Y. cLlhI1Lx/e bw욟$nj*ҹ.𨅒ez;JEcU>9$sPCqD:>3P|cs2t |a#9OCUN ' ZQg gdK& jg0AT=(~ڰ- R}GrME ;i?cn!@mM9b(vq9(ވ׌aZ.n~*UZDL^ǀnw*VRŐ^BGz *dzo$Gdu4  Ie#D ub $xvk7A(m,m 7[G=e#I61 Y50q>D1 q&^.0r8XcwQ@W(X*Eb@>kq"[0=,񉥈"m[fjƯz Zw}{TJOg -2Q_1+jp?IpbI!YJxoRDLxU AjgYA( 1a)X3`|+LblT%LCN^-kT2dQ$:ii`wK6C1ч|Z&J=xGI,-/$i _ o8NwZK*q0ǭ,A*˙ q;!:kGe2o˨8sY),u@Us>h;p.G+H)D2(Q `ADLNM ec"gD N倖˒EԲ B"8(MfVF%'nowK'/`% V,{8AЊQZ &94S"c08Xa` ܘQ M8b"bH厲Nc\DJsxݡ`&#Q/c~$uY_4r_Uz;( ̚5Et o$҅6c5 vD\jC׬鴆ʝ0vAXi!2 ܋$ ֲllWsH1,ͅ^b#f19,ZLN[Ln\e.  vMg x=dpO_8x ƚ"ZarÒg CcN)-`/S6*UM1#w=yArIX3=Jh (jʹؐv-rGAac5_v*] GW@-ڑh@a""L2 k+:A%Y!F1n:"1uFh? ՟;J˜twKv ]y\":XbA>ԉ&AɰHqoAF[|~Gu1Q`3sA$o7F3M5JOdoY{ŢB"Ds3DX Їqx- b8ƔDm=EqsN R#FYZ`ǜEqD!.&eƌdK,qR%-4 h1eȁsFTs dJHDAޏ8SW,O䮣/qiCcjgaRI~1Z-H_\h$,^ "z5p5G5F1$`$C'2c1<z"2T 2W8tj!roKU~z#$1>]{)%rH/: F`̯Yaԃ~+^>Ki cȒD̃KcE!W"%h=27öUy=WU.|pJ؈.YaLB4% xinnE޵!c}`"FB B cbO3N ϻ:}qk&EPEdʔɔ'9&!;d}dbGJ2IFj1W0氊F.*H@'NܘĖ`a$ kӈՓ Bz+.McA`βzujBdb2"1g M*[FGɰAܸ jťqNW3 Ɇ) d).|8BK"Tn -/ Ͻ12FZYzvbO lRP)Rbh2yŏ(nqLTn}œY7T d.vdBmy>ȰuDb1 GIPNak8: 7D[{~#Tr+FC*Au-TZHo3KFNv,=V5*#O0!2z^9o9I%,"!00'!<2ڸe> 0|5l\6Ob~1zBSX[ФIÜrs5Y> ryc0 d~3bC؀+3I B8 E*~ A8.EԞ2ʗ$"Ӌ2rIm*)?"҆:cQZaWF!IƱ8Ñ3޲Lm"O+a9QMhxjGh8A֟^~pcg6bPd_{ a+*D󞣌-ok)ԝH⧏_ Pg* :#\btFX^SSc]qNbHA.qpV2H&$48\d]Kd® 58+[BM6"YSvm}1$ tWVNWrѼ9cEJ9$[ Lht$E:` (V|BǬrXё1m= @FLE'C 93%0 O&l|VzwR\dELܻ:{Cra 4LAeuV(LHWplx?(6&ÿ~(kybg?xh/y?*9 }aDƟDb ĤWO Ybd_y3W8 VFIq"/;θ?:Z#`v\x" ~[7۲(dB\=@ӫv4߬Y,ucלJc AQK :1~ٶ~72| re:Bd9<XD?ND[nmIJL=Yj+ x3H53r5l@Ktnÿ#jRRXş^XT危U|qdž0䠄dR4PV !}&X\HCN LXP )eH@`N(u"K 2^^DOS9 jmߊǒ%4I<lk=o >?̧K@9qQ -rP(iS  R +4R6Kؗ&cjGXt&.ȜhW)@ajE6|1uLPd}uM 4M3\"h&[ߌHYh0)c,2Isy 3[MW}cݺQə2Gs:bzIVL' cZ 4?&<.`,UIi=Oej2`t%Fy0 X@HÒg k/y%ש* g;BBD ~H r8uU\8 bƶk Ԩ);pV*To*Fєܢ}„ܘb5²{aI.QEfB]78_0@hg^+{ĔXTaKߙ? I1(+G>LDwbxcF" |m]Y \?.61w-[ȸL+$~OdMDξpJBvL ( ! LXJS^#By\w R-3z"s GD 3 XagڣP;YݘܣC׬3%i?bZA"Zy͆ 6VG!wPB*Q[{qU#ai13!}s^ fiH j<ij1e-8qp,Cܚ9HԇȐ!xQ| :'my'#yBK/~ Z"c6NCԄbv|Hg]b;V{| MxלLu;CL,87X(dȗXڈD xg tY'/DН+"&KE`E]Gl YTdV, !z?3DQmeyw^"qLa>Y2{Iq:2S=iE\LE 3?5Zf0d;x&++d޵Ǡ'E )p'J.UCV^/ㄈD$<4ֱjz$0PQ`μNOAZ4i؃ {dPh5IQA5d7XOshODdvI(iF#q41G ]GyqHK:΁}9ċ ~qqVsf!|wZ1,5:5WȆ.Ή XW65Za0&\=z(3ߟOPoGTen?x^dmk !޸`[Ek"FƳ͛xSwDӷV\TkJ$j:r)xM?*,+"׷2dbQ?y K>22YM!_)7'X9) qSqjĚ-<2B!,y a0xwoPcߙe x42ZVΌ+֚DN O 'ӎa@1e٠=V)޼d Qhxʘ/Z+%>< bjKlӟD/OX$\[75|YfFc~13Ӓ"jfd҉XF\sxfq5TQ33`y8ELJY8Ng!T3- (]^/8 uiPmї@,(gO2N?yLGYV g\c4 LulC/DUybhchdJq䨇 "l=, 6l(x1jQ1w8<-oq9\&y=ICR,ܘ I&l|'.NRV(SR8gG;2_XS Mġ+@Dox)ҳxE sΙ'DNIZѲ-O$~Gx{&A"bM^.ڻg!fA:T{2EPM%hY= 8C#ʲ8˜23nQnd|v|̘jv2(·{RÄݸ63_zG`l[qa55L~;׬5 dz1U|WL!cNsoZ0iPF :sM[a- ~0W8b+_X#N "#/➢-_K41R0;~;NW{%Ϩh W+㜍~}È !/pI$.F6{xDm8_R\FT`a'IgS, 2Q. 5Gh^!V~+ %%e`(³< WѸla>s&h\j#s_TpGB:7w3 /٢Β۬(7(:;lFφz="6 Ro{Aܙ BJSs[[+Nj N1_!Ş&2_9f6ؠLĈdb|N'Nnfd鰶֌&i˜1B@%`!h,k&'US oQL&g8W`f LJ?~҂j|ް٠J}ݒJ7Y  x,4F:}cnBIE8j7s̄#C}\b."y)|vDmqq zP35'XFAQ&8Q!J(/]S7`&sn7T?1|d@ЌC6B3VE. qc01(>VcD&naq`bDVkd"2}dbϿ Ji8|6C2.oLEHIy`Sx }'dCYaBD=wAǙ Hx7,-qXi0􋓹ܐ#".wq4<*?`q5HH@;ʌ:nܹ)Zɲ`9`P #Z27EJRχsH% 8nR94dy>'wsG%؞]v ͑aqi =3^ְHjmY C7qVLcX {ydGEwz`byv'  &/Z8 c <'TU1(BeHzXAtiB]İs#d8#Fh 1(K8A(x/+XRq7t528I)`[rU\LN  *6ˑRدΰgі@mN6E7׃<Vq&|L %nn@F-VX~\|wD|)b<Y#@75JcFM|Rh*=\J}q34F 󼓴Ћ lֹfYC Xo|uk([IŸC'(F2.FìX)-Z&gfOd#PhEӜ$FVN6&yu4Ջ)@C执@YF.KC0DwWQ2ca("& @TKc 0QXxeh-.RUֲwb!6FBN/Sd)7ܽ7An3&΀4.3XF(NN\n8d(}XMܿXWiCDWI 57)`Ӡ=<3^b/!4H^0'dDmX▀rǽ<û;+Xھ<)8o Lv 7Jxk-m9sto?N>Xнc6$^-s'0*eElA0'Ռ'Ia7$ LFN4bb `cWX"ݭ <*ދ TAyK.Xk<0v:%_IB։r*f߆1KdY=Ri(.M_a4S0dq"S~$<9ȱUR5~CKs㈇XIr'Y;D@%Q]{+3I7|초]M!,~;2V\l."b1ʙ񃵲8ǵ`$˳Q 8+x0D HF[DҌ6e~c{*F4C6e;#4U־r}sڏ\/J-aљu̠ w"^B0mKJ®x+Nڮ~ ~2rЈFBx2ȵcV2'Ibō S̴OqdYgGb#p0Om$"2! 2N@5S7; QMTPU d8"K]睜٤H@,B% 06I$Obm GiŅ: &gM>l f\>tQr|n{ D>nc^wP`q "XYQLx:~*rJEb(N\cK|f}CZ0J)axyid0ײx ϰS9{H*>1ׁ7`;&8c\*?jXR>38^yna(qnq"5Ly99yT( \ j|a&pļ#/-H: SpE^188;lg*f.*8Fc)a5gnƌAk6Y8[L2lFbu8oI44778A:pXAY`L3*ILpN9?#?yv_b=LZJd&xLIH2&ڰ<)*`C˫ NfLꟼ:qm-aCEEF}'J_ˈB*9|`5' \1 ÈIxDߑ;̴u4 Uw2AMcsQ#ڕלt*!>2WII'[Vvb`9x<k)vx :_۸  .~rlD1*T$x\$U[>Ĺ`f gah.yDdhF 4yc3c!1\9}E': l: tdp܈xYk%6ًя5a(FoIII 4ɰAur)Kh[ЉU&ۇ&Kæ #fgxpBi}z ) &KTy{ו`6xJ~[;oôPbm3^c  W8iɾ\ax)6 L 'B8-BSsX M/Z7nhY)O ) :^Kj6g1_ozý t0L8]bx͂(ù]/kfJGL%n;Lr;ÕL [hD?#iLߛB|s(9&& AI:WbR+hdžl  YWL3QGR%ܞA#BOh -LPb^/z4Cbnf@ˈ/li:u.?,9KZF}1Yw;hOQ|"K'Σ+bI|q=MxMbDf+XB8DdEQ(p<Fʞc4L5L)\ tkY&Q<¾q20ny}21EKhN)[;ʜ`2%0 G*?'xh~#0C$|d,*w)q`Kdc2AgX &%7B|J]#\Cí<~zw8N&m6+s\?d* O|<S)]h;BGpW^YiCWH #>1cӌ6mhY盧\o"nzq!3܂CIE|@Ú/Xf (tM:0W .z0\ A 1>7va._ڈ+;`)njوӸrH~XS}uf *ColB OA1 hO'$1e \߼&- Gt=DL^PnJd:1^NOp}fi ǃ/59pREI\ayBψձ5|?6Tg2LEWM*_˜ > Q$-h8Y?:$y )^_P#= 1Z~MӕZ4b.^<9$іK1u-@d  ׉NnɊū$hTk ,E*`!bc y8q?ú_ # f:L_%qf ׏N2[Mx8*ˀwZ|admOѐu#GG>t1WD,3^3U83Qe/Yxň) Arj]`Jm"d˃+IJ2a}^y+1'Y29R|fNRzsW.*|5•~+?D=>0XlFB^?8mq"O^] :XBPȅH}cYʿs9 Qir / VH/uk @I)`,Q8Q@:x"Ls3HO[$г+ -(l_xbe8u`A#p^C"I x2Urm D54'3F8;lڮ?Ǥԇ\o$ '0T _bi\AS?y!fyxGj`0v }SU1z_xA+ 4%r2s fc2㩳!Ww'+9̓d؆Cb{hBM8?!BPHbB9 )!.p ε 8܂S ۾r;E˙8aK>6z>=Q3/,rs&:uXOH;7NCsb%Tu1}QxT+q8tgl4 g^l5l1R}fh$2wY;FڛƄ^ox%U勹OLBlXCMV~!$#hXyffŀ,Q6 0N*mm#Y~Zd` сxghU"ݭr'&1{?taOdDaAeSQeח%i æ88cL}i̯';ky U6b{f`r, kQ7TI1{oY2\S2 'ї $Jku;٣${[ RRS\ÇI{Tω1":w&~Tи=w%EW5$xi8AtqYܼbMD1|E ;JQVf Vjی X9J=N} @k tD2S3T4D^B2n# ("=1Sdt/Z淗k @#a4HfKNAe; AkjlQN^"j:҆xžZ/]lD 78doZ4ܥx5AszBB)Y Ѥ"^mzMDI/75Mn|8%6(D:,n5m{2Hž4MzNJ,bOEdyHQ&Y0!0 B9/!NJN JxR`ucո}fB;?nXb27q&^2HrUs 'p !Dip_Y7 RIV(ԻO*<œ,氹)nBhDž?}S(LVcA Oy.%@ig{5=â)!~S/BrB Jq\#`Qʔʈ|GetO 7k̲+n]뼐li~:bLAWQПʕB7P0f,Fplj1q`I&Uɽ.RRY؏$< {˼1_ؼ;SV!cp|U"'}Y>Q-OM'cZ=.$.Fy*:se[2$|{ƗJ<VZ.dGK0/1"nV~q o`VCD`0*"/a)p"sD(uyd,4j& 8D笐ɸKӾjܟ\{9(jrM:0xA4i U$bw#P]XG#zɂqч iG JiOj4lNa7%O]|uH KwY64Z+*~+EbQ"9K"ڡ2㬡C;!hGSoDTp_ DP]{="$x -B~Ȓ\V$$Ϊ׀BI/4Hx%iQe0"7V"S.W6ְGV`ŐHsXqSw`ӂq2ޭ%u=/rR D~w(mAfk&#F/ ?NaSVe2JmCa A'-= EuTيְ2'bIgU: oYCQM8z`x@wEP&`(D&k}2mө0)|>+[ֲ1209LjȨOvh ȀBJvBfxHbqab=H3,%[wЩ+݇!(wԲM6?^-˪g"J8;{rn$9* 5&\r!m1,{sor"\sl RM 0s{#\9t'' udFlzB BLlZjP2/DTA:'6n3"06jDj;_<*]NNG-"Jhu6y)j;ɩ8=+ⵄ"/Jjn3 7Q15Q ZV 7!tv`e oLAvOMfk2dry]PtHI19sU7% AdWt sUbCnA57]@gFXA]VGhr&#!L3$^(%0^%4Xq@Q8ҭE^`pb4T 0C4\Uk+G-o1*&ZϨ|Q`,̪Q7 (h['4ڣs ^m`3s3" 1f}DHyb*ih0C-@᷷fAB{H ~N 6<& RcI}16e-K6wIFgwJY)w~,3A$ +Nퟌbm>Pn#s sdv}g mH\AH$Hpo!vE7J)S0z(ox񴬟{ G!Á럌97VBJLC+Q#Tjb'+A)Lmf8yZWMN=0KZKhԑDbdBDׇAH%4nGq6FzdrZ "fjZ?<{@4JM}K:_Enk,4(\=1Nk˔l 6#hA#Vr9|#kjz9AdmH,3?YƞSOTUh-e .,G]G"YPr"#]q0VV/XL*^^yZ%1<*`ל$y-*QeJLn@"_,9$-!0,=!$a.eG!kh)"ZP?AY(V1L23U8U=,[00}Uzv|"u3!"&0ꒁ‘Otd>>X22Y S[N<dd49T*ਝӚAsMO;ёʄw#pm\:>ho`Eq nJf~g@+m\J}c>pvrnoΰGoo{DwOL!p ٲ/! I~䴏%Ȇ <*m9d ~p͆J8bm7ȋRɏy-wI:!]U<6xiU"-yzDש!aO9UNF,1jNcz}G8%ϼ'}Ȏ}2![y zy ddj~Hh4lmswC*|qH50ueɽ"LDLqɰ@t Pz;*@P- ~o 3 E]dX@VW8'E&^'@*ܸ"0WDPa`vяֱau2R[ Oi=pD~rZI 7@=@%q2ceu +:V8aH'k9o,k)P~(߭g3d>]f CSLb_\kܺggU-E JnMv$b'd%R.;Y}ڄW!!7[ ZyM~1YMDyJ;a0+XǪX#Sx4t@S8V*ޏ 1,`Ξ#! QXt!Y1G[TC02D+ć!mozOG:O1#/yVs`D}H'-|~q!|[rIR]n.l3Y+)5pOe<:@Pfz y*2rs,+#̍tEE<+MDeS8![9' 5*ZD76o1xoxHj8.k<^~Jԑd06uEl *4TOiUvsad\878b6CGB`v$ⷍW&'7k# pƜ\"nbD e>Vbö/U?єJmFP@qV&# zёf|~8 Uy< frhOypQS&ճ'k˧f qeoѷSgSGQrz LazA3H{,o"ۦq~b[=X1EбWقb=Ajmx8P pȐ %WPxFmC&#JCFy6jifԴ@W27֬$q0*r_pd@EnGeYpk/)JY6heuYr:~ܩ ;ewFQ$ @};4"*XTUZH#D(dCs Vux#{.S&*6<mF,ɡ xujv` ";9H&.GH=q;~ 3 Ó3e,/.XV󬌑!p|x*VO.m}474ȦMmŜW>2bvǦn=8_UId;|VnB+WƘVV_24_'ǽ ^-(P|2k&ƈ6Rqfy".pe%UvG&6eVDJMuN7%3HBHT2~ىӐfBknj{ko.)Ǚ'4#>14FWKz_2 !Sph-ws k(f2J^X*0mj5g S z&cj c1PU/xJJ]l\ĩ! ]H)sm1-XD v1p^)V#XPɗ 8Atl~+FުWSf̑]GbbN2 Knz$Nwߌ1^nkpe'q|U\m-p9~'9vYl8X2&1nbM d^!Yi xPK4`cSǒە!00䩳?hXɈye p?qMP܋WC)a̙MIH!C4BwF "^z ]EaYboXY^%sIS}e}"(B=`#RC᏷德&gHnz9C DH`Q!O O'>4VJ:+D vIqlFtn"䉥IŐcX_R(d~p0Dx‘!:M'!;i JX^ZR[L*/% u;Gi5 14sȂ<40C|[d<8Q N9>=J_VLS:O==F ؎9~Cdȍ`ф'1IQ(p9kboxwҋ#j.8Rr3j+?)=&E4d:5ˠrtJ1?kB),)7U8jT xoєV͇9#kvi WIHKqS_Q/@9=Wz AC#9l0j zpگnih MZN2+x(E1q!ym T.LiswZ ƳSf) 9~tǓ-\|J>._c4?5b8u8:;!#>Vc%f9ga /SNqbs2TA ^g61'R(Nb3r3ep!=x鼎 Qz`&z7,İ3 xeel>F꫰ECb=p%l"VDCz wQFçY !_1Ʋdi_>p$_1Ǽ}|xļ/{M%Ad#"xeOm/ AY~.!>2\PĖr@%)Bf$:bdGyxG@>:Aì$x43qd If43|r/ҕIQ K*?CQII³9 u&~Xɛ`2dۅ2ŝf/&&4f rlKo%Qth '3bMaO̞]T!,&FtGř$IJ #h/-2)?y&'ǼPԮE]LxbNh!]ߌ/1& C?uRc1ш,bIY0ܖ5N=ub]w(0n-iaDS Yfп  bx ՗naƺ s5Og/(x:'g\8N\}A@)1'ygN \9H'+X%-_%KZx x[9.G잤/de%btɲ_rFCd !>HFXKti['"n?1:;P(2 FB7@GDR`PȊލg F͞7$# 2+b N";ܿ8a${WxЫ?h4lW4Tcf$,wvgkXD/d2H$V;q"t=#=p`.|%dQ9tpquGa:^ 2$/w1.ia2".j'Y>#0 c2}cFp P묑W URMFMY^@vo\( Ԥ5I֎ޝy6@a4ZrKC0cA{0664ȣU셫oP 3Pڢ-ް*yL7gS33u2 s%r"ħ^bZ׎2f;M %OMʮq! 4F9iG9I"7tBI91- ?u8s' ݈?1+" ^*f8e!OE@j($v%'qůPRv<*I1O`]J<*sk=yb޲+;z!X1ꏌJG,\Ui:07;P[u&kŸ'u78mp?<pQPtc% #^3iF$'d]4X%D Y@#.I("7*8ɇַ-8؆B]I;nDK?m8%|7HB [ )."Ɓ7+"bF _ }ck(u1'ee^S)Ƶ t1S1  zh)?&*w5!&XˠeO7)~%r?²]&YkF[񀼰Lcq{ =g b5#AYDVl7oob"Yvq3~2VڭH#z~1&_c||`MFeq8zÐܐTb/Xl2¬hZ(ށ !'q1e /c>3H$Jރ*?l#/ (@W9$ I旳[(r|PG"x cջ9B1:#XYqnM'%~\)J/Yyǒa7PDC2hK\U9; +s7somc"VOZ*ȗu$.AztENlψPND6HNd C0JTW3q@X:}1a$zr8alӣ=rMGAN^2pXI)6i |`D"&'odxK+qw_ zG( Vn+OfFdDw#Zn215(d 0y5p^v;X` ’x'Yh g>kNfp0E>yYDqc~aK'xl]f %1A),eK"0@%4e; 0H%q3AJY ZIСu-ąq/?LRQU'p_l SYJCiL#y'%-/"/G2j0Đ`d\ 5VJKx t$m1.>.dF0LQQi>Ӳ'8 L"ɖ-ĬH%sO3YR!x>~#q\K8#3xJ %"AIL OY)#I;?8Uj9%"m]ђ? x#94&j)Z7I\]C;&Ϝ`QDo8&Ee9n7?Xk"H8#2\70jKr"/)<짵,p}ٍ`MOcydjIHa/Qq" ؝e,Gj8ƒqlPS)|&A|Y&j[IXKx$nI$6 Ve,qG5;>1;:Çd=ū .bcS 88$GY~ébnLpt7<\1e⇒y25ERɜfAHZmdH[j4ku ƻ H1>(Mq$$^B(yfipO2zwFU~F~3LN#~x 7r'Y EPBXXHtsrۃ ,RD4LBC&IM\^KcbU jH92JL00 dXdDr r. k.6R k4 {{c?X$6`.$AYi[&z Ȱ&<8uC|K8!Eo@FyɕU2I)&JE1%H\e2 3&9[#QnbWlg}q3}ZMd)r(36BI<)Lm5xᑷ<2e l|Z4bPdW2G[(DFAϪBh{pZ1 oQv:%c1cfֵ#0" 'hSqZRB;p9$-8B`f^UJ%(cThDDH=aVb n5]\(KV(չ>{b@rd} 5oj$9,{#XIme‘b:= >77D Dw8+;T58KYH> RuDMN;LpۡrNd&d;<_QΨq[\,Vx1 uUkyZ;|%%)U:;U<`B}Pm&P'i#@W9nf[tC&$8=yYjx}b%\c4\./ƈlKưnp5Ȃ_;^syXq*C{&x '.EVMudhƀEO吶F@:\L}MS0H6km<-&?'AK6|a0>#yJ{RQUj !*ۥs3DuK$fqO:3N9d~X +J5o\(u~t?ES|&(  9w;?&mY97 #Dy<`&S+6e7ӄFTl&Ǭ(y (rùmk%T1ihSamu(w qI$JZ2LXD|` G98uiV}g23Lb^0iB]לg@bO;*%2+"0L98bB2dEHU{N9~QE2KL"Db bz*m~27iY>*q$Δ-O3?d9)\w#$a~)2(&X ?2SBSlvUBW AvQcx#>B<@zKx5$k%?@Egͥ8ޱI@4N[ɩ.|~q5>gNTvF$x_ho)=8,+߬4rd>Y5DIITxȉ,<> Cf9aJ`{3,D\:ŶxAR-ɷ IdbDZ\S>OfX -YĎi/ʩw"Xbc``t-qY aE`9M?@P#xș0uZpG/$R; n 0q]`Վ f]v/ԸIo!,{Rf/`$6o.WR1h9Xx -"FXVw_B $TW-h$tREtF˵sq%%$uJ>h H#gkG\Ca 1X$nd1ц$ GI2Bmh:@T@p4E{LqEPFJj^2dDiȒ5RƕL2I0= /b`X6#W[J@0u R4aX[J^\8 5lMZs``ai'x@Do˶2YnYRAh&/1G"iFi_W JR;zT"SDyS,)C8cc ֜r/_xsoi [Љ {xA)'Lߊ_@:\$` o|$z޹Ūxn.5 BL&qr5uL8w6Zy$iِ g]<9i 8&SqmFZaO!'9/deFc8(bJ{jg*)-1HZYbperLsȌ`SkBd|8JҿTʓ-`$ 8p:WFNU3/4F; C,9$J$7YHC8h>0 10 DFOz@ p@WM?aiQt8y#%qP =ci%_N dDhd⣑\/NCb7oȂ~9c̸as#޻ٙ rxIJ+@S!!/9$ CzYODGDHЍ0#&߀8E}@R]%1_WXbEb׷2ec}J%SnjҼQaxY3I`FXM!&"G!"ы*_TgWm&*5C(G~[v? Lc]ĖӅzgw##/g$ KjшQ<;CFE) \l/+3ZØjeuf'+M'p|dǟpI>6@kS[Pɐ$hx a eys4J^Б'hKpe`w$ Cq=qb\NH]Ă_9>,%Ǯ N2,Ww)S =- CBd se +m*Kj\bu%B0CIVw%frXCDdch4nƟ.$/l_ ӼQ{q3@}yYh]s Tp ؑ}^CV{`8#bh{0gx Ѳ8|cS4y\D 4˜-69f>#LHEWQ.:,6ی,y?30nE/8icn?Ӆ}`B1zЂu_eՙk>㺨h +cY9]ƞiQ# AQӀOQmQ:/gKQ Obuɓ#G-+%=.YA@`%6MH a$ 1z3qڜr{Rh8xᳩ iXH \AEH ]ӯ/Ĝ !Z$b)q$*zs qfRN ,bU!7E@4_6N(_ӁY$cj &Hx&.NbVN~O@nw갊0A0D79N2dƒ$zȰJ [yzqauգxӿb}tYb4} e'z /y2N{I7| WkɛǡL>]-Σ$إ3QQK%?539$D h7u;mb^{"Sl )眡*~f9OargsNk92U2Pu7};>gĜdۆ-6t0mrt1cԫiY1%-iweL,XWӼ} \_ nZOx\Ro0TU$#"raM9K)=Tc!M !.x!?Z`"#ͻqxcxUY:0'7{=15H@3Iߟk }G~VTE<5pa4uQD^Sp񺃇d,#C9xѪSg{|N<:;&iZw!EI o VGaUMJcXwJ35Y%j? L/LcXkݎ~rC%gZ15ČP5Qvѵw33#*=8IAIda:X8 OpCM~ёHJ^18fmLrEl6Ěf\X"FFȡ NDmJ/y&;}V6Z~1~S-p b&fa _dV(1ˬBRU XFxbCc @DBѭ㤠.Yoj8Zn]q)R3oHx#*HތN#@0wUZ(qoֱ1&GHb0%%-ܣrj"B*w @Q*-,b!0TU6墺r7ṟ[Dz80 U \'"~07@U'y!n?%fɢrDEl xvc XAh#âἆfZǹ$z^声8x@H`pka.'XL@:①NUbE&FG$D!_5a@On4q9[0~qxf*D^38_bCe`$iJ D=evpb/Ge"CN;DMkO'E 'j8hE4M=(ޑ<>0Kx)"IbU'i&H7YPDbόEYG Gc ze Z !<5/;\mдY 7ca]z^59.KNqy֌6Y2U_Z~q&!cX !X~rhÉSgE5`Yμ9MȧD7pSO,B&A'SY:qVOG2AAl9W#I0ULd Bd[h+.# _čpr҅QPe;,r׮r4*(+=Of8?ܞ4!vE=Ih8FE윊"Lbc%5)X×3h `]jxroА0~pq ْ̪)ƅMumeɐnb op۳ZɗGBG5]Kܰ+k꜏Adpǒ~ðN9I4"b0˾k2tY'2~uhĐ{A¥! GB Nxb;q o ;iH<+,Elm5ƀ8p^.~lno tB6hIk)cĽ 8!vM!g }Em6TjWH yެCCx:Z>;LmԓUۏ }驴\/ŋlY!~9O;m9B!qmEf9<8T:0N\O G_;)5ob9u[ l~*<_债=/t)&w/p\Z7cP6-xeҹ U%]񔷆8e<}[ЇX\= 3Q8 ޡ[e_& sA)d&c(LIuY(Xtݫ$_Z¦}!B993!gzf JւTo/;2RQ@7wjI_^2'2F3][sAV{!-+DLEy7M=۞璥ZH+ڀcY2⃪i>.xtx([!o򹲪{=m̫a!bzV2kn}Z[%99&yzٹxtG<:ҹrJ9}|Oy]0`VT|$%nOw}@y|z.rdɧ#dlYP78&j_\jr^ vb'/ҵrr{EoQx_WoņMj߻#؋$=0d>\; H)vVٗK x(GlYgAQ]r㯦(5 0Dbv ˕ KƨpIb{Ujs}-G9IoUWQjewByk@|b|<'E"QSmd_I6nȦ +ྒྷ b10f B>G4Pq(u?{ V Atc|ǑoQ@= c RYxy&OR%t>-iggKf^FG0#*`a*Ŋ$$YRVix>5*&E2&6iikP{MlKPs}m\"6=jsTi+UN?|z3F ᄙg (rry0hdOkeC9u܄bp"Pb*`MRÛShuacbW6DKV`Nޏ0IUϻ7$5~M<@ ? !J~ҝJJԕ W:!KpoeTB{QCA-_4bHF#v!Vk \cl ]y1(8xp_3SkzAߧU] l"qܓ\I3vC 8Uc ,U:..QLoO1lܜ@Tc4$*/KXÌѯ2 dZ(?Q{s9 2dQ/>`,34#S_QZO?IцJ.jZʌE뤙<rQV'iua1͏O0N1Q ws҇frʯO9L-YًYk߬/ϓ:m9.WDdFnIE-8#3`r<70  [}OwZJaBROXs/ڷ/iX?ptMp'^ ?D*z‰2Ҧ"3l pLDg{LcC~6QeF̋XĖ~V&#wHπ M ݚ];39Ȇ(M,X΁e&ZjB"b`: I<Z՜i Ր8-Ējq9p?ax`U7+ Ӷ1DsCpd5؆,VX)3I^q"qH@4EO6_-M8Pފ6ˉFcf2X(Av1RTxFu±5-ӱB# '͞X3TZ9XA2oշCLcmp+ c;t4DVx/#';pxW< Wb6ݜrf~u_}/nzߚc_ ǭ4_6E!U ϫ=/<\vq`ȋV\{%&< I~sjoWJHgS\ؕDkQ' Km„$QsM|7p}CQm깇ER"ޫZȀK/L_&Ҭ#02 D(\Vz$y77M j t0-7Q H}ȾZJ|:6X-wYT[RLii5,XonW4 nv؅ԁe>nZݸ&1;[Œ)[xBXQD-:G2lL5 E4J&ph&.93I9o' d{}.No'y6!vWFuOJHH$rEC.uA_<KPdU:ƧPJ߀K9p20p?J+ynZ@6>!r=ݧs[ s.G"Di;;1ls &|H>p;XYM-,$p,eԯg3D&gd\4ޖSʢ$k@~C;_uUUmpTU'Bn2`m:'ԡb$2NAk97{)Aa9e/膜r[z2~RJH:>Ep;8fCH|A8#,z6iBioty4 :}QȌL*ɧG_s_Т轻Uh W4@pf>X5o I bpɷ&Hj8[\fCɳ$8!0da_XgA0詘n[GOܡcS(6cda=T~LCy VehA!ݾY% 2Ъ_Tѓȡ{%c 7 g̭'v;"JI`uczL/KwSGt$㳣!#&"5i4;i>akz&"-WxQ̈́WpUU ]`UC nėǴy< {J;?3Dt5ebG8׉HG^;!Q ZgCb`OS&> D- gǡLqR_Ci@a}\l4Sςy? t.X.X:t>vT'a(T` # BVMq+fC-Bp1Zۜtu驃iUIPNT8 lY>' t!#6hk_8\ۤf~gEffHQuM2~¿ZÇQ=g,Tl+>=Y{i7p8s])Pƀnfu|+H'!ޘ8hx19vBWy~ei=aY?&!1AQaq?ZS/\[J1.W+vP^5eYx !~E~|J80 .1?h=}c GQ%$l]mbTvbc2 _䜀qi5A߃}aEqj7aံ^7F0=Y>&FxBabΣa93R˷Ļ "`gԱD!>ЃxAK"%8#b8JAJמkFJCPҋ .Q]Da[ #Vܳϼ * 7>Z` ߔBݔj*ZS ,X5K5[Y~wҺFTd=L-0'8bQlוּ$I|ߘ+@4i2+c4mAul( v2̮@n^$4b.QW+SEV<=* 5()1]ԲGO% Qze|F3@}U9􀡕LmPg~[,9nL>\xݏKtܩZj9b,"5LF>A\ܺ[|))PQ]GqϵLF$yQAKvBF:b>kjJ lF6ke-C U)x+0,M6 1K:.sg2v(ؘf *R,bV؋q-GV(R 98q:}MA̽fc:JTJY$sUf"Y\Ƿ0h#KnrfGR3"[|F{(#0𬘨R@$E™{zC!PF3|znt*6xBP2J1#W T 6i*1qXK;|2|^7CLK"爵̽T @V T TFp9saĴĺў pfKjJ WF\ձ/.53&DRr{@u|# {VC g.!RURe[K41quoQ%+cyk5."?J UE,0wpcܰݰ.<\?%Sy4sQ|)_BՕ ޞ+t^a.Fo|1y[ aPWሰı/rF=K bVR"Wl! ugSYهx*]Q.xd%2bWW3qPGֿќ6[FV+o*7VBTBhxX0EW i!OL;n|"p]zC+19q-{GXY0fLcN)8\P꒾/1ϪX 5Lnn> VcJը1WuDw 4\|1Qn%<0~@^yܩlv`vXf9& %EħO]AΈ(f+w rK A[\Pm{APE &%e e pqC+~!,sx+/*Z3i+~4Ok0kLʚY(ƽKU(uYGx߉^Kǿ S"0FAX"T aw.WXZX7((aܤi@:TԔ˝YhKokzܵH+e+iePcUF z@ˈU.jk 7C7E#i,hܭ^w.:>%>bFĭ |^p\.M}W+uA9khf85Wifυ®nM( b;*~˻`E%eMyY4.o/@-@];ћǧ?_X:Vp^ 9\<9n`F!H6M~ |Wj9лt Y#5>"]*SEFu1JRA(akq@q0јEα/&" X/wp67ngmFϩ xAwzfW`gTo}}"&ZMH֗tvFx`oo0o]=x EsWkd'A/ĩGߑ](mb)Uwt+TJEEts2!b?`h @2@QỸ>OzDqJɯ_,. nw\AlUn2q/7 IJ Zj+${U9ʌq]% *0ZYӸ0%ᅠqAlb+#!ǭˉak+ 3 ۟R~,J(5.5HD8D.Y%i8r_v\,."{_| 6%P xVbSLEMx1% y/X\ 9W7^1 Y]_}aPp8RԾ~zqf]`D:IjۊtxaKVvOxEG@\1GpW-^C?ip̫F Q$qFmqja*x!epwu5 -*s4KM0uxpn!,c[cL M1b+=\N?7=aUcQBjPy`8ģB3SL x&jGrh0˲ݼli aK}8saj6ŬƆ\[z:")uӲAӋ%~ѣ=!=R2J{&.J|%DhˁZ~xvǥclϼ52sg vL#8 }mz@j}ajwŦw\38`^#Vԣ9G/E&/5Z` UÝYMI-mp&V~;4EV/*9wuN?p?) Xh1!l̵F!"V{\|Rס)BT%6Wޠ|~匢wN3Q1PbMO,eqJ__ϋ}#{&M:3Jr [^YnYm1^h%OafLfU:{eህb4Thvh2<_*} q(qj%c̢sqй`"X(S35 fa"SɨoCF $=U_\z/:XЮ#%Bs"w׼mZ KP G?ޞ^= 4ϴ%*)'QZ/ 01Zfy\h}3*İ.ѭ6"Y \Umc00d`X!)zJVT딃 p:81Y EjB5yb"Z6uenˀ->Z@'{=32FF"oߘՎ_0#!׳pE[ ) #8N7`RYE -~Ie vwn~STJ+1+ e a *1Ha[}azu 4]Yw ڪuv.Ħ@TF)c- 1|y`x5*QtWzzLK#DyE\iD9 bpߗuo'Xg/ 9S>BsǬ3n%\_> F[0@-B¥B37Ty# ~%1i4˴ܬȀKPy(tu0Î<7XYvg{Nݕ*Aihι4q!;@?ٖXF^5\{C\2,wM\2>nP4JkUaLZ?vأ$q^mv)ϼYc") v}tST-b* u+M~'ڔWa]qLL@Ctd5f^圜rן sMLz*qVш dhxC֐o, h+ܬ2ysKq^N8+l WMfI_z%m0rKt^k2jQvjGr@\O_1N%b"` 2ʬT Z;\j# @:R+\ %:( +q k,B2TԠWDwfwq銭P !xoQ-ϔ6 Fʋ|!莡7gQN0.ӄA(443BhW4_ gZ3laԳaPn̲BkOfq1 gL})ۓal=eQZ%TGazOf[1:S3S/ sKwqSxUGJX@-oPE̼Q#Uv=lc WV` yFЭb_XdS/x{%18U&\x9s*v0us*]btU Z!a:/p3wkPDsp/]zku-UF8#3 F"1jb-Zs2Q׉?gRERN{E±^ wĩ/h^zЄg:p|vV~AP% Exj,$kġ%_٘Q sDu (SkisN1舑Ck ~ϧpvx-VV#/,59zG6g7=~ aKW̥3{aGlk%.™,xp#K Fi/U0;w-ŊrZYDmd$OHd-p!g ¹0Yr p|:xsg9A`ZV ļb TJw(n!se+zDJ M)JX\fLjQK&4,sTΛ 1xb DϣԘ]1sk&b X~"p^PޣP`2$dBK2hOHT/;?XV<<3O{&AE[JĞ6`P?$ sc-Q\Cr?ۍ8%L@K>ت)swGk(0=%X0-6&&տke!qq^Ɂg*c)O5OosqW ބ?508gXpi[ꦆjFsU F{D(13(n**V!D‘(߸-:XS<"|Ab;}(2Q,k3B1XlmU^bTkQ-ƊGq Ǚ~Jur|pzKrX3(;c*1gV޽?qCǤn QDZ$bY -Ķ lѿ6& 8Ee]HKĴ_+U\|1Mw)Th"ĵpñn[X @0idLX^.D0nPX%":`4yK2UK q)4jqz>)>eu>3 fSO0bD@ܭ0 3qS}2V^CW!Q'8s2~]S-;K"Z#"H8UGtd *r~%ja2;0 @ 8im}D,9-*L`G@U XPmZġbqm[*8פJ\_Wj_ QlRE*xr7GPB0DQ[s\̌r2)K/ ?*r S7Wu~uPƺ^n1d%waFA 40 1ŗ$dl]3rQ`~q.c!ꖫ(S2 `a@;ax )r 1#5,פ,r*z2'+uB#J/13fX"f `0#6*e^bw_*ނ0C*z9s6v`8@Zo̳i@Wf: cTr {#wnU_w9"1LG1wFBFB&}AUPq +)>?>򭂱 [vKT%e ?D6ˍaʈ+e*s- 9q޿03rm._R{[+A(8;lt ]Ɛ!\ BqDn)u#$Pt1r$ymM|ߴ6b 2~`#X"2 ;7mWbQ柳pe,3/9qsӈDND hTd"(l7 *J{Q qٖܰH\]4&0L1l ^ %V݊mtB̵y.99yp>C1u54!-MES|m8OPT㻋 H`%q\dx@Mn68U18 ehe͘p sd\/Ote)c~q 4a$^j [\zBd_slFƵ-I)b{j>8uR-OSF_&1)¢J]f%2Kݵ4^KY2d] ߈@SW1"_/-k%+Jcqpy9JemRCܤ'pZHT.#tP)[F Z`$[ZE+1.=Aj(,MѨ5g!5ݳ0yCՙAZO0b*pa*ymܲODQ1í0t9&TfCvyK_X dy,@ߴRuuQ$~j_U3 Վ!L院y}d1%:2(.FP]_xi28V*3Vo=ێgCKs}T &!suM鈡|\]Ks {TuΔ7g]yҕ\uPVuh;&bG銼=P6Qcu!M5 J9xhyHp˥DQL "WV ־-Jw.>Zi^ӷF0B8__I_|&F,GA i{buA"RK\J y"FhD4cD TsNˣD&nbqw۪6Y``EM-J70X\z@H`2-.>en: h_0+.6039x%'2Y+}zf,H?ѻJEl>`{:(}>P~!g.6'XET5Rϴ.SA\aq\7xum@_vY1cYRjSAq(*u12un4 oJaNJ"C̸"ЋYu{ İn)9e \^/RPס̱rW2kYlwr93}AVLh PKz^^_s+ԿoӲψ</M\!HRb VACL+f5҃4<ڔeK `9< g/RW*\Y -srQ P_p Uxq8˸GĤ*Ybڬ mr5P,UAWss (Tz/_Y\\1 TZBvh090r("K)\VZTN+yv]J>sُbV-P{먁}>< F+?Z/DY>=<z̷,0)pinKa2D{pQآj5AzzVK>݀Q\b \'b68E+dM}"f F#C mm.PQqWp@l`ߩ.b.&oX >`pmZ+]E^b#.ꘃLwMfè@0 ϝ sl^]ܴl  b3OErSmLPy/}@Zz̿q;,-zˍiq`㈬7BuR?ةK08b =D]c=NJHjgDI{kU^8 U0~zr9d;|CWTq6aZ^ CAqUfe^1/_īnPV''w 2g%[|:Zr!"so2n`8)QaWyFy%f+&,TBÚSBP(YrD ( wGR c@_ 3l@dw.K[ [ԫ/?[TN&eDymyȣ8 Idی}\p3Wo":Fٯ]w7iY#K.IG/SuEn`!c5(1k0PKq.M,qWRO&3&3h1nt2eSa|EyM' SC '<=@Mc.j>/LM] k~!HBe6szLusF'9aV@,y TbY~ɨkJ)ё륱PP m EMU2 **2$rp\Qy%ωoG0]Q}e#Q#j͵Ks^{ <)~.EOoQ.r Az{eL8v@H[EuAњTK0+%=Ul\@[%\o5 jѻ7W ]ԡ%P_p7hϞe򎽷а=R1zc>b`YbQGw)hrq*HBڻ j!w%XUw)uz/Q@͓,'긋x”1. 8g%vGxxv["n> Ϊ`)1Kne Y4-T+9 ,1/1EJz=/$we}fݽ*n Aqq,&u}XFT4slD!%voK.ʛKYʈ(ɲv%>%)6hɠFz\/!_յܰFzW6cnK0^~(SܑwIvͮΡj64w:|K }ct\{5xm5ٛP@*9MyֺknMN)bwqHsb.%@cפׯ0&yVX(gzٜ}x?؅ͳ̰W=edUy|A-`(#R^X 5)aw3*_Ia']Ayh)0n9Dg>nPm$D9^ Z),@qP+ @h&wBŅ`1<ǝd=pkщubpJvMouEQ,>gBsDuƣˁU MKU%:).2)2,Qg/z~⠇@  BY󌑌Zc:0`pȦyCY%d/r%Rdɓ&6AoF$ȅd3*'x,1 ][_!uqȆ@@An!u%Q!TG8j(=j%c, (LMܮvu+)B@hLJpse0o,VrA9.ʲ8)춴%.ePAw HAE\ Vՠ-\f9yP)`,i%\%VʄkW_H#TR7 N&WmV9 xٶ !2Y-[\n$xP86L.UuV1jbaD8Xҿ0n. EUE-%1h^ ^.SPР}"1#X0]+- 8n UoQVhe<]gS%$Հx),My{N)OaiK(鈡.r5E= ]DqtPܐ!eD$5/8&,6\A=M] I E1{ JY3"\YF̲KU*e"`$Z XP#^bguQauP']=%JqE 5/nX_7oON)Jc|r9jj 0杧j5bU#EIu4dX[+6mw_o  bɨžCAi;XU ;+PZ$F69 @(x ɲ4_9x?PU є8nXxR~Bdq}b 3]/Wj6Ur"Z*YZ$@e8`Ӓ%L=D/DLj% prӿ!"0/'JbSwŹ~o&!1AQaq?\gbuJԪwĽ[:r`{ʧWސ iBKD⠡ȑkj*[anh⠶k+@s/qPf1}P)NeAX5/W̌pnbQr(:pK T]!b2L°ծcOY`Ȋo#Y I ,>Bx]cRYaJ_˸S7 *As-]@ۘZVTXQQw 9"`q)[V*^ȣbLS0 /2 XD8e QFvcr +bFn6n n 4Ol+<ǣoS/*(AnRHb:0Yvڋ r`571d7eǵ6˜& U$r@` &ZBJ UӢT l+GWܱ:Bj]N TX& G0"Ab*V4" ͿSC(sjgx8b 3"7짬b,Gۼ/+Qy]!0`r=)|AryzEi?fb4(ZW_,s՘Z_;'67&0,|.bF B=}(9LPUUK}U8,:Jmf@uP4C94JyaܲWT 7}"E+Cy,:a3*\ y7{ 1,}g鸌I`gy/H ABפ 4AkSjn!1Dp3]H)WD"6 m 9og7%eXbf\ˆ U-&oqda4oWDH5 (쨀q,R_QָM(8IcƸ!A ɸ +ŶMKJ”$i|+1(͈>YṘ2ID*Y[ӟiD/ HmӪVfHZJp 7b!%.c,jvn]fs̱PY e>"&)!c"l PUZs-QA^c@R$/`Jw9>S|F0,cCgRr""·p`8r$=a9)&OFk1;]/JTڭD+=F(G0bt?7pn<Íg0Z( , S*RlON}C%A;=iYȽ2Z 27jDζm8Qiw״x,ty{lƊ=CCyBT4A .)FZYd^OTh[rmCr"(݈VMܯ1W_bE|@ߴEzN*@@G󕖘Lo%YbHs"(?J[]~bb)fb ƒqzJ((*Cr](LRs8U. &dj$|@K  ZYq,Z.AW^b0D^e{%RrtX`*>e$~p"%}處†мtrd*eß\0Wjh-̌oJuh̲0  }Z|⯦, &;~a̵ G-[4>P]Uv5l)_hNLPEcK  1.B d+hŘsOLƪb bRe)hΡW$pQ6EfY/lCa`?J± CxE-'H&劬!E%6!!rnmrK jX9ǘ]n>g3py0^˘r+0SsH9m'R) Sy0}#U c#*UA]۰i:YSF6Ąk"NH<*fh\Z!BCѬCRUcSԸ7 d&x9es@ 3TT˃W9s3o'9o0ZT2hcmmjtj4e EJd Яǒ"j\%X9VTcD`(<<ĖB}eI/Ϗq#a 3+=A8AWN-1mb%1~n,z%.ji?(4`a]pa>bNQH-&k2f6{MZV[ь%esLuo`[Ի{֠5*4a_p:DpK%FpA;.2s2JЍtr3Sg0V%}F Lu˛@ _Aȟqψ![pъB 8,Ñ0Ѥ+WARźz2uvASZ[(g~UUPډv瘵y9jbØ@94L5ĎbTpqzR5'n[)yr̩RktfӘ]6ϴJ\^+0x*&.w $oJK7x 6oۈh #lSXf N}\ź9%*f\P,LMS6Qu01ƠGG18XZF-Q)S&PF! kk;nEyX]o>p0B1`Kxu `ʘW Q%%!U׈eFVH,4=RoD*(\{u1N%h<~acb- /?Rk@ #„34Z]jPu[2%>^ keUyILjH^lXc<l6h+zu0 Hp\s?GJa9k?ILfiZ( J:JLS#Gva[Xa^/1\[7 SbOUX`#N"5 R_%A f l+ S׹hD |FZQ{@qBb Uu/cXJW0Ʈ BmJo1m2E8_0bK͉D uĐ1_1[D/XKNjr0\XQJMk0AiSN?F,:^݌Tzq_BR]j]V*~#T8g@hoJ!D[1X-)̄pˮ՟yUEGS/P>KX m *&Px*i%X1Le-TR"my!6q؉[ a]@up&/dDJ)jBX02r )czP%Ҙ? qN`=${0bg="87(LT&J }4Y-(2XUh5O u4; k890rۄ SlL4nb.[Q)h+=X$t02KFض/pڢ[_ |D@ca32y9!.ӈ7O4Z«f;,.pRtzP\8sK3 SXNj)sfE'R))cr»e %@Ϭvh*vBD))u92WMC=g;[1L?wOhY"{KH=#&cFKJaS)BʖXX(D`1"%&0<"*!.df4Mi[QV:6Q ٩ A11'p@̶ sb@d{L iMX2hFyj j>Pae 7U+Zk}Jtj*ܼyY jil2s!u41ڟi Xuܩ d6YV F2V5A.n-̲m }&J aLQR6}}X> Rue@"E@arxq4,bljv.nZ®L<긺8$W-V )JaOĦY'M{ w H*#uAu#ܡ_p ubMKo:`:f6YdZ]F7{KDS?8"JQnD suA \Fb% f B [R{eߍ dWc'wix"# Raa GT@hs8qk&@AQ,b^2uĥ+D:51eqd2\hZ"=幦2=e`q,C$F9,gn_^o1bf,QFÁ UY $Ӵ5*ʬ'[mX硡AU"/cfP"˖*r:_+ Yeܢ ;ĔV;آVV7--.-Jw?2;щ9bF'x8n5EWf^"XX4dQz+sl@5pb((@c`pRpII7#t˟X'0MPX1T4uSqdyɃ1'%VajbRMu_Ùo {ƀh!Y]0@/-0c&ÞT*c*.a1  *-W//)ҁt˗ũRV>{-8bFP@[]?' @dbJ/VD](9%A4AJ`V.!sۆb1CQ^] 3fQjO=@M " +6,a˼j\nܳrL\*+QcQ#ЈVpu EDVsҬ! #1:F눩{̼X- aK<5~a6rBJ ![.2T[ebɍ;,<{*P-e p/2/HP͙soOϜ*ǡ [ZODAiR)v_ޒYG=bAIȄ-.P*e,G,Sdw\:%qS6n)l֠U,)  S1u'hy72+=,U$\Є j5U4a<(X¡:92d&7fKtAa^` +#}siAV % EV"]Vw/Hق^Ԩ]Pjli$ ^ e`8+\H 'P&E)RXK?c\Yj  ʮ%5!z -|+󘩺f6q z@N:RzEVPNx3P`;WTb5)G9rGU22M7b9769A /HuTbTYJgBDwIjE(5LF;"pCr^ʸ`!Y1pج6YPYqP;])XX *Fީe;Dyy)elѺ6N,(5+S ‡je&'oYk:ss']JRYx!EEQ9~8 р*dWX1v5h fUcLB"nZuq8o 7LnjRtiP^eKaPpZtn2,t-^]32*ރK(S"m&qh7j1-ku`oPqIJeLY3KElB.$32oVJt"6 &bD&YcPioX֜ gy`6nZ 8@-70ZFVPU\Ǵ<.Yh*Yԭ|@EakyKq,ڞ9{RnRSjy/|:hQ-;rƂ6V۔X,l5 mѻGDVja2򖵮\XQ}ca.eڧb8"C3ho1e^ ,;.R'w ,2ījsA0\i`9w2*[oᴴAl̩X-QzD-H-+dVp$)XPH*/UK3 g mu[, &b؍eR^l%gXtey>&sMF(>aAKI.eRY$|bT-U CF^/9֞F%YUBcĉP+s.kOf"s -;KZhař<ܰ;`lYәK@bBp GeIQJAE%!m,WjmB( r9?RN|M|0ncZ-}S?5#mKZB̡R֍0VV [ %PUw2mEA+5j՟]ڭZ5.!AayRY/sX-ܠ)h״kT$@ƌLLLM{F f%ظs-b4˩۶#Վsxce:{FN1`e&Q,jy'P 0(DGuzK(ŵ2 + W}Ņؕ(6&ۙruHjaљ&9ucH&'b*#hbSSPPEt["۟H}%WS @#WJiQSA Kɴ2:ڙ.r \ ae%A,M@+`x*✕M':H ÎeH%ܲz17`\LUW/2}w~ y39AqNܣX*ާ%al1+-Q; BQcھ٥S1w  6b*N#m]cSuX^ܼR< C̽V%w,Gb6&X5p!+WfeB/.8UA* kظ60Ҕ8. ݥJD b H C,Y@ܾ{3h?£D/A)[ ߉^ M 1f2 KF/\b3SZ|`Y`46wiez/0^I<6lBOYl".9+X~#r!d]LُF[rTωr yAĕ evĽ!gWh]\M;Ǽ`j>OoLF q=ԧ&׫-[ܫ미:10BXäj\}* 1-{.trbY% äH[kPvN@ӵ@كjB8+K oiHA6eu^#F6qUf[: d(Xbtg0vUQA-C 10&K\*Y,(Mt԰Eja۬ ,Pw^uPHWoyGji \@o!צ"J7HCTk7`Z*XK@w*F:MU*>b$Jq%L4j>Kq:B`ҹY{->f%t.Lb2̱լtbJ{PRј"z5_` [ԱW2Ž`=aTlBu a[0,iεK!#.#`2 V.U8, e 5Z5_E]Fկ1`a=R\DxX_Kk*MƼ"gTݾ0폩E`k Xrs F  'o"!5' E:9%/Hce Bzǚxtyb?Ŵis-XwɘN8.=¡ euTll] .:Dy6o_TB _4Pz%K`#_|$iEjj*8cT{gW+q%H\_mEpih,00<ʍ!3J⏷qٿcj#R%ccl! < TY5etCbZda.̭EMTsmS/`#RDv< ;MP, 9Ll#F{5@"EPaf]eK:?E=HA;e !k.m-,. Fe ZWdSrB2f:@NqWL`~ @5ij&A{ #%B1bu&8ey-I0`hBJ!,lh(Zq7/"¶p$ T1 Ѩ.cK Ӈn^ă%L/SUsww6C.$.a:898zIP&z'W`jNMU`0Q1 =""Z*Z[+amvSMa\KnFhQHQS]CfS`瘉\=Dё`nv.Zl'$)Co*Z8%"pX45̵UGZ(F"89O\3HagpTE0t%vEz+CZB,=_py)*3d* byİjLE6 eC MVV3ƕ R6rb*e0IJmH tnQhE෈!Q#\sBMnrmF]5+԰h#`R0r7oi{[;Yt+U*CRl  ePT MTOZI ㏉l2͕wLHǙ3f30\EWp^rӮKD $x ɸM5rؐv0UV'j*X&;qpTiD+_10P۶,![c0ZJEg3EQCr#9;9.kx?FX_?ی/q(Yl+K+66߈lwu,#'# \u~ƛX\j B zJ$OX e-q^}X8G7p0:#rgĵ^h-.1-EzBkk'6F$mxtbb)v-\G(gxІI@SJT~"a֔ȴU@pj6x(* 1  VX`8"ٍq UUGMw)]W;]rBԨ (K*@γR\@U_@g9\`>4`E/bs4+ k00JU~ E8 PPZlhEiC J(0M_OmraQML(`XJψ1k`n:2ȅ\~nS^s0F7 3%PU %,jڳ.U^rg_MGs &*.(\ Z3#!8f o3Uf0tQ9#ҫhs(\eeER( {Or v zm?r*J^ s-**_ 8Za9xJDiDP5Y ̒c3N 3/dx"gI雀.JO1u5&fwy- ]adAk^Th\ *Ue*j͟Hrpd`NO (c3@Wna (~6"& h ,(" 8e~>`6SxY-z 0SW/h.!Uxi=XYz.T^RdikDVwr0HblګpO^wX)!%LQĢM&3%ݬ’N;sFoUQl$"YiUBWmCIm`<@Y !krg:.(R "qS1dMG 81;-8\G{r0a,[$w8HvAX[N6DByTaLch(e04]sr ݉UUauBVPh\>`ͰJ>`h)ffؘUNe [=ĶZL|$(UtHߤ-n̊nJ,X`Q]%EbX. cUE8F`DJJh[J&`cuXTZ`(/5sZ,TqG)[fղ&Ta/*~g=Akc9_DHE3c>@VSsqrCa *hIb|MKql#fWX}18=cp./!@Q̦ ^t`dO1\qT*h=c/3N" [_[ij?m pH*9߬=ip2h驉*"´C3~1f+5soF*V8ذ8.m;N=}"DB.4Uݥr`Xnh*IQa9N%XoA7B'/|ŠX 0"dRֻ:,>e R4%u1 qgTsfd48r@/ .6+]*oЩ|%Vxu5ku\ȓ_Dzq ; _s^.V$a\Pq]FyW'?K<|>`CRE#Y#?_ XL+(gK7iҐx[J]l[dž`nR GSVaL9A [ۦ41AA|`CjU ͳ)آvW;_B/\$5] Ti{@40aefKQv$݆3&МۡuvH-U);Ksƭ bvBP"2yG#i!S^]w)(TK>6BfSVlnReAp @A@B7QQJa9H1nbt0dz@ɼ0Vkf$~ [wR^Z]1ݚ8j1N T=3-  Œ!kzK5;Mbzdy!kc9 y4Z0(\~*`;!:^ޓvx CA@Wn(4&`o&pIX%[a O4inbhS/Qϔ'O^bq`Hc\8g!oR[xb[sTEC #W>&aA PjYʅYw~UFӠ>(TvY$ȄԮ*͢huJ\ ɠmД iPNdkGF NX bpjFK4 wƛ XU:OW…qPF/KMZUqh}.o5KB< 8 Ҥ%tng M'$0~jeaT ]s !(U\F+ v5Hw6n'SsZЫ?_NaڡiɱGߙIFHz.BAj:>@n5=R@W>;NrkWcI Ǩ;oOLg"CHUyeOGiKÀ^Q+ZLqx~m5]baTҚTA5$"$?Km8 FCX\أO>lt,SkAV4cjj[78EGvH5JàBI=y$@"N{`SH } ƿvGW8DBD;qcZ\>;LV*d}] BJR`:F 0 X|uW7iB '"18_̦pY+E։< A:rT)1kLOB_2yjs:+].EhwdkR l'ooh>ðG҄dE /.$З MD!iIt8H: {}~hBVq K2}]+!UpS[$ JksriU FTvcciܙIN=Wߢ90Q ]eb6 E/rMZLKNѦxxet]=S)ZABi$D(crdd>`"ʉF ctl˽k 0@{l/`i*X;iG8ny/hp"hV^8e0 7wZ= 9]7f`[;&vGzɴ܀"[AsxrB6S (KN!~5#)Hg4`K`)܊a nfn7(iO%EFa&UC8nL+(N~Cө6}Ou= VIn&TMZRTGd)]0C4#X7[c()Y3DT̨ttl/sbp X> zjm;HȔ}p\ .Ej$!cp+I^(YjLCT #M.2м)Y_nW }Y8ȉ z;0*"`1|0Xђ3sQD̢6xf#(R).k -*q.D%O0=MI~{􄺃f%;&oO%vAŷ2b N@G"8FIn*)eNzujĚ 6/+o@A Q (dȌrQqIJkZwGiѣMwd _3j$%ƪ H Uա#$=Be6|\ՆEnl_b` ZRQv=+="BӊB' h_a !Q+qf,QJ+A{;gD ڗ$ SCF.ߞerR~ ucZth~~۵JD}WSg' HGiG._S_2`ɒCqEEY,v(#넃%.࿟. 4 RL!q{f:$Km2@WmčCT QI h H[ҎͷpOvkzn_&(}M-ȸ`1SN _$>jT.OZ.B"1HZl䠪h 0aV[XuMU5%Y}LNxR]T4O[)ẖYHA y <*a M8%yµ=>oT'i"1>u AIiW ~liEj#( &OH J󴁕^mp]a\'R4Vjpm:XF%U׍J IXT#`C_1F.è%]7ҡfv'Iu }ҥGcGh]n7*rJWs Rv:FW7"ӛ+eT Z/PEy,=zf噄{?ݫgf:P><ƻv5E(fRt@)1b5QtQh]Tw)F R[۠@F#M*WT UJapsgczW(|ERWatG$ #(Q%Pbp0dž ~93v1U1)|Dz g9q4WzCEI `aV<ωXjƙG&"5th=&mԚ=(t*+R:0FyH6{A<fLQx^4 Q`xŒ$mu>rIgLܩZ"{ɍu*(/)u.[I7gpպZ2w,n,F4RC4M u4@@@590m3RbY2B&&\bm4fZHup}iCAF<`)w(: l a X7gsh`qai-Bw5a, 4MڧaÛDdSdM~&r)5Q(UaEx; { vqܯ3Y KYѝ6g Q-:{ q-Lie:'SS^m,6_p/\[' h4Cqiл:WZpO|`#8RoBR Y6n&Ҩ+-(+/apѲjȕ?xMXIj}$6Nڄ<\/-U7B[ՂC#-t>p- ݈OS:x;.( . 7$m}mB0BC׎+NP:D<!%*£CmD!@`3Lj:9̠޲å^?6PC.4 zkp@E7ImYPi[[0:"9I2c:Ád *x3:{_0CCoJ)XUD;p`zJ9>MXCNA3p-_ouy 9U޶:Mt[ziP9H X0$E$5)ZT}_8fħNM< G#U|P t;6 #;+_iVU}75H5ut.aȺY}F[~߇2Άn@/׭W`DuJj0!=!C'__Né'ZlEo4 ?H0Aͬ&q2Z \i0s~V ]69+͎-'[7OMhH6UׅV[#Bȵ/|7X`țr+n3gIEe [+xڜ?,㊪֤rS]\ 5?qozExa(h$ܿp.|g!t'6|Sc )HB6%C+PKHyJ(-cK4'<¢adF+`Ŷ-<Css)vE3kx cb#xlR +S}˰"t[ ~iMWgjhO#$Z}tk; 7P.- m ;B~smBhmO,w65t4Dt+-ӗp:V4&@+#wI)5E_ە`Q'W A{~aKUtR+P ~[1;=4+j~JKSAm:"4]eWidYT 8Gs&&O:Y[B+~{D4]~j#:4c@:I_Mm|>J҆?bq/WBTuVa]^HƆ1D/vjZxce28GE[FZ7tIN⠂̽ DpX};Գ b &pJjf m 63 L?.Q-m#sc1N:MK/Cpڽoh}`bXEvxó+=½؀KMqS 8_VGMtJ\# M.py\{`R~`ª4=$.'Xb ؚjE*S()7݊GD* ^$ PSm\z `M铛LZCb !6pBٳ} !C#,sb5yK}E7|$֜lE<9xW[R5<$-H_<hRozfSb++:XjuhQWCSA@m,`zM/Ns&qH#5Z7dy[ܯkDhDWKS3C"z_pen4QM`c*t=\.ZZl<5Y)ثt`_!Bpw" R6jyj;]:8h)!9M٧@](k66`mvmRN D!p^X=l7a- " :ԋ_(?GѧP$/Oqa;@/MbڸHF&4 5_. 9i O17 Jx;e~ )Ph XDtHfە)RկMc2s:_Na[gg/K ipTK|1]s#fـ`P M>rSUBcO"8V]}zѥHk' ˲ib(iwYS{w+BMN=$B5q'Mcdo¦0ܝ;G8cw !W3;R*!t1FD/'$пfNo ݊*3fưan0ȝxAI_=Krk1L&i +WbMD yu:~&?EMo9AQNS| D$i.U|GN& C3m5ToYǨDpԉPÄOF!Ч d=vсZiVbԏ,F͟1WI֌lG<#Y$)"`]a&@T)e5) @j:B@`%ЅЎfXY2]0gL wFe)=|ʜ`R9ف|)0:}X3[N%u/`m=znriXkb]䚪>6fu$FCئ]N:):wQMů\hD# X%YufP24Vw>Q(Į-u`|˅jmGA|Vj5ؐ} >Iwho p6I+DoKzyLA&(AH&r@dۈjm. Nnx.h]<R\bE"vL)>6޶Ih@qaZҠ%Ef4.Bj[|H:Cz+EBhRwk-7{|6"t[f?jN,m."2"ZVV,1jnFߪ$K%^6-AT{oV򣏙#t8. l3NNdp}#a0b(J>)&+^ÌUhD׸a.R8nX`=Ev&*n"zYaqVE`n ܣ6&w.3iwiKD4˸j_4RtqiOUޯ\ H`li +@: --C|JĤO_C`@_e7e(G'EȒ*i *GIo這+!GED2 {6)K;3S< Z@?sfL)t EL5"."ZЋ}HĢy=h"CmCTJ( t.n+V]jӣZ>bFK8cQ:͐klX.Dk)Z.We-_K9ٳ N颂)X J)똱t$O?"(q1f4 KjM6xPqD:#RwhoLBC= ^~y~GJCm{LOd@7`HnJql>Y)6G P 1eQ(dWiLhh\C5]1z4D?kUVJto v~N~!ZlpYoH (Y3*+!XCA:Aϕ-T3TAPE2g(R,я`4lPdԈ! ݾ_.QB&* g 4NI[1Rk` ~h)JvRmqWXn=Ʉ\gq4}J CKC{b3’EU@0.NIG O{^~`#o41zMWikߠҘ:VF?Q2~ psTT68- ZmT߹@J[bf[B!jT"բ(h$ ްNc!R?!'mˎxS=zB:hlK4svJ)Xe [C`WFg=F%fnhC`L dRD@\(i`!1k~}{a#tSgA(-޲[<$aA,*VG-تRͳ|V6a#=vyYjΧ=^Ʃo5H %ۺlJ㞿wb 3E(7{k͜Hd $@]'ctt=;qWp@s4.!`*6@Fj4_e팁 ޿-Ua; Zy3J ETLn+#Q He"+J"EI|^itd²RIݓXѭ|q&KcOdE yGdA1Q5O1"CNZJ/ tHL0jiŸ ܟyyZl+t)i>) 08<QfZ8SXzt#2wFZ.w`&[%(C'ha1gѬ\7C|3BijX,tv@k_7xѪ68560AlίBT|qrp;wAw8Pv%(]0r P{]@ϯęm EԎQQ$ oL'E[ڽu6_^24yHs⒓ᵓ,'\J>B4(x&w{ [6BO%W1%! ]HSLaq?c;sE dQ93Mwّz$ԩ:цiP-QeuKcX'AV;VYvz~3ni i5{Ut v?>m*+:G5.Ф IH\>Gো]iﹷ8IvP,l&.'b"$@ 7žFvu>`3EV4rQo J=> d=KyN4G0nb 7Ȑcڒ0HFh  $J wF̚ɶ|PhE$&p*m kq^x k5r7Yh]?g/C V4(lX(KBi KO Lk) |vy ҠCgaP4kY{"J°DPCWTmg:w"RR e5'ċAE%!5^:QߺtꁤJmtEW niP %]'f%88$cKy'0z{Y!1t|f b&r4дz4.S87cH^wTYHiv\5\$Ά!Vn?HML6wnD\2gź<+իAQ@}p'J--ͥo^af-í*;f Bk8PTbёuJs ww ZPTkX+Pp4HL Uéx|,h$Õ M+9*a#U &ȑW`Lz @`qok Yߋ,$D:x Q6| p$ \$mY*Im9*m+w|%=y .kg^7 29(ѵ}YxxyH(l~ݺC Q;98=C{Ɇ/@t&WҢ]c)b@&ĩc+PhFJwqiFSra J&.PZ vGt j윆*a((뉂Y6jd W7 .iPoݽZv7qt )TB 3Aç:(X5iPkb#a4ޑzaqh=IYA](!qbÅ༳ԩ]Pd oMPIjM"=0x@>USUGE96hGƊK*amZ#ǘ!%c('M"q K> *_֩J2d|֑ ij# ZDQ[ L/ӏbScr fcS] d0'꧁tPxWRRq+G0vVU% Wq6G .OH }HCZ Ҁo)H2&r`D R^ځK)$ د|/ WMe?Smuګ`эhRDoO6pA1 f˚Cٮkj\Zj㊍/E5ruR5(CP?="NR;zk&v0R |:JvhPrX41M! R6-;qB(  2N RPHv6s뚶+g$Ao=*%?#MF;\ƦUI*^cȾ]0f-h]pvKm٥flP I+3s8J:L% RҶ Re}rQ @jYBk~LS*R DA֌P@A.:ߋ T8)x'R›Qiӧ MOWsBFAd@41戅t|7ᅤO.Nd%-g =4cabFܮ, E `2jɣ_4Q?SYTJZ7ٕb4Phd#hւdNדa`_C1mBF`=qΐ)m$3m5L@I8 BCZKN"Ibqmk}9 `1]:P`I !Y1U.ŰҍAO-:Ѷ4IˊI {}dATƚ`oQ?1b5 OP͗ b(,MGȰgzbPQ8;P(p44k2 X!Ilqf(@4?*|q%"s=# 4 ;@tdUE ܄$E 7]uY;iSOy~tu no/sȭ {=ȚRۉN'te[#b}},urs>`U.7k )`luy0Øv&/'4&THh(ko2쀔]fu@@Td&D)f Nk7O@F#+CK-9jj)-~OuoSV r`ar qbYoZ.@mi1jB )\zEܗ(X)I ̒  |jRM܍x6tڸD<.+FeAO2;㷍k>GR_y'EuA(NvȂ-:q]K\hhބ%n@8 Ya4d3 P⊝Mn>fzzSi/ŢgB~NrZ= v[ B ptFυR[^;Uø "j#h''3HNkCCg׹~YXkQ] +O1* ^`Z4=mHi=VCB &v$ h(evT(e즲^}Hƒ"6op0I');H/Sl$,hňnĠѵZE6p+7:~W<꣡OJ ""Ǹ=߿q䋠-#N:.àXrکmD꽢{3Y uw=P KP{x:fHɂMjrXpS(o^(FW"$Kk+*-fJwp(Q_ )?xY A@*Kݏ5.U>.f (vӍ (F]DV,|7 <#Ԯ.N9ݩQSľAd!mn* =wq"mT=yIr"DI*ˉtY,p n@gN})8+&u+1/\!C{ .e oTBYƙ R=hROn[@Ͼu`Lu./1rz #CP($!,4uD(ZP bUMLytmeC4޼qfSKm(ЈxȐNW^Ut6 NZJU PYܥ8'" f-YnSQ\RO?&%FDajA{% *N8)~8J$PD(/ ߘ 31E. \${@ ["a2CJp~X <յhX0Ed q& J;;uܲہJ)|"R VܥǴ'w_tk2 Cc&[[ǚR30TAkb~  4kʽ6O,467)&W0Z%u0z ~`Z&Nr&fH ЇE~Bq%GC| jc0~ɣA|dtm!M#mً]D 06 *Mf"rFohh48&Ka%u˅vkp^Lpld7V)O᭷V#)q=IVIΰKR#bMtJH m$GRYLn"x;|R "Xo(:fh+DٺahR\zK,ԷϙR=w]3xlⴰT[tJw6<>aP)bB.zc\sEQP0%z $+]ˎcͪa|%#]B/ч@(aފ)`~&(r!+OrTHkhj u'u UmD+CJ0JAm*|=HtbL=zJcbb-;O0K s`1.ؖo~1ԷN܊0E`83 ?nk]ESR 'ʿxhZ\)`~}3:SttjYz}RVKh 0;8oF0xfg%X ;JUOфS{˚ǻXm.w A@Hjrh ՛5@M/T2~¢1 B݂(eozn)Q)oz&8 lg}9́$5*Q} *(=vI lvbz\݆=A >2-Հ4#SVj4$ 3ų9BC"➊Vp`07XxLpc&M$ "h:̉U9/rxX-Svb )|>W1ǟ/@}^WrCEkKQ 4%eAdϣS^Oܣp?X0 Ji\k9juN8kKXm.-2NEf:n(^Y%I*H}–Kzr!#A,Q{hp@QP ~(:zGN7W/X ut0Jl 3 E;+r=|ЯeIR^sXn-l%J%tv. XO׹$Skd̵Q"{_Wȩ [(x$IU7ݢp1VRMW'A7ϸi@б{P-PxP&U -IPHN.SaVcnVT[g<\/PJVL[@ {c>1MC'p!:D5c Л+Hap,:nƍt64ooZ8#*p Dgr{?xܛtn"* W٫Hx Lct֜Λ;ɎfM{pT#G;|AF[(h>>A Nps G< 6>PE뭻ά Tɂ: zhC#M{xRq"h %f;tja&WU4ۮ03w5INPV'T=胷nn$WLWҩR@t]tۅTSVRRqZbaZ)ߛ*6%"\mԠ"ݦ%!NV9KSS6$ *v([i :$ѺԒTHBLHS2LwKfʳ3Z"('¯qЖAH0Ӻ)H`>1 Ikos-iSS % ¹Mr: V)uՂŘ`46b.FCbwN$ 3Mg)фD#FJ +Ev+Zs5wga(z iz,1"fuERdLVXJG Eu Q5^wrXItEelɰH")6h1i2k. /?шD2rI_`֍Yp<@lw*6}}kI{oG^ R@ ARb)؎6A Y dl7!DU+SCdy+61ꐞ{VlBNCmW FPeyS#S`P.TF[M Qh~/\UK̜~D &?=6E!-)(u~7 I>\4uCRz UޟqR A\ d"g@=/ 0H[cp3NBQn`l)tTP Ut/}mJP,cuF.JIr Tfr.&oY-Uhزzfն̲U-5\y翘*CJ!+T߶Sk=>S3uk{HH<|Mqo,2ggi94ezL% uiȆzN-Wq?6yF#[7 ռR6N Xw(P"" AU(6V DEܒwEkQ%kQo3.G=Ut=QMy%Xy#pDu4hb!k;M` *-a/ڛ4+O%+!eGT_ bj:R)^`:$[12-%j(Qv` h3ޏO zQF#^9(y`i49D`7bDHE vܠ2IiRMxpd* TMq@HmM̥pQl4([blqR q^ؓRO/3MLiAze黃ahY/UMEI 5 +['U;(l^/MVn$MPXT2Uf]FjڹRep3W]iV14x"M.uxkVPnj]f`ho1(c)gLYȤ-gBpK[0%j†P4SU E#6|$5( GśהmM^Z7,SB= T A#@4 dkR7N#4+4u0] ~boR}}7nQI?:dqI>ŕQxR#:R>~D(S H1kI]"+[ܠ;X(O\tM\˚pMMd15ik}wq U-ddU6s\z oyv_W69rvGrn}~o-E;@_(QUmFũy^҅&47Xq&c+WTJyŲECgYwsfD_&b=|( I2}sy#݅{c/H.砉=G'J,n;]d&Lh 6?1x6@w0=B+e.`}A?8))"mGO(GꑶpA?:5GAme]1R\G*X4U+J<8-rPO}W'6'6ACn&E( lO- ڰq_4f^RMs.7 >aIҺ؃`YAA5DXU8'N^]ύ f׺$owP𗴬v.J pFηϹ# n#ա:ۍemtK`nh,4 J<[\;'SEe 3G rv@=Ŧ=C$S:}!d P l.QuP=6 T6k4 z? wXxF M52gvM|bF^QK-rl9F:z{ d]ܭ1xQJzTLS+1/\'BXK@i]HP <"뀐kaBD)=tGd3e5BP;N R) 8-hK>, ~cb")WsDD:$*۵(nDzݪ fڟmA20-/f4y&6P#dH>@3M{!IB4a.=-tAq_@H͉#,X!nNRí4̸-5GGd*[DP w MD-]8e0U7ˁW5Zz:SFP(!f̎2t2\wJa65o~|4an7WDғAK'FF 0g0n)^B ; aDp& PE 2";2̈Z%VK!{4EweѤ+۱H9npw(RC· ;|zW4Y(6*G"B} ؼ%n{R7t _dj!nA酥rHRcy0uH*Z?EFz(~+@ZZ-mK]V*bS]$#tۯ"j J7I WB;"]`r3AF/L@){Gx`Gv/E84 hV-jaXj]P& h+tGZmw3r+I*F )m5nپD>n7̳cWN'OH-!G֗Z!em#M@1V J-]A.lӰAaY6(wM9t%dQ́USt5/@sNbłހ"WdO " ´rSn8a&G U92٠_ǧ'䂣8Z% l@3t15}07J. 'p!N̏ {#oE ^ts,@%):hhD1^rᑑ~qD7_I:\*_Z~GJ#bl%cwH$,+<hXCA9*ðWKеmqxJlSe](Z4n9cV٦(#6~;p ɋnpD%dLZ* "o|JT,5 #P1 ab>^&za 6 qT E,>´sۃ?1ObOr T">/7W wh$ 1B{l҆/@ آrΆܒd@WH[N+:T A<f[nt!1끥R'`Ko7 sf#}B_:vwH<~2y[]tD""~哚'>UB>)v`joR&zaHfӠ4)Cu Dq?m:9붊q1Aa-p=9h!O[`ы]ZHSY,Cbc^ũBmy P"b=}ĕHBR>blܪb1UF"?vfj' j[kzT uq Igzp;@m`Iś4D'BKЙ HYLBPF `5h<顡mn TK~1Pp.74$ G2$X151]i_Lrr=RBKJYU<1P 9^#z 6s ~bC}AR]UHظu)qvc 'w XoOƀ~&AmzÕLhjt'Pf %:DB2$ Egi_%п=Rd]^ ZL pqXHB0ը%:QʻckjÐ#gЦk~fp 6 HU'O  796H16t@I/6ŻXQ۾r'D_ 1O$I@ N(E( $P µLC]DMa^eQ]/X[/0FXe :t/r1)lGݻ=sY7Ճ+uv{('b:f0?xRA8hIT4ZU!B, Pi4ч M=ʎnXQoKn7вmsdl{+H/ DTP$j.by`x* ŊJ#%N>8".I ^@AһZ1 VM4gk5IҥTqLwE$9ʞnF#u@kJ<)qy~AG $54TI!wCOyZE96nFLU5!K@됀EŀP2}7GD`N&L15U*X"&>O=A>ϔBŭ,2ghXbHqqWhr&&*qqNBbAXoHDR?6/wb4|{HvDo.|MWw6؃o4UL*>;$k (hDtn^J'ϬR#ehGSO"!G]YO[ez\>d" (4Z"oXch`L3dR;;o:d[j^`͊JYޟD+J`kા ,$: pf)A#BR'n̸`[%eGb(㑢^ց֞ +ڇYOAa]#RtVȒxf!AuM8 ]"ӻ U5.рDﮝέޠdRJ 9Asi*7F8+^̌0hxlh]RC b؁ga:;J %2)i5=ݤϷJ}+I7I/闘 W{A*##bvNHͺ5T2#H0կR-IQ >ݞ!J%,?REA #՟ĊL oFlM}AO J&-0K9d L)нf ,%Rg̰:˳HD)Qhs ǪkYLFد\h=@}#jFz|UE)iUS8iP %ۍE b]ֱ̓nfPq'~@)ÈIbKC*(uFȁ+jq]rD@짧ܱ h%T*kY`l44`{pUwVl* hVAwtz֫ g-{H&;:w&umJ=~wSyzv\ݣuJ~`c ܔ4Ke9o#D OIL%j{$05An@+R4p7x6_IQw4 $EWb<[Ifl W((I ָ|;qCqmIp9XB9vm֐aM5Juv`d/^gSt9;OhRYZ utQ>އ ≎cA%Zq8, @6G72kՒdݺ Mށހ.aBC sm 8uo146uCN (Nhވ~G_-%}rFGQaX]iȨ$` {@(\=P)g J?@Qv6 >ffi5|5f]@%oq GaBl5yݨoн"SUݵ66*U+Yp#vk1$\B]ߦhCit wTx,ӀL´UOZLpQl( fg\]by EZw44T_.[ݩF"uaG&R4;4ċm^{2 Of= GbmيJ'a"2J=ׂ"@?EƆj-udNH$j\Y[UF&&P7J`FԭX5Fc)r:0}] HoA+m" "H֖ {i?Rzvz) pBT^ '[D GDz!GS;N Z»9vn:@zUCdP/HFFU$qpvW&4ZdXj5N*ǷG!}b'_yxuqb_oMʮLHN4hRŅtcsG`sd;Vlv;UحZv/YxBOcբNznY^t ҲBzaw R׼7Mg0(-5EGIp=2)y6? Bpi=9ZlŤEj1{$@Vl`6iTifX )a%MLSVOcAhЫcc5鿄pF.C t4*!JG5ԗ O5]M?{J9n <.:qwt.͔ 0k5\ԏܳ2bQSzY]]jy!C/4iz(jee~пI^rTl@fx*PZdͶ?Su 1]5ǭæ}BCN:*nhQgN ,"*S]\^Pns1鉍}@VG$*w0X2!ShmFUT8SNΫ$mۻ LJ^.A ߈O"hmΈ%YFҀ_vjwfCEv*:CB(GRZo+_{rxt\q49!}qx%pc@:φ;-8oɛ:75 MLbʱP-Sۊ  2u ~l|СQA␱GYI/ a$Vcn##p ip7/p{0Me8Қ51ū7x'mFiƽi JٰuOJ;&hҨ UnS"t֊>#bg7) zt&?IYFuDy*!@C.Y:!_\Q.Zt-hPR$T4da~}.hT.Tn)O&/I[ac =ṊϠ=Zb;% mpZR+l0l& Cьy A\{1}'=Q!DC8뙭]ƏEa;FPΩ?c:5!UdAߪ@(S˂M.ѽ똸 hf7IE҅0!x)I#:,PLl__*j=諨k:p%mFg[R@']_0(=L:$:\h4{ kз$VA I?I/ @ֆ$-jܱ!P>eujB c!} mf LCٿ ldWL!enޮzp`?M-$`Z^|nTĄ!fǓrφ)QeE!4f,cl T>qKl6PR:bP.؇x u = ?p?uhOGAgD-aN0p!'J ${ 3)SWh&ADM / ~4$v`;iWg6J ӈXn0 v P@ <'VQU w\MsXKy0;8(|'X63Pb:qaПM) mUsZ!Ș J `U+ayF&]uUl6%]nJ;It59s(3+蠣)T͕10XL0كN˝*P~9)]"U5&\E Q2;B)JbOO}6`]I(v+ʙPJe+~OrYRi 8i}I1c-)#S+Hymisk]6l(t I!J ϿqDVp$ճ_#X˃tM!2v|?)b L|kMZAvJ  j^WN}sY8:Z(f$I&JL!nbR(!-" ZDVφIpR+oOkҷ*ۆѠ@>`TT6C!QU<]^=mc0-;Ŵ ,[&WQZO/*  [FTYPjbY+ j?pJzD3IJCCxTd{; @ -UqPF .(z ![M%? XTtRAkf]ӣP@cw|@ě[Ϙc@)j H.Ԩoq!L:[K^Iey. D G+lr%:6:}El-$B(&)?npu;rm "BȳxZ,oiV;|3/Bd B-/[gX_ ~$xXGL-Z ޷|c GaFDѺ ].ĔyIFckz ޯ2xGS~_1$& f%SԪLi=ɒ%OwSEI_X$ a]b7EfmKv? jy".8 b^o6l;L q86縊L ɴUַy[*By; NVtsp:5<)[T3/y#`4Ձ6h5(;6yrI:-6֚ 6o ;cikEQ DCp7ō޼ҫ HgpnKCbHn644!{HOBso# ⌹wiD m$;auѼARD=0H 4wdb@4fƈ Hc05oldr嶉Ms38?Mѽsل@Dx4&P\on:/}Um䁧c:ΏàD~$0S5O;#Vj@M˾l{KCgҝ[ǫS ~ѸASVZ4 G.zZ`@44JCpdBdv CX"ZZoˊ ,XhQE%xuemN5Yn}pX !ߝp &;bvF/0kzˠFeȕa!64z."`S3K6"36`쇣XX'̂Ԕh~>Ta0%6[L$g)ЫQhOqNAME9% 5Nf撎!/e[$0oe1|LJwv᣽y+j T+tִ>-(z,fjx(#Բ Ԏ?RT(qԙ1bP q!H'ɧ0^iHPY|g=}HUiZ2B66L44!xo|񈊌$h1l2#;K]7cΥ/9TB&c°]& mhDK2%Ԙ;wX2]a ͟8,Vr5y.uJi,63 K:[o?Ry@ϲ1V&^f! ޓZ 0k|;AuLʈ@y1"#yrl- p0gATӈb"D uiЅjڧ".Q&;#"^aT%rFbv:g3Ii`jF31+D5z%57Aj(5EDyYiE1Vx<P6ːp, )*&[(xc H. ̀44A*%;@ž("hkX'.9SNI駾#g'ah`!1ە qf-:<~#@fN1]Pva8k\ZU4qcmBHdxp NZTv%2c ߃LKCS{?րk\RAGCGhc],3I/)dE􍐠7<)%`DO#eY 4%T Bۋ[TgRۛp3 N *juʳ?ɌCQ-qQq<َ~@sn< #Q:kXFVt`Hvzf(uP;6ŏ0nV 7[EfMb? w pL-rZ4䊽:d 0gmal.6CTUC6cB(ʄ) ށ;( ?n4փJE\SD<%7X&Eȗ@$*O0e6|`b֘ oP%H{oV:1["rIH6 l֞+n1hbYZ'[.@TEza8J8ɜvvm9Zq}5&.2v[ 6Dt(64&|IGK&"v 4v64)ZⰠAD \{t&ެ4I!rJJǼ7,j(4u kb C /;*pqdoV$tTx.2KLi4>15 lmIrB6^!C3 !jia] m E6,ZBYdY$.S(ʍLM/{Wɻ=є&,hG)\A'b ǸMNnT)}jڧGcmieTI{>ޚL&Z@PDaDk&𠦵8/CeXl9dLiaڏ|;A Rs` Ì_ξJV4?RAi,`nh`*Y52p khI`fّ{5HtdѦco%F"!/~U^*){vHRnQ?Ӻ;P3-$ {p ]H`ߢjd)qfzbņOII.Gl6D hH) E eNM :!nhY7i-YA9t>6zQF'נt log+1$ |xK F, 7* Qɩpa4֤MD]O,MX,`US}G^/Z`a~3bDR'pZJJZUMg]\;Еn+c]rh"!p\PV@OFkJ•NM.(U pYkPzKG*%%6lU`h->֞D6m.Ӟˢii*b7}$2SftY:.eJЄpqJh|g˳uh5FvaGM/W̲a" Me6蟸$],.QƕѩfF!R;L3X0y^Ld/ "l^Ld:\<5#Z^ _-s!R1Ɋӗɾ, zpl Б778$h^.H5{|-.AYfklhhpƔUuˑ JŮ15̎]iNtΨ .DXePDq2d듻f*VSBX!WhURu?(AEߎGFK:dv;8JLXztӭ>7$6`o/lB uz3B_鐃kDHf+pӦ "#2dAv^@Z!@rn#SX-P$RFa/)֖oM/nl+Р?+RHEnЌ%_9"-lQþZ$ *K'$am"&CЀRQHMX;* \Z"29OuxWb6k]E48I֘xl," Kp!Q=yvh#0{xhmL./@UX$(Sn\F #kɜ;~;G0 N@F-#{;#N{SnuNR-@PbyiJM-gh)OGTM"cSW(OEt D\Q._[ [c2m]8qSI"" UBg|<\pJk @44~"xwq]LzaE q4܄p:(BL j 36*m H U Ck7@'EdO9x&aU{& lo/L` h1VᓭC/a4 ڒ{8f-vT0M<DDLR^\ :˜E&)"ҝZ}òFtn#bMiA3KR!id~,JcutFQ%*xBXpǷޮk{b^Dl fInMaaG/* "tNWR0$lCcG=s`jyO(D?_qP:sT>]KF682hx˚*75fNp*}ķ`ݠ,8'"#nnһf JQ6lp ~ DRͨX0&Ap=`ME:~ pհ]+KEU@SdN$%^﨣HK.>^8$d53P"{6cINs`h۷X_3G}o_1c(JKԹMu V`;z@lB'yv{D*繴p!wKp@Fho;`'%-IT1*߀Zmq+/ YPSɉY̽Jݼı_]LbVK67o肂؜?*ުD&GR 2zX7SbP m[zʝTFO! n@Hq ۹}XhqVIx;`F#nܰG\{ }Y|!E:<0tx9ɹ٧GY Ft,ja$c w5A ;V͟9Cqt72&LHl}< D@Zt"i?TͫPS@[P rl옱w1if(JpI2*5}6HT*̅ y,P %u=3ĿPpHL[*p #0mM]`JȊ:ko2"wdލ$}(Iȃ~,,y9B]v4TϸN h?u9Ȃ !/w j1^|%SGGvO69M"uՠ z a4]9&fJ&֊yC#KxH@-)8`DHs+ N;M |qe/=2@"F! w%v5J,NeT<1"EI(V }\Gh ,J*cτSy]g]:>K{t^1A EjAm̅AWߗܜİl&OѦ'p)铥WrCeP0@6M6LU*uh1 $Q{\`Hs}KaH Vb#RjWJ=oOGX*L?ZY'a=o8ilQz0!CSX#`^T}CUDE<иPGj XN 5褔"(!t7,2Pa3nJr#vPiHYUt<&ku#!,VMb]<7Sj5t%ċ3D>) " j( Hm5.$x/[S73JP|ŵHe:%Iʫx< qSe>6D#h٩"@Cp +Z\H:Bʨ qM0]mà -_`ykE4؃V![(H.Ҫ׿+HO#ZŸaa(mu1"4]_sM:ǡ9QI:֪EJm &o|UA@}dإp%M{]H Scg;UPcLܟ2VASzsZ h$|P'wрXX6U Ɋ ^QNpfD.ĢY=`@PAğs8Hh@` 4E{D @.A5R4y (<X6R4DA LU49nr r3DS 1,2%DoOk.;. {[ T-% p4CفC[~qi/rǪ!7jYW07BRR`w=D[k\<Øf5"DH-{EM F^ƥe֬ 9vŻF8UAB6j^BoI 5jo DuI5 Bov#&8k[Y,g:)+醕E$lGc#ܹ⦗lE~`mֽ#$ڍTE̞pҥA$4pBdN :Kj&BH@>Ѹ-U.B,e&@ہpRi`RPDbBB[;=*nޭX-J$hoP ]-nEAZVe RxL.;0/t @o?~@Rx+KR w U6IJ%`DK iN ;r- i@l;)BhbD #:Zv^K} @:nev۪/V%S %qDpLQ#B_ݥj% ҎeVdѱD' Xœ27DyU@`zOĀ{6Vr`=ty˔H绡7)ݑ…L8}5`"kqp M(r\Yc;w>Qug=XP Hj˗bCz2r)vƑi?F1c{1YaX2<@* p^0X`0Mi/p*Hqm9l8J#*t&Qʤ`jRdnaFpl fbOZ@TV0Pu!69tJ4^0`7 J؈$â^F@Ay`2H9 av{3E ΂ &Gĸ`e<:Py) *D7̬EŕltH…Q Za;yɐHR?snv | Y]r;s_r7NG۲I*j \nC(uک~fosL@ ƃ 8"O瘡~&$_68]Hwyio#Az6L/`+%@(PdP 4)ˀ#>fL4zì^AOL;t_P#vwbޢ-c@U5yrRo ;4 P~\VBa Y:b)$ 7G6&iQ@3PAܯ&}:P|1FPP<)DhGl>1HڢR1S񫚑EnGP&1Lveu("Y`"6V&l4@|f% RE2>`PrJC8YqVKVv,|adCE{Vj"ACv0k0Z022"Aw.vcf]Nա4.E@-b s/v9Ɛ5?Opaiә2NkF)QX47+[(*$^G7}/@mP߻TU6; m6W#@ wF$*kBDJԻ)1 )w.]4q²Z$,TƆ=ӑFA6PXӾ!7PL$*تRWQ͋KRD`ȇzC8M lx1A'c^tioL޴䤪R@U.Aػ H ~LNa;-N:ONc^yh g? c&=w0 EuU bЅҦ錕 !PbF|=’`TcNO)PAWA:IW.qV @cwE {Y[hZu 4-O Ff6ƮQ=#tpjR[ VeAcۣzth #&V[gAXĵ%eip |J5џ. 4%rAdc|u]wļ2ߠeωSHq3r\N% ˚SgFl|ctl_ 6sW\=?3nOm18&w1(.PPuDy)knl' Y?kk,8E F_fv&z(Áa";Fd{B]21Kz5ֆ6<ďh,WcH* 1Xoz(* (h\!fYF>ŽQ4s@+@45-ٰ^IZ#L0Zv`#`ImzPg@~d3cl%Ɍ2/}za+[m4u8\x5m%PΩNDw@1bjZZ?Ӏ"U)>4]rRj >>\a*-p)&sP@@ijv?(@:@j`= B4mto($Gr3'QɃji@震NZQjgx6i<4RVn@-xtǡ?+*4-/M*5+Uƒ0-6gk|j= L!JuH&Q됁{"j:v0j8`S#"f*)8W4)o&jQW|q\ pwzhCGِ  _(@7+Bh hk'x ő>E$ UM EiBbQiGim҈P0.y**g1d$ݶv0y4Rϓ&T0Ly;sN7JйC?|#?2~1m [6S9С4lg+Hb]W%UK72=NXe,eҏ`Isbo@5(0[?,$C kzl\8]V.t`5|tk!4*B"ԉSšP.CK҉\p :ְ MٗmcT8IuPnB?2#<66LU)tV1+d@Q(}F qg-RE58] 1HE] ]݇xb&]AhfEEfs 좐',8Uܱ&I0P F І'lΤCDk@s R<,3^ͳ r(/&oe_hGY)J[o]xܬ{6 A%Z//LQizHWKFO(4&)E/@3fZ%%)Ac:E`jEaw#;jAjfo0'(Jۂ`.Mo}1QCbI2l E~F3JЂbɖ%!, ѵi#N-pjt!LK\m!#H $A:R TēȬ#s*;p 7]H+$LY0r50]aO}n38Ԩ34ʁ:z|N~c)6v ћM|ZN|&D!(ل7nꂧT"ڄAkiknQ"e Sbv-OU969?x$T 7 %{hC>Ot{8zX(^R ͋4zWtnƲY&!(g$7^  z&:cTqظ߀$ hwA1ׂ\OFח^|)hoPYuSf`6ޠ:<5H- 6c>)}S T ͦlTRJm< ĝePj'.Ss6 \w̃(5y eC.|u- H$Sb LBT*H %uę߸m9,I 7eOYuGGքҺjfՂJm]{Kn`}`خqT+Ox2G J9${X M9 xj6[2'J MkI,O,!iB{͵?I5U{~`:E#{eKN&  h2:ui{ OVhTBo8e fcGGA8 !:!$abikeg.0D»3\pO/l&ƪU!'Uo\BF'ڏevAM!wųVj4s.(H$hAuK&LG`$Gu>@}hiZ Gh; Gʕ]`bFu2ZR@@1E! 9 A \2f2mh7r%,pJs.6<˘PF>K (ְ-iC8Xp%fBl?0G &gFp@6ZOT<_~H( dt%:`#UB:)rFҒ2] y$[[A $-q"^AJ .(Q[K_xK]Of$hfRy\G9_<1hT^;4;⨍N]F]vQӀފJr`bSJ? A? <FP@H] hӼAMuQw:wT@{#̈PPM)^V2ҀDRs:͔"[@'urRP$0Ԝ\&NUЄ' mI&F1gGLA֕Y*|N~23¿?p RH_ۣ~'sbhͪr (BhpB]7r_k"n eYk)zjJr!4b,sm;q",#JB'Vx]Ltwq :`ѫ̄ѠO396*.E6hS.J+bh>&Z i榎46muɥ`ż>]jV+O--SPN);ANGZlTĩ?DDZŨ}QE@AA>BډWz̪hƇc;]=T:UzW$4&rkMY(A*Ob;3V1?;%h^ d@]* ;P=wD|nC 0Z?1Xgã#@HNk[P޷b R E_+@ѿ@%.`Z0K 78E!Bxs颔$ !f#@B|ꑏ#(T'THp ,[ڟrls(bNJixhфܭ[' t`x ]ۀ"eZQiͰiKEo{C{Vngǒ ~7*"q{ȀH[KA4bq%Ee-1hMՏ&dʏCh|Wi+Q /b5 T aѠEi2xcƢya w! al#Q@dphLEPNdZ舐 d 䰇GɈW]bH}; ׃ri]sYtDTi5w0D A:P7[eI{r7(>naBʙi/)I,HQqBљq`V9y{ѧ6ڡ WAO>d|@=iE`? n*ffm-uHf{0hh5 #iT[#~2bUuP3b"΃ -L Sx>r ?TWO=Jn~穵BJw\?L;RlBQ޳b Sa=q ӫ24F %f0a7v1q/pDc.0ݎ fa?<%+"5U6`s%P9W\T ap/;|2lhKd nQ~I.3k*BKTa. j?dPzyx; kP*-t[51²<Iƶ ؓW %LkDCIWB(>ЖU鍸󊬃[[afkIhVhIM|-R+=ȯ #ܣN8EEe>ѷ;8}ɹn++| qF$S֓^cTqt{Rah4!^G da 9sƂ0'x b3F<~-2"lsZ0&0i}rU*ubgL"ZlM$D )Fi6bdHo /}MfN! bQ4jtAō;/aغ{;.f"R D,ǡdIuE HF;Xl<% IhCaBRPsŀtx =ް:tdĐ]V10$b:o *acM J[Xuo)4]沂"1*6 ӡM P9z GټTLi[6P%Jx2 RpTz /|ED,6X췯]$OPj`6;P>沕@p?-fB\Q d5[Up$7P⺃A K1Eli`X-RHD 89 FA7mLFE!vS|K įENl$f.J7ZF^aZ`ԕ( mS<Q:+>zmЌ?ZbJ(tN[j 3^c zopF O/l= M5&i襰v,Fi|瘈Cq)h 0UorD Zd ء tA; "nj(j+`ը:h$J( yN5(("yu5;L=H JۉlሽQd _ڤщT} =kkf !ԯ`k:/hm͞1  n㮅aAS},AمP.D u=oycMyd H%I"'C }]bt8ZGܜ,|~3% #Zv3 >IfƷwMY(/if*MCdc?m`?MqӸA' @kjxp-6|mpW MX"Ӑ''BC^"Q!],#pr;ºӚdE(7Uhh٠%H&%Amdm1x@(Y#tЦWiD5eT6}ñqy'3L"% Px`+] )W]:\7E/ >\ ;X!U0I#1;!p@T|8*hj 7Bߦyqq( GXQMH*@'92GuI`MEiv5fjpVAie}&][q ) Z@@j2a^R0h. UqJͥn˵Ez!_- N|BXȖȗBJCy d+I[' ; +@)AHƸkQ+ !B?qDҖ~(9n1$:2bY#Q ț)aDuUUw(ܥTƦMd ʡbR^ =W{ҁy'>;:obڿQ˃4IkB~d H`am\4|,u|G>f4DD% ڂwZN`DH`qʾA-ۣ `Ԥ0_U# !wf,3[05>lvjz* (> SHj <)ˇ{ݽ\Xnށ$3vkDl-GEN濘%iK**< G_'{ $4x@f4{|QRJ6I'v*?d ?jL[@)5@͝ZW{ʸ^L5.ڇJUi"`ҥ3`xvWdVu3ꣃj ?dfh fSBQպp?4'P} ke4F\fYU i ] Z0Z'f1"Nʔv1?q/10fO+;(էGi$ oU"dx`c0Jss:18aMo0$S6F/3TӘ O^'1s(i)Ճ\uj%ћ#{qim#¨CBwF A$J4p3#.O ^H@4i/0%e cOógH~Vx|@R-ie A_J"rSU R-ɭзDq{HWu5-Xxȝx (O'MO.;L*.(fˮk+}Ə3UC oܝ}3ip$BقH6nHX"+HXn镎R%R`ˤ,@%+ n-'Fe/ 3Z'Qi{0ŠղvA h`vMmO'YPn CY+."8W螀tEqOfu}*# x5eh8M2<ýa m)d)60هSK !PLJyľ+r!^VZ9V%-\R@Ei``*Chl`6 rL.ZƷ,{wMˆ ID;"^#`%&|Lk #-DjqI¦4t; P@ v2E nPHh! bm,>0 tT*ܛ54&]³RSy 0穝I tD`*>hqx岼G{F:h*^5 ^%傀\FUK $_m4(A4!'@B6uݏR [K|Fa !.Aϫ3_b[#$a\TPxNq)2US&,mo $ *?ކ$5M#!|0 uڛ?2"L^/q=%; }W(} tz3 %( 0vJƂkءW*6Uieyp :lGŠx5aA.]E6F?あ_&0Yy| D*siвAf6vy9ܣF$C=%#ҽX0 r2aaR"LA`"m:j 1фy(g1t>7Ɏ2HAѮ\Ju[,{i㢒"7 :r%dI@Pio0:R,?E-0A4-_Mb+{aSJ-4!B;x0]( z͘{٨ڽף){ Jwa3Bw"yx |G @'\R$3Ca(| $ 逍`׬"MfPgؒ}WܰFD];1]C?2AЏ;\"W]1Uu̙@|ՁQd?0"=L1 i 1ž݇p*&WPZwVw7K4J&p @cBL`q}exB7{irDDbDI<\t"6L_Mt5]h.1Ca[ۅ">NP"wrE"&z(j1 v*p-: eI^CH ;h+] UF;Yf6GP0%+];3-McxLb??rr s:nxf)ék"hkK2W,Zh I=:N $r6[a  n\EvPnUr!UE 8c(l?l%,7NfDȤYe"IAL105 N/eII0@X` &]@g<mҫ77ʆ( Iх<e%HOQ7z'.CQ~\*VӇ ٣ZECNDtP <&׬VWRږM*W!]RIMs7p(CPGMI[I Jm"h(q1E K be≈BiYs[<];'#*H@Tm5oN>1ڂ{##N&?椷֝3A˝Ԇ#5%>] ;&39k v;<"H#FhԈ NZN?VR7,ecoQ8fE,/8Xr h(sQ+ @4%]LƑݧ$bK\<F<]1xZrTKAEձ!y4Ƞ?0LYj$lQӋc@D(`j&`%-W{ XhbL!`Y9LX 6! k ; լЛd4.B6eHN7,kpMяyoN`#pDxkaPAX^LE5"+?+,3-nWpb~ 5CBJ.${lΆ ?1KjJwN@OuFOl+, b%(p ƱdAA 5oD:̗n{Md{F>|v&Vyd=†|Ϋš腐+\QmczGe BцciV2.hVo e&i1 )/*BkMFGMR' gkJw/20*:jm]'D( l*( udSg@ߋ^bt Mg<`\o|_PAX#1 4B_ hU2r 0p Zs 8 ] gm`@"R%DB7~bIo۳ }UAIL!!MGP[F\fd4n.'l@ F,T;i7_d^ $5ncFbLZEN4&Å==MM/).IƅUz;.݂"6~j5܀ǠP+u(R ;6 pX~؏_0`iH'dd,.)$+QJ: pj&DԖ`V}c0Z*!h xL#zH9bk15}LP/u'm<j{,"; l%Wgm c=Ɯr (@UG \lFjDmF/J ~"D!J8 Yz&a2-Sq) ⛅w. P]Nhd!u=D059Lg; 2g7Zوi݌<2͙2SAe^E]BMbGݡ(kwFTĎtD m޹ fŮy^@*{*OΩED]t zN>:4"A@? SEK`୮ӪiC4m"\b>h}Mq0a 0!@cְGN5ϼ0 qZh]HT%U0(8 &8A 5DFz (r$|T 0%IȪ 4msDT 6V`+lҝ'o)=$/`7DU8ɹnHm`3XH,6LL8_r:K 驼Pbx68~w<SZ֠6@ofǧCTzP;=V]FNǃ)fIR}I vu6Ĝ^ * ?Ap+G cWHUFĔb'Q.WkD]-Y:(-n&mBP:|>@` jiM!Wds|`J[6k`Z 7w^bEfJ@b{n3YTgR q׫:@2BlF[uCpi>e=]kcxǬXf|ā#?r8Dݖ&Ө6hRܫAg`V1h) J:8U8$KY:,Vt#(>&)@-[*Ȣ Ma7%0Jb*bA#$h$9{1B?T\w2˨8'7 q*u뺠Ao0ӥs# g-bwP3\ 0$ 0uRT74Xwws}ФSZ $>g(UPZar.4AZUF:=ZZQr-}/ADGP^1pOh#uoHoՠP*+<*:Iء/­-." n;݁]uB7 ѦwKFA( =mOz?!:SZ1 ^hˬ8?$.l{8AU5}2,r%:uH7 Dnkjp2:mN%+8%kyep؁l(зV7O^F~aqEƈj}RJtAggk ÅXA48uu;Z Jwl=4'dJ@/A4<1lkzpM67PTiGF+DUJE| {*٬I8 ni wč:\Tj5Jixfb$&փM82@@](j^kv?n& !6`|j=rŒZT,'P*nTq'$ *27o=|TcyXo+n%Q͍`ͨ8;,MXi/GEPs r.HPӓQ9<\bn?J`YЙgB>3R%%r;{ ZD`5ZOFEQ!G^osHO0>LQ)q&liEl1)H.Xӵc9C?k 0?0,;:{Gɾ`[sii@:^kp}{aK$Ӂ0 9"El)M@N<|{RDkdۡt,O [U&2 &POݏn2R?+p["P> ~L2"W=9YK@boEzDNkZdq6hljkn8=7,VС #a@)Cn^*(W0;h[i] iER&FCR\*Q(P~7usm#B{ *P B x_Ҡhl 0gdHdSǮ* wЂߙvppGJEN?߸W!­]]oMA8Qy1]|JgpBif4Aӥ{T_i ދMO5%Shgr )[dbK;.T3x]](poD@h%Yԑ-71&D++vzvѬ p'W *-hűS z)`%kWdZqS\JaYSڼ뚨tMh^{#L"'%QHhj{$2*ug7AfPACy! WtWh7ɸ4`piq.Q4iӜb6/2-Jm-aR`)?ƅRVOzbmnɦk;|nI_(£DDZW(DY w:\ %jkK !ab)^K.nZ #d4.5X | 6 TR o۾cFKnB>0 z9:*7ORd9Sq.x2}Kϟ4V3ZYV[b.FocD莻b 56r)"&Or NkRNXV*j@e[QG1`u57PxNbBE'((m遱aV%v\ ܉m6HYlJ,$J]5AΝ&+18_(`-nkU5KdqsЮ7&(,#~sTd {J:h'DLO\sjPOim65|-ob &_nm pd@|ptos^prX)ϸA^&EOȸ\jwHa Kw0uKENba)=*_vAo .BV?/ԗa66@{|Ud GvolJN=~1Lm~DGG 6e'1t vى, CHCP7!!P5 G{`)G!@XqW'`+ix AGCPB ^/0 ߩO0$4T3)]w㮇8j!H뵞Ar,8p@W?ӕz %-ޠV4w:b[vM֔0<. YJ^2#|&*`wL\Jm:jt> 7_AjJ@?)(ۑPAweCTB~ C;*bKp6<ik?⃸ X4pAvy6&ЀkJ(lOpa\R ;FQ0A QK- ɚT;az!$KZGz5 VCD9~[;ͶvW9 $(ӡ*oҔ!a%h]-b`2jշBT yN&R#V$PU=2q$D`Ɵ19:SFN88/5EM8li t*X::l>?XI j̓c[|w tR KsL'n_zr+kJ'.B-A-Fk. W-05J~?7TCh>3f;-;,U9qYĆ* JfȨNiBCH;h6 \!Mdhؙaa>eMs$x\ERjRiA[w҆)Wn)k_p`=4px 0 ]"-3 Ji<0phMZ7@L{,G1 9A|D&21ЋA+V?rݺ5qo]&yE+u sK;wm4>KpygHk˲|nj[Ԋ@MZ DRYE`Ś!6HkI} }S&z 3뽠]n.R0 C7u0*ť<̘.7&NvGGMȴJh˘c_cZ{ZoɉS3Bo/a)l"0#TgXAH6J y"V酠]63eTJܒ?qo/N5з4 .׎k’\'"dX0ۡhuG K@Rk.TOXCZw+M4!n&0;BԖgRnuD_X9C:)Kwn6"+biDwTx%!+@V ]sq꿈N$d2dkMPû_"FR&@vlPJb={yP&>2]Vү UႳ#U:xrA5ZH9,Z{،!חM!6T ԃflM/{5piȌYpb"\ 3·00M(؋@.|e?a8rZuah%؜b(`=Ai0*4 JҜć4,*khyn.#!,7 W\\b/`e(  ׸8AZPT@D':PZE.MQB˦`R fn:A< LF@BvPi܏X[Rզ߹-8 ,7wdjBm.x RqRnh4u]>23KPLG2BPRWc& R&ibГjwgMa}wAbFt:  _KD')o(O =$"eɯs'A@S(75-q%zv4:YvCn'| -0%x}`z0-7n${ EH0,FB[ #NOLhO/BiO52Ƃ6 ˌ  `M޸LM_M TJ!UgzG4hz}/z JM|6!/ڿMs3c<]!8{p"TOx6Dhy;o 7/>d+* Bcѕɍ$WftE(0#AƗc.v[Aei@T_# JN۩;8 p 6VQ9 MPR:TAx4,[#i~⻠X:DD^ ?ÔC]4E_dף3KG禪|}):w~aCbu5UM(B@8@/2a#,{8'0٧Ab*.J>RS0Hr /yՄ](:6 .mPnjudQCڶ u\m= 3rwz ֵa-TFc\W֨*S4=fzXv@6H:saP ӥ@V"+E*H 2Nԍ< .A#mӗ(c6I]%ka5xwq?o.*XBQ\30X @笶Q(H_1J"Co+ED~2f'TFQP(XH{pro ,8f"5bd #h[ Ƚ{Bm/g3 Ccy5.՚iB(SHib6 P27r~%ۨc-& f~+רb)-4ɯi1tGVS`@n dg =ڡ9nO]9 -bZ Ke4;]sx (q7lx9n?03u{ ]T;U7qkP$)( #0[c@UPƺPKB>~Z M81lGk_q5A<*9E 2T>.d,*u4haۍدu;**>uCBT?A5aFP % Qus> k$dٰcv أ{uN-*$clHdaP}YEfQ)1bMVH`UَFIa%5F#iZ&;SP} @vf>#^߹1TT'8{PCwfwsx-VwjhDnh(]=;r?vdث^~elJi {nZnq + U]]|ƶTv0UwaГJZr`6!A 63ˎP@B`ZjE%(1`ҧ )zܱtL[pHd7"(PQEؠ?ϸgg4 z:4 #wsZ-:cP!jrieE++$8\7+y`.էQOHZlWg2kU"YJ8@uOz`AoܑT,EboVnaZh#' /D H -BJ EYVFb4C*Q#iT!"JM .YJyc)՗ aqk$BRkЂCE6{b Q &@ji;3c C=%8 #uQnq aͿ:-j=DG.@=[a8D"q5cL`W pEw8<7 )Yօ^Ĥ'*wtPȇKAi|TY/dAh">"BB1H6Ǧ6YNo"ń@)`^9 LV%0- TGR2,Q6m)w*L=@"Q&"v(WQPYt#8pKtj 8[~1Ǯ0h? F8VaH8N A}yGMIS bD+~cҵ]]| %>H+:g5DvlQi DNZlFro&J՜((뺇7HR *iZ\*4mu8m#`ۗ`t˧ I):0`p͘# *7xWhP S^[ tІrXB#74z驉+< XB S0YU%_1orl/DD-B59Zԁ'܁UZءiE,Q#b^b )CEEdE<5E(D{*ņ$Bm:_T,VWvAi-l*Mz.8`*o.`Mַs-h O t?fF V' "iJR)1QtTi[&&FNO -z^0A@*W~`ȧgkꉃh'cԿu\D2{"LXfPF]&V U*W8?` rQA85L(tt (c͗NpС#n:иQ 6Kh'@} Ԝ@ wi-0z0)zP@nbn!{aXĨia6xzxq3OU `'l׉*4 ~xB ycPN8l ]8a1Um2u)Eav=%5l|!$ZD20E@y5tI7Dl)wW!4WMh[IZ@;TC"J<':{Y*TN,0ˬCh6t7pߒ&!B7CsߐfYfL6%57mAIշxZ.2K8Fč=9*R[qPFn^BHZƔb90"@l(7vU MLJsˍ lp$or)~ GӺ7`@@~RB)+0T<=P3Kʰ6Nja//h(Q6\H5E"SBIk5! cj?VV1TkIc.s]u΅v>o{?2fW4#M H!8w h`4 Ҳ@cCU|pbԯv`кfnc $*J%߸8]aզ+H p:&{iI qRkA*вCf)CI7 RK# (Aїw\Ȉ /dTΘL5HQӗ^| "ey+qIRT6D=Cٺv1JͨA'- pƘq[ Y=Dq=[ZwZl`ujh*. C 8(I_;/Oo ]]CP$; )u_@Adkm)-+oQz@ F.7JF%ҹ^Uq@ZH%(ǧ!Z8_?[`ZM= bB@X hE J4CWJMk T(D+:aDyɕ$[Bʴ 6@Qùn+; R"k!R*thJpUJ -bDkD7Ą JfV Ѡ JFdBgF]0?:_Fh ]`*5 .mt Fr`ǀ5 ALIZO+ ;6tu%*A"h@%Mw4B^p '(( ^0@\/a f9wSОdH7+jRj)V+wqJS:uɇ;. LDJqyps{Kh9Ji7,h)0BcqpjA FSZz VȄ!xU~@5/7T=^[(~Ot\YvPXa*iQB6o~jA[Xa*dJ֝DjB![UM':э[OE ѱ5f A<@+j _0LaU Tΐ86B{!8Euǡ=hNM/B]{$/UG̻T8w:AD?Oܶd0 œY=T(Z:7VWgI.hJKJE;Ěbblm pQ `1,A;1}2rZt>YJm"`oY>E]GXꕨ4/ dcIKMCQ5 wdD@)z荧!39RCEt|2MD  y抨QF>9Lxj3O,Wʅ> ;C+ψT!ibO B0tRo`sPvC$P{Hm;P+ | e&iؘ"tXћbddLDE&U]Eq$WuY1A $DOn^F[S 6ՃQ&aDb!b2hmC' Gˋ$iD\IX!"ᄸf@+K7M (@ B4v25 D 4BHR{ҏHHn>92 oU?[ T;oxA|`"&( -e(OK ٬nFINč{黼FS}G^Wp騟" M&GqZ=1oa!x^(6| 0: 1m*:*q_<9t lTIdX*EH+XcpE@YK[SEqW~%|@l%X$%WLn( ވ#u6 'K JH_4CgQAMO H+PE4F* m2 [G𦋛us:nP&AУGK|V޸cca U֟qg[{à?#ܩ(l{@X$mW[1=e] P(oiĝS}GLZ߸He] 4Wv4{myb2={0&!,V`WOfM:Fܬ$P-:PAw_n4IOȐ = i٭ `yU.5JڭUUVD83fXБC͎-5۔!5rJDTiol3a LuҜy,Tjcj.bY0y%[JQz'#Ф5ޏN*=Pỏ›_]be$.tNp͒ |` p(w`712E%bhbc>XRP~•"n`-(AQd]ƽ/e*=M?t26D6O|PX〭.4P cc ,ɋJBA7VA{&܉[Oc>RTvu@JB2ƈhns:쓮¥4aCڄqk #__L.Ar(g v >54RؼAF: a+H6[N'~ (щhD`e{ d1F ‰G] ]p j5R(QDum5 \A"* `{ϐ(v;BTaPXYh ch+}:`yW,?I4_;{(Qh=ٗ@ ngcӰT}1fXm_X}xdin4ٍ IвΘ_4 ] -gtȨ݂ߐkC9 z`Pԧ)it9pckJe*J8@s;> @${2eX-&?.M@Zn%H 0,%>p[M)}kȹkdp6~C#QLQ#ro h:,40b r!!@L0a9P` ut{3Nhthsg,! RMp* g[x@A$&Sz 95I.T~͆{r ׼<(Pb7@M-4m.T Eu3TGxa6TkܐO/̅1)i+1w[%b>*n?FKɍIlPtaK @]. Eo'q1{rTvN IoO ( vɆ"A9bP0[<ȴ(jJ{aN&Y30M_rׄa-O~2B4jr5زA>`: o8#K(ݸ߾5ƨxK. m(PFˠ468Jt5n'K`άo+دHe" I_ fq & üo5Kub Hc+!7gTJRn XԤV5 2b\9>k  5$) 7OqQ|:?LO|T:z KJ52'f.ܳM@.5"TJ ~b“pvC k |4D[  aԯ"C:@&8\x`bV@1Tb{̨@0Zi~}`;KNfꆚ@OLg'lz? ŎeD-;ql]oqtp uK[=Zµ-Htx~aDZ_Ӟ94Nd*1A_V!-kl@2ӰOVͪyOVmCj>XfhJ:ob%+[[4ߙcjQٿϸW ߹"a8$kۊ,mqTO1¦=uρ70Jԁ T8#TFȸe b&/6My.#b =RPȆՠ)kIJRPG3Tvh9v[pVҭ!OAu&U?q`Qi LƐ3AP ~{Jkf4ov~b!7:j JU|PR=ˑz hnxJiT#-=" tfR%n&[h:?ق8+`SP4BnFESllI4鮢de4I' $' TT%!mC/@Z'9(D:`SH|ĉA@nYHFu<W릘 GX^nF ^%d-+sEXyþbʆlQC,/2 lAF.^a_N!P{ HVJlz B$U"څ&8 lpQ$2CG^ՙnE+mєC7 6's1% ֱ Jz!4(:ҍPKMfêT1]e&WgG>&MSc!=Hw$Պ输nH@C (au(Y\ Cb!r!:~P04Djr!kPfIFۄ3h3u H 2Z EPuj,F U|fA,<wkqfN)TNGaw)z-HdƉ.r&B._ʹ5 ٢\j؆3PE23]Ma lA,;v,<89hꯢ Mt"L @+*&/>~o/'ʉ|riq̢4 \@ Iv-YGԄ [6 y Mu@׹$ Bֿ  GML3P*%}V7eρ7QhzeoxSx_үQ~ kk~@vA*Vƫ B/x'4uܠdEC{ *>"w kt92U;XdM)m6Zw# 7HQ1Vpke C$'n O"=+Pvt=$ EC_wPDm)pZӥ(9SH*AZAWY/6&+*k 7[oK4!͏nNz5"@nO$ˤd -spmn@$cÇX:)T@ih[}F\#I|2R^ nU lu&Lꭁ¦w'Cwķ#|BӀD  L>0LE"THڭ@46^@S$lo|!vZ7`(ڰ-e0RM4][72"Q μ`7 BI `Nwt&ҧ0'")I fi f➶f"1Q`@aL) k@a3Y[ʬrANu46 1DD#>#նI/Ub`_ObTa5mJcZhtt <Zytv#S?((Լ6غtr%U _Yˉk?q+ 4]cXL1L#m6D_:r$vh2>:h!U.P"1۬H\Fwe H1%M6:`f M!Y8^XW BAnz)؈ G@)w6 Y]zbM-L¥SE6; ɐHֹ])b'[bʏt+kA1 E&6A.xؽJ^$ȡ%J1h7.[; /Sp֜;k@{l9u U!Nn f{δI(*M&+}ǒJ@#cb* HfҰ]Է($4-XzKUeEI ].CXOm{"t `ot@zYX%pLsjm|MycL@JIg7 B .$4py4[W^lzs %/~ধȩ`Lj*h67g$?i D?ovc95'|0G_E?2xqmgP&   &h.XX#``gAQ*`6@h<Hk#UAU )>'FI bQ!QN,!g2B삹z}H;;=Mo~h,ֱJ= w4+OTiT #$Ah}!FB@TØ<]%EGL YMlTJY ڇ~C.(f )kq 0t?ӄ GbM7(j? k"C1%Ӄ*:x|*y9yn 4K> Rf C^;!QWIP\d `Eȴi9:WM7+{}]y_VS qE!2$xP 88A\6/!Y\q>0"`Jy&K{#zN 1@[l2ﵡX#ENbRa(ĂV1_B]z1RttprvL2"$"N~JZc0|тt-(G^bV ͚%1jqup]7\y\7)pvD6. !^ $~C.P }TE khj{ڎc#u#GWX#%;( 6DxA}ƺ"ĀTZPf(r|tTGQ4ZnCFB mjvWGaHWT  ᝔dmI(\ina `PDB"Yq5Ҏvc?@TunQp w%l (Uݼ۸=R!Jo%3}rQ;L -4:JGhXF˧]}}i( DТqhc$v{'Ҏ+/k+O3d?܏FlCC` $UO N9d $TЊLUdpz ٰ +T(:6ۉSm#˂@Jg`^Df"Fr#l88Y\5?v̈́:Nٜ(}l+ DCIㆋy^|-= 1":20IoƱXuY4 }2 gQ$  %1ƴo_kR JU5?aGѪd6?LWvɂ\5GL\#}OZ2k)Cj6Mh>#YqV{'vY>&xd:*%\  S֩#{bBDb"@ԀmQvA w0G$G/Z:2t4RCCt~f06DG># :i&_14Kq *'ns銣[8nDy-f QqHȘ)oy-Bl0,MZ~wB A khJa Z1ڟRv=PKv _P52+#wT!$[qZf;Y&uj :{\ $ y)b.F ǎ]oa{[q /DXY؅)Q8e6vq4QpǤd:uH)!@3 qyՊ;48RJ 1'[,62@TZ݂@QڟAY#1tY׽3#%/!FT,q,5y[4H1T;^:HW(oEcc%\ ;{a[V`uhQqM&UDj0$%6FLp{lmbǼy}AO` G?ʝsqi#ؕ|V$~%f0PI H-g+P‚w/gQX#P #k3,jM%-x ܚ>ۑervQsL6hBjjuCYr ^nCi(R؅ư ;2s`ٔ*9nTXlf7Duh0d~DwkEE'qH~ 0| "O=I̳|rLPA7 @`4`Ů~LJW~fKǃO妿 ^ON6`}qI,!E[`w) ^oZkԥiqp$[*2ߠh]/kr& 5>UL78BPMH#Aڝ%`»1=Y Or(IC9 Evc5Æ-ZSKD QRTktfL:TH   tōCL]"y46#4`t[q79܄UGcchP|p|IX*U hS+NP⢱@Vc#ea E6jb hڜ0TXړ'!$ ZWԪ.a[_p e;(x1PUEPlu iNp-i)yjE|O][¯e4bvO0DQ_<nKnMl( r'H+@*'f>Y9GJ uocM*0:B:R(ԗx_0qpHCb..v T)!!TH*k2s(.`ꂢ?x:BhQSZ26bo-0D"WNOT.#mq 4|&g4lo`R(H6ǔ0pw8CiDePpWbٵ $Al]a5]a8lQ;_1cЮ+̷txiwx M5zAZj܁}yImBA=&ha] zR3rr/K, (J'R67vi@ET[=>%w FE ޜhYԗZ(mQ.?)P8 ́b|9Q6&Vc@./cd۲R%a 8$*:옍 ʅ2,;VoYI ) вG&; "6)$%%'RcB~V*r o IR&d]v V"ΙoPl 5 $(&\#hM@e%T^9F*M a^ Fw7 W^՝ D- 8gJD"Hi ʭv9;RhRPIx~3dް4ήp\v'R]4Q~?*7}7 6n5 XH4@Zktb[g/-9i||V@Xj r <*._|Eb(6 -y-4̾ z٬0P\` E+)[ PD,Rp{XA\2;u#Tg汸qAKp3o+ɚz8 jEt@Vkz\F$b FrADfﹰ4AQ_u)RRcb z-gbmME,Ǩ8*jXF$\l7 TyNj-KA#x+UlJuP 97[[]!bW{Y;ֵ(cQ lmd0N,Kԧ^lMaG RpF/j@CvbKefy 4IeN-sAETNˊ=`Yux\ -<蕵yzDgo1 (w9؂$߷N  KhEI[H4i+fltÊnHjAZkpBkść);sk26Ojo[ˈMXܴ]V0'ak5qnפHⷳ#@ ABks '{:VcW}Mآonf%Bo I*S Rx`RA82$G;B @lXlrB-024;YeG^-y"ӻɱ|D]rOs[02xE~T$ig ^4X&d):A`_3`jI#z*\qs+%4(݄2|_ZHz0Cc~b"Xҽ1$+=sivDKҬ4N$~2Npq)_T6KuJS|ݺRP?FɅ,nHP,gL#5aڋd܊74fW6 H1i:yqxeQqk )VJw1*]C:kCBn?p ض 8tp'҂bba+mϠQ ] }L}.v5LP@kWx:\@  XXHYFȒL; ʃ^Т2b ƽ:iVD@=Yq5=DÓPO% [KTԺqX(/?=-0 @tL go\{ҍ50m8HU(Cg7*K9"}?EM`j@Ѹ]c=pUb}v zgdn҄ \ n&pȠߘ B 1]e*D0YlZn `l{{6n1\0Z_G|a c/`!vN\FwqF5 (F7T̂R(OYeZ&Q' aL`*H네E؟NE=*kyF7ҍ@O+^)kBز SK>'ߘt3f:d>x8k.QM_TEΕEuuQ)f߳u-86H (wxPqGovdǹ|i JP n4? //?H2|7HZw .- +Կd5FҭIuvq#`Mܓi%`"#!}!i?s}HcR  cQ B7U0>9:$I_F[a2.F0 ]YZBSMt-q"|iLa$.)-nF8u `GlfcAU6֚!ЙvL8>k1dUHŜc݉ɚWXf*9Iɂ{sQ.-(3jte  [mUj )Gs;j 4EqF8iZDR6c7CiF D!/!bM{lIz&7IAp .|X)} kf!CHSs곖jÑ8rS} C&A kQ $.ڑ Vɧڣe @ l`ERhVo?Mۯ4p[NXt&1 i!@=-28~E;-FA;{2M4;`םkx֮7Ck)P,^khi!_W*ѫbhPcz Icȁ[N\ءls[.Bz=RDrsP> 5 SmsEs@IM CՎIq1 -̾RM$nA;5E==^st1a#jEDiu*[@%eJL0 j-Nc> .h1pݰX5}ͯYAKgkWmMcE@h5~96/'B+L:7{ /^uqa\IV`pRD1w X̛5S@2iUNWpp Z7M%LP xܭ2bO5(cDPGFjzdreWIo1\jtK8٧@˰Uqg-"UFҸnѓ)HI Bֺb73Vz*[TKg0" ` 17& vt045_a3n2)-)+8 JRѨ/{.Zk ^}qzl6j1ѧ=Ð- 6CfE D|T61$/?V7Qzpnnc Bv˸B{]`!Q:YNfݾ ýU`%M`! MP7N`t-#dqP4D5\#Htp4=Ks̈$UiPB]@n9bխ8@:^Q4B! pf\ =YP&&6([ꍛF}BH6 jk.mHA)(Hd_ohńlt(%KDLDV&A F"EEx:c4*W]h 'W;|j(z3_\:rT(]A ٹJ;=񋂫Ԟ{y*F02D/%b#-'-pD55FJ{EW%> I*V{=^M=Ji1;~9VJ X>&vIЏUiX@J˶@tG| *Zf)Ak%e D:Wie#kj3!/Rq5dd" ??DW"}qV,im"qAEKS8{n VG5F)/@6oEy '%ڮǺxq2ޙe +rI1>՝De`$<(Ao|p LI-M kvkn75a4iQ%!wy0)q(yq* CZڞ`kR64o|0%QM2\ۋ@Cm:d "` Vk\ʐ` JG\TgEtf VR&Dih3dA˕zpY@$> ,,Qڀ-N~W e*fd5AI- 71][n[^DJ0CY-Tt".>wfFRIA YwXh%Td c<جFC`6a ؏5ӊG n@ 7Bq<b=Xf-m:B VpC;z!qIHPX@l5 Zl멳'5n%Q_eWL?K8%H oTײk,'ᡁ(2c+aȪ HVF`cV)™KW`UKrYTAzVu4-;d}fyD#JjJuF"x>kNOCYl+wXe 4i?}℔ll-l9^zr96AIM >c=`)]50Z!v:ώ3 aa`FJ|[8'FZE٣;(,ց>ix (#hd= O5fI"HCm)n$L]*4a*T: . f&j )C0QP^W".T(ıv}šo| 'MO Hu!#t\XWU]#x4JƝzl667c2&anSCo4-"15bA}ƗE=t|X'Bŧ*GXN@*΍wP-Q N!CBlJkql`H鋚JUUQ-5bePA1m\TKzu. Z&m6 lqww  dEVyX^lަ5tӊ ME¹`1h4c@KaMxcoNɤ ĉ &PۜF.%18Npj;E|Zm)4nq.}gv:6<]s0^5!Adӽl2  Y:<.7 I gO=( yByvT5uf,o$k \QhI ow4E/F ԧI4YE, Wj,PtIk;t|ƊE)5p,d#%;;*; qjhoa%a(BWZ<*͖nz#>1׎PX+l$Kɚ ?DAEAoqz!Qqqu< Kee`+P(z\; ǛiVdqʘFm<6p(lR &i0μ @[a( `]})MW % ߘHY.GܵVG )i:?T`)Aajurqnex8zfJ P;cHWDbMm-*4MSS1l4n!z#(U<8U pLʄe(>v YE=.`7u$" w{5( *:)vQ!  Fs+oV&gWe̞&ѭ!,3DtRa cՠ.K o+S;xhx)M} . Ib6ȇ?6T";o()NkōQf#;7A&ܮL̀<|^ūa(M Eyn[抾Ltz%0>u@[tzT_!x-ZoSq A 7_;u9]ɽNy޿p,op_f Rt ⁐rp Ec3a˾lI L+M*x{9-ϥ ֔|1 R\(i6D-( ȴ))_LA;Ic]{3TLLoћx[ٝcȤbN{SK*sx.GT1FFPkaIV4ϸo[R={Oqn4n1a;\3AJ&[p kuVʫiR o}%l|KO?v/|$GH8! d47c I1RknWpBj|AD4?bt ~I=7G޶6(P끈N ̖!,BLg@RI;C9>>~c~¥b*2?}2* `1u_0n&=Tweq b Y'r0S" T]v֭*(Q+[ѕkk _ B&y#wA"Jj.Nǃ(6 u0.m T$!  MXՠRVчç*FۣcQveIjn% >]hAt0xG=*H /xzuK-1\*@< pLgGt%pk )i]E:ԄwR4V[[A&_ /_2o(CIw+ADkz+TKvdu 6ۜ[jG*CP㷠(rhw!Rz '˅@b Ҧ ( cZYl l2|m?0l!4U6)թeY{:.jRp9֣wZMxCіD`*9HBH8(Y M6l,G?pѝ^9H L vi s˷HH>&`$miqĈ$^1,.@Tt Tz08dzE& ^H2T}s=;Mܡ0i>=wqi&ҏ'L-,.-Aw`[1[(J?T]Qp(cGԟ.u`U3L1 M'sBڄ> 2W^6w ,IB 5UM t]Bh""{Mkt  ;zv|2ӰinP@`xنY]:4dEKRzcC$AEWqWٺ|sRk|nV:#v?ǎt?G d8 {6Ex3`[|,цc}O@~-qj^t2 JKbrm>?ɄcZzC>R !*Ѵ OVr-¼@"Q~c 5O} BZ X}^a3jSvk{ xJG] FӱY7 2Q@[X*wZxW 7\EIzGѧ;k.nk2TN*qKm԰] Rl3H7-_pU!l{ŒrD 0cy7jl[E{*`Ka%mUpcHP*q)z<0Vڮ-@HMEMz *46C6wX4 "JMib"ph1Sfڀ9W':`erBEUhE7z3"YYKw60)pEM:OOv3ji䎰K b,ONx{ZU9I$&m| IhΉǪ>֤̼ ] iGk߅Ȱh!1Giom\05jI|nJH*j|P"ц5GbP8 Q|(]TW$`?` (J)eAɱ7Ahh]("ɴiܾPU4x|pʨ.Z0XX<WZAkBiF:>L;t91n% h_[Jqzn@ KhKF4oP0]|K#C+.U&hا}E3c5b~b9Z ~?($@z(,.A,ĞD463( ]{ugڙkRiPBypf^%, 9aX"h8@QPxj]#@ 4GUҘ6Z >]7S`M܏(NG T Sa>0Ph' Bu[VO&iOJyB@]20%-P\hP)f6 ceCZ&J`U}wHerGf ;'<ڒθT- <^ALSi6,<&S\aqA+/ C+ ~_N:%ҏ1ѓñ]l8*:8xn Revl-gJRkuuBwnȇ9acZHIC&O}^a"[`'O6Q/-(k>c4 /H";?Ȱ,'_1fZz9 *629)H*:yI#7p7_BZ !S#\6l7Ud;GU@FjG8wCPƃY`d ғ " iSuIo}qDLc hv |q6]N4&tWL192Pca.+!&ļpP`j_RY[t޸+^bL@5` oNMBzˁmtZ3ۻa R~6JYoS2#poMbftX/X*4E#QU*nƊGْEMG f艝MJd7+FJ+t迹t-aD 4G,=Åaq)٠Z@rI}æ#^!C26_E Fָw6ߠVR ^ϛ0 fDfߕoR@h{l Њz;$nh(l{e@P:̊WֈzЉ ݦ<إ;D׃A&^;;B묉 t.|$ښt >GDafig]K~G&V.`ʲa_LjifqYd H\ jx D Qv&poXφw: /PJv?\)1X,myGzptZvbj(יd̴)9St iS4PP^ : J0ESgܫlR(1O<Ꜵ5Ƚ+L ͎3!O؉X~TͫC`\nJ t2ܓqORTa[i-AtvmLyEXjF̘UG7dI~$jD[O1ISPײ-^(pTj6`!z_K48 `ԕ{ ]YEF~H7(]cix; rT;iX@*Bd d$$ ?^WL7Fh|3ʞutdf'UCD)iuL ,t0xÊ"{kvwu גwE- SGRc0RHN$׳X%=HT?b ._`@ E,'Z4Pt!|\AX %Wx ~m]Mz7@:E[[e=oX>ۓs:4`<@BcXzm \gL FSR4`Sz5ȵKɛe|ĀV9qXH6() hpB%%x֜6  G~[!C1鸄_^;C]iVѱ2,gHpCƸ/K "Xt`|+X+SmD^|b pKw^ tBtdž;\ݢv@ BoFY "RP>Dwhڃ;lW,I.Op#jеFEUz~]W ݠV79sWC2]v8P$M̛j(*%Nw8 ;+--Wd1 -DP W3JZXc]η`#{BR' p)\O I>O/C]l0cMrK‚&̍ (>?SH:b, A ćIJDd?@\*Q(+,5KY7 XRpwz^4zq%B`SbI0h3"8l#rU;)#o wx)} Ғ5&ţS!w5(*/M @/`liGX J`M&{6~gpLLH/P(}uw]μflzcE4@GHSႸu4N}8zP+=0?p@Q!,DOHbґ* `I|ELd p 6ML #هO,A(O[PtCH?qí1QC-lq/cb8pt0%G!L&LjEAP\"yB*Ż?Ћ/\BOcGSR)@\nHCx"!X\ P&#,*(8֎M#6۪H 8mtV>t-L'aሐ9 uudΠ考Z3iM osV +L$4 an&h~Mf& /et=l _)ReH183H6KppNBx|;h]_;r`(4!UtB2ۃ#EVLP1uq^Zr.epWz Vvѯ߁*dn\Wc{J`Ù+H6X6=OCX*2uH>|91.!rhB3wƿ5~W[|a9TP?<GԎtrPa r n&\',I<\#<+_AܐЀ(-PM7! $`ܚ"Vt X. @Ew. 3VMEv (3?h$ j1Q1Z8"H+mG !pBQ|p{ԂԨhbx1fE ASw)W01i;}ʮ&KB4Z;N @L/z rvrs]c  xs@$j"]kqg/%vۅVbTH%;lm_]L$0FN+oF̏"qKArִ:䤓7?@ 8Ubi"Bټ/'[ꊎ a+b~(a@tOd3RANh(E-8?u+PUh3R@IxtQM)?pkly;|0wcEڕqY: jOqPdU-/JY—4ARFuL,MtDꃍ]H %R[%!J1S|I{jPfw<܈QSj~!6{;VASܦ )vz;md2U'KD2vdfanjDw`|l !ns4RX[AE`6f-%{q4;0 5ÚB3Upj]fv: 5s_jpI`2Sa$`+V|{\i2T.`T<E_4FBJ1\/h`ώaol.09qhM8 "{nΟZrIl}&f-EtY7b(NZN_"P&9E&,{^[  Ty $FFkҸKcѠp!~1=7tvbWbST,' )(| wDi"%F)!B;|ŲAQj4&  p6κ0Mc'BL4(BV,iQ05Awp ?pH&bp H, V!*[~"ձU=p*-J8> .)G%mPC{}Q2:z?U@ͺi(qo[wt0Jޚ=!)7]}th)$( NKSM 80ii᭯rhTSE~blJJ4<Ψ#31dwH#&Z:@F/ˈ<6!:p>!" dn tՓv*[Z` 1OT=7ѣN R0 ږ",'ym DQ6 -NACra.MJ/,Ă [a}:m4{\կtH8Gd 4sClM VDK`JoBPY޺jChšRہ_qX$bb .M:EZmTdiF(hm4' Tց\r:(xTEP Aa$zRZioA iogL=)'!vmEFPnG wᆳe(" 4@:*M`j?۞$ tMc7M~0_Y @)lȊ5i+Vؗ]Iaz@[5jQBڬw[ ~$lO9fkC&$%h?DD}[,g8GJM?s=A%A໙ .:pP.QIPx?.8,#A%aCK3z HnW2qu<=6:P@M|usp@t!!ԮTXюaT-oq02}4AiڄwKBHxGxP(t#4kɳ{)M LeT_iu6>=JR6O.1OM4s4! AL!vxµ|*ԉ V`o kA N@`&iA~{Fk6u#tW)$R=s/p"@/i E$;t%UM;T١JLT08}[`H* TgڶÄmnhA~8QUQD(m J qXNM/5f,ڷ:1% (ޟZ[hBl*EَumRt4>{m@I2%ZrSBA_ǟϛȋd"7]n@RW߆HW&,1""vϙw ʧӃRps+'香aEw Ш쫡jH9#ҐD9)tްkcvG&0H6bx] 4LbIjI39]INn,6-*Rm_CN#dl"6Mb80-f955Afk/bu@n(D Q +ǧf0,J4d)y3vk {a=`DbƢ |.cgʏ[j?q&*hߖYr,&Ыdz]'ES'k@"#I㉻Z,Ñu%hMH6_f=zO+}Im72F.̲ 뤯ɈJL>0KVZ [Ay A".Lv2S($[ݑŬT[tM<¢#Y;d '|\ZxஈE u xxw7j)pdKM7 x2VΜn^`'un ~sJ1wR"/)gN ~16@RҼmZ)xÿ I!iUBw:"3$/\eYNT"h]qmW`if4v' &Cv7;l%k$(Jn8Kӽph01:0T Du:*}ƣןB=diZ&O* KJJnoNUp v|;emD@mBh܍-tby@tnD7XDUh\9oEuJ-'U&ᩲ ɣ P|,%FOj複B/娸Ɔ?r"$b&VDVet8&ʜp?=_\U{aI( m'; t4 6Fh'uҡ\qȂ[TwxÏW- qHJ J٭b@U[0sfmyp!;R* %AxpnLYjCb5St-BЬ'>ZAmL`WUcsKXz N3#߶*K5'B.|fIwƄMc6H8m7$-t@ۆ~4 &躸Jt0b~hS$0Q ё{ \p^'0Dup`5nV WP !&-&h ~I5 dg8SX(x/a nVzt'J5Na7 >rkD;0#VƹgaBčTbɧkr#i 0~]LS"FB}ш80}P+0}&W HNpxHD" B hCw:zCz1/l}G<\G쑔ޱ=F]3ʁDvo:/@>'&(MS.h॰hlX ]>lϚ 낺NWNȰU}V%H9rФaUoo-%PЦܸ Aޚ!]%N(Z¡{pEVG!e)MD]θQ5/ԏ3yJM((LGx{J'xl"ψbƭ˳4@]& 1 N~Q7 ЬT4-:n[e&)~3aX@4r%m>f"j lkwyΦ龛FSde0 nM6nKܮԀҐ0wؕ陰HfPHW' fưJev@R`׀&(x{r"vMΝi1jM:ar}XyO y4%?RFngE^Rh 1F`Zd0M㙴~B@ER~bԎG}d/tbc=Dž7fG-Uп@Q&|Grܾn۠a :n'wEы 3PV'B37%╓mDE)wUfۯb7&ϳ(]иZPBRv+ q6L#IAKiw&Cp +xF~ʧ50qjD͔ME ӿ>,*8*$fPAAFƵ&̉ܵTm1 c݆̓E?1ܦֹ+WE#XNBh#'`jW`}H_DA.-$5iB6sEBыGc,h=-u|Ъt?8ˆXWT#KMT;!2 /SYC:q2f(a$]IO20z(W!۠>,'P8DI~;j5M![IJ9x2('#S{;u,hTM] LRQ5dd(h9Ƌ$fEKZ$M6‰كu.Y_WcSCj}}yl`DŞeAiOܥbP|ֱCۈJnQ6kB;qzR uߘY 3qaevд=5^+# Qʗ*+jiOfœz}'iO"Χ9`uQ~xaxwVKOR /K n&]K_KurGv[`4m&%72u%*(Y;,M=4DPpN9 e4 ]$*2EN eI5!C: M?#͟jPwz\ ʥ8YqJy)UЦ 0;tCQD)ILISDZ"i(Sljm?y-wܤNX?Y.})C:~8^gT̨oR(lOƢU~FuςTQ D*.kbv :B +/sDA=M}EWm+ތ׊hYAwuX AWYw$mdu`Dd98xTpFG_!X]o@ OfMN}w*T.ǧDψPm zv1 SffZQ(;([AΛ 0u.lJMg 'edr'1 WTDA@{$ rM؂5PC645~ۺWоn(Ƙ] vd@#Gm$TaYD?IԚDX8KD;_Yq+4RsFGؐ{ 27+rV>15 {Dy2($D,㵣E7-Q@@?Umwv" LeKen ?W<"m$`HuB\&þsjj)!-4 w榾Z*@Oa~<\,0ZQ7()t=o 3DGW*6C+z*$92~4ǀ!xkX,Y_O1C4Mew r[q9.uq*7MY><)QR<m,| N|Ĝ\]b-~el \haM%ߛE!؜Zq }%nɻ]G:Ʊ=<l18 o|`UMg.lu(Ի[O#5))C1_Y Vzp㾾v<"KP!Ɠ03^E6(~.5%ThUG5nHhH!JD*BLX>÷"+ە5ޢr=vQ8(u+zE տqbw@`-\2d-XFj*{/_= ʮ0fFrT3ܛtocD+*v[{e1)[f@ FBej%Y8Sd]]c<0\hߡtk,w u8Ҽʂ)2ϧ2f#=h$_0$ J ;A54њ0c VK&+-5Ǹ@[oTTEIL"f`Tjgp;sbA݌l0U\bVȵfSZBY DM8;v93Wf7}(D{#ƃ( jowy U)ۂALF{t ~4bTc<) c (Ao1fnN4jJQݴhaVi&DPCqžouYPj0r4"9^l>.7!'O{ AP*Odz8pʻd(\E]7͐t>sgF!ST?mD۬czbnDiӲ!cj\I[ -#qT&Bfcys*Q#= ,, nPvඒCQ ȳ}DD)92yOE~L:P=M4Ҥٛ0H+UVػVMmF?-bLdȕҠ묌BOF^D[#U]{bow`$ۿܩL"?VWino]cD#jBk1VjEvXm, e,_T{]a>S,(*=& v6opܓ.TZ`ie]֘*ů1;)Ɇ&JX, N@*2uuA%]U40iE|͋HHXۺ2Mή6DJYI=RSc:0`X>x8 f?HdAA 7yrMR0l§xoe"6welf;&:ͤ}UDw߂5za,7טs H1,8PxTg0ʂ:I͙5KHw87;?b%BJgG6 QQe:s7_ )㰋!G]e€R! iB[A~4E9C-a(^nH^8J}a9k θo#Hwn Iy4z[= FC-P WP]Aβ ԍ&tbHUw:uGw@'QzδU#n_ܒEB ?e MR`EMKjy0$xhPhnf(@7ҳ{f7Ā4"&|uSQ0 B 7 iP {rkTںdA t׳[Ƌbli!={Y+hogy5kIa-=&VD[?/CEv&[Qhvo;9bnGb*!3Nd*J.!qF/RN]wXp /CZ]+ָ9lfrom:& kacXR͢)+<:ڨT^,1BUiM/R@s] 9hab̉b6 }q-^}Wt[N/]N^u(+'ىPū~u)t'uJ@br(Mp{N8, .%4mdS4,٥ZK)$XRw}Dk"!$h1) Ŏnθ=ZSG-j$rFHL=¬Of@Z=yŹP1Rxn;2 c&WIJ#$)DȄ!gMShˆɓ,m ďak* )sZ mW"PZ'̂IuaLUi@08(0+ I-P{m(`Sg4x}CΠ:3U k*J)병) K3Kxg(M9Meڵ^yoh!ݜ]z}2n`I L[ Scq:H4oH#v4>czU5Uj Z6ٕ,Dq^1"D5s- GpeHU(>}`r4kHY- %&˦1SyjjHXۮK; XLpb6bNkҾe y ;>1 %ZPC*f }!+/fLH5H4l TaE1؟m:BW@xFEt4ʑ@t[б2S_>N@3@ۋlq"H}_iBmx2E"h.]fE0XX7E Wj$e$O92Y+=pD-`! NKS @4{lP'7L:TwU846'–f*yNЌ%^/1@{}?E]N "At KE{}xq,TƍsQ{T׃Wb]*?Mw{@&о5&nNkPLK&Fo6d5~5PHYpWapU7EB:1Dۀ*'TH;(`L:A]S.x/4%p[k6{c} ח%&.CACD* oC$p?)DSGB;f{f"oهٔ Mk&,uE{T47(n]5sFxTi9)OLoJ0'A m\uux-wRے?¨َRBwFc=ѥ*MTgGϛS 5!a<oK[kHBkC {kCxF%%әK*[ז}68M^2d 9Ir x34]fQ#/T E&4>b@Z.׆xH:O[@G#wl6~{n6ruZdBhx\ 2u7D? ٤f!}‘)U.[5)) TQX&]C֤ H0~ % RtLLO12Dj1s5wd =mzh+uITun P`;2 YbYO҂]`@q{P~w<: "6^$Btg|EuRQ2H7h.!)E뉏فD|8*;\R@Yj S G]\HMS]6@f 5AVt!µ´ o>J*lG*\cV!z4~NH|Po$n;$7BF&"`pfܢ7>V>\F4(΂=P(L ]ee"پd>P%շ[\2@Btqf6f̋ێ O[UNA,Vy5"'\GCVsp+@[(ݽȩ*=keGK2qH3M?(h44viX6wDv@ցk<*:PcH@(m ;MkuMRზ*(sEq%+芐>\+D?hۄV 3ȕg6&b R> ACfgժuu1tHAAEg&Pv`h@ {sU[ rw Zb <S'jEi&GOvq @`hȶH,BU5@7q R$y#?i$bvv͝z\=ӽ5=2Mz@&$Y<@ꅃr_D횅'S!sxjAT|R_ >&𓴶ӎ$VhQvIuT6%pMkT$ U8Qi>m3KAsZaO㸦 l:~*HcnZcŹ,(L0_0:@+X4#4]]bKGIŭ3arC)B:*E?@T7y [nOsʸɒr)wf #g>c0c +D-NhC뒞paaB l Rja( tˢ;vE%bNC4K 1~)wh;&L )m{%JD\,#n.Ux]P NKI|K1)m%}R2gƩS@ j1a$pvw16u"E4P{Pg~ Th[dIPLAӣK>#*`BT<8`ƘG<"+0xFZ48&lBR8'UaUX;˒hBqUJ@FQxiLY X9UtPDp̎M&5+ЗGEQ,Ѝ_B!%?21ok4X! |u DۀyDE" @/J*6/=0YM;7!HJ | M~c7i ]2UOd%чdbF " *).Rj~;4^}? ٯy#W 1t(wI dsN̬"=,?#"R&~yAqݎZc u :\Q/,Hh-$m/X\I{vA@ʀ2*&-;6o.X>+tAͭ4ҁ7b&ľ͆=pɩ1ZihV]DAN~ `x iYï8lϾ\ SSeqҐxɽsJ(չiƽ)*4r +_N!inиQK~XK.Xy$.ɐ˼~z>q`c1eȒn?\|kJ' b!9);,z:en{r@n8E]zc OS`am5h`CXr&m.| XS`6n-h0J^G ~!.X#g LE@0/b3/z4lnGia7 _.j^Ԧ}R@6hqNAiMR0L#OD0(;_#~/TE"$=5V? 6w ܍~Ҁo;>F J֏|Ű# $A?< kGaҠM#]to DO%n` uY -DhRd +JPk0iȎkliv-ڣ hΣ<Ef(Kc9C6(\h-9ۣ9|JM;j+vtބ w:x2JT0aw>$h}}e.>3VyZH6yhf2Qij瘵Z ΉY0aMIxRIz] I l Q[pb:kdgrGOQ p((i+4=A/ȕ\ސgv j愃fQX>6 }&9لʛ@kK>CpKD CZţM640MK!\mcOWc¸9"h6oz$,;"r.fDgPIoKupvۓT 1^ :B  !Uʅ -mh٪k[zB* }9Lz65./"PX6J S}prW }VEoPjB bH$R~n7TtBD6KFGhazm/;R cei4p&>iq QZ^bG$;_`t6ƅY 9[89̴= T2 u8u<+zuXV.hۼ" 5Qb ->`B LqV+vb(c@1ޖU l 1,4N5gzc@1J/GCҔ5zc#\2`!Pܳ,M=]*hh1CdaQ&,6 : KO3j %-iMobܘ륷?F0Cl~CADwevM )Y2٫ H#3 ~,FbXL7B迳 Q(mX8_u*+1#-gEAAK#V[w&`#Vxn֮ {닢hڹPiRpU͐؞{@BkSA`cFV;B {Շ7sk}(`pBuI nAbp V$%σ8NH+Bs.qB3p=Fh0AEe=˃to4ndV&-̰$?\UB,,EA+<v4֕cLMB 4]jczP6@t~!D՛_qˆHvsmh.A銌Sӓ7\&: ~:{|0(Zu7җ 0Op#/"R}0ʔ chٶ8,?yS, /n. &\8epD&@A7DƐa=ƕ.f`Bݰ1򑶂 ? YthsW@vk h3A( y9n6DJ@\H{@m Z2 ϯ"%,`e,AV[P!_I7&(K#Ke`H6hU WNlTۺkDS,(Bw/WQ 1yq{*:uqЊ5oCq$N8B$j^+N&!гEFnvѺ~&\i00v>%B2_nd]A P8{_iۯ36% dxwLBa]'KplAQf4ɖSm}xaDL0_Aط4 g5"e.'U S/Q ti:˫t)`^cۼ>w螊`V )J )N4Bi>-fv#ˡ,,`R6ca=6NH\2y-؞Rd7/B M4 TH+Jȳ lRGQA0fx C'A9t>:#R}(H y@_U*.bhx7@|,'Fv .dI7!s+Yw۬ML*V~eܬ#`>5Vm-oȀ[Rp)DP؉#gD֠5$ݠSBs%syK@Ma ! :6?QlJ;\ˍ&9'N1\kGщߦ7cļڲn``0$zƲTAR?ņ~F&!RM84-E(r̾Ѧmy4 B!5E…3McUQB?ZʣP5Qq)Is )uYkAJdٸwɎAUC``w4~*(P[2%wi9tiRdJUq`QHlJj+Ab]Z @$Bo h8+&VHV@l#vS܎1*9봔5Kk/siEz5K1VzhP{I/3Gj5QRҒcxT‰\L>+W=ha=y9qGj50lJ(55%iQ8l69T_2qVseS`-j!E8=msFa2;!B[BXx6}=Ydxj7 GoSr-̩ԎT:.MEe5iyk^c]xjlS8HkBWs~^ǂ/[ %`$b u! #Ah@Mq¯W )Z"|4`V wPpD-xb6AA?k=J؎Jh8O2̧UdΆ <I6uq^[w]xzbtX U:GK:h|ĮfLANi,E,ݠf 85~n^M )BlDsB&ҿ'!L5 Ҋ0\i"tG2cFQxh 4E2$-XH^ ں+:gbȼNpU#QM$$ Z(\¶ ~Ғ] ];;CP/XDEVIfX|]~n ,m+׸Т.{e7 @!Uu&pr@[-u-WB_wj Uu{VlBƍ*i|3=(2 t]08@7YPSz<ˑ3W(6A65&4}dv=1>BhpyM1wԘC*Rxg7oZ@Aw{2̧-s#h}_w"bw̍NO%"nA+aj-5s`U%;bRR)$s)Bh (%J) j3Ӣk1[)+{%HSAmis/ lI#@HFi'\IS@+[ѐΝp4Iz~śGVVCuR5FDlTmS~aP}jZ-i(v) 7Rm/.\]`tVQp_j#GM)kZ,IL,@ {ߡ1DYtTJr}WHv&'BCGI ׳:(Moo ~O ~l\bf95P*mɶ9F鱧 Nr5iPsʂ@kB}F"L, m~bk19{]~^[T# DTf@LeB~N )=%Da{І !6-  hR- nJD;1u8;ԆSzqhTW`_+AJN|ָBzOq3 4}jJ[Umy 3uUTjrDE c”Tu uXƗ"dbL̂8{zlt'-ޤ#Jr:KJ QOoY=1ZZIpg19, :V0:FD~B]-5J-'x Zr@QE {uXX2<ֱ;U cKjH ~{ kw#KDwX%˳qFTMUvlHhBf3:hM7fD #@i\oJw?HǤw0TED(t N㫐58" ix( Ay4>Qmc]7kk!,~Z :/̓ճZpKD;$dtGq58$vvk Vɝr*՘淇ss'm&J"*G7dDeל Q oHdCwQboA)fS!OH<0M]wF Z6@%.De5(H62vۏ$Qz̎FXQ]Bנ;\@æѽj:&'O*@ .l~E,( UԔ1;"ni5:{aէ`A/G_1 +[yh) tgF Yvcr6Tfɞ[H(BHEJ!B3[J `0P VR݃GA{ݝS\tZ4(B!4H.00T=4ȕ,V FHىYXm5fHFpQ Gkˍ{R24 4@\^[`4zd5K 4\l@+BSEh& ғ n2 q悐xI!J̃cn3gc{؜4ەmxv#iYH ;a.R)TFnUN8X٠r^JD ulX%N{`X @&4"XxRJMZԸkR*o I1;D; Z3"o'Fmà5d8ѶP6.R"S(Ϧ$=:M۸3HN# 1cbi|ΟXb5~"(G_\! 7cIoBX4JD-E,K4Ǯ q0d:?ZId>E~AWFo,rȭ_1bH ,t ip_dPL*LD9H6WfJ͉VT_IYF@tRY#ɴ6JdtdmBVĄFmogNP. jöc"gqT. 4;LR 1~ Sj;`jDdZ:Ȉ*&8Kzde]XU6m6tr\80joJ!^Σc7CCDAR`ci"lg BHB`8X2& -U0e݊Zd>)8=6Gc0fpTW%6@k_1 *th8GG4HOFHh,+Z 2i,-aHŦd_K;^Cd9۶:?mf5kj,Zѽⱄ# غ|1K *";.$W"P<p R0BTucihDqK-yBmIqGRg֣$O#Ca֢&cԑ錄o8 #xɶQqT!w+ciT/<ɦ&!~aS(UnmqbjMf_q[|wbOEB.̫fZp@$JVYTC0 |z801r`ܗ鮍ys#*jHwp`s )r_!U_N9$8d{߂&.kD}f GD\[%&gN9乆'kb ֥C `ЊJ(J>W(]}2x`eFU +=8tXRT6 ?>b-)~C VoXTnJXAƝ )m~#9*;d.QS6*xs,m"׎c>4ͤEl;=&$u@DTeV*4u;0NG{z-`rP KbvT&0 X(0Ju 4X{d0@Uw"5J#V`hM>fiT}E6a?n'nh@ .ۛ9z&$!ҕ^BT KUH֡ <#}ڙ+-KTg)]lmyoZ5iRئKv؇OFD&D޿fF(t~c3Dl wB?m8pOB]nu WV+%k|B8րR4 TunB>epPOLF`yhYe,V*&Je@>N,t%x8~1|wDIj$Fr[($;hCBoJ`#g-InIS'6BÿTkFĤ &jxP#"\tmSH@[OsT}kWd}M9$%lu KZ Ż!"j7$Md /9| jȣQM)zv|?3[+H7Vu߻ /cFj bUВzƳrPhS^g&(L*(_a:C @`eώqHў ΂3^Y M;T! bJmq+^V!āz34bOq6tt7 5!x\Apv*\@N8I>+@[eW4]ʦY2VP#ycBe3 j&J8FȉZ(m` $ʙw$:Y\3}jHO_KBU/mfUrsVl$7s e*S->\{:x*Gn h@SH1hf'{`RT "- pUǸox *鳈*nXGSm$_T2KJp<2] vkۃ }hZZDsD[OӮ hPUs#m(0<Ӛwb < ۭbJiN5 >H:{[M+ Ig t)21"m8]ܒN` ji(xfPt&>ܨ b"l޺gDp-9Oȇ)GTG[5fE[ _ `(::}@M:op(]CӜҺ'ETY*'& [D-h]Λl%*=w!I1`SH .+4GtB:>|+EroT) LA4VoKtVɀ t:$D.KQvֈu@W d=E^f^ꃢF5=(R*580 _15pkbJ&􌋪o>I4O.?Fv8 ܛ 4th ^no8kIT9.tQٸEsks}"m<.dCa!fR4Ai['f0cS:D_+]A@"=P!S٧qH(A_ Uu-iBuUmp)BhoI:ssGxڂ=?5v+AhX4sjBQ0%Bz;`2BD-72IHvt0f&0I{2ݡ, jXf[мEsQ5cA@RQ&5ª'zML!t$MkV Ѕd {4|,UP:jZ?& BE='i6F0+[fWmo+x6BctaǚmvGO] Kt@#hul9yOeJ< . &ʔg\(EWg 8t xc PyV OgdG!R_ 1-5_w!҈h:yS[JU0sZ|+9P=HĮ2FDޯ!Q]QkԽyw5:9Iۙ=0+p6xw+Oa]0KXV4v´z$ؿKF?1Bha̷tGhe[6F>YifӊF8?@eV %17EKR P5%'_1*N' wU\_*>cMbQyվg`z /2YOA2R6NlTyӁ8z;?(Iwi@o^0+!ǥ"zW(a9TYWt֪n V@uMC띱~3`pHmexN=$ RлlpeBsuB*"lp(4`$I1!EÑkrWϳt5uv_?zfiCMJhv>CkUygXC!  c ~"? a끆vT. -aԳ%}dB Im8`Q.d? )T43B/%,NX\E P.Cי( ky ˡU6s4<Miፃ,>&kE,Sa,RteUeR4ɣZ%f$iTCl` Y?H4NfOw>q7DU@j{cGAet^وN1 5t;IrKWup_xeֹݡ1tU@W̚]hZ9ej.9iG[U*QPYd^[{2+. v4¡6Ei'wL6 mYt ?biF)ӷd'҃hF͎!fXJQw\\3f|E۪ ?,pJ\p y_TA1ӽ,(#FGJ`mGzR žHNoD t0?߰x+:hX|ǙԀ]P?J@d5 E5ZFhu'sGȹ.>" M2Cj9NV3V H=8[=yKE !KR4L x~ {ĻVܕPq[~Mt-F5r>3AWc,n ͛oW[4Ek}v:h\bWY.o<±#lqZrTPUmBH&W*tӧkɉ͑Ptol2jҖ;|z46e8%PW0}M.@[5,#$g!fQAa؍`eTZzFqn]5L47c͂J+&B2(]@7ֶ51;BzՇa`*=8A˃WZ*ox{Kh雵od47ĄM]mr W1;Pv(n $вH@.5 ):>\F86vHq *)HVk- >M/0'= ö7Z x$ } g*xaya"10НPq$*2'r2:eZnqg0CE`|13$Ln ^:La*h#5&65CjYb@$)2yX|A#Ɖ0\-jHsY ;=Tg@?X/YuZyn; -@{^+9kTۗO iL~zԉtb-T'.W,}&gy7a5&N3R~| T~n2vx^B]a߮r6Ā5B~e"*,קLZb0pH,7 %Ěm?FM> `r%cڽ4AiO1qdQCӷJOkX6c|&X5o\n!UaJKhvUC!]7xZWBqk5$l#RiXQQcۈTD!7ƀCH\z:b j=hz+u\(@Fj2?1x}R!#m|D +ӹ顬hvc&>MV#B9]W6; :S*I KL9q=!҄ŎRĊrnPAu$/PAz>hP4?Ua%5 Q~{ Rj 5`40OB$% K)1 kAroKQu7D6T67yZ6,^2" xjȋ="-AִlAt\ڐQiA@ 4\(caR3'Ai%0 áQ\h,>a. !Uorvվe!qB rҰwkBrP"GOx:aJ I'`]X &t܋L%J&'L4Tnä^yVBC Ⰻ_`{d;Nɓh‰ӄ.jX{pX.zO蘿 LTWfN|s e:)AZLJDKSF#nWpmTVlh@7A}81Ɂ/_đUYҵ>NT:aDx>9BjѢrD_"@= T8>7wd H3 Q_{7b«H4|Pog[@CǸrZ 9䧥PgchP # +kPZ,o4Z4BUI\qeX G-bwєn=~ (: 鈎+IQI8@#MRkn & С6/RxZH':i㊅{ס$ @xf?#Ą\. UU%%|]nm:zKrO0@m-z*7}koY u4*i`,' h7Ė8zt3yCFCVԍ%)`{JRּ( U}ʎjk&v@*R|, *徂b1TtP@4ZYw̚5@P"&ܵrW4eX!U QPp;, sC{LVDiv| &]]J${w& J%ds7_ %' zst؀G3\"$\Ijݧȳa؋P*"f(I!`E&pnCPA#bud't}PA@4RAރGF 4% X) $-Ȏ"U!QHRW*YQsg_ћ*ЇP͹ HR`ث8 U[.1mbL!\snNX"kq(VŸyVrıx ak] ;7C6jQs| C`)/;M=vS Gx\[/b& <ăBYnrG<c6F8k]]bMHiF]E;)x0V n7 `٤ 6ppPR[=aw!ED%,&J|tnc;ՁdU UFRḾ8eM VkpISzZJNlU ٰWK1eop*W#rpzm|NJJt1`8B QGN,7-$JRo EMvD(A_i9HFB6 &6P!SF#L^Da>\V2 DE!Ѭ zxWbJM`Ԩ"nb=5sx¹HOUC$jI%j0a kQ0Y=!UÛIEڔ)ZY/*}KDi K ryĭJsg򱈒PCN%NS)#-Y53Z*!y[7u\ 1KX%۵Ԏɸ *@q+S̯6j D: K2!bQ6Y`sf FZp,*#n¸[$tN-0hU)= +_P+7OeFR72ִFGB j͎БJ[e34N8(xciwpEө8¢̆9ka(EH )Mc67"ƓBO_C KtdϫERaH}&T ZLbchUk A v$feJwXP-_&G01E*{tp|6XiNepjЧEzL92fW4~;x?sÆGO]bFNFq&`]\qE~A8!**K!yXoFNڿ2 vඃDDl]H"P ݮ$CKNFԑ&خhD!66IV(CJ4Z&~o2`&̓ke{(8v,D% Hȳ͛<4_ 1D<Ȼ}~l踢; تrHB*b|vm[9\"=@VwHȥPk()~J6MYh~#لكQ(6tVqZ!@Sx(!VɊ6V*Bl`\R\ '#E(kվwj-kEDEqy@@FXQzgu] 7j7-@"s#Sն8]We4bĢU!%MᓠڊIyˣv4a$%tl>nl#*\xmU[<]p ƠDB^5BL;T+e]:rݖ 7 6'šW[ӄ8`'<ݹ-Vw<tIS-T=paA1>EVEH>D;>JhNOg. (11P֟J"X'!bD ㍛ԑM?z ؏}jFpۄ KZ,dQ C\ }zMxX1^k 7UyZC|Z2ZR] ;( R@0ět(\5Ppɑ#?\ޣƞ˃wH1zk&dC (mFQ_TVI1B@n̻1P!Q 9j6e'Ϙz|3qخk6E!SF/xLsS虸;q[H/n˻q-'T X],T41`!X)P],8ta!V Fy Q ։2?ԓ`@]#0$aXK& ^GJ)~O*#Z3=B%#N@Gb,nl:Si]owXJn OO >@9]1dݴD$r=Č L@ E% -hT/§ I?"sTil4!Qo1QEn} 6MkxK2;4q.XDv?GADadm BwXzaTIנ54ѭƇ/Rp"EvJ J5J4c>AQ&JAsP`Hӛm׊X j[$X/1| .?e[;pH9noey]#4<=6V#"pBx'#؃@4zs;l$/PHÇ4nKp=i ހ6D¶Q'$]@R:w/Dn2k-%w-_*oE]δeQ{B) Mѵ0"@&_PNsѕ5Jyzm, ٸ԰U0/*>}]8@+BjAg0|p{PXe_˿LF= J~~矞V7 A!{iҖ71rl-ߘ1LpYs4,}o0mĂX)'=ˆ"R=q݂yfԋR_ԓ⿬e}L] rL._ }n:H߸ ;\Jyڤ-B֟sI,NMIyǸf@ ,2Ҡ㧙Fsd˲"y. #"]"*(&ӫ. ofQ;=(g-hAe7hqLAZe%)UuH_B&Yu tT~eЂ[FM'W͕ԸmVQ1ݯ؂" , nvg_#`P$nԼ 4'v'~ڛJZxq+Ӻ^&VQ}~ .ӿpdƷ5*N`X4|w&)G\Xl iZ`w`dݦ%{ "_xڊ:-d&n :sųdkZhnXiØUV|UwfGtp֒ÒeEh>5 w 5 vF  [²D鄭_P'c ,%zcOM1"s(b?AZpTiݙ:ܰ/Bx~M CS 316NyC e{ēy8fAkߵ!=1@vfG 8Sґ:Yf??G0kin1`@'1#1d&&HCBZWf]1j[FUq6:-K2*/jOT}d9+4w"1baƕКaKX&aCQ4CM4XTnc:̠i BD4A٫hbiw{Sb%U&t;v[滆 +G*=QS`*lN)ˇzsEߴ voF 75jh-%һȚVHNK_sv |ʫWbnv=т6͹O#vcHh )vyg GiMvsPܙ#P2!υ͓}rɑ0 lhX].̰8.%SPwi6#jA"Zz "A<Ǒ4/"K((j|dJoWM>56յ9pCF)l*PJKtYdf |݉F#}CAŐ}oa(.<2JRa0/@yfw5 ;&T4"$RvC{9].̔ ID~t$ &㬺mv"gQ(_6E&W-T)q@2iFCaI;AI$ΎZ]Ŋ"d$5$Ph5ireP5aQ `l4X=a+ %CMWҔ@EycZ@Iv$*jL<4[D#` Ea~;A֪%lJ\\oG;a!T$ @r曅YZp 7WEyJX{RG~e@6nܳHWZ4h_˃"᠑6.?_~ysic oMy0HQ`>*I_@cF P%0Ŷ.2*l>5$ HmmyF7ùDf8c\ĎRNT'pr ]rOFWEp ;.Ufy$ F.^pC Dm&6/Dj50 ZvMcC'_ϙ̦j`40tHsGi|r14#V(ɡ!-^Fx$F',RT"Zusgx+aY *έp \QFiQuC$/- 4!rP: Jn|=5?#ՄC9>Ģ(ky1:ٚɀGxT;ԚO0>AY5<dѤT48N4޺w>(i^g#ӡtF ̘DF9-c(b0Ɲv.}e=y6LaGLn6]ݺiZ3S$nH{(;QIbE]Zw/FfH[{2OqNkBJK؟3A$azS+*ΜmsBUKJmI*MmQ,h6*)D<5Rv>wxNBP;^B f+vjNsxe[U&Nd5-mJcw$-eqw$ )"j`KRq '9֢q=i~b*Z&ѡ+VaOX^7khf0`QM?G}reΚ{Fi cXd@)1L~ed0QM&[$j`jd, z8)$[ k GuCwp 65YE05lNfK $6 G @Kˈ•nx+YZj @F$*cރQAYFᖕέ*џq7/f)t i5?1H,A5v<#8T!x_q;]O2S= zy'.+&d=trnRY+'j ||i9i6{s|wCУ.4L8&fD/q hI!CyP| I4Nf'@:L[.=fHbܪ/yBhvg^,m;*+M(K@ ;.l a$'suAaGl7'ph SVY[V0@( j%W4`T \VCt΍L)dHUEh p`"ޔI~?}2?^u wg7[V g 0j,a+$`,i%:Œ;QҎza2 X<.NهPB5H}5y!S`}2Ң 1>fa(8_ 5- ܔ.´0RRM~߆V),TuF|򪄣*5X$?`4wZi-!^cQ9eDP( -uYN}nJd ,*z@TJ!Kz CwaK}.[ԑ#EWX 7^Y>Tc}%Qĭ/C Mk]i<$fT"Ժ =1iwp!$x1Qpxo-^/i߁J撂ǙBxhnm=36k [75p CU$"I9*PT~U 6# " O|2Kn?1ABܫ*jɿ z̒)LbQ=$ Yv(|!tyu' |@0cg8*žsEcO4 ,VHn)4k܆1M>fW~/ Fvm@Zk5@15z4"3JL1 7fU$ [IjJo60&> B+p4}FY c1ԖƦY0icQP@#a92)~Ŵ6 ;E ED"Tᦨ?(1a?2]L.z]8:W UT7?ii2Uc_>c#Do'7`d!HMȂh_ [yPnUbAV'2Ш ?R{6T= [^ŵG|T1ɦ%F0~8h4q&Op"7F0mi>" BM&# $ZbV*ϥCbx{Ҳĝʍ!@lmUkn([?ٹ(-)\GJ!G`C"*$K8*և z[%NWu\\cu_0dfR VCo5ja n$7-\@W&*.0r 㯨d:)kӠ*9|IM`:V[ "EFx4 k`PX~о~\R":q8kw ;[Dt1p8Άդ*Y p! RH?0"ϬK/7SsDCwpzql J3V ME]`p5:v.@]wp5<!ޜ d+0WB'&E7P4=߭3`6u߈HIrlX+^a/dڶl]* +NePZQW4e^2D.Ҫc.ܛE@H7iPS C1`_)b[>͙i`u24$o))b 谉1]Azc8C~:EZKzcSjt c7.5A~It$">'bzڿ <.^o ]h&R{o bB 0vQQQ1tؼM|V\T )J#ݺ@jݺ&*`V\R -`op|$)D C.a 9(JͩQ&u. ål|Jd+_Ayoc@4!ۢAZ?2\+J,+Z(.'4:1do o*DAyY5QtQ4/3uRm|]W[j4"&0%I%@Q5l' Ǣ@CF}oT96)bZ!$6&|CL(ַ-}ZM;*GBҳZaN 15WR{ Ps>9˵R&op̍4m(ojQHڶK0j~Φ221H+zl >8(C{4T1fJ dhn;Ny-2>=go`:fė S $>+ ӫL4pGE} bRKƚN;2HzYn fX`m)ѡx=$=ɺΊp0?cvQHbJhbTUcl7\)3qIxK_F 7 b%>B`4-EEҔGj"]l8 r !g dj^oW: ( a‚)ky=#I;t eO@0"D,b } ÁhChuhA`5 j0 c B"#[/ jÀqX>y1ʓsVǴ4BMR֮ŌB9hˆ>1dʘ%+!|B GM` 4{n;YOW 2 VR~(@`6KPq@̮b'TǿpXnTNXqAZ|UM1  :9]>16ybƁ.PG$,JyR1*a7182_!z @E~Iua tPp(M0gd9H#tQ?2J JWwwniw ShAn㜌4mXդ:lK-:ѩX =Owt-"lfږ5`hZHXG@LU@y?2b7ss$woԔnhJvcka0=\餠% &jզ0KVxUʄfHZVbVC6cFM%]~wm; ׁa{`^*-6m,2 C5nTFo"6fl AX%Oab ]~ ű}uM`t1a _Ql &S@QV"LDY-?$BF6Tq=@\pJ p @$@&ݚZ5ީð,li`!ej#HhM/_Ol\-I'/l J֬)`(bN-\ѤYmĄO=L Vikt kԻwct*@:u LF-"!ɵ o#2\clh9Q!4m돧,Zqu ZX>YlBS2X9?^QIԋyOm hZ{n<`U$jqT1 -TԌk{(tm.D'uu" .ÃS'`>eCyJPQGg+k'`,8HaIHk*ޕGu#g ZUMu hz&bl o&jGr[غd2=zdzG ) 2 Gt9 kdn6?.J}Q7SU-^kSlp)] huGB* d u̚J!›}nAD']_-@Z1JWJ#MJA2`$8BPf2ښ b{k Qʈ xt)m5A*FyyNҴ'H*o³5X`\e@k*xfg_{l@} IbnDZO˕C Bu Ԡ|`:zcf1+? {ONKgp lFʕvHhoC1, te_d%3icLrՀ ;+{yyz0W Ifk_>6*4PI;0o|&Z>U8v˜֖bj0|ܿª(#5Q618:YG}8|z7a9aiB!: M ,2AZTh jJ!~⬩#ur*#81l]&hD Z{6a&mU`~T<Ӷ=t )?QU|F>a}@M"`և}U"ej) ?giTm:fm,k0q>[Mq)z#}пEmؔ#rxQZhPJ֨jtw"hl*4TC$Q,.Ò j@Pt+c%8 U5^n,|Yy+X!v PDyVMxhlaݢ $;Bl=4MiӶ7Mf@k.ޓiYKUdk{T) H~F)ޯ6Q9]m&An}ø {,m-]>oEaMas>o*&Sd;Anj;0(: MF=$fppIC;X*S;jw(J(ט&@ CWJ+Iv663! _̡@?(2MmBԨ5#Q܅7 1 `GCɠL"l枾(K֚auXGAֱFBfteM`]2ij 2 €6*(i~ysIҋq7h ˎ4v08%,XLT!ޠA*L`PM<eeuDhFv.vݸ(uPhN#,ɒIݫ21t+qY,y3^5#-@CL:OD_xb'hɫM[AnE_QЎU5qPb)3팥)lD>acͦgbŁjz JDQΏoCNW6 Q~FL "d ?O `Ҡ/ep׸j|!nsžԧJEZb^E?7JSr + ;`L0+n5e oaZۄcBKľaX<@ s$UAB\- RAQ1܁͒vcCB Jl.L] Mvwz[xc( n.=ЪF4/rCaTS%9Yg(hz.a ~93or "Vkʜ(4xo)ۈIhEÔ. X=h:~2A*䨐 ѐ[BP S_p$YLtc3t_h(5͜Sڤ)ꇚRlR\QtHRv'E/84P%Uߦ5ZSlEB6Zv0Ij{;$D_ܺ &xٗI-F1Xd";L;T4mAAD1Tyi1 Zvxvr4}wL0$kww@}%@v[P$xD~c E`10?5/C(>j @`X *`)r&85ܦG_<*'ę8EҶZl:8+ 2n5dQ7O*yAS8\)IQlxљq_ T[: CzYR_W%5uC|«%.WJB*LpMҔц@9гzr $H |11[ 15DhӱLѥѷ%R.?n;e*m,%P'Iďk5rBzrmFD~9h|=Y7q,V# jͅQbj6y>!ˢ9TXM*tSB]փ /ĴZ,B1A?WF%vdai,K1rl.68BO9uGceB*c(`ePto/4j.zփN D0NFb"*H4È|Amf;P .*ݵ M{hB"`yG, p!,O0iD %HP&vH"ElMUH6*Esֶ>fBPx]b$6/q C'}1SRUKC{\ǰ*ʔ, G-xL!ٲ(4d'rC~V@ˠֆA2}];(^IY+^G]x j浆]QMFL! v,͠L]6r@4l(CTQt"QAǓp=Ħ!ph WMw`3m@JFbKppYMhY  OE%K)Z@Y&?n&lj(F VEGGΣr' Z zmf7qCOp3zۀ4f4՝r 5k6lQgsXFhm!ggydyi[Э!ȡ@< MB3E{pEEN! [1,Jr?J!"Ōm>Xj:KQJ;XMب"JD` $yk_,F5wpnPmHkA,T1_r{So{*BR;0`qfzUʑ]\qb7c=2v+[ci6T-"'J?p#>Vh?)~4Pn+)i{ l {?;v'@ܷӶ-AeXzC%dȭ1k6yOR4wTVNojܜ m*n,Qپ iCwӮ.=hn gd:֎7u:V&O[xDgz{יQ)zֻU-o|GOW| fȉ*Gʇ0=z+C|p(g$]KIBq8qURkaQ}Wu*#eH m??x%I8&5_F4DOς3PQ$y"CO\H"hG~f@.8QA%1 ,!zn}Jbg_|%6pOw@M}wȭ9 52AޱgTS֒k0+-& R@4#TDPvXZK*{$Nun|/k;تUG# f䧘ڡ%x&Vc ȣGeQ;8 mPq:K4< @)6dBS CC-=#jZ"!ޤ`QQ@+Xk: ּKdi(.y!\Qf>^ETpȏC'6Fāh~7&[R*R#v{Fᾉ$9oH9r}$F8q k8hVkpH1z^`Dw5Y hė !Q$$<=SAN}X mԓ|=J `QZxarT3i4t[N"$R%'ӗ:3H97sMUHen9ITбji0Ԭn5 SL\d, @:gc829֖y!\V 0MUw&pwx7Q4-]hGoF240=3obf hh0~p6<]ܮ@j0H)O96.:QV܏OSޞ#LEx W/tPOMA3˴i1hk nuKKTQD4M:ƘBmlzÂ8h#BK !nIFԈ0涣L[Èܣio *z2"AGd3!"Ղ LoBӝ;xKgz%RڏWֈ-y4@쀜)ݲ@xEff)chh 32‘[h/-(`TBpeY CV.Ezԉ?>n 7ePn$VH ;o,Id]ʂH5aMia,ǗpDءNa/ 7lgui3jN\h }12T+q:!P&/Z+UnDMhW'!**4Ƹ@@t򶕫R x ,[T 6"C&`_GtgG†Z փS9;'jHvD{Uj"h% CZmCi-*: ԿqIQG$n;5=hYXmW៣(mA.cY F,)I1?Nd?^' ElI3hSBQu1$79ʮdiu -PPc C_1j$JL7Chc &$p2 &)i`:MEAyC =aIZxݛD%DlAčkn IpVu%4GM`Z9'p3 6Y j zna<ҖH p_],h[i} f|۹pD*s1%'G(bu2  _J/;%aRC0/Pz`%Ncn<7SxF(CsV7'N 0*ɃjGePHSw W@Ps`79(=Y pe[ $५@{ pdS1iVӅʊ}hיTZ?WykhtKE{_`А ;dIϥ(ΘvBaq(}ahS%i4&*ڑş (1:Q.0:1}9q:4kese]ͺWy_54~|MA+p<-4D8}h+熡$Ri1{>H+es{c"\^'THY:|jĘ=Uwk6/@5HRiɅ!2UXh0J#?#=w͞m9W~GE@ F[*OC"ɒt!?0A" {&ÏnSN zMA7XZP#\ׇAE4^=ȱIaϬk/i hly@O CJ3wĚ19;$U(A?!BjCV!>P@zM՘ŤzqHBk/:;z;kkTPM 'RHC$GQ"$>:>qqjB"#`ѲXB@^o`. uiaRf1w{]IތV@MTС sxt $je_1 #]yr"%kY(07U DtkYrR& [vnAfJw,݇G^h!aD{v)[f< LHD&p݆B+j:0B'mȕ4lɍ/HiW Y(j#-2i>d?>EkqdJd=o2#&;;4)1Jͤ FPl)Y"1$ [w7rnBu@3PC{!Ѥu/ x 6x&;, zϓ $AJY̶Or%H:o6 b7FXAMmB?K6CFk)Q&D)I.dxY HV’=E2h?&~/8w do!B1G(D_&5+F@zahmZTt*{ pt 湄(>u0ύtxVw[t% GRۘrн:7p@wŵ~ܝ~8Fή*vJr)x}1ě-@]ʲX&$8z)H +=];&dEMG`/mC]71]x2}HCnEba萋2Z EٚND6!`rw#Uf_S|7)9-P4䙱-4_w5o E  v=IDwI#!дKب m7avqڟon/@=|;% {YD;$E[rMEܭcR8%Myk' )K. S5p!_1*襪" U@!]u\)XX7,ꏡͮ.|:Q+PAotO ,IZPNpt m]s2L|:*Z_ ۊ4RÅ˱7G4} P i![m0p3$@7O`e8nwX-aH{% بdyGRͅ74H+oLV(:-0\6K;uj,8,((Ҡ&lB|7) %!ҁ &$@CS?1,EP+Pkhs4B%}k1Gjfg6V!4A'ܾA ɘWm7ZDͶ:F;9A0=W8T1pPЇ͠+qPGT_1ԓ\wT)EƜ]_z nM9n.5Dy(UsQ(qq>>/b%#mHy=I*]~夳w n0i _74W:R)L7 h drv1R[|7ɍO%e@4!%fTu4IJuOCh_0 0ȴPZؘ֥+ĵ5"Oč )ZD_CN{R٭@%V۬R#_ESNzG Bd`Ѹz{A?r?kl:v8"/ K)jUpbH0 "nE9C`rn2t-Fc]&7 : Zzlx=ͤ̐ EWG6TD{lcQv'i[l͑`߱M㎀]~>?1I AOn?u^%:J " 5f# vXӬ.0|rY+AŔ'KEOfj !iC `w. "Bq #ĠHPhiC[%Hw1>XJ}eB{E.4.Q(M{^0L&9DNgxلBFbTPZe<*&Ae!O?jMX},p= lh]srs (|bpپ8;JUvjm4v(.Uo._]mq!OCa'I0I^Y\![)&5__;D¡ Aa5?IAt@L6#iTRi^(@Kο*lGsLҒVWk5#[4OEB3І U<^}"ۃBFMlzxVkPU(Yh⫛b^H1-#C5aAZWx|>4k~ $ H`T,MYf"\U>JE}H]QJ@/'|BAjfˋ((_O c㝴G%sX,$ah.Ph/(ۨ:iPiEi&qp$^-g$:B' g'Sǹk$C?;טJ4:4SHVsXK evŀ`ԳeTQAI1J& Ƞ#wɂ:)zZXro)P]A,l\v!)N 9o$XѾ~2P@[ȅiĻL@$B~㲯jA 4Za5sIt2t^GrP>@? N6ikRhMMX@OϹHL(bL .M5Aeh?H`R]dA]/,.b"@#W gHnv #H `T`(K~:pu yqDbJa֚p b7_f|fA˿~b1PK_Hd 6l!6}}qCvB Feۧj@"Jb[ 7A*%H#I7( F^m 9 VJPo`QkUc !C〗Dƴj{Xic!¥1T:(0@1Q ";N?1iP` CY%#6r]"Q<0S&{8ڵ*C3cwZ5mM!!*4]e+ҸTbʠQUR2ִO]%ҢUiۈ[D%Ĝ(MV!7{Ydpwiٵ7Zd2=ꆂL&uCd܉JP5 & 7tDw!RJ.;xkBjl=O~}l@TZ݃5OƹDHۨ.Z@R֓Ls4dE6/yR I59 (<@v} !X=5vHSja! K4bT rB8B RB=SC+m:",eS[6!Vso] A84%TGH~bi$6I.` (P>ŎiRhwj( *qM@4T:ka6DƳ}1s]E[*_C6R|T5<=R xw~-0R_ps(Ѩِ`Io44v)]lcfjaz X,==6%JmI7['`( 8Ч0* #,bwl%BeIcZ6VBl?:^谐\V8Q6)N 4::%Dď%"D.M٧a뇛XhN 2ʢz]:an- x孰MaTCk@D(zux^0ߡAњ0 tm=D!*¹75{Q=+SeݔD4uyN?mB n/xb@#pe@`(*̀ {x :Gpأ^q}$)ܔHCm)c"mKJ|  M!Ne L J, IV:}ኚ$SwLn9h&L'y/ubb%UϨT Ahbb( ۣ6z0Wp4zBKauI1(rR t"Kn0kuD,ڿabl@PƷ̳  MX{f2}XzAqU6 Bv̼vd:|sBRr]#jaaj)]_VjmF$A#suZ-!35!M~`6E$#A":;)w'@vRֿ\['=L +ՕfȎi!>Ѝlv\@(|ɽBE)>x-(:MA&i:X:Lk"&F9@yp u [CH6h do.* A`lϠetsAcUvm^im[brD'aO IۉRV:ml*5HAYU<a<Z mR^ҌwU0Cx1Bnj$ޗ;bJhzya\ A N0Aɩ߃/vMԿh \i ?uv咢! Y(苭D" ʷ 1H$gBPje4l,sCXT±4A@ޠPD(}a޻Ue@iY.9u,K.CBsţo, q K#o"vڴZȆRD*<2f](۠**dAHHZDfDQڦi$ G)2 AUh%[A%RŎ EB'1P~^9Vw?1F446B_f ?l=adYU6i<͊ s7PGkӃ\-\|Mrk$7BПY`NUSXX7EIE7OL#kj UNcpL@x=zCN(n]Zgu5Jݜ&2OܾгdYR-*3drT*+=lڊ9elu<ְn鷚c9Luh/ kq%z_Ŀ%ZM?ߦ`4/N-pOY:K",Q bׅ(: uU̞HPKD[JABdbkHU'rRPSc8^@leLCS%8ZA /)0<,_7@:p! I4ŸDRV li!}Њ 6JoS&BZs/21IzAH 7ܚ%A?VShTcf  ̂]^Hu cS7}%tlOYK6Zz}öDlhްw\ApJ6%F D)M\v72JfD*v^l6ChC4%XR%EՆ3pJPpMOכqzˤ='r[c^8+ǴC1^N. Ptyqb{1[0(SsJ XٝACe#\٥E9cۑD@2tBPt]%$Wy*tĔ`h05/"6!GT}18d ‹K-(J`yuCq Bd`h{.bD =b &E㉑B@P[XFDvB9N,)@DqYq5rYb4::bv); `IP$S?`%CwH0~( WL%͒ݠRsRCvmInIhZ#`}~bYē¼H0aMȟp2(GL)"YUZݳ C`әcC$(p1rJ!oۣ'ѡCp$ jw04^c $PN Td!Fw7pGvmU0~Vu='71%Cz48^li뼡 ƹ Ucb~_MiKov0H:>$mUt>B =J 4_쪉 cM뻇4b,P7l2GAD~m BF:P~˩6WGr0nƵG2Y`s4Zɰ+7`-IniI4xCwjDkZj*!,=gF~r.D\|{9)ꪆ L,DvMfDtpam&F]:t/KbKQ3Op\SĈ$Gqs7ɳA6EfáSQ9^4!@L=_7e(-g$z[^6x~Owq)ZBk`Z̘6 Bkn+I|OVo@x DlK`ߴŬhHAI{p [ 1ݫ." ]#9ҔG bkPIA}#x % OEሿPQ4;.ʹWD~-i_. ʃ-ưHpE4[@AߤLO| h3tGp4 An޽PB1Ž45gsX Itɬ`<ܓ|W ǙB$ *{JeZ,,DRB5قBQGKSXA=bp%QH'7pMLxOA1EAC6RVƢO% w RjOe U[ZDom-( ˡ+ۗ'UUݷȶD'0l *TuCAQM]7'2О[ᨽU9|yl Ϝy]b 鹖ti"`Hˎ#8X[j`Qa˫IfM?qթMp2Cyf8~"-`~7Џ$?*AWߪ(#zߎjzun4#Զ7Ƃ4^>gÒB!jovd5XHcI2 J851:ae|0R,"J7U1 lpJ\]`q :3eF pJseEJtoZ ll:p*hdjUG9Vy RM6 @w[ƻ[hL8?P'hAQi[nco %cƒ ,o6AvwЂe(V-Ѿ4JUp.0yl'q`vP/[UA*Ǡ]uaQFӦ"z{#WeXv˚4j㰄4t1E .jI@w)gEס):K; ;4ju MTt:Lsne$0)ĎoybFkSy!, +_߹ rbdM&w(0ELf_ a@.xc`? U"{h _91kTcD~`HՁϿ  pujZO1_2 'p8}Vg']\ R?dՉB m S$JN~ ~PVr.l%_'3ى1Vd#|nGx= kmʗO7zb#4oq\l8'rRЭ֓Q"%I CvBOc*hk!R4 tA:(77M EWLQnD2A5?s su&A֘}Vh r1ɮoRaYz5f#1AV;^DP1?(j4.\( tGJS5D qNWcbBA鈨jc5o}yB>۬5eJ5G}VL>+Ѕ}.4>L< *7"^eҹsA%#B\6Ft%'hPN]ϝĥ_an)Yw2'VbRGfTu@rܓfEޡXvicje"M!-a*Rp+|QK!ٍ%6j sz_bZ;~cNI]iaFɺUS_258ݦj_P 0}ͨm,iFIv!%J$FCϸDP)5)T] !&Gb 6i~cBp儆)Fomp j$5;yeCT*=& d FMGXHS ӦZR ĨեI.2k5*,hD?fSi7QDK0#u˻D@U nǗE"BJRq(+T7D6FI뱑M>_tp_4ͣfF@߿p(P-*@ 9H%OJd(Gie6=b ASa!":j~J¨z0"2[RRj}QbN Z; EZ+% *4c7uڰJ4djb\,|M+Q BQBMvlEt,/]H2Wy?pbCb 9)_,@m`"i߉At74 ET޶L%QBP|ͥlTJ?|s& vG5^BL*#-kM`Qp:Y6-k,0 Up'O8AṱkNbd ɤQVe _IlfRP@_ XnsS%2CJoq0Dhwi3Ce }x䠀nTẀFr?c&ĿjOpVRMlGd45RdžiMB_6 h)eX)>\.U/7CzLTJEe81T;Kf)pQ%}KGQUˆDto|!Hu$ҥxMVw јuWlLpG3l0 nnW1 X; PS:Os^Z!6 S$DiDe/N-cxJ*JrCX%5vmݼ[ڍT5OsLb]"po$CK  w{ D{칧`Q#T:X` tb5̟hzDu8{ 0d6_̆/ZDhvcAu(^\8.wK>/r Klީ@:Q̍IՃ$kpG `"fK g'EJwf7i*CHFN'ᦐRxre#ƔO4cX>RȲ06cdcu~YG. , 5qh)s@$.#\O.AK2;JEjM=q宝T.|t5 8L4\/3=ˠ|aJ#/\o]HPf2(l]ni{ְVƔgqCăh*yǑPbໆiE=p D0ugM4C&[i95DUo Vae]LZP,R(.y]Ps''|ϹX2Y` 8_gi4mWWz= hL-&j>'a|i L޹EIn$3t{H$h΀z :)( `h Q x|h OB5yXK`wMኒז!(vq hB F_'j)J# t8ǟB(lQJ;Atڂ lezo gVR'%XC 3V =3.Yo̠$\ J^h5ͳhdc%εyrAv?q[]R {/T4$lH0VƖt"-50+n)RUd!k9@ HH>[З[L:!I70Fɗ:ؕójoR(z/))d-sY>NضCD`6v%uxj1]I(}nERL&*X5 3J{&ѡ?v!Q@mΆb)McK&C HWe0 ctoAae50F -㿹ΟQx$+ƓM=^WŊ"y a7U]8pKh%W~"0]-fj:hUӉJ(̩>P-"3\̬w-"Sv)@MjGhPF paCPJG, aң5LqJO( ܄Ș ?Eb|wWyѥXJ]n}ň^,_0n?V TbOi !JFy]ɷbD7!AJi (Iׂ\g,O{;*w|_5cDJsAiA׃S/7kyވuμylְq+ZFv]|=^b9{(lcv \O^Y6ZxrV)US8Q<,*0TEjL)Pϱ$3I\zU)}<g_$S%4h?u>gcH7c3I,n0C!0B}\ GnPb"8!FҘ_e, ) nyb@(M4d4 \ (Ą!sT!14{`b`Z1*FK{'n  m uTH ;»nJv7 y/) @4r6YAhaʿ 'f$B-pATۢm #\ڈZ u2F /PӦ<,nKuۼ{JX@jMCcjuܤpz"$ۇBs7m ʂMB?0:P,a%Cls)WE-ytE":m HBm҅_eCܹc [o8O-xT7Q *, zO5upo]\!J%%"7?- y܃ތzk6ܣkÀ 4FBR0$[UlU Xz<>8D2f,PX;7|4HT5ŖisQ(c\nR $7h [K ȀYOA4Hlx?Hb6˩ ) p )Jihh!Tpq"L U Hؠ$KCu\4~~@&L |m.0"L{ #jp1l B L: T^1\4JGa )\af?˅x apMZj6AJ x2)qL]f..1xLt@ 80ES_eHV),80_ܒc#@^7&S 5ArF f le %b&\@ 8(cƱ o g\ U HSzQG>q@ھ`,]c=ۇ}@ _+K@ǭ"Nm3Zp {k<$h@lD%I*@C>f@/(#iґ<\f" +3„3 X"!B3>82Š$T pVnF͏ksfo""A#dE=>Gz! iGrbѬ@UA30bݘƿpRtqg> [4|͍j`5Rn>A0z\ 00UhJLF {&\D^gQ\.yQ,JWͿQT ?bܑV!\24@rײAoN ڐiL w*Ixft IG\i$w#5Cw) r/qJ"uNG뉒-@F$Pk.=%Ã^ȴ U`DK0z SkQN9֕?ODe͉^k/m<|i@@|;@~/87 h7d$-@I?NM LдKA 7e@*R:A&d?Hnh1>&0Ohe!Sur*X`eڃ~L5s,:7mt󩍑f-ܺY܄Jrʥ%EVg^Zd`ڸc1g$֦X~x0I_BR 9PtkbdCc:G5U ̯@PzyCB 6)ҠcN-lj aP!ۿ0BgXM- H[JrƑ$:%õEhC4`:XuLvSN_q 2R5XF,MEz1X[I%e0> %%u;"=b|! 0%Biy. rUa+CMW+C`׸=:ͷJMᢠ*4a"h;5~$]k[ #A@Xb4oC 4?j !4F;bMeGy`LvTlGh4bqp6t=Si<3K'$ >(iPF2 d.,0 V㐿Uis9fѓd bI29>Ƒ9rO⪡N:HZSC7{>cBt'_g2t|m? eFwqkJ՘;֖P`jpàID,f|ɄX /dWLAg~|sh@=;5 .Ǹ:J' vNslZoXY;}2J!fmuj׵ܤ]%đ&[8#|et 64od$<QWx8j~Ek!µpbҡُ%[…>u#_pY@:@) <9xJ:r =$v%0ĩ?CءZ&VbZPE(q .ֹ{򱵂$.aIa8mU( g ApHt~㥵i2\$:b5a$DgqZ4b"Pt ӣPܛD^l:q"%VdG`m. V[$hHT  ,JU 4{`)^aTIPBIq˞Stq"B7=2v.)hFr|Ƽ <_1rbSt Dt9 SRZ1Kfe&Fscók-RpQ $H At~3T[ȒXn?yC޳頪D2 R+`2c/{r5 ~b]-RB`Rᆮɳc& QkdSjx{>eي, D-ƦBF2u(..uةMc'cZJH`j4Jq dSA M0ju)Q(6r]{8ityςJuW*&7F%H `C` VwlCS:g@y)#Cf\56"*X!Z:=(Fd'LAUtg5 p`*J$JUmd ? QJR2ZsU^o8! T ^A# i!R*nsMi.L&S bҁEM @js+ Zv4Oޤ uSػVn2qE)ǦZ/w  -IY|Zj#I#wG/1O"H{8!Os.0:@Ȕu2!M(J}uu-+Mݧ tb+NR'HIwp -"7ޢ0vAQlAB+  5+USJ$DF?6o(qZ(Nfr I7i*\7x!rۀɨLڔhP**GHBtiq a()(n |`*8@̽&& h 3ڢ5)H* cT )ij7@ 46,D:Iۖ",'EŸ5Yf(x%0Z@һ LBժ5 / mdtkMzG*B% X 4f3To(ED3Ѣ4 V޿ 4@Wa21q"br2[6@}p-5͂ x=4PA#$ D~3!Z  I>˅*ծ؊NO+G&e,i]J:H~/cT(b)xt_2BZOUfTK2z-Sbzkԅ#RUՃI\C*4 R{$9q {S# gazn=Z+: AS6݉#N_Wq`tQr<S4`Cܣ(ޗٿBei!+ZSltoc~= ioli mPz@><9xբ'LZ;T4Nm1EBzg-oaY)Αt V |qZѢtJ=tu9Q$,N"7-]FPMeaRJmAf66g+ȒoYD;DC7XkBBwP_lU43;3 ͷ/5 &v`dW8K(af16ӡDy1-$@A?sJL&A>tv30`EUh@X$-F@g)TPJ94$L5}6bغ)'9% Z T*1B3w)69}˷Q7![O@Z$)`5H(׌.ڍ C%x[%52};GWґ*LznWx$ ?Dem` "_ v|9Qx;vOW#p9*ltM죃pM ^`^H%^*E|,BW!emg\0Hv27㘱-eM]cmUUJ\Y l?q>ZӪ<ĊIŠXn?\ (,YI+<2u&PCXQB"vsp@1[ 5T xe2[tX( &3Hآ|؅4A]Mk|kUnnh&@a#F-ig0{jkyH=ozxqC`l@oZ6?]+*BDE]lB*'$X1S  0.I=QLjeFr> "]dlYjzc)j%1;tL &5AeD=7]Dar4 U@Lj8xDι03un x;TIـeCTs~nC:5]"6AG&R*[1T8m,hK*Sc"fMl,.I^y+ByͤP$h6Bk/" ,7&δxIX:'7 `l B͕beEPt+ ~y{q !ܱ E!ut㋅$SO 5 S~HoC ̢Z] I>iEH *o C0֟؏^E@5 A"Y@^*o0lѦD/N^p *]_bV:J½m[1.hjc` 5h!5$pAe<\`HנSsUC}ƣ}X+ `aLT]Kl@(Y݀3].$MTȬrtZT+ 2.| F[J_sfb5.Y1/tNiJ\q*ul-%T₩7D|9^BbFAm.=*tϸea;0 ׋|ތkn ^!#хPeٓ7Cd&]L a?5}+fپY %P9ਂfK lWWnG+\ oO4W`wXk:Qr=jFlB;-q\IZl 2Y-'\3TJX!h\(CʱhxY'=1!% Bc:53z4$Κl' *:Iζ dro҅"#NA ^7cb oڄ4*v Ѷ]mIS?H=n&6J/~kx#Up^ŌHF%@&[[Gi>áf6ҍ vKk 0;@^X~ăO]Jj)A檱) +qukWˣ k .41fqsaPF*Q"35QYgf8`!g xr陠1gz9j*pivզ3-ҐXMmi\08a%woheʦm98_vWa891Р"[b76 jU&|T:B*C2! c +D _KAtxV+? T\v:A3iWRSWkӾSv_u[ M4'_ i64?!Z7a@L  IЇ\ èE%Xj)[#A_ v=qM@-RIYr׸`*p#JMomنp4X=0c.RT4-1-#djkzu`* j Yu*\^QX#;S;/M~īɕ"(43~ 1l'%bR,_܎fCQBsXhA]$DHZc `۬y@;\ wE|ͻr@_}lHTY moRʑkOcY (HWCaar:]d8zOv'z_ l @H%<@( ,QA+ f $vi!֊!nd76 ;}`%]0nt HaډZ8l԰V_Q|bk݂܌X&īW !>:{U6y=<-2!t9 qhoSo p al? W&<0O>҇T-gjZkn~ Uoi!_0(DZL+` S4"(_<+"xNЌIz sg(p x;Im7vQ(jU7N[`B.wч663^*pA(q G.&ЛOg,= vѪL'BW`c@P+8B!!r=RNלB2:66w ݂X0y4N^gh@+bɘCCw ,eCX A&ìڨP&gtWTTabq4lM!?FJrEγ/OfQ4ͶO9A37HtNQvk ]d68t|K4'wqW4(UP$ #_u/ SBϸ~iҶL;7ăSz*)v7]!C 6va]IHq2 B:YH00AjeU|`1 n -Z YvnyPڷ?qu0F5kVط{uEtrYH4U̸`JtIAV Qʝ`NuI T_<A $c&D:aSMjlyP9 ^;@*TXJm}n 0v0Q1WSs7vTGH?8r{ 94骓x0;E޷CN%`>dXZ1U@>?I)^+P]T'͓mwZξ:li=*P "J, j`:Mzs וР'>S (vX`uұ(> ~\~m҂l h}Q` HGOHWT*CR8a18[_?65Aq(Y$Ay]'d pB!1V[?؈ 0-qRPFo`*UhY\tFIla%`"^gD- t5JP5 $?{$d/tTþ22M%ջfL!~_Mx-m u鵔&@1H dG,ں # K>LH> bƇ]*R U=DH:x3W@5MJ:=5۔5D*#HZltRmMaW1U/< Uf+fYNBk P dk?r͔-B(BFq_04;7?0RXוӷSp/,@pL6Q +mnqe \)~P#IW@ !i)z?># J<: XuIACVG[H>enCTkstN£J;t)B. q Θ`\E ̾jN\ Su G]k uiǰIH^xKHo^}dfrjN.rr)`sy4wD52Z7Y:RWB,1BH09h 8SÈ57; 7 Bf9퇯:6roiWhr"fD]{4415ؐJndn6'| :OblkHD﹩ow)jۅ*Ul48.8")6ޔ]W,70`ፘg0Ԫ7 mH^DtxТmoċ:K 6| GX ֞卣*"4eYb57j.1x}U@QdrT"”LtٚwczGwyjE 0/DL,Z&5! wAUهD-81X0hDwi1Ed*J7,CF:#+>!1`p9h(el37QDZtqUwnFWF56 92Ql::uFA2T;rTIتd[ @ |f?pQx1tlNǎRɰgcn3#B )f+B. C &ٕd(@zc&xDDVGfdwV_3wB1a {gv!aVcBki/W'p$4j/HrBV@O_SbI }aH{ +D?q( FDynCPMķLXlբ pvIa*o[&d%j"1Tdշ!=!% GDmD)(O@ZBf涛hA*K0H541t ')oKڂB{Ź8І۝@vcA8`)O[awQ ~B#ŃM n@XP#b6᪫B3T? h4=8;BwQ .޼G#Qɒ֠8s)|ľБKeٳIJ& Ö-4LHTp\{9YsĀ@6 >ex'{f TTV+o?0A&:$>0w‹hÃۄ&:P7t8;[m(R//.kEPF=wH v!CBܽ3e}W o%lѤ4WQ4SWXKDC 7`GZ-IEc9$`v&@8%f _S:6XDD,BaD%1SjLq f hHH܌C&rWf`>b^P4z0PMvsx#oUR~& tb.Pt-]w7vHJF†2ɼI(ˁi%O8 3h4| f1@Dݧ̵[e(}L\qpHf,1dzp qHCIேkp >edڏoLB G@"?phBCۢ 7vaO-$ID[tQ*H[1owATcښQ]h$@z M. /1|R!&.t,]DVFU2BVeրӧf].{PnP-&I+!{G8T $HaAA\JA#4fH!TK>4#zA$2p/(&a-ż0j PqOCD(PU nn@Wub[̉At '_b(I%aQkP ;vX3pۀCHw ֋UU9G4c1PQӧo]!fΉ +GY,B1Ha]l "ѓXޠXt~m9W?M9i"KuTj,@UB=hiy5?g3AA|5v oki jnkiv}E_7jᆞfqkq[TWYw]HIs̎b.2Ѽ^`=%$,M7G⎲k4_\|<(ݟ2#8ў o[`18zQfy;̾}Ƃ,GЀ+B4 ,NG560{F*J[è mxl*ψD6QPatIs=ê#xEVhcgb*ьv OTHH'UpMV , l_#ma7*Dx6-n ]Rdmz1D!x"lxPVB5cTF WZE7–;d-_n6erN Z($몲'd?i.MdBr.Bu1j17HC iaMOedrzoJG[K2Rk:2M47=!kM جqƀk[ *J\@ŰTIo!Yԃ":nOːnGv1Sd%0)2oPapBɑAg}\aEzR2"X+r@{Mhp08] SV[+\M' ۊex@9t&5RřֲV J=D*ٓ!~`!h(ji:" V⠴" 4` L,!m_2i"ROT hlI1d S&cT֔za5X r":[=5 ԘLeoaŁ t:@(;\}kʓE:܏XP7ĞVu7m=VoTOR&EIYr{P01|@(Y+; lVZqްT ^}òEHSe 4#N~@cJ½M[}v4tiK[& xѵ]֑-H|07S9hwccك?װpU.5CrS6k,,CSP 0s D+tlQ>hHTq/C<i(E (>JWc5i`%ݯkM w "$5?9Si.Ae.%BMVk\Xp@![kNO: T`9H":+}D Z:na 7+XdUPBp֪!Z#aZkL 3IhnRLXa tkw<%$۰q}qMR*aF;*>\R'OIгV A0:ApH_J} i C ? eT4wS_p7Z)ӠuT5Lvz?<3ɽ#ي;-Ltڷ7?n SE"YZU|kkaĂX˸>ʴo@eebG n<%\y*mpֽ b#K_qeQmT%:W:9ۤUL|cOi(wMV0 hwcaL(V qȻ b)y2xIZMw,$os꟔TN f@l2 4o9ܛ6JG@hiPP9"Uơ`Y[PЅF Ħ$: !P)+P M ͥkfYvޙY9`UWJ]Xj*GrX ayB0D}as )GgvrB>y 4CJFdtU!F e !G71aN-1ֈP d@1N,GNxD9rN`W(@*.:~?-4kCt4!^PMs :@s)>*bJ^nij:G"a1l4T)EhKƅ^Gu,Z% 5 JF&ŬF/r{ 20ohtd|·xb =zxeAHEy^n}Qgc3vŕMz^{a#AK9{+PH!rip`ݬq VQC=lšiARYFHZpHHXooi1?=Jߛ'?EzR= wBҌ D~%XL5Oێl6Z4.(A`blI[IM_V0sn4ˊRa-\tg(zv1H izk6>/z 72ˢy `rZ& ER߻$ifW'=kСˇhP*o:PфA f}BV!yF{& bN B0WIq˿0xꬸ$~?nYKPT afL`)ADnIB^h{@Z)<#d#R'^cb (iv* 3]Nk,y0P-l4^o'"wdNO`0ҘwdڀKD,e8_bF:6"ӚcvhN P!Ql<‚ U6ZX ~9 ":-0kqCBY~6nxaGP 썛ךu[G.+`n0X:MbMY* mKn*(M$\KUx%-V$ZTx:Q@V m)tf.tIWc=$W?t5@O'67RC%p OG^c4bؠ>ly64l,M_: wĊc! X@,W ="=edD\2ѡ[jh'G:]N:BIY2&P(ƣ+À 6YR5Y5B V ?pr$wMfډQ&G֒}2q6|dk|' 'q.PHd' xo sSD'?cMY 1U}t'XXm쾑}KJx ){URvHa ݘc10~@v"}nRC)'06|ɓp$J2bf!fq⑲ŷ:?1Xn;XͻpE4ép lΤ ,<6x|< w;ZJ`[txiw"{ e# 5# 3aAleScgunjxrQz߸DVB~a Ţ pPơ(0?r$B;DZZɤtx zIe,#}hh6"]%(L^Ŝwl\J/&keHrhvF@/l66%]>aRM1D4' DG:e" o xȼZCU~wu=EkOa zIuJJ=0Kx By²<#_5,RB4Uw|T TkaN҆U{)7 ŔT]nN#`6Plwhܭ=D5Vq 2ʟT|Q(aJ4.[]-6OBEt>o KRI6RZ_ R"=o7;?`oJn{&P Nmv&4+Y4Vor". y:=§P50EZ΀h4AyHB :m9\ )$`B:C}3څ]=;i@tɈKֈFW T#Ō4`]fq@ >}h2/&&(h^*V0N: ӥL%"Bhʴvp; Pz"Rl8a-D̲K[ aI$}¨Rh‚SF|Bȼ3y}NkANv;Ҙ 4T%cʈDWT n/`YBorH( l"Čm6`M[瘚$Tc>fE"B57eP)y1Ӣ-8 OWXl<ЕJ,q:#AڎPVDtKwZ Sz|FGaN5):pwp]==}@2֢ F=AU=d:Ewj٥6]ѭp 8q; #AA2&3[!mǸnhji|wHU^K,9P@Ju{k8)CktuB⥦9]"##T=!-Cd}%nL!i7 E5s@U]XZQ w%P`5y^Bؚ2 _|C!A7\o)lޞr`֋~}X9Ї;ll&<-ZOrF@?%U^1%O֑QRGfI姄Z:<aH 7w%]auŒe[c.F)ZEU |#UOw7DKoL,:W)M67}#Xa2ĽUٮ"tҔǔBpSiv@ 4sVJ;B| .~L|t.'hnk9-)Ty0̒J~$=0ztuDP{E7Ã.T4tݳ ^wxcnZ4y_峒*,iM,ȃd"+l m ЊcN AA.˛Ro2M4b( )-;JKML.dI_QoXC+{ MFlb-HBR y-αi-j]Jἴֈ AլM H M!< ; VƃI_i#p?G vru4:M+A+?vit$viIh4R SažEt2P<}#gz!1FV# W Vǣ\>A 0ӝQUzot1$S ӻưX7 5ZMMkM dbJi Ql*_p8 @M Qu j(#}(U+ѩٺ@@DAa `}>ՈrRVl[ӽ5g$h荷M[fcՅUuqV ыk]p lYcrB*=k̜֑t"_21&(jwnaGoàBAFdYcݴeiyQ:_}G_o&/]'!&ˀiV!)3 1`6ͮ|&1AS^&JrdЌ1Gʠ&]z+n:b/-7D/̻(K /T^aI^OM5T,]" ?"dcDAO§)x̓:%bU3*2 )1+ǢF ~nz]CnLT1]X<]?+!pIJK ^+WMkaU 0xTDBLj3sh@7f\\Nīt5.9  F?2$-@莝AC1/jE3s(K$G* 0;HfJ٨; Ve114gᣘ)ň}=%^RFOEaH]>Ӄ \M1Kʄ.z.И:_CE0;r&i]Ѩ1nܬNlu;qȕ!⻹ba ))ϔfun;3?[WQJUCA ل5<~sB&p@ VэrkQކMv|u73vN`,Hʝin5*6NbGA0&fC(t{71"|Q'7Qok4vu8FXMIKKW M "ۣKqiNƴ$E'CR>ĒV؃ I!zTyg/lWzZbD !:&ڙ}A ݔ̭+!,QcLQ]c^8Ɲ@5nRt>q|PwZ_?*V*-8k8*DTf4s^|"\IZTy X =KzwVvrU^a8WJ?6 5ܛ`HM|2Ot\efsUUGAOLwH =/Ns:;S\z_x>dP "+5J_BijX&Jugl0 v?}ݻ ?8,(J4URꊘ*Ɠ܏%Z+X>z޽EA$/ :{O7./h "nET"p/7V;  ix@ \6COPbk8|ĶȷLڱ.T4we,$L:S)p -)M1*1"6Zf2`v -;(U ?ssQ Eк. 0qr#FjۇJVadzNoR HoF5Wba{vT"P1M% [3e'KaRjtd/c66J w9mŶiSm])ZM:#.U ,eŴ ƭ n$,ŽFΦx^*_Ϻ^hq?7޹}yZ*!W8pT#b&J=$I? . e. ξE`0e傍uq,qUt4]X7>;ԥ Dc{(ytX@GC:8FӁx I]X^cA{ A{VAB1e'w:#/6j|,ЧNiM rYC:k_quNܸNi` u$d3f DR+VB#?9547f$X QC~gA"7S{(w % xkxo8;YKw15Z4G7ӹC}%ـGnATb 6ibҠ9JP& ]Ni31@=ɡtpӤysOAB} g8 8 )A'O4D?O+P#"^xb2Ŗ#pS_H(P!‚CM PF^q/?DJwoJZN.+C B^.@V>5j=K/6UiiXHxΌ`m,`sT9$Uжo0w1W3،u^n1\ B/b-ѡ=v0Ѓ6. `Atkު޷͒~1D#}i"ht ax"U?>g4Ӫ5 b N:TJ˫m5NBpƟ1 J:~}ͭA%}0zO۠}Qm|s 5d {]w =#7vB$Q L=+m5rھv twr[ŬRʤu$Y_;6ʖ ++t^(%k!hR``hptͣU*)[_DHD7e, םh(X5ުW< :lWq ( >VgwyEt@Ye*K 6|bk5`nJD?H W`OFmlDZ̔{ehx9B' MBRE%c!]$l1ʯ 2_BJTwX@?ph7J 2p"m' (`0m&Qw(ُBӣ`NIϧ԰22@k_n {Vm5GI&z;{؍!("/h\5OXT=aS=,Xq!S /:>`x ۨ]rM*ЇS" Vڊ&_>BYo̱6PE7$FA887³iUNaD@U2|ZQJPM`蛹dA. vsN8XR:]'8BE`5ߖ\yD؟}’$>ڋ+HD؄ 9JW㍪ fquUZqz_i$f0\?q#3a㩂VCqיZo6$LI+5+uE>5P1޴gۀH!B)}g% ~a5Z0(5Q!60H @nG P

Pv Le02#yjXD?D llN. ?Cܛen6?1=y 4ޑ qЍ :Hcd`4" Qscד t@9XTG촸;V0q"tUXO\0kR'KOs4͘.|+|7rb!XlW7@:|RdLiRtW;yUz[Ʌ7Bq <%wF@_-vsa^qo Iz!Iֈ,c6~,:* ^c^P:- sPz&Iq=5M-ԝ|g82m¼@$jhplpY@xC[;de 7r r%6C㟏SxB( ?q`ġj[w6@~S@ EB+M)P$VC. +Vt4 %vʿdu6{4Pp㼁M_j +D J{>kk6mIf[nZ,ו,zТ1;Cv? ŠBR a 4|s endstream endobj 8 0 obj 689770 endobj 10 0 obj << /Length 11 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 11 0 obj 2612 endobj 9 0 obj [ /ICCBased 10 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >> endobj 12 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 13 0 obj (chicken.jpg) endobj 14 0 obj (Mac OS X 10.11.6 Quartz PDFContext) endobj 15 0 obj (Preview) endobj 16 0 obj (D:20170826033130Z00'00') endobj 17 0 obj () endobj 18 0 obj [ ] endobj 1 0 obj << /Title 13 0 R /Producer 14 0 R /Creator 15 0 R /CreationDate 16 0 R /ModDate 16 0 R /Keywords 17 0 R /AAPL:Keywords 18 0 R >> endobj xref 0 19 0000000000 65535 f 0000693481 00000 n 0000000197 00000 n 0000693158 00000 n 0000000022 00000 n 0000000179 00000 n 0000000301 00000 n 0000000390 00000 n 0000690364 00000 n 0000693122 00000 n 0000690386 00000 n 0000693101 00000 n 0000693241 00000 n 0000693291 00000 n 0000693321 00000 n 0000693374 00000 n 0000693400 00000 n 0000693442 00000 n 0000693461 00000 n trailer << /Size 19 /Root 12 0 R /Info 1 0 R /ID [ <46a8c2cb57106c16ff480d7f62b76c47> <46a8c2cb57106c16ff480d7f62b76c47> ] >> startxref 693625 %%EOF googledrive/inst/extdata/example_files/r_logo.jpg0000644000176200001440000003716114071171077022004 0ustar liggesusersExifMM*bj(1$r2i-'-'Adobe Photoshop CC 2015 (Macintosh)2016:02:15 08:02:12dL&.(6aHH Adobe_CMAdobed            "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?81zx{qs9dѷ{m{N/ZebUwumAٷ{]ۙqC'2Ӝ<:1ǵfCoOHr9Oh~sPRwGּ{rMT]{g3uT6S:]=Fǎm h,䱌`oѲG0?{tkO]ݟbLJ?U*IY1O_f_7񔕯f? Photoshop 3.08BIM%8BIM:g printOutputClrSenumClrSRGBCNm TEXTCamera RGB ProfileInteenumInteClrmMpBlboolprintSixteenBitbool printerNameTEXTOfficejet Pro 8500 A909gprintProofSetupObjc Proof Setup proofSetupBltnenum builtinProof proofCMYK8BIM;-printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@r vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@YcropWhenPrintingboolcropRectBottomlong cropRectLeftlong cropRectRightlong cropRectToplong8BIM,,8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIM?LdRlogodLnullboundsObjcRct1Top longLeftlongBtomlongLRghtlongdslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongLRghtlongdurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM }Ha Adobe_CMAdobed            "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?81zx{qs9dѷ{m{N/ZebUwumAٷ{]ۙqC'2Ӝ<:1ǵfCoOHr9Oh~sPRwGּ{rMT]{g3uT6S:]=Fǎm h,䱌`oѲG0?{tkO]ݟbLJ?U*IY1O_f_7񔕯f?8BIM!]Adobe PhotoshopAdobe Photoshop CC 20158BIMZhttp://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@      Ld   s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?c.GUHe"/3xQ{o;&%д?f1qpg-Klvʰ(}E1^Fm.:ު!Y׆m7_2(_,? ٖ-4̗֟eW>ԿO}iXaN_QCK4̗խ?gf&K{+ߑd>@  v1~[o~L~{i䯚,bmռM?}g2~t_L滳5Z Vx#q|9hiH.]/+|wlYeDTz?PA хsc_]ƟZp?P#rƿnޙ?Yo0k/SUZyQ{a`~;_s/?vm]rUDT c~`Vyڬ.L&n,:* $0 6=F3 mx&'R_v״ ~yj+Ͷmz,Rw(ښOq}ouY^sH?wS_YŚ:e(+-ȧG*V\$o/*OqX<GyY)IrdJUB??j]! ̿?{Ɖͳ~y/o)ڽy{ao<-Ӏ ȌƀPoCv6>ќa9Q:>ޛQ2&0Wͅϖ-.&FHC錈7fg8OȿR¯1BΙ˺ly_JPq g[VoI%CN_T+_wIe|k:vBݲQC_ȢߖYć.I 3[jrM_jЮ? , >;+Ė1Aʙ"W9 9~mUCvG|2\fjooΏ_.ZO~p>g,[}B~/;km4g:̧.hqH^4c΢<{bGj7:|W6]!Yl-'OKF1+ٰ,w&Ŷ~(;>-$$1gv$1ܒORs~6:bm ^jF'irj֤TPDpDgTV~]B>^^}Odžٮի:~:Xޡx#_ c~Zk^E#^g ;G8aWvޠZ%li/I ߚc ,dyߛBd,JfW\W4Xf!.8 i,L//#~z~\Eh|8vzpk -RvRT=Zy.XJ$O OŜ lx#* ݇G :X?]F}A)%'dpj{û?BjL>U$U}WO70os \[Υ&E(UGPqWΞtvuvwǫ:PY"O!(ɉ1y-#_yv:BT~1U&$ );#pUѕ##$MIծ*ggq|s\Fo6Ng* @nms~ۤAݾ7L{_{S'?C|=?>5yϞ jK+_6jQUDyLHI+9CPG.c_m?1_G(ϊg+0g/wo[s?SEvM^fׇ?y|9+_~b;GxKz??iyUy^?_|~z\JÕv`vOp|&wx<\w/W?'{googledrive/inst/extdata/example_files/chicken.jpg0000644000176200001440000250315214071171077022127 0ustar liggesusersJFIFC  !"$"$CO" 4Zy_FOS94?g f@/m@&4`9݉h9 -W6e[BkVo@;ZJ +yr՘vj5 k^N;`E0e_xb~[Ί|,3B4(u꬟Meh&-`9Q(ZIhSV]2mZ*FWΩӘ`QɐRRm1~9~)0˛qdtzi&OS]+uK蠳6 Ҧ0Bf쫒}i .M }>עkDdW}d=Y_ ʢޥ\ZXd 0[ mȬ4s ٲC0e:cYnuʺkKeIIl7M`ic:Zd꒩6(ڙ+J`s*JZkSfRu%Ի:),lej {6kE]KrbgNx;9n:r"о = /U=UtF3W.C:]+x]g,"'Wo%ӯ% Jq4V;mdU2n2yREyJfp]xm\M@P= 7bD:,Rm&DЧ[fNoVmiFt[us 6B{I*RKq[<(N3S! 6 LT)?A;T0.nK-ه3{  ]NǠ0NJ,Uf( @s7V "6V2%A)UN,󓙢^d'AˊP&?T8̊ _ jFp t]nR]hˣzV}Rr,/Da=T_jfp[Le 0 +Ӟ2Vg[>0#Q4gU/]lYZT׎Ԕ(\ᴣ؋3z:T%@gUNTzOk*˧<ީC1NƎ1|>tS,@EaJ^2P7Jx.~=0ڐnP#`s[s9{nHa3/c64.vbeإH|Eõxc^^VS7XEdje@wg;ɨ#%H7QYh̟+DP.FU$bNh--˯#/rtBOWOƑEqP-b{8sWOKf-ǯL"䪼 6)wAWj s>M#-m@OWsJd.{* Rd(Z궓rq^fA.MbU%P[* $T#i0qS(*KSSZ)pk6K CH$PC!(8[߽U?MĮ]xGyUٲe̜cZ`-VB5ڑ3UEaTi`6͹U7L Bsk Yz.dؙAYaLm+TwR0R$*FZV0Gd3 U2l5:+x1 5ݤݲtisFI(}3_Xd¬eR.^+3<ZU<5By*iܚ f(.)4֑q%vdXrE_{JzNL{M/[,mɝQ& /-wl{LֹN x/ҋ'Q'?K֪=i \LSL0\Vbu}$#}:!z&B fl94Nv1tfT~ԋUXʳ`&:r>8IҥLBL[s@̛ r[I[Dc٤E]cO TMN!^@m#3Fp)4ӉDs}(_[';yf$J MexnזvCNbUkR9I^7Fy$j-Af èhށsO+0Ӈ\\o+[1\k&њknEtҗ":͠&GmIO|ID5-+IvLx7.-613/(>*#Wm/ l# 1bT+ji墳W[cY7VuΔSC77x6D.7\RNxVP5*oSJEDy9Z7vrG M *9/f sBf?nB9ȵ 6<;-ρByz*ϲS^K>TowD]0hHךJkYVMJkY}@t2|[y^=N(5v~xrvU  pH 7@* *;S=s6cqF4`M#:x-$}yފ#B֕s&ް*.X[Tشh tTà<׊ǧ!a~CnUBQ"=&KeI+MGy(5΋ԢѢʰ95K&wM>oGǥO 2͊;Dޗ#ɠ)~ZdJ%F`YRLZѵ]z?5g`7.`3ru OA"=8,D׊~Ϲ|8iԂO̦be\PVG9+D]eR 2sJ\׋23k U8&kQmk~>&ӳ M)Б5Oaz|2vX讦tYit.|8)g:CA<ә0K_U:T/ cyގ{O|'%<MN&jheQcPt\d3(u W㛺&Nԩ3i"XZ#~kcsG>C2N}{;s&~jH@9R¡_3,+GUk βӳ3GX'k7%=BT4GI2ƒuj惾77&W3>[溗Lйb]?͵!C;B4¼g4u&FpD(<>v]7g7O>(SBݦ-P{%?֨m9Atg#6x쑆LW/}+eYmkzrzAzPEYѱ+Lpi[4!V;t/hbc"9R6yJŒqNߕbt`P'/Av}I΁a յQ$ucOGNzN/kaU]H yKO%HU湌5S,Y6iI;1V7['q59oVmiEL}@1[Dk^n**|}9/5r:z®ȏ,0yPͽQD8i@7J/RosM2s}KUBXN;\Nޅllln6YkϪsjrhu0HEJ=#9ӫsEOk~mg,/%Xs*nNV M\nԔNZq8/z[n6Gpʪ1'z>^m#PMi{Bnd: bMjiZ7jE%u@kOyav\T C%'6)yej¤Na&eo9UUs˃  3s"+=*PyZQT?>-lDQc>Fa,=%S6Vf`IG%g| ^,܉1̙&3ܔՆ~j-tt(#Es,u:h B}.E,@)z Fj.40}9kV\f lYN;va S  T•Y$bT_yY|#]}4CstJedU|GUY]H@-itF^Y >Sm)J_ A(ƾyX{NtT}P>E?rmcʅA]_+xhf;-yM;:jVBI9n-LhUY9V~)w)≲hl#TJ9t# F4S|l5lJ&C,DNac%Tu-g;(`fEm6:$Wd I/6UG|!=ָ*"CZSl'ѴUJ;nU斵XuU)/êX:ƽ鲁JkWF;EIKJ;*EPɧ6v#s'Ҕ35+_EU@}ĨZ&1Qp;@S^?@:<ѶmouF/1#-hә4䠱,1!U+/ttx4YlUz9'PS Y6v HȲ*SV>?/H|//РEtf9='V:aF}yHҺX[_uF-7lURAykJ3MɤӪ!a`&:Ӻ`)4:Q32R'vض8&ZOyt†%lsTF>oS궒zQǬX{JCȭuNBSV/ ? */vWEYDmξ jc^Q +1B oЋ+qKizu7*\wdz6/<{g8]s7,,5`6ƴI6ОhjEB 6|qZnLiUO5,_=E.Oi_>@d7e}tw @DGO{f/zGړf_.6R<d07RqXu$oAEUL$ĺE亩̟z%zZtY%YBBEyTXn[(&}buԒ ϙzE<5Ղ0bmKsJy@ ʁTst taX|83}nQ|q4` "My>IiΘWdK P@s\tDV7W4N`P//&\I1o^N7t.f}jnxPMB#QUg%WbUft `_.>'dO |D/ʙ-ZR[l<ĘnFGL\r hrtZ Jv.j6ruWi APIͽ\05Ӕ) ĩwiQU7< Ua;lx3΢Vc=]}iZz7S#%jbL+3z'\LF CzY|VUh,VOW*7jitc73kze%A5ydI[Q(}B͙uhUo0L-% 6Xf']Hq07>-ՙ֚1Q[jv$r\z9FWF3+ӛ6&$9Y\<_" Dz5nWUú,Gr%ݙ!}з1E_7r!gej^0s7=Qu)+ ]UdQN /[ //@8bʻ1%BYNʲu)+|-ߒzi-҇k3G]2 Fu_YZ؜%ŮnA'e$qheՅSXQI`›PϪGXm9LAQ.tR*d60n8,T ;uy2Nэ(XXNcϤ:2-Ls KWg R%#%;IdF-ޙJ0?a?<) iGN{|$^lx@M ˻z4fl}N{'SLⴸc=\U)*{k^s]ҹs6:=yX=fywUЭqthIYS7#xuY~iC>T&촥J;dC)Ȁk:1]tq, 4/u(fKU47 ;ݲS1IyIḓLNt]4J4`B=|E GA>vr:f!g'Tg=il: THAJC (~~(mt~zBIQtbd:iZ]* OMh˭Pnh;IY{9t}e]'aDOKG dӍ:hcx)jz\e뗲fKEξ}%q>9Qew{(ԛE'QN%D>oH&`Xq-&͡Jl3-3R<2ߊ %a/KE=2Iۈ;G39"^rؓUyM? kO,D#*dd1*aҟl/=BMFB"r9:JnNJUGœ}J/-'Bj5*21H S#U5e^0B҅>NO^'ㆶ1#WCώ TꬮVgZ*&f^m {S-$)۪GcY-i@yi$'_fqLAydzϮD1Y9 '뮳:A)+FUb`B"!!—sfʔ L{WU2&-0Ti++Q1(|kAttntIee])ǀ`yL9`Yjy]x".\ؖ|\yctKgvf >74ƔU>M6]5rP;Yb5gJ;.H `F4vMKKD/a-2l֡sڦwDiJjP ht } VkZ>@VuHtFTz䠍Lw7o;izԐQ:@4l8yMC ´fkkOGaPJ6ʬ4ZwJUنJ9UIubEgy%Ki)DIk(E;[,^M_sLm@79m_^49Nci&yUThlX4fk"i>{"ev3zEUpm6ʾ X+V~snz}KW΋3,1M& J5.ftjS9;.w-:4 dWEXUdx }H^IotU|s>0hhIvTپwivڳjtrC:~%k/k+&lrLV{r8M">Rd*o,JϨRTBE4tPm,* S%ﺑJ"~\^ˎ;m6/)[~~vK%% ѪW6D#WN~~Py8uH?E?X.F:եK9_k: 'yYbA&uN^Nf($է]VLnx3Fy=KVA_Q:<'C4I(>8Y/ŧt^x*U_optG=ToMIjLKOzJ,^( &rwܸ[:'&4>uH{@iUbYw6U&9m]B?4"H1a|qV}}DZl_T8&Z.uۼits=B"%q{ J"(DWu&=[^[:B#^e qh#_]X9LaZ"Tԝ[ݸ\٘מtxm٩_|ہEv\ͼ(42 @`{kD] OK[I] D/&my-&R EQp~[ 2VC`tLV\gԽ[zBT*.?S:հ )k' YM~N&=B45By=|-eUjS?dIyeSKQ|n=F&ѲsvSnt tϺtu~`L(??lz 闻&/gg*K~g rA-r(* pI.ɶ~疜95N:ɾ|YulcڨmҊ1Tym2E?:=TQ#`yV24F.(sk6iYC7י8>;ӡ>2/A5=Y*=+dLCN(Ɠ;Ҝ݋0LĠA2{EIŔڹFs5/q]A?H"RiJ-dQcNI2(OТ%js2h'XՅr^\ԍcbOIY 19u]n+&nrNfэf_ushd%җPzPP$C(mB%SI]F rAt4s9JZt.d]Vpze.Yɖfzg $C^Ql6"CD,ŬIzuhQϓ՝J|0j3( TBF)!MU S'^imDT:)2 R,56i=U$=tJG,'\Ru]$+1VFIK ~v .BוVmDygv&M?Q76K3#!(X56u 7(u1,ɵBU5j7fN09*kX f.Hލ)OQDcv aW4MҼZ~H>I,AձPt ʭqI{Y$Z,9.2 ;?4lͪ|ir490ALxq&*h,jGϛs}41H11vlԎ31F؜Q7!٧$´ F4LfUuPrjM:\U%RЭ S;1!d ?[mWq%^W}vʖ3 Behr5?8;+.s,o)NeZPil0z>[,ՅZD9C2őxչ;tX kIdǪٞ+)E[׹H^g,"ӡD@#E/z9'+4GSV`ث1L uf곟Z#-ɻ%,bHJyO2][};,1mu%dLFYrş&֚Вi46%|D-) /|ކ}OhM*Ia-NaU|ٗ9ނM{h* =I=!M&2Ez>W|,B4IFP/JɕPpWڅD4GX:Gzt\EpQP V}EYt348i1¥*m5:0wrW#| Q= @4zi@<IV7@levl~wJWY3F/S?24QRg__!mi@n*f2vyGU:: Г8W f~^N1vR0BT;WSt27 Y$y>nTʨ4e Jכ42}&5%q _bt+}""&b\y{>8GS5Qg e[bF ^ZYS{u!FtXYZ59o~jTmzk5Y,Gms4[t,zC_c)\i)cK=]&D{$2gƖ1Ks\V$&Ze&@c' tiE"Ӎ(:)ߨy$u F|Ӎ'J u5J]nЙ^~M|KiPyfCKOJs, '[+u h7 nzRXтiLCh3T}^5S#ϟW6ВSz0KSI aQSyUKV*f'6g0|E1\+:GgGMAYfWT D`5Ȭ,&y:#v[Q'lQazo_6JYSՒN<α#!.hUDXl3p/ϱ+lb:I/!ypѷ[]RWoR+xd-Q,Ljs5fRDL=T\ܞ'K2o-VX$5t>hsJ{TY֞XW1Lܙ1 >]TRZ#V@G!zUF8:gG9ސ\uHDg%.J62آyڮ2a'yBYaUy;+T@/7å)܇i Ƞ+un|Ѯ2W ӧ>|v̷J =VryT#RZsDQ?(6% :9X>9q}kh>iPf_[UiK#5 3pX:vS2r86EB$sDA^li[iz@.5bIJt" 0l-N`,(|_z3jV>AF*;.@UY WXsDH\xtG |K749c/4goE'\rnnayg瑪]0J"eeUɞ~yїTD@tԜ-rC]JܭݝRmXYvO5Kfd'3s |iY!^ԫQ/^Y7o4@%BRm]LPv.͹fhjZʎx?8=US ˫nx,"8RX>&R/Dh1`6?xO>zhʏM:+q>ҞAALMLVo1.nM+Y%Ttvc8R]_91< g*:13!AF*e:.}ʪQꬰkklNy/ϡ=iImq*F;z+-u) V$4h6yyܞ[֓Si6EJ5-N~+2mP+N\WjUp˿#m?pcIs*GoT U șQ)v NsX5md+AYcϡ"WN|.Jc$rʙ1|Z+CgW^ߔP)*-1BL< ꢇ(7B h*éZ]Cg GſAԟ壏F624U[]0ܨV!r ̿eb'%>utV;M+S^,HsN(٠eIh=AW8͇h*)AV(-]4Ζ;*)UjDL,/*% w)1Y\vy|C2t~~=啭&--SS`]JK.aZhMg RtǁM8wK|tC{RovF1թ3 m³s⁃XvTj?OʹeZS}ji™Ub{Eʺ2&ψ0WA*x1TZIgʬE(8 nih\ɞJ7AY!MuθU'1Cz#9+ ˝:8ym+/d!u l ȩ#d"7q=l.y<;\WqIY ,>ϳTфG]8P G)m#g12[AʋPGF z\ 5D3F] |T)Si6Tvt\ &5nbr`ns2e)j۝19]İT{CJT[o!ӜBmdL$;yޑӧbזYzzdN\xvҠUc`]ۏ% _uG{"QwRi<6ijMefE7J .除A(ox;>7aJ<ơ6{~)F M5 FC}$Zfk\ߞrujmňqכj5cOn''s -SU fXc: rt-h^ߟy*T_?բs8[;51 "LAEÎ5=5: 8FU$L$Tּ zyIH hQvN *ZJ'Idg V>T%ʯu!vt ˣژ&i $Xld阋KN鼍(BiʩRz.z73r w D 4=.*s 7pU>\6 CZ}e~{i:uM0gjFә=-oS\H*NZi-4W ;`3gW5|]B?9ze(v ;銳8MRQƂ, s5Rx>Zıy$&`*ȚYJ?sWh2u~Hvf[(S̽7T M=je:e,hIUT vW_t$%p.~tLNg tQPD<@ʉd2_(QUD"yh]F\XWP#dTOtmbZX̤tʒšXu^M}t>:Vh[`'9I/CQ\?nXްYvd;5tK#OsԚ&Q#]bQ,㒒MNq-Fyjʍk4#0 TX dԳtҏ:&me5vPLM:=j>[3jҒ}|<*n;yZ$q0YlZш-/1U]Rxӡ%}-)N=At`őNB`I$t:[LGHt* UI1Xe >X9Yd^Vi6$w$[O:ޚ}piz&D|,I"d $K,rziOZuTIh4cT1RQSMŗqWqrr^f(t+-pz.QtzV9N1>N3sAJ6ВZ(tN6G6q:ӘrmסH!,M138,֐it)zvok,=ۜ6csiJn|ʬJXeJj_(tJқ veog"ԡ͖:g=7K d _6@g9IA&28̖:qMՓ^Te$ql}Lˡ[i_E]c+onuΥ.x3E:-qrdV[8h>ĴvJVTA?pJ]!DJ:3bLlE%%g`sГQ ~r%[VM0YUI.tsR=j5WCѝy3Zj6qrתX#n-TGNז:f-AEըJ8WlOM:d˗y'ўLgt[&ZYKD,3\vZ kUo:Ԇ۪fOK|5qt64xP/wd U_?N;X_jӞD]xKS)0BiךIZosZ*K͔@:tW-FШXW>"ζVffz~i>^AۚLj}YyiʢCHAwj@X46 2 82^mJME~Z~"yӬRUTI8{P1@!λw<ɨ3]+&_HA0]&ݥ(ލf^K\UT}S5sfa_ v8Kb_`|:FzLRHMiUNFk˅eqD/"bP'.Z%*YEʾ='NDߟ. t#& jIgI,vMoOIR̈́u3<_ۻ*stuv6Tj:#:(4 X9bUG'PZ750iQV9WK:] Ⱦ]{G0ŷ *VI1-Hlx E3g6T [IJ)Ml(f G@Aoɪ<䌶4(B؟Х nWCvdlP x [F Utrʙ (seZnB̢GȽ:n՜EDB-|)eʿ Bt&Nq,EM sFB^$+1K-F[w$r`'0l2K@7gjT0x1P8Ufk˩ &o|~9{?.#"$!%32451ADCBo9u΍CAúse4, ӟg}tk7tŞg0_n:'Πfrog3v=GXh[䒮H+GT;=4e =JG 4}2-Y˜VW)Ly?GC`cJt|SQQԔ=HFSɤsZg lvOs~;_M%T=L| g*^\*MP~鐺]{>ΌRBH] V.}+p!M{E,;[o“OA/5(Ք&sΕx|:"gl+4i,9̵OMh:P"C@#)i/y޲qܶo?,7e̬(6ҙWEtb1u.YM?9~:q6,Z~&fEQWK|S+܈r3oG]ʘ9Po]~-y6TV[OgZCtUrmxʪGՕn[G}.E*ui 53%z⛠^9ZE5̺wjYzQg߸ ]JMʍiy|u 8?"p$'')2RDB/Yisj'כqk]~?eXDWNq*] 9v(ޏ>tƹubsZ>-6AjBXd,VwRԄD`%f ǽZ~|`gd7*}Jt{5h 3ry*fd8WWhhNZg1E'ȹ|Z]+W`9&(aO(HrS<ؚ. ׏yuj$ yҤMQEB11+ &2 t2N}IussԌJR~wCNfWHQzH}y+˓+?`WԠV .3_j5jZ!~΅L].jM\84;S,ur-$4'iMZ'rjLISI\;,B^J v6JkThUp(s0 u&,-&}͊ɱLԜ`^KܵiXPf^WRC1Ma._Z??g0N]kץ[Nft<͢U}oҡBcH}C3ýqՋ~u&.*FX;fop7?ohn炬 z%igS:zzT,nتan 3u?YSOAj' IrÔa$4)\r%%}X9)麒Gr/:jm1̣h_XH2ɨ)_0|Ozr+`8Q q/WiE/5~:iWf?O:yw3ȓ.gqB4UlI86ډyھq@#] RNϕ $1|mL+DS͈sQ/9b.bk*Bw@\ <]`!gh_X,G+OORtϽԟ'SԠ]D9HމCoRݽzCM_uռ:uFe]EzvX-`΂t g6rZ-Lnjtu(k5SxA9~օ0s~#n,/͜[FO ɭ4?o)*N-E[AE;- Z~9fAɐ:}q|򸮛궦iKCё|c 8Oz ^R(?&_>Rw?7Kth_ٖ>#WԒ[J]닝 *ytة9לiI|͵:G.siI!i,]WHq}q9. K1^72&+I%=J^Cޓ[J VA:Lpfhggy6Mba + UMKQ72M<迲[Ty?HQ$d4.]'r!Y$TLQN_Ⱦ3>fm瘒w>r uR^nu23;IN#1:tq{t|Zŕ/7JV٭+ɏW~BY|a0eg{ P\ԭ"ç*z=Ljn~F.ndl: 9Щ,FYg(0:;ͥcD 9C)S勤Fy9MP>[\dߏ忉b^09|q^ [3SG*,j]zerit-ȼk77x'%> bEGMx@.,-\gZz?b4 mOL@\N4Odε]'}&ʟؿŗHN{W_FK!wZ߶mU"|%/vq:&Q.Y~+Do~r Fǐi/DwZĆ;wBIDOAe^}I҂|[!Xd;\=d6ZP~5Ms'W.wci@L꾤c4zg7A#1" cN?iu:ȇocS,'/E{?gzѽk4|AMV <ϕrPx/)}D͆~jZ[)u(J)QCT1x@%Rib,ʳd.( ZĄ2Ǥh"yK=>s?1LfrXĢwQt? .^gG?&6t\wSjzg吇t~Oѕ \-UҎT@3sCyVIM7_Tk lVzvzNԉ;)&t|:t_QlW5KHMJ >$h`:榣%Q= fÓ!:AԮ%NORMK"._&gOR(/a}JAz+Hsi,/=1!mz_9lk!?3 d & f^|X[DYÞwMN7J̰5Hk4qW/ʲ9c!V:{mPhO]f+}<fU{zVMneɷބ.#XWVBn7%__w7L~T&W,z9|u>U,C3Y%B/ϭ ƍa`!4cFnLaH OԦ&̔ò&xÝh/ɩNR>36J)ϞΤe FiΛܥwe›jDÝPw iI13K@/ǀe}˱KTH1ܱؽPe_O^~WTԫ=^/yTc&>W%ש I:*ъzM[\iڴDNDʏLYy(΢RKIzG-B2a'0y`,o/ G3$B76 2\bh >H-4{ЇlXwP9R`Ώ^0~-68).ѥ+csܛԻ߮|&Z'T[M Rʪ tIpzSko~y|K jG/1=_ψ r)Hj5f`Ǿ.E6rsI7@@ҽOeIɳ%iKW/:GIGeNB)}Шgΐ6y-9tZ7Grj575HPO! {Vk[KP{q~GB(|S@|YG-u(\YG2>p[Lɒ΅G`jy3R NJCX\1 )oU(\× >Ma4 iZ‘n]Oj& H]7{EZvʜakw[lJLٵj ,֩\BM9&RiJFŕ4d:0ƴ=2 uϫyw*:֡ kg(puj\E\A [Nzi%~-Ke3ʥRNt$/(Ύ S3I"N5a?p"'ʄuo3[S5ʥaU鳰Ů|垼`\hVCy?g|8GBb zO,fQx\~W:'gvz0 M|4E Ñ.+y RfbL=H3Ң',)P4dbfqy Ag#yݾlq\y $ kπ[睧9r&/9=Q8ۍ/~ h٥qjN'U Jp[ l~Ps皆K4>t}ҧL~8٣2ogkP?ecI~P3&~ssA,>d? *WβG_қex?,*O4I,VknV>oU~'05EF0Q>4r"*o!{L!:p% q헟-y9A G,B'T2iGWϭ!ts$>]s%.Gz'hp<{qHXA>PI٥OR7@)sZC0KP0^%oZSg>-S 9oJT&_aUiD](3dJس~WTnUfGϤ3ƊM?Jzs L jt=9Yth4?M_N+s~B{k藖H 41њxR|[`n6\gNf9\! Y ݿN|Kw5*q syUdi>c`DZʏj1Vt/3 LϕzT& 8l@dL/}_ ޮ9YЕ9AZكLIO):=5̹#tn[Y Mz]G6ʉn._y$y8Ky}PfU"/ҔO 1y_1J<# rccTs9L#\/ЎOiwFJr~,W8n;Г4)B8ذ3DK}@At_so.M7A AW|HötC(Mj)'J&?,^x%G϶, +\ e5dp 2$Fc˚tfe +2[Z;'>LIOŊlQ )\.^ⷻ"$n3p/rL^tpgR"ع5%BTM*624\KY>bAYr*-޽ "Cգ0N|dwFaZFV"TsTZRNN< -}.yaNF&T|$RcH1T|qkKRm! _, [ge\mam~O/;g!n*f3?(>c,LJ:HQB:E+z?`Y) Yji W2~p k G&|+=]:gT`=)W栧D>ܕL"bJJ8{\o5_TuUIR (Qst9~=G\r5QJ>4?*EP"tfheyricB~ug=*LaRF>9"ݥ;(wGL%~|Vm%Js!& 0֜[j&_vO, 5OJ hi\̚3dH 45DNG75[K2z$@oI8+H%<usW0 <9~>\k· M̦5ǝX\@>ydQwS+Klfޚg[CU'wP-Q*kuhܬ,( FQ|QnE`aR?^|)TjXO/gHơ$v/bֱ'R,R&Ա))>;&OGWX>Ns$'hb%ZK}频JDU8jt`sXiT":0(uC5EvBӆq˒߿NYM[߲hEH*'}Po+HHJG.J%DG7_y6MʚdP@r2ԝlsD\T&zJ*V F$_;j煋DTo It>ώ[g@#k/qI>lxCɩbD݈݃R[Bt&GOtH+*u)?'q>cJWG 7%>ТtxӜa] lC7H*o Qxx9EVP_q9hx"BpOi*Io]IȔVkW6D$LԢF\H%LL}+FǛu.c'lR,JϦ[@}W -1ȵ_;e{$:*Q;.d쓏FĦsVPUӬ)y:V'oAy+n椪J7qP'OFu?B`}z \HO\ِ>:$? %2syCj߳OF7w:TM=55(M{{(ZP:syN)gLt ,J(b_Nw \(܈Gjk-xuĂTb0L` n? xH+D&A/JXܛPiJ'Z%F._"T*w5+5\`󂷟@".,ȂOke( `!̿.u+(ufӔL*oC)j_-JaY]`3uW-a}$]Ly#7Պ!TC\ }qi:ZY^'%^|-cWDyşfnu9T D ruG?\S)|V;=9Dampw4@З|oƣyA;*r͙\.`XL?#19dQP 1/3kW cRLPTNtB=?F:®z 1i`g6PKVX%iuJk4 }Zh}>iDws'V'=VG+p|)bt́>}^[&Cu- ӓ޷m|S?+r566^sl9Ny0/p| ~"+󑬰y&PLB>?"@$c>C#W,Ov&+ XUDTFġ'MB}!*Q>H8Kb8R=g~S:,坦l\0$_EUMcwDuU&wZુT3S"-e#VCdWZ2V7ǝ~^6ze/Y>>(}=h|7.\[Bya(}\c=%?͋\ 2FɧOOT8*OjU5J̸%6NPxmE;4ǷAtQ%Eu}ЭZiꫨFGTS&F!*|ٙOy ף=g;/CĿ"f$1l,T]\*@4Cl4qFJ1@LlxG*HboYPA 㭾VPs+I'^D[A+tsd>pɰ|nps VyK.1W |˓ЗL{|Z1/W1"d_jRCʐtVtDv=2- 6 NS5eZaz Li!olR}Czb> ֩zj{m獳EKdsGͣFORlbYBuO;!}C3s&Dj#u&Z˿nI(J9g`wn_1|r yd>63$p ̬OĚ1PobzΒ}jtPmtXK[N ER}|ޞ"LEVM_3]inS$Ŵ_beb[DabiinW}~ܾg߄s΀MK;Z{& S*rXc{e/X[3T3V]mZ"I9'w\^3,¦y!o,Č܀w%þ35Po_Ǖ~)yܬ\ Q&I\_4B+R_ҔBrjZ.|ΛEMog=Tt9!-إ+?'SfgvC~Mvm:y}//n{piv_UK/mwCa3*P[뼆iz*SZެŲtlHC0"/=/Ӊ2s~"A9X3~SB|92xf"qo I8#KvE4 G5(lolt7Row.z,Nڥ8cHR=OC=_nkS JJ)dRMOU_ mEvB"m@2jzlLhL w-t>+̥Tݬ'dF>c)ں1'ͦ4JՋ_,$=p%Ħw4H7% F,Ҡ&)|oIrys?u9V"/~oj*DĮ~v¥xM,K$b\8 g $ʰ_,uكx:U ayRkb3 (Xs/lOĽͤ{ VKNPaAڇ¾x]5vVB]AtWח SE#?o[7:,1nj:+',V s,Gm$73٥2ulZHdi RMR^trN~CJ9o;\`lqtGzE/]5n->QsYV~vVh@j kTKgSgߜ>J)h #&.փ!G1Q7cQ+sjOFrtgrb)RQӷMzD(jo*R/ב$TUn&kM g ǐT/2#RpUSNbGj{ D/O9>XJWsZEGԢIV$LGɱ_x"̜YCHzeVĻmRjzwLޏ~a|?ᨏ0Zҝ,::igDAs}j|t"_,6)7l.}E2TVЯ}.XTPNՐϤ'=s?+J} ,\ i@)+I? S5^??DTGꏲeڳTZ^TR>%𣱬l2旱ΚŻ+3seM~.[V*aVҘa?;׍/Q㚍H&rrbAN ~YM<[殏(Ј'=*%㥓nE=pnGAퟡR72L h/FPJ2%t?1cѓz~zU}6ؿ]p*UPRAOW=~v^r3Q MyK–N|?%+6hSCx~w3JzfgWM9ܭ7BZ Mo f'_+UY_ΉbF&8K:^)ʞ!\dho I?L!y\At YA۱ޅ2;9P1$VdEriUۥd5`}aBY2:><{,{c,\&tD>esfgʖ~5f1odY G097;\UIؘ }H{gC)ObUk21rĂs&fM 0}yOI::1kG8@/Ǵ)ˏJߝ.C&+s]Qd}/=n/:`.M~tB# NZ)%IDzx pk{%oo%Rda_R4nBEC ?sgUXϚg34ܗxi\L0Uګۇ.b[HG;&L!JIlTLX_}r>J7f7s9 KΜ Z${<99C~2-ӞfaZˆբ(OHh<5hKvgF?ڻs*4vFgKYdΗ9Rޏ_* fiXjƎJa-ť4{20ә]yW תc7CNj5ۊ$1K8qJnU @ UH8bc 4>99x Hg9)1^Y%/?*zQ=%E/p'?O9+-9׻W+uӹ>[W4Dn &J jt7/z z%FvP`,ξ[Z;,X^GjysJT.eb,ꝒdBRNdi\[`uNZ xF>M3(] j݌&tSGC3ʬBIs|\Zh/+Zs$K =s'YOz礈$EXD_sIu1aveurb:}oY4nq.S;W;ޯIIKnRhSe jMAvSRn2gAe]&q':Ȫn98L,淏Jک֖ ٵŜzW_6U.X-o=3b] K1H&UE5d8i"AEآ3НTjy34mz*PNn}*BLnZtr7ԟ^fyyb3@k祲ش%6yz2̝|24rdb6ݣ&x|4>/\/KGBO&eA#z,t&Шuqev]\R6XMXeE]cxscWn*WC,BۻINKڜJǔs֪ +Uȓ&Ɓt۞kX\ :8;T~3NTJ5 FW5gGjc-1:n?|zbвcCbfw?ٗG/=uX5w3h6e_~]@i`y\ެ&ϯ5Eϲ茠- Jg$33Kɠ!"hW(筍D'9E2|սdW7i'6r}KK-AbZ Wn*|\uT0|YaVn9xY?8>0 U~s>>@-tc[ϥL'o7Ɲi*U]NUvuvr7DԖo>nƥs)_O4` QZ|lZkM /.|@X3_bXsf/gBL,|r~x3S>SHX_01sD\s -󝍑Pδid!Nž06^gSfnA 0>lS긲f/OM wE_0pL'g֊ iQ|\蚭Bɭg (–1#G\%?~̋^D΍q*ò%eF!L-9E?JbUy|P6)f<5v(jqɇ:]G"rknsX\yU?5(wI]4)$qtW+4V|+Vٽ_7M22_20e?l-D dH_ZyߠFIL4C<e%a"BS92<ϒrj洧85&gfZA1qVnW5gk/ oS$]%G0+ z}UXuoc@ngg.Szj):.&gė瀞yWyB.} `>dZ?'=ilg:5Q6i0j-uFtO6my,}ӡi/oC>-0.y|[a{tºLwWf&l6}|cYͪ#V7`,أ>T(v9{s+4DB̿bd=r\zK_`lƺ9:SF!lZ3 r߻F~6~T΃Bǡ?$Ķ~N~W챺Ɋo043;P6pU 7;oЂ{|"*U {'mTwy'J:U%N*_%)_BR:`SwsS?w2ؾ(Ψ"1 g=l%?j3f >t2yBV̛X`~Nx,*Oun5vCo[k)l;7˽ oM!W*G΂? ]M;FocX䗕`m;U%m7ƾnsz1lv1iLIyAdZQϔx?/?< gʦsyM9@FA~s~)uXo$bBBu|KbF\F^,o-:\(:*WY~5;qZӶUWԺ;:*H~//gJN)Ҳ"zy20{ҫ.o\v@-ni>MHnd4IT:\f?269U6WC~zyut)OP+fiT:7JU/{#.lA(dCojG@|1J2 />fR6ns|ԡ= }+w"_fbw<:-(nEwRL`z[_U ]}^_~)ڲˏvN } ǝWUܟt\RIQMwۗG#,(;$z\kuz6c6}D[DrQTֿkfPe 5zf{{-N/`׽?}Q^y2{⮗YMegWg̹ɚ-ZaFt4rU'ΧӮV`RŒ̞NzR3Ф,0ݱPz_`rgBNTO*v0s{=>E}'I=NU}َol 3z1HN:wܵ>ԵJP'3 ]K)ɹcgpH fBW,s診눃8_R+"WGAE1YP(e#]|ܿ:^+wƖciMҸ,\u6y.^:Jh/+_9(G35ֻW|sߍnK>t^q7 x3~pHFt&)' ĜL '7O )frǝ削yk"k)^c)ɍUИ{ ?[j@A{.y` Kr*ڻ'^kUcʜgZ7%{hSп}‹g5u.jN?$O K9͏vÕ O̟sud?s&{чFX]ZAW=mm>_j((so:=˽Y>qh5oPnk~%\ʯ:[h{ś^n_Flo'FWC,,2/󺟽Cܹ9W>lRW3,,5;h-=¸^1%|sGǷV{ nTd td/W&e8y,˟:909BwjLa#Ex'rdΪ6uM y^DJ`G}2YG>.KPItat~ߙ*LZ@^;Ki{i-N(؄/Կ9zΗOښr5>r`Vxɍi@UխK=9z%@.eJ8p hK *c&mN3qLI<~]m`4)x'&6^r4|/gE$ih _] %NOX(oJwF bcۧ\HkY??F}.©y?p󸺻 G>n]^۵Ԯٹ۽F6ŪnտߵO 4^=,52~/kHzZڲ{7)Cڡ.[*}'zxp<ՏזƳ& 2qЖ0^W9T% ?swbDk>sF9>nAiRX?o:ln 9=젺i* 8-ZqTUeCMK4:}JWenEy{ Gk-J*pR4hgԱƉ66}'dS3&Hs'jgh/n_8)@ c=kqy ϱDG8V$È}/(є`#tӥҭդcwX52>4Nwİ`~$b6Y9uͪ:eo?Lyy߰ZY:RMC=ٴ?ֻ m `T zϿ{j6󎪙ԢyKcf_JK}rKX:daje w@`NX 4ꝳ{ D*!g9ɡB)c5ZSeC<\'RsC!B}ngR~!/9's3$t}9;}NtL[+UvR~щ@B.:wEΗ3_3`t?O;=Ryq%y-4Y w͢*2XosߕOR ILM1ly1uAkz8X(fZԑU@?_NF9Zz^7&TP9hת?$J^wSdHldZ=N91ym%wr.X>Kߩ|;b; EL`{\{tK.*z _@GuBwJ~shF[oѻzm;ҮVmү,kWx9Yu<zwL ̌u\蚉΅D5mԐz*/ sR?rY-*ނ֔-ZחJǧ'K8^j+TC;Wgyd4=;*B \ϕv=qOA;YS[ԛ,sFSXE4SoeP6Kʛ(g02ݑ Qs8ݗ춄-(t:\h1+0GS+})Lj3ѴAUֲmnyntoާI1wǕU=147!ͳ_zdwF)F#]e4x1?!bk 5vnfnn9MtO˼4 2IʷY+&禱/iO6:~* [[I|߽JPy:W(-k47oHb릞~[TTZ {Gv{'YM̕nO3?<t,O:j8\,`}' 1ѻq=fk>/BO;Olbg56q>.:)&YgU:ō!ٵS߄q ,s|?2l|s_5TuaQL>! smLEG=% SW5_@RU2j_%D VGI~|fJI0ՏVd~UY!MUdQƍZ&Jr+1St^B(Xm_&*Җ2|lƳur8ydoLoM9E}#{8 Hetsz*l}e*)ϔΌv쾷΀DAסMx, W;k6c,E._͓f<2O%y\W ~)~S]00+l|9~';eCxXfQ\;(Rls^$؛3ƳBJ{DC:5Uy̻4%XL Me(4BE|KsԌ8K2f+:Rr=mOCz/f_[T-'?+Uᇘj^",sx?I_~7C)1qTNmDإՉ!: te~=v>5eLrNA`-/y%2S afW%obԘJv;#_td:["C/g|O︟i/Q5F;T$h%&@-#,ɶ'hv۝'Rau4,\#("r8*W*m-{C?3}q#*.QS#D,zs"͟9T-/&o#\wA|^_<:E-<6=X"i vC;YgM)rܣmWHO u~N.~fί-} ,:\;m`UoEUR^n⼎o:*J`y81[[g![ Jltޣ!>-rr-q0S,b4eJ[䒉h[+kgCtz}kkc=\)3]N&Bd$Ͽp`H0б>>kӕ?=f5L.>ny;#Uw3ڛ=)LO~$X(~[0~P nuYx軫UӦu5?{,0]lc>}ߎ[;,m*uK<[K?qe0:MNJJtU ANalOisuʿZ#Vx9G++Z_ kxeG9 kcIָ{>y"g?̈(?f34> {9jq4r~5H&Ubv_>{zylt ވfyE.B sQW7fp%i]/XrGF\[_7jUhlx^MLnlͬU'xrh.}*$)Vn&X2F^jXߘ^r42.uqToCUg6),j0#~n➕o8~Pe_wyp:>+76OVY?]I36}0~o.=E{v"HCSr}McP@5hmgs.=55}!I˹Tq/!% 7fϬ4gqdN}i3^iT0墆)%sgJ2p|1Ůd3ITH7Eo }s_T`֊BɩuV7j<ŝU< ؤObo٘?m r'|BHЃ⽍2TKP\WHF>d~!eT5 FKY*qFwPz>C(I[J,MD]%Ze}#?+2bs!}sk^z"]$/jRHߎs K"s~s]MjVt1 }%3 ײwNag1{WS[yɃΥ]G^RYoaoQֲsOu׾F&W[?{Oc^ rZyԃGrܕydF"iX}HsjgHQSU9y2YIG1lyюb:luhѹ"ٹ/"pֱ> ψ_ IBIK1/MNS{=ůތh?=ah6?Ϥrӫ#w>q LZ.ɛ1Y (VX=zytD:{QS=.ѓ8_6F.Iƪ}%:rm+y-VnNXL663]Ν|R7Z$ D29GQ? k!wMKLVcic4C0ʚ'cΆ+ iSatw:?O~~8 &bℙBX\T _ڙ?R"||oH&_enqy )J5nFh;tQh574=hWc={6*YYfȡx3.uΪgzM, wlzsf߭kD`Eİ";| qg:j3/BվV[Q=ka6nF1kΕ /eL [;=w?r)F&ʺ%Kݛ@~l hcpLҞ o܏7컹80-KIh*ݳ|撤Н>Z4(Ygмڍ὚,Y9imSE9b4PϝJmv(= ;$U瀾|<?X;?TQ3Q*.$M?Q,ěs~8ЭRM}?;6:mpEs]*"Cy%2Nkӌt9`hyvC)!V㍿uS/#jlTCf7>J'?K9$yMmscK)k_S.'L>t~S~wE]_iİ jyR^ǁ@c دUBʘaVj3w8(*);:G&enGm? 4/8_G;QGQq0qWҟZ }sem, gEɣ5jEǛnqmA;k4ʹ1\~yiw(*-|x]Oi}u;\YOh}귤oV;wͬo\N֪S(YЭSR}[$S'ʙCUe9;\\08GߔN'Bno*G=f_9 >O>v?!bʿySY;JM2omN:c>󵁝G캬=Ш]?=k>)yi<ΦبfsWQ7Yj1>O3UǞ jH]"OD^gCb10njn}g~xf9EQMdWsKryhdʿ]ZYQ$VusXl{&i#2h} VvhU!?Mk]FjŸks:Lܱ$i+ϝ>YuʍTQ*AaK9ްu>^ 4 `Qi?!M!AD(V0fOoɷ3y,3J3 0Yֱf Ht탋us",+M&=i_|%# ?!vZoH?ª,Sֳ_V-QC2Ϯ5yZó"Ү7! T&د /QlQ}XK񋏩f$M8Ilfbd8h&ĝN"7⤼Y\|U5Wz|~s]W f:Z2L &,L#MőK2ks8$?1 +Zb:~ۙMGt7iu=ʘmWCo٭GwUaj jics}Y_ޭkVw֯-=!LnF筆׫oS*ߛ^hrTM/X3'QH<Քm5e!E?Djwy|~fM~(\pf-P>`!Jw%_5,q)4H~kJvS;ۏHhR+g>D̓ 8> 'u yJ'yi[pm[.ٙ/U.β,`}5:m*_Vb<RCM (P'!|)h+C"Ŏi=TVp8blt9T0}!B!n&^E,֥fN+?\nsB?*ZІrx_WI0 w#YE.o;S3[ޞrffuQ6`3ZΒm\>a>Wbv^~)E[֤Ժ)EMG2u Z-n^ՙ$dkدBV:beR%/#>Dh`SrDm!@bOdG63ESqGb\9PwUޏBo?:Z4P_0^SՖ](LwnraSƅ~E{9hγ:C8vi,&}6syA|尵\' 3>DsR m~?@>P%v\@)y~>ѰVg)tBǭc2L=9״]çԚʝA4`u_HtG5~;1eإjIobP#^wi04x3ybzg0͇騛ΟLJO>965{+#Srfi.=G3 |p)Q1p>Q. &C;!TɣJQ^G76qjFĕ6|4 gqtA4бdiWENésZS>&y(?V= h&O2.nxRhh}ru~[u91EJ6>&;ط<lJ#74zg_) mµPj|صҲ]*xzֿ'P*BO+I/I9!; _Q"4P|+Ц!&&ϡaO)y'M?ny.73uԈ}Y{3CKfvA9 lm>v=N?}ʩ@R߱} ʞ'BD IɃ?<^l+|/1iqtlVҖ|ŗ>+rh yjw4ptQ[R+-`.7k.|ٷ1*-Ać: '##˙?k9]գma}KQw!qEz+H0<}BK1C~!XyjB&Vh#_ɵNj_goz8Њ~E~>ۻWAʬi9X:1SMW+j֗G1P^]c:1^}L_xhf5HM=dhVKHbr4Y݉Lϙt*`@?>SC3oWFB}ӥޭ]7 J>#}GE9OP@IKCj(emЙ5 6pM$L VL,*^ߧbQ*d#)Xl4IgpL1P>>J?No*c-lت狒S<ȩ8HY&s+?2zTdd!Z =ud/U.~fgتcBI+i,e+K9ZQy;fEZQB _+$OC5tLxDŽuT-/$:Sdt)KWA-5^?4dn4Y1Yz))^JWqx`38hgL7YCŴCtRY:gOAg.|󈦄5D;UZ(y,ޠb? * ƹ=H3?`Y~^Fy8j~;xz'qݑY>SS cC 7q[ư7 Q%Q4/\H%r[_SY_>BEfUΨ8έqNy7``f,6RU? Hə,yZD |]٦$ş~E@AOz JCѷmFM{3J~Џ_晦O2jK-%|5<'խdzG+iS[㠜[xY-U4O$eB^.f$L={~JrǽL%jf К 0.R#,U(36Lͻ!SQOƞ <ʰr$}ִ͝J&FBcP >ED5+8PDP0L JUH3($Z O م/HfwBqG;Ӻ5+r@iG ,. 8!P=Wjٛ+Pl=u@p7R9WF+Zs>tC椿XgΡsq:.澑;_EɶzVq|_ 8$L&{E,,YE^LSɋfeGe~ % a*7CfYHdY?7!.ܸ]100ݖǔRJ9N`yVBho_.݋̶B Ӹi:iPZ57svˤF])iXay|U!?.1U^:A 3_{WjKruWf6`~'dޏ;THj-o׫F4cץbκ?']**כcԱj;L?yX%+̢)J9M~:K՝ݣ-U#Y^z ʿ|GoVuH~g/xD?؋\A!l+M j%'sv6:4C\sZ_i+ n9~k.ߑbw2ն)R&Q^1lq7iWEMdWEػG$e*U ïrU:4 U8Ƽ# (XQMj'gâyϨ.x)v6Y7_ :a'݅%9}~b9N~qPz$Y 7IRk=Tm4}OJzqo{K]\v!._ԝݿ-׋ԔttG^&k?Щu#j)O`*m{:^Gfcw`A"yt+ƚ6/бrnuL6zmSlv#單Lb![L^=.JzUXQ1s 'ɬ[2$h4%nYar=tRF7n+~CΦc>Ly~-iWZԈ:L $ _^Fة۠-DH^ S_bb9s¨i_n gEhJBa͡2g>%9N &]pQdUn)bX4IDWI;i|C5S э܅1 LO5૛17!`#n탠li"%Jp,(|mtJj//RFvcAR҇|RUSnyzz=Ha} {OFS*sJetIO;οJUb!ctpt|a=aԸ'J~6fڙzR=JCmj5 Yg,7M7RRDˤTqucg>W'4|*SrZؔTW MdC%4`e52zйlW|%JgRc=g)䀳vܢg-jrޟ VխORCOku?c/9k߶Bd]; rhmJ[.WSgxyZ ҵ4fӿdSjTnt<ĠzrwM/ Ҿw(1YGʴrB|qL؏fluTR8g\Z ˞j|W/TXa^sRb\ךo1Q͕Oډޝ=]@9E3@W`OȚٯR؅E㣿Y,^JtF_bʇI&9[!'ߝUMhl3'_gч|g}5 30G?X}oAL˫k:DEY׊hⲔ_ߎ/On>sXqw5 HtCH d#( +Cק[=9ui,@N(^g?0X |#ybƯ1sG?C }E&r4at):5P?;z{Xq籃/̥yĮteIY xfh*ЛL:̨~$=eC9W4dZ&) oѬ+\)UdXutellu8~_EaKhXQ-ƦRyJl n-i֛kOYthNDgj-)Cm^6]-W}17)*Ba%9^4 'sЅ|ܷ!a}p`}Eop8؊a>=k`9gQd?iu'-nfR~?05d?ݒ~U !`n zCήT1 Oq檏'{+dI;t>PR+KPΥӃ${XE U5-[ɑa~T^.T >a91K7b?%;!(7橺RPy޾IQCG:z\שijⶡxʂr ̨ς`d3'1|ϻDA?SٍK*;9:I${*~)_he,l`/}TO JcG>OP:ĭoFd(,LV[\->n>-z)'s)(\qV4PIO:^ s%0c1"GTAa,}45u4w~:z}a371~ *tGؖtG2wlo(*gDɐLiP h%`}=w%,衵~`s\~[Et}lD41șSQMOPqt<@{ϋ@(e=NL՟>76rTsN$")T+BjQL{*׀6pif:L~=p7J-|2Iz(V`i%rNh;}>.Wܝ4#sYv*~ִ]7 _h+nۨ^oܚbS鐹*tK^@İ:tx:tPy"yBZc2~TW#9ȋD0(:ycTKb589ؽzC"CW0;9,]ɝ^Ү19b]F;kYTRʝ>}VĖbo&[3TH5B}2у2C77)E<*gqITGτ %Ք7Ru֭Gw'61.پ[Tɛ39gҘOAӫwc ]N#_Jqg_7ΞOU%+=c(Ϝb9iU6kh:>eԯ߯B5=8yGHJ ճ(?}e*}c]لsCXMQ^˙Q-kãmѠqbO孞IIO3a='U % 2 ܫzNrǐSf2s$?$m\Cr9 $c?3b~i9TbHA6|WBo.J NR2D Uzu򡒗I?o?OFnfN0"և5qykMwźԩ:"k]XZ.lE)^7FW٣䪪ZQZʸyP Wk=h{O|AްWlZ6,'ztc=?sPl}8(WJ|sm:*JO[\s4͏OIk&CKYF@О-X¿+3LwkS GCS=׹$etU=T*s.v&s3'ps Btr>VP, g(# kt4LD шk}fQôu+%lH<%jSBTCd$Ɋ tx~Q7&Bz όHֶg2ٽzI +dY͹pgփOjj3vmw>lX2R|x]Aэ!3Xhq:I>>ّz~6Z!y:2TRSYZ}1bֱI*M_''<ǜϩn}rjJP3QKEBGo@#/CR4^̼&Lȅ*GsGco3"|뛖#WZo==y +GtKүM(ܦ >i2IIѢ 媁Td>UG8*~1|(:Cb*K M;@Slq09SZ9?}L46L~vgFw JΰSi/7!jέ>aM/IJg˙zygCg"[CJݮ^QOW9;3ZjLۍ//WwaA76;2)>GRwvYK(S`"֩7I4Җ$@HT;,7re*){$1Ft`cq 5,G5fo7GFsF*>I d*t*ls>y_FA:&aL |6^bhOgz*G724 ٠/8}L5ָ򮹧TNk9[Q,8lR E>%hs!n],qV,d襁":&pDܝ9i~qid7/ebt,B>YPFYX`Ld?9|tMQ Spy孝-3+YM6?,?K/և٣Sg(9Ftc;1sdz~M'zɞQ^kogh?Ci&I+CfPsb0yJ9L cD 2ec[~> =s#0TQt͟.%uGLF;.s~@!ZH *a`p*o_ g)]j i;P,E>I;k84Qc:JAGIɑAUYZ'D-5@ 1Jm*o۪oB<5r1Pi=(ʋJ G߻L|gȁ:TFϒ,xN9_;,E_sPtK~\_33Φ៏|<ΜHrboӋV'ΜpVL޻A_;3u[5N|iؔxRҶy*3b\x.SD̘e83by=(U47i熖s-<jfi3y0Oˁ2vH}#jѫ/!qjٖ`3nKdM3U}` 0>kNy4^V;0UFܯלG$깞41Ͳ_9lQ}ϣGq: B^hsC\>* Y=9wPY9R _|߼4jݍNNtK0KEsF<']'EqM'1IXBt)DxdQ\ ϬMe6_]`aYTi/}9Y[ştӲP{h/хJyѕ_[#ci?I'%\:;$seU\s2'Bq5?G"!P̔b,˫ ,:&u'o=$D4`J9b3cN)uIBԿ] Ri;9w%%_}(3qycϽR͏s$ 8o(j?Pyr_Rl0(@N|.z^Ps5ΡLoh.(Fk׆魓 p&~,o9e.- u%OulTW\JӧiM~/smt; +}&R~29i_pzT[GGM{R)oz&l$|gGѭo?5O*B9˟uH;h菏*B̂oe4] C> ~~w}uz9JO}HRTt} ȷCF[yh.^&*bjӊ?:B1%>+bPWH5"eZ^Np̒uͤ"m*AJً ^'ǙɔyK a¯#<;hљ6BesiqLF4ņs4#z}ES.$Btϛ̊cSAt&_K95 ^yl32)_-lr׌.Iӊ΀^<\tlR`vƓdCR[pF|ܧ >ٌYEƿK΍pڔaDU"W7 NK3'o-XtBz_5̩si˕>~ITtK" ) j'rGStӔȺ"ޚ?;ۤe-- M1:=sn,踃3&eOZRbVw5g,!Rܚ$a6Z>Wc VR_lN5۠L Xz@cTWe7AXfzI")T&qΚx_3g'C&N%%];G68VB]QȽߪj9][Y?mT9K ?7Bk韜jf9 h#R!*}dnJeNLy!;Gr^Q`e]`ߋ7 GZќߑ"ÛL>}RܘJC5J;\.J9Zl)%4FaU2~O`b>$ZQMkYiDK,3z<> tr* ~Qg=<F\Q" pcʌ/ 4b v S#%IZ[VN[U~΂07ƅ7(KԺTh\::˭ˁSV 9T'|crZ5A%mUhŜ•i2 BVaO7?byωg*BД*J1&DܿUYfٹCTHm0ЧsԀ?t qC?2-ݤ L:?aNRL!E8PU7Q#MЯ"a$`P4#ThJX7 _Ml>̜C62n{k9c2ms)u0]+w',.GވAW aOo Uj?_MӶnLJ%!Ny/ʨz=I ӆ 9'̘\LbEDM L^rI.zFe2YM"Gy^Q͛w.`%?2~Uэ?[tοvx/Fat3~;=Ǫ8EL ?X~C w3%j G5|ZmLItRO*Ƃ[7H}9);g>ٖ)CӓY/AyZ1,)%C.!3<)g}AP#=t ϫ[xM(g2IpyGc5(!$>}1@,enpgWP,Y }&:v/.s^9?Ly9_s/ `' 1\5Y@PKvq^zU9|kkG(kArg*K> ɩa]}s7ئ3Vڿ’yfR*wѰG#Sb=SM ^"ng2%KߜDfsO<ȑ޹\U\-9*a~S&~P 'Nɧ1BcXR~? J L߂);opH{KUidk]7ѧMhZI!o^OV1)u#\W>[GΞ¿'{7W՟i-ܧ НYT?F){)*qiĥ+KsJ9c?HeqƝ$Κ"M(s9ʢ߇?ߙ9F7xq+Nk3ʥ|ld MkKcac~`ϜL̡AJ[ߦ6xuǙ*X39sܖ&<[Ub/$ڥ>78"U$3<HÓ&aB8CdcU;ʦ~әC׸D&C}&ɹ:·`?g49 )j50(2`e7s zQ(LU 1|FS%?,إScTb`A̚z߮MdB;4\udHxh{h۟JTt}O&Cywc&!бˮ&}D_z<4BybjڔZ3(.u NyPO:[up%fJh}4嗩4X&jZ¯:Ã2% g4!QG~LrD>F7 0sEn&Y`I E~󒏅 33koJ}46Q^r?+i#^N\ba΁3rH&%$9VbhsOrq性Ela MHU 2Y1EʼnbIQg<>)< ~ _).]\{U8JbΗN=Ui*D8d"Oҝ^斜3N.HQjORgv_co 8"z8jӻ ͢ ~STNYZz7/K1gRTfzKr޶`CV?NoHgǕ\eu>zD=u}cI*޵t:(Xq> Gr"df9ua}omgxҡɥ_pA͉[fDgc25hiFb[ˉKD9.f%B~ 2VG-S"튛 2_J6h|xП|_TT,*.}x6XJm 1ygRKBO?GB$TQVN*EX[)h)FNhb^}"VۜXJGkW;hnyfD`]?;'֦Bޓ}v_&Hr]"uyma/+dB(fK,س%B* td\șNt(B_>o|󟤆Ԭl9??_=)M╗__{ė?5j|lʱH<[aͿډ0V vvRk_be[e}zmW/@δvB9 '.ʣ <9*kZ?Aj]=ahn}@J6~&ULH xQ/vN'X+%cxTo=t%Spj,9BN)[|sR _'?2N 9~'UCϙ)9J/2'3\TnϵԿɮ(&).95~#ϑDmvT_q]L^˅ P#raހ"SwBZlsm;vjyGbg%v5gӟ33P(QEz:;o1N+ GGRaXK3Zޕ n*(| T/ QDw~ nW>.R hVgjAWuЁ~ZuZO ǫ_!ׄϜe/O?Oql鲞K񗮕"O>o7=nF5JO8B|V.|ն0^\H1ct)bC:З PnϜƭa|Wˆ,hr e*xzg9~:_("gDuHGD`pV,a)TZ}.)4\|HûLԤzТLqu'7'-{Z *Ó߯RZÞb 'lY,zg(~?p/%J|RsHC\JC>{II)T\I_W71ɏpQY˘ x~JS9ҥ3K@xhCԓf2>z3T^Bυh/OR/~q1q[Zv1rC!+ؓwA{lZxLe0ĪpބT {A|ytc hȏK7< B]ze<)(Vݚ=a{^/:&9l]WNZߓU3ڵ+=e{ VTR;^3cH3yk#6r~.!ۦ^Sv#y O{[W_}?=~ҴEv;?#5~tAg+VPY}HW;Czљg+#:w%}>; W=ʩҹ{ =4ij?ӢAbV󣔙r_dtq3Miymw\ϵ/u?<&U2fYҩd4oR \Ɨ3(sZZv1Tbʋ)hHO|JӢ}}f&J)6{|6?3d} .Z\ɧi=KR?6]'1]>'Eɹbt+xkf9':v2f9lJ~2o?> oU-a \KO2Au~pUR`&fL#̒+8npvBݡ\/..Hc79WrFݬMgdHoc|[vo~^DrU?;RGCԔ0˟Zvo-VBm17!&b@.P}w*rcvlM>8yO|p$]y'V"/ي,ɄV'[V#H\٧.xxѿ?q%dJtئY8͏8a unS%is2U͘fIf+tPB+#DظT2teeT<&h<3gRuTjE3ٳԯʦkٍ3–5n~A/f!<іbdg3١yުTZYⷭCJgu;>\q̾^>r Gl$E){|DGG &kS[/e/[ˉt2m^}Sek {)+?!p3G,>͝a_?NZܻ Pg'+oKsAP1S/m挤z p.|?G7%b&.RW8NjLs'N(x|bZ-u\bbK(|ı>r46B)~zTtG??GUhH<XVꌺ tE҂t!3_WV- ع:dH:~D6"O_Q "v႑Ly|%6$7HS9s V~T](t֖{-1c/3N8WC~o_;w%ɫDtc36}#?m}>kW ? |ܮz|*(LNlH:)k-s.t+~ !w%SPf|;ULP~rc|MI13*x,C~ͪVVTq5N=3l(3ShJ,PY҉|j&DRCa.h3""WL(u \ԍ?NF]<БKU| LI3͂X6ORy%%05tͳе0IDcU [tN=KmL<5WUVu/?4˘f*JS:3Egz1eLo^cɽ if.N6Lji;&N?no]]&a?5Ƈ; M.:O I ּMu2ROW"8%Y9 U|A*?6r$`%ʔHBhGVrq/>1)5|"L3j;(?&jyBHrL[} jꊨ25ƓOR9k@P XzdjTb'&J:@*j*rF:gOڴ>@|ol8r?2b9*C,\Y%ievvsOC2! NUVRvMYL,H:Z[V{+tp=)9~q)mFUh26xe&]?|}æi2AR=0UvىNϳidb=yr 2cWF:ߦS|JZNt=m2 ?v{&Tc>t%εlJ'iYZ]| FH3X1\n2OAUC>t#ud^kҧo,y&/#_%󥕳iyUFy4NN#VsWz7xN߿ j7`:GϑId%4gճ2U9~}Ma\J2MEU/vgI_atn;iseg?qrJZTh⽛r/0(CG Х&G&xئ a9hPلt!C7E yNnPɣdğtX!VQe_W !&r*2ì飞qm5s  i%uy%;Ɍc\]`uY24~sUQW^u~\ g:;Y'^"ݷu+Ο΍Ӗ \+Zs/N[D-_h_uU߻AP?kNݐxff s X.+Cv}[䋙WfY3@^T0"A\;Y@W'$ƒ#&#y2h/:,~0H㇗*~r,Ҏt}2Ry]C2yC8@:-R33i,KൻP|qd)azU/Lf>g Ԫ~{yS-G/K%X2dXog2ڀr+%f棟iLxii-%#RE7.M:^(du}:v)fJݟHYW~q.4z *_"t.ALۿXGO=e: )9%e͒T,w'~̎ ǭH^}WU& r~`%t }7BƔ[kL)dIei3}T83;G}GA~!n} Jr- ] GZ8?<͇J&(s+UJ&"+BF}*}p'y9 I 3Kb#5/>J끊Kv"FagSb[rrqk5V&CrWe_iwUu??67j ?$Ssڗ>yyۥo 8aAy~g4Zi"xșJOPY0ƟAL|77)CGZ9{4%|\t" Emt(kb-MSԷt*rmSLh>[X[4xuuthaϴqBr#!=d9$ 80U K'U!t[Er֢FՎV^d >_?ALhoMjΩz3:[; :[6wۯD+m=MQjC:06P户0&/mkb*)aX?yg `39Ola<|P9g*'^g\f{mX/_h;3V-e H[Ф΁3_'<0n HYA-4"9Ɨ5>sdf&1J}I3'ci:$.i7; 9$VDKR>[5Y2 fEW|#*2JNYgBYͨgW.|X>ڢZ-NϼMSl`Vߞl_1Ds~MCa7Uޥ=xbbdJ LtYZkƃ$PƅcJa/؏75VKɥ̖ɀBɮrNgLv /ۺ?f4>7ۣPKi4)jb͠ g^oQ"'z`ncb~k?6<}DTKcJuҟVeLՁ]3q~j=As t4#/9 QL{ ߌC̋KdUd YqzhyJIjT-3%OM1 /:X#UᎏJֆ!rV/g Jx[X/ ]#8$c#|Jn̜jnh(e^6^A;~fQ'tl_uz tX~RJߺ`g1$Bȷ}9r_7ЛW_y9].l@ɅbN1gG:}a\Y\>ycvoBq`(A6߷Foe:MO)}5֠-WjU@~3 `U8s tP4_N(ɦuM䛸z2 `iLEqS徎yiJܪ>B~bI?e \U̝h@x5KS46Ϥ&. uZ#+Ic_H8)*ZySB}%u#+VHfb"]&N>d>2Z6 J-Oc\yԱ,L1?.-`]np6C%q}V4~)B^=.ZJZ)4Y=TqmWXʍ7CsGpl'[!m6ЖJPŮ,Nn\LdW10-N܂722I.n}1eS'f} PL/+'{KU_yӦt^=.h}i\Y^L;=-m[__`-[\4ջ{71ϗ}8t(,~P W-`5醭o@"%Xܑl:6W<2,g'/O]y@ Ť^?6mM aЏ 0M|ʯD_}bV*v) )R ʖTӵW#}E"prWϡDI߯AY[H'n93:(dG4My+yE^9 ;ݎ􃉞VaI!W,xr$~U  $<[*-%Lf'oh/,9O2Fѕ4OG- UA eKNit,rbb+$ϵ1ӿ"?%6|EBʅY.R:h>Em٠1xв6CT7Yw㣫tF.pJʱao;2bv$}=Y[5 BO={<^ ^aԡ`9v_&*3y̞Z୿Tio@K "zf䲵xQ`M% ԬNgd_ˌ |5PWo/`P!+1-rWƸ|X)RfRuRL pQO6hN& h }1jӕ5J] dua?=Cs /9T ˋozBL>CY{P[6OGgZc3G&ggߝJ18j٥TepVYgTv7+O]TIk(y6WΓg>ӝa,nqk\Ǿo(qS70Mv9ONco0H0˫C]>κ*CP볡}u%_kוK)UKR]f)O˻}ޒG<K!ౝ>V.(䙡#,!_* bn1XnQjI6]ՑLjye2W}p>P/ȩ2pw;q$K<۝,\ \ Z 3ibIWXhPSqlO?S$E犨jf2m+ ҿ $m(6M,?IZͅNotGɫ+JfP$}) _Հ8~NhYӣuk V8 V .x]SwYP4S}K[r'55:QM"tA<i➕8:vnZ5TtJ(z${sykKkwK֪Bޅemnoc_BmW%Zojw)K1_Ia6gS~uT[[QΡq#E7,=c) ߹OKX_:cs!vwʿ?`,mɫ?B_Ci]P?\cGZ4F|%?͝ ,D[A&+&E v*?e7F3VuB@RZL5N|~-S7O%qQ c:3 :IvI FmuNl9ft:r ?rO=[U E-13~G_r }P2v~=OD{E 5 u띷azۿ`X~惛kV9OOP3n~ϝ {\˿"#qc3G4>냴D],t+]6uÒ+1 )/^8aVr9}Sujt sPxxC<@ʉS9~tl 䅫j c\VP](:y_C?d_;FC:l w&noG$S󨮓_E6 tfޔJp>/ߕGPCYUd,ycC`cai8KTƕKWļ crߎVJӤDkcyNOlo>(^N}<4E):N3_jԬʞWKBAZfkZX7*BZ5'DO)g'@aFQo.{hԿYrǞTӺ2:Y;Y6]Hg4U3荭(%LSFH>^GZwXNt! YN.d:t9D)>`3S|lU@ysk-ly(~\̮ *(>3 WZQ' 4Rį<灋U{fQ2V-I* '\hp\;_LzCO~迥!m>R/Р՚4SU>|xt-ɵ :DG&ABYBZǍߤ~MuӨwbCVT}s ӣsj$Qa5ufPg9 kX֌f;yxkV' ]w@юu9I<~r>lwuPRfq~isR:~ZZ3wg ι9dV;Lz_t(cDl]Ixʒ/W%T|}S9ϔgi+d@T72l:k$lGw*mGHkg4t}RuLe>vMWj2THI+hxUȐ&0 G7=7ӓ̈iNnlb'k&9 5z};\ePx!RլҠMOWhD?DfY?Ze,?C&4ڝ,2:SkfΪpWz67"ΣnAnbAǣSM9z~&(ձUHv7k4 Hu0F}6W>o_B˫T/DwɂzҘmֺqE-WT3jw(v.wbuPT3=wgI?5 K=y)?Tg{Ekas}jnX&v:ʪ9z,TgR:e.2uK'տUD~UitsúyM6mUyep3(Byф()jVb~8249pDxisރ^nQ8ŧw:7PcZTŲeNt[4QKL!l] bf5H}#ԾL&v>Am>kPt: =:'u({Um}\EVt=O9*"tW oW.>itO%yj;x6ݧ@9a?z_=P2}ruXbݧypZYGj{o:g>콋Z~P(>]*p(-*(nn&q\|^127@Uժ^sVMmnQ^),\jP?^r309*(ңXFX+*S:vOn4>Y |-3o*-3o%ux/92)jc_ gٕ)sue^Nw6WRhJޔ6ZL:(;]WSPoF(]rU׫H΀0T2g D)ۦsr/"RPi%z{U"nK^{SQW`ѿ u ؟Um# Ka"9K^S+n[ɋZ><ښJ:T)jzM j ߻AS/iҧ450E/aJoUcRl_Bc1epyV;}`eqפZch΍Iv8et%Xϝ@R9Lzi6C] EBMsFZ@pǮىLsHkt6l N5!0iD[CR籊x5辢Z;Z#V.s*/k3ѥTFW)_InEUW^֠ȒO(o"2܂G{l4 8NFV92$QVM9/3!P_{^IOf =U[E\<`&t4Úsr`A`ZiDt+Y&d uaU$1뢁wE^>H}FlqQ>F+%4oLݧLFWJɘ#bі\:%σ#Xwm uQNۤ>'hTٔM6K@/I\e gZǮ_,CZC]jwxW/M݊]ܖT4>x- QRgzL!xU,ڕ-K]j &YߜzļKឺc=UhвZх޽XU}\ tC/_#( p&ujj >e5o<^ (^m%LƜ+@ L\Oy|'75fd.`u!PIGH`5 cOǒ k7ȓ('ޮ3_r^E-M%SI~`Ʌ%$jDӥt ,ua)XPRT4_=n6QGCMXUUto5Ar߈ejr Vl/ZJźХ :Sa48glss>5#+F=976@AhOYEdH֖QVRꛂ'keSD/wAC{Ҝq}i'QqP[gQ %tQQ$8 "S ۘ䗶:r̟uDz~&.ji]<&ҷ3h}t8u}.gj~]A:5F Q%Fa~4R*koɫbB!I[t \m#=31@$9t83 /n-~3mꜪ'_ҴwPʵ/H~/}٧$]u5Yv'*kZ4|~&_&?7LYM.MZ>XߵCgIQsnj@*e Ҟ~QRp_lQ?/ygzCkʦg{#<ԤpI?+ti7GOnUQLWHI1gHJ [ WL8I'YY;Ƶu0, Wg~:ҟM1&2Wgkh>})~b6& [h&}Ia'$. A㸧D-JW%Nʔ?XL&K}=0B"\Ѧ)h9kΏ:>C皩:sf5Yj5,?Ոlsr=] v~YߣGgF-rW1_1TʸX5z:<к[Eg>{߳^"k|mfn0/wKw~P諧!^}t]Tm:®vv\ iJ_ HgéBNp7]'k(MU֗Y}OCTTtJmtwGq?^X(e 1VE(UQ̤Do9?F<`''. {~E'_Z麚fEgdڗ<~ۯ4wwwX߶OzS0CUGӵ UޏN)tΛ5'TşEtYaα֝cyA=&/W3}BB)E+5͝U9kI2#CsM̖7+=y>2gND[0'HUC* ! 4 -؉~1CGxoMw?gF]ro]SιܚnzfI "s_DNސ)aE]ə2,޷G[k]K [=y9y<By^-Qdo$fYG! Wf %=F_anwv2oKn'}$IUo 6r\* `6j[mU;k? :s%gD&Ud)26;ShSEOaUoUڤ8.~UF,3eUkJ sU?YjxmҮ9~j'KZvá5 ^-_밾Mաbx VQNrF5?@؛̳ %,^Ԟ_w-XYUMk.QAXp(}Ma{%u& @O|i 2n'$;:kBK YaiB+8ٵzŇϺ|0LTӿ hЙj ?TLlls?uC[;sK=Ci7[fхGRūKvɈTms͙Fk:3\Ϫ·ݡ xn)GfuWJx2 }<$ܿ^ ^siyKQA|Iէzh؂Xr+IЦ.g"i^x>7ru6Vv9g? !Дn+`]\Ea\鿐L|:dm3މ6{2su:1KO?Aa u:=Rʩ$e!M=:TU09h smWy|P_Nո֩Eʿ&k'IkyL(U,nG2mT1;;zwXGM#)-lbe$9&ۮ=V)|9o&O];+f^A4fNUk-`st9zؼgc]^Oކ#wrlY}"YziF7GJQ}֎rFa^?6\溓򾅋E@|u4,(~K}>]В}:MEk+Mu8WKbe[:,dfK3ڔYmT=m祛XZt$'Sְg_N2:OJo˵:pQᓡ^Y>oGRs[ K5%\Kkq(BHa-SN!|vC[r{4Gy6YGE>QO! ,X̊DFsťA- .:giV\sq;ҵɕ{ӉSH9k R)62|JrWI}x-?NMU`QJҪmiX$=*C8| \s>uVUriu':ck8tF2蓒sLw0}&mVPt^}{߹fwMu#JĴ\ }9ɂӫ&oGpxcqaF0/*I0bΉ](>GZZܲ_=Ge,|VI\˥pO GW5&I&ҫ%eRc\rdzۡPV$z_L[pICF+ic gW?brѦb:>Sq|_E/e|(+X<y/`K VIL ^98AY2U%@Y6O!2bȽw|$}mlC0yPN#*]QZ5l1.\zt z>c窀oCh&>ھΝmnO}sJ7Omj/@[6FbC guxȅKڧsڶ3{ۇ'M \5&6i#akWKW0ucF|[K;+鐩g5/Tǚ4v_~}Ŋ0B}dF55GU-dm'o#(9`eF[+TeE'Z?5m@3/龅KiLQ@jj}΁ߡֱ'7zg&iG&VH뒈Q֬'{{kUP)k|$fRs9"4Lx+,Aŧ;j%GɞicBQΩ3yI%3??!jBn; _B.ܯtu20=߇|tb$l6s/nTӯikVufݤ'teGTNE]>e1X՞ar6j,zotao7奮?2~|̝ж$kG5[ܝh;^tn?zA/X_il}=>Ҩ:JlC IJ@Zm_!K-BSֳ B\)_PH3fBA="aFϜ L( 5~b3&1zX-oC z׶VfoBKLմ)u&ju($ zt~}%+zȹlY#fuJj["΋))zQgbۢ|yo5{&uEW z9t5Ǖ,ߓ`\f͕>5̘rP:ʫ {B^-C5K8&̡DgT/>%C͈PCSu]/,'(k10G3&+I{Vxs:]; ^PeNS_Iۗ[Z8PYt(gK]7rrxJg0r_?oG_RөxDHԝ7._fRLX`TAFhSoLY 9/G^ZH߆-~e ݞѣ"I>Gf~x7LZQ4=U!`ˣ<CAh։%Sեa;@&^KμﵹoJ|]h\{%XnSm oc%|m+i 3Bw7mUrt|yz3N&v#HLχ~Hi_S9O+[KA_9hj|^a9%\T΁$oXrv?tLm:NQ(!C'_mRQy9uZ K5TqPE18]f{MUL*Q1VhQvIC)\>S/z' :}GDT[J(|}?Tf9re[M3XKvvvՋH rNyQ*JU bp!lS=yo#ouc/G$:,o'gdFK26ʂ;m qbٟNZ: GFD8uO֩.|pÞ@&Sskf} 2uyXkFI֯Əй~Xzj͋'lY uM窽?\_|4O()'V湟KтsЉ̹h[~.=Y̐QȃI~ߔ㩇_k$kϷBELgt+K::otWOgMbj$( c, }JB;6t 5|- W` h,bv]z#EX^Up(0΄ @Tb.W]?浂fa5!1"A2QaBq#3RbCr?͹:ASw BY@n[%<3 RDQtckX .= Wɱ Έ.rx^?ʄpQ^y…-{?$C{](#rT@l"1+q09Uhsh#qyn33B,Y qQwGe#'RhNU>7 g! 5?ZǞ:L5X@C1g[os1`椸7{nrq0FWC) g_uvӏf%3v@Wj;T$#L T]GC꟦\F. A-Az0/'(m`E-jjT<&&q"q?STa~yCF Z0~cu8Ic@K*r-(1"j}@@lmj;b:dNG#wX lTčB"(,:` `c ea>az#t%\R=sU{Fl*|5G9-7+Jgbh.*\U,u_ps|*rq.V:V$A}3UI5O' LwvʋlXAU;, O E;ݙ҃ЀߨxrmFFF9 'hQ @Z3encƀDf1\C$n!rkxنF-MޠP5`ʾ$O/)M91@9fX֦'x-8/>4_j@`@qJ>⚜Qw3AT7B j#J6"{d/ALj70yq= i1Ps/8?FS˗J5Pq؜`4g Md* l7qsfne1Ȍ9'7\k$!uS0#wLO|uLP-.@MTEu[R *}D4v#p'*0c`ka/^@}P4C7U$d*(6@SEb* [br*fr0aZQ5^ SCQA%EL1X4DBkPT@u|&}+/( ֌5@T@.XS1^BLBs}\XBOP '/"E8,^Y[n KjۜKnΥ!7 _{j|!7QMN4@0"gjb ZnjeB@[a/ S`{& 2EajF&JbvAu _p,/EMO8A|lnq>lP@aP)Ʉب8ql}P.Vd 07?@AtnV"gm9-!ˉױ!#,_pplqތɞ+Q{1Abr_ İь2k^s˙ib/Hn]*}n mNz2yɍqD\1GOԡ5Paol `ЏD y]J"+)5C:ơ͗>L@2J U N=En1aV"Z@P؊0-w99q;n3cWY_N*Aq>@gr*dTrW"sr~)x垯}bOP1C׏w8x{rRֵm1:]&N-}S#bVPGn>+#S^%/]F9xqHuUG(uQrXAo%d%zJ0ܦ>C-mf6D339kJj> q5H)Nӓ`gQWp0=L>א*;Ck65 :U0.-\TXq(1ʷoqXP 9z@~g%&,HT9N1xœ21_QBH 3ژB=L`߶zqSɆfĵ7q}r8DMx4 BEb;FZERNl@SԶT%b3(bX9уp7PL uBW:Ћ˾X5bT+1VQ8N,:b -^6P6=CX]n. MjSХ]z#e.+>3]EWS>&רjqo-3ϨRdcD T o}N=#_X&X 0 @1=FǓOnd*E3CVU*1 -ZVE M@Ϲsè2(}fp5 N [nq \]@ϕ^.2FPr* ̔14h㉅u>Bp]|,gL2da^̖ӲCn B_kUK7S3(M6-|kN,E4 )L!BQ1X]R"1ǩ>&X~g9y@)-\4Mz&5 j2fz95j9G9ď$&N"pggPMً^5>Q70 j' v'Ħ+ƚC61UJ2up Pbq;nPe1huOYs)^Sw(wFwgRFFX lg_'`91 DoN[ɏc1*&ƛoS$ƶkGۣp|wL^w 7XٟOa 5ESA!sMT= ύĨYqmFT sqg!'CP6FUs@8;Vj&[&̶)eU?\_=E#~Ȍ>,S]b*a#(@IlBh~.gPUј,@ ;R3QPlTw]X{8?L[#d{薀2wo E&?xIXL>W?Wk]N5Q^UNc>i4!8sUN3mɉj F؟T[R_~Elc 1BDvk p.>Z+|z"'_nS Wp㪌3ų Q kKzm.SB!Yx_5_bbȶOЙ"r:wٱ6[O^ppnTjS9qr8܋Br JSCuVCS O8qZyZ8R%A@b/8Q)~jXT>:n14 @j;߈ڀ.{n3evW*7=8Vٜkޥeޠ (jU {[gĭE oC]uNɀ40p#+~=Fj2"V]8H9?1nG[]C/d@1'ոJQVc`"LLPwqpc>&fdc&rn!$n^R."A?b!*Ek!7ƉF鍊9F1F#Zܿ).w?~Qs5M)5 ZaW`[BbP=ǰ E{3JΎ6΢`Fg4gw518^S*Pn-9,muYj&-;X"s&z&\Z0*w8k_Wg#k`~ uSɔ7|V".ϗt%1[b",&!u!ZiMP! h^rÛiY4 OF ]]n*!{R}Qr/ 0;908̺IJѬ>( {~A6E|Zr[Q@C6ƥTwg#n`8?P 0q?3ğ}LoI2 8PeZE"zXnxK$A* ƌ@|͆#/ 4#=xC㸮igٗ cK1'WV&&_hDp:6g#2`,9)F78gSe 2!(@-lkOn#/<`D/z,\ BQ>U>2qMޣQN^:CQ|!BF+0.gDYww\jbPnh1v.z$R^m0&mLu1n,.)8=Mq\ZN:FрuS./c6=E|KP4Q(jkaqMDBXʸV9lhtn%QN o W= uIu(ߺAzAMŶW(?yW:}( dƔOfP95b| / n2_\@}NPCxrqbu3⢏r01O?#yL2F EECjgVqĈ@'J"T61>4:U]Eϸ{&6 +}N$c-\U ~nES$SXN9?!tLapE$ n+w6)Y7?2НKd+Dq&5381jr*DU3w綇'Xpb19VTQro1wp>c8b@Q !8A-jQ*pUZ O}_h92F=K 6bɡ>vAB>[;nCTbVq-p4jb=&& UxΣډCKc=CrW˨\2 \L ШHhL؜F7Qh{cq?oQ0^N$VUp ?ڜ{e-IkxM.u E$OCgSXϙi E򸜙c cqcf2/>U{b.Kh Pݘ_>5T D^0'+djq'kcSl194.;[B`^Qίp;bD9PY3>(FrZ4*(ƥќy*Cp]C|{1aUQ|8[_3!K?!T,@c4C0UXHd( OLPqG)wCdDr+e8DҜGkU;. Z|~}6fS7-TN=~ "%&w:,},vrM fs7\ُ8EELQ3s@&=Bk''1Cy>TQ хHj|@5qjuuj-!1|좀08ị́TU72BSF|5S0Ab38cDTo1?L/яj)Q-w1p8WqՉŵ;WqwTj&9DLv7U *{6\3Zsq:f2h́U"pTdǕ@E#(&V &Y&Yk& s +P-ynR>@OA{0sX3^vplD8 #B:@`@2|E9fJ. BQ̼^054qdSqKfLw-fKr v.2cSQc~S >ƌ&ϡ8-9rtE qawpkCL*,N\I1'ܛfjaTbD4L:clՃ88 ks6>].;uès6֧ǐ!#U8[k#+#sg-5"/+N㾺r kz;ZèCď]e(X#n]!mOa\g$zGllS (\~~.@d#LVbȌ)LU 7q2 )1g!,T+7 P?&9Pve8_n=k4bQN~blFoq ULڸR>UmQ7ϟ} s0޽@t+zJqRשF+g;Z"H&0Y1~l5?"q`Op)O#QRne_ۇTe$"L>KY!WERpܱ5zhz@ J 6`#QUl\ ?LꮤzX/Pus@Ds%nXl @Q4KJw?qs¬A[m(˟FCPrNWat}Ej8 p_Br$ +b8!Qs P4LA Ǹ[*U1רP''/)fcNH=\eT5ܼeUEEb2p|eS_q#Y5s=A;yP~Pr1FO\LtWǹ @5>Gu҉}FB3< r30LaPPGqDANJ$ZA=n"cGC0f$T`@$lODwp Лq\^Bڜ? K@xB]$n n7*a`顽f6"U#DtA{c]8kGprǃѨH 2\b'/b>nEQDA.c"rjQ|20V SGw9[ v~R15>&.7s" l}:?n>+ޠO H" :S!$MST.Nh> \((E]XzSSnapcܣP7t'7/uSbDG؜>1E@28[hb9?8щI z6@]@=lo|\kcw8>.ʈE|nQhcޡ -Y{s~27}GK ?'Ĉܙl,BC?\hLkL-n*Aޡjc9PUҌLafV.d=6'(*H p0р;Lc<8@N?=x¦M8dz2רIM%w0иPޢPLˀH|Cȥ6xenbdE>8ǍfN191P27Χt&W2]N^6)HBd F FEJc} gDFPzJ#sEOw-q!D*jPIwSfU&8f6#czD4 O)'P]r}#-EN|@n7"'Srp)(E\D}3#Й,&0 ULla+ܢ|^r0f:^ Z|q֌Fq]L&0`8 G-uI3"n6s,a!AB$G#&B|ndt#qQȜoqWo3hT@#A52 OpC'ߨHꢂFpA1{X\Θ񻙫`RWQlf%1ĵu8 ϡ c'^"qƴ|91 TTKs#DvQrgRtj]Z+*A|D{Xv ke[9ZkxM1$LhG#蜀!?/p@8Wbqq|k }w,,o jMv"1ۍSB{] GpFC>6+cT::#=fI@Ô֌P7F!p.; e= 5X}r Q_Jʲ>FįSzhC' q>w/!Q#P$Mϫcbs)꜀CţUgP-JЈa{>`WPlXuqsk;POP|Lk&ln10Lc\N1۸虊1@w1؅oWj|\~t#֧' $Ո"c GiƤ2#S4% +YL8#PHe2y:wsW`G+ SoLo̤+=DJ3b/b.ؖtfBh-_PBVa`j}2FN TC*3aL\O&4ns!VVM=FV=j":1?j::Op 壩Yu8v;j|t;#Mqn6Ugl%`s; n'P_Ќn2((ϓ=dc_T417k930w 0]xsqx*%\SZ:=J_q0TNWƯ Xjc0p{a@؜l050PޣA[؄ O|(eP􉘯rn: \ [J .)`} jYu+#/JN(xqID?‰ʖn'"cMܥ7sS5Q~0BC@9w/p~ND* Y5jQRQ3BcJ&(-UQ'gb8,/+nRmB|N?)S0|ul"~6 #8ȣu8 ќ"9;1{19 qDbSFX3ډt3GA V1P#hnbUW 7߯j1v^rƪc`3* kQ3;uܦU,{lO*qxUq?u D7pec5`#Rn0ig#"2>2DP~zbC=NJ B]И0P;Na:V><>!(w8ύw+*e[Kن)g/ ξN\N!;QyۈE) 0Q:UX`C\=jl@ bwOUp'/}Cy{4CK@j8Ȯ.j7.Ρ ^ V0e1·8jt#7@3ʢ;Eyu>U:''.L 2քVaDu8ц6QvÓyqP+>gmA\y%\t s O:1H-{Tv(UΧU1<[%krTnrdy2k *KzBU> ;dC)90 0d;1jM+j3}šQQM\T?Q 3*Q_{sIuLٸ*_D-Oqw zfcu:'؍llBRZe=%\If:0DÑ:&3+U" ]ύ&8nB@UML҉c%W>FP4"]ADfVюFQ+Mq2l[ Q9N9D-}Q9 +CbYQ#Q?OUª bބj}ϐg^h]|gi9 R@ό,28 wOٙh9]~QϗɌsCٗG7?yf2֦\^]^UESQوh0AF*X*E=\41IqHQVfdNCET[3T``b:+ \r7pz~χ g+yXw8n ݓP3ȯ8uq0*6"qфYLnUI"51M(wb9]%ѾEQ 9{vePlgbzqz֣FETBp.Lw;"TЩٝ W39w>Od`GB!kR )t llBjDuBn 8Qy ;8SD(Ep:njc]N5qXAE/UsD)lY_Sla (!H0B;ݟqFQ%.۩gȁj#NHGp QT's;*/lhB֢+#QtjVb136?39&w*$7 rryN@v P@ùbDsPa2D+2h %DAE4@Au1̇ 7p3=lLX &&=,O]re3b.QX+(Qg[S|rQ.@AWB =@?+n_;kQIcpP ҵ\]qxbAN~c7r]/V8N1 ӗcQu8e AWٔT]0/[ X{h7p(kS!Y*(;1Os<⺋(qASTmQX,7}Χ~G MO+t.YCl -N cPp>[jU#O23qF2  *)z\`Ah)_ DE78b@r̙6&If#bCV'JD$@gLY2#NFj1@쇿sor?x{}6,V6;19KYPoPb7!n *ш7ZE4PBdT{ ՘Q>/!6!V:fn"-a\NNĐcgFhQse~ж3' >[%uZψ)㹓riLOs8ַ1K㒼ʸYnkCbĿ,pK2I_gQM FKU{Lܸ1_Q[L]}@3Q1cG]"38E-P_}Y1p>fnIO{2w3-8@L \㟧*+YfeМ< ~ -b; ]ό3zedz^0 rN^Ry5:5qUwٯfkIYQPК2i@T#sE|g5>f}[CenZ.w LQM7>7 Toc9~@r>$Mѕψ>elN3wG4lEij nK "(1׸C]لP5e?nNl DsAflЃ:s;LUaK T^sT푋͘x Wp CƤʮ9x?/mKorgzQ ބ/qlsFN5\bP3iLG2qjfq3K.LVn 7 9?+q+SrxX ]/Hj9X9R#4n7S؅}G^EU U; N73'uI"+Wqq89~7 EB &*.lt`78'e&q$6Te whqOWS@Tb*I\L{1fKC n}f*)8\½6f7Q?6MGɀGZaq㊸.Z0P *,N^/N5q8ŝAjkK-]b+oBpkFrvBF4ZUܙ=@lNb ؈u93MN3ħsO4!1"A2QaBq#R3bCr?q!;+xE%B"ևmSR%XD-ݜN\m9~Q 6ź2|91E݉nJ4 ]#FNjJ,Y'I!nvTd lX.%]5.ءO~{V91r4##vV+9IG#%-Uѣ;(PѨEZ2LN $Bv_T#h|z.N \شѴJp='RQ:MU2㭢]qqWeވh1NI"q>(Ui"PŤ'蒃|yDbx.R֨r9H匛T8IM96z99n8йГ#Xn&xʬjIOI?(rrbIvJy- >2woBk|Z%"YǗF#p&vBI-)4iئ&mm)z#/"KG?,el¸8;I?)#c*f-vNKP[!z*{VFKFxHG!vNhtE>:ci+)%N7#QN~VM;9&,"gKufbX8槿96Jq~?vG5uelJ?3ܬy"IH"t6F/5Eʑ/8I]I1e7{#&rqx!YdJTECЩ*CV3~,⌠#,DT|K\2k' UD#lԥnɉwG.b0iHnLq_fKE**VPhqkd$7.)A"1lM SEN|n+ɜjPϣuԞՙ)vhbQVOqrJ2"jEd>X>yz;f u m4Nj[6G݉j zgd=Y5BĮ#>)3$$.H>9ӳr"H2eV>XG,sb•<^)NF#)xSjDndy%(%8>Ic؜0v&yL.2iq85b''t\ߋea$Lrodeݍ)JΈ$ΤdzZK)'qU'orrkR>ĝ5FXol[D9!<-3ɬ[>)%:=7eQeF1DZG] У!9e)-H14:k? .U7&s[7}loΎ9kOCm>g*Dy3Gʑ85*f2It%HsF9%ޗ)i1)exw)r e_Դ$stD*%oehGmdՑn.ug')R#֊q{.FX}eRS9FFSL#2uoȔ}O:TGkf35٨_#'&5]*-R䟶rIm[B[92_J0 >TJQuHPh~8%d#'E|d-MrmUIGWBf.햗u&6й#.hx g] O5>=d{vrl&98vW$ZbB;-v8ϱ&odج_)ty(=F>9^+5OEeŗPu =XJc_La")>W|p3ߍvN2p= FU}lqʝIcVJTD$ GZFNѕ2JbkDctƯ~V>kbiء)Dy&1rT''j*|}&1p잺dݡ^N=%9kò?%jZЛ]R.6d.oITEE%˔v$dx!H%KI#%ʹ.3|v-(z.RZdqUe"R6/sy)W8xSe$̼uƛW>5mqN]X&qr_lt\LI]ڣ(;}JU:tWPrXDzu,rFPCEm22M KQm7Cq&FJRD$"N1~[q79rF.IIHkqM<#܍#ȟF6q $"I~x$tx.OI\{gӈW-JTum7[!.IJIáKv)|ݐԻf)89Ta%<{&U"]푕;6m5HjbRIRr1rǢMF no$Q ) 2ȷQVeAi)JDh|i(uܥ$۳)x}(Hgɸ׉ǒlne#rIZ%Ɵb).Ȯ/CjŹg.6=Db)!h㟎nj~wXJ5G[+ȯe\t(EvFkcjcӹF^#̗/cn~BtLV^GƸf2r_aĨMG,9^q&*e17D`O.ɤN9*c1k9l_&V|7⯱EV7؞vM BJLȱl|Qhs܅Tx!?I;ҕqQ||2Mv5)4y-"I2/e4oFlRQ{WC:У{9G*D{DU܅M"~=nHX=gfD(&xNF'%߱8sRv';Qdb+Dpf p싛J47;XV$b8a)=V.IoQKC9e0\h,| K{f+wDTƞz=H8P|n\BFG?"U,z-ޅ>D<+ETpx*8d_Sh!>J<}>W=l(arf'Ʈ=nVHƒ~~,Qz5Gogǎ陫J[{KCwq$GqJ*FQPN8hxC[KIQd]e%N액bz~%IL$ωZbvNm⃌t8Eb>"Wh" W;܊4C'J6C"䛗eԫiVWVi $Dgd DtA&9~XO>OA$rzCB썮F:&IK$i>G+7kJOgg,ᒢ*! cC]|;"/81 dRV/(OK$eG&ߎ7 bs: [- 82x4qq\qd-P>ѓr=QcصжO%ܑp?g7,""7{FD]X۶J- &y%q0qvWv{) iŵMtd= >If?CWh{CCZb+_aVK' .(RX+3IHN:H.3ZPr%*zX!_)r^ض4~;#RPHiEؤ>7EWE8"YSUE6 "|Y-RtN(v#~(&JVrIwF}qmO+VEY(bC^Tug)̤rr@D(G'$"#r.1x䟍 erpi :}>̢F|w썪Fm-it-+ b?&5D`Cf?/g.6Bwvbb}[} R#7{ݏ&}Yx)6zCX^"v$Mv|>u'gISw5䨜sk!)TE$]VǴq_wr7H1d)%#*%um;>Iʖ4AO2N-ݗ5]GheB2#Ė/t%Z_B9XHt1GvO('.8-(>ByIyh]FS]Мkhɧ"KDIQqHod(NMd((.JB0Pl0\N/£ [g~GnyZEDn>I81!I^ƥ8R5ŵGO!;1D`),F2g$B~5FXVG 2z~&tr_G1lE( q)b#Iɡ".-ф%}7[2Elo|_&OSJHmCH++<ܫTG32M#hr"CJmtO̒^;K㕢1Q8K $]L{g$F'uc&NXhᗂخI;+J):V7r{+0H t#lQTq)V>7$≭XJDZʇ] JNFv.JYg+cn<ϊP ڣcѝveb1"[IMHx Qr (I?de|G#ɸqd#M)Jľ8n0"TEJQ% ZHPݡqD菁ytʇ'S(g_~tvrq|d1NR_KcUأ5;G4ZV)+;'oHTqIŢT諒dJeHSVvY"s~l&G0jh?W !=dEo7ܘ#jVn(++v9 b+.gk8^jJDJ_ Ȭncd]~G(E`#ߡKGRNNVFBIw%c} |Y^D1l~c93BHq_Ēއ8=ъ;G6ݏd^1FqD\)G2%(KEhj$C1KG8o5тKDx[0)~ě$?i{%fxz8!KOGJ87HNTFT4̨XC}1F$E"I⌷E:V_,hsд)!Q\58ے%z$BAQ)Fl< %'.8/E'%r|k+%*dc>G4=}?KG' ^7d8dtG:'Op3z (aEމy#*G%ً%M7t%%ۢr9Pi:쵘IՖ5jB(9YgƈZ8ɫ6-FC?# ؊1e.5xTF_9fz$ܴ$J~&B;7 Z{$N%1}c$hp4q2c//% 642\NN=>?dinH,E2ѭŊ*}^蜗*֏%%(]H}KqdjC Wb]_ '>)gf6x J${Œƹ$%ɺYt|_h~KfkG.dxh і*ύ9WCk)~Z2i([1%KmV-Xdcz!dɏxZ"RI!Z'( I!J*$Mgec=əd?xУz>xBNt/F^pd[DV${V\VhN[|n*#h|%4n'"ulCc`c''D#oFX&N95ײ6co!6D8Ӎ[#bk_dpN>>CxKd}N=[r‘}wnԝY6Y ߢv5tIJ P1XK+K)5Nؤ&F>Ʋ>(gJ-P1D~ԅ}e#'%hFEdݳ czed"2Kш䊭5#ˡIbF#3DB*Wd1jO'Mz'r\C\/.LN98?tFwфC+;作rC㵍Q"3Id^O1!Ip&bi^ϒQ%Ȣ$RuH"sJmv&'qVv9b:_CNZ&yYJ%ȶ?)PO'i1E&9o_7yde/CYJFHm]\./7(qڲ;d}4(_Ւֈ7F8˄U!T.HШLy +Y><Dc.[V|m5j98-Cb[% d%9#=9z#eŚL#x#F=hllCNIi+G0Mi}iZ>G$5LNi-c]=Yl{>EKV;ܯD$:Q~HIƐ<_r$KHSd'J-S+Z8~:)_[Rd%"!'Vz-G؋ɜmiJR~6cQ1M[d:#l69Etg=z=Y9s+*7GơHBN~IHNR:hsv&*qod{rJȋ -?7J$^g]yH^zbz%5FYUj\qtrN*IJ1! 5D[}9TW7%qd'}2)#\r0~H|3tئ8)G-Q8Ja<8`G/$i}t^9'{茖HGٜp)JlR_OZ>bSEF21Rױ_{/t== =rvT*=ltJ-v)F7̱PrYɒO)CxdZP7Dx99|סZc'eZd8ɫCdyGHY2휜Rr{>76gմ&Kc{2Pٛ?- 8YN)?D%8-IFm4 Ke vKeE~Db}|d6އ1yedVHD7,g[8Ԍo=|vBUgRFY?rRda,\sBMe㣗Icbg윲+F9{/&F |&OPt9J+$,M(n.J:[d9.2q1.)X {Hv֎&W! N9"?]21L愓M3PM]nȽ_G'"UfR8d!-1rZB*/i;fW l$mK}?#KctnLKM),d)5LPQ0F[?rkײASdcDžmXcmڢ*\ēل;Ȍ'ԒN2ls#5&N2oc'$׋$=Blrb7Z'88WJ}yǢSIIAK-/C{#8Rȓ+!] *Kqq}O\dOD >$9dʈ0v#8GKfp&-1mA,NB輌RTbاYЛ"-1cvE~O ]iiqVqI+Lggrq4I/)x5/O#l:dfd} n8Dz>'Q>̤7'ƒ"2ld1Z KJDj^Pz%]"}߱_II{;BV+,I\S5T=4ǤRJϷ'iQY]FِȨՖ5NIo㑓M (Jޘ8ґ99xq2qZ(/lS{"?㣗O8v|(_G9*+||n ъWń2d%9IסǒZvc9:ђ}MQ~V=-|bŕljĥ[0ѻG*j X78Ҫ J脱v%r M.6֨+nEfTNr]hr+?Ź|sb4971Wq?*1fOؠ89e'5휜1Opy&LTK|y JYtroe^J.9SJ}%:-N'3r9&-P欷~NWbY6ӶF JQ>;e+ٍ}(MVZ$[.ZBd{ml./TQ3RVoKϳ'R?F1dIM %ד\x2%'nٔ.8%-HԔcMZ){3YPọ̄ZBzf[HdD:._CLQ)uC#H%J?qJ쎷d*$г؟ȣJrȚc)ķ-Q/Et8섡b'~=ɕ]!.\Jeq*VCv|?#9rZI%eMԬJ]#h(%hQP-MyZ8N.:v>T*%ƿ%̛]Qq!h+a%%-J:'QD>ݒ=\O|]ވQ2%hɭ ) :Gb脒Ż#$ֈKhVcǤR^s脣/rz)"_I.]Hļm)}U$^Z"OeCnű)$|6e=EQmliiXlR)2zxYCZQ鉱4J1U*GJiXԆG!(YzD"[ƛ ER=F2~bD\T1#MGGע-#+퓓gdrlQb>?^O9rpzbRwCN?NhE&?hƣFZ&(FMQ+ij#&hG{8-T.F 'ػǖ'#䎣d9g6ɹcbޙ!ʻ!;nTkD )HV.qG Fn+I^]*T5)!{'Zߡ=G1Bq J_J?Ԅen_4]e%'Zb&%z'w~(eD]V\hKGTW{#8Z^"י)wZ*OBdkRڡ"FAB~bKd^ݓͮѦƕ l^"sDz2BȕhrHo$R/.ܖcm6cTH>=Eigٷ &NIld4A9&s^h%О.59—d[eD_J |x,ƶlp]g^$RC^F~[Vʈ#KF};MKsOf%?F5A'*+#Rm7g]( טg=*^VBS~L'Bi~ O\`>KFu']#z-eA} 1$Wz$苦Iƿed[RLLs :++*"@IQ'% fMk(*qU7ӏ$rZDH kG3KWg-'CV.QZ2u~;kt7[)].K*$GGj)|k[6'oNp(܎o95uKvb!K5+DGȋlU~''kuc+G=hƉctXBD+G2"dT$Mʙ%{g| 9[U&IZ枆'~#'Yl_(fJR^KYGMKEK(h)c{bCb~C#M$__FRdHu?(ohδ!AE oDR!KrJL?'e7m#o?6V8nDH98nD(N#!F'D[vb!hd)9=EFHI<RTKFE_CoKcEdӃTa&B |ETGZ:HlO+R6إْ#%i]Y-jKM9hR36&7-L~IOcH{Lh}TIy-J4f-EqEPg?mQâ3WB4Ǒ M)ۦ&+4**Kd䗕+T}z84{NyIJR}liH룽seq#XZd]5V/d''FԵGhOE*iꎿ[O&M[T9G=O8Idkd8ݑzaT$6'hʉPg,Tz:qp勯Hz#q~rKњdRJ:9N6Х)hn񦏅A*uWT7([hw؝RCtGIRHMCǴS ư+7WCКXKQv`&"&G"kdYEvΊR65JeC5i»?'1F7OF$m#-j?D"蝷KCf Nɵtإ5$FIУE-XI_H"f/EQ+1Z.UDf9G̒ӫ#&N9߲>*LB*;] XG.eͩFy12<ڡEG s$BLt4%eEVU Wci!%T}VE<)~hV%W} ZGCz5g#j[G,nؿ!%XkQKgU|yEQhQUͷF{%ТGЦ~ndɱ'ش$.$݉DUtJ"heh%DMdˤ58V%$ކw7cمl[jS(| j'x⚒8ႣʢM1G_hjHJRxkbIy?%_!DbUWЭrk.O^ɺ臒?Q-9O#7^Ha,]gG UШ_QTqyDQGBT(KlQpB88C!"1A2Qaq#BR3$bCr4Sc%Ds?~lToImRP:D|?޿֣xA! lW%aВ7ЕZnv+t95tⲷpN vCkE H$6kL&Z.#Iilt^ƶkɘ-i=z~9pQkK N=j81>yo!o}S m %y#㤕E‘++RIϏ2j&Q#,aގLKmC挱ޏ_kޔ;{mM6!-Y|Wo~r3޵YI2[RO>z{Й3d}S@v5+H5*mז.@WlCތhT<]ͽPҫ';мG^Fʤg!Ʀy'/RZZpyїqMǘ.'$_s/2\k_f%oG|.穵q3V=2n'?,Zf_޸Fq)ǥڏVvJcp`ؚ-O@1'sF`?:7$MCQEDځ/Mڴ񙂏7[ZU [Gl[QMFymY+]n.Wz>$e6jpŸn uv͵BcnV߭4`|}jY^ĉ$wǵE7|z y1iPjlv$e[{>˨r{cZ(vDOyQi/e)yr)5&l%X.9G3u5ҷ|h ]kNŕVlI&wB2XN(ʳ_cG䉬/XhuS®OFYΜc0F+yw[:"iќq>%,E7%*k#۵c46Pd*7k"I4.S( L1Tj$!VO,٠jq|vbR'}Za@OQZ,aڧ!Z%CS0S#nynj#azR)ͨf+[tGҵsqnb\ԧTd7ٍRPhW+)%zT$b -Rm{xh]I%QɵT\c ^͙+]e?(qlZ{rޯi/zB$6֠і^R YHq.*r-THǧzC&EHjEN#h4ӱE{HzUrFͺ./Onu+RLOP* L@ ҦYpǔ(Qj S֘!m]mRԜiy jCItTŎ+_j,JO 6Yb[S\V\m{Q.mץn_4|6޵x{Ӕ[oz2ʍ U"B4k%?t޸aZԏ(UL;(U̹[.Qj6#Daq)}޳oڣMDѬ6G*JAu گ돥O!H_LMwv*QbrO* 0LO[0m\[[n|lI۽LjNV׌պ^ ʗja Ite5;NgPjupo!f-ZH+NǑk)x_ёTWχX8nk`rd x{S3⯧LwQ{kR9eȄ[.چh|c8PֹF >Tc;1^%7'4lޡ2c_j//$N zDDmEK"z#cڴ1fCߖ}{T\T67ߛ~KVXyn]C}VQ߯Ja X{TEeRnM*;uZ4oiWSm9n3 cI!^ǽxRV.:_J6S2C>^ |K,:D MZQ.ҾL-Z7S4"9yM:Rjh8_H\ V}فn\G[*^ 4V䗒eS2/1p_޵B%Yf>%N E#?*6)U;jsrVpϟ&-ZxVR=QdGPZ$^ 2|jpN[Vtuc'Pگe{_z+fЈWнwwMǵG|5ϒcEק:}TK݇<B,DX a*_9Բf:Tep'26'~F0wT ]\IQENqacsX@_O[j/.KT >n<ƆSE/J! J,٩6wmmxZ"8V2ck^4.jPؐ7[ӫbToW|[-HWy+V1*+ޒol[-R 9q>#6mr+4[ֳ:֔gnoN@?#8ⴼ96'H1v4BSW{])P;{Tht"H Oڠ0](ia06k P~0dzzCLF!v7=w:ɼ6hZHe6E'cnסM\ؕz! ŵ #_wR UѰkR$)ГLɗo*R##$l$Wj ~T FimzY~+Q.Q|W/z1UQڵ1 ~ᷥ1ʿjU? ʔ,y6 )W) xH}(FIͱ7kG KLz¯KzČF|>W⸛qjbtpಟV4QMʀoZ? ڴq2J-E~?LGg Qj8e~ŌB_z`](lyR8XoRI&lm|HEK!K #?-jX?cb;֚ B˳2t_ZIu* k ƣif&~ώG ?/<>,315o֔!d-4y+dj}7v<_zU# Հ-,F1?jD[7%M2-N>eTlj+L/[u?%LW?5"k{Zv+~}QK(ͩr8{6Cq~1*qjbvo.RSuޙTټN7ާdzt>TE ڊjyA5M#w."1*\ߖ漿Ε+jJ.7rn ̌ŝ)>%o*'BݍzhRuGH_7\(‘Uz[ڦ 3WW/.^Tc&ڭVۯ)clYl,p}faN;/!L ϯ `r*>pEUN_=HeMŲՋonҬ*jwm+"Eq'!wh5 sڔ ~ jszT/ ɻ P $δ@kC",Y^^ qptEŸXf.U])XV oj9,zIcW=XD#0Wn?z`1`n-{ IRv&h.G(jdL/ek mZ)mv)9ص>+scE)&ەڢ}G&]i$fƌV(E˭<<5@țR149noDwRQnIs{(e!sֵwuٔ “n. z׈ef0)ۛŶWqEPI{K n:ֹcq|Ψyފ#v Q7&]"\؅7]_kڤYq㱵j.Wf?l6T\}i섲K>kDjِع^A{+"iۖQRD9.}EOgV[xJQ|cR+Re 3yV[$yD#Y !6 ਷ojS=2 ml`yO(>`E2[ڎ6ۧ03E-xd1 &5 Vr# g? yW4JlO-PbOnyG7i pRmZN!l9S߽L%2ɫ'xP Z=N}]jٳ\>"j0ԁ[=/J8yz*\㍍ZҬR"~TljCǵ &%6ʴ@SZ{Xv|y{zHKS|֢ӽŷif8Ѻƕ\-[S_@͍8c21ϝF4G`d$u%a'UFtINb4\\0DV%Eq#"GE7ؗz4ʣz PMtE $sSaX, 7AS\R8M ^_Tx͚tLc||AlOܑ'"ܦm}Oq@Ip:46rLl9 yT\k޵whʏh*[R?}Ew[AZc`gH(8}oܰڥ1$y\rcz7#K]sL8C`݅Ք9\I:^],-z.%&[[o$ku"3)X'i}ɵ3&R^}eң|ckHFXWŐe{Cd1l<Ns6nA6@ci*l1ހx`g,B&J(*U啣%> 7۵@p/% ZӴx 6vXVP'{ԪV<ԁw/%#`MiʮQ:hHHKtQH4cڜ8Y,rj?DB uLVK QzFc&.T֮r֮<#mJeJ6Zʬv4΁c&ޣ(7bBہm؎:'_-aZmC<@TpM~ҴG/xQ㯧(XD V;$d,5 ߶#sPC'PJR޹ĊV0#}i~Q4%DzQdHk^wHc!+NY R-kza$nx$+ mV**aE:XnL[XrSOD:)>1" ajvS#= 9syc}-W8سV3 H@4(Ypq92Q.i P֠ {1wK sTf]J1(3NOoSi@zYaxE頂oT#zq|\?ytǿkyVlߥM1UεK_% Zui&Dav:y %XM˒G+8_j#FeQ;mRwңK ZBj=c9o}P:}+J9IRyzZPX{RmK PR3%QmWۥrEs3 cKqt|92dyQ̆/5 ll<|_4|i֝G [Qow_Z)*A<0Hƫ׽(r+a幤eazibym.2O0pVFg^zTc C$!R& 9%6AKcoPR6$-TRVnbm@XߥFl‹FڎoJP6V}#ޢxV1k)0c#ga{R#&DZ?%E[S' IkT=N{fRlU6[vm?*o#f#n"L8TTƩc/zēBcS,8aq鹥 dWD߯6,zޣtB9("QTUI q^Zwrޠ]6 v*Z<FvxZIq:xy D#[ԌiQ؄9D͡Av?/7rra͍Z3$,C@Y]ҘG{VNEW*#[_*2[mfc;|y!\n eK#F ڦ(n 5P`bgPw"G%Ƚ:?jSeV LoΚrU%[W%/$j]G5ޡ {vB! j8&mҢÆEL%M;L3n7.}1 0E WWr^ԸF`?F:i?x&o)UAZG]RR:/`ʦ`[5Y8^+u!5 ] $Qacqk8w -ͨ2oԈ1+J~S6;Ԏ>^"7>bI1x{ڤ`:S#x16֣7Ǭkjhh'qMDٲHѸn@ޙx0 ְaZAuUi[OK8:]G|K6jYW?8H#rHZ&}B9[/Tr,Z' ~SG. l)#{0c ywү4(ow PA(mW`kPM+[!gftjXogtj/uw| }zܢzq#0iB&G1V";m@^qw`U1U#ۿ,i6 [wfeKxZE1b5M?4TZi>+O"i&CzVd zHpn޹ TF]kV%Ab-z}D@URHqj<ʦߧK8)aczhN[D;[Hxj)h" n$`(I#q(nm8,>o$ۘ25A r_j׶b/=76u gwGcm@2Kx~-$ùyba6)Q'FI~x}wԜ9r6j`esaf=9zI[xמUuՖ#/]{A֒:0CڸS&dF5ӠP('?E#Ag5[ ֢WT6J D V01e> W"R:{zTF1(4ftv{HC;B.[_V~c‡#[b*1h^.^ʲ:[x0A+83TK7 &v[sX{[E 7޼;֬ `T]v6)s\M*:XtnÕ׸M$}H+2s3mR+1dy8qll֙eKfmޱ*vR)A _dSɦ(ٖ*[*$9z},F/ku$p>?Ҥ J.#U *b# ž&ɔT:#@W mmS$txG*b4~֣,Ǘj)"Z mBHv`Ҙ#|MNH7mAOEBX?Jΐ͏$JUm<}QR6cӟi:ha*A%q߽.;64Xm+)/ހ8`ȨFP+Y -~і8#țS~0R&)ZӥS!+K ņno5]-ڡ;c8|z}Q0\xn+L1lm|z41*lixC}Ve(#b@hPV E ÷H@~bIqҘ9j̀[ZI{vH`MY7[o֧u(m~߽ڊYMq>c 4*rOF7g~%`^5Ղ~%8]};#W1k-b:B[%u=ɤ̵-A("Iy Oil7Cq&;*vR´kp2XqՔp+~u/@է^.AAèrn؞gix֒Ua`qdvr!֡p'P`$5!Y1%]#Ai$csH^`ͽ .W!`ﰨԦ |H\95W2-,ͷ7sQu#:ړ .vC(Tr})/{pd|TMnZ{c2ߥzt*i0]w(g LФq/[xho؏RX[޵ǂFq^[Y;T60?P7]377;nsS^@X:叝zrPTBnDb;3)KKJyXf!3Jl6Zh;j1 nڥEX_o*@`'aB*cZ}M6˵H,*/kR4X{n̢$RAxZ9wRR6H\yc򷑭DIP; MSkjoޖ!,m"WnUa&#ˉN|?`ǣyQ$En ,<#?uF^aNg%[ou'YOȽ/^We̞u+ۆ./noCCrTH#㟗E~ mZQcqR. lJb<.K_inZU^1Gml*1QJ(:Ȱ'N2:XvU .#DKUƼ5^Myv:"en愲nu'rlc#7"ɘ.դIY#l풽_/JEi][pgc!ulڴ%jԲJs֧X qҒۚ:Q U+t;Qt9oԪq|ޙ_P5mfu S,HCjA #؅sP#@# qbצ(<T,$@[;T$ݨyxz&1*~G,2XO[{1Ѭ K cD""6Juw[}Tw6X?2nqOAmը'YDjVMb._23Q9XfikS4 1^;V½x Z#Yr{cЕ(0-+|F1-K$ec3"GsI IO-IbiQ 8oޙxs]Ne0 vIu s>ux4.U RQHxGjVDN~ȊF7 "8?\QBIjK슃sz$j >j8lkjӴF%{c)DL/JvLk\PˡnW"A3-#fRxHfIE XmޥIٽEIc^2/mH 7L\*bg,cr(ʚtܯM!&C}WDeM 䬃q#%ehb"gmc⤅,䀶-HxQl.ӎpo~{ԤH}բM;,m$5֓-R~# )u*XoCKxfZXFKnb~ DXɷBe'l/E&ezjD]8IX۩ðV8Dv[mI: ӠHd@:金a}pԢʴ*F⪲ERq.^an(]6qpSu@eWQnn,vI_:H ^D![Sq(Q+QkQ~/O#IkN"I,E8 j 9Kx{\U{OK?<>‹N6ڠ2eWXcb J"VuLmNr*lP ؚ2K amjE<+mj&S)C)_jxl/j7D>n ){V2][֠ŎŠqEPޔosxzG_ Pc/PjP-~TjHj'bT'. *zV'.:i48GMdÕl;j߇y᩵u~թv8ke9rmVO*U(#zrq`ް8a ;W}55;Tɓ,hl[Ţ獀U@}X(۵Te)|kI*B OJ5JYYOAD iiĎyuF4Bu֜ vMy' (k~ v_+֜LcY/eʐpX|T˅IGf[b{I鹍(ԯarGne  uڱ TɓcvsBERQ7GcKH1'}鲰؁T#E$8o֞cөeޢ%ԸT2!7Qm¹ڤxȀuECd7\H8+ʨ49TyޖNJ:b;nZ6̇aɈ=:8#REޕ4:1A%}*3,pp'qש$m#o)['L&Q6"ػ\]p TyvK)f -3HdyJk|c("DSIVɽWmu[#,)K/*.65@ 2#TD" ڤh3VK! mc%eu܁+^&:DT*{tU|:ԐYOi!gȔ\s6[%Y%6*9n֤֩d!w~+S 1;#-uF+oL!*qb= vknUڑXZ3eW=k"}?:jwoֿ҃Dt?GRН\^$yÀj[2ǻ{֝E~ur7czR.GH#< mjZl1Up \VIͲl-ްamBILJ_kT4 Cb<^tGQڤ v6F0ߛ4AYS*)>wA7ʝǑ J#`u|ּGkw  Ms6E&bD=֓X'b<]iH|ʤbmQ4Hr*7ǭ$r[|?W}SЈ#J+a0IcZSkV)"XQzק(r\]zuHNPf,AsZM>L=`{E`v=|jS#=*C,ײ=H35T? MW^sKuJr4>D! e[/0d[ C[&9-͇Ztk Y|a|T˓ڬǷ|5<+4n`y,zPC2vUV-4; ~NSۯ3*(NcD@[c3t.t;] EK+ HFfq=<_jM^4&e]j!| .eJ FEvB b\z1ǂE`ڎLx+ܟJ9r9#{R$a\IM],EQ:*&Pm} d&,|-ҿ܏mbXǵp\zMJ7 T\[@mw{R!mɳu$~UUuN[0~' _B5͔U8;zkN#h!%*ilh˓o\IfsJ4i>}Px{1G,za*5!@dZ-$( I`?0@If~{֠EL[fem\:oƶ8a6YۥP=}\3$p|_-T3-?Nj0εp2?ʕSVU+!F$X^KƂ!mVMDńūE1:jiuQ+qn$Hr4㹭 14\[jm|j.K tq=@*(ѫo#"nn:Б⼀"MǿGskQè97RaLo߭FGrm~9; ckbj9nzDn{Ԝ(ᏋQs{ӨMZ$;u~Ҍ20tTT[LF3-V]Yp(CÌr;j7mt۽1KxҕUWΩ%́'ޚ=D4БL2Q&1ܷ09ƈd^sפmBGfUVIRLQ_J,bEccZyI%mY<\D+_ޢhl -V@ݐ[sojgXiIR~ƙX[ȽCpPƉ?5uڸ/EOh?Kԅ㍘DhV˖"a;S*]\-ptJ_FEPē^a&A->F}6680>xg9ejA&O{iU\ձ?QÈx$ `mQY%G#{kHA:gL֒%X}HP|H1:ޕ1b\EPM zҮir:^CzF߽Bs~Y_qDo4!^5vF9APGl1DP$AqzȪ[ΆUr$~%J $rNߝUn֢tR㠭Z 5 :Pi Mcjs2w[N2i Pw{Q2+<5W0m:rI^hIǧ{Sjp^4s`NS#@Z9~+—Ǚh9tPIōj44v,$-bERu?3.1yLR"GaG i`t݆KM_Gʵ1@Q~QWX%w;׈15H7)WĘY#7Jj w7Q?ZcOM`bzަ(# zoSxGklkEI[jҞ&Q'-]G.o:&~gzErZeh KZq"2޸OҴCM"RO(ѧ%C4,ʦmJ T`GoJ]"aHж+8,c <ʜG#R+FQAGeZ}F095Š6nPg/y-R4ve1o3W u ҖokF_ S/֕S`Kz")6# qgG3}EWOQO} BU?$$E*"bUwLXfIb7=Mkh"|jR;ZVLt;t$M{k֣Z0JmkVmEN0 d7 ^sKƱRoKu86ĉg]L9/V>dܥ޵:jjcVp׽" ҩNNZLkR`iTb3^~;!sv6ByQ5`[rGLF;^Z`QȓƎNҥvx| L:erl*Yk8FpFR X[kԖMlz c9sj<%?ޤHPHҵ*&+Nqk]Cڵ,wW[cKxzƱBvi1 aZs'Jֈ^6{R#I#ժR!6QV {9,zR/ {kPoΥToJHWOq+F֑ W|zKʼnWe˿97|%Ӥ<;4ȑe䓽a'#g[kkm?,HORC/2ݏX=*,PNkuvj$q! 1_>oQBc Ynz~u |#pך)\5SW߭xyYNժVo( ZEojE$&w0n bIvԣN,ۮŅ)de6Z1#"ʒU?@AEz{J))"+d=O I|#c˿,/*\aj0TE0B:m_$ .3hN?i A77_ֵJÐ,H5 #K& 9$AS6m4q눲&l-Vg/Ϸo q"ojб> S/%jtA+MLa@an*XT[zKǥI,*K6:}.WT?:)c*W\LkYA<^+ֵJ81N`RQ(7D;tcZ/A `l2;RpR|Z,I7?Fo`$Zь\ЍO*ƹoʊ֐CȒnWh.+zN9@ڡhۇ^itѨ2-Pe " WȈDһxVk8U[˭ r-2ZuT>/1T܁gl7$>2ȫn¢f}\\t֩;" @E*۩8tݏZF295FPq(+_A{SJ_dX/;^B׽Lp#S7Z/6Oh44ey*I4gP 9iCc!nM5g9ZbouwVeTKnO(, dTݿ:1d{v3MmODL(q>]jiW 秮0=Yy|j"U:TT[ڝ,mphLE=j@5oDH9RHzBo^tY:r?j)`Q{E6BGkcyQXᮧ3qxJ~e |\"j3k[ޗOG ;rY<9΁Kc-\xRimeᑸ@#kb9M4d+(lHDMÔEC|N!^[R 6C\zzLI?/Ƚ)x3z2jE Wq ,{JciZ$"ڕ C&'>~1t&ۥFgҙgqz+ɉu$?å 731fYq{mCK\pXӢzwǪA"+YK6}?&@6'u^'6׽&I&k8_1&ϕM.Nep2loZs$DyH1Kmp:{SiOul6ޤ=3 ԉש νhxI*۝S6h%U]\kqKdqlI9DZj$#oOK:Uoޕ.ybi >i1䵁қVV=ޤ9|&hS"|8H]*0p6ScaƵN$LȮ'43eF`cJxWhoϽCHUXe==j/n`-7NȬQj$GfB g:X r饑UũP]Go΄VQa~LyVjS>*˧M핪00Rַ_:02Xސ >Y d_oR2RcCOf1ͻVޘ&|131gޕ&QqlmޢI;-Ͻoɮ?ZPc>wIte"/zb-.U-+u(+l:Ho4ǖMۜzDHQf7oBx|O6ڥFre*:"WyO}Oi3Qm)Diq6q)VKsR$@FEU4M\vc}K,1LPayG7! M*b6FQ̬1dv4,m-:[׊MJ#Ƨ+w6N'zF39zю"3kTn]$Fxf&17<#LaqbW13&J\ @9[K(i11#i,CZTD]9?G#quZe$I+ZӤQl8u n4Π޴2dzdnmߥ F=)6Pze LHFQ`I*nԹR4r[GWw+Z3úσof|,rԮɏ"ޤa˜@c ICjg%z@? 7`YcJܢ3F`Yl566\7& "Y9@lmҦ^-ʹ[Te.X0rcɄmcԛ[/Gq4tTih|o*yG@mO U*xng~|HH9_ 5I02ӫ=;W b;VONE67LS+n|Xt ؚg-|j_L\A;0*sPc6 k'mL7Tr?jhⴑyTZH!"6[nI&KqoMM{u] 7S؜Ź510O3@G0@r~1XoN0 ߵLf֤bnYO_ʾ|'&~UJ&I)qb֨x˹f9/oz2E l7^FcT\T,ߥH?|4a.7#aj1J8{w͞ bwI`K푬8m:қqHO-#tpfE^WaiKGkֵ`됖]Wr t<+3yZB_:K"i7^y}*Hm<Ѳ\Oj!/2IuK0f2MxkcjT]nr;ԣ]uua#jY՝?9SFʀ-j&*u]jr.⦺SGLW Yx+%]R)'f)L10 AQ`0KUå&xc-9m}J/{5'r3 O[޸1a~gC"_ڡşqzeQf!}Y? 򰝬 jA>*8n΁ 56@d$^7-FK?)$N@4@B$vf+}N[r͵t?͛C7YsM,k`nzuAkZL)bek}H_26SieFnv6\t囜ߨ%Psҳ[2eIpKw*os5g p++/nĺOt6VR Qo,PO5)sh=E:*6ߚ<G|vi8Dy6vE^{ZH%1ɷAޥӟ:҂g*HJ wރ|ۂHt_| ; }j8&cȠ|Z jhvT<\mb$;{TQy!OoZئDl)&]UeRB+{)-aK9;ReǽJ#+$}'5ԅDlsYr>o@ +_aҾמ2;m5oŽ! &!y<)pSfF s!ftXHFW=wcd!␣FI&,mT-=Ÿ7c]:I#Z=8[98q2S~Z,,p;1v~׵,q s}E*ݨn,D[+һ* g9S}DJGĭjy$Xc~佨⤏zg}E"q\<~.x83l17ZrW>nEOpǩ cvm֚H⋀36Vabms׵c9IJ5bקDQ}7 {|9򣜑J%ޢx_F|M#|nc41o(M"lIk:_o9d|zy~7 US0 mnt56[£Us~yM7uNo֤.ݤpō`Evk&c蹍rR7jY&sJT ޴t#iڝfv,zC;Lsb;ҋ[3}\ܛo֡e6Zj'X8ס=/Zm $)7'.I߽E" 6kXnM' )qrmK+v;j靮l eehMђ7h>Pw Sh t.kjr1fzӞUzlc*+od8?[ LbRec!:2V݉B2aKӠĝӴ $Z /+'(xzn{dEPnn)E<'q) |E*}t}X_=Cs+#u,&a9>֔jdYsɑv41b1u3oZ%*XB 1C&! Af-o1Xg+J0\%֤IOR#$0?|*S2Y7d#Z,8+d2ڃ Uާ2 F6jqw *'nބ 8;_:Ͽib``9*mĆE'79Etˤs6K~3%v=IyNM|sz1>^"77q,V81_R7T֬8p{\e`Va͖_Fc+ BI4kc_-ɩuj t).*]?vYz.ʴPYSTFXrqe1*r%sv'#$P縭>7eFxk‰X,RgZF8LL=u|Oc@1KcHHUcs m0RNūOu &mQE1؝5 b.THl> sdfۜu2sQHqV•uz];HYG-JMQf2"ۯ[T|A%ߜ n;ڦ1 ։:5ͥ>ËgF '`mzvlZIN,m܁Z@,|PKo=Rݦ;)`O\12#Rֿ֧] AĬ,[~ HQ%=z-#cL15C[+PMб6{HzVLjdŏzryU$pU,WC/&c2A%]KeqYqUdNhK:5H2ko*LK~12SD9|cGQcKR!l}Ί<7p1.zvq^`7nڤm+r 59ddua+\Q[ -ҡ>1[3K.]EHN`*4vTqX1 mR@C{)֟9)X ۔}SY,jgLOQ"D#4p`eR,.SkmWį1;ӽܗCq6#H?67'Q ı;ޤV Ա.ݮmE 9^2FnsRiR"nר|5ڦr ?QFkd,(,hKo]3F{uڷf}3?c69GRA"NU4"˟#zj%/djl/:XVbof4^g~,:Jo,Gs~co'5 ڸwݓ+Ʌ[_Žc[yޥ7*eQ#$p.mUn׵\B{V(X Z 4(7^7Yl9E`47Q"ۚ^֟HWlE díj%U-!d $ef?ڴh#;ݭ}JG`TTfL Au=QơǧRDoڎMQZ\o*v/ۦ^$JLCڒIC ᛪe˿\S$d]y c|U.͵ޚ_<ԥs~U$XZg~^]?uVZ^yAwǕ0rc|jmP.8Nn0Li14[RըM@Pq7T7ZG~#3k ӵ֢߮C,DN'f!z[ŒH\͹_3R@vKz#iEϋ m n2Qè{ɖVKjYN~Rlk[[}%r;t'oqs7;eĽ?JK9gZbr Q=L\q=*Xd,I s3t9uӻoľM3[g~!'b+kX__MZj8ִ) fV2ټ; @Pt[oQ.'crIp0N+E?rh*Ir*Ím,-Oresw$4ud.ܭ%61Jl ncSN7>uָkeNs&V_1դGco?*ܱ2qmBձ!h" ÿj$G7$ u+a߰JYnhM" ;]Zث(Zt6_KN-zxJ ^f^nRM),QPX78n!t[ƹl~۶˸SsƦi5q5# X{Zkx;TF\tmMTw'.MD@~x:Ve5#}IW67f6`N*NHԆ޸93z&I7ju[&uڤ nM]ҢEvazӓ:Ql/jF ✌ieƔ.?J2\畯z]/j rY/=t:' [lZN/)n@T `$\&j7VwYNlr4ub&J _õD:5fOaQOb]#݇X<ʣkZ־%-[jҖ9[s;\&W;jUy32lP飖FRim֣a XwA/ sn|k=)L=J[P9SUuꯉHB[< lAeȫsΒeћۥa y>fp]%ԏJa낡cnnڣ⭌nSBe zӍ""$Bޣ$ӯ#IbmL>K~U@mqR+V8&oQJNZ>ſ< \g; YzV\ (ܠߛ3ފ<~DIOyu*ϿM6lQdGIϝ:%hyjkɸոڻ>|mRpkZU^Y.::_{p33{׈T\}\n EG^cڗ9uE-'J4:[S̟NDT"b,TIK].zM2*Y!L?K/m:U:^\4vh[ڟc xy}#IqnJlp,G1Ԓ)c җCö^vZ=An M\ti2;=փJqKl, s֛I/WQxw~ 콏ڥ&9nQ˾av_soZyWɺRƌ_9ޤDY5kk%ڙK_ڥnl7<ڀPuҌR% Rܳ [}i$vVZtLq6"u {]B^֤1$c}#[ MjC#+ڵEkݼFXx5=FMg/Sڤ1fROb=,{s~4nvoMf0Iw_.S~Syy4_ +txQq5:rgOm0qdiE~8-4`'M͇m=T(])9I ݎ+{V˕Y`cJ+&}ϯJ3p-cGp45U? 工fp2\N f{2]w4Fr.L`=*5Q8x3_,N$߭E8N9Q%6}JHV>%Ԟg46@Zd )P_6zQHXU/k*UCҊ8 I/0 R$ 3Dܤ ;o;O \Dh*"{V`UDsS ar;m҉Q$poަ@Yl׭M&L jdS[PIlztbS6AM[<[u"z.4& |ż9Flc]v@CTEc__91:~S֊$=pmoJ51' Ck'2mަS0rۏP|ٮrxޘٷR$6[QM, 65%oA6%\$QθۈxAU 潺C'pozX]h>Tb/ڊO#,QUU+' T:[Iiso@p o_ ~fܚ0\+7c޸$ep76[mIdO5jb<ƓY:Ժxaǐ;34/6 %6oln LY]9_5ZӃh~֢q ŖR+3aDm ^ t;cFg2 nkP"7Uz24Y%qxvIJ*i%K,d95l;R;N\rPwPPCĘ9$+Z 7sMi3LJu%Ζ$nKPoұZK 쿥MOc>F&>Z/rFv֚HYo֦jTsMSK}*XcUd!'o{Te/ج};V@HG`wHbxקHrozCK(兮yS2 Xx[H_;0+NX62Ѷ&9)AgmgoZhI=cҠռFj`s*ܷ6gp/vfޞ<33׾4| cMcRI}[Qy=) Kڲ 3闙 -ՕoҒ=Sȿ(?kyP(rǥÕu[c%ۥdu3] 1~ \_sK#q]x=dU&FX{mQ͐PL% UFƢIq!-VzǓ nz:_&T23ՁROK@^kRa{\zWJz٤s<[j=ɰңiF}OK&yT\;Wř,>9JG [RKǛWfڞdLŶ7QKncemqcR  X P/ 6ǚc}.J\1׬#)Al^UX )*F]Zj^vB-qڟZדQ;&բ }~n'/Jxu8 =IO)g #*zG4FDlǵss $p ojM rUz+嗅ޥ!.5$K}9;oJ8XUv1گAGDxđ"2yxr_Rs8zŏ=v6ٓ*G:O Ri'Tyd.TL. 5OM yI^A+I3W|+# a֣A>&7CPye,zSu{ uכ~8>uLJI %mjq\ӵ'&[n_O:\Ǡh~cGTp¦4fj(ڵ\6Y 񴤒ߕgݗҢҼsc~ ^;A=kLnA (#A,dt߭i e˖aOMN~#Aڸ_Њ6$f&Nn 0{-CO!19U5hB89/u64f+{QfybNiAP+ 1Q}KKJ0jȂPd݃iŝ^C"y@Ri.[a${xT7 7"QIÉץjc$?j4lY0e6{ )mڦOxۯOS-`\3S[2U#G]Ŝˍڙ]ANF8"z8ʱ\I1=H;"!֛e-,j0=iuS4@oھ)Q[~tDumt.P Zno+w)yuʖx&E| ZNԗ$^I'qn\"ÇkSY~I-ɥޟVcE,-ۥj3L{mCudw$ac=yc'%y*cBUU|͐۵$Re*1 ϥyp͹۽)$-ɖK(2雔 |7ޢ13^t&Fa"E^Σq;coOz@f[mw"1I/"jc+pgepbX -Pgidͽ+Ge7ڠM3H *zK7#*@cU|Yd@d2GB>Te7CQǀYoT Ǟ`{W8d^[:Vu}6FJV;O2fN1I9 ѭo1\o1SSCѳcMq.K.oY+936}}m 4B@anu%Q4E' TĦHIZZC|H=~;F<>ץON-SʚCΥRh|03\ͩkzn;JSy c^<;;%@wIqo*;aڟG3t6ةQQ&3 f | ȷCQHYطNnׁ )HfZkI; {f̲$tJ JY7k?jN.ʇ$^buo"uǚlTp,0,#_ >{ mMHLK{RJ t{6$oP)ow?iH`M@R,$Ȏց;pG..[PJbT,Lwn.P/UZy_U6%7aaiQڡc+~*+j퉰_sEزyR)$ U!Ym .!P%<~s³ -Ύ.NoʄϨ%@+a='N#ee~'r {/jysH ڥÞ6ۥOh! N_.Oܲ+f-R-TIܨ"ߵO((k*uZPjb9o֤?!w.]R,O7M$>7nmSvHFY hQu7=k[8Hlڿs'tT c?V#wQo^,yطJ[^CޗMK Cxnmj2976g|u-n+>4+ɞLzz{R:/=DKvmR˃bXej ڡDqI// 86:&Ԏ]޳MQ7,eFyFڗjfW\ܵV2T;V]9̡,:htJja-5*aj-;ݫN+f" Y6DQ11bZH0rO0$=|#j.J9}UN*s@÷ސîRBg;TMIpOCG&B!- nXUZF$!N /c`"ozdV܉MR#/OjID77}2"6!_|,<\?cԨH wVMġD}FQ:Z'{3qOTq&q_ӡ͵I$y UR760qfWJ\i5IRBsN8k9SCė3jb(7ؑjbe^{Wg.('߭(y?Ur-֧wQ&Qw\͵L!'$S:Cv[,q`j_jR, qSp2jM47>,O^zG>!7\i?,3D&_ҙ@&ȶk+#+$t5:E6pF0\٪W7\Te[LqQ2֧ZӛaчlGV%}DdH7kq;>Lvھ39RD4W[%+8;gO+Չ[\ۥqRG|lRĵדKS4ۿOj9Fʣ.-voʧԝdplJM[Xۡ8';GFt'1s[O|4X..Io\x9ɵ}a͖" p̒>=8b@oO["(ޟY7P@cGlwpNޥN4*D]7ۭs2,[ݺt^W1wu@QBojLxxkʼn_Y۔>;Frڒ=yߥ]zQ~KjF%\ݺGPȺr.Vʵ_fC4^ve2,(v%:֚$NvچGG{s$ ӷzm(/jEit>/7#Ap~j#Yz\RƑ啶5LogDM9oۭD|B񒪣ޡҰc=/ޣ@*z`@wM!&⢒9(Xz!j]'(3`*fG-8_ڡlߝO-}7Zo/ tbK.Cb1Fy+ZvZoN3(woJtGeͱ֢/sO ywӮ#fB OPg;*͌}EYdӕ녘TOUkZu$3Ww@]UW]N^qfߵ4>RG,EdWt44v4rq[sI/eSDe o#uǽEÆoNY99Z޶}d|F6LHCw'~܏jJN{j8| 2H>o5%ozrV|;y3zuh=K'xw'+bòF{V0DZ=IMk7 c֟HjBS!6T*1MgbVge1S^ b? :ƪ.vmPNlH&jj wts9:^z3i,o;TwS+5Kc&K+Oi#miUtL. o{ =*LXF \;fJtQ TOR.yvNȼ:Eð;Ւi '`/>$V^ߕ :ݮ/!;I{t(u> YMZV~.U#.;ըY-w VW*7S&땁Κ!ˆy$NCNjX`N$ nF{Q\?Evg>LF`}lrsʦLZ>78*jr$ua,K "8(ŔXcҰGcKȾ>PqyTks:x%6V+$-4#Wu M 4 7|Va߭4 i{}LxT6QwK$d9$ܜߔTw5kҗCDs=T1$4XX_֌_}C,Y(Y&ۙ7Aj|{ZYK\ά6V6%OAPV8noZq"Lz}O|[unbN#|ֿZöעymǥ, ;+[zTϖ}75K9Q],{$’?Mbڙ!l 7˭=m$8HcrTѮF Ul 2jd)rR^=v\t:X5G_1R#e CNåH( ޤHf`^"]Q>Y^'4+']ը@*7_kEnd k x8+l [޴t8ZW~Xɶ_K/*-f. _[qҬo۽:-cߩv5w-$E';T>aKhd1,=m{S _.֗DU3d|ωoZ3U|4=ܵʋhFzYǽN5C[MQo&rsD6? {ڤNH3jL[PQ9icW$Ftr}O2cҧu*6/Z\J/ T3ku߿Hٸ' >k{oOhϋhŅ^&{S214<\+~ԢoDkjB'$vTpJPu o[c.{R &+5#W@Hc 9J-62__P)6/N%;4ΨpZaŐ)U{T%2eE2.ҩV?s(8' +HNL}(f+ZM<~dݫC;۔Όϫk6ѨAQ)2ba{z \$H ~uIU;\%jAKPEPmP$c+Rabckp:Bn, z,|*OSK6WK(Ve[ޚڇn[oRhKmO@ m,p^õI%c*ېI9 *OlHޥ<(=O.3>AzhWTҤ㴨qַG `%mǥpQpXXyzT!ZTMLb>u\"#_4ЩAA)Mt l֦iu,vRoO\|mR2Kbk$1Oj9۱ޙCTubW)#JNE=A+Lr-SݮooڥUs^թ=֟Qf:V\ڕ~!uvZĥi/}g @G{ҡ~eqL7T߽2>U7F7VwSFQ9I~jedt_ڛT $H~_CBf2U7K`TV+fzpk_qxve7Y,\Q̆+֙#C65I(n+;OQv/Oo>gᎽzR,e6QIs[X外mD3^#{tkX mڲ6W$k=nۚ1""#uGlz~G,2(h`oM .F/q 0m5i:n“_@l.P&y"m渗1kI'K+PJ ^iׁBmsކWlڝc]>VrTM9(oҧYlKd-kQy6ۗ:N 6 Iŷ Z9rS8;,|li,zkSشoJȱ ޤQxXe7 RpxjkjX kf +a:41䡯~츩K q=w13ֵLPIYf>ӘWCPm@s3сb mښU`zTl,O^O3O OΑҺÖ+-;>/snWe Wހ:x/O+U3>}!WĸR`&[R__|yRiv8lEPo|B3yvڠ҉kjM;j^oJ7t}/J%Est IYDw6K+5ߥ `Tdxw4&HW|ɤLŭl}+S LoQr.x8kR*Wlhz{cZ(71-W+k 69rVKs(MofFm#}ɷjim_4|qqT  M$n9`çZ]1+ڙ U<:'Bq X=mRJ8vvt\ŧ:N Ѿe.ojDxnalojFY'"W3d|@uwGKpRQ{W¦zԼO9׫͹^!mFl}RIMLb,k.ޤ1tt'ȷXʰak&i1v!Z̎+`,Hu29An}df"Sw-ŗ}QO,& vmҖu?1IW,SKAFsu}+ncY^W\ Sn1~QL^BZH8r|y3rF!/jp3$cNLfYD|P7R(6 u$2I#!`ƥM<9#?RZLԨ%,GjHNId+X h)ݱ{ޘC^D<.^,ڌV*E0UpH뗊3n$ޕ*ʝ׽|LYrC>TAx7 A2XE].AUq>*LQ|^.+w מ1ot K^ӉyqFNېWNk{ok˳J,!DZҍXwj!&ԚK7 8@؇3 /*E6j/Hb1MBI]$ɩ`[^P MESo)ݫ>9A})PJWf-R)9aOσ?Zxϛz)葪d-`ipసԔ=jqQيu2%}n:~+5oqLKENQ]ͪY,:aҋ$rD8ՐXHK <={9/घ)ք;2jr=NL&mފqz&^NuM$6!oLٰfZXKfe{u|SeC_ǷB#ێzЬH[+J.8Tv(]2]65c,WӼR8f Očk_Zx` F6K*)!`z/L1o׭K<{QvM)>,^ ш[(ЭJj^K^@vHp>/֚,k_A1u-ʞ W{o4˂xy[yQM>1l6څr|\1ys6X`/nl.H1=.ץҰź߷Z2,O2v|oĹljr!R$N+TRb ɳ[~8H+Vcq#.?JሸK]blI?]4y7$<ݯj\9 2q:8aekE$:Yɾ?zbWvsW>bIF%ER Lq6 שpk-ޝ~%ls!/^6x$ɖ 67@Ç~";d0 O#~⢞mK9T/´ ֗C-G)#zp=Zr,ֲY&yҞօo6^MP|I 8\=jcoArڸ[ɓ8_cߥqWPBCڜ1Kx-Ԓe*yJb5tӐw_<6KBR8=TYs#cz +X[_1E'mfSOj> ^P~jE%ϹV/ 3[pdٺҵ+LWż]=(~SZPWu̳9ZoQBI߯NR~m]#b~ݩS6Tg %pk})@c9-K5̊߇kT R[-`*(rցL[2Q#Nq1C pk[g#Su<\Mo=>/?|>oʶuzG5sN4[ͫNkyFȌ.+/Rņlos_kҤ(X;16cYG)[}h@RrJ*+4lbh&oMˊ1+cIӕ_ K#-*xnXxRO n֪5 os}Bq9OZYpB/ \ڦ̊~5*K%2{mOǡ1Zy8eA{HhŤ6- օ;I惟%[5ϫ;5ΥVAٓn8RI;#o޸_nمZSCb0)mGK^~ u\= c~uDv Q;LɺONR 1քZjmb<7}H1 /f2R,eG'j 1&O޸F Cz5ԴLsjjvKh !`A>,&:j#Չ]/6kc|hi9GCH<[VJ>\_nLvRV3:{[^9 yR幯L_;u!,i4KE\,8azF3KLCu vdφ~72v5B)rLJ^"sY+eOyֱttBG`E<7KI L 6ufkn,؍a֒S wF_*n(26j W m}Ԍ!$7vޥg,x\GԹ=$f۩Dpy)q |_o֥5O(JI36'`jh0O^QԻʾS$Hg) -jM:^Tsh-S/ZOÍg v}}VsmS"ߡ1~UVM|P~{Qa!#դ+!6Eʘl(B5<%[ uXĿMғQ+"[`7>WLky<},16HDRQ| moJ_VuѲtf߽%E\ӭg2:6}*6I pz|FN~u%@Uaޤ4p"˸ߥD-MҔJiqEoI+e(G$aq_ 4nE+kT@қٷ4$]'4y!osޡ˺b6զ2I b"v3LSXR[: ĔIn".{Ty"6 %۹ѣۘt>Hz"]Q Ss6޵U}=4* 2^n`X7za\ڤq%x8kz'˰]=ZYu&޵sAU-lׇsjRYԋ_dVL 6۵&[R/Q B*c1޸oV>m.Bؼ;*PVʒ&, ɟq9^O 5z5*Td 7"W#~1}Ff2ߡY2ǷVEԣ_v\?mȭbpwd>!^77ZHVL=+?i |,*}4XcRD$#d\Fe'f)[ysI jڊDB\a BcNFmAxrhdd[KY67[޴ .z9:IJx|QSOsooZUG})RZUܽ7Uq&3]DA!g[oCi$FǾwM9n VvڤIaqjAOVYڸ,aTrDG{^!-7!-~!ڄ8B("oRiaxf/p {~n]#zIېۭυN1V;tZ񻙗9"lD^(By km.[ b6F[ȩt v[Zf򥛏H##qA_UĜ{u?BMJ [nR-EKeܓLEB9 '&-M,2X}=DNj:&Z,my7`Īj}0Ӵ;.j4ݏ5ΥNb[v۵ bXejy&+ :}ԉ`*3 C:hZ}8xvڳB* >"$X$G֌uHYbjYݟZiqPVDˡڞ!E/,ė`sRqܓQJ~ܦMvF2[7+pZhDᵂ# k4>ZlmO㽅 xpv\lidaDF{+]VmKvIqfTp E,}6yX漾ҩ(!'qޣv*vSΣ(vզbd ǭ"fH}mqVLd3lDMF 海Xo֬#F˱*XQ :p8fIer:l>c9$5(Uu"qDÎelOd/6m16iY/Ne1JT<(7k0ŎDbH K/-c0X&,.h<Ƕ%%MڥPȣehm|/֥2Ȳ#sa rzN*cTew֩u7]H[U ('垴%(yi4|ZO,|~@C4Jq9g5 r^4.^<_Ar 1Mthc7T2yyQwp8ߵ|;XndxzBE " YV¸?3[O*cŻ8چ9낗'cF0UʐJMAy'h˒ ̫k^5U/~_=} T{ ezzE+~Bou[ԟ1g_(yQR̢q^6([fQS#֙ΦsKof) )j&i`E5J[A}"n޸EnR@8Y^fڛNd5`}kb\ܛ_֚)[%bZstRC ;0j>tD8'%>^U 6;$ &Ur%KEJe*cnR._ڴ&Wuo=*6"XyoS UYq.\S. <>-^JԼ-T \ʜ)wU q2qL-K%ڵXxFIbQ̏B7)u ojec[ԼVTN>7OND|?E/]SFCQM<ɉxV&[Z甈KL׿-kN{QX?̼F}׏9,#HjXrHT%W$)],jP FUH5h><=j?i\]e+ED먉[bMu@Tָt,/-B;;VbMڎ)A9*lj,H Q2"$G[C]QQ(`Ovbg{Z؆7JeuB69+XJȨjhaA9!s`q 15m$ЊMFejl =)=VxͼX\Ŭ-G,R'Y7ދsW )|4f.Fpqa3vZ\"onU%LċoAب9v.Sr/N_a-<хlܵ$,ZyqڟM9ї8)ڥ:FSzz5 1mqކb%CRjm WvkT\;j6,Yjɬ2nM$,ű!ԬgN$m87}UiɉCv#nHexY'mVg h(xzdpc҈uGm\nJpqMkxvq3|on /m/8ytSYćjiՃZ-Fu&:6nGzF;w;ZVFYy|>BRQڑGocs8LUHZh̗<<p෌-x;H@|}tqZ긓cKd޾濝p#~bSmLFx`Rړ[ e no:S/ G91EjdZHRmcP^8&ڞ,Xq{$ Hl OX:7ʄj"0jU 2ڸO:qƥdWA&]mLl,<"$ώ[?:xF[:(Bi #7ޮ#/T\:iP Wz'[Ԣ Y\rIcj4WŻt]_!7&FoO̒6䊔qiW ҧSE; 9ը3H"uqL#r:F0?*^&8hs]hImjboF$w<=rQogQ6"Y&F8M*A мP#ږXqCc43L'NzА2qe[PڄHroL^,m8L68ڣI#mjY-os B{0?nȶ_;VL%YMk}5Z^3-FX)qe; T!)]vơ4WK#-~f1TP"GʣuF躉]iZ>Mkn{T* O~On؞Gi"/mkq4hn}j%HY1** ;\"mI3!ZD>S>34@c]j !jN`܏*>jܻۗqzW!;(ܚ3 'pzԿ5B-pvX E"!7LCDU$ާ0̢t xz]A,:mb{#7 E;%pק2̶6⤛ ^1HfMޑ^ tW~CWʊvj4nn Xq!* MnSF iv@}%MԺ.)WUda\xšybzXuiMeWϧ߬[ޔҫu*Gn b|7Vm |ƱSJVed8JzmuW]^58◊vxP}}2(QD,zi$7v'uߘO߿gPPnL4rҕ7GJ ͋tmlNV7u.c[ ԰x҆"acQFL-NR&-M:D/J ';8_ UZ>.rH`x[N.kADP/QLabڸxޝ?ӠU҉#qcɋzTApCԓ1AfLq{H [JYA_%Kw= :nH*+(һľ(4C.DŽ.ʕǶB.<Wd,iD]EzhtZIT+^P*UH%sK5UBN@)Ւ>c>MShybxj7 שUE54z51HRȽYMWNTȲ֢͒x$2+c=)uRͷ%DD}(Mːvw%N^)i)־%Eju#o6;#NǟY岰iظVLٽsۢzkJʧw\|Wڑ8L;^<Q-FF+ؑK,[/zc( ;Gݱ[ޒ4Q7(Z_փirT:7x:mC,#m Z{ 0 y*$Q +ԘNzM`HԓBOù7*,]>{Txu/|J& `\Ք10^)\ڤF|>K7Phk1KcԛT6`pرVJ/%HmKcxІ֜؎YZ/z:h3ԼfIكjlpn PH#rݩmFD/1ڊIJiC3Gq#Aqielvش\KXڙVy1ۥO>P1 2 !?P>}ie;oBLS~άܧaFGNI5y@nytJC>oW+\ݲSc2мwG Zen#뛃 1֦!r9}H=\^.?KVܗ/co.eQ8l S[ʌyiQl??: 1x8X8{i 6CQMnӃq6AEߡ'z2s j]ʐqO>i^>F 1=&r^چRK`yE Us/ޞ6^ҸPS~L󑉓`qq#?WRzH%議\l: ]*@HfS$QK}G[T%_ =*X 28>Td@sζdAyw7&ڑ04_M%kEld@lO4D]ED!91K+yK_ 2/j7gVQOXkPZ^@%T z}~c;m1f}A Ps+1:2Z\@LsFP{9<>uG+&?UP3IWZ>T|7iʭ԰[Jv;`_j)dU5Zc-'-Prl,Q|$pG=(ΣO"+ӭ$صP]}wߵ8b6K\߽I< TrbVk9 5&d;86jfMqcM1|-`Qoz͌H:ؐ-ڌ9 tvZޤWQ{_qRK3 .nG3"L|$cj]#t2]qocK1bҮ?*t=mb "E(ޜz{V1,ѡڥ$R27V/慑cָYmyP7$$rMKw=Iu֙U,NY.-R$+{RdY Qթ y"[9oX/J $v=+%8\;Z wm#t5!õ[,byM忽cE2z]-׌{rQizȕ?M$h_w#cơM^ic!*rmTn8l*=ͩG=JYot 9`l+K( {~դi͊Ctz\)'J1؝Qn<+ l|D߯inEEȴA{zqGؚKޔ!E׽AFC*q7QַZRlBZqLه4Bg?kbH*MQSLUھQ}صkTAA7jy'p\E&sʃ=ź('JW0o[mCvӴ6f*azg>ʵKxrX/p{T$$?XmS"fϕKb9zԖh0>wORǔIAb+FS7poFVkVŃ zRxF;ٗ{mK6Q Cc/ pDFUo zmڥcyNWjtr$F)ďsjG^[үN1~` ޛuqm}>mҙîʸj"|Be/'{߭|? ن%xA= Ynd>uYb[feMz{>9t6'V~†^rdjQ#Nj$__SZ]8ۓ~/ý4;F/޵+!?zH|aGO4,*2K HZ`(6iL3|)&>(Q'ʥKglE=ǥef#$Re~R|N)@l냹{ iә&i Qj_suz1Jٳ EGd$*ojH5$IldG/uZx^s)ZZzpVk)D}6O00O0`;z{Tͫ7U50% -H*֡e/8޾ۜ5ͶEd##jx}` mky@vL<,o_ _s?;oOpA"02#dz2L7nugU[6m[rb:_Qj%EEX4m!$_SREҟjL>m -oj"IԲ\mY6T!^2}pڒvQqM!ːֵzZ6~)@HqV1Ae$`.F1"1_ ޖW_ QI?j4`lR;tYŔTl0 bӉs;JD-yO:ڋ%0/kQ5)7ޕ-2+ ,;t7ty)$ECoĸ+oAZ(&{{j(JvTGaH~QAs3DzS-ߵ-[O.]{XURokW:ޛ&; ā*M([1V?04ǭ<( [~n83՛nѣ[kH3Q4wa`ǥLg$kmWAq JS7ݷ3W? vsűʸڌAԾ }JJ܎)cO(#x9OSK41fl{$|^ڣjF&v}$NY rZYG [{T*o|WeJkZ[_ m{޲:;F(pyMeN aDmŻ m͐H1_H74Q[j%)@@Υd .rR}E;2( ޤ|-Ŏƛ'e6:lAwoN |Aj_{Z(pi&׸@kԧ}c}컕oZCFNcbm֏ͻ^㷭GӴAQJ"r &ߟK6~)1kű8mP̐'D~K\U77B$+MH } [ Ã{Z)Ĭ+ҷ*HLv^ݶ3KԐLsMRf;;fuHl\oo:("GV+WycQC e;іyX#ZE1)ݷVj(pd zI,|Gq ]NyFO.bA4V1YI;=Cn'zރk.X(P2O& ʎ?cڟ K}>Q*rO͸ 2 1xX;-Y4FOI}*N{Z#1J8m 95F;SZc*kHq|Sa"7 bT^^6)8 @!h~>4FT-oǔzmS̸رKJ,ozJj:AQ8O?2vSC*ڦM{_θ'.^'Vwk_/[R!oGV@zm EͿ*/:ނ*EX6s*wW|;e=%(pGjpc:mدcm8߇\Aęl|+PiY`X35;RA:fk՛*X7AK<< C~ƴAŹǭ a@1?Ғc& ]qWтbz\o\#nQ ץbZmj@dK{Zԑ"GWoңIa{m&)OH栄| K2WY@mqE7FnWޕMUP8+yha p#iVtO?WY\.|y>Hd$Y.̩x4gzDž+$K-4&Bz/qAt΢9ntͿ^$Z#o;>\sC_N=;B y\m52dN.J6X vRD#s+>KjX7*uwd.6&*IU<-Qi/>JUUg/~Pz&xj!qS{{P:x6*o7Nek |@ə֒R$tQSRI°Qirua/vD1ԫl,qT^͸Wd` "t[:LRYV4PzmzBaOZda`oS 8 ?UJ+贛HrӇͿOO&#oSE7 0^UH.+͏Zd>c&zwp-Xpӊ._T>A|P+m\"v,mGdQ;>CMu)镔/DelB~Կ%HSoޑb ?C' ַjm? *ۜڢ' "wۥi4@ŅFdƄƙ(g~l }O0՚8@l4QdW5)w xOC,z爁Đ&2:jF%k$&wR cӀ:%Q']c5kNc`mڢH{^Sco/ҵ3=0S!iD GՔx zZ.xc JaQhB$h {qbQT6;ZڽRƋQKUݍԎf!oAS6|_j0xIhIxl 6j3_cRzQqZC_z3#q$ Mj OB؁RNS^IeNd\nI7ڢ. _szpJ>yH2DïM'NvըmT.#B˽7ʌqq(Q=6A{}ަ2>ƒ<c>Tҥxqﵽ)4Y(XHpʃ1 cj eN-6 6p ly飍rl!ydmoR.G`;U<т6޿fj:Euu8oZF vU8 b7$\-v) u4-uR.ieT#*53Y{V)H;e#8{X|ELP_\Ԏ@Qq dq äFTͧ}ŸSQL!݋5iZ=3]ǛeyPJ1};IM 3+;IUzKȷ(ܯvPI4[P-Z_ VfSmC&H;PW'-hE4XJHȫ"_5D(-n=clB;Cl "Hd4g!sj'9DNj[^WM<";&2k" z֢USƇ;yzN4/ZGҗ=2zF4Na_ŏnm}_ [#ñ G/ɽ@Yv܌U^/~|82xQTr:*k~4:x,bOE֛ ƪuz 2rBԯKh4ږEIj.>Տi :\6ߩ-\̃(ǁk$-(ʂSҒP@sl,nt '|RGL,|XD\t WL"G_jVӈ]=- gh6>z1Ӌ/kTi$kojVHJ?KwKQ6 %vBCHf{yZxa{v>=-oQR 18e^}8k*Ϲ߭3ꮥMנ3[L%:ax!~UL#<0OyTH!3aaoJG&MsE4wB)@ƶ}*,GڟQ,-jH)YTBە:xE?Q5$q97_(O(3[zY~ف,z7aR>@L *!iao:2ǔM>(${֥qX} JMea|.hD`_Qz),< ܯ:Lq^&󤇓%b9OM>T2j)SOMr q}&0c2<[΢p7B .-M[NqyI;*pESzr 3@Zh^g.mZ^9Uvnl֦2!!-j@G§ܲm'1HÀ<\ ymq*y]uAEƣ ߜ%f8ڐ7Å؁zr8PG-QM- ھ1ew_ָ֥ @녧 V]X6,JV+[LX̬jzF;v*~ըm@9>@ pR # )"Z};¸%9u[T{J]0].]SmS@xeښ\vQojIYLW 七lTd͹tS%nlkr} 0~4bvFcO0Ͻjĉ㠿k}Ξ\c~a?Pz2ͽ*9cśͼ1MX:1lZ}ԩWr7J#PTR& &u2ijmpzUB2# ]ݱF qz?9:2.SIrz^)xY. 1oK8T 8%Mx l쌸6jT)xvV<vL65d.>dVquae$u4z4 qRZc}G>V60+CKlԹiJ/̶SL@;jl0T֠Ԁ$vƄӑ F~E w5Oln(Km"hY mgX{n|7zl4H?j53btr.ֱB Z #|` V%\zS$ES< }gi8\j"϶$KD@0iL#ASRs 1aR |Z=?8%nVwE*Q}AT8K{^i jsfp摱狨T:-*ʲ9vh@/ DZl:ݭ3|mQ#4imD6  5tف PAP|9riDG-cP4 0˸nQY[Egx/Ec1!nGcoʴk7 XڄS:++=+&q@|U;hȑ[ڠL6x'ܛXB^GiG?GC*ږ([)unF6͑Ԍ{ZH,8F+K ȵ/Nn} 2IO1AQKeЉR k[>4VltsK | [|;ī&V FR\G{I ڎ7*|\4b[-, xg}ͭoz:FԚk[޵QsV+!lUEKdΕ&%YNX5LЦopE/M.+n$Ƿޥa XN/ EBV~+-Q tR0Z}4IfΈHrҲߗ9E,-;=)`lʡ;1jwy.w>2r֕%iؖlTN+EZ߯*iU~a-ɸǩ$%Nxx3 #\}u;ྠ~QSݐ$ ̶6˵6ku ~[R5RWs ȷ#αEs?:M=ۚסc\c\oQF4\]nPxx|0׻ wPoh@O7^)'2{RLUGP4ÈuhBF|Vv4ȂMu1 yǽp ŵJ ir4܁NÆZ-;ik&)_򯅓Jq]kAja,j\eSTmމ@LsazTYxh;d^<U|=+RRG1g-[fҜw(i#%FU;ʼHd-ZJFCcTKf>ŭP6§Ib,ތ3 Xv+UU߆B )]SM+ml-k8@ok2.pk(-B2\NIHgm&txTsIubkєg1ψn-ބzr#c)JryVȦ?0kz֚N)/W2lXFL.|6FJ?RԑȖxr;M7uE_ڰV`W!6@S6^㪵M-,sSQ0\?/՗7~|Pl ڧGv sX l\o{WK,1=VÙ⍽ZMU[icQM6HqQqQ\y NՂazermD>SԎ4;yGuk ;T H +[\=IӤi() Жt!..]nUEz.I{7 43sxjlǠfK`@sר[X V b?j-v_A$ځ/֘pWy~P\,ZXǘ Ve6(eiAbkO' iD7].V0,#E01JPqm\ejUYe,,ʣhc׎WX{qvߛkTs&VT0T/KtUoR,R32sT.UTS:KPjf= BTefUweQ!nkT'>?jjҔPAMJ)Ylj4ˢi;^:yGѺ#Al{S J2i &ܧ~u4sݶzQH1fGykYv7Ԑɦk2[!g>U * Z%[miLPi{vz1p 5q+6LCoh sKT$7X۱H:T$={_௒z޵ XW | |)m9Nquʑ#%Lc>Sqaֹ;U{']++UXI"oH [DjˀXH+?6M܋TL=ws^hxSR@ckތ.{`ԺXq0f/\5KQ/?SJzڐ6%_*iÐ~`%1jH̠/M_@e;^<:cs$Zi[ [~Z঒) z؏І5ze%]oZЬ}<[cF}6 TeSޢm6e4,,*G06 ] g,HGҡęF[rڢG ~e͈*>巿\WuI !Qȑfmޯ刓pm׽LEu9u H*%]1QP\cFCEO F,j< %Kmщ&&}J˧ )*l/Ki" _W! /**2}M-ߥKD%F bάw /x*8sby=kHaZ$p 4|P?#5f>5⏖?ځ I=I4Gɳ|UMdo"`jhUgUal4xqYWsޣ1_|G;  lj#C3cTR닃_ZDOPӼgd߆<\0soþlV oQ<&EQH:b ޲' 'C>FT"ϒRLaqQGL u B(̅q 44[ zɆ =}kOiqs~Tq,O$'ܭc#YfONu܊}4͘&"|< ^v?O!u-;tF`&bHTCRN\TVOer5iYTW2=k,nx 3c<>D/zֱH8ҠeoOE/ܫ/]'3.SHSJuqGRzfğJl-Mc1=(#j6r-FBr;zV. iեLd<%m{T-Ro6bb<=+ɶ#H`gF ޥI#;\Ͻ4ِ`Xy,nnv$I5lZﳚ'&zR!Ha/ ckԺ3q;X%O1Sʐ;X*D~BocJDF;oN.wL@ EI:x`+fk0\6q. K(錘K/{ۥmn 'Q.J|aImg/֣$[|EDߥld[qO¦1]i\hvkxkHx3gV/kJi,Ed.Ƿރ8EOZ d N"x@zm^Niጛ鿊-D0||޸bFG loRaM&z8 ù󥓈m?J@2zU?fZXub7Ik`CP7PL7&il2զI쌄ޣi?oMY[{uh}eyGonnGJgZD%rToZT$):$Iu)73Gw o;'lTq#nX/l׭E#qXRpDKʫ7F>h7JyD_|ZV!M'2;[֦]_&{G|N@Ap[kэ˖}rP?z)uX!lmkk2° MZ؝E$V!֤ o}DSJ[z)p8k{ o.64t-` U)$=ENN\_uju^.*4A&ь[½G3K]TJ|}ϽHObZ.76 y)Y@k!n!iD|nn" j1%W!s:RVTkTr<62^ޚi\W֔,jH۸u]}:'VI~i$ O2YѯD%p1i:LZY}K;ރȡԳ,OjmKj[Ø'#Z?FJ6kFBڟ5j.Kma޸ X֊ZQ=)-PCJc\B7[G-cK_YI8m4 >'% S-Ċa;pLJwjr&G|@>""o=L\6{jSKa{t6MVphDT(ǭG%g^$zVϨhiZ[5b/ZӕC߽4rߗ>Rpی+2(?֤ x[CgN SƜ˨{NG*Zi7jM+T]F䷕O =Ϙ`$r./'~5"BS z,[Զ75XɹG-ja9Zs5zKkW2[}N&Lk:pqږ:mF.}an UE(+ ;Rj?YoMtILnڎs&~[Cc{G(\zm-Zt$ cJ<.e~XU<(E-sTr.QZM8PtfXhEs1ڗLcE$e%Kc. lZqc_/L)3kh`"ynhʦ/7Qʳ9y~Uzx$N5FK`D\zTMGC֒30,ۚHCB9[Yl*1F򥍠a7ny&H s50E;[޸I]6=CpkV G>!ӧ*ºʰqK_b"uAGI?4;)ZLj)s֞hB$GMʉ\c5>$\bG1J MԚe%`ԒFyme@mWL 5.ԍ3#ޤ jSkSGk֤fpkaojh]Ҧ5Vy(^OGs.;) {Yh^;`[՛p{q|>Y 3|Aȷ2m34i8{yԛRxHD߭,G.;d4: +@H7C[΄˂SSFZhJ kA,r[f۽|,H|Y|;Hŏ/?*k֤-ZSM8l:_*oj+s\l?jƘɐ va\Rq#;zVU> Quƅ~^3{T֓vşsVBq~ GG4IA[db6MN,.6{M,lˑF5Ƅ|9$a'&?Bq-ִ"; ~~ڦu8s %5iZҡ1舵ε B˖2˸=fWozH2bm_U\tJ NjY{\ǚj1FQOFש1yz/ҷ̸mԚǧ/eaLe|Z*tM< }M|~! ^V1J,l^7"NK: ˜s֦/U|MҾQ ѾqKic׉KXEޙ$LN eokb{-OhoZ.1[*[ڢ]$N Hzf0Io SJaޥyׅ8ϭHxN \Ts ߡ5F#H0slGF4Ps+Pӝ F>Y*IESˍG/ecқIH/0hg΍vwQi7|9xD'(,{h4Ze<8O+֒&y#N:Kr7Q*~thZgu@Pq= $['a'w(0 ҕO+bmҸJ'!E2ȿڡ|;]7.O?RدU{TC'[ _ҡ:xrէi4* Imڬn&/#ohJlf>jEm3čyYhOjɧ$_@,vB;>ӵm-Ԑ,LXIz9i>#sEqWt脱/^֣I/h÷ZMhRH?z3ED+iGajӦ>kYJcW>k626 *Zb!S\["R~T}3,b]\A)7RFbdV=^[o:MMXX4ѹlBSYđ +}j~1`|]jb{Pb#=ΐ=F7-zN_Q'Et)RL2 Bm${(EkM"DmcK8-{LHPt[P UULk6z5O40^*=&$0 3@{Zw5G(B"/bI4/t?*'%M0빫&YV>Rd.%:oV+yl{H5K}?@K[m\$M"5"jC[FbdDcfp7:H%ŎŦeW^4\}-P#%cKw ݩiA@25=Աp6̐ GK62jex%{ MAfM\?9M$ӭ{/mjDl;3 bZϥH>wR;4B~:ˡnynHI5Hp[}X[ݿMc1qXZ:)nқSae 3$UZg ;7qA: Tىm7u&ܾ(x2 ՛8Fic(m0E?1̥aF+HBq%C,H#x]o~CCPiVUS3Ҿ^G=:j!߭!Y-B[ϝD7BXc͍A*(q㈪.̧ϥ1dV}_HبfG `wi1[7+n/_N׽8`mw[qRɹ v>^B궺9̷o{ԭҒ:%:@چm҃5[ҧŕK^H9rMRi T&C{SB4μAlRo*YNf܄ (YTL,6Eci '۠^&6ReUR2_z`Ώ)/ZD-mͻtStk5j9p]JG=ޒy1!{/:MB{sGfH07#κ/ڰ_4Gv^ߗjm96<hZۜ:J=^Wx{  ҐǠeZbkOrE*+._Y<3,icw+sNLw$?þ$Y/jJߕpu#ȗݖyNҌIJqmPα:ۂ:T{,d j(d5n{T)ķOT"298 VX [sᛊ͓}Ep m0{XˀXo 6{lw۩?jg]TR2i"]>˱4$齍6\W ԁV$jln*Y.iU46UsXtjf_,wmavu"msOZB \/zcJM-U#\΢0R7AzfPnnZ߭GWf1Ff/jA.}`(+#x4q# l_Y%crGo}$!f!F=>^2LK7Zr"~4^z]D-?,ڒAC:y H~akSɩFTVE,Q1}* s1 ѼRq<{^tSuZm.lI ljBoޘʆX/[G[vGuE+ydDU t]d7Q@*,㛯Z'H:')8_-mEy\FR7@Yy""DMoZGf[qYE`fCEK}H8mxl)vYۄ26bi9:Nyy<&eԭS3 L}hDbqcp5 7*z Nxb1ieĎ {T׍ۭ?[nP-֧k;{֖8LKn]֋8wz _Z@FV5*9HJD^vO/ 1k;pʣ\itR[Hͤ0XԳpkQoχZYƃY¿%]0.Myذc/9 K ^Z-j9KzFWק݇N̻^֫Rɐ=-V\fߛN>>w;Vd,mQ&pn'֔#Z-#obOBC+o/AZBQl~g)TF&k-{VjU)\*rc\_"?VTQ|CwԮDu;\:0҆r\CR:sw3'6֎n#vLZYuOTKj(RڀEo[Yك6;~XtJϽ728{]yd30=Ak M<[/ /zi B^fK_MoAaEXog"ڝPԲɱ 7Vڵ3L˄jNU1Gņ׌U"|< q {"}GOS7b ^vmoVVNn[ M,2 Rh[׋-NiZtʞ]j]GOjQ0nOSу> R,z3ڤrozx0(ћuoZ";2ɸzIa{ڞw(%r:ԻHQ'Nէem˨޾\M( ڥE8D$.Ƶ\Dx~",Ccaz0Ŗq,Iʤfu:TXtO:woJ%awRԒzcGjVhLQTaSRA{֢Rs~P-)h\o+jDKҙ' :֦@z}`:ӱhE2|6n,rL {*Rо.nx=%tܷJSh/è)kH7bRֶA[n+qc֞_gzSHA{zt&FPauaTXDzPJr{mCI "ޑ.<"〈*]Unޤ F(GHSҴFJPI얽o4Г"G*7k<(ef2QJΠȃwCqJ2@$,*=2i33c QZA$:԰T[ڡk4L̄cCIJsb>BjHK#mQY,Ӫқ"͆hF۷V|@;jx`-aKxA$D2W›&mN힢9:7QX$oKgU9pԺTS۽kg@VeO({#Z6UvE*] d8K8=8q4r& LJ;RL{᷵j9 amR'KTNF+m錑M1H%$tPTmE?^C/m6:kST.#eL4r#WmJL2u>*y0k䫷C_ n^o ߥI \FREug7R~-@;|wa\v6$m<8pXFMͻPA}#{g-6\b8FK#l<;S6q ڤE%MSpυ6֢@Q ִVXTA,bt8opߦWnn* ʖ{—YAӏ[%7rf|J2MKGڴNJHb2q[x})bJK ")@II6.wܫP =-i|65(K/ ͳcֽHK{ <"jOz// E!ȋTGu>j(lVc⌒e'鈥~]K4zehz\R8dž_*g<#)15u}E2,A+n?7d\u%A.}}h<VVn6AZԳ\8*T͋^8|3{SIJ0[kɼ :> sfF_kO W{tމ ;n=Opn7dI}4a~3?z'xkGutGʿR:xZM'r-}־T˻n*D]̏}k7F m|HF޼4DbCb|_SokϘ|O9ByQ%;ȃcoLBL D7".;s⛕xPMBBƵ&C`vsJ9VA$؆\eLޙ~c˥"ý~#z>(.7Elݪc.%jqO1ۥiONi[ޔGpymSSoGLqL.:.!-f>X5 ~JͽL]RLl*߃&\J2kS dceӄ|\=FM,G Ӫ"Wڴ'SY #2~@Rjc;~ ҆Ljԓ0QS )'"],y? Rc~h#y#slz,s卅75S`YGeFۡZePH <™ l6{Xl1+T$ԕ=$sұS$ئ;n=' /Nj]Fr֎ 2nj6E˔ ښ1Y[u&m< {E aP܀;Tq"Ƀ?H==-2c|p4Ӂ-AB jDj#i5nF%")yu;SɃuۭkC.-KnMIV2wS_ťJcuNƘO8 G~A’XuZI%y0B,S @bSoTDYVD_{S-ڦAS2Ҥ$QslNժ ܝE yoZ/kO?ZH)tK'T EI;֡gį<ըM4'נtʜ-[ViES*SiJʅנ=Q4RMTq[ j"qmޞN%$Xmf'#庶E|Y`{ztjmB'^T/o圿. )5/*FN1@':YOޖM NSd?gl|Z$DLP xwfa`Q|ܒ$p>[ښH bsQ:VFQcicpv[.Gu=k6Qrq밭uVG#{*ӝQ7fnkJSzB;(O*1FeY򋝨HHlAڸ,nL̈)#!%;- ?JPY;΂p8"1*rmk 1sU4jj`, dy׉EeqԔ=vO' BfZrpq Sw2&zvTBkmS_2S؏:ybM;&Jݯը;R|1yTUR7DTҳEo\&LCn,:S;xF-׭%8[okˠOYOLmZ>-rJ(}x~/O,RƬLv>&iVk!M+I7ޙz-(loԲ=֢h*U 4^vb:]8k)^oʰX]uKEz1d]G GK~, ,R^ʃsZ-ڔ{֞ArP('RAes식VE̪nDJIrW0,r9l;V|)$n/kcޢDPgv9p*#GZPRrD,oZ|*!#o֠tޗNVW|T֐2zEW>!~oz]>N$|*P2DmiV3&ìcuzmKW# `u;/(]6FAjx¾TL "G*k TxC{:h'sZ8ςV\^Il.jxӒ/ժiQyNը.EאTxB6?I.'Ӆ[:*I]r@fָ煾)Q2n9 j׬*ŽH[+3eO2zrr\un7Y^Qc4ekLc%ݸ}2kQ -Ws}ޙ>N:XQ+nkJAޙ;GJ0;г Wf'4ĮNPYr6TFZ'6_.n_ҠebXivˆLQZ!*Qx\Jo-Jx[ljBy}kP>)^VF´#vߠ޵#j6Ip '0܊癕A; #"3zT6PYt dnd]VEPOK 9\R7kGH{>:UA=>"aLu,6E:E|ר՗֝cq>樓5CZ}'YГj1pʲ5muVX{E:G6ǖKe˵VbT֦fak*En/*1 zTȋ$M|9ԸԠ1;}Ac[ʳHFW !Xm rbv)דcK\1ӵ_IȀn~gm v$ȩ~kztI&^Goʰ;_ʈuza:%؞czld[Ҙyy{zF$(EWe;nrRIf-r>yRe!I\mIԄ}S'1yˍiNL Ç!wR:zPXeXѹfgˏF5)+Lt'/j !Xդz%Z|2Apvkv$+%hKmiŮN{nj1#~w6ƌqH{n$Z=?yA.A%j/VČAr;ٿrGFMem֨ɰ EPFCw-w?1Iw%/Tivi.veē6Xԭ.SgeAQE _HdIBH nO`$7"V+Yznc;DY.38 >+TljW<|uӂ֧E .]MI)ۯ5>W^;ԒO:8zxv &(+ܶFܖ(C!-h`P9J_Ib,rTٍL|aRmyWck'R2i۝fV5$utG>1[=U_+Z:+[_z\O.W0V}ތ';oJ$ȫf I 15X_ZYqzP8jcf&3SmjĊJ_|H)X0֠NV|q6PiNSŏOdoO0Sz^0R7[hvkAd+0cH2m>t!C9CүmBB{\]gW[ ^R̩$\72R?pq~LC-:maMQԟG(.{NڡVwZ4H{SBjcn-8 ܓDkVC8\r*ejmLߔZ1gU\;N-SFoM,2Gs["䀃r]Jeen-כp+~j m:8)Ř_j[F-`莥EC~[P NR:+{WUH[6Փ$>k;S.ʊc#I!Tڣݑj9s{J9VŘbzZ)1,`-zA|;Q*{b{VNx1 j97PAڛTA[jS $hT6b1Dx܎N . jVp!pT}bowZAK`Oz?rzҼL 7;o}SȬEi*NZ$tff )DrJQ*̿YC:9_Y7Kl.|99X)ΗX6ڝf JWϐB>.'zEM]4'۝Ra4E9f2$ԚX&*vM|8Nk{Pl(4G_/˵|2s@o; 2F%U\N3>S@ S?n+W"g]f RK~a3b.Z$۝ L_ִzt3:o+xe \g&66ۭ*$2 z[x^i/ڙk6|__颹5>2\lNT_Q'{Dx )`G],}ޥlGL۰Wi\mN y+F 9dXҡ ԒE95ʂ175 CP{ߵ3 W;̓vkH4pL\]D[Z{_q(/QHU:mOayޡy/~967%MSy7"Ƌ &_o$cRM~IP=\ jyA\-nGEd潬ޅhĝ닒&ji-S˽j 7;_߭J%?*tڅp ":nF\iek~T|mzcqT܇2h/ex7JiR춥Ԧ:w n)S~qlk8ЫO18>{([*.BsQۅ@=E/{!ֵ;)$q\xmZW4/O$Eb~U>IHooI/F^]ҵ1`!E\zR"هMTD[vᵙC ָGބRuehf jEpՃɿ̯RnQC]cSVh˿HSnUndV[]rjѦ2Ƚ6Nxf8%n|r.QA&HwQӹ|ӗm*Oa_1DȠFT o;~dc,J5'SfFǠ͖yfn,קXo>G᧟\j\׽ԓ!T,BeEɸ?+O~IzPeɦy 6OZI nVkRS~tˑ\6e'ʙ 'ʢuwb>턖ƽ?i8ޝlmoJ8$?e*۶v#3Y~: 6W* bJl?=\msQ\  2m- ߙ*X ~2[cDnc=|&ؑD\oڸk7$j'ތJ{O^#I~! j9YX:kڒ'\=Nԏ)'4I%GJԓ4ܝcS*wL1 WήB;'!n$)%޺ځ&_({ժlG߭6S7^/rlz 2XzK_MQosT2:N?Ns-o*1v/ޭLb^ǡ"{NHޟ֛1+.צ|P11+* Rt.,ץqUQSi ʡ25ue|¢16*ifBk9exv }eʠ4#!f޵zD[:zE6E2qo}[NM1O{THFAQQdC}zՉc Ŭm׶IVeTʂ@™lr,`,ԜfwGc"4G_JBΌ +Jj 9ڎ&2.VKyR3pnE&$e 6Ǯڴm[[:ދb5쵣mTٮ9z_Y,l-ef%>У  TLZ$pSVK\IcG?2zPBMʤTdQI5vӴ$~5:)d59R rTdbM԰OZ~!>[sZ8.Yt,W{Iez < 'ekeϕr?VJxkT]^}41ٛ{-i6DbOJW ڑWR Z5/1Q)\MjCk#~Fk%mCΞ㽷lp/ ImR`N8E*Q[+bޔK4`ҳ3Jȭ{^rXHرK-L\ϓĸXðI.Kku!F*oZeVaznRO^Ԡb?m8p<j")G.źG5 ͍|T}KQ̸Mla)"q)؃֒H!qT܁wnwG`|FޔqqPL}PapI[طlX;7!ïMD O ~"_jL++NӴ҈yÈmڤmav'[׮+bzniM;V2[=JmhD\f>S<M5Fmε(tyb\%ms[NE'1S4?/xXާQQz;G;AŃ5[T˿-k[>Ouޥ1h؍P&Cpu&W?8g+@[zȐ̤f`W*E#RW忕7Q;W9^'lM 23 oWs\ Բl$b:ְ𳐽ֲb,{Z ֡@ ʟM Nk§flwU,QpH;+.žO%Emi_kھ!eq؊_eϿJa}W<Pv7 p7Lٔ_z3#)ᓔdsƱHbn®ѯ~^V[U* 1;X^*+{p,Ң~=c* F51/#MccQҡf*3n[W +#+mN6QҤ*Y;W7\ؖJ'i~&I 7 ٭NIXz4rS!c@fi Y-COŲҲTm;da9?SM"t8#yԗ&8?juvTn]!EE{zP gV3Q^'[$ZN*^!#cjHW kԜ>!Ӕ z^Jf^qqj<>!O_U̬æR[SXV8}}+O}GʚNX2qA|1%RdZ/!}m\U(Q_jIrd2Ko\H&#dmjЩԩu3"TvkoX:TQ68e VȄ~VTdB7kdǘZЯi/mʏmM3,s' qein1koB ҷ"YFB.mе62ߋ҃,x{oE&S!+0.w3vU$W"TjV )'{ά6OTwrS4izT]qQԚx|(|@1lk]]7{҇#d}B)v *]fy#Ӿ5v;n)G+Ҍ~/ޙeV BQ' &U=;'H3_zaAkRAQe {X E .cTxvN!Ө ~ZH_ĿOsr2£''՟%}D` ڤg2mh n)Ĩ?jds[oR:ΧܢmʋN5ɒ7OQ7 lie=ڵʤ{)ʆ/wk^zwj&4J\3䴷 76!%Z%ڨ"aF1Bru"fۧh3jӇ!b7*.25x+J(\9cbvv9=]OBTnFGE\d;uZm{"1+[c{ۯ)RV_s/{[ڴ)yzEJzR4bڣG}j7aPH&Q0~^rz : yjbл [1G6;PB0A8`2^ՓEkc~ccAvT8mTRKG ڢG3jp?i/~l_9n793E,4ʩ)Hب.Y<T|9H/Q<Ѭ64$mz69N|5 Ck Q|\"_~>T|ߝ+,#]VDmmEpG4h zɩ6XNHςWk wrU $? BۚD 2ɸ5(3$X41YvcF/}NʸS43*1X{\QUwmۨG"bGKDI."zoұM0$!ށ~k{r[gK 'ڧQlbiS}-}Q?G~ש4ؼ yyPKgVޛyWmчZQ\^ܫ!+MGFQd'cjoɿWbFvlkY;BN֙GMī~ճv_N<{;Er K3֑H:9oSQ끤3\աCp}z^ )fKy rX.1_*LW$*( 9*RbNEy_0ySLb1aEcR cXoGvJʈ#5#ENWƥ<|?Obx{}D>EսOJ67A~ҎHޥi`ln~p$EySYHޮEcj.׹Le9'+sze(X@!oK֠HM;R)mpL(6oҚrl79L`j~(71f1jl^,PAa}T\|#u\b(ƫXq'e/\ʬ=wRMDrǑ܅4..y>B*XSc!Jv " soڭ 㥻TҐ}5`9qZgb R:އ-}pl9p$Q^޵S/a!T>(q['r(FYΈH3SVVE1;t `qjըO-"-ETc(V[\V7QVZ}T ^!aL VCk#R+a_ɋۇS\?nFJzzQi%F3Hck{ozZͲ7>*S4Uy7/3=.L<`z@oZw\=F,HSޯ1~԰q yGs{VoTZs:oj.؍1KV<>URq8mֿ_ޕ19 Ѫ2_f:efw6 z~aa:٢fktޚ!.xYS!^U[1:ʽ ԧӿ8|ߞժbdӗq}*Nby\syS(eDحK6>vbȡHZlJyNw',9[qnޕױߧq~BErKW62nms2kms5hx=9(]DG/ curqK h|J3|M.q.Iۥ4m3N嵽(Ic/ccޏ8ڙ-x}<|޻c+s5Zӳ1F[wQ<& @Auп DSb8K]Iv@9aJT@+>hPbl"]TXƶ ibuJ<ډAh>PY# ˎGf]# ,* BcvU,qK O?Ҫ -TQ97%Q1"fA&#j^;issm$^$sBHc%N.UMβ2bߋjeGy!AP|m~y7`qWDL|`,/Q4C.5FeBU[S&ߕwZ(t[hlzS96n-䑁KobmF)^1YGjnpuרYaHQoZ3p="zuF2/L>B3rȃy}d2A{k3RŪ1VҦqmˆa-֢_I2=iMÂ?ZU|bYd£ ^į)9KנF鵓*xE^Q ?MTbW\b"4T" [Öǵ2jU"%zm@pb?ZIk pvWD' '(=Cvv}=H7RU$V*0AQqR![U6^;@Qȩ#˿.1+pZ*`eozs*v Zd,#:LM.pc^vMߵj2ߜnw޹jd*X0ck8J'eۥyv6}C(BNJnQ^evS1o0[j~;R;6XHyy>G+_JEAQh:*dr5 2xGkԜMim` SlmPA]腓+ku0r oRwN@̍$[__L|TڒiMZle`vRCh p=Oq=qrmZmqW8nNOe֒ȢMZqp#`qL$1̀(j^== iZRQp25k&}#keTCLn.}i.䷈(4'Wp3/M3C 6;H$e#)ZoZSVq CCͷR,󵷱4ǯ6⟋\"ᒍR 5#f{ڵ(@l i UڦJfjiVNVۋNYF>*B eDpu8w6}R!*i#0WX2aqwTlotx2t;X/SZsژ&TP?:p=&:{zrV9ok޵e4JҤB4+(x{`o6,EPVj:zWX%hur\m~!/]HĭnޞKoǖFwַzG7l߭,~"_#d4_C,mТ aғ73M;nvڂCw!@RD`.*nXJٕF# ɖ)&"ҹC zBt%fɊ]UL6biu&aC dU87ڗb0uPCdY.Cm(]Pqc͏7N9 _Q5 "|yFPʹEZ#$ BcV#/Z$ TRPƸE/R,"8"5 UF$эn: Q^_jKd/ށ}^/ZtVqZv@dolCP| rr[FZz-c"Y{Ј1MX }$">jELxG4G;4ff[zf1뵁߽C!} 38E7[AbYpǘ[j`d~/Jan McJAnrPoZoIڀTc}K+yI[;K C13\OLLn*[E̘({im3:H}A2YcM,GmQHV}5=5۸hbq.7(iy#]5l6~KˈT@*6ơĸ*_zpl#k.o mVp7ר`C.C-"n.Smj M^t4v9ZI3ٜXCboRO+.ýI ujPª֧F zbwe"7at觏,p1*ϾQ;Sq77,due_HqϷڦ8JUv)p-LH+YD)pҘa mjӳK>R$xSRF}|1dvW!(17LJ7-}6> FC#o1RŁkv+k*'mx5gŐ6) r(3X] Ԙ!aeePv*IZ8T́Mu jX&>tʒG2ۚHՌvG ٙ"S6m6[|(R[+mڥ2lAYܛ&Uf;M5fݪr-u(k9?h"8PX.jkI+@b;tcB*A_qbR,>Pb(|4ǔS Ԩ\Uū9uGNATDuȢ6,+D};?jf<(|FQr&DW DrV֮:itDŽ+,@䄄Qkb*>ōi`b@cz,y 24W`YnlSPLXXRլID ,+[/:PT\nT"{cQ;FEϽep[#f<6&@VK`wUe,Zᬪ[c\3RˑNޥxρ /ZkٛdP≴e~J\ƣqQ$./̋bwng9ujEFf1mjV8]`iL*/~QjR!o:958nE7ڵxn^Ǜ{ҴzX\è ˇO[ ]?oAqM"-uJk\Ƣd~jQƢt?YL[(S68s1_7-K,rqjxv YmlvΙ{{Tq?O545|Fo#"`:])H0X [o*PҤ,In 7tg2e{Z(#}tV=h$,8p 0Y*\%SWr3 {$h$KO<<|ߝ \r^9/*mڜf"ڵD"QuEnjǜ{mj_9&CoGPcVߧeU1p)> Iz-K T~8 ;΃R=V\@%R4tG}낺>TΐR0$b1qҴ8X#)[B"%ON4&A wo* 2 6*}:M˨xݾ_:@_?*+'`:l֨P;|zլdmraZ$c"  ;g{T1xp M$)&; چ9C9(XQ!QzixwJN'75I h̞d0~*2K/uӺu=E:©enaIӬ _a֌rFpaje7Oz0囒1Vu d L:(c+s,cs*2$-mZ!PrӨ޵(~ v,mq`Ux [/ԉ/܊Q;-??Kl1#K@jխ-k%ѐTxY ھV)cYjRæ"xe(#*2n| \BYtSezVr?di?Prj$X"u*YQ'_j?.0Ⓐ߽7c}%C+u5`9@^%0D"M(E@|v'փ W-:hR|-8ٮ֏KȹaޡeoO+q17Kd- >QJcڝ w*z\8爸֏nyۆ>SQ~#LWIGbGP$.tzVVUNxdxWtji!."VdZn۵N)$:xԪ,F? B6MLE .+(ޣq7jPm4x\Tڈ'cW, 8-eR-޵*06Cann`-}A:xHkt(m梞T1nb,)^^xoھ.Y./L1~I/[zvbKrtʼnl-\Y`ݎ^ ?҈8)d.Eըi$z/P>xt9Up'Ju<-Rp".?^[mMixiߝj"":agaqͽ".*s[DV`uö<01&⎛'NX܍]#"#b z!ϩB Fv n_ڀ(QjKbE;ǛzEV^mR$S@%Sڂ;d7VK78^H&Q sR\ut, [3kSP.8zLrKGv;tv=jU]WiܢS^/6,|π%LwqS.3`ďn<2c{nթ{vo_GsVSVkuzha{vy|ڍ8Q}+wd{QReV+o{WlʤO˽l[7B$Ad$sP{Ta; uJfmm\0qb;ծɯ S=>G QΛY\U %-X%(#}Tr7R*ۛsR04FAtapV UAځ]pb>J,b*kke$mV& ֜*޴")6k?{ $HE TNmo"9ϭBF8QhNL℃MfKǰI8 { AI+" %UVUԦ(>˰Eb 4ze`2QWIU]@΢i>!t@A+S C1K}dRW z쌹ۙ_}PƲ˙FhHZIQcS$/V/Zܤх05I#AҗËnjfq~(>[b@R61" ޸V2)KkzVc\O/:Y^ kBf+"rJ:D͸_?ITlڤ|+y#{dN>7 VQpK0S$ 툿L%0~PE`*Ӫhhcq_O@ZI7`-JFD8{rfyK# m* d-JYV9-uޖoҝ>$+~$|0O*. .9-;d/~#.uH8\%1whzyJvޔڍo~[zsu2 1tCi4؞MHbPIqrz%~^u|9ޑe'Ȁr$*IHW5u5did wBz5h!5 ?6 #4̀X 5MtFXb2!zIKϽHkZ+l=q,_ 4bXlxvYE ZIJַ #[N)"aRjgևC6-Pȳ/Z 32eݨLhW *12"mj<XۨS,ۿD#g`.EHfEab ]L[lhY۽!;ɔ^|Bj"vPe_V+"X0 X^PH!xb8k6pضըc`zӲ"尸#(l{w0ojxG~h(oڦ2E Կ&lSҵeE*fR֭BF<nG¥\QKQWH8OoC\MP.#RtR)U;t}׵c2>4s%_ʾG˦4KET-`jt}8X8ژɧB^u3\m~gQt1ځc_ E%}ι N~$szx 6&޴pá[e751L53AfM^$u'k HYO_SDQk/EVx'fM4[!EdVdS$"y;Qhfjbix@pHU4PHxx[^L/ڟKKhm֋8c#!]+dmVnѺ;[ڳ*/SM+P1 :nW:+ 27l/}*A¹oǵBb:GE2}t"bPʘD$!﵀EO,kZpfG[S,:T%R_~Eucp1*KO~nb{_:(?“&/"ݩd\dhSsPFal.=)eD7KGSǯC T(R6DzVڮ̈@oKsg?Ji*n  i0ØDG ]ޢMl7Pp jȐq\TzeWN#1[Pw647[Գ"\azP2wڐ3J#ñ/cm}dM!nEXyVZ 'a>^NVaGD*κë>YSeط ֝Ew| Y6l*vG CIz qclLW!vʟ[0ڵ7cc']:+[g=MuF7?MXyT poZxƭ5Zr7 TҗO q[ŗ׵f$=\~Z0T77|;^4&V؋E8n:ڠ4jnAjxKn*F8 fڵ&: D&l:~u#pcc: WÏyr=MjCn6mR#"Y7F&="ʤmp*%1A8>u$Hu q ٔT$1j"J\rH#ee(oN&#p:kzui]OjNhoʕ5-bmj^XwZ a8'eB E%y?I}:\>;ޅ) ܅AkSƘ {Vѣo{:{;kkk7eCjJ#MJɈp߭};xK[ T/m{uv;1ǰ!UFV=5#ыXoڙw.n}Oacdb}kE1G_CW~Ұ 2ʗSqtb#81K|Nޢ`M?j=0 m##֙8k"|{> c] g[cP _/Hb!-TCz/wZ](k(%XTcsFbs֢w7|;t^](WG$u*TB7n7c->lQrNNZ snzeԢwڥ M_M[!c .!I,c۵I`ڂ :$'t.AK0ðTľsD|: <(,dSZͳozYFrS6"ڞvUms|_u.fR%kRM-Jee)PaUKc` ^5ez,CJY f+HB)@6>$Χrt)8YF2&'oJX>n{wG Pڵdv cY6%^2d` KUNvJC#Q { ֍]>\Qǽ25imPF G|^?"VE"F2c;ZO k߭O7}G30jW @|=KZs+}r.E5β:c;W,@էl2+>CE,L.BqZxp¡ n <ޑWT`x/kRc@L{uQh$Xڸ.w<$ޝH1~XyVjYdĝ9w;"$Q n/T5np] r+{ym>JGa{cɣ*&w@NӆzQS@lǽFx 2å:*"@ iwB:e @1˖ԲM!Ԭ̯{[kWJـs 0mH0z9$/oJUG(c¥yWRAssڧH+_j-!'t7h~"omȭc2z^&/sH_ RJwnz4| ;:VAynj}A^I6):wd/n4O$Qӽj%29:< $OWHаvi4$2'sM/doCU(Vnh,IVӥ+K5{V"!*q%fiBQa)elqE c[T TGtYZԋWYM[q"; G;au+\9E8=Vſ :t)>+!5mڤ♯Ze2k֢NUl {RfT[׫\:G?-P 6yE$'h4+aj4OM9~ya\س^l)R(6m˂kQk ncK}ږw@ ɹO28bhi["wt[CgVژL BLE[:KAv;6W}zԒ&ؖ@:\4S7K P0[F YǪ arRļ@|MHv%nɧ8!,/("m&"2|A&GĔsU€''9֢6BKt{VW;fuڹU\#TR Iߜ԰pK,e"-ʭpV F17j( 5/Q0P鐽fdHZYX˵uH|> ^'[H_֒7lpbN.h̻mj1m CdUjep੶&6QwS,ZmaO48r(ۑE#)aȤ/Ol?Z_4ad?JF<6 iHBR/:LIOz1O-ӥj̊vJQ pֲ0é5HA#N sj0SP;֩tvVVb\ =.y$pUuunYcK!恅kzj>!"\ji%8U|Tc^ ߛΗ ,ǑKlI9dPRǞ5VXN۔5HdޕʚYjh ŷ.ڦh1 }똂"^[tҦ+te@}]L f17kGz2IáZ!z:ݨG}ZCneE[鎝sU"#G"|M+jx^qzYT$M 2H0jEXSo:td<4qfZ3/2T:6 ɪ 6t`?-̡I+8ٕ'޹p9Ѻuq|E7-HʵC.noΝX0J{jwS)K]>]jYT=5וNт@-wCKi$]}E mzmִ(BMbDͽa.,hbyI4ĭ(nVȍ:+$&0n >zXZڤl}jd{N7DnWu4[$}HB鉲_aQ߇c(LKovH|-CUaҁd l-[닃*'HoGTkSo5™Q4uJ49aSo^{<"̠+w5i,=Qm!_+Zv*6C6Ć yXYf}G3sȞݩ!(T\u:_Z0O:M sT\NҚHc;A^K&*.mcK$q~{XFRŨtqeZC#Tcnz+c!6Tˌ)q4!~-CG#b^%U!g@p8#ewd+f!͛}Ӹ%7nmq2r*84C"*K<4"9DhCǵ Ytđ H7_ |35ÅkrjCwpV#ssoS{SqySBa4ۇ"oa{WZ eS8 `1zNe%T=!r~t ~\ Ө ǨȲۊEz}Пf8nu헝ͨ&1"y\ZHp[5#pKQW;`]VUcyv~8^>鷭@=M֥d့{ ]|gnGڙzVVKֿ1B3cw;PE!NM"ʷFnK:8'*/ZmL g {t - sbk 홽DxHwMϭD^8ڑ=*2l&*2Ť[WH3uaj'UP¦OᇒK}+b/RH@6zkd˧oΕfW_Sh^BAB9}ClU Yz FnoaۥJ-Q` $=jt/|N< HkcOƴ-clQI81693 әMiWPD|&jDM~#l:*zȌ޾dFrHtt }42wK_'%v$ޔ6kLl*W]dgSžfdԘ,.~^#{[!DF8IvI`H$<&&c$/ڤYAutO4Nʦ،{֩N€mFїaSIJ(k-Lr@FmO޵c +mCfwq B2֥Ȧ oׯ\+uŒ^zx(N]YD#@Z8tBi#HɊy{V$oY;#zE/*/mڴч!nzBҰ]WqHF74-֥ 6*TebN֣궳!4Pa=j(/ԽP#+v" @x?39k(w~Ԯ#sX*S,IҤY1`HfF[l?j6Mlz(w{Oռo1R+Go\Xf6"FOn,q+Zn iKrR(EmHdf!;mQ ,(kRF|Z 48żWԌ7vy1nVDQ"_D#^sjWa3"X82rmPE1H/cK"@"[ x:7W*l~*L+^ȸfqVP"s(2^2D78N$t•we DPUf əzP*X_Fנڎ]:6\MOwUkUKo*'J2.EAnⴶX՚*HdܨR7 +7d?mEuE ,J~O:LIbQ(ǥqIԲMd~azVfˋqVNt"Db;Z/ңPͲpzunsbQx 7?Ʋ zYBFd~ԓ,rݐꄹ3jB_HI@)X m֧f]:Y]/vAO$lxCښY'BNԎ=ٮT֧'ަvr θ5_ǠO.-3zna8ۭR_ޥ64rẠz2/R #ڦGL\sb! {wiT@\q]Ȍ jo:G%2cRA$V*6 )ܫR߅8gni^S<ftktZF7.{u5:021C᠉E-ٜzR'kjXv~|n{mֵ0,7־$[>ɐ{~lIzԈn9Af6-@?ڞkKtG[#jV0rD3sdoXvq@P2Td.2vqz+v\e<}\f7"ijd,:]z^Ҷ :tp,zz$$K 2B镸`{ފv!$λX F$ŕg坲xIoΔ#z}@`@k},oRάAqw,gD,1뷝jgu fϷJ uPnm#{[_H!3Ңm?"׹ڿf̃31ŇF 7 mRYA#]r~„p46zJ]}?bӔeR6!jE?tQE~sj]9Y4L?]7%mbޝqRWtłn.*cf;֧J#uKs҇1NV}ƝE[IRf1@kn?? pzȼ{ ȳnѶjP'%HG}S4 J{MlDЫd~Tx\NZvrϿQRp 7S0R1,6$c˾5?m޵׭p{Z t41M&8ͮv{.@ޢ< ڦ)Ż]J3~V"aI!)FNҁ6w$"d/JY% dZIVsa֯loz:9_jFݓdBkQI Xƒ)K8*˷peG522su^)ZFH~f7]M$l8a{؟d^5ߥ4$O3N%/֯dܥrJ$eX)d7&XUj<+lQξ!~Fm$2;fT E򹷝2q6ØkqFsS"8X "rIa{ыWhXm<Bsڤ +$oL9k 6y&oz[' 0O:5fݍ͑y2@cn_#rdM"G)Xv+Ѻu3śkPEZԩfdYymML`x9/HeW&K1(66 mߩcu Q ٹ7 3 NԑJ8lw $~&" g.k\R2X7}iỠn4i>:[4B [p&FK_Z{B[>~bz oR\-ocFf"y}&[ާ\ Xh1|T3`|[Res1|{SCbcڤdPsK82U j~ ?cSfXlI:!?>ߵ$qjN{ɖ5P.5MUZM/("u Qe}fa)`**OPpPOLxz2Bmvo@"5E/^mR^[}?BN˪tiեyam d*vQ? .\u( vO / ݎ Su. Oi:1ۚYekԚaʭ ]S֤գlT^"n  pѵKS3 s֑CL!b cH`rk+5$ ? {ԜC-?44z7Y)VnsXA1鹷jLPO1`~bn}H'Pͻ7qY츃K" CukT \-\ٹwJV\slvy]5g6DuB'Mˏk\3q >A-E1|Sq8܂-z9! 4\=wtyQ_X͖|njp5åsI)^%Vp繽#-޸XZz;G'QbEkHݏJXF+٥9o*/=Msrjqk\78xRϹfXnj 8~h` #@/;);LB-[ʴ3@7DK}7& ꦴ~}})O1 E ʶO0"HXQQS33&FyCy7Ďo:M~Ia1=GjN32dn E.< zɴ]FmHmOJxv#/?D9fȖmRevzWRTɛJ~-&kⴳDrMK󜛣I Lٱ&ϱ%&F6,lSIv3ޣӉFۥ&rK¤7SP83u-dT("DY9z*#)jM){}VaW7Cr.]M 3ۯHeDv83fG](zmY:cMn=֧M#O^x 7PmSwRys^CY%c&Ƶ"KMTlޤJZka߿i9%C*nmLxlP~2q!ϵg0sR*M&>sgvZrRWϥLS>"-roL5A`ljiI<\p [-~F7w,LL}KϽpVL|̛mG6f֟n~ 9y4r{ԬLPHZv$tḚkL4ݿh!ьd-"Xd3޴qDZPILx~"NDHYkY.íF^ޢ~،B|LK_s<]iehDCمi)cfe tFE &ace\DR.wܟFmi5H P99&Q? 0q&iH^sS{Z'oj, a[(S,*齪U p=Ԯ4xZxrڤYb@v;1Rtԥץ8pI0W[>-jD1@z+*JPz[RfBebVE7?<[.zhg0]B n**{ <)FN֣J0nm7~;e[}jg#޴ECPc,XNn ˨nt[z> o&D#n7zEnvrtKn-Z)~ԯXrW!+pm\b1]/JN=n׿qRY8֦6t`OM<`z*i\>:ԑokSZ =zVkpu>PI#̀ާM;BVĂr3x:S8>;{ԃNjE<zx…CԲv݆ש#l7DĞX\ŷ4EDryڸxdߚA %;6)ݙc17)mgz4d#|ț\R2./m t%{Vu<&e6ؚ>8U>TY,n6ƗsFQcmQs%|1޵?$wo9ޥL vР#1} $#Q5K.-1jIlf&N3^8,7SR.\ʙu0&QؓC7iY縭LvǚĆ:e"jU?1jlSkK֢|߭N-2޴eyRH-}ڗKiC .,|j9,E5rt̏l2-9OlZ\9Kns6<==֥lwܶN#>}+?Wj_6?"E$qSZ!f+Ud*M ͬli>k,[r"6\ &VLQŭn I+E'oʡ/OzIe3>֭.XWb> H?քo5$dC}WLt!E 5Е0B'6{tMfb۰?ҢH2$phcԅeqoڵ uZi(/j$JyX; J6@j=:Ye\6lۥ^?qU%s|jKl W)xGm$3D,Y}F>9c{=HǚsO(1nӕj ҵ3Dڋƿ'E÷-נN"j*Te.HUcm-;~$ycl;<9mK,(p `~ȣmjH&beX$m65%FȇjpFsWQ2kU"jarf3FvWk#-fu,bf]á_~gI6oP.|-kS elsZԇ(?CQ[oCSSS' پ9FV"j\M%b],Yz t&iI3e(È Fui9%FܧޤK\QyAӿCO1 ^Ժif͵eZHNG"]cF4tD }Coʖ.*6 =*mriBc#QAcʴNI5:xִL\'NӼqt0~MzʂLmzX*݁ס$??塋jZSᒛ*W]{_mR-rzԟe䜓,}*HbLA [R-Y$-4Q$`?j~yjMZK6ll+M Pn;T`T!vuDK~(xlߥ u1. ӆ+:s|VNŭUUǽ8CIljEGPjSy y.]qZDI*2Zbj}9s|ӥÐژfn!rPvcK!Mj۵Cfr}FYUT`,Q;ԜTDxⴥ9tmE!K ȃSe_WeJq9էԞ!zbLC.q68>!KHw:t6H7< ArѷPrK-i ɸ >ZN,uoK;)}_/ҒQ4:`Z|"7TwV7( j ]q"ZL^԰C4!N6\C,cIyŏvRċŽvTUnڍZpۛ*Vtq6vRjǴ{k3H7Hc)yU;>J z GF52 4y V橖v*h[ĜN8N[7:ԫfU uLQ%U y>u<7naQoяcuQ6 ;OF'rwʝJ:oҙ8ш- R\ ֗Z<; \H]P8o{W'텛Rav6vՉ7\I XLnC=9VwZ!Naz^P@El.3tji$<1CHAT1H&.D@%? ҚeV\4y/M9 ];,*yDW>&榎' _J(셐9Ԝ5{WG4HmޭӼA =)y0Ř.xrvE)0j0"[s>4xL tfs{v v'PyNڊJFY:[/zUI6޽ \ %#lJЍY#2_ fTP6_ZxC3_2HvZgHJͲ٫9ÿZVb~ ɝ $n;#"#rG=jO.ýa˭K V,# TڎS\|TE0]7x'S0onS1d53L.>Qoz֥qdu6[ :m(ZkV6}z'rj8xozI_ϳ\se]\H-㷞dNW~ÜȱALOR7JX t{mdnk2({˥.W# pXޑZY)_MJG A)g͈!ju%Tx^։8.{^Y6,H 2>9w3ޓ09U8er \l7ϰoJ[SŇ@Te>'M\$Z8ЅSmߧZY3X=5y8ϭE#O^*H>|xP6Ae_4I?HȺObK$~mI=* qk*}rj#SG8zgmjqIεZ<aqcV(ժ oCJPjdyY:Ο)߇eo6B,Lq̏ZDk~'Fma8"ca,w㺲F&~)u6N]+CIygd+Äj6& 5 Ľz[^k;}[T3C?)>f4E^e MAӘR,N[(EP_*:eemG!7&'ΎE [-Mj=Q{6cgڬۇØzyTg[oIiQOXZ<]jP˕y=$*XdTݼi*lTZn![OƂ wkV̂`-R宕QrJj-埩 G+lwf@ڣk-B1>lTs//2ݛ!r²u(w ʡ_nO_.Ҷn˖ݍw#ioR"jgK6KO-Ө=мvq[_ʵ Y,2 yh͈/^j Eue;UmSˉ^4n7Shr|mmpRJ#9e.ֿ7)ۧo J/>Inz ,'+;3t Y,ܯ V۸]n[ ;CpN !Ev-a֤6[wָ\5L M\qBljH"ֽ{I6(E^),Qy~Q7 >65ěMڀq޵H#^Uoo:n]년j˰o A8ؐ{w֐& 7?b򰳳AI-^$/RE JBQ&6:ő`mM\Ht`|Qy4JE*4*!4;Z!O,?w?>\yH7qRj5X[ަpw5"Y5QUFtg Typ{0q ]?j sէ"cڦب mNDfis>c43ҌU<;F/wU{mP3j6Qrvo!L;)Vm6Y AҙNY>f@PdĀ93BuXsQg{7 sk:8AZDVC5=(v_YZ2ָvmzm*}B-{S~bt^Qrl ozcӊ2O,\Z6blmhK o[t9q6QŮh'A߯QFvcJd|# yEᰵ+Gp.7&ޚPj Rȥ>M;oڵ'oJU2wJyy#z)d/4W'M oK,Yoʦ/#jO*avC`H(9b)-SkL&H7{АN|*7q$[(C3D|.P;ВiB{_+GzmTéCmMkre=2=)8u,H?UZIVADPuolFO @jXcDQݫQb|oP$xP>8\ﱫ* `} ʍqR44l7t8Xn*HˢHب7>%}ZP.all1[&7msO}_ja 0%j8$]P> T2N;*[S`/ʄ͎ǝM!2y43%>CiKŽ+Fy%\\\F6Zv~ u֑croB3V3iȌ:ޚcC[i%ӹ `7V4l5VU-pэժq&eqoT#T$>ӮR-7$\M>DlX3Dlu%[Ȼ{7. !>DŽwzombfmOtVס6$Y&ŵFF6r ak+,d ߥE" Ҿh%rCђ0pʺ7\5&Xc7~>Ib,C}+{rӤ.Գ;(qʻT6ﺁXR-jlI㣒t:0k[c"7wچunoJMcK*@,@ڂCHĝOmS AЊKR뱰S'LcΠGl"؍ m3qa~Tn@LmDeOk&rmI@j'ȜaKE0rK.:ڮʜ+Ʋ eS!Y[}ZW.Tu42%>\”7 "m׭Y֦\I+^vP:éb: d>![eۚ3q dlloj.;oGXڙ 4q'u[QhĭioFe Ql[VY|ڏ[oE'~m&UZ?F~6L\ُ PZF͗} ۭ<Q vI1j UdͽL^T5 ZyR,5ۧ-n$cn7V udh-Tr-<=2ʲQbHewJwd[-=#NffQh_4hHM 24'# p w!i,,zITȈ)uzX$s )+THjm2=J4)ڢaIZSdi!/5'KQ*]j3K4L@Eص}]7?;P LLJإTy%OJB W߮[S%VLO[;#|{T$Ivc~ksc}#B%ݶΕSE2-G-C] ֘CQbxCQ>ɽ/zfQQX7j!"9OIڃʕYtt {[P^;%/ԯ 7*` tC-m#Zbk߉"n2iz3[YKv1R"ҟIkp&ϋo<4kɎ6`::M"jm`׵bV3ecWEHz 6Y≮#2--hxP2oՕ>>]T*KC2z~. jM9\GZo;ZHN2eWd@P (*7}0$^Ӊiַn"𔏩ҴH[j2,x+Tc V*_TцmiI,qNeD5utaڦDOKiqj(Yc%wׇ<48JY:Ns~[T9E\wHD Ć{JgQ+.tf׃AS$llM3ClzH9.zQ;劰, 3mJ:j9yFt\i@V1%V49͵65v7imY']3w+q_z]GL=A74c'kRbM Kś)t[)J%w{Ҍ3 H$2Ñ]26^sTi-JakoM:Lc6T-a=jW k\p_΋\a ,_*F7~Q~-׃Z,11S4Nۆ VZG2zv߽(Vo{Njt` v68њ]nB?xM[G`WvIsx{̵.l$ ׵%71,T.w 8}e\.Qx;INt1NC0>ⴠ܋I20uXClvޒ9*LƗWV,Nm:^1$R$(a`j#5զJbF ٘. -DWwԯ6 +{V>[5Zi.Qƙ?ZU^-͍"kQ- ipw (i.͎;yu_Y͘#AUr/1FaQ #5*PoZpd}dֿަ$6`ɺo48lABlJ(1JSr"RhztysZ!kZ:~9eǭ?9i;ET6ʷ{߭8b; Lq Y[>e>V }TeHTnW{TerK\uHȷk)&%q{;җQo#FI߯ZኰՆOXqm9_qk}Gb<07ާI𘐸x(${mbvdMEVꬿZ$UVL Ze6TNG/1HrWċmGT"HVަ"r Vn5,w/稨 Ky֥Qzݍ4}[_M&T &($<{LڤdaތV1OZ}:z#3EaR9jB,-å%;R$R-|y5e4qR0ǯzUlnj)x<*"8\^a'6&Ry2+I[2ʓv9}B5,uI!VMz6*WVM%ݱ>j-{qڎY> XA>ε2N'jΎe֌$G7f^˗:ZĊ,YOxG7XN'ca"d6\.%_[s򨥗m֎:s' Zf$_+R?:oҹȿ[VY=6wmҾ6Qc$|ֹо쟮1QqD2jos"z٠Sg M'k OޤD ̵$lp\or)a6oZf7P$eP.ynBoS"up)42S О+Rw[{ޥ,჋%qlVp/B4DT_5xCyWg]O!0KʋKb͹ƤmorCO*\c &}= Z7bzTڤT87_ʣh a򂶱Z\{\֥JGԲp*%\vh"UmjOI mjt!l%WeDL5,G`c4^F5.QV{7rG'S;<&7BZX<07Jp9TBie MMb*XR^$@iB3)ݯڌȖ{ĖBY㲐(ѻRQeԑMk|kOavpZޤ 5z-˽1 &]W"j2x R ~ěs֨D+=(j%f,1xkE_f u'ܛ/Z$:q9Vwǯo:f*~( Ankұ'+G@\8\\QqL\nl7s[mC+o޸؂~ηƸ'j7fkcP7[X+˗~T2I2ïQg')H"Xb~>j<=Z:&Ѧ+M:bi$G%IpUZ#K;jS XWYvuJ[eHzzIKLzv[H#~aqz1I/fWdIA$]QC3әVV, Zӣ>ޑu2q岅i OQGR$ ~Ζ)5HXKwfȒ#c?zW,|4DMx|"sbj4QSQ22;nkJ7;R]k\-j]lMN q֌ [{֢G4"<0?i$wyBs7Jm/qNr-Z<'GLnǽhYS=)c70#rvGIvn2:mʭ>!^Q~l!.4jYr}j1Fl$E>Xٱl߮ըCnPtɺ.43t\+c;mTB#?:d=D:5[xڗO 8Ze&-۷2fCs~kMzu.r4"p-c- LqF=7Dr[vX.iŮV@&/QfCaEI8c~Җ.l1˵D݂j#+zRIj4<1ޢ=+1?{:v6{&T$×iDʗ #jI2Q fz{]ndhOps$t=80q}KxtIYX$PJ;Q5bJBKIэ-sz$3MT-+/\*2idj#SeNɍz\hٹڧU'ĭFIPqt ihs-ٽ+Pj>EZ*.,) L8Ne%Kbhcr6fZQզ10bHHعa YFxX5O+a(:)i}FtÇ{}X3 JcK)K?EzuQJ8ar޴tNbz ix-\:Q2&b_mi4'6,m:iYF\-<s;}AT،xf:)P+ 2p77oO=(ujT;tz,{)u*8.">Uƅ?msy~W_mM, E,?]kuxwY47J$$I(Ne5&OOzXg6tƟë/S1Gҧ$kP}{S@˧n*ڵ ag[D ӂE`o0ض-^_KgGQf(ŸP1';\T=,=JGqwSIZ6Ի#.~ęʵozyUC8}D(ǐ'/ljfbʸRyUpu<YTu2bſRo*䝀 F>1 ߦ>yK T8 wY|01wcj+f/QFrq',r_¸2jb}vfɘl;RA$ 9ZĈS k[Rɧ ϑM*%]FV_:ýHqla\p2\v_-86d>ڥMB7JkEOMSBI+ְX\ˏ/s8tz-kb5= ^%1&ZZABP$Q}k67$JwX4$h Pmo_QVBݭF|?n?`cUMӹ6qZqRnHٷ|%rT>G8]:zH\v)R^Sa֤G.< f *Mh޸/ fyVEٽjI˂XL]zC[4F^zv^o{`ǵ~j."]t̯QNy30S#`ie}Jaԩg(D.JYZR%hYQ)!\jXd#iL(󠗛qeM/ymC\?N%~ßmBqq =lۦSjY;',b[pqbZ:(ecE2F`1#s~b`E֛ ~2-m"}T5<!.؃ 0ʡ7_z'xb;z֗ɟr x7:bl9j>o;Пbrʢ"nbj!?*_"A}KȮ\i4niIyWdO.)ڠ0\5M0HXK<cRC#|bȊTR ͬ8W.z) ?:XARqYʣica{2԰f4YaRg*I,o:fbxFƔ#qA,ߗjHIfG7gKgm"dzoJ8\oL˖gsz 6̙9]XΧRe!NkqHE̓FoK+%koڵ2Wk!k0^U:mM*FIxm{VWQ|s07oZ\E!ҠXt S1of_DlңĤU'(OfD-VoͫTPlM[B~+QELMSElRބFlAkFצKGs`ֽݨHozZ|ku+"{$hYl8tpJ}:!9` cާb<]#*u7dc^mr0򦗋I8kpB.tq"ǾI VrP۳(zhx˔ EVF 'γ}:9 ZWe3FzRi˄=s O)V`l< B% ;RiHҴ\@XRuHIWcPHxc)Qi1Edj7_az3"$Y&c+WwVSniPnmR1n}!"G 5ݖo(+SH$f` 4x;2e$rqG 5 Q1+oFyqTE(_ҹ8nljèD6?AM18ZTZFej?4!JZv[,l5qzs,u/ ժtj*k4n IX15gk\j9EŒWnTǨA%M\h07qN [`jGx9S9Pťai+O4ŭd_;+tgD>*6bK^~ʁ{9GkN)#I7 ھ# z(@F@.ԉHG0wpyKįoz:2I-)“~m,FU. j#xx>g:wg|"IݭS@ jOS!F+H֧HYu27pd(AC"?.ʑڗLn9zYϥ;N5A|kc/?MvtY$IזLY[-ngvq8Җ(Hy5f nmY6{ߥ6!r<>=Dq+lAa7n'z5+;c~AQ/}bvRMqp8%D/lo33Y/37zO/ !G}8PlmZr/).*6pQp1aSM1 qGZX&*CZ޿iY"ݔvF Jx>o:EKN*|NG{1v- X^HUVPɉ!".v),f2֣HAHqBm$ʙ1bkޣ˦Aj5m\"0~aE7qA# R2Qg;/6yR%RFlۈݶ*m):j1cRVMDVLf ,24f&SU[ΕtF]jdvE1ݪU<_34r6M$xbc1Z!1ƭ!\gކy΄E* Ϫmo*X8nn'?N*dΎc!Q#aSjဏ}OZ}O*. bUCH+?:)<z6,ٍŅjlzqe\/[֖AroQ)mǕ Qg4Zs r{`j1mQNf@%Td],7.D QZqF6[ h|,vcS?{I.vR"|ފM#Y\.؜+}emSq N$2ЊGGK؍rڠC:acZgG25NqPŶjA KxɷPE!PMe|܊#b!'4"E̦9ef]W Y^|\񫋯 x' B/ypA U4pn<,)u*`Wk8.EE21Rǧ4lqM;-,/+U#YpGG4@oRK,߉ɱe}7$H3bK"避JN !Q&uKԲ\_wKmX?3F3_B KClyQ:^ j\\woΣQԮܻ+%=Ôy^wk,dX|O;ކNN,K֏NQ^ʪIL<}4su e{^ԐQ .j=T2:,$E-Pi~ JI}z9eN^ kZO NZ%QPTzX4Dqkz7W˜ZG\{\EYp#J;ږ m,MpNJWK4}<ڛZ D Ϩn]ޙq y.1E*U뽩p-ڱHyR{[AC$HٮKwiI4iUTF}`AhBe(#MiEjx5&m*I^>yQ{PE"=="2:sj#!^3eU067&th۝5d͇ըF;i1yFȲx, $oK((Y=EwXHl߷Bq84m07+F]=<"`o`׵,qVu%[SN-G"$udAlWU.v5 O*JvGt4.wlnt΋|׷zR.mLH~Qɬ`z51HCRJEvRiR-+&V#T̶c/;Ӑ)c\u,N#*}29 czBٵw4ʙ:BDfzGCa֥(HՏl6&o R?An6Lk(4Dk,vچV0lߥ WI5#^O,Pq16ߔԓ.Y(-CIo4Vҙ"V}}%e˧qcUIU=|ifǟ:E*`FN*QlMF`Ox.եYN$Ň5R8ԓڸe+F?GRb^ޕіA%}|C/zY"A2[zIo֛k9T)^gHn{NH`( o/Φy7LătZfYJ<4YomzR #ה~Ub_ S"s$d}dmzM٭o3 JV66ڬ?jT{VR 5=*EYGjPc`h8Q!oaoCn; tXpxmu?9MTf e|^'1kQ%m5c!lF#HYP=,y7nEX^^^ֈ?6cQX Xm֛M<{b*b;hBNچJo*8J(c5ß@LG n$!lEZ.jO$oԱzbA498"10 {K@]m\YNId*:^VйKmGj4@~>*8\%,[R|JA_-7ܱR;$GяS-? ŭE{ >|;XIkn5#4p\X?&w'ʦ}Cig}_jurճj'PQ ܌j)dCbE+2cp{&K/p 6qڴ :yEp/ڵ|)T<Д*C90=CH 0A$rċlkQ"sJNK]ۡ&F(vn2/QMv/O*mHo,TzR r*ƌ$H=)Xp z*aK2yWhvFL%4Lֺj ڸǵJc(SIpcuޓwXfAP50ViO $p9reNp",I*V ._G+Gl:ˏLRт̲'ڦHI${dTnCKKʃn$K-%QN@9oΌJ wE~-DMwy8t74˩Rz;tăC9zWS΂>ݷNoe-e UPr$t5FY1ڲh$X(֛sxtJרQ߁{ӳJP7NQU~ucvTx?`j+#,9҉uUX2߮j:^?Zu}9!F0cjyBqYD\ԜÁ0 ?,S*,26 qSu1!kPho`OO*H'ڤȌ9T,-m>Jӯ&ڣwSC0cj 'קڦU2co-ݬ|Jܩx#feoN*i8d>7T@4h㕶&I[ŇPi$pGFi%9XRjڧ=zUxڊ IbJNoJJc|^9:6t"6'ǖYD'J 'sS<αTƹ%>mIԾWћmB aςpM6`VZÌ&ʤ 1QA2HEjQt٣E)$Śy}tqj๯vgC-s$P{Q g׈֨]H"Êw$g:*e8z^kp^EC# O8-mښC ۥnlMޣoZFBէv#H wdž1ޕBKlJ.kOUg֛MaDa7G0ܓ{Z)"uK#},XTi(^֣dx#9YM7_$BQG|{*[^* 4L.Qj!&?g|Aݒ֢bɎױvQwc% 7QDb4WO,+-WFgvڟTxMjI_ޢtU#p6R$_Ҵ%U&(8|'DwNJf֣N3#Iyw 7M yj8|cҐL$%U{*n[2 P".ǙxB1`*ڥU]<Edm@dVK8ZG*h%f="oGG`GCo*|6۽8Y|Tl7C|K-҈(Nb_o[Sm>v}-pq][v$۰Ӧ!S^=#{j5B p4<[JO$jQqGplΠ,˿&+zP_(}E dmG(c7A1z qzN^E5 c|hsQ55Ͻ,qrq*ue#陴eoB"{Df "":.7/PiR$75e#.;M6bnO:rA|ֵ$vTm|Bh|< wO& k ǟj@@#R&>~|"7% .2x4, ٪6oczg>$f俟ڱ*Jm޵Z|ށ*z 3T\ZƎ Jokm>tp64t_H~iwNyTYĸmG$|k#0߰v8ޯӪa뷩~brR#ci/u.]RX][5,GL&1ľ^$A@ҡ8Y>޾U2EDm^3's7ZR- ɔmJ#ڴj""_jsUd>\/n,P`9e\m& :d'c~#Hܧi/M_=JڄB,{yNnZzoY;ְi:Ce_ؐ7Tň[Q(12F]0<'m_,St4 ґoxT.д4t'ޞ-TV25 2$ԚyVHlo*5Gs 'uU5"]ڴ3l@5u?F=gxi$N-K%)_Z+Gu_; x}о.Uo:`@FW"mn>.h&!!0ٶĵ.EK X%>6W.*G+yȪ]|LnQyo* CXiqt6n`lj!)8(@~JJG-߽;H1`6[tXK Y: tӷ; cP AʢYMozaRݩg* N`"S8 }h|Q$L s4BۨH_V(DE^+km"ESͧHbfņ{ڑfǺ+Kn ljr QEr>iLd=*|xl׽.U#ıԚgGd#ƾ&>`9oDlmчZ:Y#S `̯MŪk\饍nߵN.+~ݶ#VW}U` 3]<$ۜ|?ޥ [z,ÁZmB$cKZƧD:T49_sz$:;}(h,(d0$j}F c~1þצ}$8z2<oj"WWNŏ7p"ebVᨾ&(U;A>! MB3zDp#gwRNo#:?A&+Ks5MH'[6zMHzֿ"2Cj;Hv5ߚ1*qcfjh$ᮡzzRq`V' ~4BW%#?Q{cXD?VN8ىk^.CeZTBȶ lޓ+/|MC4yr>zMIbW4,!g -t.v'skډ{ޒ_'-5 (o-P bh(< mGJm9* {Rg5qr okw@.Z2%@ˍE;#?p]n \}2>xYwmUߋ6"Ȝ !I&K[JME7pa|d~t.Aoz2z:OL^7qU8}qvVLk€NV}i`*nzS~ZhصFUcrmaw[8@U02oO 6 n=*b!lzm\f"] f@0GC_&XYRZWFup(#z(r~\oJ4 Дi)ߥkpt NM`)"EP݅ȭDQq[u3Jޤ$K1?zCڙ K4f<܄(Ԋ$K?HNf;5fjhc_֠Mjt@eV|2ԋUIl֚=BW2CZccQbF-֧I& xTpSY ɦb/--Qj9wnQ]榙#B~jY<OB(q~> 7ތdT/d\1$F5P` Fm*$aHeK KN)b.mZg*Hp@rxt 3׫|ͪ+[(So!PB"[{Ԝ2p̽:[zcl7Z[\ wRGO[$7iFJє#LdXb0"Œoz֥\Qic9JMf#O;s/=2//Қ9>CҙK_* P6Zu G 02nQ4^0zۇy˛Ăy?jÄD~t4\ O@Ģ^t~ Ҥer Ip .%k5رEplaJRbC5޸GZ=r~Ɇv.)p75#$lHʶtxiqz҈i? FB\g5k /0ڠ:N3FRDqRXKQK$*rJ9ϕTRO@{.n'( v'oJB]~Ƹ:C*׶ԒI"%S6ٸwTb ̱*"L;aorQG_<ih Kew$%N m:HBذt 7JXi?[4['6|1]3#F68M6bE|j̛|mz 7!z:c(# q̑ҡM>du .X.ClTjPz޵FX@W긫<&,巙]mv?ҷ|UP/k:~\uh*.€V^n$1R㚖50nd+Nc~n䎆SOZ7Sfi/&M)#'@q W XpN|TrclNI64R+/N1bln buu.QĎC&O 9$\r5q~FjGRzd@~_zD୔dw#ֳ~uoL*8[N1XmRL>Z -1S~)8;hjug7g19eҸ/֢Uí&wLJG Wʸ+P޸/sÌ3ǧ_/:__ O}42@ڣhU ڡ+vʷ`~R7jv4B\Kެq5IsHo`2qADޢ+yM& 7?8Z;H>-jHuad]AI>ѪɟsG哟\nkJx˩I5 ނ"#vƢ2 :ckcc{Hp7;-ˈ֞tXLyѹ50VKڦ*+_&p) qn,*k12G/ڥCyۛzk8aS>t4d杖"?Mj-*{KEkb*=d<,"֥/ZE(qkZJΤ?0Xw\+I@Y$yhhivhڃ+]2&b棝 UP:d˾ Xg ޤmU`j//pފ!,j, ܟj* efn/nN[ͨgT JIp;ŸQ>J!{Tǐʤ9z`:Ji GxKx~ӡUdyi46EPz"B}]<$>!C[oaSp]_TNrb{tLU7ʱӫ)8 Q6Wŀڵ]an?b\vt'H$yVMfE{T |5 w+C;V֯jxu4&jRKx5*mS:uVC9`v}oZՠ9S i8wylStG |4#mZTP3AS܌Yugm,,w-o*B8YY- "Pˋ֣:eDu#{R/MݯBF> P\rIZ[D,AǭCC=kS:+ vƣyn/IPx6DZ5 ῟Kcˉ#u jWųE/BURla [u3jBn q\jiARj Vpq?ֲlqŔ:kK{֤`|R4qoVw5z^kT;X6pzRW-T<l(A6O4 .r2, V ICfk1浩1% zX Zh~7.4y>w!/,nU`_nkɸ ]PEF^.@\iu[{z^b d$/*c̀٬ uMHLxkÔ%$<H̜,Enia)dGAi#6Ytnl–x[By{e_*n|JKj&UbcZi v\v^&gn[Gbްi'OZ/ [n)7,zWiw^{BG£W{0j8bć݉4N yO+U/ yn") wA&̄p վpV6PXq/J!搪y߯JHK݇G iw]4 |`ϭ χ.]0ڡ=e=/R1Z_Tݭ4K)K܂l 6ƭk}B- 2,7TrHSicY2{JEѲYF=Gތh=*Ț{bSC.T89I2uPBN:TIڠ e{yM M:-ojDH\G\צHvOnZhɒUƥ˪쾵6G/~j|=9#b w{=mBoǠ.T\rzT */C҄Mm{US"EDb\-ƦKNsD$z04cl :c,#̵#Lͨס b>Uo:m( ep6Sn{پu9-b7ZjYZgqoziCYGK޵* ޸Fʶ4x͔=icX \<6u,ߡbAGJ kT+[T:ȴc{z3i,:E|K/Ƞvھ4G1ߵupj7ޟU:ZX¤w;gRhg w"dž6IhxyԏXP*|j-Gn {Aw\7@i2 F"";GiiZ- +]P,/oʐ1q7GnǽS1sԼ %pEi(Ȏ-J!-.r) "b޻Ԛt-p[ q4ičvV[?{2cqڍSmwGXRY5I*GAq>*{FmCj/EkHfSKԚԑ ?ͬSM Y_*de̙Q~9Chn6Ɩ3E>[ï֮\L&WB.?6QNƌ8yVR ݶ#ʥT֧Ep* #z3MPN92clZq@P.6YTsSGQ9w,cAQSɮnoP 7l"f6\N>?E .{-DuK0Կ(kĿT##̾e)HEnfv=S&p؁~h:K\yoˍG K'1߭p 7P°čsw+ZTxź/M#%ĂaPfR䶸<]@j9b6GŸ;'nGzS%&F*I|AsZKB3lsIŒyqpGAc+K1Y_ñ4tB7 6nk^d@zfn7ϖHOcj5m F[~ 3ۆ2 "]KsB ; ʓ;97%[5ԏ/JDۖMzx8QO N,X/?j/XRE0[j.{Ҭ^+޵1QrkaA_I1^8:~⿈A5jN]1f@7VtS"A{ڎysRA'^&iT=y|N in7];<~XU𨥶+zC5!Vy`"k6=XdYoS΁{juqEt/SEd>^?*mfKWPI^@vڢU92 mmxc)!<ڴMGξ&Po$rOp $2Ejgn[JlGkTs+dP00/kmP!I#Ll¢AıhȊű'Kܨ8A*,l|tP˶VrN!\Hl|7/æ73eW&d-Z~&>,.$' eb#Sݿm^! u&T'`w>Um?C*#d6ȪIq}c: c\cmPtv{a=z;E]hXHNuOjUd˛gӶ׿/2T7k-OW3heʃcS<7 #en!s5`HZQ4Y JGc wK.Q"#,ӻ?3,-W̔0./zgta\~(N#VP[;mFicU aҢ}Dr_6k{VDrJHB35]讧Pt%NS"aSA[ө2 5 Ä#͸w޵Nxn_%6>t=pe |ێzjYTݔ~g$k̒?hjdLW.Q߯Zi$TuFr/:]Cosjitp+*`|@yq_VM nՖ偺D/Xdw' gd# Pnq^ER$"42rۛTjeWwk>fU~7!p{PIͣ9d(t75JEʭN#}1 dQyTZߧR@۸5iOMw^`"-ZĚ}Rrά_/ZC+*qaD7JSzmYÄm\Į[ߵK ,oU})[U/QK!Bߩ sſյ)NUڢ~a`uR\ZF^$aǥirDs+u$S3+e[ʞIlᐭjЮ0uo֌Gs/9 Q8%hZ|`Iqh8zf0:IY,,з(!޽kW T6brI3j "kW+;z8־T!eRfJZME{OM)#n;mQ"yKS4AU[nhI{-uY9K,z~*D@#W3rZlU >E-HO\TѴ?|Lgot^0M8-솏NS"|Dw4N2i%⨇FW޾/xT\hJ Ĝ۵fl$7eN֯@c|GZAOv|eq+ck{*,l֦Vmj/lډs͗(q!6%x-w8Wo rӬzP>&FzF=B3 lXߧy.2їM"ȗ54x1B"A_Bnxnє:2-nE{'"TD6i1P:V[XҖY ዂ;jṊ1^lj&bކ۝|iG QڎidAT,*ÅrqzOK2 ۥVV)&v@ 'u"$۟_I$*8 \֩P>\5$mΖ$xh/J}鴨] ʗ~|5IeWƁFqv=ZǧLZ`a +ysr܊ 6mB2^yoG[q6ޤk<&̲GrsRϔ+~m4qpMj5'޵+uYT=1;-iF9,[|4"(-/ݾ:0oѯ@Mc:M(QE:YGsflw2^51Bý,lOA&Km޵_fGZ!zV[#TlWY\T@.Wʮۉfүܬw-GniR{qrڕ&Ҝcܮ[ަByDIdnhن_G#IڡXZ]]︩i~~\F)])Ƿ+⤉O0ٖF^WAƂHŕ74-,P1OJϧnsqRfu*3$F%jh$[DQ&ڴ٤ejDҗ@ɐ,-ʤXOZ? V& ?+jZAcA8#᥁Ez֠KLY|0~!D<&m^q4xr 6,AKhgCsNݯhw``Lv/C3M*ƫQfW#sj= s[z2ºP:T -˥G!F2,joFeսھ",Gʣw(oCQJnI<:DH6nޕn0,:PHUuL6 ! G2-IWjSupJԬixR)=-MxO +Ps9m -Egޚhg{Ө4X/X,h𚆆ܤ ?q6 KqiI%ڄ. ;RCB%W =mB e=;C~:D4oj[iIiONjuIYgލ&[X1FF7sOm>r=۟J@JύRJN{]b3d!Ag9(a2FYޞx?I,QIm|^VIn}~(Y.q_JKȫ}w411Wcvʠ5G).V"8`:TR 0d԰El[а'թW8OzVr+sI kW ^5Q.\ZJQ六P[}R('n\L66<y7MH7,E(Oȵw'Ϟ} =@6Vޡ c B#`Z4!rxQQɢ9Ly Nʨ7ږed\v-}*HG:QԬv;mPB[A+}BmIMSljX[G~_$QPfP,Kiɀ^gf\v_R'#jS){it>O~aFQ50Ժyv&=s~1/?2VHEǡqc뽼TE<ݣNaDB) <T`7;^LZõI ^$t^RG&dzxd+SK.jgԓyź5nըNsJvaZ:#Ģb/O*>"Hv~FX|rw$qڦbpoF4l͟2OA{NUȝ m3DkI%ܥw+1#t/zTlIsgҝBoqC,<ߘޣxUK?:Dh;VIbeHv#mŪxV7ZΕ2wHW.֣*ۥ|tܑpډ&YUFduL%i&:ߵ^LB-==k\ziOٮےg.)vXhddoz*2R,(ZH6Q"rxU/\8xc8$ ް<{V1UkV'P$k$6/fjW^ 98ڧe=z, )DlI ok^*wc{߭<w&{ZA`/ñ<֠o2۵&\E 5oR堍h5ռ7"Fڭ$+&{&5{R R*cs׶(I /Ñ(U>^wn{{TTrd"Hzєd!;OO1 4hhq4g|/ p{TX`b$6S0m?[!a}jےwȲxoMg/~RV^ 7R_*%cRkW/\U;ZԬfPZH#*K2E)$[e$%ґhV+S?2ҞFSCKը K;/Ky39M )r?,xpڈb!kw;ssGխSvC,1fsMwٺ\B9,X|SO* Y¡SxK޾ p?߇ujlzQ4 vONjqL!+}ϭeWX6~d.@}VQw'JJ4G[Ժ=p$$$&T0v|TJOjJFqR@rؚU)enR"&20QV,R[߭E #˷J<j|B92_E]ڂ K:iZx%ۘmKK 6Ev&ըDqfrUڴ:xFD#}WB.6\TA[#֦3;goH,l69˃ 29Io:"RB5L8&ф[PW{TH!si$ғTnbc lM<cPpx2h a7:'N &XDQYa^d<^Pvn'(ـ6YË(I{%w`@~b> ߁󍗟yv=OޫerNGr4DEwʠSZoy/;wo"̕<̒UM Rp@%VTU ! Gc$# "G6MNXoeD>seJ-zm6d:Nb+XUD-!"Nvwm5̚dMaʼ3L<3yM8wԸ0k>sľ)9-pUƓLx'k9<3%(M8bl$HdL6 ,a3/"X6>Hє URTzjE{4%q)D^\K fѓ"h 7J$(e؛f[kWie<9ÊHx0nmj7FKB D笒_$XʚoNexk4F&.˹Hq+.X%FxRfE=`:m6J[5-}k%ܭrbUYib*cCbI2M EM?ђ [ |X5愩zH T(9˦l[gxWHbp"9 V2xG@G7z P6|dȑ笹ل!$wjwmTx/'b?NZBʵdywr"_ϦG'i5 &LqNP+ &"V0G&+ޚ0^Ed$iTIiJ~O*);{z*Aj?SqimF<)ISq@Fw#^ȮxD2'OA2)+Yo?.4JdrqF@Qgh: hyaG7A5K\n-a Ld Fɮ:EՖ'z}Kuxj8T<;e|8W5};LU3"]?IX_Yo؄T&JMo/\YLTCB(Š;(fuBִ)w{e4! x[.\>!ۣ?ZUTby#PNֲ*R #t wbV~!Re$^JORpk8qfx]>7j=ya& i>8P$%>&pMt z.q>[I? "kdc -dxP|`Ы=˯ *a ZaԚ}FLf84OQL.:2*3&A( d_/Q36Zut ^wQ洘v#MF^"*<1J5!NfV/rK!)\hi&$&A\ ͕m+Ίj6S<>:⚠qav܄"&xז 1d 8/iaō4S}bTᓲ/}y"NDLѼ"mFHYX#~D.L#q"@&HtJ[K SHf1EN|h18bp8Vw'y!:q'21T)Cj1kQs~$,kp†zd\̏/8"Ac# s:/ ܥe־uXDEA2ERH B#9I&^j5F( !-EH!߹$:O#}'U[ k?80tlx̃հEԫ%nvw2y 5{u¯ۼRu`lt=wFdYwYxY댘%fd;:K2ҒIKp[j=RYYJcO=*88DJ"#bvǼ)QҦ|8d`XW5Z"qR0\ Mٖ(P:1[nptH S)E6LxLA,qMdhW1\Aq%:xˠau]ѱč[cy=BF%k1B y)r/K"e6z2RSqn~2أ W^4r*Ǽ\u;&rB-0JCA RG Ls#^9>o.Z`6|#M%7_t;[Xqߙ˺+YO6ŐޣEhX(2#8txXm'eYByLK/78ĶfAwkD?K>k%-KG۬0Kx;$[?嘓3Ƙ^ZHN0Q2YxEQ`2Zb7(&QĞxJn d(5ї $l0@rjed;t D"/>1I#X 1ϬAh{fV-Xz;^N:ʃ@1&iF[!Qx΋\?D, `i 2>ADUm^!gewgR,/AB"әR(te嚃"([PA$θw<#$ bL.K 2(wQ&bu/mABN78ԜvLdR+k*x[yJRY5s^Up䟝GS$n b5'5=嘔ޓ QFBڪZsR9` nj R2E24m]X .Isb9lEx.^c=5n,dzɭs?ՎD.:mhҔ5[t%VG`K-?ъ"O iMaRXH\OXӝ`o2zS"#+Pw{*WNB6EHQSHBtsR5@䃕&]p",-oԟ/ybK8D ڞ}NLc*-}43E6yXx%W|BI l# @Bn~ps=.4o#E`LY'qb;F~1v`TQVC>]j\ o 6CYǭO3yWޓ]|ίSj1M]XĘ&]8d!  fԲBΧO~ bYkA0h<6܍`nyq ^գMK!꽱._pȨ`uUԃEkVI!XXTT` `a.?ӄ7A%.a3!Jw22<±u;O(Ӓ) ÌAQ܆M?qDq7-hwW @7{$ FkNM5qFɐN0%my97xIekqJG,- LU:QgxLT'Yxp`Gr)+ xeMZX?KJ1yy1U鼋Q7x/$+όK%3?!?b{ 2E8>qxP(AgF t3}ȹ-@3!)P qjlt džE#c2g(7xcZOO=J>`e0L)SДru'G%1]fs9:23^j&!WcX0| &]qŮ)R)T78i]n ( {pQ>ekqJQE&w. k$|fzuo!I;na޿42W2%SGt^~ $oՄ.0.DUdAu6Ql@r&. rYcS+5k9Dy  >ETd(es81{~q. ~2bL5e#Wל /t~0X@4-CpF&4;$PZ%G5 )[QwsS㬌Is<[gYLzqB© ;5b#cL`LqXl\amPxÓ(1:M]p=e'04' `N^0Mq,MEnútn3^8 ^~1_YHԙބkhʪ뛉qCǦS6`B" fha?R2A1ISs,@ʫbrAUbyA+!#D`"X<+_U\3OS!󬍣=0-C&i r2?to $D J4.52HY$~0 )4r|LFmEВJsY$j5&[T|z{Q3 W RkJ#Mrþ(u&rqIϜZ{_Bb"HxrCDx|Ƶ>.D[xp\4-u xAgI($r#8u:+6(s ^D"VDg(ݢ:5q )!ل(yro$K,SXt _jk 6xjW4KfجP# RR2t5e4D -;@rmIe\v _ȝa'j]( 19.KxS]`ֿ_Z[oT:ET_y Ĉ{R4nS!M' ӎKW.)r)TxǙj+dk-b[K}0 spe>|pwЍ+x{Z8y² #Q9Q]sC^g;q#$$B(y4:<<0QϷT:i3n8d׽"ɪ`DبjKZdF=Ix/$:?D-0D P t~ܒQ&kלOpZ7=G^kS)`hzu]q}B c!*ڛBɨIGMD jwS:P҉MJFUnmb13p'{1)kS 3{&}a u#P6Gn5r@?!ߙ%"Dzq`Ę19r8(Zdyq!5qþOP7p S3sVx2ZFWBy%|$GD)*LX;=Va˼S-wy?:|D-dX2B }aACb:`yk02 9(jpuGXPw.0T[Sj<+Evy0p1m,; o'ڦ\ H I!Z_2B2*$;XƄ ۈoH]x#9a-F ^N.yYĭ T;q?~szV^=upHy1,O LR|1r -B hkv+1O3m.׼bm~cb<*zEN,̓Y^Iw#> $ouZQH7 OJRFuQ|6Jz^-GaaF$ !p7` cRqxYnuy$[]Wk[02(5Ek DWw[o 79+;㸃zHUƲ8{ up8c+0wSBP eBY:G05:HqRK߼ad|d "I 'ZT R+æӈ$ū5M#2 Z(|V&ӭeg}Kx=%QK#quF3C/)B3[͎b*g$ rN5Lo/H2OQzCb3n/)a=_Xz H #D&9< alG[fƊyD#[D#46pO_Ftw@ٝ{28XZyŒ3q pT"m:D.t+fI !# Z7'<o&B1 *aSd6'@2ܜz(aVP;Ez00;`3[j'x#M,FܰN NDa%)p9(#Ӿ ,}>dky2=^Oanp#<{Sy"_3 ! Pw!T8Wm<š#2bs@ }1:p`4p?lWT-kx75!'3]$^]VM /!ҥ`]#eޚFSJ4^̜8R#nFO>}|op# Ù4 Gjn߼Ì]\~\'CZ_2L:wB d9=>b-\t8GIJ@[OWܟ(f@ O>\1)A#yT*)L \b!FG a0za]{xp+%0e cSF_|<cf-2R/@ uzYD(j1Yi.' 04`Qf{Ri0f:l_4!ȯ~[;j^78XDj+ ;|d@W pbz3$(RAfݘ{uT&+#UXG4MbUYONɄxCd5J 51@KGav2CMkx[] ۖa@\-QV_j)N5*eZaecѨK!YWYmCw󒚭/6:eBV#P(d@1 IJV²Y߶ Z55ToBVF4$pGR"--kY͕"+"xN- 5Me<yMfWn9JXtF n" W gy=7J`|1;F'Tdl v|fHBST#Bv 9\37|`QCh pUqlXRh۶/;ADWX.c RGx0XntۋX@#*€8k7XrSIOإ )0gi?Czƨ,k"$}x✭~ z`cX($c[JQ&40c.MN%WbrP:<#3g(χ?WbMFYK!.iM]e2AMM-LY!wy L"ՂIaIQJ/. tkŻ(C"?+VE@Qevx2C=<1HEu,[K5U+[{**fܠC=T9CTcx4ĸNŽ &ݵ8ǞHjq`"qN.H33â<~w(-(V1l!'zyɒ)7k`R0 ~XFEJaw<`"4JHb6 C]MVDF.`zퟜzSy VL6N˴= j&g⮍V3Uթ'E9Ndk[q\4KpsWv'߼4RDbU%. kX5/ 5x6C@ ѵ!{/XjHg&7xd%]p`hi?Xqوx8-&x&Jk Ee 7%Qi1'eQ-s[q_A[C3F0Ry4jd;1Zy8ґ|1, ]+%dAFl DόOÈA5>>9ͿW_p qI󌉩`8k Ub{.9yi%G~1%Ν$&nȓ,X@:f ˜7~iew˚z,d (>=q`1f8+x108}`ɡd{y [,X,8y+A  t:EHt)jp(VtBWs")GPk/H@$|Ee,Lb]x%9GS+48kY( -G% 'XhGdtJe&a/;y՝ b&rX][+8 916Gy6u!EwϜߌs^H1.7$&}f!Ƀs5ư0yf [+SEm$vlG%qd? 'Uw4b p#UlM8T.o*1oŸqœ^]+m\9]@TRSC=sQ(Zg#YG|KV Gj2at,o'IQߚ0I =ǜ%ʓ" YCSIm{cz_ ^I^j0E%D܄NXA¤„`Bђ%2gޤ㷜m 8b*Hƾh lQd&,SSPIZ'&0i{KK`JsN1[HY3UOud]-O)T 1[F/R9܅it`;h_r`o9 GS0JS?s [?UmЉd1sL4Zs" h`Md#K=lƛ%rc"K$J )Nư=Q9'E/x{A4=M"<88-p>rTj^HD!Osۼ gሪȧF0{jgs"Yz⼧Nd(^JDT-˥1>,xJ2BM$>D0~UǬR+qY-yI]N'÷SVv]>gfEƴ=ɝ|E_&vb'k @4[%^ctlPb09T]1Vb{-FbL"pI0 udKky!03Z,{+Ycz+np&'ߠ#9!8e<>He$5!Fq=ġˉq /E r+!-}òa:#c*9AF"u @*6ٲ@GND1Q)!pGI|ce h9m(7i! vFE.8، 94qY+$6X 닖XbX=َ(d|s0! bY(xt`>qf$0tkȐ{BRo,y]@?,QFMp {D{Y/|`P9diڤm` _Ant 1c&GD41yM:"ycӈdh)RdD^gNX?x@^dO ɯ/t:64A-v;M""V [q2y'2H{N@Շpb<{ϜdHDy/D'TI r!TF;~4&1,`|hLBxW<ѥ D#\'97Jklx 69Den u:_*~G TX1kbCrԄ+=-UD!˱LGr6 9Q0i=#wFEOy´ȟu€)81Lylpaîc 076<|ay"*S/ [Q=H-5>rfww]ynYf<7Ƃ(%~Yd&)zȄ(9vVB4G7j\Td&N# pakyF<2Q`=1XƴtnUFr`_c4qqT +0 hH HbK@pn*<x&/1'(Ӫ@'ujhU`mUDNS$E/a{0F4oh/t U.1]ckd;LMɴ_>~0Ȕt]w1^3Rjq @ہ5O2MH/ө'іKup6ל]U&B- 8):-dqՕ+#wp]`ѯ@\*σ!P;.ûIR)qƂXF8GOT!~~p, GټV'VP"0QbI/N.Ս{ؘvEF^j #;G &S>2[B8t;DBwh& ExyIN|<piYW%~.1 j2j(MϏ8J*n'H̓k Q<, m0@t9C)l @MX%'(yYwB(<:TFr_,ݬkל*Yoxnw)*}O[$'?q٧_Ihtl4#`O+RBg PNkQ𹻱LJ][űCwwl-(]2K?82hZ|F' U#,uE0792f-`4Dn4&( i2g9Z%!IO>c& I|Mz)mo9bbÌ=h:!&_p/(o)Q;cJJ\I{,069kL(@R=wrFۃ*B`5|cM 94Ets {l"v;M=Vbz5U̪'#{q0K~8`%>2N-MI YM4S5)|9 3Q֓<: $Oq]dڔjN q `(F4#V@~P}`_Rq#y’N0JPLL.3cW "*a)֋yo"6jwaqF b7pshCŕlNlPf ]S?@=;ų&u(&t6k+ _H"##=vJ0!i[XȂN9c.lwoABX/F&"jy Ify %5yV1U8GpjV \8#0;w78/Mh^^'wʲM!>”"IIL>?ܝS^) R܈( 1f g_xZ?<0 Lސ t#ҳBߙ,`hY0 9efN^)V G1T.Aq[(FL 1p,%$@K#cB OX|A7+h*NqSh_G1X&7, 6F6 `5LTD[Q.q)> "6I8qmFЂ% [V]#e /RdqK48BLlxpzb%1 `{I LX50q1EGጟ8p6}bΈ^8x+ro68k rsC3wDd$ ?U9m[""*AHV4`hR #f5:AwSup{O02²$$bIe^{)-%2ra|/y3jquw@ɻUS3UO%+7uz﭂ۚhxvd+}u-W9VyHV96]}FJ+mekXQ^$S90xک+xf\ MUn5a }[qHtJOg?:ND˅A{&! "<`3Jt/9a%^^*Ѣ0B,>P'9I9t]H>g/ H.bJ18PIFO䗠V7pY K~S2~\L0y_5&_K-{O'kv@$2L$ɨL~rahOG %Qc5ۛruVqMRN""ip!A,)šc cfW|і0+87(! /!3F--cEӎ 1SE8ee}w1 OTA,5^qÔa5dM9B K6>FO&ל#+x(^LjAdU ng&jL&3jd'^e&Oi#s3k70#'&+ 5cRo-kz$|9nTmr&@Mim2ZwϹ~3!cr@"da.1 ad%8HQ#!8`w)-0Fօld#43#s?{pnML|upA>>1#xxL%wVo9 h91NX}Aå䬓yϢYQ{#(cd%˯i*B\&a4(OfFL" xXau`u`QwQ?98J]bNf* ^/2Q\b"XC,:1Vk9q:>'eM(jqإS'qX%aQ5kA7XrAZd$HC@,P󼭻P5p M_.:"Z2WM׌l7Act9%Jf5F%ʲNt?P5$\"9MklABn˶>K1A7TO6xq7w%hyvwZ8sC>m4UHK<Ţ^!ƻf)f5 iK/mΉ2j1hg$pԦ`46%{4t!]0G`^nFǞ3Gy.>1*U֒*GA;.Q0'Y!FŐOX#Q'HJwn@ h1sd-h D՟OXLAKduDk6>R~ ݈2yuBM8_UerʨG>̜v@F5,+BjEQ)FkAF:›}RFQ% SL&ͩ!y3e>@^p Ζ1|v"/L!r8xK\ LfU$ ٭O"Q*cԡV/ `(!529XhgӤvf.qc'1rXƴl暖) 8hRߘzfه={xIöݏQ1% {Eqh>K>!5 a38ȷW3hがjm.̼GwGWؚˮ*C; `fAE ޱYG}&@2< !$ÒF/{ote@@þ6 d-:#>HA &# C&t|p右*H2_!.F 29N̛͍2'ֱTbHD 1014QM\j0S&D(Y L )p'y/}5fR/IBjTJv ga . QcfxɇFW$?5 F+/ߖ*Jm7[⭩̲w8k[-Rm8FCf 2 :eO. VتR3s  E{XޜK6A_2e!$bZXvc`ފ5KŌ%8y5<;3 ړ $'At)@{j|8'1xԤbr?x<xoڑ&a "x}=(w>27 a(p#yl(0N0eե.P8@Y$~$ϩ<JƉEk !)H dJ˻0) ;qy0%'Ϝ@ 52 8MR̳4:z `2sܢD!2!EX9q(Ԁa35La[ y&JSL o܊~(R>Xk %m` p N+%M'wFv!0'ɽP+L*ezSRg1r5#ҸPWbmtp9h,e׼tLՈgX RLVcW@EfRK)yw'V"̦faHwTu[rpwl4ngsP@.@?mݷ`2 \%N-hNpptȫM \$UyJ >77#5}9$ x]'*7*镖ILxC}yʣ4)ß"ns^UJslvfP8kxDJj=g;r2auK`@fejjs`1"X)E8ġ8 hH(±5P LrD\{wndv`\;$)3izBb,) Y1.N,-aUD-Í)DkQfbfcY>h Y$ȣRnLb@{3v暝 ϜID .^8ue"CdD{8*_K6MaACE_dTQ(14M"K<2w^a ըK 0 edrv$d>z?>œFgDa'&g6jQpĵ(̃9_ҮG7Uo! 7~Uk(c~NN걸$;J![DIjF+4Ƿ7%֐+ɽ3r7`!` ;bj|`pl?6ɊIg0y>~cX@P)o]@QOkyru*C +0K[;8_5S) /i5f*٪F ͸1Q(A?QJoMcIfh\L(zAPO5Jh9gI&8îhai\9$ Hv.VrHDAsz jMǜW+4s71́4x ʢhU12' }?w_ed}5[MHwo?R77I{i1C8͟)2I5x$n# E"5kGAFjPOѺoX'oqT 7;IK*u,A\ِ73XᐒYg1&p+vI2X`yY2!ZoZ_.3>9}JX8!=2($F lِ^#Ҍ.A*>S& φ@o*,w\b`.0t̄ՕGk'X[imb(eY0" 2|bNnʏoi!36sl|䅺 Hdn}8aD"!l^E@$Jebd{#LfӄSM&ǒ@{""1xz*sch&" gMbwλD#j|dA-˖9Ƌ͒WG`0Qx$:ʱQuGM46QNkQr`hT;u>XzzqB8{aኌN@ !xUfH63r%O `!auĘXuwZfUf1#dI$ *FTV bER!jM5{FV"p{T#IDy<eH 7m "rWIQMnS!NwXfl-`#S8pA q/A2tCknM&HZJNF`sP&rL.p(L/f-(4όVfxͣ8g(%rx0J`*%UXFgb҂(lwfG~W&穣\UwHDlz# Nq5f%S .vj# bQ~MB-GK(IM>~&17U:q,dS60igNlƱmpK^4\#,ԷY8Goze%O 0&6"g8 Y3m"el7LaBJ޳*Zb'[ȶ- ywMy5&0 +U^bk6I"gT.^tZ1' vy[$g9 {Ba:Kg_茑BeyɄL< PE1a=Fu`>ud)!a#.&;A=3PTxMZ}W ܹήk"&nj`qO YEd -"J"!ɒ '"IN#Zh/R`F㏜jO_g9lu=\nHj1a GubOD ڟxzAɎ8Qg<̘.L11c[ ;9hF4$Fe.[ N:DZmA'pؙԄ&l!d]T\cJ3sv*-wx"hȦ(ʐ>:kHSʭ ~#Yɮ^ ebw:&@{ pR ?pmM^#ɞLb`AqhįuxE?1unw[b !u4$]-$p w^g9ɉb(C\hdaDy_V㜞UYP#'b;8?2@*z@d*0o-3.AvJ1HJלAndF .O$eV6'K: e6 7NІ1$E+]wZBY[,횏!*(T}HO?bV N163e(hrMJVpC ѿ*c'{3W-&h 8' A"gOw-rfw=Rތ}b.^ Vi_@w>gtd~&ccjSt,-@!I$Ɏxz?t`>in<G_i|K cQPhx U='*Ē TG ?#o4SQZƞn7dv@RIzM #%B#ABƟ&ЌU!?xd8O/ m1YqEK(#;5๮Nr7Bw\!Si(C-ޓJrWj\ ;IJ#!/`XB4st4t!X&AT)f5sXxd,{0u|??ȊہU:"L|c0i<2ܺ#grFmjP iS&a_?;cY ( 4=2>Dg <Yf@b5?ƒu=I*Js)#$tIwgD?8gֺgiX"ZДk~@yJA/Mu9F݅q~1OP i{ΛM^@I$ӗ YxuH(D%`^C!? 1vpqg 7,{Zx˿0U (;  a;(" d-BL {ԙi'@.fW|񓥹1@^t @DJjx⛦R4$ikႚqdO.H`HgN1'%UG$[4|xÛ)1~oI˕JaW_P'q伳_xaǼΌ16 Vw#DG-o 3+ i8vaP9O5α%vy N$JRɛRTQLpcIgɋڥChۂ8^apU:Çl?PmOh0ujPS 6yem. nidE rssF Lt&㌢N XH@J8>Q-f!-.Sq,?ĵ&u8u~m$|yQ%uy$Jug*2#ɿ"xi9@Jc2YEkOlFq*gsr59+pd>!2M dx Dw CcH*X^T$^弚|Hp+G$_v-Zz]:S;L[v5tcx-y(0ǨWaj0s?8#!gV+ tcXY#gRԃv 1in&@8W 8zٛ8.1K-%Ƀں +^)@>ZJk"ɧXairU"5xcx%a Ӝ`IDCF5%YY0&dx(M|`$/\Oy$%uβI-y1SH yJ D'(Il?Q]^;)+^%66v/!}rJlDx0:$pѕ?mARXF! cw)[*7Ʊ(3\ %fN (u%k9wW9LGy3!88cͣxd eaJ?d8AMy/xhP(H8;-4¥;ͬ+bxqH9_4^Rk9hwYmnEyl~Q.WJl]@1(R]#$$; 91mLD >gRT+18 e,\mc&3D ?-$SQ5joA:Pu,::NAy7"9q~ 2yy$D6 ۍ`ŕNd…@f-l{s ); IPEx7OnCt)WX[ѧR=?cQP 1XԇJpӳ65S.@Ӓ~6m*st h.OqٰkόӐ`!J޷cmX T$E阻bh8j k1WE BUv, E A2bdgC -qx0¥?dтkMᰔq,/-NI|o'79Bd_yt^'Ze315r*NLe(H[Ȧ ]ry )#'y1m/Ϻur$]~p@A UEK$V],DҞQ1gA"k&fЧ> ZR>5"QO ԅY(ш˒K"7:7TȰ5nwD!6UFࡑ?Ӗtl)\b q\ƛ)(3ϒ-h HֿͮLgiODipT (xt0DFTC =.!8pz? r|v@h| wpqys()\~߬4g”JiA%:Era[r4b8Gvק[ˌtpSo|7~Hyc5fڋٴcpvk cEdDʛ+&:[&9) 1 a1`Ζ,K]B2$WTxĒ r X"-UQ7gL p!%K(v|ہH \,oNtȇ(tާz/ydc)Q&#j9qa6vfrNB>ԠAȎc+h}/!pqi0d-K$ˀF 1KC /N1 r+W184)#-A0>'=N#, 9KqW`?5V1OۙxR#p؉$X#o]Ʀ[ Gpb4RbeW$X1Hdq$o5ʝrP4lI7%g3z*=z V4$jc)Ra׷8@/x'Mb֢3'UEeCE 8 wXdIJs/ȿX&<59 Eusq!odׯ$WF̉~79QTzb/"ޥez2(RDq$`p5˴)raŴsȶ Z@5[kHL@Z DLjj6E*x$Z'`ƮB5NBy *o#yNMwʶȾտU3I3y^tLfF!-+8+05q,V1|jZ?fn6$ᗥV.)]b7S[W* ڲb*J&|-R[|:$^?d%}aJ┬"sHBV0M3G?X!LuXp8-[YbE" $IDsk |n#Ű$6lx:Q0V'1 eůX;3!n$' |)5h1(rv61%|Gea.Cq*OpSPotH94(Q2b%,7iraQ)2zonbA~g39K]@V\k@&3Mpo0NsyU )O9+d8.#ll=f%&NJry@I9 b#5yG>|d1)W%y c$me6Vxb#i|GJbvx-yO/`U> Q4N L,u (6%EkՃJ4+A`\vJU2)͉V*yPuCUnG H/X0 ~䬃>fkŮZx"ANoVkj4X0xs+LP&_x4DP #9%!=b;'Sm,PF2IJ۰t##l*1J1*x JQ(&mI7dZ.ʾd W`KN˲ZG0["G0k$\HBnjO :< BT`=8m`hٻT3%0jENch)0^BGbеs>y_Ҡk'k8ן8FP_$My `fe-}XwnS<ӗֲZv8c. ~E-`*p=y1ZHB]JF'1͕^>k$pd?уqxFSt.]q)wkp  הaW8Q3du,&0 yNڿ3ҟH+(Gd'Q $pg :JX e[ip Sb?>q R?d"roŖ*@-|HeɆ,GrƀPvvBzkL D[ˤ;ea7h/4O2#:?HvA(;o ~ y%ޒ2@|.P. ._PFSL- NDدTN#+ ebQ8t.t \"MA=k9y7$ l#²^$i^Dgj`V4"B`T*Jyh+r`ov(D ]iz! &et&PO8 Wsy:³|1(2G(]+n`|/i};VRv8ZΈ#'g{)١Ip%%j)/wсR=0ȞNVPd H˯$7pu1#1$V$;Jd焙`ʼUA/DQ3G3/@c- GC=hUOhpPP_b3KL\hxI,ٓ\*j70-}`YbSl,ZJ pЉ끚6MkHR?8-Y*a#uy;p;5jL!Ib8!d kM+}u>3i?B'h3`Sd`7& YXre *Jϔh9efdV@>eD kző! &`(6BMF/W*̇e0D* |!/KLn*0J"V4isj?#;1o 10A󂅜' čP Ae?Jz˘TmLh,TتQȋ'rXh+euYӭbS dౙEB9%*MD n'*&05)8|BϔdZU=S2([!5`.sёM 3yyV$y@we[wX~i\j͉1E(g2Ũd󛛇@^blXDĨQڎ5Y!}ד86 H {x_}e&8Rί7Aov@2cP¥i(xo90 BB\G:gy@F1 % $5ۂ2~Xzo&]*7+ :P) YG~I" b&=+\Q33t Q%2<jO*#q5ƍnXK`)%|`jTެ" H#/&*bY̘'TM[NQa|E 2>/Vj)-`.Z^3eX.QF&D@ 528Ayo?CxU}<+d A&^BC|B C,kCùE"@ #n@D`Jh'jc5os(NJkAGyD)y9@f1M*22FNAy ( jIP?$`zn"dxxQE= 2urXp*jb!;g3(A)ZqH\W9r#]CM&z˨-d|^[C1n{Iޑf"z?hlN1ZIS#=`2,aS3Q|$0yuׅ_#L4cGDUiet;ɱLI""$mw!#9z4@0:oWp\D]_XiqA]V^x9@PV^o'9#S`OO&X$9 ?l'R*Yb2@n1 aH&X"Z_$.ZU8j4ke¨5/!) zn"A6A7.Ksno|؉gXvIMy/]b&Ȝp& %~KȲNqG`S= I럌G: |OɇTv ֱuO96xTx ء|G<6__XLOf4 ksƔ?` $C8Ȅ 齙;$,^rD"~_Y% "\ -D8Hb &!XOyHj`CY>)3Ue8mAA++"W|eb5&$N`c G+6-sGKYh;y:zy  B#m_HM'(BDp"`07x"4h`dx8ŜƐljxm*.od~uvqu1 I:[ Z m[Zw \GːAz_X'< X$]WRb3.""s|d>Z!~E:}r`DGu!T;!a[3ag2Q{a3i"q0ƒc%蜬ǻF 8(QDGx 82P6'&+Dsp!jo$n* 0߾@ߓ DSY)1,8:x s6}MQ.(犼!$Htxi>W֓95;Bgz!>q9Hw*090Rt οאiṕ?^-Gx,o XqG;r BwzFy"n9Ą<^& $T|b@mtPMBް6ȇn^I&oI#_asn\ib \gDf\ܩX3(, 8@^'&SiwQs˽iXad;Y8Jc0tG y~8[F̩? jJeIp6~( D -wXiSr=\_mdBdF#BfWD**AP2ݨC=h'Ap  1d5nj- VVET0){"q TdD5nG$N4x{䟃Y'l\L0渻n0z,B R-y&&  qj@-\ț7RLBf+/*b֫9~}2 =y_ME\n ^79!a?L?ӋڎzŝEa]´n 4MWd[aFUWV}a`4~ e"̞So3N^2AӼ׋(NRLC^2A2$1jG^W܄$]a.Us4'U~LJ3F@ww>4lw]17q  F?K *&2{~T{8 T,r- V*G弮@J1˄MInj0 "c[=>p$6q_zU',V 2*cӈɱ&ư$By]JY n tC;C|0sCۉc|PrElV+D' 8Kɬ4DZ|cўyȻe)+5պchqN`tH8X$]nW;#9'4(w׬,e^Vz$E6hOxɛOhrG|!:ĕpJV BjL$$9陥1V0-䛏)΁^2$g#b8-Je$vkʿH.8&k"Y@dLJ:JL%X1C5 LUVb6%bu8Fu߀#$=ә|cHً%n}%.&p`B&NO|T9>X|:>"Qnm0t($ 6׍!$=ۍC51oUya;I.%  丘k"+f]cl | t{>Ws R9VN m޳a(3kH(^!,IjynS'#*& I=byډ44 CM!5>0T,9 9`;Y",Rv *7S;JJRjK艇K &4Θ0b 1^ZӬUE#,W1'Z,n+[D^OU2Q 5";Ba}#-/񂦀?Ƴj*Vq<[P;wE 0d~q1&!I)Rf#E=.;%:G^x>n)!n:,o'mBYdIV .U}"dQu7X)ĒG3 1wCKy2Ec`Ӂ'hu6xp> CfRM 0?9'9 3=3 |aQNudX1ep#-P'zxF MH!#&Dby`5#`/Nt4Xm?Eb',Q 3Zυ"¿X4s∐rjbZI;;I'sZlM*Aa[>@j70 '40.Q"x&P!jGC59Ҳ\5qdeӬ\ Dܸa*͡KuɎċ'Q$7NAHbo갢: ! i0ըB.9;QtM0 !|`/$( $AmzQe*,[j+(V`3!%O$=6 :R xwC_Li•5JU*P9>8@!Jws9Ŀ/=#tx`x¼p@3 NG w1blѻka~a$7XpCGp^u4E|a2Y[x5ȡF J^x6WdYeFBъ&1\'A'+)&d 3"#B"\7kC*plomV6o `.52wb^#+NLJ vJ$FE϶+ ϧ9ߘ(X&'bUY ߜ$npc0| H#RĨ9/0"偲t%KE^ES$@9/ B6^5vu޹v)ucv A^(tcyLDKp}x'V|J¢1K.JJDH%uI}_ruk^uEp6A o%iYĩBRmY(dP;s%20Ҙyx0{6-(}Y:FO QE3;-#6-kxNg"WqG?J,zrk Vo/VAI}b(kPӾ jZ-Qg%[L^; y a lg BŔ,6#m!A0?PMቡ%Vq$园VALxӈCvsM̿ hNp!bb.r%)rsXs#.SJ{FA'isy _Z4I?o |SZ; k-W8=̓02Y'H!N?Y#Z$%0#NtEd~sIxZH튤!(&+.hq[ݾ+;lQY~YcsfnezX%$٫U` $'N'IVM"ȳ,ef%}`i>|k#hz u~;*%Et]¾!>gX>8!ht&HR^qdI)5<9A >Y&ݷ-8;b("w'sHv#~>ߚ"$9LVO@I~'IChHwpjiK$%&1ȕ1ߗlj%,tΒu#"oħ% ׬j6twIQ >0>|{Y5rVV@?1 `#=.`cg M+xxxL~qPn6oT3p0և%.v Ó,Vɋndi>4,-YA>pKk.i{T7^9 U*1zIjYyBy+ -As/Xe?&Xt-}dX+o$lϮ_8NG1yq$o鈇]f<(aBO1 % -P9)p ){|ƒͧY3IiChvx(B(p$cn)DjJ~[s^jf<4K~r _gı,*ʽE-{Z dQePMzɸ8o* r*'4 E+t,UC@ڛI)A'VH!UNBܿ 嵰6Ĵ93XhH9e/ ij|Pj6πdc5œpx0Vwo 󃫔 g} JX'-|`>0{EHr/gU޲h3__DȾ !nę( 7)J{r1T(ߜ<`͖i6tt( ٭dYtz2&?f"R,A*!$)/'@{0~GtnZ*&ȡy9RhsqGðC{3Gb$faH xTfoJCę2y_gl1)>rBաx~g ٗ詃Z񑇦z6tKƧb%B)A¸BWgv2'qXY 3~Ba|FF F|'ћZ0$I]`$*t9`0OM(Fc)b<6FSL` U53RKLhQkA* 4KUi.LPr>KbxT3X[2BL%31;N}U"sPLr"W=b6TTڂK"''Rckɛ <Lzq^"M^(.pPehLG2y"FzF~Kgfv@d1*@.CEB4%W+)̕s#A񸴼O) 0μA-Dl8;=wH.1r|>.iW ~4$UFGRqg1Izc%/GDE^j EcSu%@%6ѫx\P]lxkNϖ֫ <_leq,(x;͗(_[#gd㙪~ LJ~MNs`CWtx#?3p^7oxw8G,gx:?HrzLQ(zh›&42i[p9{vS|pȄC(X'kduEڦg`TM$Hm=jA%°o=;KKru9'^S^a`* Ud{k0|WՆ S2GA*vїU1cJdl9GOIZygRVQc&#<@tO&qܼOWzn@#W\fǸ!*=dre[j!CkaM@; )q d"DX0ao Gc̵l+$P|`_P4p$'*SU_j?o95kX\#B8`jnR>ځfz! x*b[IrfC:%yj eUzzq"c8ynn*/c.Q ڤ93-3j=euI; D,G-Hi 3O|8{Q_nJBEo `:<B:FrS/ Myʹ93ƫ L8&~:\`~5(a'QΏ)M$n.rV&ƴLۍ%ϙpK3B xǼ7dk. rteԬ-APvq {B(F" 7"1Y|ip\ɅX Qxbud;BHy2g lWRozd3j#UNEc tC߾rS3h:+7HSǬtmo^1Կ7!5/$K?gDOZcl0S*-Yk$ k;\Tb[q1Bb6&i)wL(Yɡޞ)8?aX(gbto\ M>Dd?܉({B}XւdGL$lMFEy10' řQyΫ8EuNDBM>pL֋|^j&Xpcmk @NrG/IT>'ItI;St2ԧ hEUtoTT8r\m"¿E #OI ϧ2j<$1{N^9|g\h%+-`'M^'XosPv Le02#yjXD?D llN. ?Cܛen6?1=y 4ޑ qЍ :Hcd`4" Qscד t@9XTG촸;V0q"tUXO\0kR'KOs4͘.|+|7rb!XlW7@:|RdLiRtW;yUz[Ʌ7Bq <%wF@_-vsa^qo Iz!Iֈ,c6~,:* ^c^P:- sPz&Iq=5M-ԝ|g82m¼@$jhplpY@xC[;de 7r r%6C㟏SxB( ?q`ġj[w6@~S@ EB+M)P$VC. +Vt4 %vʿdu6{4Pp㼁M_j +D J{>kk6mIf[nZ,ו,zТ1;Cv? ŠBR a 4|sgoogledrive/inst/extdata/example_files/imdb_latin1.csv0000644000176200001440000000246014071171077022713 0ustar liggesusersVotes,Rating,Title,Year,Decade 635139,8.6,Lon,1994,1990 264285,8.1,The Princess Bride,1987,1980 43090,N/K,"Paris, Texas (1984)",1984,1980 90434,8.3,Rashmon,1950,1950 427099,8.0,X-Men: Days of Future Past,2014,2010 415845,8.1,How to Train Your Dragon,2010,2010 527349,8.0,Guardians of the Galaxy,2014,2010 474068,8.4,Le fabuleux destin d'Amlie Poulain,2001,2000 529287,8.2,Die Hard,1988,1980 466111,8.0,Harry Potter and the Deathly Hallows: Part 2,2011,2010 26012,8.0,Kumonosu-j,1957,1950 59377,8.0,Lagaan: Once Upon a Time in India,2001,2000 358305,8.6,La vita bella,1997,1990 242353,8.6,It's a Wonderful Life,1946,1940 83941,8.0,Tenk no shiro Rapyuta,1986,1980 192744,8.2,Chinatown,1974,1970 618914,8.4,WALLE,2008,2000 151256,8.4,Das Boot,1981,1980 121599,8.1,Hachi: A Dog's Tale,2009,2000 262425,8.3,Mad Max: Fury Road,2015,2010 311070,8.4,Oldeuboi,2003,2000 98949,8.2,Det sjunde inseglet,1957,1950 585474,8.5,Raiders of the Lost Ark,1981,1980 57974,8.0,The Night of the Hunter,1955,1950 55861,8.2,Smultronstllet,1957,1950 424957,8.1,Million Dollar Baby,2004,2000 117590,8.4,The Great Dictator,1940,1940 85012,8.1,Strangers on a Train,1951,1950 476501,8.6,Cidade de Deus,2002,2000 268905,8.4,Citizen Kane,1941,1940 69988:3,8.1,8,1963,1960 1078416,8.7,Forrest Gump,1994,1990 31003,8.1,Le salaire de la peur,1953,1950 googledrive/inst/extdata/example_files/r_about.html0000644000176200001440000000366414071171077022343 0ustar liggesusers R: About R

About


Introduction

R is a computer language not entirely unlike the S language developed at AT&T Bell Laboratories by Rick Becker, John Chambers and Allan Wilks. The two languages are implemented quite differently, but bear enough superficial resemblance that users should be able to switch between the two with relative ease. Currently the software is undergoing active development. Discussion of the development process is carried out on the "r-devel" mailing list. See the resources page for details on how to subscribe to this list.

We have implemented R in what we hope is a very portable fashion and in way which requires relatively little in the way of machine resources. Implementations exist for many for many members of the Unix family of operating systems, including AIX, FreeBSD, GNU/Linux, HPUX, Irix, macOS, Solaris, and Tru64. In addition there is a version for Microsoft Windows (9x, ME, NT4, 2000, XP).

Present Status

The present version implements most of the functionality in the 1988 S book (the "Blue Book") and many of the applications. In addition, we have implemented much of the functionality from the 1992 S book (the "White Book"). In particular we have versions of "lm", "glm", "aov" and "loess", and versions of "gam" and "tree" are available in contributed packages. There are several manuals in the distribution, plus a comprehensive set of help pages in "output independent" form which can be used to create versions for HTML, LaTeX, text, PDF etc. googledrive/inst/WORDLIST0000644000176200001440000000104214071171077014731 0ustar liggesusersAPI's Auth AuthState CLI CMD Codecov Colaboratory D'Agostino GCE GCP IDEs JSON OAuth ORCID PUTs RESTful Tidyverse VMs auth behaviour bigrquery cli cli's colab commenter csv de determinine dev dplyr fileOrganizer filepath funder ggplot gmailr googledrive's googlesheets https httr httr's ing lifecycle lowerCamel magrittr mockr oauth oob pkgdown pre programmatically purrr rebranded recency reprexes rlang's rprojroot setwise targetted targetting testthat th threshhold tibble tibble's tidyverse un unexamined vctrs vectorization vectorized withr

o*-^t@UVq46yU*8<$#EL9NR )/5gOdS탲&'ǔ $SV,W&t6'`}5U&LoaoPӧ#"FɌu wX1לSk0*% FZbבqI#&a|`ў,+ @(6aa`2<0.@=F'.%N;3E3 R!y6̞q`@Oy ikj7zy# }a"zvUʂ`pBSB" ~!2BەYK'8nAΓPXbS1z4Y'DXK-召AػH5I@_,IL!`ْFT}btpԛ~eobѪ*U|J)YzƭL@$ *(ܜVÆ2)IMW\/pnP]xp!Y󐹒$=]pKXx 0CL(^LQPM&z8$lbxəW1*kI4Ar5Nrk<}cFҗ'8ӓO8x2#*4( r$/BDxE2Z&Մ:XU1~}֬ ʼWLcGW`diP6Dc"w3gTRȒ>q*Mjc(!uG I䖯&ڐ5Sx8$LH;\#|eBΰ.xˎZ9 gD.12<8KE0jna*@#qL՜M=a%ӊ>1d2'+7c,.?0uVDLpL-XXYA]cŸx`СrGSɘh7 -1pDOI_B#c4RZ< \)6dbK>0kdu2'&Iv8`s@I7n#'p9>dJ#kʠڤnAn" T̳\;*SMA&1qֲH!5AȬDKy#@dc͇O4n\a0xCAn! X8͕M  /aυ# Ykx͇?n9( O$2Xmh=e[ǂ%f|bKf``ɯ!3y yA K`de$@Re-s5ɚ ( IQ[%1ko! %x (.T.()k9 u眘HS-uH?橬G21v*[0Sd:֦ F5U1 ql< ;ƴ+ js󃌭V;a"tgK X*͘}!߼{?0M(YRz?d&$%|`3 Tz06?\DN]cu"Rxx jTݵ,a<,4"䤁 FD@_X e$ ?|Z0aSOaX=B̄I;`< ' bCDGdj*"iUjHqX&DE$ T2/dS;2lcd= Ivpra.EM0G78.5=NC!-WR 'ᐸ2>H$r$S):Bna{FnquHVa eU i.5ZaFkK3؂C1CNapn51$M84v~808_^ ˴'ޅ]8XSZ2uZà*wnY !^ +K"i:A͗d=z,a*fh%*ڼe 1ݽbImYϷt=hD#L6*cXvG!B\Fs#$5/88[C؃XвNV89+(]!4"FxxJ ]3$ϐUQWSǬG9 ISK BoZhy񆤬+wbњaYf%ɠCyijrV^⇨nrn~g)=qء!H$׋Ɉ ּk&tYR´X ȂKf@"\Bjd $E_W KyP1-1*ff~# 467@%z)J aU~pͅo8,TuLf3]NMKW4Jn8)..Yo88Ǭ.G[0bHga|_qP|J2lk%7:we <',B%3`HKt&"G!2t i`_}$م*$&_hcT'uS TtDE]LŘ )]aG Z DDN=b'؅yG~dK!(}w)˔QoW{x":M1L3>mdB*4kڵU%dza 25H9A#Y`4d j #t<8,A˻j DT,BX L=nWAS2 ~N$!-LX ^@\IQJL2@=`>d0ǃ,F@daZrZez,!)S!ѯW~0]" J lic=ᚭ~|a|ձ,{rj"6 &!~O16O꒔qXJB@AT^}>}doY2)Ay١4E2;k"A4#nʹ:}H+ͼa*n\mMLKS>r-l u/2\Fpnj`EQyȼBqH%.O-86DHml;ș%q~-clEKa4yq2"Wd[b~2,N"B"`Nh(큽pRjhApV#82CɉY%~Hkä?`Y)a0c9G~|]8@aCK% JrWx8\MΚ0jr Hw&[. 7%0dl$1QH TS凚p"~dX)"to~'P(j)QH:A*k7\SdL07沣%A"0NL@'x+/ܝ8RሽdQw<^!kydm45Xށ[*pU&hʒzTTj/ZBS"sv5v=# ormϟ]gzb9}U Pȶ%~Q \{~cpXڅY ΞpIV$jO:@$ ʺ65jrl\cM`dTES8b:RUQ1˨Y "kqͥȥ M# oY Gפ 0/,A$a$Q:̱C+wIy9O5P#Ț`/yO pib&5'L0MJ,c«, )#4'/rP58ŝ$K&rXebDw 05& XL1"G3DUSfytʘ.YG̱`F:nrhM3#8ޝ+3)Y[E4ED>M/O9Z|$M|EIyōL>g@K/,_~rLK(]V9 3 P T$G8dz)Z .2!Kʹm\S!Y, rfhll~< W|juy)N?S ji,sqԷ>r1m1 BKguDNB )lWF#ZfC?vzg޸fLJ_kgPZq!F7&LsYr5 0b58Q pc>38W8e[o/x!!פEg$ ;" Ik 6O>pvL'! xHQG vN #"%qk&n;| ~%Ą@6%H*K(b0bh1$*O 8:>ohԊ#͆_9Q c($7oXWU>8]b< #nDQ<6g[#&mX-A VHVS4dlCY&  1;yĢ%RԋH_I7%1 ТLRcՃ 9<oEIpeTNrL-"g'Zk SWeӆ\&ُee6x!07d-!su"Bn#i`I)G1 PT};~^Grf7q"`Y)DAvc <9{rLD,Cj,T~H+V$&{+k|OhaA\U2jΙ-}jAcz9|X>!t8bqXiN>sfԡ%`g I"K8()QYUD^Kg7x042k*ͨZPIJ,PNƣ$֊Ojs;0]!wXs{J@d˧DRJda] E "nKFO BH6'8ܵ]N;Q~Fl/ NPE,7:y(2WoJVqS"+EV_h8HldzdQH ZӳddN7b*{]X2h,gфQG7Df̼F,,&~&^rT4 Q$ΰUa:Xw?r 8s:DD?!2*]?9)EkRFɗ`Ir>qQ3)x1A'8rm0d!321 ;ьm̠IBv^ fʔ~|SBiʴsL89`A .SPM' vȲQv'MAP!)RD2׌%|KV+[yrCwO^ yԛ>b^#n$zH847*S,lIYnjKXWm?;¯E?x ȐpV! wɌH0E>0%.|xsN:T$iL uZ0DBYm֚Xdn="kHC:Hn` @lW5$jP)d ƪLgz';nY'3tX Or ȾrX8`DmF):^Sf7ܴ#oٝ1)- u@yhy1ZFJ 3SzF;k$ #0Jʱޱ8( f[|j52,2/9p&>? :vj-r,GSH{hY/XWmlsRTƏi ouް ޣd ÷s~O9ƥŚ[(Yhћ:rΤs#5.wIA_8(İȬN\E>ؐɜ,]%l`UJ3N7bJuGXH_ JƬ f# ""DinbpE6[g1?7〪L%<:%\3kH d2&R ,vLA'$FˆF:p"=Vjׯ8r e?Wbٞz92r E'6lw?PNMل 7dvz.u:v6{̕R}b@&a䍾1.ewȈ"BK"$CRp *tkT7aHP:ƛ{~!C^.Lk:u&jTH"pnu*1uprye&7Ts3̄s\dXCceMhڔ!GKXi`&||7A%YL\cd 58X)/]A4Q@W$e@HFx wʣ2Bp!0T!:y 7!JC!E0s}eWG؉g'%lSM' }a."6JVNcCxS "'njy/ c=,Ε;e*EݰBM %>p}dPC1FS,k ȓV7Qj'ُMM y>k$U ɷ1 t:y$dgkl4a䲺$y TX3 xȪ>\d<)YTLHދ#!OlȎN0xs98="Vr˕]T𛃒ߌtPjL #=զǜ(a?C93{Id)(=c̎P@bH+^93-F>xG" p.3q޲f#7#͡w5#%,!>?wHqdk/Xzɉ!T&p% P'2B ΍eBsϣSPD΍7xٿ @xWn&ŲCU{JY:Ejy;p8fj;^&$y#D/$۶oE_Xǝq–I>lB+s2S^9E%8nE `Edn(ʳmĤa@ }Fi#dW\.A/n aN _ou*9Yg@H&xBxlҖ6@`q kAV}ax }&rX H)ub,h 'NJ 3)?ȫ >MbZ/&,A֡£$U5rdփs#2`Oxr,tP fGpfH3u&#ƱB WvJmCX٩"8vEs0L`>be ^u45C8?l}3}q{xL1b3RW]q$ѦCb~csR Tef /'J'L6؏RΌvׁ<8LAY'a(M|6-J(^ecAr}O BPhW:\/41$DMP&b[Ʉ08L,;SE*=aBx.C]^l4fܐ832 Xڴ 6$I@߸cȑX߾=86=d AQ;38Ѩ)2_.KĂfFg'l"NsIPvV! O"mq 1#ұ![S=2&w><+ ;L[ͳTA1 ' gi}x̀_r7Ձ>p}KIz*fk&'uu_AC(p"_"@KsBA ̇k-XܴcC̴ŭgIgSCB  ;E213׬CQX^*] kr>r9E>X@A إH!|ON,OͧVQwXwiX|ˢS%wݖӼm5whP Eh hԺ'Kؚ< C')1uF,jRnxCK>rF0X82ZP[IN4OqF7R%" {cX,_bUe&m}&֊ON}/(cL:+lϼko$6MxIA@n{f8Qx."8 %X D _:ȱU$$n0qmʦ4%Z0؁O8 KLT34jMV:ǕDW;rЛ""*oF$bp?ŲS1?Q% IO8)"uJSYd pĿ 9Ɯ9L@xf* a/:uA2 X&YA %]3YHkxNTT&9h r. !kHs3 gS8).{-7^2/14g,gn_C#p$OC0&s3Gkt{KRv*H\NAp$[;W KQ3 ,7|kcjOrdm|#fɫdNMO #*'x-B`$A)| f";;(`ᒂcqa_Y4.IT{R0|" K/ K si$Gs,p#-73sdʡ{B&b=\#!D8tD^ͮ#A\F5E.ϼ._/[KH" i"F/r!E?xVk>2$b)ōDN2vE-;tbc`;*CR]p/^qfW$yL1h|y _ԥ^50!%S*P([1T\%O1vxlpGjlo lP. MOI6Ucu6%6p H2XOf8C 2{>bq"^TqIƃbM<Ѝv9,r%q 9M jgKdϜDq^iwp_c}ZY[,b訍 (XK=ڝVF i ͯKZzް@L3?X mC휿zsMqe,eˁHf"X#K0NE’a0Vsy* $_<*ieT~EDVG 0Psel0rt?#3%neV Oy@:㴙Hu]F-Ȃ?9͉K4Q#Ø2<ZJyRó:<7f[N9), t'ؔWŸ3ن -wc XV#]d3 "fy?XKkYwڰIDT\u*#_epl~r?,ic|u׶FFatVJ%Tzcy2O)/<B*~Gsg Dž CK瞣e!@ILGt:HF3[(]OLɄoD"y\ ':G/(T ۳;_8lc3n 9) aOH8͉RFz=a B|.#Xb)VOll" e#veHb2)- bH;|H_Uqw5xj3sdH筠9 MS;:Zӓy0+t(U13eQ[ <kYʉ8ߜk& juf<7’V\| $kagтIk$>JFTHڞ1)U[uZ&.I!tCg{^.M_4;W z<OenK(/sN?]cHN^9uPV?y ֱPx&F9H c]?{KF$W>%}#$f%[cw6eKxzl<.}eͮ [^iB&{F{ UCی zeM}p.p_ z)FJlɀd87N\td#rŋ$@e> Ġi&S7z#-rrq+(5 egN#myKJFǝdKjbPe[fW(aY0I&F=LRq6j6Fa+ePĹjU֙dDa=%8ks D_ډd'rQHMaU,.k0|x8a" ihqG*T%e~eW9^g$2:Q (^0rBOws'iCHXiV}jRIIcqe]1RPW 8L~q>JNoM|XLf bu xq퐄@-TBu[YO8D׉L`YOLrIJPƯ  * 878 6^1TM!a;<҉Aיud]r E0$VqXy 4PI CDCY`H.9F!ɏa)٩iFU138DQ$\a sng%h[MɂW* QI<NUbvg_nGɊ3 ˏE b[figEKcWK5#66>OĹY(qx~\:^N+$T+a:.g R&p  y),I*->f@_g׮0 񲧵;2os 2coZFj:C1vO[DB"]7pM)yqB>d *7יܹ=qr}p;+i .q**YVnxGe؍U0(k9py~T5R-D@ Sb9 6^e}CQ)8CwjƫϼB5 vBRnŔ$+0݇*bI4_B]/Ͱc&0^K*#8^UvAĿ2QL,yy2OQ5X">Gtϼ$)<>x0[s`ۢԍ:Ymj1:ɦ2TeH[\v N\ 1BЇc,B$wM) I"XDCTɹEAjchxbVɂ`QD#yLiFy˨!oǃ cFpۛ`2:/%y{efSJfX S".,!"p $}ʓf'㼒@VVm&mG)=R)^aK6W{H QJ]=3:rKYtwQ؄""5/d<7AHJ TGYKsa%rA !Z mw /Łkz}KMIoKd8a!x2Պ(OVI@,r((Hdh ޢ2 &B|wgXom?T 6}:6g["ODqڐn?Q0ϸڴ&uxYyW1g/ ?:갅 y3\ep-߼,. ʗ;͹O4cBNY@ ʂrΠ&g2H-!/Z6ie#g-LoG+߇ Xʒ1CRI:r;:,f9{9đk kaGFOYa1+`f;/'?G|&k$B+Jգ[GxQL؟(-BHF0LaIoOW ƃ[̞?tPIs[ wl}A+څk^ V3˄[r`[""2`{B KOW {aG;)5T'1Al4&JRz )X$S3_!a@=*;R emTG1AqfQhG'lNz?Yexw=4eq_>zX90HY(;B]ĸ9D;O' zV`ΡTu;Te\Oc5j er~ YǃQ'RT8̴P{ǧV+JqI16dHyyp ɒzI6TBD$AϼH|uq8Hǔ*G1;dLk!F$I~6@O9Imk 0sf zc+0%+($L/>sJ# 6i y Lo԰O[JT]5r m9JߜcP><C & ه&ه˚] v( =8qŏ|aЮqX-6ɐτ)dB9Q/h,FrA85(fߌR2(uέK:Fkਹq 5>O`{'!ɩ#nQaR18;8T c^H IoŒ6KF< JX.rSzS$b(X蒔G)QO.nBݟ%X%!-a3k{ȳr<=,:RNdȯ-{O'0B.oMŚTy3[X؄ɰw (KB ]N~Km~X8`C owDs'O2Jk3ɂMOfaVV=¦D_g9 Ra;fr6NՌa㛐Cn۴`1 Q{Hk߯#ɊZ$̆uĘT$ĥIȘm vo}4I5")~ZV p3YPMǑt՝ebavLj`9J&{ m1c5|z5QՇ@|!ҳSEOy#`o 6hx\M"94PL>)06OK)`>Tՠfl(œKEy_Sӌbi1ѻx4?cJ r,b"::6v=1V (UɃ@>HB G 2Ԡ`ًI˸Ur1xpcC]a`$)ky T8 r :ړX HSk%*H)pfTs& 琜ONA8{>+E.x/9UQp5)~Y:E]cc"M)F @=Σ N)Pn!w'.Kx8'Pz{񇓧E~ 0{Jj_$oz$F*G/[FA\LG,_8q[a/ "S댁xK%:# TxdZcysDR?omb1:O͵!;q L;ה2F@eeZ*;cjh<~b\vLlN@4yp'#LAo# 4me!"kLsV1li;FK+pZւJH[r&^1)"o"ofZkE/wʡIg|QK:3zyYtK!K=c8^Ģ'a& 1.*7IC'T#a¦ /W4xs I3uTi;l#"$_5~Y*C"27a~c!E:ɨC铃&TcAP>ke 30% z2/."/ M;`-^Neο nH:Tx5u+(Cp/* :+|?p&y=c*pÀ “<,#Izrl@)!-5'㺨j$B:t硢CZj' aPp`JƤ?x@s0ͱQiDExhx2tK/<y($x1mq'!6b8DpR[9P2fDd5=/F=:rMi4 aಔLLaL@K+IP0sA ÓX7DQrڋoj]ΘB<5@FʏY|I@[jTf[ hNCz6Z!R?|ua3܁5Z2DH'(b. WqHLtZӻʁTz0py͋P`z銥J,Ͼr` 'qцQm-׌]g.eգXU6 [-LJ5 MFbde$rUüJ #xu:% QK A4!dIazUE@y39ġ82ǡJ>@@BQ[u s#QEnf+|K<C*rrF bz_7at:LB )ӯ &QxA! ~ HeN1G`8`I-n塯XKu;D.oΖ>3[c]#*e:NfMq%zg9.>N>l1&j]ǗPBMcl^kSMkv\?9q[㌾o@h8|MVK Nqαɦ1ժbQ!3G2ǼN-]bxx@w}u#YES n?]w.!4 ǜD8RdA;57/dfcߎ>qؾÏ?N$<82Jt` )1%K="" J 1>5iֺ() V<vAh@M(R<#ɠ؀8&I 660aoDiD8 ] W2sy)0@d W8NE?&Bt1rDx/:"Yq\k Bhpп8q &tw]i K8g⒛stO8jIPD9%!)j-0)ͼ=cW2 L0)"SD5c~7e#n Ş7[n4_lJ<9,jMe#Y{XQ9J¼R Upy%Zp@uR1HSi{1rCᬇGÌGz1ͻ13f_fAh5%8uWr1s+Aac^˻Xers2&5]"PnH1ϖDg2(2iՊfK(W"#RGGn@/`'ps2^QWEyaZ$HJH%+mY,lhbEu GS M[LZ^g${OaIL4r4ֿ, 9ƞ4cv$iU(Њ=Dc 0 97/pMf޲혱oD".3Jc ӐO/yxdf"3d3@}Wh$vG8(ѳ{ ;E#fQJsJ`~2WIXP [DzbYW:3TsiH]ҘZ'\!4rwD[g, $i7TRb.G|{F>sd*PIsV͆c{T_($$0~G51^pl(GOp}~_ ߟMƺI^bM!6yn!H),!#ӿmI!~X p'U.Z󄼩3 ,?-dn1!Z?ЄH ! Ϭhitxlp#C(IHC 0֟8X U`@m'j:sg 'l5ɏgezL19-wMƽmR,fx^ ߄u)ˇsOzfVA>uVL Ӱ[e"]Sh5RK $rY"`B"x M]y8oYp=FU|lJc51" 8^\;ƺJV qxrUM_f^ d#[3FA’kjWp`E8 ĴRm/ْHB{oT/mjM)5ĘQ;lɛCKnU_|'A)֧*tV~p^k41!5 4|\4e  1Ʋ=cJoDOS3H4aw&<~qܰ`}~H,LlM]Hy)ٍ XzjS!XteT 9l&hOkNyiU' 3 #~uX }$PF7vn!eHHm$ A"HB;|d/ƫ| Q4NK4,טZ ~̀BSf vAW D&0{>e\#FG.LExFy=y++!/ۤfN*+%55AS "}V9gaFypTק&2ȳ;Ѥ; hޱ`O8Bx$_ mrEýut`K)FpRo2Bb ӐLp?1M41:q$09&hq4%]CP{_2QxK~hC@o7ߝFNa%&wԸ<1+ЇOF)*konǯ]. !g0}:}~L! ʯҬŵdᲵ+T-@% &ZM40>qg>p/#߬l5a{/zC~c\YLqOX>š@S'3RA& ,YY "jŜʵcS)b[両e$M۞wђO}!Bf45 B |.3ޔ3pGnwE7c;"K^+$,+R"Y\C+qx lv Ǯfg9y!?0&d v`x:# m#lֱ0~fq<%(\fcYdzl, *|d$)>rʷFU5W4 ps!3M!=H#mૃLn|䫦)G>3;+ XPUЕDʗ[@d2Ax?kS:߽,1 JUTK"}R翬^-#JCfw)'1 ZQ$DdʓF($w(ӎƊ3֣\zK ET?xA_X#k4U(Y}Hw2Ar, nQ0O29<~sjA_iȥcy' ,3 %rl7 [Z@m1=Mf@g\uŴz7Un].i3`rqh!KsO6'&-y?`dkUdeә >D߼{<(1&0U sbOxmeF Kݸ5Smg$Ĥ$))|#H#fA6q%OxjD.&// 5*| hGiq4RGP.:E ƞuC^~1#ᓋ)<e( c?u'l:>a̼=j#b/U"v|gI1:D+q*xlEm.Md}NoBhyP}b/׌`"ڮXAQXN'횀%Eל 1o a9-lq_95MMCv"@YLB9BTln; ta$ @iHHz|}-F NMW  U8}sНL kKKv߼u"m—)Lތ閴fK'KPR E$(q+ `1a>} K.{Jb\b F?4)8,.XM.p`2Ix"&V3NJv8\M9%1+w\)rXI|8;&ۓ)d1163D$$a0%D& 딪v2X2H{b!'0nf6ֿ+:aYIssPAR+0!ׄrTbT}bp< 㗩]ڱn\D&'.; eEMm~:LuBϚz?I@1#󒕱e.2f Ӻ̈́2Rg0}n< S)@Q*%ISL S_^+S~.Gc-8K(l?x i@ "idBaV:t{"4/," n)} d"8Zh)h3#.juHIj=ჿk ;ؾuvp,m"H6! 2G=:"%GvlyL4fc LHg¾=s6u"W|9K@p" xd+A5PB2}`2*/$ O8%%g.Oy&)) V 4 Sx#eFMGX1Ȳ*"5BWDxi('3\pgэ(\3P2 GIb?aYLF. aӯ2ɒZE!y2[-ª,1]q:OAHR_9 DA{GO#xL 2q"7=V,ԴʼnV<\)yʜ\C{׬;1&4M}0\3s;%!knQC Jk8ਗA(fFk)1Fm8_v`Ɇ$t\h Sru'EdS@!62V9H)xݏIfK_qcs! A LiNk`M^]zn ]eҒ:?ЁطF5F*2—~ss{#ŌVYŎ m8C[HULPSs4s$D/ #\};#'"<+|uU)rY85&9}'fL!N` ޹ȱ'$:̞2E%9MWcY\d*kۏ3DI`mg_8c Lpobq5tT-Dc򌃌,@>UثDpO&yC_YUXbY(ð17'QXi0’-+ wyiWibe=F]'9#2( M'X%,] q义_~40]n<ٰlhM8z0Jx؇; $4ֆOũ]8E\JR f6j' tcxj9 0qbl!:|1>ȄLDTD`(E{ï4؈'^"/4I!4{@$մv`q_z߾L$A! y2t L#$4dSkB5$%fayilI:]bK/dybP{߼tYޢ~ 9t=#_&Bd0a˞b–X CDtȐtdf_5LaJ*H3w{ɜEzE5)ʱg[,B`N#LwA_󋚈LG.2TG Dpy ew|\P-Ieq ZlCԲMUn9Bޔע;{iHnp&lȦR#Eq*^8?<_8$ uÂ~ND#4f*fODŽlP#pB?d0|iK=`סZX1hw+r'pDN@mYSrmWHfh9ɭQu9 pvTHZ ~\B8R"i}{@%hr3AݳG0_Zq0&?d2ČI s8̸O8D!Ȍ" 1.X C{T`I?c'nF!)L x0 |~r M!e5ϳĀJ2$\yֲ*#Fp~/  y#*t-ecnֳ/9Gg_93FKBhOHE?ds0UۂCÈ_9JF79DId4dL{o:nuɖ DnT‚8i46⭣i3?>81I4BV5R0́"4AoźG1)Iw{[>#z}iqi"mQb[H-4 $ЫPӼVhP{$@3a;8`8&Y+FJݕ~ 3Y?7".u<`-o=tX~F*+R -.V_auĢZS#Cţw||k-UAm[&" 9vfňęPn!65a]e.(H R 21J`78KTF;d5xSGpŶ[6waRs*=uwXG Kl}5CүF1#ymoQ u.sV=nn%Bl̓8cJ 㓼-$fӐ~Z9?~3]-.$A'@;*fd~rL3DX.pݵ \dXDY>BNw6e:[DFj Ij<G3JQvpQQu UoLNV^--)>'C sL6}{'ukI&K.y"cE0 $ߣH߾o-֖,9}Fװl^J57v4u+nr+g$ngKz%)O5-1FN2h!2:'b) cSqo"$e<xE f'J j! iQw}}bJ'1;e9*-Tc&U+ETOYZVEnhӌdm%+p,n:J*a\bmŅDcDdޒ4a$#- 0奿3?RY5aR28uKQ# yNlE; 5&e &A4uMjDQ/ =8FXn91¤͒ˆrV9&x'Y@Ή7 "MQu:Dӷ$\Tv~0)2 wNSRƃ "ʋ ȗN8O):s: x! yNLV$Q9r6jM5 $:402;K0d~qDӃ6z[e lԻ ;ʵ nE ?C5aGvvF!nU y5 ')8zE/%xnFL72ݭf_,ˉ}YEfhFweu zAtlo,I YYjn0]b w?ZhŘnr}cTnwό|R_eZ]?$vڱŤ2?[A*`V^bnLdvXa9H?2.7E}bdgOx0) H1f­IĨ 4E9zWLyd/-BÎk1aOCĜW^ *oz|S:zh6N #@#Y$40Tq.ȱA6SrG*7i'HޗUfB#G/TYMS8˶1(v$Py5oY ` M ܋"na; do"6Z`,mG,"oFWiL,i"&.OGE8M<2U*%q,Nq #%hr^E!Wr:zqwYuc5k/gdo/?2o\eCz3|fR>mUrByH Trq%&v8g+{nByɦiD~k k&Z&7t`T)$ bR g\?"_ 6}qo0PbxzJYh#Db8Snj10wxseo\COy].k*S(7]aqmIN% 2)sY.h "kN W0=[G)q HZN)4"CKnMd^ uIBj6SH W/[oH!{V$tᖔA>" hO0-XqdE4vpKFrC=⣧"-B36Fa^pY*1Bro]& k*mB)z}c 䣾+/ (C*&#OtD7osJ/`Ces,0;r``T(0g9$VS:[%v%@@mo)U%>2(Il#o8!+)ӛ{DA)2&dӈH8oZ'fO?)@-hQC/ X"?@d4\p` 2ʛ0A9@JhYz {OHQ;:#D(;?^pܝk RѰɌHLC BCEk(@&xi›HG&K~wy2To(fmK#pHl$;(Ƿ]S, c!|bpzqU?XX_O,358M X{ %L2=sxT\GQX4qBjJ0Z|au%[ u< éwKj>XâэU ҙf9P)\?X֝l90rg+P?ˎAr=Yx̺ĒHį/s&І^M,<4 ) ,Kd A,@`A^ $H[<`roS$M8Tq.*ul{bK'%So_ eK&D Ԭ'1u%F(*WfT!vfK6X q%rF"-'`̑閖%D25{\Uo۬9R!,KDK Yz؄')dVhQ2 9FqigRxP~?-;?EF5FqF&M&N 5Njw`X[Li#F=!ok'_1hMbjb'^.ЬuC>|(nqxĘi zGE.?YnZ*~q(85Io$Ʋ}x[(%(܃oFlGk&@'kNtyҎ(o @f8r0,2 j!e'cD % ,ho# UQHYʄKeKV(A1xb:Xi/_Dp}k4@˥m$4l}O8LA5,&0DدCN|,ۼDc n+2ґP1 j:ld09yGIrnb)Ӊ-֧S@2t'<䔋Rk43(Fu~Q:f*G? *n7aH']sNܖόC(-6氰LW{$̰KYD} ύG 9/7昦bvcʯRFZPu93.$/n'9= B f'X0/ߏ o+Xx$-bD&=K#Tpp 5!/@Дn-;?X,|d;ȓ}FFO R(|Cȯu8%A?9*f+`h5?<CZ X&8OCBL8󌘋7Ō6>J ?=:٣^2w^E']]fT8!FPu9`D*/O8SYcy* E5ma; d7Q (1:_9Ċ4-*]J]A"\JqhAT9)P .+wgl0X!Z!ȣd(}>qZ=FB]Gx ƨ6_"{X%."ksfyq"XyIŽ)\bkXիGL2bH*'Ej;JO2}^xAnŪ2B̑njyV6~N D$Y~U$JSόqdq.GP# 6$AGOdxf,C˶F hrHUDI3g%O7IUӬWQF0eӔݽuCŎB?hlodrA)V%:k'5`.D@c.E2|0&5@bn rxՄhpu 4x9@Htd$]F|R\P]b)|yX7 XTcNT=/DFIي:FFjc( ~'mo8&HndC֧)gR<R#W>oHi-eis2(YԜ`w pυAN)$9* !l12& VCQB]W9ICuk2JTAYbWȭ~& QVKDNaG-qIj2uƱ@k@XzCX??avϡܜhLo6bKh$Z{=3 [DO#9^<'/*{a~[.iuI S9C<㥄6?Їɣ> V۵4Y4F"_X ٭sM[qoY"ga9{U^8:#fMp<!!T$pF6jHxɳylPEbyRnd33-%3G_@GHp$0<K:䬈/'In単)yE2;*z\ ]s&CѯcЍ F9h |RLSZDsPHFDF)NtM+Q\ʮ 0|NSkwxa׾R*J=, N AC &s\K(Hsģ}$ `KQd~p)55P`CW5Kqw>Ud ӷyaU{V.y<#'k&V^4"7σ P6: I #'<*Qk+F&UL|unpKcy $#;>)2u\%!Tq$$X⎃5Y8T zPjcԢrL` `bB`n*5KH.eI(%V#:u5$QJU4A];F-ǚ~@ta3F"*ė3rdؕ^G4CrMFJed:?nB@Na UK5YAk% Ȣ3ajcԈV=j~qT5FZRȍxpPh EH,R8)' =9;+&\L$2BHDwG8'a\ '9f?$}:0!IX'E)ypXHT-GP. ޹ÅXƥ@:!(rgJ דN7(P"FAAGN.Ɓǘ @NjB''3 @jC}Pn8~##&j* 8 y76$ڐz6dW; X#-10̆S7g.ч+.ݰA;?Ij0$e/5B<8TDV!%m"8ROX8EŠ{' q=LoR[:L׶gw%j<ք$ia(PyȔ*NbdJXD[LzƱ7'+pjRL:#ufNT+qNk-$ -I$zAJ͠lab9D`!MUBF%AXNNk2&Ô"Sy (ȏYoHCm8~T~l JE&)!"ڏDR/'cIQL*7ĸ/cn#cY!AI}sfX2Wz0*e7{eы>"и'qۉNyIIu2 (PPUmE8tPbju+D |UƘ +ְ7B51vU y>BZ/pꃒ6C4ZҺcFAxbM]QͶ #<5 u J<[$Sg1i`QRDE%" Rd#c@޽e- ߟ:w![9d9=aj6^۞]t\d%VB]oxg( xwM3FNRc ^{Ȓg 20>pcm(G}bwv9Zq 5u'HE ԔIcQ(1@Q hR`(U!ȑWɍoC9)O`YV @ fGtEG&\[A`2q$PP嬌S\Oࠈ}J,Y!jph̦L>P|,}%?0J ߈ê@=zW)}qg7 P9A~ .RPw TLsĵV+AMYH>xbX[pFd/..y:ɥ'7p)`( H{cTdkYS.Ø_#WV2haol>2801lif.Drl<=>$}H_k;2.\kG:qR,1H0@p`O3W2SzƓSH1uP:$[by38n'_٘_xu DCLRTBHkQ=5o u#-'O UF01H,X BWr89yIQz;\Zw˄"ƦsE@mjpѐxwŀB՘Iw@ %, d6߇XwmGPWixŌBܬbt2TOtZžGLSG8VF5 a 4vzP'% k {_*$ F. %''{R"Z&Uگ$d#Em Vf\b~!X*PADp ;?ׁ˚'yY;jAIs81`"10s)U20GHE*gaU#'DS; (p‡z?RtjO6S8-7׼H:_d qӜb`AZNfSn? Oc#>~pP^6%9y;V)Dr%Cdyrx!О5#9&ACFqxur"ZA>&2cP0 ]VAr&IeDK9Ef!qd'āK'%֝-3{O86:p9`';yͦ' MQX\^pIożԶ9#AAi*qE=̼ ~˼ 2}E}߇Ď_J0gH7#@$XP $q`(&l-d#$!Ʒ` n/a2,@. $*}К{'IFU33R|8vVU]+&Z csE`_2wE&a..d$Yd:xŁ4܏1 Q0!eܮ9mX+9Lc~bBL"ܵ`%U9d`ϐۼ4ݼ#*~5_`p|><=^dvFA|{Ip{Bc2L=Mw@ɩ 퓀ˢu:QgiN5 7V)EdRX ʨ@) t!&H`0!k+%A!fV]Q{ÉP X޵A uBL1A1?2vd'DXQ1ٺkMhrVÊFaB"# D08SK|.1R܂3&*k}=8`K#if,$O  DrʱhPSU* hŪL9+NBC&a>q EQ^rE)H^& ;0>(ÈƆ?LzezrRA^ ^#n@q8'bqư2DڜNɠRF!&ɀIaZGP\yDs;2}u`QdAnfpx|FHLKQێ#2=a|XY~6tdB*"WGFFcN=|DaAudzrͧKmqf#"r|1;iK^&OGl7iIUZ@d0]KYĮm7?c,C 60 &q)3iɬ=˱W]aظlXې?U9S|OeyCYD09zCVtw ! JSGtⳀU9p<*veHI%Qa"n+xIM|`B_7x 802^ xcZx'& 64K%r8VOЁ0O ЈzH!o)@vEu߹a3Q쇚2jV҆~3rJG13y< ˁ. 4rybgy%:ș`=!BMۈ 'M25-7YQp+ù{׿y3.NWՙ ~~0A(GʁEy`l:c v|Ý9 o+|Ϭ_^|d2BХ;`p>@v"waK{; \ xZV`Ҥ'#Epa6'o ?JLx!:HrZHcww_@LF@'B9ɝ MFD5"_QN쌂ī]VLjyQo|xg Ao|gMm&iYwog*;l肐8R9>XHp.ky0 !.Hn!n]; @W0,R(,w;0yM| sANHLxqα.os}02'x/`] @P*b3#UwΚgQh!$_pL /Q9n'P}h&:Y!o o  &LC ԴH20Oс2]d<}}e}db u̡1+HIBX_y8H}^LqcDFn>ї o  hdL(&y\ M)bF%JBi+$6u#7cD o8 a$ߥrll;`xB=@b9(L j $qP8dB6 W'GklYlXvtxulHW8u_/No F3FYdxaKQ/͂ Z͎zVEXBa1hD0IF>1x0Y{/}~qw$nT8.\c88kmI;Ī7E`v9))٭Ml|#Py:Ayۍ$yߓymLsbDG|#Ы *bw蚿#Yp`T0L+xHql4HZh"~@$[158X@^0Put*@)\\<7(wB$5( _9M EOO9O'L-н8,""DۗX (D@˻;Z!W=_pU'ncF#貄JgdJP숒L:5`/*ox9@FD45A@PޘD )T"/[dPxVKmI}9\ᬓntbȷaC2˿LnO+hw#M`(/M6V']Af*lySz&*eI1Y-tTv& 1YAԬ@ӏꄇdϜ^%8bf7vƌNf0# fbk Ӱ!q.*&s\}sT'!uB|bYo΍ iX\S’#, KJ5ь]VL(beG8]NeGjIqR%@o[fmH0 @!=_bI*Gɼ5DR_ *8pBry#Q{I~-=8{=#24@"p'FD,㜾 5O&y.R44ߔ0TE6b!aO=#ܿxQVPW2͝Y,RnGN@/_SbU#IUܾJ + f(XUS=eȚbxo;g @E !Ql/h Pu$MPJ>"9*KCrLRCb5dĶPT7@|✢1r6c&nUF48Tu{e&h Hp9]4kaպE\(q.-ȑd[oɇ C&%[M2=NR7TBe~QpM@ΰd+g`ʿ߬0K-|8`نuc%vw9HDVϝѼM;f@?|01YAq}k&ѣ. )X+/@,RH(WVK̺ðO&N6 X65' H/w%K[ 0ue^ɼgd=#0FJ6 /ǻg[8yC'ޔ$=u8%O1B{,:DI0T;D@tO(0<0kKH6!Q RaTcVo:+ 8I'hŸx~tzå%S\&e"02t:ˠu{NcHЩp9Ԋ2B1ffwVU/_Y jh-b 3d^8ac) {i{wEjU藞 aթ5}`*8)$MZNsrm"j\аHw~XIs#I(xw8͆-6s%jg'd÷z̍Oy'Ylra' PS"!3X%cB^z?8 {c?bD HrR'rj$. T 3e;nHl y;$ ''qo>\WM d|(9'l@=ܔM@u缥п R~] Bt>>*VLK XB Ԑ$bع&j fT ̅ɒi@"6=\+1\Q98jkg:(VvE^^,8ci>r<#%BkQΰrpӁ0Q8Fe!,r_C/b~+|^& JSo˄"W8rT2ƐϷ!Q,<@=#P@Me+嬞=2'zޡ~q1{Nu͸I4+ '2 츅)^K{fl ,0j0Z&>2"4Y;F#tǼxծ9w=^UPe{^sih$LLsMϚ=c2,'!_2{a׼>,2$Owjh2RMzF@p-Pf|f4IMj Y2AT'Qby:`FZ$d h%`%.8'ùQ1< 4bqi{D)pUqsjS<׬˜;Q=pBCv1)X, /`EsFKJbf& ReMמ8e@Ue"'yJ=* SEF0/ZWsuՎI+C=% Gpg,&?0`ߩ#x <]<8 Xy ʞw;Gx&;z EbE7 ?E- dx$OXi]!df;0Зh [~/}2m4yHpS^z(/L^Ua=Q61T ͬ83`0߽a2/xX3jH|Da#MOxByl/J`[ue鹬˚{nypTC2Oƾ0U{ɱ4 q;~DJÉ}$啸D!5(YYF)MdzI$A' bM `7Dˆ[8D[!SRx"w ^+js:I~rq7WF<}uyۇT1/x=LbFH1H"H$:c#$I%mjCp!pIn*$K7NjI@!$:C'˻ H%Q@x¶L{"p B/ض'NIxV8TDDO/W>, -e9qMiT<3I~I"Zb;3ij<,ύdߟ$ 䜙\+.I#+>q'Xّ /9dXɉqh{ywHK% ZRL& ͵LyIJ輂y0)뜡\(ɭc& 1-qNMG!(ek dbB&ow lι/Hh$2@u+UևB̓)0!#}m":՗5/Q ^;QI'T: Rul$u"|0Dֵ5·XTA6"hc(d--;^JڪpɪfqaW$5]ad& F!8=93z4$d)[DlZE=ίwhܐ/y*O!umd9CgIe ~QhJq[4T)8t3LUId/#79u:ߌw5to[˸2C*ETDS<Ks3fH$`d!u;h7&*Tfe/4]ݹ @@LWbAQEY!op"X7B &mMsyÞ|ˆL-(ycK:{PzbPV m쉘]d%ߒq+Yk1M H&23穀|a hUP&e6/>@`m$d}:&Yy(=4e wRC8_,10PAZAތBv:2Oj& ijX_\Ki:EBi6[k&ɫ ݖdib,׷^Aľ(\' xCe Vk$0}cIA؆8 Qzoj۪ĢBûjrwc /k.Hƃor^Gl7M2BH\-XD8((cq=FA 7~p"3yDlNEQڊf|df 9} 6oDKdh# DK% !7 Sbe(G:҈!ɎsDoY(%CXHdQ {#M(}ce,u*|dcNc\˟B 2BexHLp h7p[&* {"@fN&Kp,,ɴN!y =;iE>]Cs"I"zk*e_3/l%(0\匌Ud,l ׋#80UL{9 Jd+J&e1#HȦ(IUZbDd$}GOHc7| T6v0!C f1N<,l2+H;0;SlI8 @Χ,Sp|miSjt!Ղ-ۣ ʢS@p"OVC!rlH 'dzbq 5hQ:LF`F?L~zAϧ8sAњaY8X9ꙪB\?SXn\~54a )^yd 1` XRk⨺9$Qo.29VƖn˄,řVO]d4l,s!N:BAõK߷)LkY  v)ĈKgļU>PpAP|Ӑz3m9|BvLaA{El!q)Z8:-uyz*([1Xg"%j\o8Ʉ+Ь11FiJ N(]L*\TI) $[FǠ CoVqxHdNǩ`m,dzDi&ȍo#59@=q$_[~ri /C=l5{i 0I^1[<®JǞ2鐻'7aVL.błܩM8.ݓ)ɿHܔ׎c#ӛ*lmjgbwˇeZ2fRbe$jO#oSpK]}Z,KE3Y^e[:&o !YŃbaUpڎ,'USLT?QNB\A 1y"@iU|T2s‘KβFNL|¯}w94ً [qDw- /X.? ZNǜHa~#qyĤnGF<Fk죨5^QJ% Չ>=ɎŻp-WZ  ֟$Z(>7`qJM2z,Ф5K 10]L51LÂ1 D$ֱR&='̴N8~GҲGHuFd);'NID|HYEOG'oXUwnL<r6rNG}S!-p~q&7xc3HIfTPB# e`{ky)IM+U{X4=c-Y XcH(M>>r29ܲ8,z54a,rX]8Q&A,Oy9 En00$+OP|q|SYMT ԥZwI.Lp^HkϯNq6DN_B:5rtKMY%|E}9O9%/H߬F̓3Hda]qdbZ pKD5M9`- (|+'@p(ۭk-p9=<|eQltS0$I`cy,~wwƲhXGdB^'5uyDx Xqg&l4Nx2*7Uo su)e8-OJmzm5 PtKq.'uB3Gք-ˀ:<zl 2O>2DX9rbɽGBR&9*~0"{@dOrC81ywS"_r t3vualk }nB Va~'XJWYQ=6<26l^#v B묇.5lf}⣁P`ߕqc$XҙNZQ J.u\?z6;p"j0YIT:B+ b_q4LH׼8wPh^%^6׬L*g+|D6kB5?9[ji0:œ8DV^g3ñ^M\I&8d86$`m yYk'߀7q49rN3@:`]VR$09"N#ِ0 n&(e%p\頻w&\;9Rj|VFe=uY_Xm71u^#P]K~;r ؎FFJxH,'߅;A#Ip[th4pN5b$8%ZB1 iŘH근Ҥg&g8XL!31x*̢a(]Tq۷# 3xU!t1h{xnk$DO2-qDgo$fYox|03#DgdmADVa@&bC`_`RuǼpah6`ˆP9!E9`T :=RNL&q x̭uy^퐇Rxm˂qưfRrPgz'fK[Wxɀ`'09}~2I4b@$Ÿ<ۍkyʩ QdmKI`_q =2YnZX"o 46Vt$>G_0Z1P#5*M  )O<0Bh93<=FW.q.TD3F'#,Sj?44:Gl'`ol7S9Y2I\!xN,O!$B zņpFŢZi@LH7'۬L^1ym@FcOh ,Yxpov'NKM:}GVE$׌UK]bN]VCgCX!/Jt|WIN?9R+9'+؋7R/qǯ8ubбMH|2h,U/\Bcdq3{$q3:J!{ U=oDj)R<!zLe<  &bcܐ*;)'r=&H]ze]Z$21CiS6 FFZR_2xUy1_1; f.OK'qCew" d/ȅu9n 7$$Y_Ґ$_wkY#+L)tK"~pdbd48)L4;$&jQڪeQLT#~/Y ŷE#8mmH#oxE9D֤+Nvi$/m xlAڔWKR)%ѣj, E`Oq ԑ#F^q_U Dٿd"v?OD\˹3@|Q =AW0\JHa$}M:a5 ('0dq  B" us"HxNTaA5dsȞ뫓K ,9H[ h|ix K]a&+/÷'ehD5-?9F4'h!1C lߜ浘Ag{'5=B q7M$n9CF.ӤS9lY\py8ik<ֱ|+{ 9!3)>2Rr9a<~BN-&J 5{0t.rOWXf=JyfQ/"n`04*j/qF3\:Ldܓ# L{ȖY@v5x~w}OɤA/LWSK2=-3{PІ/a*Xf'\$16M{ń.k>),D,9V[(#dυ)a|ydӿG"a)! yh=FobZ*j2OT /'yf ]Qq$rqMV@xP Naw t !ՔwxɌLX9^iLDaLH`Ns\UqScP! 6sdh.=>p4H@#xP}f=#1UW1bdAoEexDYQ- q„zo_lt+a3h Mq{`^]ږⰆa[j}c z t`1+jâXXs_B`./k"ڶF2'@4SNAPu-R$@|6 GJ* FGm?uA_ }#r+!e̙;00) M<>!|$"1L{L([Y0&Gf+.[w3k !rxֻ[+`H@c.^}L~3oRe3HJ&cfB>Jz`|6bDwGV`(q_-'^4%Nh5Uzk%ĉ#w҄/>ome_XWkوuNK3WL`x@W b@ ana}b>\5ہ[0ID*qP0^jΫPIM^1gR|qS{udrxph`ƪPe{DzaG.gmkC7 A!ľqr.f/AVQ,i5C&6-^"r)')13,PۑˡAB$Μr *e"7 K/ }&ܜ,?0&IYh2ѧ4 Eo^:%8* :Պކ~Ж{I.C٪Y$*7]%hfĺ3ҭG !f(giLYI^BAy'"29Fd#l7Jbx2DB 0 `4w^D9 7'&^0LhQ3#!8ovx]f}K /&CWXeӒ&r7y&dTyiz JY? ]y!e3s AQk#͏=Ɣ&V.=wH6Oqyx «RѴ1TC|>Y*K*!qk+$+#!mlcTo>r=#,4oyK_cXhuhzk mTUEyˍY8  NpW? (Í1^"jŠoXYXxAL尀Wz-@0x 2<_q ,a eˍ-з@` fף#0IrpˑAC 9sDu ig]a\)Fx͜ 68kX8(%HJyj. "h_Y. cLlhI1Lx/e bw욟$nj*ҹ.𨅒ez;JEcU>9$sPCqD:>3P|cs2t |a#9OCUN ' ZQg gdK& jg0AT=(~ڰ- R}GrME ;i?cn!@mM9b(vq9(ވ׌aZ.n~*UZDL^ǀnw*VRŐ^BGz *dzo$Gdu4  Ie#D ub $xvk7A(m,m 7[G=e#I61 Y50q>D1 q&^.0r8XcwQ@W(X*Eb@>kq"[0=,񉥈"m[fjƯz Zw}{TJOg -2Q_1+jp?IpbI!YJxoRDLxU AjgYA( 1a)X3`|+LblT%LCN^-kT2dQ$:ii`wK6C1ч|Z&J=xGI,-/$i _ o8NwZK*q0ǭ,A*˙ q;!:kGe2o˨8sY),u@Us>h;p.G+H)D2(Q `ADLNM ec"gD N倖˒EԲ B"8(MfVF%'nowK'/`% V,{8AЊQZ &94S"c08Xa` ܘQ M8b"bH厲Nc\DJsxݡ`&#Q/c~$uY_4r_Uz;( ̚5Et o$҅6c5 vD\jC׬鴆ʝ0vAXi!2 ܋$ ֲllWsH1,ͅ^b#f19,ZLN[Ln\e.  vMg x=dpO_8x ƚ"ZarÒg CcN)-`/S6*UM1#w=yArIX3=Jh (jʹؐv-rGAac5_v*] GW@-ڑh@a""L2 k+:A%Y!F1n:"1uFh? ՟;J˜twKv ]y\":XbA>ԉ&AɰHqoAF[|~Gu1Q`3sA$o7F3M5JOdoY{ŢB"Ds3DX Їqx- b8ƔDm=EqsN R#FYZ`ǜEqD!.&eƌdK,qR%-4 h1eȁsFTs dJHDAޏ8SW,O䮣/qiCcjgaRI~1Z-H_\h$,^ "z5p5G5F1$`$C'2c1<z"2T 2W8tj!roKU~z#$1>]{)%rH/: F`̯Yaԃ~+^>Ki cȒD̃KcE!W"%h=27öUy=WU.|pJ؈.YaLB4% xinnE޵!c}`"FB B cbO3N ϻ:}qk&EPEdʔɔ'9&!;d}dbGJ2IFj1W0氊F.*H@'NܘĖ`a$ kӈՓ Bz+.McA`βzujBdb2"1g M*[FGɰAܸ jťqNW3 Ɇ) d).|8BK"Tn -/ Ͻ12FZYzvbO lRP)Rbh2yŏ(nqLTn}œY7T d.vdBmy>ȰuDb1 GIPNak8: 7D[{~#Tr+FC*Au-TZHo3KFNv,=V5*#O0!2z^9o9I%,"!00'!<2ڸe> 0|5l\6Ob~1zBSX[ФIÜrs5Y> ryc0 d~3bC؀+3I B8 E*~ A8.EԞ2ʗ$"Ӌ2rIm*)?"҆:cQZaWF!IƱ8Ñ3޲Lm"O+a9QMhxjGh8A֟^~pcg6bPd_{ a+*D󞣌-ok)ԝH⧏_ Pg* :#\btFX^SSc]qNbHA.qpV2H&$48\d]Kd® 58+[BM6"YSvm}1$ tWVNWrѼ9cEJ9$[ Lht$E:` (V|BǬrXё1m= @FLE'C 93%0 O&l|VzwR\dELܻ:{Cra 4LAeuV(LHWplx?(6&ÿ~(kybg?xh/y?*9 }aDƟDb ĤWO Ybd_y3W8 VFIq"/;θ?:Z#`v\x" ~[7۲(dB\=@ӫv4߬Y,ucלJc AQK :1~ٶ~72| re:Bd9<XD?ND[nmIJL=Yj+ x3H53r5l@Ktnÿ#jRRXş^XT危U|qdž0䠄dR4PV !}&X\HCN LXP )eH@`N(u"K 2^^DOS9 jmߊǒ%4I<lk=o >?̧K@9qQ -rP(iS  R +4R6Kؗ&cjGXt&.ȜhW)@ajE6|1uLPd}uM 4M3\"h&[ߌHYh0)c,2Isy 3[MW}cݺQə2Gs:bzIVL' cZ 4?&<.`,UIi=Oej2`t%Fy0 X@HÒg k/y%ש* g;BBD ~H r8uU\8 bƶk Ԩ);pV*To*Fєܢ}„ܘb5²{aI.QEfB]78_0@hg^+{ĔXTaKߙ? I1(+G>LDwbxcF" |m]Y \?.61w-[ȸL+$~OdMDξpJBvL ( ! LXJS^#By\w R-3z"s GD 3 XagڣP;YݘܣC׬3%i?bZA"Zy͆ 6VG!wPB*Q[{qU#ai13!}s^ fiH j<ij1e-8qp,Cܚ9HԇȐ!xQ| :'my'#yBK/~ Z"c6NCԄbv|Hg]b;V{| MxלLu;CL,87X(dȗXڈD xg tY'/DН+"&KE`E]Gl YTdV, !z?3DQmeyw^"qLa>Y2{Iq:2S=iE\LE 3?5Zf0d;x&++d޵Ǡ'E )p'J.UCV^/ㄈD$<4ֱjz$0PQ`μNOAZ4i؃ {dPh5IQA5d7XOshODdvI(iF#q41G ]GyqHK:΁}9ċ ~qqVsf!|wZ1,5:5WȆ.Ή XW65Za0&\=z(3ߟOPoGTen?x^dmk !޸`[Ek"FƳ͛xSwDӷV\TkJ$j:r)xM?*,+"׷2dbQ?y K>22YM!_)7'X9) qSqjĚ-<2B!,y a0xwoPcߙe x42ZVΌ+֚DN O 'ӎa@1e٠=V)޼d Qhxʘ/Z+%>< bjKlӟD/OX$\[75|YfFc~13Ӓ"jfd҉XF\sxfq5TQ33`y8ELJY8Ng!T3- (]^/8 uiPmї@,(gO2N?yLGYV g\c4 LulC/DUybhchdJq䨇 "l=, 6l(x1jQ1w8<-oq9\&y=ICR,ܘ I&l|'.NRV(SR8gG;2_XS Mġ+@Dox)ҳxE sΙ'DNIZѲ-O$~Gx{&A"bM^.ڻg!fA:T{2EPM%hY= 8C#ʲ8˜23nQnd|v|̘jv2(·{RÄݸ63_zG`l[qa55L~;׬5 dz1U|WL!cNsoZ0iPF :sM[a- ~0W8b+_X#N "#/➢-_K41R0;~;NW{%Ϩh W+㜍~}È !/pI$.F6{xDm8_R\FT`a'IgS, 2Q. 5Gh^!V~+ %%e`(³< WѸla>s&h\j#s_TpGB:7w3 /٢Β۬(7(:;lFφz="6 Ro{Aܙ BJSs[[+Nj N1_!Ş&2_9f6ؠLĈdb|N'Nnfd鰶֌&i˜1B@%`!h,k&'US oQL&g8W`f LJ?~҂j|ް٠J}ݒJ7Y  x,4F:}cnBIE8j7s̄#C}\b."y)|vDmqq zP35'XFAQ&8Q!J(/]S7`&sn7T?1|d@ЌC6B3VE. qc01(>VcD&naq`bDVkd"2}dbϿ Ji8|6C2.oLEHIy`Sx }'dCYaBD=wAǙ Hx7,-qXi0􋓹ܐ#".wq4<*?`q5HH@;ʌ:nܹ)Zɲ`9`P #Z27EJRχsH% 8nR94dy>'wsG%؞]v ͑aqi =3^ְHjmY C7qVLcX {ydGEwz`byv'  &/Z8 c <'TU1(BeHzXAtiB]İs#d8#Fh 1(K8A(x/+XRq7t528I)`[rU\LN  *6ˑRدΰgі@mN6E7׃<Vq&|L %nn@F-VX~\|wD|)b<Y#@75JcFM|Rh*=\J}q34F 󼓴Ћ lֹfYC Xo|uk([IŸC'(F2.FìX)-Z&gfOd#PhEӜ$FVN6&yu4Ջ)@C执@YF.KC0DwWQ2ca("& @TKc 0QXxeh-.RUֲwb!6FBN/Sd)7ܽ7An3&΀4.3XF(NN\n8d(}XMܿXWiCDWI 57)`Ӡ=<3^b/!4H^0'dDmX▀rǽ<û;+Xھ<)8o Lv 7Jxk-m9sto?N>Xнc6$^-s'0*eElA0'Ռ'Ia7$ LFN4bb `cWX"ݭ <*ދ TAyK.Xk<0v:%_IB։r*f߆1KdY=Ri(.M_a4S0dq"S~$<9ȱUR5~CKs㈇XIr'Y;D@%Q]{+3I7|초]M!,~;2V\l."b1ʙ񃵲8ǵ`$˳Q 8+x0D HF[DҌ6e~c{*F4C6e;#4U־r}sڏ\/J-aљu̠ w"^B0mKJ®x+Nڮ~ ~2rЈFBx2ȵcV2'Ibō S̴OqdYgGb#p0Om$"2! 2N@5S7; QMTPU d8"K]睜٤H@,B% 06I$Obm GiŅ: &gM>l f\>tQr|n{ D>nc^wP`q "XYQLx:~*rJEb(N\cK|f}CZ0J)axyid0ײx ϰS9{H*>1ׁ7`;&8c\*?jXR>38^yna(qnq"5Ly99yT( \ j|a&pļ#/-H: SpE^188;lg*f.*8Fc)a5gnƌAk6Y8[L2lFbu8oI44778A:pXAY`L3*ILpN9?#?yv_b=LZJd&xLIH2&ڰ<)*`C˫ NfLꟼ:qm-aCEEF}'J_ˈB*9|`5' \1 ÈIxDߑ;̴u4 Uw2AMcsQ#ڕלt*!>2WII'[Vvb`9x<k)vx :_۸  .~rlD1*T$x\$U[>Ĺ`f gah.yDdhF 4yc3c!1\9}E': l: tdp܈xYk%6ًя5a(FoIII 4ɰAur)Kh[ЉU&ۇ&Kæ #fgxpBi}z ) &KTy{ו`6xJ~[;oôPbm3^c  W8iɾ\ax)6 L 'B8-BSsX M/Z7nhY)O ) :^Kj6g1_ozý t0L8]bx͂(ù]/kfJGL%n;Lr;ÕL [hD?#iLߛB|s(9&& AI:WbR+hdžl  YWL3QGR%ܞA#BOh -LPb^/z4Cbnf@ˈ/li:u.?,9KZF}1Yw;hOQ|"K'Σ+bI|q=MxMbDf+XB8DdEQ(p<Fʞc4L5L)\ tkY&Q<¾q20ny}21EKhN)[;ʜ`2%0 G*?'xh~#0C$|d,*w)q`Kdc2AgX &%7B|J]#\Cí<~zw8N&m6+s\?d* O|<S)]h;BGpW^YiCWH #>1cӌ6mhY盧\o"nzq!3܂CIE|@Ú/Xf (tM:0W .z0\ A 1>7va._ڈ+;`)njوӸrH~XS}uf *ColB OA1 hO'$1e \߼&- Gt=DL^PnJd:1^NOp}fi ǃ/59pREI\ayBψձ5|?6Tg2LEWM*_˜ > Q$-h8Y?:$y )^_P#= 1Z~MӕZ4b.^<9$іK1u-@d  ׉NnɊū$hTk ,E*`!bc y8q?ú_ # f:L_%qf ׏N2[Mx8*ˀwZ|admOѐu#GG>t1WD,3^3U83Qe/Yxň) Arj]`Jm"d˃+IJ2a}^y+1'Y29R|fNRzsW.*|5•~+?D=>0XlFB^?8mq"O^] :XBPȅH}cYʿs9 Qir / VH/uk @I)`,Q8Q@:x"Ls3HO[$г+ -(l_xbe8u`A#p^C"I x2Urm D54'3F8;lڮ?Ǥԇ\o$ '0T _bi\AS?y!fyxGj`0v }SU1z_xA+ 4%r2s fc2㩳!Ww'+9̓d؆Cb{hBM8?!BPHbB9 )!.p ε 8܂S ۾r;E˙8aK>6z>=Q3/,rs&:uXOH;7NCsb%Tu1}QxT+q8tgl4 g^l5l1R}fh$2wY;FڛƄ^ox%U勹OLBlXCMV~!$#hXyffŀ,Q6 0N*mm#Y~Zd` сxghU"ݭr'&1{?taOdDaAeSQeח%i æ88cL}i̯';ky U6b{f`r, kQ7TI1{oY2\S2 'ї $Jku;٣${[ RRS\ÇI{Tω1":w&~Tи=w%EW5$xi8AtqYܼbMD1|E ;JQVf Vjی X9J=N} @k tD2S3T4D^B2n# ("=1Sdt/Z淗k @#a4HfKNAe; AkjlQN^"j:҆xžZ/]lD 78doZ4ܥx5AszBB)Y Ѥ"^mzMDI/75Mn|8%6(D:,n5m{2Hž4MzNJ,bOEdyHQ&Y0!0 B9/!NJN JxR`ucո}fB;?nXb27q&^2HrUs 'p !Dip_Y7 RIV(ԻO*<œ,氹)nBhDž?}S(LVcA Oy.%@ig{5=â)!~S/BrB Jq\#`Qʔʈ|GetO 7k̲+n]뼐li~:bLAWQПʕB7P0f,Fplj1q`I&Uɽ.RRY؏$< {˼1_ؼ;SV!cp|U"'}Y>Q-OM'cZ=.$.Fy*:se[2$|{ƗJ<VZ.dGK0/1"nV~q o`VCD`0*"/a)p"sD(uyd,4j& 8D笐ɸKӾjܟ\{9(jrM:0xA4i U$bw#P]XG#zɂqч iG JiOj4lNa7%O]|uH KwY64Z+*~+EbQ"9K"ڡ2㬡C;!hGSoDTp_ DP]{="$x -B~Ȓ\V$$Ϊ׀BI/4Hx%iQe0"7V"S.W6ְGV`ŐHsXqSw`ӂq2ޭ%u=/rR D~w(mAfk&#F/ ?NaSVe2JmCa A'-= EuTيְ2'bIgU: oYCQM8z`x@wEP&`(D&k}2mө0)|>+[ֲ1209LjȨOvh ȀBJvBfxHbqab=H3,%[wЩ+݇!(wԲM6?^-˪g"J8;{rn$9* 5&\r!m1,{sor"\sl RM 0s{#\9t'' udFlzB BLlZjP2/DTA:'6n3"06jDj;_<*]NNG-"Jhu6y)j;ɩ8=+ⵄ"/Jjn3 7Q15Q ZV 7!tv`e oLAvOMfk2dry]PtHI19sU7% AdWt sUbCnA57]@gFXA]VGhr&#!L3$^(%0^%4Xq@Q8ҭE^`pb4T 0C4\Uk+G-o1*&ZϨ|Q`,̪Q7 (h['4ڣs ^m`3s3" 1f}DHyb*ih0C-@᷷fAB{H ~N 6<& RcI}16e-K6wIFgwJY)w~,3A$ +Nퟌbm>Pn#s sdv}g mH\AH$Hpo!vE7J)S0z(ox񴬟{ G!Á럌97VBJLC+Q#Tjb'+A)Lmf8yZWMN=0KZKhԑDbdBDׇAH%4nGq6FzdrZ "fjZ?<{@4JM}K:_Enk,4(\=1Nk˔l 6#hA#Vr9|#kjz9AdmH,3?YƞSOTUh-e .,G]G"YPr"#]q0VV/XL*^^yZ%1<*`ל$y-*QeJLn@"_,9$-!0,=!$a.eG!kh)"ZP?AY(V1L23U8U=,[00}Uzv|"u3!"&0ꒁ‘Otd>>X22Y S[N<dd49T*ਝӚAsMO;ёʄw#pm\:>ho`Eq nJf~g@+m\J}c>pvrnoΰGoo{DwOL!p ٲ/! I~䴏%Ȇ <*m9d ~p͆J8bm7ȋRɏy-wI:!]U<6xiU"-yzDש!aO9UNF,1jNcz}G8%ϼ'}Ȏ}2![y zy ddj~Hh4lmswC*|qH50ueɽ"LDLqɰ@t Pz;*@P- ~o 3 E]dX@VW8'E&^'@*ܸ"0WDPa`vяֱau2R[ Oi=pD~rZI 7@=@%q2ceu +:V8aH'k9o,k)P~(߭g3d>]f CSLb_\kܺggU-E JnMv$b'd%R.;Y}ڄW!!7[ ZyM~1YMDyJ;a0+XǪX#Sx4t@S8V*ޏ 1,`Ξ#! QXt!Y1G[TC02D+ć!mozOG:O1#/yVs`D}H'-|~q!|[rIR]n.l3Y+)5pOe<:@Pfz y*2rs,+#̍tEE<+MDeS8![9' 5*ZD76o1xoxHj8.k<^~Jԑd06uEl *4TOiUvsad\878b6CGB`v$ⷍW&'7k# pƜ\"nbD e>Vbö/U?єJmFP@qV&# zёf|~8 Uy< frhOypQS&ճ'k˧f qeoѷSgSGQrz LazA3H{,o"ۦq~b[=X1EбWقb=Ajmx8P pȐ %WPxFmC&#JCFy6jifԴ@W27֬$q0*r_pd@EnGeYpk/)JY6heuYr:~ܩ ;ewFQ$ @};4"*XTUZH#D(dCs Vux#{.S&*6<mF,ɡ xujv` ";9H&.GH=q;~ 3 Ó3e,/.XV󬌑!p|x*VO.m}474ȦMmŜW>2bvǦn=8_UId;|VnB+WƘVV_24_'ǽ ^-(P|2k&ƈ6Rqfy".pe%UvG&6eVDJMuN7%3HBHT2~ىӐfBknj{ko.)Ǚ'4#>14FWKz_2 !Sph-ws k(f2J^X*0mj5g S z&cj c1PU/xJJ]l\ĩ! ]H)sm1-XD v1p^)V#XPɗ 8Atl~+FުWSf̑]GbbN2 Knz$Nwߌ1^nkpe'q|U\m-p9~'9vYl8X2&1nbM d^!Yi xPK4`cSǒە!00䩳?hXɈye p?qMP܋WC)a̙MIH!C4BwF "^z ]EaYboXY^%sIS}e}"(B=`#RC᏷德&gHnz9C DH`Q!O O'>4VJ:+D vIqlFtn"䉥IŐcX_R(d~p0Dx‘!:M'!;i JX^ZR[L*/% u;Gi5 14sȂ<40C|[d<8Q N9>=J_VLS:O==F ؎9~Cdȍ`ф'1IQ(p9kboxwҋ#j.8Rr3j+?)=&E4d:5ˠrtJ1?kB),)7U8jT xoєV͇9#kvi WIHKqS_Q/@9=Wz AC#9l0j zpگnih MZN2+x(E1q!ym T.LiswZ ƳSf) 9~tǓ-\|J>._c4?5b8u8:;!#>Vc%f9ga /SNqbs2TA ^g61'R(Nb3r3ep!=x鼎 Qz`&z7,İ3 xeel>F꫰ECb=p%l"VDCz wQFçY !_1Ʋdi_>p$_1Ǽ}|xļ/{M%Ad#"xeOm/ AY~.!>2\PĖr@%)Bf$:bdGyxG@>:Aì$x43qd If43|r/ҕIQ K*?CQII³9 u&~Xɛ`2dۅ2ŝf/&&4f rlKo%Qth '3bMaO̞]T!,&FtGř$IJ #h/-2)?y&'ǼPԮE]LxbNh!]ߌ/1& C?uRc1ш,bIY0ܖ5N=ub]w(0n-iaDS Yfп  bx ՗naƺ s5Og/(x:'g\8N\}A@)1'ygN \9H'+X%-_%KZx x[9.G잤/de%btɲ_rFCd !>HFXKti['"n?1:;P(2 FB7@GDR`PȊލg F͞7$# 2+b N";ܿ8a${WxЫ?h4lW4Tcf$,wvgkXD/d2H$V;q"t=#=p`.|%dQ9tpquGa:^ 2$/w1.ia2".j'Y>#0 c2}cFp P묑W URMFMY^@vo\( Ԥ5I֎ޝy6@a4ZrKC0cA{0664ȣU셫oP 3Pڢ-ް*yL7gS33u2 s%r"ħ^bZ׎2f;M %OMʮq! 4F9iG9I"7tBI91- ?u8s' ݈?1+" ^*f8e!OE@j($v%'qůPRv<*I1O`]J<*sk=yb޲+;z!X1ꏌJG,\Ui:07;P[u&kŸ'u78mp?<pQPtc% #^3iF$'d]4X%D Y@#.I("7*8ɇַ-8؆B]I;nDK?m8%|7HB [ )."Ɓ7+"bF _ }ck(u1'ee^S)Ƶ t1S1  zh)?&*w5!&XˠeO7)~%r?²]&YkF[񀼰Lcq{ =g b5#AYDVl7oob"Yvq3~2VڭH#z~1&_c||`MFeq8zÐܐTb/Xl2¬hZ(ށ !'q1e /c>3H$Jރ*?l#/ (@W9$ I旳[(r|PG"x cջ9B1:#XYqnM'%~\)J/Yyǒa7PDC2hK\U9; +s7somc"VOZ*ȗu$.AztENlψPND6HNd C0JTW3q@X:}1a$zr8alӣ=rMGAN^2pXI)6i |`D"&'odxK+qw_ zG( Vn+OfFdDw#Zn215(d 0y5p^v;X` ’x'Yh g>kNfp0E>yYDqc~aK'xl]f %1A),eK"0@%4e; 0H%q3AJY ZIСu-ąq/?LRQU'p_l SYJCiL#y'%-/"/G2j0Đ`d\ 5VJKx t$m1.>.dF0LQQi>Ӳ'8 L"ɖ-ĬH%sO3YR!x>~#q\K8#3xJ %"AIL OY)#I;?8Uj9%"m]ђ? x#94&j)Z7I\]C;&Ϝ`QDo8&Ee9n7?Xk"H8#2\70jKr"/)<짵,p}ٍ`MOcydjIHa/Qq" ؝e,Gj8ƒqlPS)|&A|Y&j[IXKx$nI$6 Ve,qG5;>1;:Çd=ū .bcS 88$GY~ébnLpt7<\1e⇒y25ERɜfAHZmdH[j4ku ƻ H1>(Mq$$^B(yfipO2zwFU~F~3LN#~x 7r'Y EPBXXHtsrۃ ,RD4LBC&IM\^KcbU jH92JL00 dXdDr r. k.6R k4 {{c?X$6`.$AYi[&z Ȱ&<8uC|K8!Eo@FyɕU2I)&JE1%H\e2 3&9[#QnbWlg}q3}ZMd)r(36BI<)Lm5xᑷ<2e l|Z4bPdW2G[(DFAϪBh{pZ1 oQv:%c1cfֵ#0" 'hSqZRB;p9$-8B`f^UJ%(cThDDH=aVb n5]\(KV(չ>{b@rd} 5oj$9,{#XIme‘b:= >77D Dw8+;T58KYH> RuDMN;LpۡrNd&d;<_QΨq[\,Vx1 uUkyZ;|%%)U:;U<`B}Pm&P'i#@W9nf[tC&$8=yYjx}b%\c4\./ƈlKưnp5Ȃ_;^syXq*C{&x '.EVMudhƀEO吶F@:\L}MS0H6km<-&?'AK6|a0>#yJ{RQUj !*ۥs3DuK$fqO:3N9d~X +J5o\(u~t?ES|&(  9w;?&mY97 #Dy<`&S+6e7ӄFTl&Ǭ(y (rùmk%T1ihSamu(w qI$JZ2LXD|` G98uiV}g23Lb^0iB]לg@bO;*%2+"0L98bB2dEHU{N9~QE2KL"Db bz*m~27iY>*q$Δ-O3?d9)\w#$a~)2(&X ?2SBSlvUBW AvQcx#>B<@zKx5$k%?@Egͥ8ޱI@4N[ɩ.|~q5>gNTvF$x_ho)=8,+߬4rd>Y5DIITxȉ,<> Cf9aJ`{3,D\:ŶxAR-ɷ IdbDZ\S>OfX -YĎi/ʩw"Xbc``t-qY aE`9M?@P#xș0uZpG/$R; n 0q]`Վ f]v/ԸIo!,{Rf/`$6o.WR1h9Xx -"FXVw_B $TW-h$tREtF˵sq%%$uJ>h H#gkG\Ca 1X$nd1ц$ GI2Bmh:@T@p4E{LqEPFJj^2dDiȒ5RƕL2I0= /b`X6#W[J@0u R4aX[J^\8 5lMZs``ai'x@Do˶2YnYRAh&/1G"iFi_W JR;zT"SDyS,)C8cc ֜r/_xsoi [Љ {xA)'Lߊ_@:\$` o|$z޹Ūxn.5 BL&qr5uL8w6Zy$iِ g]<9i 8&SqmFZaO!'9/deFc8(bJ{jg*)-1HZYbperLsȌ`SkBd|8JҿTʓ-`$ 8p:WFNU3/4F; C,9$J$7YHC8h>0 10 DFOz@ p@WM?aiQt8y#%qP =ci%_N dDhd⣑\/NCb7oȂ~9c̸as#޻ٙ rxIJ+@S!!/9$ CzYODGDHЍ0#&߀8E}@R]%1_WXbEb׷2ec}J%SnjҼQaxY3I`FXM!&"G!"ы*_TgWm&*5C(G~[v? Lc]ĖӅzgw##/g$ KjшQ<;CFE) \l/+3ZØjeuf'+M'p|dǟpI>6@kS[Pɐ$hx a eys4J^Б'hKpe`w$ Cq=qb\NH]Ă_9>,%Ǯ N2,Ww)S =- CBd se +m*Kj\bu%B0CIVw%frXCDdch4nƟ.$/l_ ӼQ{q3@}yYh]s Tp ؑ}^CV{`8#bh{0gx Ѳ8|cS4y\D 4˜-69f>#LHEWQ.:,6ی,y?30nE/8icn?Ӆ}`B1zЂu_eՙk>㺨h +cY9]ƞiQ# AQӀOQmQ:/gKQ Obuɓ#G-+%=.YA@`%6MH a$ 1z3qڜr{Rh8xᳩ iXH \AEH ]ӯ/Ĝ !Z$b)q$*zs qfRN ,bU!7E@4_6N(_ӁY$cj &Hx&.NbVN~O@nw갊0A0D79N2dƒ$zȰJ [yzqauգxӿb}tYb4} e'z /y2N{I7| WkɛǡL>]-Σ$إ3QQK%?539$D h7u;mb^{"Sl )眡*~f9OargsNk92U2Pu7};>gĜdۆ-6t0mrt1cԫiY1%-iweL,XWӼ} \_ nZOx\Ro0TU$#"raM9K)=Tc!M !.x!?Z`"#ͻqxcxUY:0'7{=15H@3Iߟk }G~VTE<5pa4uQD^Sp񺃇d,#C9xѪSg{|N<:;&iZw!EI o VGaUMJcXwJ35Y%j? L/LcXkݎ~rC%gZ15ČP5Qvѵw33#*=8IAIda:X8 OpCM~ёHJ^18fmLrEl6Ěf\X"FFȡ NDmJ/y&;}V6Z~1~S-p b&fa _dV(1ˬBRU XFxbCc @DBѭ㤠.Yoj8Zn]q)R3oHx#*HތN#@0wUZ(qoֱ1&GHb0%%-ܣrj"B*w @Q*-,b!0TU6墺r7ṟ[Dz80 U \'"~07@U'y!n?%fɢrDEl xvc XAh#âἆfZǹ$z^声8x@H`pka.'XL@:①NUbE&FG$D!_5a@On4q9[0~qxf*D^38_bCe`$iJ D=evpb/Ge"CN;DMkO'E 'j8hE4M=(ޑ<>0Kx)"IbU'i&H7YPDbόEYG Gc ze Z !<5/;\mдY 7ca]z^59.KNqy֌6Y2U_Z~q&!cX !X~rhÉSgE5`Yμ9MȧD7pSO,B&A'SY:qVOG2AAl9W#I0ULd Bd[h+.# _čpr҅QPe;,r׮r4*(+=Of8?ܞ4!vE=Ih8FE윊"Lbc%5)X×3h `]jxroА0~pq ْ̪)ƅMumeɐnb op۳ZɗGBG5]Kܰ+k꜏Adpǒ~ðN9I4"b0˾k2tY'2~uhĐ{A¥! GB Nxb;q o ;iH<+,Elm5ƀ8p^.~lno tB6hIk)cĽ 8!vM!g }Em6TjWH yެCCx:Z>;LmԓUۏ }驴\/ŋlY!~9O;m9B!qmEf9<8T:0N\O G_;)5ob9u[ l~*<_债=/t)&w/p\Z7cP6-xeҹ U%]񔷆8e<}[ЇX\= 3Q8 ޡ[e_& sA)d&c(LIuY(Xtݫ$_Z¦}!B993!gzf JւTo/;2RQ@7wjI_^2'2F3][sAV{!-+DLEy7M=۞璥ZH+ڀcY2⃪i>.xtx([!o򹲪{=m̫a!bzV2kn}Z[%99&yzٹxtG<:ҹrJ9}|Oy]0`VT|$%nOw}@y|z.rdɧ#dlYP78&j_\jr^ vb'/ҵrr{EoQx_WoņMj߻#؋$=0d>\; H)vVٗK x(GlYgAQ]r㯦(5 0Dbv ˕ KƨpIb{Ujs}-G9IoUWQjewByk@|b|<'E"QSmd_I6nȦ +ྒྷ b10f B>G4Pq(u?{ V Atc|ǑoQ@= c RYxy&OR%t>-iggKf^FG0#*`a*Ŋ$$YRVix>5*&E2&6iikP{MlKPs}m\"6=jsTi+UN?|z3F ᄙg (rry0hdOkeC9u܄bp"Pb*`MRÛShuacbW6DKV`Nޏ0IUϻ7$5~M<@ ? !J~ҝJJԕ W:!KpoeTB{QCA-_4bHF#v!Vk \cl ]y1(8xp_3SkzAߧU] l"qܓ\I3vC 8Uc ,U:..QLoO1lܜ@Tc4$*/KXÌѯ2 dZ(?Q{s9 2dQ/>`,34#S_QZO?IцJ.jZʌE뤙<rQV'iua1͏O0N1Q ws҇frʯO9L-YًYk߬/ϓ:m9.WDdFnIE-8#3`r<70  [}OwZJaBROXs/ڷ/iX?ptMp'^ ?D*z‰2Ҧ"3l pLDg{LcC~6QeF̋XĖ~V&#wHπ M ݚ];39Ȇ(M,X΁e&ZjB"b`: I<Z՜i Ր8-Ējq9p?ax`U7+ Ӷ1DsCpd5؆,VX)3I^q"qH@4EO6_-M8Pފ6ˉFcf2X(Av1RTxFu±5-ӱB# '͞X3TZ9XA2oշCLcmp+ c;t4DVx/#';pxW< Wb6ݜrf~u_}/nzߚc_ ǭ4_6E!U ϫ=/<\vq`ȋV\{%&< I~sjoWJHgS\ؕDkQ' Km„$QsM|7p}CQm깇ER"ޫZȀK/L_&Ҭ#02 D(\Vz$y77M j t0-7Q H}ȾZJ|:6X-wYT[RLii5,XonW4 nv؅ԁe>nZݸ&1;[Œ)[xBXQD-:G2lL5 E4J&ph&.93I9o' d{}.No'y6!vWFuOJHH$rEC.uA_<KPdU:ƧPJ߀K9p20p?J+ynZ@6>!r=ݧs[ s.G"Di;;1ls &|H>p;XYM-,$p,eԯg3D&gd\4ޖSʢ$k@~C;_uUUmpTU'Bn2`m:'ԡb$2NAk97{)Aa9e/膜r[z2~RJH:>Ep;8fCH|A8#,z6iBioty4 :}QȌL*ɧG_s_Т轻Uh W4@pf>X5o I bpɷ&Hj8[\fCɳ$8!0da_XgA0詘n[GOܡcS(6cda=T~LCy VehA!ݾY% 2Ъ_Tѓȡ{%c 7 g̭'v;"JI`uczL/KwSGt$㳣!#&"5i4;i>akz&"-WxQ̈́WpUU ]`UC nėǴy< {J;?3Dt5ebG8׉HG^;!Q ZgCb`OS&> D- gǡLqR_Ci@a}\l4Sςy? t.X.X:t>vT'a(T` # BVMq+fC-Bp1Zۜtu驃iUIPNT8 lY>' t!#6hk_8\ۤf~gEffHQuM2~¿ZÇQ=g,Tl+>=Y{i7p8s])Pƀnfu|+H'!ޘ8hx19vBWy~ei=aY?&!1AQaq?ZS/\[J1.W+vP^5eYx !~E~|J80 .1?h=}c GQ%$l]mbTvbc2 _䜀qi5A߃}aEqj7aံ^7F0=Y>&FxBabΣa93R˷Ļ "`gԱD!>ЃxAK"%8#b8JAJמkFJCPҋ .Q]Da[ #Vܳϼ * 7>Z` ߔBݔj*ZS ,X5K5[Y~wҺFTd=L-0'8bQlוּ$I|ߘ+@4i2+c4mAul( v2̮@n^$4b.QW+SEV<=* 5()1]ԲGO% Qze|F3@}U9􀡕LmPg~[,9nL>\xݏKtܩZj9b,"5LF>A\ܺ[|))PQ]GqϵLF$yQAKvBF:b>kjJ lF6ke-C U)x+0,M6 1K:.sg2v(ؘf *R,bV؋q-GV(R 98q:}MA̽fc:JTJY$sUf"Y\Ƿ0h#KnrfGR3"[|F{(#0𬘨R@$E™{zC!PF3|znt*6xBP2J1#W T 6i*1qXK;|2|^7CLK"爵̽T @V T TFp9saĴĺў pfKjJ WF\ձ/.53&DRr{@u|# {VC g.!RURe[K41quoQ%+cyk5."?J UE,0wpcܰݰ.<\?%Sy4sQ|)_BՕ ޞ+t^a.Fo|1y[ aPWሰı/rF=K bVR"Wl! ugSYهx*]Q.xd%2bWW3qPGֿќ6[FV+o*7VBTBhxX0EW i!OL;n|"p]zC+19q-{GXY0fLcN)8\P꒾/1ϪX 5Lnn> VcJը1WuDw 4\|1Qn%<0~@^yܩlv`vXf9& %EħO]AΈ(f+w rK A[\Pm{APE &%e e pqC+~!,sx+/*Z3i+~4Ok0kLʚY(ƽKU(uYGx߉^Kǿ S"0FAX"T aw.WXZX7((aܤi@:TԔ˝YhKokzܵH+e+iePcUF z@ˈU.jk 7C7E#i,hܭ^w.:>%>bFĭ |^p\.M}W+uA9khf85Wifυ®nM( b;*~˻`E%eMyY4.o/@-@];ћǧ?_X:Vp^ 9\<9n`F!H6M~ |Wj9лt Y#5>"]*SEFu1JRA(akq@q0јEα/&" X/wp67ngmFϩ xAwzfW`gTo}}"&ZMH֗tvFx`oo0o]=x EsWkd'A/ĩGߑ](mb)Uwt+TJEEts2!b?`h @2@QỸ>OzDqJɯ_,. nw\AlUn2q/7 IJ Zj+${U9ʌq]% *0ZYӸ0%ᅠqAlb+#!ǭˉak+ 3 ۟R~,J(5.5HD8D.Y%i8r_v\,."{_| 6%P xVbSLEMx1% y/X\ 9W7^1 Y]_}aPp8RԾ~zqf]`D:IjۊtxaKVvOxEG@\1GpW-^C?ip̫F Q$qFmqja*x!epwu5 -*s4KM0uxpn!,c[cL M1b+=\N?7=aUcQBjPy`8ģB3SL x&jGrh0˲ݼli aK}8saj6ŬƆ\[z:")uӲAӋ%~ѣ=!=R2J{&.J|%DhˁZ~xvǥclϼ52sg vL#8 }mz@j}ajwŦw\38`^#Vԣ9G/E&/5Z` UÝYMI-mp&V~;4EV/*9wuN?p?) Xh1!l̵F!"V{\|Rס)BT%6Wޠ|~匢wN3Q1PbMO,eqJ__ϋ}#{&M:3Jr [^YnYm1^h%OafLfU:{eህb4Thvh2<_*} q(qj%c̢sqй`"X(S35 fa"SɨoCF $=U_\z/:XЮ#%Bs"w׼mZ KP G?ޞ^= 4ϴ%*)'QZ/ 01Zfy\h}3*İ.ѭ6"Y \Umc00d`X!)zJVT딃 p:81Y EjB5yb"Z6uenˀ->Z@'{=32FF"oߘՎ_0#!׳pE[ ) #8N7`RYE -~Ie vwn~STJ+1+ e a *1Ha[}azu 4]Yw ڪuv.Ħ@TF)c- 1|y`x5*QtWzzLK#DyE\iD9 bpߗuo'Xg/ 9S>BsǬ3n%\_> F[0@-B¥B37Ty# ~%1i4˴ܬȀKPy(tu0Î<7XYvg{Nݕ*Aihι4q!;@?ٖXF^5\{C\2,wM\2>nP4JkUaLZ?vأ$q^mv)ϼYc") v}tST-b* u+M~'ڔWa]qLL@Ctd5f^圜rן sMLz*qVш dhxC֐o, h+ܬ2ysKq^N8+l WMfI_z%m0rKt^k2jQvjGr@\O_1N%b"` 2ʬT Z;\j# @:R+\ %:( +q k,B2TԠWDwfwq銭P !xoQ-ϔ6 Fʋ|!莡7gQN0.ӄA(443BhW4_ gZ3laԳaPn̲BkOfq1 gL})ۓal=eQZ%TGazOf[1:S3S/ sKwqSxUGJX@-oPE̼Q#Uv=lc WV` yFЭb_XdS/x{%18U&\x9s*v0us*]btU Z!a:/p3wkPDsp/]zku-UF8#3 F"1jb-Zs2Q׉?gRERN{E±^ wĩ/h^zЄg:p|vV~AP% Exj,$kġ%_٘Q sDu (SkisN1舑Ck ~ϧpvx-VV#/,59zG6g7=~ aKW̥3{aGlk%.™,xp#K Fi/U0;w-ŊrZYDmd$OHd-p!g ¹0Yr p|:xsg9A`ZV ļb TJw(n!se+zDJ M)JX\fLjQK&4,sTΛ 1xb DϣԘ]1sk&b X~"p^PޣP`2$dBK2hOHT/;?XV<<3O{&AE[JĞ6`P?$ sc-Q\Cr?ۍ8%L@K>ت)swGk(0=%X0-6&&տke!qq^Ɂg*c)O5OosqW ބ?508gXpi[ꦆjFsU F{D(13(n**V!D‘(߸-:XS<"|Ab;}(2Q,k3B1XlmU^bTkQ-ƊGq Ǚ~Jur|pzKrX3(;c*1gV޽?qCǤn QDZ$bY -Ķ lѿ6& 8Ee]HKĴ_+U\|1Mw)Th"ĵpñn[X @0idLX^.D0nPX%":`4yK2UK q)4jqz>)>eu>3 fSO0bD@ܭ0 3qS}2V^CW!Q'8s2~]S-;K"Z#"H8UGtd *r~%ja2;0 @ 8im}D,9-*L`G@U XPmZġbqm[*8פJ\_Wj_ QlRE*xr7GPB0DQ[s\̌r2)K/ ?*r S7Wu~uPƺ^n1d%waFA 40 1ŗ$dl]3rQ`~q.c!ꖫ(S2 `a@;ax )r 1#5,פ,r*z2'+uB#J/13fX"f `0#6*e^bw_*ނ0C*z9s6v`8@Zo̳i@Wf: cTr {#wnU_w9"1LG1wFBFB&}AUPq +)>?>򭂱 [vKT%e ?D6ˍaʈ+e*s- 9q޿03rm._R{[+A(8;lt ]Ɛ!\ BqDn)u#$Pt1r$ymM|ߴ6b 2~`#X"2 ;7mWbQ柳pe,3/9qsӈDND hTd"(l7 *J{Q qٖܰH\]4&0L1l ^ %V݊mtB̵y.99yp>C1u54!-MES|m8OPT㻋 H`%q\dx@Mn68U18 ehe͘p sd\/Ote)c~q 4a$^j [\zBd_slFƵ-I)b{j>8uR-OSF_&1)¢J]f%2Kݵ4^KY2d] ߈@SW1"_/-k%+Jcqpy9JemRCܤ'pZHT.#tP)[F Z`$[ZE+1.=Aj(,MѨ5g!5ݳ0yCՙAZO0b*pa*ymܲODQ1í0t9&TfCvyK_X dy,@ߴRuuQ$~j_U3 Վ!L院y}d1%:2(.FP]_xi28V*3Vo=ێgCKs}T &!suM鈡|\]Ks {TuΔ7g]yҕ\uPVuh;&bG銼=P6Qcu!M5 J9xhyHp˥DQL "WV ־-Jw.>Zi^ӷF0B8__I_|&F,GA i{buA"RK\J y"FhD4cD TsNˣD&nbqw۪6Y``EM-J70X\z@H`2-.>en: h_0+.6039x%'2Y+}zf,H?ѻJEl>`{:(}>P~!g.6'XET5Rϴ.SA\aq\7xum@_vY1cYRjSAq(*u12un4 oJaNJ"C̸"ЋYu{ İn)9e \^/RPס̱rW2kYlwr93}AVLh PKz^^_s+ԿoӲψ</M\!HRb VACL+f5҃4<ڔeK `9< g/RW*\Y -srQ P_p Uxq8˸GĤ*Ybڬ mr5P,UAWss (Tz/_Y\\1 TZBvh090r("K)\VZTN+yv]J>sُbV-P{먁}>< F+?Z/DY>=<z̷,0)pinKa2D{pQآj5AzzVK>݀Q\b \'b68E+dM}"f F#C mm.PQqWp@l`ߩ.b.&oX >`pmZ+]E^b#.ꘃLwMfè@0 ϝ sl^]ܴl  b3OErSmLPy/}@Zz̿q;,-zˍiq`㈬7BuR?ةK08b =D]c=NJHjgDI{kU^8 U0~zr9d;|CWTq6aZ^ CAqUfe^1/_īnPV''w 2g%[|:Zr!"so2n`8)QaWyFy%f+&,TBÚSBP(YrD ( wGR c@_ 3l@dw.K[ [ԫ/?[TN&eDymyȣ8 Idی}\p3Wo":Fٯ]w7iY#K.IG/SuEn`!c5(1k0PKq.M,qWRO&3&3h1nt2eSa|EyM' SC '<=@Mc.j>/LM] k~!HBe6szLusF'9aV@,y TbY~ɨkJ)ё륱PP m EMU2 **2$rp\Qy%ωoG0]Q}e#Q#j͵Ks^{ <)~.EOoQ.r Az{eL8v@H[EuAњTK0+%=Ul\@[%\o5 jѻ7W ]ԡ%P_p7hϞe򎽷а=R1zc>b`YbQGw)hrq*HBڻ j!w%XUw)uz/Q@͓,'긋x”1. 8g%vGxxv["n> Ϊ`)1Kne Y4-T+9 ,1/1EJz=/$we}fݽ*n Aqq,&u}XFT4slD!%voK.ʛKYʈ(ɲv%>%)6hɠFz\/!_յܰFzW6cnK0^~(SܑwIvͮΡj64w:|K }ct\{5xm5ٛP@*9MyֺknMN)bwqHsb.%@cפׯ0&yVX(gzٜ}x?؅ͳ̰W=edUy|A-`(#R^X 5)aw3*_Ia']Ayh)0n9Dg>nPm$D9^ Z),@qP+ @h&wBŅ`1<ǝd=pkщubpJvMouEQ,>gBsDuƣˁU MKU%:).2)2,Qg/z~⠇@  BY󌑌Zc:0`pȦyCY%d/r%Rdɓ&6AoF$ȅd3*'x,1 ][_!uqȆ@@An!u%Q!TG8j(=j%c, (LMܮvu+)B@hLJpse0o,VrA9.ʲ8)춴%.ePAw HAE\ Vՠ-\f9yP)`,i%\%VʄkW_H#TR7 N&WmV9 xٶ !2Y-[\n$xP86L.UuV1jbaD8Xҿ0n. EUE-%1h^ ^.SPР}"1#X0]+- 8n UoQVhe<]gS%$Հx),My{N)OaiK(鈡.r5E= ]DqtPܐ!eD$5/8&,6\A=M] I E1{ JY3"\YF̲KU*e"`$Z XP#^bguQauP']=%JqE 5/nX_7oON)Jc|r9jj 0杧j5bU#EIu4dX[+6mw_o  bɨžCAi;XU ;+PZ$F69 @(x ɲ4_9x?PU є8nXxR~Bdq}b 3]/Wj6Ur"Z*YZ$@e8`Ӓ%L=D/DLj% prӿ!"0/'JbSwŹ~o&!1AQaq?\gbuJԪwĽ[:r`{ʧWސ iBKD⠡ȑkj*[anh⠶k+@s/qPf1}P)NeAX5/W̌pnbQr(:pK T]!b2L°ծcOY`Ȋo#Y I ,>Bx]cRYaJ_˸S7 *As-]@ۘZVTXQQw 9"`q)[V*^ȣbLS0 /2 XD8e QFvcr +bFn6n n 4Ol+<ǣoS/*(AnRHb:0Yvڋ r`571d7eǵ6˜& U$r@` &ZBJ UӢT l+GWܱ:Bj]N TX& G0"Ab*V4" ͿSC(sjgx8b 3"7짬b,Gۼ/+Qy]!0`r=)|AryzEi?fb4(ZW_,s՘Z_;'67&0,|.bF B=}(9LPUUK}U8,:Jmf@uP4C94JyaܲWT 7}"E+Cy,:a3*\ y7{ 1,}g鸌I`gy/H ABפ 4AkSjn!1Dp3]H)WD"6 m 9og7%eXbf\ˆ U-&oqda4oWDH5 (쨀q,R_QָM(8IcƸ!A ɸ +ŶMKJ”$i|+1(͈>YṘ2ID*Y[ӟiD/ HmӪVfHZJp 7b!%.c,jvn]fs̱PY e>"&)!c"l PUZs-QA^c@R$/`Jw9>S|F0,cCgRr""·p`8r$=a9)&OFk1;]/JTڭD+=F(G0bt?7pn<Íg0Z( , S*RlON}C%A;=iYȽ2Z 27jDζm8Qiw״x,ty{lƊ=CCyBT4A .)FZYd^OTh[rmCr"(݈VMܯ1W_bE|@ߴEzN*@@G󕖘Lo%YbHs"(?J[]~bb)fb ƒqzJ((*Cr](LRs8U. &dj$|@K  ZYq,Z.AW^b0D^e{%RrtX`*>e$~p"%}處†мtrd*eß\0Wjh-̌oJuh̲0  }Z|⯦, &;~a̵ G-[4>P]Uv5l)_hNLPEcK  1.B d+hŘsOLƪb bRe)hΡW$pQ6EfY/lCa`?J± CxE-'H&劬!E%6!!rnmrK jX9ǘ]n>g3py0^˘r+0SsH9m'R) Sy0}#U c#*UA]۰i:YSF6Ąk"NH<*fh\Z!BCѬCRUcSԸ7 d&x9es@ 3TT˃W9s3o'9o0ZT2hcmmjtj4e EJd Яǒ"j\%X9VTcD`(<<ĖB}eI/Ϗq#a 3+=A8AWN-1mb%1~n,z%.ji?(4`a]pa>bNQH-&k2f6{MZV[ь%esLuo`[Ի{֠5*4a_p:DpK%FpA;.2s2JЍtr3Sg0V%}F Lu˛@ _Aȟqψ![pъB 8,Ñ0Ѥ+WARźz2uvASZ[(g~UUPډv瘵y9jbØ@94L5ĎbTpqzR5'n[)yr̩RktfӘ]6ϴJ\^+0x*&.w $oJK7x 6oۈh #lSXf N}\ź9%*f\P,LMS6Qu01ƠGG18XZF-Q)S&PF! kk;nEyX]o>p0B1`Kxu `ʘW Q%%!U׈eFVH,4=RoD*(\{u1N%h<~acb- /?Rk@ #„34Z]jPu[2%>^ keUyILjH^lXc<l6h+zu0 Hp\s?GJa9k?ILfiZ( J:JLS#Gva[Xa^/1\[7 SbOUX`#N"5 R_%A f l+ S׹hD |FZQ{@qBb Uu/cXJW0Ʈ BmJo1m2E8_0bK͉D uĐ1_1[D/XKNjr0\XQJMk0AiSN?F,:^݌Tzq_BR]j]V*~#T8g@hoJ!D[1X-)̄pˮ՟yUEGS/P>KX m *&Px*i%X1Le-TR"my!6q؉[ a]@up&/dDJ)jBX02r )czP%Ҙ? qN`=${0bg="87(LT&J }4Y-(2XUh5O u4; k890rۄ SlL4nb.[Q)h+=X$t02KFض/pڢ[_ |D@ca32y9!.ӈ7O4Z«f;,.pRtzP\8sK3 SXNj)sfE'R))cr»e %@Ϭvh*vBD))u92WMC=g;[1L?wOhY"{KH=#&cFKJaS)BʖXX(D`1"%&0<"*!.df4Mi[QV:6Q ٩ A11'p@̶ sb@d{L iMX2hFyj j>Pae 7U+Zk}Jtj*ܼyY jil2s!u41ڟi Xuܩ d6YV F2V5A.n-̲m }&J aLQR6}}X> Rue@"E@arxq4,bljv.nZ®L<긺8$W-V )JaOĦY'M{ w H*#uAu#ܡ_p ubMKo:`:f6YdZ]F7{KDS?8"JQnD suA \Fb% f B [R{eߍ dWc'wix"# Raa GT@hs8qk&@AQ,b^2uĥ+D:51eqd2\hZ"=幦2=e`q,C$F9,gn_^o1bf,QFÁ UY $Ӵ5*ʬ'[mX硡AU"/cfP"˖*r:_+ Yeܢ ;ĔV;آVV7--.-Jw?2;щ9bF'x8n5EWf^"XX4dQz+sl@5pb((@c`pRpII7#t˟X'0MPX1T4uSqdyɃ1'%VajbRMu_Ùo {ƀh!Y]0@/-0c&ÞT*c*.a1  *-W//)ҁt˗ũRV>{-8bFP@[]?' @dbJ/VD](9%A4AJ`V.!sۆb1CQ^] 3fQjO=@M " +6,a˼j\nܳrL\*+QcQ#ЈVpu EDVsҬ! #1:F눩{̼X- aK<5~a6rBJ ![.2T[ebɍ;,<{*P-e p/2/HP͙soOϜ*ǡ [ZODAiR)v_ޒYG=bAIȄ-.P*e,G,Sdw\:%qS6n)l֠U,)  S1u'hy72+=,U$\Є j5U4a<(X¡:92d&7fKtAa^` +#}siAV % EV"]Vw/Hق^Ԩ]Pjli$ ^ e`8+\H 'P&E)RXK?c\Yj  ʮ%5!z -|+󘩺f6q z@N:RzEVPNx3P`;WTb5)G9rGU22M7b9769A /HuTbTYJgBDwIjE(5LF;"pCr^ʸ`!Y1pج6YPYqP;])XX *Fީe;Dyy)elѺ6N,(5+S ‡je&'oYk:ss']JRYx!EEQ9~8 р*dWX1v5h fUcLB"nZuq8o 7LnjRtiP^eKaPpZtn2,t-^]32*ރK(S"m&qh7j1-ku`oPqIJeLY3KElB.$32oVJt"6 &bD&YcPioX֜ gy`6nZ 8@-70ZFVPU\Ǵ<.Yh*Yԭ|@EakyKq,ڞ9{RnRSjy/|:hQ-;rƂ6V۔X,l5 mѻGDVja2򖵮\XQ}ca.eڧb8"C3ho1e^ ,;.R'w ,2ījsA0\i`9w2*[oᴴAl̩X-QzD-H-+dVp$)XPH*/UK3 g mu[, &b؍eR^l%gXtey>&sMF(>aAKI.eRY$|bT-U CF^/9֞F%YUBcĉP+s.kOf"s -;KZhař<ܰ;`lYәK@bBp GeIQJAE%!m,WjmB( r9?RN|M|0ncZ-}S?5#mKZB̡R֍0VV [ %PUw2mEA+5j՟]ڭZ5.!AayRY/sX-ܠ)h״kT$@ƌLLLM{F f%ظs-b4˩۶#Վsxce:{FN1`e&Q,jy'P 0(DGuzK(ŵ2 + W}Ņؕ(6&ۙruHjaљ&9ucH&'b*#hbSSPPEt["۟H}%WS @#WJiQSA Kɴ2:ڙ.r \ ae%A,M@+`x*✕M':H ÎeH%ܲz17`\LUW/2}w~ y39AqNܣX*ާ%al1+-Q; BQcھ٥S1w  6b*N#m]cSuX^ܼR< C̽V%w,Gb6&X5p!+WfeB/.8UA* kظ60Ҕ8. ݥJD b H C,Y@ܾ{3h?£D/A)[ ߉^ M 1f2 KF/\b3SZ|`Y`46wiez/0^I<6lBOYl".9+X~#r!d]LُF[rTωr yAĕ evĽ!gWh]\M;Ǽ`j>OoLF q=ԧ&׫-[ܫ미:10BXäj\}* 1-{.trbY% äH[kPvN@ӵ@كjB8+K oiHA6eu^#F6qUf[: d(Xbtg0vUQA-C 10&K\*Y,(Mt԰Eja۬ ,Pw^uPHWoyGji \@o!צ"J7HCTk7`Z*XK@w*F:MU*>b$Jq%L4j>Kq:B`ҹY{->f%t.Lb2̱լtbJ{PRј"z5_` [ԱW2Ž`=aTlBu a[0,iεK!#.#`2 V.U8, e 5Z5_E]Fկ1`a=R\DxX_Kk*MƼ"gTݾ0폩E`k Xrs F  'o"!5' E:9%/Hce Bzǚxtyb?Ŵis-XwɘN8.=¡ euTll] .:Dy6o_TB _4Pz%K`#_|$iEjj*8cT{gW+q%H\_mEpih,00<ʍ!3J⏷qٿcj#R%ccl! < TY5etCbZda.̭EMTsmS/`#RDv< ;MP, 9Ll#F{5@"EPaf]eK:?E=HA;e !k.m-,. Fe ZWdSrB2f:@NqWL`~ @5ij&A{ #%B1bu&8ey-I0`hBJ!,lh(Zq7/"¶p$ T1 Ѩ.cK Ӈn^ă%L/SUsww6C.$.a:898zIP&z'W`jNMU`0Q1 =""Z*Z[+amvSMa\KnFhQHQS]CfS`瘉\=Dё`nv.Zl'$)Co*Z8%"pX45̵UGZ(F"89O\3HagpTE0t%vEz+CZB,=_py)*3d* byİjLE6 eC MVV3ƕ R6rb*e0IJmH tnQhE෈!Q#\sBMnrmF]5+԰h#`R0r7oi{[;Yt+U*CRl  ePT MTOZI ㏉l2͕wLHǙ3f30\EWp^rӮKD $x ɸM5rؐv0UV'j*X&;qpTiD+_10P۶,![c0ZJEg3EQCr#9;9.kx?FX_?ی/q(Yl+K+66߈lwu,#'# \u~ƛX\j B zJ$OX e-q^}X8G7p0:#rgĵ^h-.1-EzBkk'6F$mxtbb)v-\G(gxІI@SJT~"a֔ȴU@pj6x(* 1  VX`8"ٍq UUGMw)]W;]rBԨ (K*@γR\@U_@g9\`>4`E/bs4+ k00JU~ E8 PPZlhEiC J(0M_OmraQML(`XJψ1k`n:2ȅ\~nS^s0F7 3%PU %,jڳ.U^rg_MGs &*.(\ Z3#!8f o3Uf0tQ9#ҫhs(\eeER( {Or v zm?r*J^ s-**_ 8Za9xJDiDP5Y ̒c3N 3/dx"gI雀.JO1u5&fwy- ]adAk^Th\ *Ue*j͟Hrpd`NO (c3@Wna (~6"& h ,(" 8e~>`6SxY-z 0SW/h.!Uxi=XYz.T^RdikDVwr0HblګpO^wX)!%LQĢM&3%ݬ’N;sFoUQl$"YiUBWmCIm`<@Y !krg:.(R "qS1dMG 81;-8\G{r0a,[$w8HvAX[N6DByTaLch(e04]sr ݉UUauBVPh\>`ͰJ>`h)ffؘUNe [=ĶZL|$(UtHߤ-n̊nJ,X`Q]%EbX. cUE8F`DJJh[J&`cuXTZ`(/5sZ,TqG)[fղ&Ta/*~g=Akc9_DHE3c>@VSsqrCa *hIb|MKql#fWX}18=cp./!@Q̦ ^t`dO1\qT*h=c/3N" [_[ij?m pH*9߬=ip2h驉*"´C3~1f+5soF*V8ذ8.m;N=}"DB.4Uݥr`Xnh*IQa9N%XoA7B'/|ŠX 0"dRֻ:,>e R4%u1 qgTsfd48r@/ .6+]*oЩ|%Vxu5ku\ȓ_Dzq ; _s^.V$a\Pq]FyW'?K<|>`CRE#Y#?_ XL+(gK7iҐx[J]l[dž`nR GSVaL9A [ۦ41AA|`CjU ͳ)آvW;_B/\$5] Ti{@40aefKQv$݆3&МۡuvH-U);Ksƭ bvBP"2yG#i!S^]w)(TK>6BfSVlnReAp @A@B7QQJa9H1nbt0dz@ɼ0Vkf$~ [wR^Z]1ݚ8j1N T=3-  Œ!kzK5;Mbzdy!kc9 y4Z0(\~*`;!:^ޓvx CA@Wn(4&`o&pIX%[a O4inbhS/Qϔ'O^bq`Hc\8g!oR[xb[sTEC #W>&aA PjYʅYw~UFӠ>(TvY$ȄԮ*͢huJ\ ɠmД iPNdkGF NX bpjFK4 wƛ XU:OW…qPF/KMZUqh}.o5KB< 8 Ҥ%tng M'$0~jeaT ]s !(U\F+ v5Hw6n'SsZЫ?_NaڡiɱGߙIFHz.BAj:>@n5=R@W>;NrkWcI Ǩ;oOLg"CHUyeOGiKÀ^Q+ZLqx~m5]baTҚTA5$"$?Km8 FCX\أO>lt,SkAV4cjj[78EGvH5JàBI=y$@"N{`SH } ƿvGW8DBD;qcZ\>;LV*d}] BJR`:F 0 X|uW7iB '"18_̦pY+E։< A:rT)1kLOB_2yjs:+].EhwdkR l'ooh>ðG҄dE /.$З MD!iIt8H: {}~hBVq K2}]+!UpS[$ JksriU FTvcciܙIN=Wߢ90Q ]eb6 E/rMZLKNѦxxet]=S)ZABi$D(crdd>`"ʉF ctl˽k 0@{l/`i*X;iG8ny/hp"hV^8e0 7wZ= 9]7f`[;&vGzɴ܀"[AsxrB6S (KN!~5#)Hg4`K`)܊a nfn7(iO%EFa&UC8nL+(N~Cө6}Ou= VIn&TMZRTGd)]0C4#X7[c()Y3DT̨ttl/sbp X> zjm;HȔ}p\ .Ej$!cp+I^(YjLCT #M.2м)Y_nW }Y8ȉ z;0*"`1|0Xђ3sQD̢6xf#(R).k -*q.D%O0=MI~{􄺃f%;&oO%vAŷ2b N@G"8FIn*)eNzujĚ 6/+o@A Q (dȌrQqIJkZwGiѣMwd _3j$%ƪ H Uա#$=Be6|\ՆEnl_b` ZRQv=+="BӊB' h_a !Q+qf,QJ+A{;gD ڗ$ SCF.ߞerR~ ucZth~~۵JD}WSg' HGiG._S_2`ɒCqEEY,v(#넃%.࿟. 4 RL!q{f:$Km2@WmčCT QI h H[ҎͷpOvkzn_&(}M-ȸ`1SN _$>jT.OZ.B"1HZl䠪h 0aV[XuMU5%Y}LNxR]T4O[)ẖYHA y <*a M8%yµ=>oT'i"1>u AIiW ~liEj#( &OH J󴁕^mp]a\'R4Vjpm:XF%U׍J IXT#`C_1F.è%]7ҡfv'Iu }ҥGcGh]n7*rJWs Rv:FW7"ӛ+eT Z/PEy,=zf噄{?ݫgf:P><ƻv5E(fRt@)1b5QtQh]Tw)F R[۠@F#M*WT UJapsgczW(|ERWatG$ #(Q%Pbp0dž ~93v1U1)|Dz g9q4WzCEI `aV<ωXjƙG&"5th=&mԚ=(t*+R:0FyH6{A<fLQx^4 Q`xŒ$mu>rIgLܩZ"{ɍu*(/)u.[I7gpպZ2w,n,F4RC4M u4@@@590m3RbY2B&&\bm4fZHup}iCAF<`)w(: l a X7gsh`qai-Bw5a, 4MڧaÛDdSdM~&r)5Q(UaEx; { vqܯ3Y KYѝ6g Q-:{ q-Lie:'SS^m,6_p/\[' h4Cqiл:WZpO|`#8RoBR Y6n&Ҩ+-(+/apѲjȕ?xMXIj}$6Nڄ<\/-U7B[ՂC#-t>p- ݈OS:x;.( . 7$m}mB0BC׎+NP:D<!%*£CmD!@`3Lj:9̠޲å^?6PC.4 zkp@E7ImYPi[[0:"9I2c:Ád *x3:{_0CCoJ)XUD;p`zJ9>MXCNA3p-_ouy 9U޶:Mt[ziP9H X0$E$5)ZT}_8fħNM< G#U|P t;6 #;+_iVU}75H5ut.aȺY}F[~߇2Άn@/׭W`DuJj0!=!C'__Né'ZlEo4 ?H0Aͬ&q2Z \i0s~V ]69+͎-'[7OMhH6UׅV[#Bȵ/|7X`țr+n3gIEe [+xڜ?,㊪֤rS]\ 5?qozExa(h$ܿp.|g!t'6|Sc )HB6%C+PKHyJ(-cK4'<¢adF+`Ŷ-<Css)vE3kx cb#xlR +S}˰"t[ ~iMWgjhO#$Z}tk; 7P.- m ;B~smBhmO,w65t4Dt+-ӗp:V4&@+#wI)5E_ە`Q'W A{~aKUtR+P ~[1;=4+j~JKSAm:"4]eWidYT 8Gs&&O:Y[B+~{D4]~j#:4c@:I_Mm|>J҆?bq/WBTuVa]^HƆ1D/vjZxce28GE[FZ7tIN⠂̽ DpX};Գ b &pJjf m 63 L?.Q-m#sc1N:MK/Cpڽoh}`bXEvxó+=½؀KMqS 8_VGMtJ\# M.py\{`R~`ª4=$.'Xb ؚjE*S()7݊GD* ^$ PSm\z `M铛LZCb !6pBٳ} !C#,sb5yK}E7|$֜lE<9xW[R5<$-H_<hRozfSb++:XjuhQWCSA@m,`zM/Ns&qH#5Z7dy[ܯkDhDWKS3C"z_pen4QM`c*t=\.ZZl<5Y)ثt`_!Bpw" R6jyj;]:8h)!9M٧@](k66`mvmRN D!p^X=l7a- " :ԋ_(?GѧP$/Oqa;@/MbڸHF&4 5_. 9i O17 Jx;e~ )Ph XDtHfە)RկMc2s:_Na[gg/K ipTK|1]s#fـ`P M>rSUBcO"8V]}zѥHk' ˲ib(iwYS{w+BMN=$B5q'Mcdo¦0ܝ;G8cw !W3;R*!t1FD/'$пfNo ݊*3fưan0ȝxAI_=Krk1L&i +WbMD yu:~&?EMo9AQNS| D$i.U|GN& C3m5ToYǨDpԉPÄOF!Ч d=vсZiVbԏ,F͟1WI֌lG<#Y$)"`]a&@T)e5) @j:B@`%ЅЎfXY2]0gL wFe)=|ʜ`R9ف|)0:}X3[N%u/`m=znriXkb]䚪>6fu$FCئ]N:):wQMů\hD# X%YufP24Vw>Q(Į-u`|˅jmGA|Vj5ؐ} >Iwho p6I+DoKzyLA&(AH&r@dۈjm. Nnx.h]<R\bE"vL)>6޶Ih@qaZҠ%Ef4.Bj[|H:Cz+EBhRwk-7{|6"t[f?jN,m."2"ZVV,1jnFߪ$K%^6-AT{oV򣏙#t8. l3NNdp}#a0b(J>)&+^ÌUhD׸a.R8nX`=Ev&*n"zYaqVE`n ܣ6&w.3iwiKD4˸j_4RtqiOUޯ\ H`li +@: --C|JĤO_C`@_e7e(G'EȒ*i *GIo這+!GED2 {6)K;3S< Z@?sfL)t EL5"."ZЋ}HĢy=h"CmCTJ( t.n+V]jӣZ>bFK8cQ:͐klX.Dk)Z.We-_K9ٳ N颂)X J)똱t$O?"(q1f4 KjM6xPqD:#RwhoLBC= ^~y~GJCm{LOd@7`HnJql>Y)6G P 1eQ(dWiLhh\C5]1z4D?kUVJto v~N~!ZlpYoH (Y3*+!XCA:Aϕ-T3TAPE2g(R,я`4lPdԈ! ݾ_.QB&* g 4NI[1Rk` ~h)JvRmqWXn=Ʉ\gq4}J CKC{b3’EU@0.NIG O{^~`#o41zMWikߠҘ:VF?Q2~ psTT68- ZmT߹@J[bf[B!jT"բ(h$ ްNc!R?!'mˎxS=zB:hlK4svJ)Xe [C`WFg=F%fnhC`L dRD@\(i`!1k~}{a#tSgA(-޲[<$aA,*VG-تRͳ|V6a#=vyYjΧ=^Ʃo5H %ۺlJ㞿wb 3E(7{k͜Hd $@]'ctt=;qWp@s4.!`*6@Fj4_e팁 ޿-Ua; Zy3J ETLn+#Q He"+J"EI|^itd²RIݓXѭ|q&KcOdE yGdA1Q5O1"CNZJ/ tHL0jiŸ ܟyyZl+t)i>) 08<QfZ8SXzt#2wFZ.w`&[%(C'ha1gѬ\7C|3BijX,tv@k_7xѪ68560AlίBT|qrp;wAw8Pv%(]0r P{]@ϯęm EԎQQ$ oL'E[ڽu6_^24yHs⒓ᵓ,'\J>B4(x&w{ [6BO%W1%! ]HSLaq?c;sE dQ93Mwّz$ԩ:цiP-QeuKcX'AV;VYvz~3ni i5{Ut v?>m*+:G5.Ф IH\>Gো]iﹷ8IvP,l&.'b"$@ 7žFvu>`3EV4rQo J=> d=KyN4G0nb 7Ȑcڒ0HFh  $J wF̚ɶ|PhE$&p*m kq^x k5r7Yh]?g/C V4(lX(KBi KO Lk) |vy ҠCgaP4kY{"J°DPCWTmg:w"RR e5'ċAE%!5^:QߺtꁤJmtEW niP %]'f%88$cKy'0z{Y!1t|f b&r4дz4.S87cH^wTYHiv\5\$Ά!Vn?HML6wnD\2gź<+իAQ@}p'J--ͥo^af-í*;f Bk8PTbёuJs ww ZPTkX+Pp4HL Uéx|,h$Õ M+9*a#U &ȑW`Lz @`qok Yߋ,$D:x Q6| p$ \$mY*Im9*m+w|%=y .kg^7 29(ѵ}YxxyH(l~ݺC Q;98=C{Ɇ/@t&WҢ]c)b@&ĩc+PhFJwqiFSra J&.PZ vGt j윆*a((뉂Y6jd W7 .iPoݽZv7qt )TB 3Aç:(X5iPkb#a4ޑzaqh=IYA](!qbÅ༳ԩ]Pd oMPIjM"=0x@>USUGE96hGƊK*amZ#ǘ!%c('M"q K> *_֩J2d|֑ ij# ZDQ[ L/ӏbScr fcS] d0'꧁tPxWRRq+G0vVU% Wq6G .OH }HCZ Ҁo)H2&r`D R^ځK)$ د|/ WMe?Smuګ`эhRDoO6pA1 f˚Cٮkj\Zj㊍/E5ruR5(CP?="NR;zk&v0R |:JvhPrX41M! R6-;qB(  2N RPHv6s뚶+g$Ao=*%?#MF;\ƦUI*^cȾ]0f-h]pvKm٥flP I+3s8J:L% RҶ Re}rQ @jYBk~LS*R DA֌P@A.:ߋ T8)x'R›Qiӧ MOWsBFAd@41戅t|7ᅤO.Nd%-g =4cabFܮ, E `2jɣ_4Q?SYTJZ7ٕb4Phd#hւdNדa`_C1mBF`=qΐ)m$3m5L@I8 BCZKN"Ibqmk}9 `1]:P`I !Y1U.ŰҍAO-:Ѷ4IˊI {}dATƚ`oQ?1b5 OP͗ b(,MGȰgzbPQ8;P(p44k2 X!Ilqf(@4?*|q%"s=# 4 ;@tdUE ܄$E 7]uY;iSOy~tu no/sȭ {=ȚRۉN'te[#b}},urs>`U.7k )`luy0Øv&/'4&THh(ko2쀔]fu@@Td&D)f Nk7O@F#+CK-9jj)-~OuoSV r`ar qbYoZ.@mi1jB )\zEܗ(X)I ̒  |jRM܍x6tڸD<.+FeAO2;㷍k>GR_y'EuA(NvȂ-:q]K\hhބ%n@8 Ya4d3 P⊝Mn>fzzSi/ŢgB~NrZ= v[ B ptFυR[^;Uø "j#h''3HNkCCg׹~YXkQ] +O1* ^`Z4=mHi=VCB &v$ h(evT(e즲^}Hƒ"6op0I');H/Sl$,hňnĠѵZE6p+7:~W<꣡OJ ""Ǹ=߿q䋠-#N:.àXrکmD꽢{3Y uw=P KP{x:fHɂMjrXpS(o^(FW"$Kk+*-fJwp(Q_ )?xY A@*Kݏ5.U>.f (vӍ (F]DV,|7 <#Ԯ.N9ݩQSľAd!mn* =wq"mT=yIr"DI*ˉtY,p n@gN})8+&u+1/\!C{ .e oTBYƙ R=hROn[@Ͼu`Lu./1rz #CP($!,4uD(ZP bUMLytmeC4޼qfSKm(ЈxȐNW^Ut6 NZJU PYܥ8'" f-YnSQ\RO?&%FDajA{% *N8)~8J$PD(/ ߘ 31E. \${@ ["a2CJp~X <յhX0Ed q& J;;uܲہJ)|"R VܥǴ'w_tk2 Cc&[[ǚR30TAkb~  4kʽ6O,467)&W0Z%u0z ~`Z&Nr&fH ЇE~Bq%GC| jc0~ɣA|dtm!M#mً]D 06 *Mf"rFohh48&Ka%u˅vkp^Lpld7V)O᭷V#)q=IVIΰKR#bMtJH m$GRYLn"x;|R "Xo(:fh+DٺahR\zK,ԷϙR=w]3xlⴰT[tJw6<>aP)bB.zc\sEQP0%z $+]ˎcͪa|%#]B/ч@(aފ)`~&(r!+OrTHkhj u'u UmD+CJ0JAm*|=HtbL=zJcbb-;O0K s`1.ؖo~1ԷN܊0E`83 ?nk]ESR 'ʿxhZ\)`~}3:SttjYz}RVKh 0;8oF0xfg%X ;JUOфS{˚ǻXm.w A@Hjrh ՛5@M/T2~¢1 B݂(eozn)Q)oz&8 lg}9́$5*Q} *(=vI lvbz\݆=A >2-Հ4#SVj4$ 3ų9BC"➊Vp`07XxLpc&M$ "h:̉U9/rxX-Svb )|>W1ǟ/@}^WrCEkKQ 4%eAdϣS^Oܣp?X0 Ji\k9juN8kKXm.-2NEf:n(^Y%I*H}–Kzr!#A,Q{hp@QP ~(:zGN7W/X ut0Jl 3 E;+r=|ЯeIR^sXn-l%J%tv. XO׹$Skd̵Q"{_Wȩ [(x$IU7ݢp1VRMW'A7ϸi@б{P-PxP&U -IPHN.SaVcnVT[g<\/PJVL[@ {c>1MC'p!:D5c Л+Hap,:nƍt64ooZ8#*p Dgr{?xܛtn"* W٫Hx Lct֜Λ;ɎfM{pT#G;|AF[(h>>A Nps G< 6>PE뭻ά Tɂ: zhC#M{xRq"h %f;tja&WU4ۮ03w5INPV'T=胷nn$WLWҩR@t]tۅTSVRRqZbaZ)ߛ*6%"\mԠ"ݦ%!NV9KSS6$ *v([i :$ѺԒTHBLHS2LwKfʳ3Z"('¯qЖAH0Ӻ)H`>1 Ikos-iSS % ¹Mr: V)uՂŘ`46b.FCbwN$ 3Mg)фD#FJ +Ev+Zs5wga(z iz,1"fuERdLVXJG Eu Q5^wrXItEelɰH")6h1i2k. /?шD2rI_`֍Yp<@lw*6}}kI{oG^ R@ ARb)؎6A Y dl7!DU+SCdy+61ꐞ{VlBNCmW FPeyS#S`P.TF[M Qh~/\UK̜~D &?=6E!-)(u~7 I>\4uCRz UޟqR A\ d"g@=/ 0H[cp3NBQn`l)tTP Ut/}mJP,cuF.JIr Tfr.&oY-Uhزzfն̲U-5\y翘*CJ!+T߶Sk=>S3uk{HH<|Mqo,2ggi94ezL% uiȆzN-Wq?6yF#[7 ռR6N Xw(P"" AU(6V DEܒwEkQ%kQo3.G=Ut=QMy%Xy#pDu4hb!k;M` *-a/ڛ4+O%+!eGT_ bj:R)^`:$[12-%j(Qv` h3ޏO zQF#^9(y`i49D`7bDHE vܠ2IiRMxpd* TMq@HmM̥pQl4([blqR q^ؓRO/3MLiAze黃ahY/UMEI 5 +['U;(l^/MVn$MPXT2Uf]FjڹRep3W]iV14x"M.uxkVPnj]f`ho1(c)gLYȤ-gBpK[0%j†P4SU E#6|$5( GśהmM^Z7,SB= T A#@4 dkR7N#4+4u0] ~boR}}7nQI?:dqI>ŕQxR#:R>~D(S H1kI]"+[ܠ;X(O\tM\˚pMMd15ik}wq U-ddU6s\z oyv_W69rvGrn}~o-E;@_(QUmFũy^҅&47Xq&c+WTJyŲECgYwsfD_&b=|( I2}sy#݅{c/H.砉=G'J,n;]d&Lh 6?1x6@w0=B+e.`}A?8))"mGO(GꑶpA?:5GAme]1R\G*X4U+J<8-rPO}W'6'6ACn&E( lO- ڰq_4f^RMs.7 >aIҺ؃`YAA5DXU8'N^]ύ f׺$owP𗴬v.J pFηϹ# n#ա:ۍemtK`nh,4 J<[\;'SEe 3G rv@=Ŧ=C$S:}!d P l.QuP=6 T6k4 z? wXxF M52gvM|bF^QK-rl9F:z{ d]ܭ1xQJzTLS+1/\'BXK@i]HP <"뀐kaBD)=tGd3e5BP;N R) 8-hK>, ~cb")WsDD:$*۵(nDzݪ fڟmA20-/f4y&6P#dH>@3M{!IB4a.=-tAq_@H͉#,X!nNRí4̸-5GGd*[DP w MD-]8e0U7ˁW5Zz:SFP(!f̎2t2\wJa65o~|4an7WDғAK'FF 0g0n)^B ; aDp& PE 2";2̈Z%VK!{4EweѤ+۱H9npw(RC· ;|zW4Y(6*G"B} ؼ%n{R7t _dj!nA酥rHRcy0uH*Z?EFz(~+@ZZ-mK]V*bS]$#tۯ"j J7I WB;"]`r3AF/L@){Gx`Gv/E84 hV-jaXj]P& h+tGZmw3r+I*F )m5nپD>n7̳cWN'OH-!G֗Z!em#M@1V J-]A.lӰAaY6(wM9t%dQ́USt5/@sNbłހ"WdO " ´rSn8a&G U92٠_ǧ'䂣8Z% l@3t15}07J. 'p!N̏ {#oE ^ts,@%):hhD1^rᑑ~qD7_I:\*_Z~GJ#bl%cwH$,+<hXCA9*ðWKеmqxJlSe](Z4n9cV٦(#6~;p ɋnpD%dLZ* "o|JT,5 #P1 ab>^&za 6 qT E,>´sۃ?1ObOr T">/7W wh$ 1B{l҆/@ آrΆܒd@WH[N+:T A<f[nt!1끥R'`Ko7 sf#}B_:vwH<~2y[]tD""~哚'>UB>)v`joR&zaHfӠ4)Cu Dq?m:9붊q1Aa-p=9h!O[`ы]ZHSY,Cbc^ũBmy P"b=}ĕHBR>blܪb1UF"?vfj' j[kzT uq Igzp;@m`Iś4D'BKЙ HYLBPF `5h<顡mn TK~1Pp.74$ G2$X151]i_Lrr=RBKJYU<1P 9^#z 6s ~bC}AR]UHظu)qvc 'w XoOƀ~&AmzÕLhjt'Pf %:DB2$ Egi_%п=Rd]^ ZL pqXHB0ը%:QʻckjÐ#gЦk~fp 6 HU'O  796H16t@I/6ŻXQ۾r'D_ 1O$I@ N(E( $P µLC]DMa^eQ]/X[/0FXe :t/r1)lGݻ=sY7Ճ+uv{('b:f0?xRA8hIT4ZU!B, Pi4ч M=ʎnXQoKn7вmsdl{+H/ DTP$j.by`x* ŊJ#%N>8".I ^@AһZ1 VM4gk5IҥTqLwE$9ʞnF#u@kJ<)qy~AG $54TI!wCOyZE96nFLU5!K@됀EŀP2}7GD`N&L15U*X"&>O=A>ϔBŭ,2ghXbHqqWhr&&*qqNBbAXoHDR?6/wb4|{HvDo.|MWw6؃o4UL*>;$k (hDtn^J'ϬR#ehGSO"!G]YO[ez\>d" (4Z"oXch`L3dR;;o:d[j^`͊JYޟD+J`kા ,$: pf)A#BR'n̸`[%eGb(㑢^ց֞ +ڇYOAa]#RtVȒxf!AuM8 ]"ӻ U5.рDﮝέޠdRJ 9Asi*7F8+^̌0hxlh]RC b؁ga:;J %2)i5=ݤϷJ}+I7I/闘 W{A*##bvNHͺ5T2#H0կR-IQ >ݞ!J%,?REA #՟ĊL oFlM}AO J&-0K9d L)нf ,%Rg̰:˳HD)Qhs ǪkYLFد\h=@}#jFz|UE)iUS8iP %ۍE b]ֱ̓nfPq'~@)ÈIbKC*(uFȁ+jq]rD@짧ܱ h%T*kY`l44`{pUwVl* hVAwtz֫ g-{H&;:w&umJ=~wSyzv\ݣuJ~`c ܔ4Ke9o#D OIL%j{$05An@+R4p7x6_IQw4 $EWb<[Ifl W((I ָ|;qCqmIp9XB9vm֐aM5Juv`d/^gSt9;OhRYZ utQ>އ ≎cA%Zq8, @6G72kՒdݺ Mށހ.aBC sm 8uo146uCN (Nhވ~G_-%}rFGQaX]iȨ$` {@(\=P)g J?@Qv6 >ffi5|5f]@%oq GaBl5yݨoн"SUݵ66*U+Yp#vk1$\B]ߦhCit wTx,ӀL´UOZLpQl( fg\]by EZw44T_.[ݩF"uaG&R4;4ċm^{2 Of= GbmيJ'a"2J=ׂ"@?EƆj-udNH$j\Y[UF&&P7J`FԭX5Fc)r:0}] HoA+m" "H֖ {i?Rzvz) pBT^ '[D GDz!GS;N Z»9vn:@zUCdP/HFFU$qpvW&4ZdXj5N*ǷG!}b'_yxuqb_oMʮLHN4hRŅtcsG`sd;Vlv;UحZv/YxBOcբNznY^t ҲBzaw R׼7Mg0(-5EGIp=2)y6? Bpi=9ZlŤEj1{$@Vl`6iTifX )a%MLSVOcAhЫcc5鿄pF.C t4*!JG5ԗ O5]M?{J9n <.:qwt.͔ 0k5\ԏܳ2bQSzY]]jy!C/4iz(jee~пI^rTl@fx*PZdͶ?Su 1]5ǭæ}BCN:*nhQgN ,"*S]\^Pns1鉍}@VG$*w0X2!ShmFUT8SNΫ$mۻ LJ^.A ߈O"hmΈ%YFҀ_vjwfCEv*:CB(GRZo+_{rxt\q49!}qx%pc@:φ;-8oɛ:75 MLbʱP-Sۊ  2u ~l|СQA␱GYI/ a$Vcn##p ip7/p{0Me8Қ51ū7x'mFiƽi JٰuOJ;&hҨ UnS"t֊>#bg7) zt&?IYFuDy*!@C.Y:!_\Q.Zt-hPR$T4da~}.hT.Tn)O&/I[ac =ṊϠ=Zb;% mpZR+l0l& Cьy A\{1}'=Q!DC8뙭]ƏEa;FPΩ?c:5!UdAߪ@(S˂M.ѽ똸 hf7IE҅0!x)I#:,PLl__*j=諨k:p%mFg[R@']_0(=L:$:\h4{ kз$VA I?I/ @ֆ$-jܱ!P>eujB c!} mf LCٿ ldWL!enޮzp`?M-$`Z^|nTĄ!fǓrφ)QeE!4f,cl T>qKl6PR:bP.؇x u = ?p?uhOGAgD-aN0p!'J ${ 3)SWh&ADM / ~4$v`;iWg6J ӈXn0 v P@ <'VQU w\MsXKy0;8(|'X63Pb:qaПM) mUsZ!Ș J `U+ayF&]uUl6%]nJ;It59s(3+蠣)T͕10XL0كN˝*P~9)]"U5&\E Q2;B)JbOO}6`]I(v+ʙPJe+~OrYRi 8i}I1c-)#S+Hymisk]6l(t I!J ϿqDVp$ճ_#X˃tM!2v|?)b L|kMZAvJ  j^WN}sY8:Z(f$I&JL!nbR(!-" ZDVφIpR+oOkҷ*ۆѠ@>`TT6C!QU<]^=mc0-;Ŵ ,[&WQZO/*  [FTYPjbY+ j?pJzD3IJCCxTd{; @ -UqPF .(z ![M%? XTtRAkf]ӣP@cw|@ě[Ϙc@)j H.Ԩoq!L:[K^Iey. D G+lr%:6:}El-$B(&)?npu;rm "BȳxZ,oiV;|3/Bd B-/[gX_ ~$xXGL-Z ޷|c GaFDѺ ].ĔyIFckz ޯ2xGS~_1$& f%SԪLi=ɒ%OwSEI_X$ a]b7EfmKv? jy".8 b^o6l;L q86縊L ɴUַy[*By; NVtsp:5<)[T3/y#`4Ձ6h5(;6yrI:-6֚ 6o ;cikEQ DCp7ō޼ҫ HgpnKCbHn644!{HOBso# ⌹wiD m$;auѼARD=0H 4wdb@4fƈ Hc05oldr嶉Ms38?Mѽsل@Dx4&P\on:/}Um䁧c:ΏàD~$0S5O;#Vj@M˾l{KCgҝ[ǫS ~ѸASVZ4 G.zZ`@44JCpdBdv CX"ZZoˊ ,XhQE%xuemN5Yn}pX !ߝp &;bvF/0kzˠFeȕa!64z."`S3K6"36`쇣XX'̂Ԕh~>Ta0%6[L$g)ЫQhOqNAME9% 5Nf撎!/e[$0oe1|LJwv᣽y+j T+tִ>-(z,fjx(#Բ Ԏ?RT(qԙ1bP q!H'ɧ0^iHPY|g=}HUiZ2B66L44!xo|񈊌$h1l2#;K]7cΥ/9TB&c°]& mhDK2%Ԙ;wX2]a ͟8,Vr5y.uJi,63 K:[o?Ry@ϲ1V&^f! ޓZ 0k|;AuLʈ@y1"#yrl- p0gATӈb"D uiЅjڧ".Q&;#"^aT%rFbv:g3Ii`jF31+D5z%57Aj(5EDyYiE1Vx<P6ːp, )*&[(xc H. ̀44A*%;@ž("hkX'.9SNI駾#g'ah`!1ە qf-:<~#@fN1]Pva8k\ZU4qcmBHdxp NZTv%2c ߃LKCS{?րk\RAGCGhc],3I/)dE􍐠7<)%`DO#eY 4%T Bۋ[TgRۛp3 N *juʳ?ɌCQ-qQq<َ~@sn< #Q:kXFVt`Hvzf(uP;6ŏ0nV 7[EfMb? w pL-rZ4䊽:d 0gmal.6CTUC6cB(ʄ) ށ;( ?n4փJE\SD<%7X&Eȗ@$*O0e6|`b֘ oP%H{oV:1["rIH6 l֞+n1hbYZ'[.@TEza8J8ɜvvm9Zq}5&.2v[ 6Dt(64&|IGK&"v 4v64)ZⰠAD \{t&ެ4I!rJJǼ7,j(4u kb C /;*pqdoV$tTx.2KLi4>15 lmIrB6^!C3 !jia] m E6,ZBYdY$.S(ʍLM/{Wɻ=є&,hG)\A'b ǸMNnT)}jڧGcmieTI{>ޚL&Z@PDaDk&𠦵8/CeXl9dLiaڏ|;A Rs` Ì_ξJV4?RAi,`nh`*Y52p khI`fّ{5HtdѦco%F"!/~U^*){vHRnQ?Ӻ;P3-$ {p ]H`ߢjd)qfzbņOII.Gl6D hH) E eNM :!nhY7i-YA9t>6zQF'נt log+1$ |xK F, 7* Qɩpa4֤MD]O,MX,`US}G^/Z`a~3bDR'pZJJZUMg]\;Еn+c]rh"!p\PV@OFkJ•NM.(U pYkPzKG*%%6lU`h->֞D6m.Ӟˢii*b7}$2SftY:.eJЄpqJh|g˳uh5FvaGM/W̲a" Me6蟸$],.QƕѩfF!R;L3X0y^Ld/ "l^Ld:\<5#Z^ _-s!R1Ɋӗɾ, zpl Б778$h^.H5{|-.AYfklhhpƔUuˑ JŮ15̎]iNtΨ .DXePDq2d듻f*VSBX!WhURu?(AEߎGFK:dv;8JLXztӭ>7$6`o/lB uz3B_鐃kDHf+pӦ "#2dAv^@Z!@rn#SX-P$RFa/)֖oM/nl+Р?+RHEnЌ%_9"-lQþZ$ *K'$am"&CЀRQHMX;* \Z"29OuxWb6k]E48I֘xl," Kp!Q=yvh#0{xhmL./@UX$(Sn\F #kɜ;~;G0 N@F-#{;#N{SnuNR-@PbyiJM-gh)OGTM"cSW(OEt D\Q._[ [c2m]8qSI"" UBg|<\pJk @44~"xwq]LzaE q4܄p:(BL j 36*m H U Ck7@'EdO9x&aU{& lo/L` h1VᓭC/a4 ڒ{8f-vT0M<DDLR^\ :˜E&)"ҝZ}òFtn#bMiA3KR!id~,JcutFQ%*xBXpǷޮk{b^Dl fInMaaG/* "tNWR0$lCcG=s`jyO(D?_qP:sT>]KF682hx˚*75fNp*}ķ`ݠ,8'"#nnһf JQ6lp ~ DRͨX0&Ap=`ME:~ pհ]+KEU@SdN$%^﨣HK.>^8$d53P"{6cINs`h۷X_3G}o_1c(JKԹMu V`;z@lB'yv{D*繴p!wKp@Fho;`'%-IT1*߀Zmq+/ YPSɉY̽Jݼı_]LbVK67o肂؜?*ުD&GR 2zX7SbP m[zʝTFO! n@Hq ۹}XhqVIx;`F#nܰG\{ }Y|!E:<0tx9ɹ٧GY Ft,ja$c w5A ;V͟9Cqt72&LHl}< D@Zt"i?TͫPS@[P rl옱w1if(JpI2*5}6HT*̅ y,P %u=3ĿPpHL[*p #0mM]`JȊ:ko2"wdލ$}(Iȃ~,,y9B]v4TϸN h?u9Ȃ !/w j1^|%SGGvO69M"uՠ z a4]9&fJ&֊yC#KxH@-)8`DHs+ N;M |qe/=2@"F! w%v5J,NeT<1"EI(V }\Gh ,J*cτSy]g]:>K{t^1A EjAm̅AWߗܜİl&OѦ'p)铥WrCeP0@6M6LU*uh1 $Q{\`Hs}KaH Vb#RjWJ=oOGX*L?ZY'a=o8ilQz0!CSX#`^T}CUDE<иPGj XN 5褔"(!t7,2Pa3nJr#vPiHYUt<&ku#!,VMb]<7Sj5t%ċ3D>) " j( Hm5.$x/[S73JP|ŵHe:%Iʫx< qSe>6D#h٩"@Cp +Z\H:Bʨ qM0]mà -_`ykE4؃V![(H.Ҫ׿+HO#ZŸaa(mu1"4]_sM:ǡ9QI:֪EJm &o|UA@}dإp%M{]H Scg;UPcLܟ2VASzsZ h$|P'wрXX6U Ɋ ^QNpfD.ĢY=`@PAğs8Hh@` 4E{D @.A5R4y (<X6R4DA LU49nr r3DS 1,2%DoOk.;. {[ T-% p4CفC[~qi/rǪ!7jYW07BRR`w=D[k\<Øf5"DH-{EM F^ƥe֬ 9vŻF8UAB6j^BoI 5jo DuI5 Bov#&8k[Y,g:)+醕E$lGc#ܹ⦗lE~`mֽ#$ڍTE̞pҥA$4pBdN :Kj&BH@>Ѹ-U.B,e&@ہpRi`RPDbBB[;=*nޭX-J$hoP ]-nEAZVe RxL.;0/t @o?~@Rx+KR w U6IJ%`DK iN ;r- i@l;)BhbD #:Zv^K} @:nev۪/V%S %qDpLQ#B_ݥj% ҎeVdѱD' Xœ27DyU@`zOĀ{6Vr`=ty˔H绡7)ݑ…L8}5`"kqp M(r\Yc;w>Qug=XP Hj˗bCz2r)vƑi?F1c{1YaX2<@* p^0X`0Mi/p*Hqm9l8J#*t&Qʤ`jRdnaFpl fbOZ@TV0Pu!69tJ4^0`7 J؈$â^F@Ay`2H9 av{3E ΂ &Gĸ`e<:Py) *D7̬EŕltH…Q Za;yɐHR?snv | Y]r;s_r7NG۲I*j \nC(uک~fosL@ ƃ 8"O瘡~&$_68]Hwyio#Az6L/`+%@(PdP 4)ˀ#>fL4zì^AOL;t_P#vwbޢ-c@U5yrRo ;4 P~\VBa Y:b)$ 7G6&iQ@3PAܯ&}:P|1FPP<)DhGl>1HڢR1S񫚑EnGP&1Lveu("Y`"6V&l4@|f% RE2>`PrJC8YqVKVv,|adCE{Vj"ACv0k0Z022"Aw.vcf]Nա4.E@-b s/v9Ɛ5?Opaiә2NkF)QX47+[(*$^G7}/@mP߻TU6; m6W#@ wF$*kBDJԻ)1 )w.]4q²Z$,TƆ=ӑFA6PXӾ!7PL$*تRWQ͋KRD`ȇzC8M lx1A'c^tioL޴䤪R@U.Aػ H ~LNa;-N:ONc^yh g? c&=w0 EuU bЅҦ錕 !PbF|=’`TcNO)PAWA:IW.qV @cwE {Y[hZu 4-O Ff6ƮQ=#tpjR[ VeAcۣzth #&V[gAXĵ%eip |J5џ. 4%rAdc|u]wļ2ߠeωSHq3r\N% ˚SgFl|ctl_ 6sW\=?3nOm18&w1(.PPuDy)knl' Y?kk,8E F_fv&z(Áa";Fd{B]21Kz5ֆ6<ďh,WcH* 1Xoz(* (h\!fYF>ŽQ4s@+@45-ٰ^IZ#L0Zv`#`ImzPg@~d3cl%Ɍ2/}za+[m4u8\x5m%PΩNDw@1bjZZ?Ӏ"U)>4]rRj >>\a*-p)&sP@@ijv?(@:@j`= B4mto($Gr3'QɃji@震NZQjgx6i<4RVn@-xtǡ?+*4-/M*5+Uƒ0-6gk|j= L!JuH&Q됁{"j:v0j8`S#"f*)8W4)o&jQW|q\ pwzhCGِ  _(@7+Bh hk'x ő>E$ UM EiBbQiGim҈P0.y**g1d$ݶv0y4Rϓ&T0Ly;sN7JйC?|#?2~1m [6S9С4lg+Hb]W%UK72=NXe,eҏ`Isbo@5(0[?,$C kzl\8]V.t`5|tk!4*B"ԉSšP.CK҉\p :ְ MٗmcT8IuPnB?2#<66LU)tV1+d@Q(}F qg-RE58] 1HE] ]݇xb&]AhfEEfs 좐',8Uܱ&I0P F І'lΤCDk@s R<,3^ͳ r(/&oe_hGY)J[o]xܬ{6 A%Z//LQizHWKFO(4&)E/@3fZ%%)Ac:E`jEaw#;jAjfo0'(Jۂ`.Mo}1QCbI2l E~F3JЂbɖ%!, ѵi#N-pjt!LK\m!#H $A:R TēȬ#s*;p 7]H+$LY0r50]aO}n38Ԩ34ʁ:z|N~c)6v ћM|ZN|&D!(ل7nꂧT"ڄAkiknQ"e Sbv-OU969?x$T 7 %{hC>Ot{8zX(^R ͋4zWtnƲY&!(g$7^  z&:cTqظ߀$ hwA1ׂ\OFח^|)hoPYuSf`6ޠ:<5H- 6c>)}S T ͦlTRJm< ĝePj'.Ss6 \w̃(5y eC.|u- H$Sb LBT*H %uę߸m9,I 7eOYuGGքҺjfՂJm]{Kn`}`خqT+Ox2G J9${X M9 xj6[2'J MkI,O,!iB{͵?I5U{~`:E#{eKN&  h2:ui{ OVhTBo8e fcGGA8 !:!$abikeg.0D»3\pO/l&ƪU!'Uo\BF'ڏevAM!wųVj4s.(H$hAuK&LG`$Gu>@}hiZ Gh; Gʕ]`bFu2ZR@@1E! 9 A \2f2mh7r%,pJs.6<˘PF>K (ְ-iC8Xp%fBl?0G &gFp@6ZOT<_~H( dt%:`#UB:)rFҒ2] y$[[A $-q"^AJ .(Q[K_xK]Of$hfRy\G9_<1hT^;4;⨍N]F]vQӀފJr`bSJ? A? <FP@H] hӼAMuQw:wT@{#̈PPM)^V2ҀDRs:͔"[@'urRP$0Ԝ\&NUЄ' mI&F1gGLA֕Y*|N~23¿?p RH_ۣ~'sbhͪr (BhpB]7r_k"n eYk)zjJr!4b,sm;q",#JB'Vx]Ltwq :`ѫ̄ѠO396*.E6hS.J+bh>&Z i榎46muɥ`ż>]jV+O--SPN);ANGZlTĩ?DDZŨ}QE@AA>BډWz̪hƇc;]=T:UzW$4&rkMY(A*Ob;3V1?;%h^ d@]* ;P=wD|nC 0Z?1Xgã#@HNk[P޷b R E_+@ѿ@%.`Z0K 78E!Bxs颔$ !f#@B|ꑏ#(T'THp ,[ڟrls(bNJixhфܭ[' t`x ]ۀ"eZQiͰiKEo{C{Vngǒ ~7*"q{ȀH[KA4bq%Ee-1hMՏ&dʏCh|Wi+Q /b5 T aѠEi2xcƢya w! al#Q@dphLEPNdZ舐 d 䰇GɈW]bH}; ׃ri]sYtDTi5w0D A:P7[eI{r7(>naBʙi/)I,HQqBљq`V9y{ѧ6ڡ WAO>d|@=iE`? n*ffm-uHf{0hh5 #iT[#~2bUuP3b"΃ -L Sx>r ?TWO=Jn~穵BJw\?L;RlBQ޳b Sa=q ӫ24F %f0a7v1q/pDc.0ݎ fa?<%+"5U6`s%P9W\T ap/;|2lhKd nQ~I.3k*BKTa. j?dPzyx; kP*-t[51²<Iƶ ؓW %LkDCIWB(>ЖU鍸󊬃[[afkIhVhIM|-R+=ȯ #ܣN8EEe>ѷ;8}ɹn++| qF$S֓^cTqt{Rah4!^G da 9sƂ0'x b3F<~-2"lsZ0&0i}rU*ubgL"ZlM$D )Fi6bdHo /}MfN! bQ4jtAō;/aغ{;.f"R D,ǡdIuE HF;Xl<% IhCaBRPsŀtx =ް:tdĐ]V10$b:o *acM J[Xuo)4]沂"1*6 ӡM P9z GټTLi[6P%Jx2 RpTz /|ED,6X췯]$OPj`6;P>沕@p?-fB\Q d5[Up$7P⺃A K1Eli`X-RHD 89 FA7mLFE!vS|K įENl$f.J7ZF^aZ`ԕ( mS<Q:+>zmЌ?ZbJ(tN[j 3^c zopF O/l= M5&i襰v,Fi|瘈Cq)h 0UorD Zd ء tA; "nj(j+`ը:h$J( yN5(("yu5;L=H JۉlሽQd _ڤщT} =kkf !ԯ`k:/hm͞1  n㮅aAS},AمP.D u=oycMyd H%I"'C }]bt8ZGܜ,|~3% #Zv3 >IfƷwMY(/if*MCdc?m`?MqӸA' @kjxp-6|mpW MX"Ӑ''BC^"Q!],#pr;ºӚdE(7Uhh٠%H&%Amdm1x@(Y#tЦWiD5eT6}ñqy'3L"% Px`+] )W]:\7E/ >\ ;X!U0I#1;!p@T|8*hj 7Bߦyqq( GXQMH*@'92GuI`MEiv5fjpVAie}&][q ) Z@@j2a^R0h. UqJͥn˵Ez!_- N|BXȖȗBJCy d+I[' ; +@)AHƸkQ+ !B?qDҖ~(9n1$:2bY#Q ț)aDuUUw(ܥTƦMd ʡbR^ =W{ҁy'>;:obڿQ˃4IkB~d H`am\4|,u|G>f4DD% ڂwZN`DH`qʾA-ۣ `Ԥ0_U# !wf,3[05>lvjz* (> SHj <)ˇ{ݽ\Xnށ$3vkDl-GEN濘%iK**< G_'{ $4x@f4{|QRJ6I'v*?d ?jL[@)5@͝ZW{ʸ^L5.ڇJUi"`ҥ3`xvWdVu3ꣃj ?dfh fSBQպp?4'P} ke4F\fYU i ] Z0Z'f1"Nʔv1?q/10fO+;(էGi$ oU"dx`c0Jss:18aMo0$S6F/3TӘ O^'1s(i)Ճ\uj%ћ#{qim#¨CBwF A$J4p3#.O ^H@4i/0%e cOógH~Vx|@R-ie A_J"rSU R-ɭзDq{HWu5-Xxȝx (O'MO.;L*.(fˮk+}Ə3UC oܝ}3ip$BقH6nHX"+HXn镎R%R`ˤ,@%+ n-'Fe/ 3Z'Qi{0ŠղvA h`vMmO'YPn CY+."8W螀tEqOfu}*# x5eh8M2<ýa m)d)60هSK !PLJyľ+r!^VZ9V%-\R@Ei``*Chl`6 rL.ZƷ,{wMˆ ID;"^#`%&|Lk #-DjqI¦4t; P@ v2E nPHh! bm,>0 tT*ܛ54&]³RSy 0穝I tD`*>hqx岼G{F:h*^5 ^%傀\FUK $_m4(A4!'@B6uݏR [K|Fa !.Aϫ3_b[#$a\TPxNq)2US&,mo $ *?ކ$5M#!|0 uڛ?2"L^/q=%; }W(} tz3 %( 0vJƂkءW*6Uieyp :lGŠx5aA.]E6F?あ_&0Yy| D*siвAf6vy9ܣF$C=%#ҽX0 r2aaR"LA`"m:j 1фy(g1t>7Ɏ2HAѮ\Ju[,{i㢒"7 :r%dI@Pio0:R,?E-0A4-_Mb+{aSJ-4!B;x0]( z͘{٨ڽף){ Jwa3Bw"yx |G @'\R$3Ca(| $ 逍`׬"MfPgؒ}WܰFD];1]C?2AЏ;\"W]1Uu̙@|ՁQd?0"=L1 i 1ž݇p*&WPZwVw7K4J&p @cBL`q}exB7{irDDbDI<\t"6L_Mt5]h.1Ca[ۅ">NP"wrE"&z(j1 v*p-: eI^CH ;h+] UF;Yf6GP0%+];3-McxLb??rr s:nxf)ék"hkK2W,Zh I=:N $r6[a  n\EvPnUr!UE 8c(l?l%,7NfDȤYe"IAL105 N/eII0@X` &]@g<mҫ77ʆ( Iх<e%HOQ7z'.CQ~\*VӇ ٣ZECNDtP <&׬VWRږM*W!]RIMs7p(CPGMI[I Jm"h(q1E K be≈BiYs[<];'#*H@Tm5oN>1ڂ{##N&?椷֝3A˝Ԇ#5%>] ;&39k v;<"H#FhԈ NZN?VR7,ecoQ8fE,/8Xr h(sQ+ @4%]LƑݧ$bK\<F<]1xZrTKAEձ!y4Ƞ?0LYj$lQӋc@D(`j&`%-W{ XhbL!`Y9LX 6! k ; լЛd4.B6eHN7,kpMяyoN`#pDxkaPAX^LE5"+?+,3-nWpb~ 5CBJ.${lΆ ?1KjJwN@OuFOl+, b%(p ƱdAA 5oD:̗n{Md{F>|v&Vyd=†|Ϋš腐+\QmczGe BцciV2.hVo e&i1 )/*BkMFGMR' gkJw/20*:jm]'D( l*( udSg@ߋ^bt Mg<`\o|_PAX#1 4B_ hU2r 0p Zs 8 ] gm`@"R%DB7~bIo۳ }UAIL!!MGP[F\fd4n.'l@ F,T;i7_d^ $5ncFbLZEN4&Å==MM/).IƅUz;.݂"6~j5܀ǠP+u(R ;6 pX~؏_0`iH'dd,.)$+QJ: pj&DԖ`V}c0Z*!h xL#zH9bk15}LP/u'm<j{,"; l%Wgm c=Ɯr (@UG \lFjDmF/J ~"D!J8 Yz&a2-Sq) ⛅w. P]Nhd!u=D059Lg; 2g7Zوi݌<2͙2SAe^E]BMbGݡ(kwFTĎtD m޹ fŮy^@*{*OΩED]t zN>:4"A@? SEK`୮ӪiC4m"\b>h}Mq0a 0!@cְGN5ϼ0 qZh]HT%U0(8 &8A 5DFz (r$|T 0%IȪ 4msDT 6V`+lҝ'o)=$/`7DU8ɹnHm`3XH,6LL8_r:K 驼Pbx68~w<SZ֠6@ofǧCTzP;=V]FNǃ)fIR}I vu6Ĝ^ * ?Ap+G cWHUFĔb'Q.WkD]-Y:(-n&mBP:|>@` jiM!Wds|`J[6k`Z 7w^bEfJ@b{n3YTgR q׫:@2BlF[uCpi>e=]kcxǬXf|ā#?r8Dݖ&Ө6hRܫAg`V1h) J:8U8$KY:,Vt#(>&)@-[*Ȣ Ma7%0Jb*bA#$h$9{1B?T\w2˨8'7 q*u뺠Ao0ӥs# g-bwP3\ 0$ 0uRT74Xwws}ФSZ $>g(UPZar.4AZUF:=ZZQr-}/ADGP^1pOh#uoHoՠP*+<*:Iء/­-." n;݁]uB7 ѦwKFA( =mOz?!:SZ1 ^hˬ8?$.l{8AU5}2,r%:uH7 Dnkjp2:mN%+8%kyep؁l(зV7O^F~aqEƈj}RJtAggk ÅXA48uu;Z Jwl=4'dJ@/A4<1lkzpM67PTiGF+DUJE| {*٬I8 ni wč:\Tj5Jixfb$&փM82@@](j^kv?n& !6`|j=rŒZT,'P*nTq'$ *27o=|TcyXo+n%Q͍`ͨ8;,MXi/GEPs r.HPӓQ9<\bn?J`YЙgB>3R%%r;{ ZD`5ZOFEQ!G^osHO0>LQ)q&liEl1)H.Xӵc9C?k 0?0,;:{Gɾ`[sii@:^kp}{aK$Ӂ0 9"El)M@N<|{RDkdۡt,O [U&2 &POݏn2R?+p["P> ~L2"W=9YK@boEzDNkZdq6hljkn8=7,VС #a@)Cn^*(W0;h[i] iER&FCR\*Q(P~7usm#B{ *P B x_Ҡhl 0gdHdSǮ* wЂߙvppGJEN?߸W!­]]oMA8Qy1]|JgpBif4Aӥ{T_i ދMO5%Shgr )[dbK;.T3x]](poD@h%Yԑ-71&D++vzvѬ p'W *-hűS z)`%kWdZqS\JaYSڼ뚨tMh^{#L"'%QHhj{$2*ug7AfPACy! WtWh7ɸ4`piq.Q4iӜb6/2-Jm-aR`)?ƅRVOzbmnɦk;|nI_(£DDZW(DY w:\ %jkK !ab)^K.nZ #d4.5X | 6 TR o۾cFKnB>0 z9:*7ORd9Sq.x2}Kϟ4V3ZYV[b.FocD莻b 56r)"&Or NkRNXV*j@e[QG1`u57PxNbBE'((m遱aV%v\ ܉m6HYlJ,$J]5AΝ&+18_(`-nkU5KdqsЮ7&(,#~sTd {J:h'DLO\sjPOim65|-ob &_nm pd@|ptos^prX)ϸA^&EOȸ\jwHa Kw0uKENba)=*_vAo .BV?/ԗa66@{|Ud GvolJN=~1Lm~DGG 6e'1t vى, CHCP7!!P5 G{`)G!@XqW'`+ix AGCPB ^/0 ߩO0$4T3)]w㮇8j!H뵞Ar,8p@W?ӕz %-ޠV4w:b[vM֔0<. YJ^2#|&*`wL\Jm:jt> 7_AjJ@?)(ۑPAweCTB~ C;*bKp6<ik?⃸ X4pAvy6&ЀkJ(lOpa\R ;FQ0A QK- ɚT;az!$KZGz5 VCD9~[;ͶvW9 $(ӡ*oҔ!a%h]-b`2jշBT yN&R#V$PU=2q$D`Ɵ19:SFN88/5EM8li t*X::l>?XI j̓c[|w tR KsL'n_zr+kJ'.B-A-Fk. W-05J~?7TCh>3f;-;,U9qYĆ* JfȨNiBCH;h6 \!Mdhؙaa>eMs$x\ERjRiA[w҆)Wn)k_p`=4px 0 ]"-3 Ji<0phMZ7@L{,G1 9A|D&21ЋA+V?rݺ5qo]&yE+u sK;wm4>KpygHk˲|nj[Ԋ@MZ DRYE`Ś!6HkI} }S&z 3뽠]n.R0 C7u0*ť<̘.7&NvGGMȴJh˘c_cZ{ZoɉS3Bo/a)l"0#TgXAH6J y"V酠]63eTJܒ?qo/N5з4 .׎k’\'"dX0ۡhuG K@Rk.TOXCZw+M4!n&0;BԖgRnuD_X9C:)Kwn6"+biDwTx%!+@V ]sq꿈N$d2dkMPû_"FR&@vlPJb={yP&>2]Vү UႳ#U:xrA5ZH9,Z{،!חM!6T ԃflM/{5piȌYpb"\ 3·00M(؋@.|e?a8rZuah%؜b(`=Ai0*4 JҜć4,*khyn.#!,7 W\\b/`e(  ׸8AZPT@D':PZE.MQB˦`R fn:A< LF@BvPi܏X[Rզ߹-8 ,7wdjBm.x RqRnh4u]>23KPLG2BPRWc& R&ibГjwgMa}wAbFt:  _KD')o(O =$"eɯs'A@S(75-q%zv4:YvCn'| -0%x}`z0-7n${ EH0,FB[ #NOLhO/BiO52Ƃ6 ˌ  `M޸LM_M TJ!UgzG4hz}/z JM|6!/ڿMs3c<]!8{p"TOx6Dhy;o 7/>d+* Bcѕɍ$WftE(0#AƗc.v[Aei@T_# JN۩;8 p 6VQ9 MPR:TAx4,[#i~⻠X:DD^ ?ÔC]4E_dף3KG禪|}):w~aCbu5UM(B@8@/2a#,{8'0٧Ab*.J>RS0Hr /yՄ](:6 .mPnjudQCڶ u\m= 3rwz ֵa-TFc\W֨*S4=fzXv@6H:saP ӥ@V"+E*H 2Nԍ< .A#mӗ(c6I]%ka5xwq?o.*XBQ\30X @笶Q(H_1J"Co+ED~2f'TFQP(XH{pro ,8f"5bd #h[ Ƚ{Bm/g3 Ccy5.՚iB(SHib6 P27r~%ۨc-& f~+רb)-4ɯi1tGVS`@n dg =ڡ9nO]9 -bZ Ke4;]sx (q7lx9n?03u{ ]T;U7qkP$)( #0[c@UPƺPKB>~Z M81lGk_q5A<*9E 2T>.d,*u4haۍدu;**>uCBT?A5aFP % Qus> k$dٰcv أ{uN-*$clHdaP}YEfQ)1bMVH`UَFIa%5F#iZ&;SP} @vf>#^߹1TT'8{PCwfwsx-VwjhDnh(]=;r?vdث^~elJi {nZnq + U]]|ƶTv0UwaГJZr`6!A 63ˎP@B`ZjE%(1`ҧ )zܱtL[pHd7"(PQEؠ?ϸgg4 z:4 #wsZ-:cP!jrieE++$8\7+y`.էQOHZlWg2kU"YJ8@uOz`AoܑT,EboVnaZh#' /D H -BJ EYVFb4C*Q#iT!"JM .YJyc)՗ aqk$BRkЂCE6{b Q &@ji;3c C=%8 #uQnq aͿ:-j=DG.@=[a8D"q5cL`W pEw8<7 )Yօ^Ĥ'*wtPȇKAi|TY/dAh">"BB1H6Ǧ6YNo"ń@)`^9 LV%0- TGR2,Q6m)w*L=@"Q&"v(WQPYt#8pKtj 8[~1Ǯ0h? F8VaH8N A}yGMIS bD+~cҵ]]| %>H+:g5DvlQi DNZlFro&J՜((뺇7HR *iZ\*4mu8m#`ۗ`t˧ I):0`p͘# *7xWhP S^[ tІrXB#74z驉+< XB S0YU%_1orl/DD-B59Zԁ'܁UZءiE,Q#b^b )CEEdE<5E(D{*ņ$Bm:_T,VWvAi-l*Mz.8`*o.`Mַs-h O t?fF V' "iJR)1QtTi[&&FNO -z^0A@*W~`ȧgkꉃh'cԿu\D2{"LXfPF]&V U*W8?` rQA85L(tt (c͗NpС#n:иQ 6Kh'@} Ԝ@ wi-0z0)zP@nbn!{aXĨia6xzxq3OU `'l׉*4 ~xB ycPN8l ]8a1Um2u)Eav=%5l|!$ZD20E@y5tI7Dl)wW!4WMh[IZ@;TC"J<':{Y*TN,0ˬCh6t7pߒ&!B7CsߐfYfL6%57mAIշxZ.2K8Fč=9*R[qPFn^BHZƔb90"@l(7vU MLJsˍ lp$or)~ GӺ7`@@~RB)+0T<=P3Kʰ6Nja//h(Q6\H5E"SBIk5! cj?VV1TkIc.s]u΅v>o{?2fW4#M H!8w h`4 Ҳ@cCU|pbԯv`кfnc $*J%߸8]aզ+H p:&{iI qRkA*вCf)CI7 RK# (Aїw\Ȉ /dTΘL5HQӗ^| "ey+qIRT6D=Cٺv1JͨA'- pƘq[ Y=Dq=[ZwZl`ujh*. C 8(I_;/Oo ]]CP$; )u_@Adkm)-+oQz@ F.7JF%ҹ^Uq@ZH%(ǧ!Z8_?[`ZM= bB@X hE J4CWJMk T(D+:aDyɕ$[Bʴ 6@Qùn+; R"k!R*thJpUJ -bDkD7Ą JfV Ѡ JFdBgF]0?:_Fh ]`*5 .mt Fr`ǀ5 ALIZO+ ;6tu%*A"h@%Mw4B^p '(( ^0@\/a f9wSОdH7+jRj)V+wqJS:uɇ;. LDJqyps{Kh9Ji7,h)0BcqpjA FSZz VȄ!xU~@5/7T=^[(~Ot\YvPXa*iQB6o~jA[Xa*dJ֝DjB![UM':э[OE ѱ5f A<@+j _0LaU Tΐ86B{!8Euǡ=hNM/B]{$/UG̻T8w:AD?Oܶd0 œY=T(Z:7VWgI.hJKJE;Ěbblm pQ `1,A;1}2rZt>YJm"`oY>E]GXꕨ4/ dcIKMCQ5 wdD@)z荧!39RCEt|2MD  y抨QF>9Lxj3O,Wʅ> ;C+ψT!ibO B0tRo`sPvC$P{Hm;P+ | e&iؘ"tXћbddLDE&U]Eq$WuY1A $DOn^F[S 6ՃQ&aDb!b2hmC' Gˋ$iD\IX!"ᄸf@+K7M (@ B4v25 D 4BHR{ҏHHn>92 oU?[ T;oxA|`"&( -e(OK ٬nFINč{黼FS}G^Wp騟" M&GqZ=1oa!x^(6| 0: 1m*:*q_<9t lTIdX*EH+XcpE@YK[SEqW~%|@l%X$%WLn( ވ#u6 'K JH_4CgQAMO H+PE4F* m2 [G𦋛us:nP&AУGK|V޸cca U֟qg[{à?#ܩ(l{@X$mW[1=e] P(oiĝS}GLZ߸He] 4Wv4{myb2={0&!,V`WOfM:Fܬ$P-:PAw_n4IOȐ = i٭ `yU.5JڭUUVD83fXБC͎-5۔!5rJDTiol3a LuҜy,Tjcj.bY0y%[JQz'#Ф5ޏN*=Pỏ›_]be$.tNp͒ |` p(w`712E%bhbc>XRP~•"n`-(AQd]ƽ/e*=M?t26D6O|PX〭.4P cc ,ɋJBA7VA{&܉[Oc>RTvu@JB2ƈhns:쓮¥4aCڄqk #__L.Ar(g v >54RؼAF: a+H6[N'~ (щhD`e{ d1F ‰G] ]p j5R(QDum5 \A"* `{ϐ(v;BTaPXYh ch+}:`yW,?I4_;{(Qh=ٗ@ ngcӰT}1fXm_X}xdin4ٍ IвΘ_4 ] -gtȨ݂ߐkC9 z`Pԧ)it9pckJe*J8@s;> @${2eX-&?.M@Zn%H 0,%>p[M)}kȹkdp6~C#QLQ#ro h:,40b r!!@L0a9P` ut{3Nhthsg,! RMp* g[x@A$&Sz 95I.T~͆{r ׼<(Pb7@M-4m.T Eu3TGxa6TkܐO/̅1)i+1w[%b>*n?FKɍIlPtaK @]. Eo'q1{rTvN IoO ( vɆ"A9bP0[<ȴ(jJ{aN&Y30M_rׄa-O~2B4jr5زA>`: o8#K(ݸ߾5ƨxK. m(PFˠ468Jt5n'K`άo+دHe" I_ fq & üo5Kub Hc+!7gTJRn XԤV5 2b\9>k  5$) 7OqQ|:?LO|T:z KJ52'f.ܳM@.5"TJ ~b“pvC k |4D[  aԯ"C:@&8\x`bV@1Tb{̨@0Zi~}`;KNfꆚ@OLg'lz? ŎeD-;ql]oqtp uK[=Zµ-Htx~aDZ_Ӟ94Nd*1A_V!-kl@2ӰOVͪyOVmCj>XfhJ:ob%+[[4ߙcjQٿϸW ߹"a8$kۊ,mqTO1¦=uρ70Jԁ T8#TFȸe b&/6My.#b =RPȆՠ)kIJRPG3Tvh9v[pVҭ!OAu&U?q`Qi LƐ3AP ~{Jkf4ov~b!7:j JU|PR=ˑz hnxJiT#-=" tfR%n&[h:?ق8+`SP4BnFESllI4鮢de4I' $' TT%!mC/@Z'9(D:`SH|ĉA@nYHFu<W릘 GX^nF ^%d-+sEXyþbʆlQC,/2 lAF.^a_N!P{ HVJlz B$U"څ&8 lpQ$2CG^ՙnE+mєC7 6's1% ֱ Jz!4(:ҍPKMfêT1]e&WgG>&MSc!=Hw$Պ输nH@C (au(Y\ Cb!r!:~P04Djr!kPfIFۄ3h3u H 2Z EPuj,F U|fA,<wkqfN)TNGaw)z-HdƉ.r&B._ʹ5 ٢\j؆3PE23]Ma lA,;v,<89hꯢ Mt"L @+*&/>~o/'ʉ|riq̢4 \@ Iv-YGԄ [6 y Mu@׹$ Bֿ  GML3P*%}V7eρ7QhzeoxSx_үQ~ kk~@vA*Vƫ B/x'4uܠdEC{ *>"w kt92U;XdM)m6Zw# 7HQ1Vpke C$'n O"=+Pvt=$ EC_wPDm)pZӥ(9SH*AZAWY/6&+*k 7[oK4!͏nNz5"@nO$ˤd -spmn@$cÇX:)T@ih[}F\#I|2R^ nU lu&Lꭁ¦w'Cwķ#|BӀD  L>0LE"THڭ@46^@S$lo|!vZ7`(ڰ-e0RM4][72"Q μ`7 BI `Nwt&ҧ0'")I fi f➶f"1Q`@aL) k@a3Y[ʬrANu46 1DD#>#նI/Ub`_ObTa5mJcZhtt <Zytv#S?((Լ6غtr%U _Yˉk?q+ 4]cXL1L#m6D_:r$vh2>:h!U.P"1۬H\Fwe H1%M6:`f M!Y8^XW BAnz)؈ G@)w6 Y]zbM-L¥SE6; ɐHֹ])b'[bʏt+kA1 E&6A.xؽJ^$ȡ%J1h7.[; /Sp֜;k@{l9u U!Nn f{δI(*M&+}ǒJ@#cb* HfҰ]Է($4-XzKUeEI ].CXOm{"t `ot@zYX%pLsjm|MycL@JIg7 B .$4py4[W^lzs %/~ধȩ`Lj*h67g$?i D?ovc95'|0G_E?2xqmgP&   &h.XX#``gAQ*`6@h<Hk#UAU )>'FI bQ!QN,!g2B삹z}H;;=Mo~h,ֱJ= w4+OTiT #$Ah}!FB@TØ<]%EGL YMlTJY ڇ~C.(f )kq 0t?ӄ GbM7(j? k"C1%Ӄ*:x|*y9yn 4K> Rf C^;!QWIP\d `Eȴi9:WM7+{}]y_VS qE!2$xP 88A\6/!Y\q>0"`Jy&K{#zN 1@[l2ﵡX#ENbRa(ĂV1_B]z1RttprvL2"$"N~JZc0|тt-(G^bV ͚%1jqup]7\y\7)pvD6. !^ $~C.P }TE khj{ڎc#u#GWX#%;( 6DxA}ƺ"ĀTZPf(r|tTGQ4ZnCFB mjvWGaHWT  ᝔dmI(\ina `PDB"Yq5Ҏvc?@TunQp w%l (Uݼ۸=R!Jo%3}rQ;L -4:JGhXF˧]}}i( DТqhc$v{'Ҏ+/k+O3d?܏FlCC` $UO N9d $TЊLUdpz ٰ +T(:6ۉSm#˂@Jg`^Df"Fr#l88Y\5?v̈́:Nٜ(}l+ DCIㆋy^|-= 1":20IoƱXuY4 }2 gQ$  %1ƴo_kR JU5?aGѪd6?LWvɂ\5GL\#}OZ2k)Cj6Mh>#YqV{'vY>&xd:*%\  S֩#{bBDb"@ԀmQvA w0G$G/Z:2t4RCCt~f06DG># :i&_14Kq *'ns銣[8nDy-f QqHȘ)oy-Bl0,MZ~wB A khJa Z1ڟRv=PKv _P52+#wT!$[qZf;Y&uj :{\ $ y)b.F ǎ]oa{[q /DXY؅)Q8e6vq4QpǤd:uH)!@3 qyՊ;48RJ 1'[,62@TZ݂@QڟAY#1tY׽3#%/!FT,q,5y[4H1T;^:HW(oEcc%\ ;{a[V`uhQqM&UDj0$%6FLp{lmbǼy}AO` G?ʝsqi#ؕ|V$~%f0PI H-g+P‚w/gQX#P #k3,jM%-x ܚ>ۑervQsL6hBjjuCYr ^nCi(R؅ư ;2s`ٔ*9nTXlf7Duh0d~DwkEE'qH~ 0| "O=I̳|rLPA7 @`4`Ů~LJW~fKǃO妿 ^ON6`}qI,!E[`w) ^oZkԥiqp$[*2ߠh]/kr& 5>UL78BPMH#Aڝ%`»1=Y Or(IC9 Evc5Æ-ZSKD QRTktfL:TH   tōCL]"y46#4`t[q79܄UGcchP|p|IX*U hS+NP⢱@Vc#ea E6jb hڜ0TXړ'!$ ZWԪ.a[_p e;(x1PUEPlu iNp-i)yjE|O][¯e4bvO0DQ_<nKnMl( r'H+@*'f>Y9GJ uocM*0:B:R(ԗx_0qpHCb..v T)!!TH*k2s(.`ꂢ?x:BhQSZ26bo-0D"WNOT.#mq 4|&g4lo`R(H6ǔ0pw8CiDePpWbٵ $Al]a5]a8lQ;_1cЮ+̷txiwx M5zAZj܁}yImBA=&ha] zR3rr/K, (J'R67vi@ET[=>%w FE ޜhYԗZ(mQ.?)P8 ́b|9Q6&Vc@./cd۲R%a 8$*:옍 ʅ2,;VoYI ) вG&; "6)$%%'RcB~V*r o IR&d]v V"ΙoPl 5 $(&\#hM@e%T^9F*M a^ Fw7 W^՝ D- 8gJD"Hi ʭv9;RhRPIx~3dް4ήp\v'R]4Q~?*7}7 6n5 XH4@Zktb[g/-9i||V@Xj r <*._|Eb(6 -y-4̾ z٬0P\` E+)[ PD,Rp{XA\2;u#Tg汸qAKp3o+ɚz8 jEt@Vkz\F$b FrADfﹰ4AQ_u)RRcb z-gbmME,Ǩ8*jXF$\l7 TyNj-KA#x+UlJuP 97[[]!bW{Y;ֵ(cQ lmd0N,Kԧ^lMaG RpF/j@CvbKefy 4IeN-sAETNˊ=`Yux\ -<蕵yzDgo1 (w9؂$߷N  KhEI[H4i+fltÊnHjAZkpBkść);sk26Ojo[ˈMXܴ]V0'ak5qnפHⷳ#@ ABks '{:VcW}Mآonf%Bo I*S Rx`RA82$G;B @lXlrB-024;YeG^-y"ӻɱ|D]rOs[02xE~T$ig ^4X&d):A`_3`jI#z*\qs+%4(݄2|_ZHz0Cc~b"Xҽ1$+=sivDKҬ4N$~2Npq)_T6KuJS|ݺRP?FɅ,nHP,gL#5aڋd܊74fW6 H1i:yqxeQqk )VJw1*]C:kCBn?p ض 8tp'҂bba+mϠQ ] }L}.v5LP@kWx:\@  XXHYFȒL; ʃ^Т2b ƽ:iVD@=Yq5=DÓPO% [KTԺqX(/?=-0 @tL go\{ҍ50m8HU(Cg7*K9"}?EM`j@Ѹ]c=pUb}v zgdn҄ \ n&pȠߘ B 1]e*D0YlZn `l{{6n1\0Z_G|a c/`!vN\FwqF5 (F7T̂R(OYeZ&Q' aL`*H네E؟NE=*kyF7ҍ@O+^)kBز SK>'ߘt3f:d>x8k.QM_TEΕEuuQ)f߳u-86H (wxPqGovdǹ|i JP n4? //?H2|7HZw .- +Կd5FҭIuvq#`Mܓi%`"#!}!i?s}HcR  cQ B7U0>9:$I_F[a2.F0 ]YZBSMt-q"|iLa$.)-nF8u `GlfcAU6֚!ЙvL8>k1dUHŜc݉ɚWXf*9Iɂ{sQ.-(3jte  [mUj )Gs;j 4EqF8iZDR6c7CiF D!/!bM{lIz&7IAp .|X)} kf!CHSs곖jÑ8rS} C&A kQ $.ڑ Vɧڣe @ l`ERhVo?Mۯ4p[NXt&1 i!@=-28~E;-FA;{2M4;`םkx֮7Ck)P,^khi!_W*ѫbhPcz Icȁ[N\ءls[.Bz=RDrsP> 5 SmsEs@IM CՎIq1 -̾RM$nA;5E==^st1a#jEDiu*[@%eJL0 j-Nc> .h1pݰX5}ͯYAKgkWmMcE@h5~96/'B+L:7{ /^uqa\IV`pRD1w X̛5S@2iUNWpp Z7M%LP xܭ2bO5(cDPGFjzdreWIo1\jtK8٧@˰Uqg-"UFҸnѓ)HI Bֺb73Vz*[TKg0" ` 17& vt045_a3n2)-)+8 JRѨ/{.Zk ^}qzl6j1ѧ=Ð- 6CfE D|T61$/?V7Qzpnnc Bv˸B{]`!Q:YNfݾ ýU`%M`! MP7N`t-#dqP4D5\#Htp4=Ks̈$UiPB]@n9bխ8@:^Q4B! pf\ =YP&&6([ꍛF}BH6 jk.mHA)(Hd_ohńlt(%KDLDV&A F"EEx:c4*W]h 'W;|j(z3_\:rT(]A ٹJ;=񋂫Ԟ{y*F02D/%b#-'-pD55FJ{EW%> I*V{=^M=Ji1;~9VJ X>&vIЏUiX@J˶@tG| *Zf)Ak%e D:Wie#kj3!/Rq5dd" ??DW"}qV,im"qAEKS8{n VG5F)/@6oEy '%ڮǺxq2ޙe +rI1>՝De`$<(Ao|p LI-M kvkn75a4iQ%!wy0)q(yq* CZڞ`kR64o|0%QM2\ۋ@Cm:d "` Vk\ʐ` JG\TgEtf VR&Dih3dA˕zpY@$> ,,Qڀ-N~W e*fd5AI- 71][n[^DJ0CY-Tt".>wfFRIA YwXh%Td c<جFC`6a ؏5ӊG n@ 7Bq<b=Xf-m:B VpC;z!qIHPX@l5 Zl멳'5n%Q_eWL?K8%H oTײk,'ᡁ(2c+aȪ HVF`cV)™KW`UKrYTAzVu4-;d}fyD#JjJuF"x>kNOCYl+wXe 4i?}℔ll-l9^zr96AIM >c=`)]50Z!v:ώ3 aa`FJ|[8'FZE٣;(,ց>ix (#hd= O5fI"HCm)n$L]*4a*T: . f&j )C0QP^W".T(ıv}šo| 'MO Hu!#t\XWU]#x4JƝzl667c2&anSCo4-"15bA}ƗE=t|X'Bŧ*GXN@*΍wP-Q N!CBlJkql`H鋚JUUQ-5bePA1m\TKzu. Z&m6 lqww  dEVyX^lަ5tӊ ME¹`1h4c@KaMxcoNɤ ĉ &PۜF.%18Npj;E|Zm)4nq.}gv:6<]s0^5!Adӽl2  Y:<.7 I gO=( yByvT5uf,o$k \QhI ow4E/F ԧI4YE, Wj,PtIk;t|ƊE)5p,d#%;;*; qjhoa%a(BWZ<*͖nz#>1׎PX+l$Kɚ ?DAEAoqz!Qqqu< Kee`+P(z\; ǛiVdqʘFm<6p(lR &i0μ @[a( `]})MW % ߘHY.GܵVG )i:?T`)Aajurqnex8zfJ P;cHWDbMm-*4MSS1l4n!z#(U<8U pLʄe(>v YE=.`7u$" w{5( *:)vQ!  Fs+oV&gWe̞&ѭ!,3DtRa cՠ.K o+S;xhx)M} . Ib6ȇ?6T";o()NkōQf#;7A&ܮL̀<|^ūa(M Eyn[抾Ltz%0>u@[tzT_!x-ZoSq A 7_;u9]ɽNy޿p,op_f Rt ⁐rp Ec3a˾lI L+M*x{9-ϥ ֔|1 R\(i6D-( ȴ))_LA;Ic]{3TLLoћx[ٝcȤbN{SK*sx.GT1FFPkaIV4ϸo[R={Oqn4n1a;\3AJ&[p kuVʫiR o}%l|KO?v/|$GH8! d47c I1RknWpBj|AD4?bt ~I=7G޶6(P끈N ̖!,BLg@RI;C9>>~c~¥b*2?}2* `1u_0n&=Tweq b Y'r0S" T]v֭*(Q+[ѕkk _ B&y#wA"Jj.Nǃ(6 u0.m T$!  MXՠRVчç*FۣcQveIjn% >]hAt0xG=*H /xzuK-1\*@< pLgGt%pk )i]E:ԄwR4V[[A&_ /_2o(CIw+ADkz+TKvdu 6ۜ[jG*CP㷠(rhw!Rz '˅@b Ҧ ( cZYl l2|m?0l!4U6)թeY{:.jRp9֣wZMxCіD`*9HBH8(Y M6l,G?pѝ^9H L vi s˷HH>&`$miqĈ$^1,.@Tt Tz08dzE& ^H2T}s=;Mܡ0i>=wqi&ҏ'L-,.-Aw`[1[(J?T]Qp(cGԟ.u`U3L1 M'sBڄ> 2W^6w ,IB 5UM t]Bh""{Mkt  ;zv|2ӰinP@`xنY]:4dEKRzcC$AEWqWٺ|sRk|nV:#v?ǎt?G d8 {6Ex3`[|,цc}O@~-qj^t2 JKbrm>?ɄcZzC>R !*Ѵ OVr-¼@"Q~c 5O} BZ X}^a3jSvk{ xJG] FӱY7 2Q@[X*wZxW 7\EIzGѧ;k.nk2TN*qKm԰] Rl3H7-_pU!l{ŒrD 0cy7jl[E{*`Ka%mUpcHP*q)z<0Vڮ-@HMEMz *46C6wX4 "JMib"ph1Sfڀ9W':`erBEUhE7z3"YYKw60)pEM:OOv3ji䎰K b,ONx{ZU9I$&m| IhΉǪ>֤̼ ] iGk߅Ȱh!1Giom\05jI|nJH*j|P"ц5GbP8 Q|(]TW$`?` (J)eAɱ7Ahh]("ɴiܾPU4x|pʨ.Z0XX<WZAkBiF:>L;t91n% h_[Jqzn@ KhKF4oP0]|K#C+.U&hا}E3c5b~b9Z ~?($@z(,.A,ĞD463( ]{ugڙkRiPBypf^%, 9aX"h8@QPxj]#@ 4GUҘ6Z >]7S`M܏(NG T Sa>0Ph' Bu[VO&iOJyB@]20%-P\hP)f6 ceCZ&J`U}wHerGf ;'<ڒθT- <^ALSi6,<&S\aqA+/ C+ ~_N:%ҏ1ѓñ]l8*:8xn Revl-gJRkuuBwnȇ9acZHIC&O}^a"[`'O6Q/-(k>c4 /H";?Ȱ,'_1fZz9 *629)H*:yI#7p7_BZ !S#\6l7Ud;GU@FjG8wCPƃY`d ғ " iSuIo}qDLc hv |q6]N4&tWL192Pca.+!&ļpP`j_RY[t޸+^bL@5` oNMBzˁmtZ3ۻa R~6JYoS2#poMbftX/X*4E#QU*nƊGْEMG f艝MJd7+FJ+t迹t-aD 4G,=Åaq)٠Z@rI}æ#^!C26_E Fָw6ߠVR ^ϛ0 fDfߕoR@h{l Њz;$nh(l{e@P:̊WֈzЉ ݦ<إ;D׃A&^;;B묉 t.|$ښt >GDafig]K~G&V.`ʲa_LjifqYd H\ jx D Qv&poXφw: /PJv?\)1X,myGzptZvbj(יd̴)9St iS4PP^ : J0ESgܫlR(1O<Ꜵ5Ƚ+L ͎3!O؉X~TͫC`\nJ t2ܓqORTa[i-AtvmLyEXjF̘UG7dI~$jD[O1ISPײ-^(pTj6`!z_K48 `ԕ{ ]YEF~H7(]cix; rT;iX@*Bd d$$ ?^WL7Fh|3ʞutdf'UCD)iuL ,t0xÊ"{kvwu גwE- SGRc0RHN$׳X%=HT?b ._`@ E,'Z4Pt!|\AX %Wx ~m]Mz7@:E[[e=oX>ۓs:4`<@BcXzm \gL FSR4`Sz5ȵKɛe|ĀV9qXH6() hpB%%x֜6  G~[!C1鸄_^;C]iVѱ2,gHpCƸ/K "Xt`|+X+SmD^|b pKw^ tBtdž;\ݢv@ BoFY "RP>Dwhڃ;lW,I.Op#jеFEUz~]W ݠV79sWC2]v8P$M̛j(*%Nw8 ;+--Wd1 -DP W3JZXc]η`#{BR' p)\O I>O/C]l0cMrK‚&̍ (>?SH:b, A ćIJDd?@\*Q(+,5KY7 XRpwz^4zq%B`SbI0h3"8l#rU;)#o wx)} Ғ5&ţS!w5(*/M @/`liGX J`M&{6~gpLLH/P(}uw]μflzcE4@GHSႸu4N}8zP+=0?p@Q!,DOHbґ* `I|ELd p 6ML #هO,A(O[PtCH?qí1QC-lq/cb8pt0%G!L&LjEAP\"yB*Ż?Ћ/\BOcGSR)@\nHCx"!X\ P&#,*(8֎M#6۪H 8mtV>t-L'aሐ9 uudΠ考Z3iM osV +L$4 an&h~Mf& /et=l _)ReH183H6KppNBx|;h]_;r`(4!UtB2ۃ#EVLP1uq^Zr.epWz Vvѯ߁*dn\Wc{J`Ù+H6X6=OCX*2uH>|91.!rhB3wƿ5~W[|a9TP?<GԎtrPa r n&\',I<\#<+_AܐЀ(-PM7! $`ܚ"Vt X. @Ew. 3VMEv (3?h$ j1Q1Z8"H+mG !pBQ|p{ԂԨhbx1fE ASw)W01i;}ʮ&KB4Z;N @L/z rvrs]c  xs@$j"]kqg/%vۅVbTH%;lm_]L$0FN+oF̏"qKArִ:䤓7?@ 8Ubi"Bټ/'[ꊎ a+b~(a@tOd3RANh(E-8?u+PUh3R@IxtQM)?pkly;|0wcEڕqY: jOqPdU-/JY—4ARFuL,MtDꃍ]H %R[%!J1S|I{jPfw<܈QSj~!6{;VASܦ )vz;md2U'KD2vdfanjDw`|l !ns4RX[AE`6f-%{q4;0 5ÚB3Upj]fv: 5s_jpI`2Sa$`+V|{\i2T.`T<E_4FBJ1\/h`ώaol.09qhM8 "{nΟZrIl}&f-EtY7b(NZN_"P&9E&,{^[  Ty $FFkҸKcѠp!~1=7tvbWbST,' )(| wDi"%F)!B;|ŲAQj4&  p6κ0Mc'BL4(BV,iQ05Awp ?pH&bp H, V!*[~"ձU=p*-J8> .)G%mPC{}Q2:z?U@ͺi(qo[wt0Jޚ=!)7]}th)$( NKSM 80ii᭯rhTSE~blJJ4<Ψ#31dwH#&Z:@F/ˈ<6!:p>!" dn tՓv*[Z` 1OT=7ѣN R0 ږ",'ym DQ6 -NACra.MJ/,Ă [a}:m4{\կtH8Gd 4sClM VDK`JoBPY޺jChšRہ_qX$bb .M:EZmTdiF(hm4' Tց\r:(xTEP Aa$zRZioA iogL=)'!vmEFPnG wᆳe(" 4@:*M`j?۞$ tMc7M~0_Y @)lȊ5i+Vؗ]Iaz@[5jQBڬw[ ~$lO9fkC&$%h?DD}[,g8GJM?s=A%A໙ .:pP.QIPx?.8,#A%aCK3z HnW2qu<=6:P@M|usp@t!!ԮTXюaT-oq02}4AiڄwKBHxGxP(t#4kɳ{)M LeT_iu6>=JR6O.1OM4s4! AL!vxµ|*ԉ V`o kA N@`&iA~{Fk6u#tW)$R=s/p"@/i E$;t%UM;T١JLT08}[`H* TgڶÄmnhA~8QUQD(m J qXNM/5f,ڷ:1% (ޟZ[hBl*EَumRt4>{m@I2%ZrSBA_ǟϛȋd"7]n@RW߆HW&,1""vϙw ʧӃRps+'香aEw Ш쫡jH9#ҐD9)tްkcvG&0H6bx] 4LbIjI39]INn,6-*Rm_CN#dl"6Mb80-f955Afk/bu@n(D Q +ǧf0,J4d)y3vk {a=`DbƢ |.cgʏ[j?q&*hߖYr,&Ыdz]'ES'k@"#I㉻Z,Ñu%hMH6_f=zO+}Im72F.̲ 뤯ɈJL>0KVZ [Ay A".Lv2S($[ݑŬT[tM<¢#Y;d '|\ZxஈE u xxw7j)pdKM7 x2VΜn^`'un ~sJ1wR"/)gN ~16@RҼmZ)xÿ I!iUBw:"3$/\eYNT"h]qmW`if4v' &Cv7;l%k$(Jn8Kӽph01:0T Du:*}ƣןB=diZ&O* KJJnoNUp v|;emD@mBh܍-tby@tnD7XDUh\9oEuJ-'U&ᩲ ɣ P|,%FOj複B/娸Ɔ?r"$b&VDVet8&ʜp?=_\U{aI( m'; t4 6Fh'uҡ\qȂ[TwxÏW- qHJ J٭b@U[0sfmyp!;R* %AxpnLYjCb5St-BЬ'>ZAmL`WUcsKXz N3#߶*K5'B.|fIwƄMc6H8m7$-t@ۆ~4 &躸Jt0b~hS$0Q ё{ \p^'0Dup`5nV WP !&-&h ~I5 dg8SX(x/a nVzt'J5Na7 >rkD;0#VƹgaBčTbɧkr#i 0~]LS"FB}ш80}P+0}&W HNpxHD" B hCw:zCz1/l}G<\G쑔ޱ=F]3ʁDvo:/@>'&(MS.h॰hlX ]>lϚ 낺NWNȰU}V%H9rФaUoo-%PЦܸ Aޚ!]%N(Z¡{pEVG!e)MD]θQ5/ԏ3yJM((LGx{J'xl"ψbƭ˳4@]& 1 N~Q7 ЬT4-:n[e&)~3aX@4r%m>f"j lkwyΦ龛FSde0 nM6nKܮԀҐ0wؕ陰HfPHW' fưJev@R`׀&(x{r"vMΝi1jM:ar}XyO y4%?RFngE^Rh 1F`Zd0M㙴~B@ER~bԎG}d/tbc=Dž7fG-Uп@Q&|Grܾn۠a :n'wEы 3PV'B37%╓mDE)wUfۯb7&ϳ(]иZPBRv+ q6L#IAKiw&Cp +xF~ʧ50qjD͔ME ӿ>,*8*$fPAAFƵ&̉ܵTm1 c݆̓E?1ܦֹ+WE#XNBh#'`jW`}H_DA.-$5iB6sEBыGc,h=-u|Ъt?8ˆXWT#KMT;!2 /SYC:q2f(a$]IO20z(W!۠>,'P8DI~;j5M![IJ9x2('#S{;u,hTM] LRQ5dd(h9Ƌ$fEKZ$M6‰كu.Y_WcSCj}}yl`DŞeAiOܥbP|ֱCۈJnQ6kB;qzR uߘY 3qaevд=5^+# Qʗ*+jiOfœz}'iO"Χ9`uQ~xaxwVKOR /K n&]K_KurGv[`4m&%72u%*(Y;,M=4DPpN9 e4 ]$*2EN eI5!C: M?#͟jPwz\ ʥ8YqJy)UЦ 0;tCQD)ILISDZ"i(Sljm?y-wܤNX?Y.})C:~8^gT̨oR(lOƢU~FuςTQ D*.kbv :B +/sDA=M}EWm+ތ׊hYAwuX AWYw$mdu`Dd98xTpFG_!X]o@ OfMN}w*T.ǧDψPm zv1 SffZQ(;([AΛ 0u.lJMg 'edr'1 WTDA@{$ rM؂5PC645~ۺWоn(Ƙ] vd@#Gm$TaYD?IԚDX8KD;_Yq+4RsFGؐ{ 27+rV>15 {Dy2($D,㵣E7-Q@@?Umwv" LeKen ?W<"m$`HuB\&þsjj)!-4 w榾Z*@Oa~<\,0ZQ7()t=o 3DGW*6C+z*$92~4ǀ!xkX,Y_O1C4Mew r[q9.uq*7MY><)QR<m,| N|Ĝ\]b-~el \haM%ߛE!؜Zq }%nɻ]G:Ʊ=<l18 o|`UMg.lu(Ի[O#5))C1_Y Vzp㾾v<"KP!Ɠ03^E6(~.5%ThUG5nHhH!JD*BLX>÷"+ە5ޢr=vQ8(u+zE տqbw@`-\2d-XFj*{/_= ʮ0fFrT3ܛtocD+*v[{e1)[f@ FBej%Y8Sd]]c<0\hߡtk,w u8Ҽʂ)2ϧ2f#=h$_0$ J ;A54њ0c VK&+-5Ǹ@[oTTEIL"f`Tjgp;sbA݌l0U\bVȵfSZBY DM8;v93Wf7}(D{#ƃ( jowy U)ۂALF{t ~4bTc<) c (Ao1fnN4jJQݴhaVi&DPCqžouYPj0r4"9^l>.7!'O{ AP*Odz8pʻd(\E]7͐t>sgF!ST?mD۬czbnDiӲ!cj\I[ -#qT&Bfcys*Q#= ,, nPvඒCQ ȳ}DD)92yOE~L:P=M4Ҥٛ0H+UVػVMmF?-bLdȕҠ묌BOF^D[#U]{bow`$ۿܩL"?VWino]cD#jBk1VjEvXm, e,_T{]a>S,(*=& v6opܓ.TZ`ie]֘*ů1;)Ɇ&JX, N@*2uuA%]U40iE|͋HHXۺ2Mή6DJYI=RSc:0`X>x8 f?HdAA 7yrMR0l§xoe"6welf;&:ͤ}UDw߂5za,7טs H1,8PxTg0ʂ:I͙5KHw87;?b%BJgG6 QQe:s7_ )㰋!G]e€R! iB[A~4E9C-a(^nH^8J}a9k θo#Hwn Iy4z[= FC-P WP]Aβ ԍ&tbHUw:uGw@'QzδU#n_ܒEB ?e MR`EMKjy0$xhPhnf(@7ҳ{f7Ā4"&|uSQ0 B 7 iP {rkTںdA t׳[Ƌbli!={Y+hogy5kIa-=&VD[?/CEv&[Qhvo;9bnGb*!3Nd*J.!qF/RN]wXp /CZ]+ָ9lfrom:& kacXR͢)+<:ڨT^,1BUiM/R@s] 9hab̉b6 }q-^}Wt[N/]N^u(+'ىPū~u)t'uJ@br(Mp{N8, .%4mdS4,٥ZK)$XRw}Dk"!$h1) Ŏnθ=ZSG-j$rFHL=¬Of@Z=yŹP1Rxn;2 c&WIJ#$)DȄ!gMShˆɓ,m ďak* )sZ mW"PZ'̂IuaLUi@08(0+ I-P{m(`Sg4x}CΠ:3U k*J)병) K3Kxg(M9Meڵ^yoh!ݜ]z}2n`I L[ Scq:H4oH#v4>czU5Uj Z6ٕ,Dq^1"D5s- GpeHU(>}`r4kHY- %&˦1SyjjHXۮK; XLpb6bNkҾe y ;>1 %ZPC*f }!+/fLH5H4l TaE1؟m:BW@xFEt4ʑ@t[б2S_>N@3@ۋlq"H}_iBmx2E"h.]fE0XX7E Wj$e$O92Y+=pD-`! NKS @4{lP'7L:TwU846'–f*yNЌ%^/1@{}?E]N "At KE{}xq,TƍsQ{T׃Wb]*?Mw{@&о5&nNkPLK&Fo6d5~5PHYpWapU7EB:1Dۀ*'TH;(`L:A]S.x/4%p[k6{c} ח%&.CACD* oC$p?)DSGB;f{f"oهٔ Mk&,uE{T47(n]5sFxTi9)OLoJ0'A m\uux-wRے?¨َRBwFc=ѥ*MTgGϛS 5!a<oK[kHBkC {kCxF%%әK*[ז}68M^2d 9Ir x34]fQ#/T E&4>b@Z.׆xH:O[@G#wl6~{n6ruZdBhx\ 2u7D? ٤f!}‘)U.[5)) TQX&]C֤ H0~ % RtLLO12Dj1s5wd =mzh+uITun P`;2 YbYO҂]`@q{P~w<: "6^$Btg|EuRQ2H7h.!)E뉏فD|8*;\R@Yj S G]\HMS]6@f 5AVt!µ´ o>J*lG*\cV!z4~NH|Po$n;$7BF&"`pfܢ7>V>\F4(΂=P(L ]ee"پd>P%շ[\2@Btqf6f̋ێ O[UNA,Vy5"'\GCVsp+@[(ݽȩ*=keGK2qH3M?(h44viX6wDv@ցk<*:PcH@(m ;MkuMRზ*(sEq%+芐>\+D?hۄV 3ȕg6&b R> ACfgժuu1tHAAEg&Pv`h@ {sU[ rw Zb <S'jEi&GOvq @`hȶH,BU5@7q R$y#?i$bvv͝z\=ӽ5=2Mz@&$Y<@ꅃr_D횅'S!sxjAT|R_ >&𓴶ӎ$VhQvIuT6%pMkT$ U8Qi>m3KAsZaO㸦 l:~*HcnZcŹ,(L0_0:@+X4#4]]bKGIŭ3arC)B:*E?@T7y [nOsʸɒr)wf #g>c0c +D-NhC뒞paaB l Rja( tˢ;vE%bNC4K 1~)wh;&L )m{%JD\,#n.Ux]P NKI|K1)m%}R2gƩS@ j1a$pvw16u"E4P{Pg~ Th[dIPLAӣK>#*`BT<8`ƘG<"+0xFZ48&lBR8'UaUX;˒hBqUJ@FQxiLY X9UtPDp̎M&5+ЗGEQ,Ѝ_B!%?21ok4X! |u DۀyDE" @/J*6/=0YM;7!HJ | M~c7i ]2UOd%чdbF " *).Rj~;4^}? ٯy#W 1t(wI dsN̬"=,?#"R&~yAqݎZc u :\Q/,Hh-$m/X\I{vA@ʀ2*&-;6o.X>+tAͭ4ҁ7b&ľ͆=pɩ1ZihV]DAN~ `x iYï8lϾ\ SSeqҐxɽsJ(չiƽ)*4r +_N!inиQK~XK.Xy$.ɐ˼~z>q`c1eȒn?\|kJ' b!9);,z:en{r@n8E]zc OS`am5h`CXr&m.| XS`6n-h0J^G ~!.X#g LE@0/b3/z4lnGia7 _.j^Ԧ}R@6hqNAiMR0L#OD0(;_#~/TE"$=5V? 6w ܍~Ҁo;>F J֏|Ű# $A?< kGaҠM#]to DO%n` uY -DhRd +JPk0iȎkliv-ڣ hΣ<Ef(Kc9C6(\h-9ۣ9|JM;j+vtބ w:x2JT0aw>$h}}e.>3VyZH6yhf2Qij瘵Z ΉY0aMIxRIz] I l Q[pb:kdgrGOQ p((i+4=A/ȕ\ސgv j愃fQX>6 }&9لʛ@kK>CpKD CZţM640MK!\mcOWc¸9"h6oz$,;"r.fDgPIoKupvۓT 1^ :B  !Uʅ -mh٪k[zB* }9Lz65./"PX6J S}prW }VEoPjB bH$R~n7TtBD6KFGhazm/;R cei4p&>iq QZ^bG$;_`t6ƅY 9[89̴= T2 u8u<+zuXV.hۼ" 5Qb ->`B LqV+vb(c@1ޖU l 1,4N5gzc@1J/GCҔ5zc#\2`!Pܳ,M=]*hh1CdaQ&,6 : KO3j %-iMobܘ륷?F0Cl~CADwevM )Y2٫ H#3 ~,FbXL7B迳 Q(mX8_u*+1#-gEAAK#V[w&`#Vxn֮ {닢hڹPiRpU͐؞{@BkSA`cFV;B {Շ7sk}(`pBuI nAbp V$%σ8NH+Bs.qB3p=Fh0AEe=˃to4ndV&-̰$?\UB,,EA+<v4֕cLMB 4]jczP6@t~!D՛_qˆHvsmh.A銌Sӓ7\&: ~:{|0(Zu7җ 0Op#/"R}0ʔ chٶ8,?yS, /n. &\8epD&@A7DƐa=ƕ.f`Bݰ1򑶂 ? YthsW@vk h3A( y9n6DJ@\H{@m Z2 ϯ"%,`e,AV[P!_I7&(K#Ke`H6hU WNlTۺkDS,(Bw/WQ 1yq{*:uqЊ5oCq$N8B$j^+N&!гEFnvѺ~&\i00v>%B2_nd]A P8{_iۯ36% dxwLBa]'KplAQf4ɖSm}xaDL0_Aط4 g5"e.'U S/Q ti:˫t)`^cۼ>w螊`V )J )N4Bi>-fv#ˡ,,`R6ca=6NH\2y-؞Rd7/B M4 TH+Jȳ lRGQA0fx C'A9t>:#R}(H y@_U*.bhx7@|,'Fv .dI7!s+Yw۬ML*V~eܬ#`>5Vm-oȀ[Rp)DP؉#gD֠5$ݠSBs%syK@Ma ! :6?QlJ;\ˍ&9'N1\kGщߦ7cļڲn``0$zƲTAR?ņ~F&!RM84-E(r̾Ѧmy4 B!5E…3McUQB?ZʣP5Qq)Is )uYkAJdٸwɎAUC``w4~*(P[2%wi9tiRdJUq`QHlJj+Ab]Z @$Bo h8+&VHV@l#vS܎1*9봔5Kk/siEz5K1VzhP{I/3Gj5QRҒcxT‰\L>+W=ha=y9qGj50lJ(55%iQ8l69T_2qVseS`-j!E8=msFa2;!B[BXx6}=Ydxj7 GoSr-̩ԎT:.MEe5iyk^c]xjlS8HkBWs~^ǂ/[ %`$b u! #Ah@Mq¯W )Z"|4`V wPpD-xb6AA?k=J؎Jh8O2̧UdΆ <I6uq^[w]xzbtX U:GK:h|ĮfLANi,E,ݠf 85~n^M )BlDsB&ҿ'!L5 Ҋ0\i"tG2cFQxh 4E2$-XH^ ں+:gbȼNpU#QM$$ Z(\¶ ~Ғ] ];;CP/XDEVIfX|]~n ,m+׸Т.{e7 @!Uu&pr@[-u-WB_wj Uu{VlBƍ*i|3=(2 t]08@7YPSz<ˑ3W(6A65&4}dv=1>BhpyM1wԘC*Rxg7oZ@Aw{2̧-s#h}_w"bw̍NO%"nA+aj-5s`U%;bRR)$s)Bh (%J) j3Ӣk1[)+{%HSAmis/ lI#@HFi'\IS@+[ѐΝp4Iz~śGVVCuR5FDlTmS~aP}jZ-i(v) 7Rm/.\]`tVQp_j#GM)kZ,IL,@ {ߡ1DYtTJr}WHv&'BCGI ׳:(Moo ~O ~l\bf95P*mɶ9F鱧 Nr5iPsʂ@kB}F"L, m~bk19{]~^[T# DTf@LeB~N )=%Da{І !6-  hR- nJD;1u8;ԆSzqhTW`_+AJN|ָBzOq3 4}jJ[Umy 3uUTjrDE c”Tu uXƗ"dbL̂8{zlt'-ޤ#Jr:KJ QOoY=1ZZIpg19, :V0:FD~B]-5J-'x Zr@QE {uXX2<ֱ;U cKjH ~{ kw#KDwX%˳qFTMUvlHhBf3:hM7fD #@i\oJw?HǤw0TED(t N㫐58" ix( Ay4>Qmc]7kk!,~Z :/̓ճZpKD;$dtGq58$vvk Vɝr*՘淇ss'm&J"*G7dDeל Q oHdCwQboA)fS!OH<0M]wF Z6@%.De5(H62vۏ$Qz̎FXQ]Bנ;\@æѽj:&'O*@ .l~E,( UԔ1;"ni5:{aէ`A/G_1 +[yh) tgF Yvcr6Tfɞ[H(BHEJ!B3[J `0P VR݃GA{ݝS\tZ4(B!4H.00T=4ȕ,V FHىYXm5fHFpQ Gkˍ{R24 4@\^[`4zd5K 4\l@+BSEh& ғ n2 q悐xI!J̃cn3gc{؜4ەmxv#iYH ;a.R)TFnUN8X٠r^JD ulX%N{`X @&4"XxRJMZԸkR*o I1;D; Z3"o'Fmà5d8ѶP6.R"S(Ϧ$=:M۸3HN# 1cbi|ΟXb5~"(G_\! 7cIoBX4JD-E,K4Ǯ q0d:?ZId>E~AWFo,rȭ_1bH ,t ip_dPL*LD9H6WfJ͉VT_IYF@tRY#ɴ6JdtdmBVĄFmogNP. jöc"gqT. 4;LR 1~ Sj;`jDdZ:Ȉ*&8Kzde]XU6m6tr\80joJ!^Σc7CCDAR`ci"lg BHB`8X2& -U0e݊Zd>)8=6Gc0fpTW%6@k_1 *th8GG4HOFHh,+Z 2i,-aHŦd_K;^Cd9۶:?mf5kj,Zѽⱄ# غ|1K *";.$W"P<p R0BTucihDqK-yBmIqGRg֣$O#Ca֢&cԑ錄o8 #xɶQqT!w+ciT/<ɦ&!~aS(UnmqbjMf_q[|wbOEB.̫fZp@$JVYTC0 |z801r`ܗ鮍ys#*jHwp`s )r_!U_N9$8d{߂&.kD}f GD\[%&gN9乆'kb ֥C `ЊJ(J>W(]}2x`eFU +=8tXRT6 ?>b-)~C VoXTnJXAƝ )m~#9*;d.QS6*xs,m"׎c>4ͤEl;=&$u@DTeV*4u;0NG{z-`rP KbvT&0 X(0Ju 4X{d0@Uw"5J#V`hM>fiT}E6a?n'nh@ .ۛ9z&$!ҕ^BT KUH֡ <#}ڙ+-KTg)]lmyoZ5iRئKv؇OFD&D޿fF(t~c3Dl wB?m8pOB]nu WV+%k|B8րR4 TunB>epPOLF`yhYe,V*&Je@>N,t%x8~1|wDIj$Fr[($;hCBoJ`#g-InIS'6BÿTkFĤ &jxP#"\tmSH@[OsT}kWd}M9$%lu KZ Ż!"j7$Md /9| jȣQM)zv|?3[+H7Vu߻ /cFj bUВzƳrPhS^g&(L*(_a:C @`eώqHў ΂3^Y M;T! bJmq+^V!āz34bOq6tt7 5!x\Apv*\@N8I>+@[eW4]ʦY2VP#ycBe3 j&J8FȉZ(m` $ʙw$:Y\3}jHO_KBU/mfUrsVl$7s e*S->\{:x*Gn h@SH1hf'{`RT "- pUǸox *鳈*nXGSm$_T2KJp<2] vkۃ }hZZDsD[OӮ hPUs#m(0<Ӛwb < ۭbJiN5 >H:{[M+ Ig t)21"m8]ܒN` ji(xfPt&>ܨ b"l޺gDp-9Oȇ)GTG[5fE[ _ `(::}@M:op(]CӜҺ'ETY*'& [D-h]Λl%*=w!I1`SH .+4GtB:>|+EroT) LA4VoKtVɀ t:$D.KQvֈu@W d=E^f^ꃢF5=(R*580 _15pkbJ&􌋪o>I4O.?Fv8 ܛ 4th ^no8kIT9.tQٸEsks}"m<.dCa!fR4Ai['f0cS:D_+]A@"=P!S٧qH(A_ Uu-iBuUmp)BhoI:ssGxڂ=?5v+AhX4sjBQ0%Bz;`2BD-72IHvt0f&0I{2ݡ, jXf[мEsQ5cA@RQ&5ª'zML!t$MkV Ѕd {4|,UP:jZ?& BE='i6F0+[fWmo+x6BctaǚmvGO] Kt@#hul9yOeJ< . &ʔg\(EWg 8t xc PyV OgdG!R_ 1-5_w!҈h:yS[JU0sZ|+9P=HĮ2FDޯ!Q]QkԽyw5:9Iۙ=0+p6xw+Oa]0KXV4v´z$ؿKF?1Bha̷tGhe[6F>YifӊF8?@eV %17EKR P5%'_1*N' wU\_*>cMbQyվg`z /2YOA2R6NlTyӁ8z;?(Iwi@o^0+!ǥ"zW(a9TYWt֪n V@uMC띱~3`pHmexN=$ RлlpeBsuB*"lp(4`$I1!EÑkrWϳt5uv_?zfiCMJhv>CkUygXC!  c ~"? a끆vT. -aԳ%}dB Im8`Q.d? )T43B/%,NX\E P.Cי( ky ˡU6s4<Miፃ,>&kE,Sa,RteUeR4ɣZ%f$iTCl` Y?H4NfOw>q7DU@j{cGAet^وN1 5t;IrKWup_xeֹݡ1tU@W̚]hZ9ej.9iG[U*QPYd^[{2+. v4¡6Ei'wL6 mYt ?biF)ӷd'҃hF͎!fXJQw\\3f|E۪ ?,pJ\p y_TA1ӽ,(#FGJ`mGzR žHNoD t0?߰x+:hX|ǙԀ]P?J@d5 E5ZFhu'sGȹ.>" M2Cj9NV3V H=8[=yKE !KR4L x~ {ĻVܕPq[~Mt-F5r>3AWc,n ͛oW[4Ek}v:h\bWY.o<±#lqZrTPUmBH&W*tӧkɉ͑Ptol2jҖ;|z46e8%PW0}M.@[5,#$g!fQAa؍`eTZzFqn]5L47c͂J+&B2(]@7ֶ51;BzՇa`*=8A˃WZ*ox{Kh雵od47ĄM]mr W1;Pv(n $вH@.5 ):>\F86vHq *)HVk- >M/0'= ö7Z x$ } g*xaya"10НPq$*2'r2:eZnqg0CE`|13$Ln ^:La*h#5&65CjYb@$)2yX|A#Ɖ0\-jHsY ;=Tg@?X/YuZyn; -@{^+9kTۗO iL~zԉtb-T'.W,}&gy7a5&N3R~| T~n2vx^B]a߮r6Ā5B~e"*,קLZb0pH,7 %Ěm?FM> `r%cڽ4AiO1qdQCӷJOkX6c|&X5o\n!UaJKhvUC!]7xZWBqk5$l#RiXQQcۈTD!7ƀCH\z:b j=hz+u\(@Fj2?1x}R!#m|D +ӹ顬hvc&>MV#B9]W6; :S*I KL9q=!҄ŎRĊrnPAu$/PAz>hP4?Ua%5 Q~{ Rj 5`40OB$% K)1 kAroKQu7D6T67yZ6,^2" xjȋ="-AִlAt\ڐQiA@ 4\(caR3'Ai%0 áQ\h,>a. !Uorvվe!qB rҰwkBrP"GOx:aJ I'`]X &t܋L%J&'L4Tnä^yVBC Ⰻ_`{d;Nɓh‰ӄ.jX{pX.zO蘿 LTWfN|s e:)AZLJDKSF#nWpmTVlh@7A}81Ɂ/_đUYҵ>NT:aDx>9BjѢrD_"@= T8>7wd H3 Q_{7b«H4|Pog[@CǸrZ 9䧥PgchP # +kPZ,o4Z4BUI\qeX G-bwєn=~ (: 鈎+IQI8@#MRkn & С6/RxZH':i㊅{ס$ @xf?#Ą\. UU%%|]nm:zKrO0@m-z*7}koY u4*i`,' h7Ė8zt3yCFCVԍ%)`{JRּ( U}ʎjk&v@*R|, *徂b1TtP@4ZYw̚5@P"&ܵrW4eX!U QPp;, sC{LVDiv| &]]J${w& J%ds7_ %' zst؀G3\"$\Ijݧȳa؋P*"f(I!`E&pnCPA#bud't}PA@4RAރGF 4% X) $-Ȏ"U!QHRW*YQsg_ћ*ЇP͹ HR`ث8 U[.1mbL!\snNX"kq(VŸyVrıx ak] ;7C6jQs| C`)/;M=vS Gx\[/b& <ăBYnrG<c6F8k]]bMHiF]E;)x0V n7 `٤ 6ppPR[=aw!ED%,&J|tnc;ՁdU UFRḾ8eM VkpISzZJNlU ٰWK1eop*W#rpzm|NJJt1`8B QGN,7-$JRo EMvD(A_i9HFB6 &6P!SF#L^Da>\V2 DE!Ѭ zxWbJM`Ԩ"nb=5sx¹HOUC$jI%j0a kQ0Y=!UÛIEڔ)ZY/*}KDi K ryĭJsg򱈒PCN%NS)#-Y53Z*!y[7u\ 1KX%۵Ԏɸ *@q+S̯6j D: K2!bQ6Y`sf FZp,*#n¸[$tN-0hU)= +_P+7OeFR72ִFGB j͎БJ[e34N8(xciwpEө8¢̆9ka(EH )Mc67"ƓBO_C KtdϫERaH}&T ZLbchUk A v$feJwXP-_&G01E*{tp|6XiNepjЧEzL92fW4~;x?sÆGO]bFNFq&`]\qE~A8!**K!yXoFNڿ2 vඃDDl]H"P ݮ$CKNFԑ&خhD!66IV(CJ4Z&~o2`&̓ke{(8v,D% Hȳ͛<4_ 1D<Ȼ}~l踢; تrHB*b|vm[9\"=@VwHȥPk()~J6MYh~#لكQ(6tVqZ!@Sx(!VɊ6V*Bl`\R\ '#E(kվwj-kEDEqy@@FXQzgu] 7j7-@"s#Sն8]We4bĢU!%MᓠڊIyˣv4a$%tl>nl#*\xmU[<]p ƠDB^5BL;T+e]:rݖ 7 6'šW[ӄ8`'<ݹ-Vw<tIS-T=paA1>EVEH>D;>JhNOg. (11P֟J"X'!bD ㍛ԑM?z ؏}jFpۄ KZ,dQ C\ }zMxX1^k 7UyZC|Z2ZR] ;( R@0ět(\5Ppɑ#?\ޣƞ˃wH1zk&dC (mFQ_TVI1B@n̻1P!Q 9j6e'Ϙz|3qخk6E!SF/xLsS虸;q[H/n˻q-'T X],T41`!X)P],8ta!V Fy Q ։2?ԓ`@]#0$aXK& ^GJ)~O*#Z3=B%#N@Gb,nl:Si]owXJn OO >@9]1dݴD$r=Č L@ E% -hT/§ I?"sTil4!Qo1QEn} 6MkxK2;4q.XDv?GADadm BwXzaTIנ54ѭƇ/Rp"EvJ J5J4c>AQ&JAsP`Hӛm׊X j[$X/1| .?e[;pH9noey]#4<=6V#"pBx'#؃@4zs;l$/PHÇ4nKp=i ހ6D¶Q'$]@R:w/Dn2k-%w-_*oE]δeQ{B) Mѵ0"@&_PNsѕ5Jyzm, ٸ԰U0/*>}]8@+BjAg0|p{PXe_˿LF= J~~矞V7 A!{iҖ71rl-ߘ1LpYs4,}o0mĂX)'=ˆ"R=q݂yfԋR_ԓ⿬e}L] rL._ }n:H߸ ;\Jyڤ-B֟sI,NMIyǸf@ ,2Ҡ㧙Fsd˲"y. #"]"*(&ӫ. ofQ;=(g-hAe7hqLAZe%)UuH_B&Yu tT~eЂ[FM'W͕ԸmVQ1ݯ؂" , nvg_#`P$nԼ 4'v'~ڛJZxq+Ӻ^&VQ}~ .ӿpdƷ5*N`X4|w&)G\Xl iZ`w`dݦ%{ "_xڊ:-d&n :sųdkZhnXiØUV|UwfGtp֒ÒeEh>5 w 5 vF  [²D鄭_P'c ,%zcOM1"s(b?AZpTiݙ:ܰ/Bx~M CS 316NyC e{ēy8fAkߵ!=1@vfG 8Sґ:Yf??G0kin1`@'1#1d&&HCBZWf]1j[FUq6:-K2*/jOT}d9+4w"1baƕКaKX&aCQ4CM4XTnc:̠i BD4A٫hbiw{Sb%U&t;v[滆 +G*=QS`*lN)ˇzsEߴ voF 75jh-%һȚVHNK_sv |ʫWbnv=т6͹O#vcHh )vyg GiMvsPܙ#P2!υ͓}rɑ0 lhX].̰8.%SPwi6#jA"Zz "A<Ǒ4/"K((j|dJoWM>56յ9pCF)l*PJKtYdf |݉F#}CAŐ}oa(.<2JRa0/@yfw5 ;&T4"$RvC{9].̔ ID~t$ &㬺mv"gQ(_6E&W-T)q@2iFCaI;AI$ΎZ]Ŋ"d$5$Ph5ireP5aQ `l4X=a+ %CMWҔ@EycZ@Iv$*jL<4[D#` Ea~;A֪%lJ\\oG;a!T$ @r曅YZp 7WEyJX{RG~e@6nܳHWZ4h_˃"᠑6.?_~ysic oMy0HQ`>*I_@cF P%0Ŷ.2*l>5$ HmmyF7ùDf8c\ĎRNT'pr ]rOFWEp ;.Ufy$ F.^pC Dm&6/Dj50 ZvMcC'_ϙ̦j`40tHsGi|r14#V(ɡ!-^Fx$F',RT"Zusgx+aY *έp \QFiQuC$/- 4!rP: Jn|=5?#ՄC9>Ģ(ky1:ٚɀGxT;ԚO0>AY5<dѤT48N4޺w>(i^g#ӡtF ̘DF9-c(b0Ɲv.}e=y6LaGLn6]ݺiZ3S$nH{(;QIbE]Zw/FfH[{2OqNkBJK؟3A$azS+*ΜmsBUKJmI*MmQ,h6*)D<5Rv>wxNBP;^B f+vjNsxe[U&Nd5-mJcw$-eqw$ )"j`KRq '9֢q=i~b*Z&ѡ+VaOX^7khf0`QM?G}reΚ{Fi cXd@)1L~ed0QM&[$j`jd, z8)$[ k GuCwp 65YE05lNfK $6 G @Kˈ•nx+YZj @F$*cރQAYFᖕέ*џq7/f)t i5?1H,A5v<#8T!x_q;]O2S= zy'.+&d=trnRY+'j ||i9i6{s|wCУ.4L8&fD/q hI!CyP| I4Nf'@:L[.=fHbܪ/yBhvg^,m;*+M(K@ ;.l a$'suAaGl7'ph SVY[V0@( j%W4`T \VCt΍L)dHUEh p`"ޔI~?}2?^u wg7[V g 0j,a+$`,i%:Œ;QҎza2 X<.NهPB5H}5y!S`}2Ң 1>fa(8_ 5- ܔ.´0RRM~߆V),TuF|򪄣*5X$?`4wZi-!^cQ9eDP( -uYN}nJd ,*z@TJ!Kz CwaK}.[ԑ#EWX 7^Y>Tc}%Qĭ/C Mk]i<$fT"Ժ =1iwp!$x1Qpxo-^/i߁J撂ǙBxhnm=36k [75p CU$"I9*PT~U 6# " O|2Kn?1ABܫ*jɿ z̒)LbQ=$ Yv(|!tyu' |@0cg8*žsEcO4 ,VHn)4k܆1M>fW~/ Fvm@Zk5@15z4"3JL1 7fU$ [IjJo60&> B+p4}FY c1ԖƦY0icQP@#a92)~Ŵ6 ;E ED"Tᦨ?(1a?2]L.z]8:W UT7?ii2Uc_>c#Do'7`d!HMȂh_ [yPnUbAV'2Ш ?R{6T= [^ŵG|T1ɦ%F0~8h4q&Op"7F0mi>" BM&# $ZbV*ϥCbx{Ҳĝʍ!@lmUkn([?ٹ(-)\GJ!G`C"*$K8*և z[%NWu\\cu_0dfR VCo5ja n$7-\@W&*.0r 㯨d:)kӠ*9|IM`:V[ "EFx4 k`PX~о~\R":q8kw ;[Dt1p8Άդ*Y p! RH?0"ϬK/7SsDCwpzql J3V ME]`p5:v.@]wp5<!ޜ d+0WB'&E7P4=߭3`6u߈HIrlX+^a/dڶl]* +NePZQW4e^2D.Ҫc.ܛE@H7iPS C1`_)b[>͙i`u24$o))b 谉1]Azc8C~:EZKzcSjt c7.5A~It$">'bzڿ <.^o ]h&R{o bB 0vQQQ1tؼM|V\T )J#ݺ@jݺ&*`V\R -`op|$)D C.a 9(JͩQ&u. ål|Jd+_Ayoc@4!ۢAZ?2\+J,+Z(.'4:1do o*DAyY5QtQ4/3uRm|]W[j4"&0%I%@Q5l' Ǣ@CF}oT96)bZ!$6&|CL(ַ-}ZM;*GBҳZaN 15WR{ Ps>9˵R&op̍4m(ojQHڶK0j~Φ221H+zl >8(C{4T1fJ dhn;Ny-2>=go`:fė S $>+ ӫL4pGE} bRKƚN;2HzYn fX`m)ѡx=$=ɺΊp0?cvQHbJhbTUcl7\)3qIxK_F 7 b%>B`4-EEҔGj"]l8 r !g dj^oW: ( a‚)ky=#I;t eO@0"D,b } ÁhChuhA`5 j0 c B"#[/ jÀqX>y1ʓsVǴ4BMR֮ŌB9hˆ>1dʘ%+!|B GM` 4{n;YOW 2 VR~(@`6KPq@̮b'TǿpXnTNXqAZ|UM1  :9]>16ybƁ.PG$,JyR1*a7182_!z @E~Iua tPp(M0gd9H#tQ?2J JWwwniw ShAn㜌4mXդ:lK-:ѩX =Owt-"lfږ5`hZHXG@LU@y?2b7ss$woԔnhJvcka0=\餠% &jզ0KVxUʄfHZVbVC6cFM%]~wm; ׁa{`^*-6m,2 C5nTFo"6fl AX%Oab ]~ ű}uM`t1a _Ql &S@QV"LDY-?$BF6Tq=@\pJ p @$@&ݚZ5ީð,li`!ej#HhM/_Ol\-I'/l J֬)`(bN-\ѤYmĄO=L Vikt kԻwct*@:u LF-"!ɵ o#2\clh9Q!4m돧,Zqu ZX>YlBS2X9?^QIԋyOm hZ{n<`U$jqT1 -TԌk{(tm.D'uu" .ÃS'`>eCyJPQGg+k'`,8HaIHk*ޕGu#g ZUMu hz&bl o&jGr[غd2=zdzG ) 2 Gt9 kdn6?.J}Q7SU-^kSlp)] huGB* d u̚J!›}nAD']_-@Z1JWJ#MJA2`$8BPf2ښ b{k Qʈ xt)m5A*FyyNҴ'H*o³5X`\e@k*xfg_{l@} IbnDZO˕C Bu Ԡ|`:zcf1+? {ONKgp lFʕvHhoC1, te_d%3icLrՀ ;+{yyz0W Ifk_>6*4PI;0o|&Z>U8v˜֖bj0|ܿª(#5Q618:YG}8|z7a9aiB!: M ,2AZTh jJ!~⬩#ur*#81l]&hD Z{6a&mU`~T<Ӷ=t )?QU|F>a}@M"`և}U"ej) ?giTm:fm,k0q>[Mq)z#}пEmؔ#rxQZhPJ֨jtw"hl*4TC$Q,.Ò j@Pt+c%8 U5^n,|Yy+X!v PDyVMxhlaݢ $;Bl=4MiӶ7Mf@k.ޓiYKUdk{T) H~F)ޯ6Q9]m&An}ø {,m-]>oEaMas>o*&Sd;Anj;0(: MF=$fppIC;X*S;jw(J(ט&@ CWJ+Iv663! _̡@?(2MmBԨ5#Q܅7 1 `GCɠL"l枾(K֚auXGAֱFBfteM`]2ij 2 €6*(i~ysIҋq7h ˎ4v08%,XLT!ޠA*L`PM<eeuDhFv.vݸ(uPhN#,ɒIݫ21t+qY,y3^5#-@CL:OD_xb'hɫM[AnE_QЎU5qPb)3팥)lD>acͦgbŁjz JDQΏoCNW6 Q~FL "d ?O `Ҡ/ep׸j|!nsžԧJEZb^E?7JSr + ;`L0+n5e oaZۄcBKľaX<@ s$UAB\- RAQ1܁͒vcCB Jl.L] Mvwz[xc( n.=ЪF4/rCaTS%9Yg(hz.a ~93or "Vkʜ(4xo)ۈIhEÔ. X=h:~2A*䨐 ѐ[BP S_p$YLtc3t_h(5͜Sڤ)ꇚRlR\QtHRv'E/84P%Uߦ5ZSlEB6Zv0Ij{;$D_ܺ &xٗI-F1Xd";L;T4mAAD1Tyi1 Zvxvr4}wL0$kww@}%@v[P$xD~c E`10?5/C(>j @`X *`)r&85ܦG_<*'ę8EҶZl:8+ 2n5dQ7O*yAS8\)IQlxљq_ T[: CzYR_W%5uC|«%.WJB*LpMҔц@9гzr $H |11[ 15DhӱLѥѷ%R.?n;e*m,%P'Iďk5rBzrmFD~9h|=Y7q,V# jͅQbj6y>!ˢ9TXM*tSB]փ /ĴZ,B1A?WF%vdai,K1rl.68BO9uGceB*c(`ePto/4j.zփN D0NFb"*H4È|Amf;P .*ݵ M{hB"`yG, p!,O0iD %HP&vH"ElMUH6*Esֶ>fBPx]b$6/q C'}1SRUKC{\ǰ*ʔ, G-xL!ٲ(4d'rC~V@ˠֆA2}];(^IY+^G]x j浆]QMFL! v,͠L]6r@4l(CTQt"QAǓp=Ħ!ph WMw`3m@JFbKppYMhY  OE%K)Z@Y&?n&lj(F VEGGΣr' Z zmf7qCOp3zۀ4f4՝r 5k6lQgsXFhm!ggydyi[Э!ȡ@< MB3E{pEEN! [1,Jr?J!"Ōm>Xj:KQJ;XMب"JD` $yk_,F5wpnPmHkA,T1_r{So{*BR;0`qfzUʑ]\qb7c=2v+[ci6T-"'J?p#>Vh?)~4Pn+)i{ l {?;v'@ܷӶ-AeXzC%dȭ1k6yOR4wTVNojܜ m*n,Qپ iCwӮ.=hn gd:֎7u:V&O[xDgz{יQ)zֻU-o|GOW| fȉ*Gʇ0=z+C|p(g$]KIBq8qURkaQ}Wu*#eH m??x%I8&5_F4DOς3PQ$y"CO\H"hG~f@.8QA%1 ,!zn}Jbg_|%6pOw@M}wȭ9 52AޱgTS֒k0+-& R@4#TDPvXZK*{$Nun|/k;تUG# f䧘ڡ%x&Vc ȣGeQ;8 mPq:K4< @)6dBS CC-=#jZ"!ޤ`QQ@+Xk: ּKdi(.y!\Qf>^ETpȏC'6Fāh~7&[R*R#v{Fᾉ$9oH9r}$F8q k8hVkpH1z^`Dw5Y hė !Q$$<=SAN}X mԓ|=J `QZxarT3i4t[N"$R%'ӗ:3H97sMUHen9ITбji0Ԭn5 SL\d, @:gc829֖y!\V 0MUw&pwx7Q4-]hGoF240=3obf hh0~p6<]ܮ@j0H)O96.:QV܏OSޞ#LEx W/tPOMA3˴i1hk nuKKTQD4M:ƘBmlzÂ8h#BK !nIFԈ0涣L[Èܣio *z2"AGd3!"Ղ LoBӝ;xKgz%RڏWֈ-y4@쀜)ݲ@xEff)chh 32‘[h/-(`TBpeY CV.Ezԉ?>n 7ePn$VH ;o,Id]ʂH5aMia,ǗpDءNa/ 7lgui3jN\h }12T+q:!P&/Z+UnDMhW'!**4Ƹ@@t򶕫R x ,[T 6"C&`_GtgG†Z փS9;'jHvD{Uj"h% CZmCi-*: ԿqIQG$n;5=hYXmW៣(mA.cY F,)I1?Nd?^' ElI3hSBQu1$79ʮdiu -PPc C_1j$JL7Chc &$p2 &)i`:MEAyC =aIZxݛD%DlAčkn IpVu%4GM`Z9'p3 6Y j zna<ҖH p_],h[i} f|۹pD*s1%'G(bu2  _J/;%aRC0/Pz`%Ncn<7SxF(CsV7'N 0*ɃjGePHSw W@Ps`79(=Y pe[ $५@{ pdS1iVӅʊ}hיTZ?WykhtKE{_`А ;dIϥ(ΘvBaq(}ahS%i4&*ڑş (1:Q.0:1}9q:4kese]ͺWy_54~|MA+p<-4D8}h+熡$Ri1{>H+es{c"\^'THY:|jĘ=Uwk6/@5HRiɅ!2UXh0J#?#=w͞m9W~GE@ F[*OC"ɒt!?0A" {&ÏnSN zMA7XZP#\ׇAE4^=ȱIaϬk/i hly@O CJ3wĚ19;$U(A?!BjCV!>P@zM՘ŤzqHBk/:;z;kkTPM 'RHC$GQ"$>:>qqjB"#`ѲXB@^o`. uiaRf1w{]IތV@MTС sxt $je_1 #]yr"%kY(07U DtkYrR& [vnAfJw,݇G^h!aD{v)[f< LHD&p݆B+j:0B'mȕ4lɍ/HiW Y(j#-2i>d?>EkqdJd=o2#&;;4)1Jͤ FPl)Y"1$ [w7rnBu@3PC{!Ѥu/ x 6x&;, zϓ $AJY̶Or%H:o6 b7FXAMmB?K6CFk)Q&D)I.dxY HV’=E2h?&~/8w do!B1G(D_&5+F@zahmZTt*{ pt 湄(>u0ύtxVw[t% GRۘrн:7p@wŵ~ܝ~8Fή*vJr)x}1ě-@]ʲX&$8z)H +=];&dEMG`/mC]71]x2}HCnEba萋2Z EٚND6!`rw#Uf_S|7)9-P4䙱-4_w5o E  v=IDwI#!дKب m7avqڟon/@=|;% {YD;$E[rMEܭcR8%Myk' )K. S5p!_1*襪" U@!]u\)XX7,ꏡͮ.|:Q+PAotO ,IZPNpt m]s2L|:*Z_ ۊ4RÅ˱7G4} P i![m0p3$@7O`e8nwX-aH{% بdyGRͅ74H+oLV(:-0\6K;uj,8,((Ҡ&lB|7) %!ҁ &$@CS?1,EP+Pkhs4B%}k1Gjfg6V!4A'ܾA ɘWm7ZDͶ:F;9A0=W8T1pPЇ͠+qPGT_1ԓ\wT)EƜ]_z nM9n.5Dy(UsQ(qq>>/b%#mHy=I*]~夳w n0i _74W:R)L7 h drv1R[|7ɍO%e@4!%fTu4IJuOCh_0 0ȴPZؘ֥+ĵ5"Oč )ZD_CN{R٭@%V۬R#_ESNzG Bd`Ѹz{A?r?kl:v8"/ K)jUpbH0 "nE9C`rn2t-Fc]&7 : Zzlx=ͤ̐ EWG6TD{lcQv'i[l͑`߱M㎀]~>?1I AOn?u^%:J " 5f# vXӬ.0|rY+AŔ'KEOfj !iC `w. "Bq #ĠHPhiC[%Hw1>XJ}eB{E.4.Q(M{^0L&9DNgxلBFbTPZe<*&Ae!O?jMX},p= lh]srs (|bpپ8;JUvjm4v(.Uo._]mq!OCa'I0I^Y\![)&5__;D¡ Aa5?IAt@L6#iTRi^(@Kο*lGsLҒVWk5#[4OEB3І U<^}"ۃBFMlzxVkPU(Yh⫛b^H1-#C5aAZWx|>4k~ $ H`T,MYf"\U>JE}H]QJ@/'|BAjfˋ((_O c㝴G%sX,$ah.Ph/(ۨ:iPiEi&qp$^-g$:B' g'Sǹk$C?;טJ4:4SHVsXK evŀ`ԳeTQAI1J& Ƞ#wɂ:)zZXro)P]A,l\v!)N 9o$XѾ~2P@[ȅiĻL@$B~㲯jA 4Za5sIt2t^GrP>@? N6ikRhMMX@OϹHL(bL .M5Aeh?H`R]dA]/,.b"@#W gHnv #H `T`(K~:pu yqDbJa֚p b7_f|fA˿~b1PK_Hd 6l!6}}qCvB Feۧj@"Jb[ 7A*%H#I7( F^m 9 VJPo`QkUc !C〗Dƴj{Xic!¥1T:(0@1Q ";N?1iP` CY%#6r]"Q<0S&{8ڵ*C3cwZ5mM!!*4]e+ҸTbʠQUR2ִO]%ҢUiۈ[D%Ĝ(MV!7{Ydpwiٵ7Zd2=ꆂL&uCd܉JP5 & 7tDw!RJ.;xkBjl=O~}l@TZ݃5OƹDHۨ.Z@R֓Ls4dE6/yR I59 (<@v} !X=5vHSja! K4bT rB8B RB=SC+m:",eS[6!Vso] A84%TGH~bi$6I.` (P>ŎiRhwj( *qM@4T:ka6DƳ}1s]E[*_C6R|T5<=R xw~-0R_ps(Ѩِ`Io44v)]lcfjaz X,==6%JmI7['`( 8Ч0* #,bwl%BeIcZ6VBl?:^谐\V8Q6)N 4::%Dď%"D.M٧a뇛XhN 2ʢz]:an- x孰MaTCk@D(zux^0ߡAњ0 tm=D!*¹75{Q=+SeݔD4uyN?mB n/xb@#pe@`(*̀ {x :Gpأ^q}$)ܔHCm)c"mKJ|  M!Ne L J, IV:}ኚ$SwLn9h&L'y/ubb%UϨT Ahbb( ۣ6z0Wp4zBKauI1(rR t"Kn0kuD,ڿabl@PƷ̳  MX{f2}XzAqU6 Bv̼vd:|sBRr]#jaaj)]_VjmF$A#suZ-!35!M~`6E$#A":;)w'@vRֿ\['=L +ՕfȎi!>Ѝlv\@(|ɽBE)>x-(:MA&i:X:Lk"&F9@yp u [CH6h do.* A`lϠetsAcUvm^im[brD'aO IۉRV:ml*5HAYU<a<Z mR^ҌwU0Cx1Bnj$ޗ;bJhzya\ A N0Aɩ߃/vMԿh \i ?uv咢! Y(苭D" ʷ 1H$gBPje4l,sCXT±4A@ޠPD(}a޻Ue@iY.9u,K.CBsţo, q K#o"vڴZȆRD*<2f](۠**dAHHZDfDQڦi$ G)2 AUh%[A%RŎ EB'1P~^9Vw?1F446B_f ?l=adYU6i<͊ s7PGkӃ\-\|Mrk$7BПY`NUSXX7EIE7OL#kj UNcpL@x=zCN(n]Zgu5Jݜ&2OܾгdYR-*3drT*+=lڊ9elu<ְn鷚c9Luh/ kq%z_Ŀ%ZM?ߦ`4/N-pOY:K",Q bׅ(: uU̞HPKD[JABdbkHU'rRPSc8^@leLCS%8ZA /)0<,_7@:p! I4ŸDRV li!}Њ 6JoS&BZs/21IzAH 7ܚ%A?VShTcf  ̂]^Hu cS7}%tlOYK6Zz}öDlhްw\ApJ6%F D)M\v72JfD*v^l6ChC4%XR%EՆ3pJPpMOכqzˤ='r[c^8+ǴC1^N. Ptyqb{1[0(SsJ XٝACe#\٥E9cۑD@2tBPt]%$Wy*tĔ`h05/"6!GT}18d ‹K-(J`yuCq Bd`h{.bD =b &E㉑B@P[XFDvB9N,)@DqYq5rYb4::bv); `IP$S?`%CwH0~( WL%͒ݠRsRCvmInIhZ#`}~bYē¼H0aMȟp2(GL)"YUZݳ C`әcC$(p1rJ!oۣ'ѡCp$ jw04^c $PN Td!Fw7pGvmU0~Vu='71%Cz48^li뼡 ƹ Ucb~_MiKov0H:>$mUt>B =J 4_쪉 cM뻇4b,P7l2GAD~m BF:P~˩6WGr0nƵG2Y`s4Zɰ+7`-IniI4xCwjDkZj*!,=gF~r.D\|{9)ꪆ L,DvMfDtpam&F]:t/KbKQ3Op\SĈ$Gqs7ɳA6EfáSQ9^4!@L=_7e(-g$z[^6x~Owq)ZBk`Z̘6 Bkn+I|OVo@x DlK`ߴŬhHAI{p [ 1ݫ." ]#9ҔG bkPIA}#x % OEሿPQ4;.ʹWD~-i_. ʃ-ưHpE4[@AߤLO| h3tGp4 An޽PB1Ž45gsX Itɬ`<ܓ|W ǙB$ *{JeZ,,DRB5قBQGKSXA=bp%QH'7pMLxOA1EAC6RVƢO% w RjOe U[ZDom-( ˡ+ۗ'UUݷȶD'0l *TuCAQM]7'2О[ᨽU9|yl Ϝy]b 鹖ti"`Hˎ#8X[j`Qa˫IfM?qթMp2Cyf8~"-`~7Џ$?*AWߪ(#zߎjzun4#Զ7Ƃ4^>gÒB!jovd5XHcI2 J851:ae|0R,"J7U1 lpJ\]`q :3eF pJseEJtoZ ll:p*hdjUG9Vy RM6 @w[ƻ[hL8?P'hAQi[nco %cƒ ,o6AvwЂe(V-Ѿ4JUp.0yl'q`vP/[UA*Ǡ]uaQFӦ"z{#WeXv˚4j㰄4t1E .jI@w)gEס):K; ;4ju MTt:Lsne$0)ĎoybFkSy!, +_߹ rbdM&w(0ELf_ a@.xc`? U"{h _91kTcD~`HՁϿ  pujZO1_2 'p8}Vg']\ R?dՉB m S$JN~ ~PVr.l%_'3ى1Vd#|nGx= kmʗO7zb#4oq\l8'rRЭ֓Q"%I CvBOc*hk!R4 tA:(77M EWLQnD2A5?s su&A֘}Vh r1ɮoRaYz5f#1AV;^DP1?(j4.\( tGJS5D qNWcbBA鈨jc5o}yB>۬5eJ5G}VL>+Ѕ}.4>L< *7"^eҹsA%#B\6Ft%'hPN]ϝĥ_an)Yw2'VbRGfTu@rܓfEޡXvicje"M!-a*Rp+|QK!ٍ%6j sz_bZ;~cNI]iaFɺUS_258ݦj_P 0}ͨm,iFIv!%J$FCϸDP)5)T] !&Gb 6i~cBp儆)Fomp j$5;yeCT*=& d FMGXHS ӦZR ĨեI.2k5*,hD?fSi7QDK0#u˻D@U nǗE"BJRq(+T7D6FI뱑M>_tp_4ͣfF@߿p(P-*@ 9H%OJd(Gie6=b ASa!":j~J¨z0"2[RRj}QbN Z; EZ+% *4c7uڰJ4djb\,|M+Q BQBMvlEt,/]H2Wy?pbCb 9)_,@m`"i߉At74 ET޶L%QBP|ͥlTJ?|s& vG5^BL*#-kM`Qp:Y6-k,0 Up'O8AṱkNbd ɤQVe _IlfRP@_ XnsS%2CJoq0Dhwi3Ce }x䠀nTẀFr?c&ĿjOpVRMlGd45RdžiMB_6 h)eX)>\.U/7CzLTJEe81T;Kf)pQ%}KGQUˆDto|!Hu$ҥxMVw јuWlLpG3l0 nnW1 X; PS:Os^Z!6 S$DiDe/N-cxJ*JrCX%5vmݼ[ڍT5OsLb]"po$CK  w{ D{칧`Q#T:X` tb5̟hzDu8{ 0d6_̆/ZDhvcAu(^\8.wK>/r Klީ@:Q̍IՃ$kpG `"fK g'EJwf7i*CHFN'ᦐRxre#ƔO4cX>RȲ06cdcu~YG. , 5qh)s@$.#\O.AK2;JEjM=q宝T.|t5 8L4\/3=ˠ|aJ#/\o]HPf2(l]ni{ְVƔgqCăh*yǑPbໆiE=p D0ugM4C&[i95DUo Vae]LZP,R(.y]Ps''|ϹX2Y` 8_gi4mWWz= hL-&j>'a|i L޹EIn$3t{H$h΀z :)( `h Q x|h OB5yXK`wMኒז!(vq hB F_'j)J# t8ǟB(lQJ;Atڂ lezo gVR'%XC 3V =3.Yo̠$\ J^h5ͳhdc%εyrAv?q[]R {/T4$lH0VƖt"-50+n)RUd!k9@ HH>[З[L:!I70Fɗ:ؕójoR(z/))d-sY>NضCD`6v%uxj1]I(}nERL&*X5 3J{&ѡ?v!Q@mΆb)McK&C HWe0 ctoAae50F -㿹ΟQx$+ƓM=^WŊ"y a7U]8pKh%W~"0]-fj:hUӉJ(̩>P-"3\̬w-"Sv)@MjGhPF paCPJG, aң5LqJO( ܄Ș ?Eb|wWyѥXJ]n}ň^,_0n?V TbOi !JFy]ɷbD7!AJi (Iׂ\g,O{;*w|_5cDJsAiA׃S/7kyވuμylְq+ZFv]|=^b9{(lcv \O^Y6ZxrV)US8Q<,*0TEjL)Pϱ$3I\zU)}<g_$S%4h?u>gcH7c3I,n0C!0B}\ GnPb"8!FҘ_e, ) nyb@(M4d4 \ (Ą!sT!14{`b`Z1*FK{'n  m uTH ;»nJv7 y/) @4r6YAhaʿ 'f$B-pATۢm #\ڈZ u2F /PӦ<,nKuۼ{JX@jMCcjuܤpz"$ۇBs7m ʂMB?0:P,a%Cls)WE-ytE":m HBm҅_eCܹc [o8O-xT7Q *, zO5upo]\!J%%"7?- y܃ތzk6ܣkÀ 4FBR0$[UlU Xz<>8D2f,PX;7|4HT5ŖisQ(c\nR $7h [K ȀYOA4Hlx?Hb6˩ ) p )Jihh!Tpq"L U Hؠ$KCu\4~~@&L |m.0"L{ #jp1l B L: T^1\4JGa )\af?˅x apMZj6AJ x2)qL]f..1xLt@ 80ES_eHV),80_ܒc#@^7&S 5ArF f le %b&\@ 8(cƱ o g\ U HSzQG>q@ھ`,]c=ۇ}@ _+K@ǭ"Nm3Zp {k<$h@lD%I*@C>f@/(#iґ<\f" +3„3 X"!B3>82Š$T pVnF͏ksfo""A#dE=>Gz! iGrbѬ@UA30bݘƿpRtqg> [4|͍j`5Rn>A0z\ 00UhJLF {&\D^gQ\.yQ,JWͿQT ?bܑV!\24@rײAoN ڐiL w*Ixft IG\i$w#5Cw) r/qJ"uNG뉒-@F$Pk.=%Ã^ȴ U`DK0z SkQN9֕?ODe͉^k/m<|i@@|;@~/87 h7d$-@I?NM LдKA 7e@*R:A&d?Hnh1>&0Ohe!Sur*X`eڃ~L5s,:7mt󩍑f-ܺY܄Jrʥ%EVg^Zd`ڸc1g$֦X~x0I_BR 9PtkbdCc:G5U ̯@PzyCB 6)ҠcN-lj aP!ۿ0BgXM- H[JrƑ$:%õEhC4`:XuLvSN_q 2R5XF,MEz1X[I%e0> %%u;"=b|! 0%Biy. rUa+CMW+C`׸=:ͷJMᢠ*4a"h;5~$]k[ #A@Xb4oC 4?j !4F;bMeGy`LvTlGh4bqp6t=Si<3K'$ >(iPF2 d.,0 V㐿Uis9fѓd bI29>Ƒ9rO⪡N:HZSC7{>cBt'_g2t|m? eFwqkJ՘;֖P`jpàID,f|ɄX /dWLAg~|sh@=;5 .Ǹ:J' vNslZoXY;}2J!fmuj׵ܤ]%đ&[8#|et 64od$<QWx8j~Ek!µpbҡُ%[…>u#_pY@:@) <9xJ:r =$v%0ĩ?CءZ&VbZPE(q .ֹ{򱵂$.aIa8mU( g ApHt~㥵i2\$:b5a$DgqZ4b"Pt ӣPܛD^l:q"%VdG`m. V[$hHT  ,JU 4{`)^aTIPBIq˞Stq"B7=2v.)hFr|Ƽ <_1rbSt Dt9 SRZ1Kfe&Fscók-RpQ $H At~3T[ȒXn?yC޳頪D2 R+`2c/{r5 ~b]-RB`Rᆮɳc& QkdSjx{>eي, D-ƦBF2u(..uةMc'cZJH`j4Jq dSA M0ju)Q(6r]{8ityςJuW*&7F%H `C` VwlCS:g@y)#Cf\56"*X!Z:=(Fd'LAUtg5 p`*J$JUmd ? QJR2ZsU^o8! T ^A# i!R*nsMi.L&S bҁEM @js+ Zv4Oޤ uSػVn2qE)ǦZ/w  -IY|Zj#I#wG/1O"H{8!Os.0:@Ȕu2!M(J}uu-+Mݧ tb+NR'HIwp -"7ޢ0vAQlAB+  5+USJ$DF?6o(qZ(Nfr I7i*\7x!rۀɨLڔhP**GHBtiq a()(n |`*8@̽&& h 3ڢ5)H* cT )ij7@ 46,D:Iۖ",'EŸ5Yf(x%0Z@һ LBժ5 / mdtkMzG*B% X 4f3To(ED3Ѣ4 V޿ 4@Wa21q"br2[6@}p-5͂ x=4PA#$ D~3!Z  I>˅*ծ؊NO+G&e,i]J:H~/cT(b)xt_2BZOUfTK2z-Sbzkԅ#RUՃI\C*4 R{$9q {S# gazn=Z+: AS6݉#N_Wq`tQr<S4`Cܣ(ޗٿBei!+ZSltoc~= ioli mPz@><9xբ'LZ;T4Nm1EBzg-oaY)Αt V |qZѢtJ=tu9Q$,N"7-]FPMeaRJmAf66g+ȒoYD;DC7XkBBwP_lU43;3 ͷ/5 &v`dW8K(af16ӡDy1-$@A?sJL&A>tv30`EUh@X$-F@g)TPJ94$L5}6bغ)'9% Z T*1B3w)69}˷Q7![O@Z$)`5H(׌.ڍ C%x[%52};GWґ*LznWx$ ?Dem` "_ v|9Qx;vOW#p9*ltM죃pM ^`^H%^*E|,BW!emg\0Hv27㘱-eM]cmUUJ\Y l?q>ZӪ<ĊIŠXn?\ (,YI+<2u&PCXQB"vsp@1[ 5T xe2[tX( &3Hآ|؅4A]Mk|kUnnh&@a#F-ig0{jkyH=ozxqC`l@oZ6?]+*BDE]lB*'$X1S  0.I=QLjeFr> "]dlYjzc)j%1;tL &5AeD=7]Dar4 U@Lj8xDι03un x;TIـeCTs~nC:5]"6AG&R*[1T8m,hK*Sc"fMl,.I^y+ByͤP$h6Bk/" ,7&δxIX:'7 `l B͕beEPt+ ~y{q !ܱ E!ut㋅$SO 5 S~HoC ̢Z] I>iEH *o C0֟؏^E@5 A"Y@^*o0lѦD/N^p *]_bV:J½m[1.hjc` 5h!5$pAe<\`HנSsUC}ƣ}X+ `aLT]Kl@(Y݀3].$MTȬrtZT+ 2.| F[J_sfb5.Y1/tNiJ\q*ul-%T₩7D|9^BbFAm.=*tϸea;0 ׋|ތkn ^!#хPeٓ7Cd&]L a?5}+fپY %P9ਂfK lWWnG+\ oO4W`wXk:Qr=jFlB;-q\IZl 2Y-'\3TJX!h\(CʱhxY'=1!% Bc:53z4$Κl' *:Iζ dro҅"#NA ^7cb oڄ4*v Ѷ]mIS?H=n&6J/~kx#Up^ŌHF%@&[[Gi>áf6ҍ vKk 0;@^X~ăO]Jj)A檱) +qukWˣ k .41fqsaPF*Q"35QYgf8`!g xr陠1gz9j*pivզ3-ҐXMmi\08a%woheʦm98_vWa891Р"[b76 jU&|T:B*C2! c +D _KAtxV+? T\v:A3iWRSWkӾSv_u[ M4'_ i64?!Z7a@L  IЇ\ èE%Xj)[#A_ v=qM@-RIYr׸`*p#JMomنp4X=0c.RT4-1-#djkzu`* j Yu*\^QX#;S;/M~īɕ"(43~ 1l'%bR,_܎fCQBsXhA]$DHZc `۬y@;\ wE|ͻr@_}lHTY moRʑkOcY (HWCaar:]d8zOv'z_ l @H%<@( ,QA+ f $vi!֊!nd76 ;}`%]0nt HaډZ8l԰V_Q|bk݂܌X&īW !>:{U6y=<-2!t9 qhoSo p al? W&<0O>҇T-gjZkn~ Uoi!_0(DZL+` S4"(_<+"xNЌIz sg(p x;Im7vQ(jU7N[`B.wч663^*pA(q G.&ЛOg,= vѪL'BW`c@P+8B!!r=RNלB2:66w ݂X0y4N^gh@+bɘCCw ,eCX A&ìڨP&gtWTTabq4lM!?FJrEγ/OfQ4ͶO9A37HtNQvk ]d68t|K4'wqW4(UP$ #_u/ SBϸ~iҶL;7ăSz*)v7]!C 6va]IHq2 B:YH00AjeU|`1 n -Z YvnyPڷ?qu0F5kVط{uEtrYH4U̸`JtIAV Qʝ`NuI T_<A $c&D:aSMjlyP9 ^;@*TXJm}n 0v0Q1WSs7vTGH?8r{ 94骓x0;E޷CN%`>dXZ1U@>?I)^+P]T'͓mwZξ:li=*P "J, j`:Mzs וР'>S (vX`uұ(> ~\~m҂l h}Q` HGOHWT*CR8a18[_?65Aq(Y$Ay]'d pB!1V[?؈ 0-qRPFo`*UhY\tFIla%`"^gD- t5JP5 $?{$d/tTþ22M%ջfL!~_Mx-m u鵔&@1H dG,ں # K>LH> bƇ]*R U=DH:x3W@5MJ:=5۔5D*#HZltRmMaW1U/< Uf+fYNBk P dk?r͔-B(BFq_04;7?0RXוӷSp/,@pL6Q +mnqe \)~P#IW@ !i)z?># J<: XuIACVG[H>enCTkstN£J;t)B. q Θ`\E ̾jN\ Su G]k uiǰIH^xKHo^}dfrjN.rr)`sy4wD52Z7Y:RWB,1BH09h 8SÈ57; 7 Bf9퇯:6roiWhr"fD]{4415ؐJndn6'| :OblkHD﹩ow)jۅ*Ul48.8")6ޔ]W,70`ፘg0Ԫ7 mH^DtxТmoċ:K 6| GX ֞卣*"4eYb57j.1x}U@QdrT"”LtٚwczGwyjE 0/DL,Z&5! wAUهD-81X0hDwi1Ed*J7,CF:#+>!1`p9h(el37QDZtqUwnFWF56 92Ql::uFA2T;rTIتd[ @ |f?pQx1tlNǎRɰgcn3#B )f+B. C &ٕd(@zc&xDDVGfdwV_3wB1a {gv!aVcBki/W'p$4j/HrBV@O_SbI }aH{ +D?q( FDynCPMķLXlբ pvIa*o[&d%j"1Tdշ!=!% GDmD)(O@ZBf涛hA*K0H541t ')oKڂB{Ź8І۝@vcA8`)O[awQ ~B#ŃM n@XP#b6᪫B3T? h4=8;BwQ .޼G#Qɒ֠8s)|ľБKeٳIJ& Ö-4LHTp\{9YsĀ@6 >ex'{f TTV+o?0A&:$>0w‹hÃۄ&:P7t8;[m(R//.kEPF=wH v!CBܽ3e}W o%lѤ4WQ4SWXKDC 7`GZ-IEc9$`v&@8%f _S:6XDD,BaD%1SjLq f hHH܌C&rWf`>b^P4z0PMvsx#oUR~& tb.Pt-]w7vHJF†2ɼI(ˁi%O8 3h4| f1@Dݧ̵[e(}L\qpHf,1dzp qHCIேkp >edڏoLB G@"?phBCۢ 7vaO-$ID[tQ*H[1owATcښQ]h$@z M. /1|R!&.t,]DVFU2BVeրӧf].{PnP-&I+!{G8T $HaAA\JA#4fH!TK>4#zA$2p/(&a-ż0j PqOCD(PU nn@Wub[̉At '_b(I%aQkP ;vX3pۀCHw ֋UU9G4c1PQӧo]!fΉ +GY,B1Ha]l "ѓXޠXt~m9W?M9i"KuTj,@UB=hiy5?g3AA|5v oki jnkiv}E_7jᆞfqkq[TWYw]HIs̎b.2Ѽ^`=%$,M7G⎲k4_\|<(ݟ2#8ў o[`18zQfy;̾}Ƃ,GЀ+B4 ,NG560{F*J[è mxl*ψD6QPatIs=ê#xEVhcgb*ьv OTHH'UpMV , l_#ma7*Dx6-n ]Rdmz1D!x"lxPVB5cTF WZE7–;d-_n6erN Z($몲'd?i.MdBr.Bu1j17HC iaMOedrzoJG[K2Rk:2M47=!kM جqƀk[ *J\@ŰTIo!Yԃ":nOːnGv1Sd%0)2oPapBɑAg}\aEzR2"X+r@{Mhp08] SV[+\M' ۊex@9t&5RřֲV J=D*ٓ!~`!h(ji:" V⠴" 4` L,!m_2i"ROT hlI1d S&cT֔za5X r":[=5 ԘLeoaŁ t:@(;\}kʓE:܏XP7ĞVu7m=VoTOR&EIYr{P01|@(Y+; lVZqްT ^}òEHSe 4#N~@cJ½M[}v4tiK[& xѵ]֑-H|07S9hwccك?װpU.5CrS6k,,CSP 0s D+tlQ>hHTq/C<i(E (>JWc5i`%ݯkM w "$5?9Si.Ae.%BMVk\Xp@![kNO: T`9H":+}D Z:na 7+XdUPBp֪!Z#aZkL 3IhnRLXa tkw<%$۰q}qMR*aF;*>\R'OIгV A0:ApH_J} i C ? eT4wS_p7Z)ӠuT5Lvz?<3ɽ#ي;-Ltڷ7?n SE"YZU|kkaĂX˸>ʴo@eebG n<%\y*mpֽ b#K_qeQmT%:W:9ۤUL|cOi(wMV0 hwcaL(V qȻ b)y2xIZMw,$os꟔TN f@l2 4o9ܛ6JG@hiPP9"Uơ`Y[PЅF Ħ$: !P)+P M ͥkfYvޙY9`UWJ]Xj*GrX ayB0D}as )GgvrB>y 4CJFdtU!F e !G71aN-1ֈP d@1N,GNxD9rN`W(@*.:~?-4kCt4!^PMs :@s)>*bJ^nij:G"a1l4T)EhKƅ^Gu,Z% 5 JF&ŬF/r{ 20ohtd|·xb =zxeAHEy^n}Qgc3vŕMz^{a#AK9{+PH!rip`ݬq VQC=lšiARYFHZpHHXooi1?=Jߛ'?EzR= wBҌ D~%XL5Oێl6Z4.(A`blI[IM_V0sn4ˊRa-\tg(zv1H izk6>/z 72ˢy `rZ& ER߻$ifW'=kСˇhP*o:PфA f}BV!yF{& bN B0WIq˿0xꬸ$~?nYKPT afL`)ADnIB^h{@Z)<#d#R'^cb (iv* 3]Nk,y0P-l4^o'"wdNO`0ҘwdڀKD,e8_bF:6"ӚcvhN P!Ql<‚ U6ZX ~9 ":-0kqCBY~6nxaGP 썛ךu[G.+`n0X:MbMY* mKn*(M$\KUx%-V$ZTx:Q@V m)tf.tIWc=$W?t5@O'67RC%p OG^c4bؠ>ly64l,M_: wĊc! X@,W ="=edD\2ѡ[jh'G:]N:BIY2&P(ƣ+À 6YR5Y5B V ?pr$wMfډQ&G֒}2q6|dk|' 'q.PHd' xo sSD'?cMY 1U}t'XXm쾑}KJx ){URvHa ݘc10~@v"}nRC)'06|ɓp$J2bf!fq⑲ŷ:?1Xn;XͻpE4ép lΤ ,<6x|< w;ZJ`[txiw"{ e# 5# 3aAleScgunjxrQz߸DVB~a Ţ pPơ(0?r$B;DZZɤtx zIe,#}hh6"]%(L^Ŝwl\J/&keHrhvF@/l66%]>aRM1D4' DG:e" o xȼZCU~wu=EkOa zIuJJ=0Kx By²<#_5,RB4Uw|T TkaN҆U{)7 ŔT]nN#`6Plwhܭ=D5Vq 2ʟT|Q(aJ4.[]-6OBEt>o KRI6RZ_ R"=o7;?`oJn{&P Nmv&4+Y4Vor". y:=§P50EZ΀h4AyHB :m9\ )$`B:C}3څ]=;i@tɈKֈFW T#Ō4`]fq@ >}h2/&&(h^*V0N: ӥL%"Bhʴvp; Pz"Rl8a-D̲K[ aI$}¨Rh‚SF|Bȼ3y}NkANv;Ҙ 4T%cʈDWT n/`YBorH( l"Čm6`M[瘚$Tc>fE"B57eP)y1Ӣ-8 OWXl<ЕJ,q:#AڎPVDtKwZ Sz|FGaN5):pwp]==}@2֢ F=AU=d:Ewj٥6]ѭp 8q; #AA2&3[!mǸnhji|wHU^K,9P@Ju{k8)CktuB⥦9]"##T=!-Cd}%nL!i7 E5s@U]XZQ w%P`5y^Bؚ2 _|C!A7\o)lޞr`֋~}X9Ї;ll&<-ZOrF@?%U^1%O֑QRGfI姄Z:<aH 7w%]auŒe[c.F)ZEU |#UOw7DKoL,:W)M67}#Xa2ĽUٮ"tҔǔBpSiv@ 4sVJ;B| .~L|t.'hnk9-)Ty0̒J~$=0ztuDP{E7Ã.T4tݳ ^wxcnZ4y_峒*,iM,ȃd"+l m ЊcN AA.˛Ro2M4b( )-;JKML.dI_QoXC+{ MFlb-HBR y-αi-j]Jἴֈ AլM H M!< ; VƃI_i#p?G vru4:M+A+?vit$viIh4R SažEt2P<}#gz!1FV# W Vǣ\>A 0ӝQUzot1$S ӻưX7 5ZMMkM dbJi Ql*_p8 @M Qu j(#}(U+ѩٺ@@DAa `}>ՈrRVl[ӽ5g$h荷M[fcՅUuqV ыk]p lYcrB*=k̜֑t"_21&(jwnaGoàBAFdYcݴeiyQ:_}G_o&/]'!&ˀiV!)3 1`6ͮ|&1AS^&JrdЌ1Gʠ&]z+n:b/-7D/̻(K /T^aI^OM5T,]" ?"dcDAO§)x̓:%bU3*2 )1+ǢF ~nz]CnLT1]X<]?+!pIJK ^+WMkaU 0xTDBLj3sh@7f\\Nīt5.9  F?2$-@莝AC1/jE3s(K$G* 0;HfJ٨; Ve114gᣘ)ň}=%^RFOEaH]>Ӄ \M1Kʄ.z.И:_CE0;r&i]Ѩ1nܬNlu;qȕ!⻹ba ))ϔfun;3?[WQJUCA ل5<~sB&p@ VэrkQކMv|u73vN`,Hʝin5*6NbGA0&fC(t{71"|Q'7Qok4vu8FXMIKKW M "ۣKqiNƴ$E'CR>ĒV؃ I!zTyg/lWzZbD !:&ڙ}A ݔ̭+!,QcLQ]c^8Ɲ@5nRt>q|PwZ_?*V*-8k8*DTf4s^|"\IZTy X =KzwVvrU^a8WJ?6 5ܛ`HM|2Ot\efsUUGAOLwH =/Ns:;S\z_x>dP "+5J_BijX&Jugl0 v?}ݻ ?8,(J4URꊘ*Ɠ܏%Z+X>z޽EA$/ :{O7./h "nET"p/7V;  ix@ \6COPbk8|ĶȷLڱ.T4we,$L:S)p -)M1*1"6Zf2`v -;(U ?ssQ Eк. 0qr#FjۇJVadzNoR HoF5Wba{vT"P1M% [3e'KaRjtd/c66J w9mŶiSm])ZM:#.U ,eŴ ƭ n$,ŽFΦx^*_Ϻ^hq?7޹}yZ*!W8pT#b&J=$I? . e. ξE`0e傍uq,qUt4]X7>;ԥ Dc{(ytX@GC:8FӁx I]X^cA{ A{VAB1e'w:#/6j|,ЧNiM rYC:k_quNܸNi` u$d3f DR+VB#?9547f$X QC~gA"7S{(w % xkxo8;YKw15Z4G7ӹC}%ـGnATb 6ibҠ9JP& ]Ni31@=ɡtpӤysOAB} g8 8 )A'O4D?O+P#"^xb2Ŗ#pS_H(P!‚CM PF^q/?DJwoJZN.+C B^.@V>5j=K/6UiiXHxΌ`m,`sT9$Uжo0w1W3،u^n1\ B/b-ѡ=v0Ѓ6. `Atkު޷͒~1D#}i"ht ax"U?>g4Ӫ5 b N:TJ˫m5NBpƟ1 J:~}ͭA%}0zO۠}Qm|s 5d {]w =#7vB$Q L=+m5rھv twr[ŬRʤu$Y_;6ʖ ++t^(%k!hR``hptͣU*)[_DHD7e, םh(X5ުW< :lWq ( >VgwyEt@Ye*K 6|bk5`nJD?H W`OFmlDZ̔{ehx9B' MBRE%c!]$l1ʯ 2_BJTwX@?ph7J 2p"m' (`0m&Qw(ُBӣ`NIϧ԰22@k_n {Vm5GI&z;{؍!("/h\5OXT=aS=,Xq!S /:>`x ۨ]rM*ЇS" Vڊ&_>BYo̱6PE7$FA887³iUNaD@U2|ZQJPM`蛹dA. vsN8XR:]'8BE`5ߖ\yD؟}’$>ڋ+HD؄ 9JW㍪ fquUZqz_i$f0\?q#3a㩂VCqיZo6$LI+5+uE>5P1޴gۀH!B)}g% ~a5Z0(5Q!60H @nG P